@oracle-agent/oracle 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +10 -1
  2. package/bin/oracle-data-mcp.mjs +32 -0
  3. package/docs/cli.md +28 -0
  4. package/package.json +3 -3
  5. package/profiles/oracle/SOUL.md +10 -4
  6. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  7. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  8. package/public/oracle-splash/assets/llms/claude.svg +1 -0
  9. package/public/oracle-splash/assets/llms/codex.svg +1 -0
  10. package/public/oracle-splash/assets/llms/cursor-icon.svg +12 -0
  11. package/public/oracle-splash/assets/llms/cursor.svg +17 -0
  12. package/public/oracle-splash/assets/llms/deepseek.svg +1 -0
  13. package/public/oracle-splash/assets/llms/gemini.svg +1 -0
  14. package/public/oracle-splash/assets/llms/grok.svg +8 -0
  15. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  16. package/public/oracle-splash/assets/llms/kimi-icon.svg +1 -0
  17. package/public/oracle-splash/assets/llms/kimi.svg +1 -0
  18. package/public/oracle-splash/assets/llms/manus.svg +18 -0
  19. package/public/oracle-splash/assets/llms/openclaw.svg +22 -0
  20. package/public/oracle-splash/assets/llms/perplexity.svg +1 -0
  21. package/public/oracle-splash/assets/llms/qwen.svg +1 -0
  22. package/public/oracle-splash/assets/llms/windsurf.svg +1 -0
  23. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  24. package/public/oracle-splash/assets/protocols/across.png +0 -0
  25. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  26. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  27. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  28. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  29. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  30. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  31. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  32. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  33. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  34. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  35. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  36. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  37. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  38. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  39. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  40. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  41. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  42. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  43. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  44. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  45. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  46. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  47. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  48. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  49. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  50. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  51. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  52. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  53. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  54. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  55. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  56. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  57. package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -1
  58. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  59. package/public/oracle-splash/assets/wordmarks/gmx.svg +1 -1
  60. package/public/oracle-splash/assets/wordmarks/hyena.svg +7 -0
  61. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +1 -0
  62. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  63. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -1
  64. package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -1
  65. package/public/oracle-splash/assets/wordmarks/odos.svg +1 -1
  66. package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -1
  67. package/public/oracle-splash/assets/wordmarks/outcome.svg +16 -0
  68. package/public/oracle-splash/assets/wordmarks/paragon.svg +9 -0
  69. package/public/oracle-splash/assets/wordmarks/paraswap.svg +1 -1
  70. package/public/oracle-splash/assets/wordmarks/xyz.svg +12 -0
  71. package/public/oracle-splash/index.html +156 -184
  72. package/skills/oracle-chat/SKILL.md +61 -0
  73. package/skills/oracle-chat/chain.SKILL.md +31 -0
  74. package/skills/oracle-chat/setup.SKILL.md +37 -0
  75. package/skins/oracle.yaml +52 -0
  76. package/src/cli/chain-catalog.mjs +215 -0
  77. package/src/cli/chain-state.mjs +74 -0
  78. package/src/cli/commands/chain.mjs +143 -0
  79. package/src/cli/commands/chat.mjs +268 -0
  80. package/src/cli/commands/model.mjs +37 -0
  81. package/src/cli/commands/setup.mjs +283 -0
  82. package/src/cli/first-run.mjs +3 -0
  83. package/src/cli/kernel.mjs +42 -3
  84. package/src/cli/messaging-platforms.mjs +209 -0
  85. package/src/cli/oracle-harness.py +148 -0
  86. package/src/cli/paths.mjs +5 -0
  87. package/src/cli/setup-state.mjs +168 -0
  88. package/src/data/catalog.mjs +11 -0
  89. package/src/data/desk-data.mjs +6 -0
  90. package/src/data/providers/rfq.mjs +15 -0
  91. package/src/index.mjs +7 -0
  92. package/src/rfq/intent.mjs +180 -0
  93. package/src/rfq/sources.mjs +181 -0
@@ -4,12 +4,12 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>ORACLE</title>
7
- <meta name="description" content="Oracle multichain agent control. 13 chains, six bounded surfaces, prepare-only public plane. Self-custody. Powered by Hermes." />
7
+ <meta name="description" content="Oracle multichain agent control. Prepare-only public plane. Self-custody. Powered by Hermes." />
8
8
  <meta name="theme-color" content="#0B1018" />
9
9
  <meta name="robots" content="noindex,nofollow" />
10
10
  <link rel="preconnect" href="https://fonts.googleapis.com" />
11
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
- <link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Sans:wght@500;700&family=IBM+Plex+Mono:wght@400;500&family=Inter:wght@500;650;750;850&family=Manrope:wght@600;800&family=Outfit:wght@300;400;500;700&family=Sora:wght@500;700&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
12
+ <link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Sans:wght@500;700&family=IBM+Plex+Mono:wght@400;500&family=Inter:wght@500;650;750;850&family=UnifrakturCook:wght@700&family=Manrope:wght@600;800&family=Outfit:wght@300;400;500;700&family=Sora:wght@500;700&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
13
13
  <style>
14
14
  :root{
15
15
  --bg:#0B1018;
@@ -18,9 +18,9 @@
18
18
  --blue:#7CC4FF;
19
19
  --blue2:#A7D8FF;
20
20
  --blue-dim:#3a6f99;
21
- --ink:#E8F1FA;
22
- --cool:#9BB6D1;
23
- --mute:#5B738F;
21
+ --ink:#F4F9FE;
22
+ --cool:#C9DAEC;
23
+ --mute:#9FB8D2;
24
24
  --line:rgba(124,196,255,.14);
25
25
  --line-2:rgba(124,196,255,.24);
26
26
  --evm:#7CC4FF;
@@ -39,8 +39,8 @@
39
39
  *{box-sizing:border-box;margin:0;padding:0}
40
40
  html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
41
41
  body{
42
- min-height:100dvh;background:var(--bg);color:var(--ink);
43
- font-family:var(--sans);font-weight:300;overflow-x:hidden;
42
+ min-height:100dvh;background:var(--bg);color:var(--ink);position:relative;isolation:isolate;
43
+ font-family:var(--sans);font-weight:400;overflow-x:hidden;
44
44
  }
45
45
  ::selection{background:var(--blue);color:#061018}
46
46
  a{color:inherit;text-decoration:none}
@@ -92,7 +92,6 @@ img{display:inline-block}
92
92
  align-items:center;gap:16px;
93
93
  padding:14px var(--pad);
94
94
  background:rgba(11,16,24,.82);
95
- backdrop-filter:blur(14px);
96
95
  border-bottom:1px solid var(--line);
97
96
  }
98
97
  .brand{
@@ -118,12 +117,12 @@ img{display:inline-block}
118
117
  .nav-cta:hover{border-color:var(--blue);color:var(--blue2);box-shadow:0 0 0 1px rgba(124,196,255,.12)}
119
118
 
120
119
  /* fixed soft field behind content */
121
- #gl{position:fixed;inset:0;width:100%;height:100%;z-index:0;display:block;opacity:.9}
120
+ #gl{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block;opacity:.4;pointer-events:none}
122
121
  .veil{
123
122
  position:fixed;inset:0;z-index:1;pointer-events:none;
124
123
  background:
125
- radial-gradient(60% 50% at 50% 28%, rgba(124,196,255,.08), transparent 58%),
126
- linear-gradient(180deg, rgba(11,16,24,.2), var(--bg) 88%);
124
+ radial-gradient(60% 50% at 50% 28%, rgba(124,196,255,.10), transparent 58%),
125
+ linear-gradient(180deg, rgba(11,16,24,.12), rgba(11,16,24,.42));
127
126
  }
128
127
  main{position:relative;z-index:2;padding-top:84px}
129
128
 
@@ -146,10 +145,10 @@ main{position:relative;z-index:2;padding-top:84px}
146
145
  margin-bottom:6px;position:relative;z-index:3;
147
146
  }
148
147
  .hero-stage{position:relative;width:100%;display:grid;place-items:center;min-height:clamp(360px,52vh,560px)}
149
- .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:1;pointer-events:none}
150
- #orb-gl{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(96vw,840px);aspect-ratio:1;display:none}
151
- .webgl-orb #orb-gl{display:block}
152
- .webgl-orb .hero-orb{display:none}
148
+ .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none}
149
+ #orb-vid{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(74vw,620px);aspect-ratio:1;object-fit:contain;opacity:0;transition:opacity 1.4s var(--ease);mix-blend-mode:screen}
150
+ #orb-vid.ready{opacity:.62}
151
+ .blender-orb .hero-orb{display:none}
153
152
  .hero-orb{
154
153
  width:clamp(380px,50vw,640px);aspect-ratio:1;position:relative;transform-style:preserve-3d;
155
154
  animation:orb-slew 22s linear infinite;
@@ -178,6 +177,9 @@ main{position:relative;z-index:2;padding-top:84px}
178
177
  text-shadow:0 2px 30px rgba(0,0,0,.6);
179
178
  }
180
179
  .home-title em{font-style:italic;color:var(--blue2)}
180
+ .hero-lockup{position:relative;z-index:2;display:flex;flex-direction:column;align-items:center}
181
+ .hero-byline{margin-top:12px;font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.28em;text-transform:uppercase;color:var(--blue2);position:relative;z-index:3}
182
+ .hero-byline:hover{color:var(--ink)}
181
183
  .home-copy{position:relative;z-index:3;display:flex;flex-direction:column;align-items:center}
182
184
  .home-copy p:not(.home-kicker){max-width:56ch;color:#aac0d6;font-size:16px;line-height:1.7;margin:18px 0 0;text-shadow:0 1px 20px rgba(0,0,0,.65)}
183
185
  .home-actions{display:flex;flex-wrap:wrap;gap:14px;margin-top:26px;align-items:center;justify-content:center}
@@ -193,12 +195,12 @@ main{position:relative;z-index:2;padding-top:84px}
193
195
  .hero-note{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
194
196
  @keyframes orb-slew{0%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(0deg)}100%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(360deg)}}
195
197
  @keyframes home-breathe{0%,100%{opacity:.65;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
196
- @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}}
198
+ @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}
197
199
 
198
200
 
199
201
  .section{
200
202
  position:relative;z-index:2;max-width:var(--max);margin:0 auto;
201
- padding:clamp(28px,5vh,48px) var(--pad) 0;
203
+ padding:clamp(56px,10vh,110px) var(--pad) 0;
202
204
  }
203
205
  .section:first-of-type{padding-top:clamp(18px,3vh,28px)}
204
206
  .section-label{
@@ -211,7 +213,7 @@ main{position:relative;z-index:2;padding-top:84px}
211
213
  max-width:18ch;margin-bottom:12px;
212
214
  }
213
215
  .section-title em{font-style:italic;color:var(--blue2)}
214
- .section-lede{max-width:52ch;color:var(--cool);font-size:15px;line-height:1.65;margin-bottom:clamp(28px,4vw,44px)}
216
+ .section-lede{max-width:52ch;color:#C9DAEC;font-size:16px;line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
215
217
 
216
218
  /* orchestration graph */
217
219
  .graph-shell{
@@ -219,9 +221,9 @@ main{position:relative;z-index:2;padding-top:84px}
219
221
  background:linear-gradient(180deg, rgba(124,196,255,.04), transparent 42%), var(--panel);
220
222
  }
221
223
  .graph-top{
222
- display:flex;flex-wrap:wrap;justify-content:space-between;gap:10px;
224
+ display:flex;flex-wrap:wrap;justify-content:center;gap:10px;
223
225
  padding:14px 18px;border-bottom:1px solid var(--line);
224
- font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
226
+ font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:#9FB8D2;
225
227
  }
226
228
  .graph-top b{color:var(--blue);font-weight:500}
227
229
  .graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
@@ -246,7 +248,7 @@ main{position:relative;z-index:2;padding-top:84px}
246
248
  .route-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
247
249
  }
248
250
  .node{
249
- border:1px solid var(--line-2);border-radius:14px;background:rgba(11,16,24,.72);
251
+ border:1px solid rgba(124,196,255,.42);border-radius:14px;background:rgba(21,32,49,.92);
250
252
  padding:14px 12px;text-align:center;
251
253
  transition:border-color .3s,transform .3s var(--ease),box-shadow .3s;
252
254
  }
@@ -260,11 +262,11 @@ main{position:relative;z-index:2;padding-top:84px}
260
262
  display:flex;flex-direction:column;align-items:center;
261
263
  }
262
264
  .node.hub .orbital{width:74px;height:74px;margin:2px 0 10px;filter:drop-shadow(0 0 20px rgba(124,196,255,.35))}
263
- .node .tag{font-family:var(--mono);font-size:9px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);margin-bottom:8px}
265
+ .node .tag{font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:#9FB8D2;margin-bottom:8px}
264
266
  .node.hub .tag{color:var(--blue)}
265
- .node .name{font-family:var(--display);font-size:22px;line-height:1;letter-spacing:.01em;margin-bottom:6px}
267
+ .node .name{font-family:var(--display);font-size:22px;font-weight:500;color:#DCEAF6;line-height:1;letter-spacing:.01em;margin-bottom:6px}
266
268
  .node.hub .name{font-size:34px;font-weight:400;font-style:italic}
267
- .node .sub{font-family:var(--mono);font-size:10px;letter-spacing:.06em;color:var(--cool);line-height:1.45}
269
+ .node .sub{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:#C9DAEC;line-height:1.5}
268
270
  .node.route{min-height:138px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
269
271
  .node.route .name{font-size:18px;margin-bottom:8px}
270
272
  .node.route .chains{
@@ -360,14 +362,14 @@ main{position:relative;z-index:2;padding-top:84px}
360
362
  margin-top:22px;
361
363
  }
362
364
  .moat-card{
363
- background:var(--bg);padding:clamp(20px,3vw,28px);min-height:140px;
365
+ background:rgba(17,25,37,.94);padding:clamp(20px,3vw,28px);min-height:140px;
364
366
  display:flex;flex-direction:column;gap:10px;
365
367
  transition:background .35s;
366
368
  }
367
369
  .moat-card:hover{background:var(--panel-2)}
368
370
  .moat-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
369
371
  .moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
370
- .moat-card p{color:var(--cool);font-size:14px;line-height:1.55;max-width:44ch}
372
+ .moat-card p{color:#C9DAEC;font-size:15px;line-height:1.55;max-width:44ch}
371
373
  @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
372
374
  .evolve-rail{
373
375
  display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
@@ -382,7 +384,7 @@ main{position:relative;z-index:2;padding-top:84px}
382
384
  .wires{height:40px;position:relative}
383
385
  .wires svg{width:100%;height:100%;display:block;overflow:visible}
384
386
  .wires path{
385
- fill:none;stroke:rgba(124,196,255,.35);stroke-width:1.25;stroke-linecap:round;
387
+ fill:none;stroke:rgba(124,196,255,.58);stroke-width:1.5;stroke-linecap:round;
386
388
  stroke-dasharray:1;stroke-dashoffset:1;
387
389
  transition:stroke-dashoffset 1.3s var(--ease);
388
390
  }
@@ -403,7 +405,7 @@ main{position:relative;z-index:2;padding-top:84px}
403
405
  .wires.multi circle.c-sol{fill:var(--sol)}
404
406
 
405
407
  /* route detail cards */
406
- .route-card{
408
+ .route-card{background:rgba(17,25,37,.94);
407
409
  background:var(--bg);padding:22px 20px;min-height:150px;
408
410
  display:flex;flex-direction:column;gap:10px;transition:background .35s;
409
411
  }
@@ -411,8 +413,11 @@ main{position:relative;z-index:2;padding-top:84px}
411
413
  .route-card h3{font-family:var(--display);font-weight:400;font-size:26px;display:flex;align-items:center;gap:10px}
412
414
  .route-card h3 img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
413
415
  .route-card .where{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
414
- .route-card p{color:var(--cool);font-size:13.5px;line-height:1.55}
416
+ .route-card p{color:#C9DAEC;font-size:15px;line-height:1.55}
415
417
  .route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
418
+ .route-card.p-add{grid-column:1/-1;align-items:center;text-align:center;justify-content:center;gap:14px;padding:30px 22px}
419
+ .route-card.p-add .chips{justify-content:center;margin-top:4px}
420
+ .route-card.p-add p{max-width:46ch}
416
421
  .chip-s{
417
422
  font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
418
423
  border:1px solid var(--line);border-radius:999px;padding:5px 8px;color:var(--cool);
@@ -434,9 +439,19 @@ main{position:relative;z-index:2;padding-top:84px}
434
439
 
435
440
  /* chains */
436
441
  .chain-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
442
+ .hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:14px;padding:20px;background:rgba(124,196,255,.02)}
443
+ .hl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
444
+ .hl-grid article{border:1px solid rgba(124,196,255,.22);border-radius:10px;padding:16px 17px;background:rgba(17,25,37,.92)}
445
+ .hl-grid h3{font-family:var(--display);font-size:15px;font-weight:500;color:var(--ink);margin:0 0 6px}
446
+ .hl-grid p{font-size:14px;line-height:1.6;color:#C9DAEC;margin:0}
447
+ .hl-note{margin:16px 0 0;font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--cool);opacity:.62}
448
+ .hip3{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
449
+ .hl-note code{font-family:var(--mono);color:var(--blue2);opacity:.9}
450
+ @media(max-width:900px){.hl-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
451
+ @media(max-width:620px){.hl-grid{grid-template-columns:1fr}}
437
452
  .chain{
438
453
  border:1px solid var(--line);border-radius:14px;padding:16px;
439
- background:linear-gradient(180deg, rgba(124,196,255,.035), transparent 55%), var(--panel);
454
+ background:linear-gradient(180deg, rgba(124,196,255,.06), transparent 55%), rgba(17,25,37,.94);
440
455
  min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
441
456
  transition:border-color .3s,transform .3s var(--ease);
442
457
  }
@@ -453,6 +468,7 @@ main{position:relative;z-index:2;padding-top:84px}
453
468
  .badge.live{border-color:rgba(124,196,255,.35);color:var(--blue)}
454
469
 
455
470
  .venues{margin-top:14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:rgba(17,25,37,.85)}
471
+ .venues{background:rgba(17,25,37,.86);border:1px solid rgba(124,196,255,.16);border-radius:16px;overflow:hidden;margin-bottom:14px}
456
472
  .venues-head{
457
473
  padding:11px 14px;border-bottom:1px solid var(--line);
458
474
  font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
@@ -463,6 +479,7 @@ main{position:relative;z-index:2;padding-top:84px}
463
479
  .marquee + .marquee{border-top:1px solid rgba(124,196,255,.08)}
464
480
  .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll 48s linear infinite;will-change:transform}
465
481
  .marquee.rev .track{animation-direction:reverse;animation-duration:56s}
482
+ a.chip{text-decoration:none;color:inherit}
466
483
  .chip{
467
484
  display:inline-flex;align-items:center;gap:10px;
468
485
  font-size:15px;letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
@@ -471,7 +488,8 @@ main{position:relative;z-index:2;padding-top:84px}
471
488
  }
472
489
  .chip img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
473
490
  .chip.wm-chip{padding:10px 16px}
474
- .chip img.wm{width:auto;height:20px;max-width:150px;border-radius:0;object-fit:contain;background:none;opacity:.92}
491
+ .chip img.wm{width:auto;height:20px;max-width:150px;border-radius:0;object-fit:contain;background:none;opacity:1}
492
+ .chip img.wm.tall{height:22px;max-width:26px}
475
493
 
476
494
  .chip .wordmark{font-family:var(--proto-font,var(--sans));font-weight:var(--proto-weight,750);font-style:var(--proto-style,normal);text-transform:var(--proto-transform,none);letter-spacing:var(--proto-track,-.025em);line-height:1.2}
477
495
  .proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
@@ -505,7 +523,7 @@ main{position:relative;z-index:2;padding-top:84px}
505
523
  margin-top:8px;
506
524
  }
507
525
  .wallet-card{
508
- background:var(--bg);padding:clamp(22px,3vw,30px);
526
+ background:rgba(17,25,37,.94);padding:clamp(22px,3vw,30px);
509
527
  display:flex;flex-direction:column;gap:12px;min-height:170px;
510
528
  transition:background .35s;
511
529
  }
@@ -522,6 +540,8 @@ main{position:relative;z-index:2;padding-top:84px}
522
540
  }
523
541
 
524
542
  footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px;position:relative;z-index:2}
543
+ .labs-link{font-family:"UnifrakturCook","Old English Text MT","Lucida Blackletter",serif;font-size:16px;letter-spacing:.04em;text-transform:none;color:var(--blue2)}
544
+ .labs-link:hover{color:var(--ink)}
525
545
  .foot-row{
526
546
  max-width:var(--max);margin:0 auto 14px;
527
547
  display:flex;flex-wrap:wrap;gap:14px 24px;justify-content:space-between;align-items:center;
@@ -541,9 +561,9 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
541
561
  font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
542
562
  }
543
563
 
544
- .js .rv{opacity:0;transform:translateY(18px);filter:blur(4px)}
545
- .js .rv.in{opacity:1;transform:none;filter:blur(0);transition:opacity 1s var(--ease),transform 1s var(--ease),filter .9s var(--ease)}
546
- .js .rv.done{filter:none;transform:none;will-change:auto}
564
+ .js .rv{opacity:0;transform:translateY(18px)}
565
+ .js .rv.in{opacity:1;transform:none;transition:opacity .9s var(--ease),transform .9s var(--ease)}
566
+ .js .rv.done{transform:none;will-change:auto}
547
567
 
548
568
  @media (max-width:960px){
549
569
  .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:clamp(80px,20vw,150px)}
@@ -602,7 +622,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
602
622
  </span>
603
623
  oracle</a>
604
624
  <nav class="nav-links" aria-label="Primary">
605
- <span class="nav-chip">13 chains · 6 bounded surfaces</span>
606
625
  <a class="hide-sm" href="#orchestration">How it works</a>
607
626
  <a class="hide-sm" href="#wallets">Wallets</a>
608
627
  <a class="hide-sm" href="#chains">Chains</a>
@@ -617,7 +636,9 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
617
636
  <div class="home-inner">
618
637
  <div class="hero-stage">
619
638
  <div class="hero-art" aria-hidden="true">
620
- <canvas id="orb-gl"></canvas>
639
+ <video id="orb-vid" muted loop playsinline preload="none" hidden>
640
+ <source src="assets/hero/orb.webm" type="video/webm">
641
+ </video>
621
642
  <div class="hero-orb" id="hero-orb">
622
643
  <span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
623
644
  <span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
@@ -626,14 +647,16 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
626
647
  <span class="orbit-dot"></span>
627
648
  </div>
628
649
  </div>
629
- <h1 class="home-title" id="hero-title">OR<em>ACLE</em></h1>
650
+ <div class="hero-lockup" id="hero-title">
651
+ <h1 class="home-title">OR<em>ACLE</em></h1>
652
+ <a class="hero-byline" href="https://x.com/demi_hl" target="_blank" rel="noopener noreferrer">BY DEMI</a>
653
+ </div>
630
654
  </div>
631
655
  <div class="home-copy">
632
656
  <p class="home-kicker">self-custody agent control</p>
633
- <p>One control plane for Hyperliquid, Polymarket, EVM, Bitcoin, Solana, Stable, Robinhood Chain, and new protocol builds. The model prepares. Policy bounds. You enter when your wallet signs.</p>
657
+ <p>One control plane for Hyperliquid, Polymarket, EVM, Bitcoin, Solana, Stable, Robinhood Chain, and new protocol builds. Cross-chain research, trade, protocol interactions, NFT listing and buying. The all-in-one crypto agent. The future is agentic.</p>
634
658
  <div class="home-actions">
635
659
  <a class="enter-cta" href="#orchestration">Enter oracle</a>
636
- <span class="hero-note">13 chains · 6 bounded surfaces · protocol builder</span>
637
660
  </div>
638
661
  </div>
639
662
  </div>
@@ -642,13 +665,11 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
642
665
  <section class="section" id="orchestration">
643
666
  <p class="section-label rv">How it works</p>
644
667
  <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
645
- <p class="section-lede rv">Not one bot. A mesh: Input / Command hits the oracle control plane, then fans out across venue profiles, multi-chain EVM, Bitcoin, Solana, and a protocol builder. The public plane is prepare-only. Your wallet signs.</p>
668
+ <p class="section-lede rv">Not one bot. A mesh with profile routing via Hermes: Input / Command hits the oracle control plane, then fans out across venue profiles, multi-chain EVM, Bitcoin, Solana, and a protocol builder. Any MCP harness can drive a single agent. The public plane is prepare-only. Your wallet signs.</p>
646
669
 
647
670
  <div class="graph-shell rv">
648
671
  <div class="graph-top">
649
- <span>for <b>users</b></span>
650
672
  <span>multi-profile // protocol builder // multi-chain</span>
651
- <span><b>prepare-only</b> public plane</span>
652
673
  </div>
653
674
 
654
675
  <div class="evolve-rail">
@@ -723,7 +744,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
723
744
  <div class="tag">profile</div>
724
745
  <div class="name">robinhood agent</div>
725
746
  <div class="sub">markets · nfts · names</div>
726
- <div class="chains"><span class="ch">Robinhood Chain 4663 <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
747
+ <div class="chains"><span class="ch">Robinhood Chain <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
727
748
  </div>
728
749
  <div class="node route p-sol">
729
750
  <div class="tag">profile</div>
@@ -806,11 +827,11 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
806
827
  <article class="route-card p-rh">
807
828
  <div class="where">robinhood agent →</div>
808
829
  <h3>Robinhood <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=40&h=40" alt="Robinhood Chain" loading="lazy"></h3>
809
- <p>RH Chain markets, NFTs, names, token scans, and chain-local routing on 4663.</p>
830
+ <p>RH Chain markets, NFTs, names, token scans, and chain-local routing.</p>
810
831
  <div class="chips">
811
832
  <span class="chip-s">markets</span>
812
833
  <span class="chip-s">NFTs</span>
813
- <span class="chip-s">4663</span>
834
+ <span class="chip-s">rh chain</span>
814
835
  </div>
815
836
  </article>
816
837
  <article class="route-card p-sol">
@@ -843,13 +864,23 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
843
864
  <span class="chip-s">best route</span>
844
865
  </div>
845
866
  </article>
867
+ <article class="route-card p-nft">
868
+ <div class="where">nft agent →</div>
869
+ <h3>Cross-chain NFTs <img src="assets/protocols/opensea.png" alt="OpenSea" loading="lazy"></h3>
870
+ <p>List across 22 EVM chains and Solana via OpenSea. Buy and list Ordinals through Satflow with proven PSBT provenance. Solana listings via Magic Eden. Floors, holdings and PnL are read first, then prepared for your signature.</p>
871
+ <div class="chips">
872
+ <span class="chip-s">list</span>
873
+ <span class="chip-s">buy</span>
874
+ <span class="chip-s">floor · pnl</span>
875
+ </div>
876
+ </article>
846
877
  <article class="route-card p-stable">
847
878
  <div class="where">stable agent →</div>
848
879
  <h3>Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=40&h=40" alt="Stable" loading="lazy"></h3>
849
- <p>Stable mainnet launch radar and venue ops on chain 988, scanned straight from the chain's own logs.</p>
880
+ <p>Stable mainnet launch radar and venue ops, scanned straight from the chain's own logs.</p>
850
881
  <div class="chips">
851
882
  <span class="chip-s">launches</span>
852
- <span class="chip-s">Stable 988</span>
883
+ <span class="chip-s">Stable</span>
853
884
  </div>
854
885
  </article>
855
886
  <article class="route-card p-build">
@@ -943,10 +974,25 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
943
974
  <h2 class="section-title rv">Where you can <em>operate.</em></h2>
944
975
  <p class="section-lede rv">Live coverage grows with the profile mesh. Each chain maps to an agent, and new agents can join.</p>
945
976
  <div class="chain-grid" id="chain-grid"></div>
977
+ <div class="hl-surface rv">
978
+ <div class="venues-head"><span>hyperliquid // what oracle actually does</span><span><b>prepare-only</b> · your wallet signs</span></div>
979
+ <div class="hl-grid">
980
+ <article><h3>Perps</h3><p>Asset info, order + bracket prepare, cancel, leverage and isolated-margin updates. Tick and lot sizing enforced to 5 sig figs.</p></article>
981
+ <article><h3>Spot &amp; markets</h3><p>Spot meta, mids, L2 book, candles, market and coin datapoints, leaderboards.</p></article>
982
+ <article><h3>Staking</h3><p>Validator summaries, delegations, rewards and history. Stake deposit, withdraw and delegate prepare with a 7-day unstaking queue.</p></article>
983
+ <article><h3>Outcome markets</h3><p>HIP-4 outcome listing plus order and cancel prepare.</p></article>
984
+ <article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
985
+ <article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
986
+ </div>
987
+ </div>
946
988
  <div class="venues rv">
947
989
  <div class="venues-head"><span>protocols // venues</span><span><b>routed by name</b> · quotes ranked · prepare-only</span></div>
948
- <div class="marquee" aria-hidden="true"><div class="track" id="proto-track-a"></div></div>
949
- <div class="marquee rev" aria-hidden="true"><div class="track" id="proto-track-b"></div></div>
990
+ <div class="marquee"><div class="track" id="proto-track-a"></div></div>
991
+ <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
992
+ </div>
993
+ <div class="venues rv">
994
+ <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
995
+ <div class="marquee"><div class="track" id="llm-track"></div></div>
950
996
  </div>
951
997
  </section>
952
998
 
@@ -977,9 +1023,8 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
977
1023
  </div>
978
1024
  </div>
979
1025
  <div class="foot-meta">
980
- <span>oracle · for users</span>
981
- <span>13 chains · six bounded surfaces · protocol builder</span>
982
- <span>you sign // no house custody</span>
1026
+ <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
1027
+ <span>self custodial // the future is agentic</span>
983
1028
  </div>
984
1029
  </footer>
985
1030
 
@@ -1008,53 +1053,79 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1008
1053
  var cls = c.badge === "live" ? "badge live" : "badge";
1009
1054
  var label = c.badge === "live" ? "live" : "read";
1010
1055
  return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
1011
- ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div><div class="id">' + c.id +
1012
- '</div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1056
+ ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1013
1057
  }).join("");
1014
1058
 
1015
1059
  var WM = "assets/wordmarks/";
1016
1060
  var PROTOS_A = [
1017
- { n: "Uniswap", wm: "uniswap.svg" },
1018
- { n: "Hyperliquid", wm: "hyperliquid.svg" },
1019
- { n: "Polymarket", wm: "polymarket.png" },
1020
- { n: "Aerodrome", wm: "aerodrome.svg" },
1021
- { n: "Velodrome", wm: "velodrome.svg" },
1022
- { n: "PancakeSwap", wm: "pancakeswap.svg" },
1023
- { n: "QuickSwap", wm: "quickswap.png" },
1024
- { n: "LFJ", c: "lfj", s: "protocols/lfj" },
1025
- { n: "HyperSwap", wm: "hyperswap.svg" },
1026
- { n: "Curve", c: "curve", s: "protocols/curve-dex" },
1027
- { n: "Balancer", wm: "balancer.svg" },
1028
- { n: "Pendle", wm: "pendle.png" }
1061
+ { n: "Hyperliquid", wm: "hyperliquid.svg", u: "https://hyperliquid.xyz" },
1062
+ { n: "Outcome", wm: "outcome.svg", u: "https://outcome.xyz" },
1063
+ { n: "XYZ", wm: "xyz.svg", u: "https://trade.xyz" },
1064
+ { n: "Markets By Kinetiq", wm: "kinetiq.svg", tall: 1, u: "https://kinetiq.xyz" },
1065
+ { n: "HyENA", wm: "hyena.svg", u: "https://hyena.trade" },
1066
+ { n: "Paragon", wm: "paragon.svg", tall: 1, u: "https://paragon.trade" },
1067
+ { n: "HyperSwap", wm: "hyperswap.svg", u: "https://hyperswap.exchange" },
1068
+ { n: "Uniswap", wm: "uniswap.svg", u: "https://uniswap.org" },
1069
+ { n: "Polymarket", wm: "polymarket.png", u: "https://polymarket.com" },
1070
+ { n: "Aerodrome", wm: "aerodrome.svg", u: "https://aerodrome.finance" },
1071
+ { n: "Velodrome", wm: "velodrome.svg", u: "https://velodrome.finance" },
1072
+ { n: "PancakeSwap", wm: "pancakeswap.svg", u: "https://pancakeswap.finance" },
1073
+ { n: "QuickSwap", wm: "quickswap.png", u: "https://quickswap.exchange" },
1074
+ { n: "LFJ", wm: "lfj.webp", tall: 1, u: "https://lfj.gg" },
1075
+ { n: "Curve", wm: "curve.png", tall: 1, u: "https://curve.finance" },
1076
+ { n: "Balancer", wm: "balancer.svg", u: "https://balancer.fi" },
1077
+ { n: "Pendle", wm: "pendle.png", u: "https://pendle.finance" }
1029
1078
  ];
1030
1079
  var PROTOS_B = [
1031
- { n: "Morpho", wm: "morpho.svg" },
1032
- { n: "GMX", wm: "gmx.svg" },
1033
- { n: "LI.FI", wm: "lifi.png" },
1034
- { n: "Relay", wm: "relay.svg" },
1035
- { n: "Velora", wm: "paraswap.svg" },
1036
- { n: "Odos", wm: "odos.svg" },
1037
- { n: "CoW Swap", wm: "cowswap.svg" },
1038
- { n: "1inch", wm: "oneinch.svg" },
1039
- { n: "Jupiter", wm: "jupiter.svg" },
1040
- { n: "OpenSea", wm: "opensea.svg" },
1041
- { n: "Across", wm: "across.svg" },
1042
- { n: "Stargate", wm: "stargate.svg" },
1043
- { n: "Magic Eden", wm: "magic-eden.svg" }
1080
+ { n: "Morpho", wm: "morpho.svg", u: "https://morpho.org" },
1081
+ { n: "GMX", wm: "gmx.svg", u: "https://gmx.io" },
1082
+ { n: "LI.FI", wm: "lifi.png", u: "https://li.fi" },
1083
+ { n: "Relay", wm: "relay.svg", u: "https://relay.link" },
1084
+ { n: "Velora", wm: "paraswap.svg", u: "https://velora.xyz" },
1085
+ { n: "Odos", wm: "odos.svg", u: "https://odos.xyz" },
1086
+ { n: "CoW Swap", wm: "cowswap.svg", u: "https://cow.fi" },
1087
+ { n: "1inch", wm: "oneinch.svg", u: "https://1inch.io" },
1088
+ { n: "Jupiter", wm: "jupiter.svg", u: "https://jup.ag" },
1089
+ { n: "OpenSea", wm: "opensea.svg", u: "https://opensea.io" },
1090
+ { n: "Across", wm: "across.svg", u: "https://across.to" },
1091
+ { n: "Stargate", wm: "stargate.svg", u: "https://stargate.finance" },
1092
+ { n: "Magic Eden", wm: "magic-eden.svg", u: "https://magiceden.io" }
1044
1093
  ];
1045
1094
 
1046
1095
  function chipRow(list) {
1047
1096
  var seq = list.concat(list);
1048
1097
  return seq.map(function (x) {
1049
- if (x.wm) {
1050
- return '<span class="chip wm-chip"><img class="wm" src="' + WM + x.wm + '" alt="' + x.n + '" loading="lazy"></span>';
1051
- }
1052
- return '<span class="chip proto-' + x.c + '"><img src="' + ICON + x.s + '?w=32&h=32" alt="" loading="lazy"><span class="wordmark">' + x.n + '</span></span>';
1098
+ var body = x.wm
1099
+ ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + '" src="' + WM + x.wm + '" alt="' + x.n + '" decoding="async">' +
1100
+ (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '')
1101
+ : '<span class="wordmark">' + x.n + '</span>';
1102
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '">' + body + '</a>';
1053
1103
  }).join("");
1054
1104
  }
1055
1105
  document.getElementById("proto-track-a").innerHTML = chipRow(PROTOS_A);
1056
1106
  document.getElementById("proto-track-b").innerHTML = chipRow(PROTOS_B);
1057
1107
 
1108
+ var LM = "assets/llms/";
1109
+ var LLMS = [
1110
+ { n: "Hermes Agent", wm: "hermes.png", tall: 1, u: "https://hermes.nousresearch.com" },
1111
+ { n: "Claude", wm: "claude.svg", u: "https://claude.ai" },
1112
+ { n: "Grok", wm: "grok.svg", u: "https://grok.com" },
1113
+ { n: "Codex", wm: "codex.svg", u: "https://openai.com/codex" },
1114
+ { n: "Gemini", wm: "gemini.svg", u: "https://gemini.google.com" },
1115
+ { n: "OpenClaw", wm: "openclaw.svg", tall: 1, u: "https://openclaw.ai" },
1116
+ { n: "Perplexity", wm: "perplexity.svg", u: "https://perplexity.ai" },
1117
+ { n: "Manus", wm: "manus.svg", u: "https://manus.im" },
1118
+ { n: "Cursor", wm: "cursor-icon.svg", tall: 1, u: "https://cursor.com" },
1119
+ { n: "Windsurf", wm: "windsurf.svg", u: "https://windsurf.com" },
1120
+ { n: "DeepSeek", wm: "deepseek.svg", u: "https://deepseek.com" },
1121
+ { n: "Qwen", wm: "qwen.svg", tall: 1, u: "https://chat.qwen.ai" },
1122
+ { n: "Kimi", wm: "kimi-icon.svg", tall: 1, u: "https://kimi.com" }
1123
+ ];
1124
+ document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
1125
+ var cls = x.tall ? "wm tall" : "wm";
1126
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" decoding="async">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</a>';
1127
+ }).join("");
1128
+
1058
1129
  var loader = document.getElementById("loader");
1059
1130
  var fill = document.getElementById("loader-fill");
1060
1131
  requestAnimationFrame(function () { fill.style.width = "100%"; });
@@ -1102,106 +1173,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1102
1173
  }, { passive: true });
1103
1174
  }
1104
1175
 
1105
- (function () {
1106
- var cv = document.getElementById("orb-gl");
1107
- if (!cv || reduced) return;
1108
- var g = cv.getContext("webgl", { antialias: true, alpha: true, premultipliedAlpha: false });
1109
- if (!g) return;
1110
- document.querySelector(".hero-art").classList.add("webgl-orb");
1111
- document.body.classList.add("webgl-orb");
1112
-
1113
- var N = 4200;
1114
- var pos = new Float32Array(N * 4);
1115
- var GA = Math.PI * (3 - Math.sqrt(5));
1116
- for (var i = 0; i < N; i++) {
1117
- var y = 1 - (i / (N - 1)) * 2;
1118
- var r = Math.sqrt(1 - y * y);
1119
- var th = GA * i;
1120
- pos[i * 4] = Math.cos(th) * r;
1121
- pos[i * 4 + 1] = y;
1122
- pos[i * 4 + 2] = Math.sin(th) * r;
1123
- pos[i * 4 + 3] = (i % 97) / 97;
1124
- }
1125
- var vs = [
1126
- "attribute vec4 p;",
1127
- "uniform float t; uniform float dpr; uniform vec2 m;",
1128
- "varying float vd; varying float vtw;",
1129
- "void main(){",
1130
- " float a = t*.22 + m.x*.35;",
1131
- " float ca=cos(a), sa=sin(a);",
1132
- " vec3 q = vec3(p.x*ca + p.z*sa, p.y, -p.x*sa + p.z*ca);",
1133
- " float b = .42 + m.y*.22;",
1134
- " float cb=cos(b), sb=sin(b);",
1135
- " q = vec3(q.x, q.y*cb - q.z*sb, q.y*sb + q.z*cb);",
1136
- " float persp = 2.2/(2.2 - q.z*.9);",
1137
- " vd = q.z*.5+.5;",
1138
- " vtw = p.w;",
1139
- " gl_Position = vec4(q.x*.58*persp, q.y*.58*persp, 0., 1.);",
1140
- " gl_PointSize = (1.8 + vd*4.2) * dpr;",
1141
- "}"
1142
- ].join("\n");
1143
- var fs = [
1144
- "precision mediump float;",
1145
- "uniform float t;",
1146
- "varying float vd; varying float vtw;",
1147
- "void main(){",
1148
- " vec2 c = gl_PointCoord - .5;",
1149
- " float d = length(c);",
1150
- " if (d > .5) discard;",
1151
- " float soft = smoothstep(.5, .28, d);",
1152
- " float tw = .82 + .18*sin(t*2.2 + vtw*40.0);",
1153
- " vec3 near = vec3(.86,.95,1.0);",
1154
- " vec3 far = vec3(.24,.44,.68);",
1155
- " vec3 col = mix(far, near, vd);",
1156
- " float alpha = soft * mix(.2, 1.0, vd*vd) * tw;",
1157
- " gl_FragColor = vec4(col*alpha, alpha);",
1158
- "}"
1159
- ].join("\n");
1160
- function sh(ty, src) { var s = g.createShader(ty); g.shaderSource(s, src); g.compileShader(s); return s; }
1161
- var pr = g.createProgram();
1162
- g.attachShader(pr, sh(g.VERTEX_SHADER, vs));
1163
- g.attachShader(pr, sh(g.FRAGMENT_SHADER, fs));
1164
- g.linkProgram(pr); g.useProgram(pr);
1165
- var buf = g.createBuffer();
1166
- g.bindBuffer(g.ARRAY_BUFFER, buf);
1167
- g.bufferData(g.ARRAY_BUFFER, pos, g.STATIC_DRAW);
1168
- var loc = g.getAttribLocation(pr, "p");
1169
- g.enableVertexAttribArray(loc);
1170
- g.vertexAttribPointer(loc, 4, g.FLOAT, false, 0, 0);
1171
- var uT = g.getUniformLocation(pr, "t");
1172
- var uD = g.getUniformLocation(pr, "dpr");
1173
- var uM = g.getUniformLocation(pr, "m");
1174
- var mx = 0, my = 0, tx = 0, ty = 0;
1175
- window.addEventListener("pointermove", function (e) {
1176
- tx = (e.clientX / window.innerWidth - .5) * 2;
1177
- ty = (e.clientY / window.innerHeight - .5) * 2;
1178
- }, { passive: true });
1179
- g.enable(g.BLEND);
1180
- g.blendFunc(g.ONE, g.ONE_MINUS_SRC_ALPHA);
1181
- var dpr = Math.min(window.devicePixelRatio || 1, 2);
1182
- function size() {
1183
- var w = Math.floor(cv.clientWidth * dpr), h = Math.floor(cv.clientHeight * dpr);
1184
- if (cv.width !== w || cv.height !== h) { cv.width = w; cv.height = h; g.viewport(0, 0, w, h); }
1185
- }
1186
- var run = true;
1187
- function frame(now) {
1188
- if (!run) return;
1189
- size();
1190
- g.clearColor(0, 0, 0, 0);
1191
- g.clear(g.COLOR_BUFFER_BIT);
1192
- mx += (tx - mx) * .04; my += (ty - my) * .04;
1193
- g.uniform1f(uT, now * .001);
1194
- g.uniform1f(uD, dpr);
1195
- g.uniform2f(uM, mx, my);
1196
- g.drawArrays(g.POINTS, 0, N);
1197
- requestAnimationFrame(frame);
1198
- }
1199
- document.addEventListener("visibilitychange", function () {
1200
- run = document.visibilityState === "visible";
1201
- if (run) requestAnimationFrame(frame);
1202
- });
1203
- requestAnimationFrame(frame);
1204
- })();
1176
+ // Hero is the original CSS orb.
1205
1177
 
1206
1178
  var nodes = Array.prototype.slice.call(document.querySelectorAll(".rv, .wires"));
1207
1179
  if (reduced || !("IntersectionObserver" in window)) {