Spaces:
Running
Running
deploy(hf): sync szl-holdings/a11oy@main derived COPY set
Browse filesReusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy main.
Files: 773 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).
Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- a11oy_landing.html +111 -42
- static-vendor/a11oy-operator-widget.js +8 -8
- static/a11oy_landing.js +34 -17
a11oy_landing.html
CHANGED
|
@@ -17,10 +17,19 @@
|
|
| 17 |
<link rel="icon" href="/social-preview.svg" />
|
| 18 |
<style>
|
| 19 |
:root{
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
--r:16px; --maxw:1180px;
|
| 25 |
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,Helvetica,Arial,sans-serif;
|
| 26 |
--mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
|
|
@@ -28,9 +37,10 @@
|
|
| 28 |
*{box-sizing:border-box}
|
| 29 |
html,body{margin:0;padding:0}
|
| 30 |
body{
|
|
|
|
| 31 |
background:
|
| 32 |
-
radial-gradient(
|
| 33 |
-
radial-gradient(
|
| 34 |
var(--bg);
|
| 35 |
color:var(--ink); font-family:var(--sans); line-height:1.55;
|
| 36 |
-webkit-font-smoothing:antialiased; overflow-x:hidden;
|
|
@@ -42,7 +52,7 @@
|
|
| 42 |
/* ---- nav ---- */
|
| 43 |
header.nav{position:sticky;top:0;z-index:40;
|
| 44 |
backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
|
| 45 |
-
background:linear-gradient(180deg,
|
| 46 |
border-bottom:1px solid var(--border)}
|
| 47 |
.nav .wrap{display:flex;align-items:center;gap:18px;height:64px}
|
| 48 |
.brand{display:flex;align-items:center;gap:11px;font-weight:700;letter-spacing:.2px}
|
|
@@ -50,42 +60,95 @@
|
|
| 50 |
.brand .sub{color:var(--ghost);font-weight:500;font-size:12px;letter-spacing:2px;text-transform:uppercase}
|
| 51 |
.nav nav{margin-left:auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
|
| 52 |
.nav nav a{padding:8px 13px;border-radius:10px;color:var(--sub);font-size:14px;font-weight:500;transition:.15s}
|
| 53 |
-
.nav nav a:hover{color:var(--ink);background:
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
.btn
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
.btn-
|
| 61 |
-
|
| 62 |
-
box-shadow:0
|
| 63 |
-
.btn-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
/* ---- hero ---- */
|
| 66 |
.hero{position:relative;min-height:90vh;display:flex;align-items:center;overflow:hidden}
|
|
|
|
|
|
|
| 67 |
#hero-canvas{position:absolute;inset:0;width:100%;height:100%;z-index:0;display:block}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
.hero-fallback{position:absolute;inset:0;z-index:0;display:none;
|
| 69 |
-
background:radial-gradient(600px 600px at 65% 45%,
|
| 70 |
.hero .wrap{position:relative;z-index:2;padding-top:48px;padding-bottom:48px}
|
| 71 |
.hero-inner{max-width:720px}
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
| 74 |
font-size:12.5px;font-weight:600;letter-spacing:.4px;margin-bottom:22px}
|
| 75 |
.eyebrow .dot{width:7px;height:7px;border-radius:50%;background:var(--teal);
|
| 76 |
box-shadow:0 0 0 0 var(--teal);animation:pulse 2.4s infinite}
|
| 77 |
-
@keyframes pulse{
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
.lede b{color:var(--ink);font-weight:600}
|
| 84 |
.cta-row{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:30px}
|
|
|
|
|
|
|
| 85 |
.hero-stats{display:flex;gap:14px;flex-wrap:wrap}
|
| 86 |
.stat{padding:13px 17px;border-radius:13px;border:1px solid var(--border);
|
| 87 |
-
background:
|
| 88 |
-
|
|
|
|
| 89 |
.stat .l{font-size:11.5px;color:var(--ghost);text-transform:uppercase;letter-spacing:1.1px;margin-top:3px}
|
| 90 |
.stat .k.teal{color:var(--teal)}
|
| 91 |
|
|
@@ -100,29 +163,33 @@
|
|
| 100 |
@media(max-width:900px){.g3{grid-template-columns:1fr}}
|
| 101 |
|
| 102 |
.card{padding:26px;border-radius:var(--r);border:1px solid var(--border);
|
| 103 |
-
background:linear-gradient(180deg,
|
| 104 |
-
display:flex;flex-direction:column}
|
| 105 |
.card::before{content:"";position:absolute;inset:0;border-radius:var(--r);padding:1px;
|
| 106 |
-
background:linear-gradient(135deg,
|
| 107 |
-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
|
| 108 |
-
-webkit-mask-composite:xor;mask-composite:exclude;opacity:.
|
| 109 |
.card h3{margin:0 0 8px;font-size:1.18rem;font-weight:700}
|
| 110 |
.card p{margin:0;color:var(--sub);font-size:.97rem}
|
|
|
|
| 111 |
.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;
|
| 112 |
-
background:
|
|
|
|
| 113 |
.card .golinks{margin-top:auto;display:flex;gap:14px;flex-wrap:wrap;padding-top:16px}
|
| 114 |
.card a.go{color:var(--teal);font-family:var(--mono);font-size:12.5px}
|
| 115 |
.card a.go:hover{text-decoration:underline}
|
| 116 |
.card .num{position:absolute;top:18px;right:22px;font-family:var(--mono);font-size:13px;color:var(--ghost)}
|
| 117 |
|
| 118 |
/* ---- vertical (killinchu) ---- */
|
| 119 |
-
.vert{padding:34px;border-radius:var(--r);border:1px solid
|
| 120 |
-
background:linear-gradient(135deg,
|
|
|
|
| 121 |
display:grid;grid-template-columns:1.3fr .7fr;gap:26px;align-items:center}
|
| 122 |
@media(max-width:840px){.vert{grid-template-columns:1fr}}
|
| 123 |
.vert .pmark{width:46px;height:46px;border-radius:12px;display:grid;place-items:center;
|
| 124 |
font-family:var(--mono);font-weight:720;font-size:15px;
|
| 125 |
-
background:
|
|
|
|
| 126 |
.vert h3{font-size:1.6rem;font-weight:740;margin:0 0 4px;letter-spacing:-.4px}
|
| 127 |
.vert .tag{font-size:12px;color:var(--ghost);text-transform:uppercase;letter-spacing:1.4px;margin-bottom:14px}
|
| 128 |
.vert p{color:var(--sub);margin:0 0 6px;font-size:1.02rem}
|
|
@@ -135,15 +202,15 @@
|
|
| 135 |
.chip{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border-radius:999px;
|
| 136 |
font-size:12px;font-weight:600;font-family:var(--mono);border:1px solid var(--border)}
|
| 137 |
.chip .dot{width:8px;height:8px;border-radius:50%}
|
| 138 |
-
.chip.live{color:var(--ok);border-color:
|
| 139 |
.chip.live .dot{background:var(--ok);box-shadow:0 0 8px var(--ok)}
|
| 140 |
-
.chip.down{color:var(--down);border-color:
|
| 141 |
.chip.down .dot{background:var(--down)}
|
| 142 |
|
| 143 |
/* ---- evidence band ---- */
|
| 144 |
.evidence{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;
|
| 145 |
padding:26px 30px;border-radius:var(--r);border:1px solid var(--border);
|
| 146 |
-
background:linear-gradient(180deg,
|
| 147 |
.evidence .et{max-width:640px}
|
| 148 |
.evidence h3{margin:0 0 6px;font-size:1.15rem;font-weight:700}
|
| 149 |
.evidence p{margin:0;color:var(--sub);font-size:.97rem}
|
|
@@ -167,7 +234,7 @@
|
|
| 167 |
<a class="brand" href="/" aria-label="a11oy home">
|
| 168 |
<svg width="30" height="30" viewBox="0 0 32 32" fill="none" aria-hidden="true">
|
| 169 |
<defs><linearGradient id="lg" x1="0" y1="0" x2="1" y2="1">
|
| 170 |
-
<stop offset="0" stop-color="#
|
| 171 |
<circle cx="16" cy="16" r="13" stroke="url(#lg)" stroke-width="2"/>
|
| 172 |
<circle cx="16" cy="16" r="5" fill="url(#lg)"/>
|
| 173 |
<path d="M16 3v8M16 21v8M3 16h8M21 16h8" stroke="url(#lg)" stroke-width="1.6" opacity=".7"/>
|
|
@@ -186,6 +253,8 @@
|
|
| 186 |
<!-- ============================ HERO / FLAGSHIP ============================ -->
|
| 187 |
<section class="hero">
|
| 188 |
<canvas id="hero-canvas"></canvas>
|
|
|
|
|
|
|
| 189 |
<div class="hero-fallback" id="hero-fallback"></div>
|
| 190 |
<div class="wrap">
|
| 191 |
<div class="hero-inner">
|
|
@@ -273,7 +342,7 @@
|
|
| 273 |
</section>
|
| 274 |
|
| 275 |
<!-- ====================== THE ONE VERTICAL: killinchu ====================== -->
|
| 276 |
-
<section class="band" style="background:linear-gradient(180deg,
|
| 277 |
<div class="wrap">
|
| 278 |
<p class="kick">The vertical it already runs</p>
|
| 279 |
<h2>Where governed inference earns its keep.</h2>
|
|
|
|
| 17 |
<link rel="icon" href="/social-preview.svg" />
|
| 18 |
<style>
|
| 19 |
:root{
|
| 20 |
+
/* PALETTE (2026-06-30 elegant dark refresh)
|
| 21 |
+
Anthropic/NVIDIA-grade: deep near-black canvas, ONE restrained teal accent,
|
| 22 |
+
violet as secondary. Accent glows softly — never floods. */
|
| 23 |
+
--bg:#05070d; --deep:#070b16; --surface:#0d1220; --border:#1e2d46;
|
| 24 |
+
--teal:#2ec4b6; /* restrained teal — was #39d8c8 (too bright/saturated) */
|
| 25 |
+
--teal-soft:rgba(46,196,182,0.12);
|
| 26 |
+
--teal-dim:rgba(46,196,182,0.06);
|
| 27 |
+
--violet:#5a6de8; /* muted violet — was #6a7bff */
|
| 28 |
+
--gold:#cda64a;
|
| 29 |
+
--ink:#eaf1f7; /* near-white hero text */
|
| 30 |
+
--sub:#b8c4d6; /* body copy — WCAG AA on dark bg */
|
| 31 |
+
--ghost:#64768f;
|
| 32 |
+
--ok:#2ec4b6; --warn:#cda64a; --down:#e06a6a;
|
| 33 |
--r:16px; --maxw:1180px;
|
| 34 |
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,Helvetica,Arial,sans-serif;
|
| 35 |
--mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
|
|
|
|
| 37 |
*{box-sizing:border-box}
|
| 38 |
html,body{margin:0;padding:0}
|
| 39 |
body{
|
| 40 |
+
/* Deep near-black base — NO more bright radial gradients that wash the page */
|
| 41 |
background:
|
| 42 |
+
radial-gradient(ellipse 900px 500px at 75% -5%, #0c1530 0%, transparent 55%),
|
| 43 |
+
radial-gradient(ellipse 700px 400px at 5% 15%, #090e1e 0%, transparent 50%),
|
| 44 |
var(--bg);
|
| 45 |
color:var(--ink); font-family:var(--sans); line-height:1.55;
|
| 46 |
-webkit-font-smoothing:antialiased; overflow-x:hidden;
|
|
|
|
| 52 |
/* ---- nav ---- */
|
| 53 |
header.nav{position:sticky;top:0;z-index:40;
|
| 54 |
backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
|
| 55 |
+
background:linear-gradient(180deg,rgba(5,7,13,0.94),rgba(5,7,13,0.78));
|
| 56 |
border-bottom:1px solid var(--border)}
|
| 57 |
.nav .wrap{display:flex;align-items:center;gap:18px;height:64px}
|
| 58 |
.brand{display:flex;align-items:center;gap:11px;font-weight:700;letter-spacing:.2px}
|
|
|
|
| 60 |
.brand .sub{color:var(--ghost);font-weight:500;font-size:12px;letter-spacing:2px;text-transform:uppercase}
|
| 61 |
.nav nav{margin-left:auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
|
| 62 |
.nav nav a{padding:8px 13px;border-radius:10px;color:var(--sub);font-size:14px;font-weight:500;transition:.15s}
|
| 63 |
+
.nav nav a:hover{color:var(--ink);background:rgba(255,255,255,0.06)}
|
| 64 |
+
|
| 65 |
+
/* Buttons — elegant, not loud */
|
| 66 |
+
.btn{display:inline-flex;align-items:center;gap:8px;padding:10px 20px;border-radius:9px;
|
| 67 |
+
font-weight:600;font-size:14px;border:1px solid transparent;cursor:pointer;
|
| 68 |
+
transition:all .18s cubic-bezier(0.16,1,0.3,1);white-space:nowrap;letter-spacing:.01em}
|
| 69 |
+
/* Primary: solid teal with dark text — confident, not gradient-gaudy */
|
| 70 |
+
.btn-primary{
|
| 71 |
+
background:var(--teal);color:#03201d;border-color:var(--teal);
|
| 72 |
+
box-shadow:0 0 0 0 rgba(46,196,182,0.0)}
|
| 73 |
+
.btn-primary:hover{
|
| 74 |
+
background:#38d4c7;border-color:#38d4c7;
|
| 75 |
+
box-shadow:0 4px 20px -4px rgba(46,196,182,0.35);
|
| 76 |
+
transform:translateY(-1px)}
|
| 77 |
+
/* Ghost: refined outline */
|
| 78 |
+
.btn-ghost{border-color:var(--border);color:var(--sub);background:rgba(255,255,255,0.04)}
|
| 79 |
+
.btn-ghost:hover{border-color:rgba(46,196,182,0.5);color:var(--teal);background:var(--teal-dim)}
|
| 80 |
+
/* Violet CTA */
|
| 81 |
+
.btn-violet{
|
| 82 |
+
background:var(--violet);color:#fff;border-color:var(--violet);
|
| 83 |
+
box-shadow:0 0 0 0 rgba(90,109,232,0.0)}
|
| 84 |
+
.btn-violet:hover{
|
| 85 |
+
background:#6b7ff0;border-color:#6b7ff0;
|
| 86 |
+
box-shadow:0 4px 20px -4px rgba(90,109,232,0.35);
|
| 87 |
+
transform:translateY(-1px)}
|
| 88 |
|
| 89 |
/* ---- hero ---- */
|
| 90 |
.hero{position:relative;min-height:90vh;display:flex;align-items:center;overflow:hidden}
|
| 91 |
+
|
| 92 |
+
/* Canvas sits at z-index:0 — renders the holographic mesh */
|
| 93 |
#hero-canvas{position:absolute;inset:0;width:100%;height:100%;z-index:0;display:block}
|
| 94 |
+
|
| 95 |
+
/* DARK SCRIM: sits BETWEEN canvas (z:0) and text (z:2).
|
| 96 |
+
Ensures the deep near-black dominates even on devices where the canvas is bright.
|
| 97 |
+
On mobile especially this guarantees legibility regardless of WebGL rendering. */
|
| 98 |
+
.hero-scrim{
|
| 99 |
+
position:absolute;inset:0;z-index:1;pointer-events:none;
|
| 100 |
+
/* Radial: keep the glowing core visible at centre-right, crush edges to near-black */
|
| 101 |
+
background:
|
| 102 |
+
radial-gradient(ellipse 65% 70% at 68% 50%, transparent 0%, rgba(5,7,13,0.55) 55%, rgba(5,7,13,0.88) 100%),
|
| 103 |
+
/* Left half where text lives: very dark */
|
| 104 |
+
linear-gradient(to right, rgba(5,7,13,0.82) 0%, rgba(5,7,13,0.50) 45%, rgba(5,7,13,0.15) 100%)
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
.hero-fallback{position:absolute;inset:0;z-index:0;display:none;
|
| 108 |
+
background:radial-gradient(600px 600px at 65% 45%, rgba(46,196,182,0.06), transparent 70%)}
|
| 109 |
.hero .wrap{position:relative;z-index:2;padding-top:48px;padding-bottom:48px}
|
| 110 |
.hero-inner{max-width:720px}
|
| 111 |
+
|
| 112 |
+
/* Eyebrow pill — subtle, not a glowing mint slab */
|
| 113 |
+
.eyebrow{display:inline-flex;align-items:center;gap:9px;padding:6px 14px;border-radius:999px;
|
| 114 |
+
border:1px solid rgba(46,196,182,0.22);background:rgba(46,196,182,0.06);color:var(--teal);
|
| 115 |
font-size:12.5px;font-weight:600;letter-spacing:.4px;margin-bottom:22px}
|
| 116 |
.eyebrow .dot{width:7px;height:7px;border-radius:50%;background:var(--teal);
|
| 117 |
box-shadow:0 0 0 0 var(--teal);animation:pulse 2.4s infinite}
|
| 118 |
+
@keyframes pulse{
|
| 119 |
+
0% {box-shadow:0 0 0 0 rgba(46,196,182,0.6)}
|
| 120 |
+
70% {box-shadow:0 0 0 8px rgba(46,196,182,0.0)}
|
| 121 |
+
100%{box-shadow:0 0 0 0 rgba(46,196,182,0.0)}
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
/* Hero h1: near-white for plain words, accent ONLY on "signs its work" */
|
| 125 |
+
h1.title{
|
| 126 |
+
font-size:clamp(2.4rem,5.8vw,4.2rem);line-height:1.04;margin:0 0 18px;
|
| 127 |
+
font-weight:760;letter-spacing:-1.5px;
|
| 128 |
+
color:var(--ink); /* #eaf1f7 — high-contrast near-white */
|
| 129 |
+
/* Subtle text shadow to punch through any residual canvas glow */
|
| 130 |
+
text-shadow:0 2px 20px rgba(5,7,13,0.8),0 1px 4px rgba(5,7,13,0.6)
|
| 131 |
+
}
|
| 132 |
+
/* Accent only on the "signs its work" span — teal/violet gradient */
|
| 133 |
+
h1.title .grad{
|
| 134 |
+
background:linear-gradient(110deg, var(--teal) 0%, #7b8ff5 100%);
|
| 135 |
+
-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
|
| 136 |
+
/* Filter drop shadow preserves legibility of gradient text */
|
| 137 |
+
filter:drop-shadow(0 1px 8px rgba(5,7,13,0.7))
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
/* Body: #b8c4d6 — WCAG AA (5.8:1 on #05070d) */
|
| 141 |
+
.lede{font-size:clamp(1.06rem,2vw,1.24rem);color:var(--sub);max-width:600px;margin:0 0 28px;
|
| 142 |
+
text-shadow:0 1px 8px rgba(5,7,13,0.5)}
|
| 143 |
.lede b{color:var(--ink);font-weight:600}
|
| 144 |
.cta-row{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:30px}
|
| 145 |
+
|
| 146 |
+
/* Hero stats: frosted dark cards */
|
| 147 |
.hero-stats{display:flex;gap:14px;flex-wrap:wrap}
|
| 148 |
.stat{padding:13px 17px;border-radius:13px;border:1px solid var(--border);
|
| 149 |
+
background:rgba(255,255,255,0.04);min-width:150px;
|
| 150 |
+
backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}
|
| 151 |
+
.stat .k{font-size:1.55rem;font-weight:720;font-family:var(--mono);line-height:1.1;color:var(--ink)}
|
| 152 |
.stat .l{font-size:11.5px;color:var(--ghost);text-transform:uppercase;letter-spacing:1.1px;margin-top:3px}
|
| 153 |
.stat .k.teal{color:var(--teal)}
|
| 154 |
|
|
|
|
| 163 |
@media(max-width:900px){.g3{grid-template-columns:1fr}}
|
| 164 |
|
| 165 |
.card{padding:26px;border-radius:var(--r);border:1px solid var(--border);
|
| 166 |
+
background:linear-gradient(180deg,rgba(255,255,255,0.045),rgba(255,255,255,0.018));
|
| 167 |
+
position:relative;overflow:hidden;display:flex;flex-direction:column}
|
| 168 |
.card::before{content:"";position:absolute;inset:0;border-radius:var(--r);padding:1px;
|
| 169 |
+
background:linear-gradient(135deg,rgba(46,196,182,0.18),transparent 40%);
|
| 170 |
-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
|
| 171 |
+
-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;pointer-events:none}
|
| 172 |
.card h3{margin:0 0 8px;font-size:1.18rem;font-weight:700}
|
| 173 |
.card p{margin:0;color:var(--sub);font-size:.97rem}
|
| 174 |
+
/* Icon: no filled circle — use outline approach, less "AI template" */
|
| 175 |
.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;
|
| 176 |
+
background:rgba(46,196,182,0.07);border:1px solid rgba(46,196,182,0.18);
|
| 177 |
+
color:var(--teal);margin-bottom:15px;font-size:19px}
|
| 178 |
.card .golinks{margin-top:auto;display:flex;gap:14px;flex-wrap:wrap;padding-top:16px}
|
| 179 |
.card a.go{color:var(--teal);font-family:var(--mono);font-size:12.5px}
|
| 180 |
.card a.go:hover{text-decoration:underline}
|
| 181 |
.card .num{position:absolute;top:18px;right:22px;font-family:var(--mono);font-size:13px;color:var(--ghost)}
|
| 182 |
|
| 183 |
/* ---- vertical (killinchu) ---- */
|
| 184 |
+
.vert{padding:34px;border-radius:var(--r);border:1px solid rgba(90,109,232,0.25);
|
| 185 |
+
background:linear-gradient(135deg,rgba(90,109,232,0.07),rgba(255,255,255,0.02));
|
| 186 |
+
position:relative;overflow:hidden;
|
| 187 |
display:grid;grid-template-columns:1.3fr .7fr;gap:26px;align-items:center}
|
| 188 |
@media(max-width:840px){.vert{grid-template-columns:1fr}}
|
| 189 |
.vert .pmark{width:46px;height:46px;border-radius:12px;display:grid;place-items:center;
|
| 190 |
font-family:var(--mono);font-weight:720;font-size:15px;
|
| 191 |
+
background:rgba(90,109,232,0.10);border:1px solid rgba(90,109,232,0.28);
|
| 192 |
+
color:var(--violet);margin-bottom:14px}
|
| 193 |
.vert h3{font-size:1.6rem;font-weight:740;margin:0 0 4px;letter-spacing:-.4px}
|
| 194 |
.vert .tag{font-size:12px;color:var(--ghost);text-transform:uppercase;letter-spacing:1.4px;margin-bottom:14px}
|
| 195 |
.vert p{color:var(--sub);margin:0 0 6px;font-size:1.02rem}
|
|
|
|
| 202 |
.chip{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border-radius:999px;
|
| 203 |
font-size:12px;font-weight:600;font-family:var(--mono);border:1px solid var(--border)}
|
| 204 |
.chip .dot{width:8px;height:8px;border-radius:50%}
|
| 205 |
+
.chip.live{color:var(--ok);border-color:rgba(46,196,182,0.35);background:rgba(46,196,182,0.06)}
|
| 206 |
.chip.live .dot{background:var(--ok);box-shadow:0 0 8px var(--ok)}
|
| 207 |
+
.chip.down{color:var(--down);border-color:rgba(224,106,106,0.35);background:rgba(224,106,106,0.06)}
|
| 208 |
.chip.down .dot{background:var(--down)}
|
| 209 |
|
| 210 |
/* ---- evidence band ---- */
|
| 211 |
.evidence{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;
|
| 212 |
padding:26px 30px;border-radius:var(--r);border:1px solid var(--border);
|
| 213 |
+
background:linear-gradient(180deg,rgba(255,255,255,0.04),rgba(255,255,255,0.015))}
|
| 214 |
.evidence .et{max-width:640px}
|
| 215 |
.evidence h3{margin:0 0 6px;font-size:1.15rem;font-weight:700}
|
| 216 |
.evidence p{margin:0;color:var(--sub);font-size:.97rem}
|
|
|
|
| 234 |
<a class="brand" href="/" aria-label="a11oy home">
|
| 235 |
<svg width="30" height="30" viewBox="0 0 32 32" fill="none" aria-hidden="true">
|
| 236 |
<defs><linearGradient id="lg" x1="0" y1="0" x2="1" y2="1">
|
| 237 |
+
<stop offset="0" stop-color="#2ec4b6"/><stop offset="1" stop-color="#5a6de8"/></linearGradient></defs>
|
| 238 |
<circle cx="16" cy="16" r="13" stroke="url(#lg)" stroke-width="2"/>
|
| 239 |
<circle cx="16" cy="16" r="5" fill="url(#lg)"/>
|
| 240 |
<path d="M16 3v8M16 21v8M3 16h8M21 16h8" stroke="url(#lg)" stroke-width="1.6" opacity=".7"/>
|
|
|
|
| 253 |
<!-- ============================ HERO / FLAGSHIP ============================ -->
|
| 254 |
<section class="hero">
|
| 255 |
<canvas id="hero-canvas"></canvas>
|
| 256 |
+
<!-- Dark scrim: sits between canvas and text to guarantee legibility on all devices -->
|
| 257 |
+
<div class="hero-scrim" aria-hidden="true"></div>
|
| 258 |
<div class="hero-fallback" id="hero-fallback"></div>
|
| 259 |
<div class="wrap">
|
| 260 |
<div class="hero-inner">
|
|
|
|
| 342 |
</section>
|
| 343 |
|
| 344 |
<!-- ====================== THE ONE VERTICAL: killinchu ====================== -->
|
| 345 |
+
<section class="band" style="background:linear-gradient(180deg,rgba(10,15,30,0),rgba(10,15,30,0.6))">
|
| 346 |
<div class="wrap">
|
| 347 |
<p class="kick">The vertical it already runs</p>
|
| 348 |
<h2>Where governed inference earns its keep.</h2>
|
static-vendor/a11oy-operator-widget.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
/* a11oy-operator-widget.js — floating governed-operator widget for SZL surfaces.
|
| 2 |
-
* Version: 3.0.
|
| 3 |
* substrate (real SSE chat + agentic loop + v4 ledger). No character codenames.
|
| 4 |
*
|
| 5 |
* The operator widget is a persistent, honest interface to the substrate. It is
|
|
@@ -7,8 +7,8 @@
|
|
| 7 |
* and surfaces notifications (receipt minted, gate denied, build status,
|
| 8 |
* doctrine drift). It ROUTES questions to the substrate backends — it has NO
|
| 9 |
* model of its own — and is HONEST when a backend is unreachable (it never
|
| 10 |
-
* fabricates an answer). The agent surface is
|
| 11 |
-
*
|
| 12 |
*
|
| 13 |
* Auto-detection: the widget detects the host organ from the page origin
|
| 14 |
* (killinchu -> /api/killinchu, otherwise -> /api/a11oy) and calls SAME-ORIGIN
|
|
@@ -76,7 +76,7 @@
|
|
| 76 |
'<path d="M32 16 L32 48 M16 32 L48 32" stroke="#c9b787" stroke-width="1.4" opacity="0.55"/>' +
|
| 77 |
'<circle cx="32" cy="32" r="4.5" fill="#c9b787"/>' +
|
| 78 |
'<text x="32" y="59" font-family="ui-monospace,monospace" font-size="9" fill="#9fb4cc" ' +
|
| 79 |
-
'text-anchor="middle" letter-spacing="1">
|
| 80 |
);
|
| 81 |
|
| 82 |
// ---- Small DOM helpers ----
|
|
@@ -243,7 +243,7 @@
|
|
| 243 |
headAvatar,
|
| 244 |
el('div', { class: 'aow-head-text' }, [
|
| 245 |
el('span', { class: 'aow-eyebrow', text: 'a11oy operator' }),
|
| 246 |
-
el('span', { class: 'aow-head-name', text: '
|
| 247 |
]),
|
| 248 |
statusEl,
|
| 249 |
closeBtn,
|
|
@@ -261,7 +261,7 @@
|
|
| 261 |
onclick: function () { open(); quickAction('verify'); }
|
| 262 |
});
|
| 263 |
var qaAgent = el('button', {
|
| 264 |
-
class: 'aow-qa-btn', type: 'button', title: 'Run the governed
|
| 265 |
text: '\u26A1 Agent',
|
| 266 |
onclick: function () { open(); quickAction('agent'); }
|
| 267 |
});
|
|
@@ -333,7 +333,7 @@
|
|
| 333 |
if (!thread.length) {
|
| 334 |
var em = el('div', { class: 'aow-empty' });
|
| 335 |
em.innerHTML =
|
| 336 |
-
'<strong>a11oy
|
| 337 |
'Ask the substrate anything, or use the buttons above. I route to the live ' +
|
| 338 |
esc(CFG.organ) + ' backend and stay honest when it is unreachable \u2014 I never fabricate.' +
|
| 339 |
'<br><br><small style="color:#6b7a96">Surface: <em>' + esc(CFG.surface) + '</em> \u2022 organ: <em>' + esc(CFG.organ) + '</em></small>';
|
|
@@ -505,7 +505,7 @@
|
|
| 505 |
|
| 506 |
} else if (kind === 'agent') {
|
| 507 |
var task = 'Summarise the governance posture of the ' + CFG.surface + ' surface: what is proven, what is experimental, what is roadmap. Be honest and cite.';
|
| 508 |
-
pushMsg('user', '\u26A1 Run
|
| 509 |
disableQA(true);
|
| 510 |
runAgent(task, function () { disableQA(false); });
|
| 511 |
|
|
|
|
| 1 |
/* a11oy-operator-widget.js — floating governed-operator widget for SZL surfaces.
|
| 2 |
+
* Version: 3.0.1 — a11oy Code agent surface, wired to the LIVE a11oy/killinchu
|
| 3 |
* substrate (real SSE chat + agentic loop + v4 ledger). No character codenames.
|
| 4 |
*
|
| 5 |
* The operator widget is a persistent, honest interface to the substrate. It is
|
|
|
|
| 7 |
* and surfaces notifications (receipt minted, gate denied, build status,
|
| 8 |
* doctrine drift). It ROUTES questions to the substrate backends — it has NO
|
| 9 |
* model of its own — and is HONEST when a backend is unreachable (it never
|
| 10 |
+
* fabricates an answer). The agent surface is branded "a11oy Code" in the UI.
|
| 11 |
+
* Internal codename: Chaski (internal only, not user-visible).
|
| 12 |
*
|
| 13 |
* Auto-detection: the widget detects the host organ from the page origin
|
| 14 |
* (killinchu -> /api/killinchu, otherwise -> /api/a11oy) and calls SAME-ORIGIN
|
|
|
|
| 76 |
'<path d="M32 16 L32 48 M16 32 L48 32" stroke="#c9b787" stroke-width="1.4" opacity="0.55"/>' +
|
| 77 |
'<circle cx="32" cy="32" r="4.5" fill="#c9b787"/>' +
|
| 78 |
'<text x="32" y="59" font-family="ui-monospace,monospace" font-size="9" fill="#9fb4cc" ' +
|
| 79 |
+
'text-anchor="middle" letter-spacing="1">Code</text></svg>'
|
| 80 |
);
|
| 81 |
|
| 82 |
// ---- Small DOM helpers ----
|
|
|
|
| 243 |
headAvatar,
|
| 244 |
el('div', { class: 'aow-head-text' }, [
|
| 245 |
el('span', { class: 'aow-eyebrow', text: 'a11oy operator' }),
|
| 246 |
+
el('span', { class: 'aow-head-name', text: 'a11oy Code \u2014 governed agent surface' }),
|
| 247 |
]),
|
| 248 |
statusEl,
|
| 249 |
closeBtn,
|
|
|
|
| 261 |
onclick: function () { open(); quickAction('verify'); }
|
| 262 |
});
|
| 263 |
var qaAgent = el('button', {
|
| 264 |
+
class: 'aow-qa-btn', type: 'button', title: 'Run the governed a11oy Code agentic loop on a task',
|
| 265 |
text: '\u26A1 Agent',
|
| 266 |
onclick: function () { open(); quickAction('agent'); }
|
| 267 |
});
|
|
|
|
| 333 |
if (!thread.length) {
|
| 334 |
var em = el('div', { class: 'aow-empty' });
|
| 335 |
em.innerHTML =
|
| 336 |
+
'<strong>a11oy Code</strong><br>' +
|
| 337 |
'Ask the substrate anything, or use the buttons above. I route to the live ' +
|
| 338 |
esc(CFG.organ) + ' backend and stay honest when it is unreachable \u2014 I never fabricate.' +
|
| 339 |
'<br><br><small style="color:#6b7a96">Surface: <em>' + esc(CFG.surface) + '</em> \u2022 organ: <em>' + esc(CFG.organ) + '</em></small>';
|
|
|
|
| 505 |
|
| 506 |
} else if (kind === 'agent') {
|
| 507 |
var task = 'Summarise the governance posture of the ' + CFG.surface + ' surface: what is proven, what is experimental, what is roadmap. Be honest and cite.';
|
| 508 |
+
pushMsg('user', '\u26A1 Run a11oy Code agent: ' + task);
|
| 509 |
disableQA(true);
|
| 510 |
runAgent(task, function () { disableQA(false); });
|
| 511 |
|
static/a11oy_landing.js
CHANGED
|
@@ -17,7 +17,18 @@
|
|
| 17 |
*
|
| 18 |
* PERF: capped DPR, instanced points (single draw call), 60fps target. Honors
|
| 19 |
* prefers-reduced-motion (renders one static frame) and downshifts particle count
|
| 20 |
-
* on small / low-DPR devices.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
* ========================================================================== */
|
| 22 |
import * as THREE from "three";
|
| 23 |
|
|
@@ -26,9 +37,10 @@ const REDUCED = window.matchMedia &&
|
|
| 26 |
const MOBILE = Math.min(window.innerWidth, window.innerHeight) < 720 ||
|
| 27 |
/Mobi|Android/i.test(navigator.userAgent);
|
| 28 |
|
| 29 |
-
|
| 30 |
-
const
|
| 31 |
-
const
|
|
|
|
| 32 |
|
| 33 |
export function mountHero(canvas) {
|
| 34 |
let renderer;
|
|
@@ -43,7 +55,7 @@ export function mountHero(canvas) {
|
|
| 43 |
|
| 44 |
const DPR = Math.min(window.devicePixelRatio || 1, MOBILE ? 1.5 : 2);
|
| 45 |
renderer.setPixelRatio(DPR);
|
| 46 |
-
renderer.setClearColor(0x000000, 0);
|
| 47 |
|
| 48 |
const scene = new THREE.Scene();
|
| 49 |
const camera = new THREE.PerspectiveCamera(46, 1, 0.1, 100);
|
|
@@ -85,20 +97,22 @@ export function mountHero(canvas) {
|
|
| 85 |
uniform vec3 uTeal; uniform vec3 uDeep;
|
| 86 |
void main(){
|
| 87 |
float fres = pow(1.0 - max(dot(normalize(vN), normalize(vView)), 0.0), 2.4);
|
| 88 |
-
// Λ-pulse: the shell
|
| 89 |
float pulse = 0.5 + 0.5*sin(uTime*1.6);
|
| 90 |
-
|
|
|
|
| 91 |
vec3 col = mix(uDeep, uTeal, fres);
|
| 92 |
-
|
|
|
|
| 93 |
}`,
|
| 94 |
});
|
| 95 |
const core = new THREE.Mesh(coreGeo, coreMat);
|
| 96 |
root.add(core);
|
| 97 |
|
| 98 |
-
// wire lattice over the core (deny-by-default cage)
|
| 99 |
const cage = new THREE.LineSegments(
|
| 100 |
new THREE.EdgesGeometry(new THREE.IcosahedronGeometry(1.62, 1)),
|
| 101 |
-
new THREE.LineBasicMaterial({ color:
|
| 102 |
);
|
| 103 |
root.add(cage);
|
| 104 |
|
|
@@ -166,18 +180,20 @@ export function mountHero(canvas) {
|
|
| 166 |
if (d > 0.5) discard;
|
| 167 |
float a = smoothstep(0.5, 0.0, d);
|
| 168 |
vec3 col = mix(uDim, uTeal, vGate) * (vGate>0.5 ? vTw : 0.5);
|
| 169 |
-
|
|
|
|
| 170 |
}`,
|
| 171 |
});
|
| 172 |
const points = new THREE.Points(pGeo, pMat);
|
| 173 |
root.add(points);
|
| 174 |
|
| 175 |
-
// ---- soft additive halo sprite (fake bloom
|
|
|
|
| 176 |
const halo = new THREE.Sprite(new THREE.SpriteMaterial({
|
| 177 |
map: makeHaloTexture(), transparent: true, blending: THREE.AdditiveBlending,
|
| 178 |
-
depthWrite: false, opacity: 0.
|
| 179 |
}));
|
| 180 |
-
halo.scale.set(
|
| 181 |
scene.add(halo);
|
| 182 |
|
| 183 |
// ---- resize ---------------------------------------------------------------
|
|
@@ -237,15 +253,16 @@ export function mountHero(canvas) {
|
|
| 237 |
}
|
| 238 |
|
| 239 |
// radial-gradient halo texture, built in-canvas (no asset, no CDN)
|
|
|
|
| 240 |
function makeHaloTexture() {
|
| 241 |
const s = 256;
|
| 242 |
const c = document.createElement("canvas");
|
| 243 |
c.width = c.height = s;
|
| 244 |
const g = c.getContext("2d");
|
| 245 |
const grad = g.createRadialGradient(s/2, s/2, 0, s/2, s/2, s/2);
|
| 246 |
-
grad.addColorStop(0.0, "rgba(57,216,200,0.55)
|
| 247 |
-
grad.addColorStop(0.25, "rgba(57,216,200,0.18)
|
| 248 |
-
grad.addColorStop(1.0, "rgba(
|
| 249 |
g.fillStyle = grad;
|
| 250 |
g.fillRect(0, 0, s, s);
|
| 251 |
const tex = new THREE.CanvasTexture(c);
|
|
|
|
| 17 |
*
|
| 18 |
* PERF: capped DPR, instanced points (single draw call), 60fps target. Honors
|
| 19 |
* prefers-reduced-motion (renders one static frame) and downshifts particle count
|
| 20 |
+
* on small / low-DPR devices.
|
| 21 |
+
*
|
| 22 |
+
* VISUAL FIX (2026-06-30): Tamed the canvas from blinding-cyan flood to a
|
| 23 |
+
* restrained, elegant dark field. Key changes:
|
| 24 |
+
* - Core glow opacity: clamped to 0.40 max (was 0.92) — whispers, doesn't shout
|
| 25 |
+
* - Halo sprite: opacity 0.10 (was 0.55), scale 7×7 (was 9×9)
|
| 26 |
+
* - Particle alpha: gate-pass 0.45 (was 0.95), denied 0.18 (was 0.40)
|
| 27 |
+
* - Canvas renderer alpha: transparent over deep near-black page bg (#05070d)
|
| 28 |
+
* - Colors desaturated: teal at 30% brightness, dim at near-black for particles
|
| 29 |
+
* - Net effect: holographic mesh whispers on deep dark, never floods
|
| 30 |
+
*
|
| 31 |
+
* Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
|
| 32 |
* ========================================================================== */
|
| 33 |
import * as THREE from "three";
|
| 34 |
|
|
|
|
| 37 |
const MOBILE = Math.min(window.innerWidth, window.innerHeight) < 720 ||
|
| 38 |
/Mobi|Android/i.test(navigator.userAgent);
|
| 39 |
|
| 40 |
+
// Desaturated, restrained palette — hairlines on near-black, not bright floods
|
| 41 |
+
const TEAL = new THREE.Color(0x1a6b63); // deep teal — was 0x39d8c8 (too bright)
|
| 42 |
+
const DEEP = new THREE.Color(0x2a3578); // muted violet — was 0x6a7bff (too bright)
|
| 43 |
+
const DIM = new THREE.Color(0x0a0f1c); // near-black for denied particles
|
| 44 |
|
| 45 |
export function mountHero(canvas) {
|
| 46 |
let renderer;
|
|
|
|
| 55 |
|
| 56 |
const DPR = Math.min(window.devicePixelRatio || 1, MOBILE ? 1.5 : 2);
|
| 57 |
renderer.setPixelRatio(DPR);
|
| 58 |
+
renderer.setClearColor(0x000000, 0); // fully transparent — page bg shows through
|
| 59 |
|
| 60 |
const scene = new THREE.Scene();
|
| 61 |
const camera = new THREE.PerspectiveCamera(46, 1, 0.1, 100);
|
|
|
|
| 97 |
uniform vec3 uTeal; uniform vec3 uDeep;
|
| 98 |
void main(){
|
| 99 |
float fres = pow(1.0 - max(dot(normalize(vN), normalize(vView)), 0.0), 2.4);
|
| 100 |
+
// Λ-pulse: the shell breathes gently — restrained, not flooding
|
| 101 |
float pulse = 0.5 + 0.5*sin(uTime*1.6);
|
| 102 |
+
// TAMED: glow multiplier capped — elegant whisper, not a bright flood
|
| 103 |
+
float glow = fres * (0.28 + 0.18*pulse) * uLambda;
|
| 104 |
vec3 col = mix(uDeep, uTeal, fres);
|
| 105 |
+
// max alpha 0.40 — ensures the dark page bg always dominates
|
| 106 |
+
gl_FragColor = vec4(col * glow, clamp(glow,0.0,0.40));
|
| 107 |
}`,
|
| 108 |
});
|
| 109 |
const core = new THREE.Mesh(coreGeo, coreMat);
|
| 110 |
root.add(core);
|
| 111 |
|
| 112 |
+
// wire lattice over the core (deny-by-default cage) — very dim hairlines
|
| 113 |
const cage = new THREE.LineSegments(
|
| 114 |
new THREE.EdgesGeometry(new THREE.IcosahedronGeometry(1.62, 1)),
|
| 115 |
+
new THREE.LineBasicMaterial({ color: 0x1a4a46, transparent: true, opacity: 0.14 })
|
| 116 |
);
|
| 117 |
root.add(cage);
|
| 118 |
|
|
|
|
| 180 |
if (d > 0.5) discard;
|
| 181 |
float a = smoothstep(0.5, 0.0, d);
|
| 182 |
vec3 col = mix(uDim, uTeal, vGate) * (vGate>0.5 ? vTw : 0.5);
|
| 183 |
+
// TAMED: max alpha 0.45 gate-pass, 0.18 denied — subtle field on dark bg
|
| 184 |
+
gl_FragColor = vec4(col, a * (vGate>0.5 ? 0.45 : 0.18));
|
| 185 |
}`,
|
| 186 |
});
|
| 187 |
const points = new THREE.Points(pGeo, pMat);
|
| 188 |
root.add(points);
|
| 189 |
|
| 190 |
+
// ---- soft additive halo sprite (fake bloom) — very restrained -----------
|
| 191 |
+
// TAMED: opacity 0.10 (was 0.55), scale 7×7 (was 9×9) — barely perceptible glow
|
| 192 |
const halo = new THREE.Sprite(new THREE.SpriteMaterial({
|
| 193 |
map: makeHaloTexture(), transparent: true, blending: THREE.AdditiveBlending,
|
| 194 |
+
depthWrite: false, opacity: 0.10, color: 0x1a6b63,
|
| 195 |
}));
|
| 196 |
+
halo.scale.set(7, 7, 1);
|
| 197 |
scene.add(halo);
|
| 198 |
|
| 199 |
// ---- resize ---------------------------------------------------------------
|
|
|
|
| 253 |
}
|
| 254 |
|
| 255 |
// radial-gradient halo texture, built in-canvas (no asset, no CDN)
|
| 256 |
+
// TAMED: core stop 0.18 (was 0.55) — barely-visible glow ring on dark bg
|
| 257 |
function makeHaloTexture() {
|
| 258 |
const s = 256;
|
| 259 |
const c = document.createElement("canvas");
|
| 260 |
c.width = c.height = s;
|
| 261 |
const g = c.getContext("2d");
|
| 262 |
const grad = g.createRadialGradient(s/2, s/2, 0, s/2, s/2, s/2);
|
| 263 |
+
grad.addColorStop(0.0, "rgba(26,107,99,0.18)"); // was rgba(57,216,200,0.55)
|
| 264 |
+
grad.addColorStop(0.25, "rgba(26,107,99,0.06)"); // was rgba(57,216,200,0.18)
|
| 265 |
+
grad.addColorStop(1.0, "rgba(26,107,99,0.0)");
|
| 266 |
g.fillStyle = grad;
|
| 267 |
g.fillRect(0, 0, s, s);
|
| 268 |
const tex = new THREE.CanvasTexture(c);
|