@bongos/core 1.19.387 → 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 (59) hide show
  1. package/.bongos-core.json +130 -50
  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 +78 -53
  8. package/docs/copy-registry.json +389 -120
  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/provisioning/routes/provisioning.js +4 -4
  25. package/modules/status-ui/public/explore.html +12 -6
  26. package/package-lock.json +2 -2
  27. package/package.json +1 -1
  28. package/public-landing/assets/cosmos.css +82 -64
  29. package/public-landing/assets/world/og-card.jpg +0 -0
  30. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
  31. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp.json +12 -0
  32. package/public-landing/assets/world/r2-bongos-chrome-b.jpg +0 -0
  33. package/public-landing/assets/world/r2-bongos-chrome-b.jpg.json +12 -0
  34. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp +0 -0
  35. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp.json +13 -0
  36. package/public-landing/assets/world/r2-chrome-blob-one.jpg +0 -0
  37. package/public-landing/assets/world/r2-chrome-blob-one.jpg.json +12 -0
  38. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
  39. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp.json +13 -0
  40. package/public-landing/assets/world/r2-chrome-blobs-set.jpg +0 -0
  41. package/public-landing/assets/world/r2-chrome-blobs-set.jpg.json +12 -0
  42. package/public-landing/assets/world.css +241 -0
  43. package/public-landing/contact.html +1 -1
  44. package/public-landing/index.html +1139 -580
  45. package/public-landing/privacy.html +1 -1
  46. package/public-landing/projects.html +2 -2
  47. package/public-landing/terms.html +1 -1
  48. package/src/bongos/platform-visibility-gate.js +8 -7
  49. package/src/bongos/stealth-gate.js +9 -8
  50. package/src/module-api.js +3 -1
  51. package/src/ui/adapters/claude-design/index.js +2 -2
  52. package/tests/cloud_bongos_pack.mjs +22 -18
  53. package/tests/cosmos_token_contrast.mjs +23 -8
  54. package/tests/landing_legal_pages.mjs +8 -5
  55. package/tests/landing_page.mjs +295 -166
  56. package/tests/platform_boot.mjs +3 -1
  57. package/tests/projects_hub.mjs +9 -5
  58. package/tests/projects_hub_pre_uat.mjs +3 -1
  59. package/tests/world_tokens.mjs +351 -0
@@ -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
+ }
@@ -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=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
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. */