@lyric_dev/data-loom 0.2.4 → 0.3.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/public/style.css CHANGED
@@ -1,238 +1,878 @@
1
+ /* ===== DataLoom — blueprint theme ===== */
2
+
3
+ /* Theme: blueprint-light (default / "drafting paper") */
1
4
  :root {
2
- --bg: #0e1116;
3
- --panel: #161b22;
4
- --panel-2: #1c232d;
5
- --border: #2a3038;
6
- --text: #d7dde5;
7
- --muted: #8b96a3;
8
- --accent: #6ea8fe;
9
- --draft: #6b7585;
10
- --progress: #d8a64a;
11
- --done: #4cae6a;
12
- --warn: #d6604d;
13
- --edge: #3b4654;
14
- }
15
-
16
- * { box-sizing: border-box; }
17
-
18
- html, body {
5
+ --font: "IBM Plex Mono", monospace;
6
+ --display: "Space Grotesk", sans-serif;
7
+ --mono: "IBM Plex Mono", monospace;
8
+ --prose: "Public Sans", system-ui, -apple-system, sans-serif;
9
+
10
+ --bg: #eef1f6;
11
+ --bg2: #f7f9fc;
12
+ --app-bg: repeating-linear-gradient(0deg, transparent 0 31px, rgba(37, 99, 184, 0.07) 31px 32px),
13
+ repeating-linear-gradient(90deg, transparent 0 31px, rgba(37, 99, 184, 0.07) 31px 32px),
14
+ radial-gradient(circle at 50% -5%, rgba(37, 99, 184, 0.06), transparent 55%), #eef1f6;
15
+ --panel: #ffffff;
16
+ --panel2: #f4f7fc;
17
+ --phase-bg: rgba(37, 99, 184, 0.03);
18
+
19
+ --border: #d2dcee;
20
+ --border2: #b6c7e4;
21
+ --edge: #9db4d8;
22
+ --track: #e2e9f4;
23
+
24
+ --text: #15263e;
25
+ --muted: #566f8e;
26
+ --faint: #90a3be;
27
+
28
+ --accent: #2563b8;
29
+ --accent-bd: #a9c4ea;
30
+ --accent-soft: rgba(37, 99, 184, 0.09);
31
+ --on-accent: #ffffff;
32
+
33
+ --c-draft: #7a8aa2;
34
+ --c-progress: #b3791b;
35
+ --c-done: #1f9b73;
36
+ --c-warn: #d35a44;
37
+ --warn-soft: rgba(211, 90, 68, 0.08);
38
+
39
+ --line-a: #2563b8; /* global trace */
40
+ --line-b: #cf7b3a; /* project trace */
41
+
42
+ --shadow: 0 10px 34px rgba(28, 52, 96, 0.1);
43
+ --shadow-c: rgba(28, 52, 96, 0.16);
44
+ }
45
+
46
+ /* Theme: blueprint (dark navy) */
47
+ :root[data-theme="dark"] {
48
+ --bg: #070d18;
49
+ --bg2: #0a1322;
50
+ --app-bg: radial-gradient(circle at 50% 0%, rgba(51, 214, 192, 0.05), transparent 60%),
51
+ repeating-linear-gradient(0deg, transparent 0 31px, rgba(51, 214, 192, 0.045) 31px 32px),
52
+ repeating-linear-gradient(90deg, transparent 0 31px, rgba(51, 214, 192, 0.045) 31px 32px), #070d18;
53
+ --panel: #0c1626;
54
+ --panel2: #0d1a2c;
55
+ --phase-bg: rgba(51, 214, 192, 0.025);
56
+
57
+ --border: #1b3450;
58
+ --border2: #27496f;
59
+ --edge: #2f6a78;
60
+ --track: #13263a;
61
+
62
+ --text: #dbeaf4;
63
+ --muted: #6f8aa8;
64
+ --faint: #456280;
65
+
66
+ --accent: #33d6c0;
67
+ --accent-bd: #1e6a63;
68
+ --accent-soft: rgba(51, 214, 192, 0.1);
69
+ --on-accent: #06231f;
70
+
71
+ --c-draft: #5f7ea0;
72
+ --c-progress: #e6b13e;
73
+ --c-done: #33d6c0;
74
+ --c-warn: #ff7a5c;
75
+ --warn-soft: rgba(255, 122, 92, 0.08);
76
+
77
+ --line-a: #33d6c0;
78
+ --line-b: #f2a93b;
79
+
80
+ --shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
81
+ --shadow-c: rgba(0, 0, 0, 0.55);
82
+ }
83
+
84
+ @keyframes lm-dash {
85
+ to {
86
+ stroke-dashoffset: -28;
87
+ }
88
+ }
89
+ @keyframes lm-in {
90
+ from {
91
+ opacity: 0;
92
+ transform: translateX(14px);
93
+ }
94
+ to {
95
+ opacity: 1;
96
+ transform: translateX(0);
97
+ }
98
+ }
99
+
100
+ * {
101
+ box-sizing: border-box;
102
+ }
103
+
104
+ html,
105
+ body {
19
106
  margin: 0;
20
107
  height: 100%;
21
108
  background: var(--bg);
22
109
  color: var(--text);
23
- font: 14px/1.45 "Segoe UI", system-ui, -apple-system, sans-serif;
110
+ font: 13px/1.45 var(--font);
24
111
  }
25
112
 
113
+ /* ===== Top bar ===== */
26
114
  .topbar {
27
115
  display: flex;
28
116
  align-items: center;
29
- gap: 24px;
30
- padding: 0 18px;
31
- height: 52px;
117
+ gap: 22px;
118
+ height: 58px;
119
+ padding: 0 20px;
32
120
  border-bottom: 1px solid var(--border);
33
- background: var(--panel);
121
+ background: var(--bg2);
122
+ }
123
+ .brand {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 10px;
127
+ }
128
+ .brand-mark {
129
+ display: block;
130
+ }
131
+ .wordmark {
132
+ font-family: var(--display);
133
+ font-weight: 700;
134
+ font-size: 16px;
135
+ letter-spacing: -0.4px;
136
+ color: var(--text);
137
+ }
138
+ .wordmark-accent {
139
+ color: var(--accent);
34
140
  }
35
- .brand { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 17px; letter-spacing: 0.3px; }
36
- .brand-logo { display: block; }
37
141
 
38
- .tabs { display: flex; gap: 4px; }
142
+ .tabs {
143
+ display: flex;
144
+ gap: 4px;
145
+ padding: 4px;
146
+ border-radius: 10px;
147
+ background: var(--panel);
148
+ border: 1px solid var(--border);
149
+ }
39
150
  .tab {
40
- background: transparent;
41
- border: 1px solid transparent;
42
- color: var(--muted);
151
+ font-family: var(--font);
152
+ font-weight: 600;
153
+ font-size: 12.5px;
43
154
  padding: 6px 14px;
44
155
  border-radius: 7px;
156
+ border: 1px solid transparent;
157
+ background: transparent;
158
+ color: var(--muted);
45
159
  cursor: pointer;
46
- font: inherit;
160
+ transition: color 0.15s, background 0.15s;
47
161
  }
48
- .tab.active { color: var(--text); background: var(--panel-2); border-color: var(--border); }
49
- .tab.disabled { opacity: 0.45; cursor: not-allowed; }
50
-
51
- .project { margin-left: auto; display: flex; align-items: center; gap: 8px; }
52
- .project-label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 1px; }
53
- #project-select {
54
- background: var(--panel-2);
162
+ .tab.active {
163
+ background: var(--accent-soft);
55
164
  color: var(--text);
165
+ border-color: var(--accent-bd);
166
+ }
167
+ .tab.disabled {
168
+ opacity: 0.45;
169
+ cursor: not-allowed;
170
+ }
171
+
172
+ .topbar-right {
173
+ margin-left: auto;
174
+ display: flex;
175
+ align-items: center;
176
+ gap: 16px;
177
+ }
178
+
179
+ .theme-toggle {
180
+ display: flex;
181
+ align-items: center;
182
+ gap: 7px;
183
+ font-family: var(--mono);
184
+ font-size: 11px;
185
+ padding: 6px 11px;
186
+ border-radius: 8px;
56
187
  border: 1px solid var(--border);
57
- border-radius: 7px;
58
- padding: 5px 9px;
59
- font: inherit;
188
+ background: var(--panel);
189
+ color: var(--muted);
190
+ cursor: pointer;
191
+ transition: border-color 0.15s, color 0.15s;
192
+ }
193
+ .theme-toggle:hover {
194
+ border-color: var(--accent);
195
+ color: var(--text);
196
+ }
197
+ .theme-icon {
60
198
  font-size: 13px;
61
- max-width: 240px;
199
+ line-height: 1;
200
+ }
201
+
202
+ .project {
203
+ display: flex;
204
+ align-items: center;
205
+ gap: 8px;
206
+ }
207
+ .project-label {
208
+ font-family: var(--mono);
209
+ font-size: 9.5px;
210
+ letter-spacing: 1.5px;
211
+ text-transform: uppercase;
212
+ color: var(--faint);
213
+ }
214
+ .project-pill {
215
+ position: relative;
216
+ display: flex;
217
+ align-items: center;
218
+ background: var(--panel);
219
+ border: 1px solid var(--border);
220
+ border-radius: 8px;
221
+ padding: 0 9px 0 0;
222
+ overflow: hidden;
223
+ }
224
+ .project-pill:hover {
225
+ border-color: var(--accent);
226
+ }
227
+ #project-select {
228
+ appearance: none;
229
+ -webkit-appearance: none;
230
+ /* Solid (theme-matched) so the native dropdown popup is readable in both
231
+ themes — the option list inherits the select's own background-color. */
232
+ background-color: var(--panel);
233
+ color: var(--text);
234
+ border: none;
235
+ outline: none;
236
+ padding: 5px 4px 5px 11px;
237
+ font-family: var(--mono);
238
+ font-size: 12.5px;
239
+ max-width: 220px;
240
+ cursor: pointer;
241
+ }
242
+ #project-select option {
243
+ background-color: var(--panel);
244
+ color: var(--text);
245
+ }
246
+ .project-caret {
247
+ color: var(--faint);
248
+ font-size: 11px;
249
+ pointer-events: none;
62
250
  }
63
- #project-select:hover { border-color: var(--accent); }
64
251
 
65
- .conn { margin-left: 18px; display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
66
- .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--warn); transition: background 0.2s; }
67
- .dot.live { background: var(--done); }
68
- .gen { color: var(--border); }
252
+ .conn {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: 7px;
256
+ color: var(--muted);
257
+ font-size: 11.5px;
258
+ }
259
+ .dot {
260
+ width: 8px;
261
+ height: 8px;
262
+ border-radius: 50%;
263
+ background: var(--c-warn);
264
+ transition: background 0.2s, box-shadow 0.2s;
265
+ }
266
+ .dot.live {
267
+ background: var(--c-done);
268
+ box-shadow: 0 0 8px var(--c-done);
269
+ }
270
+ .gen {
271
+ color: var(--faint);
272
+ font-size: 10.5px;
273
+ }
69
274
 
70
- main { padding: 22px; height: calc(100% - 52px); overflow: auto; }
275
+ /* ===== Body ===== */
276
+ main {
277
+ height: calc(100% - 58px);
278
+ overflow: auto;
279
+ background: var(--app-bg);
280
+ }
71
281
 
72
- .board-wrap { position: relative; }
73
- .edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; overflow: visible; }
282
+ .view {
283
+ display: none;
284
+ }
285
+ .view.active {
286
+ display: block;
287
+ }
74
288
 
75
- .board { display: flex; flex-direction: column; position: relative; z-index: 1; }
289
+ /* ===== Roadmap: framed dependency graph ===== */
290
+ #roadmap {
291
+ padding: 20px 22px 28px;
292
+ }
76
293
 
77
- .phase-band { border: 1px dashed var(--border); border-radius: 12px; padding: 14px 16px; }
78
- .phase-band-cards { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 16px; }
79
- .phase-arrow { text-align: center; color: var(--muted); font-size: 20px; line-height: 1; padding: 8px 0; }
80
- .phase-head {
81
- font-size: 12px; text-transform: uppercase; letter-spacing: 1px;
82
- color: var(--muted); margin-bottom: 12px; padding-left: 2px;
294
+ .board-wrap {
295
+ position: relative;
296
+ }
297
+ .board {
298
+ position: relative;
299
+ width: 1180px;
300
+ height: 600px;
301
+ margin: 0 auto;
302
+ }
303
+ .edges {
304
+ position: absolute;
305
+ inset: 0;
306
+ width: 100%;
307
+ height: 100%;
308
+ pointer-events: none;
309
+ overflow: visible;
310
+ z-index: 1;
311
+ }
312
+
313
+ .phase-frame {
314
+ position: absolute;
315
+ top: 40px;
316
+ width: 234px;
317
+ height: 520px;
318
+ border: 1px dashed var(--border2);
319
+ border-radius: 16px;
320
+ background: var(--phase-bg);
321
+ }
322
+ .phase-frame-head {
323
+ display: flex;
324
+ align-items: baseline;
325
+ justify-content: space-between;
326
+ padding: 13px 15px 0;
327
+ }
328
+ .phase-frame-title {
329
+ font-family: var(--mono);
330
+ font-weight: 600;
331
+ font-size: 11px;
332
+ letter-spacing: 1.5px;
333
+ color: var(--text);
334
+ }
335
+ .phase-frame-sub {
336
+ font-size: 10px;
337
+ letter-spacing: 0.5px;
338
+ text-transform: uppercase;
339
+ color: var(--faint);
83
340
  }
84
- .phase-head b { color: var(--text); }
85
341
 
86
- .card {
342
+ .gcard {
343
+ position: absolute;
344
+ width: 210px;
345
+ display: flex;
346
+ gap: 10px;
87
347
  background: var(--panel);
88
348
  border: 1px solid var(--border);
89
- border-left: 3px solid var(--draft);
90
- border-radius: 9px;
91
- padding: 12px 13px;
92
- width: 250px;
349
+ border-radius: 11px;
350
+ padding: 12px;
93
351
  cursor: pointer;
94
- transition: border-color 0.15s, transform 0.05s;
95
- }
96
- .card:hover { border-color: var(--accent); }
97
- .card:active { transform: translateY(1px); }
98
- .card.s-draft { border-left-color: var(--draft); }
99
- .card.s-in-progress { border-left-color: var(--progress); }
100
- .card.s-done { border-left-color: var(--done); }
101
- .card.warn { box-shadow: inset 0 0 0 1px var(--warn); }
102
-
103
- .card-name { font-weight: 600; word-break: break-word; }
104
- .card-meta { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
105
-
106
- .pill {
107
- font-size: 11px; padding: 2px 8px; border-radius: 999px;
108
- border: 1px solid var(--border); color: var(--muted);
109
- }
110
- .pill.s-draft { color: var(--draft); }
111
- .pill.s-in-progress { color: var(--progress); border-color: #4a3f24; }
112
- .pill.s-done { color: var(--done); border-color: #234d31; }
113
-
114
- .caps { font-size: 11px; color: var(--muted); }
115
- .caps .add { color: var(--done); }
116
- .caps .mod { color: var(--progress); }
117
- .tasks-mini { font-size: 11px; color: var(--muted); }
118
-
119
- .doneband { margin-top: 26px; border-top: 1px dashed var(--border); padding-top: 14px; }
120
- .doneband.hidden { display: none; }
121
- .doneband-head { cursor: pointer; color: var(--muted); font-size: 12px; user-select: none; }
122
- .doneband-items { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px; }
123
- .doneband-items.collapsed { display: none; }
124
- .done-chip { background: var(--panel); border: 1px solid var(--border); border-radius: 7px; padding: 6px 10px; font-size: 12px; color: var(--muted); }
352
+ z-index: 2;
353
+ transition: border-color 0.15s;
354
+ }
355
+ .gcard:hover {
356
+ border-color: var(--accent);
357
+ }
358
+ .gcard.selected {
359
+ box-shadow: 0 0 0 2px var(--accent), var(--shadow);
360
+ }
361
+ .gcard-bar {
362
+ width: 3px;
363
+ border-radius: 3px;
364
+ flex: none;
365
+ }
366
+ .gcard-body {
367
+ flex: 1;
368
+ min-width: 0;
369
+ }
370
+ .gcard-name {
371
+ font-family: var(--mono);
372
+ font-weight: 500;
373
+ font-size: 12.5px;
374
+ letter-spacing: -0.3px;
375
+ word-break: break-word;
376
+ line-height: 1.35;
377
+ }
378
+ .gcard-pills {
379
+ display: flex;
380
+ flex-wrap: wrap;
381
+ gap: 5px;
382
+ margin-top: 9px;
383
+ align-items: center;
384
+ }
385
+ .gpill {
386
+ font-size: 10px;
387
+ padding: 2px 7px;
388
+ border-radius: 999px;
389
+ border: 1px solid var(--border);
390
+ font-family: var(--mono);
391
+ color: var(--muted);
392
+ }
393
+ .gpill.ready {
394
+ color: var(--accent);
395
+ border-color: var(--accent-bd);
396
+ }
397
+ .gpill.review {
398
+ color: var(--accent);
399
+ border: 1px dashed var(--accent-bd);
400
+ }
401
+ .gcard-waiting {
402
+ font-size: 10.5px;
403
+ color: var(--muted);
404
+ margin-top: 8px;
405
+ }
406
+ .gcard-caps {
407
+ font-size: 10.5px;
408
+ color: var(--faint);
409
+ margin-top: 8px;
410
+ font-family: var(--mono);
411
+ }
412
+ .gcard-next {
413
+ position: absolute;
414
+ top: -8px;
415
+ right: 11px;
416
+ font-size: 8.5px;
417
+ letter-spacing: 1px;
418
+ font-weight: 700;
419
+ font-family: var(--mono);
420
+ background: var(--accent);
421
+ color: var(--on-accent);
422
+ padding: 3px 7px;
423
+ border-radius: 5px;
424
+ }
125
425
 
126
- .detail {
127
- position: fixed; top: 52px; right: 0; width: 340px; height: calc(100% - 52px);
128
- background: var(--panel-2); border-left: 1px solid var(--border);
129
- padding: 20px; overflow: auto; z-index: 5;
130
- box-shadow: -8px 0 24px rgba(0,0,0,0.3);
131
- }
132
- .detail.hidden { display: none; }
133
- .detail-close { position: absolute; top: 12px; right: 14px; background: none; border: none; color: var(--muted); font-size: 22px; cursor: pointer; }
134
- .detail h2 { margin: 0 26px 4px 0; font-size: 16px; word-break: break-word; }
135
- .detail h3 { font-size: 11px; text-transform: uppercase; letter-spacing: 1px; color: var(--muted); margin: 18px 0 6px; }
136
- .detail ul { margin: 0; padding-left: 18px; }
137
- .detail li { margin: 2px 0; }
138
- .detail .empty { color: var(--border); }
139
- .detail code { background: var(--bg); padding: 1px 5px; border-radius: 4px; }
140
-
141
- .empty-state { color: var(--muted); padding: 40px; text-align: center; }
142
-
143
- /* views */
144
- .view { display: none; }
145
- .view.active { display: block; }
146
-
147
- /* topology (HOW tab) */
148
- .topo-legend { display: flex; gap: 18px; align-items: center; color: var(--muted); font-size: 12px; margin-bottom: 10px; }
149
- .topo-legend .swatch { display: inline-block; width: 18px; height: 0; border-top: 2px solid var(--edge); vertical-align: middle; margin-right: 5px; }
150
- .topo-legend .swatch.dashed { border-top-style: dashed; }
151
- .topo-hint { margin-left: auto; color: var(--border); }
152
-
153
- .topo-wrap { position: relative; min-height: 560px; }
154
- #topo-nodes { position: absolute; inset: 0; z-index: 1; }
155
-
156
- .topo-node {
426
+ .empty-state {
157
427
  position: absolute;
428
+ top: 50%;
429
+ left: 50%;
158
430
  transform: translate(-50%, -50%);
431
+ color: var(--muted);
432
+ text-align: center;
433
+ }
434
+
435
+ /* Done band */
436
+ .doneband {
437
+ margin-top: 22px;
438
+ border-top: 1px dashed var(--border2);
439
+ padding-top: 14px;
440
+ }
441
+ .doneband.hidden {
442
+ display: none;
443
+ }
444
+ .doneband-head {
445
+ font-family: var(--mono);
446
+ font-size: 11px;
447
+ letter-spacing: 0.5px;
448
+ text-transform: uppercase;
449
+ color: var(--muted);
450
+ margin-bottom: 11px;
451
+ cursor: pointer;
452
+ user-select: none;
453
+ }
454
+ .doneband-items {
455
+ display: flex;
456
+ flex-wrap: wrap;
457
+ gap: 9px;
458
+ }
459
+ .doneband-items.collapsed {
460
+ display: none;
461
+ }
462
+ .done-chip {
463
+ font-family: var(--mono);
464
+ font-size: 11px;
465
+ color: var(--muted);
159
466
  background: var(--panel);
160
467
  border: 1px solid var(--border);
161
- border-radius: 10px;
162
- padding: 10px 12px;
163
- width: 168px;
164
- text-align: center;
468
+ border-radius: 8px;
469
+ padding: 6px 11px;
470
+ cursor: pointer;
471
+ transition: border-color 0.15s;
165
472
  }
166
- .topo-node.hub {
167
- background: var(--panel-2);
473
+ .done-chip:hover {
168
474
  border-color: var(--accent);
169
- box-shadow: 0 0 0 1px var(--accent), 0 0 24px rgba(110, 168, 254, 0.18);
170
- width: 150px;
171
- }
172
- .topo-name { font-weight: 600; word-break: break-word; }
173
- .topo-sub { font-size: 11px; color: var(--muted); margin-top: 3px; }
174
- .topo-state { font-size: 11px; color: var(--muted); margin-top: 7px; display: flex; align-items: center; justify-content: center; gap: 6px; }
175
-
176
- .live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: none; }
177
- .live-unknown .live-dot { background: var(--muted); }
178
- .live-checking .live-dot { background: var(--progress); }
179
- .live-available .live-dot, .live-already-running .live-dot { background: var(--done); }
180
- .live-needs-auth .live-dot { background: #c79a3a; }
181
- .live-unreachable .live-dot { background: var(--warn); }
182
- .live-on-demand .live-dot { background: var(--accent); }
183
-
184
- .topo-check {
185
- margin-top: 9px;
186
- background: transparent;
475
+ }
476
+
477
+ /* ===== Banners (roadmap) ===== */
478
+ .conflicts {
479
+ display: flex;
480
+ gap: 11px;
481
+ align-items: flex-start;
482
+ background: var(--warn-soft);
483
+ border: 1px solid var(--c-warn);
484
+ border-radius: 11px;
485
+ padding: 12px 15px;
486
+ margin-bottom: 12px;
487
+ }
488
+ .conflicts.hidden {
489
+ display: none;
490
+ }
491
+ .conflicts-mark {
492
+ color: var(--c-warn);
493
+ font-size: 15px;
494
+ line-height: 1.1;
495
+ }
496
+ .conflicts-head {
497
+ font-weight: 600;
498
+ font-size: 12.5px;
499
+ color: var(--c-warn);
500
+ margin-bottom: 3px;
501
+ font-family: var(--prose);
502
+ }
503
+ .conflict-item {
504
+ font-size: 12px;
505
+ color: var(--text);
506
+ line-height: 1.45;
507
+ font-family: var(--prose);
508
+ }
509
+
510
+ .review {
511
+ display: flex;
512
+ gap: 11px;
513
+ align-items: center;
514
+ background: var(--accent-soft);
515
+ border: 1px solid var(--accent-bd);
516
+ border-radius: 11px;
517
+ padding: 11px 15px;
518
+ margin-bottom: 16px;
519
+ }
520
+ .review.hidden {
521
+ display: none;
522
+ }
523
+ .review-badge {
524
+ flex: none;
525
+ min-width: 21px;
526
+ height: 21px;
527
+ padding: 0 6px;
528
+ display: inline-flex;
529
+ align-items: center;
530
+ justify-content: center;
531
+ background: var(--accent);
532
+ color: var(--on-accent);
533
+ border-radius: 999px;
534
+ font-weight: 700;
535
+ font-size: 12px;
536
+ font-family: var(--mono);
537
+ }
538
+ .review-text {
539
+ font-size: 12.5px;
540
+ color: var(--text);
541
+ font-family: var(--prose);
542
+ }
543
+
544
+ /* ===== MCP Topology: circuit board ===== */
545
+ .topo-controls {
546
+ display: flex;
547
+ align-items: center;
548
+ justify-content: space-between;
549
+ padding: 14px 20px 6px;
550
+ }
551
+ .scope-row {
552
+ display: flex;
553
+ gap: 6px;
554
+ align-items: center;
555
+ }
556
+ .scope-tag {
557
+ font-family: var(--mono);
558
+ font-size: 10px;
559
+ letter-spacing: 1.5px;
560
+ text-transform: uppercase;
561
+ color: var(--faint);
562
+ margin-right: 2px;
563
+ }
564
+ .scope-chip {
565
+ font-family: var(--mono);
566
+ font-size: 11px;
567
+ padding: 5px 12px;
568
+ border-radius: 7px;
187
569
  border: 1px solid var(--border);
570
+ background: transparent;
188
571
  color: var(--muted);
189
- border-radius: 6px;
190
- padding: 3px 12px;
191
- font: inherit;
572
+ cursor: pointer;
573
+ transition: border-color 0.15s, color 0.15s;
574
+ }
575
+ .scope-chip:hover {
576
+ border-color: var(--accent);
577
+ }
578
+ .scope-chip.active {
579
+ border-color: var(--accent-bd);
580
+ background: var(--accent-soft);
581
+ color: var(--text);
582
+ }
583
+ .pcb-caption {
584
+ font-family: var(--mono);
585
+ font-size: 10.5px;
586
+ color: var(--faint);
587
+ }
588
+
589
+ .topo-wrap {
590
+ position: relative;
591
+ }
592
+ .pcb {
593
+ position: relative;
594
+ width: 1200px;
595
+ height: 640px;
596
+ margin: 0 auto;
597
+ }
598
+
599
+ .mcu {
600
+ position: absolute;
601
+ left: 524px;
602
+ top: 245px;
603
+ width: 152px;
604
+ height: 150px;
605
+ border: 1.5px solid var(--accent);
606
+ border-radius: 10px;
607
+ background: var(--panel2);
608
+ display: flex;
609
+ flex-direction: column;
610
+ align-items: center;
611
+ justify-content: center;
612
+ box-shadow: 0 0 26px var(--accent-soft);
613
+ z-index: 2;
614
+ }
615
+ .mcu-name {
616
+ font-family: var(--display);
617
+ font-weight: 700;
618
+ font-size: 14px;
619
+ color: var(--text);
620
+ }
621
+ .mcu-sub {
622
+ font-size: 9px;
623
+ letter-spacing: 1.5px;
624
+ text-transform: uppercase;
625
+ color: var(--accent);
626
+ margin-top: 3px;
627
+ font-family: var(--mono);
628
+ }
629
+
630
+ .pcb-comp {
631
+ position: absolute;
632
+ width: 196px;
633
+ background: var(--panel);
634
+ border: 1px solid var(--border);
635
+ border-radius: 8px;
636
+ padding: 9px 11px;
637
+ cursor: pointer;
638
+ z-index: 2;
639
+ transition: border-color 0.15s;
640
+ }
641
+ .pcb-comp:hover {
642
+ border-color: var(--accent);
643
+ }
644
+ .pcb-comp.selected {
645
+ box-shadow: 0 0 0 2px var(--accent);
646
+ }
647
+ .pcb-comp-top {
648
+ display: flex;
649
+ align-items: center;
650
+ gap: 8px;
651
+ }
652
+ .pcb-led {
653
+ width: 8px;
654
+ height: 8px;
655
+ border-radius: 50%;
656
+ flex: none;
657
+ }
658
+ .pcb-comp-name {
659
+ font-family: var(--mono);
660
+ font-weight: 500;
192
661
  font-size: 12px;
662
+ color: var(--text);
663
+ }
664
+ .pcb-comp-sub {
665
+ font-size: 9.5px;
666
+ color: var(--faint);
667
+ margin-top: 5px;
668
+ font-family: var(--mono);
669
+ }
670
+
671
+ .topo-empty {
672
+ position: absolute;
673
+ left: 50%;
674
+ top: 50%;
675
+ transform: translate(-50%, 90px);
676
+ color: var(--muted);
677
+ }
678
+
679
+ /* ===== Detail panels (shared) ===== */
680
+ .detail {
681
+ position: fixed;
682
+ top: 58px;
683
+ right: 0;
684
+ height: calc(100% - 58px);
685
+ width: 362px;
686
+ background: var(--panel2);
687
+ border-left: 1px solid var(--border2);
688
+ box-shadow: -14px 0 40px var(--shadow-c);
689
+ overflow: auto;
690
+ z-index: 8;
691
+ animation: lm-in 0.18s ease;
692
+ }
693
+ .detail.hidden {
694
+ display: none;
695
+ }
696
+ .detail.server {
697
+ width: 340px;
698
+ }
699
+ .detail-inner {
700
+ padding: 22px 22px 30px;
701
+ }
702
+ .detail-head {
703
+ display: flex;
704
+ justify-content: space-between;
705
+ align-items: flex-start;
706
+ gap: 12px;
707
+ }
708
+ .detail-name {
709
+ font-family: var(--mono);
710
+ font-weight: 600;
711
+ font-size: 16px;
712
+ letter-spacing: -0.4px;
713
+ word-break: break-word;
714
+ line-height: 1.3;
715
+ }
716
+ .detail-close {
717
+ flex: none;
718
+ background: var(--panel);
719
+ border: 1px solid var(--border);
720
+ color: var(--muted);
721
+ width: 28px;
722
+ height: 28px;
723
+ border-radius: 8px;
193
724
  cursor: pointer;
725
+ font-size: 15px;
726
+ line-height: 1;
727
+ transition: color 0.15s, border-color 0.15s;
728
+ }
729
+ .detail-close:hover {
730
+ color: var(--text);
731
+ border-color: var(--accent);
732
+ }
733
+ .detail-pills {
734
+ display: flex;
735
+ flex-wrap: wrap;
736
+ gap: 7px;
737
+ margin-top: 13px;
738
+ }
739
+ .detail-pill {
740
+ font-size: 11px;
741
+ padding: 3px 9px;
742
+ border-radius: 999px;
743
+ border: 1px solid var(--border);
744
+ font-family: var(--mono);
745
+ color: var(--muted);
746
+ }
747
+ .detail-section {
748
+ font-size: 10px;
749
+ letter-spacing: 1.5px;
750
+ text-transform: uppercase;
751
+ color: var(--muted);
752
+ margin: 22px 0 9px;
753
+ font-family: var(--mono);
754
+ }
755
+ .detail-section.first {
756
+ margin-top: 24px;
757
+ }
758
+ .detail-section.warn {
759
+ color: var(--c-warn);
760
+ }
761
+ .detail-list {
762
+ display: flex;
763
+ flex-direction: column;
764
+ gap: 6px;
765
+ }
766
+ .detail-item {
767
+ font-family: var(--mono);
768
+ font-size: 12px;
769
+ color: var(--text);
770
+ background: var(--panel);
771
+ border: 1px solid var(--border);
772
+ border-radius: 7px;
773
+ padding: 6px 10px;
774
+ }
775
+ .detail-item.add {
776
+ color: var(--c-done);
777
+ }
778
+ .detail-item.mod {
779
+ color: var(--c-progress);
780
+ }
781
+ .detail-item.unsat {
782
+ color: var(--c-warn);
783
+ background: var(--warn-soft);
784
+ border-color: var(--c-warn);
785
+ }
786
+ .detail-none {
787
+ font-size: 12px;
788
+ color: var(--faint);
789
+ font-style: italic;
194
790
  }
195
- .topo-check:hover { border-color: var(--accent); color: var(--text); }
196
791
 
197
- .topo-empty { position: absolute; top: 50%; left: 50%; transform: translate(-50%, 60px); color: var(--muted); }
792
+ /* tasks progress bar */
793
+ .detail-tasks {
794
+ margin-top: 22px;
795
+ }
796
+ .detail-tasks-row {
797
+ display: flex;
798
+ justify-content: space-between;
799
+ font-size: 11px;
800
+ color: var(--muted);
801
+ font-family: var(--mono);
802
+ margin-bottom: 7px;
803
+ }
804
+ .detail-tasks-track {
805
+ height: 6px;
806
+ border-radius: 6px;
807
+ background: var(--track);
808
+ overflow: hidden;
809
+ }
810
+ .detail-tasks-fill {
811
+ height: 100%;
812
+ background: var(--accent);
813
+ border-radius: 6px;
814
+ }
198
815
 
199
- /* conflicts banner (roadmap) */
200
- .conflicts {
201
- background: rgba(214, 96, 77, 0.08);
202
- border: 1px solid var(--warn);
203
- border-radius: 9px;
204
- padding: 11px 14px;
205
- margin-bottom: 18px;
206
- }
207
- .conflicts.hidden { display: none; }
208
- .conflicts-head { color: var(--warn); font-weight: 600; margin-bottom: 6px; font-size: 13px; }
209
- .conflict-item { font-size: 13px; color: var(--text); padding: 2px 0; }
210
- .conflict-item::before { content: "•"; color: var(--warn); margin-right: 8px; }
211
-
212
- /* phase-planning: readiness */
213
- .pill.r-ready { color: var(--accent); border-color: #2f4a6b; }
214
- .pill.r-blocked { color: var(--muted); }
215
- .card.next { box-shadow: 0 0 0 2px var(--accent); }
216
- .blocked-note { font-size: 11px; color: var(--muted); margin-top: 7px; }
217
- .blocked-note::before { content: "⏳ "; }
218
-
219
- /* dependency-review (roadmap) — informational, distinct from the warn banner */
220
- .review {
221
- display: flex; align-items: center; gap: 10px;
222
- background: rgba(110, 168, 254, 0.08);
223
- border: 1px solid #2f4a6b;
816
+ /* server detail */
817
+ .detail-live {
818
+ display: flex;
819
+ align-items: center;
820
+ gap: 8px;
821
+ margin-top: 15px;
822
+ }
823
+ .detail-live-dot {
824
+ width: 9px;
825
+ height: 9px;
826
+ border-radius: 50%;
827
+ }
828
+ .detail-live-label {
829
+ font-family: var(--mono);
830
+ font-size: 13px;
831
+ color: var(--text);
832
+ }
833
+ .detail-rows {
834
+ display: flex;
835
+ flex-direction: column;
836
+ gap: 13px;
837
+ margin-top: 24px;
838
+ }
839
+ .detail-row {
840
+ display: flex;
841
+ justify-content: space-between;
842
+ gap: 14px;
843
+ font-size: 12px;
844
+ }
845
+ .detail-row .k {
846
+ color: var(--muted);
847
+ font-family: var(--mono);
848
+ }
849
+ .detail-row .v {
850
+ font-family: var(--mono);
851
+ text-align: right;
852
+ word-break: break-all;
853
+ }
854
+ .detail-check {
855
+ margin-top: 24px;
856
+ width: 100%;
857
+ font-family: var(--prose);
858
+ font-weight: 600;
859
+ font-size: 12.5px;
860
+ padding: 9px;
224
861
  border-radius: 9px;
225
- padding: 10px 14px;
226
- margin-bottom: 18px;
227
- color: var(--text); font-size: 13px;
862
+ border: 1px solid var(--accent-bd);
863
+ background: var(--accent-soft);
864
+ color: var(--accent);
865
+ cursor: pointer;
866
+ transition: background 0.15s, color 0.15s;
228
867
  }
229
- .review.hidden { display: none; }
230
- .review-badge {
231
- flex: none;
232
- min-width: 20px; height: 20px; padding: 0 6px;
233
- display: inline-flex; align-items: center; justify-content: center;
234
- background: var(--accent); color: var(--bg);
235
- border-radius: 999px; font-weight: 700; font-size: 12px;
868
+ .detail-check:hover {
869
+ background: var(--accent);
870
+ color: var(--on-accent);
871
+ }
872
+ .detail-note {
873
+ font-size: 11px;
874
+ line-height: 1.5;
875
+ color: var(--faint);
876
+ margin: 13px 0 0;
877
+ font-family: var(--prose);
236
878
  }
237
- .pill.review { color: var(--accent); border-color: #2f4a6b; }
238
- .card.needs-review { border-left-style: dashed; }