claude-finops 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.
package/web/styles.css ADDED
@@ -0,0 +1,387 @@
1
+ /* Claude FinOps Command Center — light-first tokens, dark redefined under both
2
+ the OS media query and the explicit [data-theme] stamp so the toggle wins. */
3
+ :root {
4
+ color-scheme: light;
5
+ --plane: #f7f7f5;
6
+ --surface: #ffffff;
7
+ --surface-2: #fbfbfa;
8
+ --surface-3: #f1f1ee;
9
+ --border: rgba(11,11,11,0.11);
10
+ --border-strong:rgba(11,11,11,0.20);
11
+ --text: #0b0b0b;
12
+ --text-2: #52514e;
13
+ --muted: #7d7b76;
14
+ --grid: #e6e5e0;
15
+ --axis: #c3c2b7;
16
+
17
+ --s1:#2a78d6; --s2:#eb6834; --s3:#1baf7a; --s4:#eda100;
18
+ --s5:#e87ba4; --s6:#008300; --s7:#4a3aa7; --s8:#e34948;
19
+
20
+ --good:#0ca30c; --warning:#fab219; --serious:#ec835a; --critical:#d03b3b;
21
+ --good-ink:#006300; --warning-ink:#8a5a00; --serious-ink:#9a4318; --critical-ink:#a52626;
22
+ --good-bg:#eaf7ea; --warning-bg:#fdf4e0; --serious-bg:#fdefe8; --critical-bg:#fbeaea;
23
+
24
+ --seq-100:#cde2fb; --seq-250:#86b6ef; --seq-400:#3987e5; --seq-550:#1c5cab; --seq-700:#0d366b;
25
+
26
+ --est-bg:#fff6e5; --est-bd:#e0b055; --est-ink:#8a5a00;
27
+ --fc-bg:#eef3ff; --fc-bd:#8fa8e8; --fc-ink:#2b47a8;
28
+ --rec-bg:#f0f8f1; --rec-bd:#8ec79a; --rec-ink:#1d6b30;
29
+ --act-bg:#f1f1ee; --act-bd:#c3c2b7; --act-ink:#52514e;
30
+
31
+ --radius: 10px;
32
+ --shadow: 0 1px 2px rgba(11,11,11,.05), 0 4px 14px rgba(11,11,11,.04);
33
+ --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
34
+ --sans: system-ui, -apple-system, "Segoe UI", sans-serif;
35
+ }
36
+ @media (prefers-color-scheme: dark) {
37
+ :root:not([data-theme="light"]) {
38
+ color-scheme: dark;
39
+ --plane:#0d0e10; --surface:#15171a; --surface-2:#1a1d21; --surface-3:#22262b;
40
+ --border:rgba(255,255,255,0.11); --border-strong:rgba(255,255,255,0.22);
41
+ --text:#f4f5f6; --text-2:#b8bcc2; --muted:#8b9099; --grid:#252a30; --axis:#39404a;
42
+ --s1:#3987e5; --s2:#d95926; --s3:#199e70; --s4:#c98500;
43
+ --s5:#d55181; --s6:#008300; --s7:#9085e9; --s8:#e66767;
44
+ --good-ink:#4cc74c; --warning-ink:#f2b643; --serious-ink:#ef9d74; --critical-ink:#f07070;
45
+ --good-bg:#122a12; --warning-bg:#2e2410; --serious-bg:#2e1d14; --critical-bg:#2c1414;
46
+ --est-bg:#2b2413; --est-bd:#7a5f22; --est-ink:#e0b055;
47
+ --fc-bg:#161d33; --fc-bd:#3c4d80; --fc-ink:#9db4f0;
48
+ --rec-bg:#132414; --rec-bd:#2f5d38; --rec-ink:#7cc38b;
49
+ --act-bg:#22262b; --act-bd:#39404a; --act-ink:#b8bcc2;
50
+ --shadow: 0 1px 2px rgba(0,0,0,.35), 0 6px 20px rgba(0,0,0,.28);
51
+ }
52
+ }
53
+ :root[data-theme="dark"] {
54
+ color-scheme: dark;
55
+ --plane:#0d0e10; --surface:#15171a; --surface-2:#1a1d21; --surface-3:#22262b;
56
+ --border:rgba(255,255,255,0.11); --border-strong:rgba(255,255,255,0.22);
57
+ --text:#f4f5f6; --text-2:#b8bcc2; --muted:#8b9099; --grid:#252a30; --axis:#39404a;
58
+ --s1:#3987e5; --s2:#d95926; --s3:#199e70; --s4:#c98500;
59
+ --s5:#d55181; --s6:#008300; --s7:#9085e9; --s8:#e66767;
60
+ --good-ink:#4cc74c; --warning-ink:#f2b643; --serious-ink:#ef9d74; --critical-ink:#f07070;
61
+ --good-bg:#122a12; --warning-bg:#2e2410; --serious-bg:#2e1d14; --critical-bg:#2c1414;
62
+ --est-bg:#2b2413; --est-bd:#7a5f22; --est-ink:#e0b055;
63
+ --fc-bg:#161d33; --fc-bd:#3c4d80; --fc-ink:#9db4f0;
64
+ --rec-bg:#132414; --rec-bd:#2f5d38; --rec-ink:#7cc38b;
65
+ --act-bg:#22262b; --act-bd:#39404a; --act-ink:#b8bcc2;
66
+ --shadow: 0 1px 2px rgba(0,0,0,.35), 0 6px 20px rgba(0,0,0,.28);
67
+ }
68
+
69
+ * { box-sizing: border-box; }
70
+ html, body { margin:0; padding:0; }
71
+ body { background: var(--plane); color: var(--text); font-family: var(--sans);
72
+ font-size: 13px; line-height: 1.5; -webkit-font-smoothing: antialiased; }
73
+ a { color: var(--s1); text-decoration: none; }
74
+ button, input, select { font: inherit; color: inherit; }
75
+ ::selection { background: var(--seq-250); color:#0b0b0b; }
76
+
77
+ /* ---------- shell ---------- */
78
+ .app { display: grid; grid-template-columns: 216px 1fr; min-height: 100vh; }
79
+ .sidebar { background: var(--surface); border-right: 1px solid var(--border);
80
+ padding: 14px 0; position: sticky; top:0; height:100vh; overflow-y:auto; }
81
+ .brand { padding: 0 16px 14px; border-bottom: 1px solid var(--border); margin-bottom: 10px; }
82
+ .brand .mark { display:flex; align-items:center; gap:8px; font-weight:660; font-size:14px;
83
+ letter-spacing:-0.01em; }
84
+ .brand .dot { width:9px; height:9px; border-radius:3px; background:var(--s2); flex:none; }
85
+ .brand .sub { font-size:10.5px; color:var(--muted); margin-top:3px; letter-spacing:.02em; }
86
+ .nav { display:flex; flex-direction:column; gap:1px; padding: 0 8px; }
87
+ .nav .group { font-size:9.5px; text-transform:uppercase; letter-spacing:.09em; color:var(--muted);
88
+ padding: 13px 8px 5px; font-weight:600; }
89
+ .nav a { display:flex; align-items:center; gap:8px; padding:6px 9px; border-radius:7px;
90
+ color:var(--text-2); font-size:12.5px; cursor:pointer; }
91
+ .nav a:hover { background: var(--surface-3); color: var(--text); }
92
+ .nav a.on { background: var(--s1); color:#fff; font-weight:560; }
93
+ .nav a .ic { width:14px; text-align:center; opacity:.85; font-size:12px; }
94
+
95
+ .main { min-width: 0; display:flex; flex-direction:column; }
96
+
97
+ /* ---------- header ---------- */
98
+ .topbar { position:sticky; top:0; z-index:40; background: var(--surface);
99
+ border-bottom:1px solid var(--border); padding:10px 20px; }
100
+ .topbar .r1 { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
101
+ .topbar h1 { font-size:16px; margin:0; font-weight:640; letter-spacing:-0.01em; }
102
+ .crumbs { color:var(--muted); font-size:11.5px; display:flex; gap:6px; align-items:center; }
103
+ .crumbs b { color: var(--text-2); font-weight:560; }
104
+ .spacer { flex:1; }
105
+ .search { position:relative; }
106
+ .search input { width:270px; padding:6px 10px 6px 28px; border-radius:8px; font-size:12.5px;
107
+ border:1px solid var(--border); background:var(--surface-2); }
108
+ .search input:focus { outline:2px solid var(--s1); outline-offset:-1px; border-color:transparent; }
109
+ .search .mag { position:absolute; left:9px; top:50%; transform:translateY(-50%);
110
+ color:var(--muted); font-size:12px; pointer-events:none; }
111
+ .iconbtn { border:1px solid var(--border); background:var(--surface-2); border-radius:8px;
112
+ padding:6px 10px; cursor:pointer; font-size:12px; color:var(--text-2); }
113
+ .iconbtn:hover { background: var(--surface-3); color:var(--text); }
114
+
115
+ /* ---------- filter bar ---------- */
116
+ .filters { display:flex; gap:7px; align-items:center; flex-wrap:wrap; margin-top:9px; }
117
+ .chipsel { position:relative; }
118
+ .chip { border:1px solid var(--border); background:var(--surface-2); border-radius:99px;
119
+ padding:4px 11px; font-size:11.5px; cursor:pointer; color:var(--text-2);
120
+ display:inline-flex; align-items:center; gap:5px; white-space:nowrap; }
121
+ .chip:hover { border-color: var(--border-strong); color: var(--text); }
122
+ .chip.on { background: var(--s1); border-color: var(--s1); color:#fff; font-weight:550; }
123
+ .chip .n { opacity:.6; font-variant-numeric: tabular-nums; }
124
+ .pop { position:absolute; top:calc(100% + 6px); left:0; z-index:60; background:var(--surface);
125
+ border:1px solid var(--border); border-radius:10px; box-shadow:var(--shadow);
126
+ padding:8px; min-width:250px; max-height:340px; overflow:auto; }
127
+ .pop label { display:flex; align-items:center; gap:8px; padding:4px 6px; border-radius:6px;
128
+ font-size:12px; cursor:pointer; }
129
+ .pop label:hover { background: var(--surface-3); }
130
+ .pop input[type=date], .pop input[type=number] { width:100%; padding:5px 7px; border-radius:6px;
131
+ border:1px solid var(--border); background: var(--surface-2); margin-bottom:6px; }
132
+ .pop .hd { font-size:10px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted);
133
+ padding:5px 6px 3px; font-weight:600; }
134
+ .divider { width:1px; align-self:stretch; background:var(--border); margin:0 3px; }
135
+
136
+ /* ---------- badges ---------- */
137
+ .badge { display:inline-flex; align-items:center; gap:4px; font-size:9.5px; font-weight:620;
138
+ padding:1.5px 6px; border-radius:99px; border:1px solid var(--act-bd);
139
+ background:var(--act-bg); color:var(--act-ink); text-transform:uppercase;
140
+ letter-spacing:.05em; vertical-align:middle; white-space:nowrap; }
141
+ .badge.est { background:var(--est-bg); border-color:var(--est-bd); color:var(--est-ink); }
142
+ .badge.fc { background:var(--fc-bg); border-color:var(--fc-bd); color:var(--fc-ink); }
143
+ .badge.rec { background:var(--rec-bg); border-color:var(--rec-bd); color:var(--rec-ink); }
144
+ .badge.na { background:transparent; border-style:dashed; }
145
+
146
+ .status { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:600;
147
+ padding:2px 8px; border-radius:99px; }
148
+ .status .glyph { font-size:9px; }
149
+ .status.healthy { background:var(--good-bg); color:var(--good-ink); }
150
+ .status.high { background:var(--warning-bg); color:var(--warning-ink); }
151
+ .status.approaching{ background:var(--serious-bg); color:var(--serious-ink); }
152
+ .status.critical { background:var(--critical-bg); color:var(--critical-ink); }
153
+
154
+ /* ---------- layout ---------- */
155
+ .page { padding: 16px 20px 60px; display:flex; flex-direction:column; gap:14px; }
156
+ .grid { display:grid; gap:12px; }
157
+ .g2 { grid-template-columns: repeat(2, minmax(0,1fr)); }
158
+ .g3 { grid-template-columns: repeat(3, minmax(0,1fr)); }
159
+ .g4 { grid-template-columns: repeat(4, minmax(0,1fr)); }
160
+ .g5 { grid-template-columns: repeat(5, minmax(0,1fr)); }
161
+ .g23 { grid-template-columns: minmax(0,2fr) minmax(0,3fr); }
162
+ .g32 { grid-template-columns: minmax(0,3fr) minmax(0,2fr); }
163
+ @media (max-width: 1500px) { .g5 { grid-template-columns: repeat(3, minmax(0,1fr)); } }
164
+ @media (max-width: 1200px) { .g4, .g3 { grid-template-columns: repeat(2, minmax(0,1fr)); }
165
+ .g2, .g23, .g32 { grid-template-columns: minmax(0,1fr); } }
166
+ @media (max-width: 860px) { .app { grid-template-columns: 1fr; }
167
+ .sidebar { position:static; height:auto; }
168
+ .g5, .g4, .g3 { grid-template-columns: repeat(2, minmax(0,1fr)); } }
169
+
170
+ /* ---------- card ---------- */
171
+ .card { background: var(--surface); border:1px solid var(--border); border-radius: var(--radius);
172
+ box-shadow: var(--shadow); display:flex; flex-direction:column; min-width:0; }
173
+ .card > header { display:flex; align-items:center; gap:8px; padding:11px 14px 0; flex-wrap:wrap; }
174
+ .card > header h3 { margin:0; font-size:12.5px; font-weight:620; letter-spacing:-0.005em; }
175
+ .card > header .hint { font-size:11px; color:var(--muted); }
176
+ .card .body { padding: 10px 14px 14px; min-width:0; }
177
+ .card .body.flush { padding: 6px 0 0; }
178
+ .card footer { padding: 8px 14px 11px; font-size:10.5px; color:var(--muted); font-style:italic;
179
+ border-top:1px solid var(--border); margin-top:auto; }
180
+
181
+ .kpi { background:var(--surface); border:1px solid var(--border); border-radius:var(--radius);
182
+ padding:12px 14px; box-shadow:var(--shadow); display:flex; flex-direction:column; gap:2px;
183
+ min-width:0; }
184
+ .kpi .l { font-size:9.5px; text-transform:uppercase; letter-spacing:.075em; color:var(--muted);
185
+ font-weight:620; display:flex; align-items:center; gap:5px; }
186
+ .kpi .v { font-size:24px; font-weight:660; letter-spacing:-0.02em; line-height:1.15;
187
+ overflow-wrap:anywhere; }
188
+ .kpi .v.sm { font-size:17px; }
189
+ .kpi .d { font-size:11px; color:var(--text-2); }
190
+ .kpi .d .up { color:var(--critical-ink); font-weight:600; }
191
+ .kpi .d .down { color:var(--good-ink); font-weight:600; }
192
+ .kpi.na .v { font-size:12px; font-weight:500; color:var(--muted); font-style:italic; }
193
+
194
+ /* ---------- table ---------- */
195
+ .tbl-wrap { overflow-x:auto; }
196
+ table.tbl { width:100%; border-collapse:collapse; font-size:12px; }
197
+ table.tbl th { text-align:left; padding:6px 10px; font-size:10px; text-transform:uppercase;
198
+ letter-spacing:.06em; color:var(--muted); font-weight:620; border-bottom:1px solid var(--border);
199
+ white-space:nowrap; position:sticky; top:0; background:var(--surface); z-index:1; cursor:pointer; }
200
+ table.tbl th.nosort { cursor:default; }
201
+ table.tbl th.num, table.tbl td.num { text-align:right; font-variant-numeric: tabular-nums; }
202
+ table.tbl td { padding:6px 10px; border-bottom:1px solid var(--grid); vertical-align:middle;
203
+ white-space:nowrap; }
204
+ table.tbl tbody tr.clickable { cursor:pointer; }
205
+ table.tbl tbody tr.clickable:hover { background: var(--surface-3); }
206
+ table.tbl td.trunc { max-width:420px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
207
+ table.tbl .sub { font-size:10.5px; color:var(--muted); }
208
+ .swatch { width:9px; height:9px; border-radius:2.5px; display:inline-block; flex:none;
209
+ margin-right:6px; vertical-align:baseline; }
210
+ .mono { font-family: var(--mono); font-size:11px; }
211
+
212
+ /* ---------- bars / meters ---------- */
213
+ .meter { height:7px; border-radius:99px; background:var(--surface-3); overflow:hidden;
214
+ border:1px solid var(--border); }
215
+ .meter > i { display:block; height:100%; border-radius:99px; background:var(--s1); }
216
+ .meter.healthy > i { background:var(--good); }
217
+ .meter.high > i { background:var(--warning); }
218
+ .meter.approaching > i { background:var(--serious); }
219
+ .meter.critical > i { background:var(--critical); }
220
+ .minibar { height:7px; border-radius:2px; background:var(--s1); min-width:2px; display:block; }
221
+
222
+ /* ---------- legend ---------- */
223
+ .legend { display:flex; flex-wrap:wrap; gap:4px 14px; padding:6px 0 2px; font-size:11.5px;
224
+ color:var(--text-2); }
225
+ .legend .it { display:inline-flex; align-items:center; gap:5px; cursor:pointer; }
226
+ .legend .it.off { opacity:.35; }
227
+
228
+ /* ---------- charts ---------- */
229
+ .chart { position:relative; width:100%; }
230
+ .chart svg { display:block; width:100%; overflow:visible; }
231
+ .chart .gl { stroke: var(--grid); stroke-width:1; }
232
+ .chart .ax { stroke: var(--axis); stroke-width:1; }
233
+ .chart text { fill: var(--muted); font-size:10px; font-family: var(--sans); }
234
+ .chart text.val { fill: var(--text-2); font-weight:600; }
235
+ .chart .crosshair { stroke: var(--axis); stroke-width:1; stroke-dasharray:3 3; }
236
+ .tip { position:fixed; z-index:200; pointer-events:none; background:var(--surface);
237
+ border:1px solid var(--border-strong); border-radius:8px; box-shadow:var(--shadow);
238
+ padding:8px 10px; font-size:11.5px; min-width:150px; max-width:320px; }
239
+ .tip .t { font-weight:640; margin-bottom:5px; font-size:11.5px; }
240
+ .tip .row { display:flex; align-items:center; gap:7px; justify-content:space-between; }
241
+ .tip .row .k { color:var(--text-2); display:flex; align-items:center; gap:5px; }
242
+ .tip .row .v { font-variant-numeric:tabular-nums; font-weight:600; }
243
+
244
+ /* ---------- panels / lists ---------- */
245
+ .item { border:1px solid var(--border); border-radius:9px; padding:10px 12px; background:var(--surface-2);
246
+ display:flex; flex-direction:column; gap:5px; }
247
+ .item.clickable { cursor:pointer; }
248
+ .item.clickable:hover { border-color: var(--border-strong); }
249
+ .item .hd { display:flex; align-items:center; gap:8px; font-weight:600; font-size:12.5px; }
250
+ .item .dt { font-size:11.5px; color:var(--text-2); }
251
+ .item .mt { font-size:11px; color:var(--muted); display:flex; gap:12px; flex-wrap:wrap; }
252
+ .item.sev-high { border-left:3px solid var(--critical); }
253
+ .item.sev-medium { border-left:3px solid var(--warning); }
254
+ .item.sev-low { border-left:3px solid var(--axis); }
255
+ .stack { display:flex; flex-direction:column; gap:8px; }
256
+ .na { color:var(--muted); font-style:italic; font-size:11.5px; }
257
+ .note { font-size:10.5px; color:var(--muted); font-style:italic; }
258
+ .kv { display:grid; grid-template-columns: max-content 1fr; gap:4px 14px; font-size:12px; }
259
+ .kv dt { color:var(--muted); } .kv dd { margin:0; font-variant-numeric:tabular-nums; }
260
+
261
+ /* ---------- score ---------- */
262
+ .scorewrap { display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
263
+ .scorenum { font-size:48px; font-weight:700; letter-spacing:-0.03em; line-height:1; }
264
+ .scoregrade { font-size:12px; color:var(--muted); }
265
+
266
+ /* ---------- drawer ---------- */
267
+ .scrim { position:fixed; inset:0; background:rgba(11,11,11,.42); z-index:100;
268
+ backdrop-filter: blur(2px); }
269
+ .drawer { position:fixed; top:0; right:0; bottom:0; width:min(880px, 94vw); background:var(--plane);
270
+ z-index:101; box-shadow:-8px 0 40px rgba(0,0,0,.22); display:flex; flex-direction:column; }
271
+ .drawer > header { padding:13px 18px; background:var(--surface); border-bottom:1px solid var(--border);
272
+ display:flex; align-items:center; gap:10px; }
273
+ .drawer > header h2 { margin:0; font-size:14.5px; font-weight:640; }
274
+ .drawer .content { overflow-y:auto; padding:14px 18px 40px; display:flex; flex-direction:column; gap:12px; }
275
+ .prompt-text { font-family:var(--mono); font-size:11.5px; white-space:pre-wrap; word-break:break-word;
276
+ background:var(--surface-2); border:1px solid var(--border); border-radius:8px;
277
+ padding:11px 13px; max-height:340px; overflow:auto; line-height:1.55; }
278
+
279
+ .pill { display:inline-block; font-size:10.5px; padding:1px 7px; border-radius:99px;
280
+ background:var(--surface-3); color:var(--text-2); border:1px solid var(--border); }
281
+ .empty { padding:26px 10px; text-align:center; color:var(--muted); font-size:12px; }
282
+ .loading { padding:40px; text-align:center; color:var(--muted); font-size:12px; }
283
+ .tabs { display:flex; gap:3px; border-bottom:1px solid var(--border); margin-bottom:2px;
284
+ overflow-x:auto; }
285
+ .tabs button { background:none; border:none; padding:7px 12px; font-size:12px; cursor:pointer;
286
+ color:var(--text-2); border-bottom:2px solid transparent; white-space:nowrap; }
287
+ .tabs button.on { color:var(--text); border-bottom-color:var(--s1); font-weight:600; }
288
+ .hero { background:var(--surface); border:1px solid var(--border); border-radius:var(--radius);
289
+ box-shadow:var(--shadow); padding:14px 16px; }
290
+ .hero h3 { margin:0 0 8px; font-size:12.5px; font-weight:620; display:flex; align-items:center; gap:8px; }
291
+ .advisor-list { counter-reset:a; display:flex; flex-direction:column; gap:8px; }
292
+ .advisor-item { display:flex; gap:10px; align-items:flex-start; }
293
+ .advisor-item .num { counter-increment:a; flex:none; width:20px; height:20px; border-radius:6px;
294
+ background:var(--s1); color:#fff; font-size:11px; font-weight:660; display:grid;
295
+ place-items:center; margin-top:1px; }
296
+ .advisor-item .num.p2 { background:var(--s2); } .advisor-item .num.p3 { background:var(--s3); }
297
+ .advisor-item .tx b { display:block; font-size:12.5px; }
298
+ .advisor-item .tx span { font-size:11.5px; color:var(--text-2); }
299
+ .advisor-item .num::after { content: counter(a); }
300
+
301
+ /* fix playbooks */
302
+ .pb { margin-top: 6px; font-size: 12.5px; }
303
+ .pb > summary { cursor: pointer; font-weight: 600; color: var(--s1); }
304
+ .pb ol { margin: 6px 0 6px 18px; padding: 0; }
305
+ .pb li { margin: 2px 0; }
306
+ .pb-prompt { border: 1px solid var(--border-strong); border-radius: 8px; overflow: hidden; }
307
+ .pb-hd { display: flex; align-items: center; gap: 6px; padding: 5px 8px; font-weight: 600;
308
+ background: color-mix(in srgb, currentColor 5%, transparent); }
309
+ .pb-prompt pre { margin: 0; padding: 8px 10px; white-space: pre-wrap; word-break: break-word;
310
+ font-size: 12px; max-height: 220px; overflow: auto; }
311
+ .pb-copy { font-size: 11.5px; padding: 2px 10px; cursor: pointer; border: 1px solid var(--border-strong); border-radius: 6px; background: var(--s1); color: #fff; }
312
+
313
+ /* ---------- focus cues: group colours, nav badges, focus strip, severity tints ---------- */
314
+ .nav .group.g0 { color: var(--s2); } .nav a.g0 .ic { color: var(--s2); opacity: 1; }
315
+ .nav .group.g1 { color: var(--s1); } .nav a.g1 .ic { color: var(--s1); opacity: 1; }
316
+ .nav .group.g2 { color: var(--s7); } .nav a.g2 .ic { color: var(--s7); opacity: 1; }
317
+ .nav .group.g3 { color: var(--critical); } .nav a.g3 .ic { color: var(--critical); opacity: 1; }
318
+ .nav .group.g4 { color: var(--s3); } .nav a.g4 .ic { color: var(--s3); opacity: 1; }
319
+ .nav .group { font-weight: 700; }
320
+ .nav a.on .ic { color: #fff; }
321
+ .nav a.start:not(.on) { background: color-mix(in srgb, var(--critical) 9%, transparent);
322
+ color: var(--text); font-weight: 600; }
323
+ .nav a .nb { margin-left: auto; font-size: 10px; font-weight: 700; line-height: 1;
324
+ padding: 3px 6px; border-radius: 9px; }
325
+ .nav a .nb:empty { display: none; }
326
+ .nav a .nb.l1 { background: var(--critical); color: #fff; }
327
+ .nav a .nb.l2 { background: var(--warning); color: #3a2a00; }
328
+
329
+ .focus { border: 1px solid color-mix(in srgb, var(--critical) 35%, var(--border));
330
+ background: color-mix(in srgb, var(--critical) 5%, var(--surface)); border-radius: var(--radius);
331
+ padding: 10px 12px; margin-bottom: 14px; display: flex; flex-direction: column; gap: 5px; }
332
+ .focus-hd { font-weight: 700; font-size: 13px; display: flex; gap: 10px; align-items: baseline; }
333
+ .focus-it { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border-radius: 8px;
334
+ cursor: pointer; background: var(--surface); border: 1px solid var(--border); font-size: 12.5px; }
335
+ .focus-it:hover { border-color: var(--border-strong); }
336
+ .focus-it .fn { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center;
337
+ font-size: 11px; font-weight: 700; color: #fff; flex: none; }
338
+ .focus-it.l1 .fn { background: var(--critical); } .focus-it.l2 .fn { background: var(--warning); }
339
+ .focus-it .ft { flex: 1; min-width: 0; }
340
+ .focus-it .fl { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; }
341
+ .focus-it.l1 .fl { color: var(--critical-ink); } .focus-it.l2 .fl { color: var(--warning-ink); }
342
+
343
+ .item.sev-high { background: color-mix(in srgb, var(--critical) 6%, var(--surface-2)); border-left-width: 4px; }
344
+ .item.sev-medium { background: color-mix(in srgb, var(--warning) 7%, var(--surface-2)); border-left-width: 4px; }
345
+ .flash { outline: 3px solid var(--s1); outline-offset: 4px; border-radius: 8px; transition: outline-color 1s; }
346
+
347
+ /* running sessions */
348
+ .live-dot, .idle-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; }
349
+ .live-dot { background: var(--good); box-shadow: 0 0 0 3px color-mix(in srgb, var(--good) 25%, transparent);
350
+ animation: livepulse 1.4s infinite; }
351
+ .idle-dot { background: var(--axis); }
352
+ @keyframes livepulse { 50% { box-shadow: 0 0 0 6px transparent; } }
353
+ .live-actions { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-top: 6px; }
354
+ .act { font-size: 11.5px; padding: 4px 10px; border-radius: 6px; cursor: pointer;
355
+ border: 1px solid var(--border-strong); background: var(--surface); }
356
+ .act:disabled { opacity: .45; cursor: not-allowed; }
357
+ .act.warn { border-color: var(--warning); color: var(--warning-ink); }
358
+ .act.danger { border-color: var(--critical); color: var(--critical-ink); }
359
+ .act.ghost { border-style: dashed; }
360
+ .act.armed { background: var(--critical); border-color: var(--critical); color: #fff; font-weight: 700; }
361
+ .live-msg { font-size: 11.5px; }
362
+ .live-msg.ok { color: var(--good-ink); } .live-msg.err { color: var(--critical-ink); }
363
+ .item.gone { opacity: .45; }
364
+
365
+ .handover { margin-top: 8px; padding: 10px; border: 1px dashed var(--border); border-radius: 8px; display: grid; gap: 8px; }
366
+ .handover textarea { width: 100%; box-sizing: border-box; font: inherit; font-size: 12.5px; padding: 8px; border-radius: 6px;
367
+ border: 1px solid var(--border); background: transparent; color: inherit; resize: vertical; }
368
+ .handover .ho-out { display: grid; gap: 4px; }
369
+ .handover .ho-out code { word-break: break-all; }
370
+
371
+ /* ---------- walkthrough ---------- */
372
+ #tour { position: fixed; inset: 0; z-index: 1000; pointer-events: none; }
373
+ #tour .tour-ring { position: fixed; border-radius: 10px; border: 2px solid var(--accent, #eb6834);
374
+ box-shadow: 0 0 0 9999px rgba(11,11,11,.45); transition: all .18s ease; pointer-events: none; }
375
+ #tour .tour-pop { position: fixed; pointer-events: auto; background: var(--surface); color: var(--text);
376
+ border: 1px solid var(--border-strong); border-radius: var(--radius); box-shadow: var(--shadow);
377
+ padding: 14px 16px 12px; font-size: 13px; line-height: 1.45; transition: top .18s ease, left .18s ease; }
378
+ #tour .tour-hd { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
379
+ #tour .tour-n { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .06em; }
380
+ #tour .tour-x { margin-left: auto; border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 14px; }
381
+ #tour h4 { margin: 2px 0 8px; font-size: 15px; }
382
+ #tour .tour-row { display: grid; grid-template-columns: 92px 1fr; gap: 8px; margin: 5px 0; }
383
+ #tour .tour-row b { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; padding-top: 2px; }
384
+ #tour .tour-ft { display: flex; align-items: center; gap: 6px; margin-top: 12px; }
385
+ #tour .tour-ft .spacer { flex: 1; }
386
+ #tour .act.primary { background: var(--accent, #eb6834); border-color: var(--accent, #eb6834); color: #fff; }
387
+ #tour .act[disabled] { opacity: .45; cursor: default; }