create-pmos 0.52.0 → 0.53.1

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/package.json +1 -1
  2. package/payload/KIT-VERSION +2 -2
  3. package/payload/mods/pmos-cockpit/README.md +13 -0
  4. package/payload/mods/pmos-cockpit/hooks/lib/commands.mjs +2 -1
  5. package/payload/mods/pmos-cockpit/hooks/lib/grants.mjs +41 -11
  6. package/payload/mods/pmos-cockpit/hooks/lib/guard.mjs +228 -8
  7. package/payload/mods/pmos-cockpit/hooks/register.tsx +11 -3
  8. package/payload/planning/evals/eval-calibration.md +1 -1
  9. package/payload/planning/okrs/health-budgets.md +1 -1
  10. package/payload/scripts/plan-items-stage.js +271 -0
  11. package/payload/scripts/pmos-log.sh +18 -7
  12. package/payload/scripts/workflow-state.js +28 -2
  13. package/payload/state/discoveries.md +1 -1
  14. package/payload/state/log.md +1 -1
  15. package/workspace/README.md +2 -0
  16. package/workspace/REMOTE.md +24 -63
  17. package/workspace/bin/pmos.js +19 -3
  18. package/workspace/cut-stub.js +40 -0
  19. package/workspace/first-paint-audit.js +145 -0
  20. package/workspace/fixtures/capture/requirements/capture-2026-10-04-1.md +10 -0
  21. package/workspace/fixtures/initiatives-api/list.json +176 -0
  22. package/workspace/fixtures/initiatives-api/post-403.json +5 -0
  23. package/workspace/fixtures/initiatives-api/post-ok.json +10 -0
  24. package/workspace/fixtures/initiatives-api/roadmap.json +208 -0
  25. package/workspace/fixtures/initiatives-api/sheet.json +112 -0
  26. package/workspace/fixtures/report-api/draft.json +177 -0
  27. package/workspace/fixtures/reports-page/draft-biweekly-2026-10-16.md +97 -0
  28. package/workspace/fixtures/today-api/provider-rows.json +204 -0
  29. package/workspace/fixtures/today-api/seam-probe-kinds.json +5 -0
  30. package/workspace/guide/board.md +81 -0
  31. package/workspace/guide/breakdown.md +154 -0
  32. package/workspace/guide/command-palette.md +75 -0
  33. package/workspace/guide/index.md +28 -17
  34. package/workspace/guide/initiatives-roadmap.md +130 -0
  35. package/workspace/guide/initiatives-screen.md +89 -0
  36. package/workspace/guide/initiatives-timeline.md +57 -0
  37. package/workspace/guide/integrated-work.md +94 -0
  38. package/workspace/guide/knowledge-graph.md +3 -68
  39. package/workspace/guide/launcher.md +51 -0
  40. package/workspace/guide/layout.md +102 -32
  41. package/workspace/guide/live-notes.md +3 -3
  42. package/workspace/guide/pm-only-acts.md +89 -0
  43. package/workspace/guide/pm-only-lines.md +61 -0
  44. package/workspace/guide/proactive-engine.md +21 -5
  45. package/workspace/guide/reports-page.md +80 -0
  46. package/workspace/guide/reports.md +73 -0
  47. package/workspace/guide/timeline.md +70 -0
  48. package/workspace/guide/today.md +85 -0
  49. package/workspace/guide/validate-with-typesafe.md +1 -1
  50. package/workspace/lib/actor.js +91 -0
  51. package/workspace/lib/board-cache.js +32 -2
  52. package/workspace/lib/board-cli.js +108 -0
  53. package/workspace/lib/board-fold.js +232 -0
  54. package/workspace/lib/breakdown-export.js +75 -0
  55. package/workspace/lib/brief.js +20 -2
  56. package/workspace/lib/capture.js +98 -0
  57. package/workspace/lib/engine/plan-items-stage.js +271 -0
  58. package/workspace/lib/engine/workflow-state.js +28 -2
  59. package/workspace/lib/factory-join.js +158 -0
  60. package/workspace/lib/goals.js +165 -0
  61. package/workspace/lib/grant-mint.js +113 -0
  62. package/workspace/lib/health-rules-factory.js +92 -0
  63. package/workspace/lib/health-rules-plan.js +164 -0
  64. package/workspace/lib/health.js +79 -0
  65. package/workspace/lib/initiative-cli.js +222 -0
  66. package/workspace/lib/initiative-display.js +183 -0
  67. package/workspace/lib/initiative-needs.js +127 -0
  68. package/workspace/lib/initiative-rows.js +210 -0
  69. package/workspace/lib/initiative-writer.js +141 -0
  70. package/workspace/lib/issues.js +206 -0
  71. package/workspace/lib/item-cli.js +195 -0
  72. package/workspace/lib/item-spans.js +137 -0
  73. package/workspace/lib/launcher-cli.js +207 -0
  74. package/workspace/lib/measure-cli.js +100 -0
  75. package/workspace/lib/measurements.js +189 -0
  76. package/workspace/lib/mobile-nav.js +57 -53
  77. package/workspace/lib/needs-providers.js +120 -0
  78. package/workspace/lib/placements.js +440 -0
  79. package/workspace/lib/plan-items.js +922 -0
  80. package/workspace/lib/plan-ledgers.js +85 -0
  81. package/workspace/lib/plan-rules.js +72 -0
  82. package/workspace/lib/plan-tree.js +380 -0
  83. package/workspace/lib/pm-guard.js +174 -0
  84. package/workspace/lib/pm-lines-needs.js +331 -0
  85. package/workspace/lib/pmos-verbs.js +69 -0
  86. package/workspace/lib/proactive-cli.js +58 -2
  87. package/workspace/lib/proactive.js +9 -6
  88. package/workspace/lib/qr.js +293 -0
  89. package/workspace/lib/remote-access.js +93 -1
  90. package/workspace/lib/report-cli.js +152 -0
  91. package/workspace/lib/report-draft.js +578 -0
  92. package/workspace/lib/report-needs.js +213 -0
  93. package/workspace/lib/route-modules.js +128 -0
  94. package/workspace/lib/routes-board.js +91 -0
  95. package/workspace/lib/routes-capture.js +52 -0
  96. package/workspace/lib/routes-initiatives.js +371 -0
  97. package/workspace/lib/routes-reports.js +163 -0
  98. package/workspace/lib/routes-timeline.js +197 -0
  99. package/workspace/lib/routes-today.js +32 -0
  100. package/workspace/lib/today-cli.js +99 -0
  101. package/workspace/lib/today.js +333 -0
  102. package/workspace/lib/triage.js +163 -0
  103. package/workspace/lib/verify-work-cli.js +81 -0
  104. package/workspace/lib/work-check-needs.js +99 -0
  105. package/workspace/package-lock.json +1 -1
  106. package/workspace/package.json +4 -5
  107. package/workspace/public/icons/apple-touch-icon.png +0 -0
  108. package/workspace/public/icons/icon-192.png +0 -0
  109. package/workspace/public/icons/icon-512.png +0 -0
  110. package/workspace/public/index.html +40 -19
  111. package/workspace/public/pm/app.js +330 -30
  112. package/workspace/public/pm/bd-board.js +113 -0
  113. package/workspace/public/pm/bd-drag.js +59 -0
  114. package/workspace/public/pm/bd-model.js +152 -0
  115. package/workspace/public/pm/bd-timeline.js +233 -0
  116. package/workspace/public/pm/bd-tree.js +244 -0
  117. package/workspace/public/pm/board-copy.js +57 -0
  118. package/workspace/public/pm/breakdown-api.js +58 -0
  119. package/workspace/public/pm/breakdown-copy.js +138 -0
  120. package/workspace/public/pm/components.css +3135 -0
  121. package/workspace/public/pm/cycle-review.js +125 -0
  122. package/workspace/public/pm/data.js +40 -187
  123. package/workspace/public/pm/dest-board.js +438 -0
  124. package/workspace/public/pm/dest-initiatives.js +134 -0
  125. package/workspace/public/pm/dest-reports.js +270 -0
  126. package/workspace/public/pm/dest-settings.js +217 -0
  127. package/workspace/public/pm/dest-today.js +182 -0
  128. package/workspace/public/pm/dialogs.js +88 -0
  129. package/workspace/public/pm/display-word.js +56 -0
  130. package/workspace/public/pm/dock.js +175 -0
  131. package/workspace/public/pm/fixture.js +8 -227
  132. package/workspace/public/pm/frame-copy.js +99 -0
  133. package/workspace/public/pm/handoff-box.js +82 -0
  134. package/workspace/public/pm/http.js +88 -0
  135. package/workspace/public/pm/icons.js +53 -0
  136. package/workspace/public/pm/initiative-list.js +218 -0
  137. package/workspace/public/pm/initiative-sheet.js +261 -0
  138. package/workspace/public/pm/initiatives-api.js +59 -0
  139. package/workspace/public/pm/initiatives-copy.js +215 -0
  140. package/workspace/public/pm/initiatives-timeline-copy.js +59 -0
  141. package/workspace/public/pm/initiatives-timeline.js +410 -0
  142. package/workspace/public/pm/initiatives-ui.js +123 -0
  143. package/workspace/public/pm/item-sheet.js +251 -0
  144. package/workspace/public/pm/keep-card.js +204 -0
  145. package/workspace/public/pm/lifecycle.js +7 -1
  146. package/workspace/public/pm/mobile.css +49 -20
  147. package/workspace/public/pm/mobile.js +157 -29
  148. package/workspace/public/pm/modes-live.js +7 -883
  149. package/workspace/public/pm/modes.js +32 -1024
  150. package/workspace/public/pm/new-initiative-sheet.js +74 -0
  151. package/workspace/public/pm/next-step-ui.js +3 -2
  152. package/workspace/public/pm/palette-copy.js +51 -0
  153. package/workspace/public/pm/palette.js +312 -0
  154. package/workspace/public/pm/panel-breakdown.js +702 -0
  155. package/workspace/public/pm/panel-cockpit.js +63 -295
  156. package/workspace/public/pm/panel-detail.js +25 -172
  157. package/workspace/public/pm/panel-initiatives.js +1 -19
  158. package/workspace/public/pm/panel-repos.js +31 -81
  159. package/workspace/public/pm/panel-tabs.js +200 -111
  160. package/workspace/public/pm/panel-trees.js +5 -2
  161. package/workspace/public/pm/portfolio-report.js +61 -0
  162. package/workspace/public/pm/primitives.js +656 -0
  163. package/workspace/public/pm/print.css +33 -0
  164. package/workspace/public/pm/provider-cards.js +136 -0
  165. package/workspace/public/pm/registry.js +194 -0
  166. package/workspace/public/pm/release-card.js +110 -0
  167. package/workspace/public/pm/report-view.js +309 -0
  168. package/workspace/public/pm/reports-copy.js +114 -0
  169. package/workspace/public/pm/roadmap.js +271 -0
  170. package/workspace/public/pm/sig-watch.js +41 -0
  171. package/workspace/public/pm/state.js +8 -4
  172. package/workspace/public/pm/status-banner.js +13 -5
  173. package/workspace/public/pm/tab-doc.js +2 -4
  174. package/workspace/public/pm/tab-term.js +12 -2
  175. package/workspace/public/pm/tab-web.js +3 -2
  176. package/workspace/public/pm/timeline-copy.js +48 -0
  177. package/workspace/public/pm/today-cards.js +244 -0
  178. package/workspace/public/pm/today-copy.js +126 -0
  179. package/workspace/public/pm/today-goals.js +172 -0
  180. package/workspace/public/pm/tokens.css +16 -18
  181. package/workspace/public/pm/topbar.js +102 -0
  182. package/workspace/public/pm/triage-card.js +60 -0
  183. package/workspace/public/pm/undo-hold.js +103 -0
  184. package/workspace/public/pm/view-addrepo.js +2 -1
  185. package/workspace/public/pm/view-livenotes.js +3 -1
  186. package/workspace/public/pm/view-today.js +7 -162
  187. package/workspace/public/vendor/Sortable.min.js +2 -0
  188. package/workspace/public/vendor/lucide-sprite.js +79 -0
  189. package/workspace/replaced-tests.json +2877 -0
  190. package/workspace/run-tests.js +56 -5
  191. package/workspace/server.js +446 -40
  192. package/workspace/sheet-answer.js +61 -0
  193. package/workspace/skills/measure.skill +41 -0
  194. package/workspace/skills/morning-brief.skill +15 -9
  195. package/workspace/skills/report-biweekly.skill +23 -25
  196. package/workspace/skills/tracker-refresh.skill +50 -0
  197. package/workspace/test-files.json +21 -3
  198. package/workspace/test-lists/base.json +6 -0
  199. package/workspace/test-lists/run2-a.json +6 -0
  200. package/workspace/test-lists/run2-b.json +13 -0
  201. package/workspace/test-lists/run2-c.json +19 -0
  202. package/workspace/test-lists/run2-d.json +22 -0
  203. package/workspace/test-lists/run3-0.json +5 -0
  204. package/workspace/test-lists/run3-a.json +5 -0
  205. package/workspace/test-lists/run3-b.json +6 -0
  206. package/workspace/test-lists/run3-c.json +15 -0
  207. package/workspace/test-lists/run3-d.json +6 -0
  208. package/workspace/test-lists/run4-a.json +8 -0
  209. package/workspace/test-lists/run4-b.json +6 -0
  210. package/workspace/test-lists/run4-c.json +13 -0
  211. package/workspace/test-lists/run4-d.json +9 -0
  212. package/workspace/test-lists/run5-a.json +6 -0
  213. package/workspace/test-lists/run5-b.json +6 -0
  214. package/workspace/test-lists/run5-c.json +15 -0
  215. package/workspace/test-lists/workspace-launcher.json +5 -0
  216. package/workspace/test-lists/workspace-phone-app.json +5 -0
  217. package/workspace/test-run.js +27 -1
  218. package/workspace/third-party/README.md +44 -0
  219. package/workspace/third-party/lucide-static-1.52.0.LICENSE +43 -0
  220. package/workspace/third-party/sortablejs-1.15.7.LICENSE +21 -0
  221. package/workspace/design-parity.js +0 -673
  222. package/workspace/public/pm/tab-task.js +0 -86
  223. package/workspace/public/pm/view-guide.js +0 -141
  224. package/workspace/public/pm/view-knowledge.js +0 -225
  225. package/workspace/public/pm/view-memory.js +0 -122
  226. package/workspace/public/pm/view-portfolio.js +0 -153
  227. package/workspace/public/pm/view-reports.js +0 -190
  228. package/workspace/public/pm/view-scheduled.js +0 -161
  229. package/workspace/public/pm/view-skills.js +0 -216
@@ -0,0 +1,3135 @@
1
+ /* pm/components.css — the R27 primitives and the Breakdown layouts (pm-os-absorb Run 1).
2
+ *
3
+ * Linked at run time by primitives.js `ensureComponentsCss()`, the first time a Breakdown is drawn; index.html does not
4
+ * link it, so no pinned screen changes. Two sections, in this order:
5
+ * primitives `.pmc-*` — written only by primitives.js and icons.js (R28-9)
6
+ * layouts `.bd-*` — the Breakdown's own arrangement of those primitives
7
+ * Every selector starts with `.pmc-` or `.bd-`. Colours are tokens.css variables only; there is no hex and no oklch here.
8
+ * Radius is 0 (a dot is the one round shape). Hover rules sit inside (hover: hover). Under a coarse pointer every
9
+ * control is at least 44px and every row and card at least 48px.
10
+ */
11
+
12
+ /* == primitives == */
13
+
14
+ /* the overlay layer: zero-size and fixed, so it never takes clicks; the sheet, menus and toasts render in the top layer */
15
+ .pmc-layer {
16
+ position: fixed;
17
+ top: 0;
18
+ left: 0;
19
+ width: 0;
20
+ height: 0;
21
+ z-index: 60;
22
+ }
23
+ .pmc-layer__theme {
24
+ font-family: var(--sans);
25
+ font-size: 14px;
26
+ line-height: 20px;
27
+ color: var(--foreground);
28
+ }
29
+ .pmc-sprite {
30
+ position: absolute;
31
+ width: 0;
32
+ height: 0;
33
+ overflow: hidden;
34
+ }
35
+
36
+ .pmc-icon {
37
+ width: 16px;
38
+ height: 16px;
39
+ flex: none;
40
+ stroke: currentColor;
41
+ fill: none;
42
+ }
43
+
44
+ /* button */
45
+ .pmc-btn {
46
+ appearance: none;
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ gap: 6px;
51
+ flex: none;
52
+ height: 32px;
53
+ min-height: 32px;
54
+ padding: 0 14px;
55
+ border: 1px solid var(--border);
56
+ border-radius: 0;
57
+ background: transparent;
58
+ color: var(--foreground);
59
+ font-family: var(--sans);
60
+ font-size: 12px;
61
+ line-height: 1;
62
+ font-weight: 600;
63
+ letter-spacing: 0.1em;
64
+ text-transform: uppercase;
65
+ white-space: nowrap;
66
+ cursor: pointer;
67
+ user-select: none;
68
+ -webkit-tap-highlight-color: transparent;
69
+ transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease;
70
+ }
71
+ .pmc-btn:disabled {
72
+ opacity: 0.5;
73
+ cursor: default;
74
+ }
75
+ .pmc-btn--primary {
76
+ background: var(--foreground);
77
+ color: var(--background);
78
+ border-color: var(--foreground);
79
+ }
80
+ .pmc-btn--outline {
81
+ border-color: var(--border);
82
+ }
83
+ .pmc-btn--ghost {
84
+ border-color: transparent;
85
+ }
86
+ .pmc-btn--danger {
87
+ border-color: transparent;
88
+ color: var(--destructive);
89
+ }
90
+ .pmc-btn--sm {
91
+ height: 28px;
92
+ min-height: 28px;
93
+ padding: 0 10px;
94
+ }
95
+ .pmc-btn--block {
96
+ display: flex;
97
+ width: 100%;
98
+ }
99
+ .pmc-btn--icon {
100
+ width: 32px;
101
+ padding: 0;
102
+ letter-spacing: 0;
103
+ color: var(--muted-foreground);
104
+ }
105
+ .pmc-btn--icon.pmc-btn--sm {
106
+ width: 28px;
107
+ }
108
+ .pmc-btn__label {
109
+ min-width: 0;
110
+ overflow: hidden;
111
+ text-overflow: ellipsis;
112
+ }
113
+ .pmc-btn--block .pmc-btn__label {
114
+ flex: 0 1 auto;
115
+ }
116
+ .pmc-btn:focus-visible {
117
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
118
+ outline-offset: 2px;
119
+ }
120
+ .pmc-btn[aria-haspopup="menu"][aria-expanded="true"] {
121
+ color: var(--foreground);
122
+ background: var(--accent);
123
+ }
124
+
125
+ /* field */
126
+ .pmc-field[hidden],
127
+ .pmc-check[hidden] {
128
+ display: none;
129
+ }
130
+ .pmc-field {
131
+ display: flex;
132
+ flex-direction: column;
133
+ gap: 2px;
134
+ min-width: 0;
135
+ }
136
+ .pmc-field__label {
137
+ font-size: 12px;
138
+ line-height: 16px;
139
+ font-weight: 500;
140
+ color: var(--muted-foreground);
141
+ }
142
+ .pmc-field__label--hidden {
143
+ position: absolute;
144
+ width: 1px;
145
+ height: 1px;
146
+ overflow: hidden;
147
+ clip-path: inset(50%);
148
+ white-space: nowrap;
149
+ }
150
+ .pmc-field__input {
151
+ appearance: none;
152
+ display: block;
153
+ width: 100%;
154
+ min-width: 0;
155
+ height: 36px;
156
+ min-height: 36px;
157
+ margin: 0;
158
+ padding: 0;
159
+ border: 0;
160
+ border-bottom: 1px solid var(--input);
161
+ border-radius: 0;
162
+ background: transparent;
163
+ color: var(--foreground);
164
+ font-family: var(--sans);
165
+ font-size: 14px;
166
+ line-height: 20px;
167
+ }
168
+ .pmc-field__input::placeholder {
169
+ color: var(--muted-foreground);
170
+ }
171
+ .pmc-field__input--title {
172
+ font-size: 16px;
173
+ font-weight: 600;
174
+ }
175
+ .pmc-field__input--area {
176
+ height: auto;
177
+ min-height: 72px;
178
+ padding: 8px 0;
179
+ resize: vertical;
180
+ }
181
+ .pmc-field__input--select {
182
+ padding-right: 22px;
183
+ cursor: pointer;
184
+ background-image: linear-gradient(45deg, transparent 50%, var(--muted-foreground) 50%),
185
+ linear-gradient(135deg, var(--muted-foreground) 50%, transparent 50%);
186
+ background-position: calc(100% - 10px) 52%, calc(100% - 6px) 52%;
187
+ background-size: 4px 4px;
188
+ background-repeat: no-repeat;
189
+ }
190
+ .pmc-field__input--select option {
191
+ background: var(--card);
192
+ color: var(--foreground);
193
+ }
194
+ .pmc-field__input[type="date"]::-webkit-calendar-picker-indicator {
195
+ opacity: 0.6;
196
+ cursor: pointer;
197
+ }
198
+ .pmc-field__input.pmc-field__input:focus-visible {
199
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
200
+ outline-offset: 2px;
201
+ border-bottom-color: var(--ring);
202
+ }
203
+ .pmc-check {
204
+ display: inline-flex;
205
+ align-items: center;
206
+ gap: 8px;
207
+ min-height: 32px;
208
+ font-size: 14px;
209
+ line-height: 20px;
210
+ cursor: pointer;
211
+ }
212
+ .pmc-check__box {
213
+ appearance: none;
214
+ display: inline-grid;
215
+ place-content: center;
216
+ flex: none;
217
+ width: 16px;
218
+ height: 16px;
219
+ margin: 0;
220
+ border: 1px solid var(--muted-foreground);
221
+ border-radius: 0;
222
+ background: transparent;
223
+ cursor: pointer;
224
+ }
225
+ .pmc-check__box:checked {
226
+ background: var(--foreground);
227
+ border-color: var(--foreground);
228
+ }
229
+ .pmc-check__box:checked::after {
230
+ content: "";
231
+ width: 8px;
232
+ height: 4px;
233
+ border-left: 2px solid var(--background);
234
+ border-bottom: 2px solid var(--background);
235
+ transform: translateY(-1px) rotate(-45deg);
236
+ }
237
+ .pmc-check__box:focus-visible {
238
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
239
+ outline-offset: 2px;
240
+ }
241
+
242
+ /* badge, signal, dots */
243
+ .pmc-badge {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ flex: none;
247
+ height: 18px;
248
+ padding: 0 6px;
249
+ font-size: 11px;
250
+ line-height: 16px;
251
+ font-weight: 600;
252
+ letter-spacing: 0.05em;
253
+ text-transform: uppercase;
254
+ white-space: nowrap;
255
+ color: var(--muted-foreground);
256
+ border: 1px solid transparent;
257
+ }
258
+ .pmc-badge--outline {
259
+ border-color: var(--border);
260
+ color: var(--foreground);
261
+ }
262
+ .pmc-badge--warning {
263
+ color: var(--warning);
264
+ }
265
+ .pmc-badge--destructive {
266
+ color: var(--destructive);
267
+ }
268
+ .pmc-signal {
269
+ display: inline-flex;
270
+ align-items: center;
271
+ gap: 5px;
272
+ flex: none;
273
+ white-space: nowrap;
274
+ color: var(--muted-foreground);
275
+ font-weight: 500;
276
+ }
277
+ .pmc-signal--warning {
278
+ color: var(--warning);
279
+ }
280
+ .pmc-signal--destructive {
281
+ color: var(--destructive);
282
+ }
283
+ .pmc-signal__dot {
284
+ width: 6px;
285
+ height: 6px;
286
+ flex: none;
287
+ border-radius: 50%;
288
+ background: currentColor;
289
+ }
290
+ .pmc-needs-dot {
291
+ display: inline-block;
292
+ width: 6px;
293
+ height: 6px;
294
+ flex: none;
295
+ border-radius: 50%;
296
+ background: var(--brand-mark);
297
+ }
298
+ /* The Today count: the number beside the dot. With the dot, the only place the brand colour appears (R28-8). */
299
+ .pmc-needs-count {
300
+ color: var(--brand-mark);
301
+ font-size: 11px;
302
+ font-variant-numeric: tabular-nums;
303
+ }
304
+ .pmc-sep {
305
+ color: var(--muted-foreground);
306
+ flex: none;
307
+ }
308
+
309
+ /* drag handle: pointer only, never focusable */
310
+ .pmc-drag {
311
+ display: inline-flex;
312
+ align-items: center;
313
+ justify-content: center;
314
+ flex: none;
315
+ width: 16px;
316
+ min-height: 24px;
317
+ align-self: stretch;
318
+ color: var(--muted-foreground);
319
+ cursor: grab;
320
+ /* a vertical swipe that starts on the grip still scrolls; Sortable takes the touch only after the 150 ms hold */
321
+ touch-action: pan-y;
322
+ -webkit-user-select: none;
323
+ user-select: none;
324
+ -webkit-touch-callout: none;
325
+ }
326
+
327
+ /* row: lead · title over one meta line · trail */
328
+ .pmc-row {
329
+ position: relative;
330
+ display: flex;
331
+ align-items: center;
332
+ gap: 8px;
333
+ width: 100%;
334
+ min-height: 36px;
335
+ padding: 6px 16px;
336
+ border-bottom: 1px solid var(--border);
337
+ background: var(--background);
338
+ color: var(--foreground);
339
+ text-align: left;
340
+ }
341
+ .pmc-row__lead {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 2px;
345
+ flex: none;
346
+ align-self: stretch;
347
+ color: var(--muted-foreground);
348
+ }
349
+ .pmc-row__open,
350
+ .pmc-row__main {
351
+ appearance: none;
352
+ display: flex;
353
+ flex-direction: column;
354
+ gap: 2px;
355
+ flex: 1 1 auto;
356
+ min-width: 0;
357
+ margin: 0;
358
+ padding: 2px 0;
359
+ border: 0;
360
+ background: transparent;
361
+ color: inherit;
362
+ font: inherit;
363
+ text-align: left;
364
+ }
365
+ .pmc-row__open {
366
+ cursor: pointer;
367
+ }
368
+ .pmc-row__title,
369
+ .pmc-card__title {
370
+ display: flex;
371
+ align-items: center;
372
+ gap: 6px;
373
+ min-width: 0;
374
+ font-size: 14px;
375
+ line-height: 20px;
376
+ font-weight: 500;
377
+ }
378
+ .pmc-title__text {
379
+ min-width: 0;
380
+ overflow-wrap: anywhere;
381
+ }
382
+ .pmc-row__meta,
383
+ .pmc-card__meta {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ align-items: center;
387
+ column-gap: 6px;
388
+ min-width: 0;
389
+ font-size: 12px;
390
+ line-height: 16px;
391
+ color: var(--muted-foreground);
392
+ }
393
+ .pmc-row__trail {
394
+ display: flex;
395
+ align-items: center;
396
+ gap: 4px;
397
+ flex: none;
398
+ margin-right: -8px;
399
+ color: var(--muted-foreground);
400
+ }
401
+ .pmc-row--done .pmc-row__title {
402
+ color: var(--muted-foreground);
403
+ text-decoration: line-through;
404
+ text-decoration-thickness: 1px;
405
+ }
406
+ .pmc-row--proposed .pmc-row__title {
407
+ color: var(--muted-foreground);
408
+ }
409
+ .pmc-row--owed {
410
+ background: transparent;
411
+ }
412
+ .pmc-row--owed .pmc-row__title {
413
+ font-weight: 500;
414
+ color: var(--muted-foreground);
415
+ }
416
+ .pmc-row--owed .pmc-row__lead::before {
417
+ content: "";
418
+ width: 12px;
419
+ height: 12px;
420
+ margin: 0 2px;
421
+ border: 1px dashed var(--muted-foreground);
422
+ }
423
+ .pmc-row__open:focus-visible,
424
+ .pmc-card__open:focus-visible {
425
+ outline: none;
426
+ }
427
+ .pmc-row:focus-visible,
428
+ .pmc-row:has(.pmc-row__open:focus-visible) {
429
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
430
+ outline-offset: -2px;
431
+ }
432
+
433
+ /* card: raised, one open button that covers the card */
434
+ .pmc-card {
435
+ position: relative;
436
+ display: flex;
437
+ flex-direction: column;
438
+ gap: 2px;
439
+ min-width: 0;
440
+ min-height: 36px;
441
+ padding: 10px 12px;
442
+ border-radius: 0;
443
+ background: var(--card);
444
+ color: var(--foreground);
445
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 9%, transparent),
446
+ 0 1px 3px 0 color-mix(in oklab, var(--term-bg) 10%, transparent),
447
+ 0 1px 2px -1px color-mix(in oklab, var(--term-bg) 10%, transparent);
448
+ }
449
+ .pmc-card__top {
450
+ display: flex;
451
+ align-items: flex-start;
452
+ gap: 6px;
453
+ min-width: 0;
454
+ }
455
+ .pmc-card__lead {
456
+ display: flex;
457
+ align-items: center;
458
+ align-self: center;
459
+ flex: none;
460
+ min-height: 20px;
461
+ margin-left: -6px;
462
+ }
463
+ .pmc-card__open {
464
+ appearance: none;
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: 2px;
468
+ flex: 1 1 auto;
469
+ min-width: 0;
470
+ margin: 0;
471
+ padding: 0;
472
+ border: 0;
473
+ background: transparent;
474
+ color: inherit;
475
+ font: inherit;
476
+ text-align: left;
477
+ cursor: pointer;
478
+ }
479
+ .pmc-card__open::after {
480
+ content: "";
481
+ position: absolute;
482
+ inset: 0;
483
+ }
484
+ .pmc-card__trail {
485
+ position: relative;
486
+ z-index: 1;
487
+ display: flex;
488
+ flex: none;
489
+ margin: -6px -8px -6px 0;
490
+ }
491
+ .pmc-card--muted .pmc-card__title {
492
+ color: var(--muted-foreground);
493
+ }
494
+ .pmc-card:focus-visible,
495
+ .pmc-card:has(.pmc-card__open:focus-visible) {
496
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
497
+ outline-offset: 2px;
498
+ }
499
+
500
+ /* tabs: segmented (a muted track, the chosen tab lifted) and line */
501
+ .pmc-tabs {
502
+ display: inline-flex;
503
+ align-items: stretch;
504
+ gap: 2px;
505
+ max-width: 100%;
506
+ height: 32px;
507
+ padding: 2px;
508
+ background: var(--muted);
509
+ overflow-x: auto;
510
+ scrollbar-width: none;
511
+ }
512
+ .pmc-tabs--full {
513
+ display: flex;
514
+ width: 100%;
515
+ }
516
+ .pmc-tabs--full .pmc-tabs__tab {
517
+ flex: 1 1 0;
518
+ min-width: 0;
519
+ padding: 0 8px;
520
+ }
521
+ .pmc-tabs__tab {
522
+ appearance: none;
523
+ display: inline-flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ gap: 6px;
527
+ flex: 1 0 auto;
528
+ min-height: 26px;
529
+ padding: 0 12px;
530
+ border: 1px solid transparent;
531
+ border-radius: 0;
532
+ background: transparent;
533
+ color: color-mix(in oklab, var(--foreground) 68%, transparent);
534
+ font-family: var(--sans);
535
+ font-size: 12px;
536
+ line-height: 1;
537
+ font-weight: 600;
538
+ letter-spacing: 0.06em;
539
+ text-transform: uppercase;
540
+ white-space: nowrap;
541
+ cursor: pointer;
542
+ -webkit-tap-highlight-color: transparent;
543
+ }
544
+ .pmc-tabs__tab[aria-selected="true"],
545
+ .pmc-tabs__tab[aria-checked="true"] {
546
+ background: var(--background);
547
+ border-color: var(--input);
548
+ color: var(--foreground);
549
+ }
550
+ .pmc-tabs__count {
551
+ font-variant-numeric: tabular-nums;
552
+ color: inherit;
553
+ letter-spacing: 0;
554
+ }
555
+ .pmc-tabs__tab[aria-selected="true"] .pmc-tabs__count,
556
+ .pmc-tabs__tab[aria-checked="true"] .pmc-tabs__count {
557
+ color: var(--muted-foreground);
558
+ }
559
+ .pmc-tabs__tab:focus-visible {
560
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
561
+ outline-offset: -2px;
562
+ }
563
+ .pmc-tabs--line {
564
+ height: 36px;
565
+ gap: 20px;
566
+ padding: 0;
567
+ background: transparent;
568
+ border-bottom: 1px solid var(--border);
569
+ }
570
+ .pmc-tabs--line .pmc-tabs__tab {
571
+ flex: 0 0 auto;
572
+ padding: 0;
573
+ border: 0;
574
+ }
575
+ .pmc-tabs--line .pmc-tabs__tab[aria-selected="true"] {
576
+ background: transparent;
577
+ box-shadow: inset 0 -2px 0 var(--foreground);
578
+ }
579
+
580
+ /* menu: one floating surface, positioned by primitives.js */
581
+ .pmc-menu {
582
+ position: fixed;
583
+ inset: auto;
584
+ left: var(--pmc-x, 16px);
585
+ top: var(--pmc-y, 16px);
586
+ margin: 0;
587
+ min-width: 200px;
588
+ max-width: calc(100vw - 32px);
589
+ max-height: min(70dvh, 480px);
590
+ overflow: auto;
591
+ padding: 4px;
592
+ border: 0;
593
+ border-radius: 0;
594
+ background: var(--card);
595
+ color: var(--foreground);
596
+ font-family: var(--sans);
597
+ font-size: 14px;
598
+ line-height: 20px;
599
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 12%, transparent),
600
+ 0 6px 16px -4px color-mix(in oklab, var(--term-bg) 28%, transparent);
601
+ }
602
+ .pmc-menu__item {
603
+ appearance: none;
604
+ display: flex;
605
+ align-items: center;
606
+ gap: 8px;
607
+ width: 100%;
608
+ min-height: 32px;
609
+ padding: 0 12px;
610
+ border: 0;
611
+ border-radius: 0;
612
+ background: transparent;
613
+ color: var(--foreground);
614
+ font: inherit;
615
+ text-align: left;
616
+ white-space: nowrap;
617
+ cursor: pointer;
618
+ }
619
+ .pmc-menu__item--danger {
620
+ color: var(--destructive);
621
+ }
622
+ .pmc-menu__item:focus-visible {
623
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
624
+ outline-offset: -2px;
625
+ background: var(--muted);
626
+ }
627
+ .pmc-menu__sep {
628
+ height: 1px;
629
+ margin: 4px -4px;
630
+ background: var(--border);
631
+ }
632
+
633
+ /* sheet: a modal <dialog>, 420px at the side or a bottom sheet that follows the on-screen keyboard */
634
+ .pmc-sheet {
635
+ position: fixed;
636
+ max-width: none;
637
+ max-height: none;
638
+ margin: 0;
639
+ padding: 0;
640
+ border: 0;
641
+ border-radius: 0;
642
+ background: var(--card);
643
+ color: var(--foreground);
644
+ font-family: var(--sans);
645
+ font-size: 14px;
646
+ line-height: 20px;
647
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 12%, transparent),
648
+ 0 12px 32px -8px color-mix(in oklab, var(--term-bg) 40%, transparent);
649
+ }
650
+ .pmc-sheet[open] {
651
+ display: flex;
652
+ flex-direction: column;
653
+ }
654
+ .pmc-sheet::backdrop {
655
+ background: var(--background);
656
+ opacity: 0.6;
657
+ }
658
+ .pmc-sheet--side {
659
+ inset: 0 0 0 auto;
660
+ width: min(420px, 100vw);
661
+ height: 100dvh;
662
+ }
663
+ .pmc-sheet--bottom {
664
+ inset: auto 0 0 0;
665
+ bottom: var(--pmc-kb, 0px);
666
+ width: 100vw;
667
+ height: auto;
668
+ max-height: calc(var(--pmc-vvh, 100dvh) - 24px);
669
+ }
670
+ .pmc-sheet__handle {
671
+ flex: none;
672
+ width: 36px;
673
+ height: 4px;
674
+ margin: 8px auto 0;
675
+ background: var(--border);
676
+ }
677
+ .pmc-sheet__head {
678
+ display: flex;
679
+ align-items: flex-start;
680
+ gap: 8px;
681
+ flex: none;
682
+ padding: 14px 16px 12px;
683
+ border-bottom: 1px solid var(--border);
684
+ }
685
+ .pmc-sheet__heading {
686
+ flex: 1 1 auto;
687
+ min-width: 0;
688
+ }
689
+ .pmc-sheet__title {
690
+ margin: 0;
691
+ font-size: 16px;
692
+ line-height: 24px;
693
+ font-weight: 600;
694
+ letter-spacing: -0.01em;
695
+ overflow-wrap: anywhere;
696
+ }
697
+ .pmc-sheet__sub {
698
+ font-size: 12px;
699
+ line-height: 16px;
700
+ color: var(--muted-foreground);
701
+ }
702
+ .pmc-sheet__head .pmc-btn--icon {
703
+ margin: -4px -8px 0 0;
704
+ }
705
+ .pmc-sheet__body {
706
+ display: flex;
707
+ flex-direction: column;
708
+ gap: 16px;
709
+ flex: 1 1 auto;
710
+ min-height: 0;
711
+ overflow: auto;
712
+ overscroll-behavior: contain;
713
+ padding: 16px;
714
+ }
715
+ .pmc-sheet__body > * {
716
+ flex: none;
717
+ }
718
+ .pmc-sheet__actions {
719
+ display: flex;
720
+ align-items: center;
721
+ justify-content: space-between;
722
+ gap: 8px;
723
+ flex: none;
724
+ padding: 10px 16px;
725
+ padding-bottom: max(10px, env(safe-area-inset-bottom));
726
+ border-top: 1px solid var(--border);
727
+ background: var(--card);
728
+ }
729
+
730
+ /* meter: a 2px bar and its label */
731
+ .pmc-meter {
732
+ display: inline-flex;
733
+ align-items: center;
734
+ gap: 8px;
735
+ font-size: 12px;
736
+ line-height: 16px;
737
+ color: var(--muted-foreground);
738
+ font-variant-numeric: tabular-nums;
739
+ white-space: nowrap;
740
+ }
741
+ .pmc-meter__track {
742
+ position: relative;
743
+ width: 64px;
744
+ height: 2px;
745
+ overflow: hidden;
746
+ background: color-mix(in oklab, var(--foreground) 12%, transparent);
747
+ }
748
+ .pmc-meter__fill {
749
+ position: absolute;
750
+ top: 0;
751
+ bottom: 0;
752
+ left: 0;
753
+ width: var(--pmc-value, 0%);
754
+ background: color-mix(in oklab, var(--foreground) 72%, transparent);
755
+ }
756
+
757
+ /* toast: bottom right on a desktop, bottom centre on a phone; stacked by --pmc-toast-i */
758
+ .pmc-toast {
759
+ position: fixed;
760
+ inset: auto;
761
+ right: 24px;
762
+ bottom: calc(24px + var(--pmc-toast-i, 0) * 52px);
763
+ margin: 0;
764
+ display: flex;
765
+ align-items: center;
766
+ gap: 12px;
767
+ width: max-content;
768
+ max-width: calc(100vw - 32px);
769
+ min-height: 44px;
770
+ padding: 4px 4px 4px 16px;
771
+ border: 0;
772
+ border-radius: 0;
773
+ background: var(--card);
774
+ color: var(--foreground);
775
+ font-family: var(--sans);
776
+ font-size: 14px;
777
+ line-height: 20px;
778
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 12%, transparent),
779
+ 0 6px 16px -4px color-mix(in oklab, var(--term-bg) 28%, transparent);
780
+ }
781
+ .pmc-toast--error {
782
+ color: var(--destructive);
783
+ }
784
+ .pmc-toast__text {
785
+ min-width: 0;
786
+ }
787
+ @media (max-width: 760px) {
788
+ /* above the 64px bottom nav, so neither the nav nor the status line is covered for the 8 seconds of an Undo */
789
+ .pmc-toast {
790
+ left: 16px;
791
+ right: 16px;
792
+ width: auto;
793
+ bottom: calc(72px + env(safe-area-inset-bottom) + var(--pmc-toast-i, 0) * 56px);
794
+ }
795
+ /* inside a bottom sheet: above its sticky action row (and above the keyboard) */
796
+ .pmc-sheet--bottom > .pmc-toast {
797
+ bottom: calc(var(--pmc-kb, 0px) + 76px + env(safe-area-inset-bottom) + var(--pmc-toast-i, 0) * 56px);
798
+ }
799
+ }
800
+
801
+ .pmc-empty {
802
+ padding: 16px;
803
+ color: var(--muted-foreground);
804
+ font-size: 14px;
805
+ line-height: 20px;
806
+ }
807
+
808
+ /* hover: pointer devices only */
809
+ @media (hover: hover) {
810
+ .pmc-btn:hover:not(:disabled) {
811
+ background: var(--accent);
812
+ color: var(--foreground);
813
+ }
814
+ .pmc-btn--primary:hover:not(:disabled) {
815
+ background: color-mix(in oklab, var(--foreground) 86%, var(--background));
816
+ color: var(--background);
817
+ }
818
+ .pmc-btn--danger:hover:not(:disabled) {
819
+ background: color-mix(in oklab, var(--destructive) 12%, transparent);
820
+ color: var(--destructive);
821
+ }
822
+ .pmc-tabs__tab:hover {
823
+ color: var(--foreground);
824
+ }
825
+ .pmc-menu__item:hover {
826
+ background: var(--muted);
827
+ }
828
+ .pmc-row:has(.pmc-row__open:hover) {
829
+ background: color-mix(in oklab, var(--muted) 45%, var(--background));
830
+ }
831
+ .pmc-card:has(.pmc-card__open:hover) {
832
+ background: color-mix(in oklab, var(--muted) 35%, var(--card));
833
+ }
834
+ }
835
+
836
+ /* coarse pointers: 44px controls, 48px rows and cards */
837
+ @media (pointer: coarse) {
838
+ .pmc-btn,
839
+ .pmc-tabs__tab,
840
+ .pmc-menu__item,
841
+ .pmc-drag,
842
+ .pmc-field__input {
843
+ min-height: 44px;
844
+ }
845
+ .pmc-btn--sm {
846
+ height: 44px;
847
+ }
848
+ .pmc-btn--icon,
849
+ .pmc-btn--icon.pmc-btn--sm,
850
+ .pmc-drag {
851
+ min-width: 44px;
852
+ }
853
+ /* a short tab word ("All" is 24px wide) is still a 44px target both ways: the palette's scope tabs are short */
854
+ .pmc-tabs__tab {
855
+ min-width: 44px;
856
+ }
857
+ .pmc-btn {
858
+ height: 44px;
859
+ }
860
+ .pmc-tabs {
861
+ height: 48px;
862
+ }
863
+ .pmc-row,
864
+ .pmc-card {
865
+ min-height: 48px;
866
+ }
867
+ .pmc-row__open,
868
+ .pmc-card__open {
869
+ min-height: 44px;
870
+ justify-content: center;
871
+ }
872
+ .pmc-field__input {
873
+ font-size: 16px;
874
+ }
875
+ .pmc-check {
876
+ min-height: 44px;
877
+ }
878
+ .pmc-check__box {
879
+ width: 20px;
880
+ height: 20px;
881
+ }
882
+ }
883
+
884
+ /* A paragraph of a dialog sheet (dialogs.js): the question's own words, line breaks kept. */
885
+ .pmc-dialog__text {
886
+ margin: 0 0 12px;
887
+ font-size: 14px;
888
+ line-height: 1.5;
889
+ white-space: pre-line;
890
+ }
891
+
892
+ /* -- end of the primitives 3D owns: 3D writes above this line, never below it -- */
893
+
894
+
895
+ /* -- primitives · the Timeline bar .pmc-tlbar (Run 4, slice 4B): its rules go below this line -- */
896
+ /* timeline bar: grey segments on a track; colour only for health (R8); a ◆ per milestone; a 1px line for today.
897
+ * Geometry comes from primitives.js as --pmc-tl-left and --pmc-tl-width (percent of the axis). */
898
+ .pmc-tlbar {
899
+ position: relative;
900
+ height: 36px;
901
+ min-width: 0;
902
+ }
903
+ .pmc-tlbar__seg {
904
+ appearance: none;
905
+ position: absolute;
906
+ top: 50%;
907
+ left: var(--pmc-tl-left, 0);
908
+ width: var(--pmc-tl-width, 0);
909
+ min-width: 4px;
910
+ height: 12px;
911
+ margin: 0;
912
+ padding: 0;
913
+ border: 0;
914
+ border-radius: 0;
915
+ background: transparent;
916
+ color: inherit;
917
+ transform: translateY(-50%);
918
+ }
919
+ .pmc-tlbar__fill {
920
+ position: absolute;
921
+ top: 50%;
922
+ left: 0;
923
+ right: 0;
924
+ height: 12px;
925
+ background: color-mix(in oklab, var(--foreground) 24%, transparent);
926
+ transform: translateY(-50%);
927
+ pointer-events: none;
928
+ }
929
+ .pmc-tlbar__seg--done .pmc-tlbar__fill {
930
+ background: color-mix(in oklab, var(--foreground) 56%, transparent);
931
+ }
932
+ /* a split bar: each stage after the first starts with a 2px gap in the page colour, so touching or overlapping stages
933
+ * read as separate parts */
934
+ .pmc-tlbar__seg ~ .pmc-tlbar__seg .pmc-tlbar__fill {
935
+ border-left: 2px solid var(--background);
936
+ }
937
+ /* a proposal nobody kept: lighter, with a dashed edge */
938
+ .pmc-tlbar__seg--muted .pmc-tlbar__fill {
939
+ background: color-mix(in oklab, var(--foreground) 10%, transparent);
940
+ outline: 1px dashed color-mix(in oklab, var(--foreground) 48%, transparent);
941
+ outline-offset: -1px;
942
+ }
943
+ .pmc-tlbar__seg--risk .pmc-tlbar__fill {
944
+ box-shadow: inset 0 0 0 1px var(--warning);
945
+ }
946
+ .pmc-tlbar__seg--off .pmc-tlbar__fill {
947
+ box-shadow: inset 0 0 0 1px var(--destructive);
948
+ }
949
+ .pmc-tlbar--drag .pmc-tlbar__seg {
950
+ height: 24px;
951
+ cursor: grab;
952
+ touch-action: pan-y;
953
+ }
954
+ .pmc-tlbar__seg--moving {
955
+ cursor: grabbing;
956
+ }
957
+ .pmc-tlbar__seg--moving .pmc-tlbar__fill {
958
+ background: color-mix(in oklab, var(--foreground) 48%, transparent);
959
+ }
960
+ .pmc-tlbar__seg:focus-visible {
961
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
962
+ outline-offset: 2px;
963
+ }
964
+ /* the end of a movable bar: drag it to change the due date. Always drawn, never shown only on hover. At most a third
965
+ * of the bar, so a short bar still moves when it is dragged from its middle. */
966
+ .pmc-tlbar__end {
967
+ position: absolute;
968
+ top: 0;
969
+ right: 0;
970
+ bottom: 0;
971
+ box-sizing: border-box;
972
+ width: 12px;
973
+ max-width: 33%;
974
+ border-right: 2px solid color-mix(in oklab, var(--foreground) 64%, transparent);
975
+ cursor: ew-resize;
976
+ }
977
+ .pmc-tlbar__milestone {
978
+ position: absolute;
979
+ top: 50%;
980
+ left: var(--pmc-tl-left, 0);
981
+ width: 10px;
982
+ height: 10px;
983
+ margin: -5px 0 0 -5px;
984
+ background: var(--foreground);
985
+ transform: rotate(45deg);
986
+ pointer-events: none;
987
+ }
988
+ .pmc-tlbar__milestone--risk {
989
+ background: var(--warning);
990
+ }
991
+ .pmc-tlbar__milestone--off {
992
+ background: var(--destructive);
993
+ }
994
+ .pmc-tlbar__today {
995
+ position: absolute;
996
+ top: 0;
997
+ bottom: 0;
998
+ left: var(--pmc-tl-left, 0);
999
+ width: 1px;
1000
+ background: var(--foreground);
1001
+ pointer-events: none;
1002
+ }
1003
+ @media (hover: hover) {
1004
+ .pmc-tlbar--drag .pmc-tlbar__seg:hover .pmc-tlbar__fill {
1005
+ background: color-mix(in oklab, var(--foreground) 36%, transparent);
1006
+ }
1007
+ }
1008
+ @media (pointer: coarse) {
1009
+ .pmc-tlbar {
1010
+ height: 48px;
1011
+ }
1012
+ .pmc-tlbar__seg {
1013
+ min-height: 44px;
1014
+ }
1015
+ /* a one-day bar is a few pixels wide: its touch area is at least 44px wide, centred on it */
1016
+ .pmc-tlbar--drag .pmc-tlbar__seg::before {
1017
+ content: "";
1018
+ position: absolute;
1019
+ top: 0;
1020
+ bottom: 0;
1021
+ left: 50%;
1022
+ width: max(100%, 44px);
1023
+ transform: translateX(-50%);
1024
+ }
1025
+ .pmc-tlbar__end {
1026
+ width: 24px;
1027
+ }
1028
+ }
1029
+
1030
+ /* signal({ wrap: true }): the Timeline's health reason wraps inside its name cell, never cut; the dot stays on line 1 */
1031
+ .pmc-signal--wrap {
1032
+ align-items: flex-start;
1033
+ max-width: 100%;
1034
+ white-space: normal;
1035
+ overflow-wrap: anywhere;
1036
+ }
1037
+ .pmc-signal--wrap .pmc-signal__dot {
1038
+ margin-top: calc(0.5lh - 3px);
1039
+ }
1040
+ /* -- end of the Timeline bar slot (4B writes above this line) -- */
1041
+
1042
+ /* == layouts == */
1043
+
1044
+ /* the detail's entry row: a block outline button(), title and count on the left, the chevron on the right */
1045
+ .bd-entry {
1046
+ justify-content: space-between;
1047
+ gap: 10px;
1048
+ height: auto;
1049
+ min-height: 44px;
1050
+ padding: 8px 12px;
1051
+ text-align: left;
1052
+ text-transform: none;
1053
+ letter-spacing: normal;
1054
+ font-weight: 400;
1055
+ line-height: 16px;
1056
+ color: var(--foreground);
1057
+ }
1058
+ .bd-entry__title {
1059
+ margin-right: 10px;
1060
+ font-size: 12px;
1061
+ font-weight: 600;
1062
+ letter-spacing: 0.08em;
1063
+ text-transform: uppercase;
1064
+ }
1065
+ .bd-entry__meta {
1066
+ font-size: 12px;
1067
+ color: var(--muted-foreground);
1068
+ font-variant-numeric: tabular-nums;
1069
+ }
1070
+ .bd-entry-wrap--legacy {
1071
+ padding: 12px 14px 0;
1072
+ }
1073
+
1074
+ /* the pane in its tab */
1075
+ .bd-pane {
1076
+ container-type: inline-size;
1077
+ container-name: bd-pane;
1078
+ display: flex;
1079
+ flex-direction: column;
1080
+ flex: 1 1 auto;
1081
+ min-width: 0;
1082
+ min-height: 0;
1083
+ background: var(--background);
1084
+ color: var(--foreground);
1085
+ font-family: var(--sans);
1086
+ font-size: 14px;
1087
+ line-height: 20px;
1088
+ }
1089
+ .bd-head {
1090
+ display: flex;
1091
+ align-items: center;
1092
+ justify-content: space-between;
1093
+ gap: 12px;
1094
+ flex: none;
1095
+ padding: 12px 16px;
1096
+ border-bottom: 1px solid var(--border);
1097
+ }
1098
+ .bd-body {
1099
+ flex: 1 1 auto;
1100
+ min-height: 0;
1101
+ overflow: auto;
1102
+ overscroll-behavior: contain;
1103
+ padding-bottom: 48px;
1104
+ }
1105
+ .bd-note {
1106
+ padding: 16px;
1107
+ color: var(--muted-foreground);
1108
+ }
1109
+ .bd-note--error {
1110
+ color: var(--destructive);
1111
+ }
1112
+ .bd-note--flags {
1113
+ color: var(--foreground);
1114
+ border-left: 2px solid var(--warning);
1115
+ }
1116
+ .bd-flags {
1117
+ margin: 4px 0 0;
1118
+ padding-left: 16px;
1119
+ color: var(--muted-foreground);
1120
+ }
1121
+
1122
+ /* keep card (tree and Today) */
1123
+ .bd-keep {
1124
+ display: flex;
1125
+ flex-wrap: wrap;
1126
+ align-items: center;
1127
+ gap: 8px 12px;
1128
+ margin: 12px 16px;
1129
+ padding: 10px 12px;
1130
+ background: var(--muted);
1131
+ }
1132
+ .bd-keep__text {
1133
+ display: flex;
1134
+ align-items: center;
1135
+ gap: 8px;
1136
+ flex: 1 1 220px;
1137
+ min-width: 0;
1138
+ }
1139
+ .bd-keep__actions {
1140
+ display: flex;
1141
+ align-items: center;
1142
+ gap: 8px;
1143
+ flex: none;
1144
+ }
1145
+ .bd-keep--today {
1146
+ margin: 0;
1147
+ background: var(--card);
1148
+ box-shadow: 0 0 0 1px var(--border);
1149
+ }
1150
+
1151
+ /* tree */
1152
+ .bd-stage {
1153
+ display: block;
1154
+ }
1155
+ .bd-stage__head {
1156
+ display: flex;
1157
+ align-items: center;
1158
+ gap: 8px;
1159
+ min-height: 44px;
1160
+ padding: 10px 8px 6px 16px;
1161
+ border-bottom: 1px solid var(--border);
1162
+ -webkit-user-select: none;
1163
+ user-select: none;
1164
+ }
1165
+ .bd-stage__name {
1166
+ font-weight: 600;
1167
+ }
1168
+ .bd-stage__count {
1169
+ font-size: 12px;
1170
+ line-height: 16px;
1171
+ color: var(--muted-foreground);
1172
+ font-variant-numeric: tabular-nums;
1173
+ }
1174
+ .bd-stage__current {
1175
+ font-size: 11px;
1176
+ line-height: 16px;
1177
+ font-weight: 600;
1178
+ letter-spacing: 0.05em;
1179
+ text-transform: uppercase;
1180
+ color: var(--muted-foreground);
1181
+ }
1182
+ .bd-stage__toggle {
1183
+ margin-left: auto;
1184
+ }
1185
+ .bd-stage__head > .bd-trow {
1186
+ display: none;
1187
+ }
1188
+ .bd-stage__head:has(> .bd-trow) {
1189
+ background: color-mix(in oklab, var(--foreground) 5%, transparent);
1190
+ outline: 1px dashed var(--ring);
1191
+ outline-offset: -1px;
1192
+ }
1193
+ .bd-list {
1194
+ display: flex;
1195
+ flex-direction: column;
1196
+ min-height: 8px;
1197
+ }
1198
+ .bd-trow {
1199
+ padding-left: 8px;
1200
+ }
1201
+ .bd-fold {
1202
+ justify-content: flex-start;
1203
+ gap: 6px;
1204
+ height: auto;
1205
+ min-height: 36px;
1206
+ padding: 0 16px 0 52px;
1207
+ border: 0;
1208
+ border-bottom: 1px solid var(--border);
1209
+ color: var(--muted-foreground);
1210
+ font-size: 12px;
1211
+ font-weight: 400;
1212
+ line-height: 16px;
1213
+ letter-spacing: normal;
1214
+ text-transform: none;
1215
+ text-align: left;
1216
+ }
1217
+ .bd-add {
1218
+ display: flex;
1219
+ align-items: center;
1220
+ min-height: 40px;
1221
+ padding: 0 16px 0 44px;
1222
+ border-bottom: 1px solid var(--border);
1223
+ }
1224
+ .bd-add__btn {
1225
+ color: var(--muted-foreground);
1226
+ letter-spacing: 0.02em;
1227
+ text-transform: none;
1228
+ font-size: 12px;
1229
+ font-weight: 500;
1230
+ padding: 0 8px;
1231
+ }
1232
+ .bd-add__field {
1233
+ flex: 1 1 auto;
1234
+ }
1235
+ .bd-add__input {
1236
+ border-bottom: 0;
1237
+ }
1238
+
1239
+ /* board */
1240
+ .bd-board {
1241
+ display: grid;
1242
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1243
+ gap: 12px;
1244
+ padding: 16px;
1245
+ align-items: stretch;
1246
+ }
1247
+ .bd-switch {
1248
+ display: none;
1249
+ }
1250
+ .bd-col {
1251
+ display: flex;
1252
+ flex-direction: column;
1253
+ min-width: 0;
1254
+ }
1255
+ .bd-col__head {
1256
+ display: flex;
1257
+ align-items: baseline;
1258
+ gap: 8px;
1259
+ padding-bottom: 8px;
1260
+ margin-bottom: 12px;
1261
+ border-bottom: 1px solid var(--border);
1262
+ font-size: 12px;
1263
+ line-height: 16px;
1264
+ font-weight: 600;
1265
+ letter-spacing: 0.06em;
1266
+ text-transform: uppercase;
1267
+ }
1268
+ .bd-col__n {
1269
+ color: var(--muted-foreground);
1270
+ font-variant-numeric: tabular-nums;
1271
+ letter-spacing: 0;
1272
+ }
1273
+ .bd-col__list {
1274
+ display: flex;
1275
+ flex: 1 1 auto;
1276
+ flex-direction: column;
1277
+ gap: 8px;
1278
+ min-height: 120px;
1279
+ padding-bottom: 8px;
1280
+ }
1281
+ .bd-col__older {
1282
+ margin-top: -4px;
1283
+ padding: 0 2px 12px;
1284
+ font-size: 12px;
1285
+ line-height: 16px;
1286
+ color: var(--muted-foreground);
1287
+ }
1288
+ .bd-card {
1289
+ cursor: pointer;
1290
+ }
1291
+ @container bd-pane (max-width: 599px) {
1292
+ .bd-switch {
1293
+ display: flex;
1294
+ width: auto;
1295
+ margin: 16px 16px 0;
1296
+ }
1297
+ .bd-board {
1298
+ grid-template-columns: minmax(0, 1fr);
1299
+ }
1300
+ .bd-col__head {
1301
+ display: none;
1302
+ }
1303
+ .bd-col:not(.bd-col--shown) {
1304
+ display: none;
1305
+ }
1306
+ }
1307
+
1308
+ /* drag states (Sortable's classes) */
1309
+ .bd-ghost {
1310
+ opacity: 0.4;
1311
+ }
1312
+ .bd-chosen {
1313
+ background: var(--accent);
1314
+ }
1315
+ /* Sortable writes an inline opacity: 0.8 on the fallback clone (_appendGhost); only !important overrides an inline style */
1316
+ .bd-fallback,
1317
+ .bd-dragging {
1318
+ opacity: 1 !important;
1319
+ background: var(--card);
1320
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 14%, transparent),
1321
+ 0 8px 20px -6px color-mix(in oklab, var(--term-bg) 35%, transparent);
1322
+ }
1323
+
1324
+ /* item sheet */
1325
+ .bd-grid2 {
1326
+ display: grid;
1327
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1328
+ gap: 16px;
1329
+ }
1330
+ .bd-checks {
1331
+ display: flex;
1332
+ flex-wrap: wrap;
1333
+ gap: 4px 24px;
1334
+ }
1335
+ .bd-group {
1336
+ display: flex;
1337
+ flex-direction: column;
1338
+ gap: 6px;
1339
+ }
1340
+ .bd-group__label {
1341
+ font-size: 12px;
1342
+ line-height: 16px;
1343
+ font-weight: 500;
1344
+ color: var(--muted-foreground);
1345
+ }
1346
+ .bd-chips {
1347
+ display: flex;
1348
+ flex-wrap: wrap;
1349
+ gap: 4px;
1350
+ }
1351
+ .bd-chip {
1352
+ display: inline-flex;
1353
+ align-items: center;
1354
+ gap: 2px;
1355
+ min-height: 28px;
1356
+ padding-left: 8px;
1357
+ background: var(--muted);
1358
+ font-size: 12px;
1359
+ }
1360
+ .bd-after-add {
1361
+ display: flex;
1362
+ align-items: flex-end;
1363
+ gap: 8px;
1364
+ }
1365
+ .bd-after-add__field {
1366
+ flex: 1 1 auto;
1367
+ }
1368
+ .bd-muted {
1369
+ color: var(--muted-foreground);
1370
+ }
1371
+ .bd-proposed {
1372
+ display: flex;
1373
+ flex-wrap: wrap;
1374
+ align-items: center;
1375
+ justify-content: space-between;
1376
+ gap: 8px;
1377
+ font-size: 12px;
1378
+ line-height: 16px;
1379
+ }
1380
+ .bd-handoff {
1381
+ display: flex;
1382
+ flex-direction: column;
1383
+ gap: 12px;
1384
+ padding: 12px;
1385
+ background: var(--card);
1386
+ box-shadow: inset 0 0 0 1px var(--border);
1387
+ scroll-margin: 16px 0 88px;
1388
+ }
1389
+ .bd-handoff__line {
1390
+ overflow-wrap: anywhere;
1391
+ }
1392
+ .bd-handoff__actions {
1393
+ display: flex;
1394
+ align-items: center;
1395
+ gap: 8px;
1396
+ }
1397
+ .bd-handoff__details {
1398
+ font-size: 12px;
1399
+ line-height: 16px;
1400
+ color: var(--muted-foreground);
1401
+ }
1402
+ .bd-handoff__details summary {
1403
+ display: flex;
1404
+ align-items: center;
1405
+ gap: 6px;
1406
+ min-height: 32px;
1407
+ cursor: pointer;
1408
+ }
1409
+ .bd-handoff__details summary:focus-visible {
1410
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
1411
+ outline-offset: 2px;
1412
+ }
1413
+ .bd-handoff__prompt {
1414
+ margin: 8px 0 0;
1415
+ padding: 8px;
1416
+ max-height: 200px;
1417
+ overflow: auto;
1418
+ white-space: pre-wrap;
1419
+ overflow-wrap: anywhere;
1420
+ font-family: var(--mono);
1421
+ font-size: 12px;
1422
+ line-height: 16px;
1423
+ color: var(--foreground);
1424
+ background: var(--background);
1425
+ }
1426
+ .bd-handoff__facts {
1427
+ display: grid;
1428
+ grid-template-columns: auto minmax(0, 1fr);
1429
+ gap: 2px 12px;
1430
+ margin: 8px 0 0;
1431
+ }
1432
+ .bd-handoff__facts dd {
1433
+ margin: 0;
1434
+ font-family: var(--mono);
1435
+ overflow-wrap: anywhere;
1436
+ }
1437
+ .bd-handoff__error {
1438
+ color: var(--destructive);
1439
+ }
1440
+ .bd-hist__head {
1441
+ display: flex;
1442
+ align-items: center;
1443
+ gap: 6px;
1444
+ font-size: 12px;
1445
+ line-height: 16px;
1446
+ font-weight: 500;
1447
+ color: var(--muted-foreground);
1448
+ }
1449
+ .bd-hist {
1450
+ display: flex;
1451
+ flex-direction: column;
1452
+ margin: 6px 0 0;
1453
+ padding: 0;
1454
+ list-style: none;
1455
+ }
1456
+ .bd-hist__row {
1457
+ display: grid;
1458
+ grid-template-columns: minmax(64px, auto) minmax(0, 1fr) auto;
1459
+ gap: 12px;
1460
+ padding: 6px 0;
1461
+ border-bottom: 1px solid var(--border);
1462
+ font-size: 12px;
1463
+ line-height: 16px;
1464
+ }
1465
+ .bd-hist__by,
1466
+ .bd-hist__when {
1467
+ color: var(--muted-foreground);
1468
+ white-space: nowrap;
1469
+ }
1470
+
1471
+ @media (hover: hover) {
1472
+ .bd-fold:hover {
1473
+ color: var(--foreground);
1474
+ }
1475
+ }
1476
+ @media (pointer: coarse) {
1477
+ .bd-fold,
1478
+ .bd-add {
1479
+ min-height: 48px;
1480
+ }
1481
+ .bd-entry {
1482
+ min-height: 48px;
1483
+ }
1484
+ .bd-stage__head {
1485
+ min-height: 48px;
1486
+ }
1487
+ .bd-handoff__details summary {
1488
+ min-height: 44px;
1489
+ }
1490
+ }
1491
+ @media (max-width: 760px) {
1492
+ .bd-grid2 {
1493
+ gap: 12px;
1494
+ }
1495
+ }
1496
+
1497
+ /* ── one layout section per surface (pm-os-absorb seams) ──────────────────────────────────────────────────────────────
1498
+ * Runs 2 to 5 build at the same time. Each surface writes its rules directly below its own marker, with its own prefix
1499
+ * (conformance-gate.js LAYOUT_PREFIXES), and never edits another section or appends at the end of the file. A blank
1500
+ * line stays above the next marker, so two sections never touch and never merge into one conflict. */
1501
+
1502
+ /* -- layouts · .in- Initiatives: Roadmap, List, the initiative sheet (Run 2, slice 2D) -- */
1503
+
1504
+ .in-dest {
1505
+ display: flex;
1506
+ flex-direction: column;
1507
+ flex: 1 1 auto;
1508
+ min-height: 0;
1509
+ min-width: 0;
1510
+ overflow: auto;
1511
+ }
1512
+ .in-head {
1513
+ display: flex;
1514
+ align-items: center;
1515
+ flex-wrap: wrap;
1516
+ gap: 12px;
1517
+ padding: 12px 16px;
1518
+ border-bottom: 1px solid var(--border);
1519
+ }
1520
+ .in-head__title {
1521
+ flex: 1 1 auto;
1522
+ margin: 0;
1523
+ font-size: 16px;
1524
+ line-height: 24px;
1525
+ font-weight: 600;
1526
+ letter-spacing: -0.01em;
1527
+ }
1528
+ .in-body {
1529
+ display: flex;
1530
+ flex-direction: column;
1531
+ flex: 1 1 auto;
1532
+ min-height: 0;
1533
+ }
1534
+ .in-note {
1535
+ margin: 0;
1536
+ font-size: 12px;
1537
+ line-height: 16px;
1538
+ color: var(--muted-foreground);
1539
+ }
1540
+ .in-note--inline {
1541
+ padding: 8px 16px;
1542
+ }
1543
+ .in-note--error,
1544
+ .in-error {
1545
+ margin: 0;
1546
+ padding: 8px 0;
1547
+ font-size: 12px;
1548
+ line-height: 16px;
1549
+ color: var(--destructive);
1550
+ }
1551
+
1552
+ /* the Roadmap */
1553
+ .in-roadmap {
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ gap: 12px;
1557
+ padding: 12px 16px 24px;
1558
+ }
1559
+ .in-nowline {
1560
+ margin: 0;
1561
+ font-size: 12px;
1562
+ line-height: 16px;
1563
+ font-weight: 600;
1564
+ letter-spacing: 0.06em;
1565
+ text-transform: uppercase;
1566
+ font-variant-numeric: tabular-nums;
1567
+ }
1568
+ .in-cols {
1569
+ display: grid;
1570
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1571
+ gap: 12px;
1572
+ align-items: start;
1573
+ }
1574
+ .in-col {
1575
+ display: flex;
1576
+ flex-direction: column;
1577
+ gap: 8px;
1578
+ min-width: 0;
1579
+ }
1580
+ .in-col__head {
1581
+ display: flex;
1582
+ align-items: baseline;
1583
+ gap: 8px;
1584
+ padding-bottom: 8px;
1585
+ border-bottom: 1px solid var(--border);
1586
+ font-size: 12px;
1587
+ line-height: 16px;
1588
+ font-weight: 600;
1589
+ letter-spacing: 0.06em;
1590
+ text-transform: uppercase;
1591
+ }
1592
+ .in-col__count {
1593
+ color: var(--muted-foreground);
1594
+ font-variant-numeric: tabular-nums;
1595
+ letter-spacing: 0;
1596
+ }
1597
+ .in-col__empty {
1598
+ margin: 0;
1599
+ font-size: 12px;
1600
+ line-height: 16px;
1601
+ color: var(--muted-foreground);
1602
+ }
1603
+ .in-list {
1604
+ display: flex;
1605
+ flex-direction: column;
1606
+ gap: 8px;
1607
+ min-height: 24px;
1608
+ }
1609
+ .in-list--dormant {
1610
+ opacity: 0.8;
1611
+ }
1612
+ .in-card {
1613
+ cursor: pointer;
1614
+ }
1615
+ .in-grip {
1616
+ position: relative;
1617
+ z-index: 1;
1618
+ display: flex;
1619
+ align-self: stretch;
1620
+ }
1621
+
1622
+ /* the List */
1623
+ .in-list-view {
1624
+ display: flex;
1625
+ flex-direction: column;
1626
+ gap: 16px;
1627
+ padding: 12px 16px 24px;
1628
+ }
1629
+ .in-toolbar {
1630
+ display: flex;
1631
+ align-items: center;
1632
+ flex-wrap: wrap;
1633
+ gap: 8px;
1634
+ }
1635
+ .in-bulk {
1636
+ display: flex;
1637
+ align-items: center;
1638
+ flex-wrap: wrap;
1639
+ gap: 8px;
1640
+ padding: 8px 0;
1641
+ border-bottom: 1px solid var(--border);
1642
+ }
1643
+ .in-bulk__count {
1644
+ margin-right: auto;
1645
+ font-size: 12px;
1646
+ line-height: 16px;
1647
+ color: var(--muted-foreground);
1648
+ font-variant-numeric: tabular-nums;
1649
+ }
1650
+ .in-group {
1651
+ display: flex;
1652
+ flex-direction: column;
1653
+ gap: 8px;
1654
+ }
1655
+ .in-group__head {
1656
+ display: flex;
1657
+ align-items: baseline;
1658
+ gap: 8px;
1659
+ padding-bottom: 6px;
1660
+ border-bottom: 1px solid var(--border);
1661
+ }
1662
+ .in-group__name {
1663
+ font-size: 14px;
1664
+ line-height: 20px;
1665
+ font-weight: 600;
1666
+ }
1667
+ .in-group__period {
1668
+ font-size: 12px;
1669
+ line-height: 16px;
1670
+ color: var(--muted-foreground);
1671
+ }
1672
+ .in-anchor {
1673
+ display: flex;
1674
+ flex-direction: column;
1675
+ gap: 4px;
1676
+ }
1677
+ .in-anchor__head {
1678
+ display: flex;
1679
+ align-items: baseline;
1680
+ flex-wrap: wrap;
1681
+ gap: 4px 8px;
1682
+ padding: 4px 0;
1683
+ }
1684
+ .in-anchor__id {
1685
+ font-family: var(--mono);
1686
+ font-size: 12px;
1687
+ line-height: 16px;
1688
+ font-weight: 600;
1689
+ }
1690
+ .in-anchor__title {
1691
+ font-size: 12px;
1692
+ line-height: 16px;
1693
+ color: var(--muted-foreground);
1694
+ }
1695
+ .in-anchor__value {
1696
+ margin-left: auto;
1697
+ font-size: 12px;
1698
+ line-height: 16px;
1699
+ font-variant-numeric: tabular-nums;
1700
+ }
1701
+ .in-rows {
1702
+ display: flex;
1703
+ flex-direction: column;
1704
+ }
1705
+ .in-row {
1706
+ min-width: 0;
1707
+ }
1708
+ .in-attn {
1709
+ display: inline-flex;
1710
+ flex: none;
1711
+ }
1712
+
1713
+ /* the initiative sheet: about 70% of the width at a desk, the whole screen on a phone */
1714
+ .in-sheet.in-sheet {
1715
+ width: min(70vw, 100vw);
1716
+ }
1717
+ .in-sheet__crumb {
1718
+ display: flex;
1719
+ align-items: center;
1720
+ flex-wrap: wrap;
1721
+ gap: 8px;
1722
+ }
1723
+ .in-sheet__spacer {
1724
+ flex: 1 1 auto;
1725
+ }
1726
+ .in-sheet__stepper-host,
1727
+ .in-sheet__waiting-host,
1728
+ .in-sheet__tabs {
1729
+ min-width: 0;
1730
+ }
1731
+ .in-sheet__panel {
1732
+ display: flex;
1733
+ flex-direction: column;
1734
+ min-height: 160px;
1735
+ min-width: 0;
1736
+ }
1737
+ .in-sheet__rows {
1738
+ display: flex;
1739
+ flex-direction: column;
1740
+ }
1741
+ .in-stepper {
1742
+ display: flex;
1743
+ flex-wrap: wrap;
1744
+ gap: 4px 16px;
1745
+ margin: 0;
1746
+ padding: 0;
1747
+ list-style: none;
1748
+ font-size: 12px;
1749
+ line-height: 16px;
1750
+ color: var(--muted-foreground);
1751
+ }
1752
+ .in-stepper__step {
1753
+ display: inline-flex;
1754
+ align-items: center;
1755
+ gap: 4px;
1756
+ }
1757
+ .in-stepper__step[data-state="current"] {
1758
+ color: var(--foreground);
1759
+ font-weight: 600;
1760
+ }
1761
+ .in-stepper__step[data-state="done"] {
1762
+ color: var(--foreground);
1763
+ }
1764
+ .in-waiting {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ flex-wrap: wrap;
1768
+ gap: 8px 12px;
1769
+ padding: 10px 12px;
1770
+ border: 1px solid var(--border);
1771
+ }
1772
+ .in-waiting[data-on="pm"] {
1773
+ border-color: var(--ring);
1774
+ }
1775
+ .in-waiting__text {
1776
+ flex: 1 1 auto;
1777
+ min-width: 0;
1778
+ overflow-wrap: anywhere;
1779
+ }
1780
+
1781
+ /* Today cards and the Cycle review */
1782
+ .in-today-card {
1783
+ min-width: 0;
1784
+ }
1785
+ .in-cycle {
1786
+ display: flex;
1787
+ flex-direction: column;
1788
+ gap: 8px;
1789
+ }
1790
+ .in-cycle__title {
1791
+ margin: 8px 0 0;
1792
+ font-size: 12px;
1793
+ line-height: 16px;
1794
+ font-weight: 600;
1795
+ letter-spacing: 0.06em;
1796
+ text-transform: uppercase;
1797
+ }
1798
+ .in-starters {
1799
+ display: flex;
1800
+ flex-direction: column;
1801
+ align-items: flex-start;
1802
+ gap: 8px;
1803
+ padding: 8px 16px;
1804
+ }
1805
+ .in-starters__list {
1806
+ margin: 0;
1807
+ padding-left: 16px;
1808
+ font-size: 12px;
1809
+ line-height: 16px;
1810
+ }
1811
+
1812
+ /* The ⋯ button is the phone's path to the card menu; on a desk the menu opens from the context menu (right click, menu key). */
1813
+ .in-more {
1814
+ display: none;
1815
+ }
1816
+ @media (any-pointer: coarse) {
1817
+ .in-more {
1818
+ display: inline-flex;
1819
+ }
1820
+ .in-hint {
1821
+ display: none;
1822
+ }
1823
+ }
1824
+ @media (hover: hover) {
1825
+ .in-card:hover {
1826
+ background: color-mix(in oklab, var(--foreground) 4%, transparent);
1827
+ }
1828
+ }
1829
+ @media (pointer: coarse) {
1830
+ .in-card {
1831
+ min-height: 48px;
1832
+ }
1833
+ .in-anchor__head {
1834
+ min-height: 44px;
1835
+ }
1836
+ }
1837
+ @media (max-width: 760px) {
1838
+ .in-cols {
1839
+ grid-template-columns: minmax(0, 1fr);
1840
+ }
1841
+ .in-head,
1842
+ .in-roadmap,
1843
+ .in-list-view {
1844
+ padding-left: 16px;
1845
+ padding-right: 16px;
1846
+ }
1847
+ .in-sheet.in-sheet {
1848
+ inset: 0;
1849
+ width: 100vw;
1850
+ height: 100dvh;
1851
+ max-height: none;
1852
+ }
1853
+ }
1854
+
1855
+
1856
+ /* -- layouts · .fr- the frame: top bar, dock, Settings (Run 3, slice 3A) -- */
1857
+ /* The frame's root: the top bar over the body. app.js drops the cockpit's inline geometry when the frame is on. */
1858
+ .fr-root {
1859
+ display: grid;
1860
+ grid-template-rows: 48px minmax(0, 1fr);
1861
+ height: 100vh;
1862
+ overflow: hidden;
1863
+ background: var(--background);
1864
+ color: var(--foreground);
1865
+ font-family: var(--sans);
1866
+ font-size: 14px;
1867
+ line-height: 1.45;
1868
+ }
1869
+ .fr-end {
1870
+ display: none;
1871
+ }
1872
+ .fr-bar {
1873
+ display: flex;
1874
+ align-items: center;
1875
+ gap: 8px;
1876
+ min-width: 0;
1877
+ padding: 0 16px;
1878
+ border-bottom: 1px solid var(--border);
1879
+ }
1880
+ .fr-bar__repo {
1881
+ display: flex;
1882
+ flex: none;
1883
+ min-width: 0;
1884
+ max-width: 240px;
1885
+ }
1886
+ .fr-repo {
1887
+ max-width: 100%;
1888
+ font-weight: 600;
1889
+ }
1890
+ .fr-nav {
1891
+ display: flex;
1892
+ align-items: center;
1893
+ gap: 2px;
1894
+ min-width: 0;
1895
+ }
1896
+ .fr-link {
1897
+ color: var(--muted-foreground);
1898
+ }
1899
+ .fr-link[aria-current="page"] {
1900
+ color: var(--foreground);
1901
+ box-shadow: inset 0 -2px 0 var(--foreground);
1902
+ }
1903
+ .fr-mark {
1904
+ display: inline-flex;
1905
+ align-items: center;
1906
+ gap: 4px;
1907
+ }
1908
+ .fr-mark[hidden] {
1909
+ display: none;
1910
+ }
1911
+ .fr-search {
1912
+ margin-left: auto;
1913
+ min-width: 220px;
1914
+ justify-content: flex-start;
1915
+ color: var(--muted-foreground);
1916
+ }
1917
+ .fr-kbd {
1918
+ margin-left: auto;
1919
+ font-family: var(--mono);
1920
+ font-size: 11px;
1921
+ }
1922
+ /* The body: the destination, then (when open) the detail, the dock's rail and the dock. One row, columns in order. */
1923
+ .fr-body {
1924
+ display: grid;
1925
+ grid-auto-flow: column;
1926
+ grid-template-columns: minmax(0, 1fr);
1927
+ grid-auto-columns: auto;
1928
+ grid-template-rows: minmax(0, 1fr);
1929
+ min-width: 0;
1930
+ min-height: 0;
1931
+ overflow: hidden;
1932
+ }
1933
+ .fr-main {
1934
+ display: flex;
1935
+ flex-direction: column;
1936
+ min-width: 0;
1937
+ min-height: 0;
1938
+ overflow: hidden;
1939
+ }
1940
+ .fr-dest {
1941
+ flex: 1;
1942
+ min-width: 0;
1943
+ min-height: 0;
1944
+ overflow-y: auto;
1945
+ }
1946
+ .fr-dest[hidden] {
1947
+ display: none;
1948
+ }
1949
+ .fr-detail {
1950
+ display: flex;
1951
+ flex-direction: column;
1952
+ width: min(470px, 36vw);
1953
+ min-height: 0;
1954
+ border-left: 1px solid var(--border);
1955
+ background: var(--sidebar);
1956
+ }
1957
+ .fr-detail[hidden] {
1958
+ display: none;
1959
+ }
1960
+ .fr-detail__bar {
1961
+ display: flex;
1962
+ justify-content: flex-end;
1963
+ flex: none;
1964
+ padding: 4px 8px;
1965
+ border-bottom: 1px solid var(--border);
1966
+ }
1967
+ .fr-detail > #pm-detail {
1968
+ flex: 1;
1969
+ }
1970
+ .fr-dock-rail {
1971
+ display: flex;
1972
+ flex-direction: column;
1973
+ align-items: center;
1974
+ width: 44px;
1975
+ padding-top: 8px;
1976
+ border-left: 1px solid var(--border);
1977
+ background: var(--sidebar);
1978
+ }
1979
+ .fr-dock {
1980
+ width: var(--fr-dock-w, clamp(360px, 36vw, 640px));
1981
+ max-width: calc(100vw - 280px);
1982
+ border-left: 1px solid var(--border);
1983
+ }
1984
+ /* 0.53.1: while the dock is open its rail is a thin grip on the dock's left edge that resizes it (dock.js dockGrip). */
1985
+ .fr-dock-grip {
1986
+ display: none;
1987
+ }
1988
+ .fr-body[data-fr-dock="open"] > .fr-dock-rail {
1989
+ width: 6px;
1990
+ padding: 0;
1991
+ border-left: 0;
1992
+ align-items: stretch;
1993
+ background: transparent;
1994
+ }
1995
+ .fr-body[data-fr-dock="open"] > .fr-dock-rail > :not(.fr-dock-grip) {
1996
+ display: none;
1997
+ }
1998
+ .fr-body[data-fr-dock="open"] .fr-dock-grip {
1999
+ display: block;
2000
+ flex: 1;
2001
+ cursor: col-resize;
2002
+ touch-action: none;
2003
+ outline: none;
2004
+ }
2005
+ /* The grip shows a 1px line without hover (a touch screen has none); a press, a drag or the keyboard focus fills it. */
2006
+ .fr-body[data-fr-dock="open"] .fr-dock-grip {
2007
+ border-left: 1px solid var(--border);
2008
+ }
2009
+ .fr-dock-grip:focus-visible,
2010
+ .fr-dock-grip[data-dragging] {
2011
+ background: var(--ring);
2012
+ }
2013
+ @media (hover: hover) {
2014
+ .fr-dock-grip:hover {
2015
+ background: var(--ring);
2016
+ }
2017
+ }
2018
+ /* 0.53.1 Focus: the dock has the whole window; the page, the detail and the rail step aside (they stay mounted). */
2019
+ .fr-body[data-fr-dock="max"] > .fr-main,
2020
+ .fr-body[data-fr-dock="max"] > .fr-detail,
2021
+ .fr-body[data-fr-dock="max"] > .fr-dock-rail {
2022
+ display: none;
2023
+ }
2024
+ .fr-body[data-fr-dock="max"] > .fr-dock {
2025
+ width: auto;
2026
+ max-width: none;
2027
+ border-left: 0;
2028
+ }
2029
+ .fr-body[data-fr-dock="rail"] > .fr-dock {
2030
+ display: none !important;
2031
+ }
2032
+ /* The pinned ⌘K on a phone. .pmc-btn--block sets width: 100%, which with the side margins runs 32px past the place
2033
+ * (and .fr-main clips it). The column's stretch gives the width inside the margins. */
2034
+ .fr-pin {
2035
+ flex: none;
2036
+ align-self: stretch;
2037
+ width: auto;
2038
+ justify-content: flex-start;
2039
+ margin: 12px 16px 0;
2040
+ color: var(--muted-foreground);
2041
+ }
2042
+ /* Settings: one column of five sections. */
2043
+ .fr-set {
2044
+ display: flex;
2045
+ flex-direction: column;
2046
+ gap: 24px;
2047
+ max-width: 720px;
2048
+ padding: 24px 16px 48px;
2049
+ }
2050
+ .fr-set__intro {
2051
+ display: flex;
2052
+ flex-direction: column;
2053
+ gap: 4px;
2054
+ }
2055
+ .fr-set__h1 {
2056
+ margin: 0;
2057
+ font-size: 20px;
2058
+ font-weight: 600;
2059
+ }
2060
+ .fr-set__note {
2061
+ margin: 0;
2062
+ color: var(--muted-foreground);
2063
+ font-size: 12px;
2064
+ }
2065
+ .fr-set__section {
2066
+ display: flex;
2067
+ flex-direction: column;
2068
+ gap: 8px;
2069
+ }
2070
+ .fr-set__head {
2071
+ display: flex;
2072
+ align-items: center;
2073
+ justify-content: space-between;
2074
+ gap: 8px;
2075
+ min-height: 32px;
2076
+ }
2077
+ .fr-set__title {
2078
+ margin: 0;
2079
+ font-size: 14px;
2080
+ font-weight: 600;
2081
+ }
2082
+ .fr-set__fields {
2083
+ display: flex;
2084
+ flex-wrap: wrap;
2085
+ gap: 16px;
2086
+ }
2087
+ .fr-set__line {
2088
+ display: flex;
2089
+ align-items: center;
2090
+ justify-content: space-between;
2091
+ gap: 12px;
2092
+ }
2093
+ .fr-set__add {
2094
+ padding: 12px 0;
2095
+ }
2096
+ @media (max-width: 760px) {
2097
+ .fr-detail,
2098
+ .fr-dock {
2099
+ width: auto;
2100
+ max-width: none;
2101
+ border-left: 0;
2102
+ }
2103
+ .fr-set {
2104
+ padding: 16px 16px 48px;
2105
+ }
2106
+ }
2107
+ @media (pointer: coarse) {
2108
+ .fr-set__head {
2109
+ min-height: 44px;
2110
+ }
2111
+ /* The dock's own strip and bottom bar (panel-tabs.js) size their controls inline at 22-30px; under touch each is a
2112
+ * 44px target. The strip's fixed height yields to them. */
2113
+ .fr-dock [data-tabs="bar"] {
2114
+ height: auto !important;
2115
+ }
2116
+ .fr-dock [data-tabs="bar"] button,
2117
+ .fr-dock [data-tabs="bottom"] button {
2118
+ min-width: 44px !important;
2119
+ min-height: 44px !important;
2120
+ }
2121
+ }
2122
+
2123
+ /* -- layouts · .td- Today (Run 3, slice 3B) -- */
2124
+ .td-board {
2125
+ display: flex;
2126
+ flex-direction: column;
2127
+ gap: 12px;
2128
+ max-width: 720px;
2129
+ margin: 0 auto;
2130
+ padding: 16px;
2131
+ }
2132
+ .td-head {
2133
+ display: flex;
2134
+ flex-wrap: wrap;
2135
+ align-items: center;
2136
+ justify-content: space-between;
2137
+ gap: 8px 16px;
2138
+ }
2139
+ .td-count {
2140
+ margin: 0;
2141
+ font-size: 20px;
2142
+ line-height: 28px;
2143
+ font-weight: 600;
2144
+ color: var(--foreground);
2145
+ }
2146
+ .td-list {
2147
+ display: flex;
2148
+ flex-direction: column;
2149
+ gap: 8px;
2150
+ }
2151
+ /* today-goals (G6): the goals for today, above what is owed */
2152
+ .td-goals {
2153
+ display: flex;
2154
+ flex-direction: column;
2155
+ gap: 8px;
2156
+ padding: 8px 12px;
2157
+ border: 1px solid var(--border);
2158
+ background: var(--card);
2159
+ }
2160
+ .td-goals__head { display: flex; align-items: center; }
2161
+ .td-goals__list, .td-goal__steps, .td-goal__ctx-list {
2162
+ list-style: none;
2163
+ margin: 0;
2164
+ padding: 0;
2165
+ display: flex;
2166
+ flex-direction: column;
2167
+ gap: 6px;
2168
+ }
2169
+ .td-goals__list { counter-reset: goal; }
2170
+ .td-goal { display: flex; flex-direction: column; gap: 4px; }
2171
+ .td-goal__head { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
2172
+ .td-goal__text { color: var(--foreground); font-weight: 500; }
2173
+ .td-goal__text::before { counter-increment: goal; content: counter(goal) ". "; color: var(--muted-foreground); }
2174
+ .td-goal--closed .td-goal__text { color: var(--muted-foreground); text-decoration: line-through; }
2175
+ .td-goal__ctrls { display: inline-flex; gap: 4px; margin-left: auto; }
2176
+ .td-goal__body { display: flex; flex-direction: column; gap: 4px; padding-left: 16px; }
2177
+ .td-goal__step { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
2178
+ .td-goal__step-title { color: var(--foreground); }
2179
+ .td-goal__meta, .td-goal__ctx, .td-goal__none, .td-goals__note, .td-goal__prep-text {
2180
+ color: var(--muted-foreground);
2181
+ font-size: 12px;
2182
+ line-height: 16px;
2183
+ margin: 0;
2184
+ }
2185
+ .td-goal__prep { display: inline-flex; align-items: center; gap: 8px; }
2186
+ .td-goals__bar { display: flex; gap: 8px; }
2187
+ .td-goals__sub { margin: 4px 0 0; font-size: 12px; font-weight: 600; color: var(--muted-foreground); }
2188
+ .td-card {
2189
+ display: flex;
2190
+ flex-direction: column;
2191
+ gap: 8px;
2192
+ min-width: 0;
2193
+ padding: 10px 12px;
2194
+ border-radius: 0;
2195
+ background: var(--card);
2196
+ color: var(--foreground);
2197
+ box-shadow: 0 0 0 1px var(--border);
2198
+ }
2199
+ .td-card[hidden] {
2200
+ display: none;
2201
+ }
2202
+ .td-card--host {
2203
+ padding: 0;
2204
+ box-shadow: none;
2205
+ background: transparent;
2206
+ }
2207
+ .td-card__host {
2208
+ display: flex;
2209
+ align-items: flex-start;
2210
+ gap: 4px;
2211
+ min-width: 0;
2212
+ }
2213
+ .td-card__face {
2214
+ flex: 1 1 auto;
2215
+ min-width: 0;
2216
+ }
2217
+ .td-card__host > [data-today-more] {
2218
+ flex: none;
2219
+ }
2220
+ .td-card__top {
2221
+ display: flex;
2222
+ flex-wrap: wrap;
2223
+ align-items: center;
2224
+ gap: 8px 12px;
2225
+ }
2226
+ .td-card__text {
2227
+ display: flex;
2228
+ flex: 1 1 220px;
2229
+ flex-direction: column;
2230
+ gap: 2px;
2231
+ min-width: 0;
2232
+ }
2233
+ .td-card__cause {
2234
+ display: flex;
2235
+ align-items: center;
2236
+ gap: 8px;
2237
+ font-size: 14px;
2238
+ line-height: 20px;
2239
+ font-weight: 500;
2240
+ overflow-wrap: anywhere;
2241
+ }
2242
+ .td-card__evidence {
2243
+ padding-left: 14px;
2244
+ font-size: 12px;
2245
+ line-height: 16px;
2246
+ color: var(--muted-foreground);
2247
+ overflow-wrap: anywhere;
2248
+ }
2249
+ .td-card__acts {
2250
+ display: flex;
2251
+ flex: none;
2252
+ align-items: center;
2253
+ gap: 4px;
2254
+ }
2255
+ .td-accept {
2256
+ display: flex;
2257
+ flex-direction: column;
2258
+ align-items: flex-start;
2259
+ gap: 8px;
2260
+ padding-top: 8px;
2261
+ border-top: 1px solid var(--border);
2262
+ }
2263
+ .td-accept__line,
2264
+ .td-accept__q {
2265
+ margin: 0;
2266
+ font-size: 14px;
2267
+ line-height: 20px;
2268
+ }
2269
+ .td-accept__ask {
2270
+ display: flex;
2271
+ flex-wrap: wrap;
2272
+ align-items: center;
2273
+ gap: 8px 12px;
2274
+ }
2275
+ .td-accept__acts {
2276
+ display: flex;
2277
+ flex-wrap: wrap;
2278
+ gap: 8px;
2279
+ }
2280
+ .td-accept__error {
2281
+ margin: 0;
2282
+ font-size: 12px;
2283
+ line-height: 16px;
2284
+ color: var(--destructive);
2285
+ }
2286
+ .td-health {
2287
+ padding: 8px 12px;
2288
+ border-radius: 0;
2289
+ background: var(--muted);
2290
+ box-shadow: inset 2px 0 0 var(--warning);
2291
+ font-size: 12px;
2292
+ line-height: 16px;
2293
+ }
2294
+ .td-health__title {
2295
+ margin: 0 0 4px;
2296
+ font-weight: 600;
2297
+ }
2298
+ .td-health__list {
2299
+ margin: 0;
2300
+ padding-left: 16px;
2301
+ color: var(--muted-foreground);
2302
+ overflow-wrap: anywhere;
2303
+ }
2304
+ @media (max-width: 560px) {
2305
+ .td-board {
2306
+ padding: 12px 16px;
2307
+ }
2308
+ .td-card__acts {
2309
+ margin-left: auto;
2310
+ }
2311
+ }
2312
+
2313
+ /* -- layouts · .pl- the command palette and capture (Run 3, slice 3C) -- */
2314
+ .pl-list {
2315
+ display: flex;
2316
+ flex-direction: column;
2317
+ max-height: 50vh;
2318
+ overflow-y: auto;
2319
+ overscroll-behavior: contain;
2320
+ }
2321
+ .pl-item[aria-selected="true"] {
2322
+ background: var(--accent);
2323
+ }
2324
+ .pl-cli {
2325
+ font-family: var(--mono);
2326
+ font-size: 12px;
2327
+ line-height: 16px;
2328
+ color: var(--muted-foreground);
2329
+ }
2330
+ .pl-note {
2331
+ margin: 0;
2332
+ font-size: 14px;
2333
+ line-height: 20px;
2334
+ color: var(--muted-foreground);
2335
+ }
2336
+ .pl-note--error {
2337
+ color: var(--destructive);
2338
+ }
2339
+ /* the terminal's compose line (phone): one message field and Send, in the bottom bar */
2340
+ .pl-compose {
2341
+ display: flex;
2342
+ align-items: flex-end;
2343
+ gap: 8px;
2344
+ flex: 1 1 auto;
2345
+ min-width: 0;
2346
+ }
2347
+ .pl-compose__field {
2348
+ flex: 1 1 auto;
2349
+ min-width: 0;
2350
+ }
2351
+ .pl-compose__input {
2352
+ height: 44px;
2353
+ min-height: 44px;
2354
+ resize: none;
2355
+ }
2356
+
2357
+ /* -- layouts · .tl- Breakdown › Timeline (Run 4, slice 4B) -- */
2358
+ /* the chart scrolls sideways inside itself only; the name column stays put while it scrolls */
2359
+ .tl-hint {
2360
+ margin: 0 0 8px;
2361
+ padding: 0 16px;
2362
+ font-size: 12px;
2363
+ line-height: 16px;
2364
+ color: var(--muted-foreground);
2365
+ }
2366
+ .tl-scroll {
2367
+ max-width: 100%;
2368
+ overflow-x: auto;
2369
+ overscroll-behavior-x: contain;
2370
+ -webkit-overflow-scrolling: touch;
2371
+ }
2372
+ .tl-chart {
2373
+ position: relative;
2374
+ min-width: 640px;
2375
+ }
2376
+ .tl-row {
2377
+ display: grid;
2378
+ grid-template-columns: 216px minmax(0, 1fr);
2379
+ align-items: center;
2380
+ min-height: 36px;
2381
+ padding-right: 16px;
2382
+ border-bottom: 1px solid var(--border);
2383
+ }
2384
+ .tl-row--head {
2385
+ min-height: 40px;
2386
+ align-items: end;
2387
+ }
2388
+ .tl-name {
2389
+ position: sticky;
2390
+ left: 0;
2391
+ z-index: 1;
2392
+ display: flex;
2393
+ flex-direction: column;
2394
+ justify-content: center;
2395
+ align-self: stretch;
2396
+ min-width: 0;
2397
+ padding: 4px 12px 4px 16px;
2398
+ background: var(--background);
2399
+ }
2400
+ .tl-title {
2401
+ overflow: hidden;
2402
+ font-size: 14px;
2403
+ line-height: 20px;
2404
+ white-space: nowrap;
2405
+ text-overflow: ellipsis;
2406
+ }
2407
+ .tl-row--all .tl-title,
2408
+ .tl-row--stage .tl-title {
2409
+ font-size: 12px;
2410
+ line-height: 16px;
2411
+ font-weight: 600;
2412
+ letter-spacing: 0.04em;
2413
+ text-transform: uppercase;
2414
+ color: var(--muted-foreground);
2415
+ }
2416
+ .tl-meta {
2417
+ overflow: hidden;
2418
+ font-size: 12px;
2419
+ line-height: 16px;
2420
+ white-space: nowrap;
2421
+ text-overflow: ellipsis;
2422
+ color: var(--muted-foreground);
2423
+ }
2424
+ /* the health reason (R8) and "Proposed": each on its own line under the dates, wrapped, never cut */
2425
+ .tl-flag {
2426
+ display: flex;
2427
+ flex-direction: column;
2428
+ align-items: flex-start;
2429
+ gap: 2px;
2430
+ font-size: 12px;
2431
+ line-height: 16px;
2432
+ }
2433
+ .tl-track {
2434
+ position: relative;
2435
+ min-width: 0;
2436
+ }
2437
+ .tl-axis {
2438
+ position: relative;
2439
+ height: 40px;
2440
+ }
2441
+ .tl-month,
2442
+ .tl-today {
2443
+ position: absolute;
2444
+ bottom: 4px;
2445
+ left: var(--tl-x, 0);
2446
+ font-size: 11px;
2447
+ line-height: 16px;
2448
+ white-space: nowrap;
2449
+ }
2450
+ .tl-month {
2451
+ padding-left: 4px;
2452
+ border-left: 1px solid var(--border);
2453
+ color: var(--muted-foreground);
2454
+ }
2455
+ /* the today label is on its own line above the month labels, so the two never cover each other. It starts at its line,
2456
+ * or ends at it in the second half of the axis */
2457
+ .tl-today {
2458
+ bottom: 22px;
2459
+ padding-left: 4px;
2460
+ border-left: 1px solid var(--foreground);
2461
+ font-weight: 600;
2462
+ color: var(--foreground);
2463
+ }
2464
+ .tl-today--end {
2465
+ padding: 0 4px 0 0;
2466
+ border-left: 0;
2467
+ border-right: 1px solid var(--foreground);
2468
+ transform: translateX(calc(-100% + 1px));
2469
+ }
2470
+ .tl-note {
2471
+ margin: 8px 0 0;
2472
+ padding: 0 16px;
2473
+ font-size: 12px;
2474
+ line-height: 16px;
2475
+ color: var(--muted-foreground);
2476
+ }
2477
+ @media (pointer: coarse) {
2478
+ .tl-row {
2479
+ min-height: 48px;
2480
+ }
2481
+ }
2482
+ @media (max-width: 760px) {
2483
+ .tl-row {
2484
+ grid-template-columns: 144px minmax(0, 1fr);
2485
+ }
2486
+ }
2487
+
2488
+ /* -- layouts · .tl-init- Initiatives › Timeline (Run 4, slice 4C) -- */
2489
+
2490
+ .tl-init-root {
2491
+ --tl-init-name: 360px;
2492
+ --tl-init-mw: 96px;
2493
+ display: flex;
2494
+ flex-direction: column;
2495
+ gap: 24px;
2496
+ min-width: 0;
2497
+ padding: 0 0 24px;
2498
+ background: var(--background);
2499
+ color: var(--foreground);
2500
+ font-family: var(--sans);
2501
+ font-size: 14px;
2502
+ line-height: 20px;
2503
+ }
2504
+ /* only the chart scrolls sideways: the page never does */
2505
+ .tl-init-chart {
2506
+ position: relative;
2507
+ overflow-x: auto;
2508
+ overflow-y: hidden;
2509
+ overscroll-behavior-x: contain;
2510
+ container-type: inline-size;
2511
+ border-top: 1px solid var(--border);
2512
+ border-bottom: 1px solid var(--border);
2513
+ }
2514
+ .tl-init-chart:focus-visible {
2515
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
2516
+ outline-offset: -2px;
2517
+ }
2518
+ .tl-init-inner {
2519
+ position: relative;
2520
+ width: max(100%, calc(var(--tl-init-name) + var(--tl-init-months) * var(--tl-init-mw)));
2521
+ }
2522
+ .tl-init-head,
2523
+ .tl-init-group,
2524
+ .tl-init-row {
2525
+ display: grid;
2526
+ grid-template-columns: var(--tl-init-name) minmax(0, 1fr);
2527
+ border-bottom: 1px solid var(--border);
2528
+ }
2529
+ .tl-init-head {
2530
+ height: 32px;
2531
+ align-items: end;
2532
+ }
2533
+ .tl-init-months {
2534
+ display: grid;
2535
+ grid-template-columns: var(--tl-init-cols);
2536
+ height: 100%;
2537
+ }
2538
+ .tl-init-month {
2539
+ align-self: end;
2540
+ padding: 0 0 6px 6px;
2541
+ border-left: 1px solid var(--border);
2542
+ color: var(--muted-foreground);
2543
+ font-size: 12px;
2544
+ line-height: 16px;
2545
+ white-space: nowrap;
2546
+ }
2547
+ /* the name of a row stays at the left edge while the months scroll under it */
2548
+ .tl-init-corner,
2549
+ .tl-init-gname,
2550
+ .tl-init-name {
2551
+ position: sticky;
2552
+ left: 0;
2553
+ z-index: 2;
2554
+ background: var(--background);
2555
+ }
2556
+ .tl-init-gname {
2557
+ padding: 12px 8px 4px 16px;
2558
+ color: var(--foreground);
2559
+ font-size: 12px;
2560
+ font-weight: 600;
2561
+ line-height: 16px;
2562
+ }
2563
+ .tl-init-name {
2564
+ min-width: 0;
2565
+ border-bottom: 0;
2566
+ }
2567
+ /* a row with no stages keeps the place ▸ would take, so every title starts at the same left edge */
2568
+ .tl-init-lead-gap {
2569
+ flex: none;
2570
+ width: 28px;
2571
+ }
2572
+ .tl-init-sub {
2573
+ display: flex;
2574
+ align-items: center;
2575
+ min-height: 32px;
2576
+ padding: 0 8px 0 76px;
2577
+ color: var(--muted-foreground);
2578
+ font-size: 12px;
2579
+ line-height: 16px;
2580
+ }
2581
+ .tl-init-row--stage {
2582
+ min-height: 32px;
2583
+ }
2584
+ .tl-init-track {
2585
+ position: relative;
2586
+ display: flex;
2587
+ align-items: center;
2588
+ min-height: 36px;
2589
+ min-width: 0;
2590
+ }
2591
+ .tl-init-sub__none {
2592
+ padding-left: 8px;
2593
+ color: var(--muted-foreground);
2594
+ font-size: 12px;
2595
+ line-height: 16px;
2596
+ }
2597
+ .tl-init-list {
2598
+ display: flex;
2599
+ flex-direction: column;
2600
+ min-height: 8px;
2601
+ }
2602
+ /* the line for today, over the month columns only */
2603
+ .tl-init-plot {
2604
+ position: absolute;
2605
+ top: 0;
2606
+ bottom: 0;
2607
+ left: var(--tl-init-name);
2608
+ right: 0;
2609
+ z-index: 1;
2610
+ pointer-events: none;
2611
+ }
2612
+ .tl-init-today {
2613
+ position: absolute;
2614
+ top: 0;
2615
+ bottom: 0;
2616
+ left: var(--tl-init-today);
2617
+ border-left: 2px solid var(--foreground);
2618
+ }
2619
+ .tl-init-today__label {
2620
+ position: absolute;
2621
+ top: 2px;
2622
+ left: 4px;
2623
+ padding: 0 4px;
2624
+ background: var(--background);
2625
+ color: var(--foreground);
2626
+ font-size: 11px;
2627
+ line-height: 16px;
2628
+ }
2629
+ /* the initiatives with no dated item: names only, in the order they carry */
2630
+ .tl-init-undated {
2631
+ display: flex;
2632
+ flex-direction: column;
2633
+ min-width: 0;
2634
+ }
2635
+ .tl-init-undated__title {
2636
+ margin: 0;
2637
+ padding: 0 16px;
2638
+ color: var(--foreground);
2639
+ font-size: 14px;
2640
+ font-weight: 600;
2641
+ line-height: 20px;
2642
+ }
2643
+ .tl-init-undated__note {
2644
+ margin: 0;
2645
+ padding: 4px 16px 8px;
2646
+ color: var(--muted-foreground);
2647
+ font-size: 12px;
2648
+ line-height: 16px;
2649
+ }
2650
+ .tl-init-undated .tl-init-row {
2651
+ display: block;
2652
+ }
2653
+ .tl-init-undated .tl-init-name {
2654
+ position: static;
2655
+ max-width: 480px;
2656
+ }
2657
+ .tl-init-note {
2658
+ margin: 0;
2659
+ padding: 0 16px;
2660
+ color: var(--muted-foreground);
2661
+ font-size: 12px;
2662
+ line-height: 16px;
2663
+ }
2664
+ /* drag states (Sortable's classes) */
2665
+ .tl-init-ghost {
2666
+ opacity: 0.4;
2667
+ }
2668
+ .tl-init-chosen .tl-init-name {
2669
+ background: var(--accent);
2670
+ }
2671
+ /* Sortable writes an inline opacity: 0.8 on the fallback clone; only !important overrides an inline style */
2672
+ .tl-init-fallback,
2673
+ .tl-init-dragging {
2674
+ opacity: 1 !important;
2675
+ background: var(--card);
2676
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 14%, transparent),
2677
+ 0 8px 20px -6px color-mix(in oklab, var(--term-bg) 35%, transparent);
2678
+ }
2679
+ /* a phone: each row is its name over its months, and the name is as wide as the chart's box */
2680
+ @media (max-width: 760px) {
2681
+ .tl-init-inner {
2682
+ width: max(100%, calc(var(--tl-init-months) * var(--tl-init-mw)));
2683
+ }
2684
+ .tl-init-head,
2685
+ .tl-init-group,
2686
+ .tl-init-row {
2687
+ display: block;
2688
+ }
2689
+ .tl-init-corner {
2690
+ display: none;
2691
+ }
2692
+ .tl-init-gname,
2693
+ .tl-init-name {
2694
+ width: 100cqw;
2695
+ }
2696
+ .tl-init-sub {
2697
+ padding-left: 60px;
2698
+ }
2699
+ .tl-init-plot {
2700
+ left: 0;
2701
+ }
2702
+ }
2703
+ @media (pointer: coarse) {
2704
+ .tl-init-sub,
2705
+ .tl-init-row--stage {
2706
+ min-height: 44px;
2707
+ }
2708
+ .tl-init-lead-gap {
2709
+ width: 44px;
2710
+ }
2711
+ }
2712
+
2713
+ /* -- layouts · .bo- Board (Run 4, slice 4D) -- */
2714
+ .bo-head {
2715
+ flex-wrap: wrap;
2716
+ }
2717
+ .bo-head__filters {
2718
+ display: flex;
2719
+ align-items: center;
2720
+ flex-wrap: wrap;
2721
+ gap: 8px;
2722
+ min-width: 0;
2723
+ }
2724
+ .bo-head__pick {
2725
+ min-width: 160px;
2726
+ }
2727
+ .bo-head__end {
2728
+ display: flex;
2729
+ align-items: center;
2730
+ gap: 12px;
2731
+ margin-left: auto;
2732
+ }
2733
+ .bo-head__n {
2734
+ color: var(--muted-foreground);
2735
+ font-size: 12px;
2736
+ line-height: 16px;
2737
+ font-variant-numeric: tabular-nums;
2738
+ }
2739
+ .bo-releases {
2740
+ display: flex;
2741
+ flex-direction: column;
2742
+ gap: 4px;
2743
+ margin: 16px 16px 0;
2744
+ padding: 12px;
2745
+ border: 1px solid var(--border);
2746
+ border-radius: 0;
2747
+ }
2748
+ .bo-releases__head {
2749
+ font-size: 12px;
2750
+ line-height: 16px;
2751
+ font-weight: 600;
2752
+ letter-spacing: 0.06em;
2753
+ text-transform: uppercase;
2754
+ }
2755
+ .bo-releases__note {
2756
+ color: var(--muted-foreground);
2757
+ font-size: 12px;
2758
+ line-height: 16px;
2759
+ }
2760
+ .bo-rel {
2761
+ display: flex;
2762
+ align-items: center;
2763
+ justify-content: space-between;
2764
+ gap: 12px;
2765
+ padding: 8px 0;
2766
+ border-top: 1px solid var(--border);
2767
+ }
2768
+ .bo-rel--today {
2769
+ padding: 10px 12px;
2770
+ border: 1px solid var(--border);
2771
+ border-radius: 0;
2772
+ background: var(--card);
2773
+ }
2774
+ .bo-rel__main {
2775
+ flex: 1 1 auto;
2776
+ min-width: 0;
2777
+ }
2778
+ .bo-rel__title {
2779
+ font-weight: 600;
2780
+ overflow-wrap: anywhere;
2781
+ }
2782
+ .bo-rel__meta,
2783
+ .bo-rel__wait {
2784
+ color: var(--muted-foreground);
2785
+ font-size: 12px;
2786
+ line-height: 16px;
2787
+ overflow-wrap: anywhere;
2788
+ }
2789
+ .bo-card__note {
2790
+ padding: 0 12px 8px;
2791
+ color: var(--warning);
2792
+ font-size: 12px;
2793
+ line-height: 16px;
2794
+ }
2795
+ @media (pointer: coarse) {
2796
+ .bo-rel {
2797
+ min-height: 48px;
2798
+ }
2799
+ .bo-head__pick {
2800
+ min-width: 0;
2801
+ flex: 1 1 160px;
2802
+ }
2803
+ }
2804
+
2805
+ /* -- layouts · .rp- Reports (Run 5, slice 5C) -- */
2806
+ .rp-page {
2807
+ container-type: inline-size;
2808
+ display: flex;
2809
+ flex-direction: column;
2810
+ flex: 1 1 auto;
2811
+ gap: 16px;
2812
+ min-width: 0;
2813
+ min-height: 100%;
2814
+ padding: 16px;
2815
+ background: var(--background);
2816
+ color: var(--foreground);
2817
+ }
2818
+ .rp-head {
2819
+ display: flex;
2820
+ align-items: center;
2821
+ justify-content: space-between;
2822
+ gap: 12px;
2823
+ }
2824
+ .rp-head__title {
2825
+ margin: 0;
2826
+ font-size: 20px;
2827
+ line-height: 28px;
2828
+ font-weight: 500;
2829
+ }
2830
+ .rp-cols {
2831
+ display: grid;
2832
+ grid-template-columns: minmax(0, 1fr);
2833
+ gap: 16px;
2834
+ }
2835
+ .rp-col {
2836
+ display: flex;
2837
+ flex-direction: column;
2838
+ gap: 16px;
2839
+ min-width: 0;
2840
+ }
2841
+ .rp-section {
2842
+ display: flex;
2843
+ flex-direction: column;
2844
+ align-items: flex-start;
2845
+ gap: 8px;
2846
+ min-width: 0;
2847
+ }
2848
+ .rp-section__title {
2849
+ margin: 0;
2850
+ font-family: var(--mono);
2851
+ font-size: 11px;
2852
+ line-height: 16px;
2853
+ font-weight: 500;
2854
+ letter-spacing: 0.1em;
2855
+ text-transform: uppercase;
2856
+ color: var(--muted-foreground);
2857
+ }
2858
+ .rp-section__empty {
2859
+ margin: 0;
2860
+ font-size: 14px;
2861
+ line-height: 20px;
2862
+ color: var(--muted-foreground);
2863
+ }
2864
+ .rp-section__empty--bad {
2865
+ color: var(--destructive);
2866
+ }
2867
+ .rp-list {
2868
+ display: flex;
2869
+ flex-direction: column;
2870
+ align-self: stretch;
2871
+ border-top: 1px solid var(--border);
2872
+ }
2873
+ .rp-list__row--on {
2874
+ background: color-mix(in oklab, var(--muted) 45%, var(--background));
2875
+ }
2876
+ .rp-flag {
2877
+ margin: 0;
2878
+ }
2879
+ .rp-toolbar {
2880
+ display: flex;
2881
+ align-items: center;
2882
+ justify-content: space-between;
2883
+ flex-wrap: wrap;
2884
+ gap: 8px;
2885
+ align-self: stretch;
2886
+ }
2887
+ .rp-toolbar__title {
2888
+ flex: 1 1 160px;
2889
+ }
2890
+ .rp-toolbar__acts {
2891
+ display: flex;
2892
+ align-items: center;
2893
+ flex-wrap: wrap;
2894
+ gap: 8px;
2895
+ }
2896
+ .rp-viewer {
2897
+ align-items: stretch;
2898
+ }
2899
+ .rp-viewer__state {
2900
+ margin: 0;
2901
+ font-size: 12px;
2902
+ line-height: 16px;
2903
+ color: var(--muted-foreground);
2904
+ }
2905
+ .rp-sheet__msg {
2906
+ margin: 0 0 8px;
2907
+ font-size: 14px;
2908
+ line-height: 20px;
2909
+ }
2910
+ .rp-sheet__msg--bad {
2911
+ color: var(--destructive);
2912
+ }
2913
+ .rp-sheet__headline {
2914
+ margin: 0;
2915
+ font-size: 14px;
2916
+ line-height: 20px;
2917
+ color: var(--muted-foreground);
2918
+ }
2919
+ .rp-sheet__row {
2920
+ display: flex;
2921
+ flex-wrap: wrap;
2922
+ gap: 8px;
2923
+ margin-top: 12px;
2924
+ }
2925
+
2926
+ /* the report text, on screen and on paper */
2927
+ .rp-doc {
2928
+ display: flex;
2929
+ flex-direction: column;
2930
+ gap: 8px;
2931
+ min-width: 0;
2932
+ font-size: 14px;
2933
+ line-height: 20px;
2934
+ }
2935
+ .rp-doc__h1 {
2936
+ margin: 0;
2937
+ font-size: 20px;
2938
+ line-height: 28px;
2939
+ font-weight: 500;
2940
+ }
2941
+ .rp-doc__h2 {
2942
+ margin: 16px 0 0;
2943
+ padding-bottom: 4px;
2944
+ border-bottom: 1px solid var(--border);
2945
+ font-size: 16px;
2946
+ line-height: 24px;
2947
+ font-weight: 500;
2948
+ }
2949
+ .rp-doc__h3 {
2950
+ margin: 8px 0 0;
2951
+ font-size: 14px;
2952
+ line-height: 20px;
2953
+ font-weight: 500;
2954
+ }
2955
+ .rp-doc__p {
2956
+ margin: 0;
2957
+ overflow-wrap: anywhere;
2958
+ }
2959
+ .rp-doc__strong {
2960
+ font-weight: 500;
2961
+ }
2962
+ .rp-doc__list {
2963
+ margin: 0;
2964
+ padding-left: 20px;
2965
+ }
2966
+ .rp-doc__li {
2967
+ overflow-wrap: anywhere;
2968
+ }
2969
+ .rp-doc__note {
2970
+ display: flex;
2971
+ flex-direction: column;
2972
+ gap: 4px;
2973
+ padding: 8px 12px;
2974
+ border-left: 2px solid var(--border);
2975
+ background: color-mix(in oklab, var(--muted) 35%, var(--background));
2976
+ }
2977
+ .rp-doc__p--note {
2978
+ white-space: pre-wrap;
2979
+ }
2980
+ .rp-doc__scroll {
2981
+ overflow-x: auto;
2982
+ max-width: 100%;
2983
+ }
2984
+ .rp-doc__table {
2985
+ border-collapse: collapse;
2986
+ width: 100%;
2987
+ font-size: 12px;
2988
+ line-height: 16px;
2989
+ }
2990
+ .rp-doc__th,
2991
+ .rp-doc__td {
2992
+ padding: 4px 8px;
2993
+ border-bottom: 1px solid var(--border);
2994
+ text-align: left;
2995
+ vertical-align: top;
2996
+ }
2997
+ .rp-doc__th {
2998
+ font-family: var(--mono);
2999
+ font-size: 11px;
3000
+ font-weight: 500;
3001
+ letter-spacing: 0.1em;
3002
+ text-transform: uppercase;
3003
+ color: var(--muted-foreground);
3004
+ }
3005
+
3006
+ /* the printed copy lives in the body, outside every panel; print.css shows only it, and a screen never shows it */
3007
+ @media screen {
3008
+ .rp-print {
3009
+ display: none;
3010
+ }
3011
+ }
3012
+ .rp-copy-area {
3013
+ position: fixed;
3014
+ top: 0;
3015
+ left: 0;
3016
+ width: 1px;
3017
+ height: 1px;
3018
+ opacity: 0;
3019
+ }
3020
+
3021
+ @container (min-width: 720px) {
3022
+ .rp-cols {
3023
+ grid-template-columns: minmax(260px, 340px) minmax(0, 1fr);
3024
+ }
3025
+ }
3026
+ @media (pointer: coarse) {
3027
+ .rp-doc__scroll {
3028
+ -webkit-overflow-scrolling: touch;
3029
+ }
3030
+ }
3031
+
3032
+ /* -- layouts · .lg- the legacy and fixture shells (Run 3, slice 3D) -- */
3033
+ /* The legacy and fixture cockpit's two columns: the list head (a stack) and the rail's tile column. */
3034
+ .lg-stack {
3035
+ flex: none;
3036
+ display: flex;
3037
+ flex-direction: column;
3038
+ gap: 12px;
3039
+ }
3040
+ .lg-rail-col {
3041
+ flex: 0 1 auto;
3042
+ min-height: 0;
3043
+ align-self: stretch;
3044
+ margin-top: -3px;
3045
+ padding-top: 3px;
3046
+ display: flex;
3047
+ flex-direction: column;
3048
+ align-items: center;
3049
+ gap: 10px;
3050
+ overflow-y: auto;
3051
+ }
3052
+
3053
+ /* The legacy cockpit's repository rail: one 36px tile per repository (the open one inverted), a dashed tile to add one. */
3054
+ .lg-rail-tile {
3055
+ box-sizing: content-box;
3056
+ position: relative;
3057
+ flex: none;
3058
+ width: 36px;
3059
+ height: 36px;
3060
+ display: grid;
3061
+ place-items: center;
3062
+ font: 600 14px var(--sans);
3063
+ background: var(--secondary);
3064
+ color: var(--foreground);
3065
+ border: 1px solid transparent;
3066
+ }
3067
+ .lg-rail-tile[data-active="1"] {
3068
+ background: var(--primary);
3069
+ color: var(--primary-foreground);
3070
+ }
3071
+ .lg-rail-tile--add {
3072
+ background: transparent;
3073
+ border: 1px dashed var(--input);
3074
+ color: var(--muted-foreground);
3075
+ }
3076
+ .lg-rail-tile__dot {
3077
+ position: absolute;
3078
+ right: -3px;
3079
+ top: -3px;
3080
+ width: 9px;
3081
+ height: 9px;
3082
+ background: var(--warning);
3083
+ border: 2px solid var(--sidebar);
3084
+ }
3085
+ @media (hover: hover) {
3086
+ .lg-rail-tile--add:hover {
3087
+ color: var(--foreground);
3088
+ background: var(--accent);
3089
+ }
3090
+ }
3091
+ .lg-rail-tile:focus-visible {
3092
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
3093
+ }
3094
+ @media (pointer: coarse) {
3095
+ .lg-rail-tile {
3096
+ width: 44px;
3097
+ height: 44px;
3098
+ }
3099
+ }
3100
+
3101
+ /* The dock (panel 4): its strip and bottom bar are chrome and follow the theme; only the terminal pane inside it is dark. */
3102
+ .lg-dock {
3103
+ background: var(--background);
3104
+ display: flex;
3105
+ flex-direction: column;
3106
+ min-width: 0;
3107
+ min-height: 0;
3108
+ overflow: hidden;
3109
+ }
3110
+ .lg-dock-bottom {
3111
+ display: flex;
3112
+ gap: 10px;
3113
+ align-items: center;
3114
+ padding: 5px 12px;
3115
+ border-top: 1px solid var(--border);
3116
+ font-size: 12px;
3117
+ color: var(--muted-foreground);
3118
+ }
3119
+ .lg-dock-bottom__title {
3120
+ flex: 1;
3121
+ min-width: 0;
3122
+ overflow: hidden;
3123
+ text-overflow: ellipsis;
3124
+ white-space: nowrap;
3125
+ font-family: var(--mono);
3126
+ color: var(--foreground);
3127
+ }
3128
+
3129
+ /* R27: the dock draws no rounded corner. The tab strip and the scratchpad were drawn with inline radii (workspace-cockpit-nav);
3130
+ this rule wins over them, so the strip is sharp like every other surface. A tab's colour dot is a dot and keeps its circle. */
3131
+ .lg-dock *:not([data-tab-dot]) {
3132
+ border-radius: 0 !important;
3133
+ }
3134
+
3135
+ /* -- end of the layout sections: add nothing below this line -- */