@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,625 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <script>
6
- (function(){try{var q=new URLSearchParams(location.search).get('mode');var m=(q==='light'||q==='dark')?q:localStorage.getItem('cb-color-mode');if(m==='light'||m==='dark')document.documentElement.setAttribute('data-mode',m);}catch(e){}})();
7
- </script>
8
- <meta name="viewport" content="width=device-width, initial-scale=1">
9
- <title>Tasks, Builders' Hall</title>
10
- <link rel="preconnect" href="https://fonts.googleapis.com">
11
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
12
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Nunito:wght@400;600;800&display=swap" rel="stylesheet">
13
- <link rel="stylesheet" href="_tokens.css">
14
- <style>
15
- *,*::before,*::after{box-sizing:border-box}
16
- html,body{margin:0;padding:0}
17
- body{
18
- min-height:100vh;background:var(--bg-frame);color:var(--ink);
19
- font-family:var(--font-body);font-size:.95rem;line-height:1.5;
20
- -webkit-font-smoothing:antialiased;
21
- }
22
- ::selection{background:var(--accent);color:var(--on-accent)}
23
- :focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:8px}
24
- .vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
25
- svg{display:block}
26
-
27
- /* ------------- the ground: forest plate, tint, leaves at the edge, grain ------------- */
28
- .ground{position:fixed;inset:0;z-index:0;overflow:hidden}
29
- .g-forest{position:absolute;inset:0;background-image:var(--plate-forest);background-size:cover;background-position:center;filter:var(--forest-filter);transform:scale(1.06)}
30
- .g-tint{position:absolute;inset:0;background:var(--hall-tint)}
31
- .g-leaf{
32
- position:absolute;inset:0;opacity:var(--leaf-op);
33
- background-image:var(--plate-leaf);background-size:auto 118%;background-position:right center;background-repeat:no-repeat;
34
- }
35
- .g-grain{position:absolute;inset:0;background-image:var(--grain);opacity:var(--grain-op);mix-blend-mode:overlay}
36
-
37
- /* ------------- the shell ------------- */
38
- .page{position:relative;z-index:1;min-height:100vh;padding:30px clamp(14px,4.4vw,64px)}
39
- .shell{
40
- display:grid;grid-template-columns:240px minmax(0,1fr);grid-template-rows:minmax(0,1fr);
41
- height:calc(100vh - 60px);border-radius:var(--radius);overflow:hidden;
42
- background:var(--glass);
43
- -webkit-backdrop-filter:var(--glass-filter);backdrop-filter:var(--glass-filter);
44
- border:var(--line) solid var(--glass-edge);
45
- box-shadow:var(--shadow-lift),var(--glass-inner);
46
- }
47
-
48
- /* ------------- sidebar ------------- */
49
- .side{
50
- display:flex;flex-direction:column;min-height:0;
51
- background:var(--side-bg);border-right:var(--line) solid var(--side-edge);
52
- }
53
- .side-brand{
54
- display:var(--side-brand);align-items:center;gap:10px;
55
- padding:16px 18px;border-bottom:var(--line) solid var(--side-edge);
56
- }
57
- .side-brand svg{flex:none}
58
- .side-brand b{
59
- font:var(--label-weight) .72rem/1.35 var(--label-font);
60
- letter-spacing:var(--label-ls);text-transform:uppercase;color:var(--ink);
61
- }
62
- .side-nav{flex:1 1 auto;min-height:0;overflow-y:auto;padding:12px 12px 14px}
63
- .side-nav ul{list-style:none;margin:0 0 6px;padding:0}
64
- .grp-label{
65
- margin:12px 0 5px;padding:0 10px;
66
- font-family:var(--label-font);font-weight:var(--label-weight);font-size:.66rem;
67
- letter-spacing:var(--label-ls);text-transform:uppercase;color:var(--ink-faint);
68
- }
69
- .nav{
70
- display:flex;align-items:center;gap:11px;
71
- padding:6px 11px;margin-bottom:1px;border-radius:var(--radius-sm);
72
- text-decoration:none;color:var(--ink-soft);
73
- font-family:var(--nav-font);font-weight:var(--nav-weight);font-size:.86rem;
74
- letter-spacing:var(--nav-ls);text-transform:var(--nav-tt);
75
- transition:background .16s ease,color .16s ease;
76
- }
77
- .nav svg{width:17px;height:17px;flex:none;opacity:.85}
78
- .nav:hover{background:var(--nav-hover);color:var(--ink)}
79
- .nav[aria-current="page"]{background:var(--nav-cur-bg);color:var(--nav-cur-fg);font-weight:700}
80
- .nav[aria-current="page"] svg{opacity:1}
81
- .side-foot{padding:12px;border-top:var(--line) solid var(--side-edge)}
82
-
83
- /* ------------- top bar ------------- */
84
- .col{display:flex;flex-direction:column;min-width:0}
85
- .top{
86
- height:56px;flex:none;display:flex;align-items:center;gap:clamp(10px,1.6vw,22px);
87
- padding:0 clamp(14px,2vw,26px);border-bottom:var(--line) solid var(--rule-soft);
88
- background:var(--panel);
89
- }
90
- .top-mark{
91
- font-family:var(--font-display);font-weight:800;font-size:1.22rem;letter-spacing:-.012em;
92
- color:var(--ink);white-space:nowrap;
93
- }
94
- .search{
95
- flex:1 1 auto;max-width:430px;position:relative;display:flex;align-items:center;
96
- }
97
- .search svg{position:absolute;left:15px;width:17px;height:17px;color:var(--ink-faint);pointer-events:none}
98
- .search input{
99
- width:100%;height:40px;padding:0 16px 0 42px;font:inherit;font-size:.92rem;
100
- color:var(--ink);background:var(--input-bg);
101
- border:var(--line) solid var(--input-bd);border-radius:var(--radius-pill);
102
- }
103
- .search input::placeholder{
104
- color:var(--ink-faint);font-family:var(--label-font);font-size:.82rem;
105
- letter-spacing:var(--label-ls);text-transform:var(--nav-tt);
106
- }
107
- .top-right{margin-left:auto;display:flex;align-items:center;gap:10px}
108
- .rank{
109
- display:inline-flex;align-items:center;gap:7px;padding:7px 15px;border-radius:var(--radius-pill);
110
- background:var(--rank-bg);color:var(--rank-fg);
111
- border:var(--line) solid var(--rank-bd);
112
- font-family:var(--label-font);font-weight:700;font-size:.76rem;
113
- letter-spacing:var(--label-ls);text-transform:uppercase;white-space:nowrap;
114
- }
115
- .rank svg{width:15px;height:15px}
116
- .avatar{
117
- width:32px;height:32px;flex:none;border-radius:50%;display:grid;place-items:center;
118
- background:var(--accent-deep);color:var(--cream);font-weight:800;font-size:.9rem;
119
- box-shadow:inset 0 1px 0 rgba(255,255,255,.22);
120
- }
121
- .caret{width:14px;height:14px;color:var(--ink-faint)}
122
- .mode-toggle{
123
- width:54px;height:30px;flex:none;padding:0;cursor:pointer;
124
- border-radius:var(--radius-pill);border:var(--line) solid var(--toggle-bd);
125
- background:var(--toggle-bg);color:var(--ink);
126
- display:inline-flex;align-items:center;justify-content:center;
127
- }
128
- .mode-toggle:hover{border-color:var(--accent)}
129
- .mt-ico{position:relative;width:18px;height:18px}
130
- .mt-ico svg{position:absolute;inset:0;width:18px;height:18px}
131
- .i-moon{opacity:var(--moon-o)}
132
- .i-sun{opacity:var(--sun-o)}
133
-
134
- /* ------------- main ------------- */
135
- /* the board scrolls INSIDE its own frame so the bulk bar and the pager stay in the first viewport:
136
- "1 to 10 of 42" is the orientation fact this surface owes on sight */
137
- main{flex:1 1 auto;min-width:0;min-height:0;padding:18px clamp(14px,2vw,26px) 20px;overflow:auto;display:flex;flex-direction:column}
138
- .inner{max-width:1120px;width:100%;flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
139
- [role="tabpanel"]{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
140
- [role="tabpanel"][hidden]{display:none}
141
- h1{margin:0 0 11px;font-family:var(--font-display);font-weight:800;font-size:1.95rem;letter-spacing:-.024em}
142
-
143
- .tabs{display:flex;flex-wrap:wrap;gap:9px;margin-bottom:12px}
144
- .tab{
145
- display:inline-flex;align-items:center;gap:8px;cursor:pointer;
146
- padding:9px 18px;border-radius:var(--tab-radius);
147
- font:inherit;font-weight:700;font-size:.88rem;
148
- background:var(--tab-bg);border:var(--line) solid var(--tab-bd);color:var(--ink-soft);
149
- transition:background .16s ease,color .16s ease;
150
- }
151
- .tab:hover{background:var(--row-hover);color:var(--ink)}
152
- .tab[aria-selected="true"]{background:var(--tab-sel-bg);color:var(--tab-sel-fg);box-shadow:var(--tab-sel-line)}
153
- .cnt{
154
- font-variant-numeric:tabular-nums;font-size:.8rem;font-weight:600;opacity:.78;
155
- padding:1px 8px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--ink) 13%,transparent);
156
- }
157
-
158
- .filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:13px;align-items:center}
159
- .f-search{position:relative;display:flex;align-items:center;flex:1 1 210px;max-width:250px}
160
- .f-search svg{position:absolute;left:13px;width:15px;height:15px;color:var(--ink-faint);pointer-events:none}
161
- .f-search input{
162
- width:100%;height:36px;padding:0 14px 0 36px;font:inherit;font-size:.85rem;color:var(--ink);
163
- background:var(--input-bg);border:var(--line) solid var(--input-bd);border-radius:var(--radius-pill);
164
- }
165
- .f-search input::placeholder{color:var(--ink-faint)}
166
- .sel{
167
- position:relative;display:inline-flex;align-items:center;height:34px;
168
- background:var(--input-bg);border:var(--line) solid var(--input-bd);border-radius:var(--radius-pill);
169
- }
170
- .sel:focus-within{border-color:var(--accent)}
171
- .sel > label{
172
- flex:none;padding-left:11px;pointer-events:none;white-space:nowrap;
173
- font-family:var(--label-font);font-weight:var(--label-weight);font-size:.61rem;
174
- letter-spacing:.02em;text-transform:uppercase;color:var(--ink-faint);
175
- }
176
- .sel select{
177
- -webkit-appearance:none;appearance:none;
178
- height:32px;padding:0 23px 0 6px;font:inherit;font-size:.77rem;font-weight:600;
179
- color:var(--ink-soft);background:transparent;
180
- border:0;border-radius:var(--radius-pill);cursor:pointer;
181
- font-family:var(--nav-font);letter-spacing:var(--nav-ls);text-transform:var(--nav-tt);
182
- }
183
- .sel select option{color:var(--opt-fg);background:var(--opt-bg)}
184
- .sel::after{
185
- content:"";position:absolute;right:11px;top:50%;width:7px;height:7px;pointer-events:none;
186
- border-right:1.6px solid var(--ink-faint);border-bottom:1.6px solid var(--ink-faint);
187
- transform:translateY(-70%) rotate(45deg);
188
- }
189
- .sel:hover::after{border-color:var(--ink)}
190
-
191
- /* ------------- the board ------------- */
192
- .table-wrap{
193
- flex:1 1 auto;min-height:0;
194
- border-radius:var(--radius);overflow:auto;border:var(--line) solid var(--panel-edge);
195
- background:var(--panel);box-shadow:var(--shadow-card);
196
- }
197
- table{width:100%;min-width:920px;border-collapse:collapse;font-size:.87rem}
198
- thead th{
199
- position:sticky;top:0;z-index:1;
200
- background:var(--thead-bg);color:var(--ink-soft);text-align:left;
201
- font-family:var(--th-font);font-weight:var(--th-weight);font-size:.76rem;
202
- letter-spacing:var(--th-ls);text-transform:var(--th-tt);
203
- padding:10px 12px;border-bottom:var(--line) solid var(--rule);white-space:nowrap;
204
- }
205
- tbody td{padding:9px 12px;border-bottom:var(--line) solid var(--rule-soft);vertical-align:middle}
206
- tbody tr:last-child td{border-bottom:0}
207
- tbody tr:nth-child(even){background:var(--row-alt)}
208
- tbody tr:hover{background:var(--row-hover)}
209
- /* a row someone else holds is dimmed with a MUTED INK, not opacity: opacity composites every cell
210
- against the panel and drops the text under the 4.5:1 floor where no checker can see it */
211
- tbody tr.is-held td,
212
- tbody tr.is-held .tid,
213
- tbody tr.is-held .ttl,
214
- tbody tr.is-held .goal,
215
- tbody tr.is-held .state{color:var(--ink-held)}
216
- .c-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;width:72px}
217
- th.c-num{text-align:right}
218
- .tid{font-family:var(--font-mono);font-size:.8rem;font-variant-numeric:tabular-nums;color:var(--ink-soft);white-space:nowrap;width:88px}
219
- .ttl{font-weight:600;color:var(--ink)}
220
- .goal{color:var(--ink-faint);white-space:nowrap;width:190px;font-size:.85rem}
221
- .state{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;font-weight:600}
222
- .seed{width:10px;height:10px;flex:none;border-radius:50% 50% 50% 0;transform:rotate(-45deg);background:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
223
- .seed--held{background:transparent;border:1.6px solid var(--ink-faint);box-shadow:none}
224
- .state svg{width:14px;height:14px}
225
- td.conflict{
226
- color:var(--hatch-ink);font-weight:700;white-space:nowrap;
227
- background-image:repeating-linear-gradient(45deg,var(--hatch) 0 2px,transparent 2px 7px);
228
- }
229
- tr.is-conflict{background:color-mix(in srgb,var(--hatch) 22%,transparent)}
230
-
231
- /* checkbox */
232
- .cbx{
233
- -webkit-appearance:none;appearance:none;margin:0;cursor:pointer;
234
- width:18px;height:18px;border-radius:5px;
235
- border:1.6px solid var(--input-bd);background:var(--input-bg);
236
- display:grid;place-items:center;transition:background .14s ease,border-color .14s ease;
237
- }
238
- .cbx:hover{border-color:var(--accent)}
239
- .cbx:checked{background:var(--accent);border-color:var(--accent)}
240
- .cbx::after{
241
- content:"";width:5px;height:9px;margin-top:-2px;opacity:0;
242
- border-right:2px solid var(--on-accent);border-bottom:2px solid var(--on-accent);
243
- transform:rotate(42deg);
244
- }
245
- .cbx:checked::after{opacity:1}
246
- .c-sel{width:40px}
247
-
248
- /* ------------- bulk bar + pager ------------- */
249
- .bulk{
250
- margin-top:12px;display:flex;flex-wrap:wrap;align-items:center;gap:10px;
251
- padding:12px 16px;border-radius:var(--radius);
252
- background:var(--panel);border:var(--line) solid var(--panel-edge);box-shadow:var(--shadow-card);
253
- }
254
- .sel-count{
255
- font-family:var(--label-font);font-weight:var(--label-weight);font-size:.76rem;
256
- letter-spacing:var(--label-ls);text-transform:uppercase;color:var(--ink-faint);
257
- margin-right:4px;font-variant-numeric:tabular-nums;
258
- }
259
- .bulk-right{margin-left:auto;display:flex;gap:10px;flex-wrap:wrap}
260
- .btn{
261
- cursor:pointer;font:inherit;font-weight:700;font-size:.84rem;white-space:nowrap;
262
- padding:10px 20px;border-radius:var(--radius-pill);border:1.4px solid transparent;
263
- font-family:var(--nav-font);letter-spacing:var(--nav-ls);text-transform:var(--nav-tt);
264
- transition:transform .18s cubic-bezier(.16,1,.3,1),box-shadow .18s ease,background .16s ease;
265
- }
266
- .btn:hover{transform:translateY(-1px)}
267
- .btn-1{background:var(--btn-1-bg);color:var(--btn-1-fg);box-shadow:var(--shadow-card)}
268
- .btn-2{background:var(--btn-2-bg);color:var(--btn-2-fg);border-color:var(--btn-2-bd);box-shadow:var(--shadow-card)}
269
- .btn-out{background:var(--btn-o-bg);color:var(--btn-o-fg);border-color:var(--btn-o-bd)}
270
- .btn-out:hover{background:var(--nav-hover)}
271
- .signout{width:100%;display:inline-flex;align-items:center;justify-content:center;gap:9px;padding:10px 14px}
272
- .signout svg{width:16px;height:16px}
273
-
274
- .pager{
275
- margin-top:12px;display:flex;align-items:center;gap:12px;
276
- color:var(--ink-faint);font-size:.84rem;font-variant-numeric:tabular-nums;
277
- }
278
- .pager .btn{padding:7px 16px;font-size:.8rem}
279
- .pager span{margin-right:auto}
280
- .empty{
281
- padding:56px 20px;text-align:center;color:var(--ink-faint);
282
- border-radius:var(--radius);border:var(--line) dashed var(--rule);background:var(--panel);
283
- }
284
-
285
- /* ------------- scrollbars ------------- */
286
- .side-nav::-webkit-scrollbar,.table-wrap::-webkit-scrollbar,main::-webkit-scrollbar{width:10px;height:10px}
287
- .side-nav::-webkit-scrollbar-track,.table-wrap::-webkit-scrollbar-track,main::-webkit-scrollbar-track{background:var(--sb-track)}
288
- .side-nav::-webkit-scrollbar-thumb,.table-wrap::-webkit-scrollbar-thumb,main::-webkit-scrollbar-thumb{background:var(--sb-thumb);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:padding-box}
289
- .side-nav,.table-wrap,main{scrollbar-width:thin;scrollbar-color:var(--sb-thumb) transparent}
290
-
291
- @media (min-width:1024px){
292
- .side-nav{
293
- -webkit-mask-image:linear-gradient(180deg,#000 0 calc(100% - 30px),transparent 100%);
294
- mask-image:linear-gradient(180deg,#000 0 calc(100% - 30px),transparent 100%);
295
- }
296
- }
297
-
298
- @media (max-width:1023px){
299
- .page{padding:12px}
300
- .shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto;height:auto;min-height:0}
301
- .side{border-right:0;border-bottom:var(--line) solid var(--rule-soft)}
302
- .side-brand{display:none}
303
- .side-nav{display:flex;gap:6px;overflow-x:auto;overflow-y:hidden;padding:10px 12px}
304
- .side-nav ul{display:flex;gap:6px;margin:0}
305
- .grp-label{display:none}
306
- .nav{margin:0;white-space:nowrap;padding:8px 13px}
307
- .side-foot{border-top:0;padding:0 12px 10px}
308
- .signout{width:auto}
309
- .top{height:auto;flex-wrap:wrap;padding:12px 14px;gap:10px}
310
- .search{max-width:none;order:3;flex-basis:100%}
311
- main{padding:16px 14px 22px}
312
- h1{font-size:1.7rem}
313
- .bulk-right{margin-left:0}
314
- }
315
- </style>
316
- </head>
317
- <body>
318
- <!--
319
- THESIS: one work board, two finished modes of one world. It refuses the dashboard that decorates its
320
- chrome and leaves the rows generic; expression lives in material, the rows stay scannable at a glance.
321
- OWN-WORLD: dark, a soft-focus forest read THROUGH translucent glass panels with a 1px light edge
322
- (hall-2); light, pale sage ground with near-white hairline cards and small uppercase mono labels
323
- (hall-1). Sea green, bark brown, one lit tan. Nunito, 22px containers, circular badges.
324
- STORY: a builder scans forty-two claimable tasks by credits per minute, sees which are held or in
325
- conflict, selects and claims without leaving the board.
326
- FIRST VIEWPORT: 240px sidebar left with Sign out pinned, 56px top bar, Tasks with four counted tabs,
327
- nine filters, the ten-row board, bulk bar and pager. Tan lights only the current page, the selected
328
- tab, the ready seed and the one primary action.
329
- FORM: no seed key. This is new-work section 3, extend an existing surface: the organic-cards world is already
330
- committed and the owner pinned hall-1 and hall-2 as the comps, so no concept tournament was run by instruction.
331
- FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review and the verdict.
332
- -->
333
-
334
- <div class="ground" aria-hidden="true">
335
- <div class="g-forest"></div>
336
- <div class="g-tint"></div>
337
- <div class="g-leaf"></div>
338
- <div class="g-grain"></div>
339
- </div>
340
-
341
- <div class="page">
342
- <div class="shell">
343
-
344
- <aside class="side">
345
- <div class="side-brand">
346
- <svg width="26" height="20" viewBox="0 0 68 52" aria-hidden="true" focusable="false">
347
- <path d="M4 15c1 12 4 21 6 26a13 5 0 0 0 26 0c2-5 5-14 6-26Z" style="fill:var(--accent-deep)"/>
348
- <ellipse cx="23" cy="15" rx="19" ry="7" style="fill:var(--accent)"/>
349
- <ellipse cx="23" cy="15" rx="14" ry="4.6" style="fill:var(--skin-mid)"/>
350
- <path d="M40 21c1 9 3 16 5 20a10 4 0 0 0 20 0c2-4 4-11 5-20Z" style="fill:var(--terracotta)"/>
351
- <ellipse cx="55" cy="21" rx="15" ry="5.6" style="fill:var(--accent)"/>
352
- <ellipse cx="55" cy="21" rx="11" ry="3.6" style="fill:var(--skin-mid)"/>
353
- </svg>
354
- <b>Cloud Bongos<br>Builders' Hall</b>
355
- </div>
356
-
357
- <nav class="side-nav" aria-label="Hall">
358
- <ul>
359
- <li><a class="nav" href="/hall"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 11.2 12 3.6l9 7.6"/><path d="M5.6 9.6V20h12.8V9.6"/></svg>Home</a></li>
360
- <li><a class="nav" href="/hall/roadmap"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 4 3 6.4v13.2L9 17.2l6 2.4 6-2.4V6.4L15 8.8 9 6.4z"/><path d="M9 4v13.2M15 8.8V20"/></svg>Roadmap</a></li>
361
- <li><a class="nav" href="/hall/goals"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8.3"/><circle cx="12" cy="12" r="3.4"/></svg>Goals</a></li>
362
- <li><a class="nav" href="/hall/tasks" aria-current="page"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4.5 6.6h15M4.5 12h15M4.5 17.4h9"/></svg>Tasks</a></li>
363
- <li><a class="nav" href="/hall/ideas"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3.4a5.6 5.6 0 0 0-3.3 10.1c.6.5 1 1.2 1 2h4.6c0-.8.4-1.5 1-2A5.6 5.6 0 0 0 12 3.4z"/><path d="M10 18.6h4M10.7 21h2.6"/></svg>Ideas</a></li>
364
- <li><a class="nav" href="/hall/copy-desk"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16.4 3.4 20.6 7.6 8.6 19.6H4.4v-4.2z"/><path d="M14.3 5.5 18.5 9.7"/></svg>Copy desk</a></li>
365
- </ul>
366
-
367
- <p class="grp-label" id="grp-you">You</p>
368
- <ul aria-labelledby="grp-you">
369
- <li><a class="nav" href="/hall/standing"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 20v-7.4M12 20V4.6M19 20v-5"/></svg>Standing</a></li>
370
- <li><a class="nav" href="/hall/profile"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="8.2" r="3.6"/><path d="M4.8 20.4a7.2 7.2 0 0 1 14.4 0"/></svg>Profile</a></li>
371
- </ul>
372
-
373
- <p class="grp-label" id="grp-comm">Community</p>
374
- <ul aria-labelledby="grp-comm">
375
- <li><a class="nav" href="/hall/collab"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="8.4" r="3.2"/><path d="M3.4 19.8a5.7 5.7 0 0 1 11.2 0"/><path d="M16.2 5.8a3.2 3.2 0 0 1 0 5.2M17.2 14.4a5.7 5.7 0 0 1 3.4 5.4"/></svg>Collab</a></li>
376
- <li><a class="nav" href="/hall/leaderboard"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7.2 4h9.6v4.6a4.8 4.8 0 0 1-9.6 0z"/><path d="M7.2 5.4H4.6v1.3a3.1 3.1 0 0 0 2.8 3.1M16.8 5.4h2.6v1.3a3.1 3.1 0 0 1-2.8 3.1"/><path d="M12 13.4V17M8.6 20.4h6.8"/></svg>Leaderboard</a></li>
377
- <li><a class="nav" href="/hall/people"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="8" r="3.2"/><path d="M5.6 19.6a6.4 6.4 0 0 1 12.8 0"/><path d="M3 14.6a4.6 4.6 0 0 1 2.6-1.4M21 14.6a4.6 4.6 0 0 0-2.6-1.4"/></svg>People</a></li>
378
- </ul>
379
-
380
- <p class="grp-label" id="grp-docs">Docs</p>
381
- <ul aria-labelledby="grp-docs">
382
- <li><a class="nav" href="/hall/primer"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 4.6h5.6a2.4 2.4 0 0 1 2.4 2.4v12a2 2 0 0 0-2-2H4z"/><path d="M20 4.6h-5.6a2.4 2.4 0 0 0-2.4 2.4v12a2 2 0 0 1 2-2H20z"/></svg>Primer</a></li>
383
- <li><a class="nav" href="/hall/ranks"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 12.6 12 7l6 5.6M6 18 12 12.4 18 18"/></svg>Ranks</a></li>
384
- <li><a class="nav" href="/hall/economy"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8.3"/><path d="M12 7v10M14.6 9.4h-3.9a2 2 0 0 0 0 4h2.6a2 2 0 0 1 0 4H9.4"/></svg>Economy</a></li>
385
- <li><a class="nav" href="/hall/diagrams"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="8.6" y="3.2" width="6.8" height="5" rx="1.6"/><rect x="2.6" y="15.8" width="6.8" height="5" rx="1.6"/><rect x="14.6" y="15.8" width="6.8" height="5" rx="1.6"/><path d="M12 8.2v3.6M6 15.8v-4h12v4"/></svg>Diagrams</a></li>
386
- <li><a class="nav" href="/hall/repo-atlas"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8.3"/><path d="M3.8 12h16.4"/><path d="M12 3.7a13 13 0 0 1 0 16.6 13 13 0 0 1 0-16.6z"/></svg>Repo Atlas</a></li>
387
- <li><a class="nav" href="/hall/modules"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3.4 20 7.7v8.6L12 20.6 4 16.3V7.7z"/><path d="M4 7.7 12 12l8-4.3M12 12v8.6"/></svg>Modules</a></li>
388
- <li><a class="nav" href="/hall/api-docs"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 5.4 4.6 12 9 18.6M15 5.4 19.4 12 15 18.6"/></svg>API docs</a></li>
389
- </ul>
390
-
391
- <p class="grp-label" id="grp-gov">Government</p>
392
- <ul aria-labelledby="grp-gov">
393
- <li><a class="nav" href="/hall/watch"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.6 12S6 5.9 12 5.9 21.4 12 21.4 12 18 18.1 12 18.1 2.6 12 2.6 12z"/><circle cx="12" cy="12" r="2.9"/></svg>Watch</a></li>
394
- <li><a class="nav" href="/hall/harbor"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="4.8" r="2.2"/><path d="M12 7v13.2M7.6 10.4h8.8"/><path d="M4.4 14.4a7.6 7.6 0 0 0 15.2 0"/></svg>Harbor</a></li>
395
- <li><a class="nav" href="/hall/gate"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7.6" cy="12" r="3.6"/><path d="M11.2 12h9.2M17.6 12v3.4M14.6 12v2.6"/></svg>Gate</a></li>
396
- <li><a class="nav" href="/hall/sessions"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8.3"/><path d="M12 7.2V12l3.2 2"/></svg>Sessions</a></li>
397
- <li><a class="nav" href="/hall/permissions"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="4.6" y="10.2" width="14.8" height="9.6" rx="2.4"/><path d="M8 10.2V7.6a4 4 0 0 1 8 0v2.6"/></svg>Permissions</a></li>
398
- </ul>
399
- </nav>
400
-
401
- <div class="side-foot">
402
- <button class="btn btn-out signout" type="button">
403
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14.6 17v2.2a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4.8a2 2 0 0 1 2-2h6.6a2 2 0 0 1 2 2V7"/><path d="M20 12H9.8M16.8 8.8 20 12l-3.2 3.2"/></svg>
404
- Sign out
405
- </button>
406
- </div>
407
- </aside>
408
-
409
- <div class="col">
410
- <header class="top">
411
- <span class="top-mark">Builders' Hall</span>
412
- <div class="search">
413
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" aria-hidden="true"><circle cx="10.8" cy="10.8" r="6.6"/><path d="m15.8 15.8 4 4"/></svg>
414
- <input type="search" placeholder="Search" aria-label="Search the hall">
415
- </div>
416
- <div class="top-right">
417
- <button class="mode-toggle" id="mode" type="button" aria-label="Toggle light or dark">
418
- <span class="mt-ico">
419
- <svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 14.4A8.4 8.4 0 0 1 9.6 4 8.4 8.4 0 1 0 20 14.4Z"/></svg>
420
- <svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4.2"/><path d="M12 2.6v2.2M12 19.2v2.2M2.6 12h2.2M19.2 12h2.2M5.4 5.4l1.6 1.6M17 17l1.6 1.6M18.6 5.4 17 7M7 17l-1.6 1.6"/></svg>
421
- </span>
422
- </button>
423
- <span class="rank"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="9" r="5.2"/><path d="M9.2 13.4 8 21l4-2.3 4 2.3-1.2-7.6"/></svg>Trusted</span>
424
- <span class="avatar" aria-hidden="true">P</span>
425
- <svg class="caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9.5 6 6 6-6"/></svg>
426
- </div>
427
- </header>
428
-
429
- <main>
430
- <div class="inner">
431
- <h1>Tasks</h1>
432
-
433
- <div class="tabs" role="tablist" aria-label="Task status">
434
- <button class="tab" role="tab" id="tab-ready" aria-controls="panel-ready" aria-selected="true" type="button">Ready <span class="cnt">42</span></button>
435
- <button class="tab" role="tab" id="tab-prog" aria-controls="panel-prog" aria-selected="false" type="button">In Progress <span class="cnt">15</span></button>
436
- <button class="tab" role="tab" id="tab-back" aria-controls="panel-back" aria-selected="false" type="button">Backlog <span class="cnt">89</span></button>
437
- <button class="tab" role="tab" id="tab-done" aria-controls="panel-done" aria-selected="false" type="button">Completed <span class="cnt">1107</span></button>
438
- </div>
439
-
440
- <div class="filters">
441
- <div class="f-search">
442
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" aria-hidden="true"><circle cx="10.8" cy="10.8" r="6.6"/><path d="m15.8 15.8 4 4"/></svg>
443
- <input type="search" placeholder="task #, title, or goal" aria-label="Filter tasks">
444
- </div>
445
- <span class="sel"><label for="f-sort">Sort</label><select id="f-sort"><option>credits / minute (high to low)</option><option>newest first</option><option>credits (high to low)</option></select></span>
446
- <span class="sel"><label for="f-ver">Version</label><select id="f-ver"><option>any</option><option>V1</option><option>V2</option></select></span>
447
- <span class="sel"><label for="f-goal">Goal</label><select id="f-goal"><option>any</option><option>Apex UI pass 2</option><option>Project hub</option></select></span>
448
- <span class="sel"><label for="f-kind">Kind</label><select id="f-kind"><option>any</option><option>feature</option><option>bug</option></select></span>
449
- <span class="sel"><label for="f-disc">Discipline</label><select id="f-disc"><option>any</option><option>engineer</option><option>design</option></select></span>
450
- <span class="sel"><label for="f-new">Newcomer</label><select id="f-new"><option>any</option><option>newcomer friendly</option></select></span>
451
- <span class="sel"><label for="f-cre">Creator</label><select id="f-cre"><option>any</option><option>lars589</option></select></span>
452
- <span class="sel"><label for="f-age">Age</label><select id="f-age"><option>any</option><option>today</option><option>this week</option></select></span>
453
- <span class="sel"><label for="f-run">Run mode</label><select id="f-run"><option>any</option><option>parallel safe</option></select></span>
454
- </div>
455
-
456
- <div id="panel-ready" role="tabpanel" aria-labelledby="tab-ready">
457
- <div class="table-wrap">
458
- <table>
459
- <caption class="vh">Tasks ready to claim</caption>
460
- <thead>
461
- <tr>
462
- <th class="c-sel" scope="col"><span class="vh">Select</span></th>
463
- <th scope="col">Task</th>
464
- <th scope="col">Title</th>
465
- <th scope="col">Goal</th>
466
- <th class="c-num" scope="col">Credits</th>
467
- <th class="c-num" scope="col">Minutes</th>
468
- <th class="c-num" scope="col">Cr/min</th>
469
- <th scope="col">Status</th>
470
- </tr>
471
- </thead>
472
- <!-- sample rows -->
473
- <tbody>
474
- <tr>
475
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003297"></td>
476
- <td class="tid">1003297</td>
477
- <td class="ttl">Landing: three composition versions in the chosen world</td>
478
- <td class="goal">Apex UI pass 2</td>
479
- <td class="c-num">96</td><td class="c-num">40</td><td class="c-num">2.4</td>
480
- <td><span class="state"><i class="seed"></i>ready</span></td>
481
- </tr>
482
- <tr>
483
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003302"></td>
484
- <td class="tid">1003302</td>
485
- <td class="ttl">Hall: five archetype mocks in the world</td>
486
- <td class="goal">Builders' hall in the world</td>
487
- <td class="c-num">120</td><td class="c-num">55</td><td class="c-num">2.2</td>
488
- <td><span class="state"><i class="seed"></i>ready</span></td>
489
- </tr>
490
- <tr>
491
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003310"></td>
492
- <td class="tid">1003310</td>
493
- <td class="ttl">Status: the index mock in the world</td>
494
- <td class="goal">Status ledger in the world</td>
495
- <td class="c-num">60</td><td class="c-num">30</td><td class="c-num">2.0</td>
496
- <td><span class="state"><i class="seed"></i>ready</span></td>
497
- </tr>
498
- <tr>
499
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003251"></td>
500
- <td class="tid">1003251</td>
501
- <td class="ttl">The manage view says which door the project runs</td>
502
- <td class="goal">Project hub</td>
503
- <td class="c-num">45</td><td class="c-num">25</td><td class="c-num">1.8</td>
504
- <td><span class="state"><i class="seed"></i>ready</span></td>
505
- </tr>
506
- <tr class="is-held">
507
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003240" disabled></td>
508
- <td class="tid">1003240</td>
509
- <td class="ttl">A gated project refuses strangers at the door</td>
510
- <td class="goal">Project hub</td>
511
- <td class="c-num">72</td><td class="c-num">45</td><td class="c-num">1.6</td>
512
- <td><span class="state"><i class="seed seed--held"></i><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="10.4" width="14" height="9.2" rx="2.2"/><path d="M8.2 10.4V7.8a3.8 3.8 0 0 1 7.6 0v2.6"/></svg>active</span></td>
513
- </tr>
514
- <tr class="is-conflict">
515
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003241"></td>
516
- <td class="tid">1003241</td>
517
- <td class="ttl">The wizard remembers a half-finished project</td>
518
- <td class="goal">Project hub</td>
519
- <td class="c-num">54</td><td class="c-num">35</td><td class="c-num">1.5</td>
520
- <td class="conflict">has file conflicts</td>
521
- </tr>
522
- <tr>
523
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003242"></td>
524
- <td class="tid">1003242</td>
525
- <td class="ttl">Copy desk: flags carry a reason</td>
526
- <td class="goal">Copy desk</td>
527
- <td class="c-num">38</td><td class="c-num">30</td><td class="c-num">1.3</td>
528
- <td><span class="state"><i class="seed"></i>ready</span></td>
529
- </tr>
530
- <tr>
531
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003245"></td>
532
- <td class="tid">1003245</td>
533
- <td class="ttl">The identity chip opens the profile menu</td>
534
- <td class="goal">Apex UI pass 2</td>
535
- <td class="c-num">30</td><td class="c-num">25</td><td class="c-num">1.2</td>
536
- <td><span class="state"><i class="seed"></i>ready</span></td>
537
- </tr>
538
- <tr>
539
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003235"></td>
540
- <td class="tid">1003235</td>
541
- <td class="ttl">The hub answers the keyboard</td>
542
- <td class="goal">Project hub</td>
543
- <td class="c-num">24</td><td class="c-num">20</td><td class="c-num">1.2</td>
544
- <td><span class="state"><i class="seed"></i>ready</span></td>
545
- </tr>
546
- <tr>
547
- <td><input class="cbx" type="checkbox" aria-label="Select task 1003239"></td>
548
- <td class="tid">1003239</td>
549
- <td class="ttl">A same-tab GitHub return stays put</td>
550
- <td class="goal">Project hub</td>
551
- <td class="c-num">20</td><td class="c-num">20</td><td class="c-num">1.0</td>
552
- <td><span class="state"><i class="seed"></i>ready</span></td>
553
- </tr>
554
- </tbody>
555
- </table>
556
- </div>
557
-
558
- <div class="bulk" role="region" aria-label="Bulk actions">
559
- <span class="sel-count" id="selcount">0 selected</span>
560
- <button class="btn btn-1" type="button">Bulk claim</button>
561
- <button class="btn btn-2" type="button">Copy parallel prompt</button>
562
- <button class="btn btn-2" type="button">Copy sequential prompt</button>
563
- <span class="bulk-right">
564
- <button class="btn btn-out" type="button">Bulk release</button>
565
- <button class="btn btn-out" type="button" id="clear">Clear</button>
566
- </span>
567
- </div>
568
-
569
- <div class="pager">
570
- <span>1 to 10 of 42</span>
571
- <button class="btn btn-out" type="button">Previous</button>
572
- <button class="btn btn-out" type="button">Next</button>
573
- </div>
574
- </div>
575
-
576
- <div id="panel-prog" role="tabpanel" aria-labelledby="tab-prog" hidden><p class="empty">Nothing here yet.</p></div>
577
- <div id="panel-back" role="tabpanel" aria-labelledby="tab-back" hidden><p class="empty">Nothing here yet.</p></div>
578
- <div id="panel-done" role="tabpanel" aria-labelledby="tab-done" hidden><p class="empty">Nothing here yet.</p></div>
579
- </div>
580
- </main>
581
- </div>
582
- </div>
583
- </div>
584
-
585
- <script>
586
- (function () {
587
- var root = document.documentElement;
588
- function isDark() {
589
- var m = root.getAttribute('data-mode');
590
- if (m === 'dark') return true;
591
- if (m === 'light') return false;
592
- return window.matchMedia('(prefers-color-scheme: dark)').matches;
593
- }
594
- document.getElementById('mode').addEventListener('click', function () {
595
- var next = isDark() ? 'light' : 'dark';
596
- root.setAttribute('data-mode', next);
597
- try { localStorage.setItem('cb-color-mode', next); } catch (e) {}
598
- });
599
-
600
- var boxes = Array.prototype.slice.call(document.querySelectorAll('tbody .cbx'));
601
- var out = document.getElementById('selcount');
602
- function count() {
603
- var n = boxes.filter(function (b) { return b.checked; }).length;
604
- out.textContent = n + ' selected';
605
- }
606
- boxes.forEach(function (b) { b.addEventListener('change', count); });
607
- document.getElementById('clear').addEventListener('click', function () {
608
- boxes.forEach(function (b) { b.checked = false; });
609
- count();
610
- });
611
-
612
- var tabs = Array.prototype.slice.call(document.querySelectorAll('[role="tab"]'));
613
- tabs.forEach(function (t) {
614
- t.addEventListener('click', function () {
615
- tabs.forEach(function (o) {
616
- var on = o === t;
617
- o.setAttribute('aria-selected', on ? 'true' : 'false');
618
- document.getElementById(o.getAttribute('aria-controls')).hidden = !on;
619
- });
620
- });
621
- });
622
- })();
623
- </script>
624
- </body>
625
- </html>