@bongos/core 1.19.387 → 1.19.389
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.
- package/.bongos-core.json +144 -59
- package/.claude/skills/grade-recover/SKILL.md +1 -1
- package/.claude/skills/grader-health/SKILL.md +1 -1
- package/config/branding.neutral.json +19 -19
- package/config/design-tokens.neutral.json +31 -36
- package/docs/adr/0196-chrome-world-token-contract-and-the-landing-sheets.md +31 -0
- package/docs/adr/README.md +1 -0
- package/docs/branding-contract.md +1 -1
- package/docs/copy-inventory.md +93 -67
- package/docs/copy-registry.json +411 -133
- package/docs/file-map.md +15 -0
- package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
- package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
- package/modules/dev-box/app/assets/tray/win-off.png +0 -0
- package/modules/dev-box/app/assets/tray/win-on.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background@2x.png +0 -0
- package/modules/dev-box/app/build-resources/icon.png +0 -0
- package/modules/dev-box/app/renderer/index.html +1 -1
- package/modules/dev-box/app/renderer/styles.css +3 -1
- package/modules/dev-box/app/renderer/theme.generated.css +13 -13
- package/modules/dev-box/app/scripts/gen-brand.js +13 -13
- package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +3 -3
- package/modules/dev-box/app/scripts/gen-icons.js +3 -3
- package/modules/dev-box/app/src/brand.generated.json +1 -1
- package/modules/grading/grader-config.js +5 -3
- package/modules/grading/grader-rubric.json +2 -2
- package/modules/grading/grader-score.js +86 -33
- package/modules/grading/grader-workers/index.js +19 -0
- package/modules/hall-ui/public/builders.js +8 -3
- package/modules/provisioning/routes/provisioning.js +4 -4
- package/modules/status-ui/public/explore.html +12 -6
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +82 -64
- package/public-landing/assets/world/og-card.jpg +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp.json +12 -0
- package/public-landing/assets/world/r2-bongos-chrome-b.jpg +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-b.jpg.json +12 -0
- package/public-landing/assets/world/r2-chrome-blob-one-cut.webp +0 -0
- package/public-landing/assets/world/r2-chrome-blob-one-cut.webp.json +13 -0
- package/public-landing/assets/world/r2-chrome-blob-one.jpg +0 -0
- package/public-landing/assets/world/r2-chrome-blob-one.jpg.json +12 -0
- package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
- package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp.json +13 -0
- package/public-landing/assets/world/r2-chrome-blobs-set.jpg +0 -0
- package/public-landing/assets/world/r2-chrome-blobs-set.jpg.json +12 -0
- package/public-landing/assets/world.css +241 -0
- package/public-landing/contact.html +1 -1
- package/public-landing/index.html +1139 -580
- package/public-landing/privacy.html +1 -1
- package/public-landing/projects.html +2 -2
- package/public-landing/terms.html +1 -1
- package/scripts/gds/ship-grade-steps.js +27 -0
- package/src/bongos/platform-visibility-gate.js +8 -7
- package/src/bongos/stealth-gate.js +9 -8
- package/src/module-api.js +5 -1
- package/src/ui/adapters/claude-design/index.js +2 -2
- package/tests/cloud_bongos_pack.mjs +22 -18
- package/tests/cosmos_token_contrast.mjs +23 -8
- package/tests/grader.mjs +7 -6
- package/tests/grader_quality_window_overflow.mjs +324 -0
- package/tests/landing_legal_pages.mjs +8 -5
- package/tests/landing_page.mjs +295 -166
- package/tests/platform_boot.mjs +3 -1
- package/tests/projects_hub.mjs +9 -5
- package/tests/projects_hub_pre_uat.mjs +3 -1
- package/tests/world_tokens.mjs +351 -0
|
@@ -4,15 +4,17 @@
|
|
|
4
4
|
(/projects — the hub carrying the map, your projects, and the create wizard
|
|
5
5
|
at ?view=new since task 1002763).
|
|
6
6
|
|
|
7
|
-
THE LOOK —
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
THE LOOK — the chrome world (owner, 2026-08-27; task 1003298, goal 1000080).
|
|
8
|
+
The ember-marigold sunrise this file was born in is retired: the palette is a
|
|
9
|
+
neutral chrome-and-paper world with one warm accent. A LIGHT/DARK mode still
|
|
10
|
+
flips the WHOLE WORLD, not just the cards.
|
|
11
|
+
|
|
12
|
+
· light mode — a cool pale ground, near-white cards, graphite ink, and a
|
|
13
|
+
salmon accent that is a FILL and never a text colour: white on it measures
|
|
14
|
+
2.19:1, so a label on an accent fill takes --accent-on (dark ink) and an
|
|
15
|
+
accent-coloured WORD takes --accent-deep
|
|
16
|
+
· dark mode — a true-black ground with the card lifted just off it, white
|
|
17
|
+
ink, and the accent pair flipping direction so the link tone goes BRIGHTER
|
|
16
18
|
|
|
17
19
|
Mode resolution: prefers-color-scheme by default; an explicit choice
|
|
18
20
|
sets data-mode="light|dark" on <html> (persisted by the page script).
|
|
@@ -37,13 +39,13 @@
|
|
|
37
39
|
KEEP IN LOCKSTEP with config/branding.neutral.json theme.ui.colors —
|
|
38
40
|
tests/cosmos_token_contrast.mjs fails on any drift, because the pack is what
|
|
39
41
|
actually paints (its :root is spliced AFTER this file). */
|
|
40
|
-
--bg:#
|
|
41
|
-
--ink:#
|
|
42
|
-
--rule:#
|
|
43
|
-
--accent:#
|
|
44
|
-
--font-display:"
|
|
45
|
-
--font-body:"
|
|
46
|
-
--font-mono:"
|
|
42
|
+
--bg:#edecee; --bg-card:#fbfafc; --bg-deep:#e2e1e4; --bg-frame:#f6f5f7;
|
|
43
|
+
--ink:#17181a; --ink-soft:#55565a; --ink-faint:#65656a;
|
|
44
|
+
--rule:#c6c6c8; --rule-soft:#dcdbdd;
|
|
45
|
+
--accent:#fb9569; --accent-deep:#a3481a; --sea:#5b6fd0; --terracotta:#c9512c;
|
|
46
|
+
--font-display:"Manrope","Segoe UI",system-ui,-apple-system,sans-serif;
|
|
47
|
+
--font-body:"Manrope","Segoe UI",system-ui,-apple-system,sans-serif;
|
|
48
|
+
--font-mono:"JetBrains Mono",ui-monospace,"Cascadia Mono",Consolas,monospace;
|
|
47
49
|
|
|
48
50
|
/* the gate's locked space palette (dark mode's sky) */
|
|
49
51
|
--space-deep:#05060f; --space-mid:#0a0c20; --space-high:#0d0f28; --nebula:#2b2456;
|
|
@@ -59,91 +61,95 @@
|
|
|
59
61
|
/* chrome tier — the WHOLE WORLD flips with the mode (owner, 2026-08-12,
|
|
60
62
|
Loop 2: light = the sunrise white/orange page, dark = the gate's space).
|
|
61
63
|
Light values here; the dark blocks below swap all of them. */
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
/* the chrome tier is now DERIVED from the contract tier (task 1003298): the
|
|
65
|
+
page ground IS --bg and the chrome inks ARE the page inks, so a re-theme
|
|
66
|
+
carries the top bar, the sky and the footer with it. Before this they were
|
|
67
|
+
marigold literals (#f9d9a8 / #2b170e / #6d4a33) that no pack could move. */
|
|
68
|
+
--page-bg:var(--bg);
|
|
69
|
+
/* flat, not a gradient to white: one ground from the top bar to the footer.
|
|
70
|
+
A fade-out at the footer would reintroduce the fog. */
|
|
71
|
+
--sky-bg:var(--bg);
|
|
66
72
|
--star-display:none;
|
|
67
|
-
--chrome-ink
|
|
68
|
-
--chrome-ink-dim
|
|
73
|
+
--chrome-ink:var(--ink);
|
|
74
|
+
--chrome-ink-dim:var(--ink-soft);
|
|
69
75
|
--chrome-accent:var(--accent-deep);
|
|
70
76
|
--chrome-glow:none;
|
|
71
|
-
--glass-ink
|
|
77
|
+
--glass-ink:var(--ink-soft);
|
|
72
78
|
--glass-bg:rgba(255,255,255,0.62);
|
|
73
79
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
74
80
|
--ava-shadow:0 2px 8px rgba(0,0,0,0.14);
|
|
75
|
-
--hero-lede
|
|
81
|
+
--hero-lede:var(--ink-soft);
|
|
76
82
|
--hero-b:var(--accent-deep);
|
|
77
83
|
--foot-ink:var(--ink-faint);
|
|
78
84
|
--foot-code:var(--accent-deep);
|
|
79
85
|
color-scheme:light;
|
|
80
86
|
}
|
|
81
|
-
/* dark tier —
|
|
82
|
-
the
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
/* dark tier — the chrome world's night (task 1003298, 2026-08-27): a true-black
|
|
88
|
+
ground with the card lifted just off it, replacing the warm umber the marigold
|
|
89
|
+
look shipped. Two hooks so an explicit choice beats the OS preference; keep the
|
|
90
|
+
two blocks in lockstep (tests/cosmos_token_contrast.mjs).
|
|
85
91
|
|
|
86
92
|
A declaration here is PERMANENT for every instance: these selectors are (0,2,0)
|
|
87
93
|
and the branding pack injects a plain :root at (0,1,0), so it can never override
|
|
88
94
|
them. --accent, --sea and --terracotta are therefore deliberately absent — that
|
|
89
95
|
omission is the only reason a re-themed instance's accent reaches dark mode at all.
|
|
90
96
|
--accent-deep is the exception: it is text, and a hex tuned to 4.5:1 on a near-white
|
|
91
|
-
card cannot also clear it on a
|
|
97
|
+
card cannot also clear it on a near-black one. It is DERIVED from --accent (a different
|
|
92
98
|
property, so no cycle) and so still follows the pack. Every chrome token that wants
|
|
93
|
-
the warm highlight takes var(--accent-deep) for the same reason:
|
|
94
|
-
|
|
95
|
-
one pack's colour into every instance's dark mode. */
|
|
99
|
+
the warm highlight takes var(--accent-deep) for the same reason: the derivation
|
|
100
|
+
yields whatever bright twin the PACK's accent gives, so writing the literal would
|
|
101
|
+
have frozen one pack's colour into every instance's dark mode. */
|
|
96
102
|
:root[data-mode="dark"]{
|
|
97
|
-
--bg:#
|
|
98
|
-
--ink:#
|
|
99
|
-
--rule
|
|
103
|
+
--bg:#000000; --bg-card:#101012; --bg-deep:#000000; --bg-frame:#08080a;
|
|
104
|
+
--ink:#ffffff; --ink-soft:#c0c0c0; --ink-faint:#a8a8a8;
|
|
105
|
+
--rule:rgba(255,255,255,.16); --rule-soft:rgba(255,255,255,.08);
|
|
100
106
|
--accent-deep:color-mix(in srgb, var(--accent) 45%, #ffffff);
|
|
101
107
|
--link-ink:color-mix(in srgb, var(--accent) 51%, #ffffff);
|
|
102
108
|
--sea-ink:color-mix(in srgb, var(--sea) 65%, #ffffff);
|
|
103
109
|
--ok:#4ade80; --warn:#fbbf24; --err:#f87171;
|
|
104
110
|
--on-ok:#0b2e18;
|
|
105
|
-
--page-bg
|
|
106
|
-
--sky-bg
|
|
111
|
+
--page-bg:var(--bg);
|
|
112
|
+
--sky-bg:var(--bg);
|
|
107
113
|
--star-display:block;
|
|
108
|
-
--chrome-ink
|
|
109
|
-
--chrome-ink-dim
|
|
114
|
+
--chrome-ink:var(--ink);
|
|
115
|
+
--chrome-ink-dim:var(--ink-soft);
|
|
110
116
|
--chrome-accent:var(--accent-deep);
|
|
111
117
|
--chrome-glow:0 2px 12px rgba(0,0,0,.65);
|
|
112
118
|
--glass-ink:var(--accent-deep);
|
|
113
119
|
--glass-bg:rgba(255,255,255,0.07);
|
|
114
120
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
115
121
|
--ava-shadow:0 0 14px color-mix(in srgb, var(--accent) 45%, transparent);
|
|
116
|
-
--hero-lede
|
|
122
|
+
--hero-lede:var(--ink-soft);
|
|
117
123
|
--hero-b:var(--accent-deep);
|
|
118
|
-
--foot-ink
|
|
124
|
+
--foot-ink:var(--ink-faint);
|
|
119
125
|
--foot-code:var(--accent-deep);
|
|
120
126
|
--shadow-card:0 24px 60px -24px rgba(0,0,0,.6), 0 6px 22px -8px rgba(0,0,0,.4);
|
|
121
127
|
color-scheme:dark;
|
|
122
128
|
}
|
|
123
129
|
@media (prefers-color-scheme: dark){
|
|
124
130
|
:root:not([data-mode="light"]){
|
|
125
|
-
--bg:#
|
|
126
|
-
--ink:#
|
|
127
|
-
--rule
|
|
131
|
+
--bg:#000000; --bg-card:#101012; --bg-deep:#000000; --bg-frame:#08080a;
|
|
132
|
+
--ink:#ffffff; --ink-soft:#c0c0c0; --ink-faint:#a8a8a8;
|
|
133
|
+
--rule:rgba(255,255,255,.16); --rule-soft:rgba(255,255,255,.08);
|
|
128
134
|
--accent-deep:color-mix(in srgb, var(--accent) 45%, #ffffff);
|
|
129
135
|
--link-ink:color-mix(in srgb, var(--accent) 51%, #ffffff);
|
|
130
136
|
--sea-ink:color-mix(in srgb, var(--sea) 65%, #ffffff);
|
|
131
137
|
--ok:#4ade80; --warn:#fbbf24; --err:#f87171;
|
|
132
138
|
--on-ok:#0b2e18;
|
|
133
|
-
--page-bg
|
|
134
|
-
--sky-bg
|
|
139
|
+
--page-bg:var(--bg);
|
|
140
|
+
--sky-bg:var(--bg);
|
|
135
141
|
--star-display:block;
|
|
136
|
-
--chrome-ink
|
|
137
|
-
--chrome-ink-dim
|
|
142
|
+
--chrome-ink:var(--ink);
|
|
143
|
+
--chrome-ink-dim:var(--ink-soft);
|
|
138
144
|
--chrome-accent:var(--accent-deep);
|
|
139
145
|
--chrome-glow:0 2px 12px rgba(0,0,0,.65);
|
|
140
146
|
--glass-ink:var(--accent-deep);
|
|
141
147
|
--glass-bg:rgba(255,255,255,0.07);
|
|
142
148
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
143
149
|
--ava-shadow:0 0 14px color-mix(in srgb, var(--accent) 45%, transparent);
|
|
144
|
-
--hero-lede
|
|
150
|
+
--hero-lede:var(--ink-soft);
|
|
145
151
|
--hero-b:var(--accent-deep);
|
|
146
|
-
--foot-ink
|
|
152
|
+
--foot-ink:var(--ink-faint);
|
|
147
153
|
--foot-code:var(--accent-deep);
|
|
148
154
|
--shadow-card:0 24px 60px -24px rgba(0,0,0,.6), 0 6px 22px -8px rgba(0,0,0,.4);
|
|
149
155
|
color-scheme:dark;
|
|
@@ -157,6 +163,13 @@
|
|
|
157
163
|
--warn-soft:color-mix(in srgb, var(--warn) 15%, var(--bg-card));
|
|
158
164
|
--err-soft:color-mix(in srgb, var(--err) 12%, var(--bg-card));
|
|
159
165
|
--accent-soft:color-mix(in srgb, var(--accent) 15%, var(--bg-card));
|
|
166
|
+
/* THE INK ON AN ACCENT FILL (task 1003298). The chrome world's accent is a
|
|
167
|
+
light salmon — white on it is 2.19:1 in BOTH modes, so no filled accent
|
|
168
|
+
control can carry a white label any more. Derived from --accent rather than
|
|
169
|
+
pinned, so a re-theme keeps a same-hue ink; 18% accent over black measures
|
|
170
|
+
7.50:1 on the shipped pack. Every rule that used to say color:#fff on an
|
|
171
|
+
--accent background takes this instead. */
|
|
172
|
+
--accent-on:color-mix(in srgb, var(--accent) 18%, #000000);
|
|
160
173
|
--sea-soft:color-mix(in srgb, var(--sea) 16%, var(--bg-card));
|
|
161
174
|
/* the strip's STATE-carrying marks (done fill, now ring/pulse) — light uses
|
|
162
175
|
--sea as-is; dark derives brighter (the --accent-deep pattern) so a pack's
|
|
@@ -164,7 +177,7 @@
|
|
|
164
177
|
--sea-ink:var(--sea);
|
|
165
178
|
/* TEXT LINKS ONLY (task 1002822). Light is --accent-deep unchanged; dark needs
|
|
166
179
|
its own mix because --accent-deep and --ink-soft land 2 lightness points
|
|
167
|
-
apart there (
|
|
180
|
+
apart there (the marigold pack measured ΔE76 9.7) — the same colour, and dark links
|
|
168
181
|
carry no underline until hover, so weight was the only cue left. 51% is the
|
|
169
182
|
ceiling, not a preference: --accent-deep can't simply be pushed (it also
|
|
170
183
|
feeds --chrome-accent/--glass-ink/--hero-b/--foot-code), and past 51% a dark
|
|
@@ -246,7 +259,7 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
246
259
|
.lede a:hover{text-decoration:underline;}
|
|
247
260
|
|
|
248
261
|
/* ── buttons ── */
|
|
249
|
-
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:15px;color
|
|
262
|
+
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:15px;color:var(--accent-on);background:var(--accent);border:none;border-radius:999px;padding:11px 22px;text-decoration:none;box-shadow:0 10px 22px -8px color-mix(in srgb,var(--accent) 70%,transparent);transition:transform .15s ease, box-shadow .15s ease, background .15s ease;}
|
|
250
263
|
.btn:hover{transform:translateY(-1px);box-shadow:0 14px 28px -8px color-mix(in srgb,var(--accent) 80%,transparent);}
|
|
251
264
|
.btn:active{transform:translateY(0) scale(.98);}
|
|
252
265
|
.btn:disabled{background:color-mix(in srgb,var(--ink) 12%,var(--bg-deep));color:color-mix(in srgb,var(--ink) 40%,var(--bg-deep));box-shadow:none;cursor:not-allowed;transform:none;}
|
|
@@ -491,7 +504,7 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
491
504
|
.navrow a{font-family:var(--font-display);font-weight:700;font-size:13.5px;color:var(--glass-ink);
|
|
492
505
|
text-decoration:none;padding:7px 15px;border-radius:999px;white-space:nowrap;text-shadow:var(--chrome-glow);}
|
|
493
506
|
.navrow a:hover{color:var(--chrome-accent);}
|
|
494
|
-
.navrow a[aria-current="page"]{background:var(--accent);color
|
|
507
|
+
.navrow a[aria-current="page"]{background:var(--accent);color:var(--accent-on);text-shadow:none;}
|
|
495
508
|
/* Home LEAVES the hub, so it never takes the current-view pill and a hairline
|
|
496
509
|
sets it apart. Without it the header offered no way back to the landing page
|
|
497
510
|
except the wordmark, which nothing announced as a link. */
|
|
@@ -531,7 +544,7 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
531
544
|
border-radius:999px;padding:4px;gap:4px;backdrop-filter:blur(4px);}
|
|
532
545
|
.seg button{font-family:var(--font-display);font-weight:700;font-size:13px;color:var(--glass-ink);
|
|
533
546
|
background:none;border:none;cursor:pointer;padding:7px 16px;border-radius:999px;text-shadow:var(--chrome-glow);}
|
|
534
|
-
.seg button[aria-pressed="true"]{background:var(--accent);color
|
|
547
|
+
.seg button[aria-pressed="true"]{background:var(--accent);color:var(--accent-on);text-shadow:none;}
|
|
535
548
|
|
|
536
549
|
.search{flex:1;min-width:190px;max-width:460px;display:flex;align-items:center;gap:9px;
|
|
537
550
|
background:var(--glass-bg);border:1.5px solid var(--glass-border);border-radius:999px;
|
|
@@ -597,12 +610,12 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
597
610
|
without this the badge is painted over by the orb it labels */
|
|
598
611
|
.worldOrb .badge{position:absolute;top:-11px;left:50%;transform:translateX(-50%);z-index:3;
|
|
599
612
|
font-family:var(--font-mono);font-size:10.5px;font-weight:500;padding:2px 9px;border-radius:999px;
|
|
600
|
-
white-space:nowrap;background:var(--gold-soft);color
|
|
613
|
+
white-space:nowrap;background:var(--gold-soft);color:var(--accent-on);
|
|
601
614
|
box-shadow:0 2px 8px color-mix(in srgb,var(--ink) 30%,transparent);}
|
|
602
615
|
/* the owned ring is ONE ring, not two — a second cream halo read as a defect */
|
|
603
616
|
.worldOrb[data-rel="owner"] .disc{box-shadow:0 0 34px -4px color-mix(in srgb,var(--acc) 55%,transparent),
|
|
604
617
|
0 0 0 3px var(--accent);}
|
|
605
|
-
.worldOrb[data-rel="owner"] .badge{background:var(--accent);color
|
|
618
|
+
.worldOrb[data-rel="owner"] .badge{background:var(--accent);color:var(--accent-on);}
|
|
606
619
|
/* building, not owning — a lighter claim, said differently on purpose */
|
|
607
620
|
.worldOrb[data-rel="builder"] .disc{box-shadow:0 0 34px -4px color-mix(in srgb,var(--acc) 55%,transparent),
|
|
608
621
|
0 0 0 2px color-mix(in srgb,var(--accent) 55%,transparent);}
|
|
@@ -746,13 +759,14 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
746
759
|
font-weight:700;font-size:13px;color:var(--ink-soft);background:var(--bg-card);
|
|
747
760
|
border:2px solid var(--line);border-radius:999px;padding:7px 14px;white-space:nowrap;}
|
|
748
761
|
.filters button:hover{border-color:var(--accent);color:var(--accent-deep);}
|
|
749
|
-
.filters button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color
|
|
762
|
+
.filters button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:var(--accent-on);}
|
|
750
763
|
/* muted by TOKEN, not opacity — .75 multiplied after the ink resolved and took
|
|
751
764
|
the count to 4.05:1 on a resting pill and 3.23:1 on the pressed one (task
|
|
752
|
-
1002823). The pressed pill is excluded on purpose: its ground is the
|
|
753
|
-
--accent fill,
|
|
754
|
-
|
|
755
|
-
|
|
765
|
+
1002823). The pressed pill is still excluded on purpose: its ground is the
|
|
766
|
+
saturated --accent fill, so the count inherits the button's own label ink.
|
|
767
|
+
That ink is --accent-on since task 1003298 (7.50:1) — the marigold pack's
|
|
768
|
+
#fff cleared 4.61:1 there and the chrome world's salmon only clears 2.19:1.
|
|
769
|
+
Size, weight and the mono face already say "secondary". */
|
|
756
770
|
.filters .n{font-family:var(--font-mono);font-weight:500;font-size:11.5px;}
|
|
757
771
|
.filters button:not([aria-pressed="true"]) .n{color:var(--ink-faint);}
|
|
758
772
|
.mineEmpty{font-size:14.5px;font-weight:600;color:var(--ink-soft);padding:10px 0 22px;}
|
|
@@ -762,12 +776,16 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
762
776
|
.steps li{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;position:relative;list-style:none;}
|
|
763
777
|
.steps li:not(:first-child)::before{content:"";position:absolute;top:15px;right:50%;width:100%;height:3px;
|
|
764
778
|
background:var(--line);margin-right:15px;border-radius:2px;}
|
|
765
|
-
.
|
|
779
|
+
/* the rail's marks are NON-TEXT at WCAG 1.4.11's 3:1, and the chrome world's
|
|
780
|
+
--accent measures 2.10:1 on the card — so the ring and the connector take
|
|
781
|
+
--accent-deep (5.77:1 on the card, and the derived bright twin in dark). The
|
|
782
|
+
done step's FILL stays --accent with --accent-on ink on it (task 1003298). */
|
|
783
|
+
.steps li.done:not(:first-child)::before{background:var(--accent-deep);}
|
|
766
784
|
.steps .snum{width:32px;height:32px;border-radius:50%;border:3px solid var(--line);background:var(--bg-card);
|
|
767
785
|
display:flex;align-items:center;justify-content:center;font-family:var(--font-display);font-weight:700;
|
|
768
786
|
font-size:14px;color:var(--ink-faint);position:relative;z-index:1;}
|
|
769
|
-
.steps li.done .snum{border-color:var(--accent);background:var(--accent);color
|
|
770
|
-
.steps li.now .snum{border-color:var(--accent);color:var(--accent-deep);}
|
|
787
|
+
.steps li.done .snum{border-color:var(--accent-deep);background:var(--accent);color:var(--accent-on);}
|
|
788
|
+
.steps li.now .snum{border-color:var(--accent-deep);color:var(--accent-deep);}
|
|
771
789
|
.steps .slbl{font-size:12.5px;font-weight:700;color:var(--ink-faint);}
|
|
772
790
|
.steps li.now .slbl,.steps li.done .slbl{color:var(--ink-soft);}
|
|
773
791
|
.steps li[role=button]{cursor:pointer;}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "cutout",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "1:1",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T13:26Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"prompt": "Background removed (Higgsfield image_background_remover) from r2-bongos-chrome-a: a pair of bongo drums in mirror-polished liquid chrome with iridescent bronze, blue and violet reflections, brushed-steel drumheads, three-quarter view from slightly above.",
|
|
9
|
+
"source": ".impeccable/mocks/world-assets/r2-bongos-chrome-a-cut.png",
|
|
10
|
+
"encoded": "ffmpeg libwebp quality 88, alpha kept, 1600px (task 1003298)",
|
|
11
|
+
"use": "light mode: alpha cutout on the pale ground"
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "object",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "1:1",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T13:24Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"prompt": "Product render on a pure black background: a pair of bongo drums, one larger and one smaller joined by a short bridge, their shells liquid chrome with iridescent bronze, blue and violet reflections, crisp clean silhouette, seen straight on from slightly below so the drumheads are thin ellipses, faintly translucent drumheads, no hands, no text, no ground plane, no cast shadow or glow on the background. Pure black everywhere the drums are not.",
|
|
9
|
+
"source": ".impeccable/mocks/world-assets/r2-bongos-chrome-b.jpg",
|
|
10
|
+
"encoded": "verbatim copy of the plate (task 1003298)",
|
|
11
|
+
"use": "dark mode: black plate composited with mix-blend-mode lighten"
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "cutout",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "1:1",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T15:23Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"task": 1003297,
|
|
9
|
+
"prompt": "Background removed (Higgsfield image_background_remover) from r2-chrome-blob-one: a single liquid-chrome blob, mirror-polished with iridescent bronze, blue and violet reflections. Cut out so the bead can sit on a non-black ground (the landing's light mode, project orbs); the black plate with lighten blend stays the dark-mode material.",
|
|
10
|
+
"source": ".impeccable/mocks/world-assets/r2-chrome-blob-one-cut.png",
|
|
11
|
+
"encoded": "ffmpeg libwebp quality 88, alpha kept, 1600px (task 1003298)",
|
|
12
|
+
"use": "light mode: alpha cutout on the pale ground"
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "object",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "1:1",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T13:24Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"prompt": "A single iridescent liquid-chrome blob, a glossy organic form with a crisp clean edge and a mirror-smooth surface reflecting bronze, deep blue and violet with one thin bright rim highlight, centred on a pure black background, nothing else, no text, no ground plane, no shadow or glow on the background. Pure black everywhere the blob is not.",
|
|
9
|
+
"source": ".impeccable/mocks/world-assets/r2-chrome-blob-one.jpg",
|
|
10
|
+
"encoded": "verbatim copy of the plate (task 1003298)",
|
|
11
|
+
"use": "dark mode: black plate composited with mix-blend-mode lighten"
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "cutout",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "16:9",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T15:23Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"task": 1003297,
|
|
9
|
+
"prompt": "Background removed (Higgsfield image_background_remover) from r2-chrome-blobs-set: three liquid-chrome blobs, one large sweeping form, one round, one small bead, mirror-polished with iridescent bronze, blue and violet reflections. Cut out so the forms can sit on a non-black ground (the landing's light mode); the black plate with lighten blend stays the dark-mode material.",
|
|
10
|
+
"source": ".impeccable/mocks/world-assets/r2-chrome-blobs-set-cut.png",
|
|
11
|
+
"encoded": "ffmpeg libwebp quality 88, alpha kept, 1600px (task 1003298)",
|
|
12
|
+
"use": "light mode: alpha cutout on the pale ground"
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "plate",
|
|
3
|
+
"model": "nano_banana_pro",
|
|
4
|
+
"aspect_ratio": "16:9",
|
|
5
|
+
"resolution": "2k",
|
|
6
|
+
"generated": "2026-08-27T13:24Z",
|
|
7
|
+
"round": 2,
|
|
8
|
+
"prompt": "Full-frame render on a pure black background: three iridescent liquid-chrome blobs, glossy organic forms with crisp clean edges and mirror-smooth surfaces reflecting bronze, deep blue and violet, thin bright rim highlights, strong depth: one very large blob upper centre-right, a medium blob lower left, a small blob far right, generous empty black space between them, nothing else, no text, no ground plane, no shadows or glow on the background. Pure black everywhere the blobs are not, so the image can be composited with a lighten blend.",
|
|
9
|
+
"source": ".impeccable/mocks/world-assets/r2-chrome-blobs-set.jpg",
|
|
10
|
+
"encoded": "verbatim copy of the plate (task 1003298)",
|
|
11
|
+
"use": "dark mode: black plate composited with mix-blend-mode lighten"
|
|
12
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2
|
+
THE CHROME WORLD — token layer for the apex landing (`/`).
|
|
3
|
+
Ported from docs/design/mocks/world/chrome-blobs/_tokens.css at the build of
|
|
4
|
+
the approved landing composition (task 1003298, goal 1000080). The mock's
|
|
5
|
+
composition switches (hero geometry, field rectangles, shell and crest
|
|
6
|
+
surfaces) did NOT come with it: those belong to the page that arranges the
|
|
7
|
+
sculpture, not to the world. What lives here is what any surface in this
|
|
8
|
+
world needs to be the same world.
|
|
9
|
+
|
|
10
|
+
THE WORLD. Pure black space in dark, pale paper in light, with iridescent
|
|
11
|
+
liquid-chrome sculpture as the only thing in it. One warm salmon lights only
|
|
12
|
+
what is pressable or live. Type is a light geometric grotesque (Manrope 300),
|
|
13
|
+
lowercase at display sizes, tabular in figures; JetBrains Mono carries labels
|
|
14
|
+
and ids. Nothing else is decorated: the chrome is the decoration.
|
|
15
|
+
|
|
16
|
+
PALETTE STRATEGY — restrained. A neutral ground-to-ink scale and exactly one
|
|
17
|
+
hue. Dark is a true #000 ground (sampled from the owner's reference) so the
|
|
18
|
+
plates, which are rendered ON black, composite into it with `lighten` and
|
|
19
|
+
have no seam. Light is the same sculpture cut out with real alpha, standing
|
|
20
|
+
on paper under a contact shadow — no black panel anywhere.
|
|
21
|
+
|
|
22
|
+
MATERIALS. Six rendered plates, in pairs: each black-ground JPEG for dark and
|
|
23
|
+
its alpha cutout for light (`--plate-set` / `--plate-set-cut`, `--plate-bead`
|
|
24
|
+
/ `--plate-bead-cut`, `--plate-bongos` / `--plate-bongos-cut`). Every path is
|
|
25
|
+
ROOT-ABSOLUTE: Chromium resolves a url() inside a custom property against the
|
|
26
|
+
DOCUMENT, not the stylesheet that declared it, so a relative path here would
|
|
27
|
+
404 from every route but this file's own folder. Beyond the plates: dark
|
|
28
|
+
glass (translucent white over black with a backdrop blur and a 1px light
|
|
29
|
+
edge), a black pill ground for controls that must stay readable over bright
|
|
30
|
+
chrome, and 1px leader lines.
|
|
31
|
+
|
|
32
|
+
THE RULE. The fifteen contract tokens at the top of `:root` are the ONLY
|
|
33
|
+
colour source, and a host branding pack overrides exactly those (the server
|
|
34
|
+
splices them into `:root` at the end of <head>, at (0,1,0)). Everything below
|
|
35
|
+
them — every glass, tint, hatch, state colour, ramp and halo — is a var() or
|
|
36
|
+
a color-mix() of the fifteen, so a re-themed instance still gets a coherent
|
|
37
|
+
world. The two dark blocks are byte-identical twins at (0,2,0), so they win
|
|
38
|
+
over the pack; neither pins --accent, --sea or --terracotta to a literal,
|
|
39
|
+
because a re-themed instance has to be able to reach dark.
|
|
40
|
+
|
|
41
|
+
The sheet opens on `html { color-scheme: light }` rather than carrying the
|
|
42
|
+
hint in the token block: the browser's own surfaces (form controls, the
|
|
43
|
+
caret, the default scrollbar) are part of the world too, so light is the
|
|
44
|
+
sheet's opening state and each dark block below flips it with the palette.
|
|
45
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
46
|
+
html { color-scheme: light; }
|
|
47
|
+
|
|
48
|
+
:root {
|
|
49
|
+
/* ---- contract tier: the fifteen a host branding pack overrides ---- */
|
|
50
|
+
--bg: #edecee;
|
|
51
|
+
--bg-card: #fbfafc;
|
|
52
|
+
--bg-deep: #e2e1e4;
|
|
53
|
+
--bg-frame: #f6f5f7;
|
|
54
|
+
--ink: #17181a;
|
|
55
|
+
--ink-soft: #55565a;
|
|
56
|
+
--ink-faint: #65656a;
|
|
57
|
+
--rule: #c6c6c8;
|
|
58
|
+
--rule-soft: #dcdbdd;
|
|
59
|
+
--accent: #fb9569;
|
|
60
|
+
--accent-deep: #a3481a;
|
|
61
|
+
--sea: #5b6fd0;
|
|
62
|
+
--terracotta: #c9512c;
|
|
63
|
+
--font-display: "Manrope", "Segoe UI", system-ui, -apple-system, sans-serif;
|
|
64
|
+
--font-body: "Manrope", "Segoe UI", system-ui, -apple-system, sans-serif;
|
|
65
|
+
|
|
66
|
+
/* ---- derived: the second face ---- */
|
|
67
|
+
--font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Mono', Consolas, monospace;
|
|
68
|
+
|
|
69
|
+
/* ---- derived: the plates, in pairs (black-ground plate / alpha cutout) ---- */
|
|
70
|
+
--plate-set: url(/assets/world/r2-chrome-blobs-set.jpg);
|
|
71
|
+
--plate-set-cut: url(/assets/world/r2-chrome-blobs-set-cut.webp);
|
|
72
|
+
--plate-bead: url(/assets/world/r2-chrome-blob-one.jpg);
|
|
73
|
+
--plate-bead-cut: url(/assets/world/r2-chrome-blob-one-cut.webp);
|
|
74
|
+
--plate-bongos: url(/assets/world/r2-bongos-chrome-b.jpg);
|
|
75
|
+
--plate-bongos-cut: url(/assets/world/r2-bongos-chrome-a-cut.webp);
|
|
76
|
+
--blob-blend: lighten;
|
|
77
|
+
|
|
78
|
+
/* ---- derived: the void (the black the chrome composites on) ---- */
|
|
79
|
+
--void: #050508;
|
|
80
|
+
--void-ink: #ffffff;
|
|
81
|
+
--void-ink-soft: rgba(255, 255, 255, .70);
|
|
82
|
+
--void-edge: rgba(255, 255, 255, .14);
|
|
83
|
+
--void-pill: rgba(0, 0, 0, .5);
|
|
84
|
+
--void-glass: rgba(23, 24, 26, .05);
|
|
85
|
+
--void-glass-strong: rgba(23, 24, 26, .09);
|
|
86
|
+
--void-glass-edge: rgba(23, 24, 26, .12);
|
|
87
|
+
--door-bg: var(--void-glass);
|
|
88
|
+
|
|
89
|
+
/* ---- derived: glass ---- */
|
|
90
|
+
--glass: rgba(23, 24, 26, .05);
|
|
91
|
+
--glass-strong: rgba(23, 24, 26, .08);
|
|
92
|
+
--glass-edge: rgba(23, 24, 26, .12);
|
|
93
|
+
--glass-blur: 0px;
|
|
94
|
+
|
|
95
|
+
/* ---- derived: accent behaviours (the accent lights only what is live or pressable) ---- */
|
|
96
|
+
--accent-ink: color-mix(in srgb, var(--accent) 45%, #240e00);
|
|
97
|
+
--accent-lift: color-mix(in srgb, var(--accent) 58%, #ffffff);
|
|
98
|
+
--accent-tint: color-mix(in srgb, var(--accent) 30%, #fffdf9);
|
|
99
|
+
--accent-on: #2a1305;
|
|
100
|
+
/* light gives the primary door no lift, but this token is COMPOSED into shadow lists
|
|
101
|
+
(.door--go:focus-visible stacks the focus halo behind it), and the `none` keyword makes
|
|
102
|
+
any such list invalid. A zero-spread transparent shadow paints nothing and composes. */
|
|
103
|
+
--accent-glow: 0 0 0 0 transparent;
|
|
104
|
+
|
|
105
|
+
/* ---- derived: state ---- */
|
|
106
|
+
--ok: var(--accent-deep);
|
|
107
|
+
--warn: var(--terracotta);
|
|
108
|
+
--err: var(--terracotta);
|
|
109
|
+
--focus: color-mix(in srgb, var(--accent-deep) 82%, #3a1400);
|
|
110
|
+
|
|
111
|
+
/* ---- derived: geometry ---- */
|
|
112
|
+
--line: 1px;
|
|
113
|
+
--radius: 16px;
|
|
114
|
+
--radius-sm: 10px;
|
|
115
|
+
--radius-pill: 999px;
|
|
116
|
+
--top-h: 72px;
|
|
117
|
+
|
|
118
|
+
/* ---- derived: the bongo pair as line and fill, chrome ramp rather than ceramic ---- */
|
|
119
|
+
--chrome-hi: #ffffff;
|
|
120
|
+
--chrome-mid: #a9b2bd;
|
|
121
|
+
--chrome-cool: #949eaa;
|
|
122
|
+
--chrome-lo: #2e343c;
|
|
123
|
+
--skin-hi: #ffffff;
|
|
124
|
+
--skin-mid: #8e97a3;
|
|
125
|
+
--skin-lo: #333941;
|
|
126
|
+
--drum-shadow: #17181a;
|
|
127
|
+
--type-halo: none;
|
|
128
|
+
|
|
129
|
+
/* ---- derived: drawn chrome that cannot take a var() inline ---- */
|
|
130
|
+
--chev: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%2365656a' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
131
|
+
--check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 6.4l2.6 2.6L10 3.4' fill='none' stroke='%232a1305' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
132
|
+
--hatch: repeating-linear-gradient(45deg, transparent 0 5px, rgba(23, 24, 26, .12) 5px 6px);
|
|
133
|
+
|
|
134
|
+
/* ---- derived: the label face ---- */
|
|
135
|
+
--label-face: var(--font-mono);
|
|
136
|
+
--label-size: 11px;
|
|
137
|
+
--label-space: .12em;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
:root[data-mode="dark"] {
|
|
141
|
+
color-scheme: dark;
|
|
142
|
+
--bg: #000000;
|
|
143
|
+
--bg-card: #101012;
|
|
144
|
+
--bg-deep: #000000;
|
|
145
|
+
--bg-frame: #08080a;
|
|
146
|
+
--ink: #ffffff;
|
|
147
|
+
--ink-soft: #c0c0c0;
|
|
148
|
+
--ink-faint: #a8a8a8;
|
|
149
|
+
--rule: rgba(255, 255, 255, .16);
|
|
150
|
+
--rule-soft: rgba(255, 255, 255, .08);
|
|
151
|
+
--accent-deep: color-mix(in srgb, var(--accent) 70%, #ffffff);
|
|
152
|
+
--void: #000000;
|
|
153
|
+
--void-ink: var(--ink);
|
|
154
|
+
--void-ink-soft: var(--ink-soft);
|
|
155
|
+
--void-edge: rgba(255, 255, 255, .16);
|
|
156
|
+
--void-pill: rgba(0, 0, 0, .5);
|
|
157
|
+
--void-glass: rgba(255, 255, 255, .075);
|
|
158
|
+
--void-glass-strong: rgba(255, 255, 255, .14);
|
|
159
|
+
--void-glass-edge: rgba(255, 255, 255, .11);
|
|
160
|
+
--door-bg: var(--void-pill);
|
|
161
|
+
--glass: rgba(255, 255, 255, .11);
|
|
162
|
+
--glass-strong: rgba(255, 255, 255, .17);
|
|
163
|
+
--glass-edge: rgba(255, 255, 255, .13);
|
|
164
|
+
--glass-blur: 18px;
|
|
165
|
+
--accent-ink: var(--accent);
|
|
166
|
+
--accent-lift: color-mix(in srgb, var(--accent) 58%, #ffffff);
|
|
167
|
+
--accent-tint: color-mix(in srgb, var(--accent) 22%, #0b0a09);
|
|
168
|
+
--accent-on: #2a1305;
|
|
169
|
+
--accent-glow: 0 8px 28px color-mix(in srgb, var(--accent) 38%, transparent);
|
|
170
|
+
--ok: var(--accent);
|
|
171
|
+
--warn: var(--accent);
|
|
172
|
+
--err: var(--terracotta);
|
|
173
|
+
--focus: var(--accent);
|
|
174
|
+
--drum-shadow: #000000;
|
|
175
|
+
--type-halo: 0 2px 18px rgba(0, 0, 0, .94), 0 0 54px rgba(0, 0, 0, .72);
|
|
176
|
+
--chev: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%23a8a8a8' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
177
|
+
--check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 6.4l2.6 2.6L10 3.4' fill='none' stroke='%232a1305' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
178
|
+
--hatch: repeating-linear-gradient(45deg, transparent 0 5px, rgba(255, 255, 255, .14) 5px 6px);
|
|
179
|
+
--label-face: var(--font-body);
|
|
180
|
+
--label-size: 11.5px;
|
|
181
|
+
--label-space: .1em;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@media (prefers-color-scheme: dark) {
|
|
185
|
+
:root:not([data-mode="light"]) {
|
|
186
|
+
color-scheme: dark;
|
|
187
|
+
--bg: #000000;
|
|
188
|
+
--bg-card: #101012;
|
|
189
|
+
--bg-deep: #000000;
|
|
190
|
+
--bg-frame: #08080a;
|
|
191
|
+
--ink: #ffffff;
|
|
192
|
+
--ink-soft: #c0c0c0;
|
|
193
|
+
--ink-faint: #a8a8a8;
|
|
194
|
+
--rule: rgba(255, 255, 255, .16);
|
|
195
|
+
--rule-soft: rgba(255, 255, 255, .08);
|
|
196
|
+
--accent-deep: color-mix(in srgb, var(--accent) 70%, #ffffff);
|
|
197
|
+
--void: #000000;
|
|
198
|
+
--void-ink: var(--ink);
|
|
199
|
+
--void-ink-soft: var(--ink-soft);
|
|
200
|
+
--void-edge: rgba(255, 255, 255, .16);
|
|
201
|
+
--void-pill: rgba(0, 0, 0, .5);
|
|
202
|
+
--void-glass: rgba(255, 255, 255, .075);
|
|
203
|
+
--void-glass-strong: rgba(255, 255, 255, .14);
|
|
204
|
+
--void-glass-edge: rgba(255, 255, 255, .11);
|
|
205
|
+
--door-bg: var(--void-pill);
|
|
206
|
+
--glass: rgba(255, 255, 255, .11);
|
|
207
|
+
--glass-strong: rgba(255, 255, 255, .17);
|
|
208
|
+
--glass-edge: rgba(255, 255, 255, .13);
|
|
209
|
+
--glass-blur: 18px;
|
|
210
|
+
--accent-ink: var(--accent);
|
|
211
|
+
--accent-lift: color-mix(in srgb, var(--accent) 58%, #ffffff);
|
|
212
|
+
--accent-tint: color-mix(in srgb, var(--accent) 22%, #0b0a09);
|
|
213
|
+
--accent-on: #2a1305;
|
|
214
|
+
--accent-glow: 0 8px 28px color-mix(in srgb, var(--accent) 38%, transparent);
|
|
215
|
+
--ok: var(--accent);
|
|
216
|
+
--warn: var(--accent);
|
|
217
|
+
--err: var(--terracotta);
|
|
218
|
+
--focus: var(--accent);
|
|
219
|
+
--drum-shadow: #000000;
|
|
220
|
+
--type-halo: 0 2px 18px rgba(0, 0, 0, .94), 0 0 54px rgba(0, 0, 0, .72);
|
|
221
|
+
--chev: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%23a8a8a8' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
222
|
+
--check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 6.4l2.6 2.6L10 3.4' fill='none' stroke='%232a1305' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/></svg>");
|
|
223
|
+
--hatch: repeating-linear-gradient(45deg, transparent 0 5px, rgba(255, 255, 255, .14) 5px 6px);
|
|
224
|
+
--label-face: var(--font-body);
|
|
225
|
+
--label-size: 11.5px;
|
|
226
|
+
--label-space: .1em;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* ---- narrow: the bar tightens; the world is otherwise mode- and width-invariant ---- */
|
|
231
|
+
@media (max-width: 900px) {
|
|
232
|
+
:root {
|
|
233
|
+
--top-h: 60px;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* The kill switch. Every animation in this world is authored on a plate or a
|
|
238
|
+
control, and every one of them stops here. Nothing may escape it. */
|
|
239
|
+
@media (prefers-reduced-motion: reduce) {
|
|
240
|
+
*, *::before, *::after { animation: none !important; transition: none !important; }
|
|
241
|
+
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<link rel="canonical" href="{{publicOrigin}}/contact">
|
|
16
16
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
17
17
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
18
|
-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=
|
|
18
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
19
19
|
<link rel="stylesheet" href="/assets/cosmos.css">
|
|
20
20
|
<script>
|
|
21
21
|
/* Mode, resolved before first paint — the same contract as every landing page. */
|