@startsimpli/ui 0.2.0 → 0.4.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,877 @@
1
+ /* @startsimpli/ui - Gantt Chart Styles */
2
+
3
+ .gantt-wrapper {
4
+ display: flex;
5
+ flex-direction: column;
6
+ border: 1px solid hsl(var(--border, 220 13% 91%));
7
+ border-radius: 8px;
8
+ overflow: hidden;
9
+ background: hsl(var(--background, 0 0% 100%));
10
+ color: hsl(var(--foreground, 222 47% 11%));
11
+ font-family: inherit;
12
+ }
13
+
14
+ /* Fullscreen mode */
15
+ .gantt-wrapper.gantt-fullscreen {
16
+ position: fixed;
17
+ top: 0;
18
+ left: 0;
19
+ right: 0;
20
+ bottom: 0;
21
+ z-index: 9999;
22
+ border-radius: 0;
23
+ border: none;
24
+ }
25
+
26
+ .gantt-wrapper.gantt-fullscreen .gantt-body-scroll {
27
+ max-height: none;
28
+ }
29
+
30
+ /* Filter bar */
31
+ .gantt-filter-bar {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 0.5rem;
35
+ padding: 0.5rem 0.75rem;
36
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
37
+ background: hsl(var(--muted, 210 40% 96%) / 0.5);
38
+ flex-wrap: wrap;
39
+ }
40
+
41
+ .gantt-filter-search {
42
+ height: 28px;
43
+ padding: 0 0.5rem;
44
+ border: 1px solid hsl(var(--border, 220 13% 91%));
45
+ border-radius: 4px;
46
+ font-size: 0.75rem;
47
+ background: hsl(var(--background, 0 0% 100%));
48
+ color: hsl(var(--foreground, 222 47% 11%));
49
+ min-width: 140px;
50
+ outline: none;
51
+ }
52
+
53
+ .gantt-filter-search:focus {
54
+ border-color: hsl(var(--primary, 222 47% 11%) / 0.5);
55
+ }
56
+
57
+ .gantt-filter-search::placeholder {
58
+ color: hsl(var(--muted-foreground, 215 16% 47%));
59
+ }
60
+
61
+ .gantt-filter-select {
62
+ height: 28px;
63
+ padding: 0 0.375rem;
64
+ border: 1px solid hsl(var(--border, 220 13% 91%));
65
+ border-radius: 4px;
66
+ font-size: 0.7rem;
67
+ background: hsl(var(--background, 0 0% 100%));
68
+ color: hsl(var(--foreground, 222 47% 11%));
69
+ cursor: pointer;
70
+ outline: none;
71
+ }
72
+
73
+ .gantt-filter-date {
74
+ height: 28px;
75
+ padding: 0 0.375rem;
76
+ border: 1px solid hsl(var(--border, 220 13% 91%));
77
+ border-radius: 4px;
78
+ font-size: 0.65rem;
79
+ background: hsl(var(--background, 0 0% 100%));
80
+ color: hsl(var(--foreground, 222 47% 11%));
81
+ cursor: pointer;
82
+ outline: none;
83
+ max-width: 120px;
84
+ }
85
+
86
+ .gantt-filter-clear {
87
+ height: 28px;
88
+ padding: 0 0.5rem;
89
+ border: 1px solid hsl(var(--border, 220 13% 91%));
90
+ border-radius: 4px;
91
+ font-size: 0.7rem;
92
+ background: hsl(var(--background, 0 0% 100%));
93
+ color: hsl(var(--muted-foreground, 215 16% 47%));
94
+ cursor: pointer;
95
+ transition: all 0.15s;
96
+ }
97
+
98
+ .gantt-filter-clear:hover {
99
+ background: hsl(var(--accent, 210 40% 96%));
100
+ color: hsl(var(--foreground, 222 47% 11%));
101
+ }
102
+
103
+ .gantt-filter-pill {
104
+ display: inline-flex;
105
+ align-items: center;
106
+ gap: 0.25rem;
107
+ padding: 0.125rem 0.375rem;
108
+ border-radius: 3px;
109
+ font-size: 0.625rem;
110
+ font-weight: 500;
111
+ background: hsl(var(--primary, 222 47% 11%) / 0.1);
112
+ color: hsl(var(--foreground, 222 47% 11%));
113
+ white-space: nowrap;
114
+ }
115
+
116
+ .gantt-filter-pill button {
117
+ border: none;
118
+ background: transparent;
119
+ color: inherit;
120
+ cursor: pointer;
121
+ padding: 0;
122
+ font-size: 0.75rem;
123
+ line-height: 1;
124
+ opacity: 0.6;
125
+ }
126
+
127
+ .gantt-filter-pill button:hover {
128
+ opacity: 1;
129
+ }
130
+
131
+ .gantt-empty {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ min-height: 200px;
136
+ color: hsl(var(--muted-foreground, 215 16% 47%));
137
+ font-size: 0.875rem;
138
+ border: 1px solid hsl(var(--border, 220 13% 91%));
139
+ border-radius: 8px;
140
+ }
141
+
142
+ .gantt-header-row {
143
+ display: flex;
144
+ flex-shrink: 0;
145
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
146
+ background: hsl(var(--muted, 210 40% 96%));
147
+ }
148
+
149
+ .gantt-info-header {
150
+ flex-shrink: 0;
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 0.5rem;
154
+ padding: 0.5rem 1rem;
155
+ height: 52px;
156
+ font-size: 0.7rem;
157
+ font-weight: 600;
158
+ text-transform: uppercase;
159
+ color: hsl(var(--muted-foreground, 215 16% 47%));
160
+ border-right: 1px solid hsl(var(--border, 220 13% 91%));
161
+ }
162
+
163
+ .gantt-zoom-controls {
164
+ display: flex;
165
+ gap: 4px;
166
+ margin-left: auto;
167
+ align-items: center;
168
+ }
169
+
170
+ .gantt-zoom-controls button {
171
+ width: 22px;
172
+ height: 22px;
173
+ border: 1px solid hsl(var(--border, 220 13% 91%));
174
+ background: hsl(var(--background, 0 0% 100%));
175
+ color: hsl(var(--foreground, 222 47% 11%));
176
+ border-radius: 4px;
177
+ cursor: pointer;
178
+ font-size: 14px;
179
+ font-weight: 600;
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ transition: all 0.15s;
184
+ }
185
+
186
+ .gantt-zoom-controls button:hover:not(:disabled) {
187
+ background: hsl(var(--accent, 210 40% 96%));
188
+ }
189
+
190
+ .gantt-zoom-controls button:disabled {
191
+ opacity: 0.3;
192
+ cursor: not-allowed;
193
+ }
194
+
195
+ .gantt-zoom-slider {
196
+ width: 60px;
197
+ height: 4px;
198
+ border-radius: 2px;
199
+ outline: none;
200
+ cursor: pointer;
201
+ appearance: none;
202
+ -webkit-appearance: none;
203
+ background: hsl(var(--border, 220 13% 91%));
204
+ }
205
+
206
+ .gantt-zoom-slider::-webkit-slider-thumb {
207
+ appearance: none;
208
+ -webkit-appearance: none;
209
+ width: 12px;
210
+ height: 12px;
211
+ border-radius: 50%;
212
+ background: hsl(var(--primary, 222 47% 11%));
213
+ cursor: pointer;
214
+ }
215
+
216
+ .gantt-timeline-header {
217
+ flex: 1;
218
+ overflow: hidden;
219
+ }
220
+
221
+ .gantt-month-header {
222
+ display: flex;
223
+ height: 26px;
224
+ background: hsl(var(--muted, 210 40% 96%));
225
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
226
+ position: sticky;
227
+ top: 0;
228
+ z-index: 5;
229
+ }
230
+
231
+ .gantt-month {
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ font-size: 0.7rem;
236
+ font-weight: 600;
237
+ color: hsl(var(--foreground, 222 47% 11%));
238
+ border-right: 1px solid hsl(var(--border, 220 13% 91%));
239
+ text-transform: uppercase;
240
+ }
241
+
242
+ .gantt-day-header {
243
+ display: flex;
244
+ height: 26px;
245
+ background: hsl(var(--muted, 210 40% 96%));
246
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
247
+ position: sticky;
248
+ top: 26px;
249
+ z-index: 5;
250
+ }
251
+
252
+ .gantt-day {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: center;
256
+ font-size: 0.7rem;
257
+ color: hsl(var(--muted-foreground, 215 16% 47%));
258
+ border-right: 1px solid hsl(var(--border, 220 13% 91%) / 0.3);
259
+ }
260
+
261
+ .gantt-day.weekend {
262
+ background: hsl(var(--muted, 210 40% 96%) / 0.5);
263
+ }
264
+
265
+ .gantt-day.today {
266
+ background: hsl(var(--primary, 222 47% 11%) / 0.1);
267
+ color: hsl(var(--primary, 222 47% 11%));
268
+ font-weight: 600;
269
+ }
270
+
271
+ .gantt-week {
272
+ display: flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ font-size: 0.65rem;
276
+ color: hsl(var(--muted-foreground, 215 16% 47%));
277
+ border-right: 1px solid hsl(var(--border, 220 13% 91%) / 0.5);
278
+ white-space: nowrap;
279
+ overflow: hidden;
280
+ text-overflow: ellipsis;
281
+ padding: 0 4px;
282
+ }
283
+
284
+ .gantt-week.has-today {
285
+ background: hsl(var(--primary, 222 47% 11%) / 0.1);
286
+ color: hsl(var(--primary, 222 47% 11%));
287
+ font-weight: 500;
288
+ }
289
+
290
+ .gantt-body-scroll {
291
+ flex: 1;
292
+ display: flex;
293
+ overflow: auto;
294
+ -webkit-overflow-scrolling: touch;
295
+ }
296
+
297
+ .gantt-info-column {
298
+ flex-shrink: 0;
299
+ border-right: 1px solid hsl(var(--border, 220 13% 91%));
300
+ background: hsl(var(--background, 0 0% 100%));
301
+ }
302
+
303
+ .gantt-info-row {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 0.375rem;
307
+ padding: 0 0.75rem;
308
+ height: 36px;
309
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
310
+ }
311
+
312
+ .gantt-info-row:hover {
313
+ background: hsl(var(--accent, 210 40% 96%) / 0.5);
314
+ }
315
+
316
+ .gantt-row-indent { flex-shrink: 0; }
317
+
318
+ .gantt-collapse-btn {
319
+ width: 16px;
320
+ height: 16px;
321
+ padding: 0;
322
+ border: none;
323
+ background: transparent;
324
+ color: hsl(var(--muted-foreground, 215 16% 47%));
325
+ cursor: pointer;
326
+ font-size: 8px;
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ flex-shrink: 0;
331
+ border-radius: 3px;
332
+ transition: all 0.1s;
333
+ }
334
+
335
+ .gantt-collapse-btn:hover {
336
+ background: hsl(var(--accent, 210 40% 96%));
337
+ color: hsl(var(--foreground, 222 47% 11%));
338
+ }
339
+
340
+ .gantt-collapse-spacer { width: 16px; flex-shrink: 0; }
341
+
342
+ .gantt-row-title {
343
+ flex: 1;
344
+ font-size: 0.75rem;
345
+ white-space: nowrap;
346
+ overflow: hidden;
347
+ text-overflow: ellipsis;
348
+ min-width: 0;
349
+ }
350
+
351
+ .gantt-row-title:hover {
352
+ color: hsl(var(--primary, 222 47% 11%));
353
+ }
354
+
355
+ .gantt-category-badge {
356
+ padding: 0.125rem 0.375rem;
357
+ border-radius: 3px;
358
+ font-size: 0.55rem;
359
+ font-weight: 600;
360
+ text-transform: uppercase;
361
+ white-space: nowrap;
362
+ color: white;
363
+ flex-shrink: 0;
364
+ }
365
+
366
+ .gantt-status-badge {
367
+ padding: 0.125rem 0.375rem;
368
+ border-radius: 3px;
369
+ font-size: 0.55rem;
370
+ font-weight: 600;
371
+ text-transform: uppercase;
372
+ white-space: nowrap;
373
+ flex-shrink: 0;
374
+ background: hsl(var(--muted, 210 40% 96%));
375
+ color: hsl(var(--muted-foreground, 215 16% 47%));
376
+ }
377
+
378
+ .gantt-status-completed, .gantt-status-closed { background: #dcfce7; color: #166534; }
379
+ .gantt-status-in_progress, .gantt-status-active, .gantt-status-on_track { background: #fef3c7; color: #92400e; }
380
+ .gantt-status-at_risk, .gantt-status-off_track { background: #fee2e2; color: #991b1b; }
381
+ .gantt-status-draft, .gantt-status-pending { background: #e0e7ff; color: #3730a3; }
382
+
383
+ .gantt-timeline-body { position: relative; }
384
+
385
+ .gantt-grid-line {
386
+ position: absolute;
387
+ top: 0;
388
+ border-right: 1px solid hsl(var(--border, 220 13% 91%) / 0.2);
389
+ }
390
+
391
+ .gantt-grid-line.weekend { background: hsl(var(--muted, 210 40% 96%) / 0.3); }
392
+ .gantt-grid-line.today { background: hsl(var(--primary, 222 47% 11%) / 0.05); }
393
+
394
+ .gantt-row-line {
395
+ position: absolute;
396
+ left: 0;
397
+ right: 0;
398
+ height: 1px;
399
+ background: hsl(var(--border, 220 13% 91%));
400
+ }
401
+
402
+ .gantt-deps-svg { position: absolute; top: 0; left: 0; pointer-events: none; z-index: 1; }
403
+
404
+ .gantt-dep-line {
405
+ stroke: hsl(var(--muted-foreground, 215 16% 47%));
406
+ stroke-width: 1.5;
407
+ fill: none;
408
+ opacity: 0.4;
409
+ }
410
+
411
+ .gantt-today-line {
412
+ position: absolute;
413
+ top: 0;
414
+ bottom: 0;
415
+ width: 2px;
416
+ background: hsl(var(--primary, 222 47% 11%));
417
+ z-index: 3;
418
+ }
419
+
420
+ .gantt-bar {
421
+ position: absolute;
422
+ border-radius: 4px;
423
+ cursor: pointer;
424
+ display: flex;
425
+ align-items: center;
426
+ overflow: hidden;
427
+ font-size: 0.625rem;
428
+ font-weight: 500;
429
+ color: white;
430
+ transition: transform 0.1s, box-shadow 0.1s;
431
+ z-index: 2;
432
+ min-height: 16px;
433
+ min-width: 16px;
434
+ }
435
+
436
+ .gantt-bar:hover {
437
+ transform: translateY(-1px);
438
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
439
+ z-index: 4;
440
+ }
441
+
442
+ .gantt-bar.depth-0 { height: 22px; }
443
+ .gantt-bar.depth-1 { height: 20px; }
444
+ .gantt-bar.depth-2 { height: 18px; }
445
+ .gantt-bar.depth-3 { height: 16px; }
446
+
447
+ .gantt-bar-progress {
448
+ position: absolute;
449
+ left: 0;
450
+ top: 0;
451
+ bottom: 0;
452
+ background: rgba(255, 255, 255, 0.2);
453
+ border-radius: 4px 0 0 4px;
454
+ transition: width 0.2s ease;
455
+ }
456
+
457
+ .gantt-bar-progress.behind { background: rgba(239, 68, 68, 0.3); }
458
+ .gantt-bar-progress.ahead { background: rgba(34, 197, 94, 0.3); }
459
+
460
+ .gantt-bar-time-marker {
461
+ position: absolute;
462
+ top: 0;
463
+ bottom: 0;
464
+ width: 2px;
465
+ background: rgba(255, 255, 255, 0.5);
466
+ z-index: 1;
467
+ pointer-events: none;
468
+ }
469
+
470
+ .gantt-bar-label {
471
+ padding: 0 6px;
472
+ white-space: nowrap;
473
+ overflow: hidden;
474
+ text-overflow: ellipsis;
475
+ position: relative;
476
+ z-index: 1;
477
+ }
478
+
479
+ .gantt-bar-handle {
480
+ position: absolute;
481
+ top: 0;
482
+ bottom: 0;
483
+ width: 8px;
484
+ cursor: ew-resize;
485
+ opacity: 0;
486
+ transition: opacity 0.15s;
487
+ z-index: 2;
488
+ }
489
+
490
+ .gantt-bar-handle::after {
491
+ content: '';
492
+ position: absolute;
493
+ top: 50%;
494
+ transform: translateY(-50%);
495
+ width: 2px;
496
+ height: 12px;
497
+ background: rgba(255, 255, 255, 0.6);
498
+ border-radius: 1px;
499
+ }
500
+
501
+ .gantt-bar-handle-left { left: 0; }
502
+ .gantt-bar-handle-left::after { left: 3px; }
503
+ .gantt-bar-handle-right { right: 0; }
504
+ .gantt-bar-handle-right::after { right: 3px; }
505
+
506
+ .gantt-bar:hover .gantt-bar-handle { opacity: 1; }
507
+
508
+ .gantt-bar.dragging {
509
+ z-index: 10;
510
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
511
+ opacity: 0.9;
512
+ user-select: none;
513
+ -webkit-user-select: none;
514
+ }
515
+
516
+ .gantt-bar.dragging .gantt-bar-handle { opacity: 1; }
517
+
518
+ .gantt-drag-tooltip {
519
+ position: absolute;
520
+ top: -28px;
521
+ left: 50%;
522
+ transform: translateX(-50%);
523
+ background: hsl(var(--popover, 0 0% 100%));
524
+ color: hsl(var(--popover-foreground, 222 47% 11%));
525
+ padding: 4px 8px;
526
+ border-radius: 4px;
527
+ font-size: 0.65rem;
528
+ font-weight: 500;
529
+ white-space: nowrap;
530
+ pointer-events: none;
531
+ z-index: 100;
532
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
533
+ border: 1px solid hsl(var(--border, 220 13% 91%));
534
+ }
535
+
536
+ .gantt-legend {
537
+ display: flex;
538
+ gap: 1rem;
539
+ padding: 0.5rem 1rem;
540
+ border-top: 1px solid hsl(var(--border, 220 13% 91%));
541
+ font-size: 0.7rem;
542
+ color: hsl(var(--muted-foreground, 215 16% 47%));
543
+ flex-shrink: 0;
544
+ flex-wrap: wrap;
545
+ background: hsl(var(--muted, 210 40% 96%) / 0.5);
546
+ }
547
+
548
+ .gantt-legend-item { display: flex; align-items: center; gap: 0.375rem; }
549
+ .gantt-legend-color { width: 12px; height: 12px; border-radius: 2px; }
550
+
551
+ /* Focus outline for keyboard nav */
552
+ .gantt-wrapper:focus { outline: 2px solid hsl(var(--primary, 222 47% 11%) / 0.3); outline-offset: -2px; }
553
+
554
+ .gantt-row-focused {
555
+ background: hsl(var(--primary, 222 47% 11%) / 0.08) !important;
556
+ outline: 1px solid hsl(var(--primary, 222 47% 11%) / 0.3);
557
+ outline-offset: -1px;
558
+ }
559
+
560
+ /* View switcher */
561
+ .gantt-view-switcher {
562
+ display: flex;
563
+ gap: 0;
564
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
565
+ background: hsl(var(--muted, 210 40% 96%) / 0.5);
566
+ padding: 0 0.75rem;
567
+ }
568
+
569
+ .gantt-view-tab {
570
+ padding: 0.5rem 1rem;
571
+ border: none;
572
+ background: transparent;
573
+ color: hsl(var(--muted-foreground, 215 16% 47%));
574
+ font-size: 0.75rem;
575
+ font-weight: 500;
576
+ cursor: pointer;
577
+ border-bottom: 2px solid transparent;
578
+ transition: all 0.15s;
579
+ }
580
+
581
+ .gantt-view-tab:hover {
582
+ color: hsl(var(--foreground, 222 47% 11%));
583
+ }
584
+
585
+ .gantt-view-tab.active {
586
+ color: hsl(var(--foreground, 222 47% 11%));
587
+ border-bottom-color: hsl(var(--primary, 222 47% 11%));
588
+ font-weight: 600;
589
+ }
590
+
591
+ /* Board view */
592
+ .gantt-board {
593
+ display: flex;
594
+ gap: 0.75rem;
595
+ padding: 0.75rem;
596
+ overflow-x: auto;
597
+ flex: 1;
598
+ min-height: 200px;
599
+ }
600
+
601
+ .gantt-board-column {
602
+ flex: 1;
603
+ min-width: 200px;
604
+ max-width: 320px;
605
+ background: hsl(var(--muted, 210 40% 96%) / 0.5);
606
+ border-radius: 6px;
607
+ display: flex;
608
+ flex-direction: column;
609
+ }
610
+
611
+ .gantt-board-column.gantt-board-drag-over {
612
+ background: hsl(var(--primary, 222 47% 11%) / 0.08);
613
+ outline: 2px dashed hsl(var(--primary, 222 47% 11%) / 0.3);
614
+ }
615
+
616
+ .gantt-board-column-header {
617
+ display: flex;
618
+ align-items: center;
619
+ justify-content: space-between;
620
+ padding: 0.5rem 0.75rem;
621
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%) / 0.5);
622
+ }
623
+
624
+ .gantt-board-count {
625
+ font-size: 0.65rem;
626
+ color: hsl(var(--muted-foreground, 215 16% 47%));
627
+ background: hsl(var(--background, 0 0% 100%));
628
+ padding: 0.125rem 0.375rem;
629
+ border-radius: 10px;
630
+ }
631
+
632
+ .gantt-board-cards {
633
+ padding: 0.5rem;
634
+ display: flex;
635
+ flex-direction: column;
636
+ gap: 0.375rem;
637
+ flex: 1;
638
+ overflow-y: auto;
639
+ }
640
+
641
+ .gantt-board-card {
642
+ padding: 0.5rem 0.625rem;
643
+ background: hsl(var(--background, 0 0% 100%));
644
+ border: 1px solid hsl(var(--border, 220 13% 91%));
645
+ border-radius: 4px;
646
+ cursor: pointer;
647
+ display: flex;
648
+ flex-wrap: wrap;
649
+ gap: 0.375rem;
650
+ align-items: center;
651
+ transition: box-shadow 0.15s;
652
+ }
653
+
654
+ .gantt-board-card:hover {
655
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
656
+ }
657
+
658
+ .gantt-board-card[draggable='true'] { cursor: grab; }
659
+ .gantt-board-card[draggable='true']:active { cursor: grabbing; }
660
+
661
+ .gantt-board-card-title {
662
+ flex: 1 1 100%;
663
+ font-size: 0.75rem;
664
+ font-weight: 500;
665
+ color: hsl(var(--foreground, 222 47% 11%));
666
+ }
667
+
668
+ .gantt-board-card-date {
669
+ font-size: 0.625rem;
670
+ color: hsl(var(--muted-foreground, 215 16% 47%));
671
+ margin-left: auto;
672
+ }
673
+
674
+ /* List view */
675
+ .gantt-list {
676
+ flex: 1;
677
+ overflow-y: auto;
678
+ }
679
+
680
+ .gantt-list-header {
681
+ display: flex;
682
+ padding: 0.5rem 0.75rem;
683
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
684
+ background: hsl(var(--muted, 210 40% 96%));
685
+ font-size: 0.65rem;
686
+ font-weight: 600;
687
+ text-transform: uppercase;
688
+ color: hsl(var(--muted-foreground, 215 16% 47%));
689
+ position: sticky;
690
+ top: 0;
691
+ z-index: 1;
692
+ }
693
+
694
+ .gantt-list-row {
695
+ display: flex;
696
+ padding: 0.375rem 0.75rem;
697
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
698
+ cursor: pointer;
699
+ align-items: center;
700
+ transition: background 0.1s;
701
+ }
702
+
703
+ .gantt-list-row:hover {
704
+ background: hsl(var(--accent, 210 40% 96%) / 0.5);
705
+ }
706
+
707
+ .gantt-list-col-title { flex: 3; font-size: 0.75rem; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
708
+ .gantt-list-col-status { flex: 1; min-width: 80px; }
709
+ .gantt-list-col-category { flex: 1; min-width: 70px; }
710
+ .gantt-list-col-dates { flex: 1.5; font-size: 0.7rem; color: hsl(var(--muted-foreground, 215 16% 47%)); min-width: 120px; }
711
+ .gantt-list-col-progress { flex: 1; display: flex; align-items: center; gap: 0.375rem; font-size: 0.7rem; color: hsl(var(--muted-foreground, 215 16% 47%)); min-width: 100px; }
712
+
713
+ .gantt-list-progress-bar {
714
+ flex: 1;
715
+ height: 4px;
716
+ background: hsl(var(--border, 220 13% 91%));
717
+ border-radius: 2px;
718
+ overflow: hidden;
719
+ }
720
+
721
+ .gantt-list-progress-fill {
722
+ height: 100%;
723
+ border-radius: 2px;
724
+ transition: width 0.2s;
725
+ }
726
+
727
+ /* Detail modal */
728
+ .gantt-detail-overlay {
729
+ position: fixed;
730
+ top: 0;
731
+ left: 0;
732
+ right: 0;
733
+ bottom: 0;
734
+ background: rgba(0, 0, 0, 0.4);
735
+ z-index: 10000;
736
+ display: flex;
737
+ align-items: center;
738
+ justify-content: center;
739
+ }
740
+
741
+ .gantt-detail-modal {
742
+ background: hsl(var(--background, 0 0% 100%));
743
+ color: hsl(var(--foreground, 222 47% 11%));
744
+ border-radius: 8px;
745
+ width: 90%;
746
+ max-width: 480px;
747
+ max-height: 80vh;
748
+ overflow-y: auto;
749
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);
750
+ border: 1px solid hsl(var(--border, 220 13% 91%));
751
+ }
752
+
753
+ .gantt-detail-header {
754
+ display: flex;
755
+ align-items: center;
756
+ justify-content: space-between;
757
+ padding: 1rem 1.25rem;
758
+ border-bottom: 1px solid hsl(var(--border, 220 13% 91%));
759
+ }
760
+
761
+ .gantt-detail-header h3 {
762
+ margin: 0;
763
+ font-size: 0.9rem;
764
+ font-weight: 600;
765
+ flex: 1;
766
+ min-width: 0;
767
+ overflow: hidden;
768
+ text-overflow: ellipsis;
769
+ white-space: nowrap;
770
+ }
771
+
772
+ .gantt-detail-close {
773
+ width: 28px;
774
+ height: 28px;
775
+ border: none;
776
+ background: transparent;
777
+ color: hsl(var(--muted-foreground, 215 16% 47%));
778
+ cursor: pointer;
779
+ font-size: 1.2rem;
780
+ display: flex;
781
+ align-items: center;
782
+ justify-content: center;
783
+ border-radius: 4px;
784
+ flex-shrink: 0;
785
+ }
786
+
787
+ .gantt-detail-close:hover {
788
+ background: hsl(var(--accent, 210 40% 96%));
789
+ color: hsl(var(--foreground, 222 47% 11%));
790
+ }
791
+
792
+ .gantt-detail-body {
793
+ padding: 1rem 1.25rem;
794
+ display: flex;
795
+ flex-direction: column;
796
+ gap: 0.75rem;
797
+ }
798
+
799
+ .gantt-detail-row {
800
+ display: flex;
801
+ gap: 0.75rem;
802
+ }
803
+
804
+ .gantt-detail-row > .gantt-detail-field { flex: 1; }
805
+
806
+ .gantt-detail-field {
807
+ display: flex;
808
+ flex-direction: column;
809
+ gap: 0.25rem;
810
+ }
811
+
812
+ .gantt-detail-field label {
813
+ font-size: 0.65rem;
814
+ font-weight: 600;
815
+ text-transform: uppercase;
816
+ color: hsl(var(--muted-foreground, 215 16% 47%));
817
+ }
818
+
819
+ .gantt-detail-field p {
820
+ margin: 0;
821
+ font-size: 0.8rem;
822
+ color: hsl(var(--foreground, 222 47% 11%));
823
+ line-height: 1.4;
824
+ }
825
+
826
+ .gantt-detail-select,
827
+ .gantt-detail-input {
828
+ height: 32px;
829
+ padding: 0 0.5rem;
830
+ border: 1px solid hsl(var(--border, 220 13% 91%));
831
+ border-radius: 4px;
832
+ font-size: 0.8rem;
833
+ background: hsl(var(--background, 0 0% 100%));
834
+ color: hsl(var(--foreground, 222 47% 11%));
835
+ outline: none;
836
+ }
837
+
838
+ .gantt-detail-select:focus,
839
+ .gantt-detail-input:focus {
840
+ border-color: hsl(var(--primary, 222 47% 11%) / 0.5);
841
+ }
842
+
843
+ .gantt-detail-slider {
844
+ width: 100%;
845
+ height: 6px;
846
+ appearance: none;
847
+ -webkit-appearance: none;
848
+ background: hsl(var(--border, 220 13% 91%));
849
+ border-radius: 3px;
850
+ outline: none;
851
+ cursor: pointer;
852
+ }
853
+
854
+ .gantt-detail-slider::-webkit-slider-thumb {
855
+ appearance: none;
856
+ -webkit-appearance: none;
857
+ width: 16px;
858
+ height: 16px;
859
+ border-radius: 50%;
860
+ background: hsl(var(--primary, 222 47% 11%));
861
+ cursor: pointer;
862
+ }
863
+
864
+ @media (max-width: 768px) {
865
+ .gantt-info-header { width: 220px !important; padding: 0.5rem 0.5rem; }
866
+ .gantt-info-column { width: 220px !important; }
867
+ .gantt-info-row { min-height: 44px; padding: 0 0.5rem; }
868
+ .gantt-row-title { font-size: 0.8rem; }
869
+ .gantt-category-badge { display: none; }
870
+ .gantt-legend { gap: 0.75rem; padding: 0.5rem; }
871
+ }
872
+
873
+ @media (max-width: 480px) {
874
+ .gantt-info-header { width: 160px !important; }
875
+ .gantt-info-column { width: 160px !important; }
876
+ .gantt-status-badge { display: none; }
877
+ }