@bongos/core 1.19.88 → 1.19.90

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.
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Palette + hero options — cloudbongos.com/ (task 1002747)</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <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">
10
+ <style>
11
+ :root{--ink:#12131c;--soft:#5d6070;--faint:#8b8fa3;--line:#dcdfe8;--bg:#f4f5f9;--card:#fff;}
12
+ @media(prefers-color-scheme:dark){:root{--ink:#f2f3f8;--soft:#a8adc0;--faint:#767b90;--line:#2b2f3d;--bg:#0d0f16;--card:#161a24;}}
13
+ *{box-sizing:border-box;margin:0;padding:0;}
14
+ body{background:var(--bg);color:var(--ink);font-family:"Quicksand",system-ui,sans-serif;
15
+ padding:clamp(20px,4vw,46px);-webkit-font-smoothing:antialiased;}
16
+ h1{font-family:"Baloo 2",sans-serif;font-weight:700;font-size:clamp(24px,3.4vw,34px);letter-spacing:-.7px;margin-bottom:8px;}
17
+ .sub{font-size:15px;font-weight:500;color:var(--soft);max-width:74ch;line-height:1.6;margin-bottom:10px;}
18
+ .sub b{color:var(--ink);}
19
+ .warn{border-left:3px solid #dc2626;background:color-mix(in srgb,#dc2626 8%,transparent);
20
+ border-radius:0 10px 10px 0;padding:12px 16px;font-size:14px;font-weight:600;line-height:1.6;
21
+ color:var(--ink);max-width:82ch;margin:16px 0 26px;}
22
+ .warn code{font-family:"Fira Code",monospace;font-size:12.5px;}
23
+ .bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:24px;}
24
+ .bar button{cursor:pointer;font-family:"Quicksand",sans-serif;font-weight:700;font-size:13.5px;
25
+ padding:8px 16px;border-radius:999px;border:2px solid var(--line);background:var(--card);color:var(--ink);}
26
+ .bar button[aria-pressed="true"]{border-color:var(--ink);background:var(--ink);color:var(--card);}
27
+ .bar span{font-family:"Fira Code",monospace;font-size:11px;color:var(--faint);letter-spacing:.5px;text-transform:uppercase;}
28
+ .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(430px,1fr));gap:clamp(16px,2.4vw,26px);}
29
+ .cell{background:var(--card);border:1.5px solid var(--line);border-radius:18px;overflow:hidden;}
30
+ .cellHead{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1.5px solid var(--line);}
31
+ .dot{width:16px;height:16px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 1.5px rgba(128,128,128,.28) inset;}
32
+ .nm{font-family:"Baloo 2",sans-serif;font-weight:700;font-size:16px;letter-spacing:-.2px;}
33
+ .tag{font-size:12px;font-weight:600;color:var(--faint);margin-left:auto;font-family:"Fira Code",monospace;}
34
+ .frame{position:relative;width:100%;aspect-ratio:16/10;overflow:hidden;background:var(--bg);}
35
+ .frame iframe{position:absolute;top:0;left:0;width:1280px;height:800px;border:0;
36
+ transform:scale(.336);transform-origin:top left;}
37
+ .note{padding:11px 16px;font-size:13px;font-weight:500;color:var(--soft);line-height:1.55;border-top:1.5px solid var(--line);}
38
+ .note b{color:var(--ink);font-weight:700;}
39
+ a.open{display:inline-block;margin-top:6px;font-size:12.5px;font-weight:700;color:inherit;}
40
+ </style>
41
+ </head>
42
+ <body>
43
+
44
+ <h1>Seven palettes, two heroes</h1>
45
+ <p class="sub">The same landing page, re-themed. Each palette is exactly what a branding pack does — it
46
+ overrides the <b>cosmos.css</b> contract tier. On a real instance only one exists, injected by
47
+ <b>themeMarkup()</b>. Click any tile's <b>open full</b> to walk it at full size with the switcher.</p>
48
+
49
+ <div class="warn">
50
+ <b>Found while checking these:</b> the palette shipping <b>today</b> fails WCAG AA. White on
51
+ <code>--accent #f97316</code> is <b>2.80:1</b> where 4.5 is required, and <code>--accent-deep #ea580c</code>
52
+ as link text on a card is <b>3.56:1</b>. That affects every primary button and link on <code>/create</code>
53
+ and <code>/projects</code> right now — not just this page. All six candidates below were checked with a
54
+ contrast calculator across twelve pairs each and pass cleanly in both modes.
55
+ </div>
56
+
57
+ <div class="bar">
58
+ <span>hero</span>
59
+ <button data-m="bongos" aria-pressed="true">bongos</button>
60
+ <button data-m="buddha" aria-pressed="false">buddha</button>
61
+ <span style="margin-left:14px">mode</span>
62
+ <button data-md="light" aria-pressed="true">light</button>
63
+ <button data-md="dark" aria-pressed="false">dark</button>
64
+ </div>
65
+
66
+ <div class="grid" id="grid"></div>
67
+
68
+ <script>
69
+ var SCHEMES=[
70
+ {k:'', n:'shipped today', d:'#f97316', note:'The current tokens. <b>Fails contrast</b> on buttons and links — see above.'},
71
+ {k:'adobe-clay', n:'adobe clay', d:'#b8492c', note:'Fired terracotta, sand, a whisper of sage. The only warm option with a real <b>second hue</b>, so the dark band has somewhere to go. <b>Risk:</b> too much beige reads as tired.'},
72
+ {k:'ember-marigold', n:'ember marigold',d:'#ce4806', note:'Today’s sunrise with the milk taken out — a genuinely pigmented backdrop so cards lift off it. <b>Risk:</b> one hue plays every part.'},
73
+ {k:'letterpress', n:'letterpress', d:'#C22A12', note:'Warm paper, near-black type, one vermilion struck on the downbeat. Most trustworthy. <b>Risk:</b> austerity fights the rounded type.'},
74
+ {k:'deep-water', n:'deep water', d:'#0d7f97', note:'Promotes the unused <code>--sea</code> token to the lead. Calm and coherent. <b>Risk:</b> reads as generic cloud-vendor SaaS.'},
75
+ {k:'sapwood', n:'sapwood', d:'#3d7a33', note:'Oat paper and pigment greens, dodging both eco-brand and terminal-green. <b>Risk:</b> green says gardening, not build platform.'},
76
+ {k:'plumfield', n:'plumfield', d:'#932bcf', note:'Leans hardest into the space metaphor; best dark mode of the set. <b>Risk:</b> violet+magenta is the uniform of crypto — bad for a capture-resistance pitch.'}
77
+ ];
78
+ var mascot='bongos', mode='light';
79
+ function render(){
80
+ document.getElementById('grid').innerHTML = SCHEMES.map(function(s){
81
+ var src='landing-page-mock.html?rail=0&mascot='+mascot+'&mode='+mode+'&scheme='+encodeURIComponent(s.k);
82
+ return '<div class="cell">'+
83
+ '<div class="cellHead"><span class="dot" style="background:'+s.d+'"></span>'+
84
+ '<span class="nm">'+s.n+'</span><span class="tag">'+(s.k||'current')+'</span></div>'+
85
+ '<div class="frame"><iframe loading="lazy" src="'+src+'" title="'+s.n+'"></iframe></div>'+
86
+ '<div class="note">'+s.note+'<br><a class="open" href="'+src.replace('rail=0','rail=1')+'" target="_blank">open full →</a></div>'+
87
+ '</div>';
88
+ }).join('');
89
+ }
90
+ document.querySelectorAll('[data-m]').forEach(function(b){
91
+ b.onclick=function(){ mascot=b.dataset.m;
92
+ document.querySelectorAll('[data-m]').forEach(function(x){x.setAttribute('aria-pressed',String(x===b));});
93
+ render(); };
94
+ });
95
+ document.querySelectorAll('[data-md]').forEach(function(b){
96
+ b.onclick=function(){ mode=b.dataset.md;
97
+ document.querySelectorAll('[data-md]').forEach(function(x){x.setAttribute('aria-pressed',String(x===b));});
98
+ render(); };
99
+ });
100
+ render();
101
+ </script>
102
+ </body>
103
+ </html>
@@ -5,11 +5,11 @@
5
5
  --bg-deep: #ffedd5;
6
6
  --ink: #2a1f17;
7
7
  --ink-soft: #6b5d52;
8
- --ink-faint: #857567;
8
+ --ink-faint: #756a60;
9
9
  --rule: #fdba74;
10
10
  --rule-soft: #fed7aa;
11
- --accent: #f97316;
12
- --accent-deep: #ea580c;
11
+ --accent: #ce4806;
12
+ --accent-deep: #9e3406;
13
13
  --terracotta: #fb7185;
14
14
  --font-display: "Baloo 2", "Quicksand", system-ui, sans-serif;
15
15
  --font-body: "Quicksand", system-ui, -apple-system, "Segoe UI", sans-serif;
@@ -90,11 +90,11 @@ function buildThemeCss(branding) {
90
90
  --bg-deep: ${v(c.bgDeep, '#ffedd5')};
91
91
  --ink: ${v(c.ink, '#2a1f17')};
92
92
  --ink-soft: ${v(c.inkSoft, '#6b5d52')};
93
- --ink-faint: ${v(c.inkFaint, '#857567')};
93
+ --ink-faint: ${v(c.inkFaint, '#756a60')};
94
94
  --rule: ${v(c.rule, '#fdba74')};
95
95
  --rule-soft: ${v(c.ruleSoft, '#fed7aa')};
96
- --accent: ${v(c.accent, '#f97316')};
97
- --accent-deep: ${v(c.accentDeep, '#ea580c')};
96
+ --accent: ${v(c.accent, '#ce4806')};
97
+ --accent-deep: ${v(c.accentDeep, '#9e3406')};
98
98
  --terracotta: ${v(c.terracotta, '#fb7185')};
99
99
  --font-display: ${v(fonts.display, '"Baloo 2", "Quicksand", system-ui, sans-serif')};
100
100
  --font-body: ${v(fonts.body, '"Quicksand", system-ui, -apple-system, "Segoe UI", sans-serif')};
@@ -70,7 +70,7 @@ ICON = 100 # dmg.iconSize
70
70
  COLOR_ROLES = {
71
71
  "bg": "#fff7ed", "bgDeep": "#ffedd5", "bgCard": "#ffffff",
72
72
  "ink": "#2a1f17", "inkSoft": "#6b5d52", "ruleSoft": "#fed7aa",
73
- "accent": "#f97316", "accentDeep": "#ea580c", "terracotta": "#fb7185",
73
+ "accent": "#ce4806", "accentDeep": "#9e3406", "terracotta": "#fb7185",
74
74
  }
75
75
 
76
76
  FONT_DIRS = (
@@ -64,7 +64,7 @@ const OUT_BUILD = path.join(APP_DIR, 'build-resources');
64
64
  const COLOR_ROLES = {
65
65
  bgCard: '#ffffff', bgDeep: '#ffedd5', ink: '#2a1f17',
66
66
  rule: '#fdba74', ruleSoft: '#fed7aa',
67
- accent: '#f97316', accentDeep: '#ea580c', terracotta: '#fb7185',
67
+ accent: '#ce4806', accentDeep: '#9e3406', terracotta: '#fb7185',
68
68
  };
69
69
 
70
70
  // The pack, resolved exactly as gen-brand.js resolves it (env → instance → neutral).
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.88",
3
+ "version": "1.19.90",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.88",
9
+ "version": "1.19.90",
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.88",
3
+ "version": "1.19.90",
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",
@@ -27,9 +27,9 @@
27
27
  :root{
28
28
  /* contract tier (light mode) */
29
29
  --bg:#fff7ed; --bg-card:#ffffff; --bg-deep:#ffedd5;
30
- --ink:#2a1f17; --ink-soft:#6b5d52; --ink-faint:#9c8d80;
30
+ --ink:#2a1f17; --ink-soft:#6b5d52; --ink-faint:#756a60;
31
31
  --rule:#fdba74; --rule-soft:#fed7aa;
32
- --accent:#f97316; --accent-deep:#ea580c; --sea:#38bdf8; --terracotta:#fb7185;
32
+ --accent:#ce4806; --accent-deep:#9e3406; --sea:#38bdf8; --terracotta:#fb7185;
33
33
  --font-display:"Baloo 2","Quicksand",system-ui,"Arial Rounded MT Bold",sans-serif;
34
34
  --font-body:"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;
35
35
  --font-mono:"Fira Code",ui-monospace,SFMono-Regular,Menlo,monospace;
@@ -38,8 +38,9 @@
38
38
  --space-deep:#05060f; --space-mid:#0a0c20; --space-high:#0d0f28; --nebula:#2b2456;
39
39
  --sun-lit:#fb923c; --gold:#ffd98a; --gold-soft:#f6c976;
40
40
 
41
- /* semantic state tier */
42
- --ok:#16a34a; --warn:#d97706; --err:#dc2626;
41
+ /* semantic state tier — each is painted as 12px/700 chip TEXT on its own
42
+ -soft tint, so each must clear 4.5:1 against that tint AND the plain card. */
43
+ --ok:#107937; --warn:#9c5604; --err:#ca2323;
43
44
 
44
45
  /* chrome tier — the WHOLE WORLD flips with the mode (owner, 2026-08-12,
45
46
  Loop 2: light = the sunrise white/orange page, dark = the gate's space).
@@ -49,24 +50,33 @@
49
50
  --star-display:none;
50
51
  --chrome-ink:#2a1f17;
51
52
  --chrome-ink-dim:#6b5d52;
52
- --chrome-accent:#f97316;
53
+ --chrome-accent:var(--accent-deep);
53
54
  --chrome-glow:none;
54
55
  --glass-ink:#6b5d52;
55
56
  --glass-bg:rgba(255,255,255,0.65);
56
- --glass-border:rgba(249,115,22,0.4);
57
+ --glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
57
58
  --ava-shadow:0 2px 8px rgba(42,31,23,0.12);
58
59
  --hero-lede:#6b5d52;
59
- --hero-b:#ea580c;
60
- --foot-ink:#9c8d80;
61
- --foot-code:#ea580c;
60
+ --hero-b:var(--accent-deep);
61
+ --foot-ink:var(--ink-faint);
62
+ --foot-code:var(--accent-deep);
62
63
  color-scheme:light;
63
64
  }
64
65
  /* dark tier — space sky + dark cards. Two hooks so an explicit choice beats
65
- the OS preference. */
66
+ the OS preference; keep the two blocks in lockstep (tests/cosmos_token_contrast.mjs).
67
+
68
+ A declaration here is PERMANENT for every instance: these selectors are (0,2,0)
69
+ and the branding pack injects a plain :root at (0,1,0), so it can never override
70
+ them. --accent and --sea are therefore deliberately absent — that omission is the
71
+ only reason a re-themed instance's accent reaches dark mode at all.
72
+ --accent-deep is the exception: it is text, and a hex tuned to 4.5:1 on a near-white
73
+ card cannot also clear it on a #12142e one. It is DERIVED from --accent (a different
74
+ property, so no cycle) and so still follows the pack. */
66
75
  :root[data-mode="dark"]{
67
76
  --bg:#0d0f28; --bg-card:#12142e; --bg-deep:#1d2046;
68
- --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#93897d;
77
+ --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#998e82;
69
78
  --rule:#5a4a7a; --rule-soft:#3a3560;
79
+ --accent-deep:color-mix(in srgb, var(--accent) 45%, #ffffff);
70
80
  --ok:#4ade80; --warn:#fbbf24; --err:#f87171;
71
81
  --page-bg:#05060f;
72
82
  --sky-bg:radial-gradient(120% 85% at 50% -12%, #2b2456 0%, rgba(43,36,86,0) 55%),
@@ -76,7 +86,7 @@
76
86
  --star-display:block;
77
87
  --chrome-ink:#ffffff;
78
88
  --chrome-ink-dim:rgba(255,255,255,0.85);
79
- --chrome-accent:#fb923c;
89
+ --chrome-accent:var(--accent-deep);
80
90
  --chrome-glow:0 2px 12px rgba(20,12,30,.7);
81
91
  --glass-ink:#ffd98a;
82
92
  --glass-bg:rgba(255,255,255,0.06);
@@ -91,8 +101,9 @@
91
101
  @media (prefers-color-scheme: dark){
92
102
  :root:not([data-mode="light"]){
93
103
  --bg:#0d0f28; --bg-card:#12142e; --bg-deep:#1d2046;
94
- --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#93897d;
104
+ --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#998e82;
95
105
  --rule:#5a4a7a; --rule-soft:#3a3560;
106
+ --accent-deep:color-mix(in srgb, var(--accent) 45%, #ffffff);
96
107
  --ok:#4ade80; --warn:#fbbf24; --err:#f87171;
97
108
  --page-bg:#05060f;
98
109
  --sky-bg:radial-gradient(120% 85% at 50% -12%, #2b2456 0%, rgba(43,36,86,0) 55%),
@@ -102,7 +113,7 @@
102
113
  --star-display:block;
103
114
  --chrome-ink:#ffffff;
104
115
  --chrome-ink-dim:rgba(255,255,255,0.85);
105
- --chrome-accent:#fb923c;
116
+ --chrome-accent:var(--accent-deep);
106
117
  --chrome-glow:0 2px 12px rgba(20,12,30,.7);
107
118
  --glass-ink:#ffd98a;
108
119
  --glass-bg:rgba(255,255,255,0.06);
@@ -241,7 +252,7 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
241
252
  @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr code{color:var(--sun-lit);}}
242
253
  .attach{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap;}
243
254
  .attach input[type=text]{flex:1;min-width:220px;font-family:var(--font-body);font-size:15px;font-weight:600;color:var(--ink);background:var(--bg-card);border:2px solid var(--line);border-radius:12px;padding:9px 14px;outline:none;transition:border-color .15s ease, box-shadow .15s ease;}
244
- .attach input[type=text]::placeholder{color:color-mix(in srgb,var(--ink-faint) 70%,var(--bg-card));font-weight:500;}
255
+ .attach input[type=text]::placeholder{color:var(--ink-faint);font-weight:500;}
245
256
  .attach input[type=text]:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 13%,transparent);}
246
257
  .projMsg{font-size:13.5px;font-weight:600;margin-top:10px;min-height:18px;color:var(--ink-soft);line-height:1.5;}
247
258
  .projMsg.ok{color:var(--ok);}
@@ -272,7 +283,7 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
272
283
  .strip .stages li.now .sdot{border-color:var(--sea);}
273
284
  .strip .stages li.now .sdot::after{content:"";width:8px;height:8px;border-radius:50%;background:var(--sea);animation:beatPulse 1.2s ease-in-out infinite;}
274
285
  @keyframes beatPulse{0%,100%{transform:scale(.7);opacity:.6}50%{transform:scale(1.15);opacity:1}}
275
- .strip .slbl{font-size:12px;font-weight:700;color:color-mix(in srgb,var(--sea) 55%,var(--ink-faint));}
286
+ .strip .slbl{font-size:12px;font-weight:700;color:var(--ink-faint);}
276
287
  .strip .stages li.now .slbl,.strip .stages li.done .slbl{color:color-mix(in srgb,var(--sea) 40%,var(--ink));}
277
288
  .strip .pnote{text-align:center;font-size:13px;font-weight:600;color:var(--ink-soft);min-height:18px;line-height:1.5;}
278
289
  .strip .pnote a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
@@ -131,7 +131,8 @@ input[type=text]{
131
131
  background:var(--bg-card);border:2px solid var(--line);border-radius:14px;padding:13px 16px;outline:none;
132
132
  transition:border-color .15s ease, box-shadow .15s ease;
133
133
  }
134
- input[type=text]::placeholder{color:color-mix(in srgb,var(--ink-faint) 70%,var(--bg-card));font-weight:500;}
134
+ /* no fade toward the card — a 70% mix washed placeholders to 2.89:1 (task 1002749) */
135
+ input[type=text]::placeholder{color:var(--ink-faint);font-weight:500;}
135
136
  input[type=text]:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 13%,transparent);}
136
137
  input[type=text].bad{border-color:var(--err);}
137
138
  .hint{font-size:13px;font-weight:600;color:var(--ink-faint);margin-top:7px;min-height:18px;}
@@ -328,7 +329,9 @@ input[type=text].bad{border-color:var(--err);}
328
329
  .ghrow:last-child{border-bottom:0;}
329
330
  .ghrow:hover{background:color-mix(in srgb,var(--accent) 6%,var(--bg-deep));}
330
331
  .ghrow[aria-selected=true]{background:color-mix(in srgb,var(--accent) 12%,var(--bg-deep));box-shadow:inset 3px 0 0 var(--accent);font-weight:600;}
331
- .ghrow .priv{margin-left:auto;font-size:11px;font-weight:600;color:var(--ink-faint);background:color-mix(in srgb,var(--ink) 8%,transparent);border-radius:5px;padding:1px 6px;}
332
+ /* --ink-soft, not --ink-faint: the badge tint is the darkest ground on the page,
333
+ and faint ink only reaches 3.96:1 on it (task 1002749). */
334
+ .ghrow .priv{margin-left:auto;font-size:11px;font-weight:600;color:var(--ink-soft);background:color-mix(in srgb,var(--ink) 8%,transparent);border-radius:5px;padding:1px 6px;}
332
335
  </style>
333
336
  </head>
334
337
  <body>
@@ -3,7 +3,26 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Cloud Bongos — landing gate</title>
6
+ <title>Cloud Bongos — building software is laying down a beat</title>
7
+ <!-- Launch-safety metadata (task 1002746). Until the front door moves to the
8
+ landing page (see docs/design/front-door-and-hub-direction.md), THIS page is
9
+ what answers cloudbongos.com/ — so it is what search results and link
10
+ previews describe. It shipped with an internal-sounding title, no
11
+ description, and no social tags; the whole host is noindex today, so none of
12
+ it bit yet, but all of it bites the moment the pre-launch lock comes off.
13
+ The absolute cloudbongos.com URLs match the domain space.js already pins. -->
14
+ <meta name="description" content="An open-source, AI-first build platform. AI agents claim tasks and write the code; you set the scope and the gates. Explore the live projects, or start your own." />
15
+ <link rel="canonical" href="https://cloudbongos.com/" />
16
+ <meta property="og:type" content="website" />
17
+ <meta property="og:site_name" content="Cloud Bongos" />
18
+ <meta property="og:url" content="https://cloudbongos.com/" />
19
+ <meta property="og:title" content="Cloud Bongos — building software is laying down a beat" />
20
+ <meta property="og:description" content="An open-source, AI-first build platform. AI agents claim tasks and write the code; you set the scope and the gates." />
21
+ <meta property="og:image" content="https://cloudbongos.com/buddha.png" />
22
+ <meta name="twitter:card" content="summary_large_image" />
23
+ <meta name="twitter:title" content="Cloud Bongos — building software is laying down a beat" />
24
+ <meta name="twitter:description" content="An open-source, AI-first build platform. AI agents claim tasks and write the code; you set the scope and the gates." />
25
+ <meta name="twitter:image" content="https://cloudbongos.com/buddha.png" />
7
26
  <link href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet" />
8
27
  <link rel="stylesheet" href="space.css" />
9
28
  <!-- Anti-flash (task 1985 follow-up): on a direct-orbs load — a vanity door
@@ -139,6 +158,29 @@
139
158
  </style>
140
159
  </head>
141
160
  <body class="view-entry">
161
+ <!-- No-JS fallback (task 1002746). The sky is entirely JS-built: without it this
162
+ page rendered blank, so a non-executing crawler or a JS-off visitor saw
163
+ nothing at all on the domain's front door. Inline styles because every
164
+ stylesheet rule here is scoped to a body view-class this block must ignore.
165
+ Keep the copy in sync with the meta description above. -->
166
+ <noscript>
167
+ <div style="position:fixed;inset:0;z-index:9999;overflow:auto;background:#0b1020;color:#e9edf7;font-family:'Baloo 2',system-ui,sans-serif;padding:2rem;">
168
+ <div style="max-width:34rem;margin:12vh auto 0;">
169
+ <h1 style="font-size:1.9rem;line-height:1.2;margin:0 0 .75rem;">Cloud&nbsp;Bongos</h1>
170
+ <p style="font-size:1.05rem;line-height:1.6;margin:0 0 1rem;color:#c3cbe0;">
171
+ An open-source, AI-first build platform. AI agents claim tasks and write the
172
+ code; you set the scope and the gates.
173
+ </p>
174
+ <p style="font-size:1.05rem;line-height:1.6;margin:0 0 1.5rem;color:#c3cbe0;">
175
+ The interactive map of live projects needs JavaScript, but everything below
176
+ works without it.
177
+ </p>
178
+ <p style="margin:0 0 .6rem;"><a href="/projects" style="color:#ffd98a;">Your projects</a> — find and manage the projects you own.</p>
179
+ <p style="margin:0 0 .6rem;"><a href="/create" style="color:#ffd98a;">Start a project</a> — stand up a new one.</p>
180
+ <p style="margin:0;"><a href="https://builders.cloudbongos.com" style="color:#ffd98a;">Builders' Hall</a> — where the work happens.</p>
181
+ </div>
182
+ </div>
183
+ </noscript>
142
184
  <!-- ═══ dive cinematic (task 1729): clicking the Cloud Bongos orb flies you
143
185
  from the space constellation, down through the clouds, into the Cloud
144
186
  Bongos world (the download page). space.js plays #descent on the self-orb
package/src/module-api.js CHANGED
@@ -603,8 +603,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
603
603
  // landed since 1.19.86 with no explicit bump. run 31656188572. (task 1002620)
604
604
  // 1.19.88 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
605
605
  // landed since 1.19.87 with no explicit bump. run 31656577595. (task 1002620)
606
+ // 1.19.89 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
607
+ // landed since 1.19.88 with no explicit bump. run 31657467485. (task 1002620)
608
+ // 1.19.90 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
609
+ // landed since 1.19.89 with no explicit bump. run 31717551308. (task 1002620)
606
610
  // ---------------------------------------------------------------------------
607
- const CORE_VERSION = '1.19.88'; // CI auto-patch carrier (ADR 0161); see changelog above
611
+ const CORE_VERSION = '1.19.90'; // CI auto-patch carrier (ADR 0161); see changelog above
608
612
 
609
613
  // A namespaced logger so a module's log lines are attributable + consistent.
610
614
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -32,7 +32,9 @@ test('R74: a vanilla boot resolves to the Cloud Bongos identity', () => {
32
32
 
33
33
  test('R74: the vanilla pack carries the Cloud Bongos LOOK (sunrise palette, Baloo 2/Quicksand, bongo favicon)', () => {
34
34
  const c = clientBranding(vanilla());
35
- assert.equal(c.theme.colors.accent, '#f97316', 'sunrise orange accent');
35
+ // fired down from the original #f97316 so white-on-accent clears WCAG AA
36
+ // (2.80:1 -> 4.61:1, task 1002749) — same ember hue, readable
37
+ assert.equal(c.theme.colors.accent, '#ce4806', 'sunrise orange accent');
36
38
  assert.equal(c.theme.colors.bg, '#fff7ed', 'warm sunrise base');
37
39
  assert.match(c.theme.fonts.display, /Baloo 2/);
38
40
  assert.match(c.theme.fonts.body, /Quicksand/);
@@ -49,12 +51,12 @@ test('R74: serving the hall on a vanilla boot injects the Cloud Bongos sunrise t
49
51
  const html = '<head><link rel="stylesheet" href="/builders/style.css"><title>x</title></head><body></body>';
50
52
  const out = injectBrandingGlobal(html, c);
51
53
  // palette override + sunrise body backdrop + bongo favicon + the type links
52
- assert.match(out, /:root\{[^}]*--accent:#f97316;/);
54
+ assert.match(out, /:root\{[^}]*--accent:#ce4806;/);
53
55
  assert.match(out, /body\{background:linear-gradient\(180deg/);
54
56
  assert.match(out, /<link rel="icon" href="data:image\/svg\+xml[^"]*circle/);
55
57
  assert.match(out, /fonts\.googleapis\.com\/css2\?family=Baloo\+2/);
56
58
  // and it lands AFTER the stylesheet so the Cloud Bongos look wins
57
- assert.ok(out.indexOf('/builders/style.css') < out.indexOf('--accent:#f97316'));
59
+ assert.ok(out.indexOf('/builders/style.css') < out.indexOf('--accent:#ce4806'));
58
60
  });
59
61
 
60
62
  test('R74: themeMarkup paints the backdrop only when the pack supplies one', () => {