@bongos/core 1.19.726 → 1.19.728

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 (227) hide show
  1. package/.bongos-core.json +177 -492
  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/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_package.mjs +40 -1
  122. package/tests/cli_token_reissue.mjs +7 -7
  123. package/tests/cloud_bongos_pack.mjs +1 -1
  124. package/tests/currency_label.mjs +8 -8
  125. package/tests/dev_lib.mjs +4 -4
  126. package/tests/devbox_dmg_backdrop.mjs +1 -1
  127. package/tests/devbox_downloads.mjs +2 -2
  128. package/tests/devbox_icons.mjs +1 -1
  129. package/tests/discord_approvals.mjs +1 -1
  130. package/tests/discord_oauth.mjs +2 -2
  131. package/tests/executed_closure.mjs +6 -1
  132. package/tests/first_admin_bootstrap.mjs +1 -1
  133. package/tests/gate_approvals.mjs +5 -5
  134. package/tests/grade_aggregates_unavailable.mjs +1 -1
  135. package/tests/hook_user_agents.mjs +2 -2
  136. package/tests/init.mjs +6 -6
  137. package/tests/instance_config.mjs +1 -1
  138. package/tests/instance_manifest.mjs +5 -5
  139. package/tests/instance_mismatch_guard.mjs +13 -13
  140. package/tests/leak_scan_allowlist.mjs +94 -0
  141. package/tests/migrate_root_resolution.mjs +4 -4
  142. package/tests/mirror_redact.mjs +28 -4
  143. package/tests/module_catalog.mjs +5 -5
  144. package/tests/module_submissions.mjs +3 -3
  145. package/tests/package_core.mjs +1 -1
  146. package/tests/parallel-load.mjs +6 -6
  147. package/tests/projects_hub.mjs +2 -2
  148. package/tests/provision.mjs +50 -50
  149. package/tests/provisioning_github_app_routes.mjs +1 -1
  150. package/tests/provisioning_onboard_mode.mjs +2 -2
  151. package/tests/publish_reconciler.mjs +4 -4
  152. package/tests/sandbox_stage.mjs +1 -1
  153. package/tests/scrubber_corpus.mjs +3 -3
  154. package/tests/search_isolation.mjs +1 -1
  155. package/tests/session_records.mjs +1 -1
  156. package/tests/ship_card.mjs +6 -6
  157. package/tests/ship_ci_deploy.mjs +1 -1
  158. package/tests/single_host_hall.mjs +9 -9
  159. package/tests/smoke_preflight.mjs +1 -1
  160. package/tests/smoke_target.mjs +1 -1
  161. package/tests/status-probe.mjs +1 -1
  162. package/tests/status_mirror_sync.mjs +1 -1
  163. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  164. package/docs/design/mocks/_schemes.css +0 -604
  165. package/docs/design/mocks/component-sheet.html +0 -428
  166. package/docs/design/mocks/hall/_tokens.css +0 -370
  167. package/docs/design/mocks/hall/board/v1.html +0 -846
  168. package/docs/design/mocks/hall/board/v2.html +0 -858
  169. package/docs/design/mocks/hall/board/v3.html +0 -884
  170. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  171. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  172. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  173. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  174. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  175. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  176. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  177. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  178. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  179. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  180. package/docs/design/mocks/hall/task/v1.html +0 -633
  181. package/docs/design/mocks/hall/task/v2.html +0 -646
  182. package/docs/design/mocks/hall/task/v3.html +0 -647
  183. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  184. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  185. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  186. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  187. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  188. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  189. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  190. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  191. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  192. package/docs/design/mocks/hub/mine.html +0 -465
  193. package/docs/design/mocks/hub/picker.html +0 -421
  194. package/docs/design/mocks/hub/planets.html +0 -356
  195. package/docs/design/mocks/hub/v1.html +0 -1209
  196. package/docs/design/mocks/hub/v2.html +0 -1257
  197. package/docs/design/mocks/hub/v3.html +0 -1496
  198. package/docs/design/mocks/hub/wizard.html +0 -421
  199. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  200. package/docs/design/mocks/landing/v1.html +0 -956
  201. package/docs/design/mocks/landing/v2.html +0 -708
  202. package/docs/design/mocks/landing/v3.html +0 -911
  203. package/docs/design/mocks/landing-page-mock.html +0 -687
  204. package/docs/design/mocks/landing-palettes.html +0 -103
  205. package/docs/design/mocks/projects-hub-mock.html +0 -991
  206. package/docs/design/mocks/projects-hub-variants.html +0 -146
  207. package/docs/design/mocks/projects-page-mock.html +0 -167
  208. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  209. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  210. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  211. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  212. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  213. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  214. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  215. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  216. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  217. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  218. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  219. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  220. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  221. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  222. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  223. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  224. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  225. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  226. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  227. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,858 +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, v2 "the sheet" (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
- v2 "the sheet": the owner's light reference brought into the chrome world. Content sits on
16
- --bg-card sheets with a --rule-soft hairline edge and --radius-sm corners, on the --bg ground.
17
- No shadow: a sheet is separated by tone and a hairline, never by lift. */
18
- --shell-pad:20px;
19
- --sidebar-w:244px;
20
- --content-max:1160px;
21
- --sec-air:22px;
22
- --sec-gap:20px;
23
- --row-pad:12px;
24
- --task-gap:10px;
25
- --panel-bg:var(--bg-card);
26
- --panel-edge:var(--rule-soft);
27
- --panel-radius:var(--radius-sm);
28
- --panel-pad:22px;
29
- --tile-gap:14px;
30
- --tile-pad:18px;
31
- --figure:clamp(28px,2.9vw,40px);
32
- --focus-halo:var(--bg);
33
- --nav-item-h:34px;
34
- --claim-h:32px;
35
- margin:0;background:var(--bg);color:var(--ink);
36
- font-family:var(--font-body);font-size:15px;line-height:1.5;
37
- -webkit-font-smoothing:antialiased;
38
- }
39
-
40
- /* ── the floor: every visible control clears 24px on both sides ── */
41
- a,button,input,select,summary{font-family:inherit;font-size:inherit;color:inherit;min-height:24px;}
42
- button,select,input{background:none;border:0;}
43
- button{cursor:pointer;}
44
- .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
45
- .num,.tabular{font-variant-numeric:tabular-nums;}
46
-
47
- /* ── focus: the world's two-tone ring, and the state that shows it without script ── */
48
- :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);}
49
- body[data-state="focus"] .is-focus{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--focus-halo);}
50
- .nav-item:focus-visible,body[data-state="focus"] .nav-item.is-focus{outline-offset:-2px;box-shadow:none;}
51
- .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;}
52
- .skip:focus{left:12px;}
53
-
54
- /* ── the label voice: mono in light, the body face in dark. Never a hard-coded family. ── */
55
- .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;}
56
-
57
- /* ── the shell ── */
58
- .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);}
59
- .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);}
60
- .brand-mark{display:inline-flex;align-items:center;gap:10px;min-height:32px;text-decoration:none;color:var(--ink);}
61
- .brand-mark__dot{width:11px;height:11px;border-radius:50%;border:1px solid var(--ink);flex:none;}
62
- .brand-mark__name{font-weight:500;font-size:15px;letter-spacing:-.015em;white-space:nowrap;}
63
- .app-sidebar__nav{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 0 22px;}
64
- .nav-group{padding:0 0 10px;}
65
- .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;}
66
- .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);}
67
- .nav-group__chevron{width:10px;height:6px;flex:none;stroke:currentColor;stroke-width:1.4;fill:none;color:var(--ink-faint);}
68
- .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;}
69
- .nav-item:hover{color:var(--ink);}
70
- .nav-item__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;}
71
- .nav-icon{width:16px;height:16px;flex:none;stroke:currentColor;stroke-width:1.25;fill:none;stroke-linecap:round;stroke-linejoin:round;}
72
- .app-sidebar__foot{flex:none;display:flex;align-items:center;gap:6px;padding:12px var(--shell-pad);border-top:1px solid var(--rule);}
73
- .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;}
74
- .shell-user__avatar{width:26px;height:26px;flex:none;border-radius:50%;background:var(--bg-deep);border:1px solid var(--rule);}
75
- .shell-user__meta{min-width:0;display:flex;flex-direction:column;}
76
- .shell-user__name{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
77
- .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);}
78
- .shell-home,.shell-signout{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;color:var(--ink-faint);}
79
- .shell-home:hover,.shell-signout:hover{color:var(--ink);}
80
- .shell-home svg,.shell-signout svg{width:15px;height:15px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
81
-
82
- .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);}
83
- .topbar-menu{display:none;align-items:center;justify-content:center;width:32px;height:32px;color:var(--ink-soft);}
84
- .topbar-menu svg,.topbar-jump svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
85
- .topbar-title{margin:0;font-family:var(--font-display);font-weight:300;font-size:19px;letter-spacing:-.025em;text-transform:lowercase;color:var(--ink);}
86
- .topbar-side{margin-left:auto;display:flex;align-items:center;gap:8px;}
87
- .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;}
88
- .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);}
89
- .topbar-jump:hover{border-color:var(--ink-faint);color:var(--ink);}
90
- .topbar-jump__label{font-size:13px;text-transform:lowercase;}
91
- .topbar-jump__kbd{font-family:var(--font-mono);font-size:11px;color:var(--ink-faint);}
92
- .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);}
93
- .zoom-toggle:hover,.theme-toggle:hover{color:var(--ink);}
94
- .zoom-toggle svg,.theme-toggle svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
95
-
96
- .app-scrim{display:none;position:fixed;inset:0;z-index:var(--z-scrim);background:rgba(0,0,0,.55);}
97
- body[data-state="drawer"] .app-scrim{display:block;}
98
-
99
- .app-content{margin-left:var(--sidebar-w);padding:26px var(--shell-pad) 108px;}
100
- .wrap{max-width:var(--content-max);margin:0 auto;}
101
-
102
- /* ── the greeting: hall-1's rhythm, in the label voice ── */
103
- .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);}
104
- .greeting__sub{margin:6px 0 0;font-size:14px;color:var(--ink-soft);}
105
-
106
- .sec{margin-top:var(--sec-air);}
107
- .sec__lede{margin:0;font-size:13px;color:var(--ink-faint);}
108
- .count-pill{font-family:var(--font-mono);font-size:11px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
109
-
110
- .tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--tile-gap);}
111
- .tile{display:flex;flex-direction:column;gap:8px;text-decoration:none;color:var(--ink);}
112
- .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);}
113
- .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);}
114
- .tile__num--word{letter-spacing:-.03em;}
115
- .tile__sub{font-size:12.5px;color:var(--ink-faint);}
116
- .tile:hover .tile__sub{color:var(--ink-soft);}
117
-
118
- .band{display:grid;grid-template-columns:1fr 1fr;gap:var(--sec-gap);}
119
- .card{min-width:0;}
120
- .cardfoot{margin:14px 0 0;}
121
- .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;}
122
- .cardfoot a:hover{color:var(--ink);}
123
-
124
- .who{display:flex;align-items:center;gap:12px;padding-bottom:14px;}
125
- .who__avatar{width:36px;height:36px;flex:none;border-radius:50%;background:var(--bg-deep);border:1px solid var(--rule);}
126
- .who__meta{display:flex;flex-direction:column;min-width:0;}
127
- .who__name{font-weight:500;font-size:15px;}
128
- .who__handle{font-family:var(--font-mono);font-size:12px;color:var(--ink-faint);}
129
- .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;}
130
- .facts{margin:0;display:grid;grid-template-columns:1fr auto;gap:0;}
131
- .facts > div{display:contents;}
132
- .facts dt,.facts dd{border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;margin:0;}
133
- .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);}
134
- .facts dd{text-align:right;font-size:14px;color:var(--ink);font-variant-numeric:tabular-nums;}
135
-
136
- .glist{list-style:none;margin:0;padding:0;}
137
- .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;}
138
- .g__id{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
139
- .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;}
140
- a.g__t:hover{text-decoration:underline;text-underline-offset:3px;}
141
- .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;}
142
-
143
- .att{list-style:none;margin:0;padding:0;}
144
- .att__row{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;border-top:1px solid var(--rule-soft);padding:var(--row-pad) 0;}
145
- .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;}
146
- .att__line{flex:1 1 320px;min-width:0;font-size:14px;color:var(--ink);}
147
- .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;}
148
- .att__do{display:flex;gap:6px;flex:none;}
149
-
150
- .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;}
151
- .btn:hover{border-color:var(--ink-faint);}
152
- .btn--ghost{border-color:transparent;color:var(--ink-soft);}
153
- .btn--ghost:hover{border-color:var(--rule);color:var(--ink);}
154
-
155
- .nextup{list-style:none;margin:0;padding:0;}
156
- .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;}
157
- .nextup .n__id{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
158
- .nextup .n__t{min-width:0;font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
159
- .nextup .n__c{font-size:13px;color:var(--ink-soft);font-variant-numeric:tabular-nums;white-space:nowrap;}
160
- .ledger{width:100%;border-collapse:collapse;table-layout:fixed;}
161
- .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;}
162
- .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;}
163
- .ledger td:last-child,.ledger th:last-child{padding-right:0;text-align:right;}
164
- .ledger .c-id{width:88px;font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
165
- .ledger .c-cr{width:96px;text-align:right;font-variant-numeric:tabular-nums;}
166
- .ledger .c-wh{width:104px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-soft);}
167
- .ledger .c-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
168
-
169
- .tabs{display:flex;gap:0;border-bottom:1px solid var(--rule);margin-bottom:14px;flex-wrap:wrap;}
170
- .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;}
171
- .tab:first-child{padding-left:0;}
172
- .tab:hover{color:var(--ink);}
173
- .tab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--accent);}
174
- .tab[aria-selected="true"] .count-pill{color:var(--accent-ink);}
175
-
176
- .filters{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border-bottom:1px solid var(--rule-soft);padding-bottom:10px;margin-bottom:14px;}
177
- .field{display:flex;align-items:center;gap:8px;min-height:32px;}
178
- .field--search{flex:1 1 200px;min-width:160px;border-bottom:1px solid var(--rule);padding-bottom:2px;}
179
- .field--search svg{width:14px;height:14px;flex:none;stroke:var(--ink-faint);stroke-width:1.3;fill:none;}
180
- .field--search input{flex:1;min-width:0;padding:4px 0;font-size:14px;color:var(--ink);}
181
- .field--search input::placeholder{color:var(--ink-faint);}
182
- .field--search input:focus{outline:none;}
183
- .field--search:focus-within{border-bottom-color:var(--ink);}
184
- .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;
185
- 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;}
186
- .sel:hover{border-color:var(--ink-faint);color:var(--ink);}
187
- .filters .sel{max-width:118px;text-overflow:ellipsis;}
188
- .filters select.sel:first-of-type{max-width:178px;}
189
- .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;}
190
- .sw input{appearance:none;width:24px;height:24px;position:relative;flex:none;cursor:pointer;}
191
- .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);}
192
- .sw input::after{content:"";position:absolute;left:5px;top:9px;width:6px;height:6px;border-radius:50%;background:var(--ink-faint);}
193
- .sw input:checked::before{border-color:var(--accent);background:var(--accent-tint);}
194
- .sw input:checked::after{left:13px;background:var(--accent);}
195
- .sw:hover{border-color:var(--ink-faint);color:var(--ink);}
196
-
197
- .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);}
198
- .countline .num{color:var(--ink);}
199
-
200
- .tasklist{display:grid;gap:var(--task-gap);}
201
- .task{display:grid;grid-template-columns:118px minmax(0,1fr) 104px auto;gap:0 18px;align-items:start;}
202
- .task__id{display:flex;align-items:center;gap:2px;}
203
- .task__select{appearance:none;width:24px;height:24px;position:relative;flex:none;cursor:pointer;}
204
- .task__select::before{content:"";position:absolute;left:5px;top:5px;width:14px;height:14px;border:1px solid var(--rule);border-radius:3px;background:transparent;}
205
- .task__select:checked::before{background:var(--accent);border-color:var(--accent);}
206
- .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);}
207
- .task__num{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
208
- .task__open{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;color:var(--ink-faint);}
209
- .task__open:hover{color:var(--ink);}
210
- .task__open svg,.task__copy svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
211
- .task__body{min-width:0;padding-top:2px;}
212
- .task__title{margin:0 0 7px;font-size:14.5px;line-height:1.4;color:var(--ink);}
213
- .task__meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;}
214
- .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;}
215
- .task__fact{font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
216
- .task__fact + .task__fact::before{content:"·";margin-right:8px;color:var(--rule);}
217
- .task__credits{display:flex;flex-direction:column;align-items:flex-end;gap:2px;padding-top:2px;}
218
- .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);}
219
- .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);}
220
- .task__actions{display:flex;align-items:center;gap:6px;padding-top:2px;}
221
- .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;}
222
- .task__claim:hover{background:var(--accent-lift);}
223
- .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);}
224
- .task__copy:hover{color:var(--ink);border-color:var(--ink-faint);}
225
-
226
- .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;}
227
- .pager__range,.pager__page{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
228
- .pager__nav{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
229
- .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);}
230
- .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;}
231
- .pager__btn:hover:not([disabled]){color:var(--ink);border-color:var(--ink-faint);}
232
- .pager__btn[disabled]{color:var(--ink-faint);border-color:var(--rule-soft);cursor:default;}
233
-
234
- .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);}
235
- .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);}
236
- .bulkbar__actions{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
237
- .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;}
238
- .bulkbar__btn:hover{border-color:var(--ink-faint);}
239
- .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;}
240
- .bulkbar__clear:hover{color:var(--ink);}
241
-
242
- .empty-line,.err-line{margin:0;padding:var(--row-pad) 0;font-size:14px;color:var(--ink-soft);}
243
- .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);}
244
- .state-block__b{margin:0 0 16px;font-size:14px;line-height:1.5;color:var(--ink-soft);}
245
-
246
- /* ── skeletons in the shape of the final content, no shimmer: the world draws no motion here ── */
247
- .skel{display:block;background:var(--rule-soft);border-radius:2px;}
248
- .skel--label{width:64px;height:9px;}
249
- .skel--num{width:104px;height:30px;}
250
- .skel--sub{width:88px;height:9px;}
251
- .skel--title{width:min(560px,86%);height:12px;}
252
- .skel--meta{width:230px;height:9px;}
253
- .skel--id{width:60px;height:10px;}
254
- .skel--cr{width:44px;height:22px;}
255
- .skel--act{width:74px;height:28px;border-radius:var(--radius-pill);}
256
- .skel--line{width:min(420px,70%);height:11px;}
257
- .skel--row{width:min(300px,52%);height:11px;}
258
- .task--skel{align-items:center;}
259
- .task--skel .task__body{display:grid;gap:8px;}
260
- .task--skel .task__credits{align-items:flex-end;gap:6px;}
261
- .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;}
262
-
263
- /* ── the state contract: real markup, shown or hidden by CSS. Nothing is built by script. ── */
264
- body[data-state="loading"] [data-off~="loading"],
265
- body[data-state="empty"] [data-off~="empty"],
266
- body[data-state="error"] [data-off~="error"],
267
- body[data-state="populated"] [data-off~="populated"],
268
- body[data-state="rail"] [data-off~="populated"],
269
- body[data-state="drawer"] [data-off~="populated"],
270
- body[data-state="focus"] [data-off~="populated"]{display:none;}
271
-
272
- /* ══ v2's composition: the sheet ══ */
273
-
274
- /* the sidebar keeps hall-1's grouped mono headings and gains its pinned identity card */
275
- .nav-item{margin:0 10px;padding:0 12px;border-radius:var(--radius-sm);}
276
- .nav-item--active{background:var(--bg-card);color:var(--ink);}
277
- .nav-item--active::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;border-radius:1px;background:var(--accent);}
278
- .nav-group__head{padding-left:22px;padding-right:22px;}
279
- .app-sidebar__brand{padding:0 22px;}
280
- .app-sidebar__foot{margin:0 12px 12px;padding:10px;border-top:0;background:var(--bg-card);border:1px solid var(--rule-soft);border-radius:var(--radius-sm);}
281
-
282
- /* every section head is a mono label closed by a hairline UNDER it: hall-1's card head */
283
- .sec__head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--rule-soft);padding-bottom:10px;margin-bottom:16px;}
284
- .sec__h{margin:0;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-soft);}
285
- .sub-h{margin:20px 0 8px;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);}
286
- .sub-h:first-child{margin-top:0;}
287
-
288
- /* the stat tiles: v2's signature. Four real sheets in a row, hall-1's rhythm exactly. */
289
- .tile{padding:var(--tile-pad);background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);}
290
- .tile:hover{border-color:var(--rule);}
291
-
292
- /* the cards are sheets, and the first row inside one does not double the head's hairline */
293
- .card{background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);padding:var(--panel-pad);}
294
- .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;}
295
- .facts > div:first-child dt,.facts > div:first-child dd{border-top:0;padding-top:0;}
296
- .sec--sheet{background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);padding:var(--panel-pad);}
297
- .sec--sheet .cardfoot:last-child{margin-bottom:0;}
298
-
299
- /* a claimable task is a sheet: an object you can pick up */
300
- .task{background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);padding:15px 18px;}
301
- .task:hover{border-color:var(--rule);}
302
- .task--sel{border-color:var(--rule);}
303
- .task--skel{background:var(--panel-bg);border:1px solid var(--panel-edge);}
304
- .state-block{background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);padding:30px 26px 26px;max-width:none;}
305
- .state-block__b{max-width:56ch;}
306
- .empty-line,.err-line{border-top:0;}
307
- .bulkbar{background:var(--bg-card);}
308
- .pager{border-top:0;background:var(--panel-bg);border:1px solid var(--panel-edge);border-radius:var(--panel-radius);padding:10px 18px;}
309
-
310
- @media (max-width:900px){
311
- body{--sidebar-w:0px;--shell-pad:14px;--figure:clamp(26px,7.4vw,34px);}
312
- .app-sidebar{width:250px;transform:translateX(-100%);z-index:var(--z-drawer);}
313
- .topbar-menu{display:inline-flex;}
314
- .topbar-note,.topbar-jump__kbd{display:none;}
315
- .app-content{padding-bottom:200px;}
316
- .tiles{grid-template-columns:1fr 1fr;}
317
- .band{grid-template-columns:1fr;gap:var(--sec-air);}
318
- .att__kind{width:auto;}
319
- .att__do{width:100%;}
320
- .task{grid-template-columns:minmax(0,1fr) auto;gap:6px 14px;}
321
- .task__id{grid-column:1;}
322
- .task__credits{grid-column:2;grid-row:1;flex-direction:row;align-items:baseline;gap:6px;}
323
- .task__body{grid-column:1/-1;}
324
- .task__actions{grid-column:1/-1;padding-top:6px;}
325
- .ledger .c-cr{width:70px;}
326
- .ledger .c-wh{width:78px;}
327
- .bulkbar{left:0;}
328
- .bulkbar__actions{margin-left:0;width:100%;}
329
- body[data-state="drawer"] .app-sidebar{transform:none;}
330
- }
331
- @media (min-width:901px) and (max-width:1240px){
332
- body{--sidebar-w:var(--sidebar-w-rail);}
333
- .brand-mark__name,.nav-item__label,.nav-group__head-label,.nav-group__chevron,.shell-user__meta{display:none;}
334
- .app-sidebar__brand,.nav-group__head{padding-left:0;padding-right:0;justify-content:center;}
335
- .nav-item{margin:0 8px;padding:0;justify-content:center;}
336
- .app-sidebar__foot{flex-direction:column;gap:8px;margin:0 8px 10px;}
337
- .shell-user{flex:none;justify-content:center;}
338
- }
339
-
340
- /* the rail, pinned by the state contract */
341
- body[data-state="rail"]{--sidebar-w:var(--sidebar-w-rail);}
342
- body[data-state="rail"] .brand-mark__name,
343
- body[data-state="rail"] .nav-item__label,
344
- body[data-state="rail"] .nav-group__head-label,
345
- body[data-state="rail"] .nav-group__chevron,
346
- body[data-state="rail"] .shell-user__meta{display:none;}
347
- body[data-state="rail"] .app-sidebar__brand,
348
- body[data-state="rail"] .nav-group__head{padding-left:0;padding-right:0;justify-content:center;}
349
- body[data-state="rail"] .nav-item{margin:0 8px;padding:0;justify-content:center;}
350
- body[data-state="rail"] .app-sidebar__foot{flex-direction:column;gap:8px;margin:0 8px 10px;}
351
- body[data-state="rail"] .shell-user{flex:none;justify-content:center;}
352
- </style>
353
- <script>
354
- (function(){try{var q=new URLSearchParams(location.search||location.hash.slice(1)||'').get('mode');
355
- var m=(q==='light'||q==='dark')?q:'dark';
356
- document.documentElement.setAttribute('data-mode',m);
357
- document.documentElement.setAttribute('data-theme',m);}catch(e){}})();
358
- </script>
359
- </head>
360
- <body class="mock" data-state="populated">
361
- <!--
362
- Work board and home in the chrome world, v2 "the sheet" (task 1003302, goal 1000081).
363
- THESIS An application surface earns a sheet: content sits on --bg-card with a --rule-soft hairline edge and small corners, separated from the ground by tone and a hairline and never by lift.
364
- COMPOSITION First viewport at 1440: hall-1's rhythm, a grouped sidebar closed by its pinned identity card, the greeting in the label voice, then four real stat tiles as sheets in a row and the Standing and Goals sheets beside each other. Below, the board's tabs and filter row stay on the ground and each of the five ready tasks is its own sheet, so a claimable task reads as an object.
365
- LIGHT Light is where this version was born: the paper ground drops back, the label face sharpens to JetBrains Mono and the sheets read as cards on a desk. Dark keeps the same geometry with the sheet at --bg-card over true black.
366
- RISK It bends DESIGN.md's hairlines-only, no-cards rule. Defensible because this is an application surface and not a poster, but it is a real deviation and the sheet count on one page is what the owner is being asked to accept.
367
- ?state=populated the page with real data
368
- ?state=loading skeletons in the SHAPE of the final content
369
- ?state=empty nothing to show yet
370
- ?state=error the feed failed
371
- ?state=rail the sidebar collapsed to its 64px rail
372
- ?state=drawer the mobile drawer open
373
- ?state=focus keyboard focus rings on the page's real controls
374
- -->
375
- <a class="skip" href="#main">Skip to content</a>
376
-
377
- <div class="app-sidebar" id="app-sidebar">
378
- <div class="app-sidebar__brand">
379
- <a class="brand-mark" href="/" id="brand-mark">
380
- <span class="brand-mark__dot"></span><span class="brand-mark__name">Cloud Bongos</span></a>
381
- </div>
382
- <nav class="app-sidebar__nav" aria-label="Primary">
383
- <div class="nav-group">
384
- <a class="nav-item nav-item--active" id="nav-home" href="/" data-gate="always" aria-current="page">
385
- <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>
386
- <span class="nav-item__label">Home</span></a>
387
- <a class="nav-item" id="nav-roadmap" href="/roadmap" data-gate="always">
388
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 4h11M2.5 8h7.5M2.5 12h4.5"/></svg>
389
- <span class="nav-item__label">Roadmap</span></a>
390
- <a class="nav-item" id="nav-goals" href="/goals" data-gate="always">
391
- <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>
392
- <span class="nav-item__label">Goals</span></a>
393
- <a class="nav-item is-focus" id="nav-work" href="/work" data-gate="always">
394
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 5h11v8h-11z"/><path d="M6 5V3.2h4V5"/></svg>
395
- <span class="nav-item__label">Tasks</span></a>
396
- <a class="nav-item" id="nav-ideas" href="/ideas" data-gate="always">
397
- <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>
398
- <span class="nav-item__label">Ideas</span></a>
399
- <a class="nav-item" id="nav-copy-desk" href="/copy-desk" data-gate="always">
400
- <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>
401
- <span class="nav-item__label">Copy desk</span></a>
402
- </div>
403
- <div class="nav-group nav-group--collapsible" data-group="you">
404
- <button class="nav-group__head" data-gate="signed" data-group="you" aria-expanded="true" aria-controls="nav-items-you" type="button">
405
- <span class="nav-group__head-label">You</span>
406
- <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>
407
- <div class="nav-group__items" id="nav-items-you">
408
- <a class="nav-item" id="nav-standing" href="/#standing" data-gate="signed">
409
- <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>
410
- <span class="nav-item__label">Standing</span></a>
411
- <a class="nav-item" id="nav-profile" href="/profile" data-gate="signed">
412
- <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>
413
- <span class="nav-item__label">Profile</span></a>
414
- </div>
415
- </div>
416
- <div class="nav-group nav-group--collapsible" data-group="community">
417
- <button class="nav-group__head" data-gate="signed" data-group="community" aria-expanded="true" aria-controls="nav-items-community" type="button">
418
- <span class="nav-group__head-label">Community</span>
419
- <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>
420
- <div class="nav-group__items" id="nav-items-community">
421
- <a class="nav-item" id="nav-collab" href="/collab" data-gate="signed">
422
- <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>
423
- <span class="nav-item__label">Collab</span></a>
424
- <a class="nav-item" id="nav-leaderboard" href="/#leaderboard" data-gate="signed">
425
- <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>
426
- <span class="nav-item__label">Leaderboard</span></a>
427
- <a class="nav-item" id="nav-people" href="/people" data-gate="signed">
428
- <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>
429
- <span class="nav-item__label">People</span></a>
430
- </div>
431
- </div>
432
- <div class="nav-group nav-group--collapsible" data-group="docs">
433
- <button class="nav-group__head" data-gate="always" data-group="docs" aria-expanded="true" aria-controls="nav-items-docs" type="button">
434
- <span class="nav-group__head-label">Docs</span>
435
- <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>
436
- <div class="nav-group__items" id="nav-items-docs">
437
- <a class="nav-item" id="nav-primer" href="/primer" data-gate="always">
438
- <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>
439
- <span class="nav-item__label">Primer</span></a>
440
- <a class="nav-item" id="nav-ranks" href="/ranks" data-gate="always">
441
- <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>
442
- <span class="nav-item__label">Ranks</span></a>
443
- <a class="nav-item" id="nav-economy" href="/drachmae" data-gate="always">
444
- <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>
445
- <span class="nav-item__label">Economy</span></a>
446
- <a class="nav-item" id="nav-diagrams" href="/diagrams" data-gate="always">
447
- <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>
448
- <span class="nav-item__label">Diagrams</span></a>
449
- <a class="nav-item" id="nav-atlas" href="/atlas" data-gate="always">
450
- <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>
451
- <span class="nav-item__label">Repo Atlas</span></a>
452
- <a class="nav-item" id="nav-modules" href="/modules" data-gate="always">
453
- <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>
454
- <span class="nav-item__label">Modules</span></a>
455
- <a class="nav-item" id="nav-apidocs" href="/docs" data-gate="always">
456
- <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>
457
- <span class="nav-item__label">API docs</span></a>
458
- </div>
459
- </div>
460
- <div class="nav-group nav-group--collapsible" data-group="government">
461
- <button class="nav-group__head" data-gate="signed" data-group="government" aria-expanded="true" aria-controls="nav-items-government" type="button">
462
- <span class="nav-group__head-label">Government</span>
463
- <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>
464
- <div class="nav-group__items" id="nav-items-government">
465
- <a class="nav-item" id="nav-watch" href="/watch" data-gate="signed">
466
- <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>
467
- <span class="nav-item__label">Watch</span></a>
468
- <a class="nav-item" id="nav-harbor" href="/harbor" data-gate="signed">
469
- <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>
470
- <span class="nav-item__label">Harbor</span></a>
471
- <a class="nav-item" id="nav-gate" href="/gate" data-gate="signed">
472
- <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>
473
- <span class="nav-item__label">Gate</span></a>
474
- <a class="nav-item" id="nav-sessions" href="/sessions" data-gate="signed">
475
- <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>
476
- <span class="nav-item__label">Sessions</span></a>
477
- <a class="nav-item" id="nav-government" href="/government" data-gate="signed">
478
- <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>
479
- <span class="nav-item__label">Permissions</span></a>
480
- </div>
481
- </div>
482
- </nav>
483
- <div class="app-sidebar__foot">
484
- <a class="shell-user" id="shell-user" href="/settings" title="Settings">
485
- <span class="shell-user__avatar"></span>
486
- <span class="shell-user__meta">
487
- <span class="shell-user__name">Percy Jackson</span>
488
- <span class="shell-user__rank">Owner</span></span></a>
489
- <a class="shell-home" href="/" title="Back to Cloud Bongos">
490
- <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>
491
- <a class="shell-signout" href="/api/bongos/auth/logout" title="Sign out">
492
- <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>
493
- </div>
494
- </div>
495
- <div class="app-scrim" id="app-scrim"></div>
496
-
497
- <header class="app-topbar" id="app-topbar">
498
- <button class="topbar-menu" id="topbar-menu" aria-label="Open navigation" aria-expanded="false" aria-controls="app-sidebar" type="button">
499
- <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>
500
- <h2 class="topbar-title">home</h2>
501
- <div class="topbar-side">
502
- <span class="topbar-note">no active claim</span>
503
- <button class="topbar-jump" id="topbar-jump" aria-label="Jump to a page or record" type="button">
504
- <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>
505
- <span class="topbar-jump__label">Jump to</span><kbd class="topbar-jump__kbd">Ctrl K</kbd></button>
506
- <button class="zoom-toggle" aria-label="Text size" type="button">
507
- <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>
508
- <button class="theme-toggle" aria-label="Switch theme" type="button">
509
- <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>
510
- </div>
511
- </header>
512
-
513
- <main class="app-content" id="main">
514
- <div class="wrap">
515
-
516
- <h1 class="greeting">Good morning, Percy Jackson</h1>
517
- <p class="greeting__sub">BONGOS-V1 is 75 percent shipped. Five tasks are claimable right now.</p>
518
-
519
- <!-- ── overview: four figures, each a door to where the figure comes from ── -->
520
- <section class="sec" aria-labelledby="h-overview">
521
- <div class="sec__head"><h2 class="sec__h" id="h-overview">Overview</h2></div>
522
- <div class="tiles" data-off="loading">
523
- <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>
524
- <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>
525
- <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>
526
- <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>
527
- </div>
528
- <div class="tiles" data-off="populated empty error" aria-hidden="true">
529
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
530
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
531
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
532
- <div class="tile"><span class="skel skel--label"></span><span class="skel skel--num"></span><span class="skel skel--sub"></span></div>
533
- </div>
534
- </section>
535
-
536
- <!-- ── the band of two: standing and goals. Zone budget is 2. ── -->
537
- <section class="sec">
538
- <div class="band">
539
- <article class="card" aria-labelledby="h-standing">
540
- <div class="sec__head"><h2 class="sec__h" id="h-standing">Standing</h2></div>
541
- <div data-off="loading">
542
- <div class="who">
543
- <span class="who__avatar" aria-hidden="true"></span>
544
- <span class="who__meta"><span class="who__name">Percy Jackson</span><span class="who__handle">@jaxri</span></span>
545
- <span class="chip">Owner</span>
546
- </div>
547
- <dl class="facts">
548
- <div><dt>Credits</dt><dd class="num">14,441</dd></div>
549
- <div><dt>On the board</dt><dd class="num">2nd of 4</dd></div>
550
- <div><dt>Preferred work</dt><dd>Not set yet</dd></div>
551
- </dl>
552
- <p class="cardfoot"><a href="/#standing">View full standing</a></p>
553
- </div>
554
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
555
- <div><span class="skel skel--line"></span></div>
556
- <div><span class="skel skel--row"></span></div>
557
- <div><span class="skel skel--row"></span></div>
558
- </div>
559
- </article>
560
-
561
- <article class="card" aria-labelledby="h-goals">
562
- <div class="sec__head"><h2 class="sec__h" id="h-goals">Goals</h2></div>
563
- <div data-off="loading">
564
- <ul class="glist">
565
- <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>
566
- <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>
567
- <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>
568
- <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>
569
- </ul>
570
- <p class="cardfoot"><a href="/goals">All goals</a></p>
571
- </div>
572
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
573
- <div><span class="skel skel--line"></span></div>
574
- <div><span class="skel skel--line"></span></div>
575
- <div><span class="skel skel--row"></span></div>
576
- </div>
577
- </article>
578
- </div>
579
- </section>
580
-
581
- <!-- ── needs your attention: every new action awaiting the builder is a LINE, never a card ── -->
582
- <section class="sec sec--sheet" aria-labelledby="h-att">
583
- <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>
584
- <ul class="att" data-off="loading empty">
585
- <li class="att__row">
586
- <span class="att__kind">Goal invitation</span>
587
- <span class="att__line">lars589 invited you to <a href="/goals">Builders' hall in the world</a></span>
588
- <span class="att__do"><button class="btn" type="button">Accept</button><button class="btn btn--ghost" type="button">Decline</button></span>
589
- </li>
590
- <li class="att__row">
591
- <span class="att__kind">Join request</span>
592
- <span class="att__line">IAMMASTERQUA, Owner, asks to join <a href="/goals">The hall as the room</a></span>
593
- <span class="att__do"><button class="btn" type="button">Approve</button><button class="btn btn--ghost" type="button">Deny</button></span>
594
- </li>
595
- <li class="att__row">
596
- <span class="att__kind">Idea inbox</span>
597
- <span class="att__line">Three ideas are waiting to be triaged</span>
598
- <span class="att__do"><a class="btn" href="/ideas">Triage</a></span>
599
- </li>
600
- <li class="att__row">
601
- <span class="att__kind">Profile</span>
602
- <span class="att__line">Your profile has no preferred work yet, so nobody knows what to send you</span>
603
- <span class="att__do"><a class="btn" href="/profile">Add it</a></span>
604
- </li>
605
- </ul>
606
- <p class="empty-line" data-off="populated loading error">Nothing needs you right now.</p>
607
- <div class="att att--skel" data-off="populated empty error" aria-hidden="true">
608
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
609
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
610
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
611
- <div class="att__row"><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
612
- </div>
613
- </section>
614
-
615
- <!-- ── your work ── -->
616
- <section class="sec sec--sheet" aria-labelledby="h-yw">
617
- <div class="sec__head"><h2 class="sec__h" id="h-yw">Your work</h2></div>
618
- <div data-off="loading error">
619
- <h3 class="sub-h">Next up, ready to claim</h3>
620
- <ul class="nextup" data-off="empty">
621
- <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>
622
- <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>
623
- <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>
624
- </ul>
625
- <p class="empty-line" data-off="populated">Nothing is ready for you right now.</p>
626
- <p class="cardfoot"><a href="#board">See all ready work</a></p>
627
-
628
- <h3 class="sub-h">Recently shipped</h3>
629
- <table class="ledger" data-off="empty">
630
- <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>
631
- <tbody>
632
- <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>
633
- <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>
634
- <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>
635
- <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>
636
- <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>
637
- </tbody>
638
- </table>
639
- <p class="empty-line" data-off="populated">Nothing shipped yet. Claim a task on the work board to get started.</p>
640
- <p class="cardfoot"><a href="/work">All your work</a></p>
641
- </div>
642
- <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>
643
- <div class="rows--skel" data-off="populated empty error" aria-hidden="true">
644
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
645
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
646
- <div><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
647
- <div><span class="skel skel--id"></span><span class="skel skel--line"></span></div>
648
- <div><span class="skel skel--id"></span><span class="skel skel--row"></span></div>
649
- </div>
650
- </section>
651
-
652
- <!-- ── the work board: the hall's densest surface, on the same hairline grid ── -->
653
- <section class="sec" id="board" aria-labelledby="h-board">
654
- <div class="sec__head">
655
- <h2 class="sec__h" id="h-board">Work board</h2>
656
- <p class="sec__lede">Everything claimable across both versions. Ready is what you can take right now.</p>
657
- </div>
658
-
659
- <div class="tabs" role="tablist" aria-label="Work board views">
660
- <button class="tab" type="button" role="tab" aria-selected="true" aria-controls="board-panel">Ready<span class="count-pill">5</span></button>
661
- <button class="tab is-focus" type="button" role="tab" aria-selected="false">In progress<span class="count-pill">3</span></button>
662
- <button class="tab" type="button" role="tab" aria-selected="false">Backlog<span class="count-pill">41</span></button>
663
- <button class="tab" type="button" role="tab" aria-selected="false">Completed<span class="count-pill">1,176</span></button>
664
- </div>
665
-
666
- <div id="board-panel" role="tabpanel" aria-label="Ready to claim">
667
- <div class="filters">
668
- <label class="field field--search">
669
- <span class="vh">Search tasks</span>
670
- <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>
671
- <input id="board-search" class="is-focus" type="search" placeholder="task number, title, or goal">
672
- </label>
673
- <select class="sel" aria-label="Sort">
674
- <option>Credits/min, high to low</option>
675
- <option>Credits, high to low</option>
676
- <option>Minutes, low to high</option>
677
- <option>Priority, P0 first</option>
678
- <option>Stalest first</option>
679
- </select>
680
- <select class="sel" aria-label="Version">
681
- <option>Any version</option><option>BONGOS-V1</option><option>CB-V1</option>
682
- </select>
683
- <select class="sel" aria-label="Goal">
684
- <option>All goals</option><option>Builders' hall in the world</option><option>The front door</option><option>No goal</option>
685
- </select>
686
- <select class="sel" aria-label="Kind">
687
- <option>Any kind</option><option>feature</option><option>bug</option><option>infra</option><option>refactor</option><option>cleanup</option>
688
- </select>
689
- <select class="sel" aria-label="Discipline">
690
- <option>Any discipline</option><option>engineer</option><option>artist</option><option>ideator</option><option>ui</option>
691
- </select>
692
- <label class="sw"><input type="checkbox"><span>Newcomer</span></label>
693
- <label class="sw"><input type="checkbox" checked><span>Fits me</span></label>
694
- </div>
695
-
696
- <p class="countline" data-off="loading empty error"><span class="num">5</span> ready to claim</p>
697
- <p class="countline" data-off="populated empty error" aria-hidden="true"><span class="skel skel--id"></span></p>
698
-
699
- <div class="tasklist" data-off="loading empty error">
700
- <article class="task task--sel" data-task-id="1001479">
701
- <div class="task__id">
702
- <input type="checkbox" class="task__select" checked aria-label="Select task 1001479">
703
- <span class="task__num">1001479</span>
704
- <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>
705
- </div>
706
- <div class="task__body">
707
- <p class="task__title">provision-staging.sh: give the /healthz smoke the same retry/backoff as the deploy</p>
708
- <div class="task__meta">
709
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">infra</span><span class="task__tag">P1</span>
710
- <span class="task__fact">20m</span><span class="task__fact">0.50 credits/min</span><span class="task__fact">1 file</span>
711
- </div>
712
- </div>
713
- <div class="task__credits"><span class="task__credits-num">10</span><span class="task__credits-label">credits est.</span></div>
714
- <div class="task__actions">
715
- <button class="task__claim" type="button">Claim</button>
716
- <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>
717
- </div>
718
- </article>
719
-
720
- <article class="task task--sel" data-task-id="1002529">
721
- <div class="task__id">
722
- <input type="checkbox" class="task__select" checked aria-label="Select task 1002529">
723
- <span class="task__num">1002529</span>
724
- <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>
725
- </div>
726
- <div class="task__body">
727
- <p class="task__title">Provisioned instances ignore config/branding.json</p>
728
- <div class="task__meta">
729
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">bug</span><span class="task__tag">P1</span>
730
- <span class="task__fact">60m</span><span class="task__fact">0.83 credits/min</span><span class="task__fact">3 files</span>
731
- </div>
732
- </div>
733
- <div class="task__credits"><span class="task__credits-num">50</span><span class="task__credits-label">credits est.</span></div>
734
- <div class="task__actions">
735
- <button class="task__claim" type="button">Claim</button>
736
- <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>
737
- </div>
738
- </article>
739
-
740
- <article class="task" data-task-id="1002572">
741
- <div class="task__id">
742
- <input type="checkbox" class="task__select" aria-label="Select task 1002572">
743
- <span class="task__num">1002572</span>
744
- <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>
745
- </div>
746
- <div class="task__body">
747
- <p class="task__title">ship.js PART 2: fall back to the push+PR land path when a local merge is impossible</p>
748
- <div class="task__meta">
749
- <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>
750
- <span class="task__fact">60m</span><span class="task__fact">1.00 credits/min</span><span class="task__fact">2 files</span>
751
- </div>
752
- </div>
753
- <div class="task__credits"><span class="task__credits-num">60</span><span class="task__credits-label">credits est.</span></div>
754
- <div class="task__actions">
755
- <button class="task__claim is-focus" type="button">Claim</button>
756
- <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>
757
- </div>
758
- </article>
759
-
760
- <article class="task" data-task-id="1003226">
761
- <div class="task__id">
762
- <input type="checkbox" class="task__select" aria-label="Select task 1003226">
763
- <span class="task__num">1003226</span>
764
- <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>
765
- </div>
766
- <div class="task__body">
767
- <p class="task__title">main fails its own unit gate: the size ratchet measures 2 over a baseline</p>
768
- <div class="task__meta">
769
- <span class="task__tag">BONGOS-V1</span><span class="task__tag">bug</span><span class="task__tag">P1</span>
770
- <span class="task__fact">45m</span><span class="task__fact">0.56 credits/min</span><span class="task__fact">4 files</span>
771
- </div>
772
- </div>
773
- <div class="task__credits"><span class="task__credits-num">25</span><span class="task__credits-label">credits est.</span></div>
774
- <div class="task__actions">
775
- <button class="task__claim" type="button">Claim</button>
776
- <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>
777
- </div>
778
- </article>
779
-
780
- <article class="task" data-task-id="1003366">
781
- <div class="task__id">
782
- <input type="checkbox" class="task__select" aria-label="Select task 1003366">
783
- <span class="task__num">1003366</span>
784
- <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>
785
- </div>
786
- <div class="task__body">
787
- <p class="task__title">Add the three gen-* scripts and .gitattributes to protected-surfaces.json</p>
788
- <div class="task__meta">
789
- <span class="task__tag">CB-V1</span><span class="task__tag">infra</span><span class="task__tag">P1</span>
790
- <span class="task__fact">240m</span><span class="task__fact">0.25 credits/min</span><span class="task__fact">6 files</span>
791
- </div>
792
- </div>
793
- <div class="task__credits"><span class="task__credits-num">60</span><span class="task__credits-label">credits est.</span></div>
794
- <div class="task__actions">
795
- <button class="task__claim" type="button">Claim</button>
796
- <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>
797
- </div>
798
- </article>
799
- </div>
800
-
801
- <!-- the skeleton carries the card's own four-column geometry, not a grey blob -->
802
- <div class="tasklist" data-off="populated empty error" aria-hidden="true">
803
- <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>
804
- <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>
805
- <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>
806
- <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>
807
- <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>
808
- </div>
809
-
810
- <div class="state-block" data-off="populated loading error">
811
- <p class="state-block__t">nothing claimable right now</p>
812
- <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>
813
- <p><button class="btn" type="button">Clear the filters</button></p>
814
- </div>
815
-
816
- <div class="state-block" data-off="populated loading empty">
817
- <p class="state-block__t">the task feed failed</p>
818
- <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>
819
- <p><button class="btn" type="button">Try again</button></p>
820
- </div>
821
-
822
- <div class="pager" data-off="loading empty error">
823
- <span class="pager__range">Showing 1 to 5 of 5</span>
824
- <div class="pager__nav">
825
- <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>
826
- <button class="pager__btn" type="button" disabled>Prev</button>
827
- <span class="pager__page">Page 1 of 1</span>
828
- <button class="pager__btn" type="button" disabled>Next</button>
829
- </div>
830
- </div>
831
- </div>
832
- </section>
833
-
834
- </div>
835
- </main>
836
-
837
- <div class="bulkbar" data-off="loading empty error" role="region" aria-label="Bulk actions">
838
- <span class="bulkbar__count">2 to claim</span>
839
- <div class="bulkbar__actions">
840
- <button class="bulkbar__btn" type="button">Bulk claim (2)</button>
841
- <button class="bulkbar__btn" type="button">Bulk release</button>
842
- <button class="bulkbar__btn" type="button">Copy parallel prompt</button>
843
- <button class="bulkbar__btn" type="button">Copy sequential prompt</button>
844
- <button class="bulkbar__clear" type="button">Clear</button>
845
- </div>
846
- </div>
847
-
848
- <script>
849
- /* the mock's state contract: read ?state= once and apply it. Nothing is built here, and no motion. */
850
- (function () {
851
- var ok = ['populated', 'loading', 'empty', 'error', 'rail', 'drawer', 'focus'];
852
- var s = new URLSearchParams(location.search || location.hash.slice(1) || '').get('state') || 'populated';
853
- if (ok.indexOf(s) === -1) s = 'populated';
854
- document.body.setAttribute('data-state', s);
855
- })();
856
- </script>
857
- </body>
858
- </html>