@bongos/core 1.19.726 → 1.19.727

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