ritterkraft commited on
Commit
96fe0fe
·
verified ·
1 Parent(s): 2197c04

Rebuild as animated ADI model experience

Browse files
Files changed (3) hide show
  1. app.js +144 -26
  2. index.html +73 -130
  3. styles.css +372 -187
app.js CHANGED
@@ -1,33 +1,151 @@
1
- const filters = document.querySelectorAll(".filter");
2
- const models = document.querySelectorAll(".model");
3
- const toast = document.getElementById("toast");
4
 
5
- filters.forEach((button) => {
6
- button.addEventListener("click", () => {
7
- const filter = button.dataset.filter;
8
- filters.forEach((item) => item.classList.toggle("is-active", item === button));
9
- models.forEach((model) => {
10
- model.hidden = filter !== "all" && model.dataset.kind !== filter;
11
- });
12
- });
13
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- document.querySelectorAll(".copy").forEach((button) => {
16
- button.addEventListener("click", async () => {
17
- const command = button.dataset.command;
18
- try {
19
- await navigator.clipboard.writeText(command);
20
- showToast("Copied command");
21
- } catch {
22
- showToast("Copy failed");
23
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  });
25
  });
26
 
27
- function showToast(message) {
28
- toast.textContent = message;
29
- toast.classList.add("is-visible");
30
- window.clearTimeout(showToast.timeout);
31
- showToast.timeout = window.setTimeout(() => toast.classList.remove("is-visible"), 1600);
32
- }
33
 
 
 
 
 
 
1
+ const canvas = document.getElementById("field");
2
+ const ctx = canvas.getContext("2d");
3
+ const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
4
 
5
+ let width = 0;
6
+ let height = 0;
7
+ let particles = [];
8
+
9
+ function resize() {
10
+ const dpr = Math.min(window.devicePixelRatio || 1, 2);
11
+ width = window.innerWidth;
12
+ height = window.innerHeight;
13
+ canvas.width = Math.floor(width * dpr);
14
+ canvas.height = Math.floor(height * dpr);
15
+ canvas.style.width = `${width}px`;
16
+ canvas.style.height = `${height}px`;
17
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
18
+ const count = Math.max(48, Math.min(120, Math.floor(width / 13)));
19
+ particles = Array.from({ length: count }, () => ({
20
+ x: Math.random() * width,
21
+ y: Math.random() * height,
22
+ z: Math.random() * 1 + 0.35,
23
+ vx: (Math.random() - 0.5) * 0.28,
24
+ vy: (Math.random() - 0.5) * 0.18,
25
+ }));
26
+ }
27
+
28
+ function draw() {
29
+ ctx.clearRect(0, 0, width, height);
30
+ ctx.fillStyle = "rgba(2,4,5,0.22)";
31
+ ctx.fillRect(0, 0, width, height);
32
 
33
+ for (const p of particles) {
34
+ if (!prefersReduced) {
35
+ p.x += p.vx * p.z;
36
+ p.y += p.vy * p.z;
37
+ if (p.x < -20) p.x = width + 20;
38
+ if (p.x > width + 20) p.x = -20;
39
+ if (p.y < -20) p.y = height + 20;
40
+ if (p.y > height + 20) p.y = -20;
41
  }
42
+
43
+ ctx.beginPath();
44
+ ctx.fillStyle = `rgba(37,247,196,${0.10 + p.z * 0.18})`;
45
+ ctx.arc(p.x, p.y, 1.2 * p.z, 0, Math.PI * 2);
46
+ ctx.fill();
47
+ }
48
+
49
+ for (let i = 0; i < particles.length; i++) {
50
+ for (let j = i + 1; j < particles.length; j++) {
51
+ const a = particles[i];
52
+ const b = particles[j];
53
+ const dx = a.x - b.x;
54
+ const dy = a.y - b.y;
55
+ const dist = Math.sqrt(dx * dx + dy * dy);
56
+ if (dist < 120) {
57
+ ctx.strokeStyle = `rgba(91,211,255,${(1 - dist / 120) * 0.11})`;
58
+ ctx.lineWidth = 1;
59
+ ctx.beginPath();
60
+ ctx.moveTo(a.x, a.y);
61
+ ctx.lineTo(b.x, b.y);
62
+ ctx.stroke();
63
+ }
64
+ }
65
+ }
66
+
67
+ requestAnimationFrame(draw);
68
+ }
69
+
70
+ const lines = [
71
+ "$ ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M",
72
+ "loading gguf shards...",
73
+ "teacher imprint: glm-5.2",
74
+ "context window: long",
75
+ "mode: local-first",
76
+ "ready: ask ADI anything"
77
+ ];
78
+
79
+ const typeout = document.getElementById("typeout");
80
+ let char = 0;
81
+ let text = "";
82
+
83
+ function typeLoop() {
84
+ const full = lines.join("\n");
85
+ text = full.slice(0, char);
86
+ typeout.textContent = text + (char % 2 ? "█" : "");
87
+ char = char >= full.length ? 0 : char + 1;
88
+ setTimeout(typeLoop, char === 0 ? 900 : 32);
89
+ }
90
+
91
+ const models = {
92
+ qwen35: {
93
+ kind: "general assistant",
94
+ name: "adi-qwen3.5-4b-glm5.2-general",
95
+ body: "The smallest flagship ADI general model: distilled from glm-5.2 for practical local reasoning, explanation, and tool-aware chat.",
96
+ command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M",
97
+ link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF"
98
+ },
99
+ qwen3: {
100
+ kind: "general assistant",
101
+ name: "adi-qwen3-8b-glm5.2-general",
102
+ body: "More headroom for general reasoning while staying within a practical single-machine local inference envelope.",
103
+ command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF:Q4_K_M",
104
+ link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF"
105
+ },
106
+ coder: {
107
+ kind: "coding assistant",
108
+ name: "adi-qwen2.5-coder-7b-kimi2.7-code",
109
+ body: "A local coding model distilled from a frontier code teacher for generation, debugging, refactoring, and explanation.",
110
+ command: "ollama run hf.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF:Q4_K_M",
111
+ link: "https://huggingface.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF"
112
+ },
113
+ wake: {
114
+ kind: "voice interface",
115
+ name: "hey-adi-wakeword",
116
+ body: "A wakeword model for hands-free ADI loops, pairing local intelligence with ambient interaction.",
117
+ command: "hf.co/AdvancedDataIntelligence/hey-adi-wakeword",
118
+ link: "https://huggingface.co/AdvancedDataIntelligence/hey-adi-wakeword"
119
+ }
120
+ };
121
+
122
+ const kind = document.getElementById("model-kind");
123
+ const name = document.getElementById("model-name");
124
+ const body = document.getElementById("model-body");
125
+ const command = document.getElementById("model-command");
126
+ const link = document.getElementById("model-link");
127
+ const toast = document.getElementById("toast");
128
+
129
+ document.querySelectorAll(".tab").forEach((tab) => {
130
+ tab.addEventListener("click", () => {
131
+ document.querySelectorAll(".tab").forEach((item) => item.classList.toggle("active", item === tab));
132
+ const model = models[tab.dataset.model];
133
+ kind.textContent = model.kind;
134
+ name.textContent = model.name;
135
+ body.textContent = model.body;
136
+ command.textContent = model.command;
137
+ link.href = model.link;
138
  });
139
  });
140
 
141
+ document.getElementById("copy-command").addEventListener("click", async () => {
142
+ await navigator.clipboard.writeText(command.textContent);
143
+ toast.classList.add("show");
144
+ clearTimeout(window.toastTimer);
145
+ window.toastTimer = setTimeout(() => toast.classList.remove("show"), 1500);
146
+ });
147
 
148
+ window.addEventListener("resize", resize);
149
+ resize();
150
+ draw();
151
+ typeLoop();
index.html CHANGED
@@ -2,166 +2,109 @@
2
  <html lang="en">
3
  <head>
4
  <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <meta name="description" content="Advanced Data Intelligence model lab: small local models distilled at theLAB and shipped as GGUF for Ollama and llama.cpp." />
 
7
  <title>ADI Models Lab</title>
 
8
  <link rel="stylesheet" href="./styles.css" />
9
  </head>
10
  <body>
 
 
11
  <main>
12
- <section class="hero" aria-labelledby="page-title">
13
- <div class="hero__media" aria-hidden="true">
14
- <img src="https://serve.thelabsource.com/u/FhQgYP.gif" alt="" />
 
 
 
15
  </div>
16
- <div class="hero__content">
17
- <p class="eyebrow">Advanced Data Intelligence</p>
18
- <h1 id="page-title">Small local models distilled from frontier teachers.</h1>
 
19
  <p class="lede">
20
- ADI turns strong teacher outputs into compact GGUF models that run on consumer hardware,
21
- built end-to-end at theLAB and published for Ollama, llama.cpp, and local-first workflows.
 
22
  </p>
23
- <div class="hero__actions">
24
- <a class="button button--primary" href="https://thelabsource.com" target="_blank" rel="noreferrer">Visit theLAB</a>
25
- <a class="button" href="https://huggingface.co/AdvancedDataIntelligence" target="_blank" rel="noreferrer">View HF org</a>
26
- <a class="button" href="https://huggingface.co/spaces/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-demo" target="_blank" rel="noreferrer">Try live demo</a>
27
  </div>
28
  </div>
29
- </section>
30
 
31
- <section class="band stats" aria-label="Model stats">
32
- <article>
33
- <span>Models</span>
34
- <strong>6</strong>
35
- <p>general, coding, voice, and upcoming larger students</p>
36
- </article>
37
- <article>
38
- <span>Format</span>
39
- <strong>GGUF</strong>
40
- <p>ready for Ollama and llama.cpp runtimes</p>
41
- </article>
42
- <article>
43
- <span>Training style</span>
44
- <strong>Distill</strong>
45
- <p>teacher answers transferred into smaller local students</p>
46
- </article>
47
- <article>
48
- <span>Home</span>
49
- <strong>theLAB</strong>
50
- <p>Learning. Algorithms. Breakthroughs.</p>
51
- </article>
52
- </section>
53
-
54
- <section class="section" aria-labelledby="lineup-title">
55
- <div class="section__head">
56
- <div>
57
- <p class="eyebrow">Model Lineup</p>
58
- <h2 id="lineup-title">Choose the local model for the job.</h2>
59
  </div>
60
- <div class="filters" role="group" aria-label="Model filters">
61
- <button class="filter is-active" data-filter="all">All</button>
62
- <button class="filter" data-filter="general">General</button>
63
- <button class="filter" data-filter="code">Code</button>
64
- <button class="filter" data-filter="voice">Voice</button>
65
  </div>
 
66
  </div>
67
 
68
- <div class="models" id="models">
69
- <article class="model" data-kind="general">
70
- <div class="model__top"><span>General</span><span>4B</span></div>
71
- <h3>adi-qwen3.5-4b-glm5.2-general</h3>
72
- <p>Compact general assistant distilled from glm-5.2, built for fast local answers with long-context headroom.</p>
73
- <code>ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M</code>
74
- <div class="model__actions">
75
- <button class="copy" data-command="ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M">Copy</button>
76
- <a href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF" target="_blank" rel="noreferrer">Model</a>
77
- </div>
78
- </article>
79
-
80
- <article class="model" data-kind="general">
81
- <div class="model__top"><span>General</span><span>8B</span></div>
82
- <h3>adi-qwen3-8b-glm5.2-general</h3>
83
- <p>General-purpose student with more parametric headroom while remaining practical on a single local GPU.</p>
84
- <code>ollama run hf.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF:Q4_K_M</code>
85
- <div class="model__actions">
86
- <button class="copy" data-command="ollama run hf.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF:Q4_K_M">Copy</button>
87
- <a href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen3-8b-glm5.2-general-GGUF" target="_blank" rel="noreferrer">Model</a>
88
- </div>
89
- </article>
90
 
91
- <article class="model" data-kind="code">
92
- <div class="model__top"><span>Code</span><span>7B</span></div>
93
- <h3>adi-qwen2.5-coder-7b-kimi2.7-code</h3>
94
- <p>Local coding assistant distilled from a frontier code teacher for writing, explaining, and debugging.</p>
95
- <code>ollama run hf.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF:Q4_K_M</code>
96
- <div class="model__actions">
97
- <button class="copy" data-command="ollama run hf.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF:Q4_K_M">Copy</button>
98
- <a href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen2.5-coder-7b-kimi2.7-code-GGUF" target="_blank" rel="noreferrer">Model</a>
99
- </div>
100
- </article>
101
 
102
- <article class="model" data-kind="general">
103
- <div class="model__top"><span>General</span><span>9B</span></div>
104
- <h3>adi-qwen3.5-9b-glm5.2-general</h3>
105
- <p>A larger Qwen3.5 general student for users who want more reasoning headroom in the same ADI style.</p>
106
- <code>hf.co/AdvancedDataIntelligence/adi-qwen3.5-9b-glm5.2-general-GGUF</code>
107
- <div class="model__actions">
108
- <a href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-9b-glm5.2-general-GGUF" target="_blank" rel="noreferrer">Model</a>
109
- </div>
110
- </article>
111
 
112
- <article class="model" data-kind="general">
113
- <div class="model__top"><span>General</span><span>14B</span></div>
114
- <h3>adi-qwen2.5-14b-glm5.2-general</h3>
115
- <p>A bigger general distill for stronger local quality when disk, RAM, and VRAM budgets allow it.</p>
116
- <code>hf.co/AdvancedDataIntelligence/adi-qwen2.5-14b-glm5.2-general-GGUF</code>
117
- <div class="model__actions">
118
- <a href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen2.5-14b-glm5.2-general-GGUF" target="_blank" rel="noreferrer">Model</a>
119
  </div>
120
- </article>
121
-
122
- <article class="model" data-kind="voice">
123
- <div class="model__top"><span>Wakeword</span><span>Voice</span></div>
124
- <h3>hey-adi-wakeword</h3>
125
- <p>A wakeword model for ADI interaction loops, connecting local AI with hands-free ambient workflows.</p>
126
- <code>hf.co/AdvancedDataIntelligence/hey-adi-wakeword</code>
127
- <div class="model__actions">
128
- <a href="https://huggingface.co/AdvancedDataIntelligence/hey-adi-wakeword" target="_blank" rel="noreferrer">Model</a>
129
  </div>
 
130
  </article>
131
  </div>
132
  </section>
133
 
134
- <section class="showcase" aria-labelledby="visuals-title">
135
- <div>
136
- <p class="eyebrow">Visual Map</p>
137
- <h2 id="visuals-title">Built as a pipeline, not a prompt trick.</h2>
138
  <p>
139
- The ADI line is organized around repeatable distillation: collect prompts, generate teacher answers,
140
- fine-tune compact students, merge adapters, quantize to GGUF, then ship model cards with practical run commands.
 
141
  </p>
142
- <a class="button button--primary" href="https://huggingface.co/datasets/AdvancedDataIntelligence/glm5.2-general-distill" target="_blank" rel="noreferrer">Explore dataset</a>
 
 
 
 
 
143
  </div>
144
- <img src="https://serve.thelabsource.com/u/ih5dUC.png" alt="The ADI distillation pipeline" />
145
- </section>
146
-
147
- <section class="lab-grid" aria-label="ADI resources">
148
- <a class="resource resource--wide" href="https://huggingface.co/spaces/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-demo" target="_blank" rel="noreferrer">
149
- <img src="https://serve.thelabsource.com/u/4Kb3iS.gif" alt="ADI live demo preview" />
150
- <span>Launch the live browser demo</span>
151
- </a>
152
- <a class="resource" href="https://thelabsource.com" target="_blank" rel="noreferrer">
153
- <img src="https://serve.thelabsource.com/u/T5Kdlg.png" alt="" />
154
- <span>Read more at theLAB</span>
155
- </a>
156
- <a class="resource" href="https://advanced-data-intelligence.com" target="_blank" rel="noreferrer">
157
- <img src="https://serve.thelabsource.com/u/yZylMt.gif" alt="ADI animation" />
158
- <span>Advanced Data Intelligence</span>
159
- </a>
160
  </section>
161
  </main>
162
 
163
- <div class="toast" id="toast" role="status" aria-live="polite">Copied command</div>
164
  <script src="./app.js"></script>
165
  </body>
166
  </html>
167
-
 
2
  <html lang="en">
3
  <head>
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
6
+ <meta name="color-scheme" content="dark" />
7
+ <meta name="description" content="Advanced Data Intelligence: local GGUF models distilled at theLAB from frontier teachers." />
8
  <title>ADI Models Lab</title>
9
+ <link rel="preconnect" href="https://serve.thelabsource.com" />
10
  <link rel="stylesheet" href="./styles.css" />
11
  </head>
12
  <body>
13
+ <canvas id="field" aria-hidden="true"></canvas>
14
+
15
  <main>
16
+ <section class="screen hero" aria-labelledby="page-title">
17
+ <div class="asset-orbit" aria-hidden="true">
18
+ <img class="asset asset-a" src="https://serve.thelabsource.com/u/FhQgYP.gif" alt="" />
19
+ <img class="asset asset-b" src="https://serve.thelabsource.com/u/ih5dUC.png" alt="" />
20
+ <img class="asset asset-c" src="https://serve.thelabsource.com/u/4Kb3iS.gif" alt="" />
21
+ <img class="asset asset-d" src="https://serve.thelabsource.com/u/yZylMt.gif" alt="" />
22
  </div>
23
+
24
+ <div class="hero-copy">
25
+ <p class="kicker"><span></span> Advanced Data Intelligence</p>
26
+ <h1 id="page-title">Distilled intelligence for local machines.</h1>
27
  <p class="lede">
28
+ Compact ADI models distilled from frontier teachers, quantized to GGUF, and built at
29
+ <a href="https://thelabsource.com" target="_blank" rel="noreferrer">theLAB</a>
30
+ for Ollama, llama.cpp, and private local inference.
31
  </p>
32
+ <div class="actions">
33
+ <a class="button primary" href="https://thelabsource.com" target="_blank" rel="noreferrer">theLAB source</a>
34
+ <a class="button" href="https://huggingface.co/AdvancedDataIntelligence" target="_blank" rel="noreferrer">HF models</a>
35
+ <a class="button" href="#console">Run local</a>
36
  </div>
37
  </div>
 
38
 
39
+ <div class="hero-panel" aria-label="ADI model status">
40
+ <div class="panel-bar">
41
+ <span></span><span></span><span></span>
42
+ <b>adi.local/distill</b>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  </div>
44
+ <div class="ticker">
45
+ <p>teacher: glm-5.2</p>
46
+ <p>student: qwen3.5-4b</p>
47
+ <p>format: gguf:q4_k_m</p>
48
+ <p>runtime: ollama</p>
49
  </div>
50
+ <pre id="typeout"></pre>
51
  </div>
52
 
53
+ <div class="scroll-cue" aria-hidden="true">
54
+ <span>Explore the line</span>
55
+ <i></i>
56
+ </div>
57
+ </section>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
+ <section class="screen models" id="console" aria-labelledby="models-title">
60
+ <div class="section-copy">
61
+ <p class="kicker"><span></span> Model rail</p>
62
+ <h2 id="models-title">Pick a student. Copy a command. Run offline.</h2>
63
+ </div>
 
 
 
 
 
64
 
65
+ <div class="model-stage">
66
+ <nav class="model-tabs" aria-label="ADI model selector">
67
+ <button class="tab active" data-model="qwen35">Qwen3.5 4B</button>
68
+ <button class="tab" data-model="qwen3">Qwen3 8B</button>
69
+ <button class="tab" data-model="coder">Coder 7B</button>
70
+ <button class="tab" data-model="wake">Wakeword</button>
71
+ </nav>
 
 
72
 
73
+ <article class="model-readout">
74
+ <div>
75
+ <p class="model-kind" id="model-kind">general assistant</p>
76
+ <h3 id="model-name">adi-qwen3.5-4b-glm5.2-general</h3>
77
+ <p id="model-body">The smallest flagship ADI general model: distilled from glm-5.2 for practical local reasoning, explanation, and tool-aware chat.</p>
 
 
78
  </div>
79
+ <div class="command-wrap">
80
+ <code id="model-command">ollama run hf.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF:Q4_K_M</code>
81
+ <button id="copy-command">Copy command</button>
 
 
 
 
 
 
82
  </div>
83
+ <a id="model-link" class="button primary" href="https://huggingface.co/AdvancedDataIntelligence/adi-qwen3.5-4b-glm5.2-general-GGUF" target="_blank" rel="noreferrer">Open model card</a>
84
  </article>
85
  </div>
86
  </section>
87
 
88
+ <section class="screen pipeline" aria-labelledby="pipeline-title">
89
+ <div class="pipeline-copy">
90
+ <p class="kicker"><span></span> Pipeline</p>
91
+ <h2 id="pipeline-title">Teacher answers become local weights.</h2>
92
  <p>
93
+ ADI is not a prompt wrapper. It is a repeatable distillation workflow:
94
+ seed prompts, teacher responses, student fine-tune, adapter merge,
95
+ GGUF conversion, local runtime, and public model cards.
96
  </p>
97
+ <a class="button" href="https://huggingface.co/datasets/AdvancedDataIntelligence/glm5.2-general-distill" target="_blank" rel="noreferrer">View dataset</a>
98
+ </div>
99
+ <div class="pipeline-art">
100
+ <img src="https://serve.thelabsource.com/u/oLHfvT.png" alt="ADI starter model lineup" />
101
+ <img src="https://serve.thelabsource.com/u/uSv2Lp.png" alt="ADI model lineup size comparison" />
102
+ <img src="https://serve.thelabsource.com/u/O8Cq1i.gif" alt="ADI animated mark" />
103
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  </section>
105
  </main>
106
 
107
+ <div class="toast" id="toast" role="status" aria-live="polite">Copied</div>
108
  <script src="./app.js"></script>
109
  </body>
110
  </html>
 
styles.css CHANGED
@@ -1,15 +1,18 @@
1
  :root {
2
  color-scheme: dark;
3
- --bg: #05070a;
4
- --panel: #111820;
5
- --panel-2: #16202a;
6
- --text: #f5f7fb;
7
- --muted: #a8b3c2;
8
- --line: #2b3643;
9
- --green: #11c483;
10
- --blue: #58c4ff;
11
- --gold: #f4b954;
12
- --ink: #04110d;
 
 
 
13
  }
14
 
15
  * { box-sizing: border-box; }
@@ -18,306 +21,488 @@ html { scroll-behavior: smooth; }
18
 
19
  body {
20
  margin: 0;
21
- background: var(--bg);
 
 
 
 
22
  color: var(--text);
23
- font: 15px/1.5 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
  a { color: inherit; text-decoration: none; }
 
 
27
 
28
- img {
29
- display: block;
30
- max-width: 100%;
 
 
 
 
31
  }
32
 
33
  main {
34
- width: min(1200px, calc(100vw - 32px));
 
 
 
 
 
 
 
35
  margin: 0 auto;
36
  }
37
 
38
  .hero {
39
- min-height: 92vh;
40
  display: grid;
41
- grid-template-columns: minmax(0, 0.92fr) minmax(340px, 1.08fr);
42
- gap: 44px;
43
- align-items: center;
44
- padding: 34px 0 48px;
45
  }
46
 
47
- .hero__media {
48
- min-height: 420px;
49
- display: grid;
50
- place-items: center;
51
- overflow: hidden;
52
- border-radius: 8px;
53
- border: 1px solid rgba(255, 255, 255, 0.12);
54
- background: #0c1118;
55
  }
56
 
57
- .hero__media img {
58
- width: 100%;
59
- height: 100%;
60
- min-height: 420px;
 
 
61
  object-fit: cover;
 
 
 
62
  }
63
 
64
- .hero__content {
65
- display: grid;
66
- gap: 22px;
 
 
 
67
  }
68
 
69
- .eyebrow {
70
- margin: 0;
71
- color: var(--green);
72
- font-size: 13px;
73
- font-weight: 850;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  text-transform: uppercase;
75
  }
76
 
 
 
 
 
 
 
 
 
 
77
  h1, h2, h3, p { margin-top: 0; }
78
 
79
  h1 {
80
- margin-bottom: 0;
81
- max-width: 850px;
82
- font-size: clamp(44px, 7vw, 82px);
83
- line-height: 0.94;
84
  letter-spacing: 0;
 
85
  }
86
 
87
  h2 {
88
- margin-bottom: 0;
89
- font-size: clamp(30px, 4vw, 48px);
90
- line-height: 1;
91
  letter-spacing: 0;
92
  }
93
 
94
  h3 {
95
- margin-bottom: 10px;
96
- font-size: 21px;
97
- line-height: 1.16;
98
  letter-spacing: 0;
99
  }
100
 
101
  .lede {
102
- max-width: 680px;
103
- margin-bottom: 0;
104
  color: var(--muted);
105
- font-size: 18px;
106
  }
107
 
108
- .hero__actions,
109
- .model__actions,
110
- .filters {
 
 
 
111
  display: flex;
112
- gap: 10px;
113
  flex-wrap: wrap;
114
- align-items: center;
115
  }
116
 
117
  .button,
118
- .model__actions a,
119
- .copy,
120
- .filter {
121
- min-height: 42px;
122
  display: inline-flex;
123
  align-items: center;
124
  justify-content: center;
125
- border-radius: 8px;
126
  border: 1px solid var(--line);
127
- background: #121b24;
 
128
  color: var(--text);
129
- padding: 0 14px;
130
- font: inherit;
131
- font-weight: 800;
132
  cursor: pointer;
 
 
133
  }
134
 
135
- .button--primary,
136
- .copy {
137
- border-color: transparent;
138
- background: var(--green);
139
- color: var(--ink);
140
  }
141
 
142
- .band {
143
- display: grid;
144
- grid-template-columns: repeat(4, minmax(0, 1fr));
145
- gap: 12px;
146
- margin: 0 0 74px;
147
  }
148
 
149
- .stats article,
150
- .model {
 
 
 
 
151
  border: 1px solid var(--line);
152
- border-radius: 8px;
153
- background: var(--panel);
 
 
 
154
  }
155
 
156
- .stats article {
157
- padding: 18px;
 
 
 
 
 
 
 
 
158
  }
159
 
160
- .stats span,
161
- .model__top {
162
- color: var(--muted);
163
- font-size: 13px;
 
164
  }
165
 
166
- .stats strong {
167
- display: block;
168
- margin: 4px 0;
169
- font-size: 30px;
170
- line-height: 1;
 
 
 
171
  }
172
 
173
- .stats p,
174
- .model p,
175
- .showcase p {
176
- margin-bottom: 0;
177
  color: var(--muted);
 
 
 
 
 
 
 
 
 
 
 
 
178
  }
179
 
180
- .section {
181
- padding-bottom: 72px;
 
 
 
 
 
 
 
 
 
 
 
182
  }
183
 
184
- .section__head {
185
- display: flex;
186
- justify-content: space-between;
187
- gap: 20px;
188
- align-items: end;
189
- margin-bottom: 18px;
190
  }
191
 
192
- .filter.is-active {
193
- border-color: var(--green);
194
- background: rgba(17, 196, 131, 0.13);
 
 
 
 
195
  }
196
 
197
- .models {
 
198
  display: grid;
199
- grid-template-columns: repeat(3, minmax(0, 1fr));
200
- gap: 14px;
 
201
  }
202
 
203
- .model {
204
- min-height: 340px;
 
 
 
205
  display: grid;
206
- grid-template-rows: auto auto 1fr auto auto;
207
- gap: 12px;
208
- padding: 18px;
209
  }
210
 
211
- .model__top {
212
- display: flex;
213
- justify-content: space-between;
214
  gap: 10px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  }
216
 
217
  code {
218
  display: block;
219
- overflow: auto;
220
  border: 1px solid var(--line);
221
- border-radius: 8px;
222
- background: #090e14;
223
- color: #d9fff0;
224
- padding: 12px;
225
- font-size: 12px;
226
  white-space: nowrap;
227
  }
228
 
229
- .showcase {
230
- display: grid;
231
- grid-template-columns: minmax(300px, 0.86fr) minmax(360px, 1.14fr);
232
- gap: 28px;
233
  align-items: center;
234
- padding: 34px;
235
- margin-bottom: 16px;
236
- border: 1px solid var(--line);
237
- border-radius: 8px;
238
- background: var(--panel);
239
  }
240
 
241
- .showcase > div {
242
- display: grid;
243
- gap: 16px;
244
- align-content: center;
245
  }
246
 
247
- .showcase img,
248
- .resource img {
249
- border-radius: 8px;
250
- border: 1px solid rgba(255, 255, 255, 0.11);
251
  }
252
 
253
- .lab-grid {
254
- display: grid;
255
- grid-template-columns: 1.3fr 0.85fr 0.85fr;
256
- gap: 14px;
257
- padding: 0 0 44px;
258
  }
259
 
260
- .resource {
261
- min-height: 230px;
262
- display: grid;
263
- align-content: space-between;
264
- gap: 14px;
265
- padding: 14px;
266
  border: 1px solid var(--line);
267
- border-radius: 8px;
268
- background: var(--panel-2);
269
- font-weight: 850;
270
  }
271
 
272
- .resource--wide {
273
- min-height: 300px;
 
 
274
  }
275
 
276
- .resource span {
277
- color: var(--text);
 
 
 
 
 
 
 
 
278
  }
279
 
280
  .toast {
281
  position: fixed;
 
282
  right: 18px;
283
  bottom: 18px;
284
  transform: translateY(90px);
285
- transition: transform 180ms ease;
286
  border: 1px solid var(--line);
287
- border-radius: 8px;
288
- background: #101820;
289
  color: var(--text);
290
- padding: 12px 14px;
291
- box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
 
292
  }
293
 
294
- .toast.is-visible {
295
- transform: translateY(0);
 
 
 
296
  }
297
 
298
- @media (max-width: 980px) {
299
- .hero,
300
- .showcase,
301
- .lab-grid {
302
- grid-template-columns: 1fr;
303
- }
304
 
305
- .band,
306
- .models {
307
- grid-template-columns: repeat(2, minmax(0, 1fr));
308
- }
309
 
310
- .section__head {
311
- align-items: start;
312
- flex-direction: column;
313
- }
 
 
 
 
 
 
314
  }
315
 
316
  @media (max-width: 640px) {
317
- main { width: min(100vw - 22px, 1200px); }
318
- .hero { min-height: auto; padding-top: 18px; }
319
- .hero__media, .hero__media img { min-height: 280px; }
320
- .band, .models { grid-template-columns: 1fr; }
321
- .showcase { padding: 18px; }
 
 
 
322
  }
323
-
 
1
  :root {
2
  color-scheme: dark;
3
+ --bg: #020405;
4
+ --text: rgba(249, 252, 255, 0.94);
5
+ --muted: rgba(229, 238, 246, 0.62);
6
+ --dim: rgba(229, 238, 246, 0.34);
7
+ --line: rgba(255, 255, 255, 0.12);
8
+ --panel: rgba(8, 15, 22, 0.62);
9
+ --panel-strong: rgba(12, 22, 31, 0.86);
10
+ --aqua: #25f7c4;
11
+ --gold: #f5b64a;
12
+ --blue: #5bd3ff;
13
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
14
+ --body: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
15
+ --display: Georgia, "Times New Roman", serif;
16
  }
17
 
18
  * { box-sizing: border-box; }
 
21
 
22
  body {
23
  margin: 0;
24
+ overflow-x: hidden;
25
+ background:
26
+ radial-gradient(circle at 82% 12%, rgba(245, 182, 74, 0.12), transparent 28%),
27
+ radial-gradient(circle at 18% 32%, rgba(37, 247, 196, 0.14), transparent 32%),
28
+ var(--bg);
29
  color: var(--text);
30
+ font: 16px/1.58 var(--body);
31
+ -webkit-font-smoothing: antialiased;
32
+ }
33
+
34
+ body::after {
35
+ content: "";
36
+ position: fixed;
37
+ inset: 0;
38
+ pointer-events: none;
39
+ z-index: 5;
40
+ background:
41
+ linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
42
+ linear-gradient(90deg, rgba(255,255,255,0.018) 1px, transparent 1px);
43
+ background-size: 64px 64px;
44
+ mask-image: linear-gradient(to bottom, black 0%, transparent 78%);
45
  }
46
 
47
  a { color: inherit; text-decoration: none; }
48
+ button { font: inherit; color: inherit; }
49
+ img { display: block; max-width: 100%; }
50
 
51
+ #field {
52
+ position: fixed;
53
+ inset: 0;
54
+ width: 100%;
55
+ height: 100%;
56
+ z-index: 0;
57
+ pointer-events: none;
58
  }
59
 
60
  main {
61
+ position: relative;
62
+ z-index: 1;
63
+ }
64
+
65
+ .screen {
66
+ min-height: 100svh;
67
+ position: relative;
68
+ width: min(1380px, calc(100vw - 44px));
69
  margin: 0 auto;
70
  }
71
 
72
  .hero {
 
73
  display: grid;
74
+ align-items: end;
75
+ padding: 8svh 0 34px;
 
 
76
  }
77
 
78
+ .asset-orbit {
79
+ position: absolute;
80
+ inset: 0;
81
+ pointer-events: none;
82
+ perspective: 1100px;
 
 
 
83
  }
84
 
85
+ .asset {
86
+ position: absolute;
87
+ border: 1px solid rgba(255,255,255,0.13);
88
+ border-radius: 14px;
89
+ background: rgba(2,4,5,0.45);
90
+ box-shadow: 0 30px 120px rgba(0,0,0,0.5);
91
  object-fit: cover;
92
+ opacity: 0.86;
93
+ filter: saturate(1.08) contrast(1.05);
94
+ animation: float 10s ease-in-out infinite;
95
  }
96
 
97
+ .asset-a {
98
+ width: min(48vw, 760px);
99
+ height: min(42vw, 520px);
100
+ left: 4vw;
101
+ top: 12svh;
102
+ transform: rotateX(6deg) rotateY(16deg) rotateZ(-2deg);
103
  }
104
 
105
+ .asset-b {
106
+ width: min(36vw, 560px);
107
+ right: 3vw;
108
+ top: 9svh;
109
+ animation-delay: -3s;
110
+ }
111
+
112
+ .asset-c {
113
+ width: min(35vw, 520px);
114
+ right: 8vw;
115
+ bottom: 18svh;
116
+ animation-delay: -5s;
117
+ }
118
+
119
+ .asset-d {
120
+ width: min(24vw, 340px);
121
+ left: 39vw;
122
+ bottom: 12svh;
123
+ animation-delay: -7s;
124
+ }
125
+
126
+ .hero::after {
127
+ content: "";
128
+ position: absolute;
129
+ inset: auto -40px 0;
130
+ height: 62%;
131
+ background: linear-gradient(to top, var(--bg) 0%, rgba(2,4,5,0.92) 24%, rgba(2,4,5,0.52) 68%, transparent 100%);
132
+ pointer-events: none;
133
+ }
134
+
135
+ .hero-copy {
136
+ position: relative;
137
+ z-index: 2;
138
+ max-width: 880px;
139
+ padding: 0 0 8svh;
140
+ }
141
+
142
+ .kicker {
143
+ display: inline-flex;
144
+ align-items: center;
145
+ gap: 12px;
146
+ margin: 0 0 22px;
147
+ color: var(--aqua);
148
+ font: 700 11px/1 var(--mono);
149
+ letter-spacing: 0.22em;
150
  text-transform: uppercase;
151
  }
152
 
153
+ .kicker span {
154
+ width: 8px;
155
+ height: 8px;
156
+ border-radius: 50%;
157
+ background: var(--aqua);
158
+ box-shadow: 0 0 18px rgba(37, 247, 196, 0.8);
159
+ animation: pulse 2.2s ease-in-out infinite;
160
+ }
161
+
162
  h1, h2, h3, p { margin-top: 0; }
163
 
164
  h1 {
165
+ margin-bottom: 28px;
166
+ max-width: 12ch;
167
+ font: 400 clamp(58px, 10vw, 146px)/0.88 var(--display);
 
168
  letter-spacing: 0;
169
+ text-shadow: 0 4px 54px #000;
170
  }
171
 
172
  h2 {
173
+ margin-bottom: 18px;
174
+ font: 400 clamp(42px, 6vw, 86px)/0.95 var(--display);
 
175
  letter-spacing: 0;
176
  }
177
 
178
  h3 {
179
+ margin-bottom: 18px;
180
+ font-size: clamp(28px, 4vw, 56px);
181
+ line-height: 1;
182
  letter-spacing: 0;
183
  }
184
 
185
  .lede {
186
+ max-width: 62ch;
187
+ margin-bottom: 28px;
188
  color: var(--muted);
189
+ font-size: 17px;
190
  }
191
 
192
+ .lede a {
193
+ color: var(--text);
194
+ border-bottom: 1px solid var(--line);
195
+ }
196
+
197
+ .actions {
198
  display: flex;
 
199
  flex-wrap: wrap;
200
+ gap: 12px;
201
  }
202
 
203
  .button,
204
+ .model-tabs button,
205
+ #copy-command {
206
+ min-height: 46px;
 
207
  display: inline-flex;
208
  align-items: center;
209
  justify-content: center;
 
210
  border: 1px solid var(--line);
211
+ border-radius: 999px;
212
+ background: rgba(255,255,255,0.035);
213
  color: var(--text);
214
+ padding: 0 18px;
215
+ font-size: 13px;
216
+ font-weight: 700;
217
  cursor: pointer;
218
+ backdrop-filter: blur(14px);
219
+ transition: transform 160ms ease, border-color 160ms ease, background 160ms ease;
220
  }
221
 
222
+ .button:hover,
223
+ .model-tabs button:hover,
224
+ #copy-command:hover {
225
+ transform: translateY(-1px);
226
+ border-color: rgba(255,255,255,0.36);
227
  }
228
 
229
+ .button.primary,
230
+ #copy-command {
231
+ border-color: rgba(37,247,196,0.8);
232
+ background: var(--aqua);
233
+ color: #00130d;
234
  }
235
 
236
+ .hero-panel {
237
+ position: absolute;
238
+ z-index: 3;
239
+ right: 2vw;
240
+ bottom: 32px;
241
+ width: min(430px, 36vw);
242
  border: 1px solid var(--line);
243
+ border-radius: 18px;
244
+ background: rgba(5, 10, 14, 0.72);
245
+ box-shadow: 0 22px 90px rgba(0,0,0,0.5);
246
+ backdrop-filter: blur(18px);
247
+ overflow: hidden;
248
  }
249
 
250
+ .panel-bar {
251
+ display: flex;
252
+ gap: 8px;
253
+ align-items: center;
254
+ padding: 12px 14px;
255
+ border-bottom: 1px solid var(--line);
256
+ color: var(--dim);
257
+ font: 700 10px/1 var(--mono);
258
+ letter-spacing: 0.14em;
259
+ text-transform: uppercase;
260
  }
261
 
262
+ .panel-bar span {
263
+ width: 9px;
264
+ height: 9px;
265
+ border-radius: 50%;
266
+ background: var(--line);
267
  }
268
 
269
+ .panel-bar span:first-child { background: var(--aqua); }
270
+ .panel-bar span:nth-child(2) { background: var(--gold); }
271
+ .panel-bar b { margin-left: auto; font-weight: 700; }
272
+
273
+ .ticker {
274
+ display: grid;
275
+ grid-template-columns: 1fr 1fr;
276
+ border-bottom: 1px solid var(--line);
277
  }
278
 
279
+ .ticker p {
280
+ margin: 0;
281
+ padding: 13px 14px;
282
+ border-right: 1px solid var(--line);
283
  color: var(--muted);
284
+ font: 11px/1.3 var(--mono);
285
+ }
286
+
287
+ .ticker p:nth-child(even) { border-right: 0; }
288
+
289
+ pre {
290
+ min-height: 150px;
291
+ margin: 0;
292
+ padding: 16px;
293
+ color: #d6fff2;
294
+ white-space: pre-wrap;
295
+ font: 12px/1.7 var(--mono);
296
  }
297
 
298
+ .scroll-cue {
299
+ position: absolute;
300
+ z-index: 3;
301
+ left: 50%;
302
+ bottom: 18px;
303
+ transform: translateX(-50%);
304
+ display: grid;
305
+ justify-items: center;
306
+ gap: 10px;
307
+ color: var(--dim);
308
+ font: 700 10px/1 var(--mono);
309
+ letter-spacing: 0.2em;
310
+ text-transform: uppercase;
311
  }
312
 
313
+ .scroll-cue i {
314
+ width: 1px;
315
+ height: 34px;
316
+ background: var(--line);
317
+ overflow: hidden;
 
318
  }
319
 
320
+ .scroll-cue i::after {
321
+ content: "";
322
+ display: block;
323
+ width: 100%;
324
+ height: 100%;
325
+ background: linear-gradient(transparent, var(--aqua), transparent);
326
+ animation: drop 1.8s ease-in-out infinite;
327
  }
328
 
329
+ .models,
330
+ .pipeline {
331
  display: grid;
332
+ align-content: center;
333
+ gap: 32px;
334
+ padding: 72px 0;
335
  }
336
 
337
+ .section-copy {
338
+ max-width: 860px;
339
+ }
340
+
341
+ .model-stage {
342
  display: grid;
343
+ grid-template-columns: 260px minmax(0, 1fr);
344
+ gap: 18px;
 
345
  }
346
 
347
+ .model-tabs {
348
+ display: grid;
 
349
  gap: 10px;
350
+ align-content: start;
351
+ }
352
+
353
+ .model-tabs button {
354
+ justify-content: flex-start;
355
+ border-radius: 14px;
356
+ }
357
+
358
+ .model-tabs button.active {
359
+ border-color: rgba(37,247,196,0.8);
360
+ background: rgba(37,247,196,0.12);
361
+ }
362
+
363
+ .model-readout {
364
+ min-height: 470px;
365
+ display: grid;
366
+ align-content: space-between;
367
+ gap: 24px;
368
+ padding: clamp(22px, 4vw, 52px);
369
+ border: 1px solid var(--line);
370
+ border-radius: 22px;
371
+ background:
372
+ linear-gradient(135deg, rgba(37,247,196,0.10), transparent 36%),
373
+ linear-gradient(315deg, rgba(245,182,74,0.10), transparent 36%),
374
+ var(--panel-strong);
375
+ box-shadow: inset 0 1px rgba(255,255,255,0.08), 0 30px 130px rgba(0,0,0,0.36);
376
+ }
377
+
378
+ .model-kind {
379
+ margin-bottom: 14px;
380
+ color: var(--aqua);
381
+ font: 700 11px/1 var(--mono);
382
+ letter-spacing: 0.2em;
383
+ text-transform: uppercase;
384
+ }
385
+
386
+ .model-readout p:not(.model-kind) {
387
+ max-width: 70ch;
388
+ color: var(--muted);
389
+ }
390
+
391
+ .command-wrap {
392
+ display: grid;
393
+ grid-template-columns: minmax(0, 1fr) auto;
394
+ gap: 12px;
395
+ align-items: center;
396
  }
397
 
398
  code {
399
  display: block;
400
+ overflow-x: auto;
401
  border: 1px solid var(--line);
402
+ border-radius: 16px;
403
+ background: rgba(0,0,0,0.42);
404
+ color: #d9fff3;
405
+ padding: 18px;
406
+ font: 12px/1.5 var(--mono);
407
  white-space: nowrap;
408
  }
409
 
410
+ .pipeline {
411
+ grid-template-columns: 0.82fr 1.18fr;
 
 
412
  align-items: center;
 
 
 
 
 
413
  }
414
 
415
+ .pipeline-copy {
416
+ max-width: 580px;
 
 
417
  }
418
 
419
+ .pipeline-copy p {
420
+ color: var(--muted);
421
+ margin-bottom: 24px;
 
422
  }
423
 
424
+ .pipeline-art {
425
+ min-height: 620px;
426
+ position: relative;
 
 
427
  }
428
 
429
+ .pipeline-art img {
430
+ position: absolute;
 
 
 
 
431
  border: 1px solid var(--line);
432
+ border-radius: 18px;
433
+ background: rgba(0,0,0,0.3);
434
+ box-shadow: 0 24px 110px rgba(0,0,0,0.46);
435
  }
436
 
437
+ .pipeline-art img:nth-child(1) {
438
+ width: 72%;
439
+ right: 0;
440
+ top: 2%;
441
  }
442
 
443
+ .pipeline-art img:nth-child(2) {
444
+ width: 58%;
445
+ left: 0;
446
+ top: 38%;
447
+ }
448
+
449
+ .pipeline-art img:nth-child(3) {
450
+ width: 34%;
451
+ right: 10%;
452
+ bottom: 0;
453
  }
454
 
455
  .toast {
456
  position: fixed;
457
+ z-index: 10;
458
  right: 18px;
459
  bottom: 18px;
460
  transform: translateY(90px);
 
461
  border: 1px solid var(--line);
462
+ border-radius: 999px;
463
+ background: rgba(6,12,17,0.86);
464
  color: var(--text);
465
+ padding: 12px 18px;
466
+ backdrop-filter: blur(14px);
467
+ transition: transform 180ms ease;
468
  }
469
 
470
+ .toast.show { transform: translateY(0); }
471
+
472
+ @keyframes float {
473
+ 0%, 100% { translate: 0 0; }
474
+ 50% { translate: 0 -20px; }
475
  }
476
 
477
+ @keyframes pulse {
478
+ 0%, 100% { transform: scale(1); opacity: 1; }
479
+ 50% { transform: scale(1.9); opacity: 0.55; }
480
+ }
 
 
481
 
482
+ @keyframes drop {
483
+ from { transform: translateY(-110%); }
484
+ to { transform: translateY(110%); }
485
+ }
486
 
487
+ @media (max-width: 980px) {
488
+ .screen { width: min(100vw - 28px, 1380px); }
489
+ .asset-a { width: 86vw; height: 52svh; left: 0; top: 9svh; }
490
+ .asset-b, .asset-d { display: none; }
491
+ .asset-c { width: 58vw; right: 0; bottom: 20svh; }
492
+ .hero-panel { position: relative; right: auto; bottom: auto; width: 100%; margin-bottom: 80px; }
493
+ .hero-copy { padding-bottom: 28px; }
494
+ .model-stage, .pipeline { grid-template-columns: 1fr; }
495
+ .model-tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
496
+ .pipeline-art { min-height: 520px; }
497
  }
498
 
499
  @media (max-width: 640px) {
500
+ h1 { font-size: clamp(48px, 17vw, 78px); }
501
+ .asset-c { display: none; }
502
+ .command-wrap { grid-template-columns: 1fr; }
503
+ .model-tabs { grid-template-columns: 1fr; }
504
+ .pipeline-art { min-height: 420px; }
505
+ .pipeline-art img:nth-child(1) { width: 100%; }
506
+ .pipeline-art img:nth-child(2) { width: 82%; top: 42%; }
507
+ .pipeline-art img:nth-child(3) { width: 52%; }
508
  }