iris-gantt 1.0.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,2167 @@
1
+ :root {
2
+ /* SVAR Willow Theme Foundations */
3
+ --wx-gantt-primary: #37a9ef;
4
+ --wx-gantt-primary-selected: #d5eaf7;
5
+ --wx-gantt-success: #77d257;
6
+ --wx-gantt-warning: #fcba2e;
7
+ --wx-gantt-danger: #fe6158;
8
+ --wx-gantt-font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
9
+
10
+ /* Layout & Spacing */
11
+ --gantt-header-height: 84px;
12
+ /* 28px * 3 levels */
13
+ --gantt-row-height: 44px;
14
+ --gantt-scale-height: 28px;
15
+
16
+ /* Authentic SVAR Gantt Tokens */
17
+ --wx-gantt-border: 1px solid #e6e6e6;
18
+ --wx-gantt-border-color: #e6e6e6;
19
+ --wx-gantt-background: #ffffff;
20
+ --wx-gantt-background-alt: #f2f3f7;
21
+ --wx-gantt-background-hover: #eaedf5;
22
+ --wx-gantt-select-color: #eaedf5;
23
+
24
+ /* Gantt Task Specifics */
25
+ --wx-gantt-task-color: #37a9ef;
26
+ --wx-gantt-task-fill-color: rgba(0, 0, 0, 0.15);
27
+ /* Progress overlay */
28
+ --wx-gantt-project-color: #81C784;
29
+ --wx-gantt-milestone-color: #9c27b0;
30
+ --wx-gantt-milestone-border-radius: 2px;
31
+ --wx-gantt-bar-border-radius: 3px;
32
+ --wx-gantt-bar-shadow: 0 1px 2px rgba(44, 47, 60, 0.06), 0 3px 10px rgba(44, 47, 60, 0.12);
33
+
34
+ /* Typography */
35
+ --wx-gantt-font-color: #2c2f3c;
36
+ --wx-gantt-font-color-alt: #9fa1ae;
37
+ --wx-gantt-icon-color: #9fa1ae;
38
+
39
+ /* Legacy/Compatibility Fallbacks */
40
+ --font-body: var(--wx-gantt-font-family);
41
+ --color-primary: var(--wx-gantt-task-color);
42
+ --color-text-main: var(--wx-gantt-font-color);
43
+ }
44
+
45
+
46
+ /* Page Wrapper - Critical for scrolling and layout */
47
+ .gantt-page-wrapper {
48
+ display: flex;
49
+ flex-direction: column;
50
+ height: calc(100vh - 40px);
51
+ /* Leave some space for storybook padding */
52
+ width: 100%;
53
+ }
54
+
55
+ .gantt-container {
56
+ display: flex;
57
+ flex-direction: column;
58
+ flex: 1;
59
+ min-height: 0;
60
+ min-width: 0;
61
+ max-width: 100%;
62
+ /* Critical: Prevent container from expanding beyond viewport */
63
+ overflow: hidden;
64
+ background-color: var(--wx-gantt-background);
65
+ border: var(--wx-gantt-border);
66
+ margin: 0;
67
+ border-radius: var(--wx-gantt-bar-border-radius);
68
+ }
69
+
70
+ .gantt-container.theme-dark {
71
+ background-color: #1e1e1e;
72
+ border-color: #333;
73
+ color: #e0e0e0;
74
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
75
+ }
76
+
77
+
78
+
79
+
80
+
81
+ .gantt-layout {
82
+ display: flex;
83
+ flex: 1;
84
+ overflow-x: auto;
85
+ /* Individual scroll container */
86
+ overflow-y: auto;
87
+ position: relative;
88
+ background-color: #fafafa;
89
+ scroll-behavior: smooth;
90
+ min-height: 0;
91
+ min-width: 0;
92
+ width: 100%;
93
+ /* Fill available space */
94
+ }
95
+
96
+ /* Modern Scrollbars */
97
+ .gantt-layout::-webkit-scrollbar {
98
+ width: 8px;
99
+ height: 8px;
100
+ }
101
+
102
+ .gantt-layout::-webkit-scrollbar-track {
103
+ background: transparent;
104
+ }
105
+
106
+ .gantt-layout::-webkit-scrollbar-thumb {
107
+ background: #cbd5e1;
108
+ border-radius: 10px;
109
+ border: 2px solid #ffffff;
110
+ }
111
+
112
+ .gantt-layout::-webkit-scrollbar-thumb:hover {
113
+ background: #94a3b8;
114
+ }
115
+
116
+ .theme-dark .gantt-layout {
117
+ background-color: #1a1a1a;
118
+ }
119
+
120
+ /* Grid Styles - Exact Match to Image */
121
+ .gantt-grid {
122
+ display: flex;
123
+ flex-direction: column;
124
+ width: 720px;
125
+ min-width: 720px;
126
+ max-width: 720px;
127
+ border-right: var(--wx-gantt-border);
128
+ background-color: #ffffff;
129
+ flex-shrink: 0;
130
+ position: sticky;
131
+ left: 0;
132
+ z-index: 100 !important;
133
+ box-shadow: 2px 0 5px rgba(0, 0, 0, 0.05);
134
+ height: 100%;
135
+ align-self: flex-start;
136
+ }
137
+
138
+ .theme-dark .gantt-grid {
139
+ background-color: #252525;
140
+ border-right-color: #333;
141
+ box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
142
+ }
143
+
144
+ .gantt-grid-header {
145
+ position: sticky;
146
+ top: 0;
147
+ z-index: 110 !important;
148
+ height: var(--gantt-header-height);
149
+ display: flex;
150
+ border-bottom: var(--wx-gantt-border);
151
+ background-color: #ffffff;
152
+ box-shadow: none;
153
+ }
154
+
155
+ .theme-dark .gantt-grid-header {
156
+ background-color: #2d2d2d;
157
+ border-bottom-color: #444;
158
+ }
159
+
160
+ .gantt-grid-header-cell {
161
+ height: 100%;
162
+ padding: 0 16px;
163
+ font-weight: 600;
164
+ font-size: 14px;
165
+ font-family: var(--font-body);
166
+ border-right: var(--wx-gantt-border);
167
+ background-color: var(--wx-gantt-background);
168
+ /* Pure white per visual spec */
169
+ color: var(--wx-gantt-font-color);
170
+ white-space: nowrap;
171
+ overflow: hidden;
172
+ text-overflow: ellipsis;
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: flex-start;
176
+ flex-shrink: 0;
177
+ text-transform: none;
178
+ letter-spacing: 0;
179
+ }
180
+
181
+ .gantt-grid-header-cell:last-child {
182
+ border-right: none;
183
+ }
184
+
185
+ .theme-dark .gantt-grid-header-cell {
186
+ border-right-color: #333;
187
+ background-color: #2d2d2d;
188
+ color: #a0a0a0;
189
+ }
190
+
191
+ .gantt-grid-body {
192
+ flex: 1;
193
+ }
194
+
195
+ .gantt-grid-row {
196
+ display: flex;
197
+ border-bottom: var(--wx-gantt-border);
198
+ cursor: pointer;
199
+ transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
200
+ background-color: var(--wx-gantt-background);
201
+ height: var(--gantt-row-height);
202
+ min-height: var(--gantt-row-height);
203
+ max-height: var(--gantt-row-height);
204
+ }
205
+
206
+ .gantt-grid-row:hover {
207
+ background-color: #f8fafc;
208
+ border-left: 2px solid var(--color-primary);
209
+ }
210
+
211
+ .theme-dark .gantt-grid-row {
212
+ background-color: #252525;
213
+ border-bottom-color: #333;
214
+ }
215
+
216
+ .theme-dark .gantt-grid-row:hover {
217
+ background-color: #2d2d2d;
218
+ }
219
+
220
+ .gantt-grid-row.dragging-row,
221
+ .gantt-grid-row.descendant-dragging-row {
222
+ opacity: 0.3;
223
+ background-color: #f8f9fa;
224
+ pointer-events: none;
225
+ }
226
+
227
+ .gantt-ghost-descendant-count {
228
+ margin-left: 8px;
229
+ background: #2196F3;
230
+ color: white;
231
+ padding: 2px 6px;
232
+ border-radius: 10px;
233
+ font-size: 11px;
234
+ font-weight: normal;
235
+ }
236
+
237
+ .gantt-grid-row.ghost-row {
238
+ transition: none !important;
239
+ }
240
+
241
+ body.gantt-dragging {
242
+ user-select: none !important;
243
+ cursor: grabbing !important;
244
+ }
245
+
246
+ .gantt-drop-indicator {
247
+ position: absolute;
248
+ left: 0;
249
+ right: 0;
250
+ height: 2px;
251
+ background-color: #2196F3;
252
+ z-index: 10;
253
+ pointer-events: none;
254
+ }
255
+
256
+ .gantt-drop-indicator.above {
257
+ top: -1px;
258
+ }
259
+
260
+ .gantt-drop-indicator.below {
261
+ bottom: -1px;
262
+ }
263
+
264
+ .gantt-drop-indicator.inside {
265
+ top: 0;
266
+ bottom: 0;
267
+ height: auto;
268
+ background-color: rgba(33, 150, 243, 0.1);
269
+ border: 2px solid #2196F3;
270
+ }
271
+
272
+ .gantt-grid-body {
273
+ position: relative;
274
+ }
275
+
276
+ .gantt-grid-row.selected {
277
+ background-color: #eff6ff;
278
+ border-left: 3px solid var(--color-primary);
279
+ }
280
+
281
+ .theme-dark .gantt-grid-row.selected {
282
+ background-color: #2b3a4a;
283
+ }
284
+
285
+ .gantt-grid-cell {
286
+ padding: 0 12px;
287
+ font-size: 14px;
288
+ border-right: var(--wx-gantt-border);
289
+ display: flex;
290
+ align-items: center;
291
+ overflow: hidden;
292
+ font-family: var(--font-body);
293
+ color: var(--wx-gantt-font-color);
294
+ white-space: nowrap;
295
+ text-overflow: ellipsis;
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ .gantt-grid-cell:last-child {
300
+ border-right: none;
301
+ }
302
+
303
+ .theme-dark .gantt-grid-cell {
304
+ border-right-color: #2d2d2d;
305
+ color: #dee2e6;
306
+ }
307
+
308
+ .gantt-grid-cell-text {
309
+ display: flex;
310
+ align-items: center;
311
+ gap: 8px;
312
+ white-space: nowrap;
313
+ overflow: hidden;
314
+ width: 100%;
315
+ color: #1a1f23;
316
+ font-weight: 400;
317
+ }
318
+
319
+ .gantt-row-drag-handle {
320
+ cursor: grab;
321
+ color: #adb5bd;
322
+ font-size: 14px;
323
+ line-height: 1;
324
+ padding: 0 4px;
325
+ user-select: none;
326
+ opacity: 0;
327
+ transition: opacity 0.2s;
328
+ }
329
+
330
+ .gantt-grid-row:hover .gantt-row-drag-handle {
331
+ opacity: 1;
332
+ }
333
+
334
+ .gantt-dragging .gantt-row-drag-handle {
335
+ cursor: grabbing !important;
336
+ z-index: 100;
337
+ }
338
+
339
+ .gantt-tree-icon {
340
+ width: 16px;
341
+ height: 16px;
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ font-size: 10px;
346
+ color: #666;
347
+ cursor: pointer;
348
+ user-select: none;
349
+ background-color: transparent;
350
+ border: none;
351
+ }
352
+
353
+ .gantt-tree-icon:hover {
354
+ background-color: #efefef;
355
+ }
356
+
357
+ /* Progress Cell */
358
+ .gantt-progress-cell {
359
+ display: flex;
360
+ align-items: center;
361
+ gap: 8px;
362
+ width: 100%;
363
+ }
364
+
365
+ .gantt-progress-bar-bg {
366
+ flex: 1;
367
+ height: 16px;
368
+ background-color: #e0e0e0;
369
+ border-radius: 8px;
370
+ overflow: hidden;
371
+ position: relative;
372
+ }
373
+
374
+ .gantt-progress-bar-fill {
375
+ height: 100%;
376
+ background: linear-gradient(90deg, #81C784, #A5D6A7);
377
+ transition: width 0.3s;
378
+ }
379
+
380
+ .gantt-progress-text {
381
+ font-size: 11px;
382
+ color: #666;
383
+ min-width: 35px;
384
+ text-align: right;
385
+ }
386
+
387
+ /* Timeline Styles */
388
+ .gantt-timeline-container {
389
+ display: flex;
390
+ flex-direction: column;
391
+ background-color: #ffffff;
392
+ flex-shrink: 0;
393
+ min-width: 0;
394
+ overflow: visible;
395
+ }
396
+
397
+ .theme-dark .gantt-timeline-container {
398
+ background-color: #1e1e1e;
399
+ }
400
+
401
+ .gantt-timeline-header {
402
+ position: sticky;
403
+ top: 0;
404
+ z-index: 30;
405
+ background-color: var(--wx-gantt-background);
406
+ border-bottom: var(--wx-gantt-border);
407
+ height: var(--gantt-header-height);
408
+ box-shadow: none;
409
+ overflow: visible;
410
+ }
411
+
412
+ .gantt-timeline-scale {
413
+ display: flex;
414
+ border-bottom: var(--wx-gantt-border);
415
+ align-items: center;
416
+ min-height: var(--gantt-scale-height);
417
+ width: 100%;
418
+ }
419
+
420
+ .theme-dark .gantt-timeline-header {
421
+ background-color: #1e1e1e;
422
+ border-bottom-color: #444;
423
+ }
424
+
425
+ .gantt-timeline-scale-month {
426
+ height: var(--gantt-scale-height);
427
+ background-color: var(--wx-gantt-background);
428
+ font-weight: 600;
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ /* Center Month Year label in its span */
433
+ border-bottom: var(--wx-gantt-border);
434
+ font-size: 13px;
435
+ color: var(--wx-gantt-font-color);
436
+ text-transform: none;
437
+ font-family: var(--font-body);
438
+ }
439
+
440
+ .theme-dark .gantt-timeline-scale-month {
441
+ background-color: #2a2a2a;
442
+ color: #adb5bd;
443
+ border-bottom-color: #333;
444
+ }
445
+
446
+ .gantt-timeline-scale-range {
447
+ height: var(--gantt-scale-height);
448
+ background-color: var(--wx-gantt-background);
449
+ font-size: 13px;
450
+ font-weight: 600;
451
+ color: var(--wx-gantt-font-color);
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ /* Center Range label in its span */
456
+ border-bottom: var(--wx-gantt-border);
457
+ text-transform: none;
458
+ letter-spacing: 0;
459
+ font-family: var(--font-body);
460
+ }
461
+
462
+ .theme-dark .gantt-timeline-scale-range {
463
+ background-color: #1e1e1e;
464
+ color: #888;
465
+ border-bottom-color: #333;
466
+ }
467
+
468
+ .gantt-timeline-scale-day {
469
+ height: var(--gantt-scale-height);
470
+ background-color: var(--wx-gantt-background);
471
+ border-bottom: none;
472
+ display: flex;
473
+ align-items: center;
474
+ justify-content: center;
475
+ font-size: 13px;
476
+ color: var(--wx-gantt-font-color);
477
+ font-weight: 400;
478
+ font-family: var(--font-body);
479
+ }
480
+
481
+ .theme-dark .gantt-timeline-scale-day {
482
+ background-color: #1e1e1e;
483
+ color: #dee2e6;
484
+ }
485
+
486
+ .gantt-timeline-cell {
487
+ flex-shrink: 0;
488
+ height: 100%;
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ border-right: var(--wx-gantt-border);
493
+ font-size: 13px;
494
+ white-space: nowrap;
495
+ padding: 0 4px;
496
+ color: var(--wx-gantt-font-color);
497
+ font-family: var(--font-body);
498
+ min-width: 0;
499
+ overflow: hidden;
500
+ text-overflow: ellipsis;
501
+ }
502
+
503
+ .theme-dark .gantt-timeline-cell {
504
+ border-right-color: #444;
505
+ }
506
+
507
+ .gantt-timeline-cell.weekend {
508
+ background-color: #f8fafc;
509
+ }
510
+
511
+ .theme-dark .gantt-timeline-cell.weekend {
512
+ background-color: #2a2a2a;
513
+ }
514
+
515
+ .gantt-timeline-cell.holiday {
516
+ background-color: #fff8f0;
517
+ }
518
+
519
+ .theme-dark .gantt-timeline-cell.holiday {
520
+ background-color: #3a2a1a;
521
+ }
522
+
523
+ /* Timeline Body */
524
+ .gantt-timeline-body {
525
+ position: relative;
526
+ min-height: 0;
527
+ }
528
+
529
+ .gantt-timeline-grid {
530
+ display: flex;
531
+ position: absolute;
532
+ top: 0;
533
+ left: 0;
534
+ bottom: 0;
535
+ pointer-events: none;
536
+ z-index: 0;
537
+ }
538
+
539
+ .gantt-timeline-grid-column {
540
+ flex-shrink: 0;
541
+ border-right: 1px solid #e5e7eb;
542
+ }
543
+
544
+ .theme-dark .gantt-timeline-grid-column {
545
+ border-right-color: #2d2d2d;
546
+ }
547
+
548
+ .gantt-timeline-grid-column.weekend {
549
+ background-color: #f8fafc;
550
+ }
551
+
552
+ .theme-dark .gantt-timeline-grid-column.weekend {
553
+ background-color: #252525;
554
+ }
555
+
556
+ .gantt-timeline-grid-column.holiday {
557
+ background-color: #fff8f0;
558
+ }
559
+
560
+ .theme-dark .gantt-timeline-grid-column.holiday {
561
+ background-color: #332a1a;
562
+ }
563
+
564
+ .gantt-timeline-tasks {
565
+ position: relative;
566
+ z-index: 1;
567
+ display: flex;
568
+ flex-direction: column;
569
+ }
570
+
571
+ /* Dependency Links */
572
+ .gantt-links-layer {
573
+ position: absolute;
574
+ top: 0;
575
+ left: 0;
576
+ width: 100%;
577
+ height: 100%;
578
+ pointer-events: none;
579
+ z-index: 1;
580
+ overflow: visible;
581
+ }
582
+
583
+ .gantt-link {
584
+ pointer-events: all;
585
+ cursor: pointer;
586
+ transition: all 0.2s ease;
587
+ }
588
+
589
+ .gantt-link-line {
590
+ transition: all 0.2s ease;
591
+ stroke: #cbd5e0;
592
+ stroke-width: 1.5;
593
+ }
594
+
595
+ .theme-dark .gantt-link-line {
596
+ stroke: #4a5568;
597
+ }
598
+
599
+ .gantt-link:hover .gantt-link-line {
600
+ stroke-width: 2;
601
+ stroke: #a0aec0;
602
+ }
603
+
604
+ .theme-dark .gantt-link:hover .gantt-link-line {
605
+ stroke: #90CAF9;
606
+ }
607
+
608
+ .gantt-link-arrow {
609
+ transition: all 0.2s ease;
610
+ fill: #cbd5e0;
611
+ }
612
+
613
+ .theme-dark .gantt-link-arrow {
614
+ fill: #64B5F6;
615
+ }
616
+
617
+ .gantt-link:hover .gantt-link-arrow {
618
+ fill: #2196F3;
619
+ filter: drop-shadow(0 2px 4px rgba(33, 150, 243, 0.4));
620
+ }
621
+
622
+ .theme-dark .gantt-link:hover .gantt-link-arrow {
623
+ fill: #90CAF9;
624
+ }
625
+
626
+ .gantt-timeline-row {
627
+ position: relative;
628
+ width: 100%;
629
+ border-bottom: 1px solid #e5e7eb;
630
+ height: var(--gantt-row-height);
631
+ min-height: var(--gantt-row-height);
632
+ max-height: var(--gantt-row-height);
633
+ flex-shrink: 0;
634
+ }
635
+
636
+ .theme-dark .gantt-timeline-row {
637
+ border-bottom-color: #333;
638
+ }
639
+
640
+ /* Task Bar Styles */
641
+ .gantt-task-bar {
642
+ position: absolute;
643
+ height: 28px;
644
+ /* Balanced height */
645
+ top: 50%;
646
+ transform: translateY(-50%);
647
+ border-radius: var(--wx-gantt-bar-border-radius);
648
+ cursor: move;
649
+ transition: box-shadow 0.2s, transform 0.1s;
650
+ display: flex;
651
+ align-items: center;
652
+ overflow: visible;
653
+ /* Crucial for milestones */
654
+ border: none;
655
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
656
+ }
657
+
658
+ .gantt-task-bar:hover {
659
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
660
+ transform: translateY(-50%) scale(1.02);
661
+ z-index: 100 !important;
662
+ filter: brightness(1.05);
663
+ }
664
+
665
+ .gantt-task-bar.selected {
666
+ box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--color-primary);
667
+ z-index: 10;
668
+ border: 2px solid var(--color-primary);
669
+ }
670
+
671
+ .gantt-task-bar.dragging {
672
+ opacity: 0.85;
673
+ cursor: grabbing;
674
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
675
+ transition: none;
676
+ /* Instant during dragging */
677
+ }
678
+
679
+ .gantt-task-bar.project {
680
+ height: 28px;
681
+ border-radius: var(--wx-gantt-bar-border-radius);
682
+ font-weight: 600;
683
+ background-color: var(--wx-gantt-project-color) !important;
684
+ }
685
+
686
+ .gantt-task-bar.milestone {
687
+ width: 0 !important;
688
+ /* Base width is 0 for 0-duration */
689
+ height: 0 !important;
690
+ overflow: visible;
691
+ border: none;
692
+ background: none !important;
693
+ box-shadow: none;
694
+ }
695
+
696
+ .gantt-milestone-diamond {
697
+ position: absolute;
698
+ top: 50%;
699
+ left: 50%;
700
+ width: 14px;
701
+ height: 14px;
702
+ background-color: var(--wx-gantt-milestone-color);
703
+ transform: translate(-50%, -50%) rotate(45deg);
704
+ border-radius: var(--wx-gantt-milestone-border-radius);
705
+ box-shadow: var(--wx-gantt-bar-shadow);
706
+ z-index: 2;
707
+ cursor: pointer;
708
+ }
709
+
710
+ .gantt-milestone-text {
711
+ position: absolute;
712
+ left: 20px;
713
+ top: 50%;
714
+ transform: translateY(-50%);
715
+ white-space: nowrap;
716
+ color: var(--wx-gantt-font-color);
717
+ font-size: 13px;
718
+ font-weight: 400;
719
+ pointer-events: none;
720
+ font-family: var(--font-body);
721
+ }
722
+
723
+ .gantt-task-progress {
724
+ position: absolute;
725
+ left: 0;
726
+ top: 0;
727
+ height: 100%;
728
+ background-color: var(--wx-gantt-task-fill-color);
729
+ pointer-events: none;
730
+ z-index: 1;
731
+ border-radius: inherit;
732
+ }
733
+
734
+ .gantt-task-content {
735
+ position: relative;
736
+ z-index: 2;
737
+ padding: 0 12px;
738
+ color: white;
739
+ font-size: 12px;
740
+ font-weight: 600;
741
+ white-space: nowrap;
742
+ overflow: hidden;
743
+ /* Tasks still clip text */
744
+ text-overflow: ellipsis;
745
+ flex: 1;
746
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
747
+ font-family: var(--font-body);
748
+ height: 100%;
749
+ display: flex;
750
+ align-items: center;
751
+ }
752
+
753
+ .milestone .gantt-task-content {
754
+ overflow: visible;
755
+ /* Milestones must not clip their children */
756
+ }
757
+
758
+ .gantt-task-text {
759
+ display: block;
760
+ overflow: hidden;
761
+ text-overflow: ellipsis;
762
+ }
763
+
764
+ /* Resize Handles */
765
+ .gantt-task-resize-handle {
766
+ position: absolute;
767
+ top: 0;
768
+ width: 8px;
769
+ height: 100%;
770
+ cursor: ew-resize;
771
+ z-index: 3;
772
+ }
773
+
774
+ .gantt-task-resize-left {
775
+ left: 0;
776
+ }
777
+
778
+ .gantt-task-resize-right {
779
+ right: 0;
780
+ }
781
+
782
+ .gantt-task-resize-handle:hover {
783
+ background-color: rgba(255, 255, 255, 0.3);
784
+ }
785
+
786
+ /* Toolbar */
787
+ .gantt-toolbar-wrapper {
788
+ background-color: #f8f9fa;
789
+ border-bottom: 1px solid #dfe3e6;
790
+ padding: 4px 0;
791
+ }
792
+
793
+ .gantt-toolbar {
794
+ padding: 8px 20px;
795
+ background-color: transparent;
796
+ display: flex;
797
+ justify-content: space-between;
798
+ align-items: center;
799
+ z-index: 100;
800
+ }
801
+
802
+ .theme-dark .gantt-toolbar {
803
+ background-color: #252525;
804
+ border-bottom-color: #333;
805
+ }
806
+
807
+ .gantt-toolbar-left,
808
+ .gantt-toolbar-right {
809
+ display: flex;
810
+ align-items: center;
811
+ }
812
+
813
+ /* Tooltip Styles */
814
+ .gantt-tooltip {
815
+ padding: 8px 12px;
816
+ max-width: 250px;
817
+ }
818
+
819
+ .gantt-tooltip-title {
820
+ font-weight: 600;
821
+ font-size: 14px;
822
+ margin-bottom: 4px;
823
+ color: #fff;
824
+ }
825
+
826
+ .gantt-tooltip-dates {
827
+ font-size: 12px;
828
+ color: #ced4da;
829
+ margin-bottom: 4px;
830
+ }
831
+
832
+ .gantt-tooltip-progress,
833
+ .gantt-tooltip-owner {
834
+ font-size: 12px;
835
+ color: #fff;
836
+ }
837
+
838
+ /* Split Tasks */
839
+ .gantt-task-group {
840
+ position: absolute;
841
+ top: 0;
842
+ left: 0;
843
+ width: 100%;
844
+ height: 100%;
845
+ pointer-events: none;
846
+ }
847
+
848
+ .gantt-task-bar.segment {
849
+ pointer-events: all;
850
+ background: repeating-linear-gradient(45deg,
851
+ transparent,
852
+ transparent 10px,
853
+ rgba(255, 255, 255, 0.1) 10px,
854
+ rgba(255, 255, 255, 0.1) 20px);
855
+ border: 1px dashed rgba(255, 255, 255, 0.4);
856
+ }
857
+
858
+ .gantt-task-bar.segment:hover {
859
+ transform: translateY(-50%) scale(1.05);
860
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
861
+ }
862
+
863
+ /* Modern Scrollbar Styling */
864
+ .gantt-layout::-webkit-scrollbar {
865
+ width: 8px;
866
+ height: 8px;
867
+ }
868
+
869
+ .gantt-layout::-webkit-scrollbar-track {
870
+ background: transparent;
871
+ }
872
+
873
+ .gantt-layout::-webkit-scrollbar-thumb {
874
+ background: #cbd5e1;
875
+ border-radius: 10px;
876
+ border: 2px solid #ffffff;
877
+ }
878
+
879
+ .gantt-layout::-webkit-scrollbar-thumb:hover {
880
+ background: #94a3b8;
881
+ }
882
+
883
+ .theme-dark .gantt-layout::-webkit-scrollbar-track {
884
+ background: transparent;
885
+ border-color: transparent;
886
+ }
887
+
888
+ .theme-dark .gantt-layout::-webkit-scrollbar-thumb {
889
+ background: #4a5568;
890
+ border-color: #1a1a1a;
891
+ }
892
+
893
+ .theme-dark .gantt-layout::-webkit-scrollbar-thumb:hover {
894
+ background: #718096;
895
+ }
896
+
897
+
898
+
899
+ /* Modal Styles */
900
+ .gantt-modal-overlay {
901
+ position: fixed;
902
+ top: 0;
903
+ left: 0;
904
+ right: 0;
905
+ bottom: 0;
906
+ background-color: rgba(0, 0, 0, 0.5);
907
+ display: flex;
908
+ align-items: center;
909
+ justify-content: center;
910
+ z-index: 1000;
911
+ }
912
+
913
+ .gantt-modal {
914
+ background-color: white;
915
+ border-radius: 8px;
916
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
917
+ max-width: 600px;
918
+ width: 90%;
919
+ max-height: 90vh;
920
+ overflow: hidden;
921
+ display: flex;
922
+ flex-direction: column;
923
+ }
924
+
925
+ .theme-dark .gantt-modal {
926
+ background-color: #2d2d2d;
927
+ color: #ffffff;
928
+ }
929
+
930
+ .gantt-modal-header {
931
+ padding: 20px;
932
+ border-bottom: 1px solid #e0e0e0;
933
+ display: flex;
934
+ justify-content: space-between;
935
+ align-items: center;
936
+ }
937
+
938
+ .theme-dark .gantt-modal-header {
939
+ border-bottom-color: #444;
940
+ }
941
+
942
+ .gantt-modal-header h3 {
943
+ margin: 0;
944
+ font-size: 20px;
945
+ font-weight: 600;
946
+ }
947
+
948
+ .gantt-modal-close {
949
+ background: none;
950
+ border: none;
951
+ font-size: 24px;
952
+ cursor: pointer;
953
+ color: #666;
954
+ padding: 0;
955
+ width: 32px;
956
+ height: 32px;
957
+ display: flex;
958
+ align-items: center;
959
+ justify-content: center;
960
+ border-radius: 4px;
961
+ transition: all 0.2s;
962
+ }
963
+
964
+ .gantt-modal-close:hover {
965
+ background-color: #f0f0f0;
966
+ color: #333;
967
+ }
968
+
969
+ .theme-dark .gantt-modal-close:hover {
970
+ background-color: #3a3a3a;
971
+ color: #fff;
972
+ }
973
+
974
+ .gantt-modal-body {
975
+ padding: 20px;
976
+ overflow-y: auto;
977
+ flex: 1;
978
+ }
979
+
980
+ .gantt-form-row {
981
+ margin-bottom: 16px;
982
+ }
983
+
984
+ .gantt-form-row label {
985
+ display: block;
986
+ margin-bottom: 6px;
987
+ font-weight: 500;
988
+ font-size: 14px;
989
+ color: #333;
990
+ }
991
+
992
+ .theme-dark .gantt-form-row label {
993
+ color: #ddd;
994
+ }
995
+
996
+ .gantt-form-row input[type="text"],
997
+ .gantt-form-row input[type="date"],
998
+ .gantt-form-row input[type="number"],
999
+ .gantt-form-row select,
1000
+ .gantt-form-row textarea {
1001
+ width: 100%;
1002
+ padding: 10px 12px;
1003
+ border: 1px solid #d1d5da;
1004
+ border-radius: 6px;
1005
+ font-size: 14px;
1006
+ font-family: inherit;
1007
+ transition: border-color 0.2s;
1008
+ }
1009
+
1010
+ .theme-dark .gantt-form-row input,
1011
+ .theme-dark .gantt-form-row select,
1012
+ .theme-dark .gantt-form-row textarea {
1013
+ background-color: #3a3a3a;
1014
+ border-color: #555;
1015
+ color: #fff;
1016
+ }
1017
+
1018
+ .gantt-form-row input:focus,
1019
+ .gantt-form-row select:focus,
1020
+ .gantt-form-row textarea:focus {
1021
+ outline: none;
1022
+ border-color: #2196F3;
1023
+ }
1024
+
1025
+ .gantt-form-row textarea {
1026
+ resize: vertical;
1027
+ min-height: 80px;
1028
+ }
1029
+
1030
+ .gantt-form-row-group {
1031
+ display: grid;
1032
+ grid-template-columns: 1fr 1fr;
1033
+ gap: 16px;
1034
+ margin-bottom: 16px;
1035
+ }
1036
+
1037
+ .gantt-progress-value {
1038
+ margin-left: 10px;
1039
+ font-weight: 600;
1040
+ color: #2196F3;
1041
+ }
1042
+
1043
+ .gantt-modal-footer {
1044
+ padding: 16px 20px;
1045
+ border-top: 1px solid #e0e0e0;
1046
+ display: flex;
1047
+ justify-content: space-between;
1048
+ align-items: center;
1049
+ }
1050
+
1051
+ .theme-dark .gantt-modal-footer {
1052
+ border-top-color: #444;
1053
+ }
1054
+
1055
+ .gantt-modal-footer-right {
1056
+ display: flex;
1057
+ gap: 10px;
1058
+ }
1059
+
1060
+ .gantt-btn {
1061
+ padding: 10px 20px;
1062
+ border: none;
1063
+ border-radius: 6px;
1064
+ font-size: 14px;
1065
+ font-weight: 500;
1066
+ cursor: pointer;
1067
+ transition: all 0.2s;
1068
+ }
1069
+
1070
+ .gantt-btn-primary {
1071
+ background-color: #2196F3;
1072
+ color: white;
1073
+ }
1074
+
1075
+ .gantt-btn-primary:hover {
1076
+ background-color: #1976D2;
1077
+ box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);
1078
+ }
1079
+
1080
+ .gantt-btn-secondary {
1081
+ background-color: #f0f0f0;
1082
+ color: #333;
1083
+ }
1084
+
1085
+ .theme-dark .gantt-btn-secondary {
1086
+ background-color: #3a3a3a;
1087
+ color: #fff;
1088
+ }
1089
+
1090
+ .gantt-btn-secondary:hover {
1091
+ background-color: #e0e0e0;
1092
+ }
1093
+
1094
+ .theme-dark .gantt-btn-secondary:hover {
1095
+ background-color: #4a4a4a;
1096
+ }
1097
+
1098
+ .gantt-btn-danger {
1099
+ background-color: #f44336;
1100
+ color: white;
1101
+ }
1102
+
1103
+ .gantt-btn-danger:hover {
1104
+ background-color: #d32f2f;
1105
+ }
1106
+
1107
+ /* Filter and Search Styles - Ant Design with Right-aligned Filters */
1108
+ .gantt-filter-container {
1109
+ background-color: #f8f9fa;
1110
+ border-bottom: 1px solid #e0e0e0;
1111
+ }
1112
+
1113
+ .theme-dark .gantt-filter-container {
1114
+ background-color: #2a2a2a;
1115
+ border-bottom-color: #444;
1116
+ }
1117
+
1118
+ .gantt-filter-bar {
1119
+ display: flex;
1120
+ justify-content: space-between;
1121
+ align-items: center;
1122
+ padding: 12px 16px;
1123
+ gap: 16px;
1124
+ }
1125
+
1126
+ .gantt-filter-left {
1127
+ display: flex;
1128
+ align-items: center;
1129
+ gap: 10px;
1130
+ }
1131
+
1132
+ .gantt-filter-right {
1133
+ display: flex;
1134
+ align-items: center;
1135
+ gap: 10px;
1136
+ margin-left: auto;
1137
+ }
1138
+
1139
+ /* Ant Design component overrides for consistent styling */
1140
+ .gantt-search-antd .ant-input-affix-wrapper {
1141
+ border-radius: 6px;
1142
+ font-family: var(--font-body);
1143
+ }
1144
+
1145
+ .gantt-filter-select-antd .ant-select-selector {
1146
+ border-radius: 6px !important;
1147
+ font-family: var(--font-body);
1148
+ }
1149
+
1150
+ .gantt-filter-clear-antd {
1151
+ border-radius: 6px;
1152
+ font-family: var(--font-body);
1153
+ font-weight: 500;
1154
+ }
1155
+
1156
+ /* Dark theme support for Ant Design components */
1157
+ .theme-dark .gantt-search-antd .ant-input-affix-wrapper,
1158
+ .theme-dark .gantt-filter-select-antd .ant-select-selector {
1159
+ background-color: #3a3a3a;
1160
+ border-color: #555;
1161
+ color: #fff;
1162
+ }
1163
+
1164
+ .theme-dark .gantt-search-antd .ant-input,
1165
+ .theme-dark .gantt-filter-select-antd .ant-select-selection-item {
1166
+ color: #fff;
1167
+ }
1168
+
1169
+ .theme-dark .gantt-search-antd .ant-input-prefix,
1170
+ .theme-dark .gantt-filter-select-antd .ant-select-arrow {
1171
+ color: #aaa;
1172
+ }
1173
+
1174
+ /* Critical Path Styles */
1175
+ .gantt-task-bar.critical {
1176
+ background-color: #f44336 !important;
1177
+ box-shadow: 0 0 0 2px rgba(244, 67, 54, 0.3);
1178
+ }
1179
+
1180
+ .gantt-task-bar.critical .gantt-task-progress {
1181
+ background-color: rgba(255, 255, 255, 0.4);
1182
+ }
1183
+
1184
+ /* Baseline Styles */
1185
+ .gantt-baseline-container {
1186
+ position: relative;
1187
+ width: 100%;
1188
+ height: 100%;
1189
+ }
1190
+
1191
+ .gantt-baseline-bar {
1192
+ position: absolute;
1193
+ height: 8px;
1194
+ background-color: #bdbdbd;
1195
+ top: 50%;
1196
+ transform: translateY(calc(-50% + 20px));
1197
+ border-radius: 4px;
1198
+ z-index: 0;
1199
+ pointer-events: none;
1200
+ }
1201
+
1202
+ .gantt-variance-indicator {
1203
+ position: absolute;
1204
+ height: 2px;
1205
+ bottom: 0;
1206
+ opacity: 0.5;
1207
+ }
1208
+
1209
+ .gantt-variance-indicator.delayed {
1210
+ background-color: #f44336;
1211
+ }
1212
+
1213
+ .gantt-variance-indicator.ahead {
1214
+ background-color: #4CAF50;
1215
+ }
1216
+
1217
+ .gantt-variance-label {
1218
+ position: absolute;
1219
+ top: -18px;
1220
+ right: 0;
1221
+ font-size: 11px;
1222
+ font-weight: 600;
1223
+ padding: 2px 6px;
1224
+ border-radius: 3px;
1225
+ background-color: rgba(255, 255, 255, 0.9);
1226
+ }
1227
+
1228
+ /* Toolbar enhancements */
1229
+ .gantt-toolbar {
1230
+ display: flex;
1231
+ justify-content: space-between;
1232
+ align-items: center;
1233
+ }
1234
+
1235
+ .gantt-toolbar-left,
1236
+ .gantt-toolbar-right {
1237
+ display: flex;
1238
+ gap: 8px;
1239
+ align-items: center;
1240
+ }
1241
+
1242
+ .gantt-toolbar button.active {
1243
+ background-color: #1976D2;
1244
+ }
1245
+
1246
+ .gantt-milestone-marker {
1247
+ width: 14px;
1248
+ height: 14px;
1249
+ background-color: #9C27B0;
1250
+ transform: rotate(45deg);
1251
+ margin: 0 auto;
1252
+ }
1253
+
1254
+ .gantt-milestone-text {
1255
+ position: absolute;
1256
+ left: 100%;
1257
+ top: 50%;
1258
+ transform: translateY(-50%);
1259
+ margin-left: 10px;
1260
+ white-space: nowrap;
1261
+ font-size: 11px;
1262
+ color: #555;
1263
+ font-family: var(--font-body);
1264
+ pointer-events: none;
1265
+ }
1266
+
1267
+ .theme-dark .gantt-milestone-text {
1268
+ color: #ccc;
1269
+ }
1270
+
1271
+ .gantt-toolbar-separator {
1272
+ width: 1px;
1273
+ height: 24px;
1274
+ background-color: #ddd;
1275
+ margin: 0 4px;
1276
+ }
1277
+
1278
+ .theme-dark .gantt-toolbar-separator {
1279
+ background-color: #555;
1280
+ }
1281
+
1282
+ /* Dependency Editor */
1283
+ .gantt-dependency-editor-overlay {
1284
+ position: fixed;
1285
+ top: 0;
1286
+ left: 0;
1287
+ right: 0;
1288
+ bottom: 0;
1289
+ background-color: rgba(0, 0, 0, 0.5);
1290
+ display: flex;
1291
+ align-items: center;
1292
+ justify-content: center;
1293
+ z-index: 10000;
1294
+ animation: fadeIn 0.2s ease-out;
1295
+ }
1296
+
1297
+ .gantt-dependency-editor {
1298
+ background: white;
1299
+ border-radius: 8px;
1300
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1301
+ width: 700px;
1302
+ max-width: 90vw;
1303
+ max-height: 90vh;
1304
+ overflow: hidden;
1305
+ display: flex;
1306
+ flex-direction: column;
1307
+ animation: slideUp 0.3s ease-out;
1308
+ }
1309
+
1310
+ .gantt-dependency-editor-header {
1311
+ display: flex;
1312
+ justify-content: space-between;
1313
+ align-items: center;
1314
+ padding: 20px 24px;
1315
+ border-bottom: 1px solid #e0e0e0;
1316
+ background-color: #f8f9fa;
1317
+ }
1318
+
1319
+ .gantt-dependency-editor-header h3 {
1320
+ margin: 0;
1321
+ font-size: 18px;
1322
+ font-weight: 600;
1323
+ color: #333;
1324
+ }
1325
+
1326
+ .gantt-dependency-editor-body {
1327
+ padding: 24px;
1328
+ overflow-y: auto;
1329
+ flex: 1;
1330
+ }
1331
+
1332
+ .gantt-dependency-section {
1333
+ margin-bottom: 32px;
1334
+ }
1335
+
1336
+ .gantt-dependency-section h4 {
1337
+ margin: 0 0 12px 0;
1338
+ font-size: 14px;
1339
+ font-weight: 600;
1340
+ color: #555;
1341
+ text-transform: uppercase;
1342
+ letter-spacing: 0.5px;
1343
+ }
1344
+
1345
+ .gantt-dependency-section h5 {
1346
+ margin: 0 0 8px 0;
1347
+ font-size: 13px;
1348
+ font-weight: 600;
1349
+ color: #666;
1350
+ }
1351
+
1352
+ .gantt-empty-message {
1353
+ color: #999;
1354
+ font-style: italic;
1355
+ padding: 12px;
1356
+ background-color: #f8f9fa;
1357
+ border-radius: 4px;
1358
+ text-align: center;
1359
+ }
1360
+
1361
+ .gantt-dependency-list {
1362
+ list-style: none;
1363
+ padding: 0;
1364
+ margin: 0;
1365
+ }
1366
+
1367
+ .gantt-dependency-item {
1368
+ display: flex;
1369
+ justify-content: space-between;
1370
+ align-items: center;
1371
+ padding: 12px;
1372
+ margin-bottom: 8px;
1373
+ background-color: #f8f9fa;
1374
+ border-radius: 6px;
1375
+ border: 1px solid #e0e0e0;
1376
+ transition: all 0.2s;
1377
+ }
1378
+
1379
+ .gantt-dependency-item:hover {
1380
+ background-color: #e9ecef;
1381
+ border-color: #007bff;
1382
+ }
1383
+
1384
+ .gantt-dependency-info {
1385
+ display: flex;
1386
+ flex-direction: column;
1387
+ gap: 4px;
1388
+ flex: 1;
1389
+ }
1390
+
1391
+ .gantt-dependency-task-name {
1392
+ font-weight: 500;
1393
+ color: #333;
1394
+ font-size: 14px;
1395
+ }
1396
+
1397
+ .gantt-dependency-type {
1398
+ font-size: 12px;
1399
+ color: #666;
1400
+ padding: 2px 8px;
1401
+ background-color: #e3f2fd;
1402
+ border-radius: 12px;
1403
+ display: inline-block;
1404
+ width: fit-content;
1405
+ }
1406
+
1407
+ .gantt-dependency-lag {
1408
+ font-size: 11px;
1409
+ color: #ff9800;
1410
+ font-weight: 600;
1411
+ padding: 2px 6px;
1412
+ background-color: #fff3e0;
1413
+ border-radius: 10px;
1414
+ display: inline-block;
1415
+ width: fit-content;
1416
+ }
1417
+
1418
+ .gantt-dependency-remove {
1419
+ background-color: transparent;
1420
+ border: none;
1421
+ font-size: 16px;
1422
+ cursor: pointer;
1423
+ padding: 4px 8px;
1424
+ border-radius: 4px;
1425
+ transition: all 0.2s;
1426
+ }
1427
+
1428
+ .gantt-dependency-remove:hover {
1429
+ background-color: #ffebee;
1430
+ }
1431
+
1432
+ .gantt-add-dependency {
1433
+ border-top: 2px dashed #dee2e6;
1434
+ padding-top: 24px;
1435
+ }
1436
+
1437
+ .gantt-dependency-form {
1438
+ display: flex;
1439
+ flex-direction: column;
1440
+ gap: 16px;
1441
+ }
1442
+
1443
+ .gantt-form-row {
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ gap: 6px;
1447
+ }
1448
+
1449
+ .gantt-form-row label {
1450
+ font-size: 13px;
1451
+ font-weight: 500;
1452
+ color: #555;
1453
+ display: flex;
1454
+ flex-direction: column;
1455
+ gap: 2px;
1456
+ }
1457
+
1458
+ .gantt-help-text {
1459
+ font-size: 11px;
1460
+ color: #999;
1461
+ font-weight: 400;
1462
+ }
1463
+
1464
+ .gantt-select,
1465
+ .gantt-input {
1466
+ padding: 10px 12px;
1467
+ border: 1px solid #ced4da;
1468
+ border-radius: 6px;
1469
+ font-size: 14px;
1470
+ font-family: inherit;
1471
+ transition: all 0.2s;
1472
+ background-color: white;
1473
+ }
1474
+
1475
+ .gantt-select:focus,
1476
+ .gantt-input:focus {
1477
+ outline: none;
1478
+ border-color: #007bff;
1479
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);
1480
+ }
1481
+
1482
+ .gantt-form-actions {
1483
+ display: flex;
1484
+ gap: 12px;
1485
+ margin-top: 8px;
1486
+ }
1487
+
1488
+ .gantt-btn {
1489
+ padding: 10px 20px;
1490
+ border: none;
1491
+ border-radius: 6px;
1492
+ font-size: 14px;
1493
+ font-weight: 500;
1494
+ cursor: pointer;
1495
+ transition: all 0.2s;
1496
+ font-family: inherit;
1497
+ }
1498
+
1499
+ .gantt-btn-primary {
1500
+ background-color: #007bff;
1501
+ color: white;
1502
+ }
1503
+
1504
+ .gantt-btn-primary:hover:not(:disabled) {
1505
+ background-color: #0056b3;
1506
+ transform: translateY(-1px);
1507
+ box-shadow: 0 2px 8px rgba(0, 123, 255, 0.3);
1508
+ }
1509
+
1510
+ .gantt-btn-primary:disabled {
1511
+ background-color: #ccc;
1512
+ cursor: not-allowed;
1513
+ opacity: 0.6;
1514
+ }
1515
+
1516
+ .gantt-dependency-help {
1517
+ background-color: #f8f9fa;
1518
+ border: 1px solid #dee2e6;
1519
+ border-radius: 8px;
1520
+ padding: 16px;
1521
+ margin-top: 24px;
1522
+ }
1523
+
1524
+ .gantt-dependency-help ul {
1525
+ margin: 8px 0;
1526
+ padding-left: 20px;
1527
+ }
1528
+
1529
+ .gantt-dependency-help li {
1530
+ margin-bottom: 6px;
1531
+ font-size: 13px;
1532
+ line-height: 1.5;
1533
+ color: #555;
1534
+ }
1535
+
1536
+ .gantt-dependency-help strong {
1537
+ color: #333;
1538
+ }
1539
+
1540
+ .gantt-dependency-help code {
1541
+ background-color: #e9ecef;
1542
+ padding: 2px 6px;
1543
+ border-radius: 3px;
1544
+ font-family: var(--font-heading);
1545
+ font-size: 12px;
1546
+ color: #d63384;
1547
+ }
1548
+
1549
+ .gantt-dependency-help p {
1550
+ margin: 4px 0;
1551
+ font-size: 13px;
1552
+ color: #666;
1553
+ }
1554
+
1555
+ /* Dark Theme for Dependency Editor */
1556
+ .theme-dark .gantt-dependency-editor {
1557
+ background-color: #2d2d2d;
1558
+ }
1559
+
1560
+ .theme-dark .gantt-dependency-editor-header {
1561
+ background-color: #252525;
1562
+ border-bottom-color: #444;
1563
+ }
1564
+
1565
+ .theme-dark .gantt-dependency-editor-header h3 {
1566
+ color: #e0e0e0;
1567
+ }
1568
+
1569
+ .theme-dark .gantt-empty-message {
1570
+ background-color: #252525;
1571
+ color: #888;
1572
+ }
1573
+
1574
+ .theme-dark .gantt-dependency-item {
1575
+ background-color: #252525;
1576
+ border-color: #444;
1577
+ }
1578
+
1579
+ .theme-dark .gantt-dependency-item:hover {
1580
+ background-color: #333;
1581
+ border-color: #007bff;
1582
+ }
1583
+
1584
+ .theme-dark .gantt-dependency-task-name {
1585
+ color: #e0e0e0;
1586
+ }
1587
+
1588
+ .theme-dark .gantt-dependency-type {
1589
+ background-color: #1a2332;
1590
+ color: #64b5f6;
1591
+ }
1592
+
1593
+ .theme-dark .gantt-dependency-help {
1594
+ background-color: #252525;
1595
+ border-color: #444;
1596
+ }
1597
+
1598
+ .theme-dark .gantt-dependency-help code {
1599
+ background-color: #333;
1600
+ color: #ff79c6;
1601
+ }
1602
+
1603
+ .theme-dark .gantt-select,
1604
+ .theme-dark .gantt-input {
1605
+ background-color: #333;
1606
+ border-color: #555;
1607
+ color: #e0e0e0;
1608
+ }
1609
+
1610
+ .theme-dark .gantt-dependency-section h4,
1611
+ .theme-dark .gantt-dependency-section h5 {
1612
+ color: #b0b0b0;
1613
+ }
1614
+
1615
+ .theme-dark .gantt-form-row label {
1616
+ color: #b0b0b0;
1617
+ }
1618
+
1619
+ @keyframes fadeIn {
1620
+ from {
1621
+ opacity: 0;
1622
+ }
1623
+
1624
+ to {
1625
+ opacity: 1;
1626
+ }
1627
+ }
1628
+
1629
+ @keyframes slideUp {
1630
+ from {
1631
+ transform: translateY(20px);
1632
+ opacity: 0;
1633
+ }
1634
+
1635
+ to {
1636
+ transform: translateY(0);
1637
+ opacity: 1;
1638
+ }
1639
+ }
1640
+
1641
+ /* Global Typography Updates for IBM Plex */
1642
+ h1,
1643
+ h2,
1644
+ h3,
1645
+ h4,
1646
+ h5,
1647
+ h6,
1648
+ .gantt-toolbar button,
1649
+ .gantt-filter-label,
1650
+ .gantt-dependency-section h4,
1651
+ .gantt-dependency-section h5 {
1652
+ font-family: var(--font-heading);
1653
+ }
1654
+
1655
+ /* Body text uses IBM Plex Sans */
1656
+ .gantt-grid-cell,
1657
+ .gantt-task-text,
1658
+ .gantt-dependency-task-name,
1659
+ .gantt-form-row label,
1660
+ .gantt-dependency-help p,
1661
+ .gantt-dependency-help li {
1662
+ font-family: var(--font-body);
1663
+ }
1664
+
1665
+ /* Ant Design Modal Overrides */
1666
+ .gantt-dependency-modal .ant-modal-header {
1667
+ font-family: var(--font-heading);
1668
+ }
1669
+
1670
+ .gantt-dependency-modal .ant-modal-body {
1671
+ font-family: var(--font-body);
1672
+ }
1673
+
1674
+ .gantt-dependency-modal .ant-list-item-meta-title {
1675
+ font-family: var(--font-body);
1676
+ }
1677
+
1678
+ .gantt-dependency-modal .ant-typography {
1679
+ font-family: inherit;
1680
+ }
1681
+
1682
+ .gantt-dependency-modal code {
1683
+ font-family: var(--font-heading);
1684
+ }
1685
+
1686
+ /* Ensure Ant Design buttons use correct fonts */
1687
+ .gantt-dependency-modal .ant-btn {
1688
+ font-family: var(--font-body);
1689
+ }
1690
+
1691
+ /* Ant Design Select and Input */
1692
+ .gantt-dependency-modal .ant-select,
1693
+ .gantt-dependency-modal .ant-input-number {
1694
+ font-family: var(--font-body);
1695
+ }
1696
+
1697
+ /* Context Menu - SVAR Style */
1698
+ .gantt-context-menu-overlay {
1699
+ position: fixed;
1700
+ top: 0;
1701
+ left: 0;
1702
+ right: 0;
1703
+ bottom: 0;
1704
+ z-index: 9999;
1705
+ background: transparent;
1706
+ }
1707
+
1708
+ .gantt-context-menu {
1709
+ font-family: var(--font-body);
1710
+ }
1711
+
1712
+ .gantt-context-menu .ant-menu {
1713
+ font-family: var(--font-body);
1714
+ min-width: 180px;
1715
+ }
1716
+
1717
+ .gantt-context-menu .ant-menu-item {
1718
+ font-family: var(--font-body);
1719
+ font-size: 13px;
1720
+ padding: 8px 16px;
1721
+ height: auto;
1722
+ line-height: 1.5;
1723
+ }
1724
+
1725
+ .gantt-context-menu .ant-menu-item-icon {
1726
+ margin-right: 8px;
1727
+ font-size: 14px;
1728
+ }
1729
+
1730
+ .theme-dark .gantt-context-menu .ant-menu {
1731
+ background-color: #2d2d2d;
1732
+ border-color: #444;
1733
+ }
1734
+
1735
+ .theme-dark .gantt-context-menu .ant-menu-item {
1736
+ color: #e0e0e0;
1737
+ }
1738
+
1739
+ .theme-dark .gantt-context-menu .ant-menu-item:hover {
1740
+ background-color: #3a3a3a;
1741
+ color: #ffffff;
1742
+ }
1743
+
1744
+ /* ============================================
1745
+ RESPONSIVE DESIGN
1746
+ ============================================ */
1747
+
1748
+ /* Tablet and below (max-width: 1024px) */
1749
+ @media (max-width: 1024px) {
1750
+ .gantt-grid {
1751
+ min-width: 250px;
1752
+ width: 300px;
1753
+ max-width: 40%;
1754
+ }
1755
+
1756
+ .gantt-toolbar {
1757
+ flex-wrap: wrap;
1758
+ gap: 8px;
1759
+ }
1760
+
1761
+ .gantt-toolbar-left,
1762
+ .gantt-toolbar-right {
1763
+ flex-wrap: wrap;
1764
+ gap: 8px;
1765
+ }
1766
+
1767
+ .gantt-toolbar button {
1768
+ font-size: 12px;
1769
+ padding: 6px 12px;
1770
+ }
1771
+
1772
+ .gantt-toolbar button svg {
1773
+ margin-right: 4px;
1774
+ }
1775
+
1776
+ }
1777
+
1778
+ /* Mobile landscape and small tablets (max-width: 768px) */
1779
+ @media (max-width: 768px) {
1780
+ .gantt-page-wrapper {
1781
+ height: 100vh;
1782
+ overflow: auto;
1783
+ }
1784
+
1785
+ .gantt-container {
1786
+ min-height: auto;
1787
+ }
1788
+
1789
+ .gantt-layout {
1790
+ flex-direction: column;
1791
+ height: auto;
1792
+ min-height: 600px;
1793
+ }
1794
+
1795
+ .gantt-grid {
1796
+ min-width: 100%;
1797
+ width: 100%;
1798
+ max-width: 100%;
1799
+ max-height: 300px;
1800
+ border-right: none;
1801
+ border-bottom: 2px solid #ddd;
1802
+ }
1803
+
1804
+ .gantt-timeline-container {
1805
+ flex: 1;
1806
+ min-height: 400px;
1807
+ overflow-x: auto;
1808
+ overflow-y: auto;
1809
+ }
1810
+
1811
+ .gantt-toolbar {
1812
+ padding: 8px;
1813
+ flex-direction: column;
1814
+ align-items: stretch;
1815
+ }
1816
+
1817
+ .gantt-toolbar-left,
1818
+ .gantt-toolbar-right {
1819
+ width: 100%;
1820
+ justify-content: flex-start;
1821
+ flex-wrap: wrap;
1822
+ gap: 6px;
1823
+ }
1824
+
1825
+ .gantt-toolbar button {
1826
+ flex: 1 1 auto;
1827
+ min-width: 80px;
1828
+ font-size: 11px;
1829
+ padding: 8px 10px;
1830
+ }
1831
+
1832
+ .gantt-toolbar button svg {
1833
+ margin-right: 4px;
1834
+ font-size: 12px;
1835
+ }
1836
+
1837
+ /* Hide button text on very small screens, show only icons */
1838
+ .gantt-toolbar button {
1839
+ position: relative;
1840
+ }
1841
+
1842
+ .gantt-toolbar button svg {
1843
+ margin-right: 0 !important;
1844
+ }
1845
+
1846
+ /* Hide text after icon using text node selector */
1847
+ .gantt-toolbar button::after {
1848
+ content: '';
1849
+ }
1850
+
1851
+
1852
+ /* Filter and search adjustments */
1853
+ .gantt-filter-bar {
1854
+ flex-direction: column;
1855
+ gap: 8px;
1856
+ padding: 8px;
1857
+ }
1858
+
1859
+ .gantt-filter-left,
1860
+ .gantt-filter-right {
1861
+ width: 100%;
1862
+ flex-direction: column;
1863
+ gap: 8px;
1864
+ }
1865
+
1866
+ .gantt-search-antd {
1867
+ width: 100% !important;
1868
+ }
1869
+
1870
+ .gantt-filter-select-antd {
1871
+ width: 100% !important;
1872
+ }
1873
+ }
1874
+
1875
+ /* Mobile portrait (max-width: 480px) */
1876
+ @media (max-width: 480px) {
1877
+ .gantt-page-wrapper {
1878
+ height: 100vh;
1879
+ overflow: auto;
1880
+ }
1881
+
1882
+ .gantt-toolbar {
1883
+ padding: 6px;
1884
+ }
1885
+
1886
+ .gantt-toolbar button {
1887
+ font-size: 10px;
1888
+ padding: 6px 8px;
1889
+ min-width: 60px;
1890
+ }
1891
+
1892
+ .gantt-toolbar button svg {
1893
+ font-size: 11px;
1894
+ margin-right: 2px;
1895
+ }
1896
+
1897
+ /* Show only icons on very small screens */
1898
+ .gantt-toolbar button {
1899
+ display: inline-flex;
1900
+ align-items: center;
1901
+ justify-content: center;
1902
+ padding: 8px !important;
1903
+ min-width: 44px;
1904
+ position: relative;
1905
+ }
1906
+
1907
+ .gantt-toolbar button svg {
1908
+ margin-right: 0 !important;
1909
+ flex-shrink: 0;
1910
+ }
1911
+
1912
+ /* Hide text by clipping it */
1913
+ .gantt-toolbar button {
1914
+ text-indent: -9999px;
1915
+ overflow: hidden;
1916
+ white-space: nowrap;
1917
+ }
1918
+
1919
+ .gantt-toolbar button svg {
1920
+ position: absolute;
1921
+ left: 50%;
1922
+ top: 50%;
1923
+ transform: translate(-50%, -50%);
1924
+ text-indent: 0;
1925
+ }
1926
+
1927
+ .gantt-grid {
1928
+ max-height: 250px;
1929
+ }
1930
+
1931
+ .gantt-grid-header-cell {
1932
+ padding: 6px 8px;
1933
+ font-size: 11px;
1934
+ }
1935
+
1936
+ .gantt-grid-cell {
1937
+ padding: 6px 8px;
1938
+ font-size: 12px;
1939
+ }
1940
+
1941
+ .gantt-timeline-container {
1942
+ min-height: 350px;
1943
+ }
1944
+
1945
+ .gantt-timeline-cell {
1946
+ padding: 6px 4px;
1947
+ font-size: 11px;
1948
+ min-width: 40px;
1949
+ }
1950
+
1951
+ .gantt-timeline-scale {
1952
+ font-size: 10px;
1953
+ }
1954
+
1955
+ /* Modal adjustments */
1956
+ .gantt-dependency-modal .ant-modal {
1957
+ max-width: 95vw !important;
1958
+ margin: 10px auto !important;
1959
+ }
1960
+
1961
+ .gantt-dependency-editor {
1962
+ width: 95vw !important;
1963
+ max-width: 95vw !important;
1964
+ }
1965
+ }
1966
+
1967
+ /* Touch-friendly adjustments */
1968
+ @media (hover: none) and (pointer: coarse) {
1969
+ .gantt-toolbar button {
1970
+ min-height: 44px;
1971
+ min-width: 44px;
1972
+ padding: 10px 12px;
1973
+ }
1974
+
1975
+ .gantt-grid-row {
1976
+ min-height: 48px;
1977
+ }
1978
+
1979
+ .gantt-grid-cell {
1980
+ padding: 10px 12px;
1981
+ }
1982
+
1983
+ .gantt-timeline-cell {
1984
+ min-width: 50px;
1985
+ padding: 10px;
1986
+ }
1987
+ }
1988
+
1989
+ /* High DPI displays */
1990
+ @media (-webkit-min-device-pixel-ratio: 2),
1991
+ (min-resolution: 192dpi) {
1992
+
1993
+ .gantt-grid,
1994
+ .gantt-timeline-container {
1995
+ border-width: 0.5px;
1996
+ }
1997
+ }
1998
+
1999
+ /* Landscape orientation on mobile */
2000
+ @media (max-width: 768px) and (orientation: landscape) {
2001
+ .gantt-layout {
2002
+ flex-direction: row;
2003
+ }
2004
+
2005
+ .gantt-grid {
2006
+ max-height: none;
2007
+ height: 100%;
2008
+ width: 500px;
2009
+ min-width: 500px;
2010
+ max-width: 500px;
2011
+ }
2012
+
2013
+ .gantt-timeline-container {
2014
+ min-height: auto;
2015
+ height: 100%;
2016
+ }
2017
+ }
2018
+
2019
+ /* Print styles */
2020
+ @media print {
2021
+
2022
+ .gantt-toolbar,
2023
+ .gantt-filter-container {
2024
+ display: none;
2025
+ }
2026
+
2027
+ .gantt-layout {
2028
+ flex-direction: row;
2029
+ }
2030
+
2031
+ .gantt-grid {
2032
+ width: 500px;
2033
+ max-width: 500px;
2034
+ min-width: 500px;
2035
+ }
2036
+
2037
+ .gantt-container {
2038
+ overflow: visible;
2039
+ }
2040
+
2041
+ .gantt-grid,
2042
+ .gantt-timeline-container {
2043
+ overflow: visible;
2044
+ }
2045
+ }
2046
+
2047
+ /* Accessibility: Reduced motion */
2048
+ @media (prefers-reduced-motion: reduce) {
2049
+
2050
+ .gantt-grid,
2051
+ .gantt-toolbar button,
2052
+ .gantt-grid-row,
2053
+ .gantt-progress-bar-fill {
2054
+ transition: none;
2055
+ }
2056
+ }
2057
+
2058
+ /* Fix for horizontal scroll on mobile */
2059
+ @media (max-width: 768px) {
2060
+ .gantt-timeline-header {
2061
+ overflow-x: auto;
2062
+ -webkit-overflow-scrolling: touch;
2063
+ }
2064
+
2065
+ .gantt-timeline-scale {
2066
+ min-width: max-content;
2067
+ }
2068
+
2069
+ .gantt-timeline-body {
2070
+ overflow-x: auto;
2071
+ -webkit-overflow-scrolling: touch;
2072
+ }
2073
+ }
2074
+
2075
+ /* Ensure proper viewport handling */
2076
+ .gantt-page-wrapper {
2077
+ position: relative;
2078
+ width: 100%;
2079
+ max-width: 100vw;
2080
+ overflow-x: hidden;
2081
+ }
2082
+
2083
+ .gantt-container {
2084
+ max-width: 100%;
2085
+ overflow: hidden;
2086
+ }
2087
+
2088
+ .gantt-layout {
2089
+ max-width: 100%;
2090
+ overflow-x: auto;
2091
+ overflow-y: auto;
2092
+ }
2093
+
2094
+ /* Dependency Popover Styles */
2095
+ .dependency-popover .task-list-item {
2096
+ transition: background-color 0.2s ease, border-left 0.2s ease;
2097
+ border-left: 3px solid transparent;
2098
+ }
2099
+
2100
+ .dependency-popover .task-list-item:hover {
2101
+ background-color: #f0f7ff !important;
2102
+ border-left-color: #1890ff;
2103
+ }
2104
+
2105
+ .dependency-popover .task-list-item.selected {
2106
+ background-color: #e6f4ff !important;
2107
+ border-left-color: #1890ff;
2108
+ font-weight: 500;
2109
+ }
2110
+
2111
+ .dependency-popover .ant-list-item {
2112
+ border-bottom: 1px solid #f0f0f0;
2113
+ }
2114
+
2115
+ .dependency-popover .ant-list-item:last-child {
2116
+ border-bottom: none;
2117
+ }
2118
+
2119
+ /* Improve visual hierarchy in dependency editor */
2120
+ .gantt-dependency-modal .ant-modal-body {
2121
+ padding: 24px;
2122
+ }
2123
+
2124
+ .gantt-dependency-modal .ant-card {
2125
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
2126
+ border: 1px solid #f0f0f0;
2127
+ }
2128
+
2129
+ .gantt-dependency-modal .ant-list-item {
2130
+ padding: 12px 16px;
2131
+ transition: background-color 0.2s ease;
2132
+ }
2133
+
2134
+ .gantt-dependency-modal .ant-list-item:hover {
2135
+ background-color: #fafafa;
2136
+ }
2137
+
2138
+ /* Enhance input focus states */
2139
+ .dependency-popover .ant-input:focus,
2140
+ .dependency-popover .ant-select-focused .ant-select-selector,
2141
+ .dependency-popover .ant-input-number-focused {
2142
+ border-color: #1890ff;
2143
+ box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1);
2144
+ }
2145
+
2146
+ /* Improve button styling */
2147
+ .dependency-popover .ant-btn-primary {
2148
+ background-color: #5c67f2;
2149
+ border-color: #5c67f2;
2150
+ font-weight: 500;
2151
+ transition: all 0.3s ease;
2152
+ }
2153
+
2154
+ .dependency-popover .ant-btn-primary:hover {
2155
+ background-color: #4854e0;
2156
+ border-color: #4854e0;
2157
+ transform: translateY(-1px);
2158
+ box-shadow: 0 4px 12px rgba(92, 103, 242, 0.3);
2159
+ }
2160
+
2161
+ .dependency-popover .ant-btn-primary:disabled {
2162
+ background-color: #f5f5f5;
2163
+ border-color: #d9d9d9;
2164
+ color: #00000040;
2165
+ transform: none;
2166
+ box-shadow: none;
2167
+ }