@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,649 +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=Archivo:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400&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{
18
- background:var(--bg-frame); color:var(--ink);
19
- font-family:var(--font-body); font-weight:400;
20
- font-variant-numeric:tabular-nums;
21
- -webkit-font-smoothing:antialiased;
22
- min-height:100dvh;
23
- }
24
- ::selection{background:var(--sel-bg); color:var(--sel-ink)}
25
- a{color:inherit}
26
- :focus-visible{outline:none; box-shadow:0 0 0 2px var(--bg), 0 0 0 4px var(--focus)}
27
- .vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
28
-
29
- /* ---------- ground ---------- */
30
- .plate{
31
- position:fixed;inset:-24px;z-index:0;pointer-events:none;
32
- background-image:var(--plate);background-size:cover;background-position:center 42%;
33
- filter:var(--plate-filter);
34
- }
35
- .plate::after{content:'';position:absolute;inset:0;background:var(--plate-scrim)}
36
-
37
- /* ---------- shell ---------- */
38
- .shell{
39
- position:relative;z-index:1;
40
- margin:var(--shell-inset);
41
- min-height:calc(100dvh - var(--shell-inset) * 2);
42
- display:flex;
43
- background:var(--glass);
44
- -webkit-backdrop-filter:blur(var(--glass-blur)) brightness(var(--glass-dim));
45
- backdrop-filter:blur(var(--glass-blur)) brightness(var(--glass-dim));
46
- border-radius:var(--shell-radius);
47
- box-shadow:var(--glass-shadow), inset 0 0 0 var(--line) var(--glass-edge);
48
- overflow:hidden;
49
- }
50
-
51
- /* ---------- sidebar ---------- */
52
- .side{
53
- flex:0 0 240px;width:240px;display:flex;flex-direction:column;
54
- background:var(--side-fill);border-right:var(--line) solid var(--glass-edge);
55
- }
56
- .side-head{
57
- height:56px;flex:0 0 56px;display:flex;align-items:center;gap:12px;
58
- padding:0 16px;border-bottom:var(--line) solid var(--glass-edge);
59
- }
60
- .mark-plate{
61
- width:28px;height:35px;flex:0 0 28px;display:grid;place-items:center;
62
- border-radius:var(--radius);box-shadow:inset 0 0 0 1.5px var(--mark-bg);
63
- }
64
- .mark-plate svg{width:21px;height:14px;display:block}
65
- .mark-plate .ring,.mark-plate .glow,.mark-plate .bshadow{display:none}
66
- .side-head b{font-size:.9375rem;font-weight:500;letter-spacing:-.01em;color:var(--ink)}
67
- .side-nav{
68
- flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 12px 18px;
69
- scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) var(--scroll-track);
70
- }
71
- .side-nav::-webkit-scrollbar{width:8px}
72
- .side-nav::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:var(--radius-pill)}
73
- .side-nav::-webkit-scrollbar-track{background:var(--scroll-track)}
74
- .side-nav ul{list-style:none;margin:0 0 4px;padding:0}
75
- .grp-label{
76
- margin:20px 0 7px;padding:0 12px;
77
- font-family:var(--font-label);font-size:.6875rem;font-weight:400;
78
- letter-spacing:.10em;text-transform:uppercase;color:var(--ink-faint);
79
- }
80
- .nav-item{
81
- position:relative;display:flex;align-items:center;gap:11px;
82
- padding:7px 12px;border-radius:var(--radius-pill);
83
- text-decoration:none;color:var(--ink-soft);
84
- font-family:var(--font-label);font-size:.75rem;letter-spacing:.055em;
85
- text-transform:var(--nav-case);
86
- }
87
- .g-main .nav-item{text-transform:uppercase}
88
- .nav-item:hover{color:var(--ink);background:var(--row-hover)}
89
- .nav-item .ico{width:16px;height:16px;flex:0 0 16px;display:block;color:var(--ink-faint)}
90
- .nav-item[aria-current="page"]{
91
- background:var(--cur-fill);color:var(--cur-ink);font-weight:500;
92
- }
93
- .nav-item[aria-current="page"] .ico{color:var(--cur-mark)}
94
- .nav-item[aria-current="page"]::before{
95
- content:'';position:absolute;left:4px;top:50%;transform:translateY(-50%);
96
- width:var(--cur-dot-size);height:var(--cur-dot-size);
97
- border-radius:50%;background:var(--cur-dot);
98
- }
99
- .side-foot{border-top:var(--line) solid var(--glass-edge);padding:12px}
100
- .signout{
101
- display:flex;align-items:center;gap:11px;width:100%;
102
- padding:8px 12px;border:0;background:none;cursor:pointer;
103
- font:inherit;font-family:var(--font-label);font-size:.75rem;letter-spacing:.055em;color:var(--ink-soft);
104
- border-radius:var(--radius-pill);text-transform:var(--nav-case);
105
- }
106
- .signout:hover{color:var(--ink);background:var(--row-hover)}
107
- .signout svg{width:16px;height:16px;flex:0 0 16px}
108
-
109
- /* ---------- column + top bar ---------- */
110
- .col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}
111
- .topbar{
112
- height:56px;flex:0 0 56px;display:flex;align-items:center;gap:22px;
113
- padding:0 20px;border-bottom:var(--line) solid var(--glass-edge);
114
- background:var(--topbar-fill);
115
- }
116
- .hallmark{font-size:.9375rem;font-weight:500;color:var(--ink);white-space:nowrap}
117
- .search{position:relative;flex:1 1 auto;max-width:440px}
118
- .search svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--ink-faint)}
119
- .search input{
120
- width:100%;height:34px;padding:0 14px 0 38px;
121
- border:var(--line) solid var(--rule);border-radius:var(--radius-pill);
122
- background:var(--field);color:var(--ink);font:inherit;font-size:.8125rem;
123
- }
124
- .search input::placeholder{color:var(--ink-faint)}
125
- .who{display:flex;align-items:center;gap:12px;margin-left:auto}
126
- .badge{
127
- display:inline-flex;align-items:center;gap:6px;
128
- padding:4px 11px;border-radius:var(--radius-pill);
129
- background:var(--chip-fill);color:var(--chip-ink);
130
- font-family:var(--font-label);font-size:.6875rem;letter-spacing:.09em;text-transform:uppercase;
131
- box-shadow:inset 0 0 0 var(--line) var(--chip-edge);
132
- }
133
- .badge svg{width:11px;height:11px}
134
- .avatar{
135
- width:30px;height:30px;border-radius:50%;display:grid;place-items:center;
136
- background:var(--head-fill);color:var(--ink);font-size:.8125rem;font-weight:500;
137
- box-shadow:inset 0 0 0 var(--line) var(--glass-edge);
138
- }
139
- .caretbtn{
140
- width:24px;height:24px;border:0;background:none;cursor:pointer;color:var(--ink-faint);
141
- display:grid;place-items:center;border-radius:var(--radius-pill);
142
- }
143
- .caretbtn:hover{color:var(--ink)}
144
- .caretbtn i{width:6px;height:6px;border-right:1.4px solid currentColor;border-bottom:1.4px solid currentColor;transform:translateY(-2px) rotate(45deg)}
145
- .mode-toggle{
146
- width:52px;height:28px;border:0;cursor:pointer;
147
- background:var(--field);color:var(--ink-soft);
148
- border-radius:var(--radius-pill);display:grid;place-items:center;
149
- box-shadow:inset 0 0 0 var(--line) var(--rule);
150
- }
151
- .mode-toggle:hover{color:var(--ink)}
152
- .mode-toggle svg{width:16px;height:16px;display:block}
153
- .mode-toggle .i-moon{display:var(--moon-display)}
154
- .mode-toggle .i-sun{display:var(--sun-display)}
155
-
156
- /* ---------- main ---------- */
157
- main{flex:1 1 auto;width:100%;max-width:1120px;padding:28px 30px 40px;min-width:0}
158
- h1{margin:0;font-family:var(--font-display);font-size:2.5rem;font-weight:700;letter-spacing:-.03em;color:var(--ink)}
159
-
160
- .tabs{
161
- display:flex;gap:26px;margin:20px 0 0;border-bottom:var(--line) solid var(--rule);
162
- overflow-x:auto;scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) var(--scroll-track);
163
- }
164
- .tabs::-webkit-scrollbar{height:6px}
165
- .tabs::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:var(--radius-pill)}
166
- .tabs::-webkit-scrollbar-track{background:var(--scroll-track)}
167
- .tab{
168
- border:0;background:none;cursor:pointer;font:inherit;
169
- padding:10px 2px;margin-bottom:-1px;
170
- border-bottom:2px solid transparent;
171
- color:var(--ink-soft);font-size:.875rem;letter-spacing:.02em;white-space:nowrap;
172
- display:inline-flex;align-items:center;gap:8px;flex:0 0 auto;
173
- }
174
- .tab:hover{color:var(--ink)}
175
- .tab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--ink);font-weight:600}
176
- .cnt{
177
- padding:1px 8px;border-radius:var(--radius-pill);
178
- background:var(--head-fill);color:var(--ink-faint);
179
- font-size:.6875rem;letter-spacing:.03em;
180
- }
181
- .tab[aria-selected="true"] .cnt{background:var(--head-fill);color:var(--ink)}
182
-
183
- .filters{display:flex;flex-wrap:wrap;gap:10px;margin:20px 0 18px;align-items:center}
184
- .qwrap{position:relative;flex:0 0 260px}
185
- .qwrap input{
186
- width:100%;height:34px;padding:0 14px;
187
- border:var(--line) solid var(--rule);border-radius:var(--radius-pill);
188
- background:var(--field);color:var(--ink);font:inherit;font-size:.8125rem;
189
- }
190
- .qwrap input::placeholder{color:var(--ink-faint)}
191
- .sel{
192
- position:relative;display:inline-flex;align-items:center;gap:8px;
193
- height:34px;padding:0 30px 0 14px;
194
- border:var(--line) solid var(--rule);border-radius:var(--radius-pill);
195
- background:var(--field);
196
- }
197
- .sel::after{
198
- content:'';position:absolute;right:13px;top:50%;width:6px;height:6px;
199
- border-right:1.3px solid var(--ink-faint);border-bottom:1.3px solid var(--ink-faint);
200
- transform:translateY(-70%) rotate(45deg);pointer-events:none;
201
- }
202
- .sel .fl{
203
- font-family:var(--font-label);font-size:.625rem;letter-spacing:.09em;
204
- text-transform:uppercase;color:var(--ink-faint);white-space:nowrap;
205
- }
206
- .sel select{
207
- appearance:none;-webkit-appearance:none;border:0;background:none;
208
- color:var(--ink-soft);font:inherit;font-size:.8125rem;padding:0;cursor:pointer;
209
- max-width:190px;text-overflow:ellipsis;
210
- }
211
- .sel:hover{border-color:var(--ink-faint)}
212
-
213
- .tablewrap{
214
- overflow-x:auto;
215
- border:var(--line) solid var(--panel-edge);background:var(--panel);
216
- scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) var(--scroll-track);
217
- }
218
- .tablewrap::-webkit-scrollbar{height:9px}
219
- .tablewrap::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:var(--radius-pill)}
220
- .tablewrap::-webkit-scrollbar-track{background:var(--scroll-track)}
221
- table{width:100%;min-width:940px;border-collapse:collapse;table-layout:fixed}
222
- th{
223
- text-align:left;padding:11px 12px;background:var(--head-fill);
224
- font-family:var(--font-label);font-weight:400;font-size:.6875rem;
225
- letter-spacing:.09em;text-transform:uppercase;color:var(--ink-faint);
226
- border-bottom:var(--line) solid var(--panel-edge);white-space:nowrap;
227
- }
228
- td{
229
- padding:11px 12px;font-size:.8125rem;color:var(--ink);
230
- border-bottom:var(--line) solid var(--rule-soft);vertical-align:middle;
231
- }
232
- tbody tr:last-child td{border-bottom:0}
233
- tbody tr:hover td{background:var(--row-hover)}
234
- .num{text-align:right;color:var(--ink-soft)}
235
- .tid{color:var(--ink-soft)}
236
- .ttl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
237
- .goal{color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
238
- .st{white-space:nowrap}
239
- .st .cflag{margin-left:10px}
240
- .state{display:inline-flex;align-items:center;gap:8px;color:var(--ink-soft);white-space:nowrap}
241
- .sq{width:7px;height:7px;flex:0 0 7px;box-shadow:inset 0 0 0 1px var(--ink-faint)}
242
- .sq.full{background:var(--ink-faint);box-shadow:none}
243
- tr.held td{color:var(--ink-faint)}
244
- tr.held .ttl,tr.held .goal{color:var(--ink-faint)}
245
- .lock{width:13px;height:13px;flex:0 0 13px;color:var(--ink-faint)}
246
- tr.conflict td.st{background:var(--hatch-bg);background-image:var(--hatch)}
247
- tbody tr.conflict:hover td.st{background-image:var(--hatch)}
248
- .cflag{color:var(--ink);font-size:.6875rem;letter-spacing:.04em;white-space:nowrap}
249
- input[type=checkbox]{
250
- appearance:none;-webkit-appearance:none;margin:0;display:block;
251
- width:16px;height:16px;cursor:pointer;position:relative;
252
- border:var(--line) solid var(--check-edge);border-radius:var(--radius-sm);background:transparent;
253
- }
254
- input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}
255
- input[type=checkbox]:checked::after{
256
- content:'';position:absolute;left:4.5px;top:1px;width:4px;height:8px;
257
- border:solid var(--ink-on-accent);border-width:0 2px 2px 0;transform:rotate(42deg);
258
- }
259
-
260
- .bulk{
261
- display:flex;flex-wrap:wrap;align-items:center;gap:10px;
262
- margin-top:18px;
263
- }
264
- .selcount{font-size:.8125rem;color:var(--ink-soft);margin-right:6px;min-width:8ch}
265
- .btn{
266
- height:36px;padding:0 18px;border-radius:var(--radius-pill);cursor:pointer;
267
- font:inherit;font-size:.8125rem;font-weight:500;
268
- border:var(--line) solid var(--rule);background:var(--field);color:var(--ink);
269
- transition:background-color .16s cubic-bezier(.16,1,.3,1), color .16s cubic-bezier(.16,1,.3,1);
270
- }
271
- .btn:hover{border-color:var(--ink-faint)}
272
- .btn-primary{background:var(--primary-fill);color:var(--primary-ink);border-color:var(--primary-fill)}
273
- .btn-primary:hover{background:var(--primary-fill);filter:brightness(1.08)}
274
-
275
- .pager{display:flex;align-items:center;gap:14px;margin-top:20px;font-size:.8125rem;color:var(--ink-soft)}
276
- .pager .btn{height:32px;padding:0 15px}
277
- .empty{padding:46px 12px;color:var(--ink-soft);font-size:.875rem;border:var(--line) solid var(--panel-edge);background:var(--panel)}
278
-
279
- @media (max-width:1023px){
280
- .shell{flex-direction:column;margin:0;min-height:100dvh;border-radius:0}
281
- .side{flex:0 0 auto;width:100%;border-right:0;border-bottom:var(--line) solid var(--glass-edge)}
282
- .side-head{border-bottom:0}
283
- .side-nav{
284
- display:flex;align-items:center;gap:4px;overflow-x:auto;overflow-y:visible;
285
- padding:8px 12px;
286
- }
287
- .side-nav ul{display:flex;gap:4px;margin:0}
288
- .grp-label{margin:0 6px 0 12px;padding:0;white-space:nowrap;align-self:center}
289
- .nav-item{white-space:nowrap}
290
- .side-foot{border-top:0;padding:0 12px 10px}
291
- .signout{width:auto}
292
- main{padding:20px 16px 32px}
293
- h1{font-size:2rem}
294
- .topbar{gap:12px;padding:0 16px}
295
- .hallmark{display:none}
296
- }
297
- @media (max-width:640px){
298
- .search{max-width:none}
299
- .qwrap{flex:1 1 100%}
300
- .badge{display:none}
301
- }
302
- </style>
303
- </head>
304
- <body>
305
-
306
- <div class="plate" aria-hidden="true"></div>
307
-
308
- <div class="shell">
309
-
310
- <aside class="side">
311
- <div class="side-head">
312
- <span class="mark-plate" aria-hidden="true">
313
- <svg class="bongos" viewBox="62 100 316 208" role="img" aria-label="A pair of bongo drums being played">
314
- <defs>
315
- <linearGradient id="shellBig" x1="0" y1="0" x2="1" y2="0.35">
316
- <stop offset="0%" stop-color="var(--accent-deep)"/><stop offset="16%" stop-color="var(--accent)"/>
317
- <stop offset="48%" stop-color="var(--accent)"/><stop offset="86%" stop-color="var(--accent-deep)"/>
318
- <stop offset="100%" stop-color="var(--accent-deep)"/>
319
- </linearGradient>
320
- <linearGradient id="shellSml" x1="0" y1="0" x2="1" y2="0.35">
321
- <stop offset="0%" stop-color="var(--accent-deep)"/><stop offset="18%" stop-color="var(--terracotta)"/>
322
- <stop offset="55%" stop-color="var(--terracotta)"/><stop offset="100%" stop-color="var(--accent-deep)"/>
323
- </linearGradient>
324
- <radialGradient id="skin" cx="0.36" cy="0.26" r="0.9">
325
- <stop offset="0%" stop-color="var(--skin-hi)"/><stop offset="58%" stop-color="var(--skin-mid)"/>
326
- <stop offset="100%" stop-color="var(--skin-lo)"/>
327
- </radialGradient>
328
- <radialGradient id="halo" cx="0.5" cy="0.5" r="0.5">
329
- <stop offset="0%" stop-color="var(--accent)" stop-opacity="0.30"/>
330
- <stop offset="48%" stop-color="var(--accent)" stop-opacity="0.13"/>
331
- <stop offset="100%" stop-color="var(--accent)" stop-opacity="0"/>
332
- </radialGradient>
333
- <filter id="soft" x="-60%" y="-160%" width="220%" height="420%">
334
- <feGaussianBlur stdDeviation="9"/>
335
- </filter>
336
- </defs>
337
- <ellipse class="glow" cx="222" cy="170" rx="215" ry="140" fill="url(#halo)"/>
338
- <ellipse class="bshadow" cx="220" cy="286" rx="142" ry="14" fill="var(--drum-shadow)" opacity=".22" filter="url(#soft)"/>
339
- <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)"/>
340
- <path d="M 214,196 C 232,188 250,188 264,196 L 262,205 C 247,197 231,197 216,205 Z" fill="var(--ink)" opacity=".22"/>
341
- <g class="drumBig">
342
- <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(#shellBig)"/>
343
- <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"/>
344
- <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"/>
345
- <ellipse cx="150" cy="121" rx="80" ry="29" fill="var(--accent-deep)"/>
346
- <ellipse cx="150" cy="117" rx="80" ry="29" fill="var(--accent)"/>
347
- <ellipse cx="150" cy="117" rx="80" ry="29" fill="#fff" opacity=".13"/>
348
- <g class="headBig">
349
- <ellipse cx="150" cy="118" rx="70" ry="24" fill="url(#skin)"/>
350
- <ellipse cx="150" cy="118" rx="70" ry="24" fill="none" stroke="var(--ink)" stroke-opacity=".09" stroke-width="1.4"/>
351
- <ellipse cx="150" cy="118" rx="55" ry="18" fill="none" stroke="var(--ink)" stroke-opacity=".045" stroke-width="1"/>
352
- <ellipse class="ring" cx="150" cy="118" rx="56" ry="19" fill="none" stroke="var(--accent-deep)" stroke-width="2.6"/>
353
- </g>
354
- <g fill="var(--accent-deep)">
355
- <path d="M 78,138 l 9,0 -1.5,20 -6,0 z"/><path d="M 120,148 l 9,0 -1,21 -7,0 z"/>
356
- <path d="M 172,148 l 9,0 -1,21 -7,0 z"/><path d="M 214,138 l 9,0 -1.5,20 -6,0 z"/>
357
- </g>
358
- </g>
359
- <g class="drumSml">
360
- <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(#shellSml)"/>
361
- <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"/>
362
- <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"/>
363
- <ellipse cx="296" cy="137" rx="60" ry="22" fill="var(--accent-deep)"/>
364
- <ellipse cx="296" cy="133" rx="60" ry="22" fill="var(--terracotta)"/>
365
- <ellipse cx="296" cy="133" rx="60" ry="22" fill="#fff" opacity=".13"/>
366
- <g class="headSml">
367
- <ellipse cx="296" cy="134" rx="51" ry="18" fill="url(#skin)"/>
368
- <ellipse cx="296" cy="134" rx="51" ry="18" fill="none" stroke="var(--ink)" stroke-opacity=".09" stroke-width="1.4"/>
369
- <ellipse cx="296" cy="134" rx="39" ry="13" fill="none" stroke="var(--ink)" stroke-opacity=".045" stroke-width="1"/>
370
- <ellipse class="ring" cx="296" cy="134" rx="41" ry="14" fill="none" stroke="var(--accent-deep)" stroke-width="2.3"/>
371
- </g>
372
- <g fill="var(--accent-deep)">
373
- <path d="M 243,152 l 8,0 -1,17 -6,0 z"/><path d="M 276,160 l 8,0 -1,18 -6,0 z"/>
374
- <path d="M 312,160 l 8,0 -1,18 -6,0 z"/><path d="M 345,152 l 8,0 -1,17 -6,0 z"/>
375
- </g>
376
- </g>
377
- </svg>
378
- </span>
379
- <b>Cloud Bongos</b>
380
- </div>
381
-
382
- <nav class="side-nav" aria-label="Hall sections">
383
- <ul class="g-main">
384
- <li><a class="nav-item" href="/hall"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 10.5 12 4l8 6.5V19a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1z"/></svg>Home</a></li>
385
- <li><a class="nav-item" href="/hall/roadmap"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h10M4 17h13"/></svg>Roadmap</a></li>
386
- <li><a class="nav-item" href="/hall/goals"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="12" cy="12" r="7"/><circle cx="12" cy="12" r="2.5"/></svg>Goals</a></li>
387
- <li><a class="nav-item" href="/hall/work" aria-current="page"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="4" width="14" height="16" rx="1"/><path d="M9 9h6M9 13h4"/></svg>Tasks</a></li>
388
- <li><a class="nav-item" href="/hall/ideas"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.5 17h5M10.5 20h3M12 3.5a6 6 0 0 1 3.4 10.9V17H8.6v-2.6A6 6 0 0 1 12 3.5Z"/></svg>Ideas</a></li>
389
- <li><a class="nav-item" href="/hall/copy"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 4h7l5 5v11H8z"/><path d="M15 4v5h5"/></svg>Copy desk</a></li>
390
- </ul>
391
-
392
- <p class="grp-label" id="g-you">You</p>
393
- <ul aria-labelledby="g-you">
394
- <li><a class="nav-item" href="/hall/standing">Standing</a></li>
395
- <li><a class="nav-item" href="/hall/profile">Profile</a></li>
396
- </ul>
397
-
398
- <p class="grp-label" id="g-community">Community</p>
399
- <ul aria-labelledby="g-community">
400
- <li><a class="nav-item" href="/hall/collab">Collab</a></li>
401
- <li><a class="nav-item" href="/hall/leaderboard">Leaderboard</a></li>
402
- <li><a class="nav-item" href="/hall/people">People</a></li>
403
- </ul>
404
-
405
- <p class="grp-label" id="g-docs">Docs</p>
406
- <ul aria-labelledby="g-docs">
407
- <li><a class="nav-item" href="/hall/primer">Primer</a></li>
408
- <li><a class="nav-item" href="/hall/ranks">Ranks</a></li>
409
- <li><a class="nav-item" href="/hall/economy">Economy</a></li>
410
- <li><a class="nav-item" href="/hall/diagrams">Diagrams</a></li>
411
- <li><a class="nav-item" href="/hall/atlas">Repo Atlas</a></li>
412
- <li><a class="nav-item" href="/hall/modules">Modules</a></li>
413
- <li><a class="nav-item" href="/hall/api">API docs</a></li>
414
- </ul>
415
-
416
- <p class="grp-label" id="g-government">Government</p>
417
- <ul aria-labelledby="g-government">
418
- <li><a class="nav-item" href="/hall/watch">Watch</a></li>
419
- <li><a class="nav-item" href="/hall/harbor">Harbor</a></li>
420
- <li><a class="nav-item" href="/hall/gate">Gate</a></li>
421
- <li><a class="nav-item" href="/hall/sessions">Sessions</a></li>
422
- <li><a class="nav-item" href="/hall/permissions">Permissions</a></li>
423
- </ul>
424
- </nav>
425
-
426
- <div class="side-foot">
427
- <button class="signout" type="button">
428
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 4h4a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-4M9 8l-4 4 4 4M5 12h10"/></svg>
429
- Sign out
430
- </button>
431
- </div>
432
- </aside>
433
-
434
- <div class="col">
435
- <header class="topbar">
436
- <span class="hallmark">Builders' Hall</span>
437
- <div class="search">
438
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="6"/><path d="m16 16 4.5 4.5"/></svg>
439
- <label class="vh" for="hall-search">Search</label>
440
- <input id="hall-search" type="search" placeholder="Search">
441
- </div>
442
- <div class="who">
443
- <button class="mode-toggle" id="mode" type="button" aria-label="Toggle light or dark">
444
- <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.2 14.8A8.6 8.6 0 0 1 9.2 3.8a7.6 7.6 0 1 0 11 11Z"/></svg>
445
- <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"/><path d="M12 3v2M12 19v2M4.6 4.6l1.4 1.4M18 18l1.4 1.4M3 12h2M19 12h2M4.6 19.4 6 18M18 6l1.4-1.4"/></svg>
446
- </button>
447
- <span class="badge"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 4 2.4 5 5.6.8-4 3.9.9 5.5L12 16.6 7.1 19.2l.9-5.5-4-3.9 5.6-.8Z"/></svg>Trusted</span>
448
- <span class="avatar" aria-hidden="true">P</span>
449
- <button class="caretbtn" type="button" aria-label="Open account menu"><i></i></button>
450
- </div>
451
- </header>
452
-
453
- <main>
454
- <h1>Tasks</h1>
455
-
456
- <div class="tabs" role="tablist" aria-label="Task states">
457
- <button class="tab" role="tab" id="t-ready" aria-controls="p-ready" aria-selected="true" type="button">Ready <span class="cnt">42</span></button>
458
- <button class="tab" role="tab" id="t-active" aria-controls="p-active" aria-selected="false" type="button">In Progress <span class="cnt">15</span></button>
459
- <button class="tab" role="tab" id="t-backlog" aria-controls="p-backlog" aria-selected="false" type="button">Backlog <span class="cnt">89</span></button>
460
- <button class="tab" role="tab" id="t-done" aria-controls="p-done" aria-selected="false" type="button">Completed <span class="cnt">1107</span></button>
461
- </div>
462
-
463
- <div class="filters">
464
- <div class="qwrap">
465
- <label class="vh" for="f-q">Filter tasks</label>
466
- <input id="f-q" type="search" placeholder="task #, title, or goal">
467
- </div>
468
- <span class="sel"><span class="fl" id="l-sort">Sort</span><select aria-labelledby="l-sort"><option>credits / minute (high to low)</option><option>newest first</option><option>credits (high to low)</option></select></span>
469
- <span class="sel"><span class="fl" id="l-version">Version</span><select aria-labelledby="l-version"><option>any</option><option>V1</option></select></span>
470
- <span class="sel"><span class="fl" id="l-goal">Goal</span><select aria-labelledby="l-goal"><option>any</option><option>Apex UI pass 2</option></select></span>
471
- <span class="sel"><span class="fl" id="l-kind">Kind</span><select aria-labelledby="l-kind"><option>any</option><option>feature</option></select></span>
472
- <span class="sel"><span class="fl" id="l-disc">Discipline</span><select aria-labelledby="l-disc"><option>any</option><option>engineer</option></select></span>
473
- <span class="sel"><span class="fl" id="l-new">Newcomer</span><select aria-labelledby="l-new"><option>any</option><option>newcomer friendly</option></select></span>
474
- <span class="sel"><span class="fl" id="l-creator">Creator</span><select aria-labelledby="l-creator"><option>any</option><option>lars589</option></select></span>
475
- <span class="sel"><span class="fl" id="l-age">Age</span><select aria-labelledby="l-age"><option>any</option><option>last 7 days</option></select></span>
476
- <span class="sel"><span class="fl" id="l-run">Run mode</span><select aria-labelledby="l-run"><option>any</option><option>parallel safe</option></select></span>
477
- </div>
478
-
479
- <div role="tabpanel" id="p-ready" aria-labelledby="t-ready">
480
- <div class="tablewrap">
481
- <table>
482
- <colgroup>
483
- <col style="width:44px"><col style="width:88px"><col><col style="width:162px">
484
- <col style="width:74px"><col style="width:78px"><col style="width:74px"><col style="width:212px">
485
- </colgroup>
486
- <thead>
487
- <tr>
488
- <th scope="col"><label class="vh" for="all">Select all rows</label><input id="all" type="checkbox"></th>
489
- <th scope="col">Task</th>
490
- <th scope="col">Title</th>
491
- <th scope="col">Goal</th>
492
- <th scope="col" class="num">Credits</th>
493
- <th scope="col" class="num">Minutes</th>
494
- <th scope="col" class="num">Cr/min</th>
495
- <th scope="col">Status</th>
496
- </tr>
497
- </thead>
498
- <tbody>
499
- <!-- sample rows -->
500
- <tr>
501
- <td><label class="vh" for="r1">Select task 1003297</label><input id="r1" type="checkbox"></td>
502
- <td class="tid">1003297</td>
503
- <td class="ttl">Landing: three composition versions in the chosen world</td>
504
- <td class="goal">Apex UI pass 2</td>
505
- <td class="num">96</td><td class="num">40</td><td class="num">2.4</td>
506
- <td><span class="state"><i class="sq full"></i>ready</span></td>
507
- </tr>
508
- <tr>
509
- <td><label class="vh" for="r2">Select task 1003302</label><input id="r2" type="checkbox"></td>
510
- <td class="tid">1003302</td>
511
- <td class="ttl">Hall: five archetype mocks in the world</td>
512
- <td class="goal">Builders' hall in the world</td>
513
- <td class="num">120</td><td class="num">55</td><td class="num">2.2</td>
514
- <td><span class="state"><i class="sq full"></i>ready</span></td>
515
- </tr>
516
- <tr>
517
- <td><label class="vh" for="r3">Select task 1003310</label><input id="r3" type="checkbox"></td>
518
- <td class="tid">1003310</td>
519
- <td class="ttl">Status: the index mock in the world</td>
520
- <td class="goal">Status ledger in the world</td>
521
- <td class="num">60</td><td class="num">30</td><td class="num">2.0</td>
522
- <td><span class="state"><i class="sq full"></i>ready</span></td>
523
- </tr>
524
- <tr>
525
- <td><label class="vh" for="r4">Select task 1003251</label><input id="r4" type="checkbox"></td>
526
- <td class="tid">1003251</td>
527
- <td class="ttl">The manage view says which door the project runs</td>
528
- <td class="goal">Project hub</td>
529
- <td class="num">45</td><td class="num">25</td><td class="num">1.8</td>
530
- <td><span class="state"><i class="sq full"></i>ready</span></td>
531
- </tr>
532
- <tr class="held">
533
- <td><label class="vh" for="r5">Select task 1003240</label><input id="r5" type="checkbox" disabled></td>
534
- <td class="tid">1003240</td>
535
- <td class="ttl">A gated project refuses strangers at the door</td>
536
- <td class="goal">Project hub</td>
537
- <td class="num">72</td><td class="num">45</td><td class="num">1.6</td>
538
- <td><span class="state"><svg class="lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><rect x="5" y="10.5" width="14" height="9" rx="1"/><path d="M8.5 10.5V7a3.5 3.5 0 0 1 7 0v3.5"/></svg>active</span></td>
539
- </tr>
540
- <tr class="conflict">
541
- <td><label class="vh" for="r6">Select task 1003241</label><input id="r6" type="checkbox"></td>
542
- <td class="tid">1003241</td>
543
- <td class="ttl">The wizard remembers a half-finished project</td>
544
- <td class="goal">Project hub</td>
545
- <td class="num">54</td><td class="num">35</td><td class="num">1.5</td>
546
- <td class="st"><span class="state"><i class="sq full"></i>ready</span><span class="cflag">has file conflicts</span></td>
547
- </tr>
548
- <tr>
549
- <td><label class="vh" for="r7">Select task 1003242</label><input id="r7" type="checkbox"></td>
550
- <td class="tid">1003242</td>
551
- <td class="ttl">Copy desk: flags carry a reason</td>
552
- <td class="goal">Copy desk</td>
553
- <td class="num">38</td><td class="num">30</td><td class="num">1.3</td>
554
- <td><span class="state"><i class="sq full"></i>ready</span></td>
555
- </tr>
556
- <tr>
557
- <td><label class="vh" for="r8">Select task 1003245</label><input id="r8" type="checkbox"></td>
558
- <td class="tid">1003245</td>
559
- <td class="ttl">The identity chip opens the profile menu</td>
560
- <td class="goal">Apex UI pass 2</td>
561
- <td class="num">30</td><td class="num">25</td><td class="num">1.2</td>
562
- <td><span class="state"><i class="sq full"></i>ready</span></td>
563
- </tr>
564
- <tr>
565
- <td><label class="vh" for="r9">Select task 1003235</label><input id="r9" type="checkbox"></td>
566
- <td class="tid">1003235</td>
567
- <td class="ttl">The hub answers the keyboard</td>
568
- <td class="goal">Project hub</td>
569
- <td class="num">24</td><td class="num">20</td><td class="num">1.2</td>
570
- <td><span class="state"><i class="sq full"></i>ready</span></td>
571
- </tr>
572
- <tr>
573
- <td><label class="vh" for="r10">Select task 1003239</label><input id="r10" type="checkbox"></td>
574
- <td class="tid">1003239</td>
575
- <td class="ttl">A same-tab GitHub return stays put</td>
576
- <td class="goal">Project hub</td>
577
- <td class="num">20</td><td class="num">20</td><td class="num">1.0</td>
578
- <td><span class="state"><i class="sq full"></i>ready</span></td>
579
- </tr>
580
- </tbody>
581
- </table>
582
- </div>
583
-
584
- <div class="bulk" role="region" aria-label="Bulk actions">
585
- <span class="selcount" id="selcount">0 selected</span>
586
- <button class="btn btn-primary" type="button">Bulk claim</button>
587
- <button class="btn" type="button">Bulk release</button>
588
- <button class="btn" type="button">Copy parallel prompt</button>
589
- <button class="btn" type="button">Copy sequential prompt</button>
590
- <button class="btn" type="button">Clear</button>
591
- </div>
592
-
593
- <div class="pager">
594
- <span>1 to 10 of 42</span>
595
- <button class="btn" type="button">Previous</button>
596
- <button class="btn" type="button">Next</button>
597
- </div>
598
- </div>
599
-
600
- <div role="tabpanel" id="p-active" aria-labelledby="t-active" hidden><p class="empty">Nothing here yet.</p></div>
601
- <div role="tabpanel" id="p-backlog" aria-labelledby="t-backlog" hidden><p class="empty">Nothing here yet.</p></div>
602
- <div role="tabpanel" id="p-done" aria-labelledby="t-done" hidden><p class="empty">Nothing here yet.</p></div>
603
- </main>
604
- </div>
605
- </div>
606
-
607
- <script>
608
- (function(){
609
- var root=document.documentElement;
610
- function isDark(){
611
- var m=root.getAttribute('data-mode');
612
- if(m==='dark')return true;
613
- if(m==='light')return false;
614
- return window.matchMedia('(prefers-color-scheme: dark)').matches;
615
- }
616
- document.getElementById('mode').addEventListener('click',function(){
617
- var next=isDark()?'light':'dark';
618
- root.setAttribute('data-mode',next);
619
- try{localStorage.setItem('cb-color-mode',next);}catch(e){}
620
- });
621
-
622
- var rows=Array.prototype.slice.call(document.querySelectorAll('tbody input[type=checkbox]'));
623
- var all=document.getElementById('all');
624
- var out=document.getElementById('selcount');
625
- function tally(){
626
- var n=rows.filter(function(c){return c.checked;}).length;
627
- out.textContent=n+' selected';
628
- all.checked=n>0&&n===rows.filter(function(c){return !c.disabled;}).length;
629
- }
630
- rows.forEach(function(c){c.addEventListener('change',tally);});
631
- all.addEventListener('change',function(){
632
- rows.forEach(function(c){if(!c.disabled)c.checked=all.checked;});
633
- tally();
634
- });
635
-
636
- var tabs=Array.prototype.slice.call(document.querySelectorAll('[role=tab]'));
637
- tabs.forEach(function(t){
638
- t.addEventListener('click',function(){
639
- tabs.forEach(function(o){
640
- var on=o===t;
641
- o.setAttribute('aria-selected',on?'true':'false');
642
- document.getElementById(o.getAttribute('aria-controls')).hidden=!on;
643
- });
644
- });
645
- });
646
- })();
647
- </script>
648
- </body>
649
- </html>