@ganttloom/gantt-vue 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Santhoshkumar Hariharan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # @ganttloom/gantt-vue
2
+
3
+ [![npm](https://img.shields.io/npm/v/%40ganttloom%2Fgantt-vue)](https://www.npmjs.com/package/@ganttloom/gantt-vue)
4
+ [![license](https://img.shields.io/npm/l/%40ganttloom%2Fgantt-vue)](../../LICENSE)
5
+
6
+ Vue 3 component wrapping [`@ganttloom/gantt-core`](../gantt-core). A thin
7
+ wrapper: it owns no scheduling logic of its own, just Vue lifecycle,
8
+ props-as-events, and an exposed handle for the escape hatches (undo/redo,
9
+ zoom, export) that don't fit the declarative-props model.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install @ganttloom/gantt-vue
15
+ # vue >=3.3 is a peer dependency
16
+ ```
17
+
18
+ ## Quick start
19
+
20
+ ```vue
21
+ <script setup lang="ts">
22
+ import { GanttChart } from "@ganttloom/gantt-vue";
23
+
24
+ const tasks = [
25
+ { id: "1", name: "Design", start: new Date("2026-01-05"), end: new Date("2026-01-09"), progress: 60 },
26
+ { id: "2", name: "Build", start: new Date("2026-01-09"), end: new Date("2026-01-16"), progress: 10 },
27
+ ];
28
+ const dependencies = [{ fromId: "1", toId: "2", type: "FS" as const }];
29
+ </script>
30
+
31
+ <template>
32
+ <GanttChart
33
+ :tasks="tasks"
34
+ :dependencies="dependencies"
35
+ view-mode="day"
36
+ show-critical-path
37
+ enable-history
38
+ @date-change="(task, start, end) => console.log(task.name, start, end)"
39
+ />
40
+ </template>
41
+ ```
42
+
43
+ `<GanttChart />` bundles `@ganttloom/gantt-core`'s default stylesheet
44
+ automatically. Props mirror `@ganttloom/gantt-core`'s `GanttOptions`
45
+ one-to-one (in kebab-case, per Vue convention) — see that package's README
46
+ for what each one does. Pass new array/object references to trigger a sync
47
+ (`setTasks`/`setDependencies`/`setOptions` underneath); mutating in place
48
+ won't re-render.
49
+
50
+ `class`/`style` fall through onto the chart's root element automatically —
51
+ there's no separate prop for them.
52
+
53
+ ## Imperative handle
54
+
55
+ Props/events cover the declarative surface (tasks, dependencies, view
56
+ options, event listeners). For everything else, use a template ref:
57
+
58
+ ```vue
59
+ <script setup lang="ts">
60
+ import { ref } from "vue";
61
+ import { GanttChart, type GanttChartHandle } from "@ganttloom/gantt-vue";
62
+
63
+ const chartRef = ref<GanttChartHandle | null>(null);
64
+ </script>
65
+
66
+ <template>
67
+ <button @click="chartRef?.undo()">Undo</button>
68
+ <button @click="chartRef?.zoomIn()">Zoom in</button>
69
+ <GanttChart ref="chartRef" :tasks="tasks" enable-history />
70
+ </template>
71
+ ```
72
+
73
+ The exposed `GanttChartHandle` has: `undo`/`redo`/`canUndo`/`canRedo`,
74
+ `expandAll`/`collapseAll`/`toggleGroup`, `removeDependency`,
75
+ `updateDependency`, `updateTask`, `setViewMode`,
76
+ `zoomIn`/`zoomOut`/`getZoomLevel`, `fitToViewport`, `scrollToToday`,
77
+ `getPageCount`/`setPage`, `getResourceHistogram`,
78
+ `selectTask`/`clearSelection`/`getSelectedTaskIds`/`bulkShiftDates`/`bulkDelete`,
79
+ `toSVGString`/`toPNGDataURL`, `getRenderModel`, and `getInstance()` for direct
80
+ access to the underlying `@ganttloom/gantt-core` `GanttChart` when you need
81
+ something not on this list.
82
+
83
+ ## Multi-select and bulk actions
84
+
85
+ ```vue
86
+ <GanttChart
87
+ :tasks="tasks"
88
+ selectable
89
+ @selection-change="(taskIds) => (selectedCount = taskIds.length)"
90
+ />
91
+ ```
92
+
93
+ Click selects one bar, ctrl/cmd-click toggles it into the selection,
94
+ shift-click selects a range. Then drive it from the handle:
95
+ `chartRef.value?.bulkShiftDates(dayMs)`, `chartRef.value?.bulkDelete()`.
96
+
97
+ ## Row reorder and dependency editing
98
+
99
+ ```vue
100
+ <GanttChart
101
+ :tasks="tasks"
102
+ @task-reorder="(draggedId, targetId, position) => { /* position: before | after | inside */ }"
103
+ @dependency-dblclick="(dep) => {
104
+ // show your own 'edit link' UI, then:
105
+ chartRef?.updateDependency(dep.fromId, dep.toId, { type: 'SS' });
106
+ }"
107
+ />
108
+ ```
109
+
110
+ Both off by default (same construction-time-only wiring caveat as
111
+ `task-create` below — attach the listener from the first render).
112
+
113
+ ## Drag-to-create
114
+
115
+ Off by default; attach a `@task-create` listener to turn it on (the core
116
+ only wires the drag listener when a creation handler is present, so existing
117
+ consumers see no behavior change):
118
+
119
+ ```vue
120
+ <GanttChart :tasks="tasks" @task-create="(task) => console.log('created', task)" />
121
+ ```
122
+
123
+ > The core only checks for a listener **at mount** (same caveat as the other
124
+ > gated events above) — attach it from the first render if you want
125
+ > drag-to-create enabled; toggling it on after mount won't retroactively wire it.
126
+
127
+ ## Timeline markers, column resize/reorder, and search
128
+
129
+ ```vue
130
+ <script setup lang="ts">
131
+ import { filterTasks } from "@ganttloom/gantt-vue";
132
+ </script>
133
+
134
+ <template>
135
+ <GanttChart
136
+ :tasks="filterTasks(tasks, (t) => t.name.includes(query)).tasks"
137
+ :markers="[{ date: releaseDate, label: 'Release' }]"
138
+ @column-resize="(id, width) => (columnWidths[id] = width)"
139
+ @column-reorder="(order) => (columnOrder = order)"
140
+ />
141
+ </template>
142
+ ```
143
+
144
+ See `@ganttloom/gantt-core`'s README for the full behavior of each — the
145
+ props/events here are 1:1 mirrors of its `GanttOptions` fields, and
146
+ `filterTasks` is a pure re-export.
147
+
148
+ ## Resource leveling and multi-page PNG export
149
+
150
+ ```ts
151
+ const { tasks: leveled, shifted } = chartRef.value!.getLeveledTasks();
152
+ if (shifted.length) tasks.value = leveled; // if you're holding tasks in your own state
153
+
154
+ const pages = await chartRef.value!.toPNGDataURLs({ pageWidthPx: 1600, pageHeightPx: 1200 });
155
+ ```
156
+
157
+ ## Resource histogram
158
+
159
+ ```vue
160
+ <script setup lang="ts">
161
+ import { computed } from "vue";
162
+ import { renderResourceHistogramSVG } from "@ganttloom/gantt-vue";
163
+
164
+ const histogramSvg = computed(() => renderResourceHistogramSVG(chartRef.value?.getResourceHistogram() ?? []));
165
+ </script>
166
+
167
+ <template>
168
+ <div v-html="histogramSvg" />
169
+ </template>
170
+ ```
171
+
172
+ ## `useGanttChart` (lower-level composable)
173
+
174
+ If you want to own the container element/DOM tree yourself instead of using
175
+ `<GanttChart />`:
176
+
177
+ ```vue
178
+ <script setup lang="ts">
179
+ import { ref } from "vue";
180
+ import { useGanttChart } from "@ganttloom/gantt-vue";
181
+
182
+ const props = defineProps<{ tasks: GanttTask[] }>();
183
+ const containerRef = ref<HTMLDivElement | null>(null);
184
+ const { chart, canUndo, canRedo } = useGanttChart(containerRef, () => props.tasks);
185
+ </script>
186
+
187
+ <template>
188
+ <div ref="containerRef" />
189
+ </template>
190
+ ```
191
+
192
+ `useGanttChart` takes getter functions (not refs) for `tasks`/`dependencies`/`options`
193
+ so it can track whatever reactive source each one reads — a prop, a `ref`, a `computed`.
194
+
195
+ ## Re-exported types & helpers
196
+
197
+ For convenience, this package re-exports every `@ganttloom/gantt-core` type
198
+ (`GanttTask`, `GanttDependency`, `GanttColumn`, `GanttTheme`, `ViewMode`,
199
+ `WorkingCalendar`, `ConstraintType`, `ResourceLoadBucket`, etc.) and the
200
+ standalone helper functions (`computeWBSCodes`, `applyConstraint`,
201
+ `isWorkingDay`, `nextWorkingDay`, `computeResourceHistogram`,
202
+ `renderResourceHistogramSVG`, ...) so you never need
203
+ `@ganttloom/gantt-core` as a direct dependency just to reference them.
package/dist/index.cjs ADDED
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DEFAULT_PALETTE: () => import_gantt_core2.DEFAULT_PALETTE,
24
+ DENSITY_PRESETS: () => import_gantt_core2.DENSITY_PRESETS,
25
+ GanttChart: () => GanttChart,
26
+ applyColorByField: () => import_gantt_core2.applyColorByField,
27
+ applyConstraint: () => import_gantt_core2.applyConstraint,
28
+ colorByField: () => import_gantt_core2.colorByField,
29
+ computeResourceHistogram: () => import_gantt_core2.computeResourceHistogram,
30
+ computeWBSCodes: () => import_gantt_core2.computeWBSCodes,
31
+ default: () => GanttChart_default,
32
+ filterTasks: () => import_gantt_core2.filterTasks,
33
+ isHoliday: () => import_gantt_core2.isHoliday,
34
+ isWithinWorkingHours: () => import_gantt_core2.isWithinWorkingHours,
35
+ isWorkingDay: () => import_gantt_core2.isWorkingDay,
36
+ isWorkingTime: () => import_gantt_core2.isWorkingTime,
37
+ levelResources: () => import_gantt_core2.levelResources,
38
+ nextWorkingDay: () => import_gantt_core2.nextWorkingDay,
39
+ previousWorkingDay: () => import_gantt_core2.previousWorkingDay,
40
+ renderResourceHistogramSVG: () => import_gantt_core2.renderResourceHistogramSVG,
41
+ shiftToWorkingDay: () => import_gantt_core2.shiftToWorkingDay,
42
+ shiftToWorkingTime: () => import_gantt_core2.shiftToWorkingTime,
43
+ useGanttChart: () => useGanttChart
44
+ });
45
+ module.exports = __toCommonJS(index_exports);
46
+
47
+ // src/GanttChart.ts
48
+ var import_styles = require("@ganttloom/gantt-core/styles.css");
49
+ var import_vue2 = require("vue");
50
+
51
+ // src/useGanttChart.ts
52
+ var import_vue = require("vue");
53
+ var import_gantt_core = require("@ganttloom/gantt-core");
54
+ function useGanttChart(containerRef, getTasks, getDependencies, getOptions) {
55
+ const chart = (0, import_vue.shallowRef)(null);
56
+ const canUndo = (0, import_vue.shallowRef)(false);
57
+ const canRedo = (0, import_vue.shallowRef)(false);
58
+ let onHistoryChange;
59
+ (0, import_vue.onMounted)(() => {
60
+ const container = containerRef.value;
61
+ if (!container) return;
62
+ const instance = new import_gantt_core.GanttChart(container, getTasks(), getDependencies(), getOptions());
63
+ chart.value = instance;
64
+ canUndo.value = instance.canUndo;
65
+ canRedo.value = instance.canRedo;
66
+ onHistoryChange = (state) => {
67
+ canUndo.value = state.canUndo;
68
+ canRedo.value = state.canRedo;
69
+ };
70
+ instance.on("history-change", onHistoryChange);
71
+ });
72
+ (0, import_vue.onBeforeUnmount)(() => {
73
+ const instance = chart.value;
74
+ if (!instance) return;
75
+ if (onHistoryChange) instance.off("history-change", onHistoryChange);
76
+ instance.destroy();
77
+ chart.value = null;
78
+ canUndo.value = false;
79
+ canRedo.value = false;
80
+ });
81
+ (0, import_vue.watch)(getTasks, (tasks) => chart.value?.setTasks(tasks));
82
+ (0, import_vue.watch)(getDependencies, (deps) => chart.value?.setDependencies(deps));
83
+ (0, import_vue.watch)(getOptions, (options) => chart.value?.setOptions(options));
84
+ return { chart, canUndo, canRedo };
85
+ }
86
+
87
+ // src/GanttChart.ts
88
+ var EMPTY_RENDER_MODEL = {
89
+ width: 0,
90
+ height: 0,
91
+ rowHeight: 0,
92
+ headerHeight: 0,
93
+ rows: [],
94
+ bars: [],
95
+ links: [],
96
+ ticks: [],
97
+ columns: [],
98
+ theme: {},
99
+ markers: [],
100
+ rangeStart: /* @__PURE__ */ new Date(0)
101
+ };
102
+ function hasInitialListener(eventName) {
103
+ const instance = (0, import_vue2.getCurrentInstance)();
104
+ return !!(instance?.vnode.props && eventName in instance.vnode.props);
105
+ }
106
+ var ganttChartProps = {
107
+ tasks: { type: Array, required: true },
108
+ dependencies: { type: Array, default: () => [] },
109
+ viewMode: { type: String, default: void 0 },
110
+ columns: { type: Array, default: void 0 },
111
+ theme: { type: Object, default: void 0 },
112
+ colorScheme: { type: String, default: void 0 },
113
+ columnWidth: { type: Number, default: void 0 },
114
+ readonly: { type: Boolean, default: void 0 },
115
+ showProgress: { type: Boolean, default: void 0 },
116
+ showDependencies: { type: Boolean, default: void 0 },
117
+ gridPanelWidth: { type: Number, default: void 0 },
118
+ showCriticalPath: { type: Boolean, default: void 0 },
119
+ showBaseline: { type: Boolean, default: void 0 },
120
+ showDeadlines: { type: Boolean, default: void 0 },
121
+ showAssigneeAvatars: { type: Boolean, default: void 0 },
122
+ enableHistory: { type: Boolean, default: void 0 },
123
+ keyboardAccessible: { type: Boolean, default: void 0 },
124
+ virtualScroll: { type: Boolean, default: void 0 },
125
+ autoSchedule: { type: Boolean, default: void 0 },
126
+ pagination: { type: Object, default: void 0 },
127
+ snapToUnit: { type: [String, Boolean], default: void 0 },
128
+ /** working-day/holiday definition used to shade non-working time and (with autoSchedule) skip it when cascading */
129
+ calendar: { type: Object, default: void 0 },
130
+ /** arbitrary labeled vertical lines on the timeline, independent of any task */
131
+ markers: { type: Array, default: void 0 },
132
+ /** a group task with no explicit `progress` gets a duration-weighted average of its children's progress instead of 0 */
133
+ autoRollupProgress: { type: Boolean, default: void 0 },
134
+ /** enables click/ctrl-click/shift-click multi-selection of task bars, and the handle's bulkShiftDates()/bulkDelete() */
135
+ selectable: { type: Boolean, default: void 0 }
136
+ };
137
+ var ganttChartEmits = {
138
+ "date-change": (_task, _start, _end) => true,
139
+ "progress-change": (_task, _progress) => true,
140
+ "dependency-create": (_dep) => true,
141
+ "dependency-remove": (_dep) => true,
142
+ "dependency-dblclick": (_dep) => true,
143
+ "task-click": (_task) => true,
144
+ "group-toggle": (_task, _collapsed) => true,
145
+ "context-menu": (_task, _evt) => true,
146
+ "task-create": (_task) => true,
147
+ "column-resize": (_columnId, _width) => true,
148
+ "column-reorder": (_order) => true,
149
+ "task-reorder": (_draggedTaskId, _targetTaskId, _position) => true,
150
+ "selection-change": (_taskIds) => true
151
+ };
152
+ var GanttChart = (0, import_vue2.defineComponent)({
153
+ name: "GanttChart",
154
+ props: ganttChartProps,
155
+ emits: ganttChartEmits,
156
+ setup(props, { emit, expose }) {
157
+ const containerRef = (0, import_vue2.ref)(null);
158
+ const noop = () => {
159
+ };
160
+ const wireTaskCreate = hasInitialListener("onTaskCreate");
161
+ const wireColumnResize = hasInitialListener("onColumnResize");
162
+ const wireColumnReorder = hasInitialListener("onColumnReorder");
163
+ const wireTaskReorder = hasInitialListener("onTaskReorder");
164
+ const wireDependencyDblClick = hasInitialListener("onDependencyDblClick");
165
+ const getOptions = () => ({
166
+ viewMode: props.viewMode,
167
+ columns: props.columns,
168
+ theme: props.theme,
169
+ colorScheme: props.colorScheme,
170
+ columnWidth: props.columnWidth,
171
+ readonly: props.readonly,
172
+ showProgress: props.showProgress,
173
+ showDependencies: props.showDependencies,
174
+ gridPanelWidth: props.gridPanelWidth,
175
+ showCriticalPath: props.showCriticalPath,
176
+ showBaseline: props.showBaseline,
177
+ showDeadlines: props.showDeadlines,
178
+ showAssigneeAvatars: props.showAssigneeAvatars,
179
+ enableHistory: props.enableHistory,
180
+ keyboardAccessible: props.keyboardAccessible,
181
+ virtualScroll: props.virtualScroll,
182
+ autoSchedule: props.autoSchedule,
183
+ pagination: props.pagination,
184
+ snapToUnit: props.snapToUnit,
185
+ calendar: props.calendar,
186
+ markers: props.markers,
187
+ autoRollupProgress: props.autoRollupProgress,
188
+ selectable: props.selectable,
189
+ onContextMenu: noop,
190
+ onTaskCreate: wireTaskCreate ? noop : void 0,
191
+ onColumnResize: wireColumnResize ? noop : void 0,
192
+ onColumnReorder: wireColumnReorder ? noop : void 0,
193
+ onTaskReorder: wireTaskReorder ? noop : void 0,
194
+ onDependencyDblClick: wireDependencyDblClick ? noop : void 0
195
+ });
196
+ const { chart } = useGanttChart(
197
+ containerRef,
198
+ () => props.tasks,
199
+ () => props.dependencies,
200
+ getOptions
201
+ );
202
+ (0, import_vue2.watch)(getOptions, (options) => chart.value?.setOptions(options));
203
+ (0, import_vue2.watch)(chart, (instance, _prev, onCleanup) => {
204
+ if (!instance) return;
205
+ instance.on("date-change", handleDateChange);
206
+ instance.on("progress-change", handleProgressChange);
207
+ instance.on("dependency-create", handleDependencyCreate);
208
+ instance.on("dependency-remove", handleDependencyRemove);
209
+ instance.on("dependency-dblclick", handleDependencyDblClick);
210
+ instance.on("task-click", handleTaskClick);
211
+ instance.on("group-toggle", handleGroupToggle);
212
+ instance.on("context-menu", handleContextMenu);
213
+ instance.on("task-create", handleTaskCreate);
214
+ instance.on("column-resize", handleColumnResize);
215
+ instance.on("column-reorder", handleColumnReorder);
216
+ instance.on("task-reorder", handleTaskReorder);
217
+ instance.on("selection-change", handleSelectionChange);
218
+ onCleanup(() => {
219
+ instance.off("date-change", handleDateChange);
220
+ instance.off("progress-change", handleProgressChange);
221
+ instance.off("dependency-create", handleDependencyCreate);
222
+ instance.off("dependency-remove", handleDependencyRemove);
223
+ instance.off("dependency-dblclick", handleDependencyDblClick);
224
+ instance.off("task-click", handleTaskClick);
225
+ instance.off("group-toggle", handleGroupToggle);
226
+ instance.off("context-menu", handleContextMenu);
227
+ instance.off("task-create", handleTaskCreate);
228
+ instance.off("column-resize", handleColumnResize);
229
+ instance.off("column-reorder", handleColumnReorder);
230
+ instance.off("task-reorder", handleTaskReorder);
231
+ instance.off("selection-change", handleSelectionChange);
232
+ });
233
+ }, { flush: "sync" });
234
+ function handleDateChange(p) {
235
+ emit("date-change", p.task, p.start, p.end);
236
+ }
237
+ function handleProgressChange(p) {
238
+ emit("progress-change", p.task, p.progress);
239
+ }
240
+ function handleDependencyCreate(dep) {
241
+ emit("dependency-create", dep);
242
+ }
243
+ function handleDependencyRemove(dep) {
244
+ emit("dependency-remove", dep);
245
+ }
246
+ function handleDependencyDblClick(dep) {
247
+ emit("dependency-dblclick", dep);
248
+ }
249
+ function handleTaskClick(p) {
250
+ emit("task-click", p.task);
251
+ }
252
+ function handleGroupToggle(p) {
253
+ emit("group-toggle", p.task, p.collapsed);
254
+ }
255
+ function handleContextMenu(p) {
256
+ emit("context-menu", p.task, p.evt);
257
+ }
258
+ function handleTaskCreate(p) {
259
+ emit("task-create", p.task);
260
+ }
261
+ function handleColumnResize(p) {
262
+ emit("column-resize", p.columnId, p.width);
263
+ }
264
+ function handleColumnReorder(p) {
265
+ emit("column-reorder", p.order);
266
+ }
267
+ function handleTaskReorder(p) {
268
+ emit("task-reorder", p.draggedTaskId, p.targetTaskId, p.position);
269
+ }
270
+ function handleSelectionChange(p) {
271
+ emit("selection-change", p.taskIds);
272
+ }
273
+ (0, import_vue2.onBeforeUnmount)(() => {
274
+ containerRef.value = null;
275
+ });
276
+ const handle = {
277
+ undo: () => chart.value?.undo(),
278
+ redo: () => chart.value?.redo(),
279
+ canUndo: () => chart.value?.canUndo ?? false,
280
+ canRedo: () => chart.value?.canRedo ?? false,
281
+ expandAll: () => chart.value?.expandAll(),
282
+ collapseAll: () => chart.value?.collapseAll(),
283
+ toggleGroup: (taskId) => chart.value?.toggleGroup(taskId),
284
+ removeDependency: (fromId, toId) => chart.value?.removeDependency(fromId, toId),
285
+ updateDependency: (fromId, toId, partial) => chart.value?.updateDependency(fromId, toId, partial),
286
+ updateTask: (id, partial) => chart.value?.updateTask(id, partial),
287
+ setViewMode: (mode) => chart.value?.setViewMode(mode),
288
+ fitToViewport: (containerWidthPx) => chart.value?.fitToViewport(containerWidthPx),
289
+ scrollToToday: () => chart.value?.scrollToToday(),
290
+ scrollToRangeStart: () => chart.value?.scrollToRangeStart(),
291
+ scrollToRangeEnd: () => chart.value?.scrollToRangeEnd(),
292
+ getPageCount: () => chart.value?.getPageCount() ?? 1,
293
+ setPage: (page) => chart.value?.setPage(page),
294
+ zoomIn: (factor) => chart.value?.zoomIn(factor),
295
+ zoomOut: (factor) => chart.value?.zoomOut(factor),
296
+ getZoomLevel: () => chart.value?.getZoomLevel() ?? 0,
297
+ getResourceHistogram: (options) => chart.value?.getResourceHistogram(options) ?? [],
298
+ getLeveledTasks: (options) => chart.value?.getLeveledTasks(options) ?? { tasks: [], shifted: [] },
299
+ selectTask: (id, options) => chart.value?.selectTask(id, options),
300
+ selectAllVisible: () => chart.value?.selectAllVisible(),
301
+ clearSelection: () => chart.value?.clearSelection(),
302
+ getSelectedTaskIds: () => chart.value?.getSelectedTaskIds() ?? [],
303
+ bulkShiftDates: (deltaMs) => chart.value?.bulkShiftDates(deltaMs),
304
+ bulkDelete: () => chart.value?.bulkDelete(),
305
+ toSVGString: () => chart.value?.toSVGString() ?? "",
306
+ toPNGDataURL: () => chart.value?.toPNGDataURL() ?? Promise.resolve(""),
307
+ toPNGDataURLs: (options) => chart.value?.toPNGDataURLs(options) ?? Promise.resolve([]),
308
+ getRenderModel: () => chart.value?.getRenderModel() ?? EMPTY_RENDER_MODEL,
309
+ getInstance: () => chart.value
310
+ };
311
+ expose(handle);
312
+ return () => (0, import_vue2.h)("div", { ref: containerRef });
313
+ }
314
+ });
315
+ var GanttChart_default = GanttChart;
316
+
317
+ // src/index.ts
318
+ var import_gantt_core2 = require("@ganttloom/gantt-core");
319
+ // Annotate the CommonJS export names for ESM import in node:
320
+ 0 && (module.exports = {
321
+ DEFAULT_PALETTE,
322
+ DENSITY_PRESETS,
323
+ GanttChart,
324
+ applyColorByField,
325
+ applyConstraint,
326
+ colorByField,
327
+ computeResourceHistogram,
328
+ computeWBSCodes,
329
+ filterTasks,
330
+ isHoliday,
331
+ isWithinWorkingHours,
332
+ isWorkingDay,
333
+ isWorkingTime,
334
+ levelResources,
335
+ nextWorkingDay,
336
+ previousWorkingDay,
337
+ renderResourceHistogramSVG,
338
+ shiftToWorkingDay,
339
+ shiftToWorkingTime,
340
+ useGanttChart
341
+ });
342
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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 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};\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 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} 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 \"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};\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 five 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 five) 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\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 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 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 });\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(\"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 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(\"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 });\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 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\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 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":";;;;;;;;;;;;;;;;;;;;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;;;ADEA,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;AACxB;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,EACnD,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;AAClD;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,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;AAC9C;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;AAQxE,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,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,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,IACxD;AAEA,UAAM,EAAE,MAAM,IAAI;AAAA,MAChB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ;AAAA,IACF;AAIA,2BAAM,YAAY,CAAC,YAAY,MAAM,OAAO,WAAW,OAAO,CAAC;AAK/D,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,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,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,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;AAAA,MACxD,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,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;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,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;;;AD1Tf,IAAAC,qBAmBO;","names":["import_vue","GanttCore","import_gantt_core"]}