@jaeungkim/gantt-chart 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -16
- package/dist/gantt-chart.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +428 -12
- package/dist/index.d.ts +428 -12
- package/dist/index.js +2499 -2682
- package/package.json +12 -10
- package/dist/Gantt.d.ts +0 -5
- package/dist/bars/components/GanttBar.d.ts +0 -20
- package/dist/bars/components/GanttBarsLayer.d.ts +0 -24
- package/dist/bars/components/GanttDragGuides.d.ts +0 -1
- package/dist/bars/hooks/useGanttBarDrag.d.ts +0 -15
- package/dist/bars/hooks/useGanttDrawCreate.d.ts +0 -25
- package/dist/bars/hooks/useGanttProgressDrag.d.ts +0 -11
- package/dist/core/calendar.d.ts +0 -27
- package/dist/core/dates.d.ts +0 -16
- package/dist/core/reorder.d.ts +0 -55
- package/dist/core/tree.d.ts +0 -34
- package/dist/core/types.d.ts +0 -43
- package/dist/dependencies/components/GanttDependencyArrows.d.ts +0 -13
- package/dist/dependencies/hooks/useGanttLinkDrag.d.ts +0 -20
- package/dist/dependencies/utils/arrowPath.d.ts +0 -20
- package/dist/dependencies/utils/link.d.ts +0 -16
- package/dist/detail/components/GanttDetailPanel.d.ts +0 -21
- package/dist/detail/hooks/useGanttDetail.d.ts +0 -42
- package/dist/detail/utils/edit.d.ts +0 -21
- package/dist/interaction/hooks/useGanttInteraction.d.ts +0 -2
- package/dist/interaction/hooks/useGanttKeyboardNav.d.ts +0 -33
- package/dist/interaction/hooks/useGanttSelection.d.ts +0 -12
- package/dist/interaction/utils/a11y.d.ts +0 -84
- package/dist/props.d.ts +0 -121
- package/dist/rows/components/GanttRowsLayer.d.ts +0 -13
- package/dist/rows/hooks/useGanttCollapse.d.ts +0 -18
- package/dist/rows/hooks/useGanttRowModel.d.ts +0 -19
- package/dist/rows/utils/rows.d.ts +0 -21
- package/dist/shared/constants.d.ts +0 -24
- package/dist/shared/context.d.ts +0 -4
- package/dist/shared/hooks/useLatestRef.d.ts +0 -2
- package/dist/shared/hooks/useResolvedTheme.d.ts +0 -8
- package/dist/shared/store.d.ts +0 -80
- package/dist/shared/task.d.ts +0 -55
- package/dist/shared/types.d.ts +0 -117
- package/dist/shared/utils/holidays.d.ts +0 -12
- package/dist/shared/utils/i18n.d.ts +0 -5
- package/dist/shared/utils/pointerGesture.d.ts +0 -11
- package/dist/shared/virtual/axis.d.ts +0 -13
- package/dist/shared/virtual/useVirtualWindow.d.ts +0 -16
- package/dist/shared/virtual/window.d.ts +0 -31
- package/dist/task-list/components/GanttGridSplitter.d.ts +0 -6
- package/dist/task-list/components/GanttTaskAddRow.d.ts +0 -7
- package/dist/task-list/components/GanttTaskGrid.d.ts +0 -24
- package/dist/task-list/hooks/useGanttRowDrag.d.ts +0 -17
- package/dist/task-list/hooks/useGanttTaskListPane.d.ts +0 -11
- package/dist/task-list/hooks/useGanttTaskMove.d.ts +0 -16
- package/dist/timeline/components/GanttChartHeader.d.ts +0 -10
- package/dist/timeline/components/GanttHolidayLabels.d.ts +0 -6
- package/dist/timeline/components/GanttNonWorkingLayer.d.ts +0 -6
- package/dist/timeline/components/GanttTodayLine.d.ts +0 -6
- package/dist/timeline/hooks/useGanttScrollApi.d.ts +0 -62
- package/dist/timeline/hooks/useGanttViewport.d.ts +0 -47
- package/dist/timeline/hooks/useGanttVirtualization.d.ts +0 -28
- package/dist/timeline/utils/geometry.d.ts +0 -49
- package/dist/timeline/utils/header.d.ts +0 -8
- package/dist/timeline/utils/transform.d.ts +0 -9
- package/dist/timeline/utils/viewport.d.ts +0 -31
- package/dist/useGanttSelectors.d.ts +0 -11
package/README.md
CHANGED
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
[](https://github.com/jaeungkim/gantt-chart/actions/workflows/ci.yml)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Bring interactive project planning to your React app.
|
|
10
|
+
|
|
11
|
+
Drag tasks, connect dependencies, and organize projects into nested timelines. Working calendars,
|
|
12
|
+
keyboard editing, and light and dark themes come built in.
|
|
13
|
+
|
|
14
|
+
Open source · MIT licensed · React 18 & 19 · TypeScript
|
|
10
15
|
|
|
11
16
|
[Quick start](https://gantt.jaeungkim.com/docs/quick-start) |
|
|
12
17
|
[Playground](https://gantt.jaeungkim.com/playground) |
|
|
@@ -15,15 +20,21 @@ A Gantt chart for React that behaves like a controlled input.
|
|
|
15
20
|
|
|
16
21
|
## Features
|
|
17
22
|
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
23
|
+
- **Edit the plan directly.** Move and resize tasks, adjust progress, and draw dependency arrows.
|
|
24
|
+
- **Move a whole project phase.** Organize tasks into a collapsible hierarchy and move a summary
|
|
25
|
+
row together with its children.
|
|
26
|
+
- **Connect the work.** Draw finish-to-start, start-to-start, finish-to-finish and start-to-finish
|
|
27
|
+
dependencies.
|
|
28
|
+
- **Plan around working days.** Define workweeks and holidays, with optional snapping to the next
|
|
29
|
+
working day.
|
|
30
|
+
- **Explore larger plans.** Rows and time cells are virtualized, with five scales from day to year.
|
|
31
|
+
- **Use the keyboard.** Navigate, move, resize and reorder tasks with edit announcements.
|
|
32
|
+
See the [accessibility guide](https://gantt.jaeungkim.com/docs/accessibility) for supported
|
|
33
|
+
actions and remaining gaps.
|
|
34
|
+
- **Match your app.** Light and dark themes, CSS custom properties, localized dates and custom
|
|
35
|
+
detail panels.
|
|
36
|
+
- **Connect your data.** Receive updated tasks through `onTasksChange` and handle storage in
|
|
37
|
+
your app.
|
|
27
38
|
|
|
28
39
|
## Install
|
|
29
40
|
|
|
@@ -33,10 +44,11 @@ pnpm add @jaeungkim/gantt-chart
|
|
|
33
44
|
# yarn add @jaeungkim/gantt-chart
|
|
34
45
|
```
|
|
35
46
|
|
|
36
|
-
`react` and `react-dom` (`^18` or `^19`) are peer dependencies
|
|
37
|
-
`dayjs`
|
|
47
|
+
`react` and `react-dom` (`^18` or `^19`) are peer dependencies, and React is the only module the
|
|
48
|
+
built bundle imports. The ESM build is under 40 kB gzipped and the stylesheet is 4.1 kB. `dayjs` is a
|
|
49
|
+
declared dependency because `Dayjs` is in the public types.
|
|
38
50
|
|
|
39
|
-
##
|
|
51
|
+
## Connect it to your app
|
|
40
52
|
|
|
41
53
|
```tsx
|
|
42
54
|
import { useState } from 'react';
|
|
@@ -99,9 +111,6 @@ can edit. [GanttProps](https://gantt.jaeungkim.com/docs/ref/props) lists every p
|
|
|
99
111
|
default. The chart renders no toolbar, so your app renders the scale control and drives it
|
|
100
112
|
through the `ref` in [Imperative API](https://gantt.jaeungkim.com/docs/imperative-api).
|
|
101
113
|
|
|
102
|
-
The tree and calendar helpers are exported as plain functions that run without React or a DOM. See
|
|
103
|
-
[Headless core](https://gantt.jaeungkim.com/docs/headless-core).
|
|
104
|
-
|
|
105
114
|
Release notes are on [GitHub Releases](https://github.com/jaeungkim/gantt-chart/releases).
|
|
106
115
|
|
|
107
116
|
## Contributing
|
package/dist/gantt-chart.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.gantt-container{color-scheme:light;--gantt-detail-width: 320px;--gantt-font-sans: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Segoe UI", "Geist", system-ui, sans-serif;--gantt-background: #fafafa;--gantt-foreground: #18181b;--gantt-muted: #f4f4f5;--gantt-muted-foreground: #71717a;--gantt-border: #e4e4e7;--gantt-border-subtle: rgba(0, 0, 0, .04);--gantt-bar-bg: #c7c7cd;--gantt-bar-bg-hover: #b4b4bc;--gantt-bar-text: #18181b;--gantt-bar-shadow: none;--gantt-bar-shadow-hover: 0 1px 2px rgba(0, 0, 0, .08);--gantt-bar-shadow-drag: 0 4px 12px rgba(0, 0, 0, .16);--gantt-shadow-overlay: 0 4px 16px rgba(0, 0, 0, .15);--gantt-arrow: #a1a1aa;--gantt-accent: #3b82f6;--gantt-today-marker: #f43f5e;--gantt-summary-bg: #dcdce0;--gantt-summary-bg-hover: #cfcfd4;--gantt-progress-bg: #8e8e97;--gantt-progress-handle: #52525b;--gantt-non-working-bg: rgba(0, 0, 0, .035);--gantt-duration-fast: .15s;--gantt-transition-fast: .15s ease;--gantt-transition-normal: .2s ease}.gantt-container[data-theme=dark]{color-scheme:dark;--gantt-background: #09090b;--gantt-foreground: #fafafa;--gantt-muted: #18181b;--gantt-muted-foreground: #a1a1aa;--gantt-border: #27272a;--gantt-border-subtle: rgba(255, 255, 255, .04);--gantt-bar-bg: #3a3a41;--gantt-bar-bg-hover: #47474f;--gantt-bar-text: #fafafa;--gantt-bar-shadow: none;--gantt-bar-shadow-hover: 0 1px 2px rgba(0, 0, 0, .4);--gantt-bar-shadow-drag: 0 4px 12px rgba(0, 0, 0, .5);--gantt-shadow-overlay: 0 8px 24px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .08);--gantt-arrow: #71717a;--gantt-today-marker: #fb7185;--gantt-summary-bg: #2a2a2f;--gantt-summary-bg-hover: #35353c;--gantt-progress-bg: #6c6c76;--gantt-progress-handle: #a1a1aa;--gantt-non-working-bg: rgba(255, 255, 255, .03)}.gantt-container,.gantt-container *,.gantt-container *:before,.gantt-container *:after{box-sizing:border-box}.gantt-container{display:flex;flex-direction:column;overflow:hidden;isolation:isolate;background:var(--gantt-background);font-family:var(--gantt-font-sans);font-size:13px;line-height:1.5;color:var(--gantt-foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt-container:focus{outline:none}.gantt-main{position:relative;flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.gantt-scroll-container{position:relative;width:100%;flex:1;min-height:0;overflow:auto}.gantt-body{display:flex;align-items:stretch;width:max-content;min-width:100%;min-height:100%}.gantt-timeline{position:relative;flex:1 0 auto;display:flex;flex-direction:column;isolation:isolate}.gantt-grid{position:sticky;left:0;z-index:50;flex:none;display:flex;flex-direction:column;background:var(--gantt-background);border-right:1px solid var(--gantt-border)}.gantt-grid-header{position:sticky;top:0;flex:none;z-index:1;display:flex;align-items:flex-end;padding-bottom:6px;overflow:hidden;background:var(--gantt-background);border-bottom:1px solid var(--gantt-border)}.gantt-grid-header-cell{flex:1;min-width:0;padding:0 10px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--gantt-muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-body{position:relative}.gantt-grid-row{position:absolute;top:0;left:0;display:flex;width:100%;align-items:center;overflow:hidden;border-bottom:1px solid var(--gantt-border-subtle)}.gantt-grid-row:hover{background:var(--gantt-muted)}.gantt-grid-row.summary{font-weight:600}.gantt-grid-row.selected{background:var(--gantt-muted);box-shadow:inset 2px 0 0 var(--gantt-accent)}.gantt-grid-row.dragging{opacity:.45}.gantt-grid-cell{flex:1;display:flex;align-items:center;min-width:0;padding:0 10px;font-size:12px;color:var(--gantt-foreground)}.gantt-grid-cell-text{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-indent{flex:none}.gantt-grid-no{flex:none;min-width:2.25rem;margin-right:4px;font-size:11px;font-weight:400;font-variant-numeric:tabular-nums;color:var(--gantt-muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-expander{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:4px;padding:0;color:var(--gantt-muted-foreground);background:transparent;border:none;border-radius:3px;cursor:pointer}.gantt-grid-expander:hover{color:var(--gantt-foreground);background:var(--gantt-border)}.gantt-grid-expander:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:-2px}.gantt-grid-expander svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;transition:transform var(--gantt-transition-fast)}.gantt-grid-expander.open svg{transform:rotate(90deg)}.gantt-grid-expander-spacer{flex:none;width:20px}.gantt-grid-grip{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:4px;padding:0;color:var(--gantt-muted-foreground);background:transparent;border:none;border-radius:3px;opacity:0;cursor:grab;transition:opacity var(--gantt-transition-fast)}.gantt-grid-row:hover .gantt-grid-grip,.gantt-grid-row:focus-within .gantt-grid-grip{opacity:1}.gantt-grid-grip:active{cursor:grabbing}.gantt-grid-grip svg{width:12px;height:12px;fill:currentColor}.gantt-grid-grip-spacer{flex:none;width:20px}.gantt-grid-drop{position:absolute;left:0;right:0;height:2px;margin-top:-1px;color:var(--gantt-accent);background:currentColor;pointer-events:none}.gantt-grid-drop.child{height:auto;margin-top:0;background:none;border-radius:3px;box-shadow:inset 0 0 0 2px currentColor}.gantt-grid-drop.blocked{color:var(--gantt-today-marker)}.gantt-grid-splitter{position:absolute;top:0;bottom:0;z-index:60;width:5px;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.gantt-grid-splitter:hover,.gantt-grid-splitter:focus-visible{background:var(--gantt-accent);opacity:.5;outline:none}.gantt-grid-footer{flex:none;display:flex;align-items:center;height:34px;padding:0 6px;background:var(--gantt-background);border-top:1px solid var(--gantt-border);border-right:1px solid var(--gantt-border)}.gantt-grid-add{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;padding:5px 8px;font:inherit;font-size:12px;color:var(--gantt-muted-foreground);text-align:left;white-space:nowrap;overflow:hidden;background:transparent;border:none;border-radius:4px;cursor:pointer}.gantt-grid-add:hover{color:var(--gantt-foreground);background:var(--gantt-muted)}.gantt-grid-add:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:-2px}.gantt-grid-add svg{flex:none;width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}.gantt-drag-guides{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.gantt-drag-cell{position:absolute;top:44px;height:28px;display:flex;align-items:center;justify-content:center;background:var(--gantt-muted)}.gantt-drag-cell>span{flex:none;padding:0 6px;background:var(--gantt-muted);color:var(--gantt-foreground);font-family:inherit;font-size:11px;font-weight:500;line-height:28px;letter-spacing:.01em;white-space:nowrap}.gantt-drag-footprint{position:absolute;top:49px;height:18px;border-radius:6px;background:color-mix(in srgb,var(--gantt-foreground) 6%,transparent)}.gantt-holiday-labels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.gantt-holiday-band{position:absolute;top:0;bottom:0;pointer-events:auto}.gantt-holiday-cell{position:absolute;top:44px;height:28px;display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--gantt-muted);opacity:0;transition:opacity 90ms ease-out}.gantt-holiday-cell.shown,.gantt-holiday-band:hover .gantt-holiday-cell{opacity:1}@media(prefers-reduced-motion:reduce){.gantt-holiday-cell{transition:none}}.gantt-holiday-cell>span{padding:0 6px;color:var(--gantt-foreground);font-family:inherit;font-size:11px;font-weight:500;line-height:28px;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-scroll-container{scrollbar-width:thin;scrollbar-color:var(--gantt-border) transparent}.gantt-scroll-container::-webkit-scrollbar{width:10px;height:10px}.gantt-scroll-container::-webkit-scrollbar-track{background:transparent}.gantt-scroll-container::-webkit-scrollbar-thumb{background:var(--gantt-border);border-radius:5px;border:2px solid var(--gantt-background)}.gantt-scroll-container::-webkit-scrollbar-thumb:hover{background:var(--gantt-muted-foreground)}.gantt-scroll-container::-webkit-scrollbar-corner{background:transparent}.gantt-header-wrapper{position:sticky;top:0;flex:none;z-index:30;min-width:100%}.gantt-header{position:relative;min-width:100%;background:var(--gantt-background);border-bottom:1px solid var(--gantt-border)}.gantt-header-content{display:flex;flex-direction:column}.gantt-top-header{position:relative;display:flex;height:44px;border-bottom:1px solid var(--gantt-border-subtle)}.gantt-top-groups{display:flex}.gantt-top-group{--top-group-inset: 16px;display:flex;align-items:center;padding:0 var(--top-group-inset);font-size:13px;font-weight:600;letter-spacing:-.01em;background:var(--gantt-background);color:var(--gantt-foreground)}.gantt-top-group-label{position:sticky;left:calc(var(--gantt-pane-inset, 0px) + var(--top-group-inset));margin:0;padding:0;white-space:nowrap;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis}.gantt-bottom-row{display:flex;height:28px;background:var(--gantt-muted)}.gantt-bottom-cell{display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:500;color:var(--gantt-muted-foreground);letter-spacing:.01em}.gantt-content{position:relative;min-width:100%;background:var(--gantt-background)}.gantt-non-working-layer{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.gantt-non-working-range{position:absolute;top:0;bottom:0;background:var(--gantt-non-working-bg)}.gantt-rows{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.gantt-task-row{position:absolute;top:0;left:0;display:flex;width:100%;align-items:center;border-bottom:1px solid var(--gantt-border-subtle);pointer-events:none}.gantt-content,.gantt-grid-body{flex:1 0 auto;background-image:repeating-linear-gradient(to bottom,transparent 0,transparent calc(var(--gantt-row-height) - 1px),var(--gantt-border-subtle) calc(var(--gantt-row-height) - 1px),var(--gantt-border-subtle) var(--gantt-row-height))}.gantt-today-marker{position:absolute;top:0;bottom:0;width:1px;background:var(--gantt-today-marker);opacity:.6;pointer-events:none}.gantt-today-dot{position:absolute;bottom:0;width:6px;height:6px;border-radius:50%;background:var(--gantt-today-marker);transform:translate(-50%,50%);pointer-events:none}.gantt-dependency-arrows{position:absolute;top:0;left:0;width:100%;pointer-events:none;z-index:0}.gantt-dependency-arrows.linking{z-index:45}.gantt-dependency-arrows.linking .gantt-dependency-hit,.gantt-dependency-arrows.linking .gantt-dependency-delete{pointer-events:none}.gantt-dependency-arrow{stroke:var(--gantt-arrow);stroke-width:1.5;fill:none;opacity:.45}.gantt-dependency-arrow.selected,.gantt-dependency-arrow.related,.gantt-dependency-hit:hover+.gantt-dependency-arrow{opacity:1}.gantt-dependency-arrow.selected{stroke:var(--gantt-accent);stroke-width:2.5}.gantt-dependency-arrow-head{fill:var(--gantt-arrow);stroke:none}.gantt-dependency-hit{stroke:transparent;stroke-width:12;fill:none;cursor:pointer;pointer-events:stroke}.gantt-dependency-hit:hover+.gantt-dependency-arrow{stroke:var(--gantt-accent)}.gantt-dependency-delete{cursor:pointer;pointer-events:auto}.gantt-dependency-delete circle{fill:var(--gantt-accent)}.gantt-dependency-delete path{stroke:#fff;stroke-width:1.6;stroke-linecap:round}.gantt-link-handle{position:absolute;top:50%;width:12px;height:12px;background:var(--gantt-background);border:2px solid var(--gantt-accent);border-radius:50%;transform:translateY(-50%);opacity:0;cursor:crosshair;touch-action:none;pointer-events:none;transition:opacity var(--gantt-transition-fast)}.gantt-link-handle.start{left:-18px}.gantt-link-handle.end{right:-18px}.gantt-link-handle:before{content:"";position:absolute}.gantt-link-handle.start:before{top:-8px;right:-6px;bottom:-8px;left:-8px}.gantt-link-handle.end:before{top:-8px;right:-8px;bottom:-8px;left:-6px}.gantt-task-bar:hover .gantt-link-handle,.gantt-task-bar.selected .gantt-link-handle{opacity:1;pointer-events:auto}.gantt-task-bar.link-source.link-at-start .gantt-link-handle.start,.gantt-task-bar.link-source.link-at-end .gantt-link-handle.end{opacity:1}@media(hover:none){.gantt-link-handle{opacity:.55;pointer-events:auto}}.gantt-task-bar.link-valid,.gantt-task-bar.link-invalid{outline:2px solid var(--gantt-accent);outline-offset:2px}.gantt-task-bar.link-valid{background:var(--gantt-bar-color-hover, var(--gantt-bar-bg-hover));box-shadow:0 0 0 4px color-mix(in srgb,var(--gantt-accent) 25%,transparent)}.gantt-task-bar.link-invalid{outline-color:var(--gantt-today-marker);box-shadow:none}.gantt-task-bar.link-valid .gantt-link-handle.start,.gantt-task-bar.link-valid .gantt-link-handle.end{opacity:0}.gantt-task-bar.link-valid.link-at-start .gantt-link-handle.start,.gantt-task-bar.link-valid.link-at-end .gantt-link-handle.end{opacity:1;background:var(--gantt-accent)}.gantt-link-preview-line{stroke:var(--gantt-accent);stroke-width:2;stroke-dasharray:4 3;fill:none}.gantt-link-preview-line.armed{stroke-dasharray:none;stroke-width:2.5}.gantt-link-preview-line.invalid{stroke:var(--gantt-today-marker)}.gantt-link-preview-origin{fill:var(--gantt-accent)}.gantt-link-preview-type{fill:var(--gantt-accent);font-family:inherit;font-size:11px;font-weight:600;letter-spacing:.04em;paint-order:stroke;stroke:var(--gantt-background);stroke-width:3px;stroke-linejoin:round}.gantt-link-preview-reason{fill:var(--gantt-today-marker);font-family:inherit;font-size:11px;font-weight:500;paint-order:stroke;stroke:var(--gantt-background);stroke-width:3px;stroke-linejoin:round}.gantt-content.drawable{cursor:crosshair}.gantt-draw-ghost{position:absolute;top:0;left:0;background:var(--gantt-accent);opacity:.35;border:1px dashed var(--gantt-accent);border-radius:6px;pointer-events:none;z-index:5}.gantt-bar-wrap:has(>.gantt-task-bar.has-tooltip){z-index:1}.gantt-bar-wrap:has(>.gantt-task-bar.dragging){z-index:2}.gantt-task-bar{position:relative;touch-action:pan-x pan-y;display:flex;align-items:center;background:var(--gantt-bar-color, var(--gantt-bar-bg));border-radius:6px;-webkit-user-select:none;user-select:none;cursor:grab;box-shadow:var(--gantt-bar-shadow);transition:background var(--gantt-transition-fast),box-shadow var(--gantt-transition-normal)}.gantt-task-bar:before,.gantt-task-bar:after{content:"";position:absolute;top:50%;width:3px;height:12px;background:var(--gantt-muted-foreground);border-radius:2px;opacity:0;transform:translateY(-50%);transition:opacity var(--gantt-transition-fast)}.gantt-task-bar:before{left:4px}.gantt-task-bar:after{right:4px}.gantt-task-bar:hover{background:var(--gantt-bar-color-hover, var(--gantt-bar-bg-hover));box-shadow:var(--gantt-bar-shadow-hover)}.gantt-task-bar:hover:before,.gantt-task-bar:hover:after{opacity:.5}.gantt-task-bar:active,.gantt-task-bar.dragging{cursor:grabbing;box-shadow:var(--gantt-bar-shadow-drag)}.gantt-task-bar.summary{background:var(--gantt-bar-color, var(--gantt-summary-bg));border-radius:3px}.gantt-task-bar.summary:hover{background:var(--gantt-bar-color-hover, var(--gantt-summary-bg-hover))}.gantt-task-bar.summary .gantt-progress-fill{background:var(--gantt-progress-color, var(--gantt-foreground));opacity:.25}.gantt-task-bar.selected{outline:2px solid var(--gantt-accent);outline-offset:2px}.gantt-task-bar.compact:before,.gantt-task-bar.compact:after,.gantt-task-bar.compact:hover:before,.gantt-task-bar.compact:hover:after,.gantt-task-bar.compact.dragging:before,.gantt-task-bar.compact.dragging:after,.gantt-task-bar.no-resize:before,.gantt-task-bar.no-resize:after,.gantt-task-bar.no-resize:hover:before,.gantt-task-bar.no-resize:hover:after,.gantt-task-bar.no-resize.dragging:before,.gantt-task-bar.no-resize.dragging:after{opacity:0}.gantt-progress-fill{position:absolute;top:0;left:0;bottom:0;background:var(--gantt-progress-color, var(--gantt-progress-bg));border-radius:inherit;pointer-events:none}.gantt-progress-handle{position:absolute;top:50%;width:10px;height:10px;margin-left:-5px;background:var(--gantt-background);border:2px solid var(--gantt-progress-handle);border-radius:50%;transform:translateY(-50%);opacity:0;cursor:ew-resize;transition:opacity var(--gantt-transition-fast)}.gantt-task-bar:hover .gantt-progress-handle,.gantt-progress-handle.dragging{opacity:1}@media(hover:none){.gantt-progress-handle{opacity:1}.gantt-progress-handle:before{content:"";position:absolute;top:-17px;right:-17px;bottom:-17px;left:-17px}}.gantt-task-name{position:relative;flex:1;padding:0 14px;font-family:inherit;font-size:12px;font-weight:500;color:var(--gantt-bar-text-color, var(--gantt-bar-text));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.gantt-task-name.outside{position:absolute;left:100%;flex:none;padding:0 0 0 8px;color:var(--gantt-muted-foreground);max-width:160px;overflow:hidden;text-overflow:ellipsis}.gantt-task-bar:hover .gantt-task-name.outside,.gantt-task-bar.selected .gantt-task-name.outside,.gantt-task-bar.dragging .gantt-task-name.outside{color:var(--gantt-foreground)}.gantt-bar-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%);padding:8px 12px;background:var(--gantt-foreground);color:var(--gantt-background);border-radius:6px;font-family:inherit;font-size:11px;font-weight:500;white-space:nowrap;box-shadow:var(--gantt-shadow-overlay);pointer-events:none;animation:tooltipFadeIn var(--gantt-duration-fast) ease-out}@keyframes tooltipFadeIn{0%{opacity:0;transform:translate(-50%) translateY(-4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.gantt-bar-tooltip-detail{display:flex;flex-direction:column;gap:2px;text-align:left}.gantt-tooltip-name{font-weight:600}.gantt-tooltip-meta{opacity:.75}.gantt-bar-tooltip:after{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:var(--gantt-foreground)}@media(max-width:768px){.gantt-top-group{--top-group-inset: 12px;font-size:12px}.gantt-bottom-cell{font-size:10px}.gantt-task-name{font-size:11px;padding:0 10px}}.gantt-grid-lane-count{flex:none;padding:0 6px;border-radius:999px;background:var(--gantt-border);color:var(--gantt-muted-foreground);font-size:10px;font-weight:600;line-height:16px}.gantt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.gantt-container [data-gantt-cell]:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}@media(prefers-reduced-motion:reduce){.gantt-container *,.gantt-container *:before,.gantt-container *:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}}.gantt-layout{display:flex;flex:1;min-height:0}.gantt-detail{position:relative;flex:0 0 0px;display:flex;flex-direction:column;gap:12px;padding:16px 0;overflow:hidden auto;border-left:0 solid var(--gantt-border);background:var(--gantt-background);color:var(--gantt-foreground);transition:flex-basis .2s ease,padding .2s ease,border-left-width .2s ease}.gantt-detail-open{flex-basis:var(--gantt-detail-width);padding:16px;border-left-width:1px}.gantt-detail>*{min-width:calc(var(--gantt-detail-width) - 32px)}.gantt-detail-header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.gantt-detail-title{margin:0;font-size:14px;font-weight:600;line-height:1.4}.gantt-detail-close{flex:0 0 auto;padding:2px 6px;border:none;border-radius:4px;background:none;color:var(--gantt-muted-foreground);font-size:13px;line-height:1;cursor:pointer}.gantt-detail-close:hover{background:var(--gantt-muted);color:var(--gantt-foreground)}.gantt-detail-close:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}.gantt-detail-fields{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:8px 16px;margin:0;font-size:12px}.gantt-detail-fields dt{color:var(--gantt-muted-foreground)}.gantt-detail-fields dd{margin:0;overflow-wrap:anywhere}.gantt-detail-input{padding:2px 6px;border:1px solid var(--gantt-border);border-radius:4px;background:var(--gantt-background);color:var(--gantt-foreground);font:inherit;font-size:12px}.gantt-detail-input:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}.gantt-detail-header .gantt-detail-input{flex:1;min-width:0;font-size:14px;font-weight:600}.gantt-detail-fields .gantt-detail-input{width:100%}
|
|
1
|
+
.gantt-container{color-scheme:light;--gantt-detail-width: 320px;--gantt-font-sans: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Segoe UI", "Geist", system-ui, sans-serif;--gantt-background: #fafafa;--gantt-foreground: #18181b;--gantt-muted: #f4f4f5;--gantt-muted-foreground: #71717a;--gantt-border: #e4e4e7;--gantt-border-subtle: rgba(0, 0, 0, .04);--gantt-bar-bg: #c7c7cd;--gantt-bar-bg-hover: #b4b4bc;--gantt-bar-text: #18181b;--gantt-bar-shadow: none;--gantt-bar-shadow-hover: 0 1px 2px rgba(0, 0, 0, .08);--gantt-bar-shadow-drag: 0 4px 12px rgba(0, 0, 0, .16);--gantt-shadow-overlay: 0 4px 16px rgba(0, 0, 0, .15);--gantt-arrow: #a1a1aa;--gantt-accent: #3b82f6;--gantt-today-marker: #f43f5e;--gantt-summary-bg: #dcdce0;--gantt-summary-bg-hover: #cfcfd4;--gantt-progress-bg: #8e8e97;--gantt-progress-handle: #52525b;--gantt-non-working-bg: rgba(0, 0, 0, .035);--gantt-duration-fast: .15s;--gantt-transition-fast: .15s ease;--gantt-transition-normal: .2s ease}.gantt-container[data-theme=dark]{color-scheme:dark;--gantt-background: #09090b;--gantt-foreground: #fafafa;--gantt-muted: #18181b;--gantt-muted-foreground: #a1a1aa;--gantt-border: #27272a;--gantt-border-subtle: rgba(255, 255, 255, .04);--gantt-bar-bg: #3a3a41;--gantt-bar-bg-hover: #47474f;--gantt-bar-text: #fafafa;--gantt-bar-shadow: none;--gantt-bar-shadow-hover: 0 1px 2px rgba(0, 0, 0, .4);--gantt-bar-shadow-drag: 0 4px 12px rgba(0, 0, 0, .5);--gantt-shadow-overlay: 0 8px 24px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .08);--gantt-arrow: #71717a;--gantt-today-marker: #fb7185;--gantt-summary-bg: #2a2a2f;--gantt-summary-bg-hover: #35353c;--gantt-progress-bg: #6c6c76;--gantt-progress-handle: #a1a1aa;--gantt-non-working-bg: rgba(255, 255, 255, .03)}.gantt-container,.gantt-container *,.gantt-container *:before,.gantt-container *:after{box-sizing:border-box}.gantt-container{display:flex;flex-direction:column;overflow:hidden;isolation:isolate;background:var(--gantt-background);font-family:var(--gantt-font-sans);font-size:13px;line-height:1.5;color:var(--gantt-foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt-container:focus{outline:none}.gantt-main{position:relative;flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.gantt-scroll-container{position:relative;width:100%;flex:1;min-height:0;overflow:auto}.gantt-body{display:flex;align-items:stretch;width:max-content;min-width:100%;min-height:100%}.gantt-timeline{position:relative;flex:1 0 auto;display:flex;flex-direction:column;isolation:isolate}.gantt-grid{position:sticky;left:0;z-index:50;flex:none;display:flex;flex-direction:column;background:var(--gantt-background);border-right:1px solid var(--gantt-border)}.gantt-grid-header{position:sticky;top:0;flex:none;z-index:1;display:flex;align-items:flex-end;padding-bottom:6px;overflow:hidden;background:var(--gantt-background);border-bottom:1px solid var(--gantt-border)}.gantt-grid-header-cell{flex:1;min-width:0;padding:0 10px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--gantt-muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-body{position:relative}.gantt-grid-row{position:absolute;top:0;left:0;display:flex;width:100%;align-items:center;overflow:hidden;border-bottom:1px solid var(--gantt-border-subtle)}.gantt-grid-row:hover{background:var(--gantt-muted)}.gantt-grid-row.summary{font-weight:600}.gantt-grid-row.selected{background:var(--gantt-muted);box-shadow:inset 2px 0 0 var(--gantt-accent)}.gantt-grid-row.dragging{opacity:.45}.gantt-grid-cell{flex:1;display:flex;align-items:center;min-width:0;padding:0 10px;font-size:12px;color:var(--gantt-foreground)}.gantt-grid-cell-text{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-indent{flex:none}.gantt-grid-no{flex:none;min-width:2.25rem;margin-right:4px;font-size:11px;font-weight:400;font-variant-numeric:tabular-nums;color:var(--gantt-muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-grid-expander{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:4px;padding:0;color:var(--gantt-muted-foreground);background:transparent;border:none;border-radius:3px;cursor:pointer}.gantt-grid-expander:hover{color:var(--gantt-foreground);background:var(--gantt-border)}.gantt-grid-expander:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:-2px}.gantt-grid-expander svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;transition:transform var(--gantt-transition-fast)}.gantt-grid-expander.open svg{transform:rotate(90deg)}.gantt-grid-expander-spacer{flex:none;width:20px}.gantt-grid-grip{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:4px;padding:0;color:var(--gantt-muted-foreground);background:transparent;border:none;border-radius:3px;opacity:0;cursor:grab;transition:opacity var(--gantt-transition-fast)}.gantt-grid-row:hover .gantt-grid-grip,.gantt-grid-row:focus-within .gantt-grid-grip{opacity:1}.gantt-grid-grip:active{cursor:grabbing}.gantt-grid-grip svg{width:12px;height:12px;fill:currentColor}.gantt-grid-grip-spacer{flex:none;width:20px}.gantt-grid-drop{position:absolute;left:0;right:0;height:2px;margin-top:-1px;color:var(--gantt-accent);background:currentColor;pointer-events:none}.gantt-grid-drop.child{height:auto;margin-top:0;background:none;border-radius:3px;box-shadow:inset 0 0 0 2px currentColor}.gantt-grid-drop.blocked{color:var(--gantt-today-marker)}.gantt-grid-splitter{position:absolute;top:0;bottom:0;z-index:60;width:5px;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.gantt-grid-splitter:hover,.gantt-grid-splitter:focus-visible{background:var(--gantt-accent);opacity:.5;outline:none}.gantt-grid-footer{flex:none;display:flex;align-items:center;height:34px;padding:0 6px;background:var(--gantt-background);border-top:1px solid var(--gantt-border);border-right:1px solid var(--gantt-border)}.gantt-grid-add{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;padding:5px 8px;font:inherit;font-size:12px;color:var(--gantt-muted-foreground);text-align:left;white-space:nowrap;overflow:hidden;background:transparent;border:none;border-radius:4px;cursor:pointer}.gantt-grid-add:hover{color:var(--gantt-foreground);background:var(--gantt-muted)}.gantt-grid-add:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:-2px}.gantt-grid-add svg{flex:none;width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}.gantt-drag-guides{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.gantt-drag-cell{position:absolute;top:44px;height:28px;display:flex;align-items:center;justify-content:center;background:var(--gantt-muted)}.gantt-drag-cell>span{flex:none;padding:0 6px;background:var(--gantt-muted);color:var(--gantt-foreground);font-family:inherit;font-size:11px;font-weight:500;line-height:28px;letter-spacing:.01em;white-space:nowrap}.gantt-drag-footprint{position:absolute;top:49px;height:18px;border-radius:6px;background:color-mix(in srgb,var(--gantt-foreground) 6%,transparent)}.gantt-holiday-labels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.gantt-holiday-band{position:absolute;top:0;bottom:0;pointer-events:auto}.gantt-holiday-cell{position:absolute;top:44px;height:28px;display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--gantt-muted);opacity:0;transition:opacity 90ms ease-out}.gantt-holiday-cell.shown,.gantt-holiday-band:hover .gantt-holiday-cell{opacity:1}@media(prefers-reduced-motion:reduce){.gantt-holiday-cell{transition:none}}.gantt-holiday-cell>span{padding:0 6px;color:var(--gantt-foreground);font-family:inherit;font-size:11px;font-weight:500;line-height:28px;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-scroll-container{scrollbar-width:thin;scrollbar-color:var(--gantt-border) transparent}.gantt-scroll-container::-webkit-scrollbar{width:10px;height:10px}.gantt-scroll-container::-webkit-scrollbar-track{background:transparent}.gantt-scroll-container::-webkit-scrollbar-thumb{background:var(--gantt-border);border-radius:5px;border:2px solid var(--gantt-background)}.gantt-scroll-container::-webkit-scrollbar-thumb:hover{background:var(--gantt-muted-foreground)}.gantt-scroll-container::-webkit-scrollbar-corner{background:transparent}.gantt-header-wrapper{position:sticky;top:0;flex:none;z-index:30;min-width:100%}.gantt-header{position:relative;min-width:100%;background:var(--gantt-background);border-bottom:1px solid var(--gantt-border)}.gantt-header-content{display:flex;flex-direction:column}.gantt-top-header{position:relative;display:flex;height:44px;border-bottom:1px solid var(--gantt-border-subtle)}.gantt-top-groups{display:flex}.gantt-top-group{--top-group-inset: 16px;display:flex;align-items:center;padding:0 var(--top-group-inset);font-size:13px;font-weight:600;letter-spacing:-.01em;background:var(--gantt-background);color:var(--gantt-foreground)}.gantt-top-group-label{position:sticky;left:calc(var(--gantt-pane-inset, 0px) + var(--top-group-inset));margin:0;padding:0;white-space:nowrap;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis}.gantt-bottom-row{display:flex;height:28px;background:var(--gantt-muted)}.gantt-bottom-cell{display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:500;color:var(--gantt-muted-foreground);letter-spacing:.01em}.gantt-content{position:relative;min-width:100%;background:var(--gantt-background)}.gantt-non-working-layer{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.gantt-non-working-range{position:absolute;top:0;bottom:0;background:var(--gantt-non-working-bg)}.gantt-rows{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.gantt-task-row{position:absolute;top:0;left:0;display:flex;width:100%;align-items:center;border-bottom:1px solid var(--gantt-border-subtle);pointer-events:none}.gantt-content,.gantt-grid-body{flex:1 0 auto;background-image:repeating-linear-gradient(to bottom,transparent 0,transparent calc(var(--gantt-row-height) - 1px),var(--gantt-border-subtle) calc(var(--gantt-row-height) - 1px),var(--gantt-border-subtle) var(--gantt-row-height))}.gantt-today-marker{position:absolute;top:0;bottom:0;width:1px;background:var(--gantt-today-marker);opacity:.6;pointer-events:none}.gantt-today-dot{position:absolute;bottom:0;width:6px;height:6px;border-radius:50%;background:var(--gantt-today-marker);transform:translate(-50%,50%);pointer-events:none}.gantt-dependency-arrows{position:absolute;top:0;left:0;width:100%;pointer-events:none;z-index:0}.gantt-dependency-arrows.linking{z-index:45}.gantt-dependency-arrows.linking .gantt-dependency-hit,.gantt-dependency-arrows.linking .gantt-dependency-delete{pointer-events:none}.gantt-dependency-arrow{stroke:var(--gantt-arrow);stroke-width:1.5;fill:none;opacity:.45}.gantt-dependency-arrow.selected,.gantt-dependency-arrow.related,.gantt-dependency-hit:hover+.gantt-dependency-arrow{opacity:1}.gantt-dependency-arrow.selected{stroke:var(--gantt-accent);stroke-width:2.5}.gantt-dependency-arrow-head{fill:var(--gantt-arrow);stroke:none}.gantt-dependency-hit{stroke:transparent;stroke-width:12;fill:none;cursor:pointer;pointer-events:stroke}.gantt-dependency-hit:hover+.gantt-dependency-arrow{stroke:var(--gantt-accent)}.gantt-dependency-delete{cursor:pointer;pointer-events:auto}.gantt-dependency-delete circle{fill:var(--gantt-accent)}.gantt-dependency-delete path{stroke:#fff;stroke-width:1.6;stroke-linecap:round}.gantt-link-handle{position:absolute;top:50%;width:12px;height:12px;background:var(--gantt-background);border:2px solid var(--gantt-accent);border-radius:50%;transform:translateY(-50%);opacity:0;cursor:crosshair;touch-action:none;pointer-events:none;transition:opacity var(--gantt-transition-fast)}.gantt-link-handle.start{left:-18px}.gantt-link-handle.end{right:-18px}.gantt-link-handle:before{content:"";position:absolute}.gantt-link-handle.start:before{top:-8px;right:-6px;bottom:-8px;left:-8px}.gantt-link-handle.end:before{top:-8px;right:-8px;bottom:-8px;left:-6px}.gantt-task-bar:hover .gantt-link-handle,.gantt-task-bar.selected .gantt-link-handle{opacity:1;pointer-events:auto}.gantt-task-bar.link-source.link-at-start .gantt-link-handle.start,.gantt-task-bar.link-source.link-at-end .gantt-link-handle.end{opacity:1}@media(hover:none){.gantt-link-handle{opacity:.55;pointer-events:auto}}.gantt-task-bar.link-valid,.gantt-task-bar.link-invalid{outline:2px solid var(--gantt-accent);outline-offset:2px}.gantt-task-bar.link-valid{background:var(--gantt-bar-color-hover, var(--gantt-bar-bg-hover));box-shadow:0 0 0 4px color-mix(in srgb,var(--gantt-accent) 25%,transparent)}.gantt-task-bar.link-invalid{outline-color:var(--gantt-today-marker);box-shadow:none}.gantt-task-bar.link-valid .gantt-link-handle.start,.gantt-task-bar.link-valid .gantt-link-handle.end{opacity:0}.gantt-task-bar.link-valid.link-at-start .gantt-link-handle.start,.gantt-task-bar.link-valid.link-at-end .gantt-link-handle.end{opacity:1;background:var(--gantt-accent)}.gantt-link-preview-line{stroke:var(--gantt-accent);stroke-width:2;stroke-dasharray:4 3;fill:none}.gantt-link-preview-line.armed{stroke-dasharray:none;stroke-width:2.5}.gantt-link-preview-line.invalid{stroke:var(--gantt-today-marker)}.gantt-link-preview-origin{fill:var(--gantt-accent)}.gantt-link-preview-type{fill:var(--gantt-accent);font-family:inherit;font-size:11px;font-weight:600;letter-spacing:.04em;paint-order:stroke;stroke:var(--gantt-background);stroke-width:3px;stroke-linejoin:round}.gantt-link-preview-reason{fill:var(--gantt-today-marker);font-family:inherit;font-size:11px;font-weight:500;paint-order:stroke;stroke:var(--gantt-background);stroke-width:3px;stroke-linejoin:round}.gantt-content.drawable{cursor:crosshair}.gantt-draw-ghost{position:absolute;top:0;left:0;background:var(--gantt-accent);opacity:.35;border:1px dashed var(--gantt-accent);border-radius:6px;pointer-events:none;z-index:5}.gantt-bar-wrap{position:absolute;top:0;left:0;display:flex;align-items:center}.gantt-bar-wrap:has(>.gantt-task-bar.has-tooltip){z-index:1}.gantt-bar-wrap:has(>.gantt-task-bar.dragging){z-index:2}.gantt-task-bar{position:relative;touch-action:pan-x pan-y;display:flex;align-items:center;background:var(--gantt-bar-color, var(--gantt-bar-bg));border-radius:6px;-webkit-user-select:none;user-select:none;box-shadow:var(--gantt-bar-shadow);transition:background var(--gantt-transition-fast),box-shadow var(--gantt-transition-normal)}.gantt-task-bar:before,.gantt-task-bar:after{content:"";position:absolute;top:50%;width:3px;height:12px;background:var(--gantt-muted-foreground);border-radius:2px;opacity:0;transform:translateY(-50%);transition:opacity var(--gantt-transition-fast)}.gantt-task-bar:before{left:4px}.gantt-task-bar:after{right:4px}.gantt-task-bar:hover{background:var(--gantt-bar-color-hover, var(--gantt-bar-bg-hover));box-shadow:var(--gantt-bar-shadow-hover)}.gantt-task-bar:hover:before,.gantt-task-bar:hover:after{opacity:.5}.gantt-task-bar:active,.gantt-task-bar.dragging{box-shadow:var(--gantt-bar-shadow-drag)}.gantt-task-bar.summary{background:var(--gantt-bar-color, var(--gantt-summary-bg));border-radius:3px}.gantt-task-bar.summary:hover{background:var(--gantt-bar-color-hover, var(--gantt-summary-bg-hover))}.gantt-task-bar.summary .gantt-progress-fill{background:var(--gantt-progress-color, var(--gantt-foreground));opacity:.25}.gantt-task-bar.selected{outline:2px solid var(--gantt-accent);outline-offset:2px}.gantt-task-bar.compact:before,.gantt-task-bar.compact:after,.gantt-task-bar.no-resize:before,.gantt-task-bar.no-resize:after{opacity:0}.gantt-progress-fill{position:absolute;top:0;left:0;bottom:0;background:var(--gantt-progress-color, var(--gantt-progress-bg));border-radius:inherit;pointer-events:none}.gantt-progress-handle{position:absolute;top:50%;width:10px;height:10px;margin-left:-5px;background:var(--gantt-background);border:2px solid var(--gantt-progress-handle);border-radius:50%;transform:translateY(-50%);opacity:0;cursor:ew-resize;transition:opacity var(--gantt-transition-fast)}.gantt-task-bar:hover .gantt-progress-handle,.gantt-progress-handle.dragging{opacity:1}@media(hover:none){.gantt-progress-handle{opacity:1}.gantt-progress-handle:before{content:"";position:absolute;top:-17px;right:-17px;bottom:-17px;left:-17px}}.gantt-task-name{position:relative;flex:1;padding:0 14px;font-family:inherit;font-size:12px;font-weight:500;color:var(--gantt-bar-text-color, var(--gantt-bar-text));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.gantt-task-name.outside{position:absolute;left:100%;flex:none;padding:0 0 0 8px;color:var(--gantt-muted-foreground);max-width:160px;overflow:hidden;text-overflow:ellipsis}.gantt-task-bar:hover .gantt-task-name.outside,.gantt-task-bar.selected .gantt-task-name.outside,.gantt-task-bar.dragging .gantt-task-name.outside{color:var(--gantt-foreground)}.gantt-bar-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%);padding:8px 12px;background:var(--gantt-foreground);color:var(--gantt-background);border-radius:6px;font-family:inherit;font-size:11px;font-weight:500;white-space:nowrap;box-shadow:var(--gantt-shadow-overlay);pointer-events:none;animation:tooltipFadeIn var(--gantt-duration-fast) ease-out}@keyframes tooltipFadeIn{0%{opacity:0;transform:translate(-50%) translateY(-4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.gantt-bar-tooltip-detail{display:flex;flex-direction:column;gap:2px;text-align:left}.gantt-tooltip-name{font-weight:600}.gantt-tooltip-meta{opacity:.75}.gantt-bar-tooltip:after{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:var(--gantt-foreground)}@media(max-width:768px){.gantt-top-group{--top-group-inset: 12px;font-size:12px}.gantt-bottom-cell{font-size:10px}.gantt-task-name{font-size:11px;padding:0 10px}}.gantt-grid-lane-count{flex:none;padding:0 6px;border-radius:999px;background:var(--gantt-border);color:var(--gantt-muted-foreground);font-size:10px;font-weight:600;line-height:16px}.gantt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.gantt-container [data-gantt-cell]:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}@media(prefers-reduced-motion:reduce){.gantt-container *,.gantt-container *:before,.gantt-container *:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}}.gantt-layout{display:flex;flex:1;min-height:0}.gantt-detail{position:relative;flex:0 0 0px;display:flex;flex-direction:column;gap:12px;padding:16px 0;overflow:hidden auto;border-left:0 solid var(--gantt-border);background:var(--gantt-background);color:var(--gantt-foreground);transition:flex-basis .2s ease,padding .2s ease,border-left-width .2s ease}.gantt-detail-open{flex-basis:var(--gantt-detail-width);padding:16px;border-left-width:1px}.gantt-detail>*{min-width:calc(var(--gantt-detail-width) - 32px)}.gantt-detail-header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.gantt-detail-title{margin:0;font-size:14px;font-weight:600;line-height:1.4}.gantt-detail-close{flex:0 0 auto;padding:2px 6px;border:none;border-radius:4px;background:none;color:var(--gantt-muted-foreground);font-size:13px;line-height:1;cursor:pointer}.gantt-detail-close:hover{background:var(--gantt-muted);color:var(--gantt-foreground)}.gantt-detail-close:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}.gantt-detail-fields{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:8px 16px;margin:0;font-size:12px}.gantt-detail-fields dt{color:var(--gantt-muted-foreground)}.gantt-detail-fields dd{margin:0;overflow-wrap:anywhere}.gantt-detail-input{padding:2px 6px;border:1px solid var(--gantt-border);border-radius:4px;background:var(--gantt-background);color:var(--gantt-foreground);font:inherit;font-size:12px}.gantt-detail-input:focus-visible{outline:2px solid var(--gantt-accent);outline-offset:1px}.gantt-detail-header .gantt-detail-input{flex:1;min-width:0;font-size:14px;font-weight:600}.gantt-detail-fields .gantt-detail-input{width:100%}
|