create-pmos 0.51.0 → 0.53.0

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 (212) 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/bin/pmos.js +15 -1
  16. package/workspace/cut-stub.js +40 -0
  17. package/workspace/first-paint-audit.js +145 -0
  18. package/workspace/fixtures/capture/requirements/capture-2026-10-04-1.md +10 -0
  19. package/workspace/fixtures/initiatives-api/list.json +176 -0
  20. package/workspace/fixtures/initiatives-api/post-403.json +5 -0
  21. package/workspace/fixtures/initiatives-api/post-ok.json +10 -0
  22. package/workspace/fixtures/initiatives-api/roadmap.json +208 -0
  23. package/workspace/fixtures/initiatives-api/sheet.json +112 -0
  24. package/workspace/fixtures/report-api/draft.json +177 -0
  25. package/workspace/fixtures/reports-page/draft-biweekly-2026-10-16.md +97 -0
  26. package/workspace/fixtures/today-api/provider-rows.json +204 -0
  27. package/workspace/fixtures/today-api/seam-probe-kinds.json +5 -0
  28. package/workspace/guide/board.md +81 -0
  29. package/workspace/guide/breakdown.md +154 -0
  30. package/workspace/guide/command-palette.md +75 -0
  31. package/workspace/guide/index.md +27 -17
  32. package/workspace/guide/initiatives-roadmap.md +130 -0
  33. package/workspace/guide/initiatives-screen.md +89 -0
  34. package/workspace/guide/initiatives-timeline.md +57 -0
  35. package/workspace/guide/integrated-work.md +94 -0
  36. package/workspace/guide/knowledge-graph.md +3 -68
  37. package/workspace/guide/layout.md +98 -32
  38. package/workspace/guide/live-notes.md +3 -3
  39. package/workspace/guide/pm-only-acts.md +89 -0
  40. package/workspace/guide/pm-only-lines.md +61 -0
  41. package/workspace/guide/reports-page.md +80 -0
  42. package/workspace/guide/reports.md +73 -0
  43. package/workspace/guide/timeline.md +70 -0
  44. package/workspace/guide/today.md +85 -0
  45. package/workspace/guide/validate-with-typesafe.md +1 -1
  46. package/workspace/lib/actor.js +91 -0
  47. package/workspace/lib/board-cache.js +32 -2
  48. package/workspace/lib/board-cli.js +108 -0
  49. package/workspace/lib/board-fold.js +232 -0
  50. package/workspace/lib/breakdown-export.js +80 -0
  51. package/workspace/lib/capture.js +98 -0
  52. package/workspace/lib/engine/plan-items-stage.js +271 -0
  53. package/workspace/lib/engine/workflow-state.js +28 -2
  54. package/workspace/lib/factory-join.js +158 -0
  55. package/workspace/lib/grant-mint.js +113 -0
  56. package/workspace/lib/health-rules-factory.js +92 -0
  57. package/workspace/lib/health-rules-plan.js +164 -0
  58. package/workspace/lib/health.js +79 -0
  59. package/workspace/lib/initiative-cli.js +222 -0
  60. package/workspace/lib/initiative-display.js +183 -0
  61. package/workspace/lib/initiative-needs.js +127 -0
  62. package/workspace/lib/initiative-rows.js +206 -0
  63. package/workspace/lib/initiative-writer.js +141 -0
  64. package/workspace/lib/issues.js +206 -0
  65. package/workspace/lib/item-cli.js +195 -0
  66. package/workspace/lib/item-spans.js +137 -0
  67. package/workspace/lib/measure-cli.js +100 -0
  68. package/workspace/lib/measurements.js +189 -0
  69. package/workspace/lib/mobile-nav.js +57 -53
  70. package/workspace/lib/needs-providers.js +120 -0
  71. package/workspace/lib/placements.js +440 -0
  72. package/workspace/lib/plan-items.js +922 -0
  73. package/workspace/lib/plan-ledgers.js +85 -0
  74. package/workspace/lib/plan-rules.js +72 -0
  75. package/workspace/lib/plan-tree.js +367 -0
  76. package/workspace/lib/pm-guard.js +174 -0
  77. package/workspace/lib/pm-lines-needs.js +331 -0
  78. package/workspace/lib/pmos-verbs.js +66 -0
  79. package/workspace/lib/proactive.js +7 -4
  80. package/workspace/lib/report-cli.js +152 -0
  81. package/workspace/lib/report-draft.js +579 -0
  82. package/workspace/lib/report-needs.js +213 -0
  83. package/workspace/lib/route-modules.js +128 -0
  84. package/workspace/lib/routes-board.js +91 -0
  85. package/workspace/lib/routes-capture.js +52 -0
  86. package/workspace/lib/routes-initiatives.js +371 -0
  87. package/workspace/lib/routes-reports.js +163 -0
  88. package/workspace/lib/routes-timeline.js +197 -0
  89. package/workspace/lib/routes-today.js +32 -0
  90. package/workspace/lib/today-cli.js +99 -0
  91. package/workspace/lib/today.js +333 -0
  92. package/workspace/lib/triage.js +163 -0
  93. package/workspace/lib/verify-work-cli.js +81 -0
  94. package/workspace/lib/work-check-needs.js +99 -0
  95. package/workspace/package-lock.json +1 -1
  96. package/workspace/package.json +5 -5
  97. package/workspace/public/index.html +29 -19
  98. package/workspace/public/pm/app.js +299 -30
  99. package/workspace/public/pm/bd-board.js +113 -0
  100. package/workspace/public/pm/bd-drag.js +59 -0
  101. package/workspace/public/pm/bd-model.js +152 -0
  102. package/workspace/public/pm/bd-timeline.js +233 -0
  103. package/workspace/public/pm/bd-tree.js +244 -0
  104. package/workspace/public/pm/board-copy.js +57 -0
  105. package/workspace/public/pm/breakdown-api.js +58 -0
  106. package/workspace/public/pm/breakdown-copy.js +138 -0
  107. package/workspace/public/pm/components.css +3054 -0
  108. package/workspace/public/pm/cycle-review.js +125 -0
  109. package/workspace/public/pm/data.js +40 -187
  110. package/workspace/public/pm/dest-board.js +438 -0
  111. package/workspace/public/pm/dest-initiatives.js +134 -0
  112. package/workspace/public/pm/dest-reports.js +270 -0
  113. package/workspace/public/pm/dest-settings.js +217 -0
  114. package/workspace/public/pm/dest-today.js +176 -0
  115. package/workspace/public/pm/dialogs.js +88 -0
  116. package/workspace/public/pm/display-word.js +56 -0
  117. package/workspace/public/pm/dock.js +105 -0
  118. package/workspace/public/pm/fixture.js +8 -227
  119. package/workspace/public/pm/frame-copy.js +94 -0
  120. package/workspace/public/pm/handoff-box.js +82 -0
  121. package/workspace/public/pm/http.js +88 -0
  122. package/workspace/public/pm/icons.js +53 -0
  123. package/workspace/public/pm/initiative-list.js +218 -0
  124. package/workspace/public/pm/initiative-sheet.js +261 -0
  125. package/workspace/public/pm/initiatives-api.js +59 -0
  126. package/workspace/public/pm/initiatives-copy.js +215 -0
  127. package/workspace/public/pm/initiatives-timeline-copy.js +59 -0
  128. package/workspace/public/pm/initiatives-timeline.js +410 -0
  129. package/workspace/public/pm/initiatives-ui.js +123 -0
  130. package/workspace/public/pm/item-sheet.js +251 -0
  131. package/workspace/public/pm/keep-card.js +204 -0
  132. package/workspace/public/pm/lifecycle.js +7 -1
  133. package/workspace/public/pm/mobile.css +49 -20
  134. package/workspace/public/pm/mobile.js +157 -29
  135. package/workspace/public/pm/modes-live.js +7 -883
  136. package/workspace/public/pm/modes.js +32 -1024
  137. package/workspace/public/pm/new-initiative-sheet.js +74 -0
  138. package/workspace/public/pm/next-step-ui.js +3 -2
  139. package/workspace/public/pm/palette-copy.js +51 -0
  140. package/workspace/public/pm/palette.js +312 -0
  141. package/workspace/public/pm/panel-breakdown.js +702 -0
  142. package/workspace/public/pm/panel-cockpit.js +63 -295
  143. package/workspace/public/pm/panel-detail.js +25 -172
  144. package/workspace/public/pm/panel-initiatives.js +1 -19
  145. package/workspace/public/pm/panel-repos.js +31 -81
  146. package/workspace/public/pm/panel-tabs.js +197 -110
  147. package/workspace/public/pm/panel-trees.js +5 -2
  148. package/workspace/public/pm/portfolio-report.js +61 -0
  149. package/workspace/public/pm/primitives.js +656 -0
  150. package/workspace/public/pm/print.css +33 -0
  151. package/workspace/public/pm/provider-cards.js +136 -0
  152. package/workspace/public/pm/registry.js +194 -0
  153. package/workspace/public/pm/release-card.js +110 -0
  154. package/workspace/public/pm/report-view.js +309 -0
  155. package/workspace/public/pm/reports-copy.js +114 -0
  156. package/workspace/public/pm/roadmap.js +271 -0
  157. package/workspace/public/pm/sig-watch.js +41 -0
  158. package/workspace/public/pm/state.js +8 -4
  159. package/workspace/public/pm/status-banner.js +13 -5
  160. package/workspace/public/pm/tab-doc.js +2 -4
  161. package/workspace/public/pm/tab-term.js +12 -2
  162. package/workspace/public/pm/tab-web.js +3 -2
  163. package/workspace/public/pm/timeline-copy.js +48 -0
  164. package/workspace/public/pm/today-cards.js +244 -0
  165. package/workspace/public/pm/today-copy.js +97 -0
  166. package/workspace/public/pm/tokens.css +16 -18
  167. package/workspace/public/pm/topbar.js +102 -0
  168. package/workspace/public/pm/triage-card.js +60 -0
  169. package/workspace/public/pm/undo-hold.js +103 -0
  170. package/workspace/public/pm/view-addrepo.js +2 -1
  171. package/workspace/public/pm/view-livenotes.js +3 -1
  172. package/workspace/public/pm/view-today.js +7 -162
  173. package/workspace/public/vendor/Sortable.min.js +2 -0
  174. package/workspace/public/vendor/lucide-sprite.js +79 -0
  175. package/workspace/replaced-tests.json +2864 -0
  176. package/workspace/run-tests.js +117 -6
  177. package/workspace/server.js +312 -36
  178. package/workspace/sheet-answer.js +61 -0
  179. package/workspace/skills/measure.skill +41 -0
  180. package/workspace/skills/report-biweekly.skill +23 -25
  181. package/workspace/skills/tracker-refresh.skill +50 -0
  182. package/workspace/test-files.json +20 -4
  183. package/workspace/test-lists/base.json +6 -0
  184. package/workspace/test-lists/run2-a.json +6 -0
  185. package/workspace/test-lists/run2-b.json +13 -0
  186. package/workspace/test-lists/run2-c.json +19 -0
  187. package/workspace/test-lists/run2-d.json +22 -0
  188. package/workspace/test-lists/run3-0.json +5 -0
  189. package/workspace/test-lists/run3-a.json +5 -0
  190. package/workspace/test-lists/run3-b.json +6 -0
  191. package/workspace/test-lists/run3-c.json +15 -0
  192. package/workspace/test-lists/run3-d.json +6 -0
  193. package/workspace/test-lists/run4-a.json +8 -0
  194. package/workspace/test-lists/run4-b.json +6 -0
  195. package/workspace/test-lists/run4-c.json +13 -0
  196. package/workspace/test-lists/run4-d.json +9 -0
  197. package/workspace/test-lists/run5-a.json +6 -0
  198. package/workspace/test-lists/run5-b.json +6 -0
  199. package/workspace/test-lists/run5-c.json +15 -0
  200. package/workspace/test-run.js +27 -1
  201. package/workspace/third-party/README.md +44 -0
  202. package/workspace/third-party/lucide-static-1.52.0.LICENSE +43 -0
  203. package/workspace/third-party/sortablejs-1.15.7.LICENSE +21 -0
  204. package/workspace/design-parity.js +0 -673
  205. package/workspace/public/pm/tab-task.js +0 -86
  206. package/workspace/public/pm/view-guide.js +0 -141
  207. package/workspace/public/pm/view-knowledge.js +0 -225
  208. package/workspace/public/pm/view-memory.js +0 -122
  209. package/workspace/public/pm/view-portfolio.js +0 -153
  210. package/workspace/public/pm/view-reports.js +0 -190
  211. package/workspace/public/pm/view-scheduled.js +0 -161
  212. package/workspace/public/pm/view-skills.js +0 -216
@@ -0,0 +1,3054 @@
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: clamp(360px, 36vw, 640px);
1981
+ border-left: 1px solid var(--border);
1982
+ }
1983
+ .fr-body[data-fr-dock="open"] > .fr-dock-rail {
1984
+ display: none;
1985
+ }
1986
+ .fr-body[data-fr-dock="rail"] > .fr-dock {
1987
+ display: none !important;
1988
+ }
1989
+ /* The pinned ⌘K on a phone. .pmc-btn--block sets width: 100%, which with the side margins runs 32px past the place
1990
+ * (and .fr-main clips it). The column's stretch gives the width inside the margins. */
1991
+ .fr-pin {
1992
+ flex: none;
1993
+ align-self: stretch;
1994
+ width: auto;
1995
+ justify-content: flex-start;
1996
+ margin: 12px 16px 0;
1997
+ color: var(--muted-foreground);
1998
+ }
1999
+ /* Settings: one column of five sections. */
2000
+ .fr-set {
2001
+ display: flex;
2002
+ flex-direction: column;
2003
+ gap: 24px;
2004
+ max-width: 720px;
2005
+ padding: 24px 16px 48px;
2006
+ }
2007
+ .fr-set__intro {
2008
+ display: flex;
2009
+ flex-direction: column;
2010
+ gap: 4px;
2011
+ }
2012
+ .fr-set__h1 {
2013
+ margin: 0;
2014
+ font-size: 20px;
2015
+ font-weight: 600;
2016
+ }
2017
+ .fr-set__note {
2018
+ margin: 0;
2019
+ color: var(--muted-foreground);
2020
+ font-size: 12px;
2021
+ }
2022
+ .fr-set__section {
2023
+ display: flex;
2024
+ flex-direction: column;
2025
+ gap: 8px;
2026
+ }
2027
+ .fr-set__head {
2028
+ display: flex;
2029
+ align-items: center;
2030
+ justify-content: space-between;
2031
+ gap: 8px;
2032
+ min-height: 32px;
2033
+ }
2034
+ .fr-set__title {
2035
+ margin: 0;
2036
+ font-size: 14px;
2037
+ font-weight: 600;
2038
+ }
2039
+ .fr-set__fields {
2040
+ display: flex;
2041
+ flex-wrap: wrap;
2042
+ gap: 16px;
2043
+ }
2044
+ .fr-set__line {
2045
+ display: flex;
2046
+ align-items: center;
2047
+ justify-content: space-between;
2048
+ gap: 12px;
2049
+ }
2050
+ .fr-set__add {
2051
+ padding: 12px 0;
2052
+ }
2053
+ @media (max-width: 760px) {
2054
+ .fr-detail,
2055
+ .fr-dock {
2056
+ width: auto;
2057
+ border-left: 0;
2058
+ }
2059
+ .fr-set {
2060
+ padding: 16px 16px 48px;
2061
+ }
2062
+ }
2063
+ @media (pointer: coarse) {
2064
+ .fr-set__head {
2065
+ min-height: 44px;
2066
+ }
2067
+ /* The dock's own strip and bottom bar (panel-tabs.js) size their controls inline at 22-30px; under touch each is a
2068
+ * 44px target. The strip's fixed height yields to them. */
2069
+ .fr-dock [data-tabs="bar"] {
2070
+ height: auto !important;
2071
+ }
2072
+ .fr-dock [data-tabs="bar"] button,
2073
+ .fr-dock [data-tabs="bottom"] button {
2074
+ min-width: 44px !important;
2075
+ min-height: 44px !important;
2076
+ }
2077
+ }
2078
+
2079
+ /* -- layouts · .td- Today (Run 3, slice 3B) -- */
2080
+ .td-board {
2081
+ display: flex;
2082
+ flex-direction: column;
2083
+ gap: 12px;
2084
+ max-width: 720px;
2085
+ margin: 0 auto;
2086
+ padding: 16px;
2087
+ }
2088
+ .td-head {
2089
+ display: flex;
2090
+ flex-wrap: wrap;
2091
+ align-items: center;
2092
+ justify-content: space-between;
2093
+ gap: 8px 16px;
2094
+ }
2095
+ .td-count {
2096
+ margin: 0;
2097
+ font-size: 20px;
2098
+ line-height: 28px;
2099
+ font-weight: 600;
2100
+ color: var(--foreground);
2101
+ }
2102
+ .td-list {
2103
+ display: flex;
2104
+ flex-direction: column;
2105
+ gap: 8px;
2106
+ }
2107
+ .td-card {
2108
+ display: flex;
2109
+ flex-direction: column;
2110
+ gap: 8px;
2111
+ min-width: 0;
2112
+ padding: 10px 12px;
2113
+ border-radius: 0;
2114
+ background: var(--card);
2115
+ color: var(--foreground);
2116
+ box-shadow: 0 0 0 1px var(--border);
2117
+ }
2118
+ .td-card[hidden] {
2119
+ display: none;
2120
+ }
2121
+ .td-card--host {
2122
+ padding: 0;
2123
+ box-shadow: none;
2124
+ background: transparent;
2125
+ }
2126
+ .td-card__host {
2127
+ display: flex;
2128
+ align-items: flex-start;
2129
+ gap: 4px;
2130
+ min-width: 0;
2131
+ }
2132
+ .td-card__face {
2133
+ flex: 1 1 auto;
2134
+ min-width: 0;
2135
+ }
2136
+ .td-card__host > [data-today-more] {
2137
+ flex: none;
2138
+ }
2139
+ .td-card__top {
2140
+ display: flex;
2141
+ flex-wrap: wrap;
2142
+ align-items: center;
2143
+ gap: 8px 12px;
2144
+ }
2145
+ .td-card__text {
2146
+ display: flex;
2147
+ flex: 1 1 220px;
2148
+ flex-direction: column;
2149
+ gap: 2px;
2150
+ min-width: 0;
2151
+ }
2152
+ .td-card__cause {
2153
+ display: flex;
2154
+ align-items: center;
2155
+ gap: 8px;
2156
+ font-size: 14px;
2157
+ line-height: 20px;
2158
+ font-weight: 500;
2159
+ overflow-wrap: anywhere;
2160
+ }
2161
+ .td-card__evidence {
2162
+ padding-left: 14px;
2163
+ font-size: 12px;
2164
+ line-height: 16px;
2165
+ color: var(--muted-foreground);
2166
+ overflow-wrap: anywhere;
2167
+ }
2168
+ .td-card__acts {
2169
+ display: flex;
2170
+ flex: none;
2171
+ align-items: center;
2172
+ gap: 4px;
2173
+ }
2174
+ .td-accept {
2175
+ display: flex;
2176
+ flex-direction: column;
2177
+ align-items: flex-start;
2178
+ gap: 8px;
2179
+ padding-top: 8px;
2180
+ border-top: 1px solid var(--border);
2181
+ }
2182
+ .td-accept__line,
2183
+ .td-accept__q {
2184
+ margin: 0;
2185
+ font-size: 14px;
2186
+ line-height: 20px;
2187
+ }
2188
+ .td-accept__ask {
2189
+ display: flex;
2190
+ flex-wrap: wrap;
2191
+ align-items: center;
2192
+ gap: 8px 12px;
2193
+ }
2194
+ .td-accept__acts {
2195
+ display: flex;
2196
+ flex-wrap: wrap;
2197
+ gap: 8px;
2198
+ }
2199
+ .td-accept__error {
2200
+ margin: 0;
2201
+ font-size: 12px;
2202
+ line-height: 16px;
2203
+ color: var(--destructive);
2204
+ }
2205
+ .td-health {
2206
+ padding: 8px 12px;
2207
+ border-radius: 0;
2208
+ background: var(--muted);
2209
+ box-shadow: inset 2px 0 0 var(--warning);
2210
+ font-size: 12px;
2211
+ line-height: 16px;
2212
+ }
2213
+ .td-health__title {
2214
+ margin: 0 0 4px;
2215
+ font-weight: 600;
2216
+ }
2217
+ .td-health__list {
2218
+ margin: 0;
2219
+ padding-left: 16px;
2220
+ color: var(--muted-foreground);
2221
+ overflow-wrap: anywhere;
2222
+ }
2223
+ @media (max-width: 560px) {
2224
+ .td-board {
2225
+ padding: 12px 16px;
2226
+ }
2227
+ .td-card__acts {
2228
+ margin-left: auto;
2229
+ }
2230
+ }
2231
+
2232
+ /* -- layouts · .pl- the command palette and capture (Run 3, slice 3C) -- */
2233
+ .pl-list {
2234
+ display: flex;
2235
+ flex-direction: column;
2236
+ max-height: 50vh;
2237
+ overflow-y: auto;
2238
+ overscroll-behavior: contain;
2239
+ }
2240
+ .pl-item[aria-selected="true"] {
2241
+ background: var(--accent);
2242
+ }
2243
+ .pl-cli {
2244
+ font-family: var(--mono);
2245
+ font-size: 12px;
2246
+ line-height: 16px;
2247
+ color: var(--muted-foreground);
2248
+ }
2249
+ .pl-note {
2250
+ margin: 0;
2251
+ font-size: 14px;
2252
+ line-height: 20px;
2253
+ color: var(--muted-foreground);
2254
+ }
2255
+ .pl-note--error {
2256
+ color: var(--destructive);
2257
+ }
2258
+ /* the terminal's compose line (phone): one message field and Send, in the bottom bar */
2259
+ .pl-compose {
2260
+ display: flex;
2261
+ align-items: flex-end;
2262
+ gap: 8px;
2263
+ flex: 1 1 auto;
2264
+ min-width: 0;
2265
+ }
2266
+ .pl-compose__field {
2267
+ flex: 1 1 auto;
2268
+ min-width: 0;
2269
+ }
2270
+ .pl-compose__input {
2271
+ height: 44px;
2272
+ min-height: 44px;
2273
+ resize: none;
2274
+ }
2275
+
2276
+ /* -- layouts · .tl- Breakdown › Timeline (Run 4, slice 4B) -- */
2277
+ /* the chart scrolls sideways inside itself only; the name column stays put while it scrolls */
2278
+ .tl-hint {
2279
+ margin: 0 0 8px;
2280
+ padding: 0 16px;
2281
+ font-size: 12px;
2282
+ line-height: 16px;
2283
+ color: var(--muted-foreground);
2284
+ }
2285
+ .tl-scroll {
2286
+ max-width: 100%;
2287
+ overflow-x: auto;
2288
+ overscroll-behavior-x: contain;
2289
+ -webkit-overflow-scrolling: touch;
2290
+ }
2291
+ .tl-chart {
2292
+ position: relative;
2293
+ min-width: 640px;
2294
+ }
2295
+ .tl-row {
2296
+ display: grid;
2297
+ grid-template-columns: 216px minmax(0, 1fr);
2298
+ align-items: center;
2299
+ min-height: 36px;
2300
+ padding-right: 16px;
2301
+ border-bottom: 1px solid var(--border);
2302
+ }
2303
+ .tl-row--head {
2304
+ min-height: 40px;
2305
+ align-items: end;
2306
+ }
2307
+ .tl-name {
2308
+ position: sticky;
2309
+ left: 0;
2310
+ z-index: 1;
2311
+ display: flex;
2312
+ flex-direction: column;
2313
+ justify-content: center;
2314
+ align-self: stretch;
2315
+ min-width: 0;
2316
+ padding: 4px 12px 4px 16px;
2317
+ background: var(--background);
2318
+ }
2319
+ .tl-title {
2320
+ overflow: hidden;
2321
+ font-size: 14px;
2322
+ line-height: 20px;
2323
+ white-space: nowrap;
2324
+ text-overflow: ellipsis;
2325
+ }
2326
+ .tl-row--all .tl-title,
2327
+ .tl-row--stage .tl-title {
2328
+ font-size: 12px;
2329
+ line-height: 16px;
2330
+ font-weight: 600;
2331
+ letter-spacing: 0.04em;
2332
+ text-transform: uppercase;
2333
+ color: var(--muted-foreground);
2334
+ }
2335
+ .tl-meta {
2336
+ overflow: hidden;
2337
+ font-size: 12px;
2338
+ line-height: 16px;
2339
+ white-space: nowrap;
2340
+ text-overflow: ellipsis;
2341
+ color: var(--muted-foreground);
2342
+ }
2343
+ /* the health reason (R8) and "Proposed": each on its own line under the dates, wrapped, never cut */
2344
+ .tl-flag {
2345
+ display: flex;
2346
+ flex-direction: column;
2347
+ align-items: flex-start;
2348
+ gap: 2px;
2349
+ font-size: 12px;
2350
+ line-height: 16px;
2351
+ }
2352
+ .tl-track {
2353
+ position: relative;
2354
+ min-width: 0;
2355
+ }
2356
+ .tl-axis {
2357
+ position: relative;
2358
+ height: 40px;
2359
+ }
2360
+ .tl-month,
2361
+ .tl-today {
2362
+ position: absolute;
2363
+ bottom: 4px;
2364
+ left: var(--tl-x, 0);
2365
+ font-size: 11px;
2366
+ line-height: 16px;
2367
+ white-space: nowrap;
2368
+ }
2369
+ .tl-month {
2370
+ padding-left: 4px;
2371
+ border-left: 1px solid var(--border);
2372
+ color: var(--muted-foreground);
2373
+ }
2374
+ /* the today label is on its own line above the month labels, so the two never cover each other. It starts at its line,
2375
+ * or ends at it in the second half of the axis */
2376
+ .tl-today {
2377
+ bottom: 22px;
2378
+ padding-left: 4px;
2379
+ border-left: 1px solid var(--foreground);
2380
+ font-weight: 600;
2381
+ color: var(--foreground);
2382
+ }
2383
+ .tl-today--end {
2384
+ padding: 0 4px 0 0;
2385
+ border-left: 0;
2386
+ border-right: 1px solid var(--foreground);
2387
+ transform: translateX(calc(-100% + 1px));
2388
+ }
2389
+ .tl-note {
2390
+ margin: 8px 0 0;
2391
+ padding: 0 16px;
2392
+ font-size: 12px;
2393
+ line-height: 16px;
2394
+ color: var(--muted-foreground);
2395
+ }
2396
+ @media (pointer: coarse) {
2397
+ .tl-row {
2398
+ min-height: 48px;
2399
+ }
2400
+ }
2401
+ @media (max-width: 760px) {
2402
+ .tl-row {
2403
+ grid-template-columns: 144px minmax(0, 1fr);
2404
+ }
2405
+ }
2406
+
2407
+ /* -- layouts · .tl-init- Initiatives › Timeline (Run 4, slice 4C) -- */
2408
+
2409
+ .tl-init-root {
2410
+ --tl-init-name: 360px;
2411
+ --tl-init-mw: 96px;
2412
+ display: flex;
2413
+ flex-direction: column;
2414
+ gap: 24px;
2415
+ min-width: 0;
2416
+ padding: 0 0 24px;
2417
+ background: var(--background);
2418
+ color: var(--foreground);
2419
+ font-family: var(--sans);
2420
+ font-size: 14px;
2421
+ line-height: 20px;
2422
+ }
2423
+ /* only the chart scrolls sideways: the page never does */
2424
+ .tl-init-chart {
2425
+ position: relative;
2426
+ overflow-x: auto;
2427
+ overflow-y: hidden;
2428
+ overscroll-behavior-x: contain;
2429
+ container-type: inline-size;
2430
+ border-top: 1px solid var(--border);
2431
+ border-bottom: 1px solid var(--border);
2432
+ }
2433
+ .tl-init-chart:focus-visible {
2434
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
2435
+ outline-offset: -2px;
2436
+ }
2437
+ .tl-init-inner {
2438
+ position: relative;
2439
+ width: max(100%, calc(var(--tl-init-name) + var(--tl-init-months) * var(--tl-init-mw)));
2440
+ }
2441
+ .tl-init-head,
2442
+ .tl-init-group,
2443
+ .tl-init-row {
2444
+ display: grid;
2445
+ grid-template-columns: var(--tl-init-name) minmax(0, 1fr);
2446
+ border-bottom: 1px solid var(--border);
2447
+ }
2448
+ .tl-init-head {
2449
+ height: 32px;
2450
+ align-items: end;
2451
+ }
2452
+ .tl-init-months {
2453
+ display: grid;
2454
+ grid-template-columns: var(--tl-init-cols);
2455
+ height: 100%;
2456
+ }
2457
+ .tl-init-month {
2458
+ align-self: end;
2459
+ padding: 0 0 6px 6px;
2460
+ border-left: 1px solid var(--border);
2461
+ color: var(--muted-foreground);
2462
+ font-size: 12px;
2463
+ line-height: 16px;
2464
+ white-space: nowrap;
2465
+ }
2466
+ /* the name of a row stays at the left edge while the months scroll under it */
2467
+ .tl-init-corner,
2468
+ .tl-init-gname,
2469
+ .tl-init-name {
2470
+ position: sticky;
2471
+ left: 0;
2472
+ z-index: 2;
2473
+ background: var(--background);
2474
+ }
2475
+ .tl-init-gname {
2476
+ padding: 12px 8px 4px 16px;
2477
+ color: var(--foreground);
2478
+ font-size: 12px;
2479
+ font-weight: 600;
2480
+ line-height: 16px;
2481
+ }
2482
+ .tl-init-name {
2483
+ min-width: 0;
2484
+ border-bottom: 0;
2485
+ }
2486
+ /* a row with no stages keeps the place ▸ would take, so every title starts at the same left edge */
2487
+ .tl-init-lead-gap {
2488
+ flex: none;
2489
+ width: 28px;
2490
+ }
2491
+ .tl-init-sub {
2492
+ display: flex;
2493
+ align-items: center;
2494
+ min-height: 32px;
2495
+ padding: 0 8px 0 76px;
2496
+ color: var(--muted-foreground);
2497
+ font-size: 12px;
2498
+ line-height: 16px;
2499
+ }
2500
+ .tl-init-row--stage {
2501
+ min-height: 32px;
2502
+ }
2503
+ .tl-init-track {
2504
+ position: relative;
2505
+ display: flex;
2506
+ align-items: center;
2507
+ min-height: 36px;
2508
+ min-width: 0;
2509
+ }
2510
+ .tl-init-sub__none {
2511
+ padding-left: 8px;
2512
+ color: var(--muted-foreground);
2513
+ font-size: 12px;
2514
+ line-height: 16px;
2515
+ }
2516
+ .tl-init-list {
2517
+ display: flex;
2518
+ flex-direction: column;
2519
+ min-height: 8px;
2520
+ }
2521
+ /* the line for today, over the month columns only */
2522
+ .tl-init-plot {
2523
+ position: absolute;
2524
+ top: 0;
2525
+ bottom: 0;
2526
+ left: var(--tl-init-name);
2527
+ right: 0;
2528
+ z-index: 1;
2529
+ pointer-events: none;
2530
+ }
2531
+ .tl-init-today {
2532
+ position: absolute;
2533
+ top: 0;
2534
+ bottom: 0;
2535
+ left: var(--tl-init-today);
2536
+ border-left: 2px solid var(--foreground);
2537
+ }
2538
+ .tl-init-today__label {
2539
+ position: absolute;
2540
+ top: 2px;
2541
+ left: 4px;
2542
+ padding: 0 4px;
2543
+ background: var(--background);
2544
+ color: var(--foreground);
2545
+ font-size: 11px;
2546
+ line-height: 16px;
2547
+ }
2548
+ /* the initiatives with no dated item: names only, in the order they carry */
2549
+ .tl-init-undated {
2550
+ display: flex;
2551
+ flex-direction: column;
2552
+ min-width: 0;
2553
+ }
2554
+ .tl-init-undated__title {
2555
+ margin: 0;
2556
+ padding: 0 16px;
2557
+ color: var(--foreground);
2558
+ font-size: 14px;
2559
+ font-weight: 600;
2560
+ line-height: 20px;
2561
+ }
2562
+ .tl-init-undated__note {
2563
+ margin: 0;
2564
+ padding: 4px 16px 8px;
2565
+ color: var(--muted-foreground);
2566
+ font-size: 12px;
2567
+ line-height: 16px;
2568
+ }
2569
+ .tl-init-undated .tl-init-row {
2570
+ display: block;
2571
+ }
2572
+ .tl-init-undated .tl-init-name {
2573
+ position: static;
2574
+ max-width: 480px;
2575
+ }
2576
+ .tl-init-note {
2577
+ margin: 0;
2578
+ padding: 0 16px;
2579
+ color: var(--muted-foreground);
2580
+ font-size: 12px;
2581
+ line-height: 16px;
2582
+ }
2583
+ /* drag states (Sortable's classes) */
2584
+ .tl-init-ghost {
2585
+ opacity: 0.4;
2586
+ }
2587
+ .tl-init-chosen .tl-init-name {
2588
+ background: var(--accent);
2589
+ }
2590
+ /* Sortable writes an inline opacity: 0.8 on the fallback clone; only !important overrides an inline style */
2591
+ .tl-init-fallback,
2592
+ .tl-init-dragging {
2593
+ opacity: 1 !important;
2594
+ background: var(--card);
2595
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--foreground) 14%, transparent),
2596
+ 0 8px 20px -6px color-mix(in oklab, var(--term-bg) 35%, transparent);
2597
+ }
2598
+ /* a phone: each row is its name over its months, and the name is as wide as the chart's box */
2599
+ @media (max-width: 760px) {
2600
+ .tl-init-inner {
2601
+ width: max(100%, calc(var(--tl-init-months) * var(--tl-init-mw)));
2602
+ }
2603
+ .tl-init-head,
2604
+ .tl-init-group,
2605
+ .tl-init-row {
2606
+ display: block;
2607
+ }
2608
+ .tl-init-corner {
2609
+ display: none;
2610
+ }
2611
+ .tl-init-gname,
2612
+ .tl-init-name {
2613
+ width: 100cqw;
2614
+ }
2615
+ .tl-init-sub {
2616
+ padding-left: 60px;
2617
+ }
2618
+ .tl-init-plot {
2619
+ left: 0;
2620
+ }
2621
+ }
2622
+ @media (pointer: coarse) {
2623
+ .tl-init-sub,
2624
+ .tl-init-row--stage {
2625
+ min-height: 44px;
2626
+ }
2627
+ .tl-init-lead-gap {
2628
+ width: 44px;
2629
+ }
2630
+ }
2631
+
2632
+ /* -- layouts · .bo- Board (Run 4, slice 4D) -- */
2633
+ .bo-head {
2634
+ flex-wrap: wrap;
2635
+ }
2636
+ .bo-head__filters {
2637
+ display: flex;
2638
+ align-items: center;
2639
+ flex-wrap: wrap;
2640
+ gap: 8px;
2641
+ min-width: 0;
2642
+ }
2643
+ .bo-head__pick {
2644
+ min-width: 160px;
2645
+ }
2646
+ .bo-head__end {
2647
+ display: flex;
2648
+ align-items: center;
2649
+ gap: 12px;
2650
+ margin-left: auto;
2651
+ }
2652
+ .bo-head__n {
2653
+ color: var(--muted-foreground);
2654
+ font-size: 12px;
2655
+ line-height: 16px;
2656
+ font-variant-numeric: tabular-nums;
2657
+ }
2658
+ .bo-releases {
2659
+ display: flex;
2660
+ flex-direction: column;
2661
+ gap: 4px;
2662
+ margin: 16px 16px 0;
2663
+ padding: 12px;
2664
+ border: 1px solid var(--border);
2665
+ border-radius: 0;
2666
+ }
2667
+ .bo-releases__head {
2668
+ font-size: 12px;
2669
+ line-height: 16px;
2670
+ font-weight: 600;
2671
+ letter-spacing: 0.06em;
2672
+ text-transform: uppercase;
2673
+ }
2674
+ .bo-releases__note {
2675
+ color: var(--muted-foreground);
2676
+ font-size: 12px;
2677
+ line-height: 16px;
2678
+ }
2679
+ .bo-rel {
2680
+ display: flex;
2681
+ align-items: center;
2682
+ justify-content: space-between;
2683
+ gap: 12px;
2684
+ padding: 8px 0;
2685
+ border-top: 1px solid var(--border);
2686
+ }
2687
+ .bo-rel--today {
2688
+ padding: 10px 12px;
2689
+ border: 1px solid var(--border);
2690
+ border-radius: 0;
2691
+ background: var(--card);
2692
+ }
2693
+ .bo-rel__main {
2694
+ flex: 1 1 auto;
2695
+ min-width: 0;
2696
+ }
2697
+ .bo-rel__title {
2698
+ font-weight: 600;
2699
+ overflow-wrap: anywhere;
2700
+ }
2701
+ .bo-rel__meta,
2702
+ .bo-rel__wait {
2703
+ color: var(--muted-foreground);
2704
+ font-size: 12px;
2705
+ line-height: 16px;
2706
+ overflow-wrap: anywhere;
2707
+ }
2708
+ .bo-card__note {
2709
+ padding: 0 12px 8px;
2710
+ color: var(--warning);
2711
+ font-size: 12px;
2712
+ line-height: 16px;
2713
+ }
2714
+ @media (pointer: coarse) {
2715
+ .bo-rel {
2716
+ min-height: 48px;
2717
+ }
2718
+ .bo-head__pick {
2719
+ min-width: 0;
2720
+ flex: 1 1 160px;
2721
+ }
2722
+ }
2723
+
2724
+ /* -- layouts · .rp- Reports (Run 5, slice 5C) -- */
2725
+ .rp-page {
2726
+ container-type: inline-size;
2727
+ display: flex;
2728
+ flex-direction: column;
2729
+ flex: 1 1 auto;
2730
+ gap: 16px;
2731
+ min-width: 0;
2732
+ min-height: 100%;
2733
+ padding: 16px;
2734
+ background: var(--background);
2735
+ color: var(--foreground);
2736
+ }
2737
+ .rp-head {
2738
+ display: flex;
2739
+ align-items: center;
2740
+ justify-content: space-between;
2741
+ gap: 12px;
2742
+ }
2743
+ .rp-head__title {
2744
+ margin: 0;
2745
+ font-size: 20px;
2746
+ line-height: 28px;
2747
+ font-weight: 500;
2748
+ }
2749
+ .rp-cols {
2750
+ display: grid;
2751
+ grid-template-columns: minmax(0, 1fr);
2752
+ gap: 16px;
2753
+ }
2754
+ .rp-col {
2755
+ display: flex;
2756
+ flex-direction: column;
2757
+ gap: 16px;
2758
+ min-width: 0;
2759
+ }
2760
+ .rp-section {
2761
+ display: flex;
2762
+ flex-direction: column;
2763
+ align-items: flex-start;
2764
+ gap: 8px;
2765
+ min-width: 0;
2766
+ }
2767
+ .rp-section__title {
2768
+ margin: 0;
2769
+ font-family: var(--mono);
2770
+ font-size: 11px;
2771
+ line-height: 16px;
2772
+ font-weight: 500;
2773
+ letter-spacing: 0.1em;
2774
+ text-transform: uppercase;
2775
+ color: var(--muted-foreground);
2776
+ }
2777
+ .rp-section__empty {
2778
+ margin: 0;
2779
+ font-size: 14px;
2780
+ line-height: 20px;
2781
+ color: var(--muted-foreground);
2782
+ }
2783
+ .rp-section__empty--bad {
2784
+ color: var(--destructive);
2785
+ }
2786
+ .rp-list {
2787
+ display: flex;
2788
+ flex-direction: column;
2789
+ align-self: stretch;
2790
+ border-top: 1px solid var(--border);
2791
+ }
2792
+ .rp-list__row--on {
2793
+ background: color-mix(in oklab, var(--muted) 45%, var(--background));
2794
+ }
2795
+ .rp-flag {
2796
+ margin: 0;
2797
+ }
2798
+ .rp-toolbar {
2799
+ display: flex;
2800
+ align-items: center;
2801
+ justify-content: space-between;
2802
+ flex-wrap: wrap;
2803
+ gap: 8px;
2804
+ align-self: stretch;
2805
+ }
2806
+ .rp-toolbar__title {
2807
+ flex: 1 1 160px;
2808
+ }
2809
+ .rp-toolbar__acts {
2810
+ display: flex;
2811
+ align-items: center;
2812
+ flex-wrap: wrap;
2813
+ gap: 8px;
2814
+ }
2815
+ .rp-viewer {
2816
+ align-items: stretch;
2817
+ }
2818
+ .rp-viewer__state {
2819
+ margin: 0;
2820
+ font-size: 12px;
2821
+ line-height: 16px;
2822
+ color: var(--muted-foreground);
2823
+ }
2824
+ .rp-sheet__msg {
2825
+ margin: 0 0 8px;
2826
+ font-size: 14px;
2827
+ line-height: 20px;
2828
+ }
2829
+ .rp-sheet__msg--bad {
2830
+ color: var(--destructive);
2831
+ }
2832
+ .rp-sheet__headline {
2833
+ margin: 0;
2834
+ font-size: 14px;
2835
+ line-height: 20px;
2836
+ color: var(--muted-foreground);
2837
+ }
2838
+ .rp-sheet__row {
2839
+ display: flex;
2840
+ flex-wrap: wrap;
2841
+ gap: 8px;
2842
+ margin-top: 12px;
2843
+ }
2844
+
2845
+ /* the report text, on screen and on paper */
2846
+ .rp-doc {
2847
+ display: flex;
2848
+ flex-direction: column;
2849
+ gap: 8px;
2850
+ min-width: 0;
2851
+ font-size: 14px;
2852
+ line-height: 20px;
2853
+ }
2854
+ .rp-doc__h1 {
2855
+ margin: 0;
2856
+ font-size: 20px;
2857
+ line-height: 28px;
2858
+ font-weight: 500;
2859
+ }
2860
+ .rp-doc__h2 {
2861
+ margin: 16px 0 0;
2862
+ padding-bottom: 4px;
2863
+ border-bottom: 1px solid var(--border);
2864
+ font-size: 16px;
2865
+ line-height: 24px;
2866
+ font-weight: 500;
2867
+ }
2868
+ .rp-doc__h3 {
2869
+ margin: 8px 0 0;
2870
+ font-size: 14px;
2871
+ line-height: 20px;
2872
+ font-weight: 500;
2873
+ }
2874
+ .rp-doc__p {
2875
+ margin: 0;
2876
+ overflow-wrap: anywhere;
2877
+ }
2878
+ .rp-doc__strong {
2879
+ font-weight: 500;
2880
+ }
2881
+ .rp-doc__list {
2882
+ margin: 0;
2883
+ padding-left: 20px;
2884
+ }
2885
+ .rp-doc__li {
2886
+ overflow-wrap: anywhere;
2887
+ }
2888
+ .rp-doc__note {
2889
+ display: flex;
2890
+ flex-direction: column;
2891
+ gap: 4px;
2892
+ padding: 8px 12px;
2893
+ border-left: 2px solid var(--border);
2894
+ background: color-mix(in oklab, var(--muted) 35%, var(--background));
2895
+ }
2896
+ .rp-doc__p--note {
2897
+ white-space: pre-wrap;
2898
+ }
2899
+ .rp-doc__scroll {
2900
+ overflow-x: auto;
2901
+ max-width: 100%;
2902
+ }
2903
+ .rp-doc__table {
2904
+ border-collapse: collapse;
2905
+ width: 100%;
2906
+ font-size: 12px;
2907
+ line-height: 16px;
2908
+ }
2909
+ .rp-doc__th,
2910
+ .rp-doc__td {
2911
+ padding: 4px 8px;
2912
+ border-bottom: 1px solid var(--border);
2913
+ text-align: left;
2914
+ vertical-align: top;
2915
+ }
2916
+ .rp-doc__th {
2917
+ font-family: var(--mono);
2918
+ font-size: 11px;
2919
+ font-weight: 500;
2920
+ letter-spacing: 0.1em;
2921
+ text-transform: uppercase;
2922
+ color: var(--muted-foreground);
2923
+ }
2924
+
2925
+ /* the printed copy lives in the body, outside every panel; print.css shows only it, and a screen never shows it */
2926
+ @media screen {
2927
+ .rp-print {
2928
+ display: none;
2929
+ }
2930
+ }
2931
+ .rp-copy-area {
2932
+ position: fixed;
2933
+ top: 0;
2934
+ left: 0;
2935
+ width: 1px;
2936
+ height: 1px;
2937
+ opacity: 0;
2938
+ }
2939
+
2940
+ @container (min-width: 720px) {
2941
+ .rp-cols {
2942
+ grid-template-columns: minmax(260px, 340px) minmax(0, 1fr);
2943
+ }
2944
+ }
2945
+ @media (pointer: coarse) {
2946
+ .rp-doc__scroll {
2947
+ -webkit-overflow-scrolling: touch;
2948
+ }
2949
+ }
2950
+
2951
+ /* -- layouts · .lg- the legacy and fixture shells (Run 3, slice 3D) -- */
2952
+ /* The legacy and fixture cockpit's two columns: the list head (a stack) and the rail's tile column. */
2953
+ .lg-stack {
2954
+ flex: none;
2955
+ display: flex;
2956
+ flex-direction: column;
2957
+ gap: 12px;
2958
+ }
2959
+ .lg-rail-col {
2960
+ flex: 0 1 auto;
2961
+ min-height: 0;
2962
+ align-self: stretch;
2963
+ margin-top: -3px;
2964
+ padding-top: 3px;
2965
+ display: flex;
2966
+ flex-direction: column;
2967
+ align-items: center;
2968
+ gap: 10px;
2969
+ overflow-y: auto;
2970
+ }
2971
+
2972
+ /* The legacy cockpit's repository rail: one 36px tile per repository (the open one inverted), a dashed tile to add one. */
2973
+ .lg-rail-tile {
2974
+ box-sizing: content-box;
2975
+ position: relative;
2976
+ flex: none;
2977
+ width: 36px;
2978
+ height: 36px;
2979
+ display: grid;
2980
+ place-items: center;
2981
+ font: 600 14px var(--sans);
2982
+ background: var(--secondary);
2983
+ color: var(--foreground);
2984
+ border: 1px solid transparent;
2985
+ }
2986
+ .lg-rail-tile[data-active="1"] {
2987
+ background: var(--primary);
2988
+ color: var(--primary-foreground);
2989
+ }
2990
+ .lg-rail-tile--add {
2991
+ background: transparent;
2992
+ border: 1px dashed var(--input);
2993
+ color: var(--muted-foreground);
2994
+ }
2995
+ .lg-rail-tile__dot {
2996
+ position: absolute;
2997
+ right: -3px;
2998
+ top: -3px;
2999
+ width: 9px;
3000
+ height: 9px;
3001
+ background: var(--warning);
3002
+ border: 2px solid var(--sidebar);
3003
+ }
3004
+ @media (hover: hover) {
3005
+ .lg-rail-tile--add:hover {
3006
+ color: var(--foreground);
3007
+ background: var(--accent);
3008
+ }
3009
+ }
3010
+ .lg-rail-tile:focus-visible {
3011
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
3012
+ }
3013
+ @media (pointer: coarse) {
3014
+ .lg-rail-tile {
3015
+ width: 44px;
3016
+ height: 44px;
3017
+ }
3018
+ }
3019
+
3020
+ /* The dock (panel 4): its strip and bottom bar are chrome and follow the theme; only the terminal pane inside it is dark. */
3021
+ .lg-dock {
3022
+ background: var(--background);
3023
+ display: flex;
3024
+ flex-direction: column;
3025
+ min-width: 0;
3026
+ min-height: 0;
3027
+ overflow: hidden;
3028
+ }
3029
+ .lg-dock-bottom {
3030
+ display: flex;
3031
+ gap: 10px;
3032
+ align-items: center;
3033
+ padding: 5px 12px;
3034
+ border-top: 1px solid var(--border);
3035
+ font-size: 12px;
3036
+ color: var(--muted-foreground);
3037
+ }
3038
+ .lg-dock-bottom__title {
3039
+ flex: 1;
3040
+ min-width: 0;
3041
+ overflow: hidden;
3042
+ text-overflow: ellipsis;
3043
+ white-space: nowrap;
3044
+ font-family: var(--mono);
3045
+ color: var(--foreground);
3046
+ }
3047
+
3048
+ /* R27: the dock draws no rounded corner. The tab strip and the scratchpad were drawn with inline radii (workspace-cockpit-nav);
3049
+ 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. */
3050
+ .lg-dock *:not([data-tab-dot]) {
3051
+ border-radius: 0 !important;
3052
+ }
3053
+
3054
+ /* -- end of the layout sections: add nothing below this line -- */