@jaeungkim/gantt-chart 0.3.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -124
  3. package/dist/Gantt.d.ts +5 -0
  4. package/dist/bars/components/GanttBar.d.ts +20 -0
  5. package/dist/bars/components/GanttBarsLayer.d.ts +24 -0
  6. package/dist/bars/components/GanttDragGuides.d.ts +1 -0
  7. package/dist/bars/hooks/useGanttBarDrag.d.ts +16 -0
  8. package/dist/bars/hooks/useGanttDrawCreate.d.ts +25 -0
  9. package/dist/bars/hooks/useGanttProgressDrag.d.ts +11 -0
  10. package/dist/core/calendar.d.ts +27 -0
  11. package/dist/core/dates.d.ts +16 -0
  12. package/dist/core/index.d.ts +3 -0
  13. package/dist/core/reorder.d.ts +55 -0
  14. package/dist/core/tree.d.ts +34 -0
  15. package/dist/core/types.d.ts +43 -0
  16. package/dist/dependencies/components/GanttDependencyArrows.d.ts +13 -0
  17. package/dist/dependencies/hooks/useGanttLinkDrag.d.ts +20 -0
  18. package/dist/dependencies/utils/arrowPath.d.ts +20 -0
  19. package/dist/dependencies/utils/link.d.ts +17 -0
  20. package/dist/detail/components/GanttDetailPanel.d.ts +21 -0
  21. package/dist/detail/hooks/useGanttDetail.d.ts +42 -0
  22. package/dist/detail/utils/edit.d.ts +21 -0
  23. package/dist/gantt-chart.css +1 -1
  24. package/dist/index.cjs +1 -0
  25. package/dist/index.d.cts +11 -0
  26. package/dist/index.d.ts +11 -51
  27. package/dist/index.js +4749 -0
  28. package/dist/interaction/hooks/useGanttInteraction.d.ts +2 -0
  29. package/dist/interaction/hooks/useGanttKeyboardNav.d.ts +33 -0
  30. package/dist/interaction/hooks/useGanttSelection.d.ts +12 -0
  31. package/dist/interaction/utils/a11y.d.ts +84 -0
  32. package/dist/props.d.ts +121 -0
  33. package/dist/rows/components/GanttRowsLayer.d.ts +13 -0
  34. package/dist/rows/hooks/useGanttCollapse.d.ts +18 -0
  35. package/dist/rows/hooks/useGanttRowModel.d.ts +19 -0
  36. package/dist/rows/utils/rows.d.ts +21 -0
  37. package/dist/shared/constants.d.ts +24 -0
  38. package/dist/shared/context.d.ts +4 -0
  39. package/dist/shared/hooks/useLatestRef.d.ts +2 -0
  40. package/dist/shared/hooks/useResolvedTheme.d.ts +8 -0
  41. package/dist/shared/store.d.ts +81 -0
  42. package/dist/shared/task.d.ts +55 -0
  43. package/dist/shared/types.d.ts +115 -0
  44. package/dist/shared/utils/holidays.d.ts +12 -0
  45. package/dist/shared/utils/i18n.d.ts +5 -0
  46. package/dist/shared/utils/pointerGesture.d.ts +11 -0
  47. package/dist/shared/virtual/axis.d.ts +13 -0
  48. package/dist/shared/virtual/useVirtualWindow.d.ts +16 -0
  49. package/dist/shared/virtual/window.d.ts +30 -0
  50. package/dist/task-list/components/GanttGridSplitter.d.ts +6 -0
  51. package/dist/task-list/components/GanttTaskAddRow.d.ts +7 -0
  52. package/dist/task-list/components/GanttTaskGrid.d.ts +24 -0
  53. package/dist/task-list/hooks/useGanttRowDrag.d.ts +17 -0
  54. package/dist/task-list/hooks/useGanttTaskListPane.d.ts +11 -0
  55. package/dist/task-list/hooks/useGanttTaskMove.d.ts +16 -0
  56. package/dist/timeline/components/GanttChartHeader.d.ts +10 -0
  57. package/dist/timeline/components/GanttHolidayLabels.d.ts +6 -0
  58. package/dist/timeline/components/GanttNonWorkingLayer.d.ts +6 -0
  59. package/dist/timeline/components/GanttTodayLine.d.ts +6 -0
  60. package/dist/timeline/hooks/useGanttScrollApi.d.ts +62 -0
  61. package/dist/timeline/hooks/useGanttViewport.d.ts +47 -0
  62. package/dist/timeline/hooks/useGanttVirtualization.d.ts +28 -0
  63. package/dist/timeline/utils/geometry.d.ts +52 -0
  64. package/dist/timeline/utils/header.d.ts +8 -0
  65. package/dist/timeline/utils/transform.d.ts +4 -0
  66. package/dist/timeline/utils/viewport.d.ts +31 -0
  67. package/dist/useGanttSelectors.d.ts +11 -0
  68. package/package.json +53 -38
  69. package/dist/index.cjs.js +0 -4
  70. package/dist/index.es.js +0 -2394
  71. package/dist/readmeImg.png +0 -0
@@ -0,0 +1,34 @@
1
+ import { Task } from './types';
2
+ /** The minimum a task needs for the tree math - TaskTransformed fits as-is */
3
+ type TaskNode = Pick<Task, "id" | "parentId">;
4
+ /**
5
+ * A normalized tree built from parentId. Orphans, self-references and cycles lose their
6
+ * parent link and become roots, so what comes out is always acyclic.
7
+ */
8
+ export interface TaskTree {
9
+ /** parent id -> child ids (in input order) */
10
+ childIds: Map<string, string[]>;
11
+ /** task id -> normalized parent id (null for a root, an orphan or a cycle) */
12
+ parentOf: Map<string, string | null>;
13
+ /** task id -> depth from the root */
14
+ depthOf: Map<string, number>;
15
+ /** Root ids, in input order - the sibling list childIds has no key for */
16
+ rootIds: string[];
17
+ }
18
+ export declare function buildTaskTree(tasks: TaskNode[]): TaskTree;
19
+ /**
20
+ * The subtree's ids including the root itself (breadth first)
21
+ * An id that is not in the tree yields an empty array
22
+ */
23
+ export declare function collectSubtreeIds(tasks: TaskNode[], rootId: string, tree?: TaskTree): string[];
24
+ /**
25
+ * The tasks left after dropping any task with a collapsed ancestor
26
+ * Input order is preserved (row order is decided by the sequence sort)
27
+ */
28
+ export declare function getVisibleTasks<T extends TaskNode>(tasks: T[], collapsedIds: Iterable<string>, tree?: TaskTree): T[];
29
+ /**
30
+ * The tasks with every parent recomputed as a summary row: start/end always from the children
31
+ * (deepest first, so a move travels all the way up); an explicit progress is left alone.
32
+ */
33
+ export declare function rollUpTasks(tasks: Task[], tree?: TaskTree): Task[];
34
+ export {};
@@ -0,0 +1,43 @@
1
+ export type DependencyType = 'FS' | 'SS' | 'FF' | 'SF';
2
+ export interface TaskDependency {
3
+ /** The predecessor's id - a task's `dependencies` list the tasks it waits on */
4
+ targetId: string;
5
+ type: DependencyType;
6
+ }
7
+ export interface Task {
8
+ id: string;
9
+ name: string;
10
+ startDate: string;
11
+ endDate: string;
12
+ parentId: string | null;
13
+ sequence: string;
14
+ /** Progress 0-100 (%) - omitted means no progress display */
15
+ progress?: number;
16
+ /** Bar color (any CSS color) - progress fill and hover shade derive from it; omitted, the `--gantt-*` tokens decide */
17
+ color?: string;
18
+ /** Extra class name put on this task's bar and its task-list row */
19
+ className?: string;
20
+ /** Lane this task shares a row with - lane-mates draw side by side, overlaps stack onto extra rows */
21
+ lane?: string;
22
+ dependencies?: TaskDependency[];
23
+ /** Blocks every gesture on this task - overrides the chart's `readOnly` prop */
24
+ readOnly?: boolean;
25
+ /** Allows/blocks moving this task - overrides both `readOnly` settings */
26
+ allowMove?: boolean;
27
+ /** Allows/blocks resizing this task - overrides both `readOnly` settings */
28
+ allowResize?: boolean;
29
+ /** Allows/blocks dragging this task's progress handle - overrides both `readOnly` settings */
30
+ allowProgressChange?: boolean;
31
+ /** Allows/blocks starting a dependency drag from this task - overrides both `readOnly` settings */
32
+ allowLinkCreate?: boolean;
33
+ /** Allows/blocks deleting a dependency this task owns - overrides both `readOnly` settings */
34
+ allowLinkDelete?: boolean;
35
+ /** Allows/blocks dragging this row to a new position or parent - opt-in, off unless this or the chart's `allowReorder` turns it on */
36
+ allowReorder?: boolean;
37
+ /** Earliest date this task may be dragged to (ISO string) - overrides the chart's `minDate` */
38
+ minDate?: string;
39
+ /** Latest date this task may be dragged to (ISO string) - overrides the chart's `maxDate` */
40
+ maxDate?: string;
41
+ }
42
+ /** Normalizes progress into the 0-100 range; null when the value is missing or invalid */
43
+ export declare function normalizeProgress(progress: number | undefined): number | null;
@@ -0,0 +1,13 @@
1
+ import { GanttDependencyChange } from '../hooks/useGanttLinkDrag';
2
+ import { GanttVirtualization } from '../../timeline/hooks/useGanttVirtualization';
3
+ import { GanttInteractionConfig, Task, TaskTransformed } from '../../shared/task';
4
+ interface Props {
5
+ transformedTasks: TaskTransformed[];
6
+ rowCount: number;
7
+ virtual: GanttVirtualization;
8
+ interaction?: GanttInteractionConfig;
9
+ onTasksChange?: (updatedTasks: Task[]) => void;
10
+ onDependencyDelete?: (change: GanttDependencyChange) => boolean | void;
11
+ }
12
+ export default function GanttDependencyArrows({ transformedTasks, rowCount, virtual, interaction, onTasksChange, onDependencyDelete, }: Props): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,20 @@
1
+ import { DependencyType, GanttInteractionConfig, Task, TaskTransformed } from '../../shared/task';
2
+ import { LinkAnchor } from '../utils/link';
3
+ /** The link the user drew, handed to `onDependencyCreate` before anything is committed */
4
+ export interface GanttDependencyChange {
5
+ /** Task the drag started on */
6
+ predecessorId: string;
7
+ /** Task the drag was dropped on - the one whose `dependencies` gains the entry */
8
+ successorId: string;
9
+ type: DependencyType;
10
+ }
11
+ interface UseGanttLinkDragParams {
12
+ task: TaskTransformed;
13
+ interaction?: GanttInteractionConfig;
14
+ onTasksChange?: (updatedTasks: Task[]) => void;
15
+ onDependencyCreate?: (change: GanttDependencyChange) => boolean | void;
16
+ }
17
+ export declare function useGanttLinkDrag({ task, interaction, onTasksChange, onDependencyCreate, }: UseGanttLinkDragParams): {
18
+ startLink: (anchor: LinkAnchor) => (e: React.PointerEvent<HTMLElement>) => void;
19
+ };
20
+ export {};
@@ -0,0 +1,20 @@
1
+ import { RenderedDependency, TaskTransformed } from '../../shared/task';
2
+ import { LinkAnchor } from './link';
3
+ interface DragOffset {
4
+ offsetX: number;
5
+ offsetWidth: number;
6
+ }
7
+ export declare function getSmartGanttPath(dependencyType: string, startX: number, startY: number, endX: number, endY: number): string;
8
+ export declare function anchorPoint(task: TaskTransformed, anchor: LinkAnchor, offset?: DragOffset): {
9
+ x: number;
10
+ y: number;
11
+ };
12
+ export declare function buildTaskIndex(transformedTasks: TaskTransformed[]): Map<string, TaskTransformed>;
13
+ export interface ArrowViewport {
14
+ topPx: number;
15
+ bottomPx: number;
16
+ isBarVisible: (left: number, width: number) => boolean;
17
+ }
18
+ export declare function isArrowVisible(dep: Pick<RenderedDependency, "fromX" | "fromY" | "toX" | "toY">, viewport: ArrowViewport): boolean;
19
+ export declare function buildDependencies(taskById: Map<string, TaskTransformed>, liveOffsets: Record<string, DragOffset>): RenderedDependency[];
20
+ export {};
@@ -0,0 +1,17 @@
1
+ import { DependencyType, Task, TaskDependency, TaskTransformed } from '../../shared/task';
2
+ export type LinkAnchor = "start" | "end";
3
+ export type LinkRejection = "self" | "duplicate" | "cycle";
4
+ type DependencyNode = Pick<Task, "id"> & {
5
+ dependencies?: TaskDependency[];
6
+ };
7
+ export declare function linkTypeFromAnchors(from: LinkAnchor, to: LinkAnchor): DependencyType;
8
+ interface LinkTarget {
9
+ task: TaskTransformed;
10
+ anchor: LinkAnchor;
11
+ }
12
+ export declare function resolveLinkTarget(rowTasks: TaskTransformed[], contentX: number, contentY: number, rowHeight: number, zone: number): LinkTarget | null;
13
+ export declare function validateDependency(tasks: DependencyNode[], predecessorId: string, successorId: string): LinkRejection | null;
14
+ export declare const LINK_REJECTION_LABEL: Record<LinkRejection, string>;
15
+ export declare function addDependency(tasks: Task[], predecessorId: string, successorId: string, type: DependencyType): Task[];
16
+ export declare function removeDependency(tasks: Task[], predecessorId: string, successorId: string): Task[];
17
+ export {};
@@ -0,0 +1,21 @@
1
+ import { GanttDetailRenderer, GanttLocaleOptions, GanttScaleKey } from '../../shared/types';
2
+ import { GanttInteractionConfig, Task, TaskTransformed } from '../../shared/task';
3
+ interface GanttDetailPanelProps {
4
+ task: TaskTransformed;
5
+ /** Every task, so a dependency's target id can be printed by name */
6
+ tasks: TaskTransformed[];
7
+ scale: GanttScaleKey;
8
+ localeOptions?: GanttLocaleOptions;
9
+ /** Gates which built-in fields take input - the same flags the drag gestures obey */
10
+ interaction?: GanttInteractionConfig;
11
+ onClose: () => void;
12
+ onTasksChange?: (updatedTasks: Task[]) => void;
13
+ /** Replaces the body; the panel element itself, and its width, stay the chart's */
14
+ render?: GanttDetailRenderer;
15
+ /** False while the panel slides shut - the slide lives in flex-basis, see .gantt-detail */
16
+ open: boolean;
17
+ onTransitionEnd: React.TransitionEventHandler<HTMLElement>;
18
+ }
19
+ /** The docked panel on the right */
20
+ export default function GanttDetailPanel({ task, tasks, scale, localeOptions, interaction, onClose, onTasksChange, render, open, onTransitionEnd, }: GanttDetailPanelProps): import("react").JSX.Element;
21
+ export {};
@@ -0,0 +1,42 @@
1
+ import { TaskTransformed } from '../../shared/task';
2
+ type TaskMouseHandler = (task: TaskTransformed, event: React.MouseEvent) => void;
3
+ interface ResolvedDetailState<T extends {
4
+ id: string;
5
+ }> {
6
+ openId: string | null;
7
+ task: T | null;
8
+ stale: boolean;
9
+ }
10
+ export declare function resolveDetailState<T extends {
11
+ id: string;
12
+ }>({ enabled, detailTaskId, uncontrolled, tasks, }: {
13
+ enabled: boolean;
14
+ detailTaskId?: string | null;
15
+ uncontrolled: string | null;
16
+ tasks: T[];
17
+ }): ResolvedDetailState<T>;
18
+ interface UseGanttDetailParams {
19
+ enabled: boolean;
20
+ tasks: TaskTransformed[];
21
+ detailTaskId?: string | null;
22
+ onDetailChange?: (task: TaskTransformed | null) => void;
23
+ onTaskClick?: TaskMouseHandler;
24
+ }
25
+ interface GanttDetail {
26
+ task: TaskTransformed | null;
27
+ open: (taskId: string) => void;
28
+ close: () => void;
29
+ onTaskClick: TaskMouseHandler;
30
+ }
31
+ /** Controlled by `detailTaskId`, uncontrolled without it; `onDetailChange` fires in both modes */
32
+ export declare function useGanttDetail({ enabled, tasks, detailTaskId, onDetailChange, onTaskClick, }: UseGanttDetailParams): GanttDetail;
33
+ interface GanttDetailSlide {
34
+ /** The task to keep rendered - the open one, or the last one while the panel slides shut */
35
+ task: TaskTransformed | null;
36
+ /** Drives .gantt-detail-open - false on the mount frame so opening transitions up from zero */
37
+ open: boolean;
38
+ onTransitionEnd: React.TransitionEventHandler<HTMLElement>;
39
+ }
40
+ /** Holds the panel mounted through the slide-closed transition, then releases it */
41
+ export declare function useGanttDetailSlide(task: TaskTransformed | null): GanttDetailSlide;
42
+ export {};
@@ -0,0 +1,21 @@
1
+ import { GanttInteractionConfig, Task } from '../../shared/task';
2
+ export type DetailEditableField = "name" | "startDate" | "endDate" | "progress";
3
+ interface DetailEditability {
4
+ name: boolean;
5
+ /** One flag for both dates - changing either one is a resize */
6
+ dates: boolean;
7
+ progress: boolean;
8
+ }
9
+ export declare function resolveDetailEditability(task: Task & {
10
+ isSummary?: boolean;
11
+ }, config?: GanttInteractionConfig): DetailEditability;
12
+ /** Turns one field's raw input into a patch; null means the value cannot commit and the field reverts */
13
+ export declare function resolveFieldPatch(task: Task, field: DetailEditableField, value: string, config?: GanttInteractionConfig): Partial<Omit<Task, "id">> | null;
14
+ export declare function applyTaskPatch(rawTasks: Task[], taskId: string, patch: Partial<Omit<Task, "id">>): Task[];
15
+ export declare function commitDetailPatch(storeApi: {
16
+ getState: () => {
17
+ rawTasks: Task[];
18
+ setRawTasks: (tasks: Task[]) => void;
19
+ };
20
+ }, taskId: string, patch: Partial<Omit<Task, "id">>, onTasksChange?: (tasks: Task[]) => void): void;
21
+ export {};
@@ -1 +1 @@
1
- @import"https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap";:root{--font-sans: "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--background: #fafafa;--foreground: #18181b;--muted: #f4f4f5;--muted-foreground: #71717a;--border: #e4e4e7;--border-subtle: rgba(0, 0, 0, .04);--bar-bg: #e4e4e7;--bar-bg-hover: #d4d4d8;--bar-text: #18181b;--bar-shadow: 0 1px 2px rgba(0, 0, 0, .05);--bar-shadow-hover: 0 4px 12px rgba(0, 0, 0, .1);--bar-shadow-drag: 0 8px 24px rgba(0, 0, 0, .15);--arrow: #a1a1aa;--accent: #3b82f6;--transition-fast: .15s ease;--transition-normal: .2s ease}.dark,[data-theme=dark]{--background: #09090b;--foreground: #fafafa;--muted: #18181b;--muted-foreground: #a1a1aa;--border: #27272a;--border-subtle: rgba(255, 255, 255, .04);--bar-bg: #27272a;--bar-bg-hover: #3f3f46;--bar-text: #fafafa;--bar-shadow: 0 1px 2px rgba(0, 0, 0, .2);--bar-shadow-hover: 0 4px 12px rgba(0, 0, 0, .3);--bar-shadow-drag: 0 8px 24px rgba(0, 0, 0, .4);--arrow: #71717a}.gantt-container{display:flex;flex-direction:column;overflow:hidden;background:var(--background);font-family:var(--font-sans);font-size:13px;line-height:1.5;color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gantt-toolbar{flex-shrink:0;display:flex;align-items:center;justify-content:flex-end;padding:12px 16px;background:var(--background);border-bottom:1px solid var(--border)}.gantt-scale-selector{display:inline-flex}.gantt-scale-control{display:flex;gap:2px;padding:3px;background:var(--muted);border-radius:8px;border:1px solid var(--border)}.gantt-scale-button{position:relative;padding:6px 14px;font-family:inherit;font-size:12px;font-weight:500;color:var(--muted-foreground);background:transparent;border:none;border-radius:6px;cursor:pointer;transition:all var(--transition-fast);text-transform:capitalize}.gantt-scale-button:hover{color:var(--foreground)}.gantt-scale-button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.gantt-scale-button[data-active=true]{color:var(--foreground);background:var(--background);box-shadow:0 1px 3px #00000014}.gantt-main{flex:1;min-height:0;overflow:hidden}.gantt-scroll-container{width:100%;height:100%;overflow:auto}.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(--border);border-radius:5px;border:2px solid var(--background)}.gantt-scroll-container::-webkit-scrollbar-thumb:hover{background:var(--muted-foreground)}.gantt-scroll-container::-webkit-scrollbar-corner{background:transparent}.gantt-header-wrapper{position:sticky;top:0;z-index:30}.gantt-header{position:relative;background:var(--background);border-bottom:1px solid var(--border)}.gantt-header-content{display:flex;flex-direction:column}.gantt-top-header{position:relative;display:flex;height:44px;border-bottom:1px solid var(--border-subtle)}.gantt-top-groups{display:flex}.gantt-top-group{display:flex;align-items:center;padding:0 16px;font-size:13px;font-weight:600;letter-spacing:-.01em;background:var(--background);color:var(--foreground)}.gantt-top-group.sticky{position:sticky;left:0;z-index:1}.gantt-top-group-label{margin:0;padding:0;white-space:nowrap}.gantt-bottom-row{display:flex;height:28px;background:var(--muted)}.gantt-bottom-cell{display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:500;color:var(--muted-foreground);letter-spacing:.01em}.gantt-content{position:relative;background:var(--background)}.gantt-rows{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;pointer-events:none}.gantt-task-row{position:absolute;top:0;left:0;display:flex;width:100%;align-items:center;border-bottom:1px solid var(--border-subtle);pointer-events:none}.gantt-dependency-arrows{position:absolute;top:0;left:0;width:100%;pointer-events:none;z-index:5}.gantt-dependency-arrow{stroke:var(--arrow);stroke-width:1.5;fill:none}.gantt-dependency-arrow-head{fill:var(--arrow);stroke:none}.gantt-task-bar{position:relative;z-index:10;display:flex;align-items:center;background:var(--bar-bg);border-radius:6px;-webkit-user-select:none;user-select:none;cursor:grab;box-shadow:var(--bar-shadow);transition:background var(--transition-fast),box-shadow var(--transition-normal)}.gantt-task-bar:before,.gantt-task-bar:after{content:"";position:absolute;top:50%;width:3px;height:12px;background:var(--muted-foreground);border-radius:2px;opacity:0;transform:translateY(-50%);transition:opacity var(--transition-fast)}.gantt-task-bar:before{left:4px}.gantt-task-bar:after{right:4px}.gantt-task-bar:hover{background:var(--bar-bg-hover);box-shadow:var(--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(--bar-shadow-drag);z-index:100}.gantt-task-bar.dragging:before,.gantt-task-bar.dragging:after{opacity:.7}.gantt-task-name{flex:1;padding:0 14px;font-family:inherit;font-size:12px;font-weight:500;color:var(--bar-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.gantt-bar-tooltip{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);z-index:200;padding:8px 12px;background:var(--foreground);color:var(--background);border-radius:6px;font-family:inherit;font-size:11px;font-weight:500;white-space:nowrap;box-shadow:0 4px 16px #00000026;pointer-events:none;animation:tooltipFadeIn var(--transition-fast) ease-out}@keyframes tooltipFadeIn{0%{opacity:0;transform:translate(-50%) translateY(4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.gantt-bar-tooltip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:var(--foreground)}@media (max-width: 768px){.gantt-toolbar{padding:8px 12px}.gantt-scale-button{padding:5px 10px;font-size:11px}.gantt-top-group{font-size:12px;padding:0 12px}.gantt-bottom-cell{font-size:10px}.gantt-task-name{font-size:11px;padding:0 10px}}
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%}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("react/jsx-runtime"),p=require("react"),Ae=t=>{let n;const r=new Set,s=(u,l)=>{const f=typeof u=="function"?u(n):u;if(!Object.is(f,n)){const h=n;n=l??(typeof f!="object"||f===null)?f:Object.assign({},n,f),r.forEach(w=>w(n,h))}},o=()=>n,i={setState:s,getState:o,getInitialState:()=>c,subscribe:u=>(r.add(u),()=>r.delete(u))},c=n=t(s,o,i);return i},Xn=(t=>t?Ae(t):Ae),Bn=t=>t;function zn(t,n=Bn){const r=p.useSyncExternalStore(t.subscribe,p.useCallback(()=>n(t.getState()),[t,n]),p.useCallback(()=>n(t.getInitialState()),[t,n]));return p.useDebugValue(r),r}const ln=p.createContext(null);function gt(){const t=p.useContext(ln);if(!t)throw new Error("Gantt store is missing. Render this component inside <ReactGanttChart>.");return t}function V(t){return zn(gt(),t)}function qn(t){const n=[];for(const r of t){const s=n[n.length-1];s&&s.label===r.label?s.widthPx+=r.widthPx:n.push({...r})}return n}function un(t){const n=[0];let r=0;for(const s of t)r+=s.widthPx,n.push(r);return n}function te(t,n){if(t.length<2)return null;let r=0,s=t.length-2;for(;r<s;){const o=Math.ceil((r+s)/2);t[o]<=n?r=o:s=o-1}return{index:r,left:t[r],width:t[r+1]-t[r]}}function dn(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Vt={exports:{}},Kn=Vt.exports,Re;function Vn(){return Re||(Re=1,(function(t,n){(function(r,s){t.exports=s()})(Kn,(function(){var r=1e3,s=6e4,o=36e5,e="millisecond",a="second",i="minute",c="hour",u="day",l="week",f="month",h="quarter",w="year",g="date",d="Invalid Date",m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,D=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,S={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(T){var k=["th","st","nd","rd"],O=T%100;return"["+T+(k[(O-20)%10]||k[O]||k[0])+"]"}},M=function(T,k,O){var y=String(T);return!y||y.length>=k?T:""+Array(k+1-y.length).join(O)+T},A={s:M,z:function(T){var k=-T.utcOffset(),O=Math.abs(k),y=Math.floor(O/60),x=O%60;return(k<=0?"+":"-")+M(y,2,"0")+":"+M(x,2,"0")},m:function T(k,O){if(k.date()<O.date())return-T(O,k);var y=12*(O.year()-k.year())+(O.month()-k.month()),x=k.clone().add(y,f),P=O-x<0,L=k.clone().add(y+(P?-1:1),f);return+(-(y+(O-x)/(P?x-L:L-x))||0)},a:function(T){return T<0?Math.ceil(T)||0:Math.floor(T)},p:function(T){return{M:f,y:w,w:l,d:u,D:g,h:c,m:i,s:a,ms:e,Q:h}[T]||String(T||"").toLowerCase().replace(/s$/,"")},u:function(T){return T===void 0}},N="en",I={};I[N]=S;var _="$isDayjsObject",R=function(T){return T instanceof F||!(!T||!T[_])},v=function T(k,O,y){var x;if(!k)return N;if(typeof k=="string"){var P=k.toLowerCase();I[P]&&(x=P),O&&(I[P]=O,x=P);var L=k.split("-");if(!x&&L.length>1)return T(L[0])}else{var H=k.name;I[H]=k,x=H}return!y&&x&&(N=x),x||!y&&N},$=function(T,k){if(R(T))return T.clone();var O=typeof k=="object"?k:{};return O.date=T,O.args=arguments,new F(O)},j=A;j.l=v,j.i=R,j.w=function(T,k){return $(T,{locale:k.$L,utc:k.$u,x:k.$x,$offset:k.$offset})};var F=(function(){function T(O){this.$L=v(O.locale,null,!0),this.parse(O),this.$x=this.$x||O.x||{},this[_]=!0}var k=T.prototype;return k.parse=function(O){this.$d=(function(y){var x=y.date,P=y.utc;if(x===null)return new Date(NaN);if(j.u(x))return new Date;if(x instanceof Date)return new Date(x);if(typeof x=="string"&&!/Z$/i.test(x)){var L=x.match(m);if(L){var H=L[2]-1||0,X=(L[7]||"0").substring(0,3);return P?new Date(Date.UTC(L[1],H,L[3]||1,L[4]||0,L[5]||0,L[6]||0,X)):new Date(L[1],H,L[3]||1,L[4]||0,L[5]||0,L[6]||0,X)}}return new Date(x)})(O),this.init()},k.init=function(){var O=this.$d;this.$y=O.getFullYear(),this.$M=O.getMonth(),this.$D=O.getDate(),this.$W=O.getDay(),this.$H=O.getHours(),this.$m=O.getMinutes(),this.$s=O.getSeconds(),this.$ms=O.getMilliseconds()},k.$utils=function(){return j},k.isValid=function(){return this.$d.toString()!==d},k.isSame=function(O,y){var x=$(O);return this.startOf(y)<=x&&x<=this.endOf(y)},k.isAfter=function(O,y){return $(O)<this.startOf(y)},k.isBefore=function(O,y){return this.endOf(y)<$(O)},k.$g=function(O,y,x){return j.u(O)?this[y]:this.set(x,O)},k.unix=function(){return Math.floor(this.valueOf()/1e3)},k.valueOf=function(){return this.$d.getTime()},k.startOf=function(O,y){var x=this,P=!!j.u(y)||y,L=j.p(O),H=function(E,G){var B=j.w(x.$u?Date.UTC(x.$y,G,E):new Date(x.$y,G,E),x);return P?B:B.endOf(u)},X=function(E,G){return j.w(x.toDate()[E].apply(x.toDate("s"),(P?[0,0,0,0]:[23,59,59,999]).slice(G)),x)},z=this.$W,Z=this.$M,tt=this.$D,mt="set"+(this.$u?"UTC":"");switch(L){case w:return P?H(1,0):H(31,11);case f:return P?H(1,Z):H(0,Z+1);case l:var et=this.$locale().weekStart||0,dt=(z<et?z+7:z)-et;return H(P?tt-dt:tt+(6-dt),Z);case u:case g:return X(mt+"Hours",0);case c:return X(mt+"Minutes",1);case i:return X(mt+"Seconds",2);case a:return X(mt+"Milliseconds",3);default:return this.clone()}},k.endOf=function(O){return this.startOf(O,!1)},k.$set=function(O,y){var x,P=j.p(O),L="set"+(this.$u?"UTC":""),H=(x={},x[u]=L+"Date",x[g]=L+"Date",x[f]=L+"Month",x[w]=L+"FullYear",x[c]=L+"Hours",x[i]=L+"Minutes",x[a]=L+"Seconds",x[e]=L+"Milliseconds",x)[P],X=P===u?this.$D+(y-this.$W):y;if(P===f||P===w){var z=this.clone().set(g,1);z.$d[H](X),z.init(),this.$d=z.set(g,Math.min(this.$D,z.daysInMonth())).$d}else H&&this.$d[H](X);return this.init(),this},k.set=function(O,y){return this.clone().$set(O,y)},k.get=function(O){return this[j.p(O)]()},k.add=function(O,y){var x,P=this;O=Number(O);var L=j.p(y),H=function(Z){var tt=$(P);return j.w(tt.date(tt.date()+Math.round(Z*O)),P)};if(L===f)return this.set(f,this.$M+O);if(L===w)return this.set(w,this.$y+O);if(L===u)return H(1);if(L===l)return H(7);var X=(x={},x[i]=s,x[c]=o,x[a]=r,x)[L]||1,z=this.$d.getTime()+O*X;return j.w(z,this)},k.subtract=function(O,y){return this.add(-1*O,y)},k.format=function(O){var y=this,x=this.$locale();if(!this.isValid())return x.invalidDate||d;var P=O||"YYYY-MM-DDTHH:mm:ssZ",L=j.z(this),H=this.$H,X=this.$m,z=this.$M,Z=x.weekdays,tt=x.months,mt=x.meridiem,et=function(G,B,st,nt){return G&&(G[B]||G(y,P))||st[B].slice(0,nt)},dt=function(G){return j.s(H%12||12,G,"0")},E=mt||function(G,B,st){var nt=G<12?"AM":"PM";return st?nt.toLowerCase():nt};return P.replace(D,(function(G,B){return B||(function(st){switch(st){case"YY":return String(y.$y).slice(-2);case"YYYY":return j.s(y.$y,4,"0");case"M":return z+1;case"MM":return j.s(z+1,2,"0");case"MMM":return et(x.monthsShort,z,tt,3);case"MMMM":return et(tt,z);case"D":return y.$D;case"DD":return j.s(y.$D,2,"0");case"d":return String(y.$W);case"dd":return et(x.weekdaysMin,y.$W,Z,2);case"ddd":return et(x.weekdaysShort,y.$W,Z,3);case"dddd":return Z[y.$W];case"H":return String(H);case"HH":return j.s(H,2,"0");case"h":return dt(1);case"hh":return dt(2);case"a":return E(H,X,!0);case"A":return E(H,X,!1);case"m":return String(X);case"mm":return j.s(X,2,"0");case"s":return String(y.$s);case"ss":return j.s(y.$s,2,"0");case"SSS":return j.s(y.$ms,3,"0");case"Z":return L}return null})(G)||L.replace(":","")}))},k.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},k.diff=function(O,y,x){var P,L=this,H=j.p(y),X=$(O),z=(X.utcOffset()-this.utcOffset())*s,Z=this-X,tt=function(){return j.m(L,X)};switch(H){case w:P=tt()/12;break;case f:P=tt();break;case h:P=tt()/3;break;case l:P=(Z-z)/6048e5;break;case u:P=(Z-z)/864e5;break;case c:P=Z/o;break;case i:P=Z/s;break;case a:P=Z/r;break;default:P=Z}return x?P:j.a(P)},k.daysInMonth=function(){return this.endOf(f).$D},k.$locale=function(){return I[this.$L]},k.locale=function(O,y){if(!O)return this.$L;var x=this.clone(),P=v(O,y,!0);return P&&(x.$L=P),x},k.clone=function(){return j.w(this.$d,this)},k.toDate=function(){return new Date(this.valueOf())},k.toJSON=function(){return this.isValid()?this.toISOString():null},k.toISOString=function(){return this.$d.toISOString()},k.toString=function(){return this.$d.toUTCString()},T})(),U=F.prototype;return $.prototype=U,[["$ms",e],["$s",a],["$m",i],["$H",c],["$W",u],["$M",f],["$y",w],["$D",g]].forEach((function(T){U[T[1]]=function(k){return this.$g(k,T[0],T[1])}})),$.extend=function(T,k){return T.$i||(T(k,F,$),T.$i=!0),$},$.locale=v,$.isDayjs=R,$.unix=function(T){return $(1e3*T)},$.en=I[N],$.Ls=I,$.p={},$}))})(Vt)),Vt.exports}var Zn=Vn();const ee=dn(Zn);var Zt={exports:{}},Jn=Zt.exports,Ne;function Qn(){return Ne||(Ne=1,(function(t,n){(function(r,s){t.exports=s()})(Jn,(function(){var r="minute",s=/[+-]\d\d(?::?\d\d)?/g,o=/([+-]|\d\d)/g;return function(e,a,i){var c=a.prototype;i.utc=function(d){var m={date:d,utc:!0,args:arguments};return new a(m)},c.utc=function(d){var m=i(this.toDate(),{locale:this.$L,utc:!0});return d?m.add(this.utcOffset(),r):m},c.local=function(){return i(this.toDate(),{locale:this.$L,utc:!1})};var u=c.parse;c.parse=function(d){d.utc&&(this.$u=!0),this.$utils().u(d.$offset)||(this.$offset=d.$offset),u.call(this,d)};var l=c.init;c.init=function(){if(this.$u){var d=this.$d;this.$y=d.getUTCFullYear(),this.$M=d.getUTCMonth(),this.$D=d.getUTCDate(),this.$W=d.getUTCDay(),this.$H=d.getUTCHours(),this.$m=d.getUTCMinutes(),this.$s=d.getUTCSeconds(),this.$ms=d.getUTCMilliseconds()}else l.call(this)};var f=c.utcOffset;c.utcOffset=function(d,m){var D=this.$utils().u;if(D(d))return this.$u?0:D(this.$offset)?f.call(this):this.$offset;if(typeof d=="string"&&(d=(function(N){N===void 0&&(N="");var I=N.match(s);if(!I)return null;var _=(""+I[0]).match(o)||["-",0,0],R=_[0],v=60*+_[1]+ +_[2];return v===0?0:R==="+"?v:-v})(d),d===null))return this;var S=Math.abs(d)<=16?60*d:d;if(S===0)return this.utc(m);var M=this.clone();if(m)return M.$offset=S,M.$u=!1,M;var A=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(M=this.local().add(S+A,r)).$offset=S,M.$x.$localOffset=A,M};var h=c.format;c.format=function(d){var m=d||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return h.call(this,m)},c.valueOf=function(){var d=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*d},c.isUTC=function(){return!!this.$u},c.toISOString=function(){return this.toDate().toISOString()},c.toString=function(){return this.toDate().toUTCString()};var w=c.toDate;c.toDate=function(d){return d==="s"&&this.$offset?i(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():w.call(this)};var g=c.diff;c.diff=function(d,m,D){if(d&&this.$u===d.$u)return g.call(this,d,m,D);var S=this.local(),M=i(d).local();return g.call(S,M,m,D)}}}))})(Zt)),Zt.exports}var tr=Qn();const er=dn(tr);ee.extend(er);const C=ee.utc;function fn(t){return Math.floor(t.month()/3)+1}function nr(t){return t.startOf("month").month(Math.floor(t.month()/3)*3)}function rr(t,n=0){const r=(t.day()-n+7)%7;return t.startOf("day").subtract(r,"day")}const bt=38,fe=28,sr=18,or=73,je=120,_e=800,Ye=16,ar=220,ir=5,cr=56,jt=8,Ce=jt+5,hn=44,be=jt*3,lr=hn*3,ur=be,dr=24,He=4,fr=450,hr={day:"MMM D, YYYY HH:mm [UTC]",week:"MMM D, YYYY",month:"MMM D, YYYY",quarter:"MMM YYYY",year:"MMM YYYY"},mr={day:"HH:mm [UTC]",week:"MMM D",month:"MMM D",quarter:"MMM YYYY",year:"MMM YYYY"},pr=44,at={day:{labelUnit:"day",tickUnit:"hour",unitPerTick:6,tickAlign:"day",dragStepUnit:"hour",dragStepAmount:1,basePxPerDragStep:12,formatTickLabel:t=>t.format("HH"),formatHeaderLabel:t=>t.format("MMM D, YYYY")},week:{labelUnit:"month",tickUnit:"day",unitPerTick:1,dragStepUnit:"hour",dragStepAmount:6,basePxPerDragStep:18,formatTickLabel:t=>t.format("D"),formatHeaderLabel:t=>t.format("MMM YYYY")},month:{labelUnit:"month",tickUnit:"day",unitPerTick:7,tickAlign:"week",dragStepUnit:"day",dragStepAmount:1,basePxPerDragStep:18,formatTickLabel:t=>t.format("MMM D"),formatHeaderLabel:t=>t.format("MMM YYYY")},quarter:{labelUnit:"quarter",tickUnit:"month",unitPerTick:1,dragStepUnit:"day",dragStepAmount:7,basePxPerDragStep:28,formatTickLabel:t=>t.format("MMM"),formatHeaderLabel:t=>`Q${fn(t)} ${t.format("YYYY")}`},year:{labelUnit:"year",tickUnit:"month",unitPerTick:3,tickAlign:"quarter",dragStepUnit:"day",dragStepAmount:28,basePxPerDragStep:28,formatTickLabel:t=>t.format("MMM"),formatHeaderLabel:t=>t.format("YYYY")}},Jt={year:"numeric",month:"short",day:"numeric"},Pt={year:"numeric",month:"short"},he={year:"numeric"},mn={hour:"2-digit",minute:"2-digit",hourCycle:"h23"},gr={day:{hour:"2-digit",hourCycle:"h23"},week:{day:"numeric"},month:{month:"short",day:"numeric"},quarter:{month:"short"},year:{month:"short"}},$r={day:Jt,week:Pt,month:Pt,quarter:he,year:he},xr={day:{...Jt,...mn,timeZoneName:"short"},week:Jt,month:Jt,quarter:Pt,year:Pt},Fe={day:{...mn,timeZoneName:"short"},week:{month:"short",day:"numeric"},month:{month:"short",day:"numeric"},quarter:Pt,year:Pt},Dr=" – ",Ue=new Set;function Nt(t,n){const r=new Intl.DateTimeFormat(t,{timeZone:"UTC",...n});return s=>r.format(s.toDate())}function br(t){return(n,r)=>{try{return t.formatRange(n.toDate(),r.toDate())}catch{return pn(t.format(n.toDate()),t.format(r.toDate()))}}}function pn(t,n){return t===n?t:`${t}${Dr}${n}`}function wr(t){const n=Nt(t,he);return r=>{const s=n(r),o=`Q${fn(r)}`;return/\d$/.test(s)?`${o} ${s}`:`${s} ${o}`}}function gn(t,n){return t==="week"&&(n==null?void 0:n.firstDayOfWeek)!==void 0?"week":at[t].labelUnit}function Tt(t,n){var l;const r=(l=n==null?void 0:n.formats)==null?void 0:l[t],s=gn(t,n)==="week"?"day":t,o=at[t],e=at[s],a=n!=null&&n.locale?vr(n.locale,t,s):null,i=r==null?void 0:r.tooltip,c=i??(a==null?void 0:a.edge)??(f=>f.format(mr[t])),u=!i&&(a!=null&&a.range)?a.range:(f,h)=>pn(c(f),c(h));return{edge:c,range:u,tick:(r==null?void 0:r.tick)??(a==null?void 0:a.tick)??(f=>{var h;return((h=o.formatTickLabel)==null?void 0:h.call(o,f))??""}),header:(r==null?void 0:r.header)??(a==null?void 0:a.header)??(f=>{var h;return((h=e.formatHeaderLabel)==null?void 0:h.call(e,f))??f.format()}),tooltip:(r==null?void 0:r.tooltip)??(a==null?void 0:a.tooltip)??(f=>f.format(hr[t]))}}function vr(t,n,r){try{return{tick:Nt(t,gr[n]),header:r==="quarter"?wr(t):Nt(t,$r[r]),tooltip:Nt(t,xr[n]),edge:Nt(t,Fe[n]),range:br(new Intl.DateTimeFormat(t,{timeZone:"UTC",...Fe[n]}))}}catch{return Ue.has(t)||(Ue.add(t),console.warn(`[gantt-chart] Unusable locale "${t}" - falling back to the built-in labels.`)),null}}function $n(t){const n=Math.max(0,Math.round(t/36e5));return n<24?`${n}h`:`${Math.round(n/24)}d`}const Ot=Object.keys(at),yr={minute:6e4,hour:36e5,day:864e5,week:6048e5};function Sr(t){const{basePxPerDragStep:n,dragStepUnit:r,dragStepAmount:s}=at[t];return n/(s*yr[r])}function xn(t,n){const r=Ot.indexOf(t);if(r===-1)return t;const s=Math.min(Ot.length-1,Math.max(0,r+n));return Ot[s]}function Mr(t,n){for(const r of Ot)if(t*Sr(r)<=n)return r;return Ot[Ot.length-1]}const kr=24,Ir=120,Or={delta:0,lastEventAt:0,locked:!1};function Er(t,n,r){const s=r-t.lastEventAt>=Ir;if(!s&&t.locked)return{state:{delta:0,lastEventAt:r,locked:!0},step:0};const o=(s?0:t.delta)+n;return Math.abs(o)<kr?{state:{delta:o,lastEventAt:r,locked:!1},step:0}:{state:{delta:0,lastEventAt:r,locked:!0},step:Math.sign(o)}}const Pr=48,We=22;function me(t,n,r){const s=r-n;if(s<=0)return 0;const o=Math.min(Pr,s/2);return o<=0?0:t<n+o?-We*Math.min(1,(n+o-t)/o):t>r-o?We*Math.min(1,(t-(r-o))/o):0}const pe={before:0,after:0},qt=2e3;function Tr({current:t,scrollLeft:n,viewportPx:r,totalPx:s,pxPerTick:o,canExtend:e}){if(o<=0||r<=0)return null;const a=Math.max(1,Math.ceil(r/o)),i=r/2;return(e==null?void 0:e.before)!==!1&&n<=i&&t.before<qt?{...t,before:Math.min(qt,t.before+a)}:(e==null?void 0:e.after)!==!1&&s-(n+r)<=i&&t.after<qt?{...t,after:Math.min(qt,t.after+a)}:null}function _t(t){return typeof t!="number"||Number.isNaN(t)?null:Math.min(100,Math.max(0,t))}function Lt(t){const n=new Map(t.map(i=>[i.id,i])),r=new Map,s=new Map,o=new Map,e=[],a=i=>{const c=i.parentId;if(!c||c===i.id||!n.has(c))return null;const u=new Set([i.id]);let l=n.get(c);for(;l;){if(u.has(l.id))return null;if(u.add(l.id),!l.parentId)break;l=n.get(l.parentId)}return c};for(const i of t)r.set(i.id,a(i));for(const i of t){const c=r.get(i.id);if(!c){e.push(i.id);continue}const u=s.get(c);u?u.push(i.id):s.set(c,[i.id])}for(const i of t){let c=0,u=r.get(i.id)??null;for(;u;)c++,u=r.get(u)??null;o.set(i.id,c)}return{childIds:s,parentOf:r,depthOf:o,rootIds:e}}function Yt(t,n,r=Lt(t)){if(!r.parentOf.has(n))return[];const s=[n];for(let o=0;o<s.length;o++){const e=r.childIds.get(s[o]);e&&s.push(...e)}return s}function Lr(t,n,r=Lt(t)){const s=n instanceof Set?n:new Set(n);if(!s.size)return t;const o=e=>{let a=r.parentOf.get(e)??null;for(;a;){if(s.has(a))return!0;a=r.parentOf.get(a)??null}return!1};return t.filter(e=>!o(e.id))}function Ar(t){let n=0,r=0,s=0,o=!1;for(const a of t){const i=_t(a.progress);i!==null&&(o=!0);const c=i??0,u=Math.max(0,C(a.endDate).valueOf()-C(a.startDate).valueOf());n+=c*u,r+=u,s+=c}if(!o)return;const e=r>0?n/r:s/t.length;return Math.round(e)}function Dn(t,n=Lt(t)){if(!n.childIds.size)return t;const r=new Map(t.map(a=>[a.id,a])),s=[...n.childIds.keys()].filter(a=>r.has(a)).sort((a,i)=>(n.depthOf.get(i)??0)-(n.depthOf.get(a)??0)),o=new Map,e=a=>o.get(a)??r.get(a);for(const a of s){const i=r.get(a);if(!i)continue;const c=(n.childIds.get(a)??[]).map(e).filter(f=>f!==void 0);if(!c.length)continue;let u=1/0,l=-1/0;for(const f of c){const h=C(f.startDate).valueOf(),w=C(f.endDate).valueOf();Number.isNaN(h)||(u=Math.min(u,h)),Number.isNaN(w)||(l=Math.max(l,w))}!Number.isFinite(u)||!Number.isFinite(l)||o.set(a,{...i,startDate:C(u).toISOString(),endDate:C(l).toISOString(),progress:i.progress??Ar(c)})}return o.size?t.map(a=>o.get(a.id)??a):t}function Ge(t){return t.split(".").map(Number)}function Ct(t){return[...t].sort((n,r)=>{const s=Ge(n.sequence),o=Ge(r.sequence),e=Math.max(s.length,o.length);for(let a=0;a<e;a++){const i=s[a]||0,c=o[a]||0;if(i!==c)return i-c}return 0})}const Et="";function we(t,n){const r=new Map,s=new Map;if(n){const o=new Map(t.map(e=>[e.id,e]));for(const e of t){const a=e.parentId;let i=null;if(a&&a!==e.id&&o.has(a)){const c=new Set([e.id]);let u=o.get(a);for(i=a;u;){if(c.has(u.id)){i=null;break}if(c.add(u.id),!u.parentId)break;u=o.get(u.parentId)}}r.set(e.id,i)}}else{const o=new Map;for(const e of t)o.has(e.sequence)||o.set(e.sequence,e.id);for(const e of t){const a=e.sequence.lastIndexOf("."),i=a===-1?null:e.sequence.slice(0,a),c=i?o.get(i)??null:null;r.set(e.id,c===e.id?null:c)}}for(const o of t){const e=r.get(o.id)??Et,a=s.get(e);a?a.push(o.id):s.set(e,[o.id])}return{children:s,parentOf:r}}const Rr=[];function Qt(t,n){const{children:r,parentOf:s}=we(Ct(t),n);return{parentOf:s,childrenOf:o=>r.get(o??Et)??Rr}}function Nr(t,n,r,s){const o=s==="child"?r:t.parentOf.get(r)??null,e=t.childrenOf(o),a=s==="child"?e.length:e.indexOf(r)+(s==="after"?1:0),i=e.indexOf(n);return{taskId:n,toParentId:o,toIndex:i!==-1&&i<a?a-1:a}}function ve(t,n,r){const s=new Map(t.map(h=>[h.id,h])),o=s.get(n.taskId);if(!o)return"unknown-task";const e=n.toParentId?s.get(n.toParentId):null;if(n.toParentId&&!e)return"unknown-parent";if(r.canReorder&&!r.canReorder(o))return"read-only";const a=Ct(t),{children:i,parentOf:c}=we(a,r.hierarchy),u=c.get(o.id)??null;if(!r.hierarchy&&n.toParentId!==u)return"reparent-disabled";if(n.toParentId&&new Set(Yt(a,o.id)).has(n.toParentId))return"cycle";const f=(i.get(u??Et)??[]).indexOf(o.id);return n.toParentId===u&&n.toIndex===f?"no-op":null}function bn(t,n,r){if(ve(t,n,r))return null;const s=Ct(t),{children:o,parentOf:e}=we(s,r.hierarchy),a=e.get(n.taskId)??null,i=a??Et,c=n.toParentId??Et,u=[...o.get(i)??[]],l=u.indexOf(n.taskId);u.splice(l,1),o.set(i,u);const f=c===i?u:[...o.get(c)??[]],h=Math.min(Math.max(n.toIndex,0),f.length);f.splice(h,0,n.taskId),o.set(c,f);const w=new Map,g=(m,D)=>{(o.get(m)??[]).forEach((M,A)=>{const N=D?`${D}.${A+1}`:`${A+1}`;w.set(M,N),g(M,N)})};return g(Et,""),{tasks:t.map(m=>{const D=w.get(m.id)??m.sequence,S=r.hierarchy&&m.id===n.taskId?n.toParentId:m.parentId;return D===m.sequence&&S===m.parentId?m:{...m,sequence:D,parentId:S}}),change:{taskId:n.taskId,fromParentId:a,fromIndex:l,toParentId:n.toParentId,toIndex:h,afterId:f[h-1]??null,beforeId:f[h+1]??null}}}function jr(t){return t.split(".").length-1}function _r(t,n,r,s){return Ct(t).map((e,a)=>{var h;const i=s?s.depthOf.get(e.id)??0:jr(e.sequence),c=(((h=s==null?void 0:s.childIds.get(e.id))==null?void 0:h.length)??0)>0,u=a+1,{barMarginLeftAmount:l,barWidthSize:f}=Fr(C(e.startDate),C(e.endDate),n,r);return{...e,barLeft:l,barWidth:f,depth:i,isSummary:c,order:u,originalOrder:u}})}const Yr="off";function Cr(t,n,r){if(!t.length||!n.length)return 0;const s=t[0].startDate,o=n[0].startDate,e=s.valueOf()-o.valueOf();return e===0?0:e>0?It(s,n,r)??0:-(It(o,t,r)??0)}function Hr(t,n,r){const{tickUnit:s,unitPerTick:o}=at[n];if(s!=="day"&&s!=="hour")return[];const e=s==="day"?o:1,a=[];let i=0,c=null;for(const u of t){const l=u.widthPx/e;for(let f=0;f<e;f++){const h=r(u.startDate.add(f,"day"));h&&(h.key===c?a[a.length-1].width+=l:a.push({left:i+f*l,width:l,...h.label!==void 0&&{label:h.label},...h.color!==void 0&&{color:h.color}})),c=(h==null?void 0:h.key)??null}i+=u.widthPx}return a}function kt(t,n,r){const{dragStepUnit:s,dragStepAmount:o}=at[r];return t.add(n*o,s)}function ce(t,n,r){const{dragStepUnit:s,dragStepAmount:o,basePxPerDragStep:e}=at[r];return n.diff(t,s,!0)/o*e}function ye(t,n,r,s,o){const{min:e,max:a}=s;if(!e&&!a)return{startDate:n,endDate:r};if(t==="bar"){let u=n,l=r;if(a&&l.valueOf()>a.valueOf()){const f=l.valueOf()-a.valueOf();u=u.subtract(f,"millisecond"),l=a}if(e&&u.valueOf()<e.valueOf()){const f=e.valueOf()-u.valueOf();u=e,l=l.add(f,"millisecond")}return{startDate:u,endDate:l}}if(t==="left"){let u=n;e&&u.valueOf()<e.valueOf()&&(u=e),a&&u.valueOf()>a.valueOf()&&(u=a);const l=kt(r,-1,o);return u.valueOf()>l.valueOf()&&(u=l),{startDate:u,endDate:r}}let i=r;a&&i.valueOf()>a.valueOf()&&(i=a),e&&i.valueOf()<e.valueOf()&&(i=e);const c=kt(n,1,o);return i.valueOf()<c.valueOf()&&(i=c),{startDate:n,endDate:i}}function wn(t,n,r){const s=Math.min(0,n),o=Math.max(0,n);let e=n;for(const a of t){const{startDate:i}=ye("bar",a.start.add(n,"millisecond"),a.end.add(n,"millisecond"),a.bounds,r),c=Math.min(o,Math.max(s,i.valueOf()-a.start.valueOf()));Math.abs(c)<Math.abs(e)&&(e=c)}return e}function Fr(t,n,r,s){if(!r.length)return{barMarginLeftAmount:0,barWidthSize:0};const o=at[s],{tickUnit:e,unitPerTick:a}=o;let i=0,c=0,u=!1;const l=t.valueOf(),f=n.valueOf();for(const h of r){const w=h.startDate,g=w.add(a,e),d=h.widthPx,m=w.valueOf(),D=g.valueOf();if(D<=l){i+=d;continue}if(m>=f)break;const S=l>m?t:w,M=f<D?n:g,A=D-m,I=(M.valueOf()-S.valueOf())/A;if(!u&&S.valueOf()>m){const _=(S.valueOf()-m)/A;i+=_*d}c+=I*d,u=!0}return{barMarginLeftAmount:i,barWidthSize:Math.max(c,1)}}function It(t,n,r){if(!n.length)return null;const{tickUnit:s,unitPerTick:o}=at[r],e=t.valueOf();if(e<n[0].startDate.valueOf())return null;let a=0;for(const i of n){const c=i.startDate.valueOf(),u=i.startDate.add(o,s).valueOf();if(e<u)return a+(e-c)/(u-c)*i.widthPx;a+=i.widthPx}return null}function vn(t,n,r){if(!n.length||t<0)return null;const{tickUnit:s,unitPerTick:o}=at[r];let e=0;for(const a of n){if(t<e+a.widthPx){const i=a.startDate.valueOf(),c=a.startDate.add(o,s).valueOf()-i,u=a.widthPx>0?(t-e)/a.widthPx:0;return C(i+u*c)}e+=a.widthPx}return null}function Ur(t,n){if(!t.length)return null;const{tickUnit:r,unitPerTick:s}=at[n],o=t[t.length-1];return{start:t[0].startDate,end:o.startDate.add(s,r)}}function Xe(t,n){if(t<=0)return 0;let r=0;for(let s=0;s<n.length;s++)if(r+=n[s].widthPx,t<r)return s;return n.length-1}function yn(t,n,r,s){if(!r.length)return null;const{tickUnit:o,unitPerTick:e}=at[s],a=Xe(Math.min(t,n),r),i=Xe(Math.max(t,n),r);let c=0;for(let l=0;l<a;l++)c+=r[l].widthPx;let u=0;for(let l=a;l<=i;l++)u+=r[l].widthPx;return{startDate:r[a].startDate,endDate:r[i].startDate.add(e,o),leftPx:c,widthPx:u}}function Wr(t){let n=1/0,r=-1/0;for(const s of t){const o=s.startDate?C(s.startDate).valueOf():NaN;Number.isNaN(o)||(n=Math.min(n,o));const e=s.endDate?C(s.endDate).valueOf():NaN;Number.isNaN(e)||(r=Math.max(r,e))}return{minDate:C(n),maxDate:C(r)}}function Gr(t,n,r,s){const o=at[r],{tickUnit:e,unitPerTick:a}=o,i=ir*a;return{paddedMinDate:t.subtract(i+s.before*a,e),paddedMaxDate:n.add(i+s.after*a,e)}}function Xr(t,n,r){const s=at[r],{tickUnit:o,unitPerTick:e,basePxPerDragStep:a,dragStepUnit:i,dragStepAmount:c}=s,u=[];let l=s.tickAlign?Sn(t,s.tickAlign):t.startOf(o);const f=n.valueOf(),h=a/c;for(;l.valueOf()<f;){const w=l.add(e,o),d=w.diff(l,i)*h;u.push({startDate:l,widthPx:d}),l=w}return u}function Sn(t,n,r){return n==="quarter"?nr(t):n==="week"?rr(t,r):t.startOf(n)}function Br(t,n,r){const s=gn(n,r),{header:o}=Tt(n,r);if(t.length===0)return[];const e=[];let a=null;for(const i of t){const c=Sn(i.startDate,s,r==null?void 0:r.firstDayOfWeek),u=c.valueOf(),l=o(c);a&&a.startDate.valueOf()===u?a.widthPx+=i.widthPx:(a&&e.push(a),a={label:l,widthPx:i.widthPx,startDate:c})}return a&&e.push(a),e}function zr(t,n,r,s=!1,o=pe){const e=r==null?void 0:r.start,a=r==null?void 0:r.end;if(!t.length&&!(e&&a))return{bottomCells:[],transformedTasks:[]};const i=s?Lt(t):void 0,c=i?Dn(t,i):t;let u=e,l=a;if(!u||!l){const{minDate:w,maxDate:g}=Wr(c),{paddedMinDate:d,paddedMaxDate:m}=Gr(w,g,n,o);u=u??d,l=l??m}const f=Xr(u,l,n),h=_r(c,f,n,i);return{bottomCells:f,transformedTasks:h}}function qr({bottomRowCells:t,selectedScale:n,width:r,virtual:s}){const o=V(u=>u.localeOptions),e=p.useMemo(()=>Tt(n,o),[n,o]),{virtualCells:a,leadingCellPx:i}=s,c=p.useMemo(()=>qn(Br(t,n,o)),[t,n,o]);return b.jsx("header",{className:"gantt-header",style:{width:`${r}px`},children:b.jsxs("div",{className:"gantt-header-content",children:[b.jsx("div",{className:"gantt-top-header",children:b.jsx("div",{className:"gantt-top-groups",children:c.map((u,l)=>b.jsx("div",{className:"gantt-top-group",style:{width:`${u.widthPx}px`},children:b.jsx("p",{className:"gantt-top-group-label",children:u.label})},`${u.label}-${l}`))})}),b.jsxs("div",{className:"gantt-bottom-row",children:[b.jsx("div",{style:{width:`${i}px`},"aria-hidden":"true"}),a.map(u=>{const l=t[u.index];return l?b.jsx("div",{className:"gantt-bottom-cell",style:{width:`${u.size}px`},children:e.tick(l.startDate)},`bottom-${u.index}`):null})]})]})})}const Mn={};function ht(t,n=Mn){const r=(e,a)=>e!==void 0?e:t.readOnly!==void 0?!t.readOnly:a!==void 0?a:!n.readOnly,s=t.allowReorder??(t.readOnly===!0?!1:n.allowReorder??!1),o=t.isSummary===!0;return{canMove:r(t.allowMove,n.allowMove),canResize:!o&&r(t.allowResize,n.allowResize),canChangeProgress:!o&&r(t.allowProgressChange,n.allowProgressChange),canCreateLink:r(t.allowLinkCreate,n.allowLinkCreate),canDeleteLink:r(t.allowLinkDelete,n.allowLinkDelete),canReorder:s,minDate:t.minDate??n.minDate,maxDate:t.maxDate??n.maxDate}}function Kr(t=Mn){return t.allowTaskCreate??!t.readOnly}function Vr(t){const n=t==null?void 0:t.trim();return n?{"--gantt-bar-color":n,"--gantt-bar-color-hover":`color-mix(in srgb, ${n} 86%, #000)`,"--gantt-progress-color":`color-mix(in srgb, ${n} 62%, #000)`,"--gantt-bar-text-color":`oklch(from ${n} clamp(0, (l / 0.5637 - 1) * -infinity, 1) 0 h)`}:{}}const ge={offsetX:0,offsetWidth:0};function Be(t,n,r,s,o){if(r<0||o<0)return`M ${n} ${r} h ${(s-n)/2}`;const e=7,a=11,i=25,c=20,u=`M ${n} ${r}`,l=s-n,f=o-r,h=Math.abs(l),w=Math.abs(f),g=o<=r,d=o>=r,m=s>=n,D=s<=n,S=h>c,M=Math.abs(l/2),A=Math.abs(f/2);function N(){function v(){return(m||D)&&d&&!S?"downSmallHorizontal":(m||D)&&g&&!S?"upSmallHorizontal":d&&D?"downLeft":d&&m?"downRight":g&&D?"upLeft":g&&m?"upRight":""}let $=u;switch(v()){case"downRight":{$+=` h ${M-e}`,$+=` a ${e} ${e} 0 0 1 ${e} ${e}`,$+=` v ${f-e*2}`,$+=` a ${e} ${e} 0 0 0 ${e} ${e}`,$+=` h ${M-e}`;break}case"upRight":{$+=` h ${M-e}`,$+=` a ${e} ${e} 0 0 0 ${e} -${e}`,$+=` v -${w-e*2}`,$+=` a ${e} ${e} 0 0 1 ${e} -${e}`,$+=` h ${M-e}`;break}case"downLeft":case"downSmallHorizontal":{const F=r+f/2;$+=` h ${a}`,$+=` a ${e} ${e} 0 0 1 ${e} ${e}`,$+=` v ${F-r-e*2}`,$+=` a ${e} ${e} 0 0 1 -${e} ${e}`,$+=` h ${l-2*a}`,$+=` a ${e} ${e} 0 0 0 -${e} ${e}`,$+=` v ${F-r-e*2}`,$+=` a ${e} ${e} 0 0 0 ${e} ${e}`,$+=` h ${a}`;break}case"upLeft":case"upSmallHorizontal":{const F=r+f/2;$+=` h ${a}`,$+=` a ${e} ${e} 0 0 0 ${e} -${e}`,$+=` v -${r-F-e*2}`,$+=` a ${e} ${e} 0 0 0 -${e} -${e}`,$+=` h ${l-2*a}`,$+=` a ${e} ${e} 0 0 1 -${e} -${e}`,$+=` v -${r-F-e*2}`,$+=` a ${e} ${e} 0 0 1 ${e} -${e}`,$+=` h ${a}`;break}default:return $}return $}function I(){let v=u;return d&&D?(v+=` h ${i-a}`,v+=` a ${e} ${e} 0 0 1 ${e} ${e}`,v+=` v ${f-e*2}`,v+=` a ${e} ${e} 0 0 1 -${e} ${e}`,v+=` h ${l-e*2}`):d&&m?(v+=` h ${l+i-a}`,v+=` a ${e} ${e} 0 0 1 ${e} ${e}`,v+=` v ${f-e*2}`,v+=` a ${e} ${e} 0 0 1 -${e} ${e}`,v+=` h -${i-a}`):g&&D?(v+=` h ${i-a}`,v+=` a ${e} ${e} 0 0 0 ${e} -${e}`,v+=` v ${f+e*2}`,v+=` a ${e} ${e} 0 0 0 -${e} -${e}`,v+=` h ${l-i+a}`):g&&m&&(v+=` h ${l+i-a}`,v+=` a ${e} ${e} 0 0 0 ${e} -${e}`,v+=` v ${f+e*2}`,v+=` a ${e} ${e} 0 0 0 -${e} -${e}`,v+=` h -${i-a}`),v}function _(){function v(){return(m||D)&&d&&!S?"downSmallHorizontal":(m||D)&&g&&!S?"upSmallHorizontal":d&&D?"downLeft":d&&m?"downRight":g&&D?"upLeft":g&&m?"upRight":""}let $=u;switch(v()){case"downRight":case"downSmallHorizontal":{$+=` h ${-a}`,$+=` a ${e} ${e} 0 0 0 -${e} ${e}`,$+=` v ${A-e*2}`,$+=` a ${e} ${e} 0 0 0 ${e} ${e}`,$+=` h ${a*2+l}`,$+=` a ${e} ${e} 0 0 1 ${e} ${e}`,$+=` v ${A-e*2}`,$+=` a ${e} ${e} 0 0 1 -${e} ${e}`,$+=` h ${-a}`;break}case"upRight":case"upSmallHorizontal":{$+=` h ${-a}`,$+=` a ${e} ${e} 0 0 1 -${e} -${e}`,$+=` v ${-(A-e*2)}`,$+=` a ${e} ${e} 0 0 1 ${e} -${e}`,$+=` h ${a*2+l}`,$+=` a ${e} ${e} 0 0 0 ${e} -${e}`,$+=` v ${-(A-e*2)}`,$+=` a ${e} ${e} 0 0 0 -${e} -${e}`,$+=` h ${-a}`;break}case"downLeft":{$+=` h ${-M+e}`,$+=` a ${e} ${e} 0 0 0 -${e} ${e}`,$+=` v ${w-e*2}`,$+=` a ${e} ${e} 0 0 1 -${e} ${e}`,$+=` h ${-M+e}`;break}case"upLeft":{$+=` h ${-(M-e)}`,$+=` a ${e} ${e} 0 0 1 -${e} -${e}`,$+=` v ${-(w-e*2)}`,$+=` a ${e} ${e} 0 0 0 -${e} -${e}`,$+=` h ${-M+e}`;break}default:return $}return $}function R(){let v=u;return d&&D?(v+=` h ${l-i}`,v+=` a ${e} ${e} 0 0 0 -${e} ${e}`,v+=` v ${f-e*2}`,v+=` a ${e} ${e} 0 0 0 ${e} ${e}`,v+=` h ${i}`):d&&m?(v+=` h ${-i}`,v+=` a ${e} ${e} 0 0 0 -${e} ${e}`,v+=` v ${f-e*2}`,v+=` a ${e} ${e} 0 0 0 ${e} ${e}`,v+=` h ${l+i}`):g&&D?(v+=` h ${l-i}`,v+=` a ${e} ${e} 0 0 1 -${e} -${e}`,v+=` v ${f+e*2}`,v+=` a ${e} ${e} 0 0 1 ${e} -${e}`,v+=` h ${i}`):g&&m&&(v+=` h ${-i}`,v+=` a ${e} ${e} 0 0 1 -${e} -${e}`,v+=` v ${f+e*2}`,v+=` a ${e} ${e} 0 0 1 ${e} -${e}`,v+=` h ${l+i}`),v}switch(t){case"FS":return N();case"FF":return I();case"SF":return _();case"SS":return R();default:return`${u} L ${s} ${o}`}}function $e(t,n){const r=t.barLeft+n.offsetX;return{startX:r,endX:r+t.barWidth+n.offsetWidth}}function ze(t,n,r=ge){const{startX:s,endX:o}=$e(t,r);return{x:n==="start"?s:o,y:(t.order-1)*bt+bt/2}}function Zr(t,n,r,s,o){const e=bt,a=t.order-1,i=n.order-1,c=e/2,u=i*e+c,l=a*e+c,f=$e(n,s),h=$e(t,r),g={FS:[f.endX,h.startX],SS:[f.startX,h.startX],FF:[f.endX,h.endX],SF:[f.startX,h.endX]}[o];if(!g)return null;const[d,m]=g;return{fromX:d,fromY:u,toX:m,toY:l}}function Jr(t){return new Map(t.map(n=>[n.id,n]))}const Kt=32;function Qr(t,n){const r=Math.min(t.fromY,t.toY)-Kt;if(Math.max(t.fromY,t.toY)+Kt<n.topPx||r>n.bottomPx)return!1;const o=Math.min(t.fromX,t.toX)-Kt,e=Math.max(t.fromX,t.toX)+Kt;return n.isBarVisible(o,e-o)}function ts(t,n){const r=[];for(const s of t.values()){const o=n[s.id]??ge;for(const e of s.dependencies??[]){const a=t.get(e.targetId);if(!a)continue;const i=Zr(s,a,o,n[a.id]??ge,e.type);i&&r.push({...e,sourceId:s.id,...i})}}return r}function kn(t,n){const r=s=>s==="end"?"F":"S";return`${r(t)}${r(n)}`}function es(t,n,r,s,o){const e=Math.floor(r/s);if(e<0)return null;let a=null,i=1/0;for(const f of t){if(f.order-1!==e)continue;const h=f.barLeft??0,w=h+(f.barWidth??0),g=n<h?h-n:Math.max(0,n-w);g<i&&(i=g,a=f)}if(!a)return null;const c=a.barLeft??0,u=a.barWidth??0,l=Math.min(o,u/3);return{task:a,anchor:n>c+u-l?"end":"start"}}function ns(t,n,r){var i;if(n===r)return"self";const s=new Map(t.map(c=>[c.id,c])),o=(i=s.get(r))==null?void 0:i.dependencies;if(o!=null&&o.some(c=>c.targetId===n))return"duplicate";const e=new Set([n]),a=[n];for(;a.length;){const c=s.get(a.pop());for(const u of(c==null?void 0:c.dependencies)??[]){if(u.targetId===r)return"cycle";e.has(u.targetId)||(e.add(u.targetId),a.push(u.targetId))}}return null}const rs={self:"Cannot link a task to itself",duplicate:"These tasks are already linked",cycle:"That would create a circular dependency"};function ss(t,n,r,s){let o=!1;const e=t.map(a=>a.id!==r?a:(o=!0,{...a,dependencies:[...a.dependencies??[],{targetId:n,type:s}]}));return o?e:t}function os(t,n,r){let s=!1;const o=t.map(e=>{if(e.id!==r||!e.dependencies)return e;const a=e.dependencies.filter(i=>i.targetId!==n);return a.length===e.dependencies.length?e:(s=!0,{...e,dependencies:a})});return s?o:t}const as=8,is=14,cs=220;function ls(t){const n=t;return n?n.isContentEditable||n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.tagName==="SELECT":!1}function us({transformedTasks:t,rowCount:n,virtual:r,interaction:s,onTasksChange:o,onDependencyDelete:e}){const a=gt(),i=V(I=>I.dragOffsets),c=V(I=>I.linkDraft),u=V(I=>I.getTotalWidth()),l=V(I=>I.selectedDependency),f=V(I=>I.selectedTaskId),h=V(I=>I.hoveredTaskId),w=p.useMemo(()=>Jr(t),[t]),g={topPx:r.rowStartPx,bottomPx:r.rowEndPx,isBarVisible:r.isBarVisible},d=ts(w,i).filter(I=>Qr(I,g)),m=I=>(l==null?void 0:l.sourceId)===I.sourceId&&(l==null?void 0:l.targetId)===I.targetId,D=I=>h!==null&&(I.sourceId===h||I.targetId===h)||f!==null&&(I.sourceId===f||I.targetId===f),S=p.useCallback(()=>{var O;const{rawTasks:I,selectedDependency:_,setRawTasks:R,setSelectedDependency:v}=a.getState();if(!_)return;const{sourceId:$,targetId:j}=_,F=I.find(y=>y.id===$),U=(O=F==null?void 0:F.dependencies)==null?void 0:O.find(y=>y.targetId===j);if(!F||!U||!ht(F,s).canDeleteLink)return;const T={predecessorId:j,successorId:$,type:U.type};if((e==null?void 0:e(T))===!1)return;v(null);const k=os(I,j,$);R(k),o==null||o(k)},[a,s,e,o]);p.useEffect(()=>{if(!l)return;const I=R=>{ls(R.target)||(R.key==="Delete"||R.key==="Backspace"?(R.preventDefault(),S()):R.key==="Escape"&&a.getState().setSelectedDependency(null))},_=()=>{a.getState().setSelectedDependency(null)};return document.addEventListener("keydown",I),document.addEventListener("pointerdown",_),()=>{document.removeEventListener("keydown",I),document.removeEventListener("pointerdown",_)}},[l,S,a]);const M=p.useMemo(()=>{if(!c)return null;const I=w.get(c.fromTaskId);if(!I)return null;const _=ze(I,c.fromAnchor,i[I.id]),R=c.hoverTaskId?w.get(c.hoverTaskId):void 0,v=c.hoverAnchor&&kn(c.fromAnchor,c.hoverAnchor),$=!c.rejection&&R!==void 0&&c.hoverAnchor!==null,j=$&&R&&c.hoverAnchor?ze(R,c.hoverAnchor,i[R.id]):{x:c.toX,y:c.toY},F=j.x>u-cs;return{from:_,d:$&&v?Be(v,_.x,_.y,j.x,j.y):`M ${_.x} ${_.y} L ${j.x} ${j.y}`,armed:$,type:v,rejection:c.rejection,label:{x:F?j.x-12:j.x+12,y:Math.max(is,j.y-8),anchor:F?"end":"start"}}},[c,w,i,u]),N=`gantt-arrowhead-${p.useId().replace(/[^a-zA-Z0-9]/g,"")}`;return b.jsxs("svg",{className:`gantt-dependency-arrows${c?" linking":""}`,style:{height:`${n*bt}px`},children:[b.jsx("defs",{children:b.jsx("marker",{id:N,markerWidth:"5",markerHeight:"5",refX:"4.5",refY:"2.5",orient:"auto",children:b.jsx("polygon",{className:"gantt-dependency-arrow-head",points:"0 0, 5 2.5, 0 5"})})}),d.map((I,_)=>{const R=Be(I.type,I.fromX,I.fromY,I.toX,I.toY),v=m(I),$=w.get(I.sourceId),j=$!==void 0&&ht($,s).canDeleteLink;return b.jsxs("g",{children:[j&&b.jsx("path",{className:"gantt-dependency-hit",d:R,fill:"none",onPointerDown:F=>{F.stopPropagation(),a.getState().setSelectedDependency({sourceId:I.sourceId,targetId:I.targetId})}}),b.jsx("path",{className:`gantt-dependency-arrow${v?" selected":""}${D(I)?" related":""}`,d:R,markerEnd:`url(#${N})`,fill:"none"}),v&&b.jsxs("g",{className:"gantt-dependency-delete",transform:`translate(${(I.fromX+I.toX)/2} ${(I.fromY+I.toY)/2})`,role:"button","aria-label":`Delete ${I.type} dependency`,onPointerDown:F=>{F.stopPropagation(),S()},children:[b.jsx("circle",{r:as}),b.jsx("path",{d:"M -3 -3 L 3 3 M 3 -3 L -3 3"})]})]},`arrow-${_}`)}),M&&b.jsxs("g",{className:"gantt-link-preview",children:[b.jsx("path",{className:`gantt-link-preview-line${M.rejection?" invalid":""}${M.armed?" armed":""}`,d:M.d,fill:"none",markerEnd:M.rejection?void 0:`url(#${N})`}),b.jsx("circle",{className:"gantt-link-preview-origin",cx:M.from.x,cy:M.from.y,r:"3"}),M.armed&&M.type&&b.jsx("text",{className:"gantt-link-preview-type",x:M.label.x,y:M.label.y,textAnchor:M.label.anchor,children:M.type}),M.rejection&&b.jsx("text",{className:"gantt-link-preview-reason",x:M.label.x,y:M.label.y,textAnchor:M.label.anchor,children:rs[M.rejection]})]})]})}function ds(){const t=V(d=>d.currentTask),n=V(d=>d.dragOffsets),r=V(d=>d.dragMode),s=V(d=>d.selectedScale),o=V(d=>d.localeOptions),e=V(d=>d.bottomRowCells),{edge:a,range:i}=p.useMemo(()=>Tt(s,o),[s,o]),c=p.useMemo(()=>un(e),[e]),u=t?n[t.id]:void 0;if(!t||!u)return null;const l=t.barLeft+u.offsetX,f=l+t.barWidth+u.offsetWidth,h=te(c,l),w=te(c,f);if(!h||!w)return null;const g=r==="left"?[{cell:h,label:a(u.offsetStartDate)}]:r==="right"?[{cell:w,label:a(u.offsetEndDate)}]:h.index===w.index?[{cell:h,label:i(u.offsetStartDate,u.offsetEndDate)}]:[{cell:h,label:a(u.offsetStartDate)},{cell:w,label:a(u.offsetEndDate)}];return b.jsxs("div",{className:"gantt-drag-guides","aria-hidden":"true",children:[g.map(({cell:d,label:m})=>b.jsx("div",{className:"gantt-drag-cell",style:{left:`${d.left}px`,width:`${d.width}px`},children:b.jsx("span",{children:m})},d.index)),b.jsx("div",{className:"gantt-drag-footprint",style:{left:`${l}px`,width:`${Math.max(f-l,2)}px`}})]})}function fs({width:t,onWidthChange:n}){const r=a=>Math.min(_e,Math.max(je,a)),s=a=>{if(!a.isPrimary||a.button!==0)return;const i=a.clientX,c=t;a.currentTarget.setPointerCapture(a.pointerId);const u=f=>{f.pointerId===a.pointerId&&n(r(c+f.clientX-i))},l=f=>{f.pointerId===a.pointerId&&(document.removeEventListener("pointermove",u),document.removeEventListener("pointerup",l),document.removeEventListener("pointercancel",l))};document.addEventListener("pointermove",u),document.addEventListener("pointerup",l),document.addEventListener("pointercancel",l)},o=a=>{var h,w;const i=(h=a.parentElement)==null?void 0:h.querySelectorAll(".gantt-grid-cell-text");if(!(i!=null&&i.length))return;const c=(w=a.parentElement)==null?void 0:w.querySelector(".gantt-grid");if(!c)return;const u=c.getBoundingClientRect().width/c.offsetWidth||1,l=document.createRange();let f=0;i.forEach(g=>{const d=g.closest(".gantt-grid-row");if(!d)return;l.selectNodeContents(g);const m=l.getBoundingClientRect().width;let S=g.getBoundingClientRect().left-d.getBoundingClientRect().left+m;for(let M=g.nextElementSibling;M;M=M.nextElementSibling)S+=M.getBoundingClientRect().width;f=Math.max(f,S)}),n(r(Math.ceil(f/u+10)+1))},e=a=>{if(a.key==="Enter"){a.preventDefault(),o(a.currentTarget);return}a.key!=="ArrowLeft"&&a.key!=="ArrowRight"||(a.preventDefault(),n(r(t+(a.key==="ArrowLeft"?-16:16))))};return b.jsx("div",{className:"gantt-grid-splitter",style:{left:`${t-2}px`},onPointerDown:s,onDoubleClick:a=>o(a.currentTarget),onKeyDown:e,role:"separator","aria-orientation":"vertical","aria-label":"Resize task list","aria-valuenow":t,"aria-valuemin":je,"aria-valuemax":_e,tabIndex:0})}function hs({width:t,onAdd:n}){return b.jsx("div",{className:"gantt-grid-footer",style:{width:`${t}px`},children:b.jsxs("button",{type:"button",className:"gantt-grid-add",onClick:n,children:[b.jsx("svg",{viewBox:"0 0 12 12","aria-hidden":"true",children:b.jsx("path",{d:"M6 2.5 V9.5 M2.5 6 H9.5"})}),"Add task"]})})}function ms({leftPx:t}){return t===null?null:b.jsx("div",{className:"gantt-today-marker",style:{left:`${t}px`},"aria-hidden":"true"})}function ps({leftPx:t}){return t===null?null:b.jsx("div",{className:"gantt-today-dot",style:{left:`${t}px`},"aria-hidden":"true"})}function ct(t){const n=p.useRef(t);return p.useLayoutEffect(()=>{n.current=t}),n}const gs=400,$s=10;function ne(t,n,r=document){if(t.pointerType==="mouse")return n(t.clientX,t.clientY),null;let s=t.clientX,o=t.clientY,e;const a=()=>{e!==void 0&&clearTimeout(e),e=void 0,r.removeEventListener("pointermove",i),r.removeEventListener("pointerup",c),r.removeEventListener("pointercancel",c)};function i(u){const l=u;if(l.pointerId!==t.pointerId)return;if(Math.abs(l.clientX-t.clientX)+Math.abs(l.clientY-t.clientY)>$s){a();return}s=l.clientX,o=l.clientY}function c(u){u.pointerId===t.pointerId&&a()}return r.addEventListener("pointermove",i),r.addEventListener("pointerup",c),r.addEventListener("pointercancel",c),e=setTimeout(()=>{a(),n(s,o)},gs),a}function re(){const t=n=>n.preventDefault();return document.addEventListener("touchmove",t,{passive:!1}),()=>document.removeEventListener("touchmove",t)}const qe=.25;function xs({rows:t,virtualItems:n,bodyRef:r,hierarchy:s,move:o}){const e=gt(),a=V(g=>g.reorderDraft),i=ct(t),c=ct(n),u=ct(o),l=p.useRef(null),f=p.useRef(null);p.useEffect(()=>()=>{var g,d;(g=l.current)==null||g.call(l),(d=f.current)==null||d.call(f)},[]);const h=(g,d,m,D)=>{const S=Qt(e.getState().rawTasks,s);try{D.setPointerCapture(d)}catch{}const M=m==="mouse"?null:re(),A=document.body.style.cursor;document.body.style.cursor="grabbing";const N=U=>{const T=r.current;if(!T)return null;const k=U-T.getBoundingClientRect().top,O=c.current.find(X=>k>=X.start&&k<X.start+X.size);if(!O)return null;const y=i.current[O.index],x=y==null?void 0:y.tasks[0];if(!y||!x||y.tasks.length>1)return null;const P=(k-O.start)/O.size,L=P<qe?"before":P>1-qe?"after":"child",H=Nr(S,g,x.id,L);return{taskId:g,rowIndex:O.index,mode:L,depth:L==="child"?y.depth+1:y.depth,move:H,rejection:u.current.validate(H)}};let I=null;const _=U=>{U.pointerId===d&&(I=U.clientY,e.getState().setReorderDraft(N(U.clientY)))},R=()=>{M==null||M(),document.body.style.cursor=A,document.removeEventListener("pointermove",_),document.removeEventListener("pointerup",F),document.removeEventListener("pointercancel",$),document.removeEventListener("keydown",j);try{D.releasePointerCapture(d)}catch{}},v=()=>{R(),f.current=null,e.getState().setReorderDraft(null)},$=U=>{U.pointerId===d&&v()};function j(U){U.key==="Escape"&&v()}function F(U){if(U.pointerId!==d)return;const T=I===null?null:N(I)??e.getState().reorderDraft;v(),T!=null&&T.move&&!T.rejection&&u.current.apply(T.move)}f.current=v,document.addEventListener("pointermove",_),document.addEventListener("pointerup",F),document.addEventListener("pointercancel",$),document.addEventListener("keydown",j)};return{onGripPointerDown:(g,d)=>{var A,N;if(!d.isPrimary||d.button!==0||f.current)return;(A=l.current)==null||A.call(l),l.current=null;const m=(N=i.current[g])==null?void 0:N.tasks[0];if(!m)return;const D=d.currentTarget,{pointerId:S,pointerType:M}=d;l.current=ne({pointerType:M,pointerId:S,clientX:d.clientX,clientY:d.clientY},()=>{l.current=null,h(m.id,S,M,D)})},draft:a}}const Ke=5,le=(t,n)=>Math.min(Math.max(t,0),Math.max(n,0));function Ds(t,n,r){var c;const s=r[n.row];if(!s)return null;const o=r.length-1,e=le(n.col,s.cells-1),a=t.key==="ArrowRight"?1:-1,i=t.key==="ArrowLeft"||t.key==="ArrowRight";if(i&&(t.altKey||t.shiftKey)){const u=t.altKey?t.shiftKey?"left":"bar":"right";return{kind:"nudge",row:n.row,col:e,mode:u,steps:a}}if(t.altKey&&(t.key==="ArrowUp"||t.key==="ArrowDown"))return{kind:"reorder",row:n.row,col:e,delta:t.key==="ArrowDown"?1:-1};if(i&&(t.ctrlKey||t.metaKey))return{kind:"reparent",row:n.row,col:e,direction:a};if((t.ctrlKey||t.metaKey)&&(t.key==="ArrowUp"||t.key==="ArrowDown"))return{kind:"zoom",direction:t.key==="ArrowUp"?-1:1};switch(t.key){case"ArrowDown":return{kind:"focus",focus:{row:Math.min(n.row+1,o),col:e}};case"ArrowUp":return{kind:"focus",focus:{row:Math.max(n.row-1,0),col:e}};case"ArrowRight":return e===0&&s.expandable&&!s.expanded?{kind:"toggle",row:n.row,col:e}:{kind:"focus",focus:{row:n.row,col:le(e+1,s.cells-1)}};case"ArrowLeft":return e===0&&s.expandable&&s.expanded?{kind:"toggle",row:n.row,col:e}:{kind:"focus",focus:{row:n.row,col:le(e-1,s.cells-1)}};case"Home":return t.ctrlKey||t.metaKey?{kind:"focus",focus:{row:0,col:0}}:{kind:"focus",focus:{row:n.row,col:0}};case"End":{const u=t.ctrlKey||t.metaKey?o:n.row;return{kind:"focus",focus:{row:u,col:Math.max((((c=r[u])==null?void 0:c.cells)??1)-1,0)}}}case"Enter":case" ":return s.expandable?{kind:"toggle",row:n.row,col:e}:{kind:"activate",row:n.row,col:e};case"Delete":case"Backspace":return{kind:"delete",row:n.row,col:e};case"+":case"=":return{kind:"progress",row:n.row,col:e,delta:Ke};case"-":case"_":return{kind:"progress",row:n.row,col:e,delta:-Ke};default:return null}}function bs(t,n,r){if(!(!t||!t.tasks.length))return t.tasks[Math.max(0,n-r)]??t.tasks[0]}function In(t,n,r=null){const s=[t.name];return t.isSummary&&s.push("summary"),s.push(`${n(C(t.startDate))} to ${n(C(t.endDate))}`),r!==null&&s.push(`${r}% complete`),s.join(", ")}function ws(t,n,r,s){const o=s?`under ${s}`:"at the top level";return`${t} moved to ${n} of ${r} ${o}`}function On(t,n,r){var s;return{role:"row","aria-level":t.level,"aria-posinset":t.posinset,"aria-setsize":t.setsize,"aria-rowindex":n+1+r.headerOffset,...r.expandable?{"aria-expanded":r.expanded}:null,...(s=r.ownedIds)!=null&&s.length?{"aria-owns":r.ownedIds.join(" ")}:null}}function Ve(t,n){return!t&&!n?null:{min:t?C(t):void 0,max:n?C(n):void 0}}function vs(t,n,r,s,o,e){const{canMove:a,canResize:i,minDate:c,maxDate:u}=ht(n,e);if((r==="bar"?!a:!i)||!s)return null;const l=new Set(n.isSummary&&r==="bar"?Yt(t,n.id):[n.id]),f=Ve(c,u),h=C(n.startDate),w=C(n.endDate);let g=r==="right"?h:kt(h,s,o),d=r==="left"?w:kt(w,s,o),m=null;if(r==="bar"){const S=[];for(const M of t){if(!l.has(M.id))continue;const A=ht(M,e),N=M.id===n.id?f:Ve(A.minDate,A.maxDate);N&&S.push({start:M.id===n.id?h:C(M.startDate),end:M.id===n.id?w:C(M.endDate),bounds:N})}if(S.length){if(m=wn(S,g.valueOf()-h.valueOf(),o),m===0)return null;g=h.add(m,"millisecond"),d=w.add(m,"millisecond")}}else if(f){const S=ye(r,g,d,f,o);g=S.startDate,d=S.endDate}if(r!=="bar"&&!d.isAfter(g)||r==="left"&&g.valueOf()===h.valueOf()||r==="right"&&d.valueOf()===w.valueOf())return null;const D=S=>m!==null?C(S).add(m,"millisecond").toISOString():kt(C(S),s,o).toISOString();return t.map(S=>{if(!l.has(S.id))return S;switch(r){case"bar":return{...S,startDate:D(S.startDate),endDate:D(S.endDate)};case"left":return{...S,startDate:g.toISOString()};default:return{...S,endDate:d.toISOString()}}})}function ys(t,n,r,s){if(!ht(n,s).canChangeProgress)return null;const o=_t(n.progress);if(o===null)return null;const e=Math.min(100,Math.max(0,o+r));return e===o?null:t.map(a=>a.id===n.id?{...a,progress:e}:a)}function Ss(t,n,r){if(!ht(n,r).canMove)return null;const s=new Set(Yt(t,n.id));if(!s.size)return null;const o=t.filter(e=>!s.has(e.id));return o.length===t.length?null:o}function Se(t,n){var r;return n&&!!((r=t.tasks[0])!=null&&r.isSummary)}function Ze(t){return C(t.endDate).valueOf()}function Ms(t){if(t.length<2)return t.length?[[...t]]:[];const n=t.map((o,e)=>({task:o,index:e})).sort((o,e)=>{const a=C(o.task.startDate).valueOf()-C(e.task.startDate).valueOf();return a!==0?a:o.index-e.index}),r=[],s=[];for(const{task:o}of n){const e=C(o.startDate).valueOf(),a=s.findIndex(i=>i<=e);a===-1?(r.push([o]),s.push(Ze(o))):(r[a].push(o),s[a]=Math.max(s[a],Ze(o)))}return r}function ks(t){const n=new Map;for(const o of t){if(!o.lane)continue;const e=n.get(o.lane);e?e.push(o):n.set(o.lane,[o])}if(!n.size)return t.map(o=>[o]);const r=[],s=new Set;for(const o of t){if(!o.lane){r.push([o]);continue}s.has(o.lane)||(s.add(o.lane),r.push(...Ms(n.get(o.lane)??[])))}return r}function Is(t){const n=ks(t),r=n.map(i=>i.map(c=>c.id).join("+")),s=[],o=new Map,e=[];n.forEach((i,c)=>{const u=i[0].depth,l=u===0?"":e[u-1]??"";s.push(l),o.set(l,(o.get(l)??0)+1),e[u]=r[c],e.length=u+1});const a=new Map;return n.map((i,c)=>{const u=s[c],l=(a.get(u)??0)+1;a.set(u,l);const f=i[0].depth,h=c+1;return{id:r[c],tasks:i.map(w=>w.order===h?w:{...w,order:h}),depth:f,level:f+1,posinset:l,setsize:o.get(u)??1}})}function Os({rows:t,virtualItems:n,totalHeight:r,width:s,showRowNumbers:o,hierarchy:e,collapsedIds:a,onToggleCollapse:i,focus:c,reorderEnabled:u,interaction:l,move:f,selectedTaskId:h,onRowClick:w,onRowDoubleClick:g}){const d=p.useRef(null),{onGripPointerDown:m,draft:D}=xs({rows:t,virtualItems:n,bodyRef:d,hierarchy:e,move:f}),S=D?n.find(M=>M.index===D.rowIndex):void 0;return b.jsxs("div",{className:"gantt-grid",style:{width:`${s}px`},role:"presentation",children:[b.jsxs("div",{className:"gantt-grid-header",style:{height:`${or}px`},role:"row","aria-rowindex":1,children:[b.jsx("div",{className:"gantt-grid-header-cell",role:"columnheader",children:b.jsx("span",{className:"gantt-sr-only",children:"Task name"})}),b.jsx("span",{className:"gantt-sr-only",role:"columnheader",children:"Timeline"})]}),b.jsxs("div",{ref:d,className:"gantt-grid-body",style:{height:`${r}px`},role:"rowgroup",children:[n.map(M=>{const A=t[M.index];if(!A)return null;const N=A.tasks[0],I=Se(A,e),_=a.has(A.id),R=c.row===M.index,v=On(A,M.index,{headerOffset:1,expandable:I,expanded:!_,ownedIds:A.tasks.map(F=>`task-${F.id}`)}),$={height:`${M.size}px`,transform:`translateY(${M.start}px)`};if(!N)return null;const j=u&&A.tasks.length===1&&ht(N,l).canReorder;return b.jsx("div",{"data-row-id":A.id,className:["gantt-grid-row",N.isSummary?"summary":"",N.id===h?"selected":"",N.id===(D==null?void 0:D.taskId)?"dragging":"",N.className??""].filter(Boolean).join(" "),style:$,onClick:w&&(F=>w(N,F)),onDoubleClick:g&&(F=>g(N,F)),...v,children:b.jsxs("div",{className:"gantt-grid-cell",title:N.name,role:"gridcell",tabIndex:R&&c.col===0?0:-1,"data-gantt-cell":`${M.index}:0`,children:[u&&(j?b.jsx("button",{type:"button",className:"gantt-grid-grip",onPointerDown:F=>{F.stopPropagation(),m(M.index,F)},tabIndex:-1,"aria-hidden":"true",children:b.jsxs("svg",{viewBox:"0 0 12 12","aria-hidden":"true",children:[b.jsx("circle",{cx:"4.5",cy:"2.5",r:"1.1"}),b.jsx("circle",{cx:"7.5",cy:"2.5",r:"1.1"}),b.jsx("circle",{cx:"4.5",cy:"6",r:"1.1"}),b.jsx("circle",{cx:"7.5",cy:"6",r:"1.1"}),b.jsx("circle",{cx:"4.5",cy:"9.5",r:"1.1"}),b.jsx("circle",{cx:"7.5",cy:"9.5",r:"1.1"})]})}):b.jsx("span",{className:"gantt-grid-grip-spacer"})),o&&b.jsx("span",{className:"gantt-grid-no",children:N.sequence}),b.jsx("span",{className:"gantt-grid-indent",style:{width:`${A.depth*Ye}px`}}),I?b.jsx("button",{type:"button",className:`gantt-grid-expander${_?"":" open"}`,onClick:F=>{F.stopPropagation(),i(A.id)},tabIndex:-1,"aria-hidden":"true",children:b.jsx("svg",{viewBox:"0 0 12 12","aria-hidden":"true",children:b.jsx("path",{d:"M4 2.5 L8 6 L4 9.5"})})}):b.jsx("span",{className:"gantt-grid-expander-spacer"}),b.jsx("span",{className:"gantt-grid-cell-text",children:N.name}),A.tasks.length>1&&b.jsxs("span",{className:"gantt-grid-lane-count",children:["+",A.tasks.length-1]})]})},`grid-row-${A.id}`)}),D&&S&&b.jsx("div",{className:["gantt-grid-drop",D.mode==="child"?"child":"",D.rejection?"blocked":""].filter(Boolean).join(" "),style:D.mode==="child"?{top:`${S.start}px`,height:`${S.size}px`}:{top:`${S.start+(D.mode==="after"?S.size:0)}px`,marginLeft:`${D.depth*Ye}px`},"aria-hidden":"true"})]})]})}function Je(t,n){return!t&&!n?null:{min:t?C(t):void 0,max:n?C(n):void 0}}function Es(t,n={},r,s){const o=gt(),e=p.useRef(null),a=p.useRef(null),i=p.useRef(!1),c=p.useRef(null),u=p.useRef(n);u.current=n,p.useEffect(()=>()=>{var A;return(A=c.current)==null?void 0:A.call(c)},[]);const l=V(A=>A.selectedScale),{basePxPerDragStep:f}=at[l],{canMove:h,canResize:w,minDate:g,maxDate:d}=ht(t,r),m=A=>{const N=A.currentTarget.getBoundingClientRect(),I=A.pointerType!=="mouse",_=I?hn:jt,R=I?lr:be;if(w&&N.width>=R){const v=A.clientX-N.left;if(v<=_)return"left";if(v>=N.width-_)return"right"}return h?"bar":null},D=A=>{var v;if(!A.isPrimary||A.button!==0||e.current)return;(v=c.current)==null||v.call(c),c.current=null;const N=m(A);if(!N)return;const I=A.currentTarget,{pointerId:_,pointerType:R}=A;c.current=ne({pointerType:R,pointerId:_,clientX:A.clientX,clientY:A.clientY},$=>{c.current=null,S(N,_,R,$,I)})},S=(A,N,I,_,R)=>{a.current=A,i.current=!1;const v=R.closest(".gantt-scroll-container"),$=o.getState().rawTasks,j=t.isSummary?Yt($,t.id):[t.id],F=new Set(j),U=new Map($.filter(E=>F.has(E.id)).map(E=>[E.id,{start:C(E.startDate),end:C(E.endDate)}]));U.set(t.id,{start:C(t.startDate),end:C(t.endDate)});const T=Je(g,d),k=[];for(const E of $){if(!F.has(E.id))continue;const G=U.get(E.id);if(!G)continue;const B=ht(E,r),st=E.id===t.id?T:Je(B.minDate,B.maxDate);st&&k.push({start:G.start,end:G.end,bounds:st})}e.current={mode:A,pointerId:N,initialClientX:_,initialStartDate:C(t.startDate),initialEndDate:C(t.endDate),initialBarWidth:t.barWidth,dragSteps:0,basePxPerDragStep:f,lastClientX:_,autoScrollPx:0,scaleKey:l,taskId:t.id,taskIds:j,initialDates:U,snapDays:0,bounds:T,boundedMembers:k,moveDeltaMs:null,clamped:null},o.getState().setCurrentTask(t),o.getState().setDragMode(A),R.focus({preventScroll:!0});try{R.setPointerCapture(N)}catch{}const O=I==="mouse"?null:re(),y=()=>{const E=e.current;if(!E)return;const G=E.lastClientX-E.initialClientX+E.autoScrollPx,B=Math.round(G/E.basePxPerDragStep),st=Math.floor((E.initialBarWidth-E.basePxPerDragStep)/E.basePxPerDragStep);let nt=B;if(E.mode==="left"&&(nt=Math.min(B,st)),E.mode==="right"&&(nt=Math.max(B,-st)),nt===E.dragSteps)return;E.dragSteps=nt,i.current=!0;const $t=nt*E.basePxPerDragStep,rt=W=>kt(W,nt,E.scaleKey);let Q,q,K=0,ft=0;switch(E.mode){case"bar":Q=rt(E.initialStartDate),q=rt(E.initialEndDate),K=$t,ft=0;break;case"left":Q=rt(E.initialStartDate),q=E.initialEndDate,K=$t,ft=-$t;break;case"right":Q=E.initialStartDate,q=rt(E.initialEndDate),K=0,ft=$t;break}let ot=0;if(s!=null&&s.skipsNonWorkingDays){const W=E.mode==="right"?q:Q,J=s.snapForward(W);ot=J.diff(W,"day"),E.mode==="left"&&J.valueOf()>=q.valueOf()&&(ot=0)}E.snapDays=ot;const xt=ot?ce(Q,Q.add(ot,"day"),E.scaleKey):0;if(ot&&(E.mode!=="right"&&(Q=Q.add(ot,"day"),K+=xt),E.mode!=="left"&&(q=q.add(ot,"day")),E.mode==="left"&&(ft-=xt),E.mode==="right"&&(ft+=xt)),E.mode==="bar"){if(E.boundedMembers.length){const W=Q.valueOf()-E.initialStartDate.valueOf(),J=wn(E.boundedMembers,W,E.scaleKey);E.moveDeltaMs=J,Q=E.initialStartDate.add(J,"millisecond"),q=E.initialEndDate.add(J,"millisecond")}}else if(E.bounds){const W=ye(E.mode,Q,q,E.bounds,E.scaleKey);E.clamped=W,Q=W.startDate,q=W.endDate}if(E.moveDeltaMs!==null||E.clamped){const W=ce(E.initialStartDate,Q,E.scaleKey),J=ce(E.initialEndDate,q,E.scaleKey);K=W,ft=J-W}const Dt=E.moveDeltaMs!==null?W=>W.add(E.moveDeltaMs,"millisecond"):W=>rt(W).add(ot,"day"),vt=E.moveDeltaMs!==null?K:$t+xt,Y={};for(const W of E.taskIds){const J=E.initialDates.get(W),lt=W===E.taskId||!J,it=lt?Q:Dt(J.start),Ht=lt?q:Dt(J.end);Y[W]={offsetX:lt?K:vt,offsetWidth:lt?ft:0,offsetStartDate:it,offsetEndDate:Ht}}o.getState().setDragOffsets(Y)};let x=null,P=0;const L=()=>{x!==null&&cancelAnimationFrame(x),x=null,P=0},H=E=>{!v||!E.autoScrollPx||(v.scrollBy({left:-E.autoScrollPx,behavior:"smooth"}),E.autoScrollPx=0)},X=()=>{x=null;const E=e.current;if(!E||!v||P===0)return;const G=v.scrollLeft;v.scrollLeft=G+P;const B=v.scrollLeft-G;B!==0&&(E.autoScrollPx+=B,y()),x=requestAnimationFrame(X)},z=E=>{if(u.current.autoScroll===!1||!v)return;const G=v.getBoundingClientRect(),B=v.querySelector(".gantt-grid");P=me(E,G.left+((B==null?void 0:B.offsetWidth)??0),G.right),P===0?L():x===null&&(x=requestAnimationFrame(X))},Z=E=>{const G=e.current;!G||E.pointerId!==G.pointerId||(G.lastClientX=E.clientX,z(E.clientX),y())},tt=()=>{L(),document.removeEventListener("pointermove",Z),document.removeEventListener("pointerup",dt),document.removeEventListener("pointercancel",et),O==null||O()},mt=E=>{H(E),e.current=null,a.current=null,o.getState().setCurrentTask(null),o.getState().setDragMode(null),o.getState().clearDragOffsets(E.taskIds)},et=E=>{const G=e.current;G&&E.pointerId!==G.pointerId||(tt(),G&&mt(G))},dt=E=>{var ot,xt,Dt,vt;const G=e.current;if(G&&E.pointerId!==G.pointerId)return;tt();const B=G;if(!B)return;if(B.dragSteps===0){mt(B);return}const st=o.getState().rawTasks,nt=Y=>B.moveDeltaMs!==null?C(Y).add(B.moveDeltaMs,"millisecond").toISOString():kt(C(Y),B.dragSteps,B.scaleKey).add(B.snapDays,"day").toISOString(),$t=(ot=B.clamped)==null?void 0:ot.startDate.toISOString(),rt=(xt=B.clamped)==null?void 0:xt.endDate.toISOString(),Q=new Set(B.taskIds),q=st.map(Y=>{if(!Q.has(Y.id))return Y;switch(B.mode){case"bar":return{...Y,startDate:nt(Y.startDate),endDate:nt(Y.endDate)};case"left":return{...Y,startDate:$t??nt(Y.startDate)};case"right":return{...Y,endDate:rt??nt(Y.endDate)}}});e.current=null,a.current=null,o.getState().setCurrentTask(null),o.getState().setDragMode(null);const K=new Map(q.filter(Y=>Q.has(Y.id)).map(Y=>[Y.id,Y])),ft=o.getState().rawTasks.map(Y=>K.get(Y.id)??Y);o.getState().setRawTasks(ft),(vt=(Dt=u.current).onTasksChange)==null||vt.call(Dt,ft)};document.addEventListener("pointermove",Z),document.addEventListener("pointerup",dt),document.addEventListener("pointercancel",et)},M=()=>i.current?(i.current=!1,!0):!1;return{onPointerDown:D,dragMode:a.current,consumeDragClick:M}}const ue={hoverTaskId:null,hoverAnchor:null,rejection:null};function Ps({task:t,interaction:n,onTasksChange:r,onDependencyCreate:s}){const o=gt(),e=p.useRef(null),a=p.useRef(null);return p.useEffect(()=>()=>{var c;return(c=a.current)==null?void 0:c.call(a)},[]),{startLink:c=>u=>{if(!u.isPrimary||u.button!==0||e.current!==null)return;u.stopPropagation(),u.preventDefault();const l=u.currentTarget,f=l.closest(".gantt-content"),h=l.closest(".gantt-scroll-container");if(!f)return;const w=u.pointerId;e.current=w;try{l.setPointerCapture(w)}catch{}const g=u.clientX,d=u.clientY;let m=!1,D=g,S=d;const M=document.body.style.cursor,A=(x,P)=>{const L=f.getBoundingClientRect(),H=es(o.getState().rowTasks,x-L.left,P-L.top,bt,dr);if(!H)return ue;const X=o.getState().rawTasks,z=X.find(tt=>tt.id===H.task.id);return H.task.id===t.id||z!==void 0&&ht(z,n).canCreateLink?{hoverTaskId:H.task.id,hoverAnchor:H.anchor,rejection:ns(X,t.id,H.task.id)}:ue},N=(x,P)=>{const L=f.getBoundingClientRect();o.getState().setLinkDraft({fromTaskId:t.id,fromAnchor:c,toX:x-L.left,toY:P-L.top,...A(x,P)})};let I=null,_=0,R=0;const v=()=>{I!==null&&cancelAnimationFrame(I),I=null,_=0,R=0},$=()=>{if(I=null,!h||_===0&&R===0)return;const x=h.scrollLeft,P=h.scrollTop;if(h.scrollLeft=x+_,h.scrollTop=P+R,h.scrollLeft===x&&h.scrollTop===P){v();return}N(D,S),I=requestAnimationFrame($)},j=(x,P)=>{if(!h)return;const L=h.getBoundingClientRect(),H=h.querySelector(".gantt-grid");_=me(x,L.left+((H==null?void 0:H.offsetWidth)??0),L.right),R=me(P,L.top,L.bottom),_===0&&R===0?v():I===null&&(I=requestAnimationFrame($))},F=x=>{if(x.pointerId===w){if(D=x.clientX,S=x.clientY,!m){if(Math.abs(D-g)<He&&Math.abs(S-d)<He)return;m=!0,o.getState().setSelectedDependency(null),document.body.style.cursor="crosshair"}j(D,S),N(D,S)}},U=()=>{v(),document.body.style.cursor=M,document.removeEventListener("pointermove",F),document.removeEventListener("pointerup",y),document.removeEventListener("pointercancel",k),document.removeEventListener("keydown",O);try{l.releasePointerCapture(w)}catch{}},T=()=>{U(),a.current=null,e.current=null,o.getState().setLinkDraft(null)},k=x=>{x.pointerId===w&&T()};function O(x){x.key==="Escape"&&T()}function y(x){if(x.pointerId!==w)return;const L=m?A(x.clientX,x.clientY):ue;if(T(),!L.hoverTaskId||!L.hoverAnchor||L.rejection)return;const H={predecessorId:t.id,successorId:L.hoverTaskId,type:kn(c,L.hoverAnchor)};if((s==null?void 0:s(H))===!1)return;const X=ss(o.getState().rawTasks,H.predecessorId,H.successorId,H.type);o.getState().setRawTasks(X),r==null||r(X)}a.current=T,document.addEventListener("pointermove",F),document.addEventListener("pointerup",y),document.addEventListener("pointercancel",k),document.addEventListener("keydown",O)}}}function Ts(t,n,r={}){const s=gt(),[o,e]=p.useState(null),a=p.useRef(null),i=p.useRef(null);p.useEffect(()=>()=>{var h;return(h=i.current)==null?void 0:h.call(i)},[]);const c=h=>{const w=n.current;if(!w)return null;const g=w.getBoundingClientRect();if(g.width===0)return null;const d=(h-g.left)/g.width;return Math.round(Math.min(1,Math.max(0,d))*100)},{onTasksChange:u}=r,l=h=>{var g;h.stopPropagation(),h.preventDefault(),(g=i.current)==null||g.call(i),i.current=null;const{pointerType:w}=h;i.current=ne({pointerType:w,pointerId:h.pointerId,clientX:h.clientX,clientY:h.clientY},()=>{i.current=null,f(w)})},f=h=>{const w=h==="mouse"?null:re(),g=m=>{const D=c(m.clientX);D!==null&&(a.current=D,e(D))},d=()=>{document.removeEventListener("pointermove",g),document.removeEventListener("pointerup",d),document.removeEventListener("pointercancel",d),w==null||w();const m=a.current;if(a.current=null,m===null){e(null);return}const D=s.getState().rawTasks.map(S=>S.id===t.id?{...S,progress:m}:S);s.getState().setRawTasks(D),e(null),u==null||u(D)};document.addEventListener("pointermove",g),document.addEventListener("pointerup",d),document.addEventListener("pointercancel",d)};return{onProgressPointerDown:l,progress:o??_t(t.progress),isDraggingProgress:o!==null}}function Ls({currentTask:t,options:n,interaction:r,tabIndex:s,cellCoord:o,calendar:e,autoScrollOnDrag:a,onDependencyCreate:i}){const{onTasksChange:c,onTaskClick:u,onTaskDoubleClick:l,showTooltip:f=!0}=n,h=p.useRef(null),{onPointerDown:w,dragMode:g,consumeDragClick:d}=Es(t,{onTasksChange:c,autoScroll:a},r,e),{canMove:m,canResize:D,canChangeProgress:S,canCreateLink:M}=ht(t,r),[A,N]=p.useState(!1),[I,_]=p.useState(!1),R=gt(),v=V(Y=>Y.setHoveredTaskId),$=p.useRef(null),j=p.useCallback(()=>{$.current!==null&&(clearTimeout($.current),$.current=null)},[]);p.useEffect(()=>{const Y=t.id;return()=>{j(),R.getState().hoveredTaskId===Y&&R.getState().setHoveredTaskId(null)}},[t.id,j,R]);const{startLink:F}=Ps({task:t,interaction:r,onTasksChange:c,onDependencyCreate:i}),U=V(Y=>{const W=Y.linkDraft;return W?W.hoverTaskId===t.id?` link-${W.rejection?"invalid":"valid"} link-at-${W.hoverAnchor}`:W.fromTaskId===t.id?` link-source link-at-${W.fromAnchor}`:"":""}),T=M&&b.jsx(b.Fragment,{children:["start","end"].map(Y=>b.jsx("span",{className:`gantt-link-handle ${Y}`,onPointerDown:F(Y),role:"button",tabIndex:-1,"aria-label":`Link from the ${Y} of ${t.name}`},Y))}),k=V(Y=>Y.dragOffsets[t.id]),O=V(Y=>{var W;return((W=Y.currentTask)==null?void 0:W.id)===t.id}),y=V(Y=>Y.selectedScale),x=V(Y=>Y.localeOptions),P=V(Y=>Y.selectedTaskId===t.id),L=(k==null?void 0:k.offsetX)??0,H=(k==null?void 0:k.offsetWidth)??0,X=t.barLeft+L,z=t.barWidth+H,Z=Math.max(z,ur),tt=Z<cr,{onProgressPointerDown:mt,progress:et,isDraggingProgress:dt}=Ts(t,h,{onTasksChange:c}),E=et!==null,G=p.useCallback(Y=>{const W=h.current;if(!W)return;const J=W.getBoundingClientRect();if(J.width<be){N(!1);return}const lt=Y.clientX-J.left;N(lt<=jt||lt>=J.width-jt)},[]),B=Y=>{d()||u==null||u(t,Y)},st=Y=>{l==null||l(t,Y)},nt=m?"grab":"default",$t=O?m||D?"grabbing":nt:A&&D?"ew-resize":nt,{tooltip:rt}=p.useMemo(()=>Tt(y,x),[y,x]),Q=In(t,rt,E?et:null),q=Y=>{if(!k)return"";const W=rt(k.offsetStartDate),J=rt(k.offsetEndDate);switch(Y){case"left":return`Start: ${W}`;case"right":return`End: ${J}`;case"bar":default:return`${W} → ${J}`}},K=f?dt?"progress":O&&k?g==="left"||g==="right"?"resize":"move":I?"hover":null:null;p.useEffect(()=>{if(!I)return;const Y=W=>{W.key==="Escape"&&_(!1)};return document.addEventListener("keydown",Y),()=>document.removeEventListener("keydown",Y)},[I]);const ft=()=>{if(!K)return null;const Y=K!=="hover",W=Y&&k?k.offsetStartDate:C(t.startDate),J=Y&&k?k.offsetEndDate:C(t.endDate);return K==="progress"?b.jsxs("div",{className:"gantt-bar-tooltip",role:"status","aria-live":"polite",children:[et,"%"]}):Y?b.jsx("div",{className:"gantt-bar-tooltip gantt-sr-only",role:"status","aria-live":"polite",children:q(g)}):b.jsxs("div",{className:"gantt-bar-tooltip gantt-bar-tooltip-detail",role:"tooltip",children:[b.jsx("span",{className:"gantt-tooltip-name",children:t.name}),b.jsx("span",{className:"gantt-tooltip-meta",children:`${rt(W)} → ${rt(J)}`}),b.jsxs("span",{className:"gantt-tooltip-meta",children:[$n(J.valueOf()-W.valueOf()),et!==null?` · ${et}%`:""]})]})},ot=Vr(t.color),xt={transform:`translateX(${X}px)`,width:Z,height:t.isSummary?sr:fe,cursor:$t,...ot},Dt=[P?"selected":"",t.className??""].filter(Boolean).join(" "),vt=Dt?` ${Dt}`:"";return b.jsxs("div",{ref:h,id:`task-${t.id}`,"data-task-id":t.id,className:`gantt-task-bar${O?" dragging":""}${K?" has-tooltip":""}${tt?" compact":""}${t.isSummary?" summary":""}${D?"":" no-resize"}${U}${vt}`,onPointerDown:w,onClick:B,onDoubleClick:st,onMouseMove:G,onPointerEnter:Y=>{Y.pointerType==="mouse"&&(v(t.id),j(),$.current=setTimeout(()=>_(!0),fr))},onMouseLeave:()=>{N(!1),v(null),j(),_(!1)},style:xt,role:"gridcell",tabIndex:s,"data-gantt-cell":o,"aria-label":Q,children:[E&&b.jsxs(b.Fragment,{children:[b.jsx("div",{className:"gantt-progress-fill",style:{width:`${et}%`}}),S&&b.jsx("div",{className:`gantt-progress-handle${dt?" dragging":""}`,style:{left:`clamp(${Ce}px, ${et}%, calc(100% - ${Ce}px))`},onPointerDown:mt,role:"slider",tabIndex:-1,"aria-label":`${t.name} progress`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":et})]}),b.jsx("span",{className:`gantt-task-name${tt?" outside":""}`,children:t.name}),T,ft()]})}function As({rows:t,virtualItems:n,gridColumnCount:r,focus:s,isBarVisible:o,options:e,interaction:a,calendar:i,autoScrollOnDrag:c,onDependencyCreate:u}){return n.flatMap(l=>{const f=t[l.index];return f?f.tasks.map((h,w)=>{if(!o(h.barLeft,h.barWidth))return null;const g=r+w;return b.jsx("div",{className:"gantt-bar-wrap",style:{position:"absolute",top:0,left:0,height:`${l.size-1}px`,transform:`translateY(${l.start}px)`,display:"flex",alignItems:"center"},children:b.jsx(Ls,{currentTask:h,options:e,interaction:a,calendar:i,autoScrollOnDrag:c,onDependencyCreate:u,tabIndex:s.row===l.index&&s.col===g?0:-1,cellCoord:`${l.index}:${g}`})},h.id)}):[]})}function Rs({ranges:t}){const n=V(o=>o.bottomRowCells),r=p.useMemo(()=>un(n),[n]),s=p.useMemo(()=>{const o=new Set;return t.flatMap(e=>{if(!e.label)return[];const a=te(r,e.left),i=te(r,e.left+e.width-1);if(!a||!i)return[];const c=e.width>=pr&&!o.has(a.index);return c&&o.add(a.index),[{label:e.label,shown:c,left:e.left,width:e.width,cellLeft:a.left-e.left,cellWidth:i.left+i.width-a.left}]})},[t,r]);return s.length?b.jsx("div",{className:"gantt-holiday-labels",children:s.map(o=>b.jsx("div",{className:"gantt-holiday-band",style:{left:`${o.left}px`,width:`${o.width}px`},children:b.jsx("div",{className:`gantt-holiday-cell${o.shown?" shown":""}`,style:{left:`${o.cellLeft}px`,width:`${o.cellWidth}px`},children:b.jsx("span",{children:o.label})})},o.left))}):null}function Ns({ranges:t}){return t.length?b.jsx("div",{className:"gantt-non-working-layer","aria-hidden":"true",children:t.map(n=>b.jsx("div",{className:"gantt-non-working-range",style:{left:`${n.left}px`,width:`${n.width}px`,...n.color&&{background:`color-mix(in srgb, ${n.color} 14%, transparent)`}}},n.left))}):null}function js({rows:t,virtualItems:n,ownedByTaskList:r,hierarchy:s,collapsedIds:o}){return b.jsx("div",{className:"gantt-rows",role:"presentation",children:n.map(e=>{const a=t[e.index];if(!a)return null;const i={height:`${e.size}px`,transform:`translateY(${e.start}px)`};return r?b.jsx("div",{className:"gantt-task-row",style:i,"aria-hidden":"true"},`row-${a.id}`):b.jsx("div",{className:"gantt-task-row",style:i,...On(a,e.index,{headerOffset:0,expandable:Se(a,s),expanded:!o.has(a.id),ownedIds:a.tasks.map(c=>`task-${c.id}`)})},`row-${a.id}`)})})}const _s=[];function Ys({collapsedIds:t,defaultCollapsedIds:n,onCollapsedChange:r}){const[s,o]=p.useState(()=>n??_s),e=t??s,a=p.useMemo(()=>new Set(e),[e]),i=p.useCallback(l=>{t===void 0&&o(l),r==null||r(l)},[t,r]),c=p.useCallback(l=>{i(e.includes(l)?e.filter(f=>f!==l):[...e,l])},[e,i]),u=p.useCallback(l=>{e.includes(l)&&i(e.filter(f=>f!==l))},[e,i]);return{collapsedIds:a,toggle:c,expand:u}}const Qe=4;function Cs(t,n,r){const s=It(t,n,r)??0,o=yn(s,s,n,r);return o?{startDate:o.startDate.toISOString(),endDate:o.endDate.toISOString()}:null}function Hs(t,n){const r=n*bt;return t<r?null:r}function Fs({enabled:t,rowCount:n,onTaskCreate:r}){const s=gt(),[o,e]=p.useState(null),a=p.useRef(null),i=p.useRef(null),c=l=>{var w;if(!t||!l.isPrimary||l.button!==0||a.current!==null||l.target!==l.currentTarget)return;(w=i.current)==null||w.call(i),i.current=null;const f=l.currentTarget,h=l.pointerId;i.current=ne({pointerType:l.pointerType,pointerId:h,clientX:l.clientX,clientY:l.clientY},(g,d)=>{i.current=null,u(f,h,l.pointerType,g,d)})},u=(l,f,h,w,g)=>{const d=l.getBoundingClientRect(),m=w-d.left,D=Hs(g-d.top,n);if(D===null)return;a.current=f;const S=h==="mouse"?null:re(),M=$=>{const{bottomRowCells:j,selectedScale:F}=s.getState(),U=l.getBoundingClientRect();return yn(m,$-U.left,j,F)},A=$=>{if($.pointerId!==f)return;const j=l.getBoundingClientRect();if(Math.abs($.clientX-j.left-m)<Qe){e(null);return}const F=M($.clientX);e(F&&{leftPx:F.leftPx,widthPx:F.widthPx,topPx:D})},N=()=>{document.removeEventListener("pointermove",A),document.removeEventListener("pointerup",v),document.removeEventListener("pointercancel",_),document.removeEventListener("keydown",R)},I=()=>{N(),S==null||S(),a.current=null,e(null)},_=$=>{$.pointerId===f&&I()},R=$=>{$.key==="Escape"&&I()},v=$=>{if($.pointerId!==f)return;const j=l.getBoundingClientRect(),U=Math.abs($.clientX-j.left-m)>=Qe?M($.clientX):null;I(),U&&(r==null||r({startDate:U.startDate.toISOString(),endDate:U.endDate.toISOString()}))};document.addEventListener("pointermove",A),document.addEventListener("pointerup",v),document.addEventListener("pointercancel",_),document.addEventListener("keydown",R)};return{onDrawPointerDown:c,ghost:o}}function Us({readOnly:t,allowMove:n,allowResize:r,allowProgressChange:s,allowLinkCreate:o,allowLinkDelete:e,allowTaskCreate:a,allowReorder:i,minDate:c,maxDate:u}){return p.useMemo(()=>({readOnly:t,allowMove:n,allowResize:r,allowProgressChange:s,allowLinkCreate:o,allowLinkDelete:e,allowTaskCreate:a,allowReorder:i,minDate:c,maxDate:u}),[t,n,r,s,o,e,a,i,c,u])}const Ws=3;function Gs({rows:t,rawTasks:n,gridColumnCount:r,hierarchy:s,collapsedIds:o,selectedScale:e,localeOptions:a,interaction:i,onActivate:c,onToggleCollapse:u,onTasksChange:l,move:f,scrollToRow:h,scrollApi:w,bodyRef:g}){const d=gt(),[m,D]=p.useState({row:0,col:0}),[S,M]=p.useState(0),[A,N]=p.useState(""),I=p.useMemo(()=>({row:Math.min(m.row,Math.max(t.length-1,0)),col:m.col}),[m,t.length]),_=p.useMemo(()=>t.map(U=>({cells:Math.max(r+U.tasks.length,1),firstBarCell:r,expandable:Se(U,s),expanded:!o.has(U.id)})),[t,r,s,o]),{tooltip:R}=p.useMemo(()=>Tt(e,a),[e,a]),v=p.useCallback(U=>{d.getState().setRawTasks(U),l==null||l(U)},[d,l]),$=p.useCallback(U=>{const T=d.getState().rawTasks,k=Qt(T,s),O=k.parentOf.get(U.id)??null,y=k.childrenOf(O),x=T.find(P=>P.id===O);N(ws(U.name,y.indexOf(U.id)+1,y.length,(x==null?void 0:x.name)??null)),M(P=>P+1)},[d,s]),j=p.useCallback(U=>{const T=Ds(U,I,_);if(!T)return;if(U.preventDefault(),T.kind==="zoom"){const x=xn(e,T.direction);x!==e&&(w.setScale(x),N(`${x} scale`));return}const k=t[T.kind==="focus"?I.row:T.row],O=_[I.row],y=T.kind==="focus"?void 0:bs(k,T.col,(O==null?void 0:O.firstBarCell)??0);switch(T.kind){case"focus":D(T.focus),M(x=>x+1);break;case"toggle":k&&u(k.id);break;case"activate":y&&(c==null||c(y.id),N(In(y,R,null)));break;case"delete":{if(!y)return;const x=Ss(n,y,i);if(!x){N(`${y.name} cannot be deleted`);break}v(x),N(`${y.name} deleted`);break}case"nudge":{if(!y)return;const x=vs(n,y,T.mode,T.steps,e,i);if(!x){N(`${y.name} cannot be changed`);break}v(x);const P=x.find(L=>L.id===y.id);P&&N(`${y.name}, ${R(C(P.startDate))} to ${R(C(P.endDate))}`),M(L=>L+1);break}case"progress":{if(!y)return;const x=ys(n,y,T.delta,i);if(!x){N(`${y.name} progress cannot be changed`);break}v(x);const P=x.find(L=>L.id===y.id);N(`${y.name}, ${(P==null?void 0:P.progress)??0}% complete`),M(L=>L+1);break}case"reorder":{if(!y)return;const x=Qt(n,s),P=x.parentOf.get(y.id)??null,L=x.childrenOf(P),H=L.indexOf(y.id)+T.delta;if(H<0||H>=L.length)break;f.apply({taskId:y.id,toParentId:P,toIndex:H})&&$(y);break}case"reparent":{if(!y||!s)return;const x=Qt(n,s),P=x.parentOf.get(y.id)??null,L=x.childrenOf(P);if(T.direction>0){const z=L[L.indexOf(y.id)-1];if(!z)break;f.apply({taskId:y.id,toParentId:z,toIndex:x.childrenOf(z).length})&&$(y);break}if(!P)break;const H=x.parentOf.get(P)??null,X=x.childrenOf(H);f.apply({taskId:y.id,toParentId:H,toIndex:X.indexOf(P)+1})&&$(y);break}}},[I,_,t,c,u,n,i,e,w,v,R,s,f,$]),F=p.useCallback(U=>{var y,x,P;const T=(P=(x=(y=U.target).closest)==null?void 0:x.call(y,"[data-gantt-cell]"))==null?void 0:P.getAttribute("data-gantt-cell");if(!T)return;const[k,O]=T.split(":").map(Number);D(L=>L.row===k&&L.col===O?L:{row:k,col:O})},[]);return p.useEffect(()=>{if(!S)return;let U=Ws,T=0;const k=()=>{var x,P;const O=(x=g.current)==null?void 0:x.querySelector(`[data-gantt-cell="${I.row}:${I.col}"]`);if(O){O.focus({preventScroll:!0}),O.scrollIntoView({block:"nearest",inline:"nearest"});return}if(--U<=0)return;h(I.row,"auto");const y=(P=t[I.row])==null?void 0:P.tasks[0];y&&w.scrollToTask(y.id,{smooth:!1}),T=requestAnimationFrame(k)};return k(),()=>cancelAnimationFrame(T)},[S]),{focus:I,announcement:A,onKeyDown:j,onFocusCapture:F}}function Xs({rawTasks:t,tasks:n,hierarchy:r,collapsedIds:s}){const o=p.useMemo(()=>r?Lt(t):void 0,[r,t]),e=p.useMemo(()=>!r||!s.size?n:Lr(n,s,o),[r,s,n,o]),a=p.useMemo(()=>Is(e),[e]),i=p.useMemo(()=>a.flatMap(c=>c.tasks),[a]);return{rows:a,tasks:i}}const tn=t=>Symbol.iterator in t,en=t=>"entries"in t,nn=(t,n)=>{const r=t instanceof Map?t:new Map(t.entries()),s=n instanceof Map?n:new Map(n.entries());if(r.size!==s.size)return!1;for(const[o,e]of r)if(!s.has(o)||!Object.is(e,s.get(o)))return!1;return!0},Bs=(t,n)=>{const r=t[Symbol.iterator](),s=n[Symbol.iterator]();let o=r.next(),e=s.next();for(;!o.done&&!e.done;){if(!Object.is(o.value,e.value))return!1;o=r.next(),e=s.next()}return!!o.done&&!!e.done};function zs(t,n){return Object.is(t,n)?!0:typeof t!="object"||t===null||typeof n!="object"||n===null||Object.getPrototypeOf(t)!==Object.getPrototypeOf(n)?!1:tn(t)&&tn(n)?en(t)&&en(n)?nn(t,n):Bs(t,n):nn({entries:()=>Object.entries(t)},{entries:()=>Object.entries(n)})}function qs(t){const n=p.useRef(void 0);return r=>{const s=t(r);return zs(n.current,s)?n.current:n.current=s}}function Ks(){return V(qs(t=>({rawTasks:t.rawTasks,transformedTasks:t.transformedTasks,bottomRowCells:t.bottomRowCells,selectedScale:t.selectedScale,selectedTaskId:t.selectedTaskId,syncTasksFromProps:t.syncTasksFromProps,setSelectedScale:t.setSelectedScale,setLocaleOptions:t.setLocaleOptions,getTotalWidth:t.getTotalWidth})))}function Vs({selectable:t,onTaskSelect:n,onTaskClick:r}){const s=gt(),o=t??n!==void 0,e=p.useCallback(i=>{if(!o)return;const c=(i==null?void 0:i.id)??null;s.getState().selectedTaskId!==c&&(s.getState().setSelectedTaskId(c),n==null||n(i))},[o,n,s]),a=p.useCallback((i,c)=>{r==null||r(i,c),e(i)},[r,e]);return{select:e,onTaskClick:a}}function Zs(t,n){const{canResize:r,canChangeProgress:s}=ht(t,n);return{name:!(t.readOnly??(n==null?void 0:n.readOnly)??!1),dates:r,progress:s}}function Js(t,n){if(!/^\d{4}-\d{2}-\d{2}$/.test(n))return null;const r=C(`${n}T${C(t).format("HH:mm:ss.SSS")}`);return r.isValid()?r:null}const Qs=(t,n,r)=>n&&t.isBefore(C(n))?C(n):r&&t.isAfter(C(r))?C(r):t;function to(t,n,r,s){switch(n){case"name":return r.trim()===""?null:{name:r};case"progress":{const o=r.trim()===""?null:_t(Number(r));return o===null?null:{progress:o}}default:{const{minDate:o,maxDate:e}=ht(t,s),a=Js(t[n],r);if(a===null)return null;const i=Qs(a,o,e),c=n==="startDate"?i:C(t.startDate);return(n==="endDate"?i:C(t.endDate)).isAfter(c)?{[n]:i.toISOString()}:null}}}function eo(t,n,r){return t.map(s=>s.id===n?{...s,...r}:s)}function no(t,n,r,s){const{rawTasks:o,setRawTasks:e}=t.getState(),a=eo(o,n,r);e(a),s==null||s(a)}function de({value:t,commit:n,...r}){const[s,o]=p.useState(t),[e,a]=p.useState(t);e!==t&&(a(t),o(t));const i=()=>{s!==t&&n(s),o(t)};return b.jsx("input",{className:"gantt-detail-input",...r,value:s,onChange:c=>o(c.target.value),onBlur:i,onKeyDown:c=>{c.key==="Enter"&&i(),c.key==="Escape"&&(c.stopPropagation(),o(t))}})}function ro({task:t,tasks:n,scale:r,localeOptions:s,interaction:o,onClose:e,onTasksChange:a,render:i,open:c,onTransitionEnd:u}){const l=p.useRef(null),f=gt(),h=p.useId(),w=p.useRef(null);p.useEffect(()=>{const R=l.current;return w.current=document.activeElement,()=>{const v=document.activeElement;if(!(v===null||v===document.body||((R==null?void 0:R.contains(v))??!1)))return;const j=w.current;j instanceof HTMLElement&&j.isConnected&&j.focus({preventScroll:!0})}},[]),p.useEffect(()=>{const R=v=>{v.key==="Escape"&&e()};return document.addEventListener("keydown",R),()=>document.removeEventListener("keydown",R)},[e]);const{tooltip:g}=p.useMemo(()=>Tt(r,s),[r,s]),d=p.useCallback(R=>no(f,t.id,R,a),[f,t.id,a]),m=p.useCallback((R,v)=>{const $=to(t,R,v,o);$&&d($)},[t,o,d]),D=Zs(t,o),S=_t(t.progress),M=C(t.startDate),A=C(t.endDate),N=(t.dependencies??[]).map(R=>{var v;return((v=n.find($=>$.id===R.targetId))==null?void 0:v.name)??R.targetId}),I=(R,v)=>b.jsx(de,{id:`${h}-${R}`,type:"date",value:C(v).format("YYYY-MM-DD"),commit:$=>m(R,$)}),_=[D.dates?{caption:"Start",inputId:`${h}-startDate`,value:I("startDate",t.startDate)}:{caption:"Start",value:g(M)},D.dates?{caption:"End",inputId:`${h}-endDate`,value:I("endDate",t.endDate)}:{caption:"End",value:g(A)},{caption:"Duration",value:$n(A.valueOf()-M.valueOf())}];return S!==null&&_.push(D.progress?{caption:"Progress",inputId:`${h}-progress`,value:b.jsx(de,{id:`${h}-progress`,type:"number",min:0,max:100,step:1,value:String(S),commit:R=>m("progress",R)})}:{caption:"Progress",value:`${S}%`}),N.length>0&&_.push({caption:"Depends on",value:N.join(", ")}),b.jsx("aside",{ref:l,className:c?"gantt-detail gantt-detail-open":"gantt-detail",role:"complementary","aria-label":"Task details",onTransitionEnd:u,children:i?i({task:t,close:e,scale:r,update:d}):b.jsxs(b.Fragment,{children:[b.jsxs("div",{className:"gantt-detail-header",children:[D.name?b.jsx(de,{type:"text","aria-label":"Task name",value:t.name,commit:R=>m("name",R)}):b.jsx("h2",{className:"gantt-detail-title",children:t.name}),b.jsx("button",{type:"button",className:"gantt-detail-close",onClick:e,"aria-label":"Close task details",children:"✕"})]}),b.jsx("dl",{className:"gantt-detail-fields",children:_.map(({caption:R,value:v,inputId:$})=>b.jsxs(p.Fragment,{children:[b.jsx("dt",{children:$?b.jsx("label",{htmlFor:$,children:R}):R}),b.jsx("dd",{children:v})]},R))})]})})}function so({enabled:t,detailTaskId:n,uncontrolled:r,tasks:s}){if(!t)return{openId:null,task:null,stale:!1};const o=n!==void 0?n:r;if(o===null)return{openId:null,task:null,stale:!1};const e=s.find(a=>a.id===o)??null;return{openId:o,task:e,stale:e===null}}function oo({enabled:t,tasks:n,detailTaskId:r,onDetailChange:s,onTaskClick:o}){const[e,a]=p.useState(null),i=r!==void 0,{openId:c,task:u}=p.useMemo(()=>so({enabled:t,detailTaskId:r,uncontrolled:e,tasks:n}),[t,r,e,n]),l=p.useCallback(g=>{t&&g!==c&&(i||a(g),s==null||s(g?n.find(d=>d.id===g)??null:null))},[t,c,i,s,n]),f=p.useCallback(g=>{n.some(d=>d.id===g)&&l(g)},[l,n]),h=p.useCallback(()=>l(null),[l]),w=p.useCallback((g,d)=>{o==null||o(g,d),l(g.id)},[o,l]);return{task:u,open:f,close:h,onTaskClick:w}}const ao=400;function io(t){const[n,r]=p.useState(t),[s,o]=p.useState(!1);t!==null&&t!==n&&r(t);const e=t!==null;p.useEffect(()=>{let i=requestAnimationFrame(()=>{if(!e){o(!1);return}i=requestAnimationFrame(()=>o(!0))});return()=>cancelAnimationFrame(i)},[e]),p.useEffect(()=>{if(e||n===null)return;const i=setTimeout(()=>r(null),ao);return()=>clearTimeout(i)},[e,n]);const a=p.useCallback(i=>{i.target===i.currentTarget&&i.propertyName==="flex-basis"&&(e||r(null))},[e]);return{task:n,open:s,onTransitionEnd:a}}function co({scrollRef:t,bottomRowCells:n,transformedTasks:r,selectedScale:s,rowHeight:o,viewportInsetPx:e=0,zoomTo:a,setSelectedScale:i}){const c=p.useCallback((g,d)=>{const m=t.current;if(!m)return;const D=(d==null?void 0:d.align)==="start"?g:g-(m.clientWidth-e)/2;m.scrollTo({left:Math.max(0,D),behavior:(d==null?void 0:d.smooth)===!1?"auto":"smooth"})},[t,e]),u=p.useCallback((g,d)=>{const m=It(C(g),n,s);m!==null&&c(m,d)},[n,s,c]),l=p.useCallback(g=>u(C(),g),[u]),f=p.useCallback((g,d)=>{const m=r.findIndex(N=>N.id===g);if(m===-1)return;const D=r[m],S=t.current;if(!S)return;const M=(D.order-1)*o,A=M<S.scrollTop||M+o>S.scrollTop+S.clientHeight;S.scrollTo({top:A?Math.max(0,M-S.clientHeight/2+o/2):S.scrollTop,left:Math.max(0,(d==null?void 0:d.align)==="start"?D.barLeft:D.barLeft+D.barWidth/2-(S.clientWidth-e)/2),behavior:(d==null?void 0:d.smooth)===!1?"auto":"smooth"})},[r,o,t,e]),h=p.useCallback(g=>{if(!(g in at))return;const d=t.current,m=d?Math.max(0,d.clientWidth-e)/2:0,D=d?vn(d.scrollLeft+m,n,s):null;if(!D){i(g);return}a(g,{date:D,viewportX:m})},[t,e,n,s,i,a]),w=p.useCallback(()=>{const g=t.current;if(!g||!r.length)return;let d=1/0,m=-1/0;for(const D of r)d=Math.min(d,C(D.startDate).valueOf()),m=Math.max(m,C(D.endDate).valueOf());!Number.isFinite(d)||!Number.isFinite(m)||a(Mr(m-d,g.clientWidth-e),{date:C(d),viewportX:0})},[r,t,e,a]);return p.useMemo(()=>({scrollToDate:u,scrollToToday:l,scrollToTask:f,setScale:h,zoomToFit:w,getScrollElement:()=>t.current}),[u,l,f,h,w,t])}function lo({showTaskList:t}){const n=t??!1,[r,s]=p.useState(ar);return{width:r,setWidth:s,visible:n,inset:n?r:0}}function uo({hierarchy:t,interaction:n,collapsedIds:r,onTasksChange:s,onTaskMove:o,onExpand:e}){const a=gt(),i=p.useMemo(()=>({hierarchy:t,canReorder:l=>ht(l,n).canReorder}),[t,n]),c=p.useCallback(l=>ve(a.getState().rawTasks,l,i),[a,i]),u=p.useCallback(l=>{const f=bn(a.getState().rawTasks,l,i);return!f||(o==null?void 0:o(f.change))===!1?!1:(a.getState().setRawTasks(f.tasks),s==null||s(f.tasks),l.toParentId&&r.has(l.toParentId)&&(e==null||e(l.toParentId)),!0)},[a,i,o,s,r,e]);return{validate:c,apply:u}}function En(t,n){const r=Math.max(1,n);return{count:t,total:t*r,sizeAt:()=>r,offsetAt:s=>xe(s,0,t)*r,indexAt:s=>xe(Math.floor(s/r),0,t-1)}}function fo(t,n){const r=new Float64Array(t+1);for(let s=0;s<t;s+=1)r[s+1]=r[s]+Math.max(0,n(s));return{count:t,total:r[t],sizeAt:s=>s>=0&&s<t?r[s+1]-r[s]:0,offsetAt:s=>r[xe(s,0,t)],indexAt:s=>{if(t===0)return 0;let o=0,e=t-1;for(;o<e;){const a=o+e>>1;r[a+1]<=s?o=a+1:e=a}return o}}}function ho(t,n,r=0){return typeof n=="number"?En(t,n):fo(t,s=>n[s]??r)}function xe(t,n,r){return t<n?n:t>r?r:t}const mo=24;function De(t){return{start:0,end:t-1,padStart:0,padEnd:0,virtualized:!1}}function rn(t,n,r,s=5,o=0){if(t.count===0||t.count<=mo||r<=0||t.total<=r)return De(t.count);const e=s+(o<0?s:0),a=s+(o>0?s:0),i=Math.max(0,n),c=Math.max(0,t.indexAt(i)-e),u=Math.min(t.count-1,t.indexAt(i+r)+a);return{start:c,end:u,padStart:t.offsetAt(c),padEnd:Math.max(0,t.total-t.offsetAt(u+1)),virtualized:!0}}function sn(t,n){const r=[];for(let s=n.start;s<=n.end;s+=1){const o=t.offsetAt(s),e=t.sizeAt(s);r.push({index:s,key:s,start:o,end:o+e,size:e})}return r}function po(t,n){return n.end<n.start?{startPx:0,endPx:0}:{startPx:t.offsetAt(n.start),endPx:t.offsetAt(n.end+1)}}function on(t,n){return t.start===n.start&&t.end===n.end&&t.virtualized===n.virtualized&&t.padStart===n.padStart&&t.padEnd===n.padEnd}function go({scrollRef:t,row:n,col:r}){const[s,o]=p.useState(()=>({row:De(n.count),col:De(r.count)})),e=p.useRef({top:0,left:0}),a=p.useRef(0),i=p.useCallback(()=>{const l=t.current;if(!l)return;const{scrollTop:f,scrollLeft:h,clientHeight:w,clientWidth:g}=l,d=an(f,e.current.top),m=an(h,e.current.left);e.current={top:f,left:h};const D={row:rn(n,f,w,5,d),col:rn(r,h,g,5,m)};o(S=>on(S.row,D.row)&&on(S.col,D.col)?S:D)},[t,n,r]),c=p.useCallback(()=>{a.current===0&&(a.current=requestAnimationFrame(()=>{a.current=0,i()}))},[i]);p.useLayoutEffect(()=>{const l=t.current;if(!l)return;i(),l.addEventListener("scroll",c,{passive:!0});const f=new ResizeObserver(i);return f.observe(l),()=>{l.removeEventListener("scroll",c),f.disconnect()}},[t,c,i]),p.useEffect(()=>()=>{a.current!==0&&cancelAnimationFrame(a.current)},[]);const u=p.useCallback((l,f="start")=>{const h=t.current;if(!h||l<0||l>=n.count)return;const w=h.clientHeight,g=n.offsetAt(l),d=n.sizeAt(l),m=h.scrollTop;let D=g;if(f==="center")D=g-(w-d)/2;else if(f==="end")D=g-w+d;else if(f==="auto"){if(g>=m&&g+d<=m+w)return;D=g<m?g:g-w+d}h.scrollTo({top:Math.max(0,D)})},[t,n]);return{row:s.row,col:s.col,scrollToRow:u}}function an(t,n){return t>n?1:t<n?-1:0}function $o({rowCount:t,bottomRowCells:n,scrollRef:r}){var w;const s=p.useMemo(()=>En(t,bt),[t]),o=p.useMemo(()=>{const g=n.map(d=>d.widthPx);return ho(g.length,g)},[n]),{row:e,col:a,scrollToRow:i}=go({scrollRef:r,row:s,col:o}),c=p.useMemo(()=>sn(s,e),[s,e]),u=p.useMemo(()=>sn(o,a),[o,a]),{startPx:l,endPx:f}=po(o,a),h=p.useCallback((g,d)=>g+d>=l&&g<=f,[l,f]);return{virtualRows:c,totalHeight:s.total,virtualCells:u,leadingCellPx:((w=u[0])==null?void 0:w.start)??0,rowStartPx:e.padStart,rowEndPx:s.offsetAt(e.end+1),isBarVisible:h,scrollToRow:i}}function xo({enabled:t,scrollRef:n,selectedScale:r,bottomRowCells:s,totalWidth:o,viewportInsetPx:e,pinnedStart:a,pinnedEnd:i}){const[c,u]=p.useState({scale:r,value:pe}),l=c.scale===r?c.value:pe,f=ct(r),h=ct(s),w=ct(o),g=ct(e),d=ct(l);return p.useEffect(()=>{if(!t)return;const m=n.current;if(!m)return;const D=()=>{const S=h.current,M=w.current;if(!S.length||M<=0)return;const A=Tr({current:d.current,scrollLeft:m.scrollLeft,viewportPx:m.clientWidth-g.current,totalPx:M,pxPerTick:M/S.length,canExtend:{before:!a,after:!i}});A&&(d.current=A,u({scale:f.current,value:A}))};return D(),m.addEventListener("scroll",D,{passive:!0}),()=>m.removeEventListener("scroll",D)},[t,s,a,i,n,h,w,d,g,f]),l}function Do({rawTasks:t,selectedScale:n,visibleRange:r,hierarchy:s,extension:o,scrollRef:e,bottomRowCells:a}){const i=ct(n),c=ct(a),u=V(m=>m.setBottomRowCells),l=V(m=>m.setTransformedTasks),f=V(m=>m.clearAllDragOffsets),h=V(m=>m.setSelectedScale),w=p.useRef([]),g=p.useRef(0),d=p.useRef(null);return p.useLayoutEffect(()=>{const{bottomCells:m,transformedTasks:D}=zr(t,n,r,s,o),S=w.current;S.length&&m.length&&(g.current+=Cr(S,m,n)),w.current=m,u(m),l(D),f()},[t,n,r,s,o,u,l,f]),p.useLayoutEffect(()=>{const m=e.current,D=d.current;if(D){d.current=null,g.current=0;const M=It(D.date,a,i.current);if(m&&M!==null){m.scrollLeft=Math.max(0,M-D.viewportX);return}}const S=g.current;S&&(g.current=0,m&&(m.scrollLeft+=S))},[a,e,i]),p.useCallback((m,D)=>{if(m===i.current){const S=e.current,M=It(D.date,c.current,m);S&&M!==null&&(S.scrollLeft=Math.max(0,M-D.viewportX));return}d.current=D,h(m)},[h,e,i,c])}function bo({enabled:t,scrollRef:n,selectedScale:r,bottomRowCells:s,viewportInsetPx:o,zoomTo:e}){const a=ct(r),i=ct(s),c=ct(o);p.useEffect(()=>{if(!t)return;const u=n.current;if(!u)return;const l={...Or},f=h=>{if(!h.ctrlKey&&!h.metaKey)return;h.preventDefault();const{state:w,step:g}=Er(l,h.deltaY,h.timeStamp);if(Object.assign(l,w),!g)return;const d=xn(a.current,g);if(d===a.current)return;const m=u.getBoundingClientRect(),D=c.current,S=Math.min(Math.max(h.clientX-m.left,D),u.clientWidth)-D,M=vn(u.scrollLeft+S,i.current,a.current);M&&e(d,{date:M,viewportX:S})};return u.addEventListener("wheel",f,{passive:!1}),()=>u.removeEventListener("wheel",f)},[t,e,n,a,i,c])}function wo(t,n){const r=ct(n),s=p.useRef(t);p.useEffect(()=>{var o;t!==s.current&&(s.current=t,(o=r.current)==null||o.call(r,t))},[t,r])}function vo(t,n,r){const s=ct(n),o=ct(r),e=p.useRef("");p.useEffect(()=>{const a=o.current;if(!a)return;const i=Ur(t,s.current);if(!i)return;const c=`${i.start.valueOf()}:${i.end.valueOf()}`;c!==e.current&&(e.current=c,a(i))},[t,s,o])}function yo(t,n,r){const s=p.useRef(!1);p.useEffect(()=>{if(s.current||!t||!n.length)return;s.current=!0;const o=t==="today"?C():t;r.scrollToDate(o,{smooth:!1})},[t,n,r])}const Pn="(prefers-color-scheme: dark)",Tn=()=>typeof window<"u"&&typeof window.matchMedia=="function",Ln=()=>Tn()&&window.matchMedia(Pn).matches,So=()=>{if(typeof document>"u")return"light";const t=getComputedStyle(document.documentElement).colorScheme,n=t.includes("light"),r=t.includes("dark");return n&&r?Ln()?"dark":"light":r?"dark":"light"},Mo=t=>{if(typeof window>"u")return()=>{};const n=Tn()?window.matchMedia(Pn):null;n==null||n.addEventListener("change",t);const r=new MutationObserver(t);return r.observe(document.documentElement,{attributes:!0,attributeFilter:["class","style","data-theme"]}),()=>{n==null||n.removeEventListener("change",t),r.disconnect()}},ko=()=>"light";function Io(t){const n=p.useSyncExternalStore(Mo,t==="system"?()=>Ln()?"dark":"light":So,ko);return t==="light"||t==="dark"?t:n}function Oo(t="month"){return Xn()((n,r)=>({rawTasks:[],transformedTasks:[],rowTasks:[],bottomRowCells:[],selectedScale:t,currentTask:null,dragMode:null,dragOffsets:{},localeOptions:void 0,linkDraft:null,reorderDraft:null,selectedDependency:null,selectedTaskId:null,hoveredTaskId:null,setCurrentTask:s=>n({currentTask:s}),setDragMode:s=>{r().dragMode!==s&&n({dragMode:s})},setLinkDraft:s=>n({linkDraft:s}),setReorderDraft:s=>n({reorderDraft:s}),setSelectedDependency:s=>n(o=>{var e,a;return((e=o.selectedDependency)==null?void 0:e.sourceId)===(s==null?void 0:s.sourceId)&&((a=o.selectedDependency)==null?void 0:a.targetId)===(s==null?void 0:s.targetId)?o:{selectedDependency:s}}),setLocaleOptions:s=>n({localeOptions:s}),setSelectedTaskId:s=>{r().selectedTaskId!==s&&n({selectedTaskId:s})},setHoveredTaskId:s=>{r().hoveredTaskId!==s&&n({hoveredTaskId:s})},setSelectedScale:s=>{r().selectedScale!==s&&n({selectedScale:s})},setRawTasks:s=>n({rawTasks:s}),syncTasksFromProps:s=>n(o=>JSON.stringify(o.rawTasks)===JSON.stringify(s)?o:{rawTasks:s}),setBottomRowCells:s=>n({bottomRowCells:s}),setTransformedTasks:s=>n({transformedTasks:s}),setRowTasks:s=>n({rowTasks:s}),setDragOffsets:s=>n(o=>({dragOffsets:{...o.dragOffsets,...s}})),clearDragOffsets:s=>n(o=>{const e={...o.dragOffsets};let a=!1;for(const i of s)i in e&&(delete e[i],a=!0);return a?{dragOffsets:e}:o}),clearAllDragOffsets:()=>n(s=>{var a;const o=(a=s.currentTask)==null?void 0:a.id,e=Object.keys(s.dragOffsets);return e.length?!o||!s.dragOffsets[o]?{dragOffsets:{}}:e.length===1?s:{dragOffsets:{[o]:s.dragOffsets[o]}}:s}),getTotalWidth:()=>r().bottomRowCells.reduce((o,e)=>o+e.widthPx,0)}))}const Mt="day",cn=366,Eo=18263,Po="YYYY-MM-DD",To=[1,2,3,4,5];function An(t){const n=t?o=>!t(o):()=>!0,r=(o,e)=>{if(!e||!t)return o.add(e,Mt);const a=e>0?1:-1;let i=Math.abs(e),c=o,u=Math.abs(e)+cn*Math.abs(e);for(;i>0;)if(c=c.add(a,Mt),n(c)&&i--,u--<=0)return o.add(e,Mt);return c},s=(o,e)=>{const a=o.startOf(Mt),i=e.startOf(Mt),c=i.diff(a,Mt);if(!t||c===0||Math.abs(c)>Eo)return c;const u=c>0?1:-1;let l=u>0?a:i;const f=u>0?i:a;let h=0;for(;l.valueOf()<f.valueOf();)l=l.add(1,Mt),n(l)&&h++;return h===0?0:h*u};return{skipsNonWorkingDays:t!==null,isWorkingDay:n,addDays:r,daysBetween:s,daysUntil(o,e){let a=s(o,e);const i=e.valueOf();for(let c=0;c<2&&r(o,a).valueOf()<i;c++)a++;for(let c=0;c<2&&r(o,a-1).valueOf()>=i;c++)a--;return a},daysUpTo(o,e){let a=s(o,e);const i=e.valueOf();for(let c=0;c<2&&r(o,a).valueOf()>i;c++)a--;for(let c=0;c<2&&r(o,a+1).valueOf()<=i;c++)a++;return a},snapForward(o){if(!t||n(o))return o;let e=o;for(let a=0;a<cn;a++)if(e=e.add(1,Mt),n(e))return e;return o}}}const Rn=An(null);function Nn(t={}){const n=new Set(t.workingWeekdays??To),r=new Set(t.holidays??[]);return An(s=>!n.has(s.day())||r.has(s.format(Po)))}const Lo="YYYY-MM-DD",Ao=366,Ro={byDate:new Map,dates:[]};function No(t){if(!(t!=null&&t.length))return Ro;const n=new Map;for(const r of t){const s=typeof r=="string"?{date:r}:r,o=ee(s.date);if(!o.isValid())continue;const e=s.endDate?ee(s.endDate):o,a=e.isValid()&&!e.isBefore(o,"day")?Math.min(e.diff(o,"day"),Ao-1):0;for(let i=0;i<=a;i++){const c=o.add(i,"day").format(Lo);n.has(c)||n.set(c,s)}}return{byDate:n,dates:[...n.keys()]}}const jo=600,_o="100%",Yo=[],Co=p.forwardRef(function(n,r){const[s]=p.useState(()=>Oo(n.defaultScale));return b.jsx(ln.Provider,{value:s,children:b.jsx(Ho,{...n,forwardedRef:r})})});function Ho({tasks:t=Yo,onTasksChange:n,height:r=jo,width:s=_o,theme:o,className:e,showNonWorkingDays:a=!0,workingWeekdays:i,holidays:c,initialScrollTo:u,readOnly:l,allowMove:f,allowResize:h,allowProgressChange:w,minDate:g,maxDate:d,visibleStart:m,visibleEnd:D,locale:S,formats:M,firstDayOfWeek:A,showTaskList:N,showRowNumbers:I=!1,hierarchy:_=!1,collapsedIds:R,defaultCollapsedIds:v,onCollapsedChange:$,workingCalendar:j=!1,allowLinkCreate:F,allowLinkDelete:U,allowTaskCreate:T,allowReorder:k,onTaskMove:O,onDependencyCreate:y,onDependencyDelete:x,onTaskCreate:P,onTaskClick:L,onTaskDoubleClick:H,onTaskSelect:X,selectable:z,renderDetail:Z,showDetail:tt,detailTaskId:mt,onDetailChange:et,showTooltip:dt,zoomOnWheel:E=!1,infiniteScroll:G=!1,onRangeChange:B,onScaleChange:st,autoScrollOnDrag:nt=!0,forwardedRef:$t}){const{rawTasks:rt,transformedTasks:Q,bottomRowCells:q,selectedScale:K,selectedTaskId:ft,syncTasksFromProps:ot,setSelectedScale:xt,setLocaleOptions:Dt,getTotalWidth:vt}=Ks(),Y=p.useMemo(()=>S===void 0&&M===void 0&&A===void 0?void 0:{locale:S,formats:M,firstDayOfWeek:A},[S,M,A]);p.useLayoutEffect(()=>{Dt(Y)},[Y,Dt]);const W=p.useRef(null),J=p.useRef(null),lt=Us({readOnly:l,allowMove:f,allowResize:h,allowProgressChange:w,allowLinkCreate:F,allowLinkDelete:U,allowTaskCreate:T,allowReorder:k,minDate:g,maxDate:d}),it=lo({showTaskList:N}),Ht=it.visible?1:0,Ft=vt(),jn=xo({enabled:G,scrollRef:W,selectedScale:K,bottomRowCells:q,totalWidth:Ft,viewportInsetPx:it.inset,pinnedStart:!!m,pinnedEnd:!!D}),yt=Ys({collapsedIds:R,defaultCollapsedIds:v,onCollapsedChange:$}),Me=uo({hierarchy:_,interaction:lt,collapsedIds:yt.collapsedIds,onTasksChange:n,onTaskMove:O,onExpand:yt.expand}),_n=p.useMemo(()=>k===!0||rt.some(ut=>ut.allowReorder===!0),[k,rt]),Ut=p.useMemo(()=>No(c),[c]),se=p.useMemo(()=>Nn({workingWeekdays:i,holidays:Ut.dates}),[i,Ut]),ke=p.useCallback(ut=>{if(se.isWorkingDay(ut))return null;const zt=Ut.byDate.get(ut.format("YYYY-MM-DD"));return zt?{key:zt.date,label:zt.label,color:zt.color}:{key:Yr}},[se,Ut]),Yn=j?se:Rn,oe=tt??Z!==void 0,ae=Vs({selectable:z??(oe?!0:void 0),onTaskSelect:X,onTaskClick:L}),pt=oo({enabled:oe,tasks:Q,detailTaskId:mt,onDetailChange:et,onTaskClick:ae.onTaskClick}),Wt=io(pt.task),Cn=p.useMemo(()=>({onTasksChange:n,onTaskClick:pt.onTaskClick,onTaskDoubleClick:H,showTooltip:dt}),[n,pt.onTaskClick,H,dt]),{rows:St,tasks:Gt}=Xs({rawTasks:rt,tasks:Q,hierarchy:_,collapsedIds:yt.collapsedIds}),Ie=V(ut=>ut.setRowTasks);p.useLayoutEffect(()=>{Ie(Gt)},[Gt,Ie]);const At=P!==void 0&&Kr(lt),{onDrawPointerDown:Hn,ghost:Xt}=Fs({enabled:At,rowCount:St.length,onTaskCreate:P}),ie=p.useCallback(()=>{if(!At)return;const ut=Cs(C(),q,K);ut&&(P==null||P(ut))},[At,q,K,P]),wt=$o({rowCount:St.length,bottomRowCells:q,scrollRef:W}),Fn=Io(o),Oe=p.useRef(null);p.useEffect(()=>{const ut=JSON.stringify(t);ut!==Oe.current&&(Oe.current=ut,ot(t))},[t,ot]);const Un=p.useMemo(()=>m||D?{start:m?C(m):void 0,end:D?C(D):void 0}:void 0,[m,D]),Ee=Do({rawTasks:rt,selectedScale:K,visibleRange:Un,hierarchy:_,extension:jn,scrollRef:W,bottomRowCells:q});bo({enabled:E,scrollRef:W,selectedScale:K,bottomRowCells:q,viewportInsetPx:it.inset,zoomTo:Ee}),vo(q,K,B),wo(K,st);const Pe=p.useMemo(()=>It(C(),q,K),[q,K]),Te=p.useMemo(()=>a?Hr(q,K,ke):[],[a,ke,q,K]),Bt=co({scrollRef:W,bottomRowCells:q,transformedTasks:Gt,selectedScale:K,rowHeight:bt,viewportInsetPx:it.inset,zoomTo:Ee,setSelectedScale:xt});p.useImperativeHandle($t,()=>({...Bt,openDetail:pt.open,closeDetail:pt.close,addTask:ie}),[Bt,pt.open,pt.close,ie]);const Rt=Gs({onActivate:oe?pt.open:void 0,rows:St,rawTasks:rt,gridColumnCount:Ht,hierarchy:_,collapsedIds:yt.collapsedIds,selectedScale:K,localeOptions:Y,interaction:lt,onToggleCollapse:yt.toggle,onTasksChange:n,move:Me,scrollToRow:wt.scrollToRow,scrollApi:Bt,bodyRef:J});yo(u,q,Bt);const Wn=p.useCallback(ut=>{ut.target===ut.currentTarget&&(ae.select(null),pt.close())},[ae,pt]),Gn={height:typeof r=="number"?`${r}px`:r,width:typeof s=="number"?`${s}px`:s,"--gantt-pane-inset":`${it.inset}px`,"--gantt-row-height":`${bt}px`},Le={width:`${Ft}px`};return b.jsxs("section",{className:e?`gantt-container ${e}`:"gantt-container","data-theme":Fn,style:Gn,children:[b.jsx("div",{className:"gantt-sr-only",role:"status","aria-live":"polite",children:Rt.announcement}),b.jsxs("div",{className:"gantt-layout",children:[b.jsxs("div",{className:"gantt-main",children:[b.jsx("div",{ref:W,className:"gantt-scroll-container",children:b.jsxs("div",{ref:J,className:"gantt-body",role:"treegrid","aria-label":"Gantt chart","aria-rowcount":St.length+(it.visible?1:0),onKeyDown:Rt.onKeyDown,onFocusCapture:Rt.onFocusCapture,children:[it.visible&&b.jsx(Os,{rows:St,virtualItems:wt.virtualRows,totalHeight:wt.totalHeight,width:it.width,showRowNumbers:I,hierarchy:_,collapsedIds:yt.collapsedIds,onToggleCollapse:yt.toggle,focus:Rt.focus,selectedTaskId:ft,onRowClick:pt.onTaskClick,onRowDoubleClick:H,reorderEnabled:_n,interaction:lt,move:Me}),b.jsxs("div",{className:"gantt-timeline",style:Le,role:"presentation",children:[b.jsxs("div",{className:"gantt-header-wrapper",style:Le,children:[b.jsx(qr,{bottomRowCells:q,selectedScale:K,width:Ft,virtual:wt}),b.jsx(Rs,{ranges:Te}),b.jsx(ds,{}),b.jsx(ps,{leftPx:Pe})]}),b.jsxs("div",{className:`gantt-content${At?" drawable":""}`,style:{height:`${wt.totalHeight}px`,width:`${Ft}px`},role:"presentation",onPointerDown:Hn,onClick:Wn,children:[b.jsx(Ns,{ranges:Te}),b.jsx(js,{rows:St,virtualItems:wt.virtualRows,ownedByTaskList:it.visible,hierarchy:_,collapsedIds:yt.collapsedIds}),b.jsx(ms,{leftPx:Pe}),Xt&&b.jsx("div",{className:"gantt-draw-ghost",style:{left:`${Xt.leftPx}px`,width:`${Xt.widthPx}px`,height:`${fe}px`,marginTop:`${(bt-fe)/2}px`,transform:`translateY(${Xt.topPx}px)`},"aria-hidden":"true"}),b.jsx(us,{transformedTasks:Gt,rowCount:St.length,virtual:wt,interaction:lt,onTasksChange:n,onDependencyDelete:x}),b.jsx(As,{rows:St,virtualItems:wt.virtualRows,gridColumnCount:Ht,focus:Rt.focus,isBarVisible:wt.isBarVisible,options:Cn,interaction:lt,calendar:Yn,autoScrollOnDrag:nt,onDependencyCreate:y})]})]})]})}),it.visible&&b.jsx(fs,{width:it.width,onWidthChange:it.setWidth}),it.visible&&At&&b.jsx(hs,{width:it.width,onAdd:ie})]}),Wt.task&&b.jsx(ro,{task:Wt.task,tasks:Q,scale:K,localeOptions:Y,interaction:lt,onClose:pt.close,onTasksChange:n,render:Z,open:Wt.open,onTransitionEnd:Wt.onTransitionEnd})]})]})}exports.CALENDAR_DAYS=Rn;exports.ReactGanttChart=Co;exports.buildTaskTree=Lt;exports.collectSubtreeIds=Yt;exports.createWorkingCalendar=Nn;exports.moveTask=bn;exports.rollUpTasks=Dn;exports.sortTasksBySequence=Ct;exports.validateMove=ve;
@@ -0,0 +1,11 @@
1
+ export { default as ReactGanttChart } from './Gantt';
2
+ export type { GanttProps } from './props';
3
+ export type { GanttDetailApi, GanttHandle, GanttTaskCreateApi, GanttScrollApi, GanttScrollOptions, GanttZoomAnchor, } from './timeline/hooks/useGanttScrollApi';
4
+ export type { Task, TaskDependency, DependencyType, TaskTransformed, GanttInteractionConfig, } from './shared/task';
5
+ export type { GanttDependencyChange } from './dependencies/hooks/useGanttLinkDrag';
6
+ export type { GanttMoveRejection, GanttTaskMove, GanttTaskMoveChange, } from './core/reorder';
7
+ export type { GanttTaskDraft } from './bars/hooks/useGanttDrawCreate';
8
+ export type { GanttDateRange, GanttDetailRenderProps, GanttDetailRenderer, GanttFormatOverrides, GanttScaleFormat, GanttScaleKey, GanttTheme, Holiday, } from './shared/types';
9
+ export type { GanttRow } from './rows/utils/rows';
10
+ export { buildTaskTree, CALENDAR_DAYS, collectSubtreeIds, createWorkingCalendar, moveTask, rollUpTasks, sortTasksBySequence, validateMove, } from './core';
11
+ export type { GanttMoveOptions, TaskTree, WorkingCalendar, WorkingCalendarOptions, } from './core';