@bongos/core 1.19.725 → 1.19.727

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/.bongos-core.json +179 -494
  2. package/.devcontainer/Dockerfile +1 -1
  3. package/.devcontainer/devcontainer.json +2 -2
  4. package/.devcontainer/healthcheck.sh +1 -1
  5. package/.devcontainer/init-firewall.sh +1 -1
  6. package/.devcontainer/post-create.sh +2 -2
  7. package/.env.local.example +1 -1
  8. package/Dockerfile +1 -1
  9. package/docs/copy-inventory.md +1 -1
  10. package/docs/copy-registry.json +9 -9
  11. package/docs/module-api-changelog.md +4 -0
  12. package/docs/recipes/devbox-app-release.md +4 -4
  13. package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
  14. package/modules/dev-box/app/scripts/gen-brand.js +1 -1
  15. package/modules/dev-box/app/src/brand.js +1 -1
  16. package/modules/dev-box/app/test/unit.mjs +16 -16
  17. package/modules/dev-box/box-access.js +1 -1
  18. package/modules/dev-box/routes/box.js +1 -1
  19. package/modules/discord/discord-approvals.js +1 -1
  20. package/modules/grading/grader-model.js +1 -1
  21. package/modules/grading/grader-prompt.js +1 -1
  22. package/modules/grading/grader-workers/quality.js +1 -1
  23. package/modules/hall-ui/module.json +1 -1
  24. package/modules/hall-ui/public/brand-apply.js +1 -1
  25. package/modules/hall-ui/public/shell.js +1 -1
  26. package/modules/hall-ui/public/work.js +1 -1
  27. package/modules/lifecycle/conflict-resolve.js +1 -1
  28. package/modules/lifecycle/db-analytics.js +1 -1
  29. package/modules/lifecycle/routes/analytics.js +1 -1
  30. package/modules/onboarding/approval-broadcast.js +1 -1
  31. package/modules/onboarding/onboarding.js +1 -1
  32. package/modules/provisioning/tests/liveness.mjs +1 -1
  33. package/modules/public-landing/public/index.html +1 -1
  34. package/modules/public-landing/public/projects-floor.states.json +2 -2
  35. package/modules/public-landing/public/projects.probes.json +4 -4
  36. package/modules/public-landing/public/projects.states.json +2 -2
  37. package/modules/status-ui/module.json +1 -1
  38. package/modules/status-ui/public/status.js +4 -4
  39. package/modules/status-ui/public/style.css +1 -1
  40. package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
  41. package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
  42. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  43. package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
  44. package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
  45. package/modules/ui-design/kit/fixtures/progress.json +1 -1
  46. package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/scripts/cron/style_guide_audit.sh +1 -1
  50. package/scripts/discord/lib.js +1 -1
  51. package/scripts/discord/post.js +1 -1
  52. package/scripts/gds/audit-authorship.sh +1 -1
  53. package/scripts/gds/audit-replay.sh +29 -2
  54. package/scripts/gds/audit-ships.js +1 -1
  55. package/scripts/gds/backfill-sessions.js +2 -2
  56. package/scripts/gds/cf-tunnel.js +4 -4
  57. package/scripts/gds/claude-materialize.js +2 -2
  58. package/scripts/gds/cli-lib.js +6 -6
  59. package/scripts/gds/cutover-codemod.js +1 -1
  60. package/scripts/gds/dev-lib.js +2 -2
  61. package/scripts/gds/diagnose-achievements.js +2 -2
  62. package/scripts/gds/fitness-checks-identity.js +6 -4
  63. package/scripts/gds/gate-review.js +14 -6
  64. package/scripts/gds/gen-diagrams.js +1 -1
  65. package/scripts/gds/leak-scan-allowlist.js +293 -0
  66. package/scripts/gds/learning-capture.js +1 -1
  67. package/scripts/gds/linkify-refs.js +2 -2
  68. package/scripts/gds/local-preview-lib.js +1 -1
  69. package/scripts/gds/mirror-lineage-check.js +1 -1
  70. package/scripts/gds/mirror-redact.js +17 -2
  71. package/scripts/gds/newcomer-floor.templates.json +1 -1
  72. package/scripts/gds/package-core.js +18 -1
  73. package/scripts/gds/paste-token.js +1 -1
  74. package/scripts/gds/provision-units.js +2 -2
  75. package/scripts/gds/publish-manifest.js +15 -0
  76. package/scripts/gds/repo-metrics.js +1 -1
  77. package/scripts/gds/sandbox-stage.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  81. package/scripts/gds/seed-bongos-tasks.js +2 -2
  82. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  83. package/scripts/gds/seed-medusa-tasks.js +10 -10
  84. package/scripts/gds/seed-module-upstreaming.js +1 -1
  85. package/scripts/gds/seed-productization-tasks.js +6 -6
  86. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  87. package/scripts/gds/seed-staging.sh +19 -6
  88. package/scripts/gds/ship-deploy-target.js +1 -1
  89. package/scripts/gds/ship-flow.js +1 -1
  90. package/scripts/gds/smoke-gds.js +1 -1
  91. package/scripts/status-probe.mjs +2 -2
  92. package/src/bongos/auth-discord.js +2 -2
  93. package/src/bongos/live-channel.js +1 -1
  94. package/src/bongos/permission-path-check.js +80 -3
  95. package/src/bongos/pool.js +1 -1
  96. package/src/bongos/routes/auth.js +11 -11
  97. package/src/bongos/routes/security.js +1 -1
  98. package/src/bongos/routes.js +1 -1
  99. package/src/branding.js +1 -1
  100. package/src/devbox-downloads.js +1 -1
  101. package/src/instance-config.js +2 -2
  102. package/src/module-api.js +1 -1
  103. package/src/module-loader/provenance.js +2 -2
  104. package/tests/art_stage.mjs +2 -2
  105. package/tests/auth_anthropic_identity.mjs +1 -1
  106. package/tests/auth_duplicate_cookie.mjs +1 -1
  107. package/tests/auth_error_brand.mjs +1 -1
  108. package/tests/auth_inactive_builder.mjs +1 -1
  109. package/tests/backup_cli.mjs +4 -4
  110. package/tests/bongos_box_connect.mjs +2 -2
  111. package/tests/bongos_downloads.mjs +2 -2
  112. package/tests/bongos_login.mjs +5 -5
  113. package/tests/box_connect_e2e.mjs +2 -2
  114. package/tests/box_dns_repoint.mjs +10 -10
  115. package/tests/box_host_keys.mjs +1 -1
  116. package/tests/box_onboard.mjs +9 -9
  117. package/tests/box_scope_session.mjs +1 -1
  118. package/tests/box_terminal_ssrf.mjs +7 -7
  119. package/tests/boxes.mjs +9 -9
  120. package/tests/branding.mjs +2 -2
  121. package/tests/bump_version.mjs +2 -2
  122. package/tests/cf_tunnel.mjs +40 -40
  123. package/tests/cli_token_reissue.mjs +7 -7
  124. package/tests/cloud_bongos_pack.mjs +1 -1
  125. package/tests/currency_label.mjs +8 -8
  126. package/tests/dev_lib.mjs +4 -4
  127. package/tests/devbox_dmg_backdrop.mjs +1 -1
  128. package/tests/devbox_downloads.mjs +2 -2
  129. package/tests/devbox_icons.mjs +1 -1
  130. package/tests/discord_approvals.mjs +1 -1
  131. package/tests/discord_oauth.mjs +2 -2
  132. package/tests/executed_closure.mjs +6 -1
  133. package/tests/first_admin_bootstrap.mjs +1 -1
  134. package/tests/gate_approvals.mjs +5 -5
  135. package/tests/government_protected_surfaces.mjs +137 -0
  136. package/tests/grade_aggregates_unavailable.mjs +1 -1
  137. package/tests/hook_user_agents.mjs +2 -2
  138. package/tests/init.mjs +6 -6
  139. package/tests/instance_config.mjs +1 -1
  140. package/tests/instance_manifest.mjs +5 -5
  141. package/tests/instance_mismatch_guard.mjs +13 -13
  142. package/tests/leak_scan_allowlist.mjs +94 -0
  143. package/tests/migrate_root_resolution.mjs +4 -4
  144. package/tests/mirror_redact.mjs +28 -4
  145. package/tests/module_catalog.mjs +5 -5
  146. package/tests/module_submissions.mjs +3 -3
  147. package/tests/package_core.mjs +1 -1
  148. package/tests/parallel-load.mjs +6 -6
  149. package/tests/projects_hub.mjs +2 -2
  150. package/tests/provision.mjs +50 -50
  151. package/tests/provisioning_github_app_routes.mjs +1 -1
  152. package/tests/provisioning_onboard_mode.mjs +2 -2
  153. package/tests/publish_reconciler.mjs +4 -4
  154. package/tests/sandbox_stage.mjs +1 -1
  155. package/tests/scrubber_corpus.mjs +3 -3
  156. package/tests/search_isolation.mjs +1 -1
  157. package/tests/session_records.mjs +1 -1
  158. package/tests/ship_card.mjs +6 -6
  159. package/tests/ship_ci_deploy.mjs +1 -1
  160. package/tests/single_host_hall.mjs +9 -9
  161. package/tests/smoke_preflight.mjs +1 -1
  162. package/tests/smoke_target.mjs +1 -1
  163. package/tests/status-probe.mjs +1 -1
  164. package/tests/status_mirror_sync.mjs +1 -1
  165. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  166. package/docs/design/mocks/_schemes.css +0 -604
  167. package/docs/design/mocks/component-sheet.html +0 -428
  168. package/docs/design/mocks/hall/_tokens.css +0 -370
  169. package/docs/design/mocks/hall/board/v1.html +0 -846
  170. package/docs/design/mocks/hall/board/v2.html +0 -858
  171. package/docs/design/mocks/hall/board/v3.html +0 -884
  172. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  173. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  174. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  175. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  176. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  177. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  178. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  179. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  180. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  181. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  182. package/docs/design/mocks/hall/task/v1.html +0 -633
  183. package/docs/design/mocks/hall/task/v2.html +0 -646
  184. package/docs/design/mocks/hall/task/v3.html +0 -647
  185. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  186. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  187. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  188. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  189. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  190. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  191. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  192. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  193. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  194. package/docs/design/mocks/hub/mine.html +0 -465
  195. package/docs/design/mocks/hub/picker.html +0 -421
  196. package/docs/design/mocks/hub/planets.html +0 -356
  197. package/docs/design/mocks/hub/v1.html +0 -1209
  198. package/docs/design/mocks/hub/v2.html +0 -1257
  199. package/docs/design/mocks/hub/v3.html +0 -1496
  200. package/docs/design/mocks/hub/wizard.html +0 -421
  201. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  202. package/docs/design/mocks/landing/v1.html +0 -956
  203. package/docs/design/mocks/landing/v2.html +0 -708
  204. package/docs/design/mocks/landing/v3.html +0 -911
  205. package/docs/design/mocks/landing-page-mock.html +0 -687
  206. package/docs/design/mocks/landing-palettes.html +0 -103
  207. package/docs/design/mocks/projects-hub-mock.html +0 -991
  208. package/docs/design/mocks/projects-hub-variants.html +0 -146
  209. package/docs/design/mocks/projects-page-mock.html +0 -167
  210. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  211. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  212. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  213. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  214. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  215. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  216. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  217. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  218. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  219. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  220. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  221. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  222. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  223. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  224. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  225. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  226. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  227. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  228. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  229. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,1212 +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>Goals: 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
- --shell-pad:22px;
16
- --sidebar-w:240px;
17
- --gutter:26px;
18
- --row-pad:15px;
19
- --group-gap:34px;
20
- --band-gap:22px;
21
- --figure:clamp(30px,3.4vw,44px);
22
- --title:clamp(23px,2.2vw,30px);
23
- --display:clamp(34px,4.6vw,58px);
24
- --ring:44px;
25
-
26
- margin:0;
27
- background:var(--bg);
28
- color:var(--ink);
29
- font-family:var(--font-body);
30
- font-size:15px;
31
- line-height:1.5;
32
- -webkit-font-smoothing:antialiased;
33
- }
34
- *{box-sizing:border-box}
35
-
36
- /* ---------- the type voices ---------- */
37
- .display{font-family:var(--font-display);font-weight:300;letter-spacing:-.042em;text-transform:lowercase;line-height:.94}
38
- .headline{font-family:var(--font-display);font-weight:300;letter-spacing:-.035em;line-height:1.08}
39
- .lab{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
40
- .mono{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums}
41
- .num{font-variant-numeric:tabular-nums}
42
-
43
- /* ---------- focus: the world's two tone ring. ?state=focus paints the same treatment on four real
44
- controls that already carry .is-focus in the markup, so nothing is constructed and .focus() is never called ---------- */
45
- :focus-visible,body[data-state="focus"] .is-focus{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--bg);border-radius:var(--radius-sm)}
46
- .skip{position:fixed;top:10px;left:10px;z-index:200;transform:translateY(-300%);background:var(--bg-card);color:var(--ink);
47
- border:var(--line) solid var(--rule);border-radius:var(--radius-pill);padding:11px 18px;text-decoration:none;transition:transform 200ms cubic-bezier(.2,.7,.3,1)}
48
- .skip:focus{transform:none}
49
-
50
- /* ---------- the shell ---------- */
51
- .app-sidebar{position:fixed;inset:0 auto 0 0;width:var(--sidebar-w);display:flex;flex-direction:column;
52
- border-right:var(--line) solid var(--rule);background:var(--bg);z-index:var(--z-sidebar);overflow:hidden}
53
- .app-sidebar__brand{padding:0 var(--shell-pad);height:var(--topbar-h);display:flex;align-items:center;flex:none;border-bottom:var(--line) solid var(--rule-soft)}
54
- .brand-mark{display:inline-flex;align-items:center;gap:10px;min-height:24px;min-width:24px;color:var(--ink);text-decoration:none}
55
- .brand-mark__dot{width:11px;height:11px;border-radius:50%;border:1.5px solid var(--ink);flex:none}
56
- .brand-mark__name{font-weight:500;font-size:15px;letter-spacing:-.015em;white-space:nowrap}
57
- .app-sidebar__nav{flex:1;min-height:0;overflow-y:auto;padding:14px 0 22px}
58
- .nav-group{padding:0 0 6px}
59
- .nav-group+.nav-group{margin-top:14px;padding-top:14px;border-top:var(--line) solid var(--rule-soft)}
60
- .nav-group__head{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:26px;
61
- padding:0 var(--shell-pad);margin:0 0 4px;background:none;border:0;cursor:pointer;
62
- font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
63
- .nav-group__chevron{width:10px;height:6px;stroke:currentColor;fill:none;stroke-width:1.4;flex:none}
64
- .nav-item{text-transform:lowercase;display:flex;align-items:center;gap:11px;min-height:34px;padding:0 var(--shell-pad);
65
- color:var(--ink-soft);text-decoration:none;font-size:14px;border-left:2px solid transparent}
66
- .nav-item:hover{color:var(--ink)}
67
- .nav-item--active{color:var(--ink);border-left-color:var(--accent)}
68
- .nav-icon{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;color:var(--ink-faint)}
69
- .nav-item--active .nav-icon{color:var(--ink)}
70
- .app-sidebar__foot{flex:none;border-top:var(--line) solid var(--rule);padding:12px 16px;display:flex;align-items:center;gap:6px}
71
- .shell-user{display:flex;align-items:center;gap:10px;min-height:34px;flex:1;min-width:0;color:var(--ink);text-decoration:none}
72
- .shell-user__avatar{width:26px;height:26px;border-radius:50%;border:var(--line) solid var(--rule);background:var(--bg-deep);flex:none}
73
- .shell-user__meta{display:flex;flex-direction:column;min-width:0}
74
- .shell-user__name{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
75
- .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)}
76
- .shell-home,.shell-signout{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;min-width:24px;color:var(--ink-faint)}
77
- .shell-home:hover,.shell-signout:hover{color:var(--ink)}
78
- .shell-home svg,.shell-signout svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
79
-
80
- .app-topbar{position:fixed;top:0;left:var(--sidebar-w);right:0;height:var(--topbar-h);z-index:var(--z-topbar);
81
- display:flex;align-items:center;gap:14px;padding:0 var(--gutter);background:var(--bg);border-bottom:var(--line) solid var(--rule)}
82
- .topbar-menu{display:none;align-items:center;justify-content:center;width:34px;height:34px;background:none;border:0;color:var(--ink);cursor:pointer}
83
- .topbar-menu svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round}
84
- .topbar-title{margin:0;font-family:var(--font-display);font-weight:300;font-size:19px;letter-spacing:-.03em;text-transform:lowercase;color:var(--ink)}
85
- .topbar-side{margin-left:auto;display:flex;align-items:center;gap:12px}
86
- .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}
87
- .topbar-jump{display:inline-flex;align-items:center;gap:9px;height:32px;padding:0 13px;cursor:pointer;
88
- background:none;border:var(--line) solid var(--rule);border-radius:var(--radius-pill);color:var(--ink-soft);font:inherit;font-size:13px}
89
- .topbar-jump:hover{color:var(--ink);border-color:var(--ink-faint)}
90
- .topbar-jump__kbd{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-faint)}
91
- .zoom-toggle,.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;
92
- background:none;border:0;color:var(--ink-soft);cursor:pointer}
93
- .zoom-toggle:hover,.theme-toggle:hover{color:var(--ink)}
94
- .zoom-toggle svg,.theme-toggle svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
95
-
96
- .app-scrim{display:none;position:fixed;inset:0;background:rgba(0,0,0,.62);z-index:var(--z-scrim)}
97
- .app-content{margin-left:var(--sidebar-w);padding:calc(var(--topbar-h) + 34px) var(--gutter) 96px;max-width:calc(var(--content-max) + var(--sidebar-w) + var(--gutter) * 2)}
98
-
99
- /* ---------- the head of the page ---------- */
100
- .page-head{display:flex;align-items:baseline;gap:22px;flex-wrap:wrap;margin:0 0 10px}
101
- h1{margin:0;font-family:var(--font-display);font-weight:300;font-size:var(--display);letter-spacing:-.042em;text-transform:lowercase;line-height:.94}
102
- .greeting{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
103
- .page-lede{margin:0 0 26px;color:var(--ink-soft);font-size:15px;max-width:62ch}
104
-
105
- /* ---------- v1: the filter bar is bare fields on the ground, one hairline each ---------- */
106
- .filters{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px 22px;padding:0 0 14px;border-bottom:var(--line) solid var(--rule)}
107
- .field{display:flex;flex-direction:column;gap:5px;min-width:0}
108
- .field__lab{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
109
- .field input,.field select{appearance:none;background:none;border:0;border-bottom:var(--line) solid var(--rule);
110
- color:var(--ink);font:inherit;font-size:14px;height:30px;padding:0 20px 0 0;min-width:132px;cursor:pointer}
111
- .field input{cursor:text;min-width:196px}
112
- .field input::placeholder{color:var(--ink-faint)}
113
- .field select:hover,.field input:hover{border-bottom-color:var(--ink-faint)}
114
- .viewtoggle{display:inline-flex;align-items:flex-end;gap:14px;margin-left:auto}
115
- .viewtoggle__btn{background:none;border:0;padding:0 0 6px;cursor:pointer;color:var(--ink-faint);font:inherit;font-size:14px;
116
- text-transform:lowercase;min-height:28px;min-width:44px;border-bottom:2px solid transparent}
117
- .viewtoggle__btn:hover{color:var(--ink-soft)}
118
- .viewtoggle__btn[aria-pressed="true"]{color:var(--ink);border-bottom-color:var(--accent)}
119
-
120
- /* ---------- v1: the readiness figures sit bare on the page ground ---------- */
121
- .count-line{margin:20px 0 0;font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
122
- .readiness{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;margin:16px 0 0}
123
- .stat{padding:0 22px 0 0}
124
- .stat+.stat{padding-left:22px;border-left:var(--line) solid var(--rule-soft)}
125
- .stat__lab{display: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)}
126
- .stat__mark{width:7px;height:7px;border-radius:50%;flex:none}
127
- .stat__fig{margin:8px 0 0;padding:10px 0 0;border-top:var(--line) solid var(--rule-soft);
128
- font-family:var(--font-display);font-weight:300;font-size:var(--figure);letter-spacing:-.035em;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink)}
129
-
130
- /* ---------- the groups: a mono label over a hairline that runs the content width ---------- */
131
- .group{margin:var(--group-gap) 0 0}
132
- .group__head{display:flex;align-items:baseline;gap:12px;padding:0 0 8px;border-bottom:var(--line) solid var(--rule)}
133
- .group__name{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink)}
134
- .group__n{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
135
-
136
- /* ---------- v1: a goal is a band, not a card. One hairline on top, content, air ---------- */
137
- .goal{display:grid;grid-template-columns:var(--ring) minmax(0,1fr) auto;gap:20px;align-items:start;
138
- padding:var(--row-pad) 0;border-top:var(--line) solid var(--rule-soft)}
139
- .goal:first-child{border-top:0}
140
- .ring{width:var(--ring);height:var(--ring);display:block}
141
- .ring__track{fill:none;stroke:var(--rule);stroke-width:3}
142
- .ring__arc{fill:none;stroke:var(--ink);stroke-width:3;stroke-linecap:round}
143
- .ring__arc--ok{stroke:var(--ok)}
144
- .ring__txt{fill:var(--ink-soft);font-family:var(--font-mono);font-size:11px}
145
- .goal__title{display:inline-block;color:var(--ink);text-decoration:none;font-size:16px;font-weight:500;letter-spacing:-.012em;line-height:1.3;padding:1px 0;min-height:24px}
146
- .goal__title:hover{color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
147
- .goal__id{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint);margin-right:8px}
148
- .goal__sub{margin:3px 0 0;color:var(--ink-soft);font-size:13.5px;line-height:1.45;max-width:68ch}
149
- .goal__facts{display:flex;flex-wrap:wrap;align-items:center;gap:7px 10px;margin:9px 0 0}
150
- .chip{display:inline-flex;align-items:center;height:24px;padding:0 9px;border:var(--line) solid var(--rule-soft);border-radius:var(--radius-sm);
151
- font-family:var(--font-mono);font-size:11px;color:var(--ink-faint);white-space:nowrap}
152
- .chip--more{border-style:dashed}
153
- .status{display:inline-flex;align-items:center;gap:7px;height:24px;padding:0 10px;border-radius:var(--radius-pill);
154
- border:var(--line) solid currentColor;font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case)}
155
- .status--open{color:var(--info)}
156
- .status--blocked{color:var(--warn)}
157
- .status--achieved{color:var(--ok)}
158
- .status--archived{color:var(--ink-faint)}
159
- .roll{display:flex;flex-wrap:wrap;gap:8px 16px;margin:9px 0 0}
160
- .roll__d{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--ink-soft);font-variant-numeric:tabular-nums}
161
- .roll__d i{width:7px;height:7px;border-radius:50%;flex:none}
162
- .roll__d b{color:var(--ink);font-weight:600}
163
- .dot--ready{background:var(--ok)}
164
- .dot--active{background:var(--info)}
165
- .dot--blocked{background:var(--warn)}
166
- .dot--backlog{background:var(--ink-faint)}
167
- .goal__right{display:flex;flex-direction:column;align-items:flex-end;gap:8px;text-align:right;max-width:236px}
168
- .goal__next{font-size:13px;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:236px}
169
- .btn-accent{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:0 18px;border-radius:var(--radius-pill);
170
- border:0;background:var(--accent);color:var(--accent-on);font:inherit;font-size:13.5px;font-weight:500;text-transform:lowercase;text-decoration:none;cursor:pointer;
171
- transition:background 200ms cubic-bezier(.2,.7,.3,1)}
172
- .btn-accent:hover{background:var(--accent-lift)}
173
- .btn-ghost{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:0 16px;border-radius:var(--radius-pill);
174
- border:var(--line) solid var(--rule);background:none;color:var(--ink-soft);font:inherit;font-size:13.5px;text-transform:lowercase;cursor:pointer;
175
- transition:color 200ms cubic-bezier(.2,.7,.3,1)}
176
- .btn-ghost:hover{color:var(--ink);border-color:var(--ink-faint)}
177
- .tlink{display:inline-block;padding:3px 0;min-height:24px;color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
178
- .quiet{font-size:13px;color:var(--ink-faint)}
179
- .met{font-size:13px;color:var(--ok);font-weight:500}
180
-
181
- /* ---------- achieved + archived render as compact pills in BOTH views ---------- */
182
- .pills{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}
183
- .pill{display:inline-flex;align-items:center;gap:9px;min-height:32px;padding:0 14px;border-radius:var(--radius-pill);
184
- border:var(--line) solid var(--rule);color:var(--ink-soft);text-decoration:none;font-size:13px}
185
- .pill:hover{border-color:var(--ink-faint);color:var(--ink)}
186
- .pill b{color:var(--ink);font-weight:500}
187
- .pill__mark{width:16px;height:16px;flex:none;stroke:var(--ok);fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
188
- .pills--muted .pill{color:var(--ink-faint)}
189
- .pills--muted .pill b{color:var(--ink-soft)}
190
- .pills--muted .pill__mark{stroke:var(--ink-faint)}
191
- .pill__id{font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
192
-
193
- /* ---------- the world's hairline between the two surfaces ---------- */
194
- .seam{margin:var(--sp-xl) 0 0;border:0;border-top:var(--line) solid var(--rule);height:0}
195
- .seam-lab{margin:14px 0 0;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
196
-
197
- /* ---------- the detail: head band ---------- */
198
- .detail{margin:0}
199
- .detail__head{display:flex;align-items:flex-start;gap:22px;flex-wrap:wrap;padding:22px 0 0}
200
- .detail__headmain{flex:1;min-width:280px}
201
- .detail__title{margin:0;font-family:var(--font-display);font-weight:300;font-size:var(--title);letter-spacing:-.03em;line-height:1.16;color:var(--ink)}
202
- .detail__title .goal__id{font-size:.5em;vertical-align:.36em}
203
- .detail__sub{margin:7px 0 0;color:var(--ink-soft);font-size:14px;line-height:1.5;max-width:72ch}
204
- .detail__actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
205
- .disclosure{margin:14px 0 0;max-width:72ch;border-top:var(--line) solid var(--rule-soft);padding-top:10px}
206
- .disclosure__btn{display:inline-flex;align-items:center;gap:8px;min-height:26px;background:none;border:0;padding:0;cursor:pointer;
207
- color:var(--ink-faint);font:inherit;font-size:12.5px;text-align:left}
208
- .disclosure__btn:hover{color:var(--ink-soft)}
209
- .disclosure__chev{width:9px;height:9px;stroke:currentColor;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;transition:transform 200ms cubic-bezier(.2,.7,.3,1)}
210
- .disclosure__btn[aria-expanded="true"] .disclosure__chev{transform:rotate(90deg)}
211
- .disclosure__body{margin:10px 0 0;padding:0 0 0 14px;border-left:var(--line) solid var(--rule-soft);color:var(--ink-soft);font-size:13.5px;line-height:1.55}
212
- .disclosure__btn[aria-expanded="false"]+.disclosure__body{display:none}
213
- .detail__meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:14px 0 0;font-size:13px;color:var(--ink-faint)}
214
-
215
- /* ---------- the three column band ---------- */
216
- .band{display:grid;grid-template-columns:1fr;margin:var(--sp-lg) 0 0;border-top:var(--line) solid var(--rule)}
217
- .band__col{padding:var(--band-gap) 0;min-width:0}
218
- .band__col+.band__col{border-top:var(--line) solid var(--rule-soft)}
219
- @media (min-width:960px){
220
- .band{grid-template-columns:repeat(3,minmax(0,1fr));gap:0}
221
- .band__col{padding:var(--band-gap) 22px}
222
- .band__col:first-child{padding-left:0}
223
- .band__col:last-child{padding-right:0}
224
- .band__col+.band__col{border-top:0;border-left:var(--line) solid var(--rule-soft)}
225
- }
226
- .col__head{display:flex;align-items:center;gap:10px;margin:0 0 4px}
227
- .col__h{margin:0;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink);font-weight:400}
228
- .count-pill{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:var(--radius-pill);
229
- border:var(--line) solid var(--rule);font-family:var(--font-mono);font-size:11px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
230
- .col__lede{margin:6px 0 0;color:var(--ink-faint);font-size:12.5px;line-height:1.45}
231
- .col__foot{margin:12px 0 0}
232
-
233
- .crits{list-style:none;margin:12px 0 0;padding:0}
234
- .crit{display:grid;grid-template-columns:20px minmax(0,1fr);gap:11px;padding:9px 0;border-top:var(--line) solid var(--rule-soft);font-size:13px}
235
- .crit:first-child{border-top:0}
236
- .crit__mark{width:16px;height:16px;margin-top:2px;border-radius:50%;border:1.5px solid var(--rule);display:block}
237
- .crit--done .crit__mark{border-color:var(--ok);background:var(--ok)}
238
- .crit--pending .crit__mark{border-color:var(--warn)}
239
- .crit__key{font-family:var(--font-mono);font-size:12px;color:var(--ink)}
240
- .crit__detail{margin:4px 0 0;font-size:12.5px;color:var(--ink-faint);line-height:1.45}
241
-
242
- .invite{margin:12px 0 0}
243
- .invite__form{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:10px 0 0}
244
- .invite__form select{appearance:none;background:none;border:0;border-bottom:var(--line) solid var(--rule);color:var(--ink);font:inherit;font-size:13.5px;height:30px;flex:1;min-width:150px}
245
- .pending{margin:14px 0 0}
246
- .pending__h{display:flex;align-items:center;gap:8px;margin:0 0 4px;font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
247
- .pending__row{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:8px 0;border-top:var(--line) solid var(--rule-soft);font-size:13px}
248
- .pending__who{font-weight:500;color:var(--ink)}
249
- .pending__note{color:var(--ink-faint);font-size:12.5px;flex:1;min-width:80px}
250
- .pending__acts{display:flex;gap:8px}
251
- .btn-xs{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 11px;border-radius:var(--radius-pill);
252
- border:var(--line) solid var(--rule);background:none;color:var(--ink-soft);font:inherit;font-size:12px;cursor:pointer}
253
- .btn-xs:hover{color:var(--ink);border-color:var(--ink-faint)}
254
- .members{list-style:none;margin:12px 0 0;padding:0}
255
- .member{display:flex;align-items:center;gap:11px;padding:8px 0;border-top:var(--line) solid var(--rule-soft);font-size:13.5px}
256
- .member:first-child{border-top:0}
257
- .member__avatar{width:24px;height:24px;border-radius:50%;border:var(--line) solid var(--rule);background:var(--bg-deep);flex:none}
258
- .member__name{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
259
- .member__name small{color:var(--ink-faint)}
260
- .member__pill{display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:var(--radius-pill);
261
- border:var(--line) solid var(--rule);font-family:var(--label-face);font-size:10px;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
262
-
263
- .conflict{padding:11px 0;border-top:var(--line) solid var(--rule-soft);font-size:13px}
264
- .conflict:first-of-type{border-top:0;margin-top:10px}
265
- .conflict__pair{font-weight:500;color:var(--ink)}
266
- .conflict__sev{display:inline-flex;align-items:center;height:20px;padding:0 8px;margin-left:8px;border-radius:var(--radius-pill);
267
- border:var(--line) solid currentColor;font-family:var(--label-face);font-size:10px;letter-spacing:var(--label-space);text-transform:var(--label-case)}
268
- .conflict__sev--high{color:var(--danger)}
269
- .conflict__sev--medium{color:var(--warn)}
270
- .conflict__paths{margin:5px 0 0;font-family:var(--font-mono);font-size:11.5px;color:var(--ink-faint);word-break:break-all;line-height:1.5}
271
-
272
- /* ---------- the tasks band ---------- */
273
- .tasks{margin:var(--sp-lg) 0 0;border-top:var(--line) solid var(--rule);padding:var(--band-gap) 0 0}
274
- .tasks__head{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}
275
- .tabs{display:inline-flex;gap:20px}
276
- .tab{background:none;border:0;padding:0 0 7px;cursor:pointer;color:var(--ink-faint);font:inherit;font-size:14px;
277
- text-transform:lowercase;min-height:30px;min-width:44px;border-bottom:2px solid transparent}
278
- .tab:hover{color:var(--ink-soft)}
279
- .tab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--accent)}
280
- .tasks__bar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px 22px;margin:16px 0 0;padding:0 0 12px;border-bottom:var(--line) solid var(--rule-soft)}
281
- .task{display:grid;grid-template-columns:24px minmax(0,1fr) auto;gap:16px;align-items:start;padding:var(--row-pad) 0;border-top:var(--line) solid var(--rule-soft)}
282
- .task:first-of-type{border-top:0}
283
- .task__pick{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;margin-top:2px}
284
- .task__pick input{appearance:none;-webkit-appearance:none;width:24px;height:24px;margin:0;cursor:pointer;position:relative;
285
- border:1.5px solid var(--rule);border-radius:6px;background:none}
286
- .task__pick input:checked{background:var(--accent);border-color:var(--accent)}
287
- .task__pick input:checked::after{content:"";position:absolute;left:8px;top:4px;width:5px;height:10px;
288
- border:solid var(--accent-on);border-width:0 2px 2px 0;transform:rotate(45deg)}
289
- .task__pick input:disabled{opacity:.42;cursor:not-allowed}
290
- .bulk button[disabled]{opacity:.42;pointer-events:none}
291
- .task__id{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
292
- .task__title{display:inline-block;padding:1px 0;min-height:24px;color:var(--ink);text-decoration:none;font-size:15px;font-weight:500;line-height:1.35}
293
- .task__title:hover{color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
294
- .task__tags{display:flex;flex-wrap:wrap;gap:7px 9px;margin:8px 0 0;align-items:center}
295
- .task__figs{display:flex;flex-wrap:wrap;gap:7px 18px;margin:8px 0 0;font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
296
- .task__figs b{color:var(--ink-soft);font-weight:400}
297
- .task__right{display:flex;flex-direction:column;align-items:flex-end;gap:8px;text-align:right}
298
- .pri{display:inline-flex;align-items:center;height:24px;padding:0 9px;border-radius:var(--radius-sm);
299
- border:var(--line) solid currentColor;font-family:var(--font-mono);font-size:11px}
300
- .pri--p1{color:var(--danger)}
301
- .pri--p2{color:var(--warn)}
302
- .pri--p3{color:var(--ink-faint)}
303
-
304
- .ledger{width:100%;border-collapse:collapse;margin:16px 0 0;font-size:13.5px}
305
- .ledger th{text-align:left;padding:0 12px 9px 0;border-bottom:var(--line) solid var(--rule);
306
- font-family:var(--label-face);font-size:10.5px;font-weight:400;letter-spacing:var(--label-space);text-transform:var(--label-case);color:var(--ink-faint)}
307
- .ledger th button{display:inline-flex;align-items:center;gap:6px;min-height:24px;background:none;border:0;padding:0;cursor:pointer;font:inherit;color:inherit}
308
- .ledger th button:hover{color:var(--ink)}
309
- .ledger td{padding:13px 12px 13px 0;border-bottom:var(--line) solid var(--rule-soft);color:var(--ink-soft)}
310
- .ledger td:first-child{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint)}
311
- .ledger .num{color:var(--ink)}
312
-
313
- .bulk{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:var(--sp-lg) 0 0;
314
- padding:14px 0;border-top:var(--line) solid var(--rule);background:var(--bg)}
315
- .bulk__count{font-family:var(--font-mono);font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-soft)}
316
- .bulk__acts{display:flex;gap:10px;margin-left:auto}
317
-
318
- /* ---------- the states ---------- */
319
- .s-loading,.s-empty,.s-error{display:none}
320
- body[data-state="loading"] .s-live,body[data-state="empty"] .s-live,body[data-state="error"] .s-live{display:none}
321
- body[data-state="loading"] .s-loading{display:block}
322
- body[data-state="empty"] .s-empty{display:block}
323
- body[data-state="error"] .s-error{display:block}
324
- .skel{background:var(--rule-soft);border-radius:3px;height:11px}
325
- .skel--fig{height:var(--figure);border-radius:5px}
326
- .skel--ring{width:var(--ring);height:var(--ring);border-radius:50%}
327
- .skel--title{height:15px}
328
- .notice{padding:34px 0;border-top:var(--line) solid var(--rule-soft)}
329
- .notice__h{margin:0;font-family:var(--font-display);font-weight:300;font-size:22px;letter-spacing:-.03em;color:var(--ink)}
330
- .notice__p{margin:8px 0 0;color:var(--ink-soft);font-size:14px;max-width:56ch}
331
- .notice__acts{margin:16px 0 0;display:flex;gap:10px;flex-wrap:wrap}
332
- .notice--error .notice__h{color:var(--danger)}
333
-
334
- /* ---------- rail + drawer ---------- */
335
- body[data-state="rail"]{--sidebar-w:var(--sidebar-w-rail)}
336
- body[data-state="rail"] .brand-mark__name,
337
- body[data-state="rail"] .nav-item__label,
338
- body[data-state="rail"] .nav-group__head-label,
339
- body[data-state="rail"] .nav-group__chevron,
340
- body[data-state="rail"] .shell-user__meta{display:none}
341
- body[data-state="rail"] .app-sidebar__brand,
342
- body[data-state="rail"] .nav-item,
343
- body[data-state="rail"] .nav-group__head,
344
- body[data-state="rail"] .app-sidebar__foot{padding-left:0;padding-right:0;justify-content:center}
345
- body[data-state="rail"] .nav-item{border-left:0;border-right:2px solid transparent}
346
- body[data-state="rail"] .nav-item--active{border-right-color:var(--accent)}
347
- body[data-state="rail"] .nav-group__head{min-height:26px;margin-bottom:2px}
348
- body[data-state="rail"] .nav-group__head::after{content:"";width:14px;height:var(--line);background:var(--rule)}
349
- body[data-state="rail"] .app-sidebar__foot{flex-direction:column;gap:12px}
350
- body[data-state="drawer"] .app-scrim{display:block}
351
- body[data-state="drawer"] .app-sidebar{width:288px;z-index:var(--z-drawer);border-right-color:var(--rule)}
352
- body[data-state="drawer"] .app-topbar{left:0}
353
- body[data-state="drawer"] .app-content{margin-left:0}
354
-
355
- @media (max-width:1024px){
356
- .app-sidebar{transform:translateX(-100%)}
357
- .app-topbar{left:0}
358
- .app-content{margin-left:0}
359
- .topbar-menu{display:inline-flex}
360
- body[data-state="drawer"] .app-sidebar{transform:none}
361
- body[data-state="rail"] .app-sidebar{transform:none}
362
- }
363
- @media (max-width:900px){
364
- body{--gutter:20px;--shell-pad:20px}
365
- .readiness{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 0}
366
- .stat:nth-child(3){padding-left:0;border-left:0}
367
- .goal{grid-template-columns:34px minmax(0,1fr);row-gap:12px;--ring:34px}
368
- .goal__right{grid-column:1/-1;align-items:flex-start;text-align:left;max-width:100%}
369
- .goal__next{max-width:100%}
370
- .task{grid-template-columns:24px minmax(0,1fr);row-gap:12px}
371
- .task__right{grid-column:2/-1;align-items:flex-start;text-align:left}
372
- .topbar-note,.topbar-jump__label{display:none}
373
- .viewtoggle{margin-left:0}
374
- }
375
- </style>
376
- <script>
377
- (function(){try{var q=new URLSearchParams(location.search||location.hash.slice(1)||'').get('mode');
378
- var m=(q==='light'||q==='dark')?q:'dark';
379
- document.documentElement.setAttribute('data-mode',m);
380
- document.documentElement.setAttribute('data-theme',m);}catch(e){}})();
381
- </script>
382
- </head>
383
- <body class="mock" data-state="populated">
384
- <!--
385
- Goals in the chrome world, v1 "the ledger" (task 1003302, goal 1000081).
386
- THESIS the governance list is a ledger: no panels anywhere, every goal a band on the page ground, read top to bottom.
387
- COMPOSITION the first viewport is the h1 with a mono greeting on its baseline, a bare filter row closed by one rule, four
388
- readiness figures sitting straight on the ground, then Active as a mono label over a full width hairline with
389
- the goal bands under it. The detail follows below the world's seam, so the owner reads both rhythms at once.
390
- LIGHT nothing inverts: the same hairlines on pale paper, where a 1px rule is darker than the ink around it and the
391
- bands read as a printed register rather than as a screen.
392
- RISK 27 pages of pure hairline can read undifferentiated, and a goal band with no edge gives a claimable task less
393
- of an object to grab than a card does. This is the version that has to earn density with typography alone.
394
- ?state=populated the page with real data
395
- ?state=loading skeletons in the SHAPE of the final content
396
- ?state=empty nothing to show yet
397
- ?state=error the feed failed
398
- ?state=rail the sidebar collapsed to its 64px rail
399
- ?state=drawer the mobile drawer open
400
- ?state=focus keyboard focus rings on the page's real controls
401
- -->
402
-
403
- <a class="skip" href="#main">Skip to content</a>
404
-
405
- <div class="app-sidebar" id="app-sidebar">
406
- <div class="app-sidebar__brand">
407
- <a class="brand-mark" href="/" id="brand-mark">
408
- <span class="brand-mark__dot"></span><span class="brand-mark__name">Cloud Bongos</span></a>
409
- </div>
410
- <nav class="app-sidebar__nav" aria-label="Primary">
411
- <div class="nav-group">
412
- <a class="nav-item" id="nav-home" href="/" data-gate="always">
413
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 7.2 8 2.6l5.5 4.6V13H2.5z"/></svg>
414
- <span class="nav-item__label">Home</span></a>
415
- <a class="nav-item" id="nav-roadmap" href="/roadmap" data-gate="always">
416
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 12.5l3.5-4 3 2.6 4.5-6"/></svg>
417
- <span class="nav-item__label">Roadmap</span></a>
418
- <a class="nav-item nav-item--active is-focus" id="nav-goals" href="/goals" data-gate="always" aria-current="page">
419
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.5"/><circle cx="8" cy="8" r="1.6"/></svg>
420
- <span class="nav-item__label">Goals</span></a>
421
- <a class="nav-item" id="nav-work" href="/work" data-gate="always">
422
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2.5" y="3.5" width="11" height="9"/><path d="M2.5 6.5h11"/></svg>
423
- <span class="nav-item__label">Tasks</span></a>
424
- <a class="nav-item" id="nav-ideas" href="/ideas" data-gate="always">
425
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2.2a4 4 0 0 1 2.4 7.2v1.4h-4.8V9.4A4 4 0 0 1 8 2.2z"/><path d="M6.6 13.3h2.8"/></svg>
426
- <span class="nav-item__label">Ideas</span></a>
427
- <a class="nav-item" id="nav-copy-desk" href="/copy-desk" data-gate="always">
428
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M4 2.5h5l3 3v8H4z"/><path d="M9 2.5v3h3"/></svg>
429
- <span class="nav-item__label">Copy desk</span></a>
430
- </div>
431
- <div class="nav-group nav-group--collapsible" data-group="you">
432
- <button class="nav-group__head" data-gate="signed" data-group="you" aria-expanded="true" aria-controls="nav-items-you">
433
- <span class="nav-group__head-label">You</span>
434
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 4.8 9 1.4"/></svg></button>
435
- <div id="nav-items-you">
436
- <a class="nav-item" id="nav-standing" href="/#standing" data-gate="signed">
437
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.5 13V9M8 13V4M12.5 13V7"/></svg>
438
- <span class="nav-item__label">Standing</span></a>
439
- <a class="nav-item" id="nav-profile" href="/profile" data-gate="signed">
440
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="5.6" r="2.5"/><path d="M3.2 13.4c0-2.7 2.2-4 4.8-4s4.8 1.3 4.8 4"/></svg>
441
- <span class="nav-item__label">Profile</span></a>
442
- </div>
443
- </div>
444
- <div class="nav-group nav-group--collapsible" data-group="community">
445
- <button class="nav-group__head" data-gate="signed" data-group="community" aria-expanded="true" aria-controls="nav-items-community">
446
- <span class="nav-group__head-label">Community</span>
447
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 4.8 9 1.4"/></svg></button>
448
- <div id="nav-items-community">
449
- <a class="nav-item" id="nav-collab" href="/collab" data-gate="signed">
450
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="6.2" cy="8" r="3.4"/><circle cx="9.8" cy="8" r="3.4"/></svg>
451
- <span class="nav-item__label">Collab</span></a>
452
- <a class="nav-item" id="nav-leaderboard" href="/#leaderboard" data-gate="signed">
453
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 13.4V7h4.8v6.4M2.4 13.4v-3.2h3.2M10.4 13.4V4.6h3.2v8.8"/></svg>
454
- <span class="nav-item__label">Leaderboard</span></a>
455
- <a class="nav-item" id="nav-people" href="/people" data-gate="signed">
456
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6" r="2.3"/><path d="M2.4 13c0-2.2 1.6-3.5 3.6-3.5S9.6 10.8 9.6 13"/><path d="M11 6.4a1.8 1.8 0 1 1 .9 3.3c1 .4 1.7 1.4 1.7 3.3"/></svg>
457
- <span class="nav-item__label">People</span></a>
458
- </div>
459
- </div>
460
- <div class="nav-group nav-group--collapsible" data-group="docs">
461
- <button class="nav-group__head" data-gate="always" data-group="docs" aria-expanded="true" aria-controls="nav-items-docs">
462
- <span class="nav-group__head-label">Docs</span>
463
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 4.8 9 1.4"/></svg></button>
464
- <div id="nav-items-docs">
465
- <a class="nav-item" id="nav-primer" href="/primer" data-gate="always">
466
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 4.5C6.8 3.4 4.9 3.2 2.6 3.6v8c2.3-.4 4.2-.2 5.4.9 1.2-1.1 3.1-1.3 5.4-.9v-8c-2.3-.4-4.2-.2-5.4.9zM8 4.5v8"/></svg>
467
- <span class="nav-item__label">Primer</span></a>
468
- <a class="nav-item" id="nav-ranks" href="/ranks" data-gate="always">
469
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M4 6.6 8 3.2l4 3.4M4 11.6 8 8.2l4 3.4"/></svg>
470
- <span class="nav-item__label">Ranks</span></a>
471
- <a class="nav-item" id="nav-economy" href="/drachmae" data-gate="always">
472
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.5"/><path d="M8 4.8v6.4M6.3 6.4h3.4M6.3 9.4h3.4"/></svg>
473
- <span class="nav-item__label">Economy</span></a>
474
- <a class="nav-item" id="nav-diagrams" href="/diagrams" data-gate="always">
475
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="4.6" height="4"/><rect x="9" y="9.4" width="4.6" height="4"/><path d="M4.7 6.6v4.8h4.3"/></svg>
476
- <span class="nav-item__label">Diagrams</span></a>
477
- <a class="nav-item" id="nav-atlas" href="/atlas" data-gate="always">
478
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.5"/><path d="M2.5 8h11M8 2.5c1.9 2.2 1.9 8.8 0 11M8 2.5c-1.9 2.2-1.9 8.8 0 11"/></svg>
479
- <span class="nav-item__label">Repo Atlas</span></a>
480
- <a class="nav-item" id="nav-modules" href="/modules" data-gate="always">
481
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.4" width="5" height="5"/><rect x="8.6" y="2.4" width="5" height="5"/><rect x="2.4" y="8.6" width="5" height="5"/><rect x="8.6" y="8.6" width="5" height="5"/></svg>
482
- <span class="nav-item__label">Modules</span></a>
483
- <a class="nav-item" id="nav-apidocs" href="/docs" data-gate="always">
484
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3.4 3 8l3 4.6M10 3.4 13 8l-3 4.6"/></svg>
485
- <span class="nav-item__label">API docs</span></a>
486
- </div>
487
- </div>
488
- <div class="nav-group nav-group--collapsible" data-group="government">
489
- <button class="nav-group__head" data-gate="signed" data-group="government" aria-expanded="true" aria-controls="nav-items-government">
490
- <span class="nav-group__head-label">Government</span>
491
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 4.8 9 1.4"/></svg></button>
492
- <div id="nav-items-government">
493
- <a class="nav-item" id="nav-watch" href="/watch" data-gate="signed">
494
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M1.8 8S4.2 4.2 8 4.2 14.2 8 14.2 8 11.8 11.8 8 11.8 1.8 8 1.8 8z"/><circle cx="8" cy="8" r="1.8"/></svg>
495
- <span class="nav-item__label">Watch</span></a>
496
- <a class="nav-item" id="nav-harbor" href="/harbor" data-gate="signed">
497
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3.4" r="1.4"/><path d="M8 5v8.2M4.6 7h6.8M2.9 10c.6 2.2 2.6 3.4 5.1 3.4s4.5-1.2 5.1-3.4"/></svg>
498
- <span class="nav-item__label">Harbor</span></a>
499
- <a class="nav-item" id="nav-gate" href="/gate" data-gate="signed">
500
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.6 13.4V5L8 2.4 13.4 5v8.4M6 13.4V8.6h4v4.8"/></svg>
501
- <span class="nav-item__label">Gate</span></a>
502
- <a class="nav-item" id="nav-sessions" href="/sessions" data-gate="signed">
503
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.5"/><path d="M8 4.8V8l2.4 1.6"/></svg>
504
- <span class="nav-item__label">Sessions</span></a>
505
- <a class="nav-item" id="nav-government" href="/government" data-gate="signed">
506
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2.2 13.2 4.2v3.9c0 3.2-2.5 5-5.2 5.7-2.7-.7-5.2-2.5-5.2-5.7V4.2z"/></svg>
507
- <span class="nav-item__label">Permissions</span></a>
508
- </div>
509
- </div>
510
- </nav>
511
- <div class="app-sidebar__foot">
512
- <a class="shell-user" id="shell-user" href="/settings" title="Settings">
513
- <span class="shell-user__avatar"></span>
514
- <span class="shell-user__meta">
515
- <span class="shell-user__name">Percy Jackson</span>
516
- <span class="shell-user__rank">Owner</span></span></a>
517
- <a class="shell-home" href="/" title="Back to Cloud Bongos">
518
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 7.2 8 2.6l5.5 4.6V13H2.5z"/></svg></a>
519
- <a class="shell-signout" href="/api/bongos/auth/logout" title="Sign out">
520
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6.4 2.6H3.2v10.8h3.2M9.6 5.4 12.4 8l-2.8 2.6M12.4 8H6.6"/></svg></a>
521
- </div>
522
- </div>
523
-
524
- <div class="app-scrim" id="app-scrim"></div>
525
-
526
- <header class="app-topbar" id="app-topbar">
527
- <button class="topbar-menu" id="topbar-menu" aria-label="Open navigation" aria-expanded="false" aria-controls="app-sidebar">
528
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 4.5h11M2.5 8h11M2.5 11.5h11"/></svg></button>
529
- <h2 class="topbar-title">Goals</h2>
530
- <div class="topbar-side">
531
- <span class="topbar-note">BONGOS-V1 · 1176 of 1612 shipped</span>
532
- <button class="topbar-jump" id="topbar-jump" aria-label="Jump to a page or record">
533
- <span class="topbar-jump__label">Jump to</span><kbd class="topbar-jump__kbd">Ctrl K</kbd></button>
534
- <button class="zoom-toggle" aria-label="Text size">
535
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2 12.5 5.6 3.5l3.6 9M3.2 9.6h4.8M10.6 12.5l2.4-6 2.4 6M11.4 10.6h3.2"/></svg></button>
536
- <button class="theme-toggle" aria-label="Switch theme">
537
- <svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="3.4"/><path d="M8 1.4v1.6M8 13v1.6M1.4 8H3M13 8h1.6M3.4 3.4l1.1 1.1M11.5 11.5l1.1 1.1M12.6 3.4l-1.1 1.1M4.5 11.5l-1.1 1.1"/></svg></button>
538
- </div>
539
- </header>
540
-
541
- <main class="app-content" id="main">
542
-
543
- <div class="page-head">
544
- <h1>goals</h1>
545
- <span class="greeting">Good morning, Percy</span>
546
- </div>
547
- <p class="page-lede">Every shared goal on this instance, grouped by whether it can move. A goal is the module scoped
548
- workspace between a version and its criteria: the wall that bounds where its tasks may write.</p>
549
-
550
- <!-- ============ THE LIST ============ -->
551
- <section aria-labelledby="list-h">
552
- <h2 id="list-h" class="lab" style="margin:0 0 14px">All goals</h2>
553
-
554
- <div class="filters">
555
- <div class="field">
556
- <label class="field__lab" for="f-goals-search">Search</label>
557
- <input class="is-focus" id="f-goals-search" type="search" placeholder="goal # or name" value="">
558
- </div>
559
- <div class="field">
560
- <label class="field__lab" for="f-goal-version">Version</label>
561
- <select id="f-goal-version"><option>any</option><option>BONGOS-V1</option><option>CB-V1</option></select>
562
- </div>
563
- <div class="field">
564
- <label class="field__lab" for="f-goal-status">Status</label>
565
- <select id="f-goal-status"><option>any</option><option>open</option><option>achieved</option><option>archived</option></select>
566
- </div>
567
- <div class="field">
568
- <label class="field__lab" for="f-goal-mine">Membership</label>
569
- <select id="f-goal-mine"><option>All goals</option><option>My goals</option></select>
570
- </div>
571
- <div class="field">
572
- <label class="field__lab" for="f-goal-owner">Owner</label>
573
- <select id="f-goal-owner"><option>any</option><option>lars589</option><option>Percy Jackson</option><option>IAMMASTERQUA</option></select>
574
- </div>
575
- <div class="field">
576
- <label class="field__lab" for="f-goal-order">Sort</label>
577
- <select id="f-goal-order"><option>priority</option><option>recently active</option><option>newest first</option><option>stalest first</option></select>
578
- </div>
579
- <div class="viewtoggle" role="group" aria-label="View">
580
- <button type="button" class="viewtoggle__btn" id="f-goal-view-rows" aria-pressed="true">rows</button>
581
- <button type="button" class="viewtoggle__btn is-focus" id="f-goal-view-cards" aria-pressed="false">cards</button>
582
- </div>
583
- </div>
584
-
585
- <!-- populated ------------------------------------------------------ -->
586
- <div class="s-live">
587
- <p class="count-line" aria-live="polite">12 goals · 8 open · 3 achieved · 1 archived</p>
588
-
589
- <div class="readiness">
590
- <div class="stat">
591
- <span class="stat__lab"><span class="stat__mark dot--ready"></span>Ready to claim</span>
592
- <p class="stat__fig">23</p>
593
- </div>
594
- <div class="stat">
595
- <span class="stat__lab"><span class="stat__mark dot--active"></span>In progress</span>
596
- <p class="stat__fig">6</p>
597
- </div>
598
- <div class="stat">
599
- <span class="stat__lab"><span class="stat__mark dot--blocked"></span>Blocked</span>
600
- <p class="stat__fig">16</p>
601
- </div>
602
- <div class="stat">
603
- <span class="stat__lab">Criteria satisfied</span>
604
- <p class="stat__fig">12 / 35</p>
605
- </div>
606
- </div>
607
-
608
- <!-- Active -->
609
- <div class="group">
610
- <div class="group__head"><span class="group__name">Active</span><span class="group__n">6</span></div>
611
-
612
- <div class="goal">
613
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="0 of 3 criteria satisfied">
614
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
615
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="0 100.5" transform="rotate(-90 21 21)"></circle>
616
- <text class="ring__txt" x="21" y="25" text-anchor="middle">0/3</text></svg>
617
- <div>
618
- <a class="goal__title is-focus" href="#/goal/1000081"><span class="goal__id">#1000081</span>Builders' hall in the world</a>
619
- <p class="goal__sub">The 27-page hall adopts the apex world: five archetype mocks, one shell, every page family re-skinned.</p>
620
- <div class="goal__facts">
621
- <span class="status status--open">open</span>
622
- <span class="chip">hall-ui</span>
623
- <span class="chip">BONGOS-V1</span>
624
- </div>
625
- <div class="roll">
626
- <span class="roll__d"><i class="dot--active"></i><b>1</b> in progress</span>
627
- <span class="roll__d"><i class="dot--backlog"></i><b>7</b> backlog</span>
628
- </div>
629
- </div>
630
- <div class="goal__right">
631
- <span class="goal__next">Nothing claimable yet</span>
632
- <a class="tlink" href="#/goal/1000081">See all 8 tasks</a>
633
- </div>
634
- </div>
635
-
636
- <div class="goal">
637
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="2 of 4 criteria satisfied">
638
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
639
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="50.3 50.3" transform="rotate(-90 21 21)"></circle>
640
- <text class="ring__txt" x="21" y="25" text-anchor="middle">2/4</text></svg>
641
- <div>
642
- <a class="goal__title" href="#/goal/1000063"><span class="goal__id">#1000063</span>The front door</a>
643
- <p class="goal__sub">The apex landing and the project hub, in the chrome world, on one token tier.</p>
644
- <div class="goal__facts">
645
- <span class="status status--open">open</span>
646
- <span class="chip">public-landing</span>
647
- <span class="chip">BONGOS-V1</span>
648
- </div>
649
- <div class="roll">
650
- <span class="roll__d"><i class="dot--ready"></i><b>3</b> ready</span>
651
- <span class="roll__d"><i class="dot--active"></i><b>2</b> in progress</span>
652
- <span class="roll__d"><i class="dot--backlog"></i><b>4</b> backlog</span>
653
- </div>
654
- </div>
655
- <div class="goal__right">
656
- <span class="goal__next">Project settings: the card's backdrop</span>
657
- <a class="btn-accent" href="#/task/1003352">claim next</a>
658
- </div>
659
- </div>
660
-
661
- <div class="goal">
662
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="4 of 9 criteria satisfied">
663
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
664
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="44.7 55.9" transform="rotate(-90 21 21)"></circle>
665
- <text class="ring__txt" x="21" y="25" text-anchor="middle">4/9</text></svg>
666
- <div>
667
- <a class="goal__title" href="#/goal/1000075"><span class="goal__id">#1000075</span>Collaboration &amp; the social hall</a>
668
- <p class="goal__sub">Goals, membership, invitations and the people surfaces that let two builders share one wall.</p>
669
- <div class="goal__facts">
670
- <span class="status status--open">open</span>
671
- <span class="chip">builder-settings</span>
672
- <span class="chip">hall-ui</span>
673
- <span class="chip">kernel</span>
674
- <span class="chip chip--more">+3</span>
675
- </div>
676
- <div class="roll">
677
- <span class="roll__d"><i class="dot--ready"></i><b>6</b> ready</span>
678
- <span class="roll__d"><i class="dot--active"></i><b>2</b> in progress</span>
679
- <span class="roll__d"><i class="dot--blocked"></i><b>3</b> blocked</span>
680
- </div>
681
- </div>
682
- <div class="goal__right">
683
- <span class="goal__next">Goal invitations: the pending inbox</span>
684
- <a class="btn-accent" href="#/task/1002971">claim next</a>
685
- </div>
686
- </div>
687
-
688
- <div class="goal">
689
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="0 of 2 criteria satisfied">
690
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
691
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="0 100.5" transform="rotate(-90 21 21)"></circle>
692
- <text class="ring__txt" x="21" y="25" text-anchor="middle">0/2</text></svg>
693
- <div>
694
- <a class="goal__title" href="#/goal/1000064"><span class="goal__id">#1000064</span>The hall as the room</a>
695
- <p class="goal__sub">The hall stops being a dashboard and becomes the place the build happens, with Discord as its mirror.</p>
696
- <div class="goal__facts">
697
- <span class="status status--open">open</span>
698
- <span class="chip">hall-ui</span>
699
- <span class="chip">discord</span>
700
- <span class="chip">BONGOS-V1</span>
701
- </div>
702
- <div class="roll">
703
- <span class="roll__d"><i class="dot--ready"></i><b>4</b> ready</span>
704
- <span class="roll__d"><i class="dot--blocked"></i><b>1</b> blocked</span>
705
- </div>
706
- </div>
707
- <div class="goal__right">
708
- <span class="goal__next">The hall's own plate: shoot it</span>
709
- <span class="goal__next">Nothing claimable yet</span>
710
- </div>
711
- </div>
712
-
713
- <div class="goal">
714
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="1 of 3 criteria satisfied">
715
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
716
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="33.5 67" transform="rotate(-90 21 21)"></circle>
717
- <text class="ring__txt" x="21" y="25" text-anchor="middle">1/3</text></svg>
718
- <div>
719
- <a class="goal__title" href="#/goal/1000083"><span class="goal__id">#1000083</span>The ui-design module</a>
720
- <p class="goal__sub">The mock kit, the check, the render and the probe, carved into a module any instance can adopt.</p>
721
- <div class="goal__facts">
722
- <span class="status status--open">open</span>
723
- <span class="chip">ui-design</span>
724
- <span class="chip">BONGOS-V1</span>
725
- </div>
726
- <div class="roll">
727
- <span class="roll__d"><i class="dot--ready"></i><b>3</b> ready</span>
728
- <span class="roll__d"><i class="dot--active"></i><b>1</b> in progress</span>
729
- </div>
730
- </div>
731
- <div class="goal__right">
732
- <span class="goal__next">check-mock: the contrast pass</span>
733
- <a class="btn-accent" href="#/task/1003321">claim next</a>
734
- </div>
735
- </div>
736
-
737
- <div class="goal">
738
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="0 of 2 criteria satisfied">
739
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
740
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="0 100.5" transform="rotate(-90 21 21)"></circle>
741
- <text class="ring__txt" x="21" y="25" text-anchor="middle">0/2</text></svg>
742
- <div>
743
- <a class="goal__title" href="#/goal/1000082"><span class="goal__id">#1000082</span>Status ledger in the world</a>
744
- <p class="goal__sub">The public status dashboard adopts the same token tier, so the outside view and the hall are one room.</p>
745
- <div class="goal__facts">
746
- <span class="status status--open">open</span>
747
- <span class="chip">status-ui</span>
748
- <span class="chip">BONGOS-V1</span>
749
- </div>
750
- <div class="roll">
751
- <span class="roll__d"><i class="dot--ready"></i><b>2</b> ready</span>
752
- </div>
753
- </div>
754
- <div class="goal__right">
755
- <span class="goal__next">The pillars, re-cut as hairlines</span>
756
- <a class="btn-accent" href="#/task/1003330">claim next</a>
757
- </div>
758
- </div>
759
- </div>
760
-
761
- <!-- Blocked -->
762
- <div class="group">
763
- <div class="group__head"><span class="group__name">Blocked</span><span class="group__n">2</span></div>
764
-
765
- <div class="goal">
766
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="0 of 6 criteria satisfied">
767
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
768
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="0 100.5" transform="rotate(-90 21 21)"></circle>
769
- <text class="ring__txt" x="21" y="25" text-anchor="middle">0/6</text></svg>
770
- <div>
771
- <a class="goal__title" href="#/goal/1000084"><span class="goal__id">#1000084</span>Execution integrity and tenant isolation</a>
772
- <p class="goal__sub">One instance may never read or write another's rows, files or secrets, and the pipeline must prove it did not.</p>
773
- <div class="goal__facts">
774
- <span class="status status--blocked">blocked</span>
775
- <span class="chip">kernel</span>
776
- <span class="chip">sessions</span>
777
- <span class="chip">lifecycle</span>
778
- <span class="chip">provisioning</span>
779
- <span class="chip chip--more">+6</span>
780
- </div>
781
- <div class="roll">
782
- <span class="roll__d"><i class="dot--blocked"></i><b>9</b> blocked</span>
783
- </div>
784
- </div>
785
- <div class="goal__right">
786
- <a class="tlink" href="#/goal/1000084">See what is blocking</a>
787
- </div>
788
- </div>
789
-
790
- <div class="goal">
791
- <svg class="ring" viewBox="0 0 42 42" role="img" aria-label="5 of 6 criteria satisfied">
792
- <circle class="ring__track" cx="21" cy="21" r="16"></circle>
793
- <circle class="ring__arc" cx="21" cy="21" r="16" stroke-dasharray="83.8 16.7" transform="rotate(-90 21 21)"></circle>
794
- <text class="ring__txt" x="21" y="25" text-anchor="middle">5/6</text></svg>
795
- <div>
796
- <a class="goal__title" href="#/goal/1000045"><span class="goal__id">#1000045</span>Public builder profiles</a>
797
- <p class="goal__sub">A builder's own page: standing, shipped work and the consent that puts any of it in public.</p>
798
- <div class="goal__facts">
799
- <span class="status status--blocked">blocked</span>
800
- <span class="chip">builder-settings</span>
801
- <span class="chip">hall-ui</span>
802
- <span class="chip">kernel</span>
803
- <span class="chip chip--more">+2</span>
804
- </div>
805
- <div class="roll">
806
- <span class="roll__d"><i class="dot--blocked"></i><b>2</b> blocked</span>
807
- </div>
808
- </div>
809
- <div class="goal__right">
810
- <a class="tlink" href="#/goal/1000045">See what is blocking</a>
811
- </div>
812
- </div>
813
- </div>
814
-
815
- <!-- Achieved -->
816
- <div class="group">
817
- <div class="group__head"><span class="group__name">Achieved</span><span class="group__n">3</span></div>
818
- <div class="pills">
819
- <a class="pill" href="#/goal/1000080">
820
- <svg class="pill__mark" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.4 8.4 6.6 11.5 12.6 4.9"/></svg>
821
- <b>Apex UI pass 2</b><span class="pill__id">#1000080</span></a>
822
- <a class="pill" href="#/goal/1000079">
823
- <svg class="pill__mark" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.4 8.4 6.6 11.5 12.6 4.9"/></svg>
824
- <b>Code quality: pay down the frozen debt and make enforcement durable</b><span class="pill__id">#1000079</span></a>
825
- <a class="pill" href="#/goal/1000061">
826
- <svg class="pill__mark" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.4 8.4 6.6 11.5 12.6 4.9"/></svg>
827
- <b>Apex UI pass, the front door and the project hub</b><span class="pill__id">#1000061</span></a>
828
- </div>
829
- </div>
830
-
831
- <!-- Archived -->
832
- <div class="group">
833
- <div class="group__head"><span class="group__name">Archived</span><span class="group__n">1</span></div>
834
- <div class="pills pills--muted">
835
- <a class="pill" href="#/goal/1000026">
836
- <svg class="pill__mark" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.4 8.4 6.6 11.5 12.6 4.9"/></svg>
837
- <b>Cloud Bongos productization and self-host</b><span class="pill__id">#1000026</span></a>
838
- </div>
839
- </div>
840
- </div>
841
-
842
- <!-- loading -------------------------------------------------------- -->
843
- <div class="s-loading" aria-hidden="true">
844
- <p class="count-line"><span class="skel" style="display:inline-block;width:132px"></span></p>
845
- <div class="readiness">
846
- <div class="stat"><span class="skel" style="display:block;width:88px"></span><p class="stat__fig"><span class="skel skel--fig" style="display:block;width:64px"></span></p></div>
847
- <div class="stat"><span class="skel" style="display:block;width:76px"></span><p class="stat__fig"><span class="skel skel--fig" style="display:block;width:52px"></span></p></div>
848
- <div class="stat"><span class="skel" style="display:block;width:60px"></span><p class="stat__fig"><span class="skel skel--fig" style="display:block;width:52px"></span></p></div>
849
- <div class="stat"><span class="skel" style="display:block;width:96px"></span><p class="stat__fig"><span class="skel skel--fig" style="display:block;width:80px"></span></p></div>
850
- </div>
851
- <div class="group">
852
- <div class="group__head"><span class="group__name">Active</span><span class="skel" style="width:18px"></span></div>
853
- <div class="goal"><span class="skel skel--ring"></span><div>
854
- <span class="skel skel--title" style="display:block;width:58%"></span>
855
- <span class="skel" style="display:block;width:76%;margin-top:9px"></span>
856
- <span class="skel" style="display:block;width:38%;margin-top:9px"></span></div>
857
- <div class="goal__right"><span class="skel" style="display:block;width:120px"></span></div></div>
858
- <div class="goal"><span class="skel skel--ring"></span><div>
859
- <span class="skel skel--title" style="display:block;width:44%"></span>
860
- <span class="skel" style="display:block;width:68%;margin-top:9px"></span>
861
- <span class="skel" style="display:block;width:31%;margin-top:9px"></span></div>
862
- <div class="goal__right"><span class="skel" style="display:block;width:120px"></span></div></div>
863
- <div class="goal"><span class="skel skel--ring"></span><div>
864
- <span class="skel skel--title" style="display:block;width:52%"></span>
865
- <span class="skel" style="display:block;width:71%;margin-top:9px"></span>
866
- <span class="skel" style="display:block;width:34%;margin-top:9px"></span></div>
867
- <div class="goal__right"><span class="skel" style="display:block;width:120px"></span></div></div>
868
- </div>
869
- <div class="group">
870
- <div class="group__head"><span class="group__name">Blocked</span><span class="skel" style="width:18px"></span></div>
871
- <div class="goal"><span class="skel skel--ring"></span><div>
872
- <span class="skel skel--title" style="display:block;width:49%"></span>
873
- <span class="skel" style="display:block;width:64%;margin-top:9px"></span></div>
874
- <div class="goal__right"><span class="skel" style="display:block;width:120px"></span></div></div>
875
- </div>
876
- <div class="group">
877
- <div class="group__head"><span class="group__name">Achieved</span><span class="skel" style="width:18px"></span></div>
878
- <div class="pills">
879
- <span class="skel" style="width:196px;height:32px;border-radius:999px"></span>
880
- <span class="skel" style="width:240px;height:32px;border-radius:999px"></span>
881
- <span class="skel" style="width:172px;height:32px;border-radius:999px"></span>
882
- </div>
883
- </div>
884
- </div>
885
-
886
- <!-- empty ---------------------------------------------------------- -->
887
- <div class="s-empty">
888
- <div class="notice">
889
- <h3 class="notice__h">No goals match these filters.</h3>
890
- <p class="notice__p">Twelve goals exist on this instance. None of them is open, scoped to hall-ui and owned by
891
- IAMMASTERQUA at once. Widen one filter, or clear them all.</p>
892
- <div class="notice__acts">
893
- <button type="button" class="btn-ghost">clear filters</button>
894
- <a class="tlink" href="/goals">See all 12 goals</a>
895
- </div>
896
- </div>
897
- </div>
898
-
899
- <!-- error ---------------------------------------------------------- -->
900
- <div class="s-error">
901
- <div class="notice notice--error">
902
- <h3 class="notice__h">The goals feed did not answer.</h3>
903
- <p class="notice__p">GET /api/bongos/goals returned 503 after two retries. Nothing here is stale data dressed up
904
- as fresh: the page is showing you the failure instead of the last thing it happened to hold.</p>
905
- <div class="notice__acts">
906
- <button type="button" class="btn-accent">retry</button>
907
- <a class="tlink" href="/watch">Open the Watch page</a>
908
- </div>
909
- </div>
910
- </div>
911
- </section>
912
-
913
- <!-- ============ THE SEAM ============ -->
914
- <hr class="seam">
915
- <p class="seam-lab">Goal detail · #1000081</p>
916
-
917
- <!-- ============ THE DETAIL ============ -->
918
- <section class="detail" aria-labelledby="detail-h">
919
- <div class="detail__head">
920
- <div class="detail__headmain">
921
- <h2 class="detail__title" id="detail-h"><span class="goal__id">#1000081</span>Builders' hall in the world</h2>
922
- <p class="detail__sub">The 27-page hall adopts the apex world: five archetype mocks, one shell, every page family re-skinned.</p>
923
- <div class="disclosure">
924
- <button type="button" class="disclosure__btn" id="claude-notes-btn" aria-expanded="false" aria-controls="claude-notes-body">
925
- <svg class="disclosure__chev" viewBox="0 0 10 10" aria-hidden="true"><path d="M3.4 1.6 6.8 5 3.4 8.4"/></svg>
926
- Claude's notes on this goal</button>
927
- <div class="disclosure__body" id="claude-notes-body">
928
- <p style="margin:0">The hall is 27 pages built over two years by a dozen sessions, and it shows: three
929
- competing card treatments, four grey ramps, page-local colour in nine stylesheets. The round settles the
930
- composition first, on five archetypes that cover every page family, so the re-skin is a port and not
931
- twenty-seven arguments. The shell lands second, once a composition is picked.</p>
932
- </div>
933
- </div>
934
- <div class="detail__meta">
935
- <span class="chip">BONGOS-V1</span>
936
- <span class="status status--open">open</span>
937
- <span>scope</span>
938
- <span class="chip">hall-ui</span>
939
- <span>·</span>
940
- <span>opened by Percy Jackson</span>
941
- <span>·</span>
942
- <span class="num">last work 2026-08-30</span>
943
- </div>
944
- </div>
945
- <div class="detail__actions" id="goal-detail-actions">
946
- <button type="button" class="btn-ghost">make private</button>
947
- <button type="button" class="btn-accent">join goal</button>
948
- </div>
949
- </div>
950
-
951
- <div class="band">
952
- <div class="band__col">
953
- <div class="col__head"><h3 class="col__h">Completion</h3><span class="count-pill">0 / 3</span></div>
954
- <p class="col__lede">The done-when criteria. A goal is achieved when every one is confirmed, never before.</p>
955
- <ul class="crits">
956
- <li class="crit">
957
- <span class="crit__mark"></span>
958
- <div><span class="crit__key">hall-archetypes-approved</span>
959
- <p class="crit__detail">Five archetype mocks, three versions each, and the owner has picked one composition per archetype.</p></div>
960
- </li>
961
- <li class="crit">
962
- <span class="crit__mark"></span>
963
- <div><span class="crit__key">hall-shell-in-world</span>
964
- <p class="crit__detail">One shell: sidebar, topbar, rail and drawer, on the hall's own token tier.</p></div>
965
- </li>
966
- <li class="crit">
967
- <span class="crit__mark"></span>
968
- <div><span class="crit__key">hall-pages-reskinned</span>
969
- <p class="crit__detail">All 27 hall pages render on that shell with no page-local colour left anywhere.</p></div>
970
- </li>
971
- </ul>
972
- <div class="col__foot"><a class="tlink" href="#/goal/1000081/completion">View all 3</a></div>
973
- </div>
974
-
975
- <div class="band__col">
976
- <div class="col__head"><h3 class="col__h">Members</h3><span class="count-pill">3</span></div>
977
- <p class="col__lede">Who is on this goal, and what they have contributed to it.</p>
978
- <div class="invite" id="goal-invite">
979
- <button type="button" class="disclosure__btn" id="invite-btn" aria-expanded="true" aria-controls="invite-body">
980
- <svg class="disclosure__chev" viewBox="0 0 10 10" aria-hidden="true"><path d="M3.4 1.6 6.8 5 3.4 8.4"/></svg>
981
- Invite a builder</button>
982
- <div class="invite__form" id="invite-body">
983
- <label class="field__lab" for="goal-invite-builder" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Builder</label>
984
- <select id="goal-invite-builder"><option>Choose a builder</option><option>scootermack</option><option>lars589</option></select>
985
- <button type="button" class="btn-xs">send</button>
986
- </div>
987
- </div>
988
- <div class="pending" id="goal-pending">
989
- <p class="pending__h">Invitations <span class="count-pill">1</span></p>
990
- <div class="pending__row">
991
- <span class="pending__who">scootermack</span>
992
- <span class="pending__note">invited by Percy Jackson, 2 days ago</span>
993
- <span class="pending__acts"><button type="button" class="btn-xs">revoke</button></span>
994
- </div>
995
- <p class="pending__h" style="margin-top:12px">Join requests <span class="count-pill">1</span></p>
996
- <div class="pending__row">
997
- <span class="pending__who">IAMMASTERQUA</span>
998
- <span class="pending__note">"I can take the reading pages"</span>
999
- <span class="pending__acts">
1000
- <button type="button" class="btn-xs">decline</button>
1001
- <button type="button" class="btn-xs">admit</button></span>
1002
- </div>
1003
- </div>
1004
- <ul class="members" id="goal-members">
1005
- <li class="member"><span class="member__avatar"></span>
1006
- <span class="member__name">Percy Jackson <small>@jaxri</small></span>
1007
- <span class="member__pill">lead</span></li>
1008
- <li class="member"><span class="member__avatar"></span>
1009
- <span class="member__name">lars589 <small>Owner</small></span>
1010
- <span class="member__pill">member</span></li>
1011
- <li class="member"><span class="member__avatar"></span>
1012
- <span class="member__name">scootermack <small>Owner</small></span>
1013
- <span class="member__pill">member</span></li>
1014
- </ul>
1015
- <div class="col__foot"><a class="tlink" href="#/goal/1000081/members">View all 3</a></div>
1016
- </div>
1017
-
1018
- <div class="band__col" id="goal-conflicts-card">
1019
- <div class="col__head"><h3 class="col__h">Conflicts</h3><span class="count-pill">2</span></div>
1020
- <p class="col__lede">Open tasks whose declared files overlap. Sequence these before two builders collide.</p>
1021
- <div class="conflict">
1022
- <span class="conflict__pair">1003303 and 1003304</span>
1023
- <span class="conflict__sev conflict__sev--high">high</span>
1024
- <p class="conflict__paths">modules/hall-ui/public/style.css<br>modules/hall-ui/public/shell.js</p>
1025
- </div>
1026
- <div class="conflict">
1027
- <span class="conflict__pair">1003305 and 1003307</span>
1028
- <span class="conflict__sev conflict__sev--medium">medium</span>
1029
- <p class="conflict__paths">modules/hall-ui/public/work.css</p>
1030
- </div>
1031
- <div class="col__foot"><a class="tlink" href="#/goal/1000081/conflicts">View all 2</a></div>
1032
- </div>
1033
- </div>
1034
-
1035
- <div class="tasks">
1036
- <div class="tasks__head">
1037
- <h3 class="col__h">Tasks</h3>
1038
- <div class="tabs" role="tablist" aria-label="Goal tasks">
1039
- <button type="button" class="tab" id="tab-todo" role="tab" aria-selected="true" aria-controls="pane-todo">to do</button>
1040
- <button type="button" class="tab" id="tab-done" role="tab" aria-selected="false" aria-controls="pane-done">completed</button>
1041
- </div>
1042
- </div>
1043
-
1044
- <div id="pane-todo" role="tabpanel" aria-labelledby="tab-todo">
1045
- <div class="tasks__bar">
1046
- <div class="field">
1047
- <label class="field__lab" for="f-goal-search">Search</label>
1048
- <input id="f-goal-search" type="search" placeholder="task # or title">
1049
- </div>
1050
- <div class="field">
1051
- <label class="field__lab" for="f-goal-sort">Sort</label>
1052
- <select id="f-goal-sort"><option>credits / minute</option><option>credits</option><option>minutes</option><option>priority</option></select>
1053
- </div>
1054
- <div class="field">
1055
- <label class="field__lab" for="f-goal-kind">Kind</label>
1056
- <select id="f-goal-kind"><option>any</option><option>ui</option><option>engineer</option><option>infra</option></select>
1057
- </div>
1058
- </div>
1059
- <p class="count-line">8 tasks to do · 0 claimable now</p>
1060
-
1061
- <div class="task">
1062
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003302" disabled></span>
1063
- <div>
1064
- <a class="task__title" href="#/task/1003302"><span class="task__id">1003302</span> Hall composition round: five archetype mocks, three versions each</a>
1065
- <div class="task__tags">
1066
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1067
- </div>
1068
- <div class="task__figs"><span><b>90</b> credits</span><span><b>240</b>m</span><span><b>0.38</b> credits/min</span><span><b>15</b> files</span></div>
1069
- </div>
1070
- <div class="task__right">
1071
- <span class="pri pri--p1">P1</span>
1072
- <span class="quiet">claimed by Percy Jackson</span>
1073
- </div>
1074
- </div>
1075
-
1076
- <div class="task">
1077
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003303" disabled></span>
1078
- <div>
1079
- <a class="task__title" href="#/task/1003303"><span class="task__id">1003303</span> Hall shell in the world: sidebar, topbar, style.css token tier and the hall-kit primitives</a>
1080
- <div class="task__tags">
1081
- <span class="chip">ui</span><span class="chip">hall-ui</span><span class="chip">newcomer</span>
1082
- </div>
1083
- <div class="task__figs"><span><b>80</b> credits</span><span><b>180</b>m</span><span><b>0.44</b> credits/min</span><span><b>6</b> files</span></div>
1084
- </div>
1085
- <div class="task__right">
1086
- <span class="pri pri--p1">P1</span>
1087
- <span class="quiet">backlog</span>
1088
- </div>
1089
- </div>
1090
-
1091
- <div class="task">
1092
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003304" disabled></span>
1093
- <div>
1094
- <a class="task__title" href="#/task/1003304"><span class="task__id">1003304</span> Hall pages in the world: work board and home</a>
1095
- <div class="task__tags">
1096
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1097
- </div>
1098
- <div class="task__figs"><span><b>60</b> credits</span><span><b>150</b>m</span><span><b>0.40</b> credits/min</span><span><b>4</b> files</span></div>
1099
- </div>
1100
- <div class="task__right">
1101
- <span class="pri pri--p2">P2</span>
1102
- <span class="quiet">backlog</span>
1103
- </div>
1104
- </div>
1105
-
1106
- <div class="task">
1107
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003305" disabled></span>
1108
- <div>
1109
- <a class="task__title" href="#/task/1003305"><span class="task__id">1003305</span> Hall pages in the world: task detail, idea and ideas</a>
1110
- <div class="task__tags">
1111
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1112
- </div>
1113
- <div class="task__figs"><span><b>60</b> credits</span><span><b>140</b>m</span><span><b>0.43</b> credits/min</span><span><b>5</b> files</span></div>
1114
- </div>
1115
- <div class="task__right">
1116
- <span class="pri pri--p2">P2</span>
1117
- <span class="quiet">backlog</span>
1118
- </div>
1119
- </div>
1120
-
1121
- <div class="task">
1122
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003306" disabled></span>
1123
- <div>
1124
- <a class="task__title" href="#/task/1003306"><span class="task__id">1003306</span> Hall pages in the world: reading rooms - primer, diagrams, roadmap, ranks</a>
1125
- <div class="task__tags">
1126
- <span class="chip">ui</span><span class="chip">hall-ui</span><span class="chip">newcomer</span>
1127
- </div>
1128
- <div class="task__figs"><span><b>55</b> credits</span><span><b>120</b>m</span><span><b>0.46</b> credits/min</span><span><b>9</b> files</span></div>
1129
- </div>
1130
- <div class="task__right">
1131
- <span class="pri pri--p2">P2</span>
1132
- <span class="quiet">backlog</span>
1133
- </div>
1134
- </div>
1135
-
1136
- <div class="task">
1137
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003307" disabled></span>
1138
- <div>
1139
- <a class="task__title" href="#/task/1003307"><span class="task__id">1003307</span> Hall pages in the world: governance and lists - goals, government, modules, drachmae, watch, harbor, gate, sessions, people, scouting, collab, copy desk, atlas</a>
1140
- <div class="task__tags">
1141
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1142
- </div>
1143
- <div class="task__figs"><span><b>120</b> credits</span><span><b>300</b>m</span><span><b>0.40</b> credits/min</span><span><b>22</b> files</span></div>
1144
- </div>
1145
- <div class="task__right">
1146
- <span class="pri pri--p2">P2</span>
1147
- <span class="quiet">backlog</span>
1148
- </div>
1149
- </div>
1150
-
1151
- <div class="task">
1152
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003308" disabled></span>
1153
- <div>
1154
- <a class="task__title" href="#/task/1003308"><span class="task__id">1003308</span> Hall pages in the world: settings, profile, pair, my-projects, not-ready</a>
1155
- <div class="task__tags">
1156
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1157
- </div>
1158
- <div class="task__figs"><span><b>40</b> credits</span><span><b>90</b>m</span><span><b>0.44</b> credits/min</span><span><b>11</b> files</span></div>
1159
- </div>
1160
- <div class="task__right">
1161
- <span class="pri pri--p3">P3</span>
1162
- <span class="quiet">backlog</span>
1163
- </div>
1164
- </div>
1165
-
1166
- <div class="task">
1167
- <span class="task__pick"><input type="checkbox" aria-label="Select task 1003309" disabled></span>
1168
- <div>
1169
- <a class="task__title" href="#/task/1003309"><span class="task__id">1003309</span> Verify the hall in the world: both modes, every page, gates, keyboard and tests</a>
1170
- <div class="task__tags">
1171
- <span class="chip">ui</span><span class="chip">hall-ui</span>
1172
- </div>
1173
- <div class="task__figs"><span><b>50</b> credits</span><span><b>120</b>m</span><span><b>0.42</b> credits/min</span><span><b>8</b> files</span></div>
1174
- </div>
1175
- <div class="task__right">
1176
- <span class="pri pri--p3">P3</span>
1177
- <span class="quiet">backlog</span>
1178
- </div>
1179
- </div>
1180
- </div>
1181
-
1182
- <div id="pane-done" role="tabpanel" aria-labelledby="tab-done" hidden>
1183
- <div class="notice">
1184
- <h3 class="notice__h">Nothing has shipped on this goal yet.</h3>
1185
- <p class="notice__p">All eight tasks are still to do. The first one to ship lands here with its kind, its
1186
- credits and the date it went out.</p>
1187
- </div>
1188
- </div>
1189
-
1190
- <div class="bulk" role="region" aria-label="Bulk actions">
1191
- <span class="bulk__count">0 tasks selected · every task in this goal is backlog</span>
1192
- <div class="bulk__acts">
1193
- <button type="button" class="btn-ghost" disabled>clear</button>
1194
- <button type="button" class="btn-accent" disabled>bulk claim</button>
1195
- </div>
1196
- </div>
1197
- </div>
1198
- </section>
1199
-
1200
- </main>
1201
-
1202
- <script>
1203
- /* the mock's state contract: read ?state= once and apply it. Nothing is built here, and no motion. */
1204
- (function () {
1205
- var ok = ['populated', 'loading', 'empty', 'error', 'rail', 'drawer', 'focus'];
1206
- var s = new URLSearchParams(location.search || location.hash.slice(1) || '').get('state') || 'populated';
1207
- if (ok.indexOf(s) === -1) s = 'populated';
1208
- document.body.setAttribute('data-state', s);
1209
- })();
1210
- </script>
1211
- </body>
1212
- </html>