@bongos/core 1.19.725 → 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 (229) hide show
  1. package/.bongos-core.json +179 -494
  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 +4 -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/gate-review.js +14 -6
  64. package/scripts/gds/gen-diagrams.js +1 -1
  65. package/scripts/gds/leak-scan-allowlist.js +293 -0
  66. package/scripts/gds/learning-capture.js +1 -1
  67. package/scripts/gds/linkify-refs.js +2 -2
  68. package/scripts/gds/local-preview-lib.js +1 -1
  69. package/scripts/gds/mirror-lineage-check.js +1 -1
  70. package/scripts/gds/mirror-redact.js +17 -2
  71. package/scripts/gds/newcomer-floor.templates.json +1 -1
  72. package/scripts/gds/package-core.js +18 -1
  73. package/scripts/gds/paste-token.js +1 -1
  74. package/scripts/gds/provision-units.js +2 -2
  75. package/scripts/gds/publish-manifest.js +15 -0
  76. package/scripts/gds/repo-metrics.js +1 -1
  77. package/scripts/gds/sandbox-stage.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  81. package/scripts/gds/seed-bongos-tasks.js +2 -2
  82. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  83. package/scripts/gds/seed-medusa-tasks.js +10 -10
  84. package/scripts/gds/seed-module-upstreaming.js +1 -1
  85. package/scripts/gds/seed-productization-tasks.js +6 -6
  86. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  87. package/scripts/gds/seed-staging.sh +19 -6
  88. package/scripts/gds/ship-deploy-target.js +1 -1
  89. package/scripts/gds/ship-flow.js +1 -1
  90. package/scripts/gds/smoke-gds.js +1 -1
  91. package/scripts/status-probe.mjs +2 -2
  92. package/src/bongos/auth-discord.js +2 -2
  93. package/src/bongos/live-channel.js +1 -1
  94. package/src/bongos/permission-path-check.js +80 -3
  95. package/src/bongos/pool.js +1 -1
  96. package/src/bongos/routes/auth.js +11 -11
  97. package/src/bongos/routes/security.js +1 -1
  98. package/src/bongos/routes.js +1 -1
  99. package/src/branding.js +1 -1
  100. package/src/devbox-downloads.js +1 -1
  101. package/src/instance-config.js +2 -2
  102. package/src/module-api.js +1 -1
  103. package/src/module-loader/provenance.js +2 -2
  104. package/tests/art_stage.mjs +2 -2
  105. package/tests/auth_anthropic_identity.mjs +1 -1
  106. package/tests/auth_duplicate_cookie.mjs +1 -1
  107. package/tests/auth_error_brand.mjs +1 -1
  108. package/tests/auth_inactive_builder.mjs +1 -1
  109. package/tests/backup_cli.mjs +4 -4
  110. package/tests/bongos_box_connect.mjs +2 -2
  111. package/tests/bongos_downloads.mjs +2 -2
  112. package/tests/bongos_login.mjs +5 -5
  113. package/tests/box_connect_e2e.mjs +2 -2
  114. package/tests/box_dns_repoint.mjs +10 -10
  115. package/tests/box_host_keys.mjs +1 -1
  116. package/tests/box_onboard.mjs +9 -9
  117. package/tests/box_scope_session.mjs +1 -1
  118. package/tests/box_terminal_ssrf.mjs +7 -7
  119. package/tests/boxes.mjs +9 -9
  120. package/tests/branding.mjs +2 -2
  121. package/tests/bump_version.mjs +2 -2
  122. package/tests/cf_tunnel.mjs +40 -40
  123. package/tests/cli_token_reissue.mjs +7 -7
  124. package/tests/cloud_bongos_pack.mjs +1 -1
  125. package/tests/currency_label.mjs +8 -8
  126. package/tests/dev_lib.mjs +4 -4
  127. package/tests/devbox_dmg_backdrop.mjs +1 -1
  128. package/tests/devbox_downloads.mjs +2 -2
  129. package/tests/devbox_icons.mjs +1 -1
  130. package/tests/discord_approvals.mjs +1 -1
  131. package/tests/discord_oauth.mjs +2 -2
  132. package/tests/executed_closure.mjs +6 -1
  133. package/tests/first_admin_bootstrap.mjs +1 -1
  134. package/tests/gate_approvals.mjs +5 -5
  135. package/tests/government_protected_surfaces.mjs +137 -0
  136. package/tests/grade_aggregates_unavailable.mjs +1 -1
  137. package/tests/hook_user_agents.mjs +2 -2
  138. package/tests/init.mjs +6 -6
  139. package/tests/instance_config.mjs +1 -1
  140. package/tests/instance_manifest.mjs +5 -5
  141. package/tests/instance_mismatch_guard.mjs +13 -13
  142. package/tests/leak_scan_allowlist.mjs +94 -0
  143. package/tests/migrate_root_resolution.mjs +4 -4
  144. package/tests/mirror_redact.mjs +28 -4
  145. package/tests/module_catalog.mjs +5 -5
  146. package/tests/module_submissions.mjs +3 -3
  147. package/tests/package_core.mjs +1 -1
  148. package/tests/parallel-load.mjs +6 -6
  149. package/tests/projects_hub.mjs +2 -2
  150. package/tests/provision.mjs +50 -50
  151. package/tests/provisioning_github_app_routes.mjs +1 -1
  152. package/tests/provisioning_onboard_mode.mjs +2 -2
  153. package/tests/publish_reconciler.mjs +4 -4
  154. package/tests/sandbox_stage.mjs +1 -1
  155. package/tests/scrubber_corpus.mjs +3 -3
  156. package/tests/search_isolation.mjs +1 -1
  157. package/tests/session_records.mjs +1 -1
  158. package/tests/ship_card.mjs +6 -6
  159. package/tests/ship_ci_deploy.mjs +1 -1
  160. package/tests/single_host_hall.mjs +9 -9
  161. package/tests/smoke_preflight.mjs +1 -1
  162. package/tests/smoke_target.mjs +1 -1
  163. package/tests/status-probe.mjs +1 -1
  164. package/tests/status_mirror_sync.mjs +1 -1
  165. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  166. package/docs/design/mocks/_schemes.css +0 -604
  167. package/docs/design/mocks/component-sheet.html +0 -428
  168. package/docs/design/mocks/hall/_tokens.css +0 -370
  169. package/docs/design/mocks/hall/board/v1.html +0 -846
  170. package/docs/design/mocks/hall/board/v2.html +0 -858
  171. package/docs/design/mocks/hall/board/v3.html +0 -884
  172. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  173. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  174. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  175. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  176. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  177. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  178. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  179. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  180. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  181. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  182. package/docs/design/mocks/hall/task/v1.html +0 -633
  183. package/docs/design/mocks/hall/task/v2.html +0 -646
  184. package/docs/design/mocks/hall/task/v3.html +0 -647
  185. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  186. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  187. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  188. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  189. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  190. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  191. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  192. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  193. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  194. package/docs/design/mocks/hub/mine.html +0 -465
  195. package/docs/design/mocks/hub/picker.html +0 -421
  196. package/docs/design/mocks/hub/planets.html +0 -356
  197. package/docs/design/mocks/hub/v1.html +0 -1209
  198. package/docs/design/mocks/hub/v2.html +0 -1257
  199. package/docs/design/mocks/hub/v3.html +0 -1496
  200. package/docs/design/mocks/hub/wizard.html +0 -421
  201. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  202. package/docs/design/mocks/landing/v1.html +0 -956
  203. package/docs/design/mocks/landing/v2.html +0 -708
  204. package/docs/design/mocks/landing/v3.html +0 -911
  205. package/docs/design/mocks/landing-page-mock.html +0 -687
  206. package/docs/design/mocks/landing-palettes.html +0 -103
  207. package/docs/design/mocks/projects-hub-mock.html +0 -991
  208. package/docs/design/mocks/projects-hub-variants.html +0 -146
  209. package/docs/design/mocks/projects-page-mock.html +0 -167
  210. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  211. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  212. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  213. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  214. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  215. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  216. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  217. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  218. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  219. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  220. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  221. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  222. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  223. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  224. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  225. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  226. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  227. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  228. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  229. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,884 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-mode="dark" data-theme="dark">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>Work board and home: the hall in the world, v3 "the glass hall" (task 1003302)</title>
7
- <link rel="icon" href="data:,">
8
- <link rel="preconnect" href="https://fonts.googleapis.com">
9
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
11
- <link rel="stylesheet" href="../_tokens.css">
12
- <style>
13
- body{
14
- /* the composition tokens for THIS version live here, on body, never on :root.
15
- v3 "the glass hall": the owner's dark reference. One rendered plate (the hall's own) sits
16
- behind the whole shell in dark under --plate-veil; the sidebar and topbar are glass over it;
17
- content is --bg-card at --radius. The plate file is not shot yet, so --plate resolves to none
18
- and the ground reads as the flat void, which is the honest fallback and what light shows anyway. */
19
- --shell-pad:20px;
20
- --sidebar-w:var(--sidebar-w-rail);
21
- --rail-open:246px;
22
- --content-max:1120px;
23
- --sec-air:34px;
24
- --sec-gap:22px;
25
- --row-pad:14px;
26
- --task-gap:12px;
27
- --panel-bg:var(--bg-card);
28
- --panel-edge:transparent;
29
- --panel-radius:var(--radius);
30
- --panel-pad:26px;
31
- --tile-gap:0px;
32
- --tile-pad:20px 22px;
33
- --figure:clamp(26px,2.6vw,34px);
34
- --focus-halo:var(--bg);
35
- --nav-item-h:40px;
36
- --claim-h:34px;
37
- margin:0;background:var(--bg);color:var(--ink);
38
- font-family:var(--font-body);font-size:15px;line-height:1.5;
39
- -webkit-font-smoothing:antialiased;
40
- }
41
-
42
- /* ── the floor: every visible control clears 24px on both sides ── */
43
- a,button,input,select,summary{font-family:inherit;font-size:inherit;color:inherit;min-height:24px;}
44
- button,select,input{background:none;border:0;}
45
- button{cursor:pointer;}
46
- .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
47
- .num,.tabular{font-variant-numeric:tabular-nums;}
48
-
49
- /* ── focus: the world's two-tone ring, and the state that shows it without script ── */
50
- :where(a,button,input,select,[tabindex]):focus-visible{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--focus-halo);}
51
- body[data-state="focus"] .is-focus{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--focus-halo);}
52
- .nav-item:focus-visible,body[data-state="focus"] .nav-item.is-focus{outline-offset:-2px;box-shadow:none;}
53
- .skip{position:absolute;left:-9999px;top:8px;z-index:200;background:var(--bg-card);color:var(--ink);border:1px solid var(--rule);border-radius:var(--radius-pill);padding:11px 18px;text-decoration:none;}
54
- .skip:focus{left:12px;}
55
-
56
- /* ── the label voice: mono in light, the body face in dark. Never a hard-coded family. ── */
57
- .lbl{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);line-height:1.2;}
58
-
59
- /* ── the shell ── */
60
- .app-sidebar{position:fixed;top:0;left:0;bottom:0;width:var(--sidebar-w);z-index:var(--z-sidebar);display:flex;flex-direction:column;overflow:hidden;background:var(--bg);border-right:1px solid var(--rule);}
61
- .app-sidebar__brand{flex:none;height:var(--topbar-h);display:flex;align-items:center;padding:0 var(--shell-pad);border-bottom:1px solid var(--rule);}
62
- .brand-mark{display:inline-flex;align-items:center;gap:10px;min-height:32px;text-decoration:none;color:var(--ink);}
63
- .brand-mark__dot{width:11px;height:11px;border-radius:50%;border:1px solid var(--ink);flex:none;}
64
- .brand-mark__name{font-weight:500;font-size:15px;letter-spacing:-.015em;white-space:nowrap;}
65
- .app-sidebar__nav{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 0 22px;}
66
- .nav-group{padding:0 0 10px;}
67
- .nav-group__head{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:26px;padding:8px var(--shell-pad) 4px;text-align:left;}
68
- .nav-group__head-label{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
69
- .nav-group__chevron{width:10px;height:6px;flex:none;stroke:currentColor;stroke-width:1.4;fill:none;color:var(--ink-faint);}
70
- .nav-item{text-transform:lowercase;position:relative;display:flex;align-items:center;gap:10px;min-height:var(--nav-item-h);padding:0 var(--shell-pad);color:var(--ink-soft);text-decoration:none;}
71
- .nav-item:hover{color:var(--ink);}
72
- .nav-item__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;}
73
- .nav-icon{width:16px;height:16px;flex:none;stroke:currentColor;stroke-width:1.25;fill:none;stroke-linecap:round;stroke-linejoin:round;}
74
- .app-sidebar__foot{flex:none;display:flex;align-items:center;gap:6px;padding:12px var(--shell-pad);border-top:1px solid var(--rule);}
75
- .shell-user{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink);min-height:36px;}
76
- .shell-user__avatar{width:26px;height:26px;flex:none;border-radius:50%;background:var(--bg-deep);border:1px solid var(--rule);}
77
- .shell-user__meta{min-width:0;display:flex;flex-direction:column;}
78
- .shell-user__name{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
79
- .shell-user__rank{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
80
- .shell-home,.shell-signout{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;color:var(--ink-faint);}
81
- .shell-home:hover,.shell-signout:hover{color:var(--ink);}
82
- .shell-home svg,.shell-signout svg{width:15px;height:15px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
83
-
84
- .app-topbar{position:sticky;top:0;z-index:var(--z-topbar);margin-left:var(--sidebar-w);height:var(--topbar-h);display:flex;align-items:center;gap:14px;padding:0 var(--shell-pad);background:var(--bg);border-bottom:1px solid var(--rule);}
85
- .topbar-menu{display:none;align-items:center;justify-content:center;width:32px;height:32px;color:var(--ink-soft);}
86
- .topbar-menu svg,.topbar-jump svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
87
- .topbar-title{margin:0;font-family:var(--font-display);font-weight:300;font-size:19px;letter-spacing:-.025em;text-transform:lowercase;color:var(--ink);}
88
- .topbar-side{margin-left:auto;display:flex;align-items:center;gap:8px;}
89
- .topbar-note{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);white-space:nowrap;}
90
- .topbar-jump{display:inline-flex;align-items:center;gap:8px;min-height:30px;padding:0 12px;border:1px solid var(--rule);border-radius:var(--radius-pill);color:var(--ink-soft);}
91
- .topbar-jump:hover{border-color:var(--ink-faint);color:var(--ink);}
92
- .topbar-jump__label{font-size:13px;text-transform:lowercase;}
93
- .topbar-jump__kbd{font-family:var(--font-mono);font-size:11px;color:var(--ink-faint);}
94
- .zoom-toggle,.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--radius-pill);color:var(--ink-soft);}
95
- .zoom-toggle:hover,.theme-toggle:hover{color:var(--ink);}
96
- .zoom-toggle svg,.theme-toggle svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
97
-
98
- .app-scrim{display:none;position:fixed;inset:0;z-index:var(--z-scrim);background:rgba(0,0,0,.55);}
99
- body[data-state="drawer"] .app-scrim{display:block;}
100
-
101
- .app-content{margin-left:var(--sidebar-w);padding:26px var(--shell-pad) 108px;}
102
- .wrap{max-width:var(--content-max);margin:0 auto;}
103
-
104
- /* ── the greeting: hall-1's rhythm, in the label voice ── */
105
- .greeting{margin:0;font-family:var(--label-face);font-size:14px;letter-spacing:var(--label-space);text-transform:var(--label-case);font-weight:400;color:var(--ink);}
106
- .greeting__sub{margin:6px 0 0;font-size:14px;color:var(--ink-soft);}
107
-
108
- .sec{margin-top:var(--sec-air);}
109
- .sec__lede{margin:0;font-size:13px;color:var(--ink-faint);}
110
- .count-pill{font-family:var(--font-mono);font-size:11px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
111
-
112
- .tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--tile-gap);}
113
- .tile{display:flex;flex-direction:column;gap:8px;text-decoration:none;color:var(--ink);}
114
- .tile__label{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
115
- .tile__num{font-family:var(--font-display);font-weight:300;font-size:var(--figure);line-height:1;letter-spacing:-.035em;font-variant-numeric:tabular-nums;color:var(--ink);}
116
- .tile__num--word{letter-spacing:-.03em;}
117
- .tile__sub{font-size:12.5px;color:var(--ink-faint);}
118
- .tile:hover .tile__sub{color:var(--ink-soft);}
119
-
120
- .band{display:grid;grid-template-columns:1fr 1fr;gap:var(--sec-gap);}
121
- .card{min-width:0;}
122
- .cardfoot{margin:14px 0 0;}
123
- .cardfoot a{display:inline-block;padding:3px 0;min-height:24px;line-height:18px;font-size:13px;color:var(--accent-ink);text-decoration:underline;text-underline-offset:4px;}
124
- .cardfoot a:hover{color:var(--ink);}
125
-
126
- .who{display:flex;align-items:center;gap:12px;padding-bottom:14px;}
127
- .who__avatar{width:36px;height:36px;flex:none;border-radius:50%;background:var(--bg-deep);border:1px solid var(--rule);}
128
- .who__meta{display:flex;flex-direction:column;min-width:0;}
129
- .who__name{font-weight:500;font-size:15px;}
130
- .who__handle{font-family:var(--font-mono);font-size:12px;color:var(--ink-faint);}
131
- .chip{margin-left:auto;font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-soft);border:1px solid var(--rule);border-radius:var(--radius-pill);padding:4px 10px;min-height:24px;display:inline-flex;align-items:center;}
132
- .facts{margin:0;display:grid;grid-template-columns:1fr auto;gap:0;}
133
- .facts > div{display:contents;}
134
- .facts dt,.facts dd{border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;margin:0;}
135
- .facts dt{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
136
- .facts dd{text-align:right;font-size:14px;color:var(--ink);font-variant-numeric:tabular-nums;}
137
-
138
- .glist{list-style:none;margin:0;padding:0;}
139
- .glist li{display:grid;grid-template-columns:auto 1fr auto;gap:0 14px;align-items:baseline;border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;}
140
- .g__id{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
141
- .g__t{min-width:0;font-size:14px;color:var(--ink);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;padding:3px 0;min-height:24px;}
142
- a.g__t:hover{text-decoration:underline;text-underline-offset:3px;}
143
- .g__s{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);white-space:nowrap;}
144
-
145
- .att{list-style:none;margin:0;padding:0;}
146
- .att__row{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;}
147
- .att__kind{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);flex:none;width:150px;}
148
- .att__line{flex:1 1 320px;min-width:0;font-size:14px;color:var(--ink);}
149
- .att__line a{color:var(--ink);text-decoration:underline;text-underline-offset:3px;display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
150
- .att__do{display:flex;gap:6px;flex:none;}
151
-
152
- .btn{display:inline-flex;align-items:center;justify-content:center;min-height:28px;min-width:56px;padding:0 12px;border:1px solid var(--rule);border-radius:var(--radius-pill);font-size:13px;color:var(--ink);text-transform:lowercase;text-decoration:none;white-space:nowrap;}
153
- .btn:hover{border-color:var(--ink-faint);}
154
- .btn--ghost{border-color:transparent;color:var(--ink-soft);}
155
- .btn--ghost:hover{border-color:var(--rule);color:var(--ink);}
156
-
157
- .nextup{list-style:none;margin:0;padding:0;}
158
- .nextup li{display:grid;grid-template-columns:auto 1fr auto;gap:0 14px;align-items:baseline;border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;}
159
- .nextup .n__id{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
160
- .nextup .n__t{min-width:0;font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
161
- .nextup .n__c{font-size:13px;color:var(--ink-soft);font-variant-numeric:tabular-nums;white-space:nowrap;}
162
- .ledger{width:100%;border-collapse:collapse;table-layout:fixed;}
163
- .ledger th{text-align:left;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);font-weight:400;color:var(--ink-faint);padding:0 14px 8px 0;}
164
- .ledger td{border-top:1px solid var(--rule-soft);padding:var(--row-pad) 14px var(--row-pad) 0;font-size:14px;color:var(--ink);vertical-align:top;}
165
- .ledger td:last-child,.ledger th:last-child{padding-right:0;text-align:right;}
166
- .ledger .c-id{width:88px;font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
167
- .ledger .c-cr{width:96px;text-align:right;font-variant-numeric:tabular-nums;}
168
- .ledger .c-wh{width:104px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-soft);}
169
- .ledger .c-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
170
-
171
- .tabs{display:flex;gap:0;border-bottom:1px solid var(--rule);margin-bottom:14px;flex-wrap:wrap;}
172
- .tab{display:inline-flex;align-items:baseline;gap:8px;min-height:38px;padding:0 16px;color:var(--ink-soft);border-bottom:2px solid transparent;margin-bottom:-1px;text-transform:lowercase;font-size:14px;}
173
- .tab:first-child{padding-left:0;}
174
- .tab:hover{color:var(--ink);}
175
- .tab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--accent);}
176
- .tab[aria-selected="true"] .count-pill{color:var(--accent-ink);}
177
-
178
- .filters{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border-bottom:1px solid var(--rule-soft);padding-bottom:10px;margin-bottom:14px;}
179
- .field{display:flex;align-items:center;gap:8px;min-height:32px;}
180
- .field--search{flex:1 1 200px;min-width:160px;border-bottom:1px solid var(--rule);padding-bottom:2px;}
181
- .field--search svg{width:14px;height:14px;flex:none;stroke:var(--ink-faint);stroke-width:1.3;fill:none;}
182
- .field--search input{flex:1;min-width:0;padding:4px 0;font-size:14px;color:var(--ink);}
183
- .field--search input::placeholder{color:var(--ink-faint);}
184
- .field--search input:focus{outline:none;}
185
- .field--search:focus-within{border-bottom-color:var(--ink);}
186
- .sel{min-height:30px;padding:0 22px 0 8px;border:1px solid var(--rule);border-radius:var(--radius-pill);font-size:13px;color:var(--ink-soft);background:var(--bg);appearance:none;
187
- background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 12px) 13px,calc(100% - 8px) 13px;background-size:4px 4px,4px 4px;background-repeat:no-repeat;}
188
- .sel:hover{border-color:var(--ink-faint);color:var(--ink);}
189
- .filters .sel{max-width:118px;text-overflow:ellipsis;}
190
- .filters select.sel:first-of-type{max-width:178px;}
191
- .sw{display:inline-flex;align-items:center;gap:8px;min-height:30px;padding:0 10px 0 6px;border:1px solid var(--rule);border-radius:var(--radius-pill);font-size:13px;color:var(--ink-soft);cursor:pointer;}
192
- .sw input{appearance:none;width:24px;height:24px;position:relative;flex:none;cursor:pointer;}
193
- .sw input::before{content:"";position:absolute;left:3px;top:7px;width:18px;height:10px;border-radius:var(--radius-pill);border:1px solid var(--rule);background:var(--bg);}
194
- .sw input::after{content:"";position:absolute;left:5px;top:9px;width:6px;height:6px;border-radius:50%;background:var(--ink-faint);}
195
- .sw input:checked::before{border-color:var(--accent);background:var(--accent-tint);}
196
- .sw input:checked::after{left:13px;background:var(--accent);}
197
- .sw:hover{border-color:var(--ink-faint);color:var(--ink);}
198
-
199
- .countline{margin:0 0 12px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
200
- .countline .num{color:var(--ink);}
201
-
202
- .tasklist{display:grid;gap:var(--task-gap);}
203
- .task{display:grid;grid-template-columns:118px minmax(0,1fr) 104px auto;gap:0 18px;align-items:start;}
204
- .task__id{display:flex;align-items:center;gap:2px;}
205
- .task__select{appearance:none;width:24px;height:24px;position:relative;flex:none;cursor:pointer;}
206
- .task__select::before{content:"";position:absolute;left:5px;top:5px;width:14px;height:14px;border:1px solid var(--rule);border-radius:3px;background:transparent;}
207
- .task__select:checked::before{background:var(--accent);border-color:var(--accent);}
208
- .task__select:checked::after{content:"";position:absolute;left:9px;top:8px;width:4px;height:8px;border:solid var(--accent-on);border-width:0 1.5px 1.5px 0;transform:rotate(42deg);}
209
- .task__num{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
210
- .task__open{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;color:var(--ink-faint);}
211
- .task__open:hover{color:var(--ink);}
212
- .task__open svg,.task__copy svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
213
- .task__body{min-width:0;padding-top:2px;}
214
- .task__title{margin:0 0 7px;font-size:14.5px;line-height:1.4;color:var(--ink);}
215
- .task__meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;}
216
- .task__tag{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-soft);border:1px solid var(--rule);border-radius:var(--radius-pill);padding:2px 8px;}
217
- .task__fact{font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
218
- .task__fact + .task__fact::before{content:"·";margin-right:8px;color:var(--rule);}
219
- .task__credits{display:flex;flex-direction:column;align-items:flex-end;gap:2px;padding-top:2px;}
220
- .task__credits-num{font-family:var(--font-display);font-weight:300;font-size:26px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--ink);}
221
- .task__credits-label{font-family:var(--label-face);font-size:10px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
222
- .task__actions{display:flex;align-items:center;gap:6px;padding-top:2px;}
223
- .task__claim{display:inline-flex;align-items:center;justify-content:center;min-height:var(--claim-h);min-width:74px;padding:0 16px;border-radius:var(--radius-pill);background:var(--accent);color:var(--accent-on);font-weight:500;font-size:13.5px;text-transform:lowercase;}
224
- .task__claim:hover{background:var(--accent-lift);}
225
- .task__copy{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--rule);border-radius:var(--radius-pill);color:var(--ink-faint);}
226
- .task__copy:hover{color:var(--ink);border-color:var(--ink-faint);}
227
-
228
- .pager{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;}
229
- .pager__range,.pager__page{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
230
- .pager__nav{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
231
- .pager__per{display:inline-flex;align-items:center;gap:8px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint);}
232
- .pager__btn{min-height:28px;min-width:64px;padding:0 12px;border:1px solid var(--rule);border-radius:var(--radius-pill);font-size:13px;color:var(--ink-soft);text-transform:lowercase;}
233
- .pager__btn:hover:not([disabled]){color:var(--ink);border-color:var(--ink-faint);}
234
- .pager__btn[disabled]{color:var(--ink-faint);border-color:var(--rule-soft);cursor:default;}
235
-
236
- .bulkbar{position:fixed;left:var(--sidebar-w);right:0;bottom:0;z-index:var(--z-topbar);display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:12px var(--shell-pad);border-top:1px solid var(--rule);}
237
- .bulkbar__count{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink);}
238
- .bulkbar__actions{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
239
- .bulkbar__btn{min-height:30px;padding:0 14px;border:1px solid var(--rule);border-radius:var(--radius-pill);font-size:13px;color:var(--ink);text-transform:lowercase;}
240
- .bulkbar__btn:hover{border-color:var(--ink-faint);}
241
- .bulkbar__clear{min-height:30px;padding:0 10px;font-size:13px;color:var(--ink-soft);text-decoration:underline;text-underline-offset:4px;text-transform:lowercase;}
242
- .bulkbar__clear:hover{color:var(--ink);}
243
-
244
- .empty-line,.err-line{margin:0;padding:var(--row-pad) 0;font-size:14px;color:var(--ink-soft);}
245
- .state-block__t{margin:0 0 8px;font-family:var(--font-display);font-weight:300;font-size:22px;letter-spacing:-.03em;text-transform:lowercase;color:var(--ink);}
246
- .state-block__b{margin:0 0 16px;font-size:14px;line-height:1.5;color:var(--ink-soft);}
247
-
248
- /* ── skeletons in the shape of the final content, no shimmer: the world draws no motion here ── */
249
- .skel{display:block;background:var(--rule-soft);border-radius:2px;}
250
- .skel--label{width:64px;height:9px;}
251
- .skel--num{width:104px;height:30px;}
252
- .skel--sub{width:88px;height:9px;}
253
- .skel--title{width:min(560px,86%);height:12px;}
254
- .skel--meta{width:230px;height:9px;}
255
- .skel--id{width:60px;height:10px;}
256
- .skel--cr{width:44px;height:22px;}
257
- .skel--act{width:74px;height:28px;border-radius:var(--radius-pill);}
258
- .skel--line{width:min(420px,70%);height:11px;}
259
- .skel--row{width:min(300px,52%);height:11px;}
260
- .task--skel{align-items:center;}
261
- .task--skel .task__body{display:grid;gap:8px;}
262
- .task--skel .task__credits{align-items:flex-end;gap:6px;}
263
- .att--skel .att__row,.rows--skel > div{display:flex;align-items:center;gap:14px;border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;}
264
-
265
- /* ── the state contract: real markup, shown or hidden by CSS. Nothing is built by script. ── */
266
- body[data-state="loading"] [data-off~="loading"],
267
- body[data-state="empty"] [data-off~="empty"],
268
- body[data-state="error"] [data-off~="error"],
269
- body[data-state="populated"] [data-off~="populated"],
270
- body[data-state="rail"] [data-off~="populated"],
271
- body[data-state="drawer"] [data-off~="populated"],
272
- body[data-state="focus"] [data-off~="populated"]{display:none;}
273
-
274
- /* ══ v3's composition: the glass hall ══ */
275
-
276
- /* the ground: the hall's own plate under the whole shell, then its veil. Both are tokens; in light
277
- they are none, because light is the same room on paper and never a black panel. */
278
- body::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background-image:var(--plate);background-size:cover;background-position:center;mix-blend-mode:var(--plate-blend);}
279
- body::after{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background-image:var(--plate-veil);}
280
- .app-content{position:relative;z-index:1;}
281
-
282
- /* the sidebar is the 64px rail at every width, and expands over the content on hover or
283
- focus-within. No transition: the world animates transform and filter only. */
284
- .app-sidebar{width:var(--sidebar-w-rail);background:var(--glass);border-right:1px solid var(--glass-edge);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));}
285
- .app-sidebar__brand,.nav-group__head{padding-left:0;padding-right:0;justify-content:center;}
286
- .nav-item{margin:0 8px;padding:0;justify-content:center;border-radius:var(--radius-sm);}
287
- .nav-item--active{background:var(--glass-strong);color:var(--ink);}
288
- .nav-item--active::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:2px;border-radius:1px;background:var(--accent);}
289
- .brand-mark__name,.nav-item__label,.nav-group__head-label,.nav-group__chevron,.shell-user__meta{display:none;}
290
- .app-sidebar__foot{flex-direction:column;gap:8px;padding:10px 0;border-top:1px solid var(--glass-edge);}
291
- .shell-user{flex:none;justify-content:center;}
292
- .app-sidebar:hover,.app-sidebar:focus-within{width:var(--rail-open);}
293
- .app-sidebar:hover .brand-mark__name,.app-sidebar:focus-within .brand-mark__name,
294
- .app-sidebar:hover .nav-item__label,.app-sidebar:focus-within .nav-item__label,
295
- .app-sidebar:hover .shell-user__meta,.app-sidebar:focus-within .shell-user__meta{display:block;}
296
- .app-sidebar:hover .nav-group__head-label,.app-sidebar:focus-within .nav-group__head-label{display:inline;}
297
- .app-sidebar:hover .nav-group__chevron,.app-sidebar:focus-within .nav-group__chevron{display:inline-block;}
298
- .app-sidebar:hover .app-sidebar__brand,.app-sidebar:focus-within .app-sidebar__brand,
299
- .app-sidebar:hover .nav-group__head,.app-sidebar:focus-within .nav-group__head{padding-left:22px;padding-right:22px;justify-content:flex-start;}
300
- .app-sidebar:hover .nav-group__head,.app-sidebar:focus-within .nav-group__head{justify-content:space-between;}
301
- .app-sidebar:hover .nav-item,.app-sidebar:focus-within .nav-item{padding:0 12px;justify-content:flex-start;}
302
- .app-sidebar:hover .app-sidebar__foot,.app-sidebar:focus-within .app-sidebar__foot{flex-direction:row;padding:12px 16px;}
303
- .app-sidebar:hover .shell-user,.app-sidebar:focus-within .shell-user{flex:1 1 auto;justify-content:flex-start;}
304
-
305
- /* the topbar is glass over the same ground */
306
- .app-topbar{background:var(--glass);border-bottom:1px solid var(--glass-edge);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));}
307
- .topbar-jump{border-color:var(--glass-edge);background:var(--glass);}
308
-
309
- /* section heads take the display voice here: this is the loosest version, so a head is a title */
310
- .sec__head{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:14px;}
311
- .sec__h{margin:0;font-family:var(--font-display);font-weight:300;font-size:21px;line-height:1.15;letter-spacing:-.03em;color:var(--ink);text-shadow:var(--type-halo);}
312
- .sub-h{margin:22px 0 10px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);font-weight:400;color:var(--ink-faint);}
313
- .sub-h:first-child{margin-top:0;}
314
- .greeting{text-shadow:var(--type-halo);}
315
-
316
- /* the stat tiles: v3's signature. ONE glass band of four figures divided by vertical hairlines,
317
- hall-2's row exactly, rather than four separate objects. */
318
- .tiles{background:var(--glass);border:1px solid var(--glass-edge);border-radius:var(--radius);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));overflow:hidden;}
319
- .tile{padding:var(--tile-pad);border-left:1px solid var(--glass-edge);}
320
- .tile:first-child{border-left:0;}
321
- .tile:hover{background:var(--glass);}
322
- .tile__num{text-shadow:var(--type-halo);}
323
-
324
- /* content panels: --bg-card at the full radius, no hairline edge. Tone alone separates them. */
325
- .card,.sec--sheet{background:var(--panel-bg);border-radius:var(--panel-radius);padding:var(--panel-pad);}
326
- .att__row:first-child,.glist li:first-child,.nextup li:first-child,.rows--skel > div:first-child,.att--skel .att__row:first-child{border-top:0;padding-top:0;}
327
- .facts > div:first-child dt,.facts > div:first-child dd{border-top:0;padding-top:0;}
328
- .task{background:var(--panel-bg);border-radius:var(--panel-radius);padding:17px 22px;}
329
- .task{border:1px solid transparent;}
330
- .task:hover{border-color:var(--glass-edge);}
331
- .task--sel{border-color:var(--glass-edge);}
332
- .task--skel{background:var(--panel-bg);}
333
- .state-block{background:var(--panel-bg);border-radius:var(--panel-radius);padding:34px 26px 28px;max-width:none;}
334
- .state-block__b{max-width:56ch;}
335
- .empty-line,.err-line{border-top:0;}
336
- .pager{border-top:0;background:var(--panel-bg);border-radius:var(--panel-radius);padding:12px 22px;}
337
- .bulkbar{background:var(--glass);border-top:1px solid var(--glass-edge);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));}
338
- .bulkbar__btn{border-color:var(--glass-edge);background:var(--glass);}
339
- .tabs{border-bottom-color:var(--glass-edge);}
340
- .filters{border-bottom-color:var(--glass-edge);}
341
- .sel{background:var(--glass);border-color:var(--glass-edge);}
342
-
343
- /* the rail state pins the resting width: the hover expansion is off, so the reviewer sees it still */
344
- body[data-state="rail"] .app-sidebar:hover,body[data-state="rail"] .app-sidebar:focus-within{width:var(--sidebar-w-rail);}
345
- /* the drawer state IS the rail expanded over the page, which is this version's own disclosure */
346
- body[data-state="drawer"] .app-sidebar{width:var(--rail-open);z-index:var(--z-drawer);}
347
- body[data-state="drawer"] .brand-mark__name,
348
- body[data-state="drawer"] .nav-item__label,
349
- body[data-state="drawer"] .shell-user__meta{display:block;}
350
- body[data-state="drawer"] .nav-group__head-label{display:inline;}
351
- body[data-state="drawer"] .nav-group__chevron{display:inline-block;}
352
- body[data-state="drawer"] .app-sidebar__brand{padding-left:22px;padding-right:22px;justify-content:flex-start;}
353
- body[data-state="drawer"] .nav-group__head{padding-left:22px;padding-right:22px;justify-content:space-between;}
354
- body[data-state="drawer"] .nav-item{padding:0 12px;justify-content:flex-start;}
355
- body[data-state="drawer"] .app-sidebar__foot{flex-direction:row;padding:12px 16px;}
356
- body[data-state="drawer"] .shell-user{flex:1 1 auto;justify-content:flex-start;}
357
-
358
- @media (max-width:900px){
359
- body{--shell-pad:14px;--figure:clamp(24px,6.6vw,32px);--panel-pad:18px;}
360
- .topbar-menu{display:inline-flex;}
361
- .topbar-note,.topbar-jump__label,.topbar-jump__kbd{display:none;}
362
- .app-content{padding-bottom:200px;}
363
- .tiles{grid-template-columns:1fr 1fr;}
364
- .tile:nth-child(3),.tile:nth-child(4){border-top:1px solid var(--glass-edge);}
365
- .tile:nth-child(3){border-left:0;}
366
- .band{grid-template-columns:1fr;gap:var(--sec-gap);}
367
- .att__kind{width:auto;}
368
- .att__do{width:100%;}
369
- .task{grid-template-columns:minmax(0,1fr) auto;gap:6px 14px;}
370
- .task__id{grid-column:1;}
371
- .task__credits{grid-column:2;grid-row:1;flex-direction:row;align-items:baseline;gap:6px;}
372
- .task__body{grid-column:1/-1;}
373
- .task__actions{grid-column:1/-1;padding-top:6px;}
374
- .ledger .c-cr{width:70px;}
375
- .ledger .c-wh{width:78px;}
376
- .bulkbar__actions{margin-left:0;width:100%;}
377
- }
378
- </style>
379
- <script>
380
- (function(){try{var q=new URLSearchParams(location.search||location.hash.slice(1)||'').get('mode');
381
- var m=(q==='light'||q==='dark')?q:'dark';
382
- document.documentElement.setAttribute('data-mode',m);
383
- document.documentElement.setAttribute('data-theme',m);}catch(e){}})();
384
- </script>
385
- </head>
386
- <body class="mock" data-state="populated">
387
- <!--
388
- Work board and home in the chrome world, v3 "the glass hall" (task 1003302, goal 1000081).
389
- THESIS The hall gets a ground: one rendered plate under the whole shell in dark, glass chrome over it, and the sidebar living as a 64px rail at every width that expands only on hover or focus.
390
- COMPOSITION First viewport at 1440: the rail, the glass topbar, the greeting, then hall-2's single glass band of four figures divided by vertical hairlines rather than four separate objects. Below it the content sits on --bg-card panels at the full radius, and the board's five ready tasks are panels with no hairline edge at all, tone doing the whole job.
391
- LIGHT In light there is no plate and no frost: light is the same room on paper, never a black panel, so --plate-veil resolves to none, the glass collapses to a faint ink tint at zero blur, and the rail keeps its geometry unchanged.
392
- RISK A photographic ground under twenty-seven dense pages costs legibility and adds a per-page cost the other two do not have, and the rail by default trades discoverability for calm. The hall's plate is not shot yet, so what the owner sees here is the honest fallback: the flat void.
393
- ?state=populated the page with real data
394
- ?state=loading skeletons in the SHAPE of the final content
395
- ?state=empty nothing to show yet
396
- ?state=error the feed failed
397
- ?state=rail the sidebar collapsed to its 64px rail
398
- ?state=drawer the mobile drawer open
399
- ?state=focus keyboard focus rings on the page's real controls
400
- -->
401
- <a class="skip" href="#main">Skip to content</a>
402
-
403
- <div class="app-sidebar" id="app-sidebar">
404
- <div class="app-sidebar__brand">
405
- <a class="brand-mark" href="/" id="brand-mark">
406
- <span class="brand-mark__dot"></span><span class="brand-mark__name">Cloud Bongos</span></a>
407
- </div>
408
- <nav class="app-sidebar__nav" aria-label="Primary">
409
- <div class="nav-group">
410
- <a class="nav-item nav-item--active" id="nav-home" href="/" data-gate="always" aria-current="page">
411
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 6.8L8 2.5l5.5 4.3V13a.5.5 0 0 1-.5.5H3a.5.5 0 0 1-.5-.5z"/></svg>
412
- <span class="nav-item__label">Home</span></a>
413
- <a class="nav-item" id="nav-roadmap" href="/roadmap" data-gate="always">
414
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 4h11M2.5 8h7.5M2.5 12h4.5"/></svg>
415
- <span class="nav-item__label">Roadmap</span></a>
416
- <a class="nav-item" id="nav-goals" href="/goals" data-gate="always">
417
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.2"/><circle cx="8" cy="8" r="1.6"/></svg>
418
- <span class="nav-item__label">Goals</span></a>
419
- <a class="nav-item is-focus" id="nav-work" href="/work" data-gate="always">
420
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 5h11v8h-11z"/><path d="M6 5V3.2h4V5"/></svg>
421
- <span class="nav-item__label">Tasks</span></a>
422
- <a class="nav-item" id="nav-ideas" href="/ideas" data-gate="always">
423
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2.2a4 4 0 0 0-2.4 7.2v1.4h4.8V9.4A4 4 0 0 0 8 2.2z"/><path d="M6.6 13.2h2.8"/></svg>
424
- <span class="nav-item__label">Ideas</span></a>
425
- <a class="nav-item" id="nav-copy-desk" href="/copy-desk" data-gate="always">
426
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M4 2.5h8v11H4z"/><path d="M6 5.6h4M6 8h4M6 10.4h2.6"/></svg>
427
- <span class="nav-item__label">Copy desk</span></a>
428
- </div>
429
- <div class="nav-group nav-group--collapsible" data-group="you">
430
- <button class="nav-group__head" data-gate="signed" data-group="you" aria-expanded="true" aria-controls="nav-items-you" type="button">
431
- <span class="nav-group__head-label">You</span>
432
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4L5 4.8 9 1.4"/></svg></button>
433
- <div class="nav-group__items" id="nav-items-you">
434
- <a class="nav-item" id="nav-standing" href="/#standing" data-gate="signed">
435
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 13.2V8.4M8 13.2V3.6M12.8 13.2V7"/></svg>
436
- <span class="nav-item__label">Standing</span></a>
437
- <a class="nav-item" id="nav-profile" href="/profile" data-gate="signed">
438
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="5.6" r="2.5"/><path d="M3.4 13.4a4.6 4.6 0 0 1 9.2 0"/></svg>
439
- <span class="nav-item__label">Profile</span></a>
440
- </div>
441
- </div>
442
- <div class="nav-group nav-group--collapsible" data-group="community">
443
- <button class="nav-group__head" data-gate="signed" data-group="community" aria-expanded="true" aria-controls="nav-items-community" type="button">
444
- <span class="nav-group__head-label">Community</span>
445
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4L5 4.8 9 1.4"/></svg></button>
446
- <div class="nav-group__items" id="nav-items-community">
447
- <a class="nav-item" id="nav-collab" href="/collab" data-gate="signed">
448
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="5.2" cy="8" r="2.4"/><circle cx="10.8" cy="8" r="2.4"/></svg>
449
- <span class="nav-item__label">Collab</span></a>
450
- <a class="nav-item" id="nav-leaderboard" href="/#leaderboard" data-gate="signed">
451
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5 3h6v3.2a3 3 0 0 1-6 0z"/><path d="M8 9.4v2.8M6 13.4h4"/></svg>
452
- <span class="nav-item__label">Leaderboard</span></a>
453
- <a class="nav-item" id="nav-people" href="/people" data-gate="signed">
454
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="5.6" r="2.2"/><path d="M2.4 13.2a3.8 3.8 0 0 1 7.2 0"/><path d="M10.6 4.4a2.2 2.2 0 0 1 0 4.3M11.6 13.2a3.8 3.8 0 0 0-1.1-2.6"/></svg>
455
- <span class="nav-item__label">People</span></a>
456
- </div>
457
- </div>
458
- <div class="nav-group nav-group--collapsible" data-group="docs">
459
- <button class="nav-group__head" data-gate="always" data-group="docs" aria-expanded="true" aria-controls="nav-items-docs" type="button">
460
- <span class="nav-group__head-label">Docs</span>
461
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4L5 4.8 9 1.4"/></svg></button>
462
- <div class="nav-group__items" id="nav-items-docs">
463
- <a class="nav-item" id="nav-primer" href="/primer" data-gate="always">
464
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.6 3.4h4A1.4 1.4 0 0 1 8 4.8v8a1.2 1.2 0 0 0-1.2-1.1H2.6z"/><path d="M13.4 3.4h-4A1.4 1.4 0 0 0 8 4.8v8a1.2 1.2 0 0 1 1.2-1.1h4.2z"/></svg>
465
- <span class="nav-item__label">Primer</span></a>
466
- <a class="nav-item" id="nav-ranks" href="/ranks" data-gate="always">
467
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.8 8.6L8 5.4l4.2 3.2M3.8 12.2L8 9l4.2 3.2"/></svg>
468
- <span class="nav-item__label">Ranks</span></a>
469
- <a class="nav-item" id="nav-economy" href="/drachmae" data-gate="always">
470
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.2"/><path d="M6.2 6.4h3.6M6.2 9.6h3.6M8 4.8v6.4"/></svg>
471
- <span class="nav-item__label">Economy</span></a>
472
- <a class="nav-item" id="nav-diagrams" href="/diagrams" data-gate="always">
473
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.6 2.8h4v4h-4zM9.4 9.2h4v4h-4z"/><path d="M6.6 4.8h3a1 1 0 0 1 1 1v3.4"/></svg>
474
- <span class="nav-item__label">Diagrams</span></a>
475
- <a class="nav-item" id="nav-atlas" href="/atlas" data-gate="always">
476
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.4"/><path d="M2.7 8h10.6M8 2.6c1.6 1.7 2.4 3.5 2.4 5.4S9.6 11.7 8 13.4C6.4 11.7 5.6 9.9 5.6 8s.8-3.7 2.4-5.4z"/></svg>
477
- <span class="nav-item__label">Repo Atlas</span></a>
478
- <a class="nav-item" id="nav-modules" href="/modules" data-gate="always">
479
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.8 2.8h4.2v4.2H2.8zM9 2.8h4.2v4.2H9zM2.8 9h4.2v4.2H2.8zM9 9h4.2v4.2H9z"/></svg>
480
- <span class="nav-item__label">Modules</span></a>
481
- <a class="nav-item" id="nav-apidocs" href="/docs" data-gate="always">
482
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6 4.6L2.8 8 6 11.4M10 4.6L13.2 8 10 11.4"/></svg>
483
- <span class="nav-item__label">API docs</span></a>
484
- </div>
485
- </div>
486
- <div class="nav-group nav-group--collapsible" data-group="government">
487
- <button class="nav-group__head" data-gate="signed" data-group="government" aria-expanded="true" aria-controls="nav-items-government" type="button">
488
- <span class="nav-group__head-label">Government</span>
489
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4L5 4.8 9 1.4"/></svg></button>
490
- <div class="nav-group__items" id="nav-items-government">
491
- <a class="nav-item" id="nav-watch" href="/watch" data-gate="signed">
492
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M1.6 8S4.2 4.2 8 4.2 14.4 8 14.4 8 11.8 11.8 8 11.8 1.6 8 1.6 8z"/><circle cx="8" cy="8" r="1.7"/></svg>
493
- <span class="nav-item__label">Watch</span></a>
494
- <a class="nav-item" id="nav-harbor" href="/harbor" data-gate="signed">
495
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3.8" r="1.4"/><path d="M8 5.4v8M5 7.2h6M3 9.6a5 5 0 0 0 10 0"/></svg>
496
- <span class="nav-item__label">Harbor</span></a>
497
- <a class="nav-item" id="nav-gate" href="/gate" data-gate="signed">
498
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 13.2V6.2L8 3.2l4.8 3v7"/><path d="M6.4 13.2V9.2h3.2v4"/></svg>
499
- <span class="nav-item__label">Gate</span></a>
500
- <a class="nav-item" id="nav-sessions" href="/sessions" data-gate="signed">
501
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.4"/><path d="M8 4.8V8l2.2 1.6"/></svg>
502
- <span class="nav-item__label">Sessions</span></a>
503
- <a class="nav-item" id="nav-government" href="/government" data-gate="signed">
504
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.4 13.4h11.2M4.2 13.4V7M8 13.4V7M11.8 13.4V7M2.4 6.4L8 3l5.6 3.4z"/></svg>
505
- <span class="nav-item__label">Permissions</span></a>
506
- </div>
507
- </div>
508
- </nav>
509
- <div class="app-sidebar__foot">
510
- <a class="shell-user" id="shell-user" href="/settings" title="Settings">
511
- <span class="shell-user__avatar"></span>
512
- <span class="shell-user__meta">
513
- <span class="shell-user__name">Percy Jackson</span>
514
- <span class="shell-user__rank">Owner</span></span></a>
515
- <a class="shell-home" href="/" title="Back to Cloud Bongos">
516
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 6.8L8 2.5l5.5 4.3V13a.5.5 0 0 1-.5.5H3a.5.5 0 0 1-.5-.5z"/></svg></a>
517
- <a class="shell-signout" href="/api/bongos/auth/logout" title="Sign out">
518
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 3.2H4.2a1 1 0 0 0-1 1v7.6a1 1 0 0 0 1 1h5.2"/><path d="M11 5.8L13.4 8 11 10.2M6.8 8h6.6"/></svg></a>
519
- </div>
520
- </div>
521
- <div class="app-scrim" id="app-scrim"></div>
522
-
523
- <header class="app-topbar" id="app-topbar">
524
- <button class="topbar-menu" id="topbar-menu" aria-label="Open navigation" aria-expanded="false" aria-controls="app-sidebar" type="button">
525
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.4 4.4h11.2M2.4 8h11.2M2.4 11.6h11.2"/></svg></button>
526
- <h2 class="topbar-title">home</h2>
527
- <div class="topbar-side">
528
- <span class="topbar-note">no active claim</span>
529
- <button class="topbar-jump" id="topbar-jump" aria-label="Jump to a page or record" type="button">
530
- <svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="7.2" cy="7.2" r="4.2"/><path d="M10.4 10.4l3 3"/></svg>
531
- <span class="topbar-jump__label">Jump to</span><kbd class="topbar-jump__kbd">Ctrl K</kbd></button>
532
- <button class="zoom-toggle" aria-label="Text size" type="button">
533
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.4 12.4L5.6 3.6l3.2 8.8M3.5 9.6h4.2M10.6 12.4l2.2-5.6 2.2 5.6M11.4 10.6h2.9"/></svg></button>
534
- <button class="theme-toggle" aria-label="Switch theme" type="button">
535
- <svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="3.2"/><path d="M8 1.6v1.6M8 12.8v1.6M1.6 8h1.6M12.8 8h1.6M3.5 3.5l1.1 1.1M11.4 11.4l1.1 1.1M12.5 3.5l-1.1 1.1M4.6 11.4l-1.1 1.1"/></svg></button>
536
- </div>
537
- </header>
538
-
539
- <main class="app-content" id="main">
540
- <div class="wrap">
541
-
542
- <h1 class="greeting">Good morning, Percy Jackson</h1>
543
- <p class="greeting__sub">BONGOS-V1 is 75 percent shipped. Five tasks are claimable right now.</p>
544
-
545
- <!-- ── overview: four figures, each a door to where the figure comes from ── -->
546
- <section class="sec" aria-labelledby="h-overview">
547
- <div class="sec__head"><h2 class="sec__h" id="h-overview">Overview</h2></div>
548
- <div class="tiles" data-off="loading">
549
- <a class="tile" href="/drachmae"><span class="tile__label">Credits</span><span class="tile__num">14,441</span><span class="tile__sub">Second on the board</span></a>
550
- <a class="tile" href="/#standing"><span class="tile__label">Shipped</span><span class="tile__num">241</span><span class="tile__sub">Tasks landed</span></a>
551
- <a class="tile" href="/#standing"><span class="tile__label">Karma</span><span class="tile__num">96</span><span class="tile__sub">Nods from other builders</span></a>
552
- <a class="tile" href="/ranks"><span class="tile__label">Rank</span><span class="tile__num tile__num--word">Owner</span><span class="tile__sub">The archon tier</span></a>
553
- </div>
554
- <div class="tiles" data-off="populated empty error" aria-hidden="true">
555
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
556
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
557
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
558
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
559
- </div>
560
- </section>
561
-
562
- <!-- ── the band of two: standing and goals. Zone budget is 2. ── -->
563
- <section class="sec">
564
- <div class="band">
565
- <article class="card" aria-labelledby="h-standing">
566
- <div class="sec__head"><h2 class="sec__h" id="h-standing">Standing</h2></div>
567
- <div data-off="loading">
568
- <div class="who">
569
- <span class="who__avatar" aria-hidden="true"></span>
570
- <span class="who__meta"><span class="who__name">Percy Jackson</span><span class="who__handle">@jaxri</span></span>
571
- <span class="chip">Owner</span>
572
- </div>
573
- <dl class="facts">
574
- <div><dt>Credits</dt><dd class="num">14,441</dd></div>
575
- <div><dt>On the board</dt><dd class="num">2nd of 4</dd></div>
576
- <div><dt>Preferred work</dt><dd>Not set yet</dd></div>
577
- </dl>
578
- <p class="cardfoot"><a href="/#standing">View full standing</a></p>
579
- </div>
580
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
581
- <div><span class="skel skel--line"></span></div>
582
- <div><span class="skel skel--row"></span></div>
583
- <div><span class="skel skel--row"></span></div>
584
- </div>
585
- </article>
586
-
587
- <article class="card" aria-labelledby="h-goals">
588
- <div class="sec__head"><h2 class="sec__h" id="h-goals">Goals</h2></div>
589
- <div data-off="loading">
590
- <ul class="glist">
591
- <li><span class="g__id">1000081</span><a class="g__t" href="/goals">Builders' hall in the world</a><span class="g__s">open, hall-ui</span></li>
592
- <li><span class="g__id">1000064</span><a class="g__t" href="/goals">The hall as the room</a><span class="g__s">open, hall-ui</span></li>
593
- <li><span class="g__id">1000063</span><a class="g__t" href="/goals">The front door</a><span class="g__s">open, public-landing</span></li>
594
- <li><span class="g__id">1000080</span><a class="g__t" href="/goals">Apex UI pass 2</a><span class="g__s">achieved</span></li>
595
- </ul>
596
- <p class="cardfoot"><a href="/goals">All goals</a></p>
597
- </div>
598
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
599
- <div><span class="skel skel--line"></span></div>
600
- <div><span class="skel skel--line"></span></div>
601
- <div><span class="skel skel--row"></span></div>
602
- </div>
603
- </article>
604
- </div>
605
- </section>
606
-
607
- <!-- ── needs your attention: every new action awaiting the builder is a LINE, never a card ── -->
608
- <section class="sec sec--sheet" aria-labelledby="h-att">
609
- <div class="sec__head"><h2 class="sec__h" id="h-att">Needs your attention</h2><span class="count-pill" data-off="loading empty">4</span></div>
610
- <ul class="att" data-off="loading empty">
611
- <li class="att__row">
612
- <span class="att__kind">Goal invitation</span>
613
- <span class="att__line">lars589 invited you to <a href="/goals">Builders' hall in the world</a></span>
614
- <span class="att__do"><button class="btn" type="button">Accept</button><button class="btn btn--ghost" type="button">Decline</button></span>
615
- </li>
616
- <li class="att__row">
617
- <span class="att__kind">Join request</span>
618
- <span class="att__line">IAMMASTERQUA, Owner, asks to join <a href="/goals">The hall as the room</a></span>
619
- <span class="att__do"><button class="btn" type="button">Approve</button><button class="btn btn--ghost" type="button">Deny</button></span>
620
- </li>
621
- <li class="att__row">
622
- <span class="att__kind">Idea inbox</span>
623
- <span class="att__line">Three ideas are waiting to be triaged</span>
624
- <span class="att__do"><a class="btn" href="/ideas">Triage</a></span>
625
- </li>
626
- <li class="att__row">
627
- <span class="att__kind">Profile</span>
628
- <span class="att__line">Your profile has no preferred work yet, so nobody knows what to send you</span>
629
- <span class="att__do"><a class="btn" href="/profile">Add it</a></span>
630
- </li>
631
- </ul>
632
- <p class="empty-line" data-off="populated loading error">Nothing needs you right now.</p>
633
- <div class="att att--skel" data-off="populated empty error" aria-hidden="true">
634
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
635
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
636
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
637
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
638
- </div>
639
- </section>
640
-
641
- <!-- ── your work ── -->
642
- <section class="sec sec--sheet" aria-labelledby="h-yw">
643
- <div class="sec__head"><h2 class="sec__h" id="h-yw">Your work</h2></div>
644
- <div data-off="loading error">
645
- <h3 class="sub-h">Next up, ready to claim</h3>
646
- <ul class="nextup" data-off="empty">
647
- <li><span class="n__id">1002572</span><span class="n__t">ship.js PART 2: fall back to the push+PR land path when a local merge is impossible</span><span class="n__c">60 credits</span></li>
648
- <li><span class="n__id">1002529</span><span class="n__t">Provisioned instances ignore config/branding.json</span><span class="n__c">50 credits</span></li>
649
- <li><span class="n__id">1003226</span><span class="n__t">main fails its own unit gate: the size ratchet measures 2 over a baseline</span><span class="n__c">25 credits</span></li>
650
- </ul>
651
- <p class="empty-line" data-off="populated">Nothing is ready for you right now.</p>
652
- <p class="cardfoot"><a href="#board">See all ready work</a></p>
653
-
654
- <h3 class="sub-h">Recently shipped</h3>
655
- <table class="ledger" data-off="empty">
656
- <thead><tr><th class="c-id">&#8470;</th><th class="c-t">Work</th><th class="c-cr">Credits</th><th class="c-wh">Shipped</th></tr></thead>
657
- <tbody>
658
- <tr><td class="c-id">1003322</td><td class="c-t">Carve public-landing into a module: manifest, the apex-root web surface, the nested map for a newcomer</td><td class="c-cr">60</td><td class="c-wh">2h ago</td></tr>
659
- <tr><td class="c-id">1003352</td><td class="c-t">Project settings: the card's backdrop, a platform-drawn plate set the owner picks for the poster</td><td class="c-cr">45</td><td class="c-wh">6h ago</td></tr>
660
- <tr><td class="c-id">1003346</td><td class="c-t">The create wizard: the rail above, hairline fields, the review as a ledger</td><td class="c-cr">90</td><td class="c-wh">1d ago</td></tr>
661
- <tr><td class="c-id">1003347</td><td class="c-t">The planet picker: the owner's choice read first on the sky, the list and the card</td><td class="c-cr">75</td><td class="c-wh">1d ago</td></tr>
662
- <tr><td class="c-id">1003337</td><td class="c-t">The space behind the planets: frost, gold and obsidian as real templates</td><td class="c-cr">80</td><td class="c-wh">1d ago</td></tr>
663
- </tbody>
664
- </table>
665
- <p class="empty-line" data-off="populated">Nothing shipped yet. Claim a task on the work board to get started.</p>
666
- <p class="cardfoot"><a href="/work">All your work</a></p>
667
- </div>
668
- <p class="err-line" data-off="populated loading empty">Your work could not be loaded right now. <button class="btn" type="button">Try again</button></p>
669
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
670
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
671
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
672
- <div><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
673
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
674
- <div><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
675
- </div>
676
- </section>
677
-
678
- <!-- ── the work board: the hall's densest surface, on the same hairline grid ── -->
679
- <section class="sec" id="board" aria-labelledby="h-board">
680
- <div class="sec__head">
681
- <h2 class="sec__h" id="h-board">Work board</h2>
682
- <p class="sec__lede">Everything claimable across both versions. Ready is what you can take right now.</p>
683
- </div>
684
-
685
- <div class="tabs" role="tablist" aria-label="Work board views">
686
- <button class="tab" type="button" role="tab" aria-selected="true" aria-controls="board-panel">Ready<span class="count-pill">5</span></button>
687
- <button class="tab is-focus" type="button" role="tab" aria-selected="false">In progress<span class="count-pill">3</span></button>
688
- <button class="tab" type="button" role="tab" aria-selected="false">Backlog<span class="count-pill">41</span></button>
689
- <button class="tab" type="button" role="tab" aria-selected="false">Completed<span class="count-pill">1,176</span></button>
690
- </div>
691
-
692
- <div id="board-panel" role="tabpanel" aria-label="Ready to claim">
693
- <div class="filters">
694
- <label class="field field--search">
695
- <span class="vh">Search tasks</span>
696
- <svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="7.2" cy="7.2" r="4.2"/><path d="M10.4 10.4l3 3"/></svg>
697
- <input id="board-search" class="is-focus" type="search" placeholder="task number, title, or goal">
698
- </label>
699
- <select class="sel" aria-label="Sort">
700
- <option>Credits/min, high to low</option>
701
- <option>Credits, high to low</option>
702
- <option>Minutes, low to high</option>
703
- <option>Priority, P0 first</option>
704
- <option>Stalest first</option>
705
- </select>
706
- <select class="sel" aria-label="Version">
707
- <option>Any version</option><option>BONGOS-V1</option><option>CB-V1</option>
708
- </select>
709
- <select class="sel" aria-label="Goal">
710
- <option>All goals</option><option>Builders' hall in the world</option><option>The front door</option><option>No goal</option>
711
- </select>
712
- <select class="sel" aria-label="Kind">
713
- <option>Any kind</option><option>feature</option><option>bug</option><option>infra</option><option>refactor</option><option>cleanup</option>
714
- </select>
715
- <select class="sel" aria-label="Discipline">
716
- <option>Any discipline</option><option>engineer</option><option>artist</option><option>ideator</option><option>ui</option>
717
- </select>
718
- <label class="sw"><input type="checkbox"><span>Newcomer</span></label>
719
- <label class="sw"><input type="checkbox" checked><span>Fits me</span></label>
720
- </div>
721
-
722
- <p class="countline" data-off="loading empty error"><span class="num">5</span> ready to claim</p>
723
- <p class="countline" data-off="populated empty error" aria-hidden="true"><span class="skel skel--id"></span></p>
724
-
725
- <div class="tasklist" data-off="loading empty error">
726
- <article class="task task--sel" data-task-id="1001479">
727
- <div class="task__id">
728
- <input type="checkbox" class="task__select" checked aria-label="Select task 1001479">
729
- <span class="task__num">1001479</span>
730
- <button class="task__open" type="button" aria-label="Open task 1001479"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.6h4v4M13.4 2.6L8.6 7.4M6.6 3.6H3.4a.8.8 0 0 0-.8.8v7.2a.8.8 0 0 0 .8.8h7.2a.8.8 0 0 0 .8-.8V9.4"/></svg></button>
731
- </div>
732
- <div class="task__body">
733
- <p class="task__title">provision-staging.sh: give the /healthz smoke the same retry/backoff as the deploy</p>
734
- <div class="task__meta">
735
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">infra</span><span class="task__tag">P1</span>
736
- <span class="task__fact">20m</span><span class="task__fact">0.50 credits/min</span><span class="task__fact">1 file</span>
737
- </div>
738
- </div>
739
- <div class="task__credits"><span class="task__credits-num">10</span><span class="task__credits-label">credits est.</span></div>
740
- <div class="task__actions">
741
- <button class="task__claim" type="button">Claim</button>
742
- <button class="task__copy" type="button" aria-label="Copy the task prompt"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 5.6h7v7.8h-7z"/><path d="M10.4 5.6V2.8h-7v7.8h2.2"/></svg></button>
743
- </div>
744
- </article>
745
-
746
- <article class="task task--sel" data-task-id="1002529">
747
- <div class="task__id">
748
- <input type="checkbox" class="task__select" checked aria-label="Select task 1002529">
749
- <span class="task__num">1002529</span>
750
- <button class="task__open" type="button" aria-label="Open task 1002529"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.6h4v4M13.4 2.6L8.6 7.4M6.6 3.6H3.4a.8.8 0 0 0-.8.8v7.2a.8.8 0 0 0 .8.8h7.2a.8.8 0 0 0 .8-.8V9.4"/></svg></button>
751
- </div>
752
- <div class="task__body">
753
- <p class="task__title">Provisioned instances ignore config/branding.json</p>
754
- <div class="task__meta">
755
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">bug</span><span class="task__tag">P1</span>
756
- <span class="task__fact">60m</span><span class="task__fact">0.83 credits/min</span><span class="task__fact">3 files</span>
757
- </div>
758
- </div>
759
- <div class="task__credits"><span class="task__credits-num">50</span><span class="task__credits-label">credits est.</span></div>
760
- <div class="task__actions">
761
- <button class="task__claim" type="button">Claim</button>
762
- <button class="task__copy" type="button" aria-label="Copy the task prompt"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 5.6h7v7.8h-7z"/><path d="M10.4 5.6V2.8h-7v7.8h2.2"/></svg></button>
763
- </div>
764
- </article>
765
-
766
- <article class="task" data-task-id="1002572">
767
- <div class="task__id">
768
- <input type="checkbox" class="task__select" aria-label="Select task 1002572">
769
- <span class="task__num">1002572</span>
770
- <button class="task__open" type="button" aria-label="Open task 1002572"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.6h4v4M13.4 2.6L8.6 7.4M6.6 3.6H3.4a.8.8 0 0 0-.8.8v7.2a.8.8 0 0 0 .8.8h7.2a.8.8 0 0 0 .8-.8V9.4"/></svg></button>
771
- </div>
772
- <div class="task__body">
773
- <p class="task__title">ship.js PART 2: fall back to the push+PR land path when a local merge is impossible</p>
774
- <div class="task__meta">
775
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">bug</span><span class="task__tag">engineer</span><span class="task__tag">P1</span>
776
- <span class="task__fact">60m</span><span class="task__fact">1.00 credits/min</span><span class="task__fact">2 files</span>
777
- </div>
778
- </div>
779
- <div class="task__credits"><span class="task__credits-num">60</span><span class="task__credits-label">credits est.</span></div>
780
- <div class="task__actions">
781
- <button class="task__claim is-focus" type="button">Claim</button>
782
- <button class="task__copy" type="button" aria-label="Copy the task prompt"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 5.6h7v7.8h-7z"/><path d="M10.4 5.6V2.8h-7v7.8h2.2"/></svg></button>
783
- </div>
784
- </article>
785
-
786
- <article class="task" data-task-id="1003226">
787
- <div class="task__id">
788
- <input type="checkbox" class="task__select" aria-label="Select task 1003226">
789
- <span class="task__num">1003226</span>
790
- <button class="task__open" type="button" aria-label="Open task 1003226"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.6h4v4M13.4 2.6L8.6 7.4M6.6 3.6H3.4a.8.8 0 0 0-.8.8v7.2a.8.8 0 0 0 .8.8h7.2a.8.8 0 0 0 .8-.8V9.4"/></svg></button>
791
- </div>
792
- <div class="task__body">
793
- <p class="task__title">main fails its own unit gate: the size ratchet measures 2 over a baseline</p>
794
- <div class="task__meta">
795
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">bug</span><span class="task__tag">P1</span>
796
- <span class="task__fact">45m</span><span class="task__fact">0.56 credits/min</span><span class="task__fact">4 files</span>
797
- </div>
798
- </div>
799
- <div class="task__credits"><span class="task__credits-num">25</span><span class="task__credits-label">credits est.</span></div>
800
- <div class="task__actions">
801
- <button class="task__claim" type="button">Claim</button>
802
- <button class="task__copy" type="button" aria-label="Copy the task prompt"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 5.6h7v7.8h-7z"/><path d="M10.4 5.6V2.8h-7v7.8h2.2"/></svg></button>
803
- </div>
804
- </article>
805
-
806
- <article class="task" data-task-id="1003366">
807
- <div class="task__id">
808
- <input type="checkbox" class="task__select" aria-label="Select task 1003366">
809
- <span class="task__num">1003366</span>
810
- <button class="task__open" type="button" aria-label="Open task 1003366"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.6h4v4M13.4 2.6L8.6 7.4M6.6 3.6H3.4a.8.8 0 0 0-.8.8v7.2a.8.8 0 0 0 .8.8h7.2a.8.8 0 0 0 .8-.8V9.4"/></svg></button>
811
- </div>
812
- <div class="task__body">
813
- <p class="task__title">Add the three gen-* scripts and .gitattributes to protected-surfaces.json</p>
814
- <div class="task__meta">
815
- <span class="task__tag">CB-V1</span><span class="task__tag">infra</span><span class="task__tag">P1</span>
816
- <span class="task__fact">240m</span><span class="task__fact">0.25 credits/min</span><span class="task__fact">6 files</span>
817
- </div>
818
- </div>
819
- <div class="task__credits"><span class="task__credits-num">60</span><span class="task__credits-label">credits est.</span></div>
820
- <div class="task__actions">
821
- <button class="task__claim" type="button">Claim</button>
822
- <button class="task__copy" type="button" aria-label="Copy the task prompt"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 5.6h7v7.8h-7z"/><path d="M10.4 5.6V2.8h-7v7.8h2.2"/></svg></button>
823
- </div>
824
- </article>
825
- </div>
826
-
827
- <!-- the skeleton carries the card's own four-column geometry, not a grey blob -->
828
- <div class="tasklist" data-off="populated empty error" aria-hidden="true">
829
- <div class="task task--skel"><div class="task__id"><span class="skel skel--id"></span></div><div class="task__body"><span class="skel skel--title"></span><span class="skel skel--meta"></span></div><div class="task__credits"><span class="skel skel--cr"></span><span class="skel skel--label"></span></div><div class="task__actions"><span class="skel skel--act"></span></div></div>
830
- <div class="task task--skel"><div class="task__id"><span class="skel skel--id"></span></div><div class="task__body"><span class="skel skel--title"></span><span class="skel skel--meta"></span></div><div class="task__credits"><span class="skel skel--cr"></span><span class="skel skel--label"></span></div><div class="task__actions"><span class="skel skel--act"></span></div></div>
831
- <div class="task task--skel"><div class="task__id"><span class="skel skel--id"></span></div><div class="task__body"><span class="skel skel--title"></span><span class="skel skel--meta"></span></div><div class="task__credits"><span class="skel skel--cr"></span><span class="skel skel--label"></span></div><div class="task__actions"><span class="skel skel--act"></span></div></div>
832
- <div class="task task--skel"><div class="task__id"><span class="skel skel--id"></span></div><div class="task__body"><span class="skel skel--title"></span><span class="skel skel--meta"></span></div><div class="task__credits"><span class="skel skel--cr"></span><span class="skel skel--label"></span></div><div class="task__actions"><span class="skel skel--act"></span></div></div>
833
- <div class="task task--skel"><div class="task__id"><span class="skel skel--id"></span></div><div class="task__body"><span class="skel skel--title"></span><span class="skel skel--meta"></span></div><div class="task__credits"><span class="skel skel--cr"></span><span class="skel skel--label"></span></div><div class="task__actions"><span class="skel skel--act"></span></div></div>
834
- </div>
835
-
836
- <div class="state-block" data-off="populated loading error">
837
- <p class="state-block__t">nothing claimable right now</p>
838
- <p class="state-block__b">No ready task matches these filters, and nothing new has been promoted. Widen the filters, or look at the backlog to see what is still waiting on a dependency.</p>
839
- <p><button class="btn" type="button">Clear the filters</button></p>
840
- </div>
841
-
842
- <div class="state-block" data-off="populated loading empty">
843
- <p class="state-block__t">the task feed failed</p>
844
- <p class="state-block__b">The board could not be loaded right now. Nothing has been claimed or lost, and the rest of the hall above is still live.</p>
845
- <p><button class="btn" type="button">Try again</button></p>
846
- </div>
847
-
848
- <div class="pager" data-off="loading empty error">
849
- <span class="pager__range">Showing 1 to 5 of 5</span>
850
- <div class="pager__nav">
851
- <label class="pager__per"><span>Per page</span><select class="sel" aria-label="Tasks per page"><option>25</option><option>50</option><option>100</option></select></label>
852
- <button class="pager__btn" type="button" disabled>Prev</button>
853
- <span class="pager__page">Page 1 of 1</span>
854
- <button class="pager__btn" type="button" disabled>Next</button>
855
- </div>
856
- </div>
857
- </div>
858
- </section>
859
-
860
- </div>
861
- </main>
862
-
863
- <div class="bulkbar" data-off="loading empty error" role="region" aria-label="Bulk actions">
864
- <span class="bulkbar__count">2 to claim</span>
865
- <div class="bulkbar__actions">
866
- <button class="bulkbar__btn" type="button">Bulk claim (2)</button>
867
- <button class="bulkbar__btn" type="button">Bulk release</button>
868
- <button class="bulkbar__btn" type="button">Copy parallel prompt</button>
869
- <button class="bulkbar__btn" type="button">Copy sequential prompt</button>
870
- <button class="bulkbar__clear" type="button">Clear</button>
871
- </div>
872
- </div>
873
-
874
- <script>
875
- /* the mock's state contract: read ?state= once and apply it. Nothing is built here, and no motion. */
876
- (function () {
877
- var ok = ['populated', 'loading', 'empty', 'error', 'rail', 'drawer', 'focus'];
878
- var s = new URLSearchParams(location.search || location.hash.slice(1) || '').get('state') || 'populated';
879
- if (ok.indexOf(s) === -1) s = 'populated';
880
- document.body.setAttribute('data-state', s);
881
- })();
882
- </script>
883
- </body>
884
- </html>