@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,553 +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 rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
13
- <link rel="stylesheet" href="_tokens.css">
14
- <style>
15
- *{box-sizing:border-box}
16
- html,body{margin:0;padding:0}
17
- body{min-height:100dvh;background:var(--bg);color:var(--ink);font-family:var(--font-body);
18
- font-size:15px;-webkit-font-smoothing:antialiased;overflow-x:hidden}
19
- h1,h2,p,ul,ol{margin:0}
20
- ul,ol{list-style:none;padding:0}
21
- a{color:inherit;text-decoration:none}
22
- ::selection{background:var(--accent);color:var(--accent-on)}
23
- :focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:6px}
24
- .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
25
- .ic{width:17px;height:17px;flex:none;stroke:currentColor;stroke-width:1.4;fill:none;
26
- stroke-linecap:round;stroke-linejoin:round}
27
-
28
- /* ---------- the ground: the misty forest, dark mode only ---------- */
29
- .plate{position:fixed;inset:0;z-index:-1;background-image:var(--plate);background-size:cover;
30
- background-position:50% 26%;filter:saturate(.95) brightness(1.24);transform:scale(1.04)}
31
-
32
- /* ---------- one rendered chrome object blooming behind the glass (dark only) ---------- */
33
- .blob{display:var(--shell-blob);position:absolute;width:var(--s);aspect-ratio:1;
34
- background-image:var(--plate-bead);background-repeat:no-repeat;background-size:100% auto;
35
- mix-blend-mode:var(--blob-blend);pointer-events:none;
36
- animation:settle .6s cubic-bezier(.16,1,.3,1) both}
37
- @keyframes settle{from{opacity:0;transform:scale(1.05)}to{opacity:.62;transform:scale(1)}}
38
-
39
- /* ---------- shell: an inset glass window in dark, full bleed in light ---------- */
40
- .shell{position:relative;margin:var(--shell-pad);min-height:calc(100dvh - var(--shell-pad) * 2);
41
- border-radius:var(--shell-radius);border:1px solid var(--shell-edge);background:var(--shell-bg);
42
- box-shadow:var(--shell-shadow);overflow:hidden;display:grid;grid-template-columns:240px minmax(0,1fr)}
43
-
44
- /* ---------- sidebar ---------- */
45
- .side{position:relative;z-index:1;display:flex;flex-direction:column;min-height:0;
46
- border-right:1px solid var(--panel-edge);background:var(--panel-bg);
47
- backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur))}
48
- .brand{display:flex;align-items:center;gap:10px;padding:16px 18px 12px;font-size:15.5px;
49
- letter-spacing:-.01em}
50
- .badge-mark{width:28px;height:28px;border-radius:9px;flex:none;display:grid;place-items:center;
51
- background:var(--badge-bg);color:var(--badge-ink);border:1px solid var(--rule-soft)}
52
- .badge-mark svg{width:16px;height:13px;display:block}
53
- .sidenav{flex:1;min-height:0;overflow-y:auto;padding:4px 12px 12px;
54
- scrollbar-width:thin;scrollbar-color:var(--rule) transparent}
55
- .sidenav::-webkit-scrollbar{width:8px}
56
- .sidenav::-webkit-scrollbar-thumb{background:var(--rule);border-radius:99px}
57
- .sidenav::-webkit-scrollbar-track{background:transparent}
58
- .grp{margin:16px 0 6px;padding:0 10px;font-family:var(--label-face);font-size:var(--label-size);
59
- letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint)}
60
- .grp::after{content:var(--label-suffix)}
61
- .sidenav a{display:flex;align-items:center;gap:11px;min-height:34px;padding:6px 10px;
62
- border-radius:var(--radius-pill);font-family:var(--label-face);font-size:14px;color:var(--ink-soft);
63
- transition:background .18s ease,color .18s ease}
64
- .sidenav a:hover{background:var(--glass-strong);color:var(--ink)}
65
- .sidenav a[aria-current="page"]{background:var(--accent-tint);color:var(--accent-ink);
66
- border:1px solid color-mix(in srgb,var(--accent) 38%,transparent)}
67
- .signout{display:flex;align-items:center;gap:11px;margin:0 12px 14px;padding:9px 12px;min-height:36px;
68
- border-radius:var(--radius-pill);background:transparent;border:1px solid var(--rule-soft);
69
- color:var(--ink-soft);font-family:var(--label-face);font-size:14px;cursor:pointer;
70
- transition:background .18s ease,color .18s ease}
71
- .signout:hover{background:var(--glass-strong);color:var(--ink)}
72
-
73
- /* ---------- top bar ---------- */
74
- .col{display:flex;flex-direction:column;min-width:0}
75
- .top{position:relative;z-index:1;display:flex;align-items:center;gap:14px;height:56px;padding:0 20px;
76
- border-bottom:1px solid var(--panel-edge);background:var(--panel-bg);
77
- backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur))}
78
- .hallmark{font-size:17px;font-weight:500;letter-spacing:-.015em;white-space:nowrap}
79
- .search{position:relative;flex:1;max-width:430px;margin-left:auto}
80
- .search .ic{position:absolute;left:13px;top:50%;transform:translateY(-50%);color:var(--ink-faint);
81
- width:15px;height:15px}
82
- .search input{width:100%;min-height:34px;padding:7px 12px 7px 36px;border-radius:var(--radius-pill);
83
- border:1px solid var(--rule-soft);background:var(--glass);color:var(--ink);font-family:inherit;
84
- font-size:14px}
85
- .search input::placeholder{color:var(--ink-faint)}
86
- .badge{display:inline-flex;align-items:center;gap:7px;min-height:32px;padding:0 14px;
87
- border-radius:var(--radius-pill);border:1px solid var(--chip-edge);
88
- background:var(--chip-bg);color:var(--chip-ink);font-family:var(--label-face);
89
- font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:var(--head-case);
90
- white-space:nowrap}
91
- .badge .dot{width:6px;height:6px;border-radius:50%;background:var(--ink-faint)}
92
- .mode-toggle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;
93
- border-radius:var(--radius-pill);border:1px solid var(--rule-soft);background:transparent;
94
- color:var(--ink-soft);cursor:pointer}
95
- .mode-toggle:hover{background:var(--glass-strong);color:var(--ink)}
96
- .mode-toggle svg{width:15px;height:15px}
97
- .sun{display:none}
98
- :root[data-mode="dark"] .sun{display:block}
99
- :root[data-mode="dark"] .moon{display:none}
100
- @media (prefers-color-scheme:dark){:root:not([data-mode="light"]) .sun{display:block}
101
- :root:not([data-mode="light"]) .moon{display:none}}
102
- .who{display:flex;align-items:center;gap:7px}
103
- .avatar{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-size:13px;
104
- font-weight:500;background:var(--glass-strong);border:1px solid var(--rule-soft);color:var(--ink)}
105
- .caret{color:var(--ink-faint);width:12px;height:12px}
106
-
107
- /* ---------- board ---------- */
108
- .board{position:relative;flex:1;min-width:0;padding:22px 20px 26px;background:var(--board-bg)}
109
- .sheet{position:relative;z-index:1;max-width:1120px;margin:0 auto;padding:20px 20px 18px;
110
- border-radius:var(--radius);border:1px solid var(--sheet-edge);background:var(--sheet-bg);
111
- box-shadow:var(--sheet-shadow);
112
- backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur))}
113
- h1{font-size:26px;font-weight:500;letter-spacing:-.02em}
114
-
115
- .tabs{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px}
116
- .tab{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:0 16px;cursor:pointer;
117
- border-radius:var(--radius-pill);border:1px solid transparent;background:transparent;
118
- color:var(--ink-soft);font-family:var(--label-face);font-size:13px;letter-spacing:var(--label-space);
119
- text-transform:var(--head-case);transition:background .18s ease,color .18s ease}
120
- .tab:hover{background:var(--glass-strong);color:var(--ink)}
121
- .tab .n{font-variant-numeric:tabular-nums}
122
- .tab[aria-selected="true"]{background:var(--tab-bg);color:var(--tab-ink);
123
- border-color:color-mix(in srgb,var(--accent) 55%,transparent);box-shadow:var(--accent-glow)}
124
- .tab .n{padding:1px 8px;border-radius:var(--radius-pill);background:var(--glass-strong);
125
- border:1px solid var(--rule-soft)}
126
- .tab[aria-selected="true"] .n{background:color-mix(in srgb,var(--accent) 26%,transparent);
127
- border-color:color-mix(in srgb,var(--tab-ink) 26%,transparent)}
128
-
129
- .filters{margin-top:14px;padding-bottom:14px;border-bottom:1px solid var(--rule-soft)}
130
- .fsearch{position:relative;max-width:340px}
131
- .fsearch input{width:100%;min-height:34px;padding:7px 12px;border-radius:var(--radius-pill);
132
- border:1px solid var(--rule-soft);background:var(--glass);color:var(--ink);font-family:inherit;
133
- font-size:13.5px}
134
- .fsearch input::placeholder{color:var(--ink-faint)}
135
- .selects{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}
136
- .sel{display:inline-flex;align-items:center;gap:7px;min-height:32px;padding:0 6px 0 13px;
137
- border-radius:var(--radius-pill);border:1px solid var(--rule-soft);background:var(--glass)}
138
- .sel-k{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);
139
- text-transform:var(--head-case);color:var(--ink-soft);white-space:nowrap}
140
- .sel select{appearance:none;-webkit-appearance:none;border:0;background:transparent;color:var(--ink);
141
- font-family:inherit;font-size:13px;min-height:30px;padding:0 22px 0 0;cursor:pointer;
142
- background-image:var(--chev);background-repeat:no-repeat;background-position:right 6px center;
143
- background-size:9px 6px;max-width:210px;text-overflow:ellipsis}
144
-
145
- .scroller{margin-top:14px;overflow-x:auto;border-radius:var(--radius-sm);
146
- scrollbar-width:thin;scrollbar-color:var(--rule) transparent}
147
- .scroller::-webkit-scrollbar{height:9px}
148
- .scroller::-webkit-scrollbar-thumb{background:var(--rule);border-radius:99px}
149
- .scroller::-webkit-scrollbar-track{background:transparent}
150
- table{width:100%;min-width:900px;border-collapse:collapse;font-size:13.5px}
151
- thead th{text-align:left;padding:9px 12px;border-bottom:1px solid var(--rule);
152
- font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);
153
- text-transform:var(--head-case);color:var(--ink-faint);font-weight:400;white-space:nowrap}
154
- tbody td{padding:11px 12px;border-bottom:1px solid var(--rule-soft);vertical-align:middle}
155
- tbody tr:last-child td{border-bottom:0}
156
- tbody tr:hover td{background:var(--glass-strong)}
157
- .num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
158
- .tid{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-soft);white-space:nowrap}
159
- .ttl{min-width:280px}
160
- .goal{color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:190px}
161
- .cred{color:var(--fig-accent);font-weight:500;font-variant-numeric:tabular-nums;text-align:right}
162
- .state{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;color:var(--ink-soft)}
163
- .bead{width:8px;height:8px;border-radius:50%;flex:none;border:1px solid var(--ink-faint)}
164
- .state--active .bead{background:var(--accent);border-color:var(--accent);
165
- box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
166
- .state--active{color:var(--ink)}
167
- tr.held .ttl,tr.held .goal{color:var(--ink-soft)}
168
- tr.held input[type=checkbox]{opacity:.45;cursor:not-allowed}
169
- tr.clash .clashcell{background:var(--hatch);color:var(--ink)}
170
- .lock{width:13px;height:13px;color:var(--ink-faint)}
171
-
172
- /* real checkboxes, drawn */
173
- input[type=checkbox]{appearance:none;-webkit-appearance:none;width:17px;height:17px;margin:0;
174
- border-radius:5px;border:1px solid var(--rule);background:var(--glass);cursor:pointer;
175
- display:grid;place-items:center}
176
- input[type=checkbox]:checked{background-color:var(--accent);border-color:var(--accent);
177
- background-image:var(--check);background-repeat:no-repeat;background-position:center;
178
- background-size:12px 12px}
179
-
180
- .bulk{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:16px}
181
- .bulk .count{margin-right:6px;font-family:var(--label-face);font-size:var(--label-size);
182
- letter-spacing:var(--label-space);text-transform:var(--head-case);color:var(--ink-faint)}
183
- .btn{min-height:34px;padding:0 16px;border-radius:var(--radius-pill);border:1px solid var(--rule-soft);
184
- background:var(--glass);color:var(--ink);font-family:inherit;font-size:13.5px;cursor:pointer;
185
- transition:background .18s ease}
186
- .btn:hover{background:var(--glass-strong)}
187
- .btn--go{background:var(--go-bg);color:var(--go-ink);border-color:transparent;font-weight:500;
188
- box-shadow:var(--accent-glow)}
189
- .btn--go:hover{background:color-mix(in srgb,var(--go-bg) 84%,#ffffff)}
190
- .pager{display:flex;align-items:center;gap:10px;margin-top:14px;font-size:13px;color:var(--ink-soft)}
191
- .pager .of{margin-right:auto;font-variant-numeric:tabular-nums}
192
- .empty{padding:40px 4px;color:var(--ink-faint);font-size:14px}
193
-
194
- @media (max-width:1023px){
195
- /* minmax(0,1fr), not 1fr: the sidenav's scrolling flex row would otherwise blow the track out */
196
- .shell{grid-template-columns:minmax(0,1fr)}
197
- .blob{display:none}
198
- .side{min-width:0;flex-direction:row;align-items:center;gap:10px;border-right:0;
199
- border-bottom:1px solid var(--panel-edge);padding:8px 10px}
200
- .brand{padding:0 4px 0 6px;flex:none}
201
- .brand > span:not(.badge-mark){display:none}
202
- .sidenav{display:flex;align-items:center;gap:4px;overflow-x:auto;overflow-y:hidden;padding:0;
203
- min-height:44px;
204
- -webkit-mask-image:linear-gradient(to right,#000 0 88%,transparent 100%);
205
- mask-image:linear-gradient(to right,#000 0 88%,transparent 100%)}
206
- .sidenav ul{display:flex;gap:4px}
207
- .sidenav a{white-space:nowrap;min-height:32px}
208
- .grp{margin:0 2px;padding:0;align-self:center;white-space:nowrap}
209
- .signout{margin:0;flex:none}
210
- .top{gap:8px;padding:0 12px}
211
- .hallmark{font-size:15px}
212
- .search{max-width:none}
213
- .badge{display:none}
214
- .board{padding:14px 10px 20px}
215
- .sheet{padding:14px 12px}
216
- }
217
- </style>
218
- </head>
219
- <body>
220
-
221
- <div class="plate" aria-hidden="true"></div>
222
-
223
- <svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false"><defs>
224
- <symbol id="i-home" viewBox="0 0 20 20"><path d="M3 8.6 10 3l7 5.6V16a1 1 0 0 1-1 1h-3.4v-4.6H7.4V17H4a1 1 0 0 1-1-1z"/></symbol>
225
- <symbol id="i-map" viewBox="0 0 20 20"><path d="M2.6 5.4 7.4 3.4v11.2L2.6 16.6zM7.4 3.4l5.2 2v11.2l-5.2-2zM12.6 5.4l4.8-2v11.2l-4.8 2z"/></symbol>
226
- <symbol id="i-goal" viewBox="0 0 20 20"><circle cx="10" cy="10" r="7"/><circle cx="10" cy="10" r="3"/></symbol>
227
- <symbol id="i-task" viewBox="0 0 20 20"><path d="M6.6 4H5a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-1.6"/><rect x="6.6" y="2.4" width="6.8" height="3.2" rx="1"/><path d="M7.4 10h5.2M7.4 13h3.4"/></symbol>
228
- <symbol id="i-idea" viewBox="0 0 20 20"><path d="M10 2.6a5 5 0 0 0-3 9v1.8h6v-1.8a5 5 0 0 0-3-9z"/><path d="M8.2 16.4h3.6"/></symbol>
229
- <symbol id="i-pen" viewBox="0 0 20 20"><path d="m13.4 3.6 3 3L7.2 15.8l-3.8.8.8-3.8z"/><path d="m11.6 5.4 3 3"/></symbol>
230
- <symbol id="i-chart" viewBox="0 0 20 20"><path d="M3.4 16.6h13.2M6 13.4V8M10 13.4V4.4M14 13.4v-4"/></symbol>
231
- <symbol id="i-user" viewBox="0 0 20 20"><circle cx="10" cy="7" r="3.2"/><path d="M4 16.6a6 6 0 0 1 12 0"/></symbol>
232
- <symbol id="i-collab" viewBox="0 0 20 20"><circle cx="7" cy="8" r="2.6"/><circle cx="13" cy="8" r="2.6"/><path d="M2.8 16.2a4.4 4.4 0 0 1 8.4 0M8.8 16.2a4.4 4.4 0 0 1 8.4 0"/></symbol>
233
- <symbol id="i-board" viewBox="0 0 20 20"><path d="M4 16.6V9.4M10 16.6V3.4M16 16.6v-4.8"/></symbol>
234
- <symbol id="i-people" viewBox="0 0 20 20"><circle cx="8" cy="7.2" r="3"/><path d="M2.6 16.4a5.4 5.4 0 0 1 10.8 0"/><path d="M13.6 4.6a3 3 0 0 1 0 5.6M14.6 11.6a5.4 5.4 0 0 1 2.8 4.8"/></symbol>
235
- <symbol id="i-book" viewBox="0 0 20 20"><path d="M3.4 4.4A2 2 0 0 1 5.4 3H10v14H5.4a2 2 0 0 0-2 1.4z" transform="translate(0,-1)"/><path d="M16.6 4.4A2 2 0 0 0 14.6 3H10v14h4.6a2 2 0 0 1 2 1.4z" transform="translate(0,-1)"/></symbol>
236
- <symbol id="i-rank" viewBox="0 0 20 20"><path d="m10 3 2.1 4.3 4.7.7-3.4 3.3.8 4.7L10 13.8 5.8 16l.8-4.7L3.2 8l4.7-.7z"/></symbol>
237
- <symbol id="i-coin" viewBox="0 0 20 20"><circle cx="10" cy="10" r="7"/><path d="M10 6.2v7.6M12 8a2.4 2.4 0 0 0-4 1.2c0 2 4 1.4 4 3.2A2.4 2.4 0 0 1 8 13.2"/></symbol>
238
- <symbol id="i-nodes" viewBox="0 0 20 20"><circle cx="5" cy="5" r="2.2"/><circle cx="15" cy="5" r="2.2"/><circle cx="10" cy="15" r="2.2"/><path d="M6.6 6.6 9 13M13.4 6.6 11 13M7.2 5h5.6"/></symbol>
239
- <symbol id="i-globe" viewBox="0 0 20 20"><circle cx="10" cy="10" r="7"/><path d="M3 10h14M10 3a11 11 0 0 1 0 14 11 11 0 0 1 0-14z"/></symbol>
240
- <symbol id="i-box" viewBox="0 0 20 20"><path d="m10 3 6.4 3.4v7.2L10 17l-6.4-3.4V6.4z"/><path d="m3.6 6.4 6.4 3.4 6.4-3.4M10 9.8V17"/></symbol>
241
- <symbol id="i-code" viewBox="0 0 20 20"><path d="m7 6.6-4 3.4 4 3.4M13 6.6l4 3.4-4 3.4"/></symbol>
242
- <symbol id="i-eye" viewBox="0 0 20 20"><path d="M2.4 10S5.4 5 10 5s7.6 5 7.6 5-3 5-7.6 5-7.6-5-7.6-5z"/><circle cx="10" cy="10" r="2.2"/></symbol>
243
- <symbol id="i-anchor" viewBox="0 0 20 20"><circle cx="10" cy="4.6" r="1.8"/><path d="M10 6.4V17M5.6 8.6h8.8M3.4 12.4A7 7 0 0 0 10 17a7 7 0 0 0 6.6-4.6"/></symbol>
244
- <symbol id="i-gate" viewBox="0 0 20 20"><path d="M4 17V4.6a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1V17"/><path d="M2.6 17h14.8M12.6 10.6h.01"/></symbol>
245
- <symbol id="i-list" viewBox="0 0 20 20"><path d="M7 5.4h9.4M7 10h9.4M7 14.6h9.4M3.6 5.4h.01M3.6 10h.01M3.6 14.6h.01"/></symbol>
246
- <symbol id="i-key" viewBox="0 0 20 20"><circle cx="6.6" cy="9.4" r="3.2"/><path d="M9.6 8.6h7.2M14.6 8.6v3M16.8 8.6v2.4"/></symbol>
247
- <symbol id="i-out" viewBox="0 0 20 20"><path d="M12 15.4v1.2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V3.4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v1.2"/><path d="M8.6 10h8.4M14.4 7.2 17.2 10l-2.8 2.8"/></symbol>
248
- <symbol id="i-search" viewBox="0 0 20 20"><circle cx="8.8" cy="8.8" r="5.4"/><path d="m12.8 12.8 4 4"/></symbol>
249
- <symbol id="i-lock" viewBox="0 0 20 20"><rect x="4.6" y="8.6" width="10.8" height="8" rx="1.6"/><path d="M7.2 8.6V6.4a2.8 2.8 0 0 1 5.6 0v2.2"/></symbol>
250
- <symbol id="i-caret" viewBox="0 0 20 20"><path d="m5.6 8 4.4 4.4L14.4 8"/></symbol>
251
- </defs></svg>
252
-
253
- <div class="shell">
254
- <span class="blob" style="--s:500px;left:-16%;top:3%"></span>
255
-
256
- <aside class="side">
257
- <div class="brand">
258
- <span class="badge-mark" aria-hidden="true">
259
- <svg viewBox="0 0 26 20" fill="none" stroke="currentColor" stroke-width="1.5"
260
- stroke-linecap="round" stroke-linejoin="round">
261
- <ellipse cx="8.4" cy="5.6" rx="6.6" ry="2.9"/>
262
- <path d="M1.8 5.6v6.6a6.6 2.9 0 0 0 13.2 0V5.6"/>
263
- <ellipse cx="19.6" cy="8.4" rx="4.7" ry="2.1"/>
264
- <path d="M14.9 8.4v4.6a4.7 2.1 0 0 0 9.4 0V8.4"/>
265
- </svg>
266
- </span>
267
- <span>Cloud Bongos</span>
268
- </div>
269
- <nav class="sidenav" aria-label="Hall">
270
- <ul>
271
- <li><a href="/builders/home"><svg class="ic"><use href="#i-home"></use></svg>Home</a></li>
272
- <li><a href="/builders/roadmap"><svg class="ic"><use href="#i-map"></use></svg>Roadmap</a></li>
273
- <li><a href="/builders/goals"><svg class="ic"><use href="#i-goal"></use></svg>Goals</a></li>
274
- <li><a href="/builders/work" aria-current="page"><svg class="ic"><use href="#i-task"></use></svg>Tasks</a></li>
275
- <li><a href="/builders/ideas"><svg class="ic"><use href="#i-idea"></use></svg>Ideas</a></li>
276
- <li><a href="/builders/copy-desk"><svg class="ic"><use href="#i-pen"></use></svg>Copy desk</a></li>
277
- </ul>
278
- <p class="grp" id="g-you">You</p>
279
- <ul aria-labelledby="g-you">
280
- <li><a href="/builders/standing"><svg class="ic"><use href="#i-chart"></use></svg>Standing</a></li>
281
- <li><a href="/builders/profile"><svg class="ic"><use href="#i-user"></use></svg>Profile</a></li>
282
- </ul>
283
- <p class="grp" id="g-community">Community</p>
284
- <ul aria-labelledby="g-community">
285
- <li><a href="/builders/collab"><svg class="ic"><use href="#i-collab"></use></svg>Collab</a></li>
286
- <li><a href="/builders/leaderboard"><svg class="ic"><use href="#i-board"></use></svg>Leaderboard</a></li>
287
- <li><a href="/builders/people"><svg class="ic"><use href="#i-people"></use></svg>People</a></li>
288
- </ul>
289
- <p class="grp" id="g-docs">Docs</p>
290
- <ul aria-labelledby="g-docs">
291
- <li><a href="/builders/primer"><svg class="ic"><use href="#i-book"></use></svg>Primer</a></li>
292
- <li><a href="/builders/ranks"><svg class="ic"><use href="#i-rank"></use></svg>Ranks</a></li>
293
- <li><a href="/builders/economy"><svg class="ic"><use href="#i-coin"></use></svg>Economy</a></li>
294
- <li><a href="/builders/diagrams"><svg class="ic"><use href="#i-nodes"></use></svg>Diagrams</a></li>
295
- <li><a href="/builders/repo-atlas"><svg class="ic"><use href="#i-globe"></use></svg>Repo Atlas</a></li>
296
- <li><a href="/builders/modules"><svg class="ic"><use href="#i-box"></use></svg>Modules</a></li>
297
- <li><a href="/builders/api-docs"><svg class="ic"><use href="#i-code"></use></svg>API docs</a></li>
298
- </ul>
299
- <p class="grp" id="g-gov">Government</p>
300
- <ul aria-labelledby="g-gov">
301
- <li><a href="/builders/watch"><svg class="ic"><use href="#i-eye"></use></svg>Watch</a></li>
302
- <li><a href="/builders/harbor"><svg class="ic"><use href="#i-anchor"></use></svg>Harbor</a></li>
303
- <li><a href="/builders/gate"><svg class="ic"><use href="#i-gate"></use></svg>Gate</a></li>
304
- <li><a href="/builders/sessions"><svg class="ic"><use href="#i-list"></use></svg>Sessions</a></li>
305
- <li><a href="/builders/permissions"><svg class="ic"><use href="#i-key"></use></svg>Permissions</a></li>
306
- </ul>
307
- </nav>
308
- <button class="signout" type="button"><svg class="ic"><use href="#i-out"></use></svg>Sign out</button>
309
- </aside>
310
-
311
- <div class="col">
312
- <header class="top">
313
- <span class="hallmark">Builders' Hall</span>
314
- <div class="search">
315
- <svg class="ic"><use href="#i-search"></use></svg>
316
- <label class="vh" for="q">Search</label>
317
- <input id="q" type="search" placeholder="Search">
318
- </div>
319
- <span class="badge"><span class="dot"></span>Trusted</span>
320
- <button class="mode-toggle" id="mode" type="button" aria-label="Toggle light or dark">
321
- <svg class="moon" viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor"
322
- stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round">
323
- <path d="M16.2 12.4A6.8 6.8 0 0 1 7.6 3.8a6.8 6.8 0 1 0 8.6 8.6z"/>
324
- </svg>
325
- <svg class="sun" viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor"
326
- stroke-width="1.4" stroke-linecap="round">
327
- <circle cx="10" cy="10" r="3.9"/>
328
- <path d="M10 1.6v2.1M10 16.3v2.1M1.6 10h2.1M16.3 10h2.1M4.1 4.1l1.5 1.5M14.4 14.4l1.5 1.5M15.9 4.1l-1.5 1.5M5.6 14.4l-1.5 1.5"/>
329
- </svg>
330
- </button>
331
- <span class="who">
332
- <span class="avatar" aria-hidden="true">P</span>
333
- <svg class="ic caret" aria-hidden="true"><use href="#i-caret"></use></svg>
334
- </span>
335
- </header>
336
-
337
- <main class="board">
338
- <div class="sheet">
339
- <h1>Tasks</h1>
340
-
341
- <div class="tabs" role="tablist" aria-label="Task states">
342
- <button class="tab" role="tab" id="t-ready" aria-selected="true" aria-controls="p-ready" type="button">Ready <span class="n">42</span></button>
343
- <button class="tab" role="tab" id="t-prog" aria-selected="false" aria-controls="p-prog" type="button">In Progress <span class="n">15</span></button>
344
- <button class="tab" role="tab" id="t-back" aria-selected="false" aria-controls="p-back" type="button">Backlog <span class="n">89</span></button>
345
- <button class="tab" role="tab" id="t-done" aria-selected="false" aria-controls="p-done" type="button">Completed <span class="n">1107</span></button>
346
- </div>
347
-
348
- <div class="filters">
349
- <div class="fsearch">
350
- <label class="vh" for="fq">Filter tasks</label>
351
- <input id="fq" type="search" placeholder="task #, title, or goal">
352
- </div>
353
- <div class="selects">
354
- <span class="sel"><span class="sel-k">Sort</span>
355
- <select aria-label="Sort">
356
- <option>credits / minute (high to low)</option>
357
- <option>credits (high to low)</option>
358
- <option>newest first</option>
359
- </select></span>
360
- <span class="sel"><span class="sel-k">Version</span>
361
- <select aria-label="Version"><option>any</option><option>V1</option></select></span>
362
- <span class="sel"><span class="sel-k">Goal</span>
363
- <select aria-label="Goal"><option>any</option><option>Apex UI pass 2</option></select></span>
364
- <span class="sel"><span class="sel-k">Kind</span>
365
- <select aria-label="Kind"><option>any</option><option>feature</option></select></span>
366
- <span class="sel"><span class="sel-k">Discipline</span>
367
- <select aria-label="Discipline"><option>any</option><option>engineer</option></select></span>
368
- <span class="sel"><span class="sel-k">Newcomer</span>
369
- <select aria-label="Newcomer"><option>any</option><option>friendly</option></select></span>
370
- <span class="sel"><span class="sel-k">Creator</span>
371
- <select aria-label="Creator"><option>any</option><option>lars589</option></select></span>
372
- <span class="sel"><span class="sel-k">Age</span>
373
- <select aria-label="Age"><option>any</option><option>this week</option></select></span>
374
- <span class="sel"><span class="sel-k">Run mode</span>
375
- <select aria-label="Run mode"><option>any</option><option>parallel</option></select></span>
376
- </div>
377
- </div>
378
-
379
- <div id="p-ready" role="tabpanel" aria-labelledby="t-ready">
380
- <div class="scroller">
381
- <table>
382
- <caption class="vh">Claimable tasks, sorted by credits per minute</caption>
383
- <thead>
384
- <tr>
385
- <th scope="col"><label class="vh" for="all">Select all</label><input id="all" type="checkbox"></th>
386
- <th scope="col">Task</th>
387
- <th scope="col">Title</th>
388
- <th scope="col">Goal</th>
389
- <th scope="col" class="num">Credits</th>
390
- <th scope="col" class="num">Minutes</th>
391
- <th scope="col" class="num">Cr/min</th>
392
- <th scope="col">Status</th>
393
- </tr>
394
- </thead>
395
- <tbody>
396
- <!-- sample rows -->
397
- <tr>
398
- <td><label class="vh" for="r1">Select task 1003297</label><input id="r1" type="checkbox"></td>
399
- <th scope="row" class="tid">1003297</th>
400
- <td class="ttl">Landing: three composition versions in the chosen world</td>
401
- <td class="goal">Apex UI pass 2</td>
402
- <td class="cred">96</td><td class="num">40</td><td class="num">2.4</td>
403
- <td><span class="state"><span class="bead"></span>ready</span></td>
404
- </tr>
405
- <tr>
406
- <td><label class="vh" for="r2">Select task 1003302</label><input id="r2" type="checkbox"></td>
407
- <th scope="row" class="tid">1003302</th>
408
- <td class="ttl">Hall: five archetype mocks in the world</td>
409
- <td class="goal">Builders' hall in the world</td>
410
- <td class="cred">120</td><td class="num">55</td><td class="num">2.2</td>
411
- <td><span class="state"><span class="bead"></span>ready</span></td>
412
- </tr>
413
- <tr>
414
- <td><label class="vh" for="r3">Select task 1003310</label><input id="r3" type="checkbox"></td>
415
- <th scope="row" class="tid">1003310</th>
416
- <td class="ttl">Status: the index mock in the world</td>
417
- <td class="goal">Status ledger in the world</td>
418
- <td class="cred">60</td><td class="num">30</td><td class="num">2.0</td>
419
- <td><span class="state"><span class="bead"></span>ready</span></td>
420
- </tr>
421
- <tr>
422
- <td><label class="vh" for="r4">Select task 1003251</label><input id="r4" type="checkbox"></td>
423
- <th scope="row" class="tid">1003251</th>
424
- <td class="ttl">The manage view says which door the project runs</td>
425
- <td class="goal">Project hub</td>
426
- <td class="cred">45</td><td class="num">25</td><td class="num">1.8</td>
427
- <td><span class="state"><span class="bead"></span>ready</span></td>
428
- </tr>
429
- <tr class="held">
430
- <td><label class="vh" for="r5">Select task 1003240</label><input id="r5" type="checkbox" disabled></td>
431
- <th scope="row" class="tid">1003240</th>
432
- <td class="ttl">A gated project refuses strangers at the door</td>
433
- <td class="goal">Project hub</td>
434
- <td class="cred">72</td><td class="num">45</td><td class="num">1.6</td>
435
- <td><span class="state state--active"><span class="bead"></span>active
436
- <svg class="ic lock" aria-hidden="true"><use href="#i-lock"></use></svg></span></td>
437
- </tr>
438
- <tr class="clash">
439
- <td><label class="vh" for="r6">Select task 1003241</label><input id="r6" type="checkbox"></td>
440
- <th scope="row" class="tid">1003241</th>
441
- <td class="ttl">The wizard remembers a half-finished project</td>
442
- <td class="goal">Project hub</td>
443
- <td class="cred">54</td><td class="num">35</td><td class="num">1.5</td>
444
- <td class="clashcell"><span class="state"><span class="bead"></span>has file conflicts</span></td>
445
- </tr>
446
- <tr>
447
- <td><label class="vh" for="r7">Select task 1003242</label><input id="r7" type="checkbox"></td>
448
- <th scope="row" class="tid">1003242</th>
449
- <td class="ttl">Copy desk: flags carry a reason</td>
450
- <td class="goal">Copy desk</td>
451
- <td class="cred">38</td><td class="num">30</td><td class="num">1.3</td>
452
- <td><span class="state"><span class="bead"></span>ready</span></td>
453
- </tr>
454
- <tr>
455
- <td><label class="vh" for="r8">Select task 1003245</label><input id="r8" type="checkbox"></td>
456
- <th scope="row" class="tid">1003245</th>
457
- <td class="ttl">The identity chip opens the profile menu</td>
458
- <td class="goal">Apex UI pass 2</td>
459
- <td class="cred">30</td><td class="num">25</td><td class="num">1.2</td>
460
- <td><span class="state"><span class="bead"></span>ready</span></td>
461
- </tr>
462
- <tr>
463
- <td><label class="vh" for="r9">Select task 1003235</label><input id="r9" type="checkbox"></td>
464
- <th scope="row" class="tid">1003235</th>
465
- <td class="ttl">The hub answers the keyboard</td>
466
- <td class="goal">Project hub</td>
467
- <td class="cred">24</td><td class="num">20</td><td class="num">1.2</td>
468
- <td><span class="state"><span class="bead"></span>ready</span></td>
469
- </tr>
470
- <tr>
471
- <td><label class="vh" for="r10">Select task 1003239</label><input id="r10" type="checkbox"></td>
472
- <th scope="row" class="tid">1003239</th>
473
- <td class="ttl">A same-tab GitHub return stays put</td>
474
- <td class="goal">Project hub</td>
475
- <td class="cred">20</td><td class="num">20</td><td class="num">1.0</td>
476
- <td><span class="state"><span class="bead"></span>ready</span></td>
477
- </tr>
478
- </tbody>
479
- </table>
480
- </div>
481
-
482
- <div class="bulk" role="region" aria-label="Bulk actions">
483
- <span class="count" id="count">0 selected</span>
484
- <button class="btn btn--go" type="button">Bulk claim</button>
485
- <button class="btn" type="button">Bulk release</button>
486
- <button class="btn" type="button">Copy parallel prompt</button>
487
- <button class="btn" type="button">Copy sequential prompt</button>
488
- <button class="btn" type="button" id="clear">Clear</button>
489
- </div>
490
-
491
- <div class="pager">
492
- <span class="of">1 to 10 of 42</span>
493
- <button class="btn" type="button">Previous</button>
494
- <button class="btn" type="button">Next</button>
495
- </div>
496
- </div>
497
-
498
- <div id="p-prog" role="tabpanel" aria-labelledby="t-prog" hidden><p class="empty">Nothing here yet.</p></div>
499
- <div id="p-back" role="tabpanel" aria-labelledby="t-back" hidden><p class="empty">Nothing here yet.</p></div>
500
- <div id="p-done" role="tabpanel" aria-labelledby="t-done" hidden><p class="empty">Nothing here yet.</p></div>
501
- </div>
502
- </main>
503
- </div>
504
- </div>
505
-
506
- <script>
507
- (function () {
508
- var root = document.documentElement;
509
- function isDark() {
510
- var m = root.getAttribute('data-mode');
511
- if (m === 'dark') return true;
512
- if (m === 'light') return false;
513
- return window.matchMedia('(prefers-color-scheme: dark)').matches;
514
- }
515
- document.getElementById('mode').addEventListener('click', function () {
516
- var next = isDark() ? 'light' : 'dark';
517
- root.setAttribute('data-mode', next);
518
- try { localStorage.setItem('cb-color-mode', next); } catch (e) {}
519
- });
520
-
521
- var rows = Array.prototype.slice.call(document.querySelectorAll('tbody input[type=checkbox]'));
522
- var all = document.getElementById('all');
523
- var count = document.getElementById('count');
524
- function tally() {
525
- var n = rows.filter(function (c) { return c.checked; }).length;
526
- count.textContent = n + ' selected';
527
- all.checked = n > 0 && n === rows.filter(function (c) { return !c.disabled; }).length;
528
- }
529
- rows.forEach(function (c) { c.addEventListener('change', tally); });
530
- all.addEventListener('change', function () {
531
- rows.forEach(function (c) { if (!c.disabled) c.checked = all.checked; });
532
- tally();
533
- });
534
- document.getElementById('clear').addEventListener('click', function () {
535
- rows.forEach(function (c) { c.checked = false; });
536
- all.checked = false;
537
- tally();
538
- });
539
-
540
- var tabs = Array.prototype.slice.call(document.querySelectorAll('[role=tab]'));
541
- tabs.forEach(function (tab) {
542
- tab.addEventListener('click', function () {
543
- tabs.forEach(function (t) {
544
- var on = t === tab;
545
- t.setAttribute('aria-selected', on ? 'true' : 'false');
546
- document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
547
- });
548
- });
549
- });
550
- })();
551
- </script>
552
- </body>
553
- </html>