holo-codex 0.1.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 (149) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/CONTRIBUTING.md +54 -0
  3. package/LICENSE +21 -0
  4. package/README.md +215 -0
  5. package/README.zh-CN.md +215 -0
  6. package/SECURITY.md +39 -0
  7. package/assets/brand/README.md +35 -0
  8. package/assets/brand/holo-codex-icon.svg +28 -0
  9. package/assets/brand/holo-codex-lockup.svg +49 -0
  10. package/assets/brand/holo-codex-mark.svg +33 -0
  11. package/assets/brand/holo-codex-plugin-card.png +0 -0
  12. package/assets/brand/holo-codex-plugin-card.svg +81 -0
  13. package/assets/brand/holo-codex-readme-hero.png +0 -0
  14. package/assets/brand/holo-codex-readme-hero.svg +140 -0
  15. package/assets/brand/holo-codex-social-preview.png +0 -0
  16. package/assets/brand/holo-codex-social-preview.svg +130 -0
  17. package/assets/brand/holo-codex-wordmark-options.svg +52 -0
  18. package/docs/checklists/agent-loop-first-delivery-audit.md +129 -0
  19. package/docs/examples/generic-loop-repo-hygiene.md +168 -0
  20. package/docs/install.md +190 -0
  21. package/docs/local-release-readiness.md +206 -0
  22. package/docs/release-checklist.md +144 -0
  23. package/docs/self-bootstrap.md +150 -0
  24. package/docs/trust-and-safety.md +45 -0
  25. package/package.json +83 -0
  26. package/plugins/autonomous-pr-loop/.codex-plugin/plugin.json +17 -0
  27. package/plugins/autonomous-pr-loop/.mcp.json +13 -0
  28. package/plugins/autonomous-pr-loop/bin/agent-loop.mjs +31 -0
  29. package/plugins/autonomous-pr-loop/core/artifacts.ts +164 -0
  30. package/plugins/autonomous-pr-loop/core/autonomy-policy.ts +206 -0
  31. package/plugins/autonomous-pr-loop/core/ci.ts +131 -0
  32. package/plugins/autonomous-pr-loop/core/cli-i18n.ts +123 -0
  33. package/plugins/autonomous-pr-loop/core/cli.ts +1413 -0
  34. package/plugins/autonomous-pr-loop/core/command-runner.ts +446 -0
  35. package/plugins/autonomous-pr-loop/core/command.ts +47 -0
  36. package/plugins/autonomous-pr-loop/core/config-editor.ts +140 -0
  37. package/plugins/autonomous-pr-loop/core/config.ts +293 -0
  38. package/plugins/autonomous-pr-loop/core/controller-host.ts +19 -0
  39. package/plugins/autonomous-pr-loop/core/dashboard-server.ts +536 -0
  40. package/plugins/autonomous-pr-loop/core/delivery-work-item.ts +217 -0
  41. package/plugins/autonomous-pr-loop/core/doctor.ts +335 -0
  42. package/plugins/autonomous-pr-loop/core/errors.ts +82 -0
  43. package/plugins/autonomous-pr-loop/core/gate-recovery.ts +176 -0
  44. package/plugins/autonomous-pr-loop/core/gates.ts +26 -0
  45. package/plugins/autonomous-pr-loop/core/generic-lifecycle.ts +399 -0
  46. package/plugins/autonomous-pr-loop/core/git.ts +213 -0
  47. package/plugins/autonomous-pr-loop/core/github.ts +269 -0
  48. package/plugins/autonomous-pr-loop/core/gitnexus.ts +90 -0
  49. package/plugins/autonomous-pr-loop/core/happy.ts +42 -0
  50. package/plugins/autonomous-pr-loop/core/hook-capture.ts +115 -0
  51. package/plugins/autonomous-pr-loop/core/hook-events.ts +22 -0
  52. package/plugins/autonomous-pr-loop/core/hook-installation.ts +85 -0
  53. package/plugins/autonomous-pr-loop/core/hook-observer.ts +84 -0
  54. package/plugins/autonomous-pr-loop/core/hook-policy.ts +423 -0
  55. package/plugins/autonomous-pr-loop/core/hook-router.ts +452 -0
  56. package/plugins/autonomous-pr-loop/core/index.ts +32 -0
  57. package/plugins/autonomous-pr-loop/core/local-install.ts +778 -0
  58. package/plugins/autonomous-pr-loop/core/locale.ts +60 -0
  59. package/plugins/autonomous-pr-loop/core/loop-shapes.ts +190 -0
  60. package/plugins/autonomous-pr-loop/core/mcp-controller.ts +1479 -0
  61. package/plugins/autonomous-pr-loop/core/notification-feed.ts +263 -0
  62. package/plugins/autonomous-pr-loop/core/plan-parser.ts +206 -0
  63. package/plugins/autonomous-pr-loop/core/plugin-paths.ts +32 -0
  64. package/plugins/autonomous-pr-loop/core/policy.ts +65 -0
  65. package/plugins/autonomous-pr-loop/core/pr-lifecycle.ts +464 -0
  66. package/plugins/autonomous-pr-loop/core/pr-selector.ts +284 -0
  67. package/plugins/autonomous-pr-loop/core/profiles.ts +439 -0
  68. package/plugins/autonomous-pr-loop/core/redaction.ts +17 -0
  69. package/plugins/autonomous-pr-loop/core/repo-root.ts +22 -0
  70. package/plugins/autonomous-pr-loop/core/review-comments.ts +77 -0
  71. package/plugins/autonomous-pr-loop/core/scope-guard.ts +179 -0
  72. package/plugins/autonomous-pr-loop/core/state-machine.ts +828 -0
  73. package/plugins/autonomous-pr-loop/core/state-types.ts +130 -0
  74. package/plugins/autonomous-pr-loop/core/storage.ts +2527 -0
  75. package/plugins/autonomous-pr-loop/core/types.ts +567 -0
  76. package/plugins/autonomous-pr-loop/core/worker-events.ts +412 -0
  77. package/plugins/autonomous-pr-loop/core/worker-policy.ts +72 -0
  78. package/plugins/autonomous-pr-loop/core/worker-prompts.ts +182 -0
  79. package/plugins/autonomous-pr-loop/core/worker.ts +809 -0
  80. package/plugins/autonomous-pr-loop/core/workflow-board.ts +1515 -0
  81. package/plugins/autonomous-pr-loop/hooks/dist/permission-request.js +2462 -0
  82. package/plugins/autonomous-pr-loop/hooks/dist/post-compact.js +2462 -0
  83. package/plugins/autonomous-pr-loop/hooks/dist/post-tool-use.js +2462 -0
  84. package/plugins/autonomous-pr-loop/hooks/dist/pre-compact.js +2462 -0
  85. package/plugins/autonomous-pr-loop/hooks/dist/pre-tool-use.js +3460 -0
  86. package/plugins/autonomous-pr-loop/hooks/dist/session-start.js +2462 -0
  87. package/plugins/autonomous-pr-loop/hooks/dist/stop.js +2462 -0
  88. package/plugins/autonomous-pr-loop/hooks/dist/user-prompt-submit.js +2462 -0
  89. package/plugins/autonomous-pr-loop/hooks/hooks.json +106 -0
  90. package/plugins/autonomous-pr-loop/hooks/observe-runner.ts +25 -0
  91. package/plugins/autonomous-pr-loop/hooks/permission-request.ts +4 -0
  92. package/plugins/autonomous-pr-loop/hooks/post-compact.ts +4 -0
  93. package/plugins/autonomous-pr-loop/hooks/post-tool-use.ts +4 -0
  94. package/plugins/autonomous-pr-loop/hooks/pre-compact.ts +4 -0
  95. package/plugins/autonomous-pr-loop/hooks/pre-tool-use.ts +44 -0
  96. package/plugins/autonomous-pr-loop/hooks/session-start.ts +4 -0
  97. package/plugins/autonomous-pr-loop/hooks/stop.ts +4 -0
  98. package/plugins/autonomous-pr-loop/hooks/user-prompt-submit.ts +4 -0
  99. package/plugins/autonomous-pr-loop/mcp-server/src/index.ts +87 -0
  100. package/plugins/autonomous-pr-loop/mcp-server/src/tools.ts +205 -0
  101. package/plugins/autonomous-pr-loop/package.json +9 -0
  102. package/plugins/autonomous-pr-loop/schemas/config.schema.json +74 -0
  103. package/plugins/autonomous-pr-loop/schemas/marketplace.schema.json +46 -0
  104. package/plugins/autonomous-pr-loop/schemas/plugin.schema.json +32 -0
  105. package/plugins/autonomous-pr-loop/schemas/state.schema.json +19 -0
  106. package/plugins/autonomous-pr-loop/schemas/worker-event.schema.json +19 -0
  107. package/plugins/autonomous-pr-loop/schemas/worker-result.schema.json +58 -0
  108. package/plugins/autonomous-pr-loop/scripts/agent-loop.ts +44 -0
  109. package/plugins/autonomous-pr-loop/skills/autonomous-pr-loop/SKILL.md +26 -0
  110. package/plugins/autonomous-pr-loop/skills/autonomous-pr-loop/agents/openai.yaml +6 -0
  111. package/plugins/autonomous-pr-loop/ui/index.html +26 -0
  112. package/plugins/autonomous-pr-loop/ui/public/favicon.svg +7 -0
  113. package/plugins/autonomous-pr-loop/ui/src/api.ts +639 -0
  114. package/plugins/autonomous-pr-loop/ui/src/app.tsx +238 -0
  115. package/plugins/autonomous-pr-loop/ui/src/components/ActivityBadge.tsx +31 -0
  116. package/plugins/autonomous-pr-loop/ui/src/components/BrandMark.tsx +36 -0
  117. package/plugins/autonomous-pr-loop/ui/src/components/Collapsible.tsx +6 -0
  118. package/plugins/autonomous-pr-loop/ui/src/components/CommandPreview.tsx +15 -0
  119. package/plugins/autonomous-pr-loop/ui/src/components/ConfigEditor.tsx +389 -0
  120. package/plugins/autonomous-pr-loop/ui/src/components/EmptyState.tsx +10 -0
  121. package/plugins/autonomous-pr-loop/ui/src/components/ErrorState.tsx +12 -0
  122. package/plugins/autonomous-pr-loop/ui/src/components/List.tsx +7 -0
  123. package/plugins/autonomous-pr-loop/ui/src/components/MetricRow.tsx +6 -0
  124. package/plugins/autonomous-pr-loop/ui/src/components/ResponsiveTable.tsx +65 -0
  125. package/plugins/autonomous-pr-loop/ui/src/components/RiskBadge.tsx +10 -0
  126. package/plugins/autonomous-pr-loop/ui/src/components/StatusBadge.tsx +29 -0
  127. package/plugins/autonomous-pr-loop/ui/src/components/TopMetric.tsx +10 -0
  128. package/plugins/autonomous-pr-loop/ui/src/fixtures.ts +1152 -0
  129. package/plugins/autonomous-pr-loop/ui/src/i18n.ts +1105 -0
  130. package/plugins/autonomous-pr-loop/ui/src/main.tsx +14 -0
  131. package/plugins/autonomous-pr-loop/ui/src/pages/CommandCenter.tsx +470 -0
  132. package/plugins/autonomous-pr-loop/ui/src/pages/CommandCenterParts.tsx +276 -0
  133. package/plugins/autonomous-pr-loop/ui/src/pages/agent-timeline/AgentTimelineView.tsx +73 -0
  134. package/plugins/autonomous-pr-loop/ui/src/pages/artifact-viewer/ArtifactViewer.tsx +44 -0
  135. package/plugins/autonomous-pr-loop/ui/src/pages/dry-run-preview/DryRunPreview.tsx +66 -0
  136. package/plugins/autonomous-pr-loop/ui/src/pages/event-ledger/EventLedger.tsx +17 -0
  137. package/plugins/autonomous-pr-loop/ui/src/pages/gate-center/GateCenter.tsx +34 -0
  138. package/plugins/autonomous-pr-loop/ui/src/pages/mission-control/MissionControl.tsx +104 -0
  139. package/plugins/autonomous-pr-loop/ui/src/pages/mission-control/WorkflowBoard.tsx +577 -0
  140. package/plugins/autonomous-pr-loop/ui/src/pages/notifications/NotificationsView.tsx +30 -0
  141. package/plugins/autonomous-pr-loop/ui/src/pages/plan-navigator/PlanNavigator.tsx +19 -0
  142. package/plugins/autonomous-pr-loop/ui/src/pages/policy-config/PolicyConfig.tsx +22 -0
  143. package/plugins/autonomous-pr-loop/ui/src/pages/pr-inbox/PrInbox.tsx +26 -0
  144. package/plugins/autonomous-pr-loop/ui/src/pages/recovery-center/RecoveryCenter.tsx +125 -0
  145. package/plugins/autonomous-pr-loop/ui/src/pages/scope-guard/ScopeGuard.tsx +16 -0
  146. package/plugins/autonomous-pr-loop/ui/src/pages/worker-runs/WorkerRuns.tsx +39 -0
  147. package/plugins/autonomous-pr-loop/ui/src/styles.css +2673 -0
  148. package/plugins/autonomous-pr-loop/ui/src/theme.ts +57 -0
  149. package/tsconfig.json +18 -0
@@ -0,0 +1,2673 @@
1
+ :root {
2
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
3
+ --color-bg: #080d11;
4
+ --color-sidebar: #0c1217;
5
+ --color-main: #080d11;
6
+ --color-surface: #10171d;
7
+ --color-surface-subtle: #0f151b;
8
+ --color-surface-raised: #121b23;
9
+ --color-surface-muted: #0d1318;
10
+ --color-border: #26313a;
11
+ --color-border-strong: #33414d;
12
+ --color-border-control: #394855;
13
+ --color-divider: #26313a;
14
+ --color-text: #d9e2ea;
15
+ --color-text-strong: #eef4f8;
16
+ --color-text-muted: #8c9aa6;
17
+ --color-text-subtle: #91a3b2;
18
+ --color-text-soft: #9ba9b5;
19
+ --color-text-card: #d8e0e8;
20
+ --color-link: #83c1ff;
21
+ --color-link-strong: #b8d7ff;
22
+ --color-accent: #4a8bff;
23
+ --color-accent-bg: #12325c;
24
+ --color-accent-border: #214c83;
25
+ --color-focus-ring: #4a8bff;
26
+ --color-input-bg: #0a1015;
27
+ --color-input-text: #e7eef5;
28
+ --color-button-bg: #121b23;
29
+ --color-button-text: #dce6ee;
30
+ --color-code-bg: #17212a;
31
+ --color-code-text: #b8d7ff;
32
+ --color-log-bg: #0a1015;
33
+ --color-log-text: #9fb1c1;
34
+ --color-diff-text: #b8d7ff;
35
+ --color-success-text: #83e69b;
36
+ --color-success-bg: #123a24;
37
+ --color-success-border: #245c38;
38
+ --color-warning-text: #ffd76a;
39
+ --color-warning-bg: #3b2e0d;
40
+ --color-warning-border: #7a631d;
41
+ --color-danger-text: #ff9c9c;
42
+ --color-danger-bg: #3a1519;
43
+ --color-danger-border: #743139;
44
+ --color-info-text: #9ac7ff;
45
+ --color-info-bg: #102c50;
46
+ --color-info-border: #224f85;
47
+ --color-muted-text: #b4c0ca;
48
+ --color-muted-bg: #172028;
49
+ --color-muted-border: #33414d;
50
+ --color-disabled: #8f9eaa;
51
+ color-scheme: dark;
52
+ background: var(--color-bg);
53
+ color: var(--color-text);
54
+ font-synthesis: none;
55
+ text-rendering: optimizeLegibility;
56
+ }
57
+
58
+ :root[data-theme="dark"] {
59
+ color-scheme: dark;
60
+ }
61
+
62
+ :root[data-theme="light"] {
63
+ color-scheme: light;
64
+ --color-bg: #f3f6f8;
65
+ --color-sidebar: #ffffff;
66
+ --color-main: #f3f6f8;
67
+ --color-surface: #ffffff;
68
+ --color-surface-subtle: #f8fafc;
69
+ --color-surface-raised: #eef3f7;
70
+ --color-surface-muted: #ffffff;
71
+ --color-border: #d7e0e8;
72
+ --color-border-strong: #bdc9d4;
73
+ --color-border-control: #acbbc8;
74
+ --color-divider: #d7e0e8;
75
+ --color-text: #17212a;
76
+ --color-text-strong: #0b1218;
77
+ --color-text-muted: #536372;
78
+ --color-text-subtle: #657685;
79
+ --color-text-soft: #5d6f7f;
80
+ --color-text-card: #1d2a35;
81
+ --color-link: #075fb8;
82
+ --color-link-strong: #064f9a;
83
+ --color-accent: #1669c7;
84
+ --color-accent-bg: #dcecff;
85
+ --color-accent-border: #8cbcf0;
86
+ --color-focus-ring: #1669c7;
87
+ --color-input-bg: #ffffff;
88
+ --color-input-text: #17212a;
89
+ --color-button-bg: #ffffff;
90
+ --color-button-text: #17212a;
91
+ --color-code-bg: #eaf1f8;
92
+ --color-code-text: #064f9a;
93
+ --color-log-bg: #eef3f7;
94
+ --color-log-text: #344759;
95
+ --color-diff-text: #064f9a;
96
+ --color-success-text: #0f6930;
97
+ --color-success-bg: #e4f7e9;
98
+ --color-success-border: #8ac89b;
99
+ --color-warning-text: #755300;
100
+ --color-warning-bg: #fff3c4;
101
+ --color-warning-border: #d8b542;
102
+ --color-danger-text: #9b242d;
103
+ --color-danger-bg: #ffe7e9;
104
+ --color-danger-border: #e29ba2;
105
+ --color-info-text: #075fb8;
106
+ --color-info-bg: #e4f0ff;
107
+ --color-info-border: #8cbcf0;
108
+ --color-muted-text: #52606d;
109
+ --color-muted-bg: #eef3f7;
110
+ --color-muted-border: #c6d1dc;
111
+ --color-disabled: #748494;
112
+ }
113
+
114
+ * {
115
+ box-sizing: border-box;
116
+ }
117
+
118
+ html,
119
+ body,
120
+ #root {
121
+ width: 100%;
122
+ min-height: 100%;
123
+ margin: 0;
124
+ }
125
+
126
+ body {
127
+ background: var(--color-bg);
128
+ overflow-x: hidden;
129
+ }
130
+
131
+ button,
132
+ textarea,
133
+ input,
134
+ select {
135
+ font: inherit;
136
+ }
137
+
138
+ button {
139
+ cursor: pointer;
140
+ }
141
+
142
+ button:focus-visible,
143
+ textarea:focus-visible,
144
+ input:focus-visible,
145
+ select:focus-visible {
146
+ outline: 2px solid var(--color-focus-ring);
147
+ outline-offset: 2px;
148
+ }
149
+
150
+ button:disabled {
151
+ cursor: not-allowed;
152
+ opacity: 0.55;
153
+ }
154
+
155
+ .icon-button {
156
+ width: 32px;
157
+ height: 32px;
158
+ display: inline-flex;
159
+ align-items: center;
160
+ justify-content: center;
161
+ border: 1px solid var(--color-border);
162
+ border-radius: 6px;
163
+ background: var(--color-button-bg);
164
+ color: var(--color-button-text);
165
+ }
166
+
167
+ .workflow-board {
168
+ min-width: 0;
169
+ position: relative;
170
+ display: grid;
171
+ gap: 14px;
172
+ padding: 16px;
173
+ border: 1px solid var(--color-border-strong);
174
+ border-radius: 6px;
175
+ background: var(--color-surface);
176
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.08);
177
+ }
178
+
179
+ .workflow-board__summary {
180
+ min-width: 0;
181
+ display: grid;
182
+ grid-template-columns: minmax(0, 1.2fr) minmax(280px, 0.8fr);
183
+ gap: 12px;
184
+ align-items: start;
185
+ }
186
+
187
+ .workflow-board__summary h2,
188
+ .workflow-detail h3,
189
+ .workflow-matrix h4,
190
+ .workflow-stage-card h4,
191
+ .workflow-evidence h4 {
192
+ margin: 0;
193
+ color: var(--color-text-strong);
194
+ }
195
+
196
+ .workflow-board__summary p,
197
+ .workflow-detail p,
198
+ .workflow-stage-card p,
199
+ .workflow-blocker p {
200
+ margin: 6px 0 0;
201
+ color: var(--color-text-muted);
202
+ }
203
+
204
+ .workflow-board__facts {
205
+ min-width: 0;
206
+ display: grid;
207
+ grid-template-columns: repeat(2, minmax(0, 1fr));
208
+ border: 1px solid var(--color-border);
209
+ border-radius: 6px;
210
+ background: var(--color-surface-subtle);
211
+ overflow: hidden;
212
+ }
213
+
214
+ .workflow-board__facts div {
215
+ min-width: 0;
216
+ padding: 10px;
217
+ border-right: 1px solid var(--color-border);
218
+ border-bottom: 1px solid var(--color-border);
219
+ }
220
+
221
+ .workflow-board__facts div:nth-child(2n) {
222
+ border-right: 0;
223
+ }
224
+
225
+ .workflow-board__facts span,
226
+ .workflow-matrix__row small,
227
+ .actor-chip small {
228
+ display: block;
229
+ color: var(--color-text-muted);
230
+ font-size: 0.78rem;
231
+ }
232
+
233
+ .workflow-board__facts strong {
234
+ display: block;
235
+ overflow-wrap: anywhere;
236
+ }
237
+
238
+ .workflow-rail {
239
+ min-width: 0;
240
+ position: relative;
241
+ display: grid;
242
+ grid-template-columns: repeat(8, minmax(0, 1fr));
243
+ gap: 0;
244
+ overflow-x: auto;
245
+ padding: 4px 2px 8px;
246
+ scrollbar-width: thin;
247
+ }
248
+
249
+ .workflow-rail__stage::before {
250
+ content: "";
251
+ position: absolute;
252
+ left: 0;
253
+ right: 0;
254
+ top: 19px;
255
+ height: 2px;
256
+ background: var(--color-border-strong);
257
+ }
258
+
259
+ .workflow-rail__stage:first-child::before {
260
+ left: 50%;
261
+ }
262
+
263
+ .workflow-rail__stage:last-child::before {
264
+ right: 50%;
265
+ }
266
+
267
+ .workflow-rail__stage {
268
+ min-width: 0;
269
+ position: relative;
270
+ z-index: 1;
271
+ display: grid;
272
+ grid-template-rows: auto auto auto;
273
+ gap: 7px;
274
+ justify-items: center;
275
+ border: 0;
276
+ border-radius: 0;
277
+ padding: 0 7px;
278
+ background: transparent;
279
+ color: var(--color-text);
280
+ text-align: center;
281
+ }
282
+
283
+ .workflow-rail__stage.is-selected {
284
+ background: transparent;
285
+ }
286
+
287
+ .workflow-rail__node {
288
+ position: relative;
289
+ z-index: 1;
290
+ width: 34px;
291
+ height: 34px;
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ border: 2px solid var(--color-border-strong);
296
+ border-radius: 999px;
297
+ background: var(--color-surface);
298
+ color: var(--color-text-muted);
299
+ font-weight: 800;
300
+ line-height: 1;
301
+ }
302
+
303
+ .workflow-rail__label {
304
+ min-width: 0;
305
+ max-width: 100%;
306
+ color: var(--color-text-strong);
307
+ font-size: 0.9rem;
308
+ font-weight: 700;
309
+ line-height: 1.15;
310
+ overflow-wrap: normal;
311
+ }
312
+
313
+ .workflow-rail__meta {
314
+ min-width: 0;
315
+ display: grid;
316
+ justify-items: center;
317
+ gap: 4px;
318
+ }
319
+
320
+ .workflow-rail__stage--done .workflow-rail__node {
321
+ border-color: var(--color-success-border);
322
+ background: var(--color-success-bg);
323
+ color: var(--color-success-text);
324
+ }
325
+
326
+ .workflow-rail__stage--blocked .workflow-rail__node,
327
+ .workflow-rail__stage--failed .workflow-rail__node {
328
+ border-color: var(--color-danger-border);
329
+ background: var(--color-danger-bg);
330
+ color: var(--color-danger-text);
331
+ }
332
+
333
+ .workflow-rail__stage--active .workflow-rail__node,
334
+ .workflow-rail__stage--manual .workflow-rail__node {
335
+ border-color: var(--color-accent-border);
336
+ background: var(--color-accent-bg);
337
+ color: var(--color-text-strong);
338
+ box-shadow: 0 0 0 4px var(--color-accent-bg);
339
+ }
340
+
341
+ .workflow-rail__stage.is-selected .workflow-rail__label {
342
+ color: var(--color-accent);
343
+ }
344
+
345
+ .workflow-rail__stage small {
346
+ color: var(--color-text-muted);
347
+ }
348
+
349
+ .workflow-peek {
350
+ position: absolute;
351
+ z-index: 3;
352
+ left: var(--workflow-peek-left, 50%);
353
+ top: var(--workflow-peek-top, 156px);
354
+ width: min(360px, calc(100% - 32px));
355
+ max-width: min(360px, calc(100% - 32px));
356
+ max-height: 300px;
357
+ overflow: auto;
358
+ display: grid;
359
+ gap: 7px;
360
+ padding: 14px 12px 12px;
361
+ border: 1px solid var(--color-border-strong);
362
+ border-radius: 8px;
363
+ background: var(--color-surface-raised);
364
+ box-shadow: 0 16px 36px rgba(0, 0, 0, 0.28);
365
+ transform: translate(-50%, -100%);
366
+ animation: workflowPeekIn 140ms ease-out;
367
+ }
368
+
369
+ .workflow-peek .icon-button {
370
+ position: absolute;
371
+ top: 10px;
372
+ right: 10px;
373
+ }
374
+
375
+ .workflow-peek h3 {
376
+ margin: 0 34px 4px 0;
377
+ line-height: 1.2;
378
+ }
379
+
380
+ .workflow-peek > p {
381
+ margin: 0 0 8px;
382
+ }
383
+
384
+ @keyframes workflowPeekIn {
385
+ from {
386
+ opacity: 0;
387
+ transform: translate(-50%, calc(-100% + 10px));
388
+ }
389
+ to {
390
+ opacity: 1;
391
+ transform: translate(-50%, -100%);
392
+ }
393
+ }
394
+
395
+ .workflow-board__body {
396
+ min-width: 0;
397
+ display: grid;
398
+ grid-template-columns: minmax(190px, 230px) minmax(0, 1fr);
399
+ gap: 16px;
400
+ }
401
+
402
+ .workflow-board__body:has(.workflow-inspector.is-collapsed) {
403
+ grid-template-columns: 40px minmax(0, 1fr);
404
+ }
405
+
406
+ .workflow-inspector,
407
+ .workflow-detail {
408
+ min-width: 0;
409
+ }
410
+
411
+ .workflow-inspector {
412
+ position: relative;
413
+ align-self: start;
414
+ min-height: 100%;
415
+ padding-right: 10px;
416
+ border-right: 1px solid var(--color-border);
417
+ background: transparent;
418
+ }
419
+
420
+ .workflow-inspector.is-collapsed {
421
+ display: grid;
422
+ order: 0;
423
+ justify-items: center;
424
+ padding: 8px 0;
425
+ border-right-width: 2px;
426
+ border-right-color: var(--color-border-strong);
427
+ }
428
+
429
+ .workflow-inspector__toggle {
430
+ width: 22px;
431
+ height: 22px;
432
+ border-radius: 999px;
433
+ border-color: var(--color-border-strong);
434
+ background: var(--color-surface-raised);
435
+ color: var(--color-text);
436
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.14);
437
+ opacity: 1;
438
+ }
439
+
440
+ .workflow-inspector__toggle:hover,
441
+ .workflow-inspector__toggle:focus-visible {
442
+ border-color: var(--color-accent-border);
443
+ color: var(--color-accent);
444
+ }
445
+
446
+ .workflow-inspector__control {
447
+ position: absolute;
448
+ top: 8px;
449
+ right: -11px;
450
+ z-index: 2;
451
+ }
452
+
453
+ .workflow-inspector__stage {
454
+ display: grid;
455
+ gap: 10px;
456
+ padding: 6px 0;
457
+ }
458
+
459
+ .workflow-inspector__heading {
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: space-between;
463
+ gap: 8px;
464
+ padding-right: 8px;
465
+ }
466
+
467
+ .workflow-inspector__heading strong {
468
+ display: block;
469
+ color: var(--color-text-strong);
470
+ }
471
+
472
+ .workflow-inspector__hint {
473
+ margin: 0;
474
+ color: var(--color-text-muted);
475
+ font-size: 0.85rem;
476
+ line-height: 1.45;
477
+ }
478
+
479
+ .workflow-inspector__stage ul {
480
+ margin: 0;
481
+ padding: 0;
482
+ list-style: none;
483
+ }
484
+
485
+ .workflow-inspector__stage li {
486
+ display: grid;
487
+ grid-template-columns: minmax(0, 1fr);
488
+ gap: 6px;
489
+ padding: 8px 8px 8px 0;
490
+ border-top: 1px solid var(--color-border);
491
+ color: var(--color-text);
492
+ }
493
+
494
+ .workflow-inspector__submeta {
495
+ display: flex;
496
+ flex-wrap: wrap;
497
+ gap: 6px;
498
+ align-items: center;
499
+ }
500
+
501
+ .workflow-inspector__collapsed {
502
+ display: grid;
503
+ justify-items: center;
504
+ gap: 8px;
505
+ padding-top: 42px;
506
+ }
507
+
508
+ .workflow-inspector__dot {
509
+ width: 9px;
510
+ height: 9px;
511
+ border-radius: 999px;
512
+ border: 1px solid var(--color-border-strong);
513
+ background: var(--color-surface);
514
+ }
515
+
516
+ .workflow-inspector__dot--done {
517
+ border-color: var(--color-success-border);
518
+ background: var(--color-success-bg);
519
+ }
520
+
521
+ .workflow-inspector__dot--blocked,
522
+ .workflow-inspector__dot--failed {
523
+ border-color: var(--color-danger-border);
524
+ background: var(--color-danger-bg);
525
+ }
526
+
527
+ .workflow-inspector__dot--active,
528
+ .workflow-inspector__dot--manual {
529
+ border-color: var(--color-accent-border);
530
+ background: var(--color-accent-bg);
531
+ }
532
+
533
+ .workflow-inspector__submeta small {
534
+ color: var(--color-text-muted);
535
+ font-size: 0.74rem;
536
+ }
537
+
538
+ .workflow-detail {
539
+ border: 1px solid var(--color-border-strong);
540
+ border-radius: 6px;
541
+ background: var(--color-surface);
542
+ display: grid;
543
+ gap: 14px;
544
+ padding: 16px;
545
+ }
546
+
547
+ .workflow-detail__header {
548
+ display: grid;
549
+ grid-template-columns: minmax(0, 1fr) auto;
550
+ gap: 12px;
551
+ align-items: start;
552
+ }
553
+
554
+ .workflow-detail__side {
555
+ display: grid;
556
+ justify-items: end;
557
+ gap: 8px;
558
+ }
559
+
560
+ .actor-chip-row {
561
+ display: flex;
562
+ flex-wrap: wrap;
563
+ gap: 6px;
564
+ justify-content: flex-end;
565
+ }
566
+
567
+ .actor-chip {
568
+ min-width: 82px;
569
+ display: grid;
570
+ justify-items: center;
571
+ align-items: center;
572
+ gap: 2px;
573
+ padding: 6px 9px;
574
+ border: 1px solid var(--color-border);
575
+ border-radius: 999px;
576
+ background: var(--color-surface-subtle);
577
+ line-height: 1.15;
578
+ text-align: center;
579
+ }
580
+
581
+ .workflow-blocker {
582
+ display: grid;
583
+ grid-template-columns: auto minmax(0, 1fr);
584
+ gap: 10px;
585
+ padding: 10px;
586
+ border: 1px solid var(--color-danger-border);
587
+ border-radius: 6px;
588
+ background: var(--color-danger-bg);
589
+ color: var(--color-danger-text);
590
+ }
591
+
592
+ .workflow-blocker dl {
593
+ display: grid;
594
+ grid-template-columns: max-content minmax(0, 1fr);
595
+ gap: 4px 10px;
596
+ margin: 8px 0 0;
597
+ }
598
+
599
+ .workflow-blocker dt {
600
+ color: var(--color-text-muted);
601
+ font-size: 0.72rem;
602
+ text-transform: uppercase;
603
+ }
604
+
605
+ .workflow-blocker dd {
606
+ min-width: 0;
607
+ margin: 0;
608
+ overflow-wrap: anywhere;
609
+ }
610
+
611
+ .workflow-matrix,
612
+ .workflow-stage-card,
613
+ .workflow-append,
614
+ .workflow-evidence {
615
+ min-width: 0;
616
+ display: grid;
617
+ gap: 10px;
618
+ padding: 14px;
619
+ border: 1px solid var(--color-border);
620
+ border-radius: 6px;
621
+ background: var(--color-surface);
622
+ }
623
+
624
+ .workflow-matrix__rows {
625
+ display: grid;
626
+ gap: 6px;
627
+ }
628
+
629
+ .workflow-matrix__note {
630
+ min-width: 0;
631
+ display: flex;
632
+ flex-wrap: wrap;
633
+ gap: 6px 10px;
634
+ align-items: center;
635
+ margin: -2px 0 0;
636
+ color: var(--color-text-muted);
637
+ font-size: 0.84rem;
638
+ line-height: 1.35;
639
+ }
640
+
641
+ .workflow-matrix__note a {
642
+ color: var(--color-accent);
643
+ font-weight: 700;
644
+ text-decoration: none;
645
+ }
646
+
647
+ .workflow-matrix__note a:hover {
648
+ text-decoration: underline;
649
+ }
650
+
651
+ .workflow-matrix__row {
652
+ min-width: 0;
653
+ display: grid;
654
+ grid-template-columns: minmax(128px, 1fr) minmax(72px, max-content) minmax(140px, 1fr) minmax(140px, 1fr);
655
+ gap: 10px;
656
+ align-items: center;
657
+ padding: 10px;
658
+ border: 1px solid transparent;
659
+ border-radius: 5px;
660
+ border-bottom-color: var(--color-border);
661
+ background: var(--color-surface-subtle);
662
+ }
663
+
664
+ .workflow-matrix__row > span,
665
+ .workflow-matrix__row > small,
666
+ .workflow-matrix__row strong {
667
+ min-width: 0;
668
+ overflow-wrap: anywhere;
669
+ }
670
+
671
+ .workflow-matrix__row--review {
672
+ grid-template-columns: minmax(104px, 0.9fr) minmax(84px, max-content) minmax(92px, max-content) minmax(92px, max-content) minmax(160px, 1.2fr);
673
+ }
674
+
675
+ .workflow-matrix__row--header {
676
+ border-color: var(--color-border-strong);
677
+ background: var(--color-surface);
678
+ color: var(--color-text-muted);
679
+ font-size: 0.72rem;
680
+ font-weight: 700;
681
+ text-transform: uppercase;
682
+ }
683
+
684
+ .workflow-matrix__row--header span {
685
+ white-space: nowrap;
686
+ }
687
+
688
+ .workflow-matrix--review .workflow-matrix__row--header span {
689
+ white-space: normal;
690
+ }
691
+
692
+ .workflow-append label {
693
+ display: grid;
694
+ gap: 6px;
695
+ }
696
+
697
+ .workflow-append textarea {
698
+ min-height: 72px;
699
+ resize: vertical;
700
+ border: 1px solid var(--color-border-control);
701
+ border-radius: 6px;
702
+ padding: 9px;
703
+ background: var(--color-input-bg);
704
+ color: var(--color-input-text);
705
+ }
706
+
707
+ .workflow-append button {
708
+ width: 100%;
709
+ }
710
+
711
+ .workflow-append .button-row {
712
+ grid-template-columns: minmax(0, 1fr);
713
+ }
714
+
715
+ .workflow-evidence-list {
716
+ min-width: 0;
717
+ display: grid;
718
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
719
+ gap: 8px;
720
+ }
721
+
722
+ .workflow-evidence-list--compact {
723
+ max-height: 132px;
724
+ overflow: auto;
725
+ }
726
+
727
+ .workflow-evidence-chip {
728
+ min-width: 0;
729
+ width: 100%;
730
+ display: inline-grid;
731
+ grid-template-columns: auto minmax(0, 1fr);
732
+ gap: 2px 6px;
733
+ align-items: center;
734
+ text-align: left;
735
+ padding: 8px 10px;
736
+ border: 1px solid var(--color-border);
737
+ border-radius: 6px;
738
+ background: var(--color-surface-subtle);
739
+ color: inherit;
740
+ cursor: pointer;
741
+ }
742
+
743
+ .workflow-evidence-chip:hover,
744
+ .workflow-evidence-chip:focus-visible {
745
+ border-color: var(--color-accent-border);
746
+ outline: none;
747
+ }
748
+
749
+ .workflow-evidence-chip small {
750
+ grid-column: 2;
751
+ overflow: hidden;
752
+ color: var(--color-text-muted);
753
+ text-overflow: ellipsis;
754
+ white-space: nowrap;
755
+ }
756
+
757
+ .workflow-evidence-chip--drill_down_link {
758
+ border-color: var(--color-accent-border);
759
+ }
760
+
761
+ .workflow-evidence-preview {
762
+ position: relative;
763
+ width: min(100%, 520px);
764
+ padding: 12px;
765
+ border: 1px solid var(--color-accent-border);
766
+ border-radius: 6px;
767
+ background: var(--color-surface);
768
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.12);
769
+ }
770
+
771
+ .workflow-evidence-preview p {
772
+ margin: 6px 32px 10px 0;
773
+ color: var(--color-text);
774
+ }
775
+
776
+ .workflow-evidence-preview dl {
777
+ display: grid;
778
+ grid-template-columns: max-content minmax(0, 1fr);
779
+ gap: 4px 10px;
780
+ margin: 0;
781
+ color: var(--color-text-muted);
782
+ }
783
+
784
+ .workflow-evidence-preview dt {
785
+ font-size: 0.72rem;
786
+ text-transform: uppercase;
787
+ }
788
+
789
+ .workflow-evidence-preview dd {
790
+ min-width: 0;
791
+ margin: 0;
792
+ overflow-wrap: anywhere;
793
+ }
794
+
795
+ .workflow-evidence-preview .icon-button {
796
+ position: absolute;
797
+ top: 8px;
798
+ right: 8px;
799
+ }
800
+
801
+ .dashboard-shell,
802
+ .shell {
803
+ min-width: 0;
804
+ min-height: 100vh;
805
+ display: grid;
806
+ background: var(--color-bg);
807
+ }
808
+
809
+ .dashboard-shell {
810
+ grid-template-columns: 64px minmax(0, 1fr);
811
+ transition: grid-template-columns 160ms ease;
812
+ }
813
+
814
+ .dashboard-shell:has(.dashboard-sidebar:hover),
815
+ .dashboard-shell:has(.dashboard-sidebar:has(:focus-visible)) {
816
+ grid-template-columns: 230px minmax(0, 1fr);
817
+ }
818
+
819
+ .shell {
820
+ grid-template-columns: 230px minmax(0, 1fr);
821
+ }
822
+
823
+ .dashboard-sidebar,
824
+ .sidebar {
825
+ min-height: 100vh;
826
+ border-right: 1px solid var(--color-border);
827
+ background: var(--color-sidebar);
828
+ display: grid;
829
+ grid-template-rows: auto 1fr auto;
830
+ }
831
+
832
+ .dashboard-sidebar {
833
+ position: sticky;
834
+ top: 0;
835
+ align-self: start;
836
+ z-index: 20;
837
+ width: 64px;
838
+ height: 100vh;
839
+ overflow: hidden;
840
+ transition: width 160ms ease, box-shadow 160ms ease;
841
+ }
842
+
843
+ .dashboard-sidebar:hover,
844
+ .dashboard-sidebar:has(:focus-visible) {
845
+ width: 230px;
846
+ box-shadow: 12px 0 28px rgba(15, 23, 42, 0.14);
847
+ }
848
+
849
+ .dashboard-brand,
850
+ .brand {
851
+ min-width: 0;
852
+ min-height: 76px;
853
+ display: flex;
854
+ gap: 12px;
855
+ align-items: center;
856
+ padding: 18px 16px;
857
+ border-bottom: 1px solid var(--color-border);
858
+ }
859
+
860
+ .dashboard-brand {
861
+ gap: 0;
862
+ justify-content: center;
863
+ padding: 18px 13px;
864
+ }
865
+
866
+ .dashboard-sidebar:hover .dashboard-brand,
867
+ .dashboard-sidebar:has(:focus-visible) .dashboard-brand {
868
+ gap: 12px;
869
+ justify-content: flex-start;
870
+ padding: 18px 16px;
871
+ }
872
+
873
+ .brand-mark {
874
+ flex: 0 0 auto;
875
+ width: 38px;
876
+ height: 38px;
877
+ display: grid;
878
+ place-items: center;
879
+ border: 1px solid var(--color-border-strong);
880
+ border-radius: 10px;
881
+ background: var(--color-surface-raised);
882
+ color: var(--color-text-strong);
883
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.03);
884
+ }
885
+
886
+ .brand-logo {
887
+ width: 28px;
888
+ height: 28px;
889
+ display: block;
890
+ }
891
+
892
+ .brand-logo__gate {
893
+ fill: #f59e0b;
894
+ }
895
+
896
+ .dashboard-brand strong,
897
+ .dashboard-brand span,
898
+ .brand strong,
899
+ .brand span {
900
+ display: block;
901
+ overflow: hidden;
902
+ text-overflow: ellipsis;
903
+ white-space: nowrap;
904
+ }
905
+
906
+ .dashboard-brand > div:not(.brand-mark) {
907
+ min-width: 0;
908
+ width: 0;
909
+ max-width: 0;
910
+ overflow: hidden;
911
+ opacity: 0;
912
+ transition: max-width 120ms ease, opacity 120ms ease;
913
+ }
914
+
915
+ .dashboard-sidebar:hover .dashboard-brand > div:not(.brand-mark),
916
+ .dashboard-sidebar:has(:focus-visible) .dashboard-brand > div:not(.brand-mark) {
917
+ width: auto;
918
+ max-width: 150px;
919
+ opacity: 1;
920
+ }
921
+
922
+ .dashboard-brand strong,
923
+ .brand strong {
924
+ font-size: 15px;
925
+ line-height: 20px;
926
+ }
927
+
928
+ .dashboard-brand span,
929
+ .brand span {
930
+ color: var(--color-text-muted);
931
+ font-size: 12px;
932
+ line-height: 16px;
933
+ }
934
+
935
+ .nav-list {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 4px;
939
+ padding: 16px 10px;
940
+ }
941
+
942
+ .dashboard-sidebar .nav-list {
943
+ align-items: center;
944
+ min-height: 0;
945
+ overflow-y: auto;
946
+ scrollbar-width: none;
947
+ }
948
+
949
+ .dashboard-sidebar .nav-list::-webkit-scrollbar {
950
+ display: none;
951
+ }
952
+
953
+ .dashboard-sidebar:hover .nav-list,
954
+ .dashboard-sidebar:has(:focus-visible) .nav-list {
955
+ align-items: stretch;
956
+ }
957
+
958
+ .nav-item {
959
+ min-width: 0;
960
+ display: flex;
961
+ align-items: center;
962
+ gap: 10px;
963
+ height: 38px;
964
+ padding: 0 10px;
965
+ border: 1px solid transparent;
966
+ border-radius: 7px;
967
+ background: transparent;
968
+ color: var(--color-muted-text);
969
+ text-align: left;
970
+ }
971
+
972
+ .dashboard-sidebar .nav-item {
973
+ width: 38px;
974
+ justify-content: center;
975
+ gap: 0;
976
+ padding: 0;
977
+ }
978
+
979
+ .dashboard-sidebar:hover .nav-item,
980
+ .dashboard-sidebar:has(:focus-visible) .nav-item {
981
+ width: auto;
982
+ justify-content: flex-start;
983
+ gap: 10px;
984
+ padding: 0 10px;
985
+ }
986
+
987
+ .nav-item svg {
988
+ flex: 0 0 auto;
989
+ }
990
+
991
+ .nav-item span {
992
+ min-width: 0;
993
+ overflow: hidden;
994
+ text-overflow: ellipsis;
995
+ white-space: nowrap;
996
+ }
997
+
998
+ .dashboard-sidebar .nav-item span {
999
+ display: none;
1000
+ opacity: 0;
1001
+ transition: opacity 120ms ease;
1002
+ }
1003
+
1004
+ .dashboard-sidebar:hover .nav-item span,
1005
+ .dashboard-sidebar:has(:focus-visible) .nav-item span {
1006
+ display: block;
1007
+ opacity: 1;
1008
+ }
1009
+
1010
+ .nav-item.is-active {
1011
+ background: var(--color-accent-bg);
1012
+ border-color: var(--color-accent-border);
1013
+ color: var(--color-text-strong);
1014
+ }
1015
+
1016
+ .sidebar-footer-compact {
1017
+ display: grid;
1018
+ justify-items: center;
1019
+ gap: 6px;
1020
+ padding: 10px 0 14px;
1021
+ border-top: 1px solid var(--color-border);
1022
+ }
1023
+
1024
+ .dashboard-sidebar:hover .sidebar-footer-compact,
1025
+ .dashboard-sidebar:has(:focus-visible) .sidebar-footer-compact {
1026
+ display: none;
1027
+ }
1028
+
1029
+ .compact-theme-switcher {
1030
+ display: grid;
1031
+ gap: 6px;
1032
+ }
1033
+
1034
+ .compact-icon-control {
1035
+ position: relative;
1036
+ width: 38px;
1037
+ height: 38px;
1038
+ display: grid;
1039
+ place-items: center;
1040
+ border: 1px solid transparent;
1041
+ border-radius: 7px;
1042
+ background: transparent;
1043
+ color: var(--color-muted-text);
1044
+ }
1045
+
1046
+ .compact-icon-control:hover,
1047
+ .compact-icon-control:focus-visible,
1048
+ .compact-icon-control.is-active {
1049
+ border-color: var(--color-accent-border);
1050
+ background: var(--color-accent-bg);
1051
+ color: var(--color-text-strong);
1052
+ }
1053
+
1054
+ .compact-icon-control--select select {
1055
+ position: absolute;
1056
+ inset: 0;
1057
+ width: 100%;
1058
+ height: 100%;
1059
+ opacity: 0;
1060
+ cursor: pointer;
1061
+ }
1062
+
1063
+ .compact-status-dot {
1064
+ position: absolute;
1065
+ right: 8px;
1066
+ bottom: 8px;
1067
+ width: 7px;
1068
+ height: 7px;
1069
+ border-radius: 999px;
1070
+ border: 1px solid var(--color-surface);
1071
+ }
1072
+
1073
+ .compact-status-dot--green {
1074
+ background: var(--color-success-border);
1075
+ }
1076
+
1077
+ .compact-status-dot--yellow {
1078
+ background: var(--color-warning-border);
1079
+ }
1080
+
1081
+ .sidebar-footer {
1082
+ display: grid;
1083
+ gap: 12px;
1084
+ padding: 14px;
1085
+ border-top: 1px solid var(--color-border);
1086
+ }
1087
+
1088
+ .dashboard-sidebar .sidebar-footer {
1089
+ display: none;
1090
+ opacity: 0;
1091
+ pointer-events: none;
1092
+ transform: translateX(-8px);
1093
+ transition: opacity 120ms ease, transform 120ms ease;
1094
+ }
1095
+
1096
+ .dashboard-sidebar:hover .sidebar-footer,
1097
+ .dashboard-sidebar:has(:focus-visible) .sidebar-footer {
1098
+ display: grid;
1099
+ opacity: 1;
1100
+ pointer-events: auto;
1101
+ transform: translateX(0);
1102
+ }
1103
+
1104
+ .locale-switcher {
1105
+ display: grid;
1106
+ gap: 6px;
1107
+ color: var(--color-text-muted);
1108
+ font-size: 12px;
1109
+ line-height: 16px;
1110
+ }
1111
+
1112
+ .locale-switcher select {
1113
+ min-width: 0;
1114
+ width: 100%;
1115
+ height: 34px;
1116
+ border: 1px solid var(--color-border-control);
1117
+ border-radius: 7px;
1118
+ background: var(--color-input-bg);
1119
+ color: var(--color-text);
1120
+ padding: 0 8px;
1121
+ }
1122
+
1123
+ .theme-switcher {
1124
+ min-width: 0;
1125
+ display: grid;
1126
+ gap: 6px;
1127
+ color: var(--color-text-muted);
1128
+ font-size: 12px;
1129
+ line-height: 16px;
1130
+ }
1131
+
1132
+ .segmented-control {
1133
+ min-width: 0;
1134
+ display: grid;
1135
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1136
+ gap: 1px;
1137
+ padding: 2px;
1138
+ border: 1px solid var(--color-border-control);
1139
+ border-radius: 7px;
1140
+ background: var(--color-border);
1141
+ }
1142
+
1143
+ .segmented-button {
1144
+ min-width: 0;
1145
+ min-height: 30px;
1146
+ display: inline-flex;
1147
+ align-items: center;
1148
+ justify-content: center;
1149
+ gap: 5px;
1150
+ border: 0;
1151
+ border-radius: 5px;
1152
+ background: var(--color-input-bg);
1153
+ color: var(--color-text-muted);
1154
+ padding: 0 5px;
1155
+ }
1156
+
1157
+ .segmented-button span {
1158
+ min-width: 0;
1159
+ overflow: hidden;
1160
+ text-overflow: ellipsis;
1161
+ white-space: nowrap;
1162
+ }
1163
+
1164
+ .segmented-button.is-active {
1165
+ background: var(--color-accent-bg);
1166
+ color: var(--color-text-strong);
1167
+ }
1168
+
1169
+ .repo-chip {
1170
+ display: flex;
1171
+ gap: 10px;
1172
+ align-items: center;
1173
+ min-width: 0;
1174
+ color: var(--color-text-card);
1175
+ }
1176
+
1177
+ .repo-chip span {
1178
+ overflow: hidden;
1179
+ text-overflow: ellipsis;
1180
+ white-space: nowrap;
1181
+ }
1182
+
1183
+ .repo-chip--stacked {
1184
+ align-items: flex-start;
1185
+ display: grid;
1186
+ grid-template-columns: 18px minmax(0, 1fr);
1187
+ }
1188
+
1189
+ .repo-chip--stacked small {
1190
+ color: var(--color-text-subtle);
1191
+ font-size: 11px;
1192
+ grid-column: 2;
1193
+ line-height: 14px;
1194
+ min-width: 0;
1195
+ overflow: hidden;
1196
+ text-overflow: ellipsis;
1197
+ white-space: nowrap;
1198
+ }
1199
+
1200
+ .dashboard-main,
1201
+ .main {
1202
+ min-width: 0;
1203
+ display: grid;
1204
+ grid-template-rows: 78px minmax(0, 1fr);
1205
+ }
1206
+
1207
+ .topbar {
1208
+ display: grid;
1209
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1210
+ gap: 1px;
1211
+ border-bottom: 1px solid var(--color-border);
1212
+ background: var(--color-border);
1213
+ }
1214
+
1215
+ .top-metric {
1216
+ min-width: 0;
1217
+ display: grid;
1218
+ grid-template-columns: auto minmax(0, 1fr);
1219
+ align-items: center;
1220
+ gap: 12px;
1221
+ padding: 14px 18px;
1222
+ background: var(--color-surface-muted);
1223
+ }
1224
+
1225
+ .top-metric span,
1226
+ .eyebrow,
1227
+ .metric-row span,
1228
+ .health-cell span {
1229
+ color: var(--color-text-muted);
1230
+ font-size: 11px;
1231
+ line-height: 14px;
1232
+ letter-spacing: 0;
1233
+ text-transform: uppercase;
1234
+ }
1235
+
1236
+ .top-metric strong {
1237
+ display: block;
1238
+ overflow-wrap: anywhere;
1239
+ font-size: 15px;
1240
+ line-height: 21px;
1241
+ }
1242
+
1243
+ .workspace {
1244
+ min-height: 0;
1245
+ display: grid;
1246
+ grid-template-columns: minmax(0, 1fr) 330px;
1247
+ }
1248
+
1249
+ .dashboard-content,
1250
+ .content {
1251
+ min-width: 0;
1252
+ min-height: 0;
1253
+ overflow: auto;
1254
+ padding: 18px 14px 28px;
1255
+ }
1256
+
1257
+ .section-heading {
1258
+ min-width: 0;
1259
+ display: flex;
1260
+ align-items: flex-start;
1261
+ justify-content: space-between;
1262
+ gap: 16px;
1263
+ margin-bottom: 14px;
1264
+ }
1265
+
1266
+ .section-heading > div:first-child,
1267
+ .heading-actions {
1268
+ min-width: 0;
1269
+ }
1270
+
1271
+ .section-heading h1 {
1272
+ margin: 0;
1273
+ font-size: 19px;
1274
+ line-height: 26px;
1275
+ }
1276
+
1277
+ .section-heading p {
1278
+ margin: 3px 0 0;
1279
+ color: var(--color-text-soft);
1280
+ font-size: 13px;
1281
+ }
1282
+
1283
+ .heading-actions {
1284
+ display: flex;
1285
+ gap: 10px;
1286
+ align-items: center;
1287
+ }
1288
+
1289
+ .action-message {
1290
+ color: var(--color-link);
1291
+ font-size: 12px;
1292
+ }
1293
+
1294
+ .mission-grid,
1295
+ .two-stack,
1296
+ .config-editor {
1297
+ display: grid;
1298
+ gap: 12px;
1299
+ }
1300
+
1301
+ .mission-grid > *,
1302
+ .two-stack > *,
1303
+ .config-editor > * {
1304
+ min-width: 0;
1305
+ }
1306
+
1307
+ .summary-panel--mission {
1308
+ opacity: 0.9;
1309
+ }
1310
+
1311
+ .summary-panel--mission .metric-row {
1312
+ min-height: 74px;
1313
+ }
1314
+
1315
+ .focus-panel {
1316
+ min-width: 0;
1317
+ display: flex;
1318
+ justify-content: space-between;
1319
+ gap: 16px;
1320
+ align-items: flex-start;
1321
+ padding: 16px;
1322
+ border: 1px solid var(--color-border);
1323
+ border-top: 3px solid var(--color-accent);
1324
+ border-radius: 6px;
1325
+ background: var(--color-surface);
1326
+ overflow: hidden;
1327
+ }
1328
+
1329
+ .focus-panel > div {
1330
+ min-width: 0;
1331
+ }
1332
+
1333
+ .focus-panel h2 {
1334
+ margin: 2px 0 6px;
1335
+ font-size: 18px;
1336
+ line-height: 25px;
1337
+ }
1338
+
1339
+ .focus-panel h2,
1340
+ .focus-panel p,
1341
+ .section-heading h1,
1342
+ .section-heading p,
1343
+ .plain-list li {
1344
+ overflow-wrap: anywhere;
1345
+ }
1346
+
1347
+ .focus-panel p {
1348
+ margin: 0;
1349
+ color: var(--color-text-soft);
1350
+ font-size: 13px;
1351
+ }
1352
+
1353
+ .forecast-strip {
1354
+ display: grid;
1355
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1356
+ border: 1px solid var(--color-border);
1357
+ border-radius: 6px;
1358
+ background: var(--color-surface);
1359
+ overflow: hidden;
1360
+ }
1361
+
1362
+ .forecast-strip div {
1363
+ min-width: 0;
1364
+ display: grid;
1365
+ gap: 7px;
1366
+ padding: 13px;
1367
+ border-right: 1px solid var(--color-border);
1368
+ }
1369
+
1370
+ .forecast-strip div:last-child {
1371
+ border-right: 0;
1372
+ }
1373
+
1374
+ .forecast-strip span,
1375
+ .muted-copy {
1376
+ color: var(--color-text-muted);
1377
+ font-size: 12px;
1378
+ }
1379
+
1380
+ .forecast-strip strong {
1381
+ min-width: 0;
1382
+ overflow: hidden;
1383
+ text-overflow: ellipsis;
1384
+ white-space: nowrap;
1385
+ font-size: 14px;
1386
+ }
1387
+
1388
+ .summary-panel {
1389
+ display: grid;
1390
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1391
+ border: 1px solid var(--color-border);
1392
+ border-radius: 6px;
1393
+ background: var(--color-surface);
1394
+ overflow: hidden;
1395
+ }
1396
+
1397
+ .summary-panel--mission {
1398
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1399
+ }
1400
+
1401
+ .pr-summary {
1402
+ display: grid;
1403
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1404
+ border: 1px solid var(--color-border);
1405
+ border-radius: 6px;
1406
+ background: var(--color-surface);
1407
+ overflow: hidden;
1408
+ }
1409
+
1410
+ .metric-row,
1411
+ .health-cell {
1412
+ min-width: 0;
1413
+ display: grid;
1414
+ gap: 7px;
1415
+ padding: 14px;
1416
+ border-right: 1px solid var(--color-border);
1417
+ }
1418
+
1419
+ .top-metric--green,
1420
+ .metric-row--green {
1421
+ box-shadow: inset 0 3px 0 var(--color-success-border);
1422
+ }
1423
+
1424
+ .top-metric--yellow,
1425
+ .metric-row--yellow {
1426
+ box-shadow: inset 0 3px 0 var(--color-warning-border);
1427
+ }
1428
+
1429
+ .top-metric--red,
1430
+ .metric-row--red {
1431
+ box-shadow: inset 0 3px 0 var(--color-danger-border);
1432
+ }
1433
+
1434
+ .top-metric--blue,
1435
+ .metric-row--blue {
1436
+ box-shadow: inset 0 3px 0 var(--color-info-border);
1437
+ }
1438
+
1439
+ .top-metric--muted,
1440
+ .metric-row--muted {
1441
+ box-shadow: inset 0 3px 0 var(--color-border-strong);
1442
+ }
1443
+
1444
+ .metric-row:last-child,
1445
+ .health-cell:last-child {
1446
+ border-right: 0;
1447
+ }
1448
+
1449
+ .metric-row strong,
1450
+ .health-cell strong {
1451
+ min-width: 0;
1452
+ overflow: hidden;
1453
+ text-overflow: ellipsis;
1454
+ white-space: nowrap;
1455
+ font-size: 15px;
1456
+ }
1457
+
1458
+ .health-strip {
1459
+ display: grid;
1460
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1461
+ border: 1px solid var(--color-border);
1462
+ border-top: 3px solid var(--color-accent);
1463
+ border-radius: 6px;
1464
+ background: var(--color-surface);
1465
+ overflow: hidden;
1466
+ }
1467
+
1468
+ .command-preview {
1469
+ display: grid;
1470
+ grid-template-columns: auto minmax(0, 1fr) minmax(0, 1.2fr);
1471
+ align-items: center;
1472
+ gap: 16px;
1473
+ padding: 12px;
1474
+ border: 1px solid var(--color-border);
1475
+ background: var(--color-surface);
1476
+ }
1477
+
1478
+ .command-list {
1479
+ display: grid;
1480
+ gap: 8px;
1481
+ }
1482
+
1483
+ .command-line {
1484
+ min-width: 0;
1485
+ display: grid;
1486
+ grid-template-columns: auto minmax(0, 1fr);
1487
+ gap: 10px;
1488
+ align-items: center;
1489
+ padding: 8px 10px;
1490
+ border: 1px solid var(--color-border);
1491
+ background: var(--color-surface-raised);
1492
+ }
1493
+
1494
+ .command-line code {
1495
+ min-width: 0;
1496
+ overflow: hidden;
1497
+ text-overflow: ellipsis;
1498
+ white-space: nowrap;
1499
+ color: var(--color-link-strong);
1500
+ }
1501
+
1502
+ .disclosure-panel {
1503
+ min-width: 0;
1504
+ max-width: 100%;
1505
+ border: 1px solid var(--color-border);
1506
+ background: var(--color-surface-subtle);
1507
+ }
1508
+
1509
+ .disclosure-panel summary {
1510
+ min-width: 0;
1511
+ min-height: 44px;
1512
+ display: flex;
1513
+ align-items: center;
1514
+ justify-content: space-between;
1515
+ gap: 12px;
1516
+ padding: 10px 12px;
1517
+ cursor: pointer;
1518
+ list-style: none;
1519
+ }
1520
+
1521
+ .disclosure-panel summary span:first-child {
1522
+ min-width: 0;
1523
+ overflow: hidden;
1524
+ text-overflow: ellipsis;
1525
+ white-space: nowrap;
1526
+ }
1527
+
1528
+ .disclosure-panel summary::-webkit-details-marker {
1529
+ display: none;
1530
+ }
1531
+
1532
+ .disclosure-panel summary span:first-child {
1533
+ font-weight: 650;
1534
+ }
1535
+
1536
+ .disclosure-panel summary .status-badge {
1537
+ flex: 0 1 auto;
1538
+ justify-content: center;
1539
+ overflow: hidden;
1540
+ text-align: center;
1541
+ text-overflow: ellipsis;
1542
+ white-space: nowrap;
1543
+ }
1544
+
1545
+ .disclosure-panel > :not(summary) {
1546
+ padding: 10px 12px 12px;
1547
+ }
1548
+
1549
+ .disclosure-panel > .plain-list {
1550
+ padding: 10px 12px 12px 32px;
1551
+ }
1552
+
1553
+ .plain-list {
1554
+ margin: 0;
1555
+ padding-left: 18px;
1556
+ list-style-position: outside;
1557
+ color: var(--color-text-card);
1558
+ font-size: 13px;
1559
+ line-height: 21px;
1560
+ }
1561
+
1562
+ .scope-note {
1563
+ margin: 0;
1564
+ padding: 10px 12px;
1565
+ border: 1px solid var(--color-border);
1566
+ background: var(--color-surface-subtle);
1567
+ color: var(--color-text-soft);
1568
+ font-size: 12px;
1569
+ line-height: 18px;
1570
+ overflow-wrap: anywhere;
1571
+ }
1572
+
1573
+ .raw-message-details {
1574
+ min-width: 0;
1575
+ display: grid;
1576
+ gap: 8px;
1577
+ }
1578
+
1579
+ .raw-message-details > summary {
1580
+ min-height: 0;
1581
+ display: inline-flex;
1582
+ padding: 0;
1583
+ color: var(--color-link);
1584
+ cursor: pointer;
1585
+ font-size: 12px;
1586
+ line-height: 18px;
1587
+ list-style: revert;
1588
+ }
1589
+
1590
+ .raw-message-details pre {
1591
+ max-height: 180px;
1592
+ overflow: auto;
1593
+ margin: 6px 0 0;
1594
+ padding: 10px;
1595
+ border: 1px solid var(--color-border);
1596
+ border-radius: 6px;
1597
+ background: var(--color-log-bg);
1598
+ color: var(--color-log-text);
1599
+ font-size: 12px;
1600
+ line-height: 18px;
1601
+ white-space: pre-wrap;
1602
+ overflow-wrap: anywhere;
1603
+ }
1604
+
1605
+ .command-preview span,
1606
+ .command-preview p {
1607
+ color: var(--color-text-muted);
1608
+ font-size: 12px;
1609
+ }
1610
+
1611
+ .command-preview code {
1612
+ min-width: 0;
1613
+ overflow: hidden;
1614
+ text-overflow: ellipsis;
1615
+ white-space: nowrap;
1616
+ padding: 8px 10px;
1617
+ border-radius: 6px;
1618
+ background: var(--color-code-bg);
1619
+ color: var(--color-link-strong);
1620
+ }
1621
+
1622
+ .table-panel {
1623
+ min-width: 0;
1624
+ overflow: auto;
1625
+ border: 1px solid var(--color-border);
1626
+ background: var(--color-surface-subtle);
1627
+ }
1628
+
1629
+ .compact-card-list {
1630
+ display: none;
1631
+ }
1632
+
1633
+ .compact-data-card {
1634
+ min-width: 0;
1635
+ display: grid;
1636
+ gap: 10px;
1637
+ padding: 12px;
1638
+ border-bottom: 1px solid var(--color-border);
1639
+ background: var(--color-surface-subtle);
1640
+ }
1641
+
1642
+ .compact-data-card:last-child {
1643
+ border-bottom: 0;
1644
+ }
1645
+
1646
+ .compact-data-card__head {
1647
+ min-width: 0;
1648
+ display: grid;
1649
+ gap: 4px;
1650
+ }
1651
+
1652
+ .compact-data-card__head strong,
1653
+ .compact-data-card p {
1654
+ min-width: 0;
1655
+ margin: 0;
1656
+ overflow-wrap: anywhere;
1657
+ }
1658
+
1659
+ .compact-data-card__head span,
1660
+ .compact-data-card p {
1661
+ color: var(--color-text-subtle);
1662
+ font-size: 12px;
1663
+ line-height: 17px;
1664
+ }
1665
+
1666
+ .compact-data-card dl {
1667
+ display: grid;
1668
+ gap: 8px;
1669
+ margin: 0;
1670
+ }
1671
+
1672
+ .compact-data-card dl div {
1673
+ min-width: 0;
1674
+ display: grid;
1675
+ gap: 3px;
1676
+ }
1677
+
1678
+ .compact-data-card dd {
1679
+ overflow-wrap: anywhere;
1680
+ }
1681
+
1682
+ table {
1683
+ width: 100%;
1684
+ min-width: 680px;
1685
+ border-collapse: collapse;
1686
+ }
1687
+
1688
+ th,
1689
+ td {
1690
+ padding: 9px 11px;
1691
+ border-bottom: 1px solid var(--color-border);
1692
+ text-align: left;
1693
+ vertical-align: middle;
1694
+ font-size: 13px;
1695
+ overflow-wrap: anywhere;
1696
+ }
1697
+
1698
+ th {
1699
+ color: var(--color-disabled);
1700
+ font-size: 11px;
1701
+ text-transform: uppercase;
1702
+ background: var(--color-surface-raised);
1703
+ }
1704
+
1705
+ td {
1706
+ color: var(--color-text-card);
1707
+ }
1708
+
1709
+ td:first-child,
1710
+ th:first-child {
1711
+ padding-left: 14px;
1712
+ }
1713
+
1714
+ .event-ledger-table table {
1715
+ table-layout: fixed;
1716
+ }
1717
+
1718
+ .event-ledger-table th:nth-child(1),
1719
+ .event-ledger-table td:nth-child(1) {
1720
+ width: 72px;
1721
+ white-space: nowrap;
1722
+ }
1723
+
1724
+ .event-ledger-table th:nth-child(2),
1725
+ .event-ledger-table td:nth-child(2) {
1726
+ width: 92px;
1727
+ white-space: nowrap;
1728
+ }
1729
+
1730
+ .event-ledger-table th:nth-child(3),
1731
+ .event-ledger-table td:nth-child(3) {
1732
+ width: 190px;
1733
+ }
1734
+
1735
+ .event-ledger-table th:nth-child(1),
1736
+ .event-ledger-table th:nth-child(2),
1737
+ .event-ledger-table th:nth-child(3),
1738
+ .event-ledger-table td:nth-child(1),
1739
+ .event-ledger-table td:nth-child(2),
1740
+ .event-ledger-table td:nth-child(3) {
1741
+ overflow-wrap: normal;
1742
+ word-break: normal;
1743
+ }
1744
+
1745
+ .plan-list-table table {
1746
+ table-layout: fixed;
1747
+ }
1748
+
1749
+ .plan-list-table th:nth-child(1),
1750
+ .plan-list-table td:nth-child(1) {
1751
+ width: 86px;
1752
+ white-space: nowrap;
1753
+ }
1754
+
1755
+ .plan-list-table th:nth-child(2),
1756
+ .plan-list-table td:nth-child(2) {
1757
+ width: 120px;
1758
+ white-space: nowrap;
1759
+ }
1760
+
1761
+ .plan-list-table th:nth-child(3),
1762
+ .plan-list-table td:nth-child(3) {
1763
+ width: 48%;
1764
+ }
1765
+
1766
+ .plan-list-table th:nth-child(4),
1767
+ .plan-list-table td:nth-child(4) {
1768
+ width: 26%;
1769
+ }
1770
+
1771
+ .plan-list-table th:nth-child(1),
1772
+ .plan-list-table th:nth-child(2),
1773
+ .plan-list-table td:nth-child(1),
1774
+ .plan-list-table td:nth-child(2) {
1775
+ overflow-wrap: normal;
1776
+ word-break: normal;
1777
+ }
1778
+
1779
+ .empty-cell {
1780
+ color: var(--color-disabled);
1781
+ text-align: center;
1782
+ }
1783
+
1784
+ .intervention-panel,
1785
+ .inspector {
1786
+ min-width: 0;
1787
+ border-left: 1px solid var(--color-border);
1788
+ background: var(--color-surface-muted);
1789
+ overflow: auto;
1790
+ }
1791
+
1792
+ .inspector-section {
1793
+ padding: 18px 14px;
1794
+ border-bottom: 1px solid var(--color-border);
1795
+ }
1796
+
1797
+ .gate-title {
1798
+ min-width: 0;
1799
+ display: flex;
1800
+ gap: 12px;
1801
+ align-items: flex-start;
1802
+ color: var(--color-warning-text);
1803
+ }
1804
+
1805
+ .gate-title > div {
1806
+ min-width: 0;
1807
+ }
1808
+
1809
+ .gate-title h2 {
1810
+ margin: 0 0 8px;
1811
+ color: var(--color-text-strong);
1812
+ font-size: 17px;
1813
+ line-height: 23px;
1814
+ overflow-wrap: anywhere;
1815
+ }
1816
+
1817
+ .detail-list {
1818
+ display: grid;
1819
+ gap: 12px;
1820
+ margin: 18px 0 0;
1821
+ }
1822
+
1823
+ .detail-list div {
1824
+ display: grid;
1825
+ grid-template-columns: 92px minmax(0, 1fr);
1826
+ gap: 10px;
1827
+ }
1828
+
1829
+ .inline-detail {
1830
+ display: inline-block;
1831
+ margin-left: 6px;
1832
+ color: var(--color-log-text);
1833
+ overflow-wrap: anywhere;
1834
+ }
1835
+
1836
+ .timeline-list {
1837
+ min-width: 0;
1838
+ display: grid;
1839
+ gap: 8px;
1840
+ }
1841
+
1842
+ .timeline-list--compact {
1843
+ margin-top: 8px;
1844
+ }
1845
+
1846
+ .timeline-item,
1847
+ .inline-details {
1848
+ min-width: 0;
1849
+ border: 1px solid var(--color-border);
1850
+ background: var(--color-surface-raised);
1851
+ }
1852
+
1853
+ .timeline-item summary,
1854
+ .inline-details summary {
1855
+ min-width: 0;
1856
+ min-height: 40px;
1857
+ display: flex;
1858
+ align-items: center;
1859
+ gap: 10px;
1860
+ padding: 8px 10px;
1861
+ cursor: pointer;
1862
+ list-style: none;
1863
+ overflow-wrap: anywhere;
1864
+ }
1865
+
1866
+ .timeline-item summary::-webkit-details-marker,
1867
+ .inline-details summary::-webkit-details-marker {
1868
+ display: none;
1869
+ }
1870
+
1871
+ .timeline-item summary strong {
1872
+ min-width: 0;
1873
+ flex: 1 1 auto;
1874
+ overflow-wrap: anywhere;
1875
+ }
1876
+
1877
+ .timeline-item summary span {
1878
+ flex: 0 0 auto;
1879
+ color: var(--color-text-muted);
1880
+ font-size: 12px;
1881
+ }
1882
+
1883
+ .timeline-item .detail-list {
1884
+ margin: 0;
1885
+ padding: 0 10px 10px;
1886
+ }
1887
+
1888
+ .inline-details {
1889
+ max-width: min(560px, 100%);
1890
+ }
1891
+
1892
+ .inline-details > p {
1893
+ margin: 0;
1894
+ padding: 0 10px 10px;
1895
+ color: var(--color-danger-text);
1896
+ font-size: 12px;
1897
+ }
1898
+
1899
+ .inline-details .raw-message-details {
1900
+ margin: 0 10px 10px;
1901
+ }
1902
+
1903
+ .inline-details .raw-message-details > summary {
1904
+ min-height: 0;
1905
+ display: inline-flex;
1906
+ padding: 0;
1907
+ color: var(--color-link);
1908
+ font-size: 12px;
1909
+ line-height: 18px;
1910
+ list-style: revert;
1911
+ }
1912
+
1913
+ dt {
1914
+ color: var(--color-text-muted);
1915
+ font-size: 12px;
1916
+ }
1917
+
1918
+ dd {
1919
+ margin: 0;
1920
+ min-width: 0;
1921
+ overflow-wrap: anywhere;
1922
+ color: var(--color-text-card);
1923
+ font-size: 13px;
1924
+ }
1925
+
1926
+ textarea {
1927
+ width: 100%;
1928
+ min-height: 92px;
1929
+ resize: vertical;
1930
+ border: 1px solid var(--color-border-strong);
1931
+ border-radius: 6px;
1932
+ background: var(--color-log-bg);
1933
+ color: var(--color-input-text);
1934
+ padding: 10px;
1935
+ }
1936
+
1937
+ input,
1938
+ select {
1939
+ width: 100%;
1940
+ min-height: 36px;
1941
+ border: 1px solid var(--color-border-strong);
1942
+ border-radius: 6px;
1943
+ background: var(--color-log-bg);
1944
+ color: var(--color-input-text);
1945
+ padding: 7px 9px;
1946
+ }
1947
+
1948
+ label {
1949
+ display: grid;
1950
+ gap: 7px;
1951
+ color: var(--color-muted-text);
1952
+ font-size: 12px;
1953
+ }
1954
+
1955
+ .form-grid {
1956
+ display: grid;
1957
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1958
+ gap: 12px;
1959
+ }
1960
+
1961
+ .merge-config-grid {
1962
+ align-items: end;
1963
+ column-gap: 16px;
1964
+ }
1965
+
1966
+ .toggle-row {
1967
+ grid-template-columns: auto minmax(0, 1fr);
1968
+ align-items: center;
1969
+ }
1970
+
1971
+ .merge-config-grid .toggle-row {
1972
+ align-self: end;
1973
+ min-height: 36px;
1974
+ padding: 0 2px;
1975
+ white-space: nowrap;
1976
+ }
1977
+
1978
+ .toggle-row input {
1979
+ width: 16px;
1980
+ min-height: 16px;
1981
+ }
1982
+
1983
+ .button-row,
1984
+ .control-grid {
1985
+ display: grid;
1986
+ gap: 10px;
1987
+ margin-top: 12px;
1988
+ }
1989
+
1990
+ .preset-tabs {
1991
+ min-width: min(100%, 520px);
1992
+ display: grid;
1993
+ grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
1994
+ gap: 8px;
1995
+ }
1996
+
1997
+ .preset-tabs .ghost-button.is-active {
1998
+ border-color: var(--color-accent);
1999
+ background: var(--color-accent-bg);
2000
+ color: var(--color-text-strong);
2001
+ }
2002
+
2003
+ .button-row button,
2004
+ .control-grid button,
2005
+ .heading-actions button {
2006
+ min-width: 0;
2007
+ white-space: normal;
2008
+ }
2009
+
2010
+ .button-row {
2011
+ grid-template-columns: 1fr 1fr;
2012
+ }
2013
+
2014
+ .button-row.wide {
2015
+ grid-template-columns: repeat(2, minmax(0, 180px));
2016
+ justify-content: start;
2017
+ }
2018
+
2019
+ .action-result {
2020
+ display: grid;
2021
+ gap: 4px;
2022
+ margin-top: 12px;
2023
+ padding: 10px 12px;
2024
+ border: 1px solid var(--color-accent-border);
2025
+ border-radius: 7px;
2026
+ background: var(--color-accent-bg);
2027
+ color: var(--color-text-card);
2028
+ font-size: 13px;
2029
+ line-height: 18px;
2030
+ }
2031
+
2032
+ .action-result--error {
2033
+ border-color: var(--color-danger-border);
2034
+ background: var(--color-danger-bg);
2035
+ }
2036
+
2037
+ .control-grid {
2038
+ grid-template-columns: 1fr 1fr;
2039
+ }
2040
+
2041
+ .ghost-button,
2042
+ .success-button,
2043
+ .danger-button,
2044
+ .control-grid button {
2045
+ min-height: 38px;
2046
+ border: 1px solid var(--color-border-strong);
2047
+ border-radius: 6px;
2048
+ background: var(--color-surface-raised);
2049
+ color: var(--color-button-text);
2050
+ display: inline-flex;
2051
+ align-items: center;
2052
+ justify-content: center;
2053
+ gap: 8px;
2054
+ padding: 0 12px;
2055
+ }
2056
+
2057
+ .success-button {
2058
+ border-color: var(--color-success-border);
2059
+ background: var(--color-success-bg);
2060
+ color: var(--color-success-text);
2061
+ }
2062
+
2063
+ .danger-button {
2064
+ border-color: var(--color-danger-border);
2065
+ background: var(--color-danger-bg);
2066
+ color: var(--color-danger-text);
2067
+ }
2068
+
2069
+ .artifact-shortcut {
2070
+ min-width: 0;
2071
+ display: flex;
2072
+ align-items: center;
2073
+ gap: 10px;
2074
+ padding: 10px;
2075
+ border: 1px solid var(--color-border);
2076
+ border-radius: 6px;
2077
+ background: var(--color-surface);
2078
+ }
2079
+
2080
+ .artifact-shortcut span {
2081
+ overflow: hidden;
2082
+ text-overflow: ellipsis;
2083
+ white-space: nowrap;
2084
+ }
2085
+
2086
+ .artifact-preview {
2087
+ min-width: 0;
2088
+ border: 1px solid var(--color-border);
2089
+ background: var(--color-surface-subtle);
2090
+ }
2091
+
2092
+ .artifact-preview span {
2093
+ display: block;
2094
+ padding: 9px 12px;
2095
+ border-bottom: 1px solid var(--color-border);
2096
+ color: var(--color-disabled);
2097
+ font-size: 11px;
2098
+ line-height: 14px;
2099
+ text-transform: uppercase;
2100
+ }
2101
+
2102
+ .artifact-preview pre {
2103
+ min-height: 180px;
2104
+ max-height: 360px;
2105
+ margin: 0;
2106
+ overflow: auto;
2107
+ padding: 12px;
2108
+ color: var(--color-text-card);
2109
+ font-size: 12px;
2110
+ line-height: 18px;
2111
+ white-space: pre-wrap;
2112
+ overflow-wrap: anywhere;
2113
+ }
2114
+
2115
+ .config-save-panel,
2116
+ .soft-state {
2117
+ display: grid;
2118
+ gap: 12px;
2119
+ padding: 14px;
2120
+ border: 1px solid var(--color-border);
2121
+ background: var(--color-surface);
2122
+ }
2123
+
2124
+ .soft-state h2,
2125
+ .config-save-panel h2 {
2126
+ margin: 0;
2127
+ font-size: 16px;
2128
+ }
2129
+
2130
+ .soft-state p,
2131
+ .config-save-panel p {
2132
+ margin: 0;
2133
+ color: var(--color-text-soft);
2134
+ }
2135
+
2136
+ .soft-state--error {
2137
+ border-color: var(--color-danger-border);
2138
+ color: var(--color-danger-text);
2139
+ }
2140
+
2141
+ .diff-list {
2142
+ display: grid;
2143
+ gap: 7px;
2144
+ min-height: 30px;
2145
+ }
2146
+
2147
+ .diff-list code {
2148
+ overflow-wrap: anywhere;
2149
+ color: var(--color-diff-text);
2150
+ font-size: 12px;
2151
+ }
2152
+
2153
+ .notification-list {
2154
+ display: grid;
2155
+ gap: 8px;
2156
+ }
2157
+
2158
+ .notification-item {
2159
+ border: 1px solid var(--color-border);
2160
+ background: var(--color-surface-raised);
2161
+ }
2162
+
2163
+ .notification-item summary {
2164
+ min-height: 40px;
2165
+ }
2166
+
2167
+ .notification-item p {
2168
+ margin: 0 12px 10px;
2169
+ color: var(--color-text-card);
2170
+ font-size: 13px;
2171
+ }
2172
+
2173
+ .notification-item pre {
2174
+ max-height: 180px;
2175
+ overflow: auto;
2176
+ margin: 0;
2177
+ padding: 10px 12px;
2178
+ background: var(--color-log-bg);
2179
+ color: var(--color-log-text);
2180
+ font-size: 12px;
2181
+ white-space: pre-wrap;
2182
+ overflow-wrap: anywhere;
2183
+ }
2184
+
2185
+ .status-badge {
2186
+ min-width: 0;
2187
+ width: fit-content;
2188
+ max-width: 100%;
2189
+ display: inline-flex;
2190
+ align-items: center;
2191
+ min-height: 20px;
2192
+ padding: 2px 7px;
2193
+ border-radius: 5px;
2194
+ border: 1px solid var(--color-border-strong);
2195
+ font-size: 11px;
2196
+ line-height: 14px;
2197
+ overflow: hidden;
2198
+ text-overflow: ellipsis;
2199
+ white-space: nowrap;
2200
+ }
2201
+
2202
+ .status-badge--green {
2203
+ color: var(--color-success-text);
2204
+ background: var(--color-success-bg);
2205
+ border-color: var(--color-success-border);
2206
+ }
2207
+
2208
+ .status-badge--yellow {
2209
+ color: var(--color-warning-text);
2210
+ background: var(--color-warning-bg);
2211
+ border-color: var(--color-warning-border);
2212
+ }
2213
+
2214
+ .status-badge--red {
2215
+ color: var(--color-danger-text);
2216
+ background: var(--color-danger-bg);
2217
+ border-color: var(--color-danger-border);
2218
+ }
2219
+
2220
+ .status-badge--blue {
2221
+ color: var(--color-info-text);
2222
+ background: var(--color-info-bg);
2223
+ border-color: var(--color-info-border);
2224
+ }
2225
+
2226
+ .status-badge--muted {
2227
+ color: var(--color-muted-text);
2228
+ background: var(--color-muted-bg);
2229
+ border-color: var(--color-border-strong);
2230
+ }
2231
+
2232
+ .recovery-panel {
2233
+ display: grid;
2234
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2235
+ border: 1px solid var(--color-border);
2236
+ background: var(--color-surface);
2237
+ }
2238
+
2239
+ .state-screen {
2240
+ min-height: 100vh;
2241
+ display: grid;
2242
+ place-content: center;
2243
+ gap: 12px;
2244
+ text-align: center;
2245
+ padding: 24px;
2246
+ background: var(--color-bg);
2247
+ color: var(--color-button-text);
2248
+ }
2249
+
2250
+ .state-screen h1 {
2251
+ margin: 0;
2252
+ font-size: 22px;
2253
+ }
2254
+
2255
+ .state-screen p {
2256
+ margin: 0;
2257
+ color: var(--color-text-subtle);
2258
+ }
2259
+
2260
+ .state-screen--error {
2261
+ color: var(--color-danger-text);
2262
+ }
2263
+
2264
+ .login-screen {
2265
+ width: 100%;
2266
+ }
2267
+
2268
+ .login-brand {
2269
+ display: inline-flex;
2270
+ align-items: center;
2271
+ justify-content: center;
2272
+ gap: 12px;
2273
+ margin: 0 auto 8px;
2274
+ color: var(--color-text-strong);
2275
+ }
2276
+
2277
+ .login-brand strong {
2278
+ font-size: 20px;
2279
+ line-height: 26px;
2280
+ }
2281
+
2282
+ .brand-logo--login {
2283
+ width: 46px;
2284
+ height: 46px;
2285
+ }
2286
+
2287
+ .login-form {
2288
+ width: min(420px, calc(100vw - 32px));
2289
+ display: grid;
2290
+ gap: 10px;
2291
+ margin: 8px auto 0;
2292
+ }
2293
+
2294
+ .spin {
2295
+ animation: spin 1s linear infinite;
2296
+ margin: 0 auto;
2297
+ }
2298
+
2299
+ @keyframes spin {
2300
+ to {
2301
+ transform: rotate(360deg);
2302
+ }
2303
+ }
2304
+
2305
+ @media (max-width: 1180px) {
2306
+ .dashboard-main,
2307
+ .main {
2308
+ grid-template-rows: auto minmax(0, 1fr);
2309
+ }
2310
+
2311
+ .topbar {
2312
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2313
+ }
2314
+
2315
+ .workspace {
2316
+ grid-template-columns: minmax(0, 1fr);
2317
+ }
2318
+
2319
+ .intervention-panel,
2320
+ .inspector {
2321
+ border-left: 0;
2322
+ border-top: 1px solid var(--color-border);
2323
+ overflow: visible;
2324
+ }
2325
+ }
2326
+
2327
+ @media (max-width: 1180px) and (min-width: 861px) {
2328
+ .summary-panel--mission {
2329
+ grid-template-columns: repeat(6, minmax(0, 1fr));
2330
+ }
2331
+
2332
+ .summary-panel--mission .metric-row {
2333
+ grid-column: span 2;
2334
+ }
2335
+
2336
+ .summary-panel--mission .metric-row:nth-last-child(-n+2) {
2337
+ grid-column: span 3;
2338
+ }
2339
+ }
2340
+
2341
+ @media (max-width: 1320px) and (min-width: 861px) {
2342
+ .workflow-board__body {
2343
+ grid-template-columns: minmax(160px, 190px) minmax(0, 1fr);
2344
+ gap: 14px;
2345
+ }
2346
+
2347
+ .workflow-board__body:has(.workflow-inspector.is-collapsed) {
2348
+ grid-template-columns: 40px minmax(0, 1fr);
2349
+ }
2350
+
2351
+ .workflow-detail__header {
2352
+ grid-template-columns: 1fr;
2353
+ }
2354
+
2355
+ .workflow-inspector {
2356
+ order: 0;
2357
+ }
2358
+
2359
+ .actor-chip-row {
2360
+ justify-content: flex-start;
2361
+ }
2362
+ }
2363
+
2364
+ @media (max-width: 860px) {
2365
+ .shell {
2366
+ grid-template-columns: 1fr;
2367
+ }
2368
+
2369
+ .dashboard-shell {
2370
+ grid-template-columns: 1fr;
2371
+ }
2372
+
2373
+ .dashboard-shell:has(.dashboard-sidebar:hover),
2374
+ .dashboard-shell:has(.dashboard-sidebar:has(:focus-visible)) {
2375
+ grid-template-columns: 1fr;
2376
+ }
2377
+
2378
+ .dashboard-sidebar,
2379
+ .sidebar {
2380
+ position: static;
2381
+ min-height: auto;
2382
+ width: auto;
2383
+ height: auto;
2384
+ overflow: visible;
2385
+ border-right: 0;
2386
+ border-bottom: 1px solid var(--color-border);
2387
+ grid-template-rows: auto auto auto;
2388
+ box-shadow: none;
2389
+ }
2390
+
2391
+ .dashboard-sidebar:hover,
2392
+ .dashboard-sidebar:has(:focus-visible) {
2393
+ width: auto;
2394
+ box-shadow: none;
2395
+ }
2396
+
2397
+ .dashboard-brand {
2398
+ justify-content: flex-start;
2399
+ padding: 18px 16px;
2400
+ }
2401
+
2402
+ .dashboard-brand > div:not(.brand-mark),
2403
+ .dashboard-sidebar .nav-item span,
2404
+ .dashboard-sidebar .sidebar-footer {
2405
+ opacity: 1;
2406
+ }
2407
+
2408
+ .sidebar-footer-compact {
2409
+ display: none;
2410
+ }
2411
+
2412
+ .dashboard-sidebar .sidebar-footer {
2413
+ display: flex;
2414
+ pointer-events: auto;
2415
+ transform: none;
2416
+ }
2417
+
2418
+ .nav-list {
2419
+ display: flex;
2420
+ flex-direction: row;
2421
+ overflow-x: auto;
2422
+ padding: 8px 10px;
2423
+ scrollbar-width: thin;
2424
+ }
2425
+
2426
+ .nav-item {
2427
+ flex: 0 0 auto;
2428
+ width: auto;
2429
+ max-width: 132px;
2430
+ height: 34px;
2431
+ justify-content: flex-start;
2432
+ padding: 0 10px;
2433
+ }
2434
+
2435
+ .sidebar-footer {
2436
+ display: flex;
2437
+ gap: 8px;
2438
+ align-items: center;
2439
+ overflow-x: auto;
2440
+ padding: 8px 10px 10px;
2441
+ scrollbar-width: thin;
2442
+ }
2443
+
2444
+ .locale-switcher {
2445
+ min-width: 128px;
2446
+ flex: 0 0 auto;
2447
+ }
2448
+
2449
+ .theme-switcher {
2450
+ min-width: 188px;
2451
+ flex: 0 0 auto;
2452
+ }
2453
+
2454
+ .repo-chip--stacked {
2455
+ min-width: 180px;
2456
+ flex: 0 0 auto;
2457
+ }
2458
+
2459
+ .sidebar-footer .status-badge {
2460
+ flex: 0 0 auto;
2461
+ }
2462
+
2463
+ .main {
2464
+ grid-template-rows: auto minmax(0, 1fr);
2465
+ }
2466
+
2467
+ .workspace,
2468
+ .form-grid {
2469
+ grid-template-columns: 1fr;
2470
+ }
2471
+
2472
+ .summary-panel,
2473
+ .health-strip,
2474
+ .forecast-strip,
2475
+ .recovery-panel {
2476
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2477
+ }
2478
+
2479
+ .topbar {
2480
+ display: flex;
2481
+ overflow-x: auto;
2482
+ scrollbar-width: thin;
2483
+ }
2484
+
2485
+ .topbar .top-metric {
2486
+ flex: 0 0 190px;
2487
+ }
2488
+
2489
+ .summary-panel--mission {
2490
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2491
+ }
2492
+
2493
+ .summary-panel--mission .metric-row:last-child {
2494
+ grid-column: 1 / -1;
2495
+ }
2496
+
2497
+ .workflow-board__summary,
2498
+ .workflow-board__body,
2499
+ .workflow-detail__header {
2500
+ grid-template-columns: 1fr;
2501
+ }
2502
+
2503
+ .workflow-board__facts {
2504
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2505
+ }
2506
+
2507
+ .workflow-inspector {
2508
+ order: 2;
2509
+ }
2510
+
2511
+ .actor-chip-row {
2512
+ justify-content: flex-start;
2513
+ }
2514
+
2515
+ .workflow-matrix__row {
2516
+ grid-template-columns: 1fr auto;
2517
+ }
2518
+
2519
+ .workflow-matrix__row small {
2520
+ grid-column: 1 / -1;
2521
+ }
2522
+
2523
+ .pr-summary {
2524
+ grid-template-columns: 1fr;
2525
+ }
2526
+
2527
+ .intervention-panel,
2528
+ .inspector {
2529
+ border-left: 0;
2530
+ border-top: 1px solid var(--color-border);
2531
+ }
2532
+
2533
+ .command-preview {
2534
+ grid-template-columns: 1fr;
2535
+ }
2536
+
2537
+ .button-row,
2538
+ .button-row.wide,
2539
+ .control-grid {
2540
+ grid-template-columns: 1fr;
2541
+ }
2542
+
2543
+ .workflow-rail {
2544
+ grid-template-columns: none;
2545
+ grid-auto-flow: column;
2546
+ grid-auto-columns: minmax(118px, 1fr);
2547
+ overflow-x: auto;
2548
+ }
2549
+ }
2550
+
2551
+ @media (max-width: 560px) {
2552
+ .dashboard-brand,
2553
+ .brand {
2554
+ min-height: 64px;
2555
+ padding: 14px 12px;
2556
+ }
2557
+
2558
+ .dashboard-content,
2559
+ .content {
2560
+ padding: 14px 10px 24px;
2561
+ }
2562
+
2563
+ .summary-panel,
2564
+ .health-strip,
2565
+ .forecast-strip,
2566
+ .recovery-panel {
2567
+ grid-template-columns: 1fr;
2568
+ }
2569
+
2570
+ .topbar .top-metric {
2571
+ flex-basis: 176px;
2572
+ }
2573
+
2574
+ .summary-panel--mission {
2575
+ grid-template-columns: 1fr;
2576
+ }
2577
+
2578
+ .summary-panel--mission .metric-row:last-child {
2579
+ grid-column: auto;
2580
+ }
2581
+
2582
+ .summary-panel--mission {
2583
+ display: flex;
2584
+ overflow-x: auto;
2585
+ scrollbar-width: thin;
2586
+ }
2587
+
2588
+ .summary-panel--mission .metric-row {
2589
+ flex: 0 0 154px;
2590
+ min-height: 66px;
2591
+ }
2592
+
2593
+ .workflow-board {
2594
+ padding: 10px;
2595
+ }
2596
+
2597
+ .workflow-board__facts {
2598
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2599
+ }
2600
+
2601
+ .workflow-board__facts div,
2602
+ .workflow-board__facts div:nth-child(2n) {
2603
+ border-right: 0;
2604
+ }
2605
+
2606
+ .workflow-board__facts div:nth-child(odd) {
2607
+ border-right: 1px solid var(--color-border);
2608
+ }
2609
+
2610
+ .workflow-rail {
2611
+ grid-template-columns: none;
2612
+ grid-auto-flow: column;
2613
+ grid-auto-columns: 128px;
2614
+ overflow-x: auto;
2615
+ }
2616
+
2617
+ .workflow-peek {
2618
+ position: fixed;
2619
+ inset: auto 10px 10px 10px;
2620
+ max-width: none;
2621
+ max-height: 46vh;
2622
+ }
2623
+
2624
+ .workflow-matrix__row {
2625
+ grid-template-columns: 1fr;
2626
+ }
2627
+
2628
+ .workflow-evidence-chip {
2629
+ max-width: 100%;
2630
+ width: 100%;
2631
+ }
2632
+
2633
+ .section-heading,
2634
+ .focus-panel {
2635
+ flex-direction: column;
2636
+ align-items: stretch;
2637
+ }
2638
+
2639
+ .heading-actions {
2640
+ width: 100%;
2641
+ justify-content: space-between;
2642
+ }
2643
+
2644
+ .status-badge {
2645
+ width: max-content;
2646
+ max-width: 100%;
2647
+ }
2648
+
2649
+ .detail-list div {
2650
+ grid-template-columns: 1fr;
2651
+ gap: 4px;
2652
+ }
2653
+
2654
+ .artifact-preview pre {
2655
+ max-height: 50vh;
2656
+ }
2657
+
2658
+ .table-panel {
2659
+ overflow: visible;
2660
+ }
2661
+
2662
+ .table-panel table {
2663
+ display: none;
2664
+ }
2665
+
2666
+ .compact-card-list {
2667
+ display: grid;
2668
+ }
2669
+ }
2670
+
2671
+ .compact-card-list--always {
2672
+ display: grid;
2673
+ }