sandtable 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.
@@ -0,0 +1,731 @@
1
+ /* Sandtable Dashboard Styles v0.3 */
2
+ :root {
3
+ --bg: #f8f9fa;
4
+ --header-bg: #1a1a2e;
5
+ --brief-bg: linear-gradient(135deg, #16213e, #0f3460);
6
+ --card-bg: #ffffff;
7
+ --border: #e0e0e0;
8
+ --text: #333333;
9
+ --text-light: #666666;
10
+ --text-muted: #999999;
11
+ --accent: #4EC9B0;
12
+ --completed: #2e7d32;
13
+ --in-progress: #e65100;
14
+ --pending: #999999;
15
+ --blocked: #c62828;
16
+ /* v2 additions */
17
+ --secondary-tag: #7B61FF;
18
+ --source-link: #569CD6;
19
+ --past-tab: #95a5a6;
20
+ --current-tab: #4EC9B0;
21
+ --future-tab: #3498db;
22
+ --tab-bg: #ffffff;
23
+ /* v0.3 time-phase card colors */
24
+ --past-bg: #e8edf2; /* 历史:灰蓝 */
25
+ --current-bg: #fff8e1; /* 现阶段:暖黄 */
26
+ --future-bg: #f5f5f5; /* 未来:浅灰 */
27
+ --past-border: #b0bec5;
28
+ --current-border: #ffcc02;
29
+ --future-border: #d0d0d0;
30
+ /* v0.3 event type colors */
31
+ --event-decision: #e53935;
32
+ --event-spec: #7B61FF;
33
+ --event-code: #569CD6;
34
+ --event-test: #4EC9B0;
35
+ --event-approval: #FF9800;
36
+ --event-ops: #795548;
37
+ --event-lesson: #E91E63;
38
+ /* Priority colors */
39
+ --priority-must: #e53935;
40
+ --priority-should: #FF9800;
41
+ --priority-can: #999;
42
+ }
43
+
44
+ * { margin: 0; padding: 0; box-sizing: border-box; }
45
+
46
+ body {
47
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
48
+ background: var(--bg);
49
+ color: var(--text);
50
+ min-height: 100vh;
51
+ display: flex;
52
+ flex-direction: column;
53
+ }
54
+
55
+ /* Header */
56
+ #header {
57
+ background: var(--header-bg);
58
+ color: #fff;
59
+ padding: 10px 24px;
60
+ display: flex;
61
+ justify-content: space-between;
62
+ align-items: center;
63
+ }
64
+ .header-left { display: flex; align-items: center; gap: 10px; }
65
+ #header h1 { font-size: 18px; font-weight: 600; }
66
+ .header-right { display: flex; align-items: center; gap: 12px; font-size: 13px; }
67
+ .badge {
68
+ background: rgba(255,255,255,0.15);
69
+ padding: 2px 10px;
70
+ border-radius: 10px;
71
+ font-size: 11px;
72
+ }
73
+ .status-dot {
74
+ width: 8px; height: 8px;
75
+ border-radius: 50%;
76
+ background: var(--accent);
77
+ display: inline-block;
78
+ }
79
+
80
+ /* Brief Bar */
81
+ #brief-bar {
82
+ background: var(--brief-bg);
83
+ color: #e0e0e0;
84
+ padding: 12px 24px;
85
+ border-bottom: 1px solid rgba(255,255,255,0.1);
86
+ }
87
+ #brief-bar strong { color: var(--accent); font-size: 13px; display: block; margin-bottom: 4px; }
88
+ #brief-text { font-size: 13px; line-height: 1.6; }
89
+
90
+ /* Category Filter Tabs */
91
+ #category-tabs {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: 4px;
95
+ padding: 8px 24px;
96
+ background: var(--tab-bg);
97
+ border-bottom: 1px solid var(--border);
98
+ flex-wrap: wrap;
99
+ }
100
+ .cat-tab {
101
+ padding: 5px 14px;
102
+ border: 1px solid var(--border);
103
+ background: var(--card-bg);
104
+ border-radius: 16px;
105
+ font-size: 12px;
106
+ cursor: pointer;
107
+ color: var(--text-light);
108
+ transition: all 0.2s;
109
+ white-space: nowrap;
110
+ }
111
+ .cat-tab:hover { background: #e8f5e9; border-color: var(--accent); }
112
+ .cat-tab.active {
113
+ background: var(--accent);
114
+ color: #fff;
115
+ border-color: var(--accent);
116
+ font-weight: 600;
117
+ }
118
+ .tab-right {
119
+ margin-left: auto;
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 12px;
123
+ font-size: 12px;
124
+ color: var(--text-muted);
125
+ }
126
+ #element-summary { font-size: 12px; color: var(--text-muted); }
127
+
128
+ /* Main Content: Dual View */
129
+ #main-content {
130
+ display: flex;
131
+ flex: 1;
132
+ min-height: 0;
133
+ }
134
+ #doc-tree-panel {
135
+ width: 55%;
136
+ border-right: 1px solid var(--border);
137
+ overflow-y: auto;
138
+ padding: 20px;
139
+ }
140
+ #event-stream-panel {
141
+ width: 45%;
142
+ overflow-y: auto;
143
+ padding: 20px;
144
+ background: #fafafa;
145
+ }
146
+
147
+ /* Panel Header */
148
+ .panel-header {
149
+ display: flex;
150
+ justify-content: space-between;
151
+ align-items: center;
152
+ margin-bottom: 16px;
153
+ }
154
+ .panel-header h2 { font-size: 16px; font-weight: 600; }
155
+ .hint { font-size: 10px; color: #bbb; }
156
+
157
+ /* Element Card (Timeline) — with time-phase colors */
158
+ .timeline-tree { }
159
+ .element-card {
160
+ border: 1px solid var(--border);
161
+ border-radius: 8px;
162
+ margin-bottom: 12px;
163
+ overflow: hidden;
164
+ }
165
+ .element-card.secondary-element {
166
+ border-left: 3px solid var(--secondary-tag);
167
+ }
168
+ /* Time-phase card backgrounds */
169
+ .element-card[data-timegroup="past"] {
170
+ background: var(--past-bg);
171
+ border-color: var(--past-border);
172
+ }
173
+ .element-card[data-timegroup="current"] {
174
+ background: var(--current-bg);
175
+ border-color: var(--current-border);
176
+ }
177
+ .element-card[data-timegroup="future"] {
178
+ background: var(--future-bg);
179
+ border-color: var(--future-border);
180
+ }
181
+
182
+ .element-header {
183
+ padding: 10px 14px;
184
+ font-weight: 600;
185
+ font-size: 13px;
186
+ display: flex;
187
+ justify-content: space-between;
188
+ align-items: center;
189
+ }
190
+ .element-header.completed { background: #e8f5e9; color: var(--completed); }
191
+ .element-header.in_progress { background: #fff3e0; color: var(--in-progress); }
192
+ .element-header.pending { background: #f5f5f5; color: var(--pending); }
193
+ .element-header.blocked { background: #ffebee; color: var(--blocked); }
194
+ .element-header.cancelled { background: #f5f5f5; color: var(--text-muted); }
195
+ .element-header.unknown { background: #fafafa; color: var(--text-light); }
196
+
197
+ .element-meta {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 8px;
201
+ font-size: 11px;
202
+ font-weight: 400;
203
+ }
204
+ .element-type-tag {
205
+ background: #eee;
206
+ padding: 1px 7px;
207
+ border-radius: 4px;
208
+ font-size: 10px;
209
+ color: var(--text-muted);
210
+ }
211
+ .source-badge {
212
+ font-size: 10px;
213
+ background: #e3f2fd;
214
+ padding: 1px 7px;
215
+ border-radius: 4px;
216
+ color: var(--source-link);
217
+ cursor: pointer;
218
+ text-decoration: none;
219
+ }
220
+ .source-badge:hover { background: var(--source-link); color: #fff; }
221
+ .element-summary {
222
+ padding: 6px 14px;
223
+ font-size: 12px;
224
+ color: var(--text-light);
225
+ line-height: 1.5;
226
+ }
227
+ .element-tags { padding: 4px 14px 8px; }
228
+ .tag {
229
+ display: inline-block;
230
+ background: #f0f0f0;
231
+ padding: 1px 6px;
232
+ border-radius: 3px;
233
+ font-size: 10px;
234
+ color: var(--text-muted);
235
+ margin-right: 4px;
236
+ }
237
+ .element-children {
238
+ border-top: 1px solid #f0f0f0;
239
+ padding: 4px 14px 8px;
240
+ }
241
+ .sub-element {
242
+ padding: 4px 0;
243
+ font-size: 12px;
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 8px;
247
+ color: var(--text-light);
248
+ }
249
+
250
+ /* Waterfall */
251
+ .waterfall {
252
+ border-left: 2px solid var(--accent);
253
+ padding-left: 16px;
254
+ margin-left: 8px;
255
+ }
256
+ .waterfall-event {
257
+ margin-bottom: 18px;
258
+ position: relative;
259
+ }
260
+ .waterfall-event::before {
261
+ content: '';
262
+ position: absolute;
263
+ left: -22px;
264
+ top: 6px;
265
+ width: 8px;
266
+ height: 8px;
267
+ border-radius: 50%;
268
+ background: var(--accent);
269
+ }
270
+ .waterfall-event.secondary::before { background: var(--secondary-tag); }
271
+ .waterfall-date {
272
+ font-size: 11px;
273
+ color: var(--accent);
274
+ margin-bottom: 2px;
275
+ font-weight: 600;
276
+ }
277
+ .waterfall-marker {
278
+ display: none;
279
+ }
280
+ .waterfall-body {}
281
+ .waterfall-title {
282
+ font-size: 13px;
283
+ font-weight: 600;
284
+ margin-bottom: 3px;
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 6px;
288
+ }
289
+ .kind-badge {
290
+ font-size: 10px;
291
+ padding: 1px 6px;
292
+ border-radius: 4px;
293
+ font-weight: 400;
294
+ }
295
+ .kind-badge.primary { background: #e8f5e9; color: var(--completed); }
296
+ .kind-badge.secondary { background: #ede7f6; color: var(--secondary-tag); }
297
+ .waterfall-source {
298
+ font-size: 11px;
299
+ color: var(--source-link);
300
+ margin-bottom: 2px;
301
+ }
302
+ .waterfall-source code {
303
+ font-size: 10px;
304
+ background: #f5f5f5;
305
+ padding: 1px 5px;
306
+ border-radius: 3px;
307
+ }
308
+ .waterfall-summary {
309
+ font-size: 12px;
310
+ color: var(--text-light);
311
+ line-height: 1.5;
312
+ }
313
+ .waterfall-related {
314
+ font-size: 10px;
315
+ color: var(--text-muted);
316
+ margin-top: 2px;
317
+ }
318
+
319
+ /* Waterfall — Event Stream additions */
320
+ .waterfall-date-header {
321
+ font-size: 13px;
322
+ font-weight: 700;
323
+ color: var(--text);
324
+ padding: 8px 0 4px;
325
+ margin-left: -16px;
326
+ padding-left: 16px;
327
+ border-bottom: 1px solid var(--border);
328
+ margin-bottom: 12px;
329
+ }
330
+ .waterfall-date-header:first-child { margin-top: 0; }
331
+ .event-icon { font-size: 14px; margin-right: 4px; }
332
+ .event-time { font-size: 10px; color: var(--text-muted); font-weight: 400; }
333
+ .subtype-tag {
334
+ font-size: 9px;
335
+ background: #f0f0f0;
336
+ padding: 0 5px;
337
+ border-radius: 3px;
338
+ color: var(--text-muted);
339
+ font-weight: 400;
340
+ }
341
+ .waterfall-refs { margin: 3px 0; display: flex; gap: 8px; flex-wrap: wrap; }
342
+ .ref-link {
343
+ font-size: 10px;
344
+ padding: 1px 6px;
345
+ border-radius: 3px;
346
+ text-decoration: none;
347
+ }
348
+ .doc-ref { background: #e3f2fd; color: var(--source-link); }
349
+ .doc-ref:hover { background: var(--source-link); color: #fff; }
350
+ .commit-ref { background: #f5f5f5; color: var(--text-muted); font-family: monospace; }
351
+ .pr-ref { background: #e8f5e9; color: var(--completed); }
352
+ .impact-badge {
353
+ font-size: 9px;
354
+ padding: 1px 5px;
355
+ border-radius: 3px;
356
+ margin-right: 6px;
357
+ }
358
+ .impact-high { background: #ffebee; color: var(--blocked); font-weight: 600; }
359
+ .impact-medium { background: #fff3e0; color: var(--in-progress); }
360
+ .actor-badge {
361
+ font-size: 9px;
362
+ color: var(--text-muted);
363
+ margin-left: 4px;
364
+ }
365
+ .event-tags { margin-top: 3px; }
366
+
367
+ /* Must-record event highlight */
368
+ .waterfall-event.must-record {
369
+ background: #fffef5;
370
+ border-left-width: 4px !important;
371
+ padding-left: 4px;
372
+ }
373
+
374
+ /* Waterfall event highlight (ref jump) */
375
+ .waterfall-event.highlighted {
376
+ animation: waterfall-flash 1.2s ease-in-out 2;
377
+ }
378
+ @keyframes waterfall-flash {
379
+ 0%, 100% { background: transparent; }
380
+ 50% { background: #fff9c4; }
381
+ }
382
+
383
+ /* Category section in timeline */
384
+ .category-section { margin-bottom: 16px; }
385
+ .category-header {
386
+ font-size: 12px;
387
+ font-weight: 600;
388
+ padding: 4px 8px;
389
+ border-radius: 4px;
390
+ margin-bottom: 8px;
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 8px;
394
+ }
395
+ .category-header.primary-section {
396
+ background: #e8f5e9;
397
+ color: var(--completed);
398
+ }
399
+ .category-header.secondary-section {
400
+ background: #f5f5f5;
401
+ color: var(--text-muted);
402
+ }
403
+ .category-count { font-weight: 400; font-size: 11px; }
404
+
405
+ /* Archived element */
406
+ .element-header.archived {
407
+ background: #fafafa;
408
+ color: #999;
409
+ font-style: italic;
410
+ }
411
+ .element-header.archived::after {
412
+ content: ' (只读/已停产)';
413
+ font-size: 10px;
414
+ font-style: normal;
415
+ color: #bbb;
416
+ }
417
+
418
+ /* Time badges */
419
+ .time-badge {
420
+ font-size: 10px;
421
+ padding: 1px 6px;
422
+ border-radius: 3px;
423
+ font-weight: 500;
424
+ }
425
+ .time-past-badge { background: var(--past-bg); color: #607d8b; }
426
+ .time-current-badge { background: var(--current-bg); color: #e65100; }
427
+ .time-future-badge { background: var(--future-bg); color: #999; }
428
+
429
+ /* Unknown category badge */
430
+ .unknown-badge {
431
+ background: #fff3e0;
432
+ color: var(--in-progress);
433
+ font-size: 10px;
434
+ padding: 1px 7px;
435
+ border-radius: 4px;
436
+ }
437
+
438
+ /* Footer / Conventions */
439
+ #footer {
440
+ background: #fafafa;
441
+ border-top: 1px solid var(--border);
442
+ padding: 10px 24px;
443
+ font-size: 12px;
444
+ color: var(--text-muted);
445
+ display: flex;
446
+ align-items: center;
447
+ gap: 8px;
448
+ }
449
+ #conventions-bar { display: flex; gap: 12px; }
450
+ .convention-tag {
451
+ color: var(--accent);
452
+ cursor: help;
453
+ font-weight: 500;
454
+ }
455
+ .convention-tag:hover { text-decoration: underline; }
456
+ .convention-tag.term-tag { color: #CE9178; }
457
+ .conventions-placeholder {
458
+ color: var(--text-muted);
459
+ font-style: italic;
460
+ border: 1px dashed var(--border);
461
+ padding: 2px 12px;
462
+ border-radius: 4px;
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 8px;
466
+ }
467
+ .conventions-placeholder span {
468
+ color: var(--source-link);
469
+ cursor: help;
470
+ font-style: normal;
471
+ }
472
+ .conventions-placeholder span:hover { text-decoration: underline; }
473
+
474
+ /* Loading / Error */
475
+ .loading { color: var(--text-muted); font-style: italic; padding: 20px; }
476
+ .error { color: var(--blocked); padding: 20px; }
477
+
478
+ /* ---- v0.3 Event Stream Styles ---- */
479
+ .event-stream {
480
+ display: flex;
481
+ flex-direction: column;
482
+ gap: 0;
483
+ }
484
+ .event-item {
485
+ padding: 10px 14px;
486
+ border-left: 3px solid var(--border);
487
+ margin-bottom: 6px;
488
+ border-radius: 4px;
489
+ background: #fff;
490
+ position: relative;
491
+ font-size: 12px;
492
+ }
493
+ .event-item.must-record {
494
+ border-left-width: 5px;
495
+ background: #fffef5;
496
+ }
497
+ /* Event type colors */
498
+ .event-item.type-对齐与拍板 { border-left-color: var(--event-decision); }
499
+ .event-item.type-规格演进 { border-left-color: var(--event-spec); }
500
+ .event-item.type-代码变更 { border-left-color: var(--event-code); }
501
+ .event-item.type-测试与质量 { border-left-color: var(--event-test); }
502
+ .event-item.type-审批与交接 { border-left-color: var(--event-approval); }
503
+ .event-item.type-运维与基建 { border-left-color: var(--event-ops); }
504
+ .event-item.type-教训沉淀 { border-left-color: var(--event-lesson); }
505
+ /* Time-phase backgrounds for events */
506
+ .event-item.time-past { background: var(--past-bg); }
507
+ .event-item.time-current { background: var(--current-bg); }
508
+ .event-item.time-future { background: var(--future-bg); }
509
+
510
+ .event-item-header {
511
+ display: flex;
512
+ justify-content: space-between;
513
+ align-items: flex-start;
514
+ gap: 8px;
515
+ }
516
+ .event-item-title {
517
+ font-weight: 600;
518
+ flex: 1;
519
+ line-height: 1.4;
520
+ }
521
+ .event-item-meta {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: 6px;
525
+ flex-shrink: 0;
526
+ font-size: 10px;
527
+ }
528
+ .event-type-badge {
529
+ padding: 1px 6px;
530
+ border-radius: 3px;
531
+ font-size: 10px;
532
+ font-weight: 600;
533
+ color: #fff;
534
+ }
535
+ .badge-decision { background: var(--event-decision); }
536
+ .badge-spec { background: var(--event-spec); }
537
+ .badge-code { background: var(--event-code); }
538
+ .badge-test { background: var(--event-test); }
539
+ .badge-approval { background: var(--event-approval); }
540
+ .badge-ops { background: var(--event-ops); }
541
+ .badge-lesson { background: var(--event-lesson); }
542
+
543
+ .event-priority-dot {
544
+ width: 8px; height: 8px;
545
+ border-radius: 50%;
546
+ display: inline-block;
547
+ }
548
+ .priority-must { background: var(--priority-must); }
549
+ .priority-should { background: var(--priority-should); }
550
+ .priority-can { background: var(--priority-can); }
551
+
552
+ .event-item-body {
553
+ margin-top: 4px;
554
+ display: flex;
555
+ align-items: center;
556
+ gap: 8px;
557
+ flex-wrap: wrap;
558
+ font-size: 10px;
559
+ color: var(--text-muted);
560
+ }
561
+ .event-time-text {
562
+ font-family: monospace;
563
+ color: var(--text-light);
564
+ }
565
+ .event-ref-link {
566
+ color: var(--source-link);
567
+ text-decoration: none;
568
+ cursor: pointer;
569
+ }
570
+ .event-ref-link:hover { text-decoration: underline; }
571
+ .event-tag {
572
+ display: inline-block;
573
+ background: #f0f0f0;
574
+ padding: 1px 5px;
575
+ border-radius: 3px;
576
+ font-size: 9px;
577
+ }
578
+ .event-actor {
579
+ color: var(--text-muted);
580
+ font-style: italic;
581
+ }
582
+ .event-item.highlighted {
583
+ animation: event-flash 1.2s ease-in-out 2;
584
+ background: #fff9c4 !important;
585
+ }
586
+ @keyframes event-flash {
587
+ 0%, 100% { background: #fff9c4; }
588
+ 50% { background: #ffe082; }
589
+ }
590
+ .event-impact-high { color: var(--blocked); font-weight: 600; }
591
+ .event-impact-medium { color: var(--in-progress); }
592
+ .event-impact-low { color: var(--text-muted); }
593
+
594
+ /* Date group header */
595
+ .event-date-group {
596
+ font-size: 12px;
597
+ font-weight: 700;
598
+ color: var(--text);
599
+ padding: 12px 0 6px;
600
+ margin-bottom: 4px;
601
+ border-bottom: 1px solid var(--border);
602
+ }
603
+ .event-date-group:first-child { margin-top: 0; padding-top: 0; }
604
+
605
+ /* ---- Floating Panel (Markdown Preview) ---- */
606
+ .floating-panel {
607
+ position: fixed;
608
+ top: 0;
609
+ right: 0;
610
+ width: 480px;
611
+ max-width: 90vw;
612
+ height: 100vh;
613
+ background: #fff;
614
+ box-shadow: -4px 0 24px rgba(0,0,0,0.15);
615
+ z-index: 1000;
616
+ display: flex;
617
+ flex-direction: column;
618
+ transition: transform 0.25s ease;
619
+ }
620
+ .floating-panel.hidden {
621
+ transform: translateX(100%);
622
+ }
623
+ .floating-header {
624
+ display: flex;
625
+ justify-content: space-between;
626
+ align-items: center;
627
+ padding: 12px 16px;
628
+ background: var(--header-bg);
629
+ color: #fff;
630
+ font-size: 14px;
631
+ font-weight: 600;
632
+ }
633
+ .floating-body {
634
+ flex: 1;
635
+ overflow-y: auto;
636
+ padding: 16px 20px;
637
+ font-size: 13px;
638
+ line-height: 1.7;
639
+ color: var(--text);
640
+ white-space: pre-wrap;
641
+ word-break: break-word;
642
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, monospace;
643
+ }
644
+ .floating-body h1, .floating-body h2, .floating-body h3 {
645
+ margin: 12px 0 6px;
646
+ color: var(--text);
647
+ }
648
+ .floating-body h1 { font-size: 18px; border-bottom: 1px solid var(--border); padding-bottom: 4px; }
649
+ .floating-body h2 { font-size: 16px; }
650
+ .floating-body h3 { font-size: 14px; }
651
+ .floating-body code {
652
+ background: #f5f5f5;
653
+ padding: 1px 4px;
654
+ border-radius: 3px;
655
+ font-size: 12px;
656
+ }
657
+ .floating-body pre {
658
+ background: #f5f5f5;
659
+ padding: 10px;
660
+ border-radius: 6px;
661
+ overflow-x: auto;
662
+ font-size: 12px;
663
+ margin: 8px 0;
664
+ }
665
+ .floating-body blockquote {
666
+ border-left: 3px solid var(--accent);
667
+ padding-left: 12px;
668
+ color: var(--text-light);
669
+ margin: 8px 0;
670
+ }
671
+ .floating-body table {
672
+ border-collapse: collapse;
673
+ width: 100%;
674
+ font-size: 12px;
675
+ margin: 8px 0;
676
+ }
677
+ .floating-body th, .floating-body td {
678
+ border: 1px solid var(--border);
679
+ padding: 4px 8px;
680
+ text-align: left;
681
+ }
682
+ .floating-body th { background: #f5f5f5; }
683
+ .floating-body a { color: var(--source-link); }
684
+
685
+ .close-btn {
686
+ background: none;
687
+ border: none;
688
+ color: #fff;
689
+ font-size: 22px;
690
+ cursor: pointer;
691
+ padding: 0 4px;
692
+ line-height: 1;
693
+ }
694
+ .close-btn:hover { opacity: 0.7; }
695
+
696
+ /* Overlay behind floating panel */
697
+ #floating-overlay {
698
+ position: fixed;
699
+ top: 0; left: 0;
700
+ width: 100vw; height: 100vh;
701
+ background: rgba(0,0,0,0.2);
702
+ z-index: 999;
703
+ }
704
+ #floating-overlay.hidden { display: none; }
705
+
706
+ /* ---- Milestone hover tooltip ---- */
707
+ .milestone-tooltip {
708
+ display: none;
709
+ position: absolute;
710
+ background: #fff;
711
+ border: 1px solid var(--border);
712
+ border-radius: 6px;
713
+ padding: 8px 12px;
714
+ font-size: 11px;
715
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
716
+ z-index: 100;
717
+ max-width: 280px;
718
+ line-height: 1.5;
719
+ }
720
+ .element-header:hover .milestone-tooltip {
721
+ display: block;
722
+ }
723
+
724
+ /* ---- Empty State ---- */
725
+ .empty-state {
726
+ text-align: center;
727
+ padding: 48px 20px;
728
+ color: var(--text-muted);
729
+ }
730
+ .empty-state h3 { font-size: 18px; margin-bottom: 8px; }
731
+ .empty-state p { font-size: 13px; max-width: 400px; margin: 0 auto; line-height: 1.6; }