@ganttloom/gantt-vue 0.4.0 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,11 +76,13 @@ The exposed `GanttChartHandle` has: `undo`/`redo`/`canUndo`/`canRedo`,
76
76
  `expandAll`/`collapseAll`/`toggleGroup`, `removeDependency`,
77
77
  `updateDependency`, `updateTask`, `setViewMode`,
78
78
  `zoomIn`/`zoomOut`/`getZoomLevel`, `fitToViewport`, `scrollToToday`,
79
- `getPageCount`/`setPage`, `getResourceHistogram`,
80
- `selectTask`/`clearSelection`/`getSelectedTaskIds`/`bulkShiftDates`/`bulkDelete`,
81
- `toSVGString`/`toPNGDataURL`, `getRenderModel`, and `getInstance()` for direct
82
- access to the underlying `@ganttloom/gantt-core` `GanttChart` when you need
83
- something not on this list.
79
+ `scrollToRangeStart`/`scrollToRangeEnd`, `getPageCount`/`setPage`,
80
+ `getResourceHistogram`, `getLeveledTasks`,
81
+ `selectTask`/`selectAllVisible`/`clearSelection`/`getSelectedTaskIds`/`bulkShiftDates`/`bulkDelete`,
82
+ `setSort`/`getSort`, `toSVGString`/`toPNGDataURL`/`toPNGDataURLs`,
83
+ `getRenderModel`, and `getInstance()` for direct access to the underlying
84
+ `@ganttloom/gantt-core` `GanttChart` when you need something not on this
85
+ list.
84
86
 
85
87
  ## Multi-select and bulk actions
86
88
 
@@ -133,6 +135,15 @@ into one or two lonely columns, and the date header stays pinned to the
133
135
  top while scrolling a tall task list vertically (still scrolling
134
136
  horizontally in sync with the bars).
135
137
 
138
+ ## Header position
139
+
140
+ `header-position` places the grid and timeline headers at `"top"` (the
141
+ default), `"bottom"`, or `"none"` to hide them entirely:
142
+
143
+ ```vue
144
+ <GanttChart :tasks="tasks" header-position="bottom" />
145
+ ```
146
+
136
147
  ## Drag-to-create
137
148
 
138
149
  Off by default; attach a `@task-create` listener to turn it on (the core
@@ -230,11 +241,16 @@ If you want to own the container element/DOM tree yourself instead of using
230
241
  ```vue
231
242
  <script setup lang="ts">
232
243
  import { ref } from "vue";
233
- import { useGanttChart } from "@ganttloom/gantt-vue";
244
+ import { useGanttChart, type GanttTask, type GanttDependency } from "@ganttloom/gantt-vue";
234
245
 
235
- const props = defineProps<{ tasks: GanttTask[] }>();
246
+ const props = defineProps<{ tasks: GanttTask[]; dependencies: GanttDependency[] }>();
236
247
  const containerRef = ref<HTMLDivElement | null>(null);
237
- const { chart, canUndo, canRedo } = useGanttChart(containerRef, () => props.tasks);
248
+ const { chart, canUndo, canRedo } = useGanttChart(
249
+ containerRef,
250
+ () => props.tasks,
251
+ () => props.dependencies,
252
+ () => ({ enableHistory: true })
253
+ );
238
254
  </script>
239
255
 
240
256
  <template>
package/dist/index.cjs CHANGED
@@ -119,6 +119,8 @@ var ganttChartProps = {
119
119
  showCriticalPath: { type: Boolean, default: void 0 },
120
120
  showBaseline: { type: Boolean, default: void 0 },
121
121
  showDeadlines: { type: Boolean, default: void 0 },
122
+ /** Positions the grid and timeline headers. Default is "top". */
123
+ headerPosition: { type: String, default: void 0 },
122
124
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
123
125
  showTooltip: { type: Boolean, default: void 0 },
124
126
  /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
@@ -192,6 +194,7 @@ var GanttChart = (0, import_vue2.defineComponent)({
192
194
  showCriticalPath: props.showCriticalPath,
193
195
  showBaseline: props.showBaseline,
194
196
  showDeadlines: props.showDeadlines,
197
+ headerPosition: props.headerPosition,
195
198
  showTooltip: props.showTooltip,
196
199
  renderTooltip: props.renderTooltip,
197
200
  showAssigneeAvatars: props.showAssigneeAvatars,
@@ -220,7 +223,6 @@ var GanttChart = (0, import_vue2.defineComponent)({
220
223
  () => props.dependencies,
221
224
  getOptions
222
225
  );
223
- (0, import_vue2.watch)(getOptions, (options) => chart.value?.setOptions(options));
224
226
  (0, import_vue2.watch)(chart, (instance, _prev, onCleanup) => {
225
227
  if (!instance) return;
226
228
  instance.on("date-change", handleDateChange);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/GanttChart.ts","../src/useGanttChart.ts"],"sourcesContent":["export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n","// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n sort: null,\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\n showTooltip: { type: Boolean, default: undefined },\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\n renderTooltip: {\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\n default: undefined,\n },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n /**\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\n */\n autoFitToViewport: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"task-dblclick\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showTooltip: props.showTooltip,\n renderTooltip: props.renderTooltip,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n autoFitToViewport: props.autoFitToViewport,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"task-dblclick\", handleTaskDblClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n instance.on(\"sort-change\", handleSortChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"task-dblclick\", handleTaskDblClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n instance.off(\"sort-change\", handleSortChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleTaskDblClick(p: { task: GanttTask }) {\n emit(\"task-dblclick\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\n emit(\"sort-change\", p.sort);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\n getSort: () => chart.value?.getSort() ?? null,\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n"],"mappings":"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","names":["import_vue","GanttCore","import_gantt_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/GanttChart.ts","../src/useGanttChart.ts"],"sourcesContent":["export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n","// Pulls in the core's default styles so consumers get a working chart out of the box.\r\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\r\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\r\n// import \"@ganttloom/gantt-core/styles.css\";\r\nimport \"@ganttloom/gantt-core/styles.css\";\r\n\r\nimport {\r\n defineComponent,\r\n getCurrentInstance,\r\n h,\r\n onBeforeUnmount,\r\n ref,\r\n watch,\r\n type ExtractPropTypes,\r\n type PropType,\r\n} from \"vue\";\r\nimport type {\r\n GanttChart as GanttCore,\r\n GanttColumn,\r\n GanttDependency,\r\n GanttMarker,\r\n GanttOptions,\r\n GanttRenderModel,\r\n GanttTask,\r\n GanttTheme,\r\n ResourceHistogramOptions,\r\n ResourceLoadBucket,\r\n ResourceLevelingOptions,\r\n ResourceLevelingResult,\r\n ViewMode,\r\n WorkingCalendar,\r\n} from \"@ganttloom/gantt-core\";\r\nimport { useGanttChart } from \"./useGanttChart\";\r\n\r\n/** Imperative escape hatches, available via a template ref (see the package README). */\r\nexport interface GanttChartHandle {\r\n /** Reverts the most recent move/resize/link/progress/create action. No-op unless `enable-history` is set. */\r\n undo(): void;\r\n /** Re-applies the most recently undone action. No-op unless `enable-history` is set. */\r\n redo(): void;\r\n /** Whether `undo()` currently has anything to revert. */\r\n canUndo(): boolean;\r\n /** Whether `redo()` currently has anything to re-apply. */\r\n canRedo(): boolean;\r\n /** Expands every collapsed group row. */\r\n expandAll(): void;\r\n /** Collapses every group row that has children. */\r\n collapseAll(): void;\r\n /** Toggles a single group row's collapsed state. */\r\n toggleGroup(taskId: string): void;\r\n /** Removes a dependency link between two tasks, if it exists. */\r\n removeDependency(fromId: string, toId: string): void;\r\n /** Patches an existing dependency link's fields (e.g. its `type` or `lagMs`). */\r\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\r\n /** Patches a task's fields in place (e.g. dates, progress, name) and re-renders. */\r\n updateTask(id: string, partial: Partial<GanttTask>): void;\r\n /** Switches the timeline's zoom level (hour/day/week/month/quarter/year). */\r\n setViewMode(mode: ViewMode): void;\r\n /** Grows `column-width` (never shrinks) so the timeline exactly fills the given container width. */\r\n fitToViewport(containerWidthPx: number): void;\r\n /** Scrolls the timeline so today's date is centered in the viewport. */\r\n scrollToToday(): void;\r\n /** Scrolls the timeline to the very start of the task date range. */\r\n scrollToRangeStart(): void;\r\n /** Scrolls the timeline to the very end of the task date range. */\r\n scrollToRangeEnd(): void;\r\n /** Total number of pages, when `pagination` is set (always `1` otherwise). */\r\n getPageCount(): number;\r\n /** Jumps to a 1-indexed page of top-level rows, when `pagination` is set. */\r\n setPage(page: number): void;\r\n /** Multiplies `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */\r\n zoomIn(factor?: number): void;\r\n /** Divides `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */\r\n zoomOut(factor?: number): void;\r\n /** Current `column-width` in px per smallest time unit. */\r\n getZoomLevel(): number;\r\n /** Per-assignee workload buckets, for spotting over-allocation. */\r\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\r\n /** Computes a conflict-free schedule by delaying double-booked assignees' tasks; does not mutate the chart's own tasks. */\r\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\r\n /** Selects one task bar; pass `{ additive: true }` to add to the existing selection instead of replacing it. Requires `selectable`. */\r\n selectTask(id: string, options?: { additive?: boolean }): void;\r\n /** Selects every currently-visible task bar. Requires `selectable`. */\r\n selectAllVisible(): void;\r\n /** Clears the current bar selection. */\r\n clearSelection(): void;\r\n /** IDs of the currently-selected task bars. */\r\n getSelectedTaskIds(): string[];\r\n /** Sorts sibling rows at every tree level by a column's value; `direction` omitted/`null` clears sorting. */\r\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\r\n /** The current sort state, or `null` if unsorted. */\r\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\r\n /** Shifts every selected task's start/end by `deltaMs`. Requires `selectable`. */\r\n bulkShiftDates(deltaMs: number): void;\r\n /** Deletes every currently-selected task. Requires `selectable`. */\r\n bulkDelete(): void;\r\n /** Serializes the current chart to a standalone SVG string. */\r\n toSVGString(): string;\r\n /** Renders the current chart to a single PNG data URL. */\r\n toPNGDataURL(): Promise<string>;\r\n /** Renders the current chart to one PNG data URL per page, tiled to the given page pixel size. */\r\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\r\n /** The current computed render model (rows/bars/links/ticks), or `null` before first render. */\r\n getRenderModel(): GanttRenderModel | null;\r\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\r\n getInstance(): GanttCore | null;\r\n}\r\n\r\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\r\n width: 0,\r\n height: 0,\r\n rowHeight: 0,\r\n headerHeight: 0,\r\n rows: [],\r\n bars: [],\r\n links: [],\r\n ticks: [],\r\n columns: [],\r\n theme: {} as GanttTheme,\r\n markers: [],\r\n rangeStart: new Date(0),\r\n sort: null,\r\n};\r\n\r\n/**\r\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\r\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\r\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\r\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\r\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\r\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\r\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\r\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\r\n */\r\nfunction hasInitialListener(eventName: string): boolean {\r\n const instance = getCurrentInstance();\r\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\r\n}\r\n\r\nconst ganttChartProps = {\r\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\r\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\r\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\r\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\r\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\r\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\r\n columnWidth: { type: Number, default: undefined },\r\n readonly: { type: Boolean, default: undefined },\r\n showProgress: { type: Boolean, default: undefined },\r\n showDependencies: { type: Boolean, default: undefined },\r\n gridPanelWidth: { type: Number, default: undefined },\r\n showCriticalPath: { type: Boolean, default: undefined },\r\n showBaseline: { type: Boolean, default: undefined },\r\n showDeadlines: { type: Boolean, default: undefined },\r\n /** Positions the grid and timeline headers. Default is \"top\". */\r\n headerPosition: { type: String as PropType<\"top\" | \"bottom\" | \"none\">, default: undefined },\r\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\r\n showTooltip: { type: Boolean, default: undefined },\r\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\r\n renderTooltip: {\r\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\r\n default: undefined,\r\n },\r\n showAssigneeAvatars: { type: Boolean, default: undefined },\r\n enableHistory: { type: Boolean, default: undefined },\r\n keyboardAccessible: { type: Boolean, default: undefined },\r\n virtualScroll: { type: Boolean, default: undefined },\r\n autoSchedule: { type: Boolean, default: undefined },\r\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\r\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\r\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\r\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\r\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\r\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\r\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\r\n autoRollupProgress: { type: Boolean, default: undefined },\r\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\r\n selectable: { type: Boolean, default: undefined },\r\n /**\r\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\r\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\r\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\r\n */\r\n autoFitToViewport: { type: Boolean, default: undefined },\r\n} as const;\r\n\r\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\r\n\r\nconst ganttChartEmits = {\r\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\r\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\r\n \"dependency-create\": (_dep: GanttDependency) => true,\r\n \"dependency-remove\": (_dep: GanttDependency) => true,\r\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\r\n \"task-click\": (_task: GanttTask) => true,\r\n \"task-dblclick\": (_task: GanttTask) => true,\r\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\r\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\r\n \"task-create\": (_task: GanttTask) => true,\r\n \"column-resize\": (_columnId: string, _width: number) => true,\r\n \"column-reorder\": (_order: string[]) => true,\r\n \"task-reorder\": (\r\n _draggedTaskId: string,\r\n _targetTaskId: string,\r\n _position: \"before\" | \"after\" | \"inside\"\r\n ) => true,\r\n \"selection-change\": (_taskIds: string[]) => true,\r\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\r\n};\r\n\r\nexport const GanttChart = defineComponent({\r\n name: \"GanttChart\",\r\n props: ganttChartProps,\r\n emits: ganttChartEmits,\r\n setup(props, { emit, expose }) {\r\n const containerRef = ref<HTMLElement | null>(null);\r\n const noop = () => {};\r\n\r\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\r\n // up the relevant DOM interaction at construction, and are captured once, up front.\r\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\r\n // handling works out of the box even for consumers who haven't attached a listener.\r\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\r\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\r\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\r\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\r\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\r\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\r\n\r\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\r\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\r\n // So none of them belong in `options` below — doing that would fire the Vue listener\r\n // twice per event, once here and once through the chart.on(...) subscription further down.\r\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\r\n // purely to control wiring, and (b) everything else, which is plain reactive config.\r\n const getOptions = (): GanttOptions => ({\r\n viewMode: props.viewMode,\r\n columns: props.columns,\r\n theme: props.theme,\r\n colorScheme: props.colorScheme,\r\n columnWidth: props.columnWidth,\r\n readonly: props.readonly,\r\n showProgress: props.showProgress,\r\n showDependencies: props.showDependencies,\r\n gridPanelWidth: props.gridPanelWidth,\r\n showCriticalPath: props.showCriticalPath,\r\n showBaseline: props.showBaseline,\r\n showDeadlines: props.showDeadlines,\r\n headerPosition: props.headerPosition,\r\n showTooltip: props.showTooltip,\r\n renderTooltip: props.renderTooltip,\r\n showAssigneeAvatars: props.showAssigneeAvatars,\r\n enableHistory: props.enableHistory,\r\n keyboardAccessible: props.keyboardAccessible,\r\n virtualScroll: props.virtualScroll,\r\n autoSchedule: props.autoSchedule,\r\n pagination: props.pagination,\r\n snapToUnit: props.snapToUnit,\r\n calendar: props.calendar,\r\n markers: props.markers,\r\n autoRollupProgress: props.autoRollupProgress,\r\n selectable: props.selectable,\r\n autoFitToViewport: props.autoFitToViewport,\r\n onContextMenu: noop,\r\n onTaskCreate: wireTaskCreate ? noop : undefined,\r\n onColumnResize: wireColumnResize ? noop : undefined,\r\n onColumnReorder: wireColumnReorder ? noop : undefined,\r\n onTaskReorder: wireTaskReorder ? noop : undefined,\r\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\r\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\r\n });\r\n\r\n const { chart } = useGanttChart(\r\n containerRef,\r\n () => props.tasks,\r\n () => props.dependencies,\r\n getOptions\r\n );\r\n\r\n // useGanttChart already watches getOptions and calls setOptions on change -\r\n // no need to duplicate that here.\r\n\r\n // All real event dispatch goes through the chart's public emitter — set up once when the\r\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\r\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\r\n watch(chart, (instance, _prev, onCleanup) => {\r\n if (!instance) return;\r\n instance.on(\"date-change\", handleDateChange);\r\n instance.on(\"progress-change\", handleProgressChange);\r\n instance.on(\"dependency-create\", handleDependencyCreate);\r\n instance.on(\"dependency-remove\", handleDependencyRemove);\r\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\r\n instance.on(\"task-click\", handleTaskClick);\r\n instance.on(\"task-dblclick\", handleTaskDblClick);\r\n instance.on(\"group-toggle\", handleGroupToggle);\r\n instance.on(\"context-menu\", handleContextMenu);\r\n instance.on(\"task-create\", handleTaskCreate);\r\n instance.on(\"column-resize\", handleColumnResize);\r\n instance.on(\"column-reorder\", handleColumnReorder);\r\n instance.on(\"task-reorder\", handleTaskReorder);\r\n instance.on(\"selection-change\", handleSelectionChange);\r\n instance.on(\"sort-change\", handleSortChange);\r\n onCleanup(() => {\r\n instance.off(\"date-change\", handleDateChange);\r\n instance.off(\"progress-change\", handleProgressChange);\r\n instance.off(\"dependency-create\", handleDependencyCreate);\r\n instance.off(\"dependency-remove\", handleDependencyRemove);\r\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\r\n instance.off(\"task-click\", handleTaskClick);\r\n instance.off(\"task-dblclick\", handleTaskDblClick);\r\n instance.off(\"group-toggle\", handleGroupToggle);\r\n instance.off(\"context-menu\", handleContextMenu);\r\n instance.off(\"task-create\", handleTaskCreate);\r\n instance.off(\"column-resize\", handleColumnResize);\r\n instance.off(\"column-reorder\", handleColumnReorder);\r\n instance.off(\"task-reorder\", handleTaskReorder);\r\n instance.off(\"selection-change\", handleSelectionChange);\r\n instance.off(\"sort-change\", handleSortChange);\r\n });\r\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\r\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\r\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\r\n\r\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\r\n emit(\"date-change\", p.task, p.start, p.end);\r\n }\r\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\r\n emit(\"progress-change\", p.task, p.progress);\r\n }\r\n function handleDependencyCreate(dep: GanttDependency) {\r\n emit(\"dependency-create\", dep);\r\n }\r\n function handleDependencyRemove(dep: GanttDependency) {\r\n emit(\"dependency-remove\", dep);\r\n }\r\n function handleDependencyDblClick(dep: GanttDependency) {\r\n emit(\"dependency-dblclick\", dep);\r\n }\r\n function handleTaskClick(p: { task: GanttTask }) {\r\n emit(\"task-click\", p.task);\r\n }\r\n function handleTaskDblClick(p: { task: GanttTask }) {\r\n emit(\"task-dblclick\", p.task);\r\n }\r\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\r\n emit(\"group-toggle\", p.task, p.collapsed);\r\n }\r\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\r\n emit(\"context-menu\", p.task, p.evt);\r\n }\r\n function handleTaskCreate(p: { task: GanttTask }) {\r\n emit(\"task-create\", p.task);\r\n }\r\n function handleColumnResize(p: { columnId: string; width: number }) {\r\n emit(\"column-resize\", p.columnId, p.width);\r\n }\r\n function handleColumnReorder(p: { order: string[] }) {\r\n emit(\"column-reorder\", p.order);\r\n }\r\n function handleTaskReorder(p: {\r\n draggedTaskId: string;\r\n targetTaskId: string;\r\n position: \"before\" | \"after\" | \"inside\";\r\n }) {\r\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\r\n }\r\n function handleSelectionChange(p: { taskIds: string[] }) {\r\n emit(\"selection-change\", p.taskIds);\r\n }\r\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\r\n emit(\"sort-change\", p.sort);\r\n }\r\n\r\n onBeforeUnmount(() => {\r\n containerRef.value = null;\r\n });\r\n\r\n const handle: GanttChartHandle = {\r\n undo: () => chart.value?.undo(),\r\n redo: () => chart.value?.redo(),\r\n canUndo: () => chart.value?.canUndo ?? false,\r\n canRedo: () => chart.value?.canRedo ?? false,\r\n expandAll: () => chart.value?.expandAll(),\r\n collapseAll: () => chart.value?.collapseAll(),\r\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\r\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\r\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\r\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\r\n setViewMode: (mode) => chart.value?.setViewMode(mode),\r\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\r\n scrollToToday: () => chart.value?.scrollToToday(),\r\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\r\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\r\n getPageCount: () => chart.value?.getPageCount() ?? 1,\r\n setPage: (page) => chart.value?.setPage(page),\r\n zoomIn: (factor) => chart.value?.zoomIn(factor),\r\n zoomOut: (factor) => chart.value?.zoomOut(factor),\r\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\r\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\r\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\r\n selectTask: (id, options) => chart.value?.selectTask(id, options),\r\n selectAllVisible: () => chart.value?.selectAllVisible(),\r\n clearSelection: () => chart.value?.clearSelection(),\r\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\r\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\r\n getSort: () => chart.value?.getSort() ?? null,\r\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\r\n bulkDelete: () => chart.value?.bulkDelete(),\r\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\r\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\r\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\r\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\r\n getInstance: () => chart.value,\r\n };\r\n expose(handle);\r\n\r\n // A single root element: class/style attrs fall through onto it automatically.\r\n return () => h(\"div\", { ref: containerRef });\r\n },\r\n});\r\n\r\nexport default GanttChart;\r\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIA,oBAAO;AAEP,IAAAA,cASO;;;ACfP,iBAAyF;AACzF,wBAAwC;AAwBjC,SAAS,cACd,cACA,UACA,iBACA,YACqB;AACrB,QAAM,YAAQ,uBAA6B,IAAI;AAC/C,QAAM,cAAU,uBAAW,KAAK;AAChC,QAAM,cAAU,uBAAW,KAAK;AAEhC,MAAI;AAEJ,4BAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,UAAM,WAAW,IAAI,kBAAAC,WAAU,WAAW,SAAS,GAAG,gBAAgB,GAAG,WAAW,CAAC;AACrF,UAAM,QAAQ;AACd,YAAQ,QAAQ,SAAS;AACzB,YAAQ,QAAQ,SAAS;AAEzB,sBAAkB,CAAC,UAAU;AAC3B,cAAQ,QAAQ,MAAM;AACtB,cAAQ,QAAQ,MAAM;AAAA,IACxB;AACA,aAAS,GAAG,kBAAkB,eAAe;AAAA,EAC/C,CAAC;AAED,kCAAgB,MAAM;AACpB,UAAM,WAAW,MAAM;AACvB,QAAI,CAAC,SAAU;AACf,QAAI,gBAAiB,UAAS,IAAI,kBAAkB,eAAe;AACnE,aAAS,QAAQ;AACjB,UAAM,QAAQ;AACd,YAAQ,QAAQ;AAChB,YAAQ,QAAQ;AAAA,EAClB,CAAC;AAID,wBAAM,UAAU,CAAC,UAAU,MAAM,OAAO,SAAS,KAAK,CAAC;AACvD,wBAAM,iBAAiB,CAAC,SAAS,MAAM,OAAO,gBAAgB,IAAI,CAAC;AACnE,wBAAM,YAAY,CAAC,YAAY,MAAM,OAAO,WAAW,OAAO,CAAC;AAE/D,SAAO,EAAE,OAAO,SAAS,QAAQ;AACnC;;;ADsCA,IAAM,qBAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AAAA,EACV,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AAAA,EACV,YAAY,oBAAI,KAAK,CAAC;AAAA,EACtB,MAAM;AACR;AAYA,SAAS,mBAAmB,WAA4B;AACtD,QAAM,eAAW,gCAAmB;AACpC,SAAO,CAAC,EAAE,UAAU,MAAM,SAAS,aAAa,SAAS,MAAM;AACjE;AAEA,IAAM,kBAAkB;AAAA,EACtB,OAAO,EAAE,MAAM,OAAgC,UAAU,KAAK;AAAA,EAC9D,cAAc,EAAE,MAAM,OAAsC,SAAS,MAAM,CAAC,EAAE;AAAA,EAC9E,UAAU,EAAE,MAAM,QAA8B,SAAS,OAAU;AAAA,EACnE,SAAS,EAAE,MAAM,OAAkC,SAAS,OAAU;AAAA,EACtE,OAAO,EAAE,MAAM,QAAyC,SAAS,OAAU;AAAA,EAC3E,aAAa,EAAE,MAAM,QAA+C,SAAS,OAAU;AAAA,EACvF,aAAa,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,EAChD,UAAU,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAC9C,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,kBAAkB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACtD,gBAAgB,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,EACnD,kBAAkB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACtD,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAEnD,gBAAgB,EAAE,MAAM,QAA+C,SAAS,OAAU;AAAA;AAAA,EAE1F,aAAa,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAEjD,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,qBAAqB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACzD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACnD,oBAAoB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACxD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACnD,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,YAAY,EAAE,MAAM,QAAwD,SAAS,OAAU;AAAA,EAC/F,YAAY,EAAE,MAAM,CAAC,QAAQ,OAAO,GAAgD,SAAS,OAAU;AAAA;AAAA,EAEvG,UAAU,EAAE,MAAM,QAAqC,SAAS,OAAU;AAAA;AAAA,EAE1E,SAAS,EAAE,MAAM,OAAkC,SAAS,OAAU;AAAA;AAAA,EAEtE,oBAAoB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAExD,YAAY,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,mBAAmB,EAAE,MAAM,SAAS,SAAS,OAAU;AACzD;AAIA,IAAM,kBAAkB;AAAA,EACtB,eAAe,CAAC,OAAkB,QAAc,SAAe;AAAA,EAC/D,mBAAmB,CAAC,OAAkB,cAAsB;AAAA,EAC5D,qBAAqB,CAAC,SAA0B;AAAA,EAChD,qBAAqB,CAAC,SAA0B;AAAA,EAChD,uBAAuB,CAAC,SAA0B;AAAA,EAClD,cAAc,CAAC,UAAqB;AAAA,EACpC,iBAAiB,CAAC,UAAqB;AAAA,EACvC,gBAAgB,CAAC,OAAkB,eAAwB;AAAA,EAC3D,gBAAgB,CAAC,OAAkB,SAAuB;AAAA,EAC1D,eAAe,CAAC,UAAqB;AAAA,EACrC,iBAAiB,CAAC,WAAmB,WAAmB;AAAA,EACxD,kBAAkB,CAAC,WAAqB;AAAA,EACxC,gBAAgB,CACd,gBACA,eACA,cACG;AAAA,EACL,oBAAoB,CAAC,aAAuB;AAAA,EAC5C,eAAe,CAAC,UAAkE;AACpF;AAEO,IAAM,iBAAa,6BAAgB;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,MAAM,OAAO,GAAG;AAC7B,UAAM,mBAAe,iBAAwB,IAAI;AACjD,UAAM,OAAO,MAAM;AAAA,IAAC;AAMpB,UAAM,iBAAiB,mBAAmB,cAAc;AACxD,UAAM,mBAAmB,mBAAmB,gBAAgB;AAC5D,UAAM,oBAAoB,mBAAmB,iBAAiB;AAC9D,UAAM,kBAAkB,mBAAmB,eAAe;AAC1D,UAAM,yBAAyB,mBAAmB,sBAAsB;AACxE,UAAM,mBAAmB,mBAAmB,gBAAgB;AAQ5D,UAAM,aAAa,OAAqB;AAAA,MACtC,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,cAAc,MAAM;AAAA,MACpB,kBAAkB,MAAM;AAAA,MACxB,gBAAgB,MAAM;AAAA,MACtB,kBAAkB,MAAM;AAAA,MACxB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,gBAAgB,MAAM;AAAA,MACtB,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,qBAAqB,MAAM;AAAA,MAC3B,eAAe,MAAM;AAAA,MACrB,oBAAoB,MAAM;AAAA,MAC1B,eAAe,MAAM;AAAA,MACrB,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,oBAAoB,MAAM;AAAA,MAC1B,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB,eAAe;AAAA,MACf,cAAc,iBAAiB,OAAO;AAAA,MACtC,gBAAgB,mBAAmB,OAAO;AAAA,MAC1C,iBAAiB,oBAAoB,OAAO;AAAA,MAC5C,eAAe,kBAAkB,OAAO;AAAA,MACxC,sBAAsB,yBAAyB,OAAO;AAAA,MACtD,gBAAgB,mBAAmB,OAAO;AAAA,IAC5C;AAEA,UAAM,EAAE,MAAM,IAAI;AAAA,MAChB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ;AAAA,IACF;AAQA,2BAAM,OAAO,CAAC,UAAU,OAAO,cAAc;AAC3C,UAAI,CAAC,SAAU;AACf,eAAS,GAAG,eAAe,gBAAgB;AAC3C,eAAS,GAAG,mBAAmB,oBAAoB;AACnD,eAAS,GAAG,qBAAqB,sBAAsB;AACvD,eAAS,GAAG,qBAAqB,sBAAsB;AACvD,eAAS,GAAG,uBAAuB,wBAAwB;AAC3D,eAAS,GAAG,cAAc,eAAe;AACzC,eAAS,GAAG,iBAAiB,kBAAkB;AAC/C,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,eAAe,gBAAgB;AAC3C,eAAS,GAAG,iBAAiB,kBAAkB;AAC/C,eAAS,GAAG,kBAAkB,mBAAmB;AACjD,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,oBAAoB,qBAAqB;AACrD,eAAS,GAAG,eAAe,gBAAgB;AAC3C,gBAAU,MAAM;AACd,iBAAS,IAAI,eAAe,gBAAgB;AAC5C,iBAAS,IAAI,mBAAmB,oBAAoB;AACpD,iBAAS,IAAI,qBAAqB,sBAAsB;AACxD,iBAAS,IAAI,qBAAqB,sBAAsB;AACxD,iBAAS,IAAI,uBAAuB,wBAAwB;AAC5D,iBAAS,IAAI,cAAc,eAAe;AAC1C,iBAAS,IAAI,iBAAiB,kBAAkB;AAChD,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,eAAe,gBAAgB;AAC5C,iBAAS,IAAI,iBAAiB,kBAAkB;AAChD,iBAAS,IAAI,kBAAkB,mBAAmB;AAClD,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,oBAAoB,qBAAqB;AACtD,iBAAS,IAAI,eAAe,gBAAgB;AAAA,MAC9C,CAAC;AAAA,IACH,GAAG,EAAE,OAAO,OAAO,CAAC;AAIpB,aAAS,iBAAiB,GAAgD;AACxE,WAAK,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;AAAA,IAC5C;AACA,aAAS,qBAAqB,GAA0C;AACtE,WAAK,mBAAmB,EAAE,MAAM,EAAE,QAAQ;AAAA,IAC5C;AACA,aAAS,uBAAuB,KAAsB;AACpD,WAAK,qBAAqB,GAAG;AAAA,IAC/B;AACA,aAAS,uBAAuB,KAAsB;AACpD,WAAK,qBAAqB,GAAG;AAAA,IAC/B;AACA,aAAS,yBAAyB,KAAsB;AACtD,WAAK,uBAAuB,GAAG;AAAA,IACjC;AACA,aAAS,gBAAgB,GAAwB;AAC/C,WAAK,cAAc,EAAE,IAAI;AAAA,IAC3B;AACA,aAAS,mBAAmB,GAAwB;AAClD,WAAK,iBAAiB,EAAE,IAAI;AAAA,IAC9B;AACA,aAAS,kBAAkB,GAA4C;AACrE,WAAK,gBAAgB,EAAE,MAAM,EAAE,SAAS;AAAA,IAC1C;AACA,aAAS,kBAAkB,GAA2C;AACpE,WAAK,gBAAgB,EAAE,MAAM,EAAE,GAAG;AAAA,IACpC;AACA,aAAS,iBAAiB,GAAwB;AAChD,WAAK,eAAe,EAAE,IAAI;AAAA,IAC5B;AACA,aAAS,mBAAmB,GAAwC;AAClE,WAAK,iBAAiB,EAAE,UAAU,EAAE,KAAK;AAAA,IAC3C;AACA,aAAS,oBAAoB,GAAwB;AACnD,WAAK,kBAAkB,EAAE,KAAK;AAAA,IAChC;AACA,aAAS,kBAAkB,GAIxB;AACD,WAAK,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ;AAAA,IAClE;AACA,aAAS,sBAAsB,GAA0B;AACvD,WAAK,oBAAoB,EAAE,OAAO;AAAA,IACpC;AACA,aAAS,iBAAiB,GAAqE;AAC7F,WAAK,eAAe,EAAE,IAAI;AAAA,IAC5B;AAEA,qCAAgB,MAAM;AACpB,mBAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,SAA2B;AAAA,MAC/B,MAAM,MAAM,MAAM,OAAO,KAAK;AAAA,MAC9B,MAAM,MAAM,MAAM,OAAO,KAAK;AAAA,MAC9B,SAAS,MAAM,MAAM,OAAO,WAAW;AAAA,MACvC,SAAS,MAAM,MAAM,OAAO,WAAW;AAAA,MACvC,WAAW,MAAM,MAAM,OAAO,UAAU;AAAA,MACxC,aAAa,MAAM,MAAM,OAAO,YAAY;AAAA,MAC5C,aAAa,CAAC,WAAW,MAAM,OAAO,YAAY,MAAM;AAAA,MACxD,kBAAkB,CAAC,QAAQ,SAAS,MAAM,OAAO,iBAAiB,QAAQ,IAAI;AAAA,MAC9E,kBAAkB,CAAC,QAAQ,MAAM,YAAY,MAAM,OAAO,iBAAiB,QAAQ,MAAM,OAAO;AAAA,MAChG,YAAY,CAAC,IAAI,YAAY,MAAM,OAAO,WAAW,IAAI,OAAO;AAAA,MAChE,aAAa,CAAC,SAAS,MAAM,OAAO,YAAY,IAAI;AAAA,MACpD,eAAe,CAAC,qBAAqB,MAAM,OAAO,cAAc,gBAAgB;AAAA,MAChF,eAAe,MAAM,MAAM,OAAO,cAAc;AAAA,MAChD,oBAAoB,MAAM,MAAM,OAAO,mBAAmB;AAAA,MAC1D,kBAAkB,MAAM,MAAM,OAAO,iBAAiB;AAAA,MACtD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK;AAAA,MACnD,SAAS,CAAC,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,MAC5C,QAAQ,CAAC,WAAW,MAAM,OAAO,OAAO,MAAM;AAAA,MAC9C,SAAS,CAAC,WAAW,MAAM,OAAO,QAAQ,MAAM;AAAA,MAChD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK;AAAA,MACnD,sBAAsB,CAAC,YAAY,MAAM,OAAO,qBAAqB,OAAO,KAAK,CAAC;AAAA,MAClF,iBAAiB,CAAC,YAAY,MAAM,OAAO,gBAAgB,OAAO,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAChG,YAAY,CAAC,IAAI,YAAY,MAAM,OAAO,WAAW,IAAI,OAAO;AAAA,MAChE,kBAAkB,MAAM,MAAM,OAAO,iBAAiB;AAAA,MACtD,gBAAgB,MAAM,MAAM,OAAO,eAAe;AAAA,MAClD,oBAAoB,MAAM,MAAM,OAAO,mBAAmB,KAAK,CAAC;AAAA,MAChE,SAAS,CAAC,UAAU,cAAc,MAAM,OAAO,QAAQ,UAAU,SAAS;AAAA,MAC1E,SAAS,MAAM,MAAM,OAAO,QAAQ,KAAK;AAAA,MACzC,gBAAgB,CAAC,YAAY,MAAM,OAAO,eAAe,OAAO;AAAA,MAChE,YAAY,MAAM,MAAM,OAAO,WAAW;AAAA,MAC1C,aAAa,MAAM,MAAM,OAAO,YAAY,KAAK;AAAA,MACjD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,QAAQ,EAAE;AAAA,MACrE,eAAe,CAAC,YAAY,MAAM,OAAO,cAAc,OAAO,KAAK,QAAQ,QAAQ,CAAC,CAAC;AAAA,MACrF,gBAAgB,MAAM,MAAM,OAAO,eAAe,KAAK;AAAA,MACvD,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,WAAO,MAAM;AAGb,WAAO,UAAM,eAAE,OAAO,EAAE,KAAK,aAAa,CAAC;AAAA,EAC7C;AACF,CAAC;AAED,IAAO,qBAAQ;;;ADjYf,IAAAC,qBAmBO;","names":["import_vue","GanttCore","import_gantt_core"]}
package/dist/index.d.cts CHANGED
@@ -5,47 +5,81 @@ export { ConstraintType, DEFAULT_PALETTE, DENSITY_PRESETS, Density, DependencyTy
5
5
 
6
6
  /** Imperative escape hatches, available via a template ref (see the package README). */
7
7
  interface GanttChartHandle {
8
+ /** Reverts the most recent move/resize/link/progress/create action. No-op unless `enable-history` is set. */
8
9
  undo(): void;
10
+ /** Re-applies the most recently undone action. No-op unless `enable-history` is set. */
9
11
  redo(): void;
12
+ /** Whether `undo()` currently has anything to revert. */
10
13
  canUndo(): boolean;
14
+ /** Whether `redo()` currently has anything to re-apply. */
11
15
  canRedo(): boolean;
16
+ /** Expands every collapsed group row. */
12
17
  expandAll(): void;
18
+ /** Collapses every group row that has children. */
13
19
  collapseAll(): void;
20
+ /** Toggles a single group row's collapsed state. */
14
21
  toggleGroup(taskId: string): void;
22
+ /** Removes a dependency link between two tasks, if it exists. */
15
23
  removeDependency(fromId: string, toId: string): void;
24
+ /** Patches an existing dependency link's fields (e.g. its `type` or `lagMs`). */
16
25
  updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;
26
+ /** Patches a task's fields in place (e.g. dates, progress, name) and re-renders. */
17
27
  updateTask(id: string, partial: Partial<GanttTask>): void;
28
+ /** Switches the timeline's zoom level (hour/day/week/month/quarter/year). */
18
29
  setViewMode(mode: ViewMode): void;
30
+ /** Grows `column-width` (never shrinks) so the timeline exactly fills the given container width. */
19
31
  fitToViewport(containerWidthPx: number): void;
32
+ /** Scrolls the timeline so today's date is centered in the viewport. */
20
33
  scrollToToday(): void;
34
+ /** Scrolls the timeline to the very start of the task date range. */
21
35
  scrollToRangeStart(): void;
36
+ /** Scrolls the timeline to the very end of the task date range. */
22
37
  scrollToRangeEnd(): void;
38
+ /** Total number of pages, when `pagination` is set (always `1` otherwise). */
23
39
  getPageCount(): number;
40
+ /** Jumps to a 1-indexed page of top-level rows, when `pagination` is set. */
24
41
  setPage(page: number): void;
42
+ /** Multiplies `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */
25
43
  zoomIn(factor?: number): void;
44
+ /** Divides `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */
26
45
  zoomOut(factor?: number): void;
46
+ /** Current `column-width` in px per smallest time unit. */
27
47
  getZoomLevel(): number;
48
+ /** Per-assignee workload buckets, for spotting over-allocation. */
28
49
  getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];
50
+ /** Computes a conflict-free schedule by delaying double-booked assignees' tasks; does not mutate the chart's own tasks. */
29
51
  getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;
52
+ /** Selects one task bar; pass `{ additive: true }` to add to the existing selection instead of replacing it. Requires `selectable`. */
30
53
  selectTask(id: string, options?: {
31
54
  additive?: boolean;
32
55
  }): void;
56
+ /** Selects every currently-visible task bar. Requires `selectable`. */
33
57
  selectAllVisible(): void;
58
+ /** Clears the current bar selection. */
34
59
  clearSelection(): void;
60
+ /** IDs of the currently-selected task bars. */
35
61
  getSelectedTaskIds(): string[];
62
+ /** Sorts sibling rows at every tree level by a column's value; `direction` omitted/`null` clears sorting. */
36
63
  setSort(columnId: string | null, direction?: "asc" | "desc" | null): void;
64
+ /** The current sort state, or `null` if unsorted. */
37
65
  getSort(): {
38
66
  columnId: string;
39
67
  direction: "asc" | "desc";
40
68
  } | null;
69
+ /** Shifts every selected task's start/end by `deltaMs`. Requires `selectable`. */
41
70
  bulkShiftDates(deltaMs: number): void;
71
+ /** Deletes every currently-selected task. Requires `selectable`. */
42
72
  bulkDelete(): void;
73
+ /** Serializes the current chart to a standalone SVG string. */
43
74
  toSVGString(): string;
75
+ /** Renders the current chart to a single PNG data URL. */
44
76
  toPNGDataURL(): Promise<string>;
77
+ /** Renders the current chart to one PNG data URL per page, tiled to the given page pixel size. */
45
78
  toPNGDataURLs(options?: {
46
79
  pageWidthPx?: number;
47
80
  pageHeightPx?: number;
48
81
  }): Promise<string[]>;
82
+ /** The current computed render model (rows/bars/links/ticks), or `null` before first render. */
49
83
  getRenderModel(): GanttRenderModel | null;
50
84
  /** Direct access to the underlying framework-agnostic core instance (null before mount). */
51
85
  getInstance(): GanttChart$1 | null;
@@ -107,6 +141,11 @@ declare const ganttChartProps: {
107
141
  readonly type: BooleanConstructor;
108
142
  readonly default: undefined;
109
143
  };
144
+ /** Positions the grid and timeline headers. Default is "top". */
145
+ readonly headerPosition: {
146
+ readonly type: PropType<"top" | "bottom" | "none">;
147
+ readonly default: undefined;
148
+ };
110
149
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
111
150
  readonly showTooltip: {
112
151
  readonly type: BooleanConstructor;
@@ -236,6 +275,11 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
236
275
  readonly type: BooleanConstructor;
237
276
  readonly default: undefined;
238
277
  };
278
+ /** Positions the grid and timeline headers. Default is "top". */
279
+ readonly headerPosition: {
280
+ readonly type: PropType<"top" | "bottom" | "none">;
281
+ readonly default: undefined;
282
+ };
239
283
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
240
284
  readonly showTooltip: {
241
285
  readonly type: BooleanConstructor;
@@ -384,6 +428,11 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
384
428
  readonly type: BooleanConstructor;
385
429
  readonly default: undefined;
386
430
  };
431
+ /** Positions the grid and timeline headers. Default is "top". */
432
+ readonly headerPosition: {
433
+ readonly type: PropType<"top" | "bottom" | "none">;
434
+ readonly default: undefined;
435
+ };
387
436
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
388
437
  readonly showTooltip: {
389
438
  readonly type: BooleanConstructor;
@@ -479,6 +528,7 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
479
528
  readonly theme: Partial<GanttTheme>;
480
529
  readonly colorScheme: "light" | "dark" | "auto";
481
530
  readonly columnWidth: number;
531
+ readonly headerPosition: "top" | "bottom" | "none";
482
532
  readonly readonly: boolean;
483
533
  readonly showProgress: boolean;
484
534
  readonly showDependencies: boolean;
package/dist/index.d.ts CHANGED
@@ -5,47 +5,81 @@ export { ConstraintType, DEFAULT_PALETTE, DENSITY_PRESETS, Density, DependencyTy
5
5
 
6
6
  /** Imperative escape hatches, available via a template ref (see the package README). */
7
7
  interface GanttChartHandle {
8
+ /** Reverts the most recent move/resize/link/progress/create action. No-op unless `enable-history` is set. */
8
9
  undo(): void;
10
+ /** Re-applies the most recently undone action. No-op unless `enable-history` is set. */
9
11
  redo(): void;
12
+ /** Whether `undo()` currently has anything to revert. */
10
13
  canUndo(): boolean;
14
+ /** Whether `redo()` currently has anything to re-apply. */
11
15
  canRedo(): boolean;
16
+ /** Expands every collapsed group row. */
12
17
  expandAll(): void;
18
+ /** Collapses every group row that has children. */
13
19
  collapseAll(): void;
20
+ /** Toggles a single group row's collapsed state. */
14
21
  toggleGroup(taskId: string): void;
22
+ /** Removes a dependency link between two tasks, if it exists. */
15
23
  removeDependency(fromId: string, toId: string): void;
24
+ /** Patches an existing dependency link's fields (e.g. its `type` or `lagMs`). */
16
25
  updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;
26
+ /** Patches a task's fields in place (e.g. dates, progress, name) and re-renders. */
17
27
  updateTask(id: string, partial: Partial<GanttTask>): void;
28
+ /** Switches the timeline's zoom level (hour/day/week/month/quarter/year). */
18
29
  setViewMode(mode: ViewMode): void;
30
+ /** Grows `column-width` (never shrinks) so the timeline exactly fills the given container width. */
19
31
  fitToViewport(containerWidthPx: number): void;
32
+ /** Scrolls the timeline so today's date is centered in the viewport. */
20
33
  scrollToToday(): void;
34
+ /** Scrolls the timeline to the very start of the task date range. */
21
35
  scrollToRangeStart(): void;
36
+ /** Scrolls the timeline to the very end of the task date range. */
22
37
  scrollToRangeEnd(): void;
38
+ /** Total number of pages, when `pagination` is set (always `1` otherwise). */
23
39
  getPageCount(): number;
40
+ /** Jumps to a 1-indexed page of top-level rows, when `pagination` is set. */
24
41
  setPage(page: number): void;
42
+ /** Multiplies `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */
25
43
  zoomIn(factor?: number): void;
44
+ /** Divides `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */
26
45
  zoomOut(factor?: number): void;
46
+ /** Current `column-width` in px per smallest time unit. */
27
47
  getZoomLevel(): number;
48
+ /** Per-assignee workload buckets, for spotting over-allocation. */
28
49
  getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];
50
+ /** Computes a conflict-free schedule by delaying double-booked assignees' tasks; does not mutate the chart's own tasks. */
29
51
  getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;
52
+ /** Selects one task bar; pass `{ additive: true }` to add to the existing selection instead of replacing it. Requires `selectable`. */
30
53
  selectTask(id: string, options?: {
31
54
  additive?: boolean;
32
55
  }): void;
56
+ /** Selects every currently-visible task bar. Requires `selectable`. */
33
57
  selectAllVisible(): void;
58
+ /** Clears the current bar selection. */
34
59
  clearSelection(): void;
60
+ /** IDs of the currently-selected task bars. */
35
61
  getSelectedTaskIds(): string[];
62
+ /** Sorts sibling rows at every tree level by a column's value; `direction` omitted/`null` clears sorting. */
36
63
  setSort(columnId: string | null, direction?: "asc" | "desc" | null): void;
64
+ /** The current sort state, or `null` if unsorted. */
37
65
  getSort(): {
38
66
  columnId: string;
39
67
  direction: "asc" | "desc";
40
68
  } | null;
69
+ /** Shifts every selected task's start/end by `deltaMs`. Requires `selectable`. */
41
70
  bulkShiftDates(deltaMs: number): void;
71
+ /** Deletes every currently-selected task. Requires `selectable`. */
42
72
  bulkDelete(): void;
73
+ /** Serializes the current chart to a standalone SVG string. */
43
74
  toSVGString(): string;
75
+ /** Renders the current chart to a single PNG data URL. */
44
76
  toPNGDataURL(): Promise<string>;
77
+ /** Renders the current chart to one PNG data URL per page, tiled to the given page pixel size. */
45
78
  toPNGDataURLs(options?: {
46
79
  pageWidthPx?: number;
47
80
  pageHeightPx?: number;
48
81
  }): Promise<string[]>;
82
+ /** The current computed render model (rows/bars/links/ticks), or `null` before first render. */
49
83
  getRenderModel(): GanttRenderModel | null;
50
84
  /** Direct access to the underlying framework-agnostic core instance (null before mount). */
51
85
  getInstance(): GanttChart$1 | null;
@@ -107,6 +141,11 @@ declare const ganttChartProps: {
107
141
  readonly type: BooleanConstructor;
108
142
  readonly default: undefined;
109
143
  };
144
+ /** Positions the grid and timeline headers. Default is "top". */
145
+ readonly headerPosition: {
146
+ readonly type: PropType<"top" | "bottom" | "none">;
147
+ readonly default: undefined;
148
+ };
110
149
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
111
150
  readonly showTooltip: {
112
151
  readonly type: BooleanConstructor;
@@ -236,6 +275,11 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
236
275
  readonly type: BooleanConstructor;
237
276
  readonly default: undefined;
238
277
  };
278
+ /** Positions the grid and timeline headers. Default is "top". */
279
+ readonly headerPosition: {
280
+ readonly type: PropType<"top" | "bottom" | "none">;
281
+ readonly default: undefined;
282
+ };
239
283
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
240
284
  readonly showTooltip: {
241
285
  readonly type: BooleanConstructor;
@@ -384,6 +428,11 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
384
428
  readonly type: BooleanConstructor;
385
429
  readonly default: undefined;
386
430
  };
431
+ /** Positions the grid and timeline headers. Default is "top". */
432
+ readonly headerPosition: {
433
+ readonly type: PropType<"top" | "bottom" | "none">;
434
+ readonly default: undefined;
435
+ };
387
436
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
388
437
  readonly showTooltip: {
389
438
  readonly type: BooleanConstructor;
@@ -479,6 +528,7 @@ declare const GanttChart: vue.DefineComponent<ExtractPropTypes<{
479
528
  readonly theme: Partial<GanttTheme>;
480
529
  readonly colorScheme: "light" | "dark" | "auto";
481
530
  readonly columnWidth: number;
531
+ readonly headerPosition: "top" | "bottom" | "none";
482
532
  readonly readonly: boolean;
483
533
  readonly showProgress: boolean;
484
534
  readonly showDependencies: boolean;
package/dist/index.js CHANGED
@@ -80,6 +80,8 @@ var ganttChartProps = {
80
80
  showCriticalPath: { type: Boolean, default: void 0 },
81
81
  showBaseline: { type: Boolean, default: void 0 },
82
82
  showDeadlines: { type: Boolean, default: void 0 },
83
+ /** Positions the grid and timeline headers. Default is "top". */
84
+ headerPosition: { type: String, default: void 0 },
83
85
  /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */
84
86
  showTooltip: { type: Boolean, default: void 0 },
85
87
  /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */
@@ -153,6 +155,7 @@ var GanttChart = defineComponent({
153
155
  showCriticalPath: props.showCriticalPath,
154
156
  showBaseline: props.showBaseline,
155
157
  showDeadlines: props.showDeadlines,
158
+ headerPosition: props.headerPosition,
156
159
  showTooltip: props.showTooltip,
157
160
  renderTooltip: props.renderTooltip,
158
161
  showAssigneeAvatars: props.showAssigneeAvatars,
@@ -181,7 +184,6 @@ var GanttChart = defineComponent({
181
184
  () => props.dependencies,
182
185
  getOptions
183
186
  );
184
- watch2(getOptions, (options) => chart.value?.setOptions(options));
185
187
  watch2(chart, (instance, _prev, onCleanup) => {
186
188
  if (!instance) return;
187
189
  instance.on("date-change", handleDateChange);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/GanttChart.ts","../src/useGanttChart.ts","../src/index.ts"],"sourcesContent":["// Pulls in the core's default styles so consumers get a working chart out of the box.\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\n// import \"@ganttloom/gantt-core/styles.css\";\nimport \"@ganttloom/gantt-core/styles.css\";\n\nimport {\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n ref,\n watch,\n type ExtractPropTypes,\n type PropType,\n} from \"vue\";\nimport type {\n GanttChart as GanttCore,\n GanttColumn,\n GanttDependency,\n GanttMarker,\n GanttOptions,\n GanttRenderModel,\n GanttTask,\n GanttTheme,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n ViewMode,\n WorkingCalendar,\n} from \"@ganttloom/gantt-core\";\nimport { useGanttChart } from \"./useGanttChart\";\n\n/** Imperative escape hatches, available via a template ref (see the package README). */\nexport interface GanttChartHandle {\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n expandAll(): void;\n collapseAll(): void;\n toggleGroup(taskId: string): void;\n removeDependency(fromId: string, toId: string): void;\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\n updateTask(id: string, partial: Partial<GanttTask>): void;\n setViewMode(mode: ViewMode): void;\n fitToViewport(containerWidthPx: number): void;\n scrollToToday(): void;\n scrollToRangeStart(): void;\n scrollToRangeEnd(): void;\n getPageCount(): number;\n setPage(page: number): void;\n zoomIn(factor?: number): void;\n zoomOut(factor?: number): void;\n getZoomLevel(): number;\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\n selectTask(id: string, options?: { additive?: boolean }): void;\n selectAllVisible(): void;\n clearSelection(): void;\n getSelectedTaskIds(): string[];\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\n bulkShiftDates(deltaMs: number): void;\n bulkDelete(): void;\n toSVGString(): string;\n toPNGDataURL(): Promise<string>;\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\n getRenderModel(): GanttRenderModel | null;\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\n getInstance(): GanttCore | null;\n}\n\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\n width: 0,\n height: 0,\n rowHeight: 0,\n headerHeight: 0,\n rows: [],\n bars: [],\n links: [],\n ticks: [],\n columns: [],\n theme: {} as GanttTheme,\n markers: [],\n rangeStart: new Date(0),\n sort: null,\n};\n\n/**\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\n */\nfunction hasInitialListener(eventName: string): boolean {\n const instance = getCurrentInstance();\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\n}\n\nconst ganttChartProps = {\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\n columnWidth: { type: Number, default: undefined },\n readonly: { type: Boolean, default: undefined },\n showProgress: { type: Boolean, default: undefined },\n showDependencies: { type: Boolean, default: undefined },\n gridPanelWidth: { type: Number, default: undefined },\n showCriticalPath: { type: Boolean, default: undefined },\n showBaseline: { type: Boolean, default: undefined },\n showDeadlines: { type: Boolean, default: undefined },\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\n showTooltip: { type: Boolean, default: undefined },\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\n renderTooltip: {\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\n default: undefined,\n },\n showAssigneeAvatars: { type: Boolean, default: undefined },\n enableHistory: { type: Boolean, default: undefined },\n keyboardAccessible: { type: Boolean, default: undefined },\n virtualScroll: { type: Boolean, default: undefined },\n autoSchedule: { type: Boolean, default: undefined },\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\n autoRollupProgress: { type: Boolean, default: undefined },\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\n selectable: { type: Boolean, default: undefined },\n /**\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\n */\n autoFitToViewport: { type: Boolean, default: undefined },\n} as const;\n\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\n\nconst ganttChartEmits = {\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\n \"dependency-create\": (_dep: GanttDependency) => true,\n \"dependency-remove\": (_dep: GanttDependency) => true,\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\n \"task-click\": (_task: GanttTask) => true,\n \"task-dblclick\": (_task: GanttTask) => true,\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\n \"task-create\": (_task: GanttTask) => true,\n \"column-resize\": (_columnId: string, _width: number) => true,\n \"column-reorder\": (_order: string[]) => true,\n \"task-reorder\": (\n _draggedTaskId: string,\n _targetTaskId: string,\n _position: \"before\" | \"after\" | \"inside\"\n ) => true,\n \"selection-change\": (_taskIds: string[]) => true,\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\n};\n\nexport const GanttChart = defineComponent({\n name: \"GanttChart\",\n props: ganttChartProps,\n emits: ganttChartEmits,\n setup(props, { emit, expose }) {\n const containerRef = ref<HTMLElement | null>(null);\n const noop = () => {};\n\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\n // up the relevant DOM interaction at construction, and are captured once, up front.\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\n // handling works out of the box even for consumers who haven't attached a listener.\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\n\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\n // So none of them belong in `options` below — doing that would fire the Vue listener\n // twice per event, once here and once through the chart.on(...) subscription further down.\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\n // purely to control wiring, and (b) everything else, which is plain reactive config.\n const getOptions = (): GanttOptions => ({\n viewMode: props.viewMode,\n columns: props.columns,\n theme: props.theme,\n colorScheme: props.colorScheme,\n columnWidth: props.columnWidth,\n readonly: props.readonly,\n showProgress: props.showProgress,\n showDependencies: props.showDependencies,\n gridPanelWidth: props.gridPanelWidth,\n showCriticalPath: props.showCriticalPath,\n showBaseline: props.showBaseline,\n showDeadlines: props.showDeadlines,\n showTooltip: props.showTooltip,\n renderTooltip: props.renderTooltip,\n showAssigneeAvatars: props.showAssigneeAvatars,\n enableHistory: props.enableHistory,\n keyboardAccessible: props.keyboardAccessible,\n virtualScroll: props.virtualScroll,\n autoSchedule: props.autoSchedule,\n pagination: props.pagination,\n snapToUnit: props.snapToUnit,\n calendar: props.calendar,\n markers: props.markers,\n autoRollupProgress: props.autoRollupProgress,\n selectable: props.selectable,\n autoFitToViewport: props.autoFitToViewport,\n onContextMenu: noop,\n onTaskCreate: wireTaskCreate ? noop : undefined,\n onColumnResize: wireColumnResize ? noop : undefined,\n onColumnReorder: wireColumnReorder ? noop : undefined,\n onTaskReorder: wireTaskReorder ? noop : undefined,\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\n });\n\n const { chart } = useGanttChart(\n containerRef,\n () => props.tasks,\n () => props.dependencies,\n getOptions\n );\n\n // getOptions() builds a fresh object every call, so this only re-syncs gantt-core's\n // options when one of the reactive prop values it reads actually changed.\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n // All real event dispatch goes through the chart's public emitter — set up once when the\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\n watch(chart, (instance, _prev, onCleanup) => {\n if (!instance) return;\n instance.on(\"date-change\", handleDateChange);\n instance.on(\"progress-change\", handleProgressChange);\n instance.on(\"dependency-create\", handleDependencyCreate);\n instance.on(\"dependency-remove\", handleDependencyRemove);\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\n instance.on(\"task-click\", handleTaskClick);\n instance.on(\"task-dblclick\", handleTaskDblClick);\n instance.on(\"group-toggle\", handleGroupToggle);\n instance.on(\"context-menu\", handleContextMenu);\n instance.on(\"task-create\", handleTaskCreate);\n instance.on(\"column-resize\", handleColumnResize);\n instance.on(\"column-reorder\", handleColumnReorder);\n instance.on(\"task-reorder\", handleTaskReorder);\n instance.on(\"selection-change\", handleSelectionChange);\n instance.on(\"sort-change\", handleSortChange);\n onCleanup(() => {\n instance.off(\"date-change\", handleDateChange);\n instance.off(\"progress-change\", handleProgressChange);\n instance.off(\"dependency-create\", handleDependencyCreate);\n instance.off(\"dependency-remove\", handleDependencyRemove);\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\n instance.off(\"task-click\", handleTaskClick);\n instance.off(\"task-dblclick\", handleTaskDblClick);\n instance.off(\"group-toggle\", handleGroupToggle);\n instance.off(\"context-menu\", handleContextMenu);\n instance.off(\"task-create\", handleTaskCreate);\n instance.off(\"column-resize\", handleColumnResize);\n instance.off(\"column-reorder\", handleColumnReorder);\n instance.off(\"task-reorder\", handleTaskReorder);\n instance.off(\"selection-change\", handleSelectionChange);\n instance.off(\"sort-change\", handleSortChange);\n });\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\n\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\n emit(\"date-change\", p.task, p.start, p.end);\n }\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\n emit(\"progress-change\", p.task, p.progress);\n }\n function handleDependencyCreate(dep: GanttDependency) {\n emit(\"dependency-create\", dep);\n }\n function handleDependencyRemove(dep: GanttDependency) {\n emit(\"dependency-remove\", dep);\n }\n function handleDependencyDblClick(dep: GanttDependency) {\n emit(\"dependency-dblclick\", dep);\n }\n function handleTaskClick(p: { task: GanttTask }) {\n emit(\"task-click\", p.task);\n }\n function handleTaskDblClick(p: { task: GanttTask }) {\n emit(\"task-dblclick\", p.task);\n }\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\n emit(\"group-toggle\", p.task, p.collapsed);\n }\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\n emit(\"context-menu\", p.task, p.evt);\n }\n function handleTaskCreate(p: { task: GanttTask }) {\n emit(\"task-create\", p.task);\n }\n function handleColumnResize(p: { columnId: string; width: number }) {\n emit(\"column-resize\", p.columnId, p.width);\n }\n function handleColumnReorder(p: { order: string[] }) {\n emit(\"column-reorder\", p.order);\n }\n function handleTaskReorder(p: {\n draggedTaskId: string;\n targetTaskId: string;\n position: \"before\" | \"after\" | \"inside\";\n }) {\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\n }\n function handleSelectionChange(p: { taskIds: string[] }) {\n emit(\"selection-change\", p.taskIds);\n }\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\n emit(\"sort-change\", p.sort);\n }\n\n onBeforeUnmount(() => {\n containerRef.value = null;\n });\n\n const handle: GanttChartHandle = {\n undo: () => chart.value?.undo(),\n redo: () => chart.value?.redo(),\n canUndo: () => chart.value?.canUndo ?? false,\n canRedo: () => chart.value?.canRedo ?? false,\n expandAll: () => chart.value?.expandAll(),\n collapseAll: () => chart.value?.collapseAll(),\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\n setViewMode: (mode) => chart.value?.setViewMode(mode),\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\n scrollToToday: () => chart.value?.scrollToToday(),\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\n getPageCount: () => chart.value?.getPageCount() ?? 1,\n setPage: (page) => chart.value?.setPage(page),\n zoomIn: (factor) => chart.value?.zoomIn(factor),\n zoomOut: (factor) => chart.value?.zoomOut(factor),\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\n selectTask: (id, options) => chart.value?.selectTask(id, options),\n selectAllVisible: () => chart.value?.selectAllVisible(),\n clearSelection: () => chart.value?.clearSelection(),\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\n getSort: () => chart.value?.getSort() ?? null,\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\n bulkDelete: () => chart.value?.bulkDelete(),\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\n getInstance: () => chart.value,\n };\n expose(handle);\n\n // A single root element: class/style attrs fall through onto it automatically.\n return () => h(\"div\", { ref: containerRef });\n },\n});\n\nexport default GanttChart;\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n","export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n"],"mappings":"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","names":["onBeforeUnmount","watch","watch","onBeforeUnmount"]}
1
+ {"version":3,"sources":["../src/GanttChart.ts","../src/useGanttChart.ts","../src/index.ts"],"sourcesContent":["// Pulls in the core's default styles so consumers get a working chart out of the box.\r\n// This resolves through gantt-core's package.json \"exports\" map (\"./styles.css\" -> \"./dist/styles.css\").\r\n// If your bundler can't resolve CSS imports from a dependency's export map, import it yourself instead:\r\n// import \"@ganttloom/gantt-core/styles.css\";\r\nimport \"@ganttloom/gantt-core/styles.css\";\r\n\r\nimport {\r\n defineComponent,\r\n getCurrentInstance,\r\n h,\r\n onBeforeUnmount,\r\n ref,\r\n watch,\r\n type ExtractPropTypes,\r\n type PropType,\r\n} from \"vue\";\r\nimport type {\r\n GanttChart as GanttCore,\r\n GanttColumn,\r\n GanttDependency,\r\n GanttMarker,\r\n GanttOptions,\r\n GanttRenderModel,\r\n GanttTask,\r\n GanttTheme,\r\n ResourceHistogramOptions,\r\n ResourceLoadBucket,\r\n ResourceLevelingOptions,\r\n ResourceLevelingResult,\r\n ViewMode,\r\n WorkingCalendar,\r\n} from \"@ganttloom/gantt-core\";\r\nimport { useGanttChart } from \"./useGanttChart\";\r\n\r\n/** Imperative escape hatches, available via a template ref (see the package README). */\r\nexport interface GanttChartHandle {\r\n /** Reverts the most recent move/resize/link/progress/create action. No-op unless `enable-history` is set. */\r\n undo(): void;\r\n /** Re-applies the most recently undone action. No-op unless `enable-history` is set. */\r\n redo(): void;\r\n /** Whether `undo()` currently has anything to revert. */\r\n canUndo(): boolean;\r\n /** Whether `redo()` currently has anything to re-apply. */\r\n canRedo(): boolean;\r\n /** Expands every collapsed group row. */\r\n expandAll(): void;\r\n /** Collapses every group row that has children. */\r\n collapseAll(): void;\r\n /** Toggles a single group row's collapsed state. */\r\n toggleGroup(taskId: string): void;\r\n /** Removes a dependency link between two tasks, if it exists. */\r\n removeDependency(fromId: string, toId: string): void;\r\n /** Patches an existing dependency link's fields (e.g. its `type` or `lagMs`). */\r\n updateDependency(fromId: string, toId: string, partial: Partial<GanttDependency>): void;\r\n /** Patches a task's fields in place (e.g. dates, progress, name) and re-renders. */\r\n updateTask(id: string, partial: Partial<GanttTask>): void;\r\n /** Switches the timeline's zoom level (hour/day/week/month/quarter/year). */\r\n setViewMode(mode: ViewMode): void;\r\n /** Grows `column-width` (never shrinks) so the timeline exactly fills the given container width. */\r\n fitToViewport(containerWidthPx: number): void;\r\n /** Scrolls the timeline so today's date is centered in the viewport. */\r\n scrollToToday(): void;\r\n /** Scrolls the timeline to the very start of the task date range. */\r\n scrollToRangeStart(): void;\r\n /** Scrolls the timeline to the very end of the task date range. */\r\n scrollToRangeEnd(): void;\r\n /** Total number of pages, when `pagination` is set (always `1` otherwise). */\r\n getPageCount(): number;\r\n /** Jumps to a 1-indexed page of top-level rows, when `pagination` is set. */\r\n setPage(page: number): void;\r\n /** Multiplies `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */\r\n zoomIn(factor?: number): void;\r\n /** Divides `column-width` by `factor` (default `1.25`), clamped to a sane zoom range. */\r\n zoomOut(factor?: number): void;\r\n /** Current `column-width` in px per smallest time unit. */\r\n getZoomLevel(): number;\r\n /** Per-assignee workload buckets, for spotting over-allocation. */\r\n getResourceHistogram(options?: ResourceHistogramOptions): ResourceLoadBucket[];\r\n /** Computes a conflict-free schedule by delaying double-booked assignees' tasks; does not mutate the chart's own tasks. */\r\n getLeveledTasks(options?: ResourceLevelingOptions): ResourceLevelingResult;\r\n /** Selects one task bar; pass `{ additive: true }` to add to the existing selection instead of replacing it. Requires `selectable`. */\r\n selectTask(id: string, options?: { additive?: boolean }): void;\r\n /** Selects every currently-visible task bar. Requires `selectable`. */\r\n selectAllVisible(): void;\r\n /** Clears the current bar selection. */\r\n clearSelection(): void;\r\n /** IDs of the currently-selected task bars. */\r\n getSelectedTaskIds(): string[];\r\n /** Sorts sibling rows at every tree level by a column's value; `direction` omitted/`null` clears sorting. */\r\n setSort(columnId: string | null, direction?: \"asc\" | \"desc\" | null): void;\r\n /** The current sort state, or `null` if unsorted. */\r\n getSort(): { columnId: string; direction: \"asc\" | \"desc\" } | null;\r\n /** Shifts every selected task's start/end by `deltaMs`. Requires `selectable`. */\r\n bulkShiftDates(deltaMs: number): void;\r\n /** Deletes every currently-selected task. Requires `selectable`. */\r\n bulkDelete(): void;\r\n /** Serializes the current chart to a standalone SVG string. */\r\n toSVGString(): string;\r\n /** Renders the current chart to a single PNG data URL. */\r\n toPNGDataURL(): Promise<string>;\r\n /** Renders the current chart to one PNG data URL per page, tiled to the given page pixel size. */\r\n toPNGDataURLs(options?: { pageWidthPx?: number; pageHeightPx?: number }): Promise<string[]>;\r\n /** The current computed render model (rows/bars/links/ticks), or `null` before first render. */\r\n getRenderModel(): GanttRenderModel | null;\r\n /** Direct access to the underlying framework-agnostic core instance (null before mount). */\r\n getInstance(): GanttCore | null;\r\n}\r\n\r\nconst EMPTY_RENDER_MODEL: GanttRenderModel = {\r\n width: 0,\r\n height: 0,\r\n rowHeight: 0,\r\n headerHeight: 0,\r\n rows: [],\r\n bars: [],\r\n links: [],\r\n ticks: [],\r\n columns: [],\r\n theme: {} as GanttTheme,\r\n markers: [],\r\n rangeStart: new Date(0),\r\n sort: null,\r\n};\r\n\r\n/**\r\n * Checks whether the parent actually bound a listener for `eventName` (e.g. \"onTaskCreate\")\r\n * on this component's *initial* vnode. A handful of gantt-core options only wire up their\r\n * DOM interaction (drag-to-create, column resize/reorder, dependency double-click, context\r\n * menu) when the corresponding callback is truthy AT CONSTRUCTION TIME — so a stable no-op\r\n * is passed there to force the wiring on, and the real dispatch goes through the reactive\r\n * \"task-create\" etc. event subscription below instead. Reading `vnode.props` (rather than a\r\n * declared prop/emit) is what lets this stay accurate for both `@task-create=\"...\"` template\r\n * listeners and a plain `onTaskCreate` prop, without needing the caller to pass anything else.\r\n */\r\nfunction hasInitialListener(eventName: string): boolean {\r\n const instance = getCurrentInstance();\r\n return !!(instance?.vnode.props && eventName in instance.vnode.props);\r\n}\r\n\r\nconst ganttChartProps = {\r\n tasks: { type: Array as PropType<GanttTask[]>, required: true },\r\n dependencies: { type: Array as PropType<GanttDependency[]>, default: () => [] },\r\n viewMode: { type: String as PropType<ViewMode>, default: undefined },\r\n columns: { type: Array as PropType<GanttColumn[]>, default: undefined },\r\n theme: { type: Object as PropType<Partial<GanttTheme>>, default: undefined },\r\n colorScheme: { type: String as PropType<\"light\" | \"dark\" | \"auto\">, default: undefined },\r\n columnWidth: { type: Number, default: undefined },\r\n readonly: { type: Boolean, default: undefined },\r\n showProgress: { type: Boolean, default: undefined },\r\n showDependencies: { type: Boolean, default: undefined },\r\n gridPanelWidth: { type: Number, default: undefined },\r\n showCriticalPath: { type: Boolean, default: undefined },\r\n showBaseline: { type: Boolean, default: undefined },\r\n showDeadlines: { type: Boolean, default: undefined },\r\n /** Positions the grid and timeline headers. Default is \"top\". */\r\n headerPosition: { type: String as PropType<\"top\" | \"bottom\" | \"none\">, default: undefined },\r\n /** hover tooltip on task bars, defaults to true. A floating, CSS-customizable element (`.gantt-tooltip`) - not the browser's native title tooltip. */\r\n showTooltip: { type: Boolean, default: undefined },\r\n /** fully control tooltip content/markup; return null/undefined to suppress it for a specific task. Defaults to name/dates/progress/assignees/notes. */\r\n renderTooltip: {\r\n type: Function as PropType<(task: GanttTask) => HTMLElement | string | null | undefined>,\r\n default: undefined,\r\n },\r\n showAssigneeAvatars: { type: Boolean, default: undefined },\r\n enableHistory: { type: Boolean, default: undefined },\r\n keyboardAccessible: { type: Boolean, default: undefined },\r\n virtualScroll: { type: Boolean, default: undefined },\r\n autoSchedule: { type: Boolean, default: undefined },\r\n pagination: { type: Object as PropType<{ pageSize: number; page: number }>, default: undefined },\r\n snapToUnit: { type: [String, Boolean] as PropType<\"hour\" | \"day\" | \"week\" | false>, default: undefined },\r\n /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */\r\n calendar: { type: Object as PropType<WorkingCalendar>, default: undefined },\r\n /** arbitrary labeled vertical lines on the timeline, independent of any task */\r\n markers: { type: Array as PropType<GanttMarker[]>, default: undefined },\r\n /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */\r\n autoRollupProgress: { type: Boolean, default: undefined },\r\n /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */\r\n selectable: { type: Boolean, default: undefined },\r\n /**\r\n * Stretch (never shrink) the timeline to fill the container's width instead of leaving empty\r\n * space - the common \"short project at month/year zoom\" or \"just a few tasks\" case. Off by\r\n * default (a new chart's pixel layout shouldn't change for existing consumers who don't opt in).\r\n */\r\n autoFitToViewport: { type: Boolean, default: undefined },\r\n} as const;\r\n\r\nexport type GanttChartProps = ExtractPropTypes<typeof ganttChartProps>;\r\n\r\nconst ganttChartEmits = {\r\n \"date-change\": (_task: GanttTask, _start: Date, _end: Date) => true,\r\n \"progress-change\": (_task: GanttTask, _progress: number) => true,\r\n \"dependency-create\": (_dep: GanttDependency) => true,\r\n \"dependency-remove\": (_dep: GanttDependency) => true,\r\n \"dependency-dblclick\": (_dep: GanttDependency) => true,\r\n \"task-click\": (_task: GanttTask) => true,\r\n \"task-dblclick\": (_task: GanttTask) => true,\r\n \"group-toggle\": (_task: GanttTask, _collapsed: boolean) => true,\r\n \"context-menu\": (_task: GanttTask, _evt: PointerEvent) => true,\r\n \"task-create\": (_task: GanttTask) => true,\r\n \"column-resize\": (_columnId: string, _width: number) => true,\r\n \"column-reorder\": (_order: string[]) => true,\r\n \"task-reorder\": (\r\n _draggedTaskId: string,\r\n _targetTaskId: string,\r\n _position: \"before\" | \"after\" | \"inside\"\r\n ) => true,\r\n \"selection-change\": (_taskIds: string[]) => true,\r\n \"sort-change\": (_sort: { columnId: string; direction: \"asc\" | \"desc\" } | null) => true,\r\n};\r\n\r\nexport const GanttChart = defineComponent({\r\n name: \"GanttChart\",\r\n props: ganttChartProps,\r\n emits: ganttChartEmits,\r\n setup(props, { emit, expose }) {\r\n const containerRef = ref<HTMLElement | null>(null);\r\n const noop = () => {};\r\n\r\n // See hasInitialListener's doc comment: these six only affect whether gantt-core wires\r\n // up the relevant DOM interaction at construction, and are captured once, up front.\r\n // onContextMenu is deliberately always wired (unlike the other six) so right-click\r\n // handling works out of the box even for consumers who haven't attached a listener.\r\n const wireTaskCreate = hasInitialListener(\"onTaskCreate\");\r\n const wireColumnResize = hasInitialListener(\"onColumnResize\");\r\n const wireColumnReorder = hasInitialListener(\"onColumnReorder\");\r\n const wireTaskReorder = hasInitialListener(\"onTaskReorder\");\r\n const wireDependencyDblClick = hasInitialListener(\"onDependencyDblClick\");\r\n const wireTaskDblClick = hasInitialListener(\"onTaskDblClick\");\r\n\r\n // gantt-core invokes every one of these seven callbacks from a call site that ALSO\r\n // unconditionally emits the matching public event (\"date-change\", \"selection-change\", ...).\r\n // So none of them belong in `options` below — doing that would fire the Vue listener\r\n // twice per event, once here and once through the chart.on(...) subscription further down.\r\n // options only ever needs: (a) the six gate-a-DOM-feature callbacks, as stable no-ops/undefined\r\n // purely to control wiring, and (b) everything else, which is plain reactive config.\r\n const getOptions = (): GanttOptions => ({\r\n viewMode: props.viewMode,\r\n columns: props.columns,\r\n theme: props.theme,\r\n colorScheme: props.colorScheme,\r\n columnWidth: props.columnWidth,\r\n readonly: props.readonly,\r\n showProgress: props.showProgress,\r\n showDependencies: props.showDependencies,\r\n gridPanelWidth: props.gridPanelWidth,\r\n showCriticalPath: props.showCriticalPath,\r\n showBaseline: props.showBaseline,\r\n showDeadlines: props.showDeadlines,\r\n headerPosition: props.headerPosition,\r\n showTooltip: props.showTooltip,\r\n renderTooltip: props.renderTooltip,\r\n showAssigneeAvatars: props.showAssigneeAvatars,\r\n enableHistory: props.enableHistory,\r\n keyboardAccessible: props.keyboardAccessible,\r\n virtualScroll: props.virtualScroll,\r\n autoSchedule: props.autoSchedule,\r\n pagination: props.pagination,\r\n snapToUnit: props.snapToUnit,\r\n calendar: props.calendar,\r\n markers: props.markers,\r\n autoRollupProgress: props.autoRollupProgress,\r\n selectable: props.selectable,\r\n autoFitToViewport: props.autoFitToViewport,\r\n onContextMenu: noop,\r\n onTaskCreate: wireTaskCreate ? noop : undefined,\r\n onColumnResize: wireColumnResize ? noop : undefined,\r\n onColumnReorder: wireColumnReorder ? noop : undefined,\r\n onTaskReorder: wireTaskReorder ? noop : undefined,\r\n onDependencyDblClick: wireDependencyDblClick ? noop : undefined,\r\n onTaskDblClick: wireTaskDblClick ? noop : undefined,\r\n });\r\n\r\n const { chart } = useGanttChart(\r\n containerRef,\r\n () => props.tasks,\r\n () => props.dependencies,\r\n getOptions\r\n );\r\n\r\n // useGanttChart already watches getOptions and calls setOptions on change -\r\n // no need to duplicate that here.\r\n\r\n // All real event dispatch goes through the chart's public emitter — set up once when the\r\n // instance appears. `emit` is stable for the component's lifetime, so (unlike the React\r\n // wrapper's ref-of-latest-callback dance) there's no need to guard against re-subscribing.\r\n watch(chart, (instance, _prev, onCleanup) => {\r\n if (!instance) return;\r\n instance.on(\"date-change\", handleDateChange);\r\n instance.on(\"progress-change\", handleProgressChange);\r\n instance.on(\"dependency-create\", handleDependencyCreate);\r\n instance.on(\"dependency-remove\", handleDependencyRemove);\r\n instance.on(\"dependency-dblclick\", handleDependencyDblClick);\r\n instance.on(\"task-click\", handleTaskClick);\r\n instance.on(\"task-dblclick\", handleTaskDblClick);\r\n instance.on(\"group-toggle\", handleGroupToggle);\r\n instance.on(\"context-menu\", handleContextMenu);\r\n instance.on(\"task-create\", handleTaskCreate);\r\n instance.on(\"column-resize\", handleColumnResize);\r\n instance.on(\"column-reorder\", handleColumnReorder);\r\n instance.on(\"task-reorder\", handleTaskReorder);\r\n instance.on(\"selection-change\", handleSelectionChange);\r\n instance.on(\"sort-change\", handleSortChange);\r\n onCleanup(() => {\r\n instance.off(\"date-change\", handleDateChange);\r\n instance.off(\"progress-change\", handleProgressChange);\r\n instance.off(\"dependency-create\", handleDependencyCreate);\r\n instance.off(\"dependency-remove\", handleDependencyRemove);\r\n instance.off(\"dependency-dblclick\", handleDependencyDblClick);\r\n instance.off(\"task-click\", handleTaskClick);\r\n instance.off(\"task-dblclick\", handleTaskDblClick);\r\n instance.off(\"group-toggle\", handleGroupToggle);\r\n instance.off(\"context-menu\", handleContextMenu);\r\n instance.off(\"task-create\", handleTaskCreate);\r\n instance.off(\"column-resize\", handleColumnResize);\r\n instance.off(\"column-reorder\", handleColumnReorder);\r\n instance.off(\"task-reorder\", handleTaskReorder);\r\n instance.off(\"selection-change\", handleSelectionChange);\r\n instance.off(\"sort-change\", handleSortChange);\r\n });\r\n }, { flush: \"sync\" }); // synchronous: chart.value is set inside useGanttChart's onMounted,\r\n // and listeners must be attached before that same tick's synchronous code (e.g. a ref call\r\n // right after mount) can trigger an event — Vue's default 'pre' flush would run this a tick late.\r\n\r\n function handleDateChange(p: { task: GanttTask; start: Date; end: Date }) {\r\n emit(\"date-change\", p.task, p.start, p.end);\r\n }\r\n function handleProgressChange(p: { task: GanttTask; progress: number }) {\r\n emit(\"progress-change\", p.task, p.progress);\r\n }\r\n function handleDependencyCreate(dep: GanttDependency) {\r\n emit(\"dependency-create\", dep);\r\n }\r\n function handleDependencyRemove(dep: GanttDependency) {\r\n emit(\"dependency-remove\", dep);\r\n }\r\n function handleDependencyDblClick(dep: GanttDependency) {\r\n emit(\"dependency-dblclick\", dep);\r\n }\r\n function handleTaskClick(p: { task: GanttTask }) {\r\n emit(\"task-click\", p.task);\r\n }\r\n function handleTaskDblClick(p: { task: GanttTask }) {\r\n emit(\"task-dblclick\", p.task);\r\n }\r\n function handleGroupToggle(p: { task: GanttTask; collapsed: boolean }) {\r\n emit(\"group-toggle\", p.task, p.collapsed);\r\n }\r\n function handleContextMenu(p: { task: GanttTask; evt: PointerEvent }) {\r\n emit(\"context-menu\", p.task, p.evt);\r\n }\r\n function handleTaskCreate(p: { task: GanttTask }) {\r\n emit(\"task-create\", p.task);\r\n }\r\n function handleColumnResize(p: { columnId: string; width: number }) {\r\n emit(\"column-resize\", p.columnId, p.width);\r\n }\r\n function handleColumnReorder(p: { order: string[] }) {\r\n emit(\"column-reorder\", p.order);\r\n }\r\n function handleTaskReorder(p: {\r\n draggedTaskId: string;\r\n targetTaskId: string;\r\n position: \"before\" | \"after\" | \"inside\";\r\n }) {\r\n emit(\"task-reorder\", p.draggedTaskId, p.targetTaskId, p.position);\r\n }\r\n function handleSelectionChange(p: { taskIds: string[] }) {\r\n emit(\"selection-change\", p.taskIds);\r\n }\r\n function handleSortChange(p: { sort: { columnId: string; direction: \"asc\" | \"desc\" } | null }) {\r\n emit(\"sort-change\", p.sort);\r\n }\r\n\r\n onBeforeUnmount(() => {\r\n containerRef.value = null;\r\n });\r\n\r\n const handle: GanttChartHandle = {\r\n undo: () => chart.value?.undo(),\r\n redo: () => chart.value?.redo(),\r\n canUndo: () => chart.value?.canUndo ?? false,\r\n canRedo: () => chart.value?.canRedo ?? false,\r\n expandAll: () => chart.value?.expandAll(),\r\n collapseAll: () => chart.value?.collapseAll(),\r\n toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),\r\n removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),\r\n updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),\r\n updateTask: (id, partial) => chart.value?.updateTask(id, partial),\r\n setViewMode: (mode) => chart.value?.setViewMode(mode),\r\n fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),\r\n scrollToToday: () => chart.value?.scrollToToday(),\r\n scrollToRangeStart: () => chart.value?.scrollToRangeStart(),\r\n scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),\r\n getPageCount: () => chart.value?.getPageCount() ?? 1,\r\n setPage: (page) => chart.value?.setPage(page),\r\n zoomIn: (factor) => chart.value?.zoomIn(factor),\r\n zoomOut: (factor) => chart.value?.zoomOut(factor),\r\n getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,\r\n getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],\r\n getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },\r\n selectTask: (id, options) => chart.value?.selectTask(id, options),\r\n selectAllVisible: () => chart.value?.selectAllVisible(),\r\n clearSelection: () => chart.value?.clearSelection(),\r\n getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],\r\n setSort: (columnId, direction) => chart.value?.setSort(columnId, direction),\r\n getSort: () => chart.value?.getSort() ?? null,\r\n bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),\r\n bulkDelete: () => chart.value?.bulkDelete(),\r\n toSVGString: () => chart.value?.toSVGString() ?? \"\",\r\n toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(\"\"),\r\n toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),\r\n getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,\r\n getInstance: () => chart.value,\r\n };\r\n expose(handle);\r\n\r\n // A single root element: class/style attrs fall through onto it automatically.\r\n return () => h(\"div\", { ref: containerRef });\r\n },\r\n});\r\n\r\nexport default GanttChart;\r\n","import { onBeforeUnmount, onMounted, shallowRef, watch, type Ref, type ShallowRef } from \"vue\";\nimport { GanttChart as GanttCore } from \"@ganttloom/gantt-core\";\nimport type { GanttDependency, GanttOptions, GanttTask } from \"@ganttloom/gantt-core\";\n\nexport interface UseGanttChartResult {\n /** The underlying framework-agnostic GanttChart instance, or null before the mount effect runs. */\n chart: ShallowRef<GanttCore | null>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canUndo: Ref<boolean>;\n /** Reactive, subscribed to the core's \"history-change\" event. Only meaningful when `enableHistory` is set in options. */\n canRedo: Ref<boolean>;\n}\n\n/**\n * Lower-level escape hatch for consumers who want to own their own container element\n * and DOM tree instead of using the <GanttChart /> component. Constructs a\n * @ganttloom/gantt-core GanttChart instance against `containerRef.value` on mount,\n * keeps it in sync with the tasks/dependencies/options getters via setTasks / setDependencies /\n * setOptions (reference-equality checks only — return a new array/object to trigger a sync),\n * and destroys it on unmount.\n *\n * `getTasks`/`getDependencies`/`getOptions` are plain functions (not refs) so this composable\n * can track whatever reactive source each one reads — a prop, a ref, a computed — without\n * imposing a shape on the caller.\n */\nexport function useGanttChart(\n containerRef: Ref<HTMLElement | null>,\n getTasks: () => GanttTask[],\n getDependencies: () => GanttDependency[],\n getOptions: () => GanttOptions\n): UseGanttChartResult {\n const chart = shallowRef<GanttCore | null>(null);\n const canUndo = shallowRef(false);\n const canRedo = shallowRef(false);\n\n let onHistoryChange: ((state: { canUndo: boolean; canRedo: boolean }) => void) | undefined;\n\n onMounted(() => {\n const container = containerRef.value;\n if (!container) return;\n\n const instance = new GanttCore(container, getTasks(), getDependencies(), getOptions());\n chart.value = instance;\n canUndo.value = instance.canUndo;\n canRedo.value = instance.canRedo;\n\n onHistoryChange = (state) => {\n canUndo.value = state.canUndo;\n canRedo.value = state.canRedo;\n };\n instance.on(\"history-change\", onHistoryChange);\n });\n\n onBeforeUnmount(() => {\n const instance = chart.value;\n if (!instance) return;\n if (onHistoryChange) instance.off(\"history-change\", onHistoryChange);\n instance.destroy();\n chart.value = null;\n canUndo.value = false;\n canRedo.value = false;\n });\n\n // Non-immediate: the initial values were already passed to the constructor above,\n // so these only need to fire on subsequent changes.\n watch(getTasks, (tasks) => chart.value?.setTasks(tasks));\n watch(getDependencies, (deps) => chart.value?.setDependencies(deps));\n watch(getOptions, (options) => chart.value?.setOptions(options));\n\n return { chart, canUndo, canRedo };\n}\n","export { GanttChart, default } from \"./GanttChart\";\nexport type { GanttChartProps, GanttChartHandle } from \"./GanttChart\";\n\nexport { useGanttChart } from \"./useGanttChart\";\nexport type { UseGanttChartResult } from \"./useGanttChart\";\n\n// Re-exported so consumers never need to add @ganttloom/gantt-core as a direct\n// dependency just to reference its types.\nexport type {\n ViewMode,\n DependencyType,\n GanttDependency,\n GanttAssignee,\n GanttTask,\n GanttColumn,\n GanttTheme,\n GanttRenderRow,\n GanttRenderBar,\n GanttRenderLink,\n GanttRenderTick,\n GanttRenderModel,\n GanttOptions,\n GanttEventMap,\n WorkingCalendar,\n ConstraintType,\n ResourceHistogramOptions,\n ResourceLoadBucket,\n GanttMarker,\n GanttRenderMarker,\n FilterTasksOptions,\n FilterTasksResult,\n Density,\n ResourceLevelingOptions,\n ResourceLevelingResult,\n} from \"@ganttloom/gantt-core\";\n\nexport {\n computeWBSCodes,\n applyConstraint,\n isWorkingDay,\n isHoliday,\n isWithinWorkingHours,\n isWorkingTime,\n nextWorkingDay,\n previousWorkingDay,\n shiftToWorkingDay,\n shiftToWorkingTime,\n computeResourceHistogram,\n renderResourceHistogramSVG,\n filterTasks,\n colorByField,\n applyColorByField,\n DEFAULT_PALETTE,\n DENSITY_PRESETS,\n levelResources,\n} from \"@ganttloom/gantt-core\";\n"],"mappings":";AAIA,OAAO;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAAA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,OAGK;;;ACfP,SAAS,iBAAiB,WAAW,YAAY,aAAwC;AACzF,SAAS,cAAc,iBAAiB;AAwBjC,SAAS,cACd,cACA,UACA,iBACA,YACqB;AACrB,QAAM,QAAQ,WAA6B,IAAI;AAC/C,QAAM,UAAU,WAAW,KAAK;AAChC,QAAM,UAAU,WAAW,KAAK;AAEhC,MAAI;AAEJ,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,UAAM,WAAW,IAAI,UAAU,WAAW,SAAS,GAAG,gBAAgB,GAAG,WAAW,CAAC;AACrF,UAAM,QAAQ;AACd,YAAQ,QAAQ,SAAS;AACzB,YAAQ,QAAQ,SAAS;AAEzB,sBAAkB,CAAC,UAAU;AAC3B,cAAQ,QAAQ,MAAM;AACtB,cAAQ,QAAQ,MAAM;AAAA,IACxB;AACA,aAAS,GAAG,kBAAkB,eAAe;AAAA,EAC/C,CAAC;AAED,kBAAgB,MAAM;AACpB,UAAM,WAAW,MAAM;AACvB,QAAI,CAAC,SAAU;AACf,QAAI,gBAAiB,UAAS,IAAI,kBAAkB,eAAe;AACnE,aAAS,QAAQ;AACjB,UAAM,QAAQ;AACd,YAAQ,QAAQ;AAChB,YAAQ,QAAQ;AAAA,EAClB,CAAC;AAID,QAAM,UAAU,CAAC,UAAU,MAAM,OAAO,SAAS,KAAK,CAAC;AACvD,QAAM,iBAAiB,CAAC,SAAS,MAAM,OAAO,gBAAgB,IAAI,CAAC;AACnE,QAAM,YAAY,CAAC,YAAY,MAAM,OAAO,WAAW,OAAO,CAAC;AAE/D,SAAO,EAAE,OAAO,SAAS,QAAQ;AACnC;;;ADsCA,IAAM,qBAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM,CAAC;AAAA,EACP,MAAM,CAAC;AAAA,EACP,OAAO,CAAC;AAAA,EACR,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AAAA,EACV,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AAAA,EACV,YAAY,oBAAI,KAAK,CAAC;AAAA,EACtB,MAAM;AACR;AAYA,SAAS,mBAAmB,WAA4B;AACtD,QAAM,WAAW,mBAAmB;AACpC,SAAO,CAAC,EAAE,UAAU,MAAM,SAAS,aAAa,SAAS,MAAM;AACjE;AAEA,IAAM,kBAAkB;AAAA,EACtB,OAAO,EAAE,MAAM,OAAgC,UAAU,KAAK;AAAA,EAC9D,cAAc,EAAE,MAAM,OAAsC,SAAS,MAAM,CAAC,EAAE;AAAA,EAC9E,UAAU,EAAE,MAAM,QAA8B,SAAS,OAAU;AAAA,EACnE,SAAS,EAAE,MAAM,OAAkC,SAAS,OAAU;AAAA,EACtE,OAAO,EAAE,MAAM,QAAyC,SAAS,OAAU;AAAA,EAC3E,aAAa,EAAE,MAAM,QAA+C,SAAS,OAAU;AAAA,EACvF,aAAa,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,EAChD,UAAU,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAC9C,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,kBAAkB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACtD,gBAAgB,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,EACnD,kBAAkB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACtD,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAEnD,gBAAgB,EAAE,MAAM,QAA+C,SAAS,OAAU;AAAA;AAAA,EAE1F,aAAa,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAEjD,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,qBAAqB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACzD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACnD,oBAAoB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACxD,eAAe,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EACnD,cAAc,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA,EAClD,YAAY,EAAE,MAAM,QAAwD,SAAS,OAAU;AAAA,EAC/F,YAAY,EAAE,MAAM,CAAC,QAAQ,OAAO,GAAgD,SAAS,OAAU;AAAA;AAAA,EAEvG,UAAU,EAAE,MAAM,QAAqC,SAAS,OAAU;AAAA;AAAA,EAE1E,SAAS,EAAE,MAAM,OAAkC,SAAS,OAAU;AAAA;AAAA,EAEtE,oBAAoB,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA,EAExD,YAAY,EAAE,MAAM,SAAS,SAAS,OAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,mBAAmB,EAAE,MAAM,SAAS,SAAS,OAAU;AACzD;AAIA,IAAM,kBAAkB;AAAA,EACtB,eAAe,CAAC,OAAkB,QAAc,SAAe;AAAA,EAC/D,mBAAmB,CAAC,OAAkB,cAAsB;AAAA,EAC5D,qBAAqB,CAAC,SAA0B;AAAA,EAChD,qBAAqB,CAAC,SAA0B;AAAA,EAChD,uBAAuB,CAAC,SAA0B;AAAA,EAClD,cAAc,CAAC,UAAqB;AAAA,EACpC,iBAAiB,CAAC,UAAqB;AAAA,EACvC,gBAAgB,CAAC,OAAkB,eAAwB;AAAA,EAC3D,gBAAgB,CAAC,OAAkB,SAAuB;AAAA,EAC1D,eAAe,CAAC,UAAqB;AAAA,EACrC,iBAAiB,CAAC,WAAmB,WAAmB;AAAA,EACxD,kBAAkB,CAAC,WAAqB;AAAA,EACxC,gBAAgB,CACd,gBACA,eACA,cACG;AAAA,EACL,oBAAoB,CAAC,aAAuB;AAAA,EAC5C,eAAe,CAAC,UAAkE;AACpF;AAEO,IAAM,aAAa,gBAAgB;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,MAAM,OAAO,GAAG;AAC7B,UAAM,eAAe,IAAwB,IAAI;AACjD,UAAM,OAAO,MAAM;AAAA,IAAC;AAMpB,UAAM,iBAAiB,mBAAmB,cAAc;AACxD,UAAM,mBAAmB,mBAAmB,gBAAgB;AAC5D,UAAM,oBAAoB,mBAAmB,iBAAiB;AAC9D,UAAM,kBAAkB,mBAAmB,eAAe;AAC1D,UAAM,yBAAyB,mBAAmB,sBAAsB;AACxE,UAAM,mBAAmB,mBAAmB,gBAAgB;AAQ5D,UAAM,aAAa,OAAqB;AAAA,MACtC,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,cAAc,MAAM;AAAA,MACpB,kBAAkB,MAAM;AAAA,MACxB,gBAAgB,MAAM;AAAA,MACtB,kBAAkB,MAAM;AAAA,MACxB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,gBAAgB,MAAM;AAAA,MACtB,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,qBAAqB,MAAM;AAAA,MAC3B,eAAe,MAAM;AAAA,MACrB,oBAAoB,MAAM;AAAA,MAC1B,eAAe,MAAM;AAAA,MACrB,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,oBAAoB,MAAM;AAAA,MAC1B,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB,eAAe;AAAA,MACf,cAAc,iBAAiB,OAAO;AAAA,MACtC,gBAAgB,mBAAmB,OAAO;AAAA,MAC1C,iBAAiB,oBAAoB,OAAO;AAAA,MAC5C,eAAe,kBAAkB,OAAO;AAAA,MACxC,sBAAsB,yBAAyB,OAAO;AAAA,MACtD,gBAAgB,mBAAmB,OAAO;AAAA,IAC5C;AAEA,UAAM,EAAE,MAAM,IAAI;AAAA,MAChB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ;AAAA,IACF;AAQA,IAAAC,OAAM,OAAO,CAAC,UAAU,OAAO,cAAc;AAC3C,UAAI,CAAC,SAAU;AACf,eAAS,GAAG,eAAe,gBAAgB;AAC3C,eAAS,GAAG,mBAAmB,oBAAoB;AACnD,eAAS,GAAG,qBAAqB,sBAAsB;AACvD,eAAS,GAAG,qBAAqB,sBAAsB;AACvD,eAAS,GAAG,uBAAuB,wBAAwB;AAC3D,eAAS,GAAG,cAAc,eAAe;AACzC,eAAS,GAAG,iBAAiB,kBAAkB;AAC/C,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,eAAe,gBAAgB;AAC3C,eAAS,GAAG,iBAAiB,kBAAkB;AAC/C,eAAS,GAAG,kBAAkB,mBAAmB;AACjD,eAAS,GAAG,gBAAgB,iBAAiB;AAC7C,eAAS,GAAG,oBAAoB,qBAAqB;AACrD,eAAS,GAAG,eAAe,gBAAgB;AAC3C,gBAAU,MAAM;AACd,iBAAS,IAAI,eAAe,gBAAgB;AAC5C,iBAAS,IAAI,mBAAmB,oBAAoB;AACpD,iBAAS,IAAI,qBAAqB,sBAAsB;AACxD,iBAAS,IAAI,qBAAqB,sBAAsB;AACxD,iBAAS,IAAI,uBAAuB,wBAAwB;AAC5D,iBAAS,IAAI,cAAc,eAAe;AAC1C,iBAAS,IAAI,iBAAiB,kBAAkB;AAChD,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,eAAe,gBAAgB;AAC5C,iBAAS,IAAI,iBAAiB,kBAAkB;AAChD,iBAAS,IAAI,kBAAkB,mBAAmB;AAClD,iBAAS,IAAI,gBAAgB,iBAAiB;AAC9C,iBAAS,IAAI,oBAAoB,qBAAqB;AACtD,iBAAS,IAAI,eAAe,gBAAgB;AAAA,MAC9C,CAAC;AAAA,IACH,GAAG,EAAE,OAAO,OAAO,CAAC;AAIpB,aAAS,iBAAiB,GAAgD;AACxE,WAAK,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;AAAA,IAC5C;AACA,aAAS,qBAAqB,GAA0C;AACtE,WAAK,mBAAmB,EAAE,MAAM,EAAE,QAAQ;AAAA,IAC5C;AACA,aAAS,uBAAuB,KAAsB;AACpD,WAAK,qBAAqB,GAAG;AAAA,IAC/B;AACA,aAAS,uBAAuB,KAAsB;AACpD,WAAK,qBAAqB,GAAG;AAAA,IAC/B;AACA,aAAS,yBAAyB,KAAsB;AACtD,WAAK,uBAAuB,GAAG;AAAA,IACjC;AACA,aAAS,gBAAgB,GAAwB;AAC/C,WAAK,cAAc,EAAE,IAAI;AAAA,IAC3B;AACA,aAAS,mBAAmB,GAAwB;AAClD,WAAK,iBAAiB,EAAE,IAAI;AAAA,IAC9B;AACA,aAAS,kBAAkB,GAA4C;AACrE,WAAK,gBAAgB,EAAE,MAAM,EAAE,SAAS;AAAA,IAC1C;AACA,aAAS,kBAAkB,GAA2C;AACpE,WAAK,gBAAgB,EAAE,MAAM,EAAE,GAAG;AAAA,IACpC;AACA,aAAS,iBAAiB,GAAwB;AAChD,WAAK,eAAe,EAAE,IAAI;AAAA,IAC5B;AACA,aAAS,mBAAmB,GAAwC;AAClE,WAAK,iBAAiB,EAAE,UAAU,EAAE,KAAK;AAAA,IAC3C;AACA,aAAS,oBAAoB,GAAwB;AACnD,WAAK,kBAAkB,EAAE,KAAK;AAAA,IAChC;AACA,aAAS,kBAAkB,GAIxB;AACD,WAAK,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ;AAAA,IAClE;AACA,aAAS,sBAAsB,GAA0B;AACvD,WAAK,oBAAoB,EAAE,OAAO;AAAA,IACpC;AACA,aAAS,iBAAiB,GAAqE;AAC7F,WAAK,eAAe,EAAE,IAAI;AAAA,IAC5B;AAEA,IAAAC,iBAAgB,MAAM;AACpB,mBAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,SAA2B;AAAA,MAC/B,MAAM,MAAM,MAAM,OAAO,KAAK;AAAA,MAC9B,MAAM,MAAM,MAAM,OAAO,KAAK;AAAA,MAC9B,SAAS,MAAM,MAAM,OAAO,WAAW;AAAA,MACvC,SAAS,MAAM,MAAM,OAAO,WAAW;AAAA,MACvC,WAAW,MAAM,MAAM,OAAO,UAAU;AAAA,MACxC,aAAa,MAAM,MAAM,OAAO,YAAY;AAAA,MAC5C,aAAa,CAAC,WAAW,MAAM,OAAO,YAAY,MAAM;AAAA,MACxD,kBAAkB,CAAC,QAAQ,SAAS,MAAM,OAAO,iBAAiB,QAAQ,IAAI;AAAA,MAC9E,kBAAkB,CAAC,QAAQ,MAAM,YAAY,MAAM,OAAO,iBAAiB,QAAQ,MAAM,OAAO;AAAA,MAChG,YAAY,CAAC,IAAI,YAAY,MAAM,OAAO,WAAW,IAAI,OAAO;AAAA,MAChE,aAAa,CAAC,SAAS,MAAM,OAAO,YAAY,IAAI;AAAA,MACpD,eAAe,CAAC,qBAAqB,MAAM,OAAO,cAAc,gBAAgB;AAAA,MAChF,eAAe,MAAM,MAAM,OAAO,cAAc;AAAA,MAChD,oBAAoB,MAAM,MAAM,OAAO,mBAAmB;AAAA,MAC1D,kBAAkB,MAAM,MAAM,OAAO,iBAAiB;AAAA,MACtD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK;AAAA,MACnD,SAAS,CAAC,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,MAC5C,QAAQ,CAAC,WAAW,MAAM,OAAO,OAAO,MAAM;AAAA,MAC9C,SAAS,CAAC,WAAW,MAAM,OAAO,QAAQ,MAAM;AAAA,MAChD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK;AAAA,MACnD,sBAAsB,CAAC,YAAY,MAAM,OAAO,qBAAqB,OAAO,KAAK,CAAC;AAAA,MAClF,iBAAiB,CAAC,YAAY,MAAM,OAAO,gBAAgB,OAAO,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAChG,YAAY,CAAC,IAAI,YAAY,MAAM,OAAO,WAAW,IAAI,OAAO;AAAA,MAChE,kBAAkB,MAAM,MAAM,OAAO,iBAAiB;AAAA,MACtD,gBAAgB,MAAM,MAAM,OAAO,eAAe;AAAA,MAClD,oBAAoB,MAAM,MAAM,OAAO,mBAAmB,KAAK,CAAC;AAAA,MAChE,SAAS,CAAC,UAAU,cAAc,MAAM,OAAO,QAAQ,UAAU,SAAS;AAAA,MAC1E,SAAS,MAAM,MAAM,OAAO,QAAQ,KAAK;AAAA,MACzC,gBAAgB,CAAC,YAAY,MAAM,OAAO,eAAe,OAAO;AAAA,MAChE,YAAY,MAAM,MAAM,OAAO,WAAW;AAAA,MAC1C,aAAa,MAAM,MAAM,OAAO,YAAY,KAAK;AAAA,MACjD,cAAc,MAAM,MAAM,OAAO,aAAa,KAAK,QAAQ,QAAQ,EAAE;AAAA,MACrE,eAAe,CAAC,YAAY,MAAM,OAAO,cAAc,OAAO,KAAK,QAAQ,QAAQ,CAAC,CAAC;AAAA,MACrF,gBAAgB,MAAM,MAAM,OAAO,eAAe,KAAK;AAAA,MACvD,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,WAAO,MAAM;AAGb,WAAO,MAAM,EAAE,OAAO,EAAE,KAAK,aAAa,CAAC;AAAA,EAC7C;AACF,CAAC;AAED,IAAO,qBAAQ;;;AEjYf;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["onBeforeUnmount","watch","watch","onBeforeUnmount"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ganttloom/gantt-vue",
3
- "version": "0.4.0",
3
+ "version": "0.4.4",
4
4
  "description": "Vue 3 wrapper for @ganttloom/gantt-core — fully customizable Gantt chart component.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -40,7 +40,7 @@
40
40
  "vue": ">=3.3"
41
41
  },
42
42
  "dependencies": {
43
- "@ganttloom/gantt-core": "0.4.0"
43
+ "@ganttloom/gantt-core": "0.4.4"
44
44
  },
45
45
  "devDependencies": {
46
46
  "vue": "^3.5.13",