@bongos/core 1.19.726 → 1.19.727

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 (226) hide show
  1. package/.bongos-core.json +176 -491
  2. package/.devcontainer/Dockerfile +1 -1
  3. package/.devcontainer/devcontainer.json +2 -2
  4. package/.devcontainer/healthcheck.sh +1 -1
  5. package/.devcontainer/init-firewall.sh +1 -1
  6. package/.devcontainer/post-create.sh +2 -2
  7. package/.env.local.example +1 -1
  8. package/Dockerfile +1 -1
  9. package/docs/copy-inventory.md +1 -1
  10. package/docs/copy-registry.json +9 -9
  11. package/docs/module-api-changelog.md +2 -0
  12. package/docs/recipes/devbox-app-release.md +4 -4
  13. package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
  14. package/modules/dev-box/app/scripts/gen-brand.js +1 -1
  15. package/modules/dev-box/app/src/brand.js +1 -1
  16. package/modules/dev-box/app/test/unit.mjs +16 -16
  17. package/modules/dev-box/box-access.js +1 -1
  18. package/modules/dev-box/routes/box.js +1 -1
  19. package/modules/discord/discord-approvals.js +1 -1
  20. package/modules/grading/grader-model.js +1 -1
  21. package/modules/grading/grader-prompt.js +1 -1
  22. package/modules/grading/grader-workers/quality.js +1 -1
  23. package/modules/hall-ui/module.json +1 -1
  24. package/modules/hall-ui/public/brand-apply.js +1 -1
  25. package/modules/hall-ui/public/shell.js +1 -1
  26. package/modules/hall-ui/public/work.js +1 -1
  27. package/modules/lifecycle/conflict-resolve.js +1 -1
  28. package/modules/lifecycle/db-analytics.js +1 -1
  29. package/modules/lifecycle/routes/analytics.js +1 -1
  30. package/modules/onboarding/approval-broadcast.js +1 -1
  31. package/modules/onboarding/onboarding.js +1 -1
  32. package/modules/provisioning/tests/liveness.mjs +1 -1
  33. package/modules/public-landing/public/index.html +1 -1
  34. package/modules/public-landing/public/projects-floor.states.json +2 -2
  35. package/modules/public-landing/public/projects.probes.json +4 -4
  36. package/modules/public-landing/public/projects.states.json +2 -2
  37. package/modules/status-ui/module.json +1 -1
  38. package/modules/status-ui/public/status.js +4 -4
  39. package/modules/status-ui/public/style.css +1 -1
  40. package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
  41. package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
  42. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  43. package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
  44. package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
  45. package/modules/ui-design/kit/fixtures/progress.json +1 -1
  46. package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/scripts/cron/style_guide_audit.sh +1 -1
  50. package/scripts/discord/lib.js +1 -1
  51. package/scripts/discord/post.js +1 -1
  52. package/scripts/gds/audit-authorship.sh +1 -1
  53. package/scripts/gds/audit-replay.sh +29 -2
  54. package/scripts/gds/audit-ships.js +1 -1
  55. package/scripts/gds/backfill-sessions.js +2 -2
  56. package/scripts/gds/cf-tunnel.js +4 -4
  57. package/scripts/gds/claude-materialize.js +2 -2
  58. package/scripts/gds/cli-lib.js +6 -6
  59. package/scripts/gds/cutover-codemod.js +1 -1
  60. package/scripts/gds/dev-lib.js +2 -2
  61. package/scripts/gds/diagnose-achievements.js +2 -2
  62. package/scripts/gds/fitness-checks-identity.js +6 -4
  63. package/scripts/gds/gen-diagrams.js +1 -1
  64. package/scripts/gds/leak-scan-allowlist.js +293 -0
  65. package/scripts/gds/learning-capture.js +1 -1
  66. package/scripts/gds/linkify-refs.js +2 -2
  67. package/scripts/gds/local-preview-lib.js +1 -1
  68. package/scripts/gds/mirror-lineage-check.js +1 -1
  69. package/scripts/gds/mirror-redact.js +17 -2
  70. package/scripts/gds/newcomer-floor.templates.json +1 -1
  71. package/scripts/gds/package-core.js +18 -1
  72. package/scripts/gds/paste-token.js +1 -1
  73. package/scripts/gds/provision-units.js +2 -2
  74. package/scripts/gds/publish-manifest.js +15 -0
  75. package/scripts/gds/repo-metrics.js +1 -1
  76. package/scripts/gds/sandbox-stage.js +1 -1
  77. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-tasks.js +2 -2
  81. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  82. package/scripts/gds/seed-medusa-tasks.js +10 -10
  83. package/scripts/gds/seed-module-upstreaming.js +1 -1
  84. package/scripts/gds/seed-productization-tasks.js +6 -6
  85. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  86. package/scripts/gds/seed-staging.sh +19 -6
  87. package/scripts/gds/ship-deploy-target.js +1 -1
  88. package/scripts/gds/ship-flow.js +1 -1
  89. package/scripts/gds/smoke-gds.js +1 -1
  90. package/scripts/status-probe.mjs +2 -2
  91. package/src/bongos/auth-discord.js +2 -2
  92. package/src/bongos/live-channel.js +1 -1
  93. package/src/bongos/pool.js +1 -1
  94. package/src/bongos/routes/auth.js +11 -11
  95. package/src/bongos/routes/security.js +1 -1
  96. package/src/bongos/routes.js +1 -1
  97. package/src/branding.js +1 -1
  98. package/src/devbox-downloads.js +1 -1
  99. package/src/instance-config.js +2 -2
  100. package/src/module-api.js +1 -1
  101. package/src/module-loader/provenance.js +2 -2
  102. package/tests/art_stage.mjs +2 -2
  103. package/tests/auth_anthropic_identity.mjs +1 -1
  104. package/tests/auth_duplicate_cookie.mjs +1 -1
  105. package/tests/auth_error_brand.mjs +1 -1
  106. package/tests/auth_inactive_builder.mjs +1 -1
  107. package/tests/backup_cli.mjs +4 -4
  108. package/tests/bongos_box_connect.mjs +2 -2
  109. package/tests/bongos_downloads.mjs +2 -2
  110. package/tests/bongos_login.mjs +5 -5
  111. package/tests/box_connect_e2e.mjs +2 -2
  112. package/tests/box_dns_repoint.mjs +10 -10
  113. package/tests/box_host_keys.mjs +1 -1
  114. package/tests/box_onboard.mjs +9 -9
  115. package/tests/box_scope_session.mjs +1 -1
  116. package/tests/box_terminal_ssrf.mjs +7 -7
  117. package/tests/boxes.mjs +9 -9
  118. package/tests/branding.mjs +2 -2
  119. package/tests/bump_version.mjs +2 -2
  120. package/tests/cf_tunnel.mjs +40 -40
  121. package/tests/cli_token_reissue.mjs +7 -7
  122. package/tests/cloud_bongos_pack.mjs +1 -1
  123. package/tests/currency_label.mjs +8 -8
  124. package/tests/dev_lib.mjs +4 -4
  125. package/tests/devbox_dmg_backdrop.mjs +1 -1
  126. package/tests/devbox_downloads.mjs +2 -2
  127. package/tests/devbox_icons.mjs +1 -1
  128. package/tests/discord_approvals.mjs +1 -1
  129. package/tests/discord_oauth.mjs +2 -2
  130. package/tests/executed_closure.mjs +6 -1
  131. package/tests/first_admin_bootstrap.mjs +1 -1
  132. package/tests/gate_approvals.mjs +5 -5
  133. package/tests/grade_aggregates_unavailable.mjs +1 -1
  134. package/tests/hook_user_agents.mjs +2 -2
  135. package/tests/init.mjs +6 -6
  136. package/tests/instance_config.mjs +1 -1
  137. package/tests/instance_manifest.mjs +5 -5
  138. package/tests/instance_mismatch_guard.mjs +13 -13
  139. package/tests/leak_scan_allowlist.mjs +94 -0
  140. package/tests/migrate_root_resolution.mjs +4 -4
  141. package/tests/mirror_redact.mjs +28 -4
  142. package/tests/module_catalog.mjs +5 -5
  143. package/tests/module_submissions.mjs +3 -3
  144. package/tests/package_core.mjs +1 -1
  145. package/tests/parallel-load.mjs +6 -6
  146. package/tests/projects_hub.mjs +2 -2
  147. package/tests/provision.mjs +50 -50
  148. package/tests/provisioning_github_app_routes.mjs +1 -1
  149. package/tests/provisioning_onboard_mode.mjs +2 -2
  150. package/tests/publish_reconciler.mjs +4 -4
  151. package/tests/sandbox_stage.mjs +1 -1
  152. package/tests/scrubber_corpus.mjs +3 -3
  153. package/tests/search_isolation.mjs +1 -1
  154. package/tests/session_records.mjs +1 -1
  155. package/tests/ship_card.mjs +6 -6
  156. package/tests/ship_ci_deploy.mjs +1 -1
  157. package/tests/single_host_hall.mjs +9 -9
  158. package/tests/smoke_preflight.mjs +1 -1
  159. package/tests/smoke_target.mjs +1 -1
  160. package/tests/status-probe.mjs +1 -1
  161. package/tests/status_mirror_sync.mjs +1 -1
  162. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  163. package/docs/design/mocks/_schemes.css +0 -604
  164. package/docs/design/mocks/component-sheet.html +0 -428
  165. package/docs/design/mocks/hall/_tokens.css +0 -370
  166. package/docs/design/mocks/hall/board/v1.html +0 -846
  167. package/docs/design/mocks/hall/board/v2.html +0 -858
  168. package/docs/design/mocks/hall/board/v3.html +0 -884
  169. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  170. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  171. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  172. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  173. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  174. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  175. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  176. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  177. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  178. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  179. package/docs/design/mocks/hall/task/v1.html +0 -633
  180. package/docs/design/mocks/hall/task/v2.html +0 -646
  181. package/docs/design/mocks/hall/task/v3.html +0 -647
  182. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  183. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  184. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  185. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  186. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  187. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  188. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  189. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  190. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  191. package/docs/design/mocks/hub/mine.html +0 -465
  192. package/docs/design/mocks/hub/picker.html +0 -421
  193. package/docs/design/mocks/hub/planets.html +0 -356
  194. package/docs/design/mocks/hub/v1.html +0 -1209
  195. package/docs/design/mocks/hub/v2.html +0 -1257
  196. package/docs/design/mocks/hub/v3.html +0 -1496
  197. package/docs/design/mocks/hub/wizard.html +0 -421
  198. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  199. package/docs/design/mocks/landing/v1.html +0 -956
  200. package/docs/design/mocks/landing/v2.html +0 -708
  201. package/docs/design/mocks/landing/v3.html +0 -911
  202. package/docs/design/mocks/landing-page-mock.html +0 -687
  203. package/docs/design/mocks/landing-palettes.html +0 -103
  204. package/docs/design/mocks/projects-hub-mock.html +0 -991
  205. package/docs/design/mocks/projects-hub-variants.html +0 -146
  206. package/docs/design/mocks/projects-page-mock.html +0 -167
  207. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  208. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  209. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  210. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  211. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  212. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  213. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  214. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  215. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  216. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  217. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  218. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  219. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  220. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  221. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  222. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  223. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  224. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  225. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  226. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,13 +0,0 @@
1
- {
2
- "kind": "backdrop",
3
- "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
- "aspect_ratio": "16:9",
5
- "resolution": "2k",
6
- "generated": "2026-08-29T15:37Z",
7
- "round": 3,
8
- "task": 1003337,
9
- "prompt": "Deep-space photograph on a pure black ground: almost entirely black with a barely-there violet-to-blue gradient in the upper left corner and a handful of pin-sharp stars, maximal emptiness, no nebula, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black everywhere but the faint corner.",
10
- "source": ".impeccable/mocks/world-assets/r3-space-deepfield.jpg",
11
- "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
- "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
- }
@@ -1,13 +0,0 @@
1
- {
2
- "kind": "backdrop",
3
- "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
- "aspect_ratio": "16:9",
5
- "resolution": "2k",
6
- "generated": "2026-08-29T15:37Z",
7
- "round": 3,
8
- "task": 1003337,
9
- "prompt": "Deep-space photograph on a pure black ground: thin drifting cosmic dust filaments in bronze and cool blue crossing the frame diagonally, sparse pin-sharp stars, one soft distant glow low right, generous empty black, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
- "source": ".impeccable/mocks/world-assets/r3-space-dust.jpg",
11
- "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
- "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
- }
@@ -1,13 +0,0 @@
1
- {
2
- "kind": "backdrop",
3
- "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
- "aspect_ratio": "16:9",
5
- "resolution": "2k",
6
- "generated": "2026-08-29T15:37Z",
7
- "round": 3,
8
- "task": 1003337,
9
- "prompt": "Deep-space photograph on a pure black ground: a faint wide nebula wash in muted violet and deep blue with a soft bronze warmth along one edge, very sparse pin-sharp stars of varied brightness and size, gentle depth, most of the frame near-black, nothing else, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
- "source": ".impeccable/mocks/world-assets/r3-space-nebula.jpg",
11
- "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
- "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
- }
@@ -1,13 +0,0 @@
1
- {
2
- "kind": "backdrop",
3
- "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
- "aspect_ratio": "16:9",
5
- "resolution": "2k",
6
- "generated": "2026-08-29T15:37Z",
7
- "round": 3,
8
- "task": 1003337,
9
- "prompt": "Deep-space photograph on a pure black ground: a fine field of pin-sharp stars in three depths (a few bright, many mid, a faint dust of tiny ones), a barely visible cool haze band drifting across the lower third, no nebula colour, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
- "source": ".impeccable/mocks/world-assets/r3-space-starfield.jpg",
11
- "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
- "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
- }
@@ -1,192 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Hub composition round: bar, dropdowns, search and the poster card, three versions (task 1003299)</title>
7
- <style>
8
- :root{--ink:#14151a;--soft:#585c6b;--faint:#8a8fa0;--line:#d9dce5;--bg:#f3f4f8;--card:#ffffff;--kick:#0b5fff;}
9
- :root[data-mode="dark"]{--ink:#f1f2f7;--soft:#a9aec0;--faint:#737890;--line:#2a2e3b;--bg:#0c0e14;--card:#151822;--kick:#7aa2ff;}
10
- @media (prefers-color-scheme:dark){:root:not([data-mode="light"]){--ink:#f1f2f7;--soft:#a9aec0;--faint:#737890;--line:#2a2e3b;--bg:#0c0e14;--card:#151822;--kick:#7aa2ff;}}
11
- *{box-sizing:border-box;margin:0;padding:0}
12
- body{background:var(--bg);color:var(--ink);font-family:system-ui,-apple-system,"Segoe UI",sans-serif;padding:clamp(18px,3vw,40px);-webkit-font-smoothing:antialiased;line-height:1.5}
13
- h1{font-size:clamp(22px,3vw,32px);letter-spacing:-.4px;margin-bottom:6px}
14
- .sub{color:var(--soft);max-width:100ch;font-size:14.5px;margin-bottom:8px}
15
- .sub b{color:var(--ink)}
16
- .read{border-left:3px solid var(--kick);padding:10px 14px;margin:14px 0 18px;font-size:14px;max-width:110ch;background:color-mix(in srgb,var(--kick) 7%,transparent);border-radius:0 8px 8px 0}
17
- .read code{font-family:ui-monospace,Consolas,monospace;font-size:12.5px}
18
- .read ol,.read ul{margin:6px 0 0 18px}
19
- .bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:6px 0 22px;position:sticky;top:0;background:var(--bg);padding:10px 0;z-index:5;border-bottom:1px solid var(--line)}
20
- .bar span{font-size:11px;letter-spacing:.6px;text-transform:uppercase;color:var(--faint);margin-left:10px}
21
- .bar span:first-child{margin-left:0}
22
- .bar button,.bar select{cursor:pointer;font:inherit;font-weight:600;font-size:13px;padding:6px 14px;border-radius:999px;border:1.5px solid var(--line);background:var(--card);color:var(--ink)}
23
- .bar button[aria-pressed="true"]{background:var(--ink);color:var(--card);border-color:var(--ink)}
24
- .cand{background:var(--card);border:1.5px solid var(--line);border-radius:16px;padding:16px 18px 18px;margin-bottom:22px}
25
- .kick{font-size:11px;letter-spacing:.9px;text-transform:uppercase;color:var(--kick);font-weight:700}
26
- .cand h2{font-size:20px;margin:2px 0 4px;letter-spacing:-.2px}
27
- .meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:8px 22px;font-size:13.5px;color:var(--soft);margin:6px 0 12px}
28
- .meta b{color:var(--ink);font-weight:600}
29
- .meta ul{margin:2px 0 0 16px}
30
- .tiles{display:grid;grid-template-columns:3fr 3fr 1fr 1fr;gap:12px;align-items:start;margin-bottom:12px}
31
- .boards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;align-items:start}
32
- @media (max-width:1100px){.tiles{grid-template-columns:1fr 1fr}.boards{grid-template-columns:1fr}}
33
- @media (max-width:640px){.tiles{grid-template-columns:1fr}}
34
- .tile{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--bg)}
35
- .tileHead{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:12px;color:var(--soft);border-bottom:1px solid var(--line)}
36
- .tileHead a{color:var(--kick);font-weight:600;text-decoration:none;white-space:nowrap}
37
- .frame{position:relative;width:100%;aspect-ratio:1440/900;overflow:hidden}
38
- .frame iframe{position:absolute;top:0;left:0;width:1440px;height:900px;border:0;transform-origin:0 0}
39
- .phone .frame{aspect-ratio:390/844}
40
- .phone .frame iframe{width:390px;height:844px}
41
- .tall .frame{aspect-ratio:1440/2400}
42
- .tall .frame iframe{height:2400px}
43
- .decide{border:1.5px solid var(--kick);border-radius:16px;padding:16px 18px;margin-bottom:22px;font-size:14px;max-width:120ch}
44
- .decide h2{font-size:18px;margin-bottom:6px}
45
- .decide ol,.decide ul{margin:6px 0 0 20px}
46
- .decide li{margin:4px 0}
47
- footer{color:var(--faint);font-size:12.5px;margin-top:28px}
48
- </style>
49
- <script>
50
- (function(){try{var q=new URLSearchParams(location.search).get('mode');var m=(q==='light'||q==='dark')?q:'dark';document.documentElement.setAttribute('data-mode',m);}catch(e){}})();
51
- </script>
52
- </head>
53
- <body>
54
-
55
- <h1>The /projects hub in the chrome world: three versions of the bar, the dropdowns, the search and the poster card</h1>
56
- <p class="sub">Round 4 of the apex pass (task 1003299, goal 1000080), after the landing was built and <code>DESIGN.md</code> recorded the world. Each version keeps the sky, the orbs, the hover card, the toolbar, the table (plus a hall glyph), the mine view and the new view exactly as they ship today, and recomposes what the owner settled: <b>one grounded top bar</b> (not sticky), the logo as home, a <b>Projects dropdown</b> holding Map / Your projects / New project, a <b>profile dropdown</b> on the identity chip, the <b>map search in the bar</b> (hidden off the map), no Home, no hall pill (hall entry becomes a per-project affordance), and the <b>poster card</b> with its degradation ladder. Mocks are judged <b>dark first</b>; flip to light. Open this sheet from the checkout that holds <code>docs/design/mocks/hub/</code>; the tiles are local iframes.</p>
57
-
58
- <div class="read">
59
- <b>How to read the three.</b> Same givens, same real data, same state contract, same sky. What differs is the bar's material, the menu's mechanism and the card's composition. <b>v1 "the shelf"</b>: the landing's pill grammar set down on a real shelf; floating card panels. <b>v2 "the hairline"</b>: no pills, hairlines only; the menu unfolds as a full-width band under the bar; the card's figures are leader-line callouts on the art. <b>v3 "the glass strip"</b>: one continuous glass surface the sky shows through; segments and attached glass panels; the card's name sits on the art. The state picker flips every version to the same state at once; <b>boards</b> show every bar state, the whole card ladder and the menu component on one tall page each. <code>open full</code> walks any state at full size.
60
- </div>
61
-
62
- <div class="decide" id="decision">
63
- <h2>The decision this round asks of the owner</h2>
64
- <ol>
65
- <li><b>Pick one version</b> (or name a merge: for example v1's bar with v3's card).</li>
66
- <li><b>Beyond the skin.</b> Each version's head comment lists what changes on the page beyond restyling, each item tagged <code>given</code> / <code>consequence</code> / <code>proposal</code>. The proposals are yours to take or leave; they are summarised per version below and in <code>docs/design/projects-hub-direction-v2.md</code>.</li>
67
- <li><b>Two things the build needs that no feed carries yet</b> (not a design question, recorded so the pick is informed): the faces and the shipped-in-30-days figure need new enrichment fields; a per-project hall address is needed to know where the hall entry shows.</li>
68
- </ol>
69
- </div>
70
-
71
- <div class="bar">
72
- <span>mode</span>
73
- <button data-md="dark" aria-pressed="true" type="button">dark</button>
74
- <button data-md="light" aria-pressed="false" type="button">light</button>
75
- <span>state</span>
76
- <select id="statePick" aria-label="State shown in the first tile of every version">
77
- <option value="in-map-projects">signed in, map, Projects menu open</option>
78
- <option value="in-map">signed in, map</option>
79
- <option value="out-map">signed out, map</option>
80
- <option value="in-map-profile">signed in, profile menu open</option>
81
- <option value="in-map-focus">keyboard focus in the menu</option>
82
- <option value="in-map-search">search focused with a query</option>
83
- <option value="in-mine">your projects (search hidden)</option>
84
- <option value="in-new">new project (search hidden)</option>
85
- <option value="out-new">signed out, new project</option>
86
- <option value="in-table">table view with the hall glyph</option>
87
- </select>
88
- <span>card</span>
89
- <select id="cardPick" aria-label="Card state shown in the second tile of every version">
90
- <option value="card">the platform's own project, everything present</option>
91
- <option value="card-member">Off the Boats: no art, a real zero, no hall entry</option>
92
- <option value="card-noart">no art</option>
93
- <option value="card-nofaces">no faces</option>
94
- <option value="card-onefig">one figure</option>
95
- <option value="card-nofig">no figures</option>
96
- <option value="card-floor">everything null: today's card</option>
97
- </select>
98
- </div>
99
-
100
- <section class="cand" id="v1">
101
- <div class="kick">v1 · the shelf</div>
102
- <h2>The landing's pill grammar, set down on a real shelf</h2>
103
- <div class="meta"><div><b>The bar:</b> the landing's pills on a <code>bg-frame</code> shelf, 72px, hairline edge; the search a glass pill in the left group.</div><div><b>The menu:</b> a floating card panel, 240px, 8px under its trigger; the current view a 6px accent dot.</div><div><b>The card:</b> the poster as a stack: banner, disc, name, faces, a two-up figure band, hairline ledger rows, the landing's door bar.</div><div><b>Proposes:</b> About in the menu; the card at 560; Runs as the address; the empty state as a hairline; <code>not checked</code> for the status cell.</div></div>
104
- <div class="tiles">
105
- <div class="tile" data-v="v1" data-kind="state"><div class="tileHead"><span class="lab">in-map-projects</span><a class="open" href="v1.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1, the bar state picked above, 1440" loading="lazy"></iframe></div></div>
106
- <div class="tile" data-v="v1" data-kind="card"><div class="tileHead"><span class="lab">card</span><a class="open" href="v1.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1, the card state picked above, 1440" loading="lazy"></iframe></div></div>
107
- <div class="tile phone" data-v="v1" data-kind="fixed" data-state="in-map-projects"><div class="tileHead"><span class="lab">390 · menu open</span><a class="open" href="v1.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1 at 390, the Projects menu open" loading="lazy"></iframe></div></div>
108
- <div class="tile phone" data-v="v1" data-kind="fixed" data-state="card"><div class="tileHead"><span class="lab">390 · card</span><a class="open" href="v1.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1 at 390, the card" loading="lazy"></iframe></div></div>
109
- </div>
110
- <div class="boards">
111
- <div class="tile tall" data-v="v1" data-kind="fixed" data-state="board-bar"><div class="tileHead"><span class="lab">board · every bar state</span><a class="open" href="v1.html?mode=dark&state=board-bar" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1, the bar states board" loading="lazy"></iframe></div></div>
112
- <div class="tile tall" data-v="v1" data-kind="fixed" data-state="board-card"><div class="tileHead"><span class="lab">board · the card ladder</span><a class="open" href="v1.html?mode=dark&state=board-card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1, the card ladder board" loading="lazy"></iframe></div></div>
113
- <div class="tile tall" data-v="v1" data-kind="fixed" data-state="board-menu"><div class="tileHead"><span class="lab">board · the menu and the search</span><a class="open" href="v1.html?mode=dark&state=board-menu" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v1, the menu component board" loading="lazy"></iframe></div></div>
114
- </div>
115
- </section>
116
-
117
- <section class="cand" id="v2">
118
- <div class="kick">v2 · the hairline</div>
119
- <h2>Hairlines, not containers: the menu unfolds as a band under the bar</h2>
120
- <div class="meta"><div><b>The bar:</b> no pills; the page ground closed by one hairline, 64px; a bare search field with a bottom hairline; lowercase text triggers, the open one underlined in the accent.</div><div><b>The menu:</b> a full-width band that unfolds under the bar and pushes the page down; three titled cells; the current one lit by a 2px accent hairline on top.</div><div><b>The card:</b> the specimen: the two figures as leader-line callouts on the art; a mono ledger; one accent door plus the hall as a text link.</div><div><b>Proposes:</b> the toolbar as a hairline row; the empty state as a band; About as a fourth cell; the card at 560; the under-24px controls floored.</div></div>
121
- <div class="tiles">
122
- <div class="tile" data-v="v2" data-kind="state"><div class="tileHead"><span class="lab">in-map-projects</span><a class="open" href="v2.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2, the bar state picked above, 1440" loading="lazy"></iframe></div></div>
123
- <div class="tile" data-v="v2" data-kind="card"><div class="tileHead"><span class="lab">card</span><a class="open" href="v2.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2, the card state picked above, 1440" loading="lazy"></iframe></div></div>
124
- <div class="tile phone" data-v="v2" data-kind="fixed" data-state="in-map-projects"><div class="tileHead"><span class="lab">390 · menu open</span><a class="open" href="v2.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2 at 390, the Projects menu open" loading="lazy"></iframe></div></div>
125
- <div class="tile phone" data-v="v2" data-kind="fixed" data-state="card"><div class="tileHead"><span class="lab">390 · card</span><a class="open" href="v2.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2 at 390, the card" loading="lazy"></iframe></div></div>
126
- </div>
127
- <div class="boards">
128
- <div class="tile tall" data-v="v2" data-kind="fixed" data-state="board-bar"><div class="tileHead"><span class="lab">board · every bar state</span><a class="open" href="v2.html?mode=dark&state=board-bar" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2, the bar states board" loading="lazy"></iframe></div></div>
129
- <div class="tile tall" data-v="v2" data-kind="fixed" data-state="board-card"><div class="tileHead"><span class="lab">board · the card ladder</span><a class="open" href="v2.html?mode=dark&state=board-card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2, the card ladder board" loading="lazy"></iframe></div></div>
130
- <div class="tile tall" data-v="v2" data-kind="fixed" data-state="board-menu"><div class="tileHead"><span class="lab">board · the menu and the search</span><a class="open" href="v2.html?mode=dark&state=board-menu" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v2, the menu component board" loading="lazy"></iframe></div></div>
131
- </div>
132
- </section>
133
-
134
- <section class="cand" id="v3">
135
- <div class="kick">v3 · the glass strip</div>
136
- <h2>One continuous glass surface the sky shows through</h2>
137
- <div class="meta"><div><b>The bar:</b> one continuous glass plate over the sky, 64px; the search fused into it; the right end cut into three segments by hairlines.</div><div><b>The menu:</b> a card panel welded to the strip's bottom edge; the current view marked by an accent bar at its left.</div><div><b>The card:</b> the room: the name on the art's lower third over a card-ground scrim; a shelf line with the disc, the relationship and the faces; figures and facts as one hairline ledger; a full-width door bar.</div><div><b>Proposes:</b> the card at 640; the hover card on the panel's glass; search by tag; the table scrolling in its panel on a phone; the wizard's bongo pair on the chrome ramp; a rule for dark art on a paper card.</div></div>
138
- <div class="tiles">
139
- <div class="tile" data-v="v3" data-kind="state"><div class="tileHead"><span class="lab">in-map-projects</span><a class="open" href="v3.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3, the bar state picked above, 1440" loading="lazy"></iframe></div></div>
140
- <div class="tile" data-v="v3" data-kind="card"><div class="tileHead"><span class="lab">card</span><a class="open" href="v3.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3, the card state picked above, 1440" loading="lazy"></iframe></div></div>
141
- <div class="tile phone" data-v="v3" data-kind="fixed" data-state="in-map-projects"><div class="tileHead"><span class="lab">390 · menu open</span><a class="open" href="v3.html?mode=dark&state=in-map-projects" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3 at 390, the Projects menu open" loading="lazy"></iframe></div></div>
142
- <div class="tile phone" data-v="v3" data-kind="fixed" data-state="card"><div class="tileHead"><span class="lab">390 · card</span><a class="open" href="v3.html?mode=dark&state=card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3 at 390, the card" loading="lazy"></iframe></div></div>
143
- </div>
144
- <div class="boards">
145
- <div class="tile tall" data-v="v3" data-kind="fixed" data-state="board-bar"><div class="tileHead"><span class="lab">board · every bar state</span><a class="open" href="v3.html?mode=dark&state=board-bar" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3, the bar states board" loading="lazy"></iframe></div></div>
146
- <div class="tile tall" data-v="v3" data-kind="fixed" data-state="board-card"><div class="tileHead"><span class="lab">board · the card ladder</span><a class="open" href="v3.html?mode=dark&state=board-card" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3, the card ladder board" loading="lazy"></iframe></div></div>
147
- <div class="tile tall" data-v="v3" data-kind="fixed" data-state="board-menu"><div class="tileHead"><span class="lab">board · the menu and the search</span><a class="open" href="v3.html?mode=dark&state=board-menu" target="_blank" rel="noopener">open full</a></div><div class="frame"><iframe title="v3, the menu component board" loading="lazy"></iframe></div></div>
148
- </div>
149
- </section>
150
-
151
- <footer>Task 1003299 · goal 1000080 · mocks under <code>docs/design/mocks/hub/</code> · the world: <code>DESIGN.md</code>, ADR 0196 · the record: <code>docs/design/projects-hub-direction-v2.md</code>.</footer>
152
-
153
- <script>
154
- (function () {
155
- var mode = document.documentElement.getAttribute('data-mode') || 'dark';
156
- var state = 'in-map-projects', card = 'card';
157
- function src(v, st) { return v + '.html?mode=' + mode + '&state=' + st; }
158
- function paint() {
159
- document.querySelectorAll('.tile[data-v]').forEach(function (t) {
160
- var v = t.getAttribute('data-v'), kind = t.getAttribute('data-kind');
161
- var st = kind === 'state' ? state : kind === 'card' ? card : t.getAttribute('data-state');
162
- var f = t.querySelector('iframe'), a = t.querySelector('a.open');
163
- var u = src(v, st);
164
- if (f.getAttribute('src') !== u) f.setAttribute('src', u);
165
- if (a) a.setAttribute('href', u);
166
- var lab = t.querySelector('.lab'); if (lab && (kind === 'state' || kind === 'card')) lab.textContent = st;
167
- });
168
- }
169
- document.querySelectorAll('.bar button[data-md]').forEach(function (b) {
170
- b.addEventListener('click', function () {
171
- mode = b.getAttribute('data-md');
172
- document.documentElement.setAttribute('data-mode', mode);
173
- document.querySelectorAll('.bar button[data-md]').forEach(function (x) { x.setAttribute('aria-pressed', String(x === b)); });
174
- paint();
175
- });
176
- });
177
- document.getElementById('statePick').addEventListener('change', function (e) { state = e.target.value; paint(); });
178
- document.getElementById('cardPick').addEventListener('change', function (e) { card = e.target.value; paint(); });
179
- function scale() {
180
- document.querySelectorAll('.frame').forEach(function (fr) {
181
- var f = fr.querySelector('iframe'); if (!f) return;
182
- var w = parseFloat(f.style.width || f.getAttribute('width')) || (fr.closest('.phone') ? 390 : 1440);
183
- f.style.transform = 'scale(' + (fr.clientWidth / w) + ')';
184
- });
185
- }
186
- window.addEventListener('resize', scale);
187
- paint(); scale();
188
- window.addEventListener('load', scale);
189
- })();
190
- </script>
191
- </body>
192
- </html>