@bongos/core 1.19.726 → 1.19.727

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/.bongos-core.json +176 -491
  2. package/.devcontainer/Dockerfile +1 -1
  3. package/.devcontainer/devcontainer.json +2 -2
  4. package/.devcontainer/healthcheck.sh +1 -1
  5. package/.devcontainer/init-firewall.sh +1 -1
  6. package/.devcontainer/post-create.sh +2 -2
  7. package/.env.local.example +1 -1
  8. package/Dockerfile +1 -1
  9. package/docs/copy-inventory.md +1 -1
  10. package/docs/copy-registry.json +9 -9
  11. package/docs/module-api-changelog.md +2 -0
  12. package/docs/recipes/devbox-app-release.md +4 -4
  13. package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
  14. package/modules/dev-box/app/scripts/gen-brand.js +1 -1
  15. package/modules/dev-box/app/src/brand.js +1 -1
  16. package/modules/dev-box/app/test/unit.mjs +16 -16
  17. package/modules/dev-box/box-access.js +1 -1
  18. package/modules/dev-box/routes/box.js +1 -1
  19. package/modules/discord/discord-approvals.js +1 -1
  20. package/modules/grading/grader-model.js +1 -1
  21. package/modules/grading/grader-prompt.js +1 -1
  22. package/modules/grading/grader-workers/quality.js +1 -1
  23. package/modules/hall-ui/module.json +1 -1
  24. package/modules/hall-ui/public/brand-apply.js +1 -1
  25. package/modules/hall-ui/public/shell.js +1 -1
  26. package/modules/hall-ui/public/work.js +1 -1
  27. package/modules/lifecycle/conflict-resolve.js +1 -1
  28. package/modules/lifecycle/db-analytics.js +1 -1
  29. package/modules/lifecycle/routes/analytics.js +1 -1
  30. package/modules/onboarding/approval-broadcast.js +1 -1
  31. package/modules/onboarding/onboarding.js +1 -1
  32. package/modules/provisioning/tests/liveness.mjs +1 -1
  33. package/modules/public-landing/public/index.html +1 -1
  34. package/modules/public-landing/public/projects-floor.states.json +2 -2
  35. package/modules/public-landing/public/projects.probes.json +4 -4
  36. package/modules/public-landing/public/projects.states.json +2 -2
  37. package/modules/status-ui/module.json +1 -1
  38. package/modules/status-ui/public/status.js +4 -4
  39. package/modules/status-ui/public/style.css +1 -1
  40. package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
  41. package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
  42. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  43. package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
  44. package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
  45. package/modules/ui-design/kit/fixtures/progress.json +1 -1
  46. package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/scripts/cron/style_guide_audit.sh +1 -1
  50. package/scripts/discord/lib.js +1 -1
  51. package/scripts/discord/post.js +1 -1
  52. package/scripts/gds/audit-authorship.sh +1 -1
  53. package/scripts/gds/audit-replay.sh +29 -2
  54. package/scripts/gds/audit-ships.js +1 -1
  55. package/scripts/gds/backfill-sessions.js +2 -2
  56. package/scripts/gds/cf-tunnel.js +4 -4
  57. package/scripts/gds/claude-materialize.js +2 -2
  58. package/scripts/gds/cli-lib.js +6 -6
  59. package/scripts/gds/cutover-codemod.js +1 -1
  60. package/scripts/gds/dev-lib.js +2 -2
  61. package/scripts/gds/diagnose-achievements.js +2 -2
  62. package/scripts/gds/fitness-checks-identity.js +6 -4
  63. package/scripts/gds/gen-diagrams.js +1 -1
  64. package/scripts/gds/leak-scan-allowlist.js +293 -0
  65. package/scripts/gds/learning-capture.js +1 -1
  66. package/scripts/gds/linkify-refs.js +2 -2
  67. package/scripts/gds/local-preview-lib.js +1 -1
  68. package/scripts/gds/mirror-lineage-check.js +1 -1
  69. package/scripts/gds/mirror-redact.js +17 -2
  70. package/scripts/gds/newcomer-floor.templates.json +1 -1
  71. package/scripts/gds/package-core.js +18 -1
  72. package/scripts/gds/paste-token.js +1 -1
  73. package/scripts/gds/provision-units.js +2 -2
  74. package/scripts/gds/publish-manifest.js +15 -0
  75. package/scripts/gds/repo-metrics.js +1 -1
  76. package/scripts/gds/sandbox-stage.js +1 -1
  77. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-tasks.js +2 -2
  81. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  82. package/scripts/gds/seed-medusa-tasks.js +10 -10
  83. package/scripts/gds/seed-module-upstreaming.js +1 -1
  84. package/scripts/gds/seed-productization-tasks.js +6 -6
  85. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  86. package/scripts/gds/seed-staging.sh +19 -6
  87. package/scripts/gds/ship-deploy-target.js +1 -1
  88. package/scripts/gds/ship-flow.js +1 -1
  89. package/scripts/gds/smoke-gds.js +1 -1
  90. package/scripts/status-probe.mjs +2 -2
  91. package/src/bongos/auth-discord.js +2 -2
  92. package/src/bongos/live-channel.js +1 -1
  93. package/src/bongos/pool.js +1 -1
  94. package/src/bongos/routes/auth.js +11 -11
  95. package/src/bongos/routes/security.js +1 -1
  96. package/src/bongos/routes.js +1 -1
  97. package/src/branding.js +1 -1
  98. package/src/devbox-downloads.js +1 -1
  99. package/src/instance-config.js +2 -2
  100. package/src/module-api.js +1 -1
  101. package/src/module-loader/provenance.js +2 -2
  102. package/tests/art_stage.mjs +2 -2
  103. package/tests/auth_anthropic_identity.mjs +1 -1
  104. package/tests/auth_duplicate_cookie.mjs +1 -1
  105. package/tests/auth_error_brand.mjs +1 -1
  106. package/tests/auth_inactive_builder.mjs +1 -1
  107. package/tests/backup_cli.mjs +4 -4
  108. package/tests/bongos_box_connect.mjs +2 -2
  109. package/tests/bongos_downloads.mjs +2 -2
  110. package/tests/bongos_login.mjs +5 -5
  111. package/tests/box_connect_e2e.mjs +2 -2
  112. package/tests/box_dns_repoint.mjs +10 -10
  113. package/tests/box_host_keys.mjs +1 -1
  114. package/tests/box_onboard.mjs +9 -9
  115. package/tests/box_scope_session.mjs +1 -1
  116. package/tests/box_terminal_ssrf.mjs +7 -7
  117. package/tests/boxes.mjs +9 -9
  118. package/tests/branding.mjs +2 -2
  119. package/tests/bump_version.mjs +2 -2
  120. package/tests/cf_tunnel.mjs +40 -40
  121. package/tests/cli_token_reissue.mjs +7 -7
  122. package/tests/cloud_bongos_pack.mjs +1 -1
  123. package/tests/currency_label.mjs +8 -8
  124. package/tests/dev_lib.mjs +4 -4
  125. package/tests/devbox_dmg_backdrop.mjs +1 -1
  126. package/tests/devbox_downloads.mjs +2 -2
  127. package/tests/devbox_icons.mjs +1 -1
  128. package/tests/discord_approvals.mjs +1 -1
  129. package/tests/discord_oauth.mjs +2 -2
  130. package/tests/executed_closure.mjs +6 -1
  131. package/tests/first_admin_bootstrap.mjs +1 -1
  132. package/tests/gate_approvals.mjs +5 -5
  133. package/tests/grade_aggregates_unavailable.mjs +1 -1
  134. package/tests/hook_user_agents.mjs +2 -2
  135. package/tests/init.mjs +6 -6
  136. package/tests/instance_config.mjs +1 -1
  137. package/tests/instance_manifest.mjs +5 -5
  138. package/tests/instance_mismatch_guard.mjs +13 -13
  139. package/tests/leak_scan_allowlist.mjs +94 -0
  140. package/tests/migrate_root_resolution.mjs +4 -4
  141. package/tests/mirror_redact.mjs +28 -4
  142. package/tests/module_catalog.mjs +5 -5
  143. package/tests/module_submissions.mjs +3 -3
  144. package/tests/package_core.mjs +1 -1
  145. package/tests/parallel-load.mjs +6 -6
  146. package/tests/projects_hub.mjs +2 -2
  147. package/tests/provision.mjs +50 -50
  148. package/tests/provisioning_github_app_routes.mjs +1 -1
  149. package/tests/provisioning_onboard_mode.mjs +2 -2
  150. package/tests/publish_reconciler.mjs +4 -4
  151. package/tests/sandbox_stage.mjs +1 -1
  152. package/tests/scrubber_corpus.mjs +3 -3
  153. package/tests/search_isolation.mjs +1 -1
  154. package/tests/session_records.mjs +1 -1
  155. package/tests/ship_card.mjs +6 -6
  156. package/tests/ship_ci_deploy.mjs +1 -1
  157. package/tests/single_host_hall.mjs +9 -9
  158. package/tests/smoke_preflight.mjs +1 -1
  159. package/tests/smoke_target.mjs +1 -1
  160. package/tests/status-probe.mjs +1 -1
  161. package/tests/status_mirror_sync.mjs +1 -1
  162. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  163. package/docs/design/mocks/_schemes.css +0 -604
  164. package/docs/design/mocks/component-sheet.html +0 -428
  165. package/docs/design/mocks/hall/_tokens.css +0 -370
  166. package/docs/design/mocks/hall/board/v1.html +0 -846
  167. package/docs/design/mocks/hall/board/v2.html +0 -858
  168. package/docs/design/mocks/hall/board/v3.html +0 -884
  169. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  170. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  171. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  172. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  173. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  174. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  175. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  176. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  177. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  178. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  179. package/docs/design/mocks/hall/task/v1.html +0 -633
  180. package/docs/design/mocks/hall/task/v2.html +0 -646
  181. package/docs/design/mocks/hall/task/v3.html +0 -647
  182. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  183. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  184. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  185. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  186. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  187. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  188. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  189. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  190. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  191. package/docs/design/mocks/hub/mine.html +0 -465
  192. package/docs/design/mocks/hub/picker.html +0 -421
  193. package/docs/design/mocks/hub/planets.html +0 -356
  194. package/docs/design/mocks/hub/v1.html +0 -1209
  195. package/docs/design/mocks/hub/v2.html +0 -1257
  196. package/docs/design/mocks/hub/v3.html +0 -1496
  197. package/docs/design/mocks/hub/wizard.html +0 -421
  198. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  199. package/docs/design/mocks/landing/v1.html +0 -956
  200. package/docs/design/mocks/landing/v2.html +0 -708
  201. package/docs/design/mocks/landing/v3.html +0 -911
  202. package/docs/design/mocks/landing-page-mock.html +0 -687
  203. package/docs/design/mocks/landing-palettes.html +0 -103
  204. package/docs/design/mocks/projects-hub-mock.html +0 -991
  205. package/docs/design/mocks/projects-hub-variants.html +0 -146
  206. package/docs/design/mocks/projects-page-mock.html +0 -167
  207. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  208. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  209. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  210. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  211. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  212. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  213. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  214. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  215. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  216. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  217. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  218. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  219. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  220. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  221. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  222. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  223. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  224. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  225. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  226. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,595 +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=Antonio:wght@400;600;700&family=Azeret+Mono:wght@400;500&family=Barlow:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
13
- <link rel="stylesheet" href="_tokens.css">
14
- <style>
15
- body { overflow-x: hidden; }
16
-
17
- /* ---------- the ground plate (dark only, token driven) ---------- */
18
- .plate { position: fixed; inset: -24px; z-index: -1; }
19
- .plate::before {
20
- content: ''; position: absolute; inset: 0;
21
- background-image: var(--plate); background-size: cover; background-position: center;
22
- filter: blur(var(--plate-blur)) saturate(.82) contrast(.78) brightness(1.22);
23
- }
24
- .plate::after { content: ''; position: absolute; inset: 0; background: var(--plate-tint); }
25
-
26
- .app { display: grid; grid-template-columns: 240px minmax(0, 1fr); height: 100dvh; }
27
-
28
- /* ---------- sidebar ---------- */
29
- .side {
30
- position: relative; display: flex; flex-direction: column; min-height: 0;
31
- background: var(--side-bg); border-right: var(--line) solid var(--glass-edge);
32
- backdrop-filter: blur(var(--glass-blur));
33
- }
34
- .brand { display: flex; align-items: center; gap: 10px; padding: 16px 18px 14px; text-decoration: none; flex: 0 0 auto; }
35
- .brand-mark { width: 32px; height: 24px; display: block; flex: 0 0 auto; }
36
- .brand-mark svg { width: 100%; height: 100%; display: block; }
37
- .brand-name { font: 600 13px/1.2 var(--font-body); letter-spacing: .17em; text-transform: uppercase; color: var(--ink); }
38
- .sidenav { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 4px 10px 14px; scrollbar-width: thin; scrollbar-color: var(--scroll-thumb) transparent; }
39
- .sidenav::-webkit-scrollbar { width: 8px; }
40
- .sidenav::-webkit-scrollbar-track { background: transparent; }
41
- .sidenav::-webkit-scrollbar-thumb { background: var(--scroll-thumb); border-radius: var(--radius-pill); }
42
- .grp { margin: 16px 0 6px; padding: 0 10px; font: 500 10.5px/1 var(--label-font); letter-spacing: var(--label-track); text-transform: uppercase; color: var(--accent-text); }
43
- .sidenav ul { margin: 0; padding: 0; list-style: none; }
44
- .sidenav a {
45
- position: relative; display: flex; align-items: center; gap: 10px;
46
- padding: 8px 10px; min-height: 34px; border-radius: var(--radius-pill);
47
- color: var(--ink-soft); text-decoration: none; font: 400 13.5px/1.2 var(--font-body);
48
- }
49
- .sidenav a:hover { color: var(--ink); background: var(--row-hover); }
50
- .sidenav a[aria-current="page"] {
51
- background: var(--accent-tint); color: var(--accent-text); font-weight: 600;
52
- box-shadow: inset 2px 0 0 var(--accent-ui);
53
- }
54
- .ico { width: 17px; height: 17px; flex: 0 0 auto; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
55
- .side-foot { flex: 0 0 auto; padding: 12px 16px 18px; border-top: var(--line) solid var(--glass-edge); }
56
- .signout {
57
- display: inline-flex; align-items: center; gap: 9px; min-height: 34px; padding: 0 14px;
58
- background: none; border: var(--line) solid transparent; border-radius: var(--radius-pill);
59
- color: var(--ink-soft); font: 400 13.5px/1 var(--font-body); cursor: pointer; font-family: var(--font-body);
60
- }
61
- .signout:hover { color: var(--ink); border-color: var(--edge-ui); }
62
-
63
- /* ---------- top bar ---------- */
64
- .col { display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; }
65
- .topbar {
66
- flex: 0 0 auto; height: 56px; display: flex; align-items: center; gap: 14px;
67
- padding: 0 20px; background: var(--topbar-bg);
68
- border-bottom: var(--line) solid var(--glass-edge); backdrop-filter: blur(var(--glass-blur));
69
- }
70
- .hallname { font: 600 15px/1 var(--font-display); letter-spacing: .06em; text-transform: uppercase; color: var(--ink); flex: 0 0 auto; font-size: 19px; }
71
- .search { position: relative; flex: 1 1 auto; max-width: 560px; display: flex; align-items: center; }
72
- .search .ico { position: absolute; left: 12px; color: var(--ink-faint); pointer-events: none; }
73
- .search input {
74
- width: 100%; height: 34px; padding: 0 12px 0 36px; color: var(--ink);
75
- background: var(--panel-bg); border: var(--line) solid var(--edge-ui); border-radius: var(--radius-pill);
76
- font: 400 13.5px/1 var(--font-body);
77
- }
78
- .search input::placeholder { color: var(--ink-faint); }
79
- .kbd { position: absolute; right: 10px; font: 400 10.5px/1 var(--font-mono); color: var(--ink-faint); pointer-events: none; }
80
- .spacer { flex: 1 1 auto; }
81
- .rank {
82
- display: inline-flex; align-items: center; gap: 7px; height: 28px; padding: 0 12px;
83
- border-radius: var(--radius-pill); background: var(--accent-tint); color: var(--accent-text);
84
- font: 600 11px/1 var(--font-body); letter-spacing: var(--label-track); text-transform: uppercase;
85
- }
86
- .rank .ico { width: 13px; height: 13px; }
87
- .avatar {
88
- width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center;
89
- background: var(--bg-deep); border: var(--line) solid var(--edge-ui); color: var(--ink);
90
- font: 600 12.5px/1 var(--font-body);
91
- }
92
- .caret { width: 13px; height: 13px; stroke: currentColor; fill: none; stroke-width: 1.5; color: var(--ink-faint); }
93
- .mode-toggle {
94
- width: 34px; height: 34px; display: grid; place-items: center; padding: 0; cursor: pointer;
95
- background: none; border: var(--line) solid transparent; border-radius: var(--radius-pill); color: var(--ink-soft);
96
- }
97
- .mode-toggle:hover { color: var(--accent-text); border-color: var(--edge-ui); }
98
- .mode-toggle svg { width: 17px; height: 17px; display: block; }
99
- .mode-toggle .i-moon { display: var(--icon-moon); }
100
- .mode-toggle .i-sun { display: var(--icon-sun); }
101
-
102
- /* ---------- main ---------- */
103
- main {
104
- flex: 1 1 auto; min-width: 0; min-height: 0; overflow-y: auto; padding: 22px 20px 40px;
105
- scrollbar-width: thin; scrollbar-color: var(--scroll-thumb) transparent;
106
- }
107
- main::-webkit-scrollbar { width: 10px; }
108
- main::-webkit-scrollbar-track { background: transparent; }
109
- main::-webkit-scrollbar-thumb { background: var(--scroll-thumb); border-radius: var(--radius-pill); }
110
- .inner { max-width: 1120px; margin: 0 auto; }
111
- h1 { margin: 0 0 14px; font: 700 30px/1 var(--font-display); letter-spacing: .01em; text-transform: uppercase; color: var(--ink); }
112
-
113
- .tabs { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
114
- .tab {
115
- display: inline-flex; align-items: center; gap: 8px; min-height: 32px; padding: 0 14px; cursor: pointer;
116
- background: var(--panel-bg); border: var(--line) solid var(--edge-ui); border-radius: var(--radius-pill);
117
- backdrop-filter: blur(var(--glass-blur));
118
- color: var(--ink-soft); font: 600 11.5px/1 var(--font-body); letter-spacing: var(--label-track); text-transform: uppercase;
119
- font-family: var(--font-body);
120
- }
121
- .tab:hover { color: var(--ink); border-color: var(--accent-text); }
122
- .tab .cnt {
123
- display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 18px; padding: 0 6px;
124
- border-radius: var(--radius-pill); background: var(--row-hover); color: inherit;
125
- font: 500 10.5px/1 var(--font-mono); font-variant-numeric: tabular-nums; letter-spacing: 0;
126
- }
127
- .tab[aria-selected="true"] { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--on-accent); }
128
- .tab[aria-selected="true"] .cnt { background: color-mix(in srgb, var(--on-accent) 18%, transparent); }
129
-
130
- .filters { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; align-items: center; }
131
- .qsearch { flex: 1 1 230px; min-width: 190px; max-width: 320px; }
132
- .qsearch input {
133
- width: 100%; height: 32px; padding: 0 13px; color: var(--ink);
134
- background: var(--panel-bg); border: var(--line) solid var(--edge-ui); border-radius: var(--radius-pill);
135
- font: 400 12.5px/1 var(--font-body);
136
- }
137
- .qsearch input::placeholder { color: var(--ink-faint); }
138
- .sel {
139
- position: relative; display: inline-flex; align-items: center; gap: 8px; height: 32px;
140
- padding: 0 30px 0 14px; background: var(--panel-bg);
141
- border: var(--line) solid var(--edge-ui); border-radius: var(--radius-pill);
142
- backdrop-filter: blur(var(--glass-blur));
143
- }
144
- .sel:hover { border-color: var(--accent-text); }
145
- .sel:focus-within { outline: 2px solid var(--focus); outline-offset: 2px; }
146
- .sel::after {
147
- content: ''; position: absolute; right: 13px; top: 50%; width: 6px; height: 6px;
148
- border-right: 1.4px solid var(--ink-soft); border-bottom: 1.4px solid var(--ink-soft);
149
- transform: translateY(-72%) rotate(45deg); pointer-events: none;
150
- }
151
- .sel .k {
152
- font: 600 10.5px/1 var(--font-body); letter-spacing: var(--label-track);
153
- text-transform: uppercase; color: var(--ink-faint); white-space: nowrap;
154
- }
155
- .sel select {
156
- appearance: none; -webkit-appearance: none; background: none; border: 0; padding: 0; cursor: pointer;
157
- max-width: 200px; color: var(--ink); font: 400 12.5px/1 var(--font-body); font-family: var(--font-body);
158
- }
159
- .sel select:focus-visible { outline: none; }
160
-
161
- .panel {
162
- position: relative; background: var(--panel-bg); border: var(--line) solid var(--glass-edge);
163
- border-radius: var(--radius); backdrop-filter: blur(var(--glass-blur)); box-shadow: var(--shadow-card);
164
- }
165
- .tk { position: absolute; top: 10px; right: 12px; color: var(--ink-faint); line-height: 0; }
166
- .tk svg { display: block; width: 13px; height: 13px; }
167
- .tablewrap { overflow-x: auto; scrollbar-width: thin; scrollbar-color: var(--scroll-thumb) var(--scroll-track); }
168
- .tablewrap::-webkit-scrollbar { height: 9px; }
169
- .tablewrap::-webkit-scrollbar-track { background: var(--scroll-track); }
170
- .tablewrap::-webkit-scrollbar-thumb { background: var(--scroll-thumb); border-radius: var(--radius-pill); }
171
- table { width: 100%; min-width: 860px; border-collapse: collapse; }
172
- thead th {
173
- text-align: left; padding: 12px 12px 11px; white-space: nowrap;
174
- border-bottom: var(--line) solid var(--glass-edge);
175
- font: 600 10.5px/1 var(--label-font); letter-spacing: var(--label-track); text-transform: uppercase; color: var(--ink-soft);
176
- }
177
- thead th.r, tbody td.r { text-align: right; }
178
- tbody td { padding: 11px 12px; border-bottom: var(--line) solid var(--rule-soft); font: 400 13.5px/1.35 var(--font-body); color: var(--ink); vertical-align: middle; }
179
- tbody tr:last-child td { border-bottom: 0; }
180
- tbody tr:hover td { background: var(--row-hover); }
181
- tbody tr.sel-row td { background: var(--accent-tint); }
182
- td.id, td.num-cell { font-family: var(--font-mono); font-variant-numeric: tabular-nums; font-size: 12.5px; }
183
- td.id { color: var(--accent-text); }
184
- td.goal { color: var(--ink-soft); font-size: 12.5px; }
185
- .cbcell { width: 40px; }
186
- tr.held td { color: var(--ink-faint); }
187
- tr.held td.id { color: var(--ink-faint); }
188
-
189
- input[type="checkbox"] {
190
- appearance: none; -webkit-appearance: none; width: 17px; height: 17px; margin: 0; cursor: pointer;
191
- background: var(--bg-card); border: var(--line) solid var(--edge-ui); border-radius: 4px; display: block; position: relative;
192
- }
193
- input[type="checkbox"]:checked { background: var(--accent-fill); border-color: var(--accent-fill); }
194
- input[type="checkbox"]:checked::after {
195
- content: ''; position: absolute; left: 5px; top: 1px; width: 5px; height: 10px;
196
- border-right: 2px solid var(--on-accent); border-bottom: 2px solid var(--on-accent); transform: rotate(42deg);
197
- }
198
-
199
- .state { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; font: 600 10.5px/1 var(--font-body); letter-spacing: var(--label-track); text-transform: uppercase; color: var(--ink-soft); }
200
- .led { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; }
201
- .led.ready { border: 1.5px solid var(--accent-ui); }
202
- .led.active { background: var(--accent-ui); box-shadow: 0 0 9px var(--halo-bloom); }
203
- .state .ico { width: 13px; height: 13px; color: var(--ink-faint); }
204
- td.conflict {
205
- background:
206
- repeating-linear-gradient(-45deg, var(--hatch) 0 1px, transparent 1px 6px);
207
- }
208
- td.conflict .state { color: var(--err); }
209
-
210
- .bulk {
211
- display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
212
- padding: 13px 14px; border-top: var(--line) solid var(--glass-edge);
213
- }
214
- .bulk .count { font: 600 11px/1 var(--font-body); letter-spacing: var(--label-track); text-transform: uppercase; color: var(--ink-soft); margin-right: 4px; }
215
- .btn {
216
- min-height: 32px; padding: 0 15px; cursor: pointer; font-family: var(--font-body);
217
- background: none; border: var(--line) solid var(--edge-ui); border-radius: var(--radius-pill);
218
- color: var(--ink); font: 600 11.5px/1 var(--font-body); letter-spacing: var(--label-track); text-transform: uppercase;
219
- display: inline-flex; align-items: center;
220
- }
221
- .btn:hover { border-color: var(--accent-text); color: var(--accent-text); }
222
- .btn.primary { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--on-accent); }
223
- .btn.primary:hover { color: var(--on-accent); filter: brightness(1.08); }
224
-
225
- .pager { display: flex; align-items: center; gap: 10px; padding: 14px 2px 0; }
226
- /* the pager sits on the bare plate, so its controls carry their own glass */
227
- .pager .btn { background: var(--panel-bg); backdrop-filter: blur(var(--glass-blur)); }
228
- .pager .of { font: 400 12.5px/1 var(--font-mono); color: var(--ink-faint); font-variant-numeric: tabular-nums; margin-right: auto; }
229
-
230
- .empty { padding: 46px 16px; text-align: center; font: 400 13.5px/1.4 var(--font-body); color: var(--ink-faint); }
231
-
232
- /* ---------- narrow ---------- */
233
- @media (max-width: 1024px) {
234
- .app { grid-template-columns: minmax(0, 1fr); }
235
- .side { flex-direction: row; align-items: center; gap: 10px; border-right: 0; border-bottom: var(--line) solid var(--glass-edge); padding-right: 12px; }
236
- .brand { padding: 10px 12px; }
237
- .brand-name { display: none; }
238
- .sidenav { overflow-x: auto; overflow-y: hidden; padding: 8px 0; white-space: nowrap; scrollbar-width: thin; }
239
- .sidenav ul { display: inline-flex; gap: 4px; }
240
- .grp { display: inline-block; margin: 0 6px 0 12px; padding: 0; vertical-align: middle; }
241
- .sidenav a { display: inline-flex; }
242
- .side-foot { border-top: 0; padding: 0 4px 0 8px; }
243
- .hallname { font-size: 16px; }
244
- .kbd { display: none; }
245
- main { padding: 18px 14px 34px; }
246
- }
247
- @media (max-width: 620px) {
248
- .topbar { flex-wrap: wrap; height: auto; padding: 10px 14px; gap: 10px; }
249
- .search { order: 3; flex: 1 1 100%; max-width: none; }
250
- h1 { font-size: 25px; }
251
- }
252
- </style>
253
- </head>
254
- <body>
255
- <div class="plate" aria-hidden="true"></div>
256
-
257
- <svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false"><defs>
258
- <symbol id="i-home" viewBox="0 0 24 24"><path d="M3.6 10.6 12 4l8.4 6.6V20a1 1 0 0 1-1 1H4.6a1 1 0 0 1-1-1z"/><path d="M9.6 21v-6.4h4.8V21"/></symbol>
259
- <symbol id="i-map" viewBox="0 0 24 24"><path d="M9 4.4 3.6 6.6v13l5.4-2.2 6 2.2 5.4-2.2v-13L15 6.6z"/><path d="M9 4.4v13.2M15 6.6v13.2"/></symbol>
260
- <symbol id="i-goal" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.2"/><circle cx="12" cy="12" r="3.4"/></symbol>
261
- <symbol id="i-tasks" viewBox="0 0 24 24"><path d="M3.4 6.6 5 8.2l2.6-2.8M3.4 12.4 5 14l2.6-2.8M3.4 18.2 5 19.8l2.6-2.8M10.6 6.8h10M10.6 12.6h10M10.6 18.4h10"/></symbol>
262
- <symbol id="i-idea" viewBox="0 0 24 24"><path d="M9.4 18.4h5.2M10.4 21h3.2"/><path d="M12 3a6.1 6.1 0 0 0-3.5 11.1v1.7h7V14A6.1 6.1 0 0 0 12 3z"/></symbol>
263
- <symbol id="i-doc" viewBox="0 0 24 24"><path d="M6 3.2h7.6L18 7.6V20.8H6z"/><path d="M13.6 3.2v4.4H18"/><path d="M9 12.6h6M9 16.2h6"/></symbol>
264
- <symbol id="i-badge" viewBox="0 0 24 24"><circle cx="12" cy="9" r="5.4"/><path d="M8.4 13.4 7 21l5-2.4 5 2.4-1.4-7.6"/></symbol>
265
- <symbol id="i-person" viewBox="0 0 24 24"><circle cx="12" cy="8" r="3.9"/><path d="M4.8 20.4a7.2 7.2 0 0 1 14.4 0"/></symbol>
266
- <symbol id="i-people" viewBox="0 0 24 24"><circle cx="9" cy="8.4" r="3.4"/><path d="M2.8 20a6.2 6.2 0 0 1 12.4 0"/><path d="M16 5.4a3.4 3.4 0 0 1 0 6.6M17.6 14.6A6.2 6.2 0 0 1 21.2 20"/></symbol>
267
- <symbol id="i-chart" viewBox="0 0 24 24"><path d="M4.4 20.2V12M12 20.2V4.6M19.6 20.2v-6.4"/></symbol>
268
- <symbol id="i-group" viewBox="0 0 24 24"><circle cx="7.4" cy="9" r="2.9"/><circle cx="16.6" cy="9" r="2.9"/><path d="M2.6 19.4a4.9 4.9 0 0 1 9.6 0M11.8 19.4a4.9 4.9 0 0 1 9.6 0"/></symbol>
269
- <symbol id="i-book" viewBox="0 0 24 24"><path d="M4.2 5.6A2.4 2.4 0 0 1 6.6 3.2h13.2v15H6.6a2.4 2.4 0 0 0-2.4 2.4z"/><path d="M19.8 18.2v2.6H6.6"/></symbol>
270
- <symbol id="i-ranks" viewBox="0 0 24 24"><path d="M6.6 13.4 12 8.8l5.4 4.6M6.6 19 12 14.4l5.4 4.6M6.6 7.8 12 3.2l5.4 4.6"/></symbol>
271
- <symbol id="i-coin" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.2"/><path d="M12 7.2v9.6M14.4 9.4a2.6 2.6 0 0 0-4.8 1.2c0 2.6 4.8 1.4 4.8 3.8a2.6 2.6 0 0 1-4.8 1.2"/></symbol>
272
- <symbol id="i-diagram" viewBox="0 0 24 24"><rect x="3.4" y="3.4" width="6.2" height="6.2" rx="1.2"/><rect x="14.4" y="14.4" width="6.2" height="6.2" rx="1.2"/><path d="M9.6 6.5h5.4a2.6 2.6 0 0 1 2.6 2.6v5.3"/></symbol>
273
- <symbol id="i-globe" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.2"/><path d="M3.8 12h16.4M12 3.8a13 13 0 0 1 0 16.4 13 13 0 0 1 0-16.4z"/></symbol>
274
- <symbol id="i-cube" viewBox="0 0 24 24"><path d="M12 3.4 4.2 7.7v8.6L12 20.6l7.8-4.3V7.7z"/><path d="m4.2 7.7 7.8 4.3 7.8-4.3M12 12v8.6"/></symbol>
275
- <symbol id="i-code" viewBox="0 0 24 24"><path d="M8.8 7.2 3.8 12l5 4.8M15.2 7.2 20.2 12l-5 4.8M13.4 4.6l-2.8 14.8"/></symbol>
276
- <symbol id="i-eye" viewBox="0 0 24 24"><path d="M2.6 12S6 5.8 12 5.8 21.4 12 21.4 12 18 18.2 12 18.2 2.6 12 2.6 12z"/><circle cx="12" cy="12" r="2.9"/></symbol>
277
- <symbol id="i-anchor" viewBox="0 0 24 24"><circle cx="12" cy="5.4" r="2.4"/><path d="M12 7.8v13M6.6 11.4h10.8M3.6 14.6a8.4 8.4 0 0 0 16.8 0"/></symbol>
278
- <symbol id="i-lock" viewBox="0 0 24 24"><rect x="4.6" y="10.4" width="14.8" height="10.2" rx="1.6"/><path d="M8.2 10.4V7.8a3.8 3.8 0 0 1 7.6 0v2.6"/></symbol>
279
- <symbol id="i-clock" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.2"/><path d="M12 7.2V12l3.2 2.2"/></symbol>
280
- <symbol id="i-key" viewBox="0 0 24 24"><circle cx="7.6" cy="14.6" r="3.9"/><path d="m10.4 11.8 8.4-8.4M16.4 5.8l2.2 2.2M14 8.2l2.2 2.2"/></symbol>
281
- <symbol id="i-out" viewBox="0 0 24 24"><path d="M14.6 4.6H5.4v14.8h9.2M11 12h9.6M17.4 8.6 21 12l-3.6 3.4"/></symbol>
282
- <symbol id="i-search" viewBox="0 0 24 24"><circle cx="10.8" cy="10.8" r="6.4"/><path d="m15.6 15.6 4.4 4.4"/></symbol>
283
- <symbol id="i-trophy" viewBox="0 0 24 24"><path d="M7.4 3.6h9.2v5a4.6 4.6 0 0 1-9.2 0z"/><path d="M7.4 5.2H4.6v1.4a3 3 0 0 0 3 3M16.6 5.2h2.8v1.4a3 3 0 0 1-3 3M9.6 20.4h4.8M12 13.2v7.2"/></symbol>
284
- </defs></svg>
285
-
286
- <div class="app">
287
- <aside class="side">
288
- <a class="brand" href="/">
289
- <span class="brand-mark">
290
- <svg viewBox="0 0 440 320" role="img" aria-label="A pair of bongo drums being played" style="--accent:var(--ink-soft);--accent-deep:var(--ink-faint);--terracotta:var(--ink-soft);--ink:var(--bg-deep);--skin-hi:var(--ink-soft);--skin-mid:var(--ink-soft);--skin-lo:var(--ink-faint)">
291
- <defs>
292
- <linearGradient id="hShellBig" x1="0" y1="0" x2="1" y2="0.35">
293
- <stop offset="0%" stop-color="var(--accent-deep)"/><stop offset="16%" stop-color="var(--accent)"/>
294
- <stop offset="48%" stop-color="var(--accent)"/><stop offset="86%" stop-color="var(--accent-deep)"/>
295
- <stop offset="100%" stop-color="var(--accent-deep)"/>
296
- </linearGradient>
297
- <linearGradient id="hShellSml" x1="0" y1="0" x2="1" y2="0.35">
298
- <stop offset="0%" stop-color="var(--accent-deep)"/><stop offset="18%" stop-color="var(--terracotta)"/>
299
- <stop offset="55%" stop-color="var(--terracotta)"/><stop offset="100%" stop-color="var(--accent-deep)"/>
300
- </linearGradient>
301
- <radialGradient id="hSkin" cx="0.36" cy="0.26" r="0.9">
302
- <stop offset="0%" stop-color="var(--skin-hi)"/><stop offset="58%" stop-color="var(--skin-mid)"/>
303
- <stop offset="100%" stop-color="var(--skin-lo)"/>
304
- </radialGradient>
305
- </defs>
306
- <path d="M 214,196 C 232,188 250,188 264,196 L 258,232 C 244,225 230,225 219,232 Z" fill="var(--accent-deep)"/>
307
- <g>
308
- <path d="M 74,118 C 76,166 90,228 98,266 A 52,17 0 0 0 202,266 C 210,228 224,166 226,118 Z" fill="url(#hShellBig)"/>
309
- <path d="M 172,124 C 174,176 186,232 192,268 A 52,17 0 0 0 202,266 C 210,228 224,166 226,118 Z" fill="var(--ink)" opacity=".17"/>
310
- <path d="M 92,126 C 94,174 104,230 110,266 A 52,17 0 0 1 100,267 C 92,230 78,172 76,124 Z" fill="#fff" opacity=".20"/>
311
- <ellipse cx="150" cy="121" rx="80" ry="29" fill="var(--accent-deep)"/>
312
- <ellipse cx="150" cy="117" rx="80" ry="29" fill="var(--accent)"/>
313
- <ellipse cx="150" cy="118" rx="70" ry="24" fill="url(#hSkin)"/>
314
- </g>
315
- <g>
316
- <path d="M 240,134 C 242,178 252,230 258,266 A 40,13 0 0 0 338,266 C 344,230 354,178 356,134 Z" fill="url(#hShellSml)"/>
317
- <path d="M 314,140 C 316,186 324,234 328,268 A 40,13 0 0 0 338,266 C 344,230 354,178 356,134 Z" fill="var(--ink)" opacity=".19"/>
318
- <path d="M 254,140 C 256,182 264,232 268,266 A 40,13 0 0 1 260,267 C 254,232 244,182 242,138 Z" fill="#fff" opacity=".17"/>
319
- <ellipse cx="296" cy="137" rx="60" ry="22" fill="var(--accent-deep)"/>
320
- <ellipse cx="296" cy="133" rx="60" ry="22" fill="var(--terracotta)"/>
321
- <ellipse cx="296" cy="134" rx="51" ry="18" fill="url(#hSkin)"/>
322
- </g>
323
- </svg>
324
- </span>
325
- <span class="brand-name">Cloud Bongos</span>
326
- </a>
327
-
328
- <nav class="sidenav" aria-label="Hall">
329
- <ul>
330
- <li><a href="/builders"><svg class="ico"><use href="#i-home"/></svg>Home</a></li>
331
- <li><a href="/builders/roadmap"><svg class="ico"><use href="#i-map"/></svg>Roadmap</a></li>
332
- <li><a href="/builders/goals"><svg class="ico"><use href="#i-goal"/></svg>Goals</a></li>
333
- <li><a href="/builders/work" aria-current="page"><svg class="ico"><use href="#i-tasks"/></svg>Tasks</a></li>
334
- <li><a href="/builders/ideas"><svg class="ico"><use href="#i-idea"/></svg>Ideas</a></li>
335
- <li><a href="/builders/copy-desk"><svg class="ico"><use href="#i-doc"/></svg>Copy desk</a></li>
336
- </ul>
337
- <p class="grp" id="g-you">You</p>
338
- <ul aria-labelledby="g-you">
339
- <li><a href="/builders/standing"><svg class="ico"><use href="#i-badge"/></svg>Standing</a></li>
340
- <li><a href="/builders/profile"><svg class="ico"><use href="#i-person"/></svg>Profile</a></li>
341
- </ul>
342
- <p class="grp" id="g-community">Community</p>
343
- <ul aria-labelledby="g-community">
344
- <li><a href="/builders/collab"><svg class="ico"><use href="#i-people"/></svg>Collab</a></li>
345
- <li><a href="/builders/leaderboard"><svg class="ico"><use href="#i-chart"/></svg>Leaderboard</a></li>
346
- <li><a href="/builders/people"><svg class="ico"><use href="#i-group"/></svg>People</a></li>
347
- </ul>
348
- <p class="grp" id="g-docs">Docs</p>
349
- <ul aria-labelledby="g-docs">
350
- <li><a href="/builders/primer"><svg class="ico"><use href="#i-book"/></svg>Primer</a></li>
351
- <li><a href="/builders/ranks"><svg class="ico"><use href="#i-ranks"/></svg>Ranks</a></li>
352
- <li><a href="/builders/economy"><svg class="ico"><use href="#i-coin"/></svg>Economy</a></li>
353
- <li><a href="/builders/diagrams"><svg class="ico"><use href="#i-diagram"/></svg>Diagrams</a></li>
354
- <li><a href="/builders/repo-atlas"><svg class="ico"><use href="#i-globe"/></svg>Repo Atlas</a></li>
355
- <li><a href="/builders/modules"><svg class="ico"><use href="#i-cube"/></svg>Modules</a></li>
356
- <li><a href="/builders/api-docs"><svg class="ico"><use href="#i-code"/></svg>API docs</a></li>
357
- </ul>
358
- <p class="grp" id="g-government">Government</p>
359
- <ul aria-labelledby="g-government">
360
- <li><a href="/builders/watch"><svg class="ico"><use href="#i-eye"/></svg>Watch</a></li>
361
- <li><a href="/builders/harbor"><svg class="ico"><use href="#i-anchor"/></svg>Harbor</a></li>
362
- <li><a href="/builders/gate"><svg class="ico"><use href="#i-lock"/></svg>Gate</a></li>
363
- <li><a href="/builders/sessions"><svg class="ico"><use href="#i-clock"/></svg>Sessions</a></li>
364
- <li><a href="/builders/permissions"><svg class="ico"><use href="#i-key"/></svg>Permissions</a></li>
365
- </ul>
366
- </nav>
367
-
368
- <div class="side-foot">
369
- <button class="signout" type="button"><svg class="ico"><use href="#i-out"/></svg>Sign out</button>
370
- </div>
371
- </aside>
372
-
373
- <div class="col">
374
- <header class="topbar">
375
- <span class="hallname">Builders' Hall</span>
376
- <label class="search">
377
- <svg class="ico"><use href="#i-search"/></svg>
378
- <span class="sr-only">Search the hall</span>
379
- <input type="search" placeholder="Search">
380
- <span class="kbd" aria-hidden="true">Ctrl K</span>
381
- </label>
382
- <span class="spacer"></span>
383
- <span class="rank"><svg class="ico"><use href="#i-trophy"/></svg>Trusted</span>
384
- <span class="avatar" aria-hidden="true">P</span>
385
- <svg class="caret" viewBox="0 0 13 13" aria-hidden="true"><path d="m3.4 5 3.1 3.1L9.6 5"/></svg>
386
- <button class="mode-toggle" id="mode" type="button" aria-label="Toggle light or dark">
387
- <svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.5 14.6A8.6 8.6 0 0 1 9.4 3.5a8.6 8.6 0 1 0 11.1 11.1z"/></svg>
388
- <svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4.2"/><path d="M12 2v2.4M12 19.6V22M4.2 4.2l1.7 1.7M18.1 18.1l1.7 1.7M2 12h2.4M19.6 12H22M4.2 19.8l1.7-1.7M18.1 5.9l1.7-1.7"/></svg>
389
- </button>
390
- </header>
391
-
392
- <main>
393
- <div class="inner">
394
- <h1>Tasks</h1>
395
-
396
- <div class="tabs" role="tablist" aria-label="Task status">
397
- <button class="tab" role="tab" id="t-ready" aria-selected="true" aria-controls="p-ready" type="button">Ready <span class="cnt">42</span></button>
398
- <button class="tab" role="tab" id="t-progress" aria-selected="false" aria-controls="p-progress" type="button">In Progress <span class="cnt">15</span></button>
399
- <button class="tab" role="tab" id="t-backlog" aria-selected="false" aria-controls="p-backlog" type="button">Backlog <span class="cnt">89</span></button>
400
- <button class="tab" role="tab" id="t-completed" aria-selected="false" aria-controls="p-completed" type="button">Completed <span class="cnt">1107</span></button>
401
- </div>
402
-
403
- <div class="filters">
404
- <span class="qsearch">
405
- <label class="sr-only" for="f-q">Search tasks</label>
406
- <input id="f-q" type="search" placeholder="task #, title, or goal">
407
- </span>
408
- <span class="sel"><span class="k">Sort</span><label class="sr-only" 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>
409
- <span class="sel"><span class="k">Version</span><label class="sr-only" for="f-version">Version</label><select id="f-version"><option>any</option><option>V1</option><option>Customer-0</option></select></span>
410
- <span class="sel"><span class="k">Goal</span><label class="sr-only" for="f-goal">Goal</label><select id="f-goal"><option>any</option><option>Apex UI pass 2</option><option>Project hub</option></select></span>
411
- <span class="sel"><span class="k">Kind</span><label class="sr-only" for="f-kind">Kind</label><select id="f-kind"><option>any</option><option>feature</option><option>bug</option></select></span>
412
- <span class="sel"><span class="k">Discipline</span><label class="sr-only" for="f-discipline">Discipline</label><select id="f-discipline"><option>any</option><option>engineer</option><option>design</option></select></span>
413
- <span class="sel"><span class="k">Newcomer</span><label class="sr-only" for="f-newcomer">Newcomer</label><select id="f-newcomer"><option>any</option><option>newcomer friendly</option></select></span>
414
- <span class="sel"><span class="k">Creator</span><label class="sr-only" for="f-creator">Creator</label><select id="f-creator"><option>any</option><option>lars589</option></select></span>
415
- <span class="sel"><span class="k">Age</span><label class="sr-only" for="f-age">Age</label><select id="f-age"><option>any</option><option>last 7 days</option></select></span>
416
- <span class="sel"><span class="k">Run mode</span><label class="sr-only" for="f-runmode">Run mode</label><select id="f-runmode"><option>any</option><option>parallel safe</option></select></span>
417
- </div>
418
-
419
- <section class="panel" id="p-ready" role="tabpanel" aria-labelledby="t-ready">
420
- <div class="tablewrap">
421
- <table>
422
- <caption class="sr-only">Tasks ready to claim</caption>
423
- <thead>
424
- <tr>
425
- <th scope="col" class="cbcell"><label class="sr-only" for="cb-all">Select all rows</label><input type="checkbox" id="cb-all"></th>
426
- <th scope="col">Task</th>
427
- <th scope="col">Title</th>
428
- <th scope="col">Goal</th>
429
- <th scope="col" class="r">Credits</th>
430
- <th scope="col" class="r">Minutes</th>
431
- <th scope="col" class="r">Cr/min</th>
432
- <th scope="col">Status</th>
433
- </tr>
434
- </thead>
435
- <tbody>
436
- <!-- sample rows -->
437
- <tr>
438
- <td class="cbcell"><label class="sr-only" for="cb1">Select task 1003297</label><input type="checkbox" id="cb1" class="rowcb"></td>
439
- <td class="id">1003297</td>
440
- <td>Landing: three composition versions in the chosen world</td>
441
- <td class="goal">Apex UI pass 2</td>
442
- <td class="r num-cell">96</td><td class="r num-cell">40</td><td class="r num-cell">2.4</td>
443
- <td><span class="state"><span class="led ready"></span>ready</span></td>
444
- </tr>
445
- <tr>
446
- <td class="cbcell"><label class="sr-only" for="cb2">Select task 1003302</label><input type="checkbox" id="cb2" class="rowcb"></td>
447
- <td class="id">1003302</td>
448
- <td>Hall: five archetype mocks in the world</td>
449
- <td class="goal">Builders' hall in the world</td>
450
- <td class="r num-cell">120</td><td class="r num-cell">55</td><td class="r num-cell">2.2</td>
451
- <td><span class="state"><span class="led ready"></span>ready</span></td>
452
- </tr>
453
- <tr>
454
- <td class="cbcell"><label class="sr-only" for="cb3">Select task 1003310</label><input type="checkbox" id="cb3" class="rowcb"></td>
455
- <td class="id">1003310</td>
456
- <td>Status: the index mock in the world</td>
457
- <td class="goal">Status ledger in the world</td>
458
- <td class="r num-cell">60</td><td class="r num-cell">30</td><td class="r num-cell">2.0</td>
459
- <td><span class="state"><span class="led ready"></span>ready</span></td>
460
- </tr>
461
- <tr>
462
- <td class="cbcell"><label class="sr-only" for="cb4">Select task 1003251</label><input type="checkbox" id="cb4" class="rowcb"></td>
463
- <td class="id">1003251</td>
464
- <td>The manage view says which door the project runs</td>
465
- <td class="goal">Project hub</td>
466
- <td class="r num-cell">45</td><td class="r num-cell">25</td><td class="r num-cell">1.8</td>
467
- <td><span class="state"><span class="led ready"></span>ready</span></td>
468
- </tr>
469
- <tr class="held">
470
- <td class="cbcell"><label class="sr-only" for="cb5">Select task 1003240</label><input type="checkbox" id="cb5" class="rowcb" disabled></td>
471
- <td class="id">1003240</td>
472
- <td>A gated project refuses strangers at the door</td>
473
- <td class="goal">Project hub</td>
474
- <td class="r num-cell">72</td><td class="r num-cell">45</td><td class="r num-cell">1.6</td>
475
- <td><span class="state"><span class="led active"></span><svg class="ico"><use href="#i-lock"/></svg>active</span></td>
476
- </tr>
477
- <tr>
478
- <td class="cbcell"><label class="sr-only" for="cb6">Select task 1003241</label><input type="checkbox" id="cb6" class="rowcb"></td>
479
- <td class="id">1003241</td>
480
- <td>The wizard remembers a half-finished project</td>
481
- <td class="goal">Project hub</td>
482
- <td class="r num-cell">54</td><td class="r num-cell">35</td><td class="r num-cell">1.5</td>
483
- <td class="conflict"><span class="state">has file conflicts</span></td>
484
- </tr>
485
- <tr>
486
- <td class="cbcell"><label class="sr-only" for="cb7">Select task 1003242</label><input type="checkbox" id="cb7" class="rowcb"></td>
487
- <td class="id">1003242</td>
488
- <td>Copy desk: flags carry a reason</td>
489
- <td class="goal">Copy desk</td>
490
- <td class="r num-cell">38</td><td class="r num-cell">30</td><td class="r num-cell">1.3</td>
491
- <td><span class="state"><span class="led ready"></span>ready</span></td>
492
- </tr>
493
- <tr>
494
- <td class="cbcell"><label class="sr-only" for="cb8">Select task 1003245</label><input type="checkbox" id="cb8" class="rowcb"></td>
495
- <td class="id">1003245</td>
496
- <td>The identity chip opens the profile menu</td>
497
- <td class="goal">Apex UI pass 2</td>
498
- <td class="r num-cell">30</td><td class="r num-cell">25</td><td class="r num-cell">1.2</td>
499
- <td><span class="state"><span class="led ready"></span>ready</span></td>
500
- </tr>
501
- <tr>
502
- <td class="cbcell"><label class="sr-only" for="cb9">Select task 1003235</label><input type="checkbox" id="cb9" class="rowcb"></td>
503
- <td class="id">1003235</td>
504
- <td>The hub answers the keyboard</td>
505
- <td class="goal">Project hub</td>
506
- <td class="r num-cell">24</td><td class="r num-cell">20</td><td class="r num-cell">1.2</td>
507
- <td><span class="state"><span class="led ready"></span>ready</span></td>
508
- </tr>
509
- <tr>
510
- <td class="cbcell"><label class="sr-only" for="cb10">Select task 1003239</label><input type="checkbox" id="cb10" class="rowcb"></td>
511
- <td class="id">1003239</td>
512
- <td>A same-tab GitHub return stays put</td>
513
- <td class="goal">Project hub</td>
514
- <td class="r num-cell">20</td><td class="r num-cell">20</td><td class="r num-cell">1.0</td>
515
- <td><span class="state"><span class="led ready"></span>ready</span></td>
516
- </tr>
517
- </tbody>
518
- </table>
519
- </div>
520
- <div class="bulk" role="region" aria-label="Bulk actions">
521
- <span class="count" id="selcount">0 selected</span>
522
- <button class="btn primary" type="button">Bulk claim</button>
523
- <button class="btn" type="button">Bulk release</button>
524
- <button class="btn" type="button">Copy parallel prompt</button>
525
- <button class="btn" type="button">Copy sequential prompt</button>
526
- <button class="btn" type="button" id="clearsel">Clear</button>
527
- </div>
528
- </section>
529
-
530
- <section class="panel" id="p-progress" role="tabpanel" aria-labelledby="t-progress" hidden><p class="empty">Nothing here yet.</p></section>
531
- <section class="panel" id="p-backlog" role="tabpanel" aria-labelledby="t-backlog" hidden><p class="empty">Nothing here yet.</p></section>
532
- <section class="panel" id="p-completed" role="tabpanel" aria-labelledby="t-completed" hidden><p class="empty">Nothing here yet.</p></section>
533
-
534
- <div class="pager">
535
- <span class="of">1 to 10 of 42</span>
536
- <button class="btn" type="button">Previous</button>
537
- <button class="btn" type="button">Next</button>
538
- </div>
539
- </div>
540
- </main>
541
- </div>
542
- </div>
543
-
544
- <script>
545
- (function () {
546
- var root = document.documentElement;
547
- var btn = document.getElementById('mode');
548
- function isDark() {
549
- var a = root.getAttribute('data-mode');
550
- if (a === 'dark') return true;
551
- if (a === 'light') return false;
552
- return window.matchMedia('(prefers-color-scheme: dark)').matches;
553
- }
554
- btn.addEventListener('click', function () {
555
- var next = isDark() ? 'light' : 'dark';
556
- root.setAttribute('data-mode', next);
557
- try { localStorage.setItem('cb-color-mode', next); } catch (e) {}
558
- });
559
-
560
- var boxes = Array.prototype.slice.call(document.querySelectorAll('.rowcb'));
561
- var all = document.getElementById('cb-all');
562
- var out = document.getElementById('selcount');
563
- function paint() {
564
- var n = 0;
565
- boxes.forEach(function (b) {
566
- var row = b.closest('tr');
567
- if (b.checked) { n++; row.classList.add('sel-row'); } else { row.classList.remove('sel-row'); }
568
- });
569
- out.textContent = n + ' selected';
570
- }
571
- boxes.forEach(function (b) { b.addEventListener('change', paint); });
572
- all.addEventListener('change', function () {
573
- boxes.forEach(function (b) { if (!b.disabled) b.checked = all.checked; });
574
- paint();
575
- });
576
- document.getElementById('clearsel').addEventListener('click', function () {
577
- boxes.forEach(function (b) { b.checked = false; });
578
- all.checked = false;
579
- paint();
580
- });
581
-
582
- var tabs = Array.prototype.slice.call(document.querySelectorAll('[role="tab"]'));
583
- tabs.forEach(function (t) {
584
- t.addEventListener('click', function () {
585
- tabs.forEach(function (o) {
586
- var on = o === t;
587
- o.setAttribute('aria-selected', on ? 'true' : 'false');
588
- document.getElementById(o.getAttribute('aria-controls')).hidden = !on;
589
- });
590
- });
591
- });
592
- })();
593
- </script>
594
- </body>
595
- </html>