@canvas-components/gantt-table 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/domain/date.ts","../src/domain/layout.ts","../src/interaction/hit-test.ts","../src/schema/options.ts","../src/rendering/canvas-renderer.ts","../src/gantt.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const toTimestamp = (value: Date | string | number) => {\n const timestamp = value instanceof Date ? value.getTime() : new Date(value).getTime();\n if (!Number.isFinite(timestamp)) throw new Error(`Invalid date value: ${String(value)}`);\n return timestamp;\n};\n\nexport const dayMs = 24 * 60 * 60 * 1000;\n\nexport function startOfDay(timestamp: number) {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\nexport function formatDate(timestamp: number) {\n return new Intl.DateTimeFormat(\"zh-CN\", { month: \"2-digit\", day: \"2-digit\" }).format(new Date(timestamp));\n}\n","import { dayMs, startOfDay, toTimestamp } from \"./date\";\nimport type { GanttOptions, GanttScale, GanttTask } from \"../schema/options\";\n\nexport interface GanttLayout {\n start: number;\n end: number;\n dayWidth: number;\n rowHeight: number;\n headerHeight: number;\n taskColumnWidth: number;\n rows: Array<{ task: GanttTask; index: number; y: number }>;\n totalWidth: number;\n totalHeight: number;\n}\n\nexport function resolveDayWidth(scale: GanttScale) {\n return scale === \"month\" ? 42 : scale === \"week\" ? 28 : 80;\n}\n\nexport function buildGanttLayout(options: GanttOptions, width: number): GanttLayout {\n const timestamps = options.tasks.flatMap((task) => [toTimestamp(task.start), toTimestamp(task.end)]);\n const start = startOfDay(toTimestamp(options.startDate ?? Math.min(...timestamps, Date.now())));\n const end = startOfDay(toTimestamp(options.endDate ?? Math.max(...timestamps, Date.now()) + dayMs));\n const dayWidth = resolveDayWidth(options.scale ?? \"day\");\n const days = Math.max(1, Math.ceil((end - start) / dayMs));\n const taskColumnWidth = options.taskColumnWidth ?? 220;\n const rows = options.tasks.map((task, index) => ({ task, index, y: (options.headerHeight ?? 56) + index * (options.rowHeight ?? 36) }));\n return { start, end, dayWidth, rowHeight: options.rowHeight ?? 36, headerHeight: options.headerHeight ?? 56, taskColumnWidth, rows, totalWidth: taskColumnWidth + days * dayWidth, totalHeight: (options.headerHeight ?? 56) + options.tasks.length * (options.rowHeight ?? 36) };\n}\n\nexport function xForDate(timestamp: number, layout: GanttLayout) {\n return layout.taskColumnWidth + ((timestamp - layout.start) / dayMs) * layout.dayWidth;\n}\n","import { toTimestamp } from \"../domain/date\";\nimport { xForDate, type GanttLayout } from \"../domain/layout\";\nimport type { GanttTask } from \"../schema/options\";\n\nexport function hitTestTask(x: number, y: number, layout: GanttLayout): GanttTask | null {\n const row = layout.rows.find((item) => y >= item.y && y < item.y + layout.rowHeight);\n if (!row) return null;\n const start = xForDate(toTimestamp(row.task.start), layout); const end = xForDate(toTimestamp(row.task.end), layout);\n return x >= start && x <= end ? row.task : null;\n}\n","/** 甘特图缩放级别。 */\nexport type GanttScale = \"day\" | \"week\" | \"month\";\n\n/** 甘特任务定义。 */\nexport interface GanttTask {\n id: string;\n title: string;\n start: Date | string | number;\n end: Date | string | number;\n progress?: number;\n color?: string;\n parentId?: string;\n collapsed?: boolean;\n}\n\n/** 任务依赖定义。 */\nexport interface GanttDependency {\n from: string;\n to: string;\n type?: \"finish-to-start\" | \"start-to-start\" | \"finish-to-finish\";\n}\n\n/** 甘特图主题。 */\nexport interface GanttTheme {\n backgroundColor: string;\n borderColor: string;\n textColor: string;\n mutedTextColor: string;\n headerBackgroundColor: string;\n weekendBackgroundColor: string;\n gridColor: string;\n taskColor: string;\n taskProgressColor: string;\n milestoneColor: string;\n selectionColor: string;\n fontFamily: string;\n fontSize: number;\n}\n\n/** 甘特图配置。 */\nexport interface GanttOptions {\n tasks: GanttTask[];\n dependencies?: GanttDependency[];\n startDate?: Date | string | number;\n endDate?: Date | string | number;\n scale?: GanttScale;\n rowHeight?: number;\n headerHeight?: number;\n taskColumnWidth?: number;\n theme?: Partial<GanttTheme>;\n onTaskClick?: (task: GanttTask) => void;\n onTaskChange?: (task: GanttTask) => void;\n}\n\nexport const defaultGanttTheme: GanttTheme = {\n backgroundColor: \"#ffffff\",\n borderColor: \"#d9e1ec\",\n textColor: \"#1f2329\",\n mutedTextColor: \"#7a8798\",\n headerBackgroundColor: \"#f5f8fc\",\n weekendBackgroundColor: \"#fafafa\",\n gridColor: \"#e7edf5\",\n taskColor: \"#1677ff\",\n taskProgressColor: \"#0958d9\",\n milestoneColor: \"#722ed1\",\n selectionColor: \"#91caff\",\n fontFamily: '\"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n fontSize: 14,\n};\n","import { formatDate, dayMs, toTimestamp } from \"../domain/date\";\nimport type { GanttLayout } from \"../domain/layout\";\nimport { xForDate } from \"../domain/layout\";\nimport { defaultGanttTheme, type GanttDependency, type GanttTheme } from \"../schema/options\";\n\nexport function renderGantt(context: CanvasRenderingContext2D, layout: GanttLayout, dependencies: GanttDependency[], selectedId: string | null, theme: GanttTheme) {\n context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n context.fillStyle = theme.backgroundColor; context.fillRect(0, 0, context.canvas.width, context.canvas.height);\n context.font = `${theme.fontSize}px ${theme.fontFamily}`; context.textBaseline = \"middle\";\n context.fillStyle = theme.headerBackgroundColor; context.fillRect(0, 0, layout.totalWidth, layout.headerHeight);\n context.strokeStyle = theme.borderColor; context.beginPath(); context.moveTo(layout.taskColumnWidth, 0); context.lineTo(layout.taskColumnWidth, layout.totalHeight); context.stroke();\n for (let t = layout.start, day = 0; t < layout.end; t += dayMs, day++) {\n const x = layout.taskColumnWidth + day * layout.dayWidth;\n const date = new Date(t); const weekend = date.getDay() === 0 || date.getDay() === 6;\n if (weekend) { context.fillStyle = theme.weekendBackgroundColor; context.fillRect(x, layout.headerHeight, layout.dayWidth, layout.totalHeight - layout.headerHeight); }\n context.strokeStyle = theme.gridColor; context.beginPath(); context.moveTo(x, 0); context.lineTo(x, layout.totalHeight); context.stroke();\n context.fillStyle = theme.mutedTextColor; context.fillText(formatDate(t), x + 6, layout.headerHeight / 2);\n }\n context.fillStyle = theme.textColor; context.fillText(\"任务\", 16, layout.headerHeight / 2);\n layout.rows.forEach(({ task, y }) => {\n context.strokeStyle = theme.gridColor; context.beginPath(); context.moveTo(0, y); context.lineTo(layout.totalWidth, y); context.stroke();\n context.fillStyle = theme.textColor; context.fillText(task.title, 16, y + layout.rowHeight / 2);\n const start = toTimestamp(task.start); const end = Math.max(start + dayMs, toTimestamp(task.end));\n const x = xForDate(start, layout); const w = Math.max(8, ((end - start) / dayMs) * layout.dayWidth - 4); const barY = y + 8; const barH = layout.rowHeight - 16;\n context.fillStyle = task.color ?? theme.taskColor; context.beginPath(); context.roundRect(x, barY, w, barH, 4); context.fill();\n if (task.progress) { context.fillStyle = theme.taskProgressColor; context.beginPath(); context.roundRect(x, barY, w * Math.min(100, Math.max(0, task.progress)) / 100, barH, 4); context.fill(); }\n if (selectedId === task.id) { context.strokeStyle = theme.selectionColor; context.lineWidth = 2; context.strokeRect(x - 1, barY - 1, w + 2, barH + 2); context.lineWidth = 1; }\n });\n const rowMap = new Map(layout.rows.map((row) => [row.task.id, row]));\n context.strokeStyle = theme.milestoneColor; context.fillStyle = theme.milestoneColor;\n dependencies.forEach((dependency) => { const from = rowMap.get(dependency.from); const to = rowMap.get(dependency.to); if (!from || !to) return; const fromX = xForDate(toTimestamp(from.task.end), layout); const fromY = from.y + layout.rowHeight / 2; const toX = xForDate(toTimestamp(to.task.start), layout); const toY = to.y + layout.rowHeight / 2; context.beginPath(); context.moveTo(fromX, fromY); context.lineTo((fromX + toX) / 2, fromY); context.lineTo((fromX + toX) / 2, toY); context.lineTo(toX, toY); context.stroke(); context.beginPath(); context.moveTo(toX, toY); context.lineTo(toX - 5, toY - 4); context.lineTo(toX - 5, toY + 4); context.closePath(); context.fill(); });\n}\n","import { buildGanttLayout, type GanttLayout } from \"./domain/layout\";\nimport { hitTestTask } from \"./interaction/hit-test\";\nimport { defaultGanttTheme, type GanttOptions, type GanttTask } from \"./schema/options\";\nimport { renderGantt } from \"./rendering/canvas-renderer\";\n\n/** 原生 Canvas 甘特图实例。 */\nexport class Gantt {\n private readonly container: HTMLElement;\n private readonly canvas: HTMLCanvasElement;\n private readonly context: CanvasRenderingContext2D;\n private options: GanttOptions;\n private layout: GanttLayout | null = null;\n private selectedId: string | null = null;\n private scrollLeft = 0;\n private scrollTop = 0;\n private resizeObserver: ResizeObserver | null = null;\n private drag: { task: GanttTask; startX: number; originalStart: number; originalEnd: number } | null = null;\n\n constructor(container: HTMLElement, options: GanttOptions) {\n const context = document.createElement(\"canvas\").getContext(\"2d\");\n if (!context) throw new Error(\"Canvas 2D context is not supported in the current environment.\");\n this.container = container; this.canvas = context.canvas; this.context = context; this.options = options;\n this.canvas.style.display = \"block\"; this.canvas.style.touchAction = \"none\"; this.container.style.overflow = \"hidden\";\n }\n\n /** 挂载并开始渲染。 */\n mount() {\n if (!this.canvas.parentElement) this.container.appendChild(this.canvas);\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown); this.canvas.addEventListener(\"pointermove\", this.handlePointerMove); this.canvas.addEventListener(\"pointerup\", this.handlePointerUp); this.canvas.addEventListener(\"wheel\", this.handleWheel, { passive: false });\n this.resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => this.render()); this.resizeObserver?.observe(this.container); this.render();\n }\n\n /** 更新配置并重绘。 */\n updateOptions(options: GanttOptions) { this.options = options; this.selectedId = null; this.render(); }\n /** 获取当前选中任务。 */\n getSelectedTask() { return this.options.tasks.find((task) => task.id === this.selectedId) ?? null; }\n /** 销毁实例。 */\n destroy() { this.resizeObserver?.disconnect(); this.resizeObserver = null; this.canvas.remove(); }\n\n private render() {\n const width = this.container.clientWidth || this.options.taskColumnWidth || 800; const height = this.container.clientHeight || 480; const ratio = window.devicePixelRatio || 1;\n this.layout = buildGanttLayout(this.options, width); this.canvas.width = width * ratio; this.canvas.height = height * ratio; this.canvas.style.width = `${width}px`; this.canvas.style.height = `${height}px`; this.context.setTransform(ratio, 0, 0, ratio, -this.scrollLeft * ratio, -this.scrollTop * ratio);\n renderGantt(this.context, this.layout, this.options.dependencies ?? [], this.selectedId, { ...defaultGanttTheme, ...this.options.theme });\n }\n private point(event: PointerEvent) { const rect = this.canvas.getBoundingClientRect(); return { x: event.clientX - rect.left + this.scrollLeft, y: event.clientY - rect.top + this.scrollTop }; }\n private handlePointerDown = (event: PointerEvent) => { if (!this.layout) return; const point = this.point(event); const task = hitTestTask(point.x, point.y, this.layout); if (!task) return; this.selectedId = task.id; this.drag = { task, startX: point.x, originalStart: new Date(task.start).getTime(), originalEnd: new Date(task.end).getTime() }; this.canvas.setPointerCapture(event.pointerId); this.options.onTaskClick?.(task); this.render(); };\n private handlePointerMove = (event: PointerEvent) => { if (!this.drag || !this.layout) return; const delta = Math.round((this.point(event).x - this.drag.startX) / this.layout.dayWidth) * 86400000; this.drag.task.start = new Date(this.drag.originalStart + delta); this.drag.task.end = new Date(this.drag.originalEnd + delta); this.render(); };\n private handlePointerUp = (event: PointerEvent) => { if (!this.drag) return; this.options.onTaskChange?.(this.drag.task); this.drag = null; this.canvas.releasePointerCapture(event.pointerId); };\n private handleWheel = (event: WheelEvent) => { event.preventDefault(); this.scrollLeft = Math.max(0, this.scrollLeft + event.deltaX + (event.shiftKey ? event.deltaY : 0)); this.scrollTop = Math.max(0, this.scrollTop + (event.shiftKey ? 0 : event.deltaY)); this.render(); };\n}\n"]}
1
+ {"version":3,"sources":["../src/domain/scroll.ts","../src/domain/scrollbar.ts","../src/domain/date.ts","../src/domain/task-rows.ts","../src/domain/layout.ts","../src/domain/task-geometry.ts","../src/domain/dependency-geometry.ts","../src/domain/dependency-edit.ts","../src/domain/row-drag.ts","../src/interaction/wheel-scroll.ts","../src/engine/wheel-scroll-controller.ts","../src/engine/event-controller.ts","../src/domain/timeline-headers.ts","../src/rendering/primitives/dependencies.ts","../src/rendering/primitives/dependency-editor.ts","../src/domain/timeline-columns.ts","../src/rendering/primitives/grid.ts","../src/rendering/primitives/scrollbars.ts","../src/domain/task-content.ts","../src/rendering/primitives/task-bars.ts","../src/rendering/canvas-renderer.ts","../src/schema/options.ts","../src/engine/render-service.ts","../src/engine/runtime.ts","../src/gantt.ts","../src/interaction/hit-test.ts"],"names":["timelineViewportWidth","bodyViewportHeight","options","range","date","drawHorizontalLine","drawVerticalLine"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GanttLayout } from \"./layout\";\n\nexport interface GanttScrollState {\n left: number;\n top: number;\n}\n\nexport interface GanttScrollBounds {\n maxLeft: number;\n maxTop: number;\n}\n\nexport interface GanttViewportLayout {\n width: number;\n height: number;\n contentRight: number;\n contentBottom: number;\n timelineViewportWidth: number;\n bodyViewportHeight: number;\n hasHorizontalScrollbar: boolean;\n hasVerticalScrollbar: boolean;\n bounds: GanttScrollBounds;\n}\n\n/** 与 ListTable 默认滚动条厚度保持一致。 */\nexport const GANTT_SCROLLBAR_SIZE = 10;\n\n/** 计算内容视口与占位式滚动条所需空间。 */\nexport function resolveGanttViewportLayout(\n layout: GanttLayout,\n width: number,\n height: number,\n): GanttViewportLayout {\n const timelineContentWidth = Math.max(\n layout.totalWidth - layout.taskColumnWidth,\n 0,\n );\n const bodyContentHeight = Math.max(\n layout.totalHeight - layout.headerHeight,\n 0,\n );\n let hasHorizontalScrollbar =\n timelineContentWidth > Math.max(width - layout.taskColumnWidth, 0);\n let hasVerticalScrollbar =\n bodyContentHeight > Math.max(height - layout.headerHeight, 0);\n\n for (let index = 0; index < 2; index += 1) {\n const timelineViewportWidth = Math.max(\n width -\n layout.taskColumnWidth -\n (hasVerticalScrollbar ? GANTT_SCROLLBAR_SIZE : 0),\n 0,\n );\n const bodyViewportHeight = Math.max(\n height -\n layout.headerHeight -\n (hasHorizontalScrollbar ? GANTT_SCROLLBAR_SIZE : 0),\n 0,\n );\n hasHorizontalScrollbar = timelineContentWidth > timelineViewportWidth + 1;\n hasVerticalScrollbar = bodyContentHeight > bodyViewportHeight + 1;\n }\n\n const contentRight = Math.max(\n width - (hasVerticalScrollbar ? GANTT_SCROLLBAR_SIZE : 0),\n layout.taskColumnWidth,\n );\n const contentBottom = Math.max(\n height - (hasHorizontalScrollbar ? GANTT_SCROLLBAR_SIZE : 0),\n layout.headerHeight,\n );\n const timelineViewportWidth = Math.max(\n contentRight - layout.taskColumnWidth,\n 0,\n );\n const bodyViewportHeight = Math.max(contentBottom - layout.headerHeight, 0);\n\n return {\n width,\n height,\n contentRight,\n contentBottom,\n timelineViewportWidth,\n bodyViewportHeight,\n hasHorizontalScrollbar,\n hasVerticalScrollbar,\n bounds: {\n maxLeft: Math.max(timelineContentWidth - timelineViewportWidth, 0),\n maxTop: Math.max(bodyContentHeight - bodyViewportHeight, 0),\n },\n };\n}\n\n/** 计算甘特图在当前视口内的最大滚动距离。 */\nexport function resolveGanttScrollBounds(\n layout: GanttLayout,\n width: number,\n height: number,\n): GanttScrollBounds {\n return resolveGanttViewportLayout(layout, width, height).bounds;\n}\n\n/** 将滚动位置约束在有效内容范围内。 */\nexport function clampGanttScroll(\n scroll: GanttScrollState,\n bounds: GanttScrollBounds,\n): GanttScrollState {\n return {\n left: Math.min(Math.max(scroll.left, 0), bounds.maxLeft),\n top: Math.min(Math.max(scroll.top, 0), bounds.maxTop),\n };\n}\n","import type { GanttLayout } from \"./layout\";\nimport {\n GANTT_SCROLLBAR_SIZE,\n type GanttScrollState,\n type GanttViewportLayout,\n} from \"./scroll\";\n\nexport interface GanttScrollbarRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface GanttAxisScrollbarLayout {\n decreaseButton: GanttScrollbarRect;\n increaseButton: GanttScrollbarRect;\n track: GanttScrollbarRect;\n thumb: GanttScrollbarRect;\n}\n\nexport interface GanttScrollbarLayout {\n horizontal?: GanttAxisScrollbarLayout;\n vertical?: GanttAxisScrollbarLayout;\n}\n\nexport type GanttScrollbarRole =\n | \"decrease-button\"\n | \"increase-button\"\n | \"track\"\n | \"thumb\";\n\nexport interface GanttScrollbarHit {\n axis: \"horizontal\" | \"vertical\";\n role: GanttScrollbarRole;\n}\n\nconst MIN_THUMB_SIZE = 36;\n\n/** 计算带两端按钮的占位式滚动条布局。 */\nexport function computeGanttScrollbarLayout(params: {\n layout: GanttLayout;\n viewport: GanttViewportLayout;\n scroll: GanttScrollState;\n}): GanttScrollbarLayout {\n const { layout, viewport, scroll } = params;\n const result: GanttScrollbarLayout = {};\n\n if (viewport.hasHorizontalScrollbar) {\n const barX = layout.taskColumnWidth;\n const barWidth = Math.max(viewport.contentRight - barX, 0);\n const decreaseButton = {\n x: barX,\n y: viewport.contentBottom,\n width: Math.min(GANTT_SCROLLBAR_SIZE, barWidth / 2),\n height: GANTT_SCROLLBAR_SIZE,\n };\n const increaseButton = {\n x: Math.max(viewport.contentRight - GANTT_SCROLLBAR_SIZE, barX),\n y: viewport.contentBottom,\n width: Math.min(GANTT_SCROLLBAR_SIZE, barWidth / 2),\n height: GANTT_SCROLLBAR_SIZE,\n };\n const track = {\n x: decreaseButton.x + decreaseButton.width,\n y: viewport.contentBottom,\n width: Math.max(\n barWidth - decreaseButton.width - increaseButton.width,\n 0,\n ),\n height: GANTT_SCROLLBAR_SIZE,\n };\n const contentWidth = Math.max(\n layout.totalWidth - layout.taskColumnWidth,\n 1,\n );\n const thumbWidth = Math.min(\n Math.max(\n (viewport.timelineViewportWidth / contentWidth) * track.width,\n MIN_THUMB_SIZE,\n ),\n track.width,\n );\n const available = Math.max(track.width - thumbWidth, 0);\n result.horizontal = {\n decreaseButton,\n increaseButton,\n track,\n thumb: {\n x:\n track.x +\n (viewport.bounds.maxLeft === 0\n ? 0\n : (scroll.left / viewport.bounds.maxLeft) * available),\n y: track.y,\n width: thumbWidth,\n height: track.height,\n },\n };\n }\n\n if (viewport.hasVerticalScrollbar) {\n const barY = layout.headerHeight;\n const barHeight = Math.max(viewport.contentBottom - barY, 0);\n const decreaseButton = {\n x: viewport.contentRight,\n y: barY,\n width: GANTT_SCROLLBAR_SIZE,\n height: Math.min(GANTT_SCROLLBAR_SIZE, barHeight / 2),\n };\n const increaseButton = {\n x: viewport.contentRight,\n y: Math.max(viewport.contentBottom - GANTT_SCROLLBAR_SIZE, barY),\n width: GANTT_SCROLLBAR_SIZE,\n height: Math.min(GANTT_SCROLLBAR_SIZE, barHeight / 2),\n };\n const track = {\n x: viewport.contentRight,\n y: decreaseButton.y + decreaseButton.height,\n width: GANTT_SCROLLBAR_SIZE,\n height: Math.max(\n barHeight - decreaseButton.height - increaseButton.height,\n 0,\n ),\n };\n const contentHeight = Math.max(layout.totalHeight - layout.headerHeight, 1);\n const thumbHeight = Math.min(\n Math.max(\n (viewport.bodyViewportHeight / contentHeight) * track.height,\n MIN_THUMB_SIZE,\n ),\n track.height,\n );\n const available = Math.max(track.height - thumbHeight, 0);\n result.vertical = {\n decreaseButton,\n increaseButton,\n track,\n thumb: {\n x: track.x,\n y:\n track.y +\n (viewport.bounds.maxTop === 0\n ? 0\n : (scroll.top / viewport.bounds.maxTop) * available),\n width: track.width,\n height: thumbHeight,\n },\n };\n }\n\n return result;\n}\n\n/** 命中滚动条的按钮、轨道或滑块。 */\nexport function hitTestGanttScrollbar(\n x: number,\n y: number,\n layout: GanttScrollbarLayout,\n): GanttScrollbarHit | null {\n for (const axis of [\"horizontal\", \"vertical\"] as const) {\n const scrollbar = layout[axis];\n if (!scrollbar) continue;\n for (const role of [\n \"thumb\",\n \"decrease-button\",\n \"increase-button\",\n \"track\",\n ] as const) {\n const rect =\n role === \"decrease-button\"\n ? scrollbar.decreaseButton\n : role === \"increase-button\"\n ? scrollbar.increaseButton\n : scrollbar[role];\n if (isPointInRect(x, y, rect)) return { axis, role };\n }\n }\n return null;\n}\n\nfunction isPointInRect(x: number, y: number, rect: GanttScrollbarRect) {\n return (\n x >= rect.x &&\n x <= rect.x + rect.width &&\n y >= rect.y &&\n y <= rect.y + rect.height\n );\n}\n","export const toTimestamp = (value: Date | string | number) => {\n const dateOnlyMatch =\n typeof value === \"string\" ? /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value) : null;\n const timestamp = dateOnlyMatch\n ? new Date(\n Number(dateOnlyMatch[1]),\n Number(dateOnlyMatch[2]) - 1,\n Number(dateOnlyMatch[3]),\n ).getTime()\n : value instanceof Date\n ? value.getTime()\n : new Date(value).getTime();\n if (!Number.isFinite(timestamp))\n throw new Error(`Invalid date value: ${String(value)}`);\n return timestamp;\n};\n\nexport const dayMs = 24 * 60 * 60 * 1000;\n\nexport function startOfDay(timestamp: number) {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\nexport function formatDate(timestamp: number) {\n return new Intl.DateTimeFormat(\"zh-CN\", {\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(new Date(timestamp));\n}\n","import type { GanttLayout, GanttLayoutRow } from \"./layout\";\nimport type { GanttTask } from \"../schema/options\";\n\n/** 按模式返回一行内实际参与布局的任务条。 */\nexport function resolveGanttRowTasks(row: GanttTask, multiTask: boolean) {\n return multiTask ? (row.tasks ?? []) : [row];\n}\n\n/** 在行数据及其行内任务中查找指定任务。 */\nexport function findGanttTaskById(rows: GanttTask[], taskId: string | null) {\n if (!taskId) return null;\n for (const row of rows) {\n if (row.id === taskId) return row;\n const task = row.tasks?.find((item) => item.id === taskId);\n if (task) return task;\n }\n return null;\n}\n\n/** 在布局中查找任务条及其所属行。 */\nexport function findGanttLayoutTask(\n layout: GanttLayout,\n taskId: string | null,\n): { row: GanttLayoutRow; task: GanttTask } | null {\n if (!taskId) return null;\n for (const row of layout.rows) {\n const task = row.tasks.find((item) => item.id === taskId);\n if (task) return { row, task };\n }\n return null;\n}\n","import { dayMs, startOfDay, toTimestamp } from \"./date\";\nimport type {\n GanttHeaderLevel,\n GanttOptions,\n GanttScale,\n GanttTask,\n} from \"../schema/options\";\nimport { resolveGanttRowTasks } from \"./task-rows\";\n\nexport interface GanttLayoutRow {\n task: GanttTask;\n tasks: GanttTask[];\n index: number;\n y: number;\n}\n\nexport interface GanttHeaderLevelLayout extends GanttHeaderLevel {\n y: number;\n height: number;\n}\n\nexport interface GanttLayout {\n scale: GanttScale;\n start: number;\n end: number;\n dayWidth: number;\n rowHeight: number;\n headerHeight: number;\n headerLevels: GanttHeaderLevelLayout[];\n taskColumnWidth: number;\n rows: GanttLayoutRow[];\n totalWidth: number;\n totalHeight: number;\n}\n\nexport function resolveDayWidth(scale: GanttScale) {\n return scale === \"month\" ? 12 : scale === \"week\" ? 28 : 80;\n}\n\nexport function buildGanttLayout(\n options: GanttOptions,\n _width: number,\n): GanttLayout {\n const timestamps = options.tasks.flatMap((row) =>\n resolveGanttRowTasks(row, options.multiTask === true).flatMap((task) =>\n task.start != null && task.end != null\n ? [toTimestamp(task.start), toTimestamp(task.end)]\n : [],\n ),\n );\n const fallbackStart =\n timestamps.length > 0 ? Math.min(...timestamps) : Date.now();\n const fallbackEnd =\n timestamps.length > 0 ? Math.max(...timestamps) : fallbackStart + dayMs;\n const rawStart = startOfDay(toTimestamp(options.startDate ?? fallbackStart));\n const rawEnd = startOfDay(\n toTimestamp(options.endDate ?? fallbackEnd + dayMs),\n );\n const scale = options.scale ?? \"day\";\n const { start, end } = resolveScaleRange(rawStart, rawEnd, scale);\n const dayWidth = resolveDayWidth(scale);\n const days = Math.max(1, Math.ceil((end - start) / dayMs));\n const taskColumnWidth = options.taskColumnWidth ?? 220;\n const headerLevels = resolveHeaderLevelLayouts(options, scale);\n const headerHeight = headerLevels.reduce(\n (total, level) => total + level.height,\n 0,\n );\n const rows = options.tasks.map((task, index) => ({\n task,\n tasks: resolveGanttRowTasks(task, options.multiTask === true),\n index,\n y: headerHeight + index * (options.rowHeight ?? 36),\n }));\n return {\n scale,\n start,\n end,\n dayWidth,\n rowHeight: options.rowHeight ?? 36,\n headerHeight,\n headerLevels,\n taskColumnWidth,\n rows,\n totalWidth: taskColumnWidth + days * dayWidth,\n totalHeight:\n headerHeight + options.tasks.length * (options.rowHeight ?? 36),\n };\n}\n\n/** 当时间轴内容不足一屏时,等比例扩展最小时间列以填满可视区域。 */\nexport function fitGanttLayoutToTimelineWidth(\n layout: GanttLayout,\n timelineViewportWidth: number,\n): GanttLayout {\n const timelineWidth = Math.max(layout.totalWidth - layout.taskColumnWidth, 0);\n if (timelineViewportWidth <= timelineWidth || timelineViewportWidth <= 0) {\n return layout;\n }\n const days = Math.max(1, Math.ceil((layout.end - layout.start) / dayMs));\n return {\n ...layout,\n dayWidth: timelineViewportWidth / days,\n totalWidth: layout.taskColumnWidth + timelineViewportWidth,\n };\n}\n\nfunction resolveHeaderLevelLayouts(\n options: GanttOptions,\n scale: GanttScale,\n): GanttHeaderLevelLayout[] {\n const defaultHeight = Math.max(options.headerHeight ?? 56, 1);\n const levels = options.headerLevels?.length\n ? options.headerLevels\n : [{ unit: scale }];\n let y = 0;\n return levels.map((level) => {\n const height = Math.max(level.height ?? defaultHeight, 1);\n const result = { ...level, y, height };\n y += height;\n return result;\n });\n}\n\n/** 将时间范围扩展到当前缩放级别的完整列边界。 */\nexport function resolveScaleRange(\n start: number,\n end: number,\n scale: GanttScale,\n) {\n if (scale === \"day\") return { start, end };\n const startDate = new Date(start);\n const endDate = new Date(end);\n if (scale === \"week\") {\n const startDay = (startDate.getDay() + 6) % 7;\n startDate.setDate(startDate.getDate() - startDay);\n const endDay = (endDate.getDay() + 6) % 7;\n if (endDay !== 0) endDate.setDate(endDate.getDate() + 7 - endDay);\n return { start: startDate.getTime(), end: endDate.getTime() };\n }\n startDate.setDate(1);\n if (endDate.getDate() !== 1) {\n endDate.setMonth(endDate.getMonth() + 1, 1);\n }\n return { start: startDate.getTime(), end: endDate.getTime() };\n}\n\nexport function xForDate(timestamp: number, layout: GanttLayout) {\n return (\n layout.taskColumnWidth +\n ((timestamp - layout.start) / dayMs) * layout.dayWidth\n );\n}\n","import { dayMs, toTimestamp } from \"./date\";\nimport { xForDate, type GanttLayout } from \"./layout\";\nimport type { GanttTask } from \"../schema/options\";\n\nexport interface GanttTaskBarRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type GanttTaskHitRole = \"body\" | \"resize-start\" | \"resize-end\";\n\nexport interface GanttTaskHit {\n task: GanttTask;\n role: GanttTaskHitRole;\n}\n\nconst RESIZE_HANDLE_HIT_WIDTH = 8;\n\n/** 判断任务是否已配置可绘制的时间范围。 */\nexport function hasTaskSchedule(task: GanttTask): task is GanttTask & {\n start: Date | string | number;\n end: Date | string | number;\n} {\n return task.start != null && task.end != null;\n}\n\n/** 清除任务排期但保留任务行。 */\nexport function clearTaskSchedule(task: GanttTask) {\n delete task.start;\n delete task.end;\n}\n\n/** 计算任务条在内容坐标系中的区域。 */\nexport function resolveTaskBarRect(\n task: GanttTask,\n rowY: number,\n layout: GanttLayout,\n): GanttTaskBarRect {\n if (!hasTaskSchedule(task)) {\n throw new Error(`Task ${task.id} does not have a schedule.`);\n }\n const start = toTimestamp(task.start);\n const end = Math.max(start + dayMs, toTimestamp(task.end));\n return {\n x: xForDate(start, layout),\n y: rowY + 8,\n width: Math.max(8, ((end - start) / dayMs) * layout.dayWidth),\n height: Math.max(layout.rowHeight - 16, 4),\n };\n}\n\n/** 命中任务条主体或选中任务的左右缩放手柄。 */\nexport function hitTestTaskBar(params: {\n x: number;\n y: number;\n layout: GanttLayout;\n selectedId: string | null;\n resizable: boolean;\n}): GanttTaskHit | null {\n const row = params.layout.rows.find(\n (item) => params.y >= item.y && params.y < item.y + params.layout.rowHeight,\n );\n if (!row) return null;\n for (let index = row.tasks.length - 1; index >= 0; index -= 1) {\n const task = row.tasks[index];\n if (!task || !hasTaskSchedule(task)) continue;\n const rect = resolveTaskBarRect(task, row.y, params.layout);\n if (\n params.y < rect.y ||\n params.y > rect.y + rect.height ||\n params.x < rect.x - RESIZE_HANDLE_HIT_WIDTH / 2 ||\n params.x > rect.x + rect.width + RESIZE_HANDLE_HIT_WIDTH / 2\n ) {\n continue;\n }\n if (params.resizable && task.id === params.selectedId) {\n if (Math.abs(params.x - rect.x) <= RESIZE_HANDLE_HIT_WIDTH) {\n return { task, role: \"resize-start\" };\n }\n if (\n Math.abs(params.x - (rect.x + rect.width)) <= RESIZE_HANDLE_HIT_WIDTH\n ) {\n return { task, role: \"resize-end\" };\n }\n }\n return { task, role: \"body\" };\n }\n return null;\n}\n\n/** 根据行内拖拽起止位置生成吸附到日边界的任务范围。 */\nexport function resolveTaskCreateRange(params: {\n anchorX: number;\n currentX: number;\n layout: GanttLayout;\n}) {\n const lastDayStart = Math.max(params.layout.end - dayMs, params.layout.start);\n const timestampForX = (x: number) => {\n const dayIndex = Math.floor(\n (x - params.layout.taskColumnWidth) / params.layout.dayWidth,\n );\n return Math.min(\n Math.max(params.layout.start + dayIndex * dayMs, params.layout.start),\n lastDayStart,\n );\n };\n const anchor = timestampForX(params.anchorX);\n const current = timestampForX(params.currentX);\n return {\n start: Math.min(anchor, current),\n end: Math.min(Math.max(anchor, current) + dayMs, params.layout.end),\n };\n}\n\n/** 将水平像素位移转换为时间位移,并按需吸附到最小日维度。 */\nexport function resolveTaskTimeDelta(\n deltaX: number,\n layout: GanttLayout,\n snapToColumn: boolean,\n anchorTimestamp?: number,\n) {\n const rawDays = deltaX / layout.dayWidth;\n const rawDelta = rawDays * dayMs;\n if (!snapToColumn) return rawDelta;\n const anchor = anchorTimestamp ?? layout.start;\n const target = anchor + rawDelta;\n const snappedTarget =\n layout.start + Math.round((target - layout.start) / dayMs) * dayMs;\n return snappedTarget - anchor;\n}\n\n/** 根据拖拽模式计算任务范围,并约束在时间轴内且至少保留一天。 */\nexport function resolveTaskDragRange(params: {\n mode: \"move\" | \"resize-start\" | \"resize-end\";\n originalStart: number;\n originalEnd: number;\n delta: number;\n minStart?: number;\n maxEnd?: number;\n}) {\n const { mode, originalStart, originalEnd } = params;\n const minStart = params.minStart ?? Number.NEGATIVE_INFINITY;\n const maxEnd = params.maxEnd ?? Number.POSITIVE_INFINITY;\n if (mode === \"resize-start\") {\n return {\n start: Math.max(\n minStart,\n Math.min(originalStart + params.delta, originalEnd - dayMs),\n ),\n end: originalEnd,\n };\n }\n if (mode === \"resize-end\") {\n return {\n start: originalStart,\n end: Math.min(\n maxEnd,\n Math.max(originalEnd + params.delta, originalStart + dayMs),\n ),\n };\n }\n const delta = Math.min(\n Math.max(params.delta, minStart - originalStart),\n maxEnd - originalEnd,\n );\n return {\n start: originalStart + delta,\n end: originalEnd + delta,\n };\n}\n","import type { GanttTaskBarRect } from \"./task-geometry\";\nimport { hasTaskSchedule, resolveTaskBarRect } from \"./task-geometry\";\nimport type { GanttLayout } from \"./layout\";\nimport { findGanttLayoutTask } from \"./task-rows\";\nimport type { GanttDependency } from \"../schema/options\";\n\nexport interface GanttDependencyPoint {\n x: number;\n y: number;\n}\n\nexport interface GanttDependencyRoute {\n points: GanttDependencyPoint[];\n arrowDirection: \"left\" | \"right\";\n}\n\nconst CONNECTOR_GAP = 12;\n\n/** 计算类似示意图的正交依赖连线路径。 */\nexport function resolveDependencyRoute(params: {\n from: GanttTaskBarRect;\n to: GanttTaskBarRect;\n rowHeight: number;\n type?: GanttDependency[\"type\"];\n}): GanttDependencyRoute {\n const type = params.type ?? \"finish-to-start\";\n const fromY = params.from.y + params.from.height / 2;\n const toY = params.to.y + params.to.height / 2;\n const fromLeft = params.from.x;\n const fromRight = params.from.x + params.from.width;\n const toLeft = params.to.x;\n const toRight = params.to.x + params.to.width;\n\n if (type === \"start-to-start\") {\n const outerX = Math.min(fromLeft, toLeft) - CONNECTOR_GAP;\n return {\n points: [\n { x: fromLeft, y: fromY },\n { x: outerX, y: fromY },\n { x: outerX, y: toY },\n { x: toLeft, y: toY },\n ],\n arrowDirection: \"right\",\n };\n }\n if (type === \"finish-to-finish\") {\n const outerX = Math.max(fromRight, toRight) + CONNECTOR_GAP;\n return {\n points: [\n { x: fromRight, y: fromY },\n { x: outerX, y: fromY },\n { x: outerX, y: toY },\n { x: toRight, y: toY },\n ],\n arrowDirection: \"left\",\n };\n }\n\n const sourceExitX = fromRight + CONNECTOR_GAP;\n const targetEntryX = toLeft - CONNECTOR_GAP;\n if (sourceExitX <= targetEntryX) {\n const middleX = (sourceExitX + targetEntryX) / 2;\n return {\n points: [\n { x: fromRight, y: fromY },\n { x: middleX, y: fromY },\n { x: middleX, y: toY },\n { x: toLeft, y: toY },\n ],\n arrowDirection: \"right\",\n };\n }\n\n const rowDirection = toY >= fromY ? 1 : -1;\n const channelY =\n fromY === toY\n ? fromY - Math.max(params.rowHeight / 2, CONNECTOR_GAP)\n : fromY + (params.rowHeight / 2) * rowDirection;\n return {\n points: [\n { x: fromRight, y: fromY },\n { x: sourceExitX, y: fromY },\n { x: sourceExitX, y: channelY },\n { x: targetEntryX, y: channelY },\n { x: targetEntryX, y: toY },\n { x: toLeft, y: toY },\n ],\n arrowDirection: \"right\",\n };\n}\n\n/** 根据任务布局计算一条依赖线的完整路径。 */\nexport function resolveDependencyLayoutRoute(\n dependency: GanttDependency,\n layout: GanttLayout,\n rowOffsets?: ReadonlyMap<string, number>,\n) {\n const from = findGanttLayoutTask(layout, dependency.from);\n const to = findGanttLayoutTask(layout, dependency.to);\n if (\n !from ||\n !to ||\n !hasTaskSchedule(from.task) ||\n !hasTaskSchedule(to.task)\n ) {\n return null;\n }\n return resolveDependencyRoute({\n from: resolveTaskBarRect(\n from.task,\n from.row.y + (rowOffsets?.get(from.row.task.id) ?? 0),\n layout,\n ),\n to: resolveTaskBarRect(\n to.task,\n to.row.y + (rowOffsets?.get(to.row.task.id) ?? 0),\n layout,\n ),\n rowHeight: layout.rowHeight,\n type: dependency.type,\n });\n}\n\n/** 命中距离鼠标最近的依赖折线。 */\nexport function hitTestGanttDependency(params: {\n x: number;\n y: number;\n layout: GanttLayout;\n dependencies: GanttDependency[];\n tolerance?: number;\n}) {\n const tolerance = params.tolerance ?? 6;\n for (let index = params.dependencies.length - 1; index >= 0; index -= 1) {\n const dependency = params.dependencies[index];\n if (!dependency) continue;\n const route = resolveDependencyLayoutRoute(dependency, params.layout);\n if (!route) continue;\n for (\n let pointIndex = 1;\n pointIndex < route.points.length;\n pointIndex += 1\n ) {\n const start = route.points[pointIndex - 1];\n const end = route.points[pointIndex];\n if (\n start &&\n end &&\n distanceToSegment(params.x, params.y, start.x, start.y, end.x, end.y) <=\n tolerance\n ) {\n return { dependency, index, route };\n }\n }\n }\n return null;\n}\n\nfunction distanceToSegment(\n x: number,\n y: number,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n) {\n const deltaX = endX - startX;\n const deltaY = endY - startY;\n const lengthSquared = deltaX * deltaX + deltaY * deltaY;\n if (lengthSquared === 0) return Math.hypot(x - startX, y - startY);\n const ratio = Math.min(\n Math.max(\n ((x - startX) * deltaX + (y - startY) * deltaY) / lengthSquared,\n 0,\n ),\n 1,\n );\n return Math.hypot(\n x - (startX + ratio * deltaX),\n y - (startY + ratio * deltaY),\n );\n}\n","import type { GanttLayout } from \"./layout\";\nimport { findGanttLayoutTask } from \"./task-rows\";\nimport { hasTaskSchedule, resolveTaskBarRect } from \"./task-geometry\";\nimport type { GanttDependency, GanttTask } from \"../schema/options\";\n\nexport type GanttDependencySide = \"start\" | \"finish\";\n\nexport interface GanttDependencyAnchor {\n task: GanttTask;\n side: GanttDependencySide;\n x: number;\n y: number;\n}\n\nexport interface GanttDependencyDragVisualState {\n sourceTaskId: string;\n sourceSide: GanttDependencySide;\n sourceX: number;\n sourceY: number;\n currentX: number;\n currentY: number;\n targetTaskId: string | null;\n targetSide: GanttDependencySide | null;\n}\n\nconst CONNECTOR_OFFSET = 10;\nconst CONNECTOR_HIT_RADIUS = 8;\n\n/** 返回任务条左右两侧的依赖连接锚点。 */\nexport function resolveTaskDependencyAnchors(\n task: GanttTask,\n rowY: number,\n layout: GanttLayout,\n): [GanttDependencyAnchor, GanttDependencyAnchor] | null {\n if (!hasTaskSchedule(task)) return null;\n const rect = resolveTaskBarRect(task, rowY, layout);\n const y = rect.y + rect.height / 2;\n return [\n { task, side: \"start\", x: rect.x - CONNECTOR_OFFSET, y },\n {\n task,\n side: \"finish\",\n x: rect.x + rect.width + CONNECTOR_OFFSET,\n y,\n },\n ];\n}\n\n/** 命中当前选中任务的依赖连接锚点。 */\nexport function hitTestTaskDependencyAnchor(params: {\n x: number;\n y: number;\n layout: GanttLayout;\n selectedTaskId: string | null;\n}) {\n const result = findGanttLayoutTask(params.layout, params.selectedTaskId);\n if (!result) return null;\n const anchors = resolveTaskDependencyAnchors(\n result.task,\n result.row.y,\n params.layout,\n );\n return (\n anchors?.find(\n (anchor) =>\n Math.hypot(params.x - anchor.x, params.y - anchor.y) <=\n CONNECTOR_HIT_RADIUS,\n ) ?? null\n );\n}\n\n/** 根据拖拽起点和目标端点推导支持的依赖类型。 */\nexport function resolveDependencyType(\n sourceSide: GanttDependencySide,\n targetSide: GanttDependencySide,\n): GanttDependency[\"type\"] | null {\n if (sourceSide === \"start\") {\n return targetSide === \"start\" ? \"start-to-start\" : null;\n }\n return targetSide === \"finish\" ? \"finish-to-finish\" : \"finish-to-start\";\n}\n\n/** 命中依赖拖拽的目标任务,并按鼠标所在半区选择端点。 */\nexport function resolveDependencyDropTarget(params: {\n x: number;\n y: number;\n layout: GanttLayout;\n sourceTaskId: string;\n sourceSide: GanttDependencySide;\n}) {\n const row = params.layout.rows.find(\n (item) => params.y >= item.y && params.y < item.y + params.layout.rowHeight,\n );\n if (!row) return null;\n for (let index = row.tasks.length - 1; index >= 0; index -= 1) {\n const task = row.tasks[index];\n if (!task || task.id === params.sourceTaskId || !hasTaskSchedule(task)) {\n continue;\n }\n const rect = resolveTaskBarRect(task, row.y, params.layout);\n if (\n params.x < rect.x - CONNECTOR_HIT_RADIUS ||\n params.x > rect.x + rect.width + CONNECTOR_HIT_RADIUS\n ) {\n continue;\n }\n const targetSide: GanttDependencySide =\n params.x < rect.x + rect.width / 2 ? \"start\" : \"finish\";\n const type = resolveDependencyType(params.sourceSide, targetSide);\n if (!type) continue;\n return {\n task,\n side: targetSide,\n type,\n x: targetSide === \"start\" ? rect.x : rect.x + rect.width,\n y: rect.y + rect.height / 2,\n };\n }\n return null;\n}\n\n/** 添加依赖;同一对任务已存在时更新其类型并保留自定义颜色。 */\nexport function upsertGanttDependency(\n dependencies: GanttDependency[],\n dependency: GanttDependency,\n) {\n const index = dependencies.findIndex(\n (item) => item.from === dependency.from && item.to === dependency.to,\n );\n if (index < 0) {\n return {\n dependencies: [...dependencies, dependency],\n index: dependencies.length,\n };\n }\n const next = dependencies.slice();\n next[index] = { ...dependencies[index], ...dependency };\n return { dependencies: next, index };\n}\n\n/** 删除指定索引的依赖并返回新数组。 */\nexport function removeGanttDependency(\n dependencies: GanttDependency[],\n index: number,\n) {\n return dependencies.filter((_, itemIndex) => itemIndex !== index);\n}\n","import type { GanttTask } from \"../schema/options\";\n\nexport interface GanttRowDragVisualState {\n phase: \"potential\" | \"dragging\";\n taskId: string;\n fromIndex: number;\n targetIndex: number;\n offsets: ReadonlyMap<string, number>;\n}\n\n/** 根据拖拽行中心点计算最终目标行索引。 */\nexport function resolveRowDragTargetIndex(params: {\n pointerDeltaY: number;\n fromIndex: number;\n rowHeight: number;\n rowCount: number;\n}) {\n const rowHeight = Math.max(params.rowHeight, 1);\n return Math.min(\n Math.max(\n Math.round(params.fromIndex + params.pointerDeltaY / rowHeight),\n 0,\n ),\n Math.max(params.rowCount - 1, 0),\n );\n}\n\n/** 计算目标位置变化后,各行用于让位动画的垂直偏移。 */\nexport function resolveRowDragTargetOffset(params: {\n rowIndex: number;\n fromIndex: number;\n targetIndex: number;\n rowHeight: number;\n}) {\n const { rowIndex, fromIndex, targetIndex, rowHeight } = params;\n if (rowIndex === fromIndex) return 0;\n if (\n targetIndex > fromIndex &&\n rowIndex > fromIndex &&\n rowIndex <= targetIndex\n ) {\n return -rowHeight;\n }\n if (\n targetIndex < fromIndex &&\n rowIndex >= targetIndex &&\n rowIndex < fromIndex\n ) {\n return rowHeight;\n }\n return 0;\n}\n\n/** 返回移动指定任务后的新任务顺序,不修改原数组。 */\nexport function reorderGanttTasks(\n tasks: GanttTask[],\n fromIndex: number,\n targetIndex: number,\n) {\n if (\n fromIndex === targetIndex ||\n fromIndex < 0 ||\n fromIndex >= tasks.length ||\n targetIndex < 0 ||\n targetIndex >= tasks.length\n ) {\n return tasks.slice();\n }\n const reordered = tasks.slice();\n const [task] = reordered.splice(fromIndex, 1);\n if (task) reordered.splice(targetIndex, 0, task);\n return reordered;\n}\n","import type { GanttScrollState } from \"../domain/scroll\";\n\nexport const WHEEL_DELTA_MODE_PIXEL = 0;\nexport const WHEEL_DELTA_MODE_LINE = 1;\nexport const WHEEL_DELTA_MODE_PAGE = 2;\n\n/** 将不同 deltaMode 的滚轮增量统一换算为像素。 */\nexport function normalizeWheelDeltaToPixels(params: {\n delta: number;\n deltaMode: number;\n lineHeight: number;\n pageSize: number;\n}) {\n const delta = Number.isFinite(params.delta) ? params.delta : 0;\n const lineHeight = Math.max(params.lineHeight, 1);\n const pageSize = Math.max(params.pageSize, 1);\n if (params.deltaMode === WHEEL_DELTA_MODE_LINE) return delta * lineHeight;\n if (params.deltaMode === WHEEL_DELTA_MODE_PAGE) return delta * pageSize;\n return delta;\n}\n\n/** 缓和鼠标滚轮常见的大步进,同时保留触控板的细粒度输入。 */\nexport function softenWheelDeltaPixels(params: {\n delta: number;\n deltaMode: number;\n lineHeight: number;\n}) {\n const { delta } = params;\n if (delta === 0) return 0;\n const absoluteDelta = Math.abs(delta);\n const lineHeight = Math.max(params.lineHeight, 1);\n if (\n params.deltaMode === WHEEL_DELTA_MODE_PIXEL &&\n absoluteDelta >= 80 &&\n absoluteDelta <= 160\n ) {\n return delta * 0.42;\n }\n if (params.deltaMode === WHEEL_DELTA_MODE_LINE) {\n const maxStep = Math.max(lineHeight * 0.75, 24);\n if (absoluteDelta <= maxStep) return delta * 0.72;\n return Math.sign(delta) * (maxStep + (absoluteDelta - maxStep) * 0.35);\n }\n const softThreshold = Math.max(lineHeight * 1.25, 48);\n if (absoluteDelta <= softThreshold) return delta;\n return (\n Math.sign(delta) * (softThreshold + (absoluteDelta - softThreshold) * 0.4)\n );\n}\n\n/** 解析甘特图横纵方向的滚轮滚动量。 */\nexport function resolveWheelScrollDelta(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n shiftKey: boolean;\n lineHeight: number;\n pageWidth: number;\n pageHeight: number;\n}) {\n const rawX = softenWheelDeltaPixels({\n delta: normalizeWheelDeltaToPixels({\n delta: params.deltaX,\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n pageSize: params.pageWidth,\n }),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n const rawY = softenWheelDeltaPixels({\n delta: normalizeWheelDeltaToPixels({\n delta: params.deltaY,\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n pageSize: params.pageHeight,\n }),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n return params.shiftKey\n ? { left: rawX + rawY, top: 0 }\n : { left: rawX, top: rawY };\n}\n\n/** 判断滚轮事件是否应按触控板输入即时响应。 */\nexport function shouldApplyWheelDeltaImmediately(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n}) {\n if (params.deltaMode !== WHEEL_DELTA_MODE_PIXEL) return false;\n return Math.abs(params.deltaX) < 40 && Math.abs(params.deltaY) < 40;\n}\n\n/** 计算平滑滚轮动画的下一帧位置。 */\nexport function advanceWheelScrollSmoothing(params: {\n current: GanttScrollState;\n target: GanttScrollState;\n deltaMs: number;\n timeConstantMs?: number;\n}) {\n const timeConstant = Math.max(params.timeConstantMs ?? 92, 1);\n const deltaMs = Math.max(Math.min(params.deltaMs, 64), 0);\n const alpha = 1 - Math.exp(-deltaMs / timeConstant);\n const nextLeft =\n params.current.left + (params.target.left - params.current.left) * alpha;\n const nextTop =\n params.current.top + (params.target.top - params.current.top) * alpha;\n const done =\n Math.abs(params.target.left - nextLeft) < 0.35 &&\n Math.abs(params.target.top - nextTop) < 0.35;\n return {\n nextScroll: done\n ? { left: params.target.left, top: params.target.top }\n : { left: nextLeft, top: nextTop },\n done,\n };\n}\n","import { clampGanttScroll } from \"../domain/scroll\";\nimport {\n advanceWheelScrollSmoothing,\n resolveWheelScrollDelta,\n shouldApplyWheelDeltaImmediately,\n} from \"../interaction/wheel-scroll\";\nimport type { GanttEventHost } from \"./runtime\";\n\n/** 管理滚轮目标累计与逐帧缓动。 */\nexport class GanttWheelScrollController {\n constructor(private readonly host: GanttEventHost) {}\n\n /** 消费滚轮输入,并根据设备特征选择即时或平滑滚动。 */\n handleWheel(event: WheelEvent) {\n const { runtime } = this.host;\n if (!runtime.layout || !runtime.viewport) return;\n event.preventDefault();\n const lineHeight = this.host.getOptions().rowHeight ?? 36;\n const delta = resolveWheelScrollDelta({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n shiftKey: event.shiftKey,\n lineHeight,\n pageWidth: runtime.viewport.timelineViewportWidth,\n pageHeight: runtime.viewport.bodyViewportHeight,\n });\n if (delta.left === 0 && delta.top === 0) return;\n\n const base = runtime.wheelScrollTarget ?? runtime.scroll;\n const target = clampGanttScroll(\n { left: base.left + delta.left, top: base.top + delta.top },\n runtime.viewport.bounds,\n );\n if (\n shouldApplyWheelDeltaImmediately({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n })\n ) {\n this.stop();\n if (\n target.left !== runtime.scroll.left ||\n target.top !== runtime.scroll.top\n ) {\n runtime.scroll = target;\n this.host.render();\n }\n return;\n }\n if (\n target.left === runtime.scroll.left &&\n target.top === runtime.scroll.top &&\n runtime.wheelScrollFrameId == null\n ) {\n return;\n }\n runtime.wheelScrollTarget = target;\n if (runtime.wheelScrollFrameId == null) {\n runtime.wheelScrollLastTime = performance.now();\n this.scheduleNextFrame();\n }\n }\n\n /** 停止尚未完成的滚轮缓动。 */\n stop() {\n const { runtime } = this.host;\n if (runtime.wheelScrollFrameId != null) {\n cancelAnimationFrame(runtime.wheelScrollFrameId);\n }\n runtime.wheelScrollFrameId = null;\n runtime.wheelScrollTarget = null;\n runtime.wheelScrollLastTime = 0;\n }\n\n private scheduleNextFrame() {\n this.host.runtime.wheelScrollFrameId = requestAnimationFrame(() => {\n this.advanceFrame();\n });\n }\n\n private advanceFrame() {\n const { runtime } = this.host;\n runtime.wheelScrollFrameId = null;\n const pendingTarget = runtime.wheelScrollTarget;\n if (!pendingTarget || !runtime.viewport) return;\n const target = clampGanttScroll(pendingTarget, runtime.viewport.bounds);\n runtime.wheelScrollTarget = target;\n const now = performance.now();\n const { nextScroll, done } = advanceWheelScrollSmoothing({\n current: runtime.scroll,\n target,\n deltaMs: now - runtime.wheelScrollLastTime,\n });\n runtime.wheelScrollLastTime = now;\n runtime.scroll = nextScroll;\n this.host.render();\n if (done) {\n runtime.wheelScrollTarget = null;\n runtime.wheelScrollLastTime = 0;\n return;\n }\n this.scheduleNextFrame();\n }\n}\n","import {\n hitTestGanttScrollbar,\n type GanttAxisScrollbarLayout,\n} from \"../domain/scrollbar\";\nimport { clampGanttScroll } from \"../domain/scroll\";\nimport { hitTestGanttDependency } from \"../domain/dependency-geometry\";\nimport {\n hitTestTaskDependencyAnchor,\n removeGanttDependency,\n resolveDependencyDropTarget,\n resolveDependencyType,\n upsertGanttDependency,\n} from \"../domain/dependency-edit\";\nimport {\n reorderGanttTasks,\n resolveRowDragTargetIndex,\n resolveRowDragTargetOffset,\n} from \"../domain/row-drag\";\nimport { toTimestamp } from \"../domain/date\";\nimport { findGanttTaskById } from \"../domain/task-rows\";\nimport {\n clearTaskSchedule,\n hasTaskSchedule,\n hitTestTaskBar,\n resolveTaskCreateRange,\n resolveTaskDragRange,\n resolveTaskTimeDelta,\n} from \"../domain/task-geometry\";\nimport type { GanttEventHost } from \"./runtime\";\nimport { GanttWheelScrollController } from \"./wheel-scroll-controller\";\n\n/** 协调任务条、滚动条和滚轮交互。 */\nexport class GanttEventController {\n private readonly wheelScrollController: GanttWheelScrollController;\n private rowDragFrameId: number | null = null;\n\n constructor(private readonly host: GanttEventHost) {\n this.wheelScrollController = new GanttWheelScrollController(host);\n }\n\n readonly handlePointerDown = (event: PointerEvent) => {\n this.wheelScrollController.stop();\n const { runtime } = this.host;\n if (!runtime.layout || !runtime.viewport) return;\n const point = this.point(event);\n this.host.canvas.focus({ preventScroll: true });\n const scrollbarHit = hitTestGanttScrollbar(\n point.x,\n point.y,\n runtime.scrollbars,\n );\n if (scrollbarHit) {\n this.handleScrollbarPointerDown(\n event,\n scrollbarHit.axis,\n scrollbarHit.role,\n scrollbarHit.axis === \"horizontal\" ? point.x : point.y,\n );\n return;\n }\n if (this.isTaskColumnResizeHandle(point.x, point.y)) {\n const options = this.host.getOptions();\n const startWidth = runtime.layout.taskColumnWidth;\n runtime.columnResize = {\n startX: point.x,\n startWidth,\n minWidth: Math.max(options.taskColumnMinWidth ?? 120, 48),\n maxWidth: Math.max(\n Math.min(\n options.taskColumnMaxWidth ?? 480,\n runtime.viewport.width - 80,\n ),\n options.taskColumnMinWidth ?? 120,\n ),\n };\n this.host.canvas.style.cursor = \"col-resize\";\n this.host.canvas.setPointerCapture(event.pointerId);\n return;\n }\n if (this.startRowDrag(event, point.x, point.y)) return;\n if (\n point.x < runtime.layout.taskColumnWidth ||\n point.x >= runtime.viewport.contentRight ||\n point.y < runtime.layout.headerHeight ||\n point.y >= runtime.viewport.contentBottom\n ) {\n return;\n }\n const contentX = point.x + runtime.scroll.left;\n const contentY = point.y + runtime.scroll.top;\n const options = this.host.getOptions();\n if (options.editable === true) {\n const anchor = hitTestTaskDependencyAnchor({\n x: contentX,\n y: contentY,\n layout: runtime.layout,\n selectedTaskId: runtime.selectedId,\n });\n if (anchor) {\n runtime.dependencyDrag = {\n sourceTaskId: anchor.task.id,\n sourceSide: anchor.side,\n sourceX: anchor.x,\n sourceY: anchor.y,\n currentX: anchor.x,\n currentY: anchor.y,\n targetTaskId: null,\n targetSide: null,\n };\n runtime.selectedDependencyIndex = null;\n this.host.canvas.style.cursor = \"crosshair\";\n this.host.canvas.setPointerCapture(event.pointerId);\n this.host.render();\n return;\n }\n }\n const hit = hitTestTaskBar({\n x: contentX,\n y: contentY,\n layout: runtime.layout,\n selectedId: runtime.selectedId,\n resizable: options.editable === true && options.taskResizable !== false,\n });\n if (!hit) {\n const dependencyHit = hitTestGanttDependency({\n x: contentX,\n y: contentY,\n layout: runtime.layout,\n dependencies: options.dependencies ?? [],\n });\n if (dependencyHit) {\n runtime.selectedId = null;\n runtime.selectedDependencyIndex = dependencyHit.index;\n options.onDependencyClick?.(\n dependencyHit.dependency,\n dependencyHit.index,\n );\n this.host.render();\n return;\n }\n runtime.selectedDependencyIndex = null;\n if (options.editable === true) {\n this.startTaskCreate(event, contentX, contentY);\n }\n this.host.render();\n return;\n }\n runtime.selectedId = hit.task.id;\n runtime.selectedDependencyIndex = null;\n options.onTaskClick?.(hit.task);\n if (options.editable !== true || !hasTaskSchedule(hit.task)) {\n this.host.render();\n return;\n }\n runtime.taskDrag = {\n task: hit.task,\n mode:\n hit.role === \"body\"\n ? \"move\"\n : hit.role === \"resize-start\"\n ? \"resize-start\"\n : \"resize-end\",\n startX: contentX,\n originalStart: toTimestamp(hit.task.start),\n originalEnd: toTimestamp(hit.task.end),\n };\n this.host.canvas.style.cursor =\n hit.role === \"body\" ? \"grabbing\" : \"ew-resize\";\n this.host.canvas.setPointerCapture(event.pointerId);\n this.host.render();\n };\n\n readonly handlePointerMove = (event: PointerEvent) => {\n const { runtime } = this.host;\n const point = this.point(event);\n if (runtime.scrollbarDrag) {\n const drag = runtime.scrollbarDrag;\n const coordinate = drag.axis === \"horizontal\" ? point.x : point.y;\n const availableTrack = Math.max(drag.trackLength - drag.thumbLength, 1);\n const next =\n ((coordinate - drag.pointerOffset - drag.trackStart) / availableTrack) *\n drag.maxScroll;\n this.scrollAxisTo(drag.axis, next, true);\n return;\n }\n if (runtime.columnResize) {\n const drag = runtime.columnResize;\n runtime.taskColumnWidth = Math.round(\n Math.min(\n Math.max(drag.startWidth + point.x - drag.startX, drag.minWidth),\n drag.maxWidth,\n ),\n );\n this.host.render();\n return;\n }\n if (runtime.rowDrag) {\n this.updateRowDrag(point.y + runtime.scroll.top);\n return;\n }\n if (runtime.dependencyDrag && runtime.layout) {\n this.updateDependencyDrag(\n point.x + runtime.scroll.left,\n point.y + runtime.scroll.top,\n );\n return;\n }\n if (runtime.taskDrag && runtime.layout) {\n this.updateTaskDrag(point.x + runtime.scroll.left, false);\n return;\n }\n this.updateCursor(point.x, point.y);\n };\n\n readonly handlePointerUp = (event: PointerEvent) => {\n const { runtime } = this.host;\n if (runtime.dependencyDrag) {\n this.finishDependencyDrag();\n runtime.dependencyDrag = null;\n this.host.render();\n }\n if (runtime.rowDrag) {\n this.finishRowDrag();\n }\n if (runtime.taskDrag) {\n if (this.host.getOptions().snapToColumn === true) {\n const point = this.point(event);\n this.updateTaskDrag(point.x + runtime.scroll.left, true);\n }\n this.host.getOptions().onTaskChange?.(runtime.taskDrag.task);\n }\n if (runtime.columnResize && runtime.taskColumnWidth != null) {\n this.host.getOptions().onTaskColumnResize?.(runtime.taskColumnWidth);\n }\n runtime.taskDrag = null;\n runtime.dependencyDrag = null;\n runtime.scrollbarDrag = null;\n runtime.columnResize = null;\n this.host.canvas.style.cursor = \"default\";\n if (this.host.canvas.hasPointerCapture(event.pointerId)) {\n this.host.canvas.releasePointerCapture(event.pointerId);\n }\n };\n\n readonly handlePointerLeave = () => {\n if (\n !this.host.runtime.taskDrag &&\n !this.host.runtime.dependencyDrag &&\n !this.host.runtime.scrollbarDrag &&\n !this.host.runtime.columnResize &&\n !this.host.runtime.rowDrag\n ) {\n this.host.canvas.style.cursor = \"default\";\n }\n };\n\n readonly handleWheel = (event: WheelEvent) => {\n this.wheelScrollController.handleWheel(event);\n };\n\n readonly handleKeyDown = (event: KeyboardEvent) => {\n if (\n this.host.getOptions().editable !== true ||\n (event.key !== \"Delete\" && event.key !== \"Backspace\")\n ) {\n return;\n }\n const { runtime } = this.host;\n const options = this.host.getOptions();\n if (runtime.selectedDependencyIndex != null) {\n const dependencies = options.dependencies ?? [];\n if (dependencies[runtime.selectedDependencyIndex]) {\n event.preventDefault();\n const next = removeGanttDependency(\n dependencies,\n runtime.selectedDependencyIndex,\n );\n options.dependencies = next;\n runtime.selectedDependencyIndex = null;\n options.onDependenciesChange?.(next);\n this.host.render();\n }\n return;\n }\n const task = findGanttTaskById(options.tasks, runtime.selectedId);\n if (!task || !hasTaskSchedule(task)) return;\n event.preventDefault();\n clearTaskSchedule(task);\n runtime.selectedId = null;\n this.host.getOptions().onTaskChange?.(task);\n this.host.render();\n };\n\n /** 停止控制器持有的异步交互。 */\n destroy() {\n this.wheelScrollController.stop();\n this.stopRowDragAnimation();\n }\n\n /** 停止尚未完成的滚轮缓动。 */\n stopWheelScroll() {\n this.wheelScrollController.stop();\n }\n\n private handleScrollbarPointerDown(\n event: PointerEvent,\n axis: \"horizontal\" | \"vertical\",\n role: \"decrease-button\" | \"increase-button\" | \"track\" | \"thumb\",\n coordinate: number,\n ) {\n const { runtime } = this.host;\n const scrollbar = runtime.scrollbars[axis];\n if (!scrollbar || !runtime.layout || !runtime.viewport) return;\n event.preventDefault();\n this.host.canvas.style.cursor = role === \"thumb\" ? \"grabbing\" : \"pointer\";\n if (role === \"decrease-button\" || role === \"increase-button\") {\n const direction = role === \"decrease-button\" ? -1 : 1;\n const step =\n axis === \"horizontal\"\n ? runtime.layout.dayWidth\n : runtime.layout.rowHeight;\n this.scrollAxisBy(axis, direction * step);\n return;\n }\n if (role === \"track\") {\n this.jumpToTrackPosition(axis, coordinate, scrollbar);\n return;\n }\n const trackStart =\n axis === \"horizontal\" ? scrollbar.track.x : scrollbar.track.y;\n const trackLength =\n axis === \"horizontal\" ? scrollbar.track.width : scrollbar.track.height;\n const thumbStart =\n axis === \"horizontal\" ? scrollbar.thumb.x : scrollbar.thumb.y;\n const thumbLength =\n axis === \"horizontal\" ? scrollbar.thumb.width : scrollbar.thumb.height;\n runtime.scrollbarDrag = {\n axis,\n pointerOffset: coordinate - thumbStart,\n trackStart,\n trackLength,\n thumbLength,\n maxScroll:\n axis === \"horizontal\"\n ? runtime.viewport.bounds.maxLeft\n : runtime.viewport.bounds.maxTop,\n };\n this.host.canvas.setPointerCapture(event.pointerId);\n }\n\n private jumpToTrackPosition(\n axis: \"horizontal\" | \"vertical\",\n coordinate: number,\n scrollbar: GanttAxisScrollbarLayout,\n ) {\n const { viewport } = this.host.runtime;\n if (!viewport) return;\n const trackStart =\n axis === \"horizontal\" ? scrollbar.track.x : scrollbar.track.y;\n const trackLength =\n axis === \"horizontal\" ? scrollbar.track.width : scrollbar.track.height;\n const thumbLength =\n axis === \"horizontal\" ? scrollbar.thumb.width : scrollbar.thumb.height;\n const maxScroll =\n axis === \"horizontal\" ? viewport.bounds.maxLeft : viewport.bounds.maxTop;\n const ratio =\n (coordinate - trackStart - thumbLength / 2) /\n Math.max(trackLength - thumbLength, 1);\n this.scrollAxisTo(axis, Math.min(Math.max(ratio, 0), 1) * maxScroll);\n }\n\n private updateTaskDrag(contentX: number, snapToColumn: boolean) {\n const { runtime } = this.host;\n const drag = runtime.taskDrag;\n if (!drag || !runtime.layout) return;\n if (drag.mode === \"create\") {\n const range = resolveTaskCreateRange({\n anchorX: drag.startX,\n currentX: contentX,\n layout: runtime.layout,\n });\n drag.task.start = new Date(range.start);\n drag.task.end = new Date(range.end);\n this.host.scheduleRender();\n return;\n }\n const delta = resolveTaskTimeDelta(\n contentX - drag.startX,\n runtime.layout,\n snapToColumn,\n drag.mode === \"resize-end\" ? drag.originalEnd : drag.originalStart,\n );\n const range = resolveTaskDragRange({\n mode: drag.mode,\n originalStart: drag.originalStart,\n originalEnd: drag.originalEnd,\n delta,\n minStart: runtime.layout.start,\n maxEnd: runtime.layout.end,\n });\n drag.task.start = new Date(range.start);\n drag.task.end = new Date(range.end);\n this.host.scheduleRender();\n }\n\n private updateDependencyDrag(contentX: number, contentY: number) {\n const { runtime } = this.host;\n const drag = runtime.dependencyDrag;\n if (!drag || !runtime.layout) return;\n const target = resolveDependencyDropTarget({\n x: contentX,\n y: contentY,\n layout: runtime.layout,\n sourceTaskId: drag.sourceTaskId,\n sourceSide: drag.sourceSide,\n });\n drag.currentX = target?.x ?? contentX;\n drag.currentY = target?.y ?? contentY;\n drag.targetTaskId = target?.task.id ?? null;\n drag.targetSide = target?.side ?? null;\n this.host.scheduleRender();\n }\n\n private finishDependencyDrag() {\n const { runtime } = this.host;\n const drag = runtime.dependencyDrag;\n if (!drag || !drag.targetTaskId || !drag.targetSide) return;\n const type = resolveDependencyType(drag.sourceSide, drag.targetSide);\n if (!type) return;\n const options = this.host.getOptions();\n const dependency = {\n from: drag.sourceTaskId,\n to: drag.targetTaskId,\n type,\n } as const;\n const result = upsertGanttDependency(\n options.dependencies ?? [],\n dependency,\n );\n options.dependencies = result.dependencies;\n runtime.selectedId = null;\n runtime.selectedDependencyIndex = result.index;\n options.onDependenciesChange?.(result.dependencies);\n }\n\n private startTaskCreate(\n event: PointerEvent,\n contentX: number,\n contentY: number,\n ) {\n const { runtime } = this.host;\n if (!runtime.layout) return false;\n const row = runtime.layout.rows.find(\n (item) =>\n contentY >= item.y && contentY < item.y + runtime.layout!.rowHeight,\n );\n const task = row?.tasks.find((item) => !hasTaskSchedule(item));\n if (!row || !task) return false;\n const range = resolveTaskCreateRange({\n anchorX: contentX,\n currentX: contentX,\n layout: runtime.layout,\n });\n task.start = new Date(range.start);\n task.end = new Date(range.end);\n runtime.selectedId = task.id;\n runtime.taskDrag = {\n task,\n mode: \"create\",\n startX: contentX,\n originalStart: range.start,\n originalEnd: range.end,\n };\n this.host.canvas.style.cursor = \"ew-resize\";\n this.host.canvas.setPointerCapture(event.pointerId);\n this.host.getOptions().onTaskClick?.(task);\n this.host.render();\n return true;\n }\n\n private startRowDrag(\n event: PointerEvent,\n pointerX: number,\n pointerY: number,\n ) {\n const { runtime } = this.host;\n if (\n this.host.getOptions().editable !== true ||\n this.host.getOptions().rowDraggable !== true ||\n !runtime.layout ||\n !runtime.viewport ||\n pointerX < 0 ||\n pointerX >= runtime.layout.taskColumnWidth ||\n pointerY < runtime.layout.headerHeight ||\n pointerY >= runtime.viewport.contentBottom\n ) {\n return false;\n }\n const contentY = pointerY + runtime.scroll.top;\n const row = runtime.layout.rows.find(\n (item) =>\n contentY >= item.y && contentY < item.y + runtime.layout!.rowHeight,\n );\n if (!row) return false;\n const multiTask = this.host.getOptions().multiTask === true;\n runtime.selectedId = multiTask ? null : row.task.id;\n runtime.rowDrag = {\n phase: \"potential\",\n pointerId: event.pointerId,\n taskId: row.task.id,\n fromIndex: row.index,\n targetIndex: row.index,\n startY: contentY,\n currentY: contentY,\n offsets: new Map(),\n };\n this.host.canvas.style.cursor = \"grab\";\n this.host.canvas.setPointerCapture(event.pointerId);\n if (!multiTask) this.host.getOptions().onTaskClick?.(row.task);\n this.host.render();\n return true;\n }\n\n private updateRowDrag(contentY: number) {\n const { runtime } = this.host;\n const drag = runtime.rowDrag;\n if (!drag || !runtime.layout) return;\n const deltaY = contentY - drag.startY;\n if (drag.phase === \"potential\") {\n if (Math.abs(deltaY) < 5) return;\n drag.phase = \"dragging\";\n this.host.canvas.style.cursor = \"grabbing\";\n }\n drag.currentY = contentY;\n drag.targetIndex = resolveRowDragTargetIndex({\n pointerDeltaY: deltaY,\n fromIndex: drag.fromIndex,\n rowHeight: runtime.layout.rowHeight,\n rowCount: runtime.layout.rows.length,\n });\n drag.offsets.set(drag.taskId, deltaY);\n this.host.scheduleRender();\n this.scheduleRowDragAnimation();\n }\n\n private finishRowDrag() {\n const drag = this.host.runtime.rowDrag;\n if (!drag) return;\n this.stopRowDragAnimation();\n if (drag.phase === \"dragging\" && drag.fromIndex !== drag.targetIndex) {\n const options = this.host.getOptions();\n const tasks = reorderGanttTasks(\n options.tasks,\n drag.fromIndex,\n drag.targetIndex,\n );\n options.tasks = tasks;\n options.onTaskReorder?.(tasks, drag.fromIndex, drag.targetIndex);\n }\n this.host.runtime.rowDrag = null;\n this.host.render();\n }\n\n private scheduleRowDragAnimation() {\n if (this.rowDragFrameId != null) return;\n this.rowDragFrameId = requestAnimationFrame(() => {\n this.rowDragFrameId = null;\n this.advanceRowDragAnimation();\n });\n }\n\n private advanceRowDragAnimation() {\n const { runtime } = this.host;\n const drag = runtime.rowDrag;\n if (!drag || drag.phase !== \"dragging\" || !runtime.layout) return;\n let done = true;\n runtime.layout.rows.forEach((row) => {\n if (row.task.id === drag.taskId) return;\n const target = resolveRowDragTargetOffset({\n rowIndex: row.index,\n fromIndex: drag.fromIndex,\n targetIndex: drag.targetIndex,\n rowHeight: runtime.layout!.rowHeight,\n });\n const current = drag.offsets.get(row.task.id) ?? 0;\n const next = current + (target - current) * 0.28;\n if (Math.abs(target - next) < 0.35) {\n drag.offsets.set(row.task.id, target);\n } else {\n drag.offsets.set(row.task.id, next);\n done = false;\n }\n });\n this.host.render();\n if (!done) this.scheduleRowDragAnimation();\n }\n\n private stopRowDragAnimation() {\n if (this.rowDragFrameId != null) cancelAnimationFrame(this.rowDragFrameId);\n this.rowDragFrameId = null;\n }\n\n private updateCursor(x: number, y: number) {\n const { runtime } = this.host;\n const scrollbarHit = hitTestGanttScrollbar(x, y, runtime.scrollbars);\n if (scrollbarHit) {\n this.host.canvas.style.cursor =\n scrollbarHit.role === \"thumb\" ? \"grab\" : \"pointer\";\n return;\n }\n if (this.isTaskColumnResizeHandle(x, y)) {\n this.host.canvas.style.cursor = \"col-resize\";\n return;\n }\n if (\n this.host.getOptions().editable === true &&\n this.host.getOptions().rowDraggable === true &&\n !!runtime.layout &&\n !!runtime.viewport &&\n x >= 0 &&\n x < runtime.layout.taskColumnWidth &&\n y >= runtime.layout.headerHeight &&\n y < runtime.viewport.contentBottom\n ) {\n this.host.canvas.style.cursor = \"grab\";\n return;\n }\n if (\n !runtime.layout ||\n !runtime.viewport ||\n x < runtime.layout.taskColumnWidth ||\n x >= runtime.viewport.contentRight ||\n y < runtime.layout.headerHeight ||\n y >= runtime.viewport.contentBottom\n ) {\n this.host.canvas.style.cursor = \"default\";\n return;\n }\n const hit = hitTestTaskBar({\n x: x + runtime.scroll.left,\n y: y + runtime.scroll.top,\n layout: runtime.layout,\n selectedId: runtime.selectedId,\n resizable:\n this.host.getOptions().editable === true &&\n this.host.getOptions().taskResizable !== false,\n });\n if (this.host.getOptions().editable === true) {\n const anchor = hitTestTaskDependencyAnchor({\n x: x + runtime.scroll.left,\n y: y + runtime.scroll.top,\n layout: runtime.layout,\n selectedTaskId: runtime.selectedId,\n });\n if (anchor) {\n this.host.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n if (hit) {\n this.host.canvas.style.cursor =\n this.host.getOptions().editable !== true\n ? \"pointer\"\n : hit.role === \"body\"\n ? \"grab\"\n : \"ew-resize\";\n return;\n }\n const dependencyHit = hitTestGanttDependency({\n x: x + runtime.scroll.left,\n y: y + runtime.scroll.top,\n layout: runtime.layout,\n dependencies: this.host.getOptions().dependencies ?? [],\n });\n if (dependencyHit) {\n this.host.canvas.style.cursor = \"pointer\";\n return;\n }\n const contentY = y + runtime.scroll.top;\n const row = runtime.layout.rows.find(\n (item) =>\n contentY >= item.y && contentY < item.y + runtime.layout!.rowHeight,\n );\n this.host.canvas.style.cursor =\n this.host.getOptions().editable === true &&\n !!row &&\n row.tasks.some((task) => !hasTaskSchedule(task))\n ? \"crosshair\"\n : \"default\";\n }\n\n private scrollAxisBy(axis: \"horizontal\" | \"vertical\", delta: number) {\n const current =\n axis === \"horizontal\"\n ? this.host.runtime.scroll.left\n : this.host.runtime.scroll.top;\n this.scrollAxisTo(axis, current + delta);\n }\n\n private isTaskColumnResizeHandle(x: number, y: number) {\n const { layout, viewport } = this.host.runtime;\n return (\n this.host.getOptions().taskColumnResizable !== false &&\n !!layout &&\n !!viewport &&\n y >= 0 &&\n y < viewport.contentBottom &&\n x >= layout.taskColumnWidth - 5 &&\n x <= layout.taskColumnWidth\n );\n }\n\n private scrollAxisTo(\n axis: \"horizontal\" | \"vertical\",\n value: number,\n scheduleRender = false,\n ) {\n if (scheduleRender) {\n const { runtime } = this.host;\n if (!runtime.viewport) return;\n const next = clampGanttScroll(\n axis === \"horizontal\"\n ? { left: value, top: runtime.scroll.top }\n : { left: runtime.scroll.left, top: value },\n runtime.viewport.bounds,\n );\n if (\n next.left === runtime.scroll.left &&\n next.top === runtime.scroll.top\n ) {\n return;\n }\n runtime.scroll = next;\n this.host.scheduleRender();\n return;\n }\n if (axis === \"horizontal\") {\n this.host.scrollTo(value, this.host.runtime.scroll.top);\n } else {\n this.host.scrollTo(this.host.runtime.scroll.left, value);\n }\n }\n\n private point(event: PointerEvent) {\n const rect = this.host.canvas.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n }\n}\n","import { dayMs } from \"./date\";\nimport {\n xForDate,\n type GanttHeaderLevelLayout,\n type GanttLayout,\n} from \"./layout\";\nimport type { GanttHeaderUnit } from \"../schema/options\";\n\nexport interface GanttTimelineHeaderCell {\n start: number;\n end: number;\n x: number;\n width: number;\n label: string;\n}\n\n/** 按指定时间单位构建一层连续的时间表头单元格。 */\nexport function buildTimelineHeaderCells(\n layout: GanttLayout,\n level: GanttHeaderLevelLayout,\n) {\n const cells: GanttTimelineHeaderCell[] = [];\n for (\n let start = layout.start;\n start < layout.end;\n start = resolveNextHeaderStart(start, level.unit)\n ) {\n const end = Math.min(resolveNextHeaderStart(start, level.unit), layout.end);\n cells.push({\n start,\n end,\n x: xForDate(start, layout),\n width: ((end - start) / dayMs) * layout.dayWidth,\n label:\n level.formatter?.(new Date(start), new Date(end)) ??\n formatHeaderLabel(start, end, level.unit),\n });\n }\n return cells;\n}\n\nfunction resolveNextHeaderStart(timestamp: number, unit: GanttHeaderUnit) {\n if (unit === \"day\") return timestamp + dayMs;\n if (unit === \"week\") {\n const date = new Date(timestamp);\n const daysUntilNextMonday = 7 - ((date.getDay() + 6) % 7);\n return timestamp + daysUntilNextMonday * dayMs;\n }\n const date = new Date(timestamp);\n if (unit === \"month\") {\n date.setMonth(date.getMonth() + 1, 1);\n } else if (unit === \"quarter\") {\n date.setMonth((Math.floor(date.getMonth() / 3) + 1) * 3, 1);\n } else {\n date.setFullYear(date.getFullYear() + 1, 0, 1);\n }\n return date.getTime();\n}\n\nfunction formatHeaderLabel(start: number, end: number, unit: GanttHeaderUnit) {\n const date = new Date(start);\n if (unit === \"year\") return `${date.getFullYear()}年`;\n if (unit === \"quarter\") {\n return `${date.getFullYear()} Q${Math.floor(date.getMonth() / 3) + 1}`;\n }\n if (unit === \"month\") {\n return new Intl.DateTimeFormat(\"zh-CN\", {\n year: \"numeric\",\n month: \"long\",\n }).format(date);\n }\n const short = (timestamp: number) =>\n new Intl.DateTimeFormat(\"zh-CN\", {\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(new Date(timestamp));\n if (unit === \"week\") return `${short(start)} - ${short(end - dayMs)}`;\n return short(start);\n}\n","import { resolveDependencyLayoutRoute } from \"../../domain/dependency-geometry\";\nimport type { GanttLayout } from \"../../domain/layout\";\nimport type { GanttDependency, GanttTheme } from \"../../schema/options\";\n\n/** 绘制任务依赖正交折线与箭头。 */\nexport function drawDependencies(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n dependencies: GanttDependency[],\n theme: GanttTheme,\n rowOffsets?: ReadonlyMap<string, number>,\n selectedIndex?: number | null,\n) {\n dependencies.forEach((dependency, index) => {\n const route = resolveDependencyLayoutRoute(dependency, layout, rowOffsets);\n if (!route) return;\n const color = dependency.color ?? theme.milestoneColor;\n context.strokeStyle = color;\n context.fillStyle = color;\n const [firstPoint, ...remainingPoints] = route.points;\n const lastPoint = route.points[route.points.length - 1];\n if (!firstPoint || !lastPoint) return;\n context.save();\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n const selected = selectedIndex === index;\n context.lineWidth = selected ? 2.5 : 1.5;\n if (selected) {\n context.shadowColor = theme.selectionColor;\n context.shadowBlur = 5;\n }\n context.beginPath();\n context.moveTo(firstPoint.x, firstPoint.y);\n remainingPoints.forEach((point) => context.lineTo(point.x, point.y));\n context.stroke();\n drawDependencyArrow(context, lastPoint, route.arrowDirection);\n context.restore();\n });\n}\n\nfunction drawDependencyArrow(\n context: CanvasRenderingContext2D,\n point: { x: number; y: number },\n direction: \"left\" | \"right\",\n) {\n const baseX = point.x + (direction === \"right\" ? -7 : 7);\n context.beginPath();\n context.moveTo(point.x, point.y);\n context.lineTo(baseX, point.y - 4.5);\n context.lineTo(baseX, point.y + 4.5);\n context.closePath();\n context.fill();\n}\n","import {\n resolveTaskDependencyAnchors,\n type GanttDependencyDragVisualState,\n} from \"../../domain/dependency-edit\";\nimport type { GanttLayout } from \"../../domain/layout\";\nimport { findGanttLayoutTask } from \"../../domain/task-rows\";\nimport type { GanttTheme } from \"../../schema/options\";\n\n/** 绘制任务依赖锚点与拖拽预览线。 */\nexport function drawDependencyEditor(params: {\n context: CanvasRenderingContext2D;\n layout: GanttLayout;\n selectedTaskId: string | null;\n drag: GanttDependencyDragVisualState | null;\n theme: GanttTheme;\n}) {\n const { context, layout, selectedTaskId, drag, theme } = params;\n const result = findGanttLayoutTask(layout, selectedTaskId);\n if (result) {\n const anchors = resolveTaskDependencyAnchors(\n result.task,\n result.row.y,\n layout,\n );\n anchors?.forEach((anchor) => {\n context.save();\n context.strokeStyle = theme.selectionColor;\n context.fillStyle = theme.backgroundColor;\n context.lineWidth = 1.5;\n context.beginPath();\n context.moveTo(\n anchor.side === \"start\" ? anchor.x + 4 : anchor.x - 4,\n anchor.y,\n );\n context.lineTo(\n anchor.side === \"start\" ? anchor.x + 10 : anchor.x - 10,\n anchor.y,\n );\n context.stroke();\n context.beginPath();\n context.arc(anchor.x, anchor.y, 4, 0, Math.PI * 2);\n context.fill();\n context.stroke();\n context.restore();\n });\n }\n if (!drag) return;\n\n context.save();\n context.strokeStyle = theme.milestoneColor;\n context.fillStyle = theme.milestoneColor;\n context.lineWidth = 1.5;\n context.setLineDash([5, 4]);\n const middleX = (drag.sourceX + drag.currentX) / 2;\n context.beginPath();\n context.moveTo(drag.sourceX, drag.sourceY);\n context.lineTo(middleX, drag.sourceY);\n context.lineTo(middleX, drag.currentY);\n context.lineTo(drag.currentX, drag.currentY);\n context.stroke();\n context.setLineDash([]);\n if (drag.targetTaskId && drag.targetSide) {\n context.beginPath();\n context.arc(drag.currentX, drag.currentY, 5, 0, Math.PI * 2);\n context.fill();\n }\n context.restore();\n}\n","import { dayMs } from \"./date\";\nimport { xForDate, type GanttLayout } from \"./layout\";\n\nexport interface GanttTimelineColumn {\n start: number;\n end: number;\n x: number;\n width: number;\n label: string;\n}\n\n/** 按日、周或月构建完整时间列。 */\nexport function buildTimelineColumns(\n layout: GanttLayout,\n): GanttTimelineColumn[] {\n const result: GanttTimelineColumn[] = [];\n for (\n let start = layout.start;\n start < layout.end;\n start = resolveNextColumnStart(start, layout.scale)\n ) {\n const end = Math.min(\n resolveNextColumnStart(start, layout.scale),\n layout.end,\n );\n const x = xForDate(start, layout);\n result.push({\n start,\n end,\n x,\n width: ((end - start) / dayMs) * layout.dayWidth,\n label: formatTimelineColumnLabel(start, end, layout.scale),\n });\n }\n return result;\n}\n\n/** 获取当前缩放级别下单列的大致天数,用于拖拽吸附。 */\nexport function resolveTimelineColumnDays(layout: GanttLayout) {\n return layout.scale === \"month\" ? 30 : layout.scale === \"week\" ? 7 : 1;\n}\n\nfunction resolveNextColumnStart(\n timestamp: number,\n scale: GanttLayout[\"scale\"],\n) {\n if (scale === \"day\") return timestamp + dayMs;\n if (scale === \"week\") return timestamp + 7 * dayMs;\n const date = new Date(timestamp);\n date.setMonth(date.getMonth() + 1, 1);\n return date.getTime();\n}\n\nfunction formatTimelineColumnLabel(\n start: number,\n end: number,\n scale: GanttLayout[\"scale\"],\n) {\n const short = (timestamp: number) =>\n new Intl.DateTimeFormat(\"zh-CN\", {\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(new Date(timestamp));\n if (scale === \"day\") return short(start);\n if (scale === \"week\") return `${short(start)} - ${short(end - dayMs)}`;\n return new Intl.DateTimeFormat(\"zh-CN\", {\n year: \"numeric\",\n month: \"long\",\n }).format(new Date(start));\n}\n","import { dayMs } from \"../../domain/date\";\nimport { xForDate, type GanttLayout } from \"../../domain/layout\";\nimport { buildTimelineColumns } from \"../../domain/timeline-columns\";\nimport type { GanttTheme } from \"../../schema/options\";\n\n/** 绘制时间轴表体的背景与单元格框线。 */\nexport function drawTimelineBodyGrid(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n showWeekendBackground = true,\n) {\n if (showWeekendBackground) {\n for (\n let timestamp = layout.start;\n timestamp < layout.end;\n timestamp += dayMs\n ) {\n const x = xForDate(timestamp, layout);\n const date = new Date(timestamp);\n if (date.getDay() === 0 || date.getDay() === 6) {\n context.fillStyle = theme.weekendBackgroundColor;\n context.fillRect(\n x,\n layout.headerHeight,\n layout.dayWidth,\n layout.totalHeight - layout.headerHeight,\n );\n }\n }\n }\n buildTimelineColumns(layout).forEach((column) =>\n drawVerticalLine(\n context,\n column.x,\n layout.headerHeight,\n layout.totalHeight,\n theme.borderColor,\n ),\n );\n drawVerticalLine(\n context,\n layout.totalWidth,\n layout.headerHeight,\n layout.totalHeight,\n theme.borderColor,\n );\n drawRowLines(\n context,\n layout,\n layout.taskColumnWidth,\n layout.totalWidth,\n theme,\n );\n}\n\n/** 绘制固定任务列的行框线。 */\nexport function drawTaskColumnGrid(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n) {\n drawRowLines(context, layout, 0, layout.taskColumnWidth, theme);\n}\n\nexport function drawVerticalLine(\n context: CanvasRenderingContext2D,\n x: number,\n top: number,\n bottom: number,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(Math.round(x) + 0.5, top);\n context.lineTo(Math.round(x) + 0.5, bottom);\n context.stroke();\n}\n\nexport function drawHorizontalLine(\n context: CanvasRenderingContext2D,\n y: number,\n left: number,\n right: number,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(left, Math.round(y) + 0.5);\n context.lineTo(right, Math.round(y) + 0.5);\n context.stroke();\n}\n\nfunction drawRowLines(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n left: number,\n right: number,\n theme: GanttTheme,\n) {\n layout.rows.forEach(({ y }) =>\n drawHorizontalLine(context, y, left, right, theme.borderColor),\n );\n drawHorizontalLine(\n context,\n layout.totalHeight,\n left,\n right,\n theme.borderColor,\n );\n}\n","import type {\n GanttAxisScrollbarLayout,\n GanttScrollbarLayout,\n GanttScrollbarRect,\n} from \"../../domain/scrollbar\";\nimport type { GanttViewportLayout } from \"../../domain/scroll\";\nimport type { GanttTheme } from \"../../schema/options\";\n\n/** 绘制占位式滚动条、分隔线和两端方向按钮。 */\nexport function drawGanttScrollbars(params: {\n context: CanvasRenderingContext2D;\n viewport: GanttViewportLayout;\n layout: GanttScrollbarLayout;\n theme: GanttTheme;\n headerHeight: number;\n}) {\n const { context, viewport, layout, theme, headerHeight } = params;\n context.save();\n\n if (viewport.hasHorizontalScrollbar) {\n context.fillStyle = theme.backgroundColor;\n context.fillRect(\n 0,\n viewport.contentBottom,\n viewport.width,\n viewport.height - viewport.contentBottom,\n );\n drawHorizontalLine(\n context,\n viewport.contentBottom,\n 0,\n viewport.width,\n theme.borderColor,\n );\n }\n if (viewport.hasVerticalScrollbar) {\n context.fillStyle = theme.headerBackgroundColor;\n context.fillRect(\n viewport.contentRight,\n 0,\n viewport.width - viewport.contentRight,\n headerHeight,\n );\n context.fillStyle = theme.backgroundColor;\n context.fillRect(\n viewport.contentRight,\n headerHeight,\n viewport.width - viewport.contentRight,\n viewport.contentBottom - headerHeight,\n );\n drawVerticalLine(\n context,\n viewport.contentRight,\n 0,\n viewport.height,\n theme.borderColor,\n );\n }\n if (layout.horizontal) {\n drawAxisScrollbar(context, layout.horizontal, \"horizontal\", theme);\n }\n if (layout.vertical) {\n drawAxisScrollbar(context, layout.vertical, \"vertical\", theme);\n }\n context.restore();\n}\n\nfunction drawAxisScrollbar(\n context: CanvasRenderingContext2D,\n layout: GanttAxisScrollbarLayout,\n axis: \"horizontal\" | \"vertical\",\n theme: GanttTheme,\n) {\n drawButton(context, layout.decreaseButton, axis, \"decrease\");\n drawButton(context, layout.increaseButton, axis, \"increase\");\n context.fillStyle = \"rgba(100, 116, 139, 0.8)\";\n context.beginPath();\n context.roundRect(\n layout.thumb.x,\n layout.thumb.y,\n layout.thumb.width,\n layout.thumb.height,\n Math.min(layout.thumb.width, layout.thumb.height) / 2,\n );\n context.fill();\n if (axis === \"horizontal\") {\n drawHorizontalLine(\n context,\n layout.track.y,\n layout.track.x,\n layout.track.x + layout.track.width,\n theme.borderColor,\n );\n } else {\n drawVerticalLine(\n context,\n layout.track.x,\n layout.track.y,\n layout.track.y + layout.track.height,\n theme.borderColor,\n );\n }\n}\n\nfunction drawButton(\n context: CanvasRenderingContext2D,\n rect: GanttScrollbarRect,\n axis: \"horizontal\" | \"vertical\",\n direction: \"decrease\" | \"increase\",\n) {\n context.save();\n context.fillStyle = \"rgba(71, 85, 105, 0.88)\";\n context.beginPath();\n const centerX = rect.x + rect.width / 2;\n const centerY = rect.y + rect.height / 2;\n const iconSize = Math.min(rect.width, rect.height) * 0.64;\n const directionOffset = iconSize * 0.4;\n const crossAxisOffset = iconSize / 2;\n if (axis === \"horizontal\") {\n const tipX =\n centerX + (direction === \"decrease\" ? -1 : 1) * directionOffset;\n const tailX =\n centerX + (direction === \"decrease\" ? 1 : -1) * directionOffset;\n context.moveTo(tipX, centerY);\n context.lineTo(tailX, centerY - crossAxisOffset);\n context.lineTo(tailX, centerY + crossAxisOffset);\n } else {\n const tipY =\n centerY + (direction === \"decrease\" ? -1 : 1) * directionOffset;\n const tailY =\n centerY + (direction === \"decrease\" ? 1 : -1) * directionOffset;\n context.moveTo(centerX, tipY);\n context.lineTo(centerX - crossAxisOffset, tailY);\n context.lineTo(centerX + crossAxisOffset, tailY);\n }\n context.closePath();\n context.fill();\n context.restore();\n}\n\nfunction drawHorizontalLine(\n context: CanvasRenderingContext2D,\n y: number,\n left: number,\n right: number,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(left, Math.round(y) + 0.5);\n context.lineTo(right, Math.round(y) + 0.5);\n context.stroke();\n}\n\nfunction drawVerticalLine(\n context: CanvasRenderingContext2D,\n x: number,\n top: number,\n bottom: number,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(Math.round(x) + 0.5, top);\n context.lineTo(Math.round(x) + 0.5, bottom);\n context.stroke();\n}\n","import type { GanttTaskStyle, GanttTaskRenderResult } from \"../schema/options\";\n\n/** 解析任务条文字样式。 */\nexport function resolveGanttTaskContentStyle(\n style: GanttTaskStyle | undefined,\n fallback: Required<GanttTaskStyle>,\n): Required<GanttTaskStyle> {\n return {\n color: style?.color ?? fallback.color,\n fontSize: style?.fontSize ?? fallback.fontSize,\n fontWeight: style?.fontWeight ?? fallback.fontWeight,\n fontFamily: style?.fontFamily ?? fallback.fontFamily,\n textAlign: style?.textAlign ?? fallback.textAlign,\n };\n}\n\n/** 将任务条 render 返回值归一化为可绘制文本。 */\nexport function normalizeGanttTaskContent(\n result: GanttTaskRenderResult,\n): string | null {\n return result == null ? null : String(result);\n}\n\n/** 在指定像素宽度内截断文本并添加省略号。 */\nexport function ellipsizeGanttTaskText(\n context: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n) {\n if (maxWidth <= 0) return \"\";\n if (context.measureText(text).width <= maxWidth) return text;\n const ellipsis = \"…\";\n if (context.measureText(ellipsis).width > maxWidth) return \"\";\n let left = 0;\n let right = text.length;\n while (left < right) {\n const middle = Math.ceil((left + right) / 2);\n if (\n context.measureText(`${text.slice(0, middle)}${ellipsis}`).width <=\n maxWidth\n ) {\n left = middle;\n } else {\n right = middle - 1;\n }\n }\n return `${text.slice(0, left)}${ellipsis}`;\n}\n","import type { GanttLayout } from \"../../domain/layout\";\nimport {\n hasTaskSchedule,\n resolveTaskBarRect,\n} from \"../../domain/task-geometry\";\nimport {\n ellipsizeGanttTaskText,\n normalizeGanttTaskContent,\n resolveGanttTaskContentStyle,\n} from \"../../domain/task-content\";\nimport type { GanttTaskStyle, GanttTheme } from \"../../schema/options\";\n\nconst HANDLE_WIDTH = 6;\n\n/** 绘制任务条、进度和选中缩放手柄。 */\nexport function drawTaskBars(params: {\n context: CanvasRenderingContext2D;\n layout: GanttLayout;\n selectedId: string | null;\n theme: GanttTheme;\n resizable: boolean;\n rowOffsets?: ReadonlyMap<string, number>;\n draggedRowId?: string;\n}) {\n const { context, layout, selectedId, theme, resizable } = params;\n layout.rows.forEach((row) => {\n const isDragging = row.task.id === params.draggedRowId;\n const visualY = row.y + (params.rowOffsets?.get(row.task.id) ?? 0);\n row.tasks.forEach((task) => {\n if (!hasTaskSchedule(task)) return;\n const rect = resolveTaskBarRect(task, visualY, layout);\n if (isDragging) {\n context.save();\n context.globalAlpha = 0.82;\n context.shadowColor = \"rgba(31, 35, 41, 0.2)\";\n context.shadowBlur = 8;\n context.shadowOffsetY = 3;\n }\n context.fillStyle = task.color ?? theme.taskColor;\n context.beginPath();\n context.roundRect(rect.x, rect.y, rect.width, rect.height, 4);\n context.fill();\n if ((task.progress ?? 0) > 0) {\n context.fillStyle = task.progressColor ?? theme.taskProgressColor;\n context.beginPath();\n context.roundRect(\n rect.x,\n rect.y,\n (rect.width * Math.min(100, Math.max(0, task.progress ?? 0))) / 100,\n rect.height,\n 4,\n );\n context.fill();\n }\n const content = task.render\n ? normalizeGanttTaskContent(task.render(task, row.index))\n : null;\n if (content != null) {\n drawTaskBarContent(context, rect, content, task.style, theme);\n }\n if (isDragging) context.restore();\n if (selectedId !== task.id) return;\n context.strokeStyle = theme.selectionColor;\n context.lineWidth = 2;\n context.strokeRect(\n rect.x - 1,\n rect.y - 1,\n rect.width + 2,\n rect.height + 2,\n );\n context.lineWidth = 1;\n if (!resizable) return;\n drawResizeHandle(context, rect.x, rect.y, rect.height, theme);\n drawResizeHandle(\n context,\n rect.x + rect.width,\n rect.y,\n rect.height,\n theme,\n );\n });\n });\n}\n\nfunction drawTaskBarContent(\n context: CanvasRenderingContext2D,\n rect: { x: number; y: number; width: number; height: number },\n content: string,\n taskStyle: GanttTaskStyle | undefined,\n theme: GanttTheme,\n) {\n if (!content || rect.width <= 0) return;\n const horizontalPadding = 8;\n const contentWidth = Math.max(rect.width - horizontalPadding * 2, 0);\n if (contentWidth <= 0) return;\n\n context.save();\n context.beginPath();\n context.roundRect(rect.x, rect.y, rect.width, rect.height, 4);\n context.clip();\n context.textBaseline = \"middle\";\n\n const style = resolveGanttTaskContentStyle(taskStyle, {\n color: theme.backgroundColor,\n fontSize: Math.min(theme.fontSize, rect.height - 6),\n fontWeight: 500,\n fontFamily: theme.fontFamily,\n textAlign: \"left\",\n });\n context.font = `${style.fontWeight} ${style.fontSize}px ${style.fontFamily}`;\n context.fillStyle = style.color;\n context.textAlign = style.textAlign;\n const x =\n style.textAlign === \"center\"\n ? rect.x + rect.width / 2\n : style.textAlign === \"right\"\n ? rect.x + rect.width - horizontalPadding\n : rect.x + horizontalPadding;\n context.fillText(\n ellipsizeGanttTaskText(context, content, contentWidth),\n x,\n rect.y + rect.height / 2,\n );\n context.restore();\n}\n\nfunction drawResizeHandle(\n context: CanvasRenderingContext2D,\n centerX: number,\n y: number,\n height: number,\n theme: GanttTheme,\n) {\n const handleHeight = Math.max(Math.min(height - 4, 18), 8);\n const handleY = y + (height - handleHeight) / 2;\n context.fillStyle = theme.backgroundColor;\n context.strokeStyle = theme.selectionColor;\n context.lineWidth = 1;\n context.beginPath();\n context.roundRect(\n centerX - HANDLE_WIDTH / 2,\n handleY,\n HANDLE_WIDTH,\n handleHeight,\n 2,\n );\n context.fill();\n context.stroke();\n}\n","import type { GanttLayout } from \"../domain/layout\";\nimport type { GanttDependencyDragVisualState } from \"../domain/dependency-edit\";\nimport type { GanttRowDragVisualState } from \"../domain/row-drag\";\nimport { buildTimelineHeaderCells } from \"../domain/timeline-headers\";\nimport type { GanttScrollbarLayout } from \"../domain/scrollbar\";\nimport {\n resolveGanttViewportLayout,\n type GanttScrollState,\n type GanttViewportLayout,\n} from \"../domain/scroll\";\nimport type { GanttDependency, GanttTheme } from \"../schema/options\";\nimport { drawDependencies } from \"./primitives/dependencies\";\nimport { drawDependencyEditor } from \"./primitives/dependency-editor\";\nimport {\n drawHorizontalLine,\n drawTaskColumnGrid,\n drawTimelineBodyGrid,\n drawVerticalLine,\n} from \"./primitives/grid\";\nimport { drawGanttScrollbars } from \"./primitives/scrollbars\";\nimport { drawTaskBars } from \"./primitives/task-bars\";\n\nexport interface RenderGanttViewport {\n viewport: GanttViewportLayout;\n scroll: GanttScrollState;\n scrollbars?: GanttScrollbarLayout;\n taskColumnTitle?: string;\n taskResizable?: boolean;\n weekendBackground?: boolean;\n rowDrag?: GanttRowDragVisualState | null;\n selectedDependencyIndex?: number | null;\n dependencyDrag?: GanttDependencyDragVisualState | null;\n dependencyEditable?: boolean;\n}\n\n/** 按表体、固定列、固定表头和滚动条分层绘制甘特图。 */\nexport function renderGantt(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n dependencies: GanttDependency[],\n selectedId: string | null,\n theme: GanttTheme,\n renderViewport?: RenderGanttViewport,\n) {\n const viewport =\n renderViewport?.viewport ??\n resolveGanttViewportLayout(\n layout,\n context.canvas.clientWidth || context.canvas.width,\n context.canvas.clientHeight || context.canvas.height,\n );\n const scroll = renderViewport?.scroll ?? { left: 0, top: 0 };\n context.clearRect(0, 0, viewport.width, viewport.height);\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, viewport.width, viewport.height);\n context.font = `${theme.fontSize}px ${theme.fontFamily}`;\n context.textBaseline = \"middle\";\n\n drawTimelineBody({\n context,\n layout,\n dependencies,\n selectedId,\n theme,\n viewport,\n scroll,\n taskResizable: renderViewport?.taskResizable !== false,\n weekendBackground: renderViewport?.weekendBackground !== false,\n rowDrag: renderViewport?.rowDrag,\n selectedDependencyIndex: renderViewport?.selectedDependencyIndex,\n dependencyDrag: renderViewport?.dependencyDrag,\n dependencyEditable: renderViewport?.dependencyEditable === true,\n });\n drawTaskColumnBody(\n context,\n layout,\n theme,\n viewport,\n scroll.top,\n renderViewport?.rowDrag,\n );\n drawRowDragInsertionIndicator(\n context,\n layout,\n viewport,\n scroll.top,\n renderViewport?.rowDrag,\n );\n drawTimelineHeader(context, layout, theme, viewport, scroll.left);\n drawCornerHeader(\n context,\n layout,\n theme,\n renderViewport?.taskColumnTitle ?? \"任务\",\n );\n drawGanttScrollbars({\n context,\n viewport,\n layout: renderViewport?.scrollbars ?? {},\n theme,\n headerHeight: layout.headerHeight,\n });\n drawFixedBoundaries(context, layout, theme, viewport);\n}\n\nfunction drawTimelineBody(params: {\n context: CanvasRenderingContext2D;\n layout: GanttLayout;\n dependencies: GanttDependency[];\n selectedId: string | null;\n theme: GanttTheme;\n viewport: GanttViewportLayout;\n scroll: GanttScrollState;\n taskResizable: boolean;\n weekendBackground: boolean;\n rowDrag?: GanttRowDragVisualState | null;\n selectedDependencyIndex?: number | null;\n dependencyDrag?: GanttDependencyDragVisualState | null;\n dependencyEditable: boolean;\n}) {\n const { context, layout, theme, viewport, scroll } = params;\n context.save();\n context.beginPath();\n context.rect(\n layout.taskColumnWidth,\n layout.headerHeight,\n viewport.timelineViewportWidth,\n viewport.bodyViewportHeight,\n );\n context.clip();\n context.translate(-scroll.left, -scroll.top);\n drawTimelineBodyGrid(context, layout, theme, params.weekendBackground);\n drawTaskBars({\n context,\n layout,\n selectedId: params.selectedId,\n theme,\n resizable: params.taskResizable,\n rowOffsets: params.rowDrag?.offsets,\n draggedRowId:\n params.rowDrag?.phase === \"dragging\" ? params.rowDrag.taskId : undefined,\n });\n drawDependencies(\n context,\n layout,\n params.dependencies,\n theme,\n params.rowDrag?.offsets,\n params.selectedDependencyIndex,\n );\n if (params.dependencyEditable) {\n drawDependencyEditor({\n context,\n layout,\n selectedTaskId: params.selectedId,\n drag: params.dependencyDrag ?? null,\n theme,\n });\n }\n context.restore();\n}\n\nfunction drawTaskColumnBody(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n viewport: GanttViewportLayout,\n scrollTop: number,\n rowDrag?: GanttRowDragVisualState | null,\n) {\n context.save();\n context.beginPath();\n context.rect(\n 0,\n layout.headerHeight,\n layout.taskColumnWidth,\n viewport.bodyViewportHeight,\n );\n context.clip();\n context.fillStyle = theme.backgroundColor;\n context.fillRect(\n 0,\n layout.headerHeight,\n layout.taskColumnWidth,\n viewport.bodyViewportHeight,\n );\n context.translate(0, -scrollTop);\n drawTaskColumnGrid(context, layout, theme);\n layout.rows.forEach(({ task, y }) => {\n const visualY = y + (rowDrag?.offsets.get(task.id) ?? 0);\n const isDragging =\n rowDrag?.phase === \"dragging\" && rowDrag.taskId === task.id;\n if (isDragging) {\n context.save();\n context.globalAlpha = 0.94;\n context.shadowColor = \"rgba(31, 35, 41, 0.16)\";\n context.shadowBlur = 8;\n context.shadowOffsetY = 3;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, visualY, layout.taskColumnWidth, layout.rowHeight);\n context.restore();\n }\n context.fillStyle = theme.textColor;\n context.fillText(task.title, 16, visualY + layout.rowHeight / 2);\n });\n context.restore();\n}\n\nfunction drawRowDragInsertionIndicator(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n viewport: GanttViewportLayout,\n scrollTop: number,\n rowDrag?: GanttRowDragVisualState | null,\n) {\n if (!rowDrag || rowDrag.phase !== \"dragging\") return;\n const y =\n layout.headerHeight + rowDrag.targetIndex * layout.rowHeight - scrollTop;\n if (y < layout.headerHeight || y > viewport.contentBottom) return;\n context.save();\n context.strokeStyle = \"#1677ff\";\n context.fillStyle = \"#1677ff\";\n context.lineWidth = 2;\n context.beginPath();\n context.moveTo(0, Math.round(y) + 0.5);\n context.lineTo(viewport.contentRight, Math.round(y) + 0.5);\n context.stroke();\n context.beginPath();\n context.arc(5, Math.round(y) + 0.5, 4, 0, Math.PI * 2);\n context.fill();\n context.restore();\n}\n\nfunction drawTimelineHeader(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n viewport: GanttViewportLayout,\n scrollLeft: number,\n) {\n context.save();\n context.beginPath();\n context.rect(\n layout.taskColumnWidth,\n 0,\n viewport.timelineViewportWidth,\n layout.headerHeight,\n );\n context.clip();\n context.fillStyle = theme.headerBackgroundColor;\n context.fillRect(\n layout.taskColumnWidth,\n 0,\n viewport.timelineViewportWidth,\n layout.headerHeight,\n );\n context.translate(-scrollLeft, 0);\n context.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n const visibleLeft = layout.taskColumnWidth + scrollLeft;\n const visibleRight = visibleLeft + viewport.timelineViewportWidth;\n context.textAlign = \"center\";\n layout.headerLevels.forEach((level) => {\n buildTimelineHeaderCells(layout, level).forEach((cell) => {\n drawVerticalLine(\n context,\n cell.x,\n level.y,\n level.y + level.height,\n theme.borderColor,\n );\n const cellRight = cell.x + cell.width;\n const clippedLeft = Math.max(cell.x, visibleLeft);\n const clippedRight = Math.min(cellRight, visibleRight);\n if (clippedRight <= clippedLeft) return;\n const availableWidth = clippedRight - clippedLeft - 16;\n if (availableWidth < 24) return;\n context.fillStyle = theme.mutedTextColor;\n context.fillText(\n cell.label,\n (clippedLeft + clippedRight) / 2,\n level.y + level.height / 2,\n availableWidth,\n );\n });\n drawVerticalLine(\n context,\n layout.totalWidth,\n level.y,\n level.y + level.height,\n theme.borderColor,\n );\n drawHorizontalLine(\n context,\n level.y + level.height,\n layout.taskColumnWidth,\n layout.totalWidth,\n theme.borderColor,\n );\n });\n context.textAlign = \"left\";\n context.restore();\n}\n\nfunction drawCornerHeader(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n title: string,\n) {\n context.fillStyle = theme.headerBackgroundColor;\n context.fillRect(0, 0, layout.taskColumnWidth, layout.headerHeight);\n context.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n context.fillStyle = theme.textColor;\n context.fillText(title, 16, layout.headerHeight / 2);\n}\n\nfunction drawFixedBoundaries(\n context: CanvasRenderingContext2D,\n layout: GanttLayout,\n theme: GanttTheme,\n viewport: GanttViewportLayout,\n) {\n drawVerticalLine(\n context,\n layout.taskColumnWidth,\n 0,\n viewport.contentBottom,\n theme.borderColor,\n );\n drawHorizontalLine(\n context,\n layout.headerHeight,\n 0,\n viewport.contentRight,\n theme.borderColor,\n );\n}\n","/** 甘特图缩放级别。 */\nexport type GanttScale = \"day\" | \"week\" | \"month\";\n\n/** 时间轴多层表头的时间单位。 */\nexport type GanttHeaderUnit = \"year\" | \"quarter\" | \"month\" | \"week\" | \"day\";\n\n/** 时间轴单层表头配置。 */\nexport interface GanttHeaderLevel {\n unit: GanttHeaderUnit;\n /** 当前层高度;未配置时使用 headerHeight。 */\n height?: number;\n /** 自定义当前分组的显示文本。 */\n formatter?: (start: Date, end: Date) => string;\n}\n\n/** 甘特任务定义。 */\nexport interface GanttTask {\n id: string;\n title: string;\n /** 多任务行模式下,同一行内的任务条。 */\n tasks?: GanttTask[];\n /** 任务开始时间;与 end 同时存在时绘制行内进度条。 */\n start?: Date | string | number;\n /** 任务结束时间;与 start 同时存在时绘制行内进度条。 */\n end?: Date | string | number;\n progress?: number;\n color?: string;\n /** 当前任务已完成进度的颜色,未配置时使用主题色。 */\n progressColor?: string;\n /** 自定义任务条内部内容。 */\n render?: GanttTaskRender;\n /** 自定义任务条内部文字样式。 */\n style?: GanttTaskStyle;\n parentId?: string;\n collapsed?: boolean;\n}\n\n/** 任务条内文字内容的样式。 */\nexport interface GanttTaskStyle {\n color?: string;\n fontSize?: number;\n fontWeight?: string | number;\n fontFamily?: string;\n textAlign?: \"left\" | \"center\" | \"right\";\n}\n\n/** 任务条自定义内容渲染结果。 */\nexport type GanttTaskRenderResult = string | number | null | undefined;\n\n/** 任务条自定义内容渲染函数。 */\nexport type GanttTaskRender = (\n task: GanttTask,\n rowIndex: number,\n) => GanttTaskRenderResult;\n\n/** 任务依赖定义。 */\nexport interface GanttDependency {\n from: string;\n to: string;\n type?: \"finish-to-start\" | \"start-to-start\" | \"finish-to-finish\";\n /** 当前依赖连线颜色,未配置时使用主题色。 */\n color?: string;\n}\n\n/** 甘特图主题。 */\nexport interface GanttTheme {\n backgroundColor: string;\n borderColor: string;\n textColor: string;\n mutedTextColor: string;\n headerBackgroundColor: string;\n weekendBackgroundColor: string;\n gridColor: string;\n taskColor: string;\n taskProgressColor: string;\n milestoneColor: string;\n selectionColor: string;\n fontFamily: string;\n fontSize: number;\n}\n\n/** 甘特图配置。 */\nexport interface GanttOptions {\n tasks: GanttTask[];\n dependencies?: GanttDependency[];\n startDate?: Date | string | number;\n endDate?: Date | string | number;\n scale?: GanttScale;\n rowHeight?: number;\n /** 单层表头高度。@default 56 */\n headerHeight?: number;\n /** 时间轴表头层级,由上至下配置;默认仅显示当前 scale 对应层级。 */\n headerLevels?: GanttHeaderLevel[];\n taskColumnWidth?: number;\n /** 固定任务列的表头文案。@default \"任务\" */\n taskColumnTitle?: string;\n /** 是否允许拖拽调整固定任务列宽度。@default true */\n taskColumnResizable?: boolean;\n /** 固定任务列最小宽度。@default 120 */\n taskColumnMinWidth?: number;\n /** 固定任务列最大宽度。@default 480 */\n taskColumnMaxWidth?: number;\n /** 是否开启任务条编辑模式。@default false */\n editable?: boolean;\n /** 编辑模式下是否允许拖拽任务条两端调整日期范围。@default true */\n taskResizable?: boolean;\n /** 拖拽移动或缩放任务条时,是否吸附到最小日维度。@default false */\n snapToColumn?: boolean;\n /** 是否显示周末背景色。@default true */\n weekendBackground?: boolean;\n /** 是否允许在固定任务列中拖拽调整任务行顺序。@default false */\n rowDraggable?: boolean;\n /** 是否开启一行多个任务条模式。@default false */\n multiTask?: boolean;\n theme?: Partial<GanttTheme>;\n onTaskClick?: (task: GanttTask) => void;\n /** 任务条新增、移动、缩放或删除完成时触发。 */\n onTaskChange?: (task: GanttTask) => void;\n /** 点击依赖连线时触发。 */\n onDependencyClick?: (dependency: GanttDependency, index: number) => void;\n /** 依赖连线新增、修改或删除完成时触发。 */\n onDependenciesChange?: (dependencies: GanttDependency[]) => void;\n onTaskColumnResize?: (width: number) => void;\n /** 任务行顺序发生变化时触发。 */\n onTaskReorder?: (\n tasks: GanttTask[],\n fromIndex: number,\n targetIndex: number,\n ) => void;\n}\n\nexport const defaultGanttTheme: GanttTheme = {\n backgroundColor: \"#ffffff\",\n borderColor: \"#d9e1ec\",\n textColor: \"#1f2329\",\n mutedTextColor: \"#7a8798\",\n headerBackgroundColor: \"#f5f8fc\",\n weekendBackgroundColor: \"#fafafa\",\n gridColor: \"#e7edf5\",\n taskColor: \"#1677ff\",\n taskProgressColor: \"#0958d9\",\n milestoneColor: \"#722ed1\",\n selectionColor: \"#91caff\",\n fontFamily: '\"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n fontSize: 14,\n};\n","import {\n buildGanttLayout,\n fitGanttLayoutToTimelineWidth,\n} from \"../domain/layout\";\nimport { clampGanttScroll, resolveGanttViewportLayout } from \"../domain/scroll\";\nimport { computeGanttScrollbarLayout } from \"../domain/scrollbar\";\nimport { renderGantt } from \"../rendering/canvas-renderer\";\nimport { defaultGanttTheme, type GanttOptions } from \"../schema/options\";\nimport type { GanttRuntime } from \"./runtime\";\n\n/** 计算当前布局并发布一帧甘特图渲染。 */\nexport function renderGanttFrame(params: {\n container: HTMLElement;\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n options: GanttOptions;\n runtime: GanttRuntime;\n}) {\n const { container, canvas, context, options, runtime } = params;\n const theme = { ...defaultGanttTheme, ...options.theme };\n container.style.boxSizing = \"border-box\";\n container.style.border = `1px solid ${theme.borderColor}`;\n container.style.borderRadius = \"8px\";\n const width = container.clientWidth || options.taskColumnWidth || 800;\n const height = container.clientHeight || 480;\n const ratio = window.devicePixelRatio || 1;\n const resolvedOptions =\n runtime.taskColumnWidth == null\n ? options\n : { ...options, taskColumnWidth: runtime.taskColumnWidth };\n let layout = buildGanttLayout(resolvedOptions, width);\n let viewport = resolveGanttViewportLayout(layout, width, height);\n layout = fitGanttLayoutToTimelineWidth(\n layout,\n viewport.timelineViewportWidth,\n );\n viewport = resolveGanttViewportLayout(layout, width, height);\n const scroll = clampGanttScroll(runtime.scroll, viewport.bounds);\n const scrollbars = computeGanttScrollbarLayout({ layout, viewport, scroll });\n\n runtime.layout = layout;\n runtime.viewport = viewport;\n runtime.scroll = scroll;\n runtime.scrollbars = scrollbars;\n const pixelWidth = Math.max(Math.round(width * ratio), 1);\n const pixelHeight = Math.max(Math.round(height * ratio), 1);\n if (canvas.width !== pixelWidth) canvas.width = pixelWidth;\n if (canvas.height !== pixelHeight) canvas.height = pixelHeight;\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (canvas.style.width !== cssWidth) canvas.style.width = cssWidth;\n if (canvas.style.height !== cssHeight) canvas.style.height = cssHeight;\n context.setTransform(ratio, 0, 0, ratio, 0, 0);\n renderGantt(\n context,\n layout,\n resolvedOptions.dependencies ?? [],\n runtime.selectedId,\n { ...defaultGanttTheme, ...resolvedOptions.theme },\n {\n viewport,\n scroll,\n scrollbars,\n taskColumnTitle: resolvedOptions.taskColumnTitle,\n taskResizable:\n resolvedOptions.editable === true &&\n resolvedOptions.taskResizable !== false,\n weekendBackground: resolvedOptions.weekendBackground !== false,\n rowDrag: runtime.rowDrag,\n selectedDependencyIndex: runtime.selectedDependencyIndex,\n dependencyDrag: runtime.dependencyDrag,\n dependencyEditable: resolvedOptions.editable === true,\n },\n );\n}\n","import type { GanttLayout } from \"../domain/layout\";\nimport type { GanttRowDragVisualState } from \"../domain/row-drag\";\nimport type { GanttDependencyDragVisualState } from \"../domain/dependency-edit\";\nimport type { GanttScrollbarLayout } from \"../domain/scrollbar\";\nimport type { GanttScrollState, GanttViewportLayout } from \"../domain/scroll\";\nimport type { GanttTask, GanttOptions } from \"../schema/options\";\n\nexport interface GanttTaskDragState {\n task: GanttTask;\n mode: \"create\" | \"move\" | \"resize-start\" | \"resize-end\";\n startX: number;\n originalStart: number;\n originalEnd: number;\n}\n\nexport interface GanttScrollbarDragState {\n axis: \"horizontal\" | \"vertical\";\n pointerOffset: number;\n trackStart: number;\n trackLength: number;\n thumbLength: number;\n maxScroll: number;\n}\n\nexport interface GanttColumnResizeState {\n startX: number;\n startWidth: number;\n minWidth: number;\n maxWidth: number;\n}\n\nexport interface GanttRowDragState extends GanttRowDragVisualState {\n pointerId: number;\n startY: number;\n currentY: number;\n offsets: Map<string, number>;\n}\n\nexport interface GanttRuntime {\n layout: GanttLayout | null;\n viewport: GanttViewportLayout | null;\n scrollbars: GanttScrollbarLayout;\n scroll: GanttScrollState;\n selectedId: string | null;\n selectedDependencyIndex: number | null;\n dependencyDrag: GanttDependencyDragVisualState | null;\n taskDrag: GanttTaskDragState | null;\n scrollbarDrag: GanttScrollbarDragState | null;\n columnResize: GanttColumnResizeState | null;\n taskColumnWidth: number | null;\n wheelScrollTarget: GanttScrollState | null;\n wheelScrollFrameId: number | null;\n wheelScrollLastTime: number;\n rowDrag: GanttRowDragState | null;\n}\n\nexport interface GanttEventHost {\n canvas: HTMLCanvasElement;\n runtime: GanttRuntime;\n getOptions: () => GanttOptions;\n render: () => void;\n scheduleRender: () => void;\n scrollTo: (left: number, top?: number) => void;\n}\n\n/** 创建甘特图运行时状态。 */\nexport function createGanttRuntime(): GanttRuntime {\n return {\n layout: null,\n viewport: null,\n scrollbars: {},\n scroll: { left: 0, top: 0 },\n selectedId: null,\n selectedDependencyIndex: null,\n dependencyDrag: null,\n taskDrag: null,\n scrollbarDrag: null,\n columnResize: null,\n taskColumnWidth: null,\n wheelScrollTarget: null,\n wheelScrollFrameId: null,\n wheelScrollLastTime: 0,\n rowDrag: null,\n };\n}\n","import { clampGanttScroll } from \"./domain/scroll\";\nimport { GanttEventController } from \"./engine/event-controller\";\nimport { renderGanttFrame } from \"./engine/render-service\";\nimport { createGanttRuntime } from \"./engine/runtime\";\nimport { findGanttTaskById } from \"./domain/task-rows\";\nimport type { GanttOptions } from \"./schema/options\";\n\n/** 原生 Canvas 甘特图实例。 */\nexport class Gantt {\n private readonly canvas: HTMLCanvasElement;\n private readonly context: CanvasRenderingContext2D;\n private readonly runtime = createGanttRuntime();\n private readonly eventController: GanttEventController;\n private options: GanttOptions;\n private resizeObserver: ResizeObserver | null = null;\n private renderFrameId: number | null = null;\n\n constructor(\n private readonly container: HTMLElement,\n options: GanttOptions,\n ) {\n const context = document.createElement(\"canvas\").getContext(\"2d\");\n if (!context) {\n throw new Error(\n \"Canvas 2D context is not supported in the current environment.\",\n );\n }\n this.canvas = context.canvas;\n this.context = context;\n this.options = options;\n this.canvas.style.display = \"block\";\n this.canvas.style.touchAction = \"none\";\n this.canvas.style.outline = \"none\";\n this.canvas.tabIndex = 0;\n this.container.style.overflow = \"hidden\";\n this.container.style.borderRadius = \"8px\";\n this.eventController = new GanttEventController({\n canvas: this.canvas,\n runtime: this.runtime,\n getOptions: () => this.options,\n render: () => this.render(),\n scheduleRender: () => this.scheduleRender(),\n scrollTo: (left, top) => this.scrollTo(left, top),\n });\n }\n\n /** 挂载并开始渲染。 */\n mount() {\n if (!this.canvas.parentElement) this.container.appendChild(this.canvas);\n this.canvas.addEventListener(\n \"pointerdown\",\n this.eventController.handlePointerDown,\n );\n this.canvas.addEventListener(\n \"pointermove\",\n this.eventController.handlePointerMove,\n );\n this.canvas.addEventListener(\n \"pointerup\",\n this.eventController.handlePointerUp,\n );\n this.canvas.addEventListener(\n \"pointercancel\",\n this.eventController.handlePointerUp,\n );\n this.canvas.addEventListener(\n \"pointerleave\",\n this.eventController.handlePointerLeave,\n );\n this.canvas.addEventListener(\"wheel\", this.eventController.handleWheel, {\n passive: false,\n });\n this.canvas.addEventListener(\"keydown\", this.eventController.handleKeyDown);\n this.resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(() => this.render());\n this.resizeObserver?.observe(this.container);\n this.render();\n }\n\n /** 更新配置并重绘。 */\n updateOptions(options: GanttOptions) {\n this.eventController.stopWheelScroll();\n if (options.scale !== this.options.scale) {\n this.runtime.scroll.left = 0;\n }\n if (options.taskColumnWidth !== this.options.taskColumnWidth) {\n this.runtime.taskColumnWidth = null;\n }\n this.options = options;\n if (\n this.runtime.selectedDependencyIndex != null &&\n this.runtime.selectedDependencyIndex >=\n (options.dependencies?.length ?? 0)\n ) {\n this.runtime.selectedDependencyIndex = null;\n }\n this.render();\n }\n\n /** 获取当前选中任务。 */\n getSelectedTask() {\n return findGanttTaskById(this.options.tasks, this.runtime.selectedId);\n }\n\n /** 获取当前选中的依赖连线。 */\n getSelectedDependency() {\n return this.runtime.selectedDependencyIndex == null\n ? null\n : (this.options.dependencies?.[this.runtime.selectedDependencyIndex] ??\n null);\n }\n\n /** 滚动到指定位置,超出内容范围的坐标会被自动约束。 */\n scrollTo(left: number, top = this.runtime.scroll.top) {\n this.eventController.stopWheelScroll();\n const viewport = this.runtime.viewport;\n if (!viewport) return;\n this.runtime.scroll = clampGanttScroll({ left, top }, viewport.bounds);\n this.render();\n }\n\n /** 销毁实例。 */\n destroy() {\n this.eventController.destroy();\n if (this.renderFrameId != null) {\n cancelAnimationFrame(this.renderFrameId);\n this.renderFrameId = null;\n }\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.canvas.removeEventListener(\n \"pointerdown\",\n this.eventController.handlePointerDown,\n );\n this.canvas.removeEventListener(\n \"pointermove\",\n this.eventController.handlePointerMove,\n );\n this.canvas.removeEventListener(\n \"pointerup\",\n this.eventController.handlePointerUp,\n );\n this.canvas.removeEventListener(\n \"pointercancel\",\n this.eventController.handlePointerUp,\n );\n this.canvas.removeEventListener(\n \"pointerleave\",\n this.eventController.handlePointerLeave,\n );\n this.canvas.removeEventListener(\"wheel\", this.eventController.handleWheel);\n this.canvas.removeEventListener(\n \"keydown\",\n this.eventController.handleKeyDown,\n );\n this.canvas.remove();\n }\n\n private render() {\n if (this.renderFrameId != null) {\n cancelAnimationFrame(this.renderFrameId);\n this.renderFrameId = null;\n }\n renderGanttFrame({\n container: this.container,\n canvas: this.canvas,\n context: this.context,\n options: this.options,\n runtime: this.runtime,\n });\n }\n\n private scheduleRender() {\n if (this.renderFrameId != null) return;\n this.renderFrameId = requestAnimationFrame(() => {\n this.renderFrameId = null;\n this.render();\n });\n }\n}\n","import type { GanttLayout } from \"../domain/layout\";\nimport { hitTestTaskBar } from \"../domain/task-geometry\";\nimport type { GanttTask } from \"../schema/options\";\n\nexport function hitTestTask(\n x: number,\n y: number,\n layout: GanttLayout,\n): GanttTask | null {\n return (\n hitTestTaskBar({\n x,\n y,\n layout,\n selectedId: null,\n resizable: false,\n })?.task ?? null\n );\n}\n"]}