@bongos/core 1.24.47 → 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 (106) hide show
  1. package/.bongos-core.json +165 -110
  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/file-map.md +1 -1
  6. package/docs/module-api-changelog.md +4 -0
  7. package/docs/page-readings.json +625 -625
  8. package/modules/hall-ui/public/ai-studio.html +2 -2
  9. package/modules/hall-ui/public/atlas.html +2 -2
  10. package/modules/hall-ui/public/blockers.html +2 -2
  11. package/modules/hall-ui/public/board-room.html +2 -2
  12. package/modules/hall-ui/public/city.html +1 -1
  13. package/modules/hall-ui/public/collab.css +3 -22
  14. package/modules/hall-ui/public/collab.html +2 -2
  15. package/modules/hall-ui/public/commands.html +2 -2
  16. package/modules/hall-ui/public/controls.css +223 -0
  17. package/modules/hall-ui/public/copy-desk.html +2 -2
  18. package/modules/hall-ui/public/deploy.html +2 -2
  19. package/modules/hall-ui/public/goal-map.html +2 -2
  20. package/modules/hall-ui/public/goals.css +4 -23
  21. package/modules/hall-ui/public/goals.html +2 -2
  22. package/modules/hall-ui/public/government.html +2 -2
  23. package/modules/hall-ui/public/hall-render.js +1 -1
  24. package/modules/hall-ui/public/idea.html +2 -2
  25. package/modules/hall-ui/public/ideas.html +2 -2
  26. package/modules/hall-ui/public/index.html +5 -5
  27. package/modules/hall-ui/public/market-watch-item.html +2 -2
  28. package/modules/hall-ui/public/market-watch-rules.html +2 -2
  29. package/modules/hall-ui/public/market-watch.html +2 -2
  30. package/modules/hall-ui/public/modules.html +2 -2
  31. package/modules/hall-ui/public/money.html +2 -2
  32. package/modules/hall-ui/public/my-agents.css +3 -25
  33. package/modules/hall-ui/public/my-agents.html +2 -2
  34. package/modules/hall-ui/public/oversight.css +3 -17
  35. package/modules/hall-ui/public/panel.css +6 -48
  36. package/modules/hall-ui/public/primer.html +2 -2
  37. package/modules/hall-ui/public/profile.html +2 -2
  38. package/modules/hall-ui/public/project-settings.html +2 -2
  39. package/modules/hall-ui/public/roster.html +2 -2
  40. package/modules/hall-ui/public/settings.html +2 -2
  41. package/modules/hall-ui/public/shell.js +1 -1
  42. package/modules/hall-ui/public/speciality-tools.js +14 -14
  43. package/modules/hall-ui/public/street.html +1 -1
  44. package/modules/hall-ui/public/studio.html +2 -2
  45. package/modules/hall-ui/public/style.css +31 -255
  46. package/modules/hall-ui/public/task.html +2 -2
  47. package/modules/hall-ui/public/thinking.html +2 -2
  48. package/modules/hall-ui/public/tweak-editor.html +2 -2
  49. package/modules/hall-ui/public/watch.html +2 -2
  50. package/modules/hall-ui/public/welcome-boot.css +3 -4
  51. package/modules/hall-ui/public/welcome-boot.js +5 -3
  52. package/modules/hall-ui/public/work.html +2 -2
  53. package/modules/public-landing/public/account.html +1 -5
  54. package/modules/public-landing/public/assets/cosmos.css +7 -6
  55. package/modules/public-landing/public/community.html +1 -5
  56. package/modules/public-landing/public/connections.html +1 -5
  57. package/modules/public-landing/public/contact.html +1 -5
  58. package/modules/public-landing/public/guild.html +1 -5
  59. package/modules/public-landing/public/index.html +5 -8
  60. package/modules/public-landing/public/invitations.html +1 -5
  61. package/modules/public-landing/public/privacy.html +1 -5
  62. package/modules/public-landing/public/projects.html +1 -5
  63. package/modules/public-landing/public/terms.html +1 -5
  64. package/modules/raise/views/gate.html +4 -3
  65. package/modules/raise/views/nda.html +2 -1
  66. package/modules/raise/views/page.html +4 -3
  67. package/modules/status-ui/public/index.html +1 -1
  68. package/modules/status-ui/public/style.css +2 -2
  69. package/modules/ui-design/public/brand/apple-touch-icon.png +0 -0
  70. package/modules/ui-design/public/brand/favicon.svg +1 -0
  71. package/modules/ui-design/public/brand/mark-body.svg +1 -0
  72. package/modules/ui-design/public/brand/mark-dark.svg +1 -0
  73. package/modules/ui-design/public/brand/mark-dot.svg +1 -0
  74. package/modules/ui-design/public/brand/mark-light.svg +1 -0
  75. package/modules/ui-design/public/brand/mark-mono.svg +1 -0
  76. package/modules/ui-design/public/brand/mark.svg +21 -0
  77. package/package-lock.json +2 -2
  78. package/package.json +1 -1
  79. package/release-notes.json +12 -0
  80. package/scripts/bongos/fitness.js +1 -2
  81. package/scripts/bongos/gen-brand.js +99 -0
  82. package/scripts/gds/gen-brand.js +7 -0
  83. package/src/bongos/platform-visibility-gate.js +6 -3
  84. package/src/bongos/prelaunch-gate.js +6 -3
  85. package/src/bongos/serve-internal.js +1 -0
  86. package/src/brand-mark.js +96 -0
  87. package/src/branding.js +2 -0
  88. package/src/hall-look.js +7 -7
  89. package/src/module-api.js +1 -1
  90. package/tests/brand_mark.mjs +195 -0
  91. package/tests/bulk_toolbar.mjs +4 -1
  92. package/tests/cloud_bongos_pack.mjs +5 -2
  93. package/tests/hall_board_world.mjs +6 -2
  94. package/tests/hall_builders_page_pass.mjs +6 -4
  95. package/tests/hall_controls.mjs +274 -0
  96. package/tests/hall_loading.mjs +8 -10
  97. package/tests/hall_oversight_world.mjs +7 -4
  98. package/tests/hall_record_world.mjs +21 -7
  99. package/tests/hall_settings_world.mjs +5 -2
  100. package/tests/loading_mark.mjs +7 -13
  101. package/tests/nav_permission_atoms.mjs +2 -1
  102. package/tests/raise.mjs +3 -1
  103. package/tests/welcome_boot.mjs +5 -2
  104. package/modules/raise/public/favicon.svg +0 -1
  105. package/modules/raise/public/logo-ink.svg +0 -1
  106. package/modules/raise/public/logo-night.svg +0 -1
@@ -7,7 +7,7 @@
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1">
8
8
  <title>Studio — {{worldName}}</title>
9
9
  <meta name="description" content="Make something with AI in the studio: bring sketches, pictures or a PDF, say what you want, and get an answer and pictures back.">
10
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
10
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
12
  <link rel="stylesheet" href="/builders/studio.css?v=2026-10-09-day">
13
13
  <link rel="stylesheet" href="/builders/ai-studio.css?v=2026-10-29-ais1">
@@ -89,7 +89,7 @@
89
89
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
90
90
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
91
91
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
92
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
92
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
93
93
  <script src="/builders/palette.js" defer></script>
94
94
  <script src="/builders/tweak-editor-lib.js?v=2026-09-28-tw23"></script>
95
95
  <script src="/builders/studio-lib.js?v=2026-10-09-day"></script>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Repo Atlas — a self-drawing map of the codebase</title>
7
7
  <meta name="description" content="A live, self-generating map of the repository: how context is organized, and the truth of the module structure — clean modules vs the still-fused core.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='25' font-size='26' text-anchor='middle'>🪘</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -92,7 +92,7 @@
92
92
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
93
93
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
94
94
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
95
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
95
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
96
96
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
97
97
  <script src="/builders/palette.js" defer></script>
98
98
  <script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Blockers — {{worldName}}</title>
7
7
  <meta name="description" content="What needs the project owner right now, and the work it holds up.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -61,7 +61,7 @@
61
61
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
62
62
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
63
63
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
64
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
64
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
65
65
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
66
66
  <script src="/builders/palette.js" defer></script>
67
67
  <!-- the branding pack's currency label, loaded BEFORE blockers.js. -->
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Board Room — {{worldName}}</title>
7
7
  <meta name="description" content="The Board Room — where a Full Idea that cleared the completeness grade is ratified, and where the constitution itself is amended.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -63,7 +63,7 @@
63
63
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
64
64
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
65
65
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
66
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
66
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
67
67
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
68
68
  <script src="/builders/palette.js" defer></script>
69
69
  <script src="/builders/hall-kit.js"></script>
@@ -108,7 +108,7 @@
108
108
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
109
109
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
110
110
  <script src="/builders/craft-mode.js?v=2026-11-05-goals" defer></script>
111
- <script src="/builders/shell.js?v=2026-11-06-sidebar" defer></script>
111
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark" defer></script>
112
112
  <script src="/builders/palette.js" defer></script>
113
113
  <script src="/builders/gov-living.js?v=2026-10-09-positions1" defer></script>
114
114
  <script src="/builders/gov-feeds.js?v=2026-10-09-living3" defer></script>
@@ -201,16 +201,8 @@
201
201
  capitals — .btn-ghost lowercases its label, and this one is a named action the
202
202
  owner wrote, so it does not borrow that class. */
203
203
  .cb-ask { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 7px 0 0; }
204
- .cb-ask__door {
205
- font: inherit;
206
- font-size: 12.5px;
207
- color: var(--accent-ink);
208
- background: none;
209
- border: 0;
210
- padding: 0;
211
- cursor: pointer;
212
- }
213
- .cb-ask__door:hover { text-decoration: underline; }
204
+ /* .cb-ask__door is the shared text button (controls.css, task 1005084): it
205
+ measured 19px tall as a bare text control, under the 24px floor. */
214
206
  .cb-ask__copy {
215
207
  font: inherit;
216
208
  font-size: 12px;
@@ -290,22 +282,11 @@
290
282
  condensed to three rows precisely so the page stays readable. */
291
283
  .cb-reply-form { margin: 9px 0 0; max-width: var(--measure); }
292
284
  .cb-reply-input {
285
+ /* the shared textarea (controls.css, task 1005084); the form only sizes it */
293
286
  width: 100%;
294
- font: inherit;
295
- font-size: 13px;
296
287
  line-height: 1.55;
297
- color: var(--ink);
298
- background: var(--glass);
299
- border: 1px solid var(--rule);
300
- border-radius: var(--radius-sm);
301
- padding: 9px 11px;
302
288
  resize: vertical;
303
289
  }
304
- /* NO `outline: none` HERE. The shell already draws the hall's one focus ring on
305
- :focus-visible, and dropping it to style a field is exactly what the hall's
306
- own audit refuses — it caught this line. The border tint is an ADDITION to
307
- that ring, not a replacement for it. */
308
- .cb-reply-input:focus { border-color: var(--accent-ink); }
309
290
  .cb-reply-actions { display: flex; gap: 8px; margin: 7px 0 0; }
310
291
 
311
292
  /* ---- the archive (task 1004224) -------------------------------------------
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Collab — {{worldName}}</title>
7
7
  <meta name="description" content="Builders asking builders for help: what is waiting on you, what you asked, and every open ask across the project.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -162,7 +162,7 @@
162
162
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
163
163
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
164
164
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
165
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
165
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
166
166
  <script src="/builders/palette.js" defer></script>
167
167
  <script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
168
168
  <script src="/builders/collab.js?v=2026-09-24-archive"></script>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Commands — {{worldName}}</title>
7
7
  <meta name="description" content="Every slash command (skill) and every bongos terminal command this project has: what each does, when to reach for it and what it costs.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -54,7 +54,7 @@
54
54
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
55
55
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
56
56
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
57
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
57
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
58
58
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
59
59
  <script src="/builders/palette.js" defer></script>
60
60
  <script src="/builders/hall-kit.js"></script>
@@ -0,0 +1,223 @@
1
+ /* modules/hall-ui/public/controls.css — THE HALL'S ONE BUTTON AND ONE FIELD
2
+ (task 1005084, goal 1000138 "One Cloud Bongos design system").
3
+
4
+ The UI audit counted eight main-button heights (24 / 26 / 30 / 34 / 36 / 38 /
5
+ 40 / 46px) and five field styles in the hall. This sheet is the one of each
6
+ that replaces them. style.css @imports it right after the shared token sheet,
7
+ so a page sheet can still place a button (margin, align-self, width) but no
8
+ longer re-draws one.
9
+
10
+ THE BUTTON — `.btn` and three modifiers:
11
+ .btn primary: the accent fill with --accent-on, the DARK ink.
12
+ White on the salmon fails AA and DESIGN.md bans it.
13
+ 46px, a full pill: DESIGN.md's door height.
14
+ .btn--ghost the quiet sibling: no fill, one hairline, soft ink.
15
+ .btn--sm the row size, for a button that repeats down a list or
16
+ sits in a table: 30px, still over the 24px floor.
17
+ .btn--text a button that reads as a link: no fill, no edge, the
18
+ accent ink, underlined on hover; 24px so it keeps the floor.
19
+ Two sizes, not eight. A page picks the size by where the button lives: once
20
+ on the page → the default; once per row → --sm.
21
+
22
+ THE NAMES PAGES ALREADY WRITE. Markup across ~40 scripts and a dozen tests
23
+ spells the older vocabularies (.btn-accent, .btn-ghost, .td-btn, .pbtn …).
24
+ Renaming them would move nothing on screen, so each joins the shared rule it
25
+ always meant instead, by size and by fill:
26
+ primary .btn-accent .landing__btn .task__claim .td-btn--primary
27
+ .setup-gate__save .pbtn--save .craft-save
28
+ ghost .btn--quiet .btn-ghost .landing__btn--quiet .td-btn .wip__release
29
+ .pbtn .settings-btn .sessions-row__end .event-sound-preview
30
+ small .btn-ghost .task__claim .td-btn .wip__release
31
+ text .cb-ask__door
32
+ A new page writes `.btn` and its modifiers, never a new name.
33
+
34
+ THE FIELD — one text input / select / textarea, `.input` for a field the
35
+ element selectors do not reach. 40px, a pill (a textarea takes the tile
36
+ corner), an edge that clears 3:1 against the card in both modes so the
37
+ field is findable (WCAG 1.4.11), the ink edge on focus inside DESIGN.md's
38
+ two-tone ring.
39
+
40
+ Every colour here is a token or a color-mix of tokens; both terms of every
41
+ mix flip with the mode, so nothing here needs a dark twin.
42
+ tests/hall_controls.mjs measures the pairs in both modes. */
43
+
44
+ /* ---------- the button ---------- */
45
+ .btn, .btn-accent, .btn-ghost, .btn--text,
46
+ .landing__btn, .task__claim, .td-btn, .wip__release, .setup-gate__save,
47
+ .pbtn, .settings-btn, .sessions-row__end, .event-sound-preview, button.craft-save,
48
+ .cb-ask__door {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ gap: var(--ds-space-hair);
53
+ box-sizing: border-box;
54
+ min-height: 46px;
55
+ min-width: 46px;
56
+ padding: 0 var(--ds-space-md);
57
+ font-family: var(--font-body);
58
+ font-size: var(--ds-text-lg);
59
+ font-weight: 500;
60
+ line-height: 1.2;
61
+ text-transform: lowercase;
62
+ text-decoration: none;
63
+ white-space: nowrap;
64
+ /* transparent rather than absent: a modifier that sets only a border COLOUR
65
+ (collab.css's .btn--quiet) cannot paint an edge that was never reserved. */
66
+ border: var(--line) solid transparent;
67
+ border-radius: var(--radius-pill);
68
+ cursor: pointer;
69
+ transition: background-color var(--ds-dur-fast) var(--ds-ease),
70
+ border-color var(--ds-dur-fast) var(--ds-ease),
71
+ color var(--ds-dur-fast) var(--ds-ease);
72
+ }
73
+
74
+ /* primary — the accent door */
75
+ .btn, .btn-accent, .landing__btn, .task__claim, .setup-gate__save {
76
+ color: var(--accent-on);
77
+ background: var(--accent);
78
+ }
79
+
80
+ .btn:hover:not(:disabled), .btn-accent:hover:not(:disabled), .landing__btn:hover,
81
+ .task__claim:hover:not(:disabled), .setup-gate__save:hover:not(:disabled) {
82
+ color: var(--accent-on);
83
+ background: var(--accent-lift);
84
+ text-decoration: none;
85
+ }
86
+ .btn:disabled, .btn-accent:disabled, .task__claim:disabled, .setup-gate__save:disabled {
87
+ color: var(--ink-faint);
88
+ background: var(--glass);
89
+ border-color: transparent;
90
+ cursor: default;
91
+ }
92
+
93
+ /* ghost — after primary, so `.btn btn--ghost` takes it. Each state is written
94
+ in the same three layers (primary, ghost, primary-on-a-ghost-base) and with
95
+ no :not() in the selector, so a page's own modifier at one class
96
+ (record.css's .td-btn--danger) still wins on source order. */
97
+ .btn--ghost, .btn--quiet, .btn-ghost, .landing__btn--quiet, .td-btn, .wip__release,
98
+ .pbtn, .settings-btn, .sessions-row__end, .event-sound-preview {
99
+ color: var(--ink-soft);
100
+ background: transparent;
101
+ border-color: var(--rule);
102
+ }
103
+ .btn--ghost:hover:not(:disabled), .btn--quiet:hover:not(:disabled), .btn-ghost:hover:not(:disabled),
104
+ .landing__btn--quiet:hover, .td-btn:hover:not(:disabled), .wip__release:hover:not(:disabled),
105
+ .pbtn:hover:not(:disabled), .settings-btn:hover:not(:disabled),
106
+ .sessions-row__end:hover:not(:disabled), .event-sound-preview:hover:not(:disabled) {
107
+ color: var(--ink);
108
+ background: transparent;
109
+ border-color: var(--ink-faint);
110
+ text-decoration: none;
111
+ }
112
+ .btn--ghost:disabled, .btn--quiet:disabled, .btn-ghost:disabled, .td-btn:disabled,
113
+ .wip__release:disabled, .pbtn:disabled, .settings-btn:disabled, .sessions-row__end:disabled,
114
+ .pbtn[aria-disabled="true"], .settings-btn[aria-disabled="true"] {
115
+ color: var(--ink-faint);
116
+ background: transparent;
117
+ border-color: var(--rule-soft);
118
+ cursor: default;
119
+ }
120
+
121
+ /* primary on a ghost base — after ghost, so `.td-btn td-btn--primary` takes it */
122
+ .td-btn--primary, .pbtn--save, .craft-save {
123
+ color: var(--accent-on);
124
+ background: var(--accent);
125
+ border-color: transparent;
126
+ }
127
+ .td-btn--primary:hover:not(:disabled), .pbtn--save:hover:not(:disabled),
128
+ .craft-save:hover:not(:disabled) {
129
+ color: var(--accent-on);
130
+ background: var(--accent-lift);
131
+ border-color: transparent;
132
+ }
133
+ .td-btn--primary:disabled, .pbtn--save:disabled, .craft-save:disabled {
134
+ color: var(--ink-faint);
135
+ background: var(--glass);
136
+ border-color: transparent;
137
+ }
138
+
139
+ /* small — the row size */
140
+ .btn--sm, .btn-ghost, .task__claim, .td-btn, .wip__release {
141
+ min-height: 30px;
142
+ min-width: 30px;
143
+ padding: 0 var(--ds-space-sm);
144
+ font-size: var(--ds-text-sm);
145
+ }
146
+
147
+ /* text — a button that reads as a link: the sentence's own size and case, the
148
+ accent ink, underlined on hover; 24px so it keeps the floor in a line that
149
+ has no rhythm of its own. collab's "Reply" door is one. */
150
+ .btn--text, .cb-ask__door {
151
+ min-height: 24px;
152
+ min-width: 24px;
153
+ padding: 0 2px;
154
+ font-size: inherit;
155
+ font-weight: inherit;
156
+ text-transform: none;
157
+ color: var(--accent-ink);
158
+ background: transparent;
159
+ border-color: transparent;
160
+ }
161
+ .btn--text:hover:not(:disabled), .cb-ask__door:hover:not(:disabled) {
162
+ color: var(--accent-ink);
163
+ background: transparent;
164
+ text-decoration: underline;
165
+ text-underline-offset: 3px;
166
+ }
167
+ .btn--text:disabled { color: var(--ink-faint); background: transparent; }
168
+
169
+ /* Focus keeps the pill. The shell's two-tone ring (style.css :focus-visible)
170
+ sets the tile corner for the general case; a pill under it would square off. */
171
+ .btn:focus-visible, .btn-accent:focus-visible, .btn-ghost:focus-visible,
172
+ .landing__btn:focus-visible, .task__claim:focus-visible, .td-btn:focus-visible,
173
+ .wip__release:focus-visible, .setup-gate__save:focus-visible, .pbtn:focus-visible,
174
+ .settings-btn:focus-visible, .sessions-row__end:focus-visible,
175
+ .event-sound-preview:focus-visible, button.craft-save:focus-visible {
176
+ border-radius: var(--radius-pill);
177
+ }
178
+
179
+ /* ---------- the field ----------
180
+ The four element selectors the hall always styled keep their weight (0,1,1),
181
+ so nothing that leaned on them moves in the cascade. The other text types
182
+ join inside :where(), as a floor a page's own class can still sit on. */
183
+ select, input[type="text"], input[type="search"], textarea,
184
+ :where(input[type="email"], input[type="url"], input[type="number"], input[type="password"]),
185
+ .input {
186
+ box-sizing: border-box;
187
+ min-height: 40px;
188
+ padding: 0 var(--ds-space-sm);
189
+ font-family: var(--font-body);
190
+ font-size: var(--ds-text-md);
191
+ line-height: 1.4;
192
+ color: var(--ink);
193
+ background: transparent;
194
+ /* the edge clears 3:1 on both grounds in both modes; --rule (1.6:1) did not */
195
+ border: var(--line) solid color-mix(in srgb, var(--ink) 60%, var(--bg-card));
196
+ border-radius: var(--radius-pill);
197
+ transition: border-color var(--ds-dur-fast) var(--ds-ease);
198
+ }
199
+ textarea {
200
+ padding: var(--ds-space-xs) var(--ds-space-sm);
201
+ border-radius: var(--radius-sm);
202
+ }
203
+ select:hover, input[type="text"]:hover, input[type="search"]:hover, textarea:hover,
204
+ :where(input[type="email"], input[type="url"], input[type="number"], input[type="password"]):hover,
205
+ .input:hover {
206
+ border-color: var(--ink-faint);
207
+ }
208
+ /* Focus: the ink edge inside the shell's two-tone ring, keeping the field's
209
+ own corner (the ring's rule sets the tile corner for the general case). */
210
+ select:focus-visible, input[type="text"]:focus-visible, input[type="search"]:focus-visible,
211
+ :where(input[type="email"], input[type="url"], input[type="number"], input[type="password"]):focus-visible,
212
+ .input:focus-visible {
213
+ border-color: var(--ink);
214
+ border-radius: var(--radius-pill);
215
+ }
216
+ textarea:focus-visible { border-color: var(--ink); border-radius: var(--radius-sm); }
217
+ select:disabled, input[type="text"]:disabled, input[type="search"]:disabled, textarea:disabled,
218
+ :where(input[type="email"], input[type="url"], input[type="number"], input[type="password"]):disabled,
219
+ .input:disabled {
220
+ opacity: .55;
221
+ cursor: not-allowed;
222
+ }
223
+ select option { background: var(--bg-card); color: var(--ink); }
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Copy desk — {{worldName}}</title>
7
7
  <meta name="description" content="The artist's queue over the words this project shows people: flagged copy, who flagged it and why, and the duplicated strings nobody has looked at yet.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -180,7 +180,7 @@
180
180
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
181
181
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
182
182
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
183
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
183
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
184
184
  <script src="/builders/palette.js" defer></script>
185
185
  <script src="/builders/hall-kit.js"></script>
186
186
  <script src="/builders/copy-desk.js?v=2026-09-01-redesign"></script>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Deploy — {{worldName}}</title>
7
7
  <meta name="description" content="Move this project onto a newer core and read back the version its box actually serves — the deploy gate, without a shell or an ssh key.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-09-23-changelist1">
@@ -81,7 +81,7 @@
81
81
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
82
82
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
83
83
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
84
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
84
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
85
85
  <script src="/builders/palette.js" defer></script>
86
86
  <script src="/builders/hall-kit.js"></script>
87
87
  <!-- the shared ask card the move is drawn with (task 1004829) -->
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
6
  <title>The sky — {{worldName}}</title>
7
7
  <meta name="description" content="The whole project, drawn from the ledger: every goal a gravity well sized by its credits, the routes between goals that wait on each other, and a ledger drawer that lists all of it.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <!-- The faces (Manrope, JetBrains Mono) come from the branding pack's font
@@ -140,7 +140,7 @@
140
140
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
141
141
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
142
142
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
143
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
143
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
144
144
  <script src="/builders/palette.js" defer></script>
145
145
 
146
146
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -92,25 +92,9 @@
92
92
  .goal-conflicts-card--live .count-pill { background: var(--warn-weak); color: var(--warn); }
93
93
  #goal-conflicts-view-card.goal-conflicts-card--live { background: var(--bg-card); border-color: color-mix(in srgb, var(--warn) 42%, transparent); }
94
94
 
95
- /* task 1828 — inline Claim on a ready To-do row + the conflicts "view all". */
96
- .goal-claim-btn {
97
- display: inline-flex; align-items: center; justify-content: center;
98
- height: 24px; padding: 0 12px; border-radius: var(--radius-sm);
99
- border: var(--line) solid var(--accent); background: var(--accent); color: var(--accent-on);
100
- font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap;
101
- }
102
- .goal-claim-btn:hover:not(:disabled) { background: var(--accent-lift); }
103
- .goal-claim-btn:disabled { opacity: 0.55; cursor: default; }
104
- /* task 1828 — Release on the viewer's OWN active claim (ghost, not accent —
105
- it's the undo of a claim); a muted label for another builder's claim. */
106
- .goal-release-btn {
107
- display: inline-flex; align-items: center; justify-content: center;
108
- height: 24px; padding: 0 12px; border-radius: var(--radius-sm);
109
- border: var(--line) solid var(--rule); background: var(--bg-card); color: var(--ink-soft);
110
- font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap;
111
- }
112
- .goal-release-btn:hover:not(:disabled) { background: var(--glass); color: var(--ink); }
113
- .goal-release-btn:disabled { opacity: 0.55; cursor: default; }
95
+ /* The To-do row's Claim and Release are the shared .task__claim / .wip__release
96
+ (controls.css, task 1005084); the old .goal-claim-btn / .goal-release-btn had
97
+ no markup left. */
114
98
  .ledger__claimed { font-size: 12px; color: var(--ink-faint); white-space: nowrap; }
115
99
  .ledger__action { text-align: right; white-space: nowrap; }
116
100
  /* task 1828 — shared "View all N →" foot under a capped band column. */
@@ -211,10 +195,7 @@
211
195
  .uat-form { display: flex; flex-direction: column; gap: 8px; }
212
196
  .uat-field { display: flex; flex-direction: column; gap: 4px; }
213
197
  .uat-field input[type="file"] { min-height: 24px; font: inherit; font-size: 12px; }
214
- .uat-field textarea {
215
- font: inherit; font-size: 12.5px; padding: 6px 8px; border-radius: var(--radius);
216
- border: var(--line) solid var(--rule); background: var(--bg-card); color: var(--ink); resize: vertical;
217
- }
198
+ .uat-field textarea { resize: vertical; } /* the shared field (controls.css) */
218
199
  .uat-check-input { display: inline-flex; align-items: center; gap: 8px; min-height: 24px; cursor: pointer; }
219
200
  .uat-check-input input { width: 16px; height: 16px; margin: 0; }
220
201
  .uat-hint { margin: 0; }
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Goals — {{worldName}}</title>
7
7
  <meta name="description" content="Shared goals: progress, members, work remaining, and conflicts — {{worldName}}.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-03-goals1">
@@ -253,7 +253,7 @@
253
253
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
254
254
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
255
255
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
256
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
256
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
257
257
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
258
258
  <script src="/builders/palette.js" defer></script>
259
259
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Government — {{worldName}}</title>
7
7
  <meta name="description" content="How this project is governed — the constitution it runs, the Board Room where Full Ideas are ratified, and the ranks &amp; permissions that administer it.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -157,7 +157,7 @@
157
157
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
158
158
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
159
159
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
160
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
160
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
161
161
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
162
162
  <script src="/builders/palette.js" defer></script>
163
163
  <script src="/builders/hall-kit.js"></script>
@@ -271,7 +271,7 @@
271
271
  const logo = b.theme && b.theme.logo;
272
272
  return logo
273
273
  ? `<img class="landing__logo" src="${escapeHtml(logo)}" alt="" width="56" height="56" decoding="async">`
274
- : '<svg class="landing__logo" viewBox="0 0 200 200" aria-hidden="true"><path class="landing__ring" d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke-width="15" stroke-linecap="round"/><circle class="landing__planet" cx="100" cy="100" r="55"/><circle cx="156" cy="46" r="12" fill="#fb9569"/></svg>';
274
+ : '<svg class="landing__logo" viewBox="0 0 200 200" aria-hidden="true"><use href="/modules/ui-design/public/brand/mark.svg#mark"/></svg>';
275
275
  }
276
276
 
277
277
  // Strip the hall's chrome (rail, top bar, foot) for the signed-out card —
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Idea — {{worldName}}</title>
7
7
  <meta name="description" content="One idea, read end to end: its grade, its five answers, how complete they are, who had the thought and who developed it.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
8
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -53,7 +53,7 @@
53
53
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
54
54
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
55
55
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
56
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
56
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
57
57
  <script src="/builders/palette.js" defer></script>
58
58
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
59
59
  written inside an idea's own prose keeps resolving from this page. -->
@@ -9,7 +9,7 @@
9
9
  the Full Idea form, which was true when the form was the page and became a
10
10
  quiet lie the moment quick filing landed above it. -->
11
11
  <meta name="description" content="File a thought in one line, see where it will land, and keep the receipt. Developing it into a Full Idea — five questions with a live completeness score — is a step you take afterwards, on the same page.">
12
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
12
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
13
13
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
15
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -228,7 +228,7 @@
228
228
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
229
229
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
230
230
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
231
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
231
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
232
232
  <script src="/builders/palette.js" defer></script>
233
233
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
234
234
  <script src="/builders/vote-control.js"></script>
@@ -15,11 +15,11 @@
15
15
  sends "add a short bio" to the hub's account page, where the bio is edited.
16
16
  Empty on an instance with no hub, and the bio half is then not asked for. -->
17
17
  <meta name="hub-origin" content="{{hubOrigin}}">
18
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
18
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
19
19
  <link rel="preconnect" href="https://fonts.googleapis.com">
20
20
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
21
21
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
22
- <link rel="stylesheet" href="/builders/welcome-boot.css?v=2026-10-23-city1">
22
+ <link rel="stylesheet" href="/builders/welcome-boot.css?v=2026-11-07-brand-mark">
23
23
  <link rel="stylesheet" href="/builders/hall-ask.css">
24
24
  <link rel="stylesheet" href="/builders/home-city.css">
25
25
  <link rel="stylesheet" href="/builders/home-gallery.css">
@@ -106,10 +106,10 @@
106
106
  BEFORE builders.js so the chrome ids exist when events are wired. -->
107
107
  <!-- task 1004785: the first-visit-of-the-day welcome (the tower). Before shell.js, which asks it
108
108
  before the craft picker so the two never stack. Home only. -->
109
- <script src="/builders/welcome-boot.js?v=2026-10-23-city1" defer></script>
109
+ <script src="/builders/welcome-boot.js?v=2026-11-07-brand-mark" defer></script>
110
110
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
111
111
  <script src="/builders/craft-mode.js?v=2026-11-05-goals" defer></script>
112
- <script src="/builders/shell.js?v=2026-11-06-sidebar" defer></script>
112
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark" defer></script>
113
113
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
114
114
  <script src="/builders/palette.js" defer></script>
115
115
  <!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
@@ -146,7 +146,7 @@
146
146
  window.OTBHallRender(ctx) once during its own setup. The module
147
147
  hall-widget tags the server injects still anchor on builders.js's tag
148
148
  below (it matches by filename), so they land between the two. -->
149
- <script src="/builders/hall-render.js?v=2026-11-04-reading-room-2" defer></script>
149
+ <script src="/builders/hall-render.js?v=2026-11-07-brand-mark" defer></script>
150
150
  <!-- task 1002802 (P06): the profile-completion nudge slice. Exposes
151
151
  window.OTBProfileNudge; goal-inbox.js's mount() calls it once it has
152
152
  created the #attention-profile div, so load order is not load-bearing. -->