Files
2026-07-13 12:09:03 +08:00

339 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Glossary - AI Engineering from Scratch</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' fill='%23fafaf5'/><rect x='2' y='2' width='28' height='28' fill='none' stroke='%233553ff' stroke-width='1.2'/><text x='6' y='22' font-size='14' font-family='monospace' fill='%233553ff'>AI</text></svg>">
<meta name="description" content="AI glossary: what people say vs what things actually mean. Every term explained without hand-waving.">
<link rel="canonical" href="https://aiengineeringfromscratch.com/glossary.html">
<meta property="og:title" content="Glossary · AI Engineering from Scratch">
<meta property="og:description" content="What people say vs what things actually mean. Every AI term, defined without hand-waving.">
<meta property="og:image" content="https://aiengineeringfromscratch.com/og-image.png?v=3">
<meta property="og:url" content="https://aiengineeringfromscratch.com/glossary.html">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Glossary · AI Engineering from Scratch">
<meta name="twitter:description" content="What people say vs what things actually mean.">
<meta name="twitter:image" content="https://aiengineeringfromscratch.com/og-image.png?v=3">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=VT323&family=Source+Serif+4:ital,opsz,wght@0,8..60,400..700;1,8..60,400..700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css?v=20260525a">
<style>
.glossary-page {
padding: 100px 0 80px;
min-height: 100vh;
}
.glossary-header {
text-align: center;
margin-bottom: 40px;
}
.glossary-header h1 {
font-size: clamp(2rem, 5vw, 3rem);
margin-bottom: 8px;
}
.glossary-header p {
color: var(--text-muted);
font-size: 1.1rem;
}
.glossary-search-wrap {
max-width: 500px;
margin: 0 auto 40px;
position: relative;
}
.glossary-search {
width: 100%;
font-family: var(--font-body);
font-size: 1.1rem;
padding: 14px 20px;
background: var(--bg-surface);
border: 2px solid var(--border);
border-radius: 0;
color: var(--text);
outline: none;
transition: border-color 0.2s;
}
.glossary-search::placeholder {
color: var(--text-muted);
}
.glossary-search:focus {
border-color: var(--accent);
}
.glossary-search:focus-visible {
outline: 2px solid var(--blueprint);
outline-offset: 2px;
}
.glossary-count {
text-align: center;
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--text-muted);
margin-bottom: 24px;
}
.glossary-list {
display: flex;
flex-direction: column;
gap: 16px;
max-width: 800px;
margin: 0 auto;
}
.glossary-card {
background: var(--bg-surface);
border: 2px solid var(--border);
border-radius: 0;
padding: 24px;
box-shadow: var(--shadow-hard);
transition: transform 0.2s, box-shadow 0.2s;
}
.glossary-card:hover {
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hard-lg);
}
.glossary-term {
font-family: var(--font-heading);
font-weight: 700;
font-size: 1.3rem;
color: var(--accent);
margin-bottom: 12px;
}
.glossary-row {
display: flex;
gap: 24px;
flex-wrap: wrap;
}
.glossary-col {
flex: 1;
min-width: 200px;
}
.glossary-col-label {
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-muted);
margin-bottom: 4px;
}
.glossary-col-says {
color: var(--text-muted);
font-size: 0.95rem;
font-style: italic;
}
.glossary-col-means {
color: var(--text);
font-size: 0.95rem;
line-height: 1.5;
}
.glossary-empty {
text-align: center;
padding: 48px 24px;
color: var(--text-muted);
font-size: 1.1rem;
}
@media (max-width: 768px) {
.glossary-page {
padding: 80px 0 48px;
}
.glossary-row {
flex-direction: column;
gap: 12px;
}
.glossary-card {
padding: 18px 16px;
}
}
</style>
</head>
<body>
<a href="#main" class="skip-link">Skip to content</a>
<header class="site-header">
<div class="header-inner">
<a href="index.html" class="logo">
<span class="logo-icon" aria-hidden="true"></span> AI / FROM SCRATCH
</a>
<nav class="header-nav">
<a href="index.html#contents">Contents</a>
<a href="catalog.html">Catalog</a>
<a href="prereqs.html">Roadmap</a>
<a href="glossary.html">Glossary</a>
<a href="about.html">About</a>
<a href="https://github.com/rohitg00/ai-engineering-from-scratch" target="_blank" rel="noopener" class="header-github">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
<svg class="star-icon" width="12" height="12" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .587l3.668 7.568 8.332 1.151-6.064 5.828 1.48 8.279L12 19.896l-7.416 3.517 1.48-8.279L0 9.306l8.332-1.151z"/></svg>
<span class="star-count" data-loading="true" aria-label="GitHub stars"></span>
</a>
</nav>
<button class="search-toggle" type="button" data-cmd-palette
aria-label="Search (⌘K)" title="Search (⌘K)">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2.5"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
</button>
<button class="theme-toggle" id="themeToggle" aria-label="Toggle theme" type="button">
<span class="theme-icon" id="themeIcon">N</span>
</button>
</div>
</header>
<main class="glossary-page" id="main">
<div class="container">
<div class="glossary-header">
<h1>AI Glossary</h1>
<p>What people <em>say</em> vs what things actually <em>mean</em></p>
</div>
<div class="glossary-search-wrap">
<input type="text" class="glossary-search" id="glossarySearch" placeholder="Search terms...">
</div>
<div class="glossary-count" id="glossaryCount"></div>
<div class="glossary-list" id="glossaryList"></div>
</div>
</main>
<footer class="site-footer">
<div class="container footer-inner">
<p>AI Engineering from Scratch · open source · free forever.</p>
<div class="footer-links">
<a href="index.html">Home</a>
<a href="https://github.com/rohitg00/ai-engineering-from-scratch" target="_blank" rel="noopener">GitHub</a>
<a href="catalog.html">Catalog</a>
<a href="https://github.com/rohitg00/ai-engineering-from-scratch/issues/new/choose" target="_blank" rel="noopener">Report / Suggest</a>
</div>
</div>
</footer>
<script src="data.js?v=20260525a"></script>
<script src="progress.js?v=20260525a"></script>
<script src="header.js?v=20260525a" defer></script>
<script src="cmdpalette.js?v=20260525a" defer></script>
<script>
(function () {
var root = document.documentElement;
var stored = localStorage.getItem('theme');
if (stored) {
root.setAttribute('data-theme', stored);
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
root.setAttribute('data-theme', 'dark');
} else {
root.setAttribute('data-theme', 'light');
}
function updateIcon() {
var icon = document.getElementById('themeIcon');
if (!icon) return;
icon.textContent = root.getAttribute('data-theme') === 'light' ? 'N' : 'D';
}
updateIcon();
document.addEventListener('DOMContentLoaded', function () {
updateIcon();
var btn = document.getElementById('themeToggle');
if (btn) {
btn.addEventListener('click', function () {
var next = root.getAttribute('data-theme') === 'light' ? 'dark' : 'light';
root.setAttribute('data-theme', next);
localStorage.setItem('theme', next);
updateIcon();
});
}
var searchInput = document.getElementById('glossarySearch');
var listEl = document.getElementById('glossaryList');
var countEl = document.getElementById('glossaryCount');
function escapeHtml(str) {
var div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}
function renderGlossary(filter) {
var terms = GLOSSARY;
if (filter) {
var q = filter.toLowerCase();
terms = terms.filter(function (t) {
return t.term.toLowerCase().indexOf(q) !== -1 ||
t.says.toLowerCase().indexOf(q) !== -1 ||
t.means.toLowerCase().indexOf(q) !== -1;
});
}
countEl.textContent = terms.length + ' of ' + GLOSSARY.length + ' terms';
if (terms.length === 0) {
listEl.innerHTML = '<div class="glossary-empty">No terms match your search.</div>';
return;
}
var html = '';
for (var i = 0; i < terms.length; i++) {
var t = terms[i];
html += '<div class="glossary-card">';
html += '<div class="glossary-term">' + escapeHtml(t.term) + '</div>';
html += '<div class="glossary-row">';
html += '<div class="glossary-col">';
html += '<div class="glossary-col-label">What people say</div>';
html += '<div class="glossary-col-says">"' + escapeHtml(t.says) + '"</div>';
html += '</div>';
html += '<div class="glossary-col">';
html += '<div class="glossary-col-label">What it actually means</div>';
html += '<div class="glossary-col-means">' + escapeHtml(t.means) + '</div>';
html += '</div>';
html += '</div>';
html += '</div>';
}
listEl.innerHTML = html;
}
// Support ?q= deep-links from the command palette and external sources.
// Pre-populate the search box and filter to the matching term so the
// user lands directly on the definition rather than the full list.
var urlQ = '';
try { urlQ = new URLSearchParams(window.location.search).get('q') || ''; } catch (_) {}
if (urlQ && searchInput) {
searchInput.value = urlQ;
}
renderGlossary(urlQ);
if (searchInput) {
searchInput.addEventListener('input', function () {
renderGlossary(searchInput.value.trim());
});
}
});
})();
</script>
<script defer src="https://va.vercel-scripts.com/v1/script.js"></script>
</body>
</html>