iris-gantt 1.0.0 → 1.0.2

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.
Files changed (60) hide show
  1. package/README.md +183 -215
  2. package/USAGE.md +838 -0
  3. package/dist/Gantt/Chart.d.ts +22 -0
  4. package/dist/Gantt/Chart.d.ts.map +1 -0
  5. package/dist/Gantt/ContextMenu.d.ts +19 -0
  6. package/dist/Gantt/ContextMenu.d.ts.map +1 -0
  7. package/dist/Gantt/DependencyEditor.d.ts +13 -0
  8. package/dist/Gantt/DependencyEditor.d.ts.map +1 -0
  9. package/dist/Gantt/DependencyPopover.d.ts +12 -0
  10. package/dist/Gantt/DependencyPopover.d.ts.map +1 -0
  11. package/dist/Gantt/DragDrop.d.ts +18 -0
  12. package/dist/Gantt/DragDrop.d.ts.map +1 -0
  13. package/dist/Gantt/Gantt.d.ts +35 -0
  14. package/dist/Gantt/Gantt.d.ts.map +1 -0
  15. package/dist/Gantt/GanttPro.d.ts +16 -0
  16. package/dist/Gantt/GanttPro.d.ts.map +1 -0
  17. package/dist/Gantt/Grid.d.ts +29 -0
  18. package/dist/Gantt/Grid.d.ts.map +1 -0
  19. package/dist/Gantt/LinkRenderer.d.ts +15 -0
  20. package/dist/Gantt/LinkRenderer.d.ts.map +1 -0
  21. package/dist/Gantt/TaskBar.d.ts +19 -0
  22. package/dist/Gantt/TaskBar.d.ts.map +1 -0
  23. package/dist/Gantt/TaskCreator.d.ts +8 -0
  24. package/dist/Gantt/TaskCreator.d.ts.map +1 -0
  25. package/dist/Gantt/TaskEditor.d.ts +10 -0
  26. package/dist/Gantt/TaskEditor.d.ts.map +1 -0
  27. package/dist/Gantt/Timeline.d.ts +23 -0
  28. package/dist/Gantt/Timeline.d.ts.map +1 -0
  29. package/dist/Gantt/Toolbar.d.ts +15 -0
  30. package/dist/Gantt/Toolbar.d.ts.map +1 -0
  31. package/dist/Gantt/UndoRedo.d.ts +27 -0
  32. package/dist/Gantt/UndoRedo.d.ts.map +1 -0
  33. package/dist/Gantt/exports.d.ts +21 -0
  34. package/dist/Gantt/exports.d.ts.map +1 -0
  35. package/dist/Gantt/features/AutoScheduler.d.ts +10 -0
  36. package/dist/Gantt/features/AutoScheduler.d.ts.map +1 -0
  37. package/dist/Gantt/features/Baselines.d.ts +27 -0
  38. package/dist/Gantt/features/Baselines.d.ts.map +1 -0
  39. package/dist/Gantt/features/CriticalPath.d.ts +10 -0
  40. package/dist/Gantt/features/CriticalPath.d.ts.map +1 -0
  41. package/dist/Gantt/features/ExportUtils.d.ts +11 -0
  42. package/dist/Gantt/features/ExportUtils.d.ts.map +1 -0
  43. package/dist/Gantt/features/FilterSearch.d.ts +20 -0
  44. package/dist/Gantt/features/FilterSearch.d.ts.map +1 -0
  45. package/dist/Gantt/types.d.ts +80 -0
  46. package/dist/Gantt/types.d.ts.map +1 -0
  47. package/dist/Gantt/utils/dateUtils.d.ts +11 -0
  48. package/dist/Gantt/utils/dateUtils.d.ts.map +1 -0
  49. package/dist/Gantt/utils/dependencyParser.d.ts +26 -0
  50. package/dist/Gantt/utils/dependencyParser.d.ts.map +1 -0
  51. package/dist/gantt.css +1 -0
  52. package/dist/index.d.ts +3 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/iris-gantt.js +1232 -1500
  55. package/dist/iris-gantt.umd.cjs +8 -8
  56. package/dist/types.d.ts +2 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/package.json +42 -7
  59. package/dist/iris-gantt.css +0 -1
  60. package/src/components/Gantt/gantt.css +0 -2167
@@ -1,2167 +0,0 @@
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
- }