@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
@@ -60,6 +60,9 @@
60
60
  shadows, motion, stacking — every surface loads. Imported FIRST so this
61
61
  sheet's own rules follow it; the hall's scale names below are aliases of it. */
62
62
  @import url("/modules/ui-design/public/tokens.css");
63
+ /* The hall's one button and one field (task 1005084): .btn and its modifiers,
64
+ the text field / select / textarea. Straight after the scales it spends. */
65
+ @import url("controls.css");
63
66
  @import url("page-notes.css");
64
67
  @import url("craft-review.css");
65
68
 
@@ -430,20 +433,7 @@ code, kbd, pre {
430
433
  the composition around it. */
431
434
  .num, .tabular { font-variant-numeric: tabular-nums; }
432
435
 
433
- select, input[type="text"], input[type="search"], textarea {
434
- font-family: var(--font-body);
435
- font-size: 14px;
436
- color: var(--ink);
437
- background: none;
438
- border: 1px solid var(--rule);
439
- border-radius: var(--radius-pill);
440
- min-height: 30px;
441
- padding: 5px 12px;
442
- }
443
- select:hover, input[type="text"]:hover, input[type="search"]:hover { border-color: var(--ink-faint); }
444
- textarea { border-radius: var(--radius-sm); }
445
- select:disabled { opacity: 0.55; cursor: not-allowed; }
446
- select option { background: var(--bg-card); color: var(--ink); }
436
+ /* The field (text input, select, textarea) is controls.css's (task 1005084). */
447
437
 
448
438
  button { font-family: var(--font-body); }
449
439
 
@@ -569,12 +559,12 @@ main:focus { outline: none; }
569
559
  width: 28px; height: 28px;
570
560
  display: block;
571
561
  flex-shrink: 0;
562
+ /* drawn from the one mark (modules/ui-design/public/brand/mark.svg, task 1005088) */
563
+ --mark-ink: var(--ink);
572
564
  }
573
- html[data-theme="dark"] .brand-mark__mark .mr { stroke: #e2e1e4; }
574
- html[data-theme="dark"] .brand-mark__mark .mp { fill: #e2e1e4; }
565
+ html[data-theme="dark"] .brand-mark__mark { --mark-ink: #e2e1e4; }
575
566
  @media (prefers-color-scheme: dark) {
576
- html:not([data-theme]) .brand-mark__mark .mr { stroke: #e2e1e4; }
577
- html:not([data-theme]) .brand-mark__mark .mp { fill: #e2e1e4; }
567
+ html:not([data-theme]) .brand-mark__mark { --mark-ink: #e2e1e4; }
578
568
  }
579
569
  /* A project's logo in the mark's place (ADR 0358): the image is the founder's, so
580
570
  it gets a soft square, never a recolour. */
@@ -1422,8 +1412,7 @@ html.setup-gate-open { overflow: hidden; }
1422
1412
  }
1423
1413
  .setup-gate code { font-family: var(--font-mono); font-size: 14px; padding: 1px 6px; border-radius: 6px; background: var(--glass); }
1424
1414
  .setup-gate__crafts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
1425
- .setup-gate__craft,
1426
- .setup-gate__save {
1415
+ .setup-gate__craft {
1427
1416
  min-height: 36px;
1428
1417
  padding: 0 16px;
1429
1418
  border-radius: var(--radius-pill);
@@ -1435,8 +1424,8 @@ html.setup-gate-open { overflow: hidden; }
1435
1424
  cursor: pointer;
1436
1425
  }
1437
1426
  .setup-gate__craft[aria-pressed="true"] { border-color: var(--accent); background: var(--accent-tint); }
1438
- .setup-gate__save { margin-top: 12px; background: var(--accent); border-color: var(--accent); color: var(--accent-on); }
1439
- .setup-gate__save:disabled { opacity: .5; cursor: default; }
1427
+ /* The save is the shared primary door (controls.css, task 1005084). */
1428
+ .setup-gate__save { margin-top: 12px; }
1440
1429
  .setup-gate__err { margin: 8px 0 0; font-size: 14px; color: var(--danger); }
1441
1430
  .setup-gate__foot { margin: 24px 0 0; font-size: 14px; }
1442
1431
  .setup-gate__foot a { color: var(--ink-soft); }
@@ -2634,23 +2623,16 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2634
2623
  wherever there is room and drops it where there is not. */
2635
2624
  min-width: min(150px, 100%);
2636
2625
  max-width: 100%;
2637
- min-height: 32px;
2638
- font-family: var(--font-body);
2639
- padding: 4px 8px;
2640
- font-size: 13.5px;
2641
2626
  text-transform: none;
2642
2627
  letter-spacing: normal;
2643
2628
  font-weight: 400;
2644
2629
  }
2645
- /* task 1829: the Work Board free-text search box, sized to match the filter
2646
- selects it sits alongside. */
2630
+ /* task 1829: the Work Board free-text search box. Both it and the selects are
2631
+ the shared field (controls.css, task 1005084); the filter only sets widths
2632
+ and undoes the label voice they would inherit. */
2647
2633
  .filter input[type="search"] {
2648
2634
  min-width: min(200px, 100%);
2649
2635
  max-width: 100%;
2650
- min-height: 32px;
2651
- font-family: var(--font-body);
2652
- padding: 4px 8px;
2653
- font-size: 13.5px;
2654
2636
  text-transform: none;
2655
2637
  letter-spacing: normal;
2656
2638
  font-weight: 400;
@@ -2673,94 +2655,8 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2673
2655
  }
2674
2656
  .pager__range { font-family: var(--font-mono); font-size: 12px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
2675
2657
 
2676
- /* Pill or nothing (DESIGN.md, Shapes). A ghost button is a hairline pill; the
2677
- one filled shape on a page is the accent door, and only where the action is
2678
- the live thing. 28px of box plus the row’s own air clears the 24px floor. */
2679
- .btn-ghost {
2680
- display: inline-flex;
2681
- align-items: center;
2682
- justify-content: center;
2683
- gap: 6px;
2684
- min-height: 30px;
2685
- min-width: 56px;
2686
- padding: 0 14px;
2687
- font-size: 13px;
2688
- text-transform: lowercase;
2689
- color: var(--ink-soft);
2690
- background: none;
2691
- border: 1px solid var(--rule);
2692
- border-radius: var(--radius-pill);
2693
- cursor: pointer;
2694
- }
2695
- .btn-ghost:hover:not(:disabled) { border-color: var(--ink-faint); color: var(--ink); text-decoration: none; }
2696
- .btn-ghost:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: default; }
2697
-
2698
- /* The accent door: the page’s one primary action. --accent-on is the dark ink
2699
- that goes on the salmon; white on it fails AA and is banned. */
2700
- .btn-accent {
2701
- display: inline-flex;
2702
- align-items: center;
2703
- justify-content: center;
2704
- gap: 6px;
2705
- min-height: 34px;
2706
- min-width: 74px;
2707
- padding: 0 16px;
2708
- font-size: 13.5px;
2709
- font-weight: 500;
2710
- text-transform: lowercase;
2711
- color: var(--accent-on);
2712
- background: var(--accent);
2713
- border: 0;
2714
- border-radius: var(--radius-pill);
2715
- cursor: pointer;
2716
- }
2717
- .btn-accent:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
2718
- .btn-accent:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
2719
-
2720
- /* `.btn` / `.btn--ghost` — the SECOND button vocabulary in the hall, used by
2721
- ideas, idea, copy-desk, my-projects and collab. Task 1003305 found it had no
2722
- rule anywhere in the surface: every one of those buttons was rendering as a
2723
- browser default control, on a page whose every other shape is a pill. They
2724
- are not renamed to .btn-accent/.btn-ghost because the class is spelled into
2725
- markup and into tests/idea_spark_hall.mjs; instead the two vocabularies are
2726
- made to say the same thing. `.btn` is the accent door and `.btn--ghost` its
2727
- quiet sibling, which is exactly how the calling pages already use the pair
2728
- (submit vs. discard, mark vs. withdraw). --accent-on is the dark ink for the
2729
- salmon; white on it fails AA and DESIGN.md bans it. */
2730
- .btn {
2731
- display: inline-flex;
2732
- align-items: center;
2733
- justify-content: center;
2734
- gap: 6px;
2735
- min-height: 34px;
2736
- min-width: 74px;
2737
- padding: 0 16px;
2738
- font-family: var(--font-body);
2739
- font-size: 13.5px;
2740
- font-weight: 500;
2741
- text-transform: lowercase;
2742
- color: var(--accent-on);
2743
- background: var(--accent);
2744
- /* transparent rather than absent: collab.css's `.btn--quiet` sets only a
2745
- border-COLOUR, and a modifier cannot paint an edge that was never reserved. */
2746
- border: var(--line) solid transparent;
2747
- border-radius: var(--radius-pill);
2748
- cursor: pointer;
2749
- }
2750
- .btn:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
2751
- .btn:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
2752
- .btn--ghost {
2753
- min-height: 30px;
2754
- min-width: 56px;
2755
- padding: 0 14px;
2756
- font-size: 13px;
2757
- font-weight: 400;
2758
- color: var(--ink-soft);
2759
- background: none;
2760
- border-color: var(--rule);
2761
- }
2762
- .btn--ghost:hover:not(:disabled) { background: none; border-color: var(--ink-faint); color: var(--ink); }
2763
- .btn--ghost:disabled { background: none; color: var(--ink-faint); border-color: var(--rule-soft); }
2658
+ /* The buttons — .btn and its modifiers, and the older names pages still write
2659
+ (.btn-accent, .btn-ghost, .btn--ghost …) — are controls.css's (task 1005084). */
2764
2660
 
2765
2661
  /* ---------- profile / standing ---------- */
2766
2662
 
@@ -3040,11 +2936,8 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
3040
2936
  gap keeps the label and the select together when the lede wraps. */
3041
2937
  .curve__filter { display: inline-flex; align-items: center; gap: 6px; margin-left: 10px; }
3042
2938
  .curve__filter-label { color: var(--ink-soft); }
3043
- .curve__filter-select {
3044
- font: inherit; color: inherit; background: var(--surface-2);
3045
- border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
3046
- padding: 2px 6px; max-width: 16ch;
3047
- }
2939
+ /* the shared field (controls.css); only its width is the filter's */
2940
+ .curve__filter-select { max-width: 16ch; }
3048
2941
 
3049
2942
  .curve__headline {
3050
2943
  display: grid;
@@ -3297,22 +3190,6 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
3297
3190
  }
3298
3191
  .setup__divider::before, .setup__divider::after { content: ""; flex: 1; border-top: 1px solid var(--rule-soft); }
3299
3192
 
3300
- .setup__btn {
3301
- display: inline-flex;
3302
- align-items: center;
3303
- gap: 8px;
3304
- height: 34px;
3305
- padding: 0 16px;
3306
- border-radius: var(--radius-sm);
3307
- border: 1px solid var(--accent);
3308
- background: var(--accent);
3309
- color: #fff;
3310
- font-size: 13.5px;
3311
- font-weight: 600;
3312
- cursor: pointer;
3313
- }
3314
- .setup__btn:hover:not(:disabled) { background: var(--accent-deep); border-color: var(--accent-deep); color: #fff; text-decoration: none; }
3315
- .setup__btn:disabled, .setup__btn--open[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
3316
3193
  .setup__getcode { margin: 10px 0; }
3317
3194
  /* A <summary> is a control, so it owes the 24px floor like any other; it
3318
3195
  measured 20px tall (task 1003304). The height is bought with padding rather
@@ -3366,9 +3243,7 @@ html[data-door="out"] #hall-main { width: 100%; }
3366
3243
  background: var(--bg-card);
3367
3244
  text-align: center;
3368
3245
  }
3369
- .landing__logo { display: block; width: 56px; height: 56px; margin: 0 auto 18px; overflow: visible; }
3370
- .landing__ring { stroke: var(--ink); }
3371
- .landing__planet { fill: var(--ink); }
3246
+ .landing__logo { display: block; width: 56px; height: 56px; margin: 0 auto 18px; overflow: visible; --mark-ink: var(--ink); }
3372
3247
  .landing__title {
3373
3248
  margin: 0 0 28px;
3374
3249
  font-family: var(--font-display);
@@ -3387,31 +3262,9 @@ html[data-door="out"] #hall-main { width: 100%; }
3387
3262
  line-height: 18px;
3388
3263
  }
3389
3264
  .landing__cta { margin: 14px 0; }
3390
- .landing__btn {
3391
- display: inline-flex;
3392
- align-items: center;
3393
- justify-content: center;
3394
- gap: 10px;
3395
- min-height: 46px;
3396
- padding: 0 22px;
3397
- border-radius: var(--radius-pill);
3398
- border: 0;
3399
- background: var(--accent);
3400
- color: var(--accent-on);
3401
- font-size: 14px;
3402
- font-weight: 500;
3403
- text-transform: lowercase;
3404
- cursor: pointer;
3405
- }
3406
- .landing__btn:hover { background: var(--accent-lift); text-decoration: none; color: var(--accent-on); }
3265
+ /* .landing__btn is the shared primary door, --quiet its ghost (controls.css). */
3407
3266
  .landing__btn--block { display: flex; width: 100%; }
3408
3267
  .landing__gh { flex-shrink: 0; }
3409
- .landing__btn--quiet {
3410
- background: transparent;
3411
- color: var(--ink);
3412
- box-shadow: inset 0 0 0 1px var(--border-strong);
3413
- }
3414
- .landing__btn--quiet:hover { background: var(--surface-2); color: var(--ink); }
3415
3268
  .landing__note { font-size: 12.5px; color: var(--ink-faint); }
3416
3269
  .landing__error { color: var(--danger); }
3417
3270
  .landing__error-h { color: var(--danger); margin: 0 0 4px; font-size: 14px; }
@@ -3642,29 +3495,8 @@ html[data-door="out"] #hall-main { width: 100%; }
3642
3495
  the touches chip and the whole-card selection target (promoted from work.css,
3643
3496
  task 1003659, so their cascade position is the same on every page). */
3644
3497
 
3645
- /* The page's one primary action, and the only accent FILL on the board.
3646
- --accent-on is the dark ink that goes on the salmon: white on it fails AA and
3647
- DESIGN.md bans it outright, which is what the old `color: #fff` was. */
3648
- .task__claim {
3649
- display: inline-flex;
3650
- align-items: center;
3651
- justify-content: center;
3652
- min-height: 34px;
3653
- min-width: 74px;
3654
- padding: 0 16px;
3655
- background: var(--accent);
3656
- border: 0;
3657
- color: var(--accent-on);
3658
- border-radius: var(--radius-pill);
3659
- font-size: 13.5px;
3660
- font-weight: 500;
3661
- text-transform: lowercase;
3662
- cursor: pointer;
3663
- white-space: nowrap;
3664
- transition: background 150ms, opacity 150ms;
3665
- }
3666
- .task__claim:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); }
3667
- .task__claim:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
3498
+ /* The page's one primary action, and the only accent FILL on the board: the
3499
+ shared primary door at the row size (controls.css, task 1005084). */
3668
3500
 
3669
3501
  /* Files a claimable task is responsible for — a compact count chip in the meta
3670
3502
  row; the full path list rides the tooltip (task 2170 density pass). The mono
@@ -3778,27 +3610,13 @@ html[data-door="out"] #hall-main { width: 100%; }
3778
3610
  color: var(--ink-faint);
3779
3611
  }
3780
3612
 
3781
- .wip__release {
3782
- display: inline-flex;
3783
- align-items: center;
3784
- justify-content: center;
3785
- min-height: 30px;
3786
- padding: 0 14px;
3787
- background: none;
3788
- border: var(--line) solid var(--rule);
3789
- color: var(--ink-soft);
3790
- border-radius: var(--radius-pill);
3791
- font-size: 13px;
3792
- text-transform: lowercase;
3793
- cursor: pointer;
3794
- transition: background 150ms, color 150ms, border-color 150ms;
3795
- }
3613
+ /* .wip__release is the shared ghost at the row size (controls.css); a release
3614
+ is the undo of a claim, so its hover warns. */
3796
3615
  .wip__release:hover:not(:disabled) {
3797
3616
  background: var(--danger-weak);
3798
3617
  color: var(--danger);
3799
3618
  border-color: color-mix(in srgb, var(--danger) 40%, transparent);
3800
3619
  }
3801
- .wip__release:disabled { opacity: 0.55; cursor: default; }
3802
3620
 
3803
3621
  .wip__select {
3804
3622
  appearance: none;
@@ -4064,38 +3882,8 @@ html[data-door="out"] #hall-main { width: 100%; }
4064
3882
  .td-dep:hover { text-decoration: underline; }
4065
3883
  .td-dep-status { color: var(--ink-faint); font-size: 12px; margin-left: 6px; }
4066
3884
  .td-actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 0; }
4067
- /* Pill or nothing (DESIGN.md, Shapes): the ghost pill, with --btn--primary the
4068
- one accent door. It carried a literal `#fff` on the salmon until task 1003305
4069
- — the exact pairing DESIGN.md bans, because it fails AA. */
4070
- .td-btn {
4071
- display: inline-flex;
4072
- align-items: center;
4073
- justify-content: center;
4074
- font: inherit;
4075
- font-size: 13px;
4076
- min-height: 30px;
4077
- min-width: 56px;
4078
- padding: 0 14px;
4079
- border: var(--line) solid var(--rule);
4080
- border-radius: var(--radius-pill);
4081
- background: none;
4082
- color: var(--ink-soft);
4083
- text-transform: lowercase;
4084
- cursor: pointer;
4085
- }
4086
- .td-btn:hover:not(:disabled) { border-color: var(--ink-faint); color: var(--ink); text-decoration: none; }
4087
- .td-btn--primary {
4088
- min-height: 34px;
4089
- min-width: 74px;
4090
- padding: 0 16px;
4091
- font-weight: 500;
4092
- background: var(--accent);
4093
- color: var(--accent-on);
4094
- border-color: var(--accent);
4095
- }
4096
- .td-btn--primary:hover:not(:disabled) { background: var(--accent-lift); border-color: var(--accent-lift); color: var(--accent-on); }
4097
- .td-btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: default; }
4098
- .td-btn--primary:disabled { background: var(--glass); }
3885
+ /* .td-btn is the shared ghost at the row size and .td-btn--primary the accent
3886
+ door (controls.css, task 1005084). */
4099
3887
  .td-action-note { flex-basis: 100%; font-size: 12.5px; color: var(--ink-soft); margin: 4px 0 0; }
4100
3888
 
4101
3889
  /* Idea triage inside the record overlay (task 1002447). A two-column grid so
@@ -4103,17 +3891,9 @@ html[data-door="out"] #hall-main { width: 100%; }
4103
3891
  .td-form { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; margin: 14px 0 0; }
4104
3892
  .td-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
4105
3893
  .td-field--wide { grid-column: 1 / -1; }
4106
- /* The base `select, input` rule already carries the world's field; this only
4107
- re-states the sizing the two-column grid needs. */
4108
- .td-field input, .td-field select {
4109
- font-size: 13px;
4110
- min-width: 0;
4111
- max-width: 100%;
4112
- }
4113
- /* The 24px floor (task 1004301 found it failing): at 13px the base field's padding left a
4114
- number input 21px tall beside a select that clears it — the task page's "Wait for task"
4115
- box. Sized to sit level with its select. */
4116
- .td-field input { min-height: 26px; box-sizing: border-box; }
3894
+ /* The field is the shared one (controls.css); the two-column grid only needs
3895
+ it to shrink with its column. */
3896
+ .td-field input, .td-field select { min-width: 0; max-width: 100%; }
4117
3897
  .td-form .td-actions, .td-form-hint, .td-form .td-action-note { grid-column: 1 / -1; }
4118
3898
  .td-form .td-actions { margin: 4px 0 0; }
4119
3899
  .td-form-hint { font-size: 12.5px; color: var(--ink-soft); margin: 0; }
@@ -4316,7 +4096,6 @@ html[data-door="out"] #hall-main { width: 100%; }
4316
4096
  .filter-views__tag { font-size: 11px; color: var(--ink-faint); margin-left: 6px; }
4317
4097
  .filter-views__empty, .filter-views__note { font-size: 12.5px; color: var(--ink-soft); margin: 0 0 10px; }
4318
4098
  .filter-views__note:empty { display: none; }
4319
- .filter-views__row .btn-ghost { min-height: 24px; padding: 0 8px; font-size: 12px; }
4320
4099
  .filter-views__save { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px; }
4321
4100
  .filter-views__save .filter { flex: 1 1 180px; }
4322
4101
  /* On a phone the button can sit anywhere in a wrapped row, so the menu spans the
@@ -4378,9 +4157,6 @@ html[data-door="out"] #hall-main { width: 100%; }
4378
4157
  than edit the markup, the name joins the lede it meant. */
4379
4158
  .scroll__note { margin: 0 0 14px; font-size: 13.5px; color: var(--ink-soft); max-width: var(--measure); }
4380
4159
 
4381
- /* collab.js:73-74 — the settle buttons asked for a small variant of .btn that
4382
- does not exist, so "Someone helped" rendered full-size on every row. */
4383
- .btn--sm { min-height: 26px; padding: 0 11px; font-size: 12.5px; }
4384
4160
 
4385
4161
  /* The notice line: roster.js and blockers.js notice() set body.className='note'
4386
4162
  for an empty / error message, and neither page's sheet defines it. */
@@ -4450,7 +4226,7 @@ html[data-door="out"] #hall-main { width: 100%; }
4450
4226
  }
4451
4227
  /* the ring and the core: one ink, breathing */
4452
4228
  .hall-loading::before {
4453
- --hl-shape: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cpath d='M137 31 A78 78 0 1 0 170 66' fill='none' stroke='black' stroke-width='15' stroke-linecap='round'/%3E%3Ccircle cx='100' cy='100' r='55'/%3E%3C/svg%3E");
4229
+ --hl-shape: url("/modules/ui-design/public/brand/mark-body.svg");
4454
4230
  background: color-mix(in srgb, var(--ink) 30%, var(--bg-card));
4455
4231
  animation:
4456
4232
  hall-loading-turn var(--hl-beat) cubic-bezier(.45, .05, .55, .95) infinite,
@@ -4458,7 +4234,7 @@ html[data-door="out"] #hall-main { width: 100%; }
4458
4234
  }
4459
4235
  /* the dot: the accent, laid exactly over the mark and turning with it */
4460
4236
  .hall-loading::after {
4461
- --hl-shape: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Ccircle cx='156' cy='46' r='12'/%3E%3C/svg%3E");
4237
+ --hl-shape: url("/modules/ui-design/public/brand/mark-dot.svg");
4462
4238
  position: absolute;
4463
4239
  top: var(--hl-pad);
4464
4240
  left: calc(50% - var(--hl-size) / 2);
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Task — {{worldName}}</title>
7
7
  <meta name="description" content="Task details — {{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-roadmap1">
@@ -59,7 +59,7 @@
59
59
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
60
60
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
61
61
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
62
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
62
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
63
63
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
64
64
  <script src="/builders/palette.js" defer></script>
65
65
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N deep-link overlay
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
6
  <title>Your sky — {{worldName}}</title>
7
7
  <meta name="description" content="Your thinking, drawn from the ledger: every thought you filed as one of five objects, in the goal that caught it, sized by the work it caused.">
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
@@ -141,7 +141,7 @@
141
141
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
142
142
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
143
143
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
144
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
144
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
145
145
  <script src="/builders/palette.js" defer></script>
146
146
 
147
147
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -7,7 +7,7 @@
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1">
8
8
  <title>Tweak a page — {{worldName}}</title>
9
9
  <meta name="description" content="Tweak Mode's editor: every word of one page as a single document, typed over in place and saved as you go, then submitted as one batch.">
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="preconnect" href="https://fonts.googleapis.com">
12
12
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
13
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -145,7 +145,7 @@
145
145
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
146
146
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
147
147
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
148
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
148
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
149
149
  <script src="/builders/palette.js" defer></script>
150
150
  <script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
151
151
  <script src="/builders/tweak-editor-lib.js?v=2026-09-29-tw27"></script>
@@ -8,7 +8,7 @@
8
8
  <!-- The hub's origin, for the link from a guild's head in the applications queue to
9
9
  its page on the hub (task 1002304). Empty on a vanilla instance: no link. -->
10
10
  <meta name="hub-origin" content="{{hubOrigin}}">
11
- <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>">
11
+ <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
12
12
  <link rel="preconnect" href="https://fonts.googleapis.com">
13
13
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
14
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
@@ -271,7 +271,7 @@
271
271
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
272
272
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
273
273
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
274
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
274
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
275
275
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
276
276
  <script src="/builders/palette.js" defer></script>
277
277
  <!-- shared component kit (window.OTBKit) — tabs, ledger, pager (task 2166). -->
@@ -75,11 +75,10 @@ html.wb-open { overflow: hidden; }
75
75
  letter-spacing: -.01em; text-transform: lowercase; white-space: nowrap;
76
76
  }
77
77
  /* the mark's ink follows the painting: pale by night, dark by day; the moon stays salmon */
78
- .wb__ring { stroke: #e2e1e4; }
79
- .wb__planet { fill: #e2e1e4; transform-box: fill-box; transform-origin: center; }
78
+ .wb__mark { --mark-ink: #e2e1e4; }
79
+ .wb__planet { transform-box: fill-box; transform-origin: center; }
80
80
  .wb__moonlet { transform-box: view-box; transform-origin: 100px 100px; }
81
- .wb--day .wb__ring { stroke: #17181a; }
82
- .wb--day .wb__planet { fill: #17181a; }
81
+ .wb--day .wb__mark { --mark-ink: #17181a; }
83
82
  .wb--lit .wb__ring { stroke-dasharray: 100; animation: wb-ring 1.5s cubic-bezier(.6, 0, .2, 1) .5s both; }
84
83
  .wb--lit .wb__planet { animation: wb-planet 1s cubic-bezier(.3, 1.4, .5, 1) .3s both; }
85
84
  .wb--lit .wb__moonlet { animation: wb-orbit 1.6s cubic-bezier(.25, .8, .3, 1) 1.1s both, wb-glow 3.2s ease-in-out 2.7s infinite alternate; }
@@ -57,10 +57,12 @@
57
57
  // The banner is the logo, animated (task 1004953; it replaced "Working on the core of <project>"):
58
58
  // the ring draws in, the planet settles, the moon glides into the gap and glows. A project with its
59
59
  // own logo (theme.logo, ADR 0358) shows that instead, as the sidebar's brand mark does.
60
+ // The parts are referenced one by one from the one mark (task 1005088) so each can move.
61
+ var MARK = '/modules/ui-design/public/brand/mark.svg';
60
62
  var MARK_SVG = '<svg class="wb__mark" viewBox="0 0 200 200" aria-hidden="true">' +
61
- '<path class="wb__ring" d="M137 31 A78 78 0 1 0 170 66" pathLength="100" fill="none" stroke-width="15" stroke-linecap="round"/>' +
62
- '<circle class="wb__planet" cx="100" cy="100" r="55"/>' +
63
- '<circle class="wb__moonlet" cx="156" cy="46" r="12" fill="#fb9569"/></svg>';
63
+ '<use class="wb__ring" href="' + MARK + '#mark-ring"/>' +
64
+ '<use class="wb__planet" href="' + MARK + '#mark-disc"/>' +
65
+ '<use class="wb__moonlet" href="' + MARK + '#mark-dot"/></svg>';
64
66
  function logoHtml(branding) {
65
67
  var logo = branding && branding.theme && branding.theme.logo;
66
68
  var mark = logo ? '<img class="wb__logo" src="' + esc(logo) + '" alt="" width="40" height="40" decoding="async">' : MARK_SVG;
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Tasks — {{worldName}}</title>
7
7
  <meta name="description" content="What {{worldName}} is building right now, and what waits to be claimed.">
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">
@@ -174,7 +174,7 @@
174
174
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
175
175
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
176
176
  <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
177
- <script src="/builders/shell.js?v=2026-11-06-sidebar"></script>
177
+ <script src="/builders/shell.js?v=2026-11-07-brand-mark"></script>
178
178
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
179
179
  <script src="/builders/palette.js" defer></script>
180
180
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
@@ -97,11 +97,7 @@
97
97
  <header class="shell bar">
98
98
  <div class="barLeft">
99
99
  <a class="barMark" id="barMark" href="/">
100
- <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true">
101
- <path class="mr" d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke="#17181a" stroke-width="15" stroke-linecap="round"/>
102
- <circle class="mp" cx="100" cy="100" r="55" fill="#17181a"/>
103
- <circle cx="156" cy="46" r="12" style="fill:var(--accent)"/>
104
- </svg>
100
+ <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true"><use href="/modules/ui-design/public/brand/mark.svg#mark"/></svg>
105
101
  <span>{{productName}}</span>
106
102
  </a>
107
103
  </div>
@@ -576,13 +576,13 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
576
576
  }
577
577
  /* the ring and the core: one ink, breathing */
578
578
  .loading-mark::before{
579
- --lm-shape:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cpath d='M137 31 A78 78 0 1 0 170 66' fill='none' stroke='black' stroke-width='15' stroke-linecap='round'/%3E%3Ccircle cx='100' cy='100' r='55'/%3E%3C/svg%3E");
579
+ --lm-shape:url("/modules/ui-design/public/brand/mark-body.svg");
580
580
  background:color-mix(in srgb,var(--ink) 30%,var(--bg-card));
581
581
  animation:loading-mark-turn 1.6s cubic-bezier(.45,.05,.55,.95) infinite,loading-mark-breathe .8s ease-in-out infinite alternate-reverse;
582
582
  }
583
583
  /* the dot: the accent, laid exactly over the mark and turning with it */
584
584
  .loading-mark::after{
585
- --lm-shape:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Ccircle cx='156' cy='46' r='12'/%3E%3C/svg%3E");
585
+ --lm-shape:url("/modules/ui-design/public/brand/mark-dot.svg");
586
586
  background:var(--accent);
587
587
  }
588
588
  .loading-mark--page{--lm-size:64px;padding:72px 0;gap:16px;}
@@ -623,11 +623,12 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
623
623
  color:var(--ink);text-decoration:none;text-shadow:var(--type-halo);}
624
624
  /* the mark: Ink and one light; its Night ink twin on a dark ground (task 1004846) */
625
625
  .barMark svg{width:32px;height:32px;display:block;flex:none;}
626
- :root[data-mode="dark"] .bongosMark .mr{stroke:#e2e1e4;}
627
- :root[data-mode="dark"] .bongosMark .mp{fill:#e2e1e4;}
626
+ /* drawn from the one mark (modules/ui-design/public/brand/mark.svg, task 1005088), coloured by
627
+ --mark-ink (the ring and planet) and --mark-dot (the moon; the accent when unset) */
628
+ .bongosMark{--mark-ink:var(--ink);}
629
+ :root[data-mode="dark"] .bongosMark{--mark-ink:#e2e1e4;}
628
630
  @media (prefers-color-scheme: dark){
629
- :root:not([data-mode="light"]) .bongosMark .mr{stroke:#e2e1e4;}
630
- :root:not([data-mode="light"]) .bongosMark .mp{fill:#e2e1e4;}
631
+ :root:not([data-mode="light"]) .bongosMark{--mark-ink:#e2e1e4;}
631
632
  }
632
633
  .barMark:hover{color:var(--ink);}
633
634
  /* the two-tone focus ring on the bar's and the bands' controls (DESIGN.md
@@ -165,11 +165,7 @@
165
165
  <header class="shell bar">
166
166
  <div class="barLeft">
167
167
  <a class="barMark" id="barMark" href="/">
168
- <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true">
169
- <path class="mr" d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke="#17181a" stroke-width="15" stroke-linecap="round"/>
170
- <circle class="mp" cx="100" cy="100" r="55" fill="#17181a"/>
171
- <circle cx="156" cy="46" r="12" style="fill:var(--accent)"/>
172
- </svg>
168
+ <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true"><use href="/modules/ui-design/public/brand/mark.svg#mark"/></svg>
173
169
  <span>{{productName}}</span>
174
170
  </a>
175
171
  </div>
@@ -70,11 +70,7 @@
70
70
  <header class="shell bar">
71
71
  <div class="barLeft">
72
72
  <a class="barMark" id="barMark" href="/">
73
- <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true">
74
- <path class="mr" d="M137 31 A78 78 0 1 0 170 66" fill="none" stroke="#17181a" stroke-width="15" stroke-linecap="round"/>
75
- <circle class="mp" cx="100" cy="100" r="55" fill="#17181a"/>
76
- <circle cx="156" cy="46" r="12" style="fill:var(--accent)"/>
77
- </svg>
73
+ <svg class="bongosMark" viewBox="0 0 200 200" aria-hidden="true"><use href="/modules/ui-design/public/brand/mark.svg#mark"/></svg>
78
74
  <span>{{productName}}</span>
79
75
  </a>
80
76
  </div>