|
64 | 64 | </a> |
65 | 65 | <div class="ym-navlinks" style="display: flex; align-items: center; gap: clamp(14px, 2.2vw, 34px); font-size: 14.5px; color: #ffffff; font-weight: 500;"> |
66 | 66 | <a href="#how" style="transition: color .2s;" style-hover="color: #19cdff;">How it works</a> |
67 | | - <a href="#engine" style="transition: color .2s;" style-hover="color: #19cdff;">Engine</a> |
68 | 67 | <a href="#benchmarks" style="transition: color .2s;" style-hover="color: #19cdff;">Benchmarks</a> |
69 | 68 | <a href="#savings" style="transition: color .2s;" style-hover="color: #19cdff;">Savings</a> |
70 | 69 | <a href="#compare" style="transition: color .2s;" style-hover="color: #19cdff;">Compare</a> |
@@ -235,118 +234,7 @@ <h3 style="margin: 22px 0 10px; font-family: 'Montserrat', sans-serif; font-weig |
235 | 234 | </div> |
236 | 235 | </section> |
237 | 236 |
|
238 | | - <!-- ENGINE / THREE LAYERS --> |
239 | | - <section id="engine" style="position: relative; padding: clamp(92px, 11vw, 168px) clamp(20px, 5vw, 72px); max-width: 1280px; margin: 0 auto;"> |
240 | | - <div style="font-size: 13px; font-weight: 600; letter-spacing: 2px; color: #19cdff; text-transform: uppercase; margin-bottom: 16px;">Under the hood</div> |
241 | | - <h2 style="margin: 0 0 14px; font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: clamp(32px, 4.4vw, 60px); letter-spacing: -1.4px; line-height: 1.02;">Three layers. One engine.</h2> |
242 | | - <p style="margin: 0; max-width: 620px; font-size: 18px; color: #cdd9e8; line-height: 1.5;">Vector search finds what you asked for. The graph finds what you forgot to ask for. Ebbinghaus decides what survives.</p> |
243 | 237 |
|
244 | | - <!-- ✦ ARCHITECTURE DIAGRAM --> |
245 | | - <div style="margin: 44px 0 0; padding: 34px 32px 28px; border-radius: 24px; background: linear-gradient(135deg, #0c1a30 0%, #0a1424 60%, #0c1a30 100%); border: 1px solid rgba(15,181,168,0.15); overflow: hidden;"> |
246 | | - <div style="font-size: 11px; font-weight: 600; letter-spacing: 1.5px; text-transform: uppercase; color: #19cdff; margin-bottom: 20px;">How the engine works</div> |
247 | | - <svg width="100%" viewBox="0 0 900 188" fill="none" xmlns="http://www.w3.org/2000/svg"> |
248 | | - <defs> |
249 | | - <linearGradient id="ymcyan" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#0e1a2c"/><stop offset="100%" stop-color="#0e1a2c"/></linearGradient> |
250 | | - <linearGradient id="ymteal" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#0e1a2c"/><stop offset="100%" stop-color="#0e1a2c"/></linearGradient> |
251 | | - <linearGradient id="ymamb" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#0e1a2c"/><stop offset="100%" stop-color="#0e1a2c"/></linearGradient> |
252 | | - <marker id="ymeng" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#19cdff" opacity=".5"/></marker> |
253 | | - </defs> |
254 | | - <!-- Query flows right → --> |
255 | | - <text x="14" y="100" font-size="10" fill="#cdd9e8" font-family="Figtree,sans-serif">Query →</text> |
256 | | - |
257 | | - <!-- Layer 1: Vector Search --> |
258 | | - <rect x="64" y="20" width="234" height="148" rx="16" fill="url(#ymcyan)" stroke="#19cdff" stroke-width="1.5"/> |
259 | | - <rect x="64" y="20" width="234" height="4" rx="2" fill="#19cdff" opacity=".6"/> |
260 | | - <g transform="translate(96,53)" stroke="#19cdff" stroke-width="1.8" fill="none" stroke-linecap="round"><circle cx="-2" cy="-2" r="6"/><line x1="2.5" y1="2.5" x2="7" y2="7"/></g> |
261 | | - <text x="116" y="58" font-size="13" fill="#0a192f" font-family="Figtree,sans-serif" font-weight="700">Vector Search</text> |
262 | | - <text x="84" y="87" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Dense + BM25 hybrid</text> |
263 | | - <text x="84" y="104" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Semantic similarity</text> |
264 | | - <text x="84" y="121" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Top-K candidates</text> |
265 | | - <text x="84" y="155" font-size="10" fill="#19cdff" font-family="JetBrains Mono,monospace">score ≥ 0.72</text> |
266 | | - |
267 | | - <!-- Connector 1→2 --> |
268 | | - <line x1="300" y1="94" x2="370" y2="94" stroke="#19cdff" stroke-width="1.5" stroke-dasharray="5 3" opacity=".5" marker-end="url(#ymeng)"><animate attributeName="stroke-dashoffset" from="0" to="-16" dur="1s" repeatCount="indefinite"/></line> |
269 | | - <text x="314" y="88" font-size="9" fill="#cdd9e8" font-family="Figtree,sans-serif">expand</text> |
270 | | - |
271 | | - <!-- Layer 2: Entity Graph --> |
272 | | - <rect x="374" y="20" width="234" height="148" rx="16" fill="url(#ymteal)" stroke="#19cdff" stroke-width="1.5"/> |
273 | | - <rect x="374" y="20" width="234" height="4" rx="2" fill="#19cdff" opacity=".6"/> |
274 | | - <g transform="translate(404,53)" stroke="#19cdff" stroke-width="1.6"><line x1="-6" y1="-4" x2="6" y2="-5"/><line x1="6" y1="-5" x2="-1" y2="6"/><line x1="-6" y1="-4" x2="-1" y2="6"/><circle cx="-6" cy="-4" r="2.6" fill="#19cdff" stroke="none"/><circle cx="6" cy="-5" r="2.6" fill="#19cdff" stroke="none"/><circle cx="-1" cy="6" r="2.6" fill="#19cdff" stroke="none"/></g> |
275 | | - <text x="422" y="58" font-size="13" fill="#0a192f" font-family="Figtree,sans-serif" font-weight="700">Entity Graph</text> |
276 | | - <text x="394" y="87" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Node expansion</text> |
277 | | - <text x="394" y="104" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Related memory hops</text> |
278 | | - <text x="394" y="121" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Temporal reasoning</text> |
279 | | - <text x="394" y="155" font-size="10" fill="#19cdff" font-family="JetBrains Mono,monospace">depth ≤ 2 hops</text> |
280 | | - |
281 | | - <!-- Connector 2→3 --> |
282 | | - <line x1="610" y1="94" x2="680" y2="94" stroke="#b8690a" stroke-width="1.5" stroke-dasharray="5 3" opacity=".5" marker-end="url(#ymeng)"><animate attributeName="stroke-dashoffset" from="0" to="-16" dur="1.2s" repeatCount="indefinite"/></line> |
283 | | - <text x="622" y="88" font-size="9" fill="#cdd9e8" font-family="Figtree,sans-serif">filter</text> |
284 | | - |
285 | | - <!-- Layer 3: Decay --> |
286 | | - <rect x="684" y="20" width="202" height="148" rx="16" fill="url(#ymamb)" stroke="#fbbf73" stroke-width="1.5"/> |
287 | | - <rect x="684" y="20" width="202" height="4" rx="2" fill="#fbbf73" opacity=".7"/> |
288 | | - <g transform="translate(712,53)" stroke="#b8690a" stroke-width="1.8" fill="none" stroke-linecap="round"><path d="M-7 -5 C -2 -5, -1 5, 6 5"/><circle cx="6" cy="5" r="1.6" fill="#b8690a" stroke="none"/></g> |
289 | | - <text x="730" y="58" font-size="13" fill="#0a192f" font-family="Figtree,sans-serif" font-weight="700">Decay Filter</text> |
290 | | - <text x="704" y="87" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Ebbinghaus S(t)</text> |
291 | | - <text x="704" y="104" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Prune S < 0.05</text> |
292 | | - <text x="704" y="121" font-size="11" fill="#cdd9e8" font-family="Figtree,sans-serif">Ranked output</text> |
293 | | - <text x="704" y="155" font-size="10" fill="#b8690a" font-family="JetBrains Mono,monospace">e^(−λt)</text> |
294 | | - </svg> |
295 | | - </div> |
296 | | - |
297 | | - |
298 | | - <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 30px; margin-top: 56px;"> |
299 | | - <sc-for list="{{ layers }}" as="layer" hint-placeholder-count="3"> |
300 | | - <div style="padding: 36px; border-radius: 20px; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); transition: transform .25s, border-color .25s;" style-hover="transform: translateY(-6px); border-color: rgba(94,234,212,0.35);"> |
301 | | - <div style="font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 1px; color: #19cdff; text-transform: uppercase;">{{ layer.tag }}</div> |
302 | | - <h3 style="margin: 12px 0 12px; font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 23px; letter-spacing: -0.4px;">{{ layer.title }}</h3> |
303 | | - <p style="margin: 0 0 20px; font-size: 15px; line-height: 1.6; color: #cdd9e8;">{{ layer.desc }}</p> |
304 | | - <div style="display: flex; flex-direction: column; gap: 10px;"> |
305 | | - <sc-for list="{{ layer.points }}" as="pt" hint-placeholder-count="3"> |
306 | | - <div style="display: flex; align-items: center; gap: 10px; font-size: 14px; color: #cdd9e8;"> |
307 | | - <span style="width: 6px; height: 6px; border-radius: 50%; background: #19cdff; flex: none;"></span>{{ pt }} |
308 | | - </div> |
309 | | - </sc-for> |
310 | | - </div> |
311 | | - </div> |
312 | | - </sc-for> |
313 | | - </div> |
314 | | - </section> |
315 | | - |
316 | | - <!-- INTERACTIVE DECAY --> |
317 | | - <section id="decay" style="position: relative; padding: clamp(92px, 11vw, 168px) clamp(20px, 5vw, 72px); max-width: 1280px; margin: 0 auto;"> |
318 | | - <div style="display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.25fr); gap: clamp(30px, 5vw, 70px); align-items: center;"> |
319 | | - <div> |
320 | | - <div style="font-size: 13px; font-weight: 600; letter-spacing: 2px; color: #b8690a; text-transform: uppercase; margin-bottom: 16px;">The forgetting curve</div> |
321 | | - <h2 style="margin: 0 0 16px; font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: clamp(30px, 4vw, 54px); letter-spacing: -1.4px; line-height: 1.03;">Watch memory fade.</h2> |
322 | | - <p style="margin: 0 0 28px; font-size: 17px; line-height: 1.6; color: #cdd9e8;">Every memory carries a strength score <span style="font-family: 'JetBrains Mono', monospace; color: #19cdff;">S(t) = e<sup>−λt</sup></span>. Different categories age at different rates. Drag to set the half-life — when strength drops below the prune line, the memory fades from retrieval.</p> |
323 | | - |
324 | | - <div style="display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 26px;"> |
325 | | - <sc-for list="{{ presets }}" as="p" hint-placeholder-count="3"> |
326 | | - <button onClick="{{ p.onClick }}" style="cursor: pointer; font-family: 'Google Sans', 'Figtree', sans-serif; font-size: 13.5px; font-weight: 600; color: {{ p.fg }}; background: {{ p.bg }}; border: 1px solid {{ p.bd }}; padding: 9px 16px; border-radius: 999px; transition: all .2s;">{{ p.label }}</button> |
327 | | - </sc-for> |
328 | | - </div> |
329 | | - |
330 | | - <div style="font-size: 13px; color: #cdd9e8; margin-bottom: 8px; display: flex; justify-content: space-between;"><span>Half-life</span><span style="font-family: 'JetBrains Mono', monospace; color: #ffffff;">{{ halfLifeLabel }}</span></div> |
331 | | - <input type="range" min="3" max="60" step="1" value="{{ halfLife }}" onInput="{{ onHalfLife }}" style="width: 100%; accent-color: #19cdff; cursor: pointer;"> |
332 | | - |
333 | | - <div style="margin-top: 26px; display: flex; gap: 26px;"> |
334 | | - <div> |
335 | | - <div style="font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 30px; color: #b8690a;">{{ strengthLabel }}</div> |
336 | | - <div style="font-size: 13px; color: #cdd9e8; margin-top: 4px;">Strength after 14 days</div> |
337 | | - </div> |
338 | | - <div> |
339 | | - <div style="font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 30px; color: #ffffff;">{{ pruneDayLabel }}</div> |
340 | | - <div style="font-size: 13px; color: #cdd9e8; margin-top: 4px;">Pruned at S < 0.05</div> |
341 | | - </div> |
342 | | - </div> |
343 | | - </div> |
344 | | - |
345 | | - <div style="position: relative; border-radius: 22px; background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(12,20,36,0.01)); border: 1px solid rgba(255,255,255,0.1); padding: 22px;"> |
346 | | - <canvas ref="{{ decayCanvasRef }}" style="width: 100%; height: 360px; display: block;"></canvas> |
347 | | - </div> |
348 | | - </div> |
349 | | - </section> |
350 | 238 |
|
351 | 239 | <!-- BENCHMARKS --> |
352 | 240 | <section id="benchmarks" style="position: relative; padding: clamp(92px, 11vw, 168px) clamp(20px, 5vw, 72px); max-width: 1280px; margin: 0 auto;"> |
@@ -1116,7 +1004,6 @@ <h3 style="margin: 0 0 6px; font-family: 'Montserrat', sans-serif; font-weight: |
1116 | 1004 | closeMenu: () => this.setState({ menuOpen: false }), |
1117 | 1005 | mobileLinks: [ |
1118 | 1006 | { href: '#how', label: 'How it works' }, |
1119 | | - { href: '#engine', label: 'Engine' }, |
1120 | 1007 | { href: '#benchmarks', label: 'Benchmarks' }, |
1121 | 1008 | { href: '#savings', label: 'Savings' }, |
1122 | 1009 | { href: '#compare', label: 'Compare' }, |
|
0 commit comments