@bongos/core 1.19.726 → 1.19.728

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/.bongos-core.json +177 -492
  2. package/.devcontainer/Dockerfile +1 -1
  3. package/.devcontainer/devcontainer.json +2 -2
  4. package/.devcontainer/healthcheck.sh +1 -1
  5. package/.devcontainer/init-firewall.sh +1 -1
  6. package/.devcontainer/post-create.sh +2 -2
  7. package/.env.local.example +1 -1
  8. package/Dockerfile +1 -1
  9. package/docs/copy-inventory.md +1 -1
  10. package/docs/copy-registry.json +9 -9
  11. package/docs/module-api-changelog.md +4 -0
  12. package/docs/recipes/devbox-app-release.md +4 -4
  13. package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
  14. package/modules/dev-box/app/scripts/gen-brand.js +1 -1
  15. package/modules/dev-box/app/src/brand.js +1 -1
  16. package/modules/dev-box/app/test/unit.mjs +16 -16
  17. package/modules/dev-box/box-access.js +1 -1
  18. package/modules/dev-box/routes/box.js +1 -1
  19. package/modules/discord/discord-approvals.js +1 -1
  20. package/modules/grading/grader-model.js +1 -1
  21. package/modules/grading/grader-prompt.js +1 -1
  22. package/modules/grading/grader-workers/quality.js +1 -1
  23. package/modules/hall-ui/module.json +1 -1
  24. package/modules/hall-ui/public/brand-apply.js +1 -1
  25. package/modules/hall-ui/public/shell.js +1 -1
  26. package/modules/hall-ui/public/work.js +1 -1
  27. package/modules/lifecycle/conflict-resolve.js +1 -1
  28. package/modules/lifecycle/db-analytics.js +1 -1
  29. package/modules/lifecycle/routes/analytics.js +1 -1
  30. package/modules/onboarding/approval-broadcast.js +1 -1
  31. package/modules/onboarding/onboarding.js +1 -1
  32. package/modules/provisioning/tests/liveness.mjs +1 -1
  33. package/modules/public-landing/public/index.html +1 -1
  34. package/modules/public-landing/public/projects-floor.states.json +2 -2
  35. package/modules/public-landing/public/projects.probes.json +4 -4
  36. package/modules/public-landing/public/projects.states.json +2 -2
  37. package/modules/status-ui/module.json +1 -1
  38. package/modules/status-ui/public/status.js +4 -4
  39. package/modules/status-ui/public/style.css +1 -1
  40. package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
  41. package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
  42. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  43. package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
  44. package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
  45. package/modules/ui-design/kit/fixtures/progress.json +1 -1
  46. package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/scripts/cron/style_guide_audit.sh +1 -1
  50. package/scripts/discord/lib.js +1 -1
  51. package/scripts/discord/post.js +1 -1
  52. package/scripts/gds/audit-authorship.sh +1 -1
  53. package/scripts/gds/audit-replay.sh +29 -2
  54. package/scripts/gds/audit-ships.js +1 -1
  55. package/scripts/gds/backfill-sessions.js +2 -2
  56. package/scripts/gds/cf-tunnel.js +4 -4
  57. package/scripts/gds/claude-materialize.js +2 -2
  58. package/scripts/gds/cli-lib.js +6 -6
  59. package/scripts/gds/cutover-codemod.js +1 -1
  60. package/scripts/gds/dev-lib.js +2 -2
  61. package/scripts/gds/diagnose-achievements.js +2 -2
  62. package/scripts/gds/fitness-checks-identity.js +6 -4
  63. package/scripts/gds/gen-diagrams.js +1 -1
  64. package/scripts/gds/leak-scan-allowlist.js +293 -0
  65. package/scripts/gds/learning-capture.js +1 -1
  66. package/scripts/gds/linkify-refs.js +2 -2
  67. package/scripts/gds/local-preview-lib.js +1 -1
  68. package/scripts/gds/mirror-lineage-check.js +1 -1
  69. package/scripts/gds/mirror-redact.js +17 -2
  70. package/scripts/gds/newcomer-floor.templates.json +1 -1
  71. package/scripts/gds/package-core.js +18 -1
  72. package/scripts/gds/paste-token.js +1 -1
  73. package/scripts/gds/provision-units.js +2 -2
  74. package/scripts/gds/publish-manifest.js +15 -0
  75. package/scripts/gds/repo-metrics.js +1 -1
  76. package/scripts/gds/sandbox-stage.js +1 -1
  77. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-tasks.js +2 -2
  81. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  82. package/scripts/gds/seed-medusa-tasks.js +10 -10
  83. package/scripts/gds/seed-module-upstreaming.js +1 -1
  84. package/scripts/gds/seed-productization-tasks.js +6 -6
  85. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  86. package/scripts/gds/seed-staging.sh +19 -6
  87. package/scripts/gds/ship-deploy-target.js +1 -1
  88. package/scripts/gds/ship-flow.js +1 -1
  89. package/scripts/gds/smoke-gds.js +1 -1
  90. package/scripts/status-probe.mjs +2 -2
  91. package/src/bongos/auth-discord.js +2 -2
  92. package/src/bongos/live-channel.js +1 -1
  93. package/src/bongos/pool.js +1 -1
  94. package/src/bongos/routes/auth.js +11 -11
  95. package/src/bongos/routes/security.js +1 -1
  96. package/src/bongos/routes.js +1 -1
  97. package/src/branding.js +1 -1
  98. package/src/devbox-downloads.js +1 -1
  99. package/src/instance-config.js +2 -2
  100. package/src/module-api.js +1 -1
  101. package/src/module-loader/provenance.js +2 -2
  102. package/tests/art_stage.mjs +2 -2
  103. package/tests/auth_anthropic_identity.mjs +1 -1
  104. package/tests/auth_duplicate_cookie.mjs +1 -1
  105. package/tests/auth_error_brand.mjs +1 -1
  106. package/tests/auth_inactive_builder.mjs +1 -1
  107. package/tests/backup_cli.mjs +4 -4
  108. package/tests/bongos_box_connect.mjs +2 -2
  109. package/tests/bongos_downloads.mjs +2 -2
  110. package/tests/bongos_login.mjs +5 -5
  111. package/tests/box_connect_e2e.mjs +2 -2
  112. package/tests/box_dns_repoint.mjs +10 -10
  113. package/tests/box_host_keys.mjs +1 -1
  114. package/tests/box_onboard.mjs +9 -9
  115. package/tests/box_scope_session.mjs +1 -1
  116. package/tests/box_terminal_ssrf.mjs +7 -7
  117. package/tests/boxes.mjs +9 -9
  118. package/tests/branding.mjs +2 -2
  119. package/tests/bump_version.mjs +2 -2
  120. package/tests/cf_tunnel.mjs +40 -40
  121. package/tests/cli_package.mjs +40 -1
  122. package/tests/cli_token_reissue.mjs +7 -7
  123. package/tests/cloud_bongos_pack.mjs +1 -1
  124. package/tests/currency_label.mjs +8 -8
  125. package/tests/dev_lib.mjs +4 -4
  126. package/tests/devbox_dmg_backdrop.mjs +1 -1
  127. package/tests/devbox_downloads.mjs +2 -2
  128. package/tests/devbox_icons.mjs +1 -1
  129. package/tests/discord_approvals.mjs +1 -1
  130. package/tests/discord_oauth.mjs +2 -2
  131. package/tests/executed_closure.mjs +6 -1
  132. package/tests/first_admin_bootstrap.mjs +1 -1
  133. package/tests/gate_approvals.mjs +5 -5
  134. package/tests/grade_aggregates_unavailable.mjs +1 -1
  135. package/tests/hook_user_agents.mjs +2 -2
  136. package/tests/init.mjs +6 -6
  137. package/tests/instance_config.mjs +1 -1
  138. package/tests/instance_manifest.mjs +5 -5
  139. package/tests/instance_mismatch_guard.mjs +13 -13
  140. package/tests/leak_scan_allowlist.mjs +94 -0
  141. package/tests/migrate_root_resolution.mjs +4 -4
  142. package/tests/mirror_redact.mjs +28 -4
  143. package/tests/module_catalog.mjs +5 -5
  144. package/tests/module_submissions.mjs +3 -3
  145. package/tests/package_core.mjs +1 -1
  146. package/tests/parallel-load.mjs +6 -6
  147. package/tests/projects_hub.mjs +2 -2
  148. package/tests/provision.mjs +50 -50
  149. package/tests/provisioning_github_app_routes.mjs +1 -1
  150. package/tests/provisioning_onboard_mode.mjs +2 -2
  151. package/tests/publish_reconciler.mjs +4 -4
  152. package/tests/sandbox_stage.mjs +1 -1
  153. package/tests/scrubber_corpus.mjs +3 -3
  154. package/tests/search_isolation.mjs +1 -1
  155. package/tests/session_records.mjs +1 -1
  156. package/tests/ship_card.mjs +6 -6
  157. package/tests/ship_ci_deploy.mjs +1 -1
  158. package/tests/single_host_hall.mjs +9 -9
  159. package/tests/smoke_preflight.mjs +1 -1
  160. package/tests/smoke_target.mjs +1 -1
  161. package/tests/status-probe.mjs +1 -1
  162. package/tests/status_mirror_sync.mjs +1 -1
  163. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  164. package/docs/design/mocks/_schemes.css +0 -604
  165. package/docs/design/mocks/component-sheet.html +0 -428
  166. package/docs/design/mocks/hall/_tokens.css +0 -370
  167. package/docs/design/mocks/hall/board/v1.html +0 -846
  168. package/docs/design/mocks/hall/board/v2.html +0 -858
  169. package/docs/design/mocks/hall/board/v3.html +0 -884
  170. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  171. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  172. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  173. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  174. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  175. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  176. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  177. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  178. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  179. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  180. package/docs/design/mocks/hall/task/v1.html +0 -633
  181. package/docs/design/mocks/hall/task/v2.html +0 -646
  182. package/docs/design/mocks/hall/task/v3.html +0 -647
  183. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  184. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  185. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  186. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  187. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  188. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  189. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  190. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  191. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  192. package/docs/design/mocks/hub/mine.html +0 -465
  193. package/docs/design/mocks/hub/picker.html +0 -421
  194. package/docs/design/mocks/hub/planets.html +0 -356
  195. package/docs/design/mocks/hub/v1.html +0 -1209
  196. package/docs/design/mocks/hub/v2.html +0 -1257
  197. package/docs/design/mocks/hub/v3.html +0 -1496
  198. package/docs/design/mocks/hub/wizard.html +0 -421
  199. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  200. package/docs/design/mocks/landing/v1.html +0 -956
  201. package/docs/design/mocks/landing/v2.html +0 -708
  202. package/docs/design/mocks/landing/v3.html +0 -911
  203. package/docs/design/mocks/landing-page-mock.html +0 -687
  204. package/docs/design/mocks/landing-palettes.html +0 -103
  205. package/docs/design/mocks/projects-hub-mock.html +0 -991
  206. package/docs/design/mocks/projects-hub-variants.html +0 -146
  207. package/docs/design/mocks/projects-page-mock.html +0 -167
  208. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  209. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  210. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  211. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  212. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  213. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  214. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  215. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  216. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  217. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  218. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  219. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  220. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  221. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  222. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  223. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  224. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  225. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  226. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  227. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,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>