@bongos/core 1.24.48 → 1.24.49

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 (91) hide show
  1. package/.bongos-core.json +142 -97
  2. package/config/branding.neutral.json +2 -1
  3. package/docs/copy-inventory.md +1028 -1028
  4. package/docs/copy-registry.json +1448 -1448
  5. package/docs/module-api-changelog.md +2 -0
  6. package/docs/page-readings.json +625 -625
  7. package/modules/hall-ui/public/ai-studio.html +2 -2
  8. package/modules/hall-ui/public/atlas.html +2 -2
  9. package/modules/hall-ui/public/blockers.html +2 -2
  10. package/modules/hall-ui/public/board-room.html +2 -2
  11. package/modules/hall-ui/public/city.html +1 -1
  12. package/modules/hall-ui/public/collab.html +2 -2
  13. package/modules/hall-ui/public/commands.html +2 -2
  14. package/modules/hall-ui/public/copy-desk.html +2 -2
  15. package/modules/hall-ui/public/deploy.html +2 -2
  16. package/modules/hall-ui/public/goal-map.html +2 -2
  17. package/modules/hall-ui/public/goals.html +2 -2
  18. package/modules/hall-ui/public/government.html +2 -2
  19. package/modules/hall-ui/public/hall-render.js +1 -1
  20. package/modules/hall-ui/public/idea.html +2 -2
  21. package/modules/hall-ui/public/ideas.html +2 -2
  22. package/modules/hall-ui/public/index.html +5 -5
  23. package/modules/hall-ui/public/market-watch-item.html +2 -2
  24. package/modules/hall-ui/public/market-watch-rules.html +2 -2
  25. package/modules/hall-ui/public/market-watch.html +2 -2
  26. package/modules/hall-ui/public/modules.html +2 -2
  27. package/modules/hall-ui/public/money.html +2 -2
  28. package/modules/hall-ui/public/my-agents.html +2 -2
  29. package/modules/hall-ui/public/primer.html +2 -2
  30. package/modules/hall-ui/public/profile.html +2 -2
  31. package/modules/hall-ui/public/project-settings.html +2 -2
  32. package/modules/hall-ui/public/roster.html +2 -2
  33. package/modules/hall-ui/public/settings.html +2 -2
  34. package/modules/hall-ui/public/shell.js +1 -1
  35. package/modules/hall-ui/public/street.html +1 -1
  36. package/modules/hall-ui/public/studio.html +2 -2
  37. package/modules/hall-ui/public/style.css +7 -9
  38. package/modules/hall-ui/public/task.html +2 -2
  39. package/modules/hall-ui/public/thinking.html +2 -2
  40. package/modules/hall-ui/public/tweak-editor.html +2 -2
  41. package/modules/hall-ui/public/watch.html +2 -2
  42. package/modules/hall-ui/public/welcome-boot.css +3 -4
  43. package/modules/hall-ui/public/welcome-boot.js +5 -3
  44. package/modules/hall-ui/public/work.html +2 -2
  45. package/modules/public-landing/public/account.html +1 -5
  46. package/modules/public-landing/public/assets/cosmos.css +7 -6
  47. package/modules/public-landing/public/community.html +1 -5
  48. package/modules/public-landing/public/connections.html +1 -5
  49. package/modules/public-landing/public/contact.html +1 -5
  50. package/modules/public-landing/public/guild.html +1 -5
  51. package/modules/public-landing/public/index.html +5 -8
  52. package/modules/public-landing/public/invitations.html +1 -5
  53. package/modules/public-landing/public/privacy.html +1 -5
  54. package/modules/public-landing/public/projects.html +1 -5
  55. package/modules/public-landing/public/terms.html +1 -5
  56. package/modules/raise/views/gate.html +4 -3
  57. package/modules/raise/views/nda.html +2 -1
  58. package/modules/raise/views/page.html +4 -3
  59. package/modules/status-ui/public/index.html +1 -1
  60. package/modules/status-ui/public/style.css +2 -2
  61. package/modules/ui-design/public/brand/apple-touch-icon.png +0 -0
  62. package/modules/ui-design/public/brand/favicon.svg +1 -0
  63. package/modules/ui-design/public/brand/mark-body.svg +1 -0
  64. package/modules/ui-design/public/brand/mark-dark.svg +1 -0
  65. package/modules/ui-design/public/brand/mark-dot.svg +1 -0
  66. package/modules/ui-design/public/brand/mark-light.svg +1 -0
  67. package/modules/ui-design/public/brand/mark-mono.svg +1 -0
  68. package/modules/ui-design/public/brand/mark.svg +21 -0
  69. package/package-lock.json +2 -2
  70. package/package.json +1 -1
  71. package/release-notes.json +6 -0
  72. package/scripts/bongos/fitness.js +1 -2
  73. package/scripts/bongos/gen-brand.js +99 -0
  74. package/scripts/gds/gen-brand.js +7 -0
  75. package/src/bongos/platform-visibility-gate.js +6 -3
  76. package/src/bongos/prelaunch-gate.js +6 -3
  77. package/src/bongos/serve-internal.js +1 -0
  78. package/src/brand-mark.js +96 -0
  79. package/src/branding.js +2 -0
  80. package/src/hall-look.js +7 -7
  81. package/src/module-api.js +1 -1
  82. package/tests/brand_mark.mjs +195 -0
  83. package/tests/cloud_bongos_pack.mjs +5 -2
  84. package/tests/hall_loading.mjs +8 -10
  85. package/tests/loading_mark.mjs +7 -13
  86. package/tests/nav_permission_atoms.mjs +2 -1
  87. package/tests/raise.mjs +3 -1
  88. package/tests/welcome_boot.mjs +5 -2
  89. package/modules/raise/public/favicon.svg +0 -1
  90. package/modules/raise/public/logo-ink.svg +0 -1
  91. package/modules/raise/public/logo-night.svg +0 -1
@@ -38,7 +38,8 @@ const SURFACES = {
38
38
  status: { css: STATUS_CSS, loader: section(STATUS_CSS, '/* ---------- The loader (task 1005053') },
39
39
  };
40
40
  const flat = (s) => s.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\s+/g, ' ');
41
- const masksOf = (css) => [...css.matchAll(/url\("data:image\/svg\+xml,([^"]+)"\)/g)].map((m) => decodeURIComponent(m[1]));
41
+ // The masks are the brand folder's one-ink shapes (task 1005088), named by file.
42
+ const masksOf = (css) => [...css.matchAll(/url\("\/modules\/ui-design\/public\/brand\/(mark-[a-z]+\.svg)"\)/g)].map((m) => m[1]);
42
43
  function keyframes(css, name) {
43
44
  const m = css.match(new RegExp(`@keyframes ${name} ?\\{`));
44
45
  assert.ok(m, `@keyframes ${name} exists`);
@@ -48,16 +49,11 @@ function keyframes(css, name) {
48
49
  }
49
50
 
50
51
  test('the apex loader is the bar\'s own Bongos mark, and the status loader is the same mark', () => {
51
- // The apex bar draws the mark inline (account.html's .bongosMark); the loader's
52
- // two masks carry exactly its arc, core and dot, so the loader IS the logo.
52
+ // The apex bar and the loader are cut from the one mark (task 1005088): the bar references
53
+ // mark.svg, and the loader's two masks are its ring-and-core and its dot, so the loader IS the logo.
53
54
  const bar = read(LANDING, 'account.html');
54
- const arc = bar.match(/<path class="mr" d="([^"]+)"/)[1];
55
- assert.match(bar, /<circle class="mp" cx="100" cy="100" r="55"/);
56
- assert.match(bar, /<circle cx="156" cy="46" r="12" style="fill:var\(--accent\)"\/>/);
57
- const [ring, dot] = masksOf(SURFACES.apex.loader);
58
- assert.ok(ring.includes(`d='${arc}'`), 'the ring is the bar mark\'s arc');
59
- assert.ok(ring.includes("<circle cx='100' cy='100' r='55'/>"), 'the core is the bar mark\'s core');
60
- assert.ok(dot.includes("<circle cx='156' cy='46' r='12'/>"), 'the dot is the bar mark\'s dot');
55
+ assert.match(bar, /<svg class="bongosMark"[^>]*><use href="\/modules\/ui-design\/public\/brand\/mark\.svg#mark"\/><\/svg>/);
56
+ assert.deepEqual(masksOf(SURFACES.apex.loader), ['mark-body.svg', 'mark-dot.svg']);
61
57
  // The status page has no Bongos mark of its own: its loader carries the apex's two
62
58
  // masks byte for byte, so the two surfaces cannot drift into two logos.
63
59
  assert.deepEqual(masksOf(SURFACES.status.loader), masksOf(SURFACES.apex.loader));
@@ -91,9 +87,7 @@ for (const [name, { css, loader }] of Object.entries(SURFACES)) {
91
87
  for (const p of paints) assert.match(p, /^(var\(--[a-z-]+\)|color-mix\(in srgb, ?var\(--ink\) 30%, ?var\(--bg-card\)\))$/, `${p} is a token or a mix of one`);
92
88
  // The one accent is the dot: the live thing on a waiting page (the One Warm Thing Rule).
93
89
  assert.equal((css.match(/var\(--accent\)/g) || []).length, 1, 'the accent paints the dot alone');
94
- const masks = masksOf(loader);
95
- assert.equal(masks.length, 2, 'two masks: the ring and core, and the dot');
96
- for (const m of masks) assert.doesNotMatch(m.replace(/stroke='black'|fill='none'/g, ''), /fill='|stroke='|#/, 'a mask carries no colour of its own');
90
+ assert.deepEqual(masksOf(loader), ['mark-body.svg', 'mark-dot.svg'], 'two masks: the ring and core, and the dot');
97
91
  });
98
92
 
99
93
  test(`${name}: the dot shares the ring's grid cell, so no page padding can knock it off`, () => {
@@ -101,7 +101,8 @@ test('the hall-preview fixture carries every atom /me resolves', () => {
101
101
  // task 1005050: Accomplishments left it (folded into Profile; its hashes redirect);
102
102
  // task 1005051: Roadmap left it (folded into Goals; /roadmap redirects).
103
103
  // task 1005070: the remembered nav (the rail paints before /me).
104
- const SHELL_SHA = 'dbbe6f2eb49a65c3';
104
+ // task 1005088: the sidebar mark is drawn by reference to the one brand mark.
105
+ const SHELL_SHA = '2845bfedfaf7846f';
105
106
 
106
107
  test('shell.js has not changed without its cache-bust being bumped', () => {
107
108
  const actual = crypto.createHash('sha256').update(SHELL).digest('hex').slice(0, 16);
package/tests/raise.mjs CHANGED
@@ -157,7 +157,9 @@ test('a stranger gets the gate, never the copy', async () => {
157
157
  assert.doesNotMatch(html, /gamification of capitalism/);
158
158
  assert.equal(r.headers.get('x-robots-tag'), 'noindex, nofollow, noarchive');
159
159
  assert.equal((await get('/raise/media/x.mp4')).status, 401);
160
- assert.equal((await get('/raise/assets/logo-ink.svg')).status, 200, 'the gate needs its logo');
160
+ // the gate's logo is the shared one (task 1005088), served on every host, never a raise copy
161
+ assert.match(html, /src="\/modules\/ui-design\/public\/brand\/mark-light\.svg"/, 'the gate needs its logo');
162
+ assert.equal((await get('/raise/assets/logo-ink.svg')).status, 404, 'the old pasted copy is gone');
161
163
  assert.match(await (await get('/raise/nda')).text(), /CONFIDENTIALITY|Confidential/i);
162
164
  });
163
165
 
@@ -79,8 +79,11 @@ test('the banner is the logo, named from the branding pack, never a hardcoded wo
79
79
  assert.equal(W.bannerText, undefined, 'the "Working on the core of" banner is gone');
80
80
  const harbor = W.logoHtml({ identity: { worldName: 'Harbor', productName: 'Cloud Bongos' } });
81
81
  assert.match(harbor, /<svg class="wb__mark"/, 'no project logo: the Bongos mark');
82
- assert.match(harbor, /class="wb__ring"[^>]*pathLength="100"/, 'the ring can draw in');
83
- assert.match(harbor, /class="wb__moonlet"[^>]*fill="#fb9569"/, 'the salmon moon');
82
+ // the parts come from the one mark (task 1005088), whose ring carries pathLength="100"
83
+ assert.match(harbor, /<use class="wb__ring" href="\/modules\/ui-design\/public\/brand\/mark\.svg#mark-ring"\/>/, 'the ring can draw in');
84
+ assert.match(harbor, /<use class="wb__planet" href="[^"]*#mark-disc"\/>/, 'the planet');
85
+ assert.match(harbor, /<use class="wb__moonlet" href="[^"]*#mark-dot"\/>/, 'the moon');
86
+ assert.match(fs.readFileSync(path.join(ROOT, 'modules', 'ui-design', 'public', 'brand', 'mark.svg'), 'utf8'), /id="mark-ring"[^>]*pathLength="100"/);
84
87
  assert.match(harbor, /<span class="wb__name">Harbor<\/span>/);
85
88
  assert.match(W.logoHtml(undefined), /<span class="wb__name">this project<\/span>/, 'no branding: still a name');
86
89
  const own = W.logoHtml({ identity: { worldName: 'Harbor' }, theme: { logo: '/logo.png?a="b"' } });
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><style>.p{fill:#17181a}.r{stroke:#17181a}@media (prefers-color-scheme:dark){.p{fill:#e2e1e4}.r{stroke:#e2e1e4}}</style><path class="r" d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke-width="24" stroke-linecap="round"/><circle class="p" cx="100" cy="100" r="50"/><circle cx="156" cy="46" r="18" fill="#fb9569"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" role="img" aria-label="Cloud Bongos"><path d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke="#17181a" stroke-width="15" stroke-linecap="round"/><circle cx="100" cy="100" r="55" fill="#17181a"/><circle cx="156" cy="46" r="12" fill="#fb9569"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" role="img" aria-label="Cloud Bongos"><path d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke="#e2e1e4" stroke-width="15" stroke-linecap="round"/><circle cx="100" cy="100" r="55" fill="#e2e1e4"/><circle cx="156" cy="46" r="12" fill="#fb9569"/></svg>