@bongos/core 1.19.386 → 1.19.388

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 (63) hide show
  1. package/.bongos-core.json +138 -53
  2. package/config/branding.neutral.json +19 -19
  3. package/config/design-tokens.neutral.json +31 -36
  4. package/docs/adr/0196-chrome-world-token-contract-and-the-landing-sheets.md +31 -0
  5. package/docs/adr/README.md +1 -0
  6. package/docs/branding-contract.md +1 -1
  7. package/docs/copy-inventory.md +156 -133
  8. package/docs/copy-registry.json +537 -286
  9. package/docs/file-map.md +14 -0
  10. package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
  11. package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
  12. package/modules/dev-box/app/assets/tray/win-off.png +0 -0
  13. package/modules/dev-box/app/assets/tray/win-on.png +0 -0
  14. package/modules/dev-box/app/build-resources/dmg-background.png +0 -0
  15. package/modules/dev-box/app/build-resources/dmg-background@2x.png +0 -0
  16. package/modules/dev-box/app/build-resources/icon.png +0 -0
  17. package/modules/dev-box/app/renderer/index.html +1 -1
  18. package/modules/dev-box/app/renderer/styles.css +3 -1
  19. package/modules/dev-box/app/renderer/theme.generated.css +13 -13
  20. package/modules/dev-box/app/scripts/gen-brand.js +13 -13
  21. package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +3 -3
  22. package/modules/dev-box/app/scripts/gen-icons.js +3 -3
  23. package/modules/dev-box/app/src/brand.generated.json +1 -1
  24. package/modules/hall-ui/public/government.css +70 -0
  25. package/modules/hall-ui/public/government.html +9 -2
  26. package/modules/hall-ui/public/government.js +175 -32
  27. package/modules/provisioning/routes/provisioning.js +4 -4
  28. package/modules/status-ui/public/explore.html +12 -6
  29. package/package-lock.json +2 -2
  30. package/package.json +1 -1
  31. package/public-landing/assets/cosmos.css +82 -64
  32. package/public-landing/assets/world/og-card.jpg +0 -0
  33. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
  34. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp.json +12 -0
  35. package/public-landing/assets/world/r2-bongos-chrome-b.jpg +0 -0
  36. package/public-landing/assets/world/r2-bongos-chrome-b.jpg.json +12 -0
  37. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp +0 -0
  38. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp.json +13 -0
  39. package/public-landing/assets/world/r2-chrome-blob-one.jpg +0 -0
  40. package/public-landing/assets/world/r2-chrome-blob-one.jpg.json +12 -0
  41. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
  42. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp.json +13 -0
  43. package/public-landing/assets/world/r2-chrome-blobs-set.jpg +0 -0
  44. package/public-landing/assets/world/r2-chrome-blobs-set.jpg.json +12 -0
  45. package/public-landing/assets/world.css +241 -0
  46. package/public-landing/contact.html +1 -1
  47. package/public-landing/index.html +1139 -580
  48. package/public-landing/privacy.html +1 -1
  49. package/public-landing/projects.html +2 -2
  50. package/public-landing/terms.html +1 -1
  51. package/src/bongos/platform-visibility-gate.js +8 -7
  52. package/src/bongos/stealth-gate.js +9 -8
  53. package/src/module-api.js +5 -1
  54. package/src/ui/adapters/claude-design/index.js +2 -2
  55. package/tests/cloud_bongos_pack.mjs +22 -18
  56. package/tests/cosmos_token_contrast.mjs +23 -8
  57. package/tests/government_board_room_copy.mjs +131 -0
  58. package/tests/landing_legal_pages.mjs +8 -5
  59. package/tests/landing_page.mjs +295 -166
  60. package/tests/platform_boot.mjs +3 -1
  61. package/tests/projects_hub.mjs +9 -5
  62. package/tests/projects_hub_pre_uat.mjs +3 -1
  63. package/tests/world_tokens.mjs +351 -0
@@ -8,14 +8,19 @@
8
8
  /* Self-contained so the showcase renders correctly whether or not the host
9
9
  injects theme tokens. Warm Cloud Bongos defaults; overridable by the pack. */
10
10
  :root {
11
- --bg: #f9d9a8; --card: #fffaf2; --ink: #2b170e; --ink-soft: #6d4a33;
12
- --rule: #e8a463; --accent: #ce4806;
11
+ /* a hand-written mirror of config/branding.neutral.json theme.ui.colors —
12
+ this page is served without the branding injection, so a drifted value
13
+ renders a palette the product no longer paints (tests/design_tokens_sync.mjs).
14
+ Chrome world, task 1003298. --accent-deep is the TEXT-safe accent: the
15
+ salmon --accent is a fill and measures 2.1:1 as type on the card. */
16
+ --bg: #edecee; --card: #fbfafc; --ink: #17181a; --ink-soft: #55565a;
17
+ --rule: #c6c6c8; --accent: #fb9569; --accent-deep: #a3481a;
13
18
  }
14
19
  * { box-sizing: border-box; }
15
20
  body {
16
21
  margin: 0; padding: 2.5rem 1.25rem 4rem;
17
22
  background: var(--bg); color: var(--ink);
18
- font-family: "Quicksand", system-ui, -apple-system, "Segoe UI", sans-serif;
23
+ font-family: "Manrope", system-ui, -apple-system, "Segoe UI", sans-serif;
19
24
  line-height: 1.5;
20
25
  }
21
26
  .wrap { max-width: 960px; margin: 0 auto; }
@@ -28,14 +33,15 @@
28
33
  padding: 1.1rem 1.2rem; text-decoration: none; color: inherit;
29
34
  display: flex; flex-direction: column; gap: .4rem; transition: transform .12s ease, box-shadow .12s ease;
30
35
  }
31
- .card:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(234,88,12,.12); }
36
+ .card:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0,0,0,.12); }
32
37
  .card h2 { font-size: 1.15rem; margin: 0; }
33
38
  .card p { margin: 0; color: var(--ink-soft); font-size: .95rem; }
34
- .card .origin { color: var(--accent); font-size: .82rem; word-break: break-all; margin-top: auto; }
39
+ .card .origin { color: var(--accent-deep); font-size: .82rem; word-break: break-all; margin-top: auto; }
35
40
  .card .art { width: 100%; height: 120px; object-fit: cover; border-radius: 10px; margin-bottom: .3rem; }
36
41
  .empty, .err { text-align: center; color: var(--ink-soft); padding: 3rem 1rem; }
37
42
  @media (prefers-color-scheme: dark) {
38
- :root { --bg: #1a1410; --card: #241c16; --ink: #f5ece3; --ink-soft: #b9a998; --rule: #4a3728; }
43
+ :root { --bg: #000000; --card: #101012; --ink: #ffffff; --ink-soft: #c0c0c0; --rule: rgba(255,255,255,.16);
44
+ --accent-deep: color-mix(in srgb, var(--accent) 45%, #ffffff); }
39
45
  }
40
46
  </style>
41
47
  </head>
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.386",
3
+ "version": "1.19.388",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.386",
9
+ "version": "1.19.388",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.386",
3
+ "version": "1.19.388",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -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 — ember marigold (owner, 2026-08-13; task 1002748, and before it
8
- the 2026-08-12 Loop 2 decisions). A LIGHT/DARK mode flips the WHOLE WORLD,
9
- not just the cards, and BOTH grounds are warm — dark is not an inversion:
10
-
11
- · light mode — pigmented marigold air, ivory cards, an ember accent fired
12
- down from SaaS-bright into something with heat behind it
13
- · dark mode — a warm umber night: deep-brown cards, cream ink, and the
14
- accent pair flipping direction so the link tone goes BRIGHTER, which is
15
- how warm schemes actually behave on a dark ground
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:#f9d9a8; --bg-card:#fffaf2; --bg-deep:#f6d8ae;
41
- --ink:#2b170e; --ink-soft:#6d4a33; --ink-faint:#785a41;
42
- --rule:#e8a463; --rule-soft:#f6d8ae;
43
- --accent:#ce4806; --accent-deep:#9e3406; --sea:#0f7a96; --terracotta:#855b3d;
44
- --font-display:"Baloo 2","Quicksand",system-ui,"Arial Rounded MT Bold",sans-serif;
45
- --font-body:"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;
46
- --font-mono:"Fira Code",ui-monospace,SFMono-Regular,Menlo,monospace;
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
- --page-bg:#f9d9a8;
63
- /* flat, not a gradient to white: the golden ground IS the marigold decision.
64
- A gradient that faded out at the footer would reintroduce the fog. */
65
- --sky-bg:#f9d9a8;
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:#2b170e;
68
- --chrome-ink-dim:#6d4a33;
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:#6d4a33;
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:#6d4a33;
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 — ember marigold's night: a WARM umber world, not an inversion of
82
- the light one and no longer the gate's blue-violet space (task 1002748,
83
- direction §3). Two hooks so an explicit choice beats the OS preference; keep
84
- the two blocks in lockstep (tests/cosmos_token_contrast.mjs).
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 #2c1710 one. It is DERIVED from --accent (a different
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: marigold's own
94
- #ffab63 is what that derivation yields, so writing the literal would have frozen
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:#150c06; --bg-card:#2c1710; --bg-deep:#3f2317;
98
- --ink:#fdeedd; --ink-soft:#dcb693; --ink-faint:#b89272;
99
- --rule:#5e3521; --rule-soft:#3f2317;
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:#150c06;
106
- --sky-bg:#150c06;
111
+ --page-bg:var(--bg);
112
+ --sky-bg:var(--bg);
107
113
  --star-display:block;
108
- --chrome-ink:#fdeedd;
109
- --chrome-ink-dim:#dcb693;
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:#dcb693;
122
+ --hero-lede:var(--ink-soft);
117
123
  --hero-b:var(--accent-deep);
118
- --foot-ink:#b89272;
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:#150c06; --bg-card:#2c1710; --bg-deep:#3f2317;
126
- --ink:#fdeedd; --ink-soft:#dcb693; --ink-faint:#b89272;
127
- --rule:#5e3521; --rule-soft:#3f2317;
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:#150c06;
134
- --sky-bg:#150c06;
139
+ --page-bg:var(--bg);
140
+ --sky-bg:var(--bg);
135
141
  --star-display:block;
136
- --chrome-ink:#fdeedd;
137
- --chrome-ink-dim:#dcb693;
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:#dcb693;
150
+ --hero-lede:var(--ink-soft);
145
151
  --hero-b:var(--accent-deep);
146
- --foot-ink:#b89272;
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 (#e9ad8f vs #dcb693, ΔE76 9.7) — the same colour, and dark links
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:#fff;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;}
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:#fff;text-shadow:none;}
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:#fff;text-shadow:none;}
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:#2b170e;
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:#fff;}
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:#fff;}
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 saturated
753
- --accent fill, where no ink token clears 4.5:1 (--ink is the best at 3.70
754
- light / 4.05 dark) — only the button's own #fff does, at 4.61, so the count
755
- inherits it there. Size, weight and the mono face already say "secondary". */
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
- .steps li.done:not(:first-child)::before{background:var(--accent);}
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:#fff;}
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;}
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }