@taskctrl/canvas-timeline 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-timeline.es.js","sources":["../src/types.ts","../src/core/ViewState.ts","../src/core/IntervalTree.ts","../src/core/LayoutEngine.ts","../src/core/HierarchyEngine.ts","../src/canvas/defaultSummaryRenderer.ts","../src/core/HitTest.ts","../src/canvas/CanvasManager.ts","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/timezone.js","../src/utils/timezone.ts","../src/canvas/GridLayer.ts","../src/canvas/DrawHelpers.ts","../src/canvas/ItemsLayer.ts","../src/canvas/OverlayLayer.ts","../src/interaction/ZoomHandler.ts","../src/interaction/InteractionHandler.ts","../src/interaction/snapUtils.ts","../node_modules/dayjs/plugin/isoWeek.js","../src/dom/Sidebar.tsx","../src/dom/TodayMarker.tsx","../src/dom/CustomMarker.tsx","../src/CanvasTimeline.tsx","../src/dom/TimelineHeaders.tsx","../node_modules/dayjs/plugin/weekOfYear.js","../src/dom/DateHeader.tsx","../src/dom/SidebarHeader.tsx","../src/dom/CustomHeader.tsx"],"sourcesContent":["import type React from 'react'\n\nexport interface Group {\n id: number | string\n title: string\n type?: string\n hierarchy?: string\n root?: boolean\n [key: string]: unknown\n}\n\nexport interface Item {\n id: number\n group: number | string\n start_time: number\n end_time: number\n parentId?: number\n type?: string\n [key: string]: unknown\n}\n\nexport interface ItemBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface ItemState {\n selected: boolean\n hovered: boolean\n dragging: boolean\n filtered: boolean\n}\n\nexport interface DrawHelpers {\n roundRect(x: number, y: number, w: number, h: number, radius?: number): void\n fillText(text: string, x: number, y: number, maxWidth?: number): void\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient\n leftBar(color: string, width?: number): void\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size?: number): void\n badge(text: string, x: number, y: number, bgColor: string): void\n}\n\nexport type CanvasItemRenderer = (\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n helpers: DrawHelpers,\n) => void\n\nexport type CanvasGroupItemRenderer = CanvasItemRenderer\n\nexport interface DayStyle {\n backgroundColor?: string\n borderColor?: string\n opacity?: number\n}\n\nexport interface RowStyle {\n backgroundColor?: string\n borderBottomColor?: string\n}\n\nexport interface Dependency {\n fromItemId: number\n toItemId: number\n type?: 'finish-to-start' | 'start-to-start' | 'finish-to-finish'\n color?: string\n}\n\nexport interface TimeRangeHighlight {\n start: number\n end: number\n color: string\n label?: string\n opacity?: number\n}\n\nexport interface TimelineTheme {\n primary: string\n trainColors: Record<string, string>\n status: { red: string; yellow: string; green: string }\n grid: { line: string; rowAlt: string; weekend: string }\n item: { radius: number; text: string; selectedRing: string }\n marker: { today: string; milestone: string; cursor: string }\n sidebar: { bg: string; border: string; text: string }\n header: { bg: string; border: string; text: string }\n}\n\nexport const DEFAULT_THEME: TimelineTheme = {\n primary: '#269bf7',\n trainColors: {},\n status: { red: '#EF5350', yellow: '#FBBF24', green: '#31c48d' },\n grid: { line: '#E5E5E5', rowAlt: '#F7F7F7', weekend: 'rgba(0,0,0,0.03)' },\n item: { radius: 3, text: '#374151', selectedRing: '#a3a3a3' },\n marker: { today: '#FD7171', milestone: '#3B82F6', cursor: '#269bf7' },\n sidebar: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n header: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n}\n\nexport interface MarkerConfig {\n date: number\n color: string\n width: number\n label?: string\n}\n\nexport interface CanvasTimelineProps {\n groups: Group[]\n items: Item[]\n defaultTimeStart: number\n defaultTimeEnd: number\n visibleTimeStart?: number\n visibleTimeEnd?: number\n sidebarWidth: number\n lineHeight: number\n itemHeightRatio: number\n stackItems: boolean\n buffer?: number\n canMove: boolean\n canResize: false | 'left' | 'right' | 'both'\n canChangeGroup: boolean\n dragSnap: number\n minZoom: number\n maxZoom: number\n theme?: Partial<TimelineTheme>\n dayStyle?: (date: Date) => DayStyle | null\n rowStyle?: (group: Group) => RowStyle | null\n showCursorLine?: boolean\n itemRenderer: CanvasItemRenderer\n groupRenderer?: CanvasGroupItemRenderer\n summaryRenderer?: CanvasItemRenderer\n sidebarGroupRenderer: (group: Group) => React.ReactNode\n rightSidebarWidth?: number\n rightSidebarGroupRenderer?: (group: Group) => React.ReactNode\n dependencies?: Dependency[]\n highlights?: TimeRangeHighlight[]\n onItemClick?: (itemId: number, e: PointerEvent) => void\n onItemDoubleClick?: (itemId: number, e: PointerEvent) => void\n onItemContextMenu?: (itemId: number, e: PointerEvent) => void\n onItemMove?: (itemId: number, newStartTime: number, newGroupId: string | number, childMoves?: { itemId: number; newStart: number }[]) => void\n onItemResize?: (itemId: number, newTime: number, edge: 'left' | 'right') => void\n /** Validate and optionally constrain move/resize. Return the (possibly modified) time. */\n moveResizeValidator?: (action: 'move' | 'resize', itemId: number, time: number, edge?: 'left' | 'right') => number\n onItemHover?: (itemId: number | null, e: PointerEvent) => void\n onCanvasDoubleClick?: (groupId: number, time: number) => void\n onCanvasContextMenu?: (groupId: number, time: number, e: PointerEvent) => void\n onTimeChange?: (start: number, end: number) => void\n onZoom?: (start: number, end: number) => void\n selected?: number[]\n /** Called when the timeline is ready, providing the capture API */\n onReady?: (api: CanvasTimelineRef) => void\n /** Dev-only: show a version + build-time badge in the top-left corner.\n * Wire to your app's dev flag, e.g. `devBadge={import.meta.env.DEV}`. */\n /** Maximum visible height for the timeline body. Accepts a number (px) or\n * a CSS string like `'calc(100vh - 98px)'`. When set, the canvas and sidebar\n * are clipped and internally scrollable via wheel, drag, or touch. */\n maxHeight?: number | string\n /** IANA timezone string (e.g. \"America/New_York\", \"UTC\").\n * When set, grid lines, headers, and day styling render in this timezone.\n * Defaults to the browser's local timezone. */\n timezone?: string\n devBadge?: boolean\n children?: React.ReactNode\n}\n\nexport interface CaptureOptions {\n timeStart: number\n timeEnd: number\n scale: number\n sidebarWidth: number\n}\n\nexport interface CanvasTimelineRef {\n captureToCanvas(options: CaptureOptions): HTMLCanvasElement\n}\n","export interface ViewStateConfig {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights?: number[]\n}\n\nexport class ViewState {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights: number[] | null\n\n private visibleDuration: number\n private pixelsPerMs: number\n // Cumulative top-edge offsets per group: length = groupCount + 1,\n // groupYOffsets[i] = sum of heights[0..i-1]; groupYOffsets[groupCount] = total.\n private groupYOffsets: number[]\n\n constructor(config: ViewStateConfig) {\n this.visibleTimeStart = config.visibleTimeStart\n this.visibleTimeEnd = config.visibleTimeEnd\n this.canvasWidth = config.canvasWidth\n this.canvasHeight = config.canvasHeight\n this.sidebarWidth = config.sidebarWidth\n this.lineHeight = config.lineHeight\n this.groupCount = config.groupCount\n this.buffer = config.buffer\n this.scrollTop = config.scrollTop\n this.groupHeights = config.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.groupYOffsets = []\n this.recomputeGroupYOffsets()\n }\n\n update(params: Partial<ViewStateConfig>): void {\n if (params.visibleTimeStart !== undefined) this.visibleTimeStart = params.visibleTimeStart\n if (params.visibleTimeEnd !== undefined) this.visibleTimeEnd = params.visibleTimeEnd\n if (params.canvasWidth !== undefined) this.canvasWidth = params.canvasWidth\n if (params.canvasHeight !== undefined) this.canvasHeight = params.canvasHeight\n if (params.sidebarWidth !== undefined) this.sidebarWidth = params.sidebarWidth\n if (params.lineHeight !== undefined) this.lineHeight = params.lineHeight\n if (params.groupCount !== undefined) this.groupCount = params.groupCount\n if (params.buffer !== undefined) this.buffer = params.buffer\n if (params.scrollTop !== undefined) this.scrollTop = params.scrollTop\n if (params.groupHeights !== undefined) this.groupHeights = params.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.recomputeGroupYOffsets()\n }\n\n private recomputeGroupYOffsets(): void {\n const offsets = new Array<number>(this.groupCount + 1)\n offsets[0] = 0\n for (let i = 0; i < this.groupCount; i++) {\n const h = this.groupHeights?.[i] ?? this.lineHeight\n offsets[i + 1] = offsets[i] + h\n }\n this.groupYOffsets = offsets\n }\n\n timeToX(time: number): number {\n return (time - this.visibleTimeStart) * this.pixelsPerMs\n }\n\n xToTime(x: number): number {\n return this.visibleTimeStart + x / this.pixelsPerMs\n }\n\n yToGroupIndex(y: number): number {\n if (this.groupCount === 0) return 0\n const target = y + this.scrollTop\n if (target <= 0) return 0\n if (target >= this.groupYOffsets[this.groupCount]) return this.groupCount - 1\n // Binary search: smallest i where groupYOffsets[i + 1] > target.\n let lo = 0\n let hi = this.groupCount - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (this.groupYOffsets[mid + 1] > target) hi = mid\n else lo = mid + 1\n }\n return lo\n }\n\n groupIndexToY(index: number): number {\n if (index < 0) return -this.scrollTop\n if (index >= this.groupCount) {\n return (this.groupYOffsets[this.groupCount] ?? 0) - this.scrollTop\n }\n return this.groupYOffsets[index] - this.scrollTop\n }\n\n groupIndexToHeight(index: number): number {\n if (index < 0 || index >= this.groupCount) return this.lineHeight\n return this.groupHeights?.[index] ?? this.lineHeight\n }\n\n getBufferBounds(): { bufferStart: number; bufferEnd: number } {\n const extend = this.visibleDuration * 1.5\n return {\n bufferStart: this.visibleTimeStart - extend,\n bufferEnd: this.visibleTimeEnd + extend,\n }\n }\n\n getVisibleGroupRange(): { firstVisible: number; lastVisible: number } {\n if (this.groupCount === 0) return { firstVisible: 0, lastVisible: -1 }\n const firstVisible = this.yToGroupIndex(0)\n const lastVisible = this.yToGroupIndex(this.canvasHeight)\n return { firstVisible, lastVisible }\n }\n\n isScrollInBuffer(scrollXOffset: number): boolean {\n const bufferPixels = this.visibleDuration * 1.5 * this.pixelsPerMs\n return Math.abs(scrollXOffset) < bufferPixels\n }\n\n getTotalHeight(): number {\n return this.groupYOffsets[this.groupCount] ?? 0\n }\n}\n","interface TreeNode<T> {\n center: number\n left: TreeNode<T> | null\n right: TreeNode<T> | null\n overlapping: Array<{ item: T; start: number; end: number }>\n}\n\nexport class IntervalTree<T> {\n private root: TreeNode<T> | null = null\n\n buildFromItems(\n items: T[],\n getStart: (item: T) => number,\n getEnd: (item: T) => number,\n ): void {\n const intervals = items.map((item) => ({\n item,\n start: getStart(item),\n end: getEnd(item),\n }))\n this.root = this.buildNode(intervals)\n }\n\n private buildNode(\n intervals: Array<{ item: T; start: number; end: number }>,\n ): TreeNode<T> | null {\n if (intervals.length === 0) return null\n\n let min = Infinity\n let max = -Infinity\n for (const iv of intervals) {\n if (iv.start < min) min = iv.start\n if (iv.end > max) max = iv.end\n }\n const center = (min + max) / 2\n\n const leftIntervals: Array<{ item: T; start: number; end: number }> = []\n const rightIntervals: Array<{ item: T; start: number; end: number }> = []\n const overlapping: Array<{ item: T; start: number; end: number }> = []\n\n for (const iv of intervals) {\n if (iv.end < center) {\n leftIntervals.push(iv)\n } else if (iv.start > center) {\n rightIntervals.push(iv)\n } else {\n overlapping.push(iv)\n }\n }\n\n return {\n center,\n left: this.buildNode(leftIntervals),\n right: this.buildNode(rightIntervals),\n overlapping,\n }\n }\n\n query(start: number, end: number): T[] {\n const results: T[] = []\n this.queryNode(this.root, start, end, results)\n return results\n }\n\n private queryNode(\n node: TreeNode<T> | null,\n start: number,\n end: number,\n results: T[],\n ): void {\n if (node === null) return\n\n for (const iv of node.overlapping) {\n if (iv.start <= end && iv.end >= start) {\n results.push(iv.item)\n }\n }\n\n if (start <= node.center && node.left !== null) {\n this.queryNode(node.left, start, end, results)\n }\n\n if (end >= node.center && node.right !== null) {\n this.queryNode(node.right, start, end, results)\n }\n }\n}\n","import type { Item } from '../types'\nimport type { HierarchyEngine } from './HierarchyEngine'\n\nexport interface ItemLayout {\n stackLevel: number\n itemHeight: number\n}\n\nexport class LayoutEngine {\n private readonly lineHeight: number\n private readonly itemHeightRatio: number\n private layoutCache: Map<number, ItemLayout> = new Map()\n private groupMaxStack: Map<string | number, number> = new Map()\n\n constructor(lineHeight: number, itemHeightRatio: number) {\n this.lineHeight = lineHeight\n this.itemHeightRatio = itemHeightRatio\n }\n\n computeLayout(items: Item[], stackItems: boolean, hierarchy?: HierarchyEngine): Map<number, ItemLayout> {\n this.layoutCache = new Map()\n this.groupMaxStack = new Map()\n\n const itemHeight = this.lineHeight * this.itemHeightRatio\n const summaryHeight = itemHeight * 0.6\n\n if (!stackItems) {\n for (const item of items) {\n const isSummary = hierarchy?.isParent(item.id) ?? false\n this.layoutCache.set(item.id, { stackLevel: 0, itemHeight: isSummary ? summaryHeight : itemHeight })\n this.groupMaxStack.set(item.group, 0)\n }\n return this.layoutCache\n }\n\n // Group items by group id\n const byGroup = new Map<string | number, Item[]>()\n for (const item of items) {\n let arr = byGroup.get(item.group)\n if (!arr) {\n arr = []\n byGroup.set(item.group, arr)\n }\n arr.push(item)\n }\n\n for (const [groupId, groupItems] of byGroup) {\n if (hierarchy) {\n this.computeHierarchyLayout(groupItems, hierarchy, itemHeight, summaryHeight, groupId)\n } else {\n this.computeFlatLayout(groupItems, itemHeight, groupId)\n }\n }\n\n return this.layoutCache\n }\n\n private computeFlatLayout(groupItems: Item[], itemHeight: number, groupId: string | number): void {\n groupItems.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of groupItems) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n private computeHierarchyLayout(\n groupItems: Item[],\n hierarchy: HierarchyEngine,\n itemHeight: number,\n summaryHeight: number,\n groupId: string | number,\n ): void {\n // Separate leaf items from parents\n const leaves: Item[] = []\n const parents: Item[] = []\n for (const item of groupItems) {\n if (hierarchy.isParent(item.id)) {\n parents.push(item)\n } else {\n leaves.push(item)\n }\n }\n\n // Stack leaves first using sweep-line\n leaves.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of leaves) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n // Stack parents above leaves, sorted by nesting depth\n // Deepest parents first (closest to children), shallowest last (on top)\n parents.sort((a, b) => hierarchy.getNestingDepth(b.id) - hierarchy.getNestingDepth(a.id))\n\n let nextLevel = leaves.length > 0 ? maxLevel + 1 : 0\n for (const parent of parents) {\n this.layoutCache.set(parent.id, { stackLevel: nextLevel, itemHeight: summaryHeight })\n if (nextLevel > maxLevel) maxLevel = nextLevel\n nextLevel++\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n getLayout(itemId: number): ItemLayout | undefined {\n return this.layoutCache.get(itemId)\n }\n\n getGroupHeight(groupId: string | number): number {\n const maxStack = this.groupMaxStack.get(groupId) ?? 0\n return (maxStack + 1) * this.lineHeight\n }\n}\n","interface HierarchyItem {\n id: number\n start_time: number\n end_time: number\n parentId?: number\n}\n\nexport class HierarchyEngine {\n private parentToChildren: Map<number, number[]> = new Map()\n private childToParent: Map<number, number> = new Map()\n private itemMap: Map<number, HierarchyItem> = new Map()\n private depthCache: Map<number, number> = new Map()\n\n rebuild(items: HierarchyItem[]): void {\n this.parentToChildren = new Map()\n this.childToParent = new Map()\n this.itemMap = new Map()\n this.depthCache = new Map()\n\n for (const item of items) {\n this.itemMap.set(item.id, item)\n }\n\n for (const item of items) {\n if (item.parentId !== undefined && this.itemMap.has(item.parentId)) {\n this.childToParent.set(item.id, item.parentId)\n let children = this.parentToChildren.get(item.parentId)\n if (!children) {\n children = []\n this.parentToChildren.set(item.parentId, children)\n }\n children.push(item.id)\n }\n }\n\n // Detect and break cycles\n for (const id of this.childToParent.keys()) {\n const visited = new Set<number>()\n let current: number | undefined = id\n while (current !== undefined) {\n if (visited.has(current)) {\n const parentId = this.childToParent.get(id)!\n this.childToParent.delete(id)\n const siblings = this.parentToChildren.get(parentId)\n if (siblings) {\n const idx = siblings.indexOf(id)\n if (idx !== -1) siblings.splice(idx, 1)\n if (siblings.length === 0) this.parentToChildren.delete(parentId)\n }\n break\n }\n visited.add(current)\n current = this.childToParent.get(current)\n }\n }\n }\n\n isParent(itemId: number): boolean {\n const children = this.parentToChildren.get(itemId)\n return children !== undefined && children.length > 0\n }\n\n getParent(itemId: number): number | undefined {\n return this.childToParent.get(itemId)\n }\n\n getChildren(itemId: number): number[] {\n return this.parentToChildren.get(itemId) ?? []\n }\n\n getDescendants(itemId: number): number[] {\n const result: number[] = []\n const stack = [...this.getChildren(itemId)]\n while (stack.length > 0) {\n const id = stack.pop()!\n result.push(id)\n const children = this.parentToChildren.get(id)\n if (children) stack.push(...children)\n }\n return result\n }\n\n getEffectiveSpan(itemId: number): { start: number; end: number } {\n const item = this.itemMap.get(itemId)\n if (!item) return { start: 0, end: 0 }\n\n let start = item.start_time\n let end = item.end_time\n\n const descendants = this.getDescendants(itemId)\n for (const descId of descendants) {\n const desc = this.itemMap.get(descId)\n if (!desc) continue\n if (desc.start_time < start) start = desc.start_time\n if (desc.end_time > end) end = desc.end_time\n }\n\n return { start, end }\n }\n\n getNestingDepth(itemId: number): number {\n const cached = this.depthCache.get(itemId)\n if (cached !== undefined) return cached\n\n let depth = 0\n let current = this.childToParent.get(itemId)\n while (current !== undefined) {\n depth++\n current = this.childToParent.get(current)\n }\n this.depthCache.set(itemId, depth)\n return depth\n }\n\n getMoveDelta(itemId: number, newStart: number): { itemId: number; newStart: number }[] {\n const item = this.itemMap.get(itemId)\n if (!item) return []\n\n const delta = newStart - item.start_time\n const descendants = this.getDescendants(itemId)\n return descendants.map(descId => {\n const desc = this.itemMap.get(descId)!\n return { itemId: descId, newStart: desc.start_time + delta }\n })\n }\n\n getResizeConstraint(itemId: number, edge: 'left' | 'right'): { min: number; max: number } {\n const children = this.getDescendants(itemId)\n if (children.length === 0) {\n return edge === 'left'\n ? { min: -Infinity, max: Infinity }\n : { min: -Infinity, max: Infinity }\n }\n\n if (edge === 'left') {\n let minChildStart = Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.start_time < minChildStart) {\n minChildStart = child.start_time\n }\n }\n return { min: -Infinity, max: minChildStart }\n } else {\n let maxChildEnd = -Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.end_time > maxChildEnd) {\n maxChildEnd = child.end_time\n }\n }\n return { min: maxChildEnd, max: Infinity }\n }\n }\n}\n","import type { Item, ItemBounds, ItemState, DrawHelpers, TimelineTheme } from '../types'\n\nexport function defaultSummaryRenderer(\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n _helpers: DrawHelpers,\n theme: TimelineTheme,\n): void {\n const { x, y, width, height } = bounds\n const color = theme.primary\n\n // Semi-transparent fill\n ctx.globalAlpha = 0.15\n ctx.fillStyle = color\n ctx.fillRect(x, y, width, height)\n ctx.globalAlpha = 1\n\n // Border\n ctx.strokeStyle = color\n ctx.lineWidth = 1.5\n ctx.strokeRect(x, y, width, height)\n\n // Diamond marker at start edge\n const diamondSize = Math.min(height * 0.5, 6)\n const midY = y + height / 2\n\n ctx.fillStyle = color\n // Left diamond\n ctx.beginPath()\n ctx.moveTo(x, midY)\n ctx.lineTo(x + diamondSize, midY - diamondSize)\n ctx.lineTo(x + diamondSize * 2, midY)\n ctx.lineTo(x + diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Right diamond\n ctx.beginPath()\n ctx.moveTo(x + width, midY)\n ctx.lineTo(x + width - diamondSize, midY - diamondSize)\n ctx.lineTo(x + width - diamondSize * 2, midY)\n ctx.lineTo(x + width - diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Title text centered\n const title = (item as { title?: string }).title\n if (title && width > 30) {\n ctx.fillStyle = theme.item.text\n ctx.font = '500 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n const textWidth = ctx.measureText(title).width\n const maxTextWidth = width - diamondSize * 4 - 4\n if (maxTextWidth > 20) {\n const displayText = textWidth > maxTextWidth\n ? title.slice(0, Math.floor(title.length * maxTextWidth / textWidth)) + '...'\n : title\n ctx.fillText(displayText, x + width / 2 - Math.min(textWidth, maxTextWidth) / 2, midY)\n }\n }\n\n // Selected ring\n if (state.selected) {\n ctx.strokeStyle = theme.item.selectedRing\n ctx.lineWidth = 2\n ctx.strokeRect(x - 1, y - 1, width + 2, height + 2)\n }\n}\n","import type { Item, Group } from '../types'\nimport type { ViewState } from './ViewState'\nimport type { IntervalTree } from './IntervalTree'\nimport type { LayoutEngine } from './LayoutEngine'\n\nexport function hitTest(\n canvasX: number,\n canvasY: number,\n view: ViewState,\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n groups: Group[],\n): Item | null {\n const time = view.xToTime(canvasX)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const candidates = tree.query(time, time)\n\n let topItem: Item | null = null\n let topY = -Infinity\n\n for (const item of candidates) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n if (canvasX < x || canvasX > x + width) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const height = itemLayout.itemHeight\n\n if (canvasY < y || canvasY > y + height) continue\n\n if (y > topY) {\n topY = y\n topItem = item\n }\n }\n\n return topItem\n}\n\nexport function hitTestGroup(\n canvasY: number,\n view: ViewState,\n groups: Group[],\n): Group | null {\n const groupIndex = view.yToGroupIndex(canvasY)\n return groups[groupIndex] ?? null\n}\n\nexport function detectEdge(\n canvasX: number,\n item: Item,\n view: ViewState,\n threshold: number = 6,\n): 'left' | 'right' | 'body' {\n const leftX = view.timeToX(item.start_time)\n const rightX = view.timeToX(item.end_time)\n if (canvasX - leftX <= threshold) return 'left'\n if (rightX - canvasX <= threshold) return 'right'\n return 'body'\n}\n","/**\n * Resize the canvas buffer only when dimensions actually change.\n * Setting canvas.width/height is destructive (clears buffer + resets state),\n * so we avoid it unless necessary.\n */\nexport function setupCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n): CanvasRenderingContext2D {\n const dpr = window.devicePixelRatio || 1\n const targetW = Math.round(width * dpr)\n const targetH = Math.round(height * dpr)\n\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW\n canvas.height = targetH\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n }\n\n const ctx = canvas.getContext('2d')!\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n return ctx\n}\n\nexport function clearCanvas(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const dpr = window.devicePixelRatio || 1\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr)\n}\n\nexport type LayerName = 'grid' | 'items' | 'overlay'\n\nexport interface DirtyFlags {\n grid: boolean\n items: boolean\n overlay: boolean\n}\n\nexport class RenderScheduler {\n private dirty: DirtyFlags = { grid: false, items: false, overlay: false }\n private rafId: number | null = null\n private drawCallback: (flags: DirtyFlags) => void\n\n constructor(drawCallback: (flags: DirtyFlags) => void) {\n this.drawCallback = drawCallback\n }\n\n markDirty(layer: LayerName): void {\n this.dirty[layer] = true\n this.schedule()\n }\n\n markAllDirty(): void {\n this.dirty.grid = true\n this.dirty.items = true\n this.dirty.overlay = true\n this.schedule()\n }\n\n dispose(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private schedule(): void {\n if (this.rafId !== null) return\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null\n const flags = { ...this.dirty }\n this.dirty.grid = false\n this.dirty.items = false\n this.dirty.overlay = false\n this.drawCallback(flags)\n })\n }\n}\n","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport tz from 'dayjs/plugin/timezone'\n\ndayjs.extend(utc)\ndayjs.extend(tz)\n\nexport function toDayjs(ts: number, timezone?: string): dayjs.Dayjs {\n return timezone ? dayjs(ts).tz(timezone) : dayjs(ts)\n}\n","import { toDayjs } from '../utils/timezone'\nimport type { Group, TimelineTheme, DayStyle, RowStyle, TimeRangeHighlight } from '../types'\nimport type { ViewState } from '../core/ViewState'\n\nexport class GridLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n theme: TimelineTheme,\n dayStyle?: (date: Date) => DayStyle | null,\n rowStyle?: (group: Group) => RowStyle | null,\n highlights?: TimeRangeHighlight[],\n timezone?: string,\n ): void {\n const { firstVisible, lastVisible } = view.getVisibleGroupRange()\n\n // Draw row backgrounds\n for (let i = firstVisible; i <= lastVisible; i++) {\n const y = view.groupIndexToY(i)\n const rowHeight = view.groupIndexToHeight(i)\n const group = groups[i]\n if (!group) continue\n\n let bgColor: string\n const customRow = rowStyle?.(group)\n if (customRow?.backgroundColor) {\n bgColor = customRow.backgroundColor\n } else {\n bgColor = i % 2 === 0 ? '#FFFFFF' : theme.grid.rowAlt\n }\n\n ctx.fillStyle = bgColor\n ctx.fillRect(0, y, view.canvasWidth, rowHeight)\n\n // Row separator\n ctx.strokeStyle = customRow?.borderBottomColor ?? theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(view.canvasWidth, y + rowHeight)\n ctx.stroke()\n }\n\n // Draw time range highlight backgrounds (under grid lines)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n const opacity = h.opacity ?? 0.12\n const r = parseInt(h.color.slice(1, 3), 16)\n const g = parseInt(h.color.slice(3, 5), 16)\n const b = parseInt(h.color.slice(5, 7), 16)\n ctx.fillStyle = `rgb(${Math.round(r * opacity + 255 * (1 - opacity))},${Math.round(g * opacity + 255 * (1 - opacity))},${Math.round(b * opacity + 255 * (1 - opacity))})`\n ctx.fillRect(x, 0, w, view.canvasHeight)\n }\n }\n\n // Draw day columns, backgrounds, and vertical grid lines\n const visibleStart = view.visibleTimeStart\n const visibleEnd = view.visibleTimeEnd\n const visibleDuration = visibleEnd - visibleStart\n const dayMs = 86400000\n const dayPixelWidth = (dayMs / visibleDuration) * view.canvasWidth\n\n // Determine grid line interval based on zoom level\n let stepUnit: 'day' | 'week' | 'month' = 'day'\n if (dayPixelWidth < 2) stepUnit = 'month'\n else if (dayPixelWidth < 8) stepUnit = 'week'\n\n // Draw day backgrounds (dayStyle + weekends) — batch consecutive same-style days\n if (dayStyle || true) { // always draw weekends\n let current = toDayjs(visibleStart, timezone).startOf('day')\n const end = toDayjs(visibleEnd, timezone).endOf('day')\n\n // Batch: track current fill color and start x\n let batchColor: string | null = null\n let batchOpacity = 1\n let batchStartX = 0\n const customBorderLines: { x: number; color: string }[] = []\n\n const flushBatch = (endX: number) => {\n if (batchColor !== null) {\n ctx.fillStyle = batchColor\n if (batchOpacity !== 1) ctx.globalAlpha = batchOpacity\n ctx.fillRect(batchStartX, 0, endX - batchStartX, view.canvasHeight)\n if (batchOpacity !== 1) ctx.globalAlpha = 1\n batchColor = null\n batchOpacity = 1\n }\n }\n\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n\n const date = current.toDate()\n const custom = dayStyle?.(date)\n let color: string | null = null\n let opacity = 1\n\n if (custom?.backgroundColor) {\n color = custom.backgroundColor\n opacity = custom.opacity ?? 1\n } else {\n const dow = current.day()\n if (dow === 0 || dow === 6) {\n color = theme.grid.weekend\n }\n }\n\n // Collect custom border colors for later drawing\n if (custom?.borderColor) {\n customBorderLines.push({ x, color: custom.borderColor })\n }\n\n // Batch consecutive same-color fills\n if (color === batchColor && opacity === batchOpacity) {\n // extend batch\n } else {\n flushBatch(x)\n if (color !== null) {\n batchColor = color\n batchOpacity = opacity\n batchStartX = x\n }\n }\n\n current = current.add(1, 'day')\n }\n // Flush remaining batch\n if (batchColor !== null) {\n flushBatch(view.timeToX(current.valueOf()))\n }\n\n // Draw custom border lines from dayStyle\n for (const line of customBorderLines) {\n ctx.strokeStyle = line.color\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(line.x, 0)\n ctx.lineTo(line.x, view.canvasHeight)\n ctx.stroke()\n }\n }\n\n // Draw vertical grid lines at appropriate interval\n let current = toDayjs(visibleStart, timezone).startOf(stepUnit)\n const end = toDayjs(visibleEnd, timezone).add(1, stepUnit)\n\n ctx.strokeStyle = theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n ctx.moveTo(x, 0)\n ctx.lineTo(x, view.canvasHeight)\n current = current.add(1, stepUnit)\n }\n ctx.stroke()\n\n // Draw time range highlight edge lines and labels (after grid lines so they render on top)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n // Edge lines\n ctx.strokeStyle = h.color\n ctx.globalAlpha = 0.4\n ctx.lineWidth = 1\n ctx.beginPath()\n if (x1 >= 0 && x1 <= view.canvasWidth) {\n ctx.moveTo(x1, 0)\n ctx.lineTo(x1, view.canvasHeight)\n }\n if (x2 >= 0 && x2 <= view.canvasWidth) {\n ctx.moveTo(x2, 0)\n ctx.lineTo(x2, view.canvasHeight)\n }\n ctx.stroke()\n ctx.globalAlpha = 1\n\n // Label badge\n if (h.label) {\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n ctx.save()\n ctx.font = '600 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(h.label).width\n const padding = 6\n const badgeWidth = textWidth + padding * 2\n const badgeHeight = 18\n const badgeX = x + (w - badgeWidth) / 2\n const badgeY = 4\n\n ctx.fillStyle = h.color\n ctx.globalAlpha = 0.9\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.globalAlpha = 1\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n ctx.fillText(h.label, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n }\n}\n","import type { DrawHelpers, ItemBounds } from '../types'\n\nconst ITEM_FONT = '500 12px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\n/**\n * Creates a DrawHelpers object bound to the given canvas context and optional item bounds.\n * These helpers are passed to every itemRenderer call to simplify common canvas operations.\n */\nexport function createDrawHelpers(\n ctx: CanvasRenderingContext2D,\n bounds?: ItemBounds,\n): DrawHelpers {\n return {\n /**\n * Draws a filled rounded rectangle.\n * Default corner radius is 3px.\n */\n roundRect(x: number, y: number, w: number, h: number, radius = 3): void {\n ctx.beginPath()\n ctx.roundRect(x, y, w, h, radius)\n ctx.fill()\n },\n\n /**\n * Draws text at (x, y) using the standard item font.\n * If maxWidth is provided and the text is too wide, binary-search truncates it\n * and appends '...' so it fits within maxWidth.\n */\n fillText(text: string, x: number, y: number, maxWidth?: number): void {\n ctx.font = ITEM_FONT\n\n if (maxWidth !== undefined && ctx.measureText(text).width > maxWidth) {\n // Binary-search for the longest prefix that fits with '...' appended\n let lo = 0\n let hi = text.length\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2)\n const candidate = text.slice(0, mid) + '...'\n if (ctx.measureText(candidate).width <= maxWidth) {\n lo = mid\n } else {\n hi = mid - 1\n }\n }\n ctx.fillText(text.slice(0, lo) + '...', x, y)\n } else {\n ctx.fillText(text, x, y)\n }\n },\n\n /**\n * Creates a 50/50 linear gradient from color1 (0%–50%) to color2 (50%–100%)\n * spanning the given x position and width.\n */\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient {\n const grad = ctx.createLinearGradient(x, 0, x + w, 0)\n grad.addColorStop(0, color1)\n grad.addColorStop(0.5, color1)\n grad.addColorStop(0.5, color2)\n grad.addColorStop(1, color2)\n return grad\n },\n\n /**\n * Draws a vertical colored bar on the left edge of the item bounds.\n * Does nothing if no bounds were provided.\n */\n leftBar(color: string, width = 3): void {\n if (!bounds) return\n ctx.save()\n ctx.fillStyle = color\n ctx.fillRect(bounds.x, bounds.y, width, bounds.height)\n ctx.restore()\n },\n\n /**\n * Draws a vector icon centered at (x, y).\n * Supported types: 'check', 'danger-red', 'danger-yellow'.\n * Default size is 14px.\n */\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size = 14): void {\n ctx.save()\n const half = size / 2\n\n if (type === 'check') {\n // Green circle with white checkmark\n ctx.fillStyle = '#31c48d'\n ctx.beginPath()\n ctx.arc(x + half, y + half, half, 0, Math.PI * 2)\n ctx.fill()\n\n // Draw checkmark path\n ctx.strokeStyle = '#ffffff'\n ctx.lineWidth = size * 0.12\n ctx.beginPath()\n const cx = x + half\n const cy = y + half\n ctx.moveTo(cx - half * 0.45, cy)\n ctx.lineTo(cx - half * 0.1, cy + half * 0.42)\n ctx.lineTo(cx + half * 0.45, cy - half * 0.35)\n ctx.stroke()\n } else if (type === 'danger-red' || type === 'danger-yellow') {\n const fillColor = type === 'danger-red' ? '#EF5350' : '#FBBF24'\n\n // Triangle background\n ctx.fillStyle = fillColor\n ctx.beginPath()\n ctx.moveTo(x + half, y) // top-center\n ctx.lineTo(x + size, y + size) // bottom-right\n ctx.lineTo(x, y + size) // bottom-left\n ctx.closePath()\n ctx.fill()\n\n // Exclamation mark stem\n ctx.fillStyle = '#ffffff'\n const stemW = size * 0.12\n const stemX = x + half - stemW / 2\n ctx.fillRect(stemX, y + size * 0.35, stemW, size * 0.35)\n\n // Exclamation mark dot\n ctx.beginPath()\n ctx.arc(x + half, y + size * 0.82, stemW * 0.7, 0, Math.PI * 2)\n ctx.fill()\n }\n\n ctx.restore()\n },\n\n /**\n * Draws a pill-shaped badge with centered white text on a colored background.\n */\n badge(text: string, x: number, y: number, bgColor: string): void {\n ctx.save()\n\n // Measure text to size the pill\n ctx.font = ITEM_FONT\n const textMetrics = ctx.measureText(text)\n const textWidth = textMetrics.width\n const paddingH = 8\n const paddingV = 3\n const pillHeight = 12 + paddingV * 2\n const pillWidth = textWidth + paddingH * 2\n const radius = pillHeight / 2\n\n // Draw pill background\n ctx.fillStyle = bgColor\n ctx.beginPath()\n ctx.roundRect(x, y, pillWidth, pillHeight, radius)\n ctx.fill()\n\n // Draw centered white text\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, x + pillWidth / 2, y + pillHeight / 2)\n\n ctx.restore()\n },\n }\n}\n","import type {\n Item, Group, TimelineTheme, CanvasItemRenderer, CanvasGroupItemRenderer,\n Dependency, ItemBounds, ItemState,\n} from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { IntervalTree } from '../core/IntervalTree'\nimport type { LayoutEngine } from '../core/LayoutEngine'\nimport type { HierarchyEngine } from '../core/HierarchyEngine'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport class ItemsLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n items: Item[],\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n itemRenderer: CanvasItemRenderer,\n groupRenderer: CanvasGroupItemRenderer | undefined,\n theme: TimelineTheme,\n selected: number[],\n hoveredItemId: number | undefined,\n dependencies?: Dependency[],\n summaryRenderer?: CanvasItemRenderer,\n hierarchy?: HierarchyEngine,\n ): void {\n // Query only visible time range + small padding (not the full 4x buffer)\n const padding = (view.visibleTimeEnd - view.visibleTimeStart) * 0.1\n const queryStart = view.visibleTimeStart - padding\n const queryEnd = view.visibleTimeEnd + padding\n const visibleItems = tree.query(queryStart, queryEnd)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const selectedSet = new Set(selected)\n const itemBoundsMap = new Map<number, ItemBounds>()\n\n // Vertical culling bounds\n const yMin = -view.lineHeight\n const yMax = view.canvasHeight + view.lineHeight\n\n for (const item of visibleItems) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n\n // Skip items that are entirely off-screen vertically\n const height = itemLayout.itemHeight\n if (y + height < yMin || y > yMax) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n const bounds: ItemBounds = { x, y, width, height }\n itemBoundsMap.set(item.id, bounds)\n\n const state: ItemState = {\n selected: selectedSet.has(item.id),\n hovered: hoveredItemId === item.id,\n dragging: false,\n filtered: item.filtered !== false,\n }\n\n ctx.save()\n const helpers = createDrawHelpers(ctx, bounds)\n let renderer: CanvasItemRenderer\n if (summaryRenderer && hierarchy?.isParent(item.id)) {\n renderer = summaryRenderer\n } else if (groupRenderer && (item.type === 'control_area_group' || item.type === 'construction_train')) {\n renderer = groupRenderer\n } else {\n renderer = itemRenderer\n }\n renderer(ctx, item, bounds, state, helpers)\n ctx.restore()\n }\n\n if (dependencies && dependencies.length > 0) {\n // Build a full item map for dependency endpoint lookup (off-screen items too)\n const depItemIds = new Set<number>()\n for (const dep of dependencies) {\n if (!itemBoundsMap.has(dep.fromItemId)) depItemIds.add(dep.fromItemId)\n if (!itemBoundsMap.has(dep.toItemId)) depItemIds.add(dep.toItemId)\n }\n if (depItemIds.size > 0) {\n const itemMap = new Map<number, Item>()\n for (const item of items) {\n if (depItemIds.has(item.id)) itemMap.set(item.id, item)\n }\n for (const [id, item] of itemMap) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n const itemLayout = layout.getLayout(id)\n if (!itemLayout) continue\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n itemBoundsMap.set(id, { x, y, width, height: itemLayout.itemHeight })\n }\n }\n this.drawDependencies(ctx, dependencies, itemBoundsMap, hoveredItemId, theme)\n }\n }\n\n private drawDependencies(\n ctx: CanvasRenderingContext2D,\n dependencies: Dependency[],\n boundsMap: Map<number, ItemBounds>,\n hoveredItemId: number | undefined,\n theme: TimelineTheme,\n ): void {\n for (const dep of dependencies) {\n const fromBounds = boundsMap.get(dep.fromItemId)\n const toBounds = boundsMap.get(dep.toItemId)\n if (!fromBounds || !toBounds) continue\n\n const isHighlighted = hoveredItemId === dep.fromItemId || hoveredItemId === dep.toItemId\n\n ctx.strokeStyle = isHighlighted ? theme.primary : (dep.color ?? '#94A3B8')\n ctx.lineWidth = isHighlighted ? 2 : 1.5\n ctx.setLineDash([])\n\n const startX = fromBounds.x + fromBounds.width\n const startY = fromBounds.y + fromBounds.height / 2\n const endX = toBounds.x\n const endY = toBounds.y + toBounds.height / 2\n\n const dx = Math.abs(endX - startX)\n const cpOffset = Math.max(dx * 0.4, 30)\n\n ctx.beginPath()\n ctx.moveTo(startX, startY)\n ctx.bezierCurveTo(startX + cpOffset, startY, endX - cpOffset, endY, endX, endY)\n ctx.stroke()\n\n // Arrowhead\n const arrowSize = 6\n ctx.fillStyle = ctx.strokeStyle\n ctx.beginPath()\n ctx.moveTo(endX, endY)\n ctx.lineTo(endX - arrowSize, endY - arrowSize / 2)\n ctx.lineTo(endX - arrowSize, endY + arrowSize / 2)\n ctx.closePath()\n ctx.fill()\n }\n }\n}\n","import type { TimelineTheme, MarkerConfig, ItemBounds, Item, CanvasItemRenderer } from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { InteractionMode } from '../interaction/InteractionHandler'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport interface InteractionRenderState {\n item: Item\n mode: InteractionMode\n bounds: ItemBounds\n renderer: CanvasItemRenderer\n targetGroupY?: number\n groupChanged?: boolean\n}\n\nexport interface OverlayDrawOptions {\n cursorX: number | null\n snapX?: number | null\n markers?: MarkerConfig[]\n\n interaction?: InteractionRenderState | null\n}\n\nexport class OverlayLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n theme: TimelineTheme,\n options: OverlayDrawOptions,\n ): void {\n const { cursorX, snapX, markers, interaction } = options\n\n // Draw markers\n if (markers) {\n for (const marker of markers) {\n const x = view.timeToX(marker.date)\n\n ctx.fillStyle = marker.color\n ctx.fillRect(x - marker.width / 2, 0, marker.width, view.canvasHeight)\n\n if (marker.label) {\n ctx.save()\n ctx.font = '500 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(marker.label).width\n const padding = 8\n const maxBadgeWidth = 200\n const badgeWidth = Math.min(textWidth + padding * 2, maxBadgeWidth)\n const badgeHeight = 20\n const badgeX = x - badgeWidth / 2\n const badgeY = 4\n\n ctx.fillStyle = marker.color\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n const maxTextWidth = maxBadgeWidth - padding * 2\n const displayText = textWidth > maxTextWidth\n ? marker.label.slice(0, Math.floor(marker.label.length * maxTextWidth / textWidth)) + '…'\n : marker.label\n ctx.fillText(displayText, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n\n // Draw cursor line\n if (cursorX !== null && cursorX !== undefined) {\n ctx.strokeStyle = theme.marker.cursor\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(cursorX, 0)\n ctx.lineTo(cursorX, view.canvasHeight)\n ctx.stroke()\n }\n\n // Draw snap guide line\n if (snapX !== null && snapX !== undefined) {\n ctx.strokeStyle = theme.primary\n ctx.lineWidth = 1\n ctx.setLineDash([4, 4])\n ctx.beginPath()\n ctx.moveTo(snapX, 0)\n ctx.lineTo(snapX, view.canvasHeight)\n ctx.stroke()\n ctx.setLineDash([])\n }\n\n // Draw interaction ghost (move, resize-left, resize-right)\n if (interaction) {\n // Group highlight band when moving to a different group\n if (interaction.groupChanged && interaction.targetGroupY !== undefined) {\n ctx.fillStyle = 'rgba(59, 130, 246, 0.08)'\n ctx.fillRect(0, interaction.targetGroupY, view.canvasWidth, view.lineHeight)\n }\n\n ctx.save()\n ctx.globalAlpha = 0.5\n const helpers = createDrawHelpers(ctx, interaction.bounds)\n interaction.renderer(\n ctx, interaction.item, interaction.bounds,\n { selected: false, hovered: false, dragging: true, filtered: true },\n helpers,\n )\n ctx.restore()\n }\n }\n}\n","const MAX_DELTA = 120\n\n/**\n * Normalize wheel delta across browsers/platforms.\n * deltaMode 0 = pixels, 1 = lines (×15), 2 = pages (×800).\n * Clamp to ±120 to prevent erratic jumps.\n */\nfunction normalizeDelta(e: WheelEvent): number {\n let delta = e.deltaY || e.deltaX\n if (e.deltaMode === 1) delta *= 15\n else if (e.deltaMode === 2) delta *= 800\n return Math.max(-MAX_DELTA, Math.min(MAX_DELTA, delta))\n}\n\nexport class ZoomHandler {\n private onZoom: (newStart: number, newEnd: number) => void\n private visibleTimeStart: number\n private visibleTimeEnd: number\n private minZoom: number\n private maxZoom: number\n\n constructor(\n onZoom: (newStart: number, newEnd: number) => void,\n visibleTimeStart: number,\n visibleTimeEnd: number,\n minZoom: number,\n maxZoom: number,\n ) {\n this.onZoom = onZoom\n this.visibleTimeStart = visibleTimeStart\n this.visibleTimeEnd = visibleTimeEnd\n this.minZoom = minZoom\n this.maxZoom = maxZoom\n }\n\n updateBounds(start: number, end: number): void {\n this.visibleTimeStart = start\n this.visibleTimeEnd = end\n }\n\n handleWheelZoom(e: WheelEvent, cursorRatio: number): void {\n const delta = normalizeDelta(e)\n // Speed: ctrlKey (trackpad pinch) = 10, metaKey = 3, altKey = 1\n const speed = e.ctrlKey ? 10 : e.metaKey ? 3 : 1\n\n // Reciprocal formula for symmetric zoom-in / zoom-out\n const scale = delta > 0\n ? 1.0 + (speed * delta) / 500\n : 1.0 / (1.0 + (speed * -delta) / 500)\n\n const currentDuration = this.visibleTimeEnd - this.visibleTimeStart\n let newDuration = Math.round(currentDuration * scale)\n newDuration = Math.max(this.minZoom, Math.min(this.maxZoom, newDuration))\n\n const newStart = Math.round(this.visibleTimeStart + (currentDuration - newDuration) * cursorRatio)\n const newEnd = newStart + newDuration\n\n this.onZoom(newStart, newEnd)\n }\n}\n","import type { Item } from '../types'\n\nconst ACTIVATION_THRESHOLD = 4\n\nexport type InteractionMode = 'move' | 'resize-left' | 'resize-right'\n\nexport interface InteractionState {\n item: Item\n mode: InteractionMode\n startX: number\n startY: number\n currentX: number\n currentY: number\n deltaX: number\n originalGroup: string | number\n currentGroup: string | number\n}\n\nexport class InteractionHandler {\n private state: InteractionState | null = null\n private dragSnap: number\n private activated = false\n\n constructor(dragSnap: number) {\n this.dragSnap = dragSnap\n }\n\n startInteraction(item: Item, mode: InteractionMode, x: number, y: number): void {\n this.state = {\n item, mode, startX: x, startY: y, currentX: x, currentY: y,\n deltaX: 0, originalGroup: item.group, currentGroup: item.group,\n }\n this.activated = false\n }\n\n update(x: number, y: number): void {\n if (!this.state) return\n this.state.currentX = x\n this.state.currentY = y\n this.state.deltaX = x - this.state.startX\n if (!this.activated && Math.abs(this.state.deltaX) >= ACTIVATION_THRESHOLD) {\n this.activated = true\n }\n }\n\n setCurrentGroup(groupId: string | number): void {\n if (this.state) this.state.currentGroup = groupId\n }\n\n endMove(pixelsPerMs: number): { newStartTime: number; newGroupId: string | number } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const newStartTime = this.state.item.start_time + deltaMs\n const snapped = Math.round(newStartTime / this.dragSnap) * this.dragSnap\n const newGroupId = this.state.currentGroup\n this.state = null\n this.activated = false\n return { newStartTime: snapped, newGroupId }\n }\n\n endResize(pixelsPerMs: number): { newTime: number; edge: 'left' | 'right' } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const edge = this.state.mode === 'resize-left' ? 'left' as const : 'right' as const\n const baseTime = edge === 'left' ? this.state.item.start_time : this.state.item.end_time\n const newTime = baseTime + deltaMs\n const snapped = Math.round(newTime / this.dragSnap) * this.dragSnap\n this.state = null\n this.activated = false\n return { newTime: snapped, edge }\n }\n\n cancel(): void {\n this.state = null\n this.activated = false\n }\n\n getState(): InteractionState | null {\n return this.state\n }\n\n getMode(): InteractionMode | null {\n return this.state?.mode ?? null\n }\n\n isActive(): boolean {\n return this.state !== null && this.activated\n }\n\n isPending(): boolean {\n return this.state !== null\n }\n}\n","interface SnapItem {\n id: number\n start_time: number\n end_time: number\n}\n\n/**\n * Collect start and end X positions from all items except the dragged item.\n */\nexport function collectItemEdges(\n items: SnapItem[],\n excludeItemId: number,\n timeToX: (time: number) => number,\n): number[] {\n const edges: number[] = []\n for (const item of items) {\n if (item.id === excludeItemId) continue\n edges.push(timeToX(item.start_time))\n edges.push(timeToX(item.end_time))\n }\n return edges\n}\n\n/**\n * Find the best snap target from a list of edge X positions.\n * Returns the snapped X position if an edge is within threshold, or null to fall back to time-grid snap.\n */\nexport function findSnapTarget(\n currentX: number,\n edgeXPositions: number[],\n thresholdPx: number,\n _pixelsPerMs: number,\n _dragSnap: number,\n): number | null {\n if (edgeXPositions.length === 0) return null\n\n let closestX = edgeXPositions[0]\n let closestDist = Math.abs(currentX - closestX)\n\n for (let i = 1; i < edgeXPositions.length; i++) {\n const dist = Math.abs(currentX - edgeXPositions[i])\n if (dist < closestDist) {\n closestDist = dist\n closestX = edgeXPositions[i]\n }\n }\n\n if (closestDist <= thresholdPx) {\n return closestX\n }\n\n return null\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){\"use strict\";var e=\"day\";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf(\"year\"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,\"week\")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return\"isoweek\"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf(\"day\"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf(\"day\"):n.bind(this)(e,t)}}}));","import React, { useRef, useCallback, useEffect, useMemo } from 'react'\nimport type { Group, TimelineTheme } from '../types'\n\ninterface SidebarProps {\n groups: Group[]\n width: number\n lineHeight: number\n groupHeights?: number[]\n scrollTop: number\n canvasHeight: number\n theme: TimelineTheme\n groupRenderer: (group: Group) => React.ReactNode\n onScroll: (scrollTop: number) => void\n}\n\nconst OVERSCAN_PX = 200\n\nexport function Sidebar({\n groups, width, lineHeight, groupHeights, scrollTop, canvasHeight, theme, groupRenderer, onScroll,\n}: SidebarProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false)\n\n // Cumulative top-edge offsets per group: length = groups.length + 1.\n const offsets = useMemo(() => {\n const arr = new Array<number>(groups.length + 1)\n arr[0] = 0\n for (let i = 0; i < groups.length; i++) {\n arr[i + 1] = arr[i] + (groupHeights?.[i] ?? lineHeight)\n }\n return arr\n }, [groups.length, groupHeights, lineHeight])\n\n const totalHeight = offsets[groups.length] ?? 0\n const displayHeight = canvasHeight\n\n // Binary search for the group containing a given y; clamped to [0, groups.length - 1].\n const groupAtY = useCallback((y: number): number => {\n if (groups.length === 0) return 0\n if (y <= 0) return 0\n if (y >= totalHeight) return groups.length - 1\n let lo = 0\n let hi = groups.length - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (offsets[mid + 1] > y) hi = mid\n else lo = mid + 1\n }\n return lo\n }, [groups.length, offsets, totalHeight])\n\n const firstVisible = groupAtY(scrollTop - OVERSCAN_PX)\n const lastVisible = groupAtY(scrollTop + canvasHeight + OVERSCAN_PX)\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n if (isScrollingRef.current) return\n onScroll(e.currentTarget.scrollTop)\n }, [onScroll])\n\n useEffect(() => {\n if (containerRef.current) {\n isScrollingRef.current = true\n containerRef.current.scrollTop = scrollTop\n requestAnimationFrame(() => { isScrollingRef.current = false })\n }\n }, [scrollTop])\n\n const visibleGroups = []\n for (let i = firstVisible; i <= lastVisible; i++) {\n const group = groups[i]\n if (!group) continue\n const top = offsets[i]\n const height = offsets[i + 1] - top\n visibleGroups.push(\n <div\n key={group.id}\n style={{\n position: 'absolute',\n top,\n height,\n width: '100%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n borderBottom: `1px solid ${theme.grid?.line ?? '#E5E5E5'}`,\n boxSizing: 'border-box',\n }}\n >\n {groupRenderer(group)}\n </div>,\n )\n }\n\n return (\n <div\n ref={containerRef}\n onScroll={handleScroll}\n style={{\n width,\n height: displayHeight,\n overflowY: totalHeight > canvasHeight ? 'auto' : 'hidden',\n overflowX: 'hidden',\n position: 'relative',\n borderRight: `1px solid ${theme.sidebar.border}`,\n backgroundColor: theme.sidebar.bg,\n }}\n >\n <div style={{ height: totalHeight, position: 'relative' }}>{visibleGroups}</div>\n </div>\n )\n}\n","import type { MarkerConfig } from '../types'\n\ninterface TodayMarkerProps {\n color?: string\n width?: number\n label?: string\n /** Auto-update interval in ms. Default 10000 (10s). Set 0 to disable. */\n interval?: number\n}\n\nexport function TodayMarker(_props: TodayMarkerProps) { return null }\nTodayMarker.displayName = 'TodayMarker'\n\nexport function getTodayMarkerConfig(props: TodayMarkerProps): MarkerConfig {\n // Snap to current minute to avoid unnecessary redraws\n const now = Math.floor(Date.now() / 60000) * 60000\n return { date: now, color: props.color ?? '#FD7171', width: props.width ?? 6, label: props.label }\n}\n\nexport function getTodayMarkerInterval(props: TodayMarkerProps): number {\n return props.interval ?? 10000\n}\n","import type { MarkerConfig } from '../types'\n\ninterface CustomMarkerProps {\n date: number\n color?: string\n width?: number\n label?: string\n}\n\nexport function CustomMarker(_props: CustomMarkerProps) { return null }\nCustomMarker.displayName = 'CustomMarker'\n\nexport function getCustomMarkerConfig(props: CustomMarkerProps): MarkerConfig {\n return {\n date: props.date,\n color: props.color ?? '#3B82F6',\n width: props.width ?? 4,\n label: props.label,\n }\n}\n","import React, { useRef, useEffect, useState, useCallback, useMemo, useImperativeHandle, forwardRef } from 'react'\nimport { flushSync } from 'react-dom'\nimport type {\n CanvasTimelineProps,\n CanvasTimelineRef,\n MarkerConfig,\n TimelineTheme,\n Item,\n ItemBounds,\n ItemState,\n DrawHelpers,\n} from './types'\nimport { DEFAULT_THEME } from './types'\nimport { ViewState } from './core/ViewState'\nimport { IntervalTree } from './core/IntervalTree'\nimport { LayoutEngine } from './core/LayoutEngine'\nimport { HierarchyEngine } from './core/HierarchyEngine'\nimport { defaultSummaryRenderer } from './canvas/defaultSummaryRenderer'\nimport { hitTest, hitTestGroup } from './core/HitTest'\nimport { setupCanvas, clearCanvas, RenderScheduler } from './canvas/CanvasManager'\nimport { GridLayer } from './canvas/GridLayer'\nimport { ItemsLayer } from './canvas/ItemsLayer'\nimport { OverlayLayer } from './canvas/OverlayLayer'\nimport { ZoomHandler } from './interaction/ZoomHandler'\nimport { InteractionHandler } from './interaction/InteractionHandler'\nimport type { InteractionMode } from './interaction/InteractionHandler'\nimport { findSnapTarget, collectItemEdges } from './interaction/snapUtils'\nimport { detectEdge } from './core/HitTest'\nimport dayjs from 'dayjs'\nimport isoWeek from 'dayjs/plugin/isoWeek'\nimport { toDayjs } from './utils/timezone'\nimport { Sidebar } from './dom/Sidebar'\nimport { getTodayMarkerConfig, getTodayMarkerInterval } from './dom/TodayMarker'\nimport { getCustomMarkerConfig } from './dom/CustomMarker'\n\ndayjs.extend(isoWeek)\n\nfunction mergeTheme(partial?: Partial<TimelineTheme>): TimelineTheme {\n if (!partial) return DEFAULT_THEME\n return {\n ...DEFAULT_THEME,\n ...partial,\n status: { ...DEFAULT_THEME.status, ...partial.status },\n grid: { ...DEFAULT_THEME.grid, ...partial.grid },\n item: { ...DEFAULT_THEME.item, ...partial.item },\n marker: { ...DEFAULT_THEME.marker, ...partial.marker },\n sidebar: { ...DEFAULT_THEME.sidebar, ...partial.sidebar },\n header: { ...DEFAULT_THEME.header, ...partial.header },\n }\n}\n\nconst HEADER_THROTTLE_MS = 32\n\nexport const CanvasTimeline = React.memo(forwardRef<CanvasTimelineRef, CanvasTimelineProps>(function CanvasTimeline(props, ref) {\n const {\n groups,\n items,\n defaultTimeStart,\n defaultTimeEnd,\n sidebarWidth,\n lineHeight,\n itemHeightRatio,\n stackItems,\n canMove,\n canChangeGroup,\n canResize,\n dragSnap,\n minZoom,\n maxZoom,\n theme: themePartial,\n dayStyle,\n rowStyle,\n showCursorLine,\n itemRenderer,\n groupRenderer,\n sidebarGroupRenderer,\n dependencies,\n highlights,\n onItemClick,\n onItemDoubleClick,\n onItemContextMenu,\n onItemMove,\n onItemResize,\n moveResizeValidator,\n onItemHover,\n onCanvasDoubleClick,\n onCanvasContextMenu,\n onTimeChange,\n onZoom,\n selected: selectedProp = [],\n rightSidebarWidth,\n rightSidebarGroupRenderer,\n onReady,\n maxHeight,\n timezone,\n devBadge,\n children,\n } = props\n\n const theme = useMemo(() => mergeTheme(themePartial), [themePartial])\n\n const getGroupIndex = useCallback((groupId: string | number, grps: typeof groups) => {\n for (let i = 0; i < grps.length; i++) {\n if (grps[i].id === groupId) return i\n }\n return 0\n }, [])\n\n const selectedKey = selectedProp.join(',')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const selected = useMemo(() => selectedProp, [selectedKey])\n\n const gridCanvasRef = useRef<HTMLCanvasElement>(null)\n const itemsCanvasRef = useRef<HTMLCanvasElement>(null)\n const overlayCanvasRef = useRef<HTMLCanvasElement>(null)\n const interactionRef = useRef<HTMLDivElement>(null)\n const outerRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const [containerWidth, setContainerWidth] = useState(800)\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null)\n\n useEffect(() => {\n const container = outerRef.current\n if (!container) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n setContainerWidth(entry.contentRect.width)\n }\n })\n obs.observe(container)\n return () => obs.disconnect()\n }, [])\n\n // Measure actual resolved height of the body container (handles CSS calc values)\n useEffect(() => {\n const el = containerRef.current\n if (!el || !maxHeight) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) setMeasuredHeight(entry.contentRect.height)\n })\n obs.observe(el)\n return () => obs.disconnect()\n }, [maxHeight])\n\n const canvasWidth = Math.max(0, containerWidth - sidebarWidth - (rightSidebarWidth ?? 0))\n\n // --- CORE DATA STRUCTURES ---\n const hierarchyEngine = useMemo(() => {\n const engine = new HierarchyEngine()\n engine.rebuild(items)\n return engine\n }, [items])\n\n const intervalTree = useMemo(() => {\n const tree = new IntervalTree<(typeof items)[0]>()\n tree.buildFromItems(\n items,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).start,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).end,\n )\n return tree\n }, [items, hierarchyEngine])\n\n const layoutEngine = useMemo(() => {\n const engine = new LayoutEngine(lineHeight, itemHeightRatio)\n engine.computeLayout(items, stackItems, hierarchyEngine)\n return engine\n }, [items, lineHeight, itemHeightRatio, stackItems, hierarchyEngine])\n\n const groupHeights = useMemo(\n () => groups.map((g) => layoutEngine.getGroupHeight(g.id)),\n [groups, layoutEngine],\n )\n const totalHeight = useMemo(\n () => groupHeights.reduce((a, b) => a + b, 0),\n [groupHeights],\n )\n const resolvedMaxHeight = typeof maxHeight === 'number' ? maxHeight : measuredHeight\n const canvasHeight = resolvedMaxHeight ? Math.min(totalHeight, resolvedMaxHeight) : totalHeight\n\n // --- MUTABLE VIEW STATE (hot path) ---\n const viewStateRef = useRef<ViewState>(\n new ViewState({\n visibleTimeStart: props.visibleTimeStart ?? defaultTimeStart,\n visibleTimeEnd: props.visibleTimeEnd ?? defaultTimeEnd,\n canvasWidth,\n canvasHeight,\n sidebarWidth,\n lineHeight,\n groupCount: groups.length,\n buffer: props.buffer ?? 3,\n scrollTop: 0,\n groupHeights,\n }),\n )\n\n const cursorXRef = useRef<number | null>(null)\n const hoveredItemIdRef = useRef<number | undefined>(undefined)\n\n // --- PAN STATE ---\n const panRef = useRef<{ startX: number; startY: number; lastX: number; lastY: number } | null>(null)\n const didPanRef = useRef(false)\n const PAN_THRESHOLD = 4\n\n // --- THROTTLED HEADER STATE ---\n const [headerTimeStart, setHeaderTimeStart] = useState(props.visibleTimeStart ?? defaultTimeStart)\n const [headerTimeEnd, setHeaderTimeEnd] = useState(props.visibleTimeEnd ?? defaultTimeEnd)\n const [sidebarScrollTop, setSidebarScrollTop] = useState(0)\n const headerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const syncHeaderState = useCallback(() => {\n const vs = viewStateRef.current\n setHeaderTimeStart(vs.visibleTimeStart)\n setHeaderTimeEnd(vs.visibleTimeEnd)\n setSidebarScrollTop(vs.scrollTop)\n headerTimerRef.current = null\n }, [])\n\n const scheduleHeaderSync = useCallback(() => {\n if (headerTimerRef.current !== null) return\n headerTimerRef.current = setTimeout(syncHeaderState, HEADER_THROTTLE_MS)\n }, [syncHeaderState])\n\n useEffect(() => {\n return () => { if (headerTimerRef.current !== null) clearTimeout(headerTimerRef.current) }\n }, [])\n\n const resolvedSummaryRenderer = useMemo(() => {\n if (props.summaryRenderer) return props.summaryRenderer\n return (ctx: CanvasRenderingContext2D, item: Item, bounds: ItemBounds, state: ItemState, helpers: DrawHelpers) => {\n defaultSummaryRenderer(ctx, item, bounds, state, helpers, theme)\n }\n }, [props.summaryRenderer, theme])\n\n const gridLayer = useMemo(() => new GridLayer(), [])\n const itemsLayer = useMemo(() => new ItemsLayer(), [])\n const overlayLayer = useMemo(() => new OverlayLayer(), [])\n const interactionHandler = useMemo(() => new InteractionHandler(dragSnap), [dragSnap])\n\n // --- MARKERS ---\n const markerConfigs = useMemo(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n return configs\n }, [children])\n const markersKey = useMemo(() => markerConfigs.map(m => `${m.date}|${m.color}|${m.width}|${m.label ?? ''}`).join(';'), [markerConfigs])\n const markersRef = useRef(markerConfigs)\n markersRef.current = markerConfigs\n\n // TodayMarker auto-update: refresh overlay on interval\n const todayMarkerInterval = useMemo(() => {\n let interval = 0\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n interval = getTodayMarkerInterval(child.props as { interval?: number })\n }\n })\n return interval\n }, [children])\n\n // --- PROPS REF ---\n const propsRef = useRef({\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n })\n propsRef.current = {\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n }\n\n // --- DRAW FUNCTIONS ---\n const drawGrid = useCallback(() => {\n const canvas = gridCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n gridLayer.draw(ctx, viewStateRef.current, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n }, [gridLayer])\n\n const drawItems = useCallback(() => {\n const canvas = itemsCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n itemsLayer.draw(\n ctx, viewStateRef.current, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, hoveredItemIdRef.current, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n }, [itemsLayer])\n\n const calculateSnapX = useCallback((item: (typeof items)[0], deltaX: number, mode: InteractionMode) => {\n const vs = viewStateRef.current\n const p = propsRef.current\n const pixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n\n // Determine which edges of the dragged item to check\n const draggedEdgeXs: number[] = []\n if (mode === 'move') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n } else if (mode === 'resize-left') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n } else {\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n }\n\n // Collect other items' edges\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, item.id, (t) => vs.timeToX(t))\n\n // Check each dragged edge against other items' edges\n for (const edgeX of draggedEdgeXs) {\n const snapX = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (snapX !== null) return snapX\n }\n\n // Fall back to time grid snap — snap the edge being dragged, not the start\n const edgeTime = mode === 'resize-right'\n ? item.end_time + deltaMs\n : item.start_time + deltaMs\n const snapped = Math.round(edgeTime / p.dragSnap) * p.dragSnap\n return vs.timeToX(snapped)\n }, [])\n\n const drawOverlay = useCallback(() => {\n const canvas = overlayCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n\n const vs = viewStateRef.current\n const state = interactionHandler.getState()\n let interactionRender = null\n if (state) {\n const origX = vs.timeToX(state.item.start_time)\n const origWidth = vs.timeToX(state.item.end_time) - origX\n let x: number, width: number\n if (state.mode === 'resize-left') {\n x = origX + state.deltaX\n width = origWidth - state.deltaX\n } else if (state.mode === 'resize-right') {\n x = origX\n width = origWidth + state.deltaX\n } else {\n // move\n x = origX + state.deltaX\n width = origWidth\n }\n const groupIndex = getGroupIndex(state.currentGroup, p.groups)\n const targetGroupY = vs.groupIndexToY(groupIndex)\n const groupChanged = state.currentGroup !== state.originalGroup\n interactionRender = {\n item: state.item,\n mode: state.mode,\n bounds: { x, y: targetGroupY + (p.lineHeight - p.lineHeight * p.itemHeightRatio) / 2, width, height: p.lineHeight * p.itemHeightRatio },\n renderer: p.itemRenderer,\n targetGroupY,\n groupChanged,\n }\n }\n\n overlayLayer.draw(ctx, vs, p.theme, {\n cursorX: p.showCursorLine ? cursorXRef.current : null,\n snapX: state ? calculateSnapX(state.item, state.deltaX, state.mode) : null,\n markers: markersRef.current,\n interaction: interactionRender,\n })\n }, [overlayLayer, interactionHandler, calculateSnapX, getGroupIndex])\n\n // --- RENDER SCHEDULER ---\n const schedulerRef = useRef<RenderScheduler | null>(null)\n if (!schedulerRef.current) {\n schedulerRef.current = new RenderScheduler((flags) => {\n if (flags.grid) drawGrid()\n if (flags.items) drawItems()\n if (flags.overlay) drawOverlay()\n })\n }\n const scheduler = schedulerRef.current\n\n useEffect(() => {\n return () => scheduler.dispose()\n }, [scheduler])\n\n // --- TODAY MARKER AUTO-UPDATE ---\n useEffect(() => {\n if (!todayMarkerInterval) return\n const timer = setInterval(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n markersRef.current = configs\n scheduler.markDirty('overlay')\n }, todayMarkerInterval)\n return () => clearInterval(timer)\n }, [todayMarkerInterval, children, scheduler])\n\n // --- SYNC ON DIMENSION/DATA CHANGES ---\n useEffect(() => {\n viewStateRef.current.update({\n canvasWidth, canvasHeight, sidebarWidth, lineHeight,\n groupCount: groups.length, groupHeights,\n })\n scheduler.markAllDirty()\n }, [canvasWidth, canvasHeight, sidebarWidth, lineHeight, groups.length, groupHeights, scheduler])\n\n useEffect(() => {\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n }, [items, groups, selected, theme, dayStyle, rowStyle, intervalTree, layoutEngine, scheduler])\n\n const highlightsKey = useMemo(\n () => props.highlights?.map(h => `${h.start}|${h.end}|${h.color}|${h.label ?? ''}|${h.opacity ?? ''}`).join(';') ?? '',\n [props.highlights],\n )\n\n const prevHighlightsKey = useRef(highlightsKey)\n useEffect(() => {\n if (highlightsKey !== prevHighlightsKey.current) {\n prevHighlightsKey.current = highlightsKey\n scheduler.markDirty('grid')\n }\n }, [highlightsKey, scheduler])\n\n const prevMarkersKey = useRef(markersKey)\n useEffect(() => {\n if (markersKey !== prevMarkersKey.current) {\n prevMarkersKey.current = markersKey\n scheduler.markDirty('overlay')\n }\n }, [markersKey, scheduler])\n\n // --- CONTROLLED MODE ---\n const prevControlledStart = useRef(props.visibleTimeStart)\n const prevControlledEnd = useRef(props.visibleTimeEnd)\n if (props.visibleTimeStart !== undefined && props.visibleTimeStart !== prevControlledStart.current) {\n prevControlledStart.current = props.visibleTimeStart\n viewStateRef.current.update({ visibleTimeStart: props.visibleTimeStart })\n scheduler.markAllDirty()\n }\n if (props.visibleTimeEnd !== undefined && props.visibleTimeEnd !== prevControlledEnd.current) {\n prevControlledEnd.current = props.visibleTimeEnd\n viewStateRef.current.update({ visibleTimeEnd: props.visibleTimeEnd })\n scheduler.markAllDirty()\n }\n\n // --- THROTTLED PARENT CALLBACKS ---\n const callbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const scheduleCallbacks = useCallback((type: 'zoom' | 'scroll') => {\n if (callbackTimerRef.current !== null) return\n callbackTimerRef.current = setTimeout(() => {\n callbackTimerRef.current = null\n const vs = viewStateRef.current\n const p = propsRef.current\n if (type === 'zoom') {\n p.onZoom?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n } else {\n p.onTimeChange?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n }\n }, HEADER_THROTTLE_MS)\n }, [])\n\n useEffect(() => {\n return () => { if (callbackTimerRef.current !== null) clearTimeout(callbackTimerRef.current) }\n }, [])\n\n // --- ZOOM HANDLER ---\n const zoomHandlerRef = useRef<ZoomHandler | null>(null)\n const zoomHandler = useMemo(() => {\n return new ZoomHandler(\n (newStart, newEnd) => {\n viewStateRef.current.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n },\n defaultTimeStart,\n defaultTimeEnd,\n minZoom,\n maxZoom,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n zoomHandlerRef.current = zoomHandler\n\n // --- WHEEL HANDLER ---\n const handleVerticalScroll = useCallback((deltaY: number) => {\n const vs = viewStateRef.current\n const totalHeight = vs.getTotalHeight()\n const maxScroll = Math.max(0, totalHeight - vs.canvasHeight)\n const newScrollTop = Math.max(0, Math.min(maxScroll, vs.scrollTop + deltaY))\n if (newScrollTop === vs.scrollTop) return\n vs.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }, [scheduler])\n\n const handleHorizontalScroll = useCallback((deltaX: number) => {\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n const newStart = vs.visibleTimeStart + deltaMs\n const newEnd = vs.visibleTimeEnd + deltaMs\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n flushSync(() => syncHeaderState())\n propsRef.current.onTimeChange?.(newStart, newEnd)\n }, [scheduler, syncHeaderState])\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey || e.altKey) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n const cursorRatio = (e.clientX - rect.left) / rect.width\n zoomHandler.handleWheelZoom(e, cursorRatio)\n } else if (e.shiftKey) {\n e.preventDefault()\n // Some browsers (Chrome/Edge on macOS) pre-translate shift + external mouse wheel\n // into deltaX with deltaY=0; trackpads keep the raw deltaY. Use whichever is non-zero.\n handleHorizontalScroll(e.deltaY || e.deltaX)\n } else {\n const deltaX = e.deltaX\n if (deltaX !== 0 && Math.abs(deltaX) > Math.abs(e.deltaY)) {\n e.preventDefault()\n handleHorizontalScroll(deltaX)\n } else if (e.deltaY !== 0) {\n const hasInternalScroll = totalHeight > canvasHeight\n if (hasInternalScroll) e.preventDefault()\n handleVerticalScroll(e.deltaY)\n }\n }\n }\n el.addEventListener('wheel', handleWheel, { passive: false })\n return () => el.removeEventListener('wheel', handleWheel)\n }, [zoomHandler, handleVerticalScroll, handleHorizontalScroll, totalHeight, canvasHeight])\n\n // --- TOUCH PINCH-TO-ZOOM ---\n const touchRef = useRef<{ lastDistance: number | null; lastCenter: number | null }>({ lastDistance: null, lastCenter: null })\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n\n const getDistance = (t1: Touch, t2: Touch) => Math.abs(t1.clientX - t2.clientX)\n const getCenter = (t1: Touch, t2: Touch, rect: DOMRect) => ((t1.clientX + t2.clientX) / 2) - rect.left\n\n const handleTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault()\n touchRef.current.lastDistance = getDistance(e.touches[0], e.touches[1])\n touchRef.current.lastCenter = null\n }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && touchRef.current.lastDistance !== null) {\n e.preventDefault()\n const newDistance = getDistance(e.touches[0], e.touches[1])\n const rect = el.getBoundingClientRect()\n const center = getCenter(e.touches[0], e.touches[1], rect)\n const cursorRatio = center / rect.width\n\n if (newDistance !== 0 && touchRef.current.lastDistance !== 0) {\n const scale = touchRef.current.lastDistance / newDistance\n const vs = viewStateRef.current\n const currentDuration = vs.visibleTimeEnd - vs.visibleTimeStart\n let newDuration = currentDuration * scale\n newDuration = Math.max(minZoom, Math.min(maxZoom, newDuration))\n\n const cursorTime = vs.visibleTimeStart + currentDuration * cursorRatio\n const newStart = cursorTime - newDuration * cursorRatio\n const newEnd = cursorTime + newDuration * (1 - cursorRatio)\n\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n }\n touchRef.current.lastDistance = newDistance\n }\n }\n\n const handleTouchEnd = () => {\n touchRef.current.lastDistance = null\n touchRef.current.lastCenter = null\n }\n\n el.addEventListener('touchstart', handleTouchStart, { passive: false })\n el.addEventListener('touchmove', handleTouchMove, { passive: false })\n el.addEventListener('touchend', handleTouchEnd)\n return () => {\n el.removeEventListener('touchstart', handleTouchStart)\n el.removeEventListener('touchmove', handleTouchMove)\n el.removeEventListener('touchend', handleTouchEnd)\n }\n }, [scheduler, scheduleHeaderSync, scheduleCallbacks])\n\n // --- POINTER HANDLERS ---\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n cursorXRef.current = x\n\n // --- Pan mode (drag on empty canvas) ---\n if (panRef.current) {\n const dx = e.clientX - panRef.current.startX\n const dy = e.clientY - panRef.current.startY\n if (!didPanRef.current && (Math.abs(dx) >= PAN_THRESHOLD || Math.abs(dy) >= PAN_THRESHOLD)) {\n didPanRef.current = true\n el.style.cursor = 'grabbing'\n el.setPointerCapture(e.pointerId)\n }\n if (didPanRef.current) {\n const moveDeltaX = e.clientX - panRef.current.lastX\n const moveDeltaY = e.clientY - panRef.current.lastY\n panRef.current.lastX = e.clientX\n panRef.current.lastY = e.clientY\n if (Math.abs(moveDeltaX) > 0) handleHorizontalScroll(-moveDeltaX)\n if (Math.abs(moveDeltaY) > 0) handleVerticalScroll(-moveDeltaY)\n }\n return\n }\n\n if (interactionHandler.isPending()) {\n interactionHandler.update(x, y)\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n if (state && state.mode === 'move' && propsRef.current.canChangeGroup) {\n const group = hitTestGroup(y, viewStateRef.current, propsRef.current.groups)\n if (group) interactionHandler.setCurrentGroup(group.id)\n }\n scheduler.markDirty('overlay')\n }\n return\n }\n\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n const newHoveredId = item?.id\n if (newHoveredId !== hoveredItemIdRef.current) {\n hoveredItemIdRef.current = newHoveredId\n scheduler.markDirty('items')\n p.onItemHover?.(newHoveredId ?? null, e.nativeEvent as unknown as PointerEvent)\n }\n\n // Cursor management\n if (item) {\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (p.canMove) {\n el.style.cursor = 'grab'\n } else {\n el.style.cursor = 'default'\n }\n } else {\n el.style.cursor = 'default'\n }\n }, [interactionHandler, scheduler, handleHorizontalScroll, handleVerticalScroll])\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const p = propsRef.current\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n\n if (!item) {\n // Start pan on empty canvas\n panRef.current = { startX: e.clientX, startY: e.clientY, lastX: e.clientX, lastY: e.clientY }\n didPanRef.current = false\n return\n }\n\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-left', x, y)\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-right', x, y)\n } else if (p.canMove) {\n interactionHandler.startInteraction(item, 'move', x, y)\n }\n }, [interactionHandler])\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n\n // --- End pan mode ---\n if (panRef.current) {\n const wasPanning = didPanRef.current\n panRef.current = null\n didPanRef.current = false\n el.style.cursor = 'default'\n if (wasPanning) return // suppress click after pan\n }\n\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n if (state) {\n const validator = propsRef.current.moveResizeValidator\n if (state.mode === 'move') {\n const result = interactionHandler.endMove(pixelsPerMs)\n if (result) {\n // Check for item-to-item snap\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const draggedStartX = vs.timeToX(state.item.start_time + deltaMs)\n const draggedEndX = vs.timeToX(state.item.end_time + deltaMs)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n let snappedStartTime = result.newStartTime\n // Check start edge\n const startSnap = findSnapTarget(draggedStartX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (startSnap !== null) {\n snappedStartTime = vs.xToTime(startSnap)\n } else {\n // Check end edge\n const endSnap = findSnapTarget(draggedEndX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (endSnap !== null) {\n const duration = state.item.end_time - state.item.start_time\n snappedStartTime = vs.xToTime(endSnap) - duration\n }\n }\n\n const validatedTime = validator ? validator('move', state.item.id, snappedStartTime) : snappedStartTime\n const childMoves = propsRef.current.hierarchyEngine.getMoveDelta(state.item.id, validatedTime)\n propsRef.current.onItemMove?.(state.item.id, validatedTime, result.newGroupId, childMoves.length > 0 ? childMoves : undefined)\n }\n } else {\n const result = interactionHandler.endResize(pixelsPerMs)\n if (result) {\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const edgeTime = result.edge === 'left' ? state.item.start_time + deltaMs : state.item.end_time + deltaMs\n const edgeX = vs.timeToX(edgeTime)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n const snap = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n let constrainedTime = snap !== null ? vs.xToTime(snap) : result.newTime\n // Apply hierarchy resize constraints\n const constraint = propsRef.current.hierarchyEngine.getResizeConstraint(state.item.id, result.edge)\n if (result.edge === 'left' && constrainedTime > constraint.max) {\n constrainedTime = constraint.max\n } else if (result.edge === 'right' && constrainedTime < constraint.min) {\n constrainedTime = constraint.min\n }\n\n const validatedTime = validator ? validator('resize', state.item.id, constrainedTime, result.edge) : constrainedTime\n propsRef.current.onItemResize?.(state.item.id, validatedTime, result.edge)\n }\n }\n }\n el.style.cursor = 'default'\n scheduler.markDirty('overlay')\n return\n }\n if (interactionHandler.isPending()) interactionHandler.cancel()\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, propsRef.current.intervalTree, propsRef.current.layoutEngine, propsRef.current.groups)\n if (item) propsRef.current.onItemClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n }, [interactionHandler, scheduler])\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemDoubleClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasDoubleClick?.(group.id as number, time)\n }\n }, [])\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemContextMenu?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasContextMenu?.(group.id as number, time, e.nativeEvent as unknown as PointerEvent)\n }\n }, [])\n\n const handlePointerLeave = useCallback(() => {\n panRef.current = null\n didPanRef.current = false\n cursorXRef.current = null\n if (interactionRef.current) interactionRef.current.style.cursor = 'default'\n if (hoveredItemIdRef.current !== undefined) {\n hoveredItemIdRef.current = undefined\n scheduler.markDirty('items')\n propsRef.current.onItemHover?.(null, new PointerEvent('pointerleave'))\n }\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n }, [scheduler])\n\n // --- HEADER CHILDREN ---\n const headerChildren = useMemo(() => {\n const headers: React.ReactNode[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TimelineHeaders') {\n const childProps = child.props as Record<string, unknown>\n headers.push(\n React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? headerTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? headerTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n sidebarWidth: childProps.sidebarWidth ?? sidebarWidth,\n theme: childProps.theme ?? theme,\n timezone: childProps.timezone ?? timezone,\n onZoomToInterval: childProps.onZoomToInterval ?? ((start: number, end: number) => {\n viewStateRef.current.update({ visibleTimeStart: start, visibleTimeEnd: end })\n scheduler.markAllDirty()\n syncHeaderState()\n propsRef.current.onTimeChange?.(start, end)\n propsRef.current.onZoom?.(start, end)\n }),\n }),\n )\n }\n })\n return headers\n }, [children, headerTimeStart, headerTimeEnd, canvasWidth, sidebarWidth, theme, timezone, scheduler, syncHeaderState])\n\n // --- INITIAL DRAW ---\n const initialDrawDone = useRef(false)\n useEffect(() => {\n if (!initialDrawDone.current) {\n initialDrawDone.current = true\n scheduler.markAllDirty()\n }\n }, [scheduler])\n\n // --- IMPERATIVE HANDLE (print capture) ---\n useImperativeHandle(ref, () => ({\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n\n // Preserve the current zoom level (pixels per ms) from the on-screen view\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n\n const compositeWidth = (printSidebarWidth + timelineWidth) * scale\n const compositeHeight = (headerHeight + totalHeight) * scale\n\n const canvas = document.createElement('canvas')\n canvas.width = compositeWidth\n canvas.height = compositeHeight\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n\n // --- Draw sidebar ---\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n\n // Row background from rowStyle\n if (p.rowStyle) {\n const style = p.rowStyle(group)\n if (style?.backgroundColor) {\n ctx.fillStyle = style.backgroundColor\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n }\n }\n\n // Group title\n const groupType = group.type as string | undefined\n let fontWeight = '400'\n let indent = 8\n if (groupType === 'project') {\n fontWeight = '700'\n } else if (groupType === 'CAG') {\n fontWeight = '600'\n } else if (groupType === 'CA') {\n fontWeight = '400'\n indent = 24\n }\n\n ctx.fillStyle = '#111'\n ctx.font = `${fontWeight} 12px sans-serif`\n ctx.textBaseline = 'middle'\n ctx.fillText(group.title, indent, y + rowHeight / 2, printSidebarWidth - indent - 4)\n }\n\n // --- Draw headers ---\n const drawHeaderRow = (rowY: number, getLabel: (time: dayjs.Dayjs) => string, unit: dayjs.ManipulateType) => {\n ctx.fillStyle = p.theme.header?.bg ?? '#f5f5f5'\n ctx.fillRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n ctx.strokeStyle = p.theme.grid?.line ?? '#e0e0e0'\n ctx.lineWidth = 1\n ctx.strokeRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n\n let cursor = toDayjs(timeStart, p.timezone).startOf(unit)\n if (cursor.valueOf() < timeStart) cursor = cursor.add(1, unit)\n\n const pxPerMs = timelineWidth / (timeEnd - timeStart)\n\n while (cursor.valueOf() < timeEnd) {\n const nextCursor = cursor.add(1, unit)\n const x = printSidebarWidth + (cursor.valueOf() - timeStart) * pxPerMs\n const endX = printSidebarWidth + (Math.min(nextCursor.valueOf(), timeEnd) - timeStart) * pxPerMs\n const width = endX - x\n\n // Vertical divider\n ctx.beginPath()\n ctx.moveTo(x, rowY)\n ctx.lineTo(x, rowY + headerRowHeight)\n ctx.stroke()\n\n // Label\n ctx.fillStyle = '#333'\n ctx.font = '600 11px sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n ctx.fillText(getLabel(cursor), x + width / 2, rowY + headerRowHeight / 2, width - 4)\n\n cursor = nextCursor\n }\n ctx.textAlign = 'start' // reset\n }\n\n drawHeaderRow(0, (d) => d.format('YYYY'), 'year')\n drawHeaderRow(headerRowHeight, (d) => d.format('MM'), 'month')\n drawHeaderRow(headerRowHeight * 2, (d) => String(d.isoWeek()), 'week')\n\n // --- Draw timeline layers ---\n const printViewState = new ViewState({\n visibleTimeStart: timeStart,\n visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth,\n canvasHeight: totalHeight,\n sidebarWidth: 0,\n lineHeight: p.lineHeight,\n groupCount: p.groups.length,\n buffer: 1,\n scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n\n // Offset context for timeline area\n ctx.save()\n ctx.translate(printSidebarWidth, headerHeight)\n\n // Clip to timeline area\n ctx.beginPath()\n ctx.rect(0, 0, timelineWidth, totalHeight)\n ctx.clip()\n\n gridLayer.draw(ctx, printViewState, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(\n ctx, printViewState, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n overlayLayer.draw(ctx, printViewState, p.theme, {\n cursorX: null,\n snapX: null,\n markers: markersRef.current,\n interaction: null,\n })\n\n ctx.restore()\n\n return canvas\n },\n }), [gridLayer, itemsLayer, overlayLayer])\n\n // --- ON READY CALLBACK ---\n useEffect(() => {\n const api: CanvasTimelineRef = {\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n const fullWidth = printSidebarWidth + timelineWidth\n const fullHeight = headerHeight + totalHeight\n\n const canvas = document.createElement('canvas')\n canvas.width = fullWidth * scale\n canvas.height = fullHeight * scale\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n ctx.fillStyle = '#FFFFFF'\n ctx.fillRect(0, 0, fullWidth, fullHeight)\n\n // Sidebar\n ctx.save()\n ctx.beginPath()\n ctx.rect(0, 0, printSidebarWidth, fullHeight)\n ctx.clip()\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(0, 0, printSidebarWidth, headerHeight)\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.strokeRect(0, 0, printSidebarWidth, headerHeight)\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n const rs = p.rowStyle?.(group)\n ctx.fillStyle = rs?.backgroundColor ?? (i % 2 === 0 ? '#FFFFFF' : '#F7F7F7')\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n ctx.strokeStyle = '#E5E5E5'\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(printSidebarWidth, y + rowHeight)\n ctx.stroke()\n const gt = (group.type as string) ?? ''\n let indent = 8, fw = '400', fs = 11\n if (gt === 'project') { fw = '700'; fs = 12 }\n else if (gt === 'control_area_group') { fw = '600' }\n else if (gt === 'control_area') { indent = 24 }\n ctx.fillStyle = '#374151'\n ctx.font = `${fw} ${fs}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`\n ctx.textBaseline = 'middle'\n const title = typeof group.title === 'string' ? group.title : String(group.title)\n ctx.fillText(title, indent, y + rowHeight / 2, printSidebarWidth - indent - 8)\n }\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(printSidebarWidth, 0)\n ctx.lineTo(printSidebarWidth, fullHeight)\n ctx.stroke()\n ctx.restore()\n\n // Headers\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, 0, timelineWidth, headerHeight)\n ctx.clip()\n const duration = timeEnd - timeStart\n const units: Array<{ unit: 'year' | 'month' | 'week'; row: number }> = [\n { unit: 'year', row: 0 }, { unit: 'month', row: 1 }, { unit: 'week', row: 2 },\n ]\n for (const { unit, row } of units) {\n const hy = row * headerRowHeight\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(printSidebarWidth, hy, timelineWidth, headerRowHeight)\n let cur = toDayjs(timeStart, p.timezone).startOf(unit)\n const endBound = toDayjs(timeEnd, p.timezone).add(1, unit)\n while (cur.isBefore(endBound)) {\n const next = cur.add(1, unit)\n const sx = printSidebarWidth + ((cur.valueOf() - timeStart) / duration) * timelineWidth\n const w = ((next.valueOf() - cur.valueOf()) / duration) * timelineWidth\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 0.5\n ctx.strokeRect(sx, hy, w, headerRowHeight)\n let label: string\n if (unit === 'year') label = cur.format('YYYY')\n else if (unit === 'month') label = cur.format('MM')\n else label = `${cur.week()}`\n ctx.fillStyle = '#6c737f'\n ctx.font = unit === 'year'\n ? '600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n : '400 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n if (w > 20) ctx.fillText(label, sx + w / 2, hy + headerRowHeight / 2)\n cur = next\n }\n }\n ctx.textAlign = 'start'\n ctx.restore()\n\n // Timeline\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, headerHeight, timelineWidth, totalHeight)\n ctx.clip()\n ctx.translate(printSidebarWidth, headerHeight)\n const pv = new ViewState({\n visibleTimeStart: timeStart, visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth, canvasHeight: totalHeight,\n sidebarWidth: 0, lineHeight: p.lineHeight,\n groupCount: p.groups.length, buffer: 1, scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n gridLayer.draw(ctx, pv, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(ctx, pv, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine)\n overlayLayer.draw(ctx, pv, p.theme, { cursorX: null, markers: markersRef.current })\n ctx.restore()\n\n return canvas\n },\n }\n onReady?.(api)\n }, [onReady, gridLayer, itemsLayer, overlayLayer])\n\n // --- RENDER ---\n const canvasContainerStyle: React.CSSProperties = {\n position: 'relative',\n width: canvasWidth,\n height: canvasHeight,\n overflow: 'hidden',\n cursor: 'default',\n }\n\n const canvasStyle: React.CSSProperties = { position: 'absolute', top: 0, left: 0 }\n\n return (\n <div ref={outerRef} style={{ display: 'flex', flexDirection: 'column', width: '100%', position: 'relative' }}>\n {(__LIB_DEV__ || devBadge) ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 9999,\n padding: '2px 6px',\n fontSize: 10,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n lineHeight: 1.4,\n color: '#fff',\n background: 'rgba(17, 24, 39, 0.78)',\n borderBottomRightRadius: 4,\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n v{__LIB_VERSION__} · {__LIB_BUILD__}\n </div>\n ) : null}\n {headerChildren}\n <div ref={containerRef} style={{ display: 'flex', overflow: 'hidden', maxHeight: maxHeight ?? undefined }}>\n <Sidebar\n groups={groups}\n width={sidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={sidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n <div\n ref={interactionRef}\n style={canvasContainerStyle}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n onPointerLeave={handlePointerLeave}\n >\n <canvas ref={gridCanvasRef} style={{ ...canvasStyle, zIndex: 0 }} />\n <canvas ref={itemsCanvasRef} style={{ ...canvasStyle, zIndex: 1 }} />\n <canvas ref={overlayCanvasRef} style={{ ...canvasStyle, zIndex: 2 }} />\n </div>\n {rightSidebarWidth && rightSidebarGroupRenderer ? (\n <Sidebar\n groups={groups}\n width={rightSidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={rightSidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n ) : null}\n </div>\n </div>\n )\n}))\n","import React from 'react'\nimport type { TimelineTheme } from '../types'\n\nexport interface TimelineHeadersProps {\n children: React.ReactNode\n theme?: TimelineTheme\n className?: string\n classNames?: string\n style?: React.CSSProperties\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n sidebarWidth?: number\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function TimelineHeaders({ children, theme, className, classNames: _classNames, style, visibleTimeStart, visibleTimeEnd, canvasWidth, sidebarWidth = 0, onZoomToInterval, timezone }: TimelineHeadersProps) {\n const enhancedChildren = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'DateHeader') {\n const childProps = child.props as Record<string, unknown>\n const enhanced = React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? visibleTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? visibleTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n theme: childProps.theme ?? theme,\n onZoomToInterval: childProps.onIntervalClick ?? childProps.onZoomToInterval ?? onZoomToInterval,\n timezone: childProps.timezone ?? timezone,\n })\n return (\n <div style={{ display: 'flex' }}>\n <div style={{ width: sidebarWidth, flexShrink: 0 }} />\n <div style={{ flex: 1, overflow: 'hidden' }}>{enhanced}</div>\n </div>\n )\n }\n return child\n })\n\n return (\n <div className={className} style={{\n position: 'sticky', top: 0, zIndex: 20, display: 'flex', flexDirection: 'column',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n borderTop: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n ...style,\n }}>\n {enhancedChildren}\n </div>\n )\n}\nTimelineHeaders.displayName = 'TimelineHeaders'\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){\"use strict\";var e=\"week\",t=\"year\";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),\"day\");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,\"millisecond\"),o=this.diff(a,e,!0);return o<0?r(this).startOf(\"week\").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));","import { useMemo, useCallback } from 'react'\nimport dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport type { TimelineTheme } from '../types'\nimport { toDayjs } from '../utils/timezone'\n\ndayjs.extend(weekOfYear)\n\nexport type DateUnit = 'year' | 'month' | 'week' | 'day' | 'hour'\n\n// Minimum cell width in pixels before the header auto-hides\nconst DEFAULT_MIN_CELL_WIDTH: Record<DateUnit, number> = {\n year: 30,\n month: 30,\n week: 20,\n day: 15,\n hour: 30,\n}\n\nexport interface DateHeaderProps {\n unit: DateUnit\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n theme?: TimelineTheme\n height?: number\n className?: string\n labelFormat?: string | ((start: Date, end: Date, unit: DateUnit) => string)\n onIntervalClick?: (startTime: number, endTime: number) => void\n /** Minimum cell width in pixels. Header auto-hides when cells are narrower. Set to 0 to disable. */\n minCellWidth?: number\n // Called by TimelineHeaders to inject zoom behavior\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function DateHeader({\n unit,\n visibleTimeStart = 0,\n visibleTimeEnd = 0,\n canvasWidth = 0,\n theme,\n height = 28,\n className,\n labelFormat,\n onIntervalClick,\n minCellWidth,\n onZoomToInterval,\n timezone,\n}: DateHeaderProps) {\n const intervals = useMemo(() => {\n if (!visibleTimeStart || !visibleTimeEnd || !canvasWidth) return []\n\n const duration = visibleTimeEnd - visibleTimeStart\n\n // Check average cell width — auto-hide if too narrow\n const minWidth = minCellWidth ?? DEFAULT_MIN_CELL_WIDTH[unit]\n if (minWidth > 0) {\n const sampleStart = toDayjs(visibleTimeStart, timezone).startOf(unit)\n const sampleEnd = sampleStart.add(1, unit)\n const avgCellWidth = ((sampleEnd.valueOf() - sampleStart.valueOf()) / duration) * canvasWidth\n if (avgCellWidth < minWidth) return []\n }\n\n const result: Array<{ start: number; end: number; label: string; left: number; width: number }> = []\n // Add buffer: 1 extra unit before and after visible range\n let current = toDayjs(visibleTimeStart, timezone).startOf(unit).subtract(1, unit)\n const endBound = toDayjs(visibleTimeEnd, timezone).add(2, unit).valueOf()\n\n while (current.valueOf() < endBound) {\n const next = current.add(1, unit)\n const start = current.valueOf()\n const end = next.valueOf()\n const left = ((start - visibleTimeStart) / duration) * canvasWidth\n const width = ((end - start) / duration) * canvasWidth\n const label = formatLabel(current, next, unit, labelFormat, width)\n result.push({ start, end, label, left, width })\n current = next\n }\n return result\n }, [visibleTimeStart, visibleTimeEnd, canvasWidth, unit, labelFormat, minCellWidth, timezone])\n\n const handleClick = useCallback((start: number, end: number) => {\n if (onIntervalClick) {\n onIntervalClick(start, end)\n } else if (onZoomToInterval) {\n onZoomToInterval(start, end)\n }\n }, [onIntervalClick, onZoomToInterval])\n\n // Auto-hide: return nothing if no intervals (cells too narrow)\n if (intervals.length === 0) return null\n\n return (\n <div style={{ display: 'flex', position: 'relative', height, overflow: 'hidden' }}>\n {intervals.map((interval) => (\n <div\n key={interval.start}\n className={className}\n onClick={() => handleClick(interval.start, interval.end)}\n style={{\n position: 'absolute',\n left: interval.left,\n width: interval.width,\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRight: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n fontSize: 12,\n color: theme?.header.text ?? '#6c737f',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n userSelect: 'none',\n padding: '0 4px',\n boxSizing: 'border-box',\n }}\n >\n <span>{interval.label}</span>\n </div>\n ))}\n </div>\n )\n}\nDateHeader.displayName = 'DateHeader'\n\nfunction formatLabel(\n start: dayjs.Dayjs,\n end: dayjs.Dayjs,\n unit: DateUnit,\n labelFormat: string | ((start: Date, end: Date, unit: DateUnit) => string) | undefined,\n _width: number,\n): string {\n if (typeof labelFormat === 'function') {\n return labelFormat(start.toDate(), end.toDate(), unit)\n }\n if (typeof labelFormat === 'string') {\n return start.format(labelFormat)\n }\n return formatDefault(start, unit)\n}\n\nfunction formatDefault(d: dayjs.Dayjs, unit: DateUnit): string {\n switch (unit) {\n case 'year': return d.format('YYYY')\n case 'month': return d.format('MM')\n case 'week': return `${d.week()}`\n case 'day': return d.format('D')\n case 'hour': return d.format('HH:mm')\n }\n}\n","import React from 'react'\n\ninterface SidebarHeaderProps {\n width: number\n children?: (props: { getRootProps: () => React.HTMLAttributes<HTMLDivElement> }) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function SidebarHeader({ width, children, style }: SidebarHeaderProps) {\n const getRootProps = (): React.HTMLAttributes<HTMLDivElement> => ({ style: { width, ...style } })\n if (children) return <>{children({ getRootProps })}</>\n return <div style={{ width }} />\n}\nSidebarHeader.displayName = 'SidebarHeader'\n","import React from 'react'\ninterface CustomHeaderProps { children: React.ReactNode }\nexport function CustomHeader({ children }: CustomHeaderProps) { return <>{children}</> }\nCustomHeader.displayName = 'CustomHeader'\n"],"names":["DEFAULT_THEME","ViewState","config","params","offsets","i","h","_a","time","x","y","target","lo","hi","mid","index","extend","firstVisible","lastVisible","scrollXOffset","bufferPixels","IntervalTree","items","getStart","getEnd","intervals","item","min","max","iv","center","leftIntervals","rightIntervals","overlapping","start","end","results","node","LayoutEngine","lineHeight","itemHeightRatio","stackItems","hierarchy","itemHeight","summaryHeight","isSummary","byGroup","arr","groupId","groupItems","a","b","d","levelEnds","maxLevel","level","leaves","parents","nextLevel","parent","itemId","HierarchyEngine","children","id","visited","current","parentId","siblings","idx","result","stack","descendants","descId","desc","cached","depth","newStart","delta","edge","minChildStart","childId","child","maxChildEnd","defaultSummaryRenderer","ctx","bounds","state","_helpers","theme","width","height","color","diamondSize","midY","title","textWidth","maxTextWidth","displayText","hitTest","canvasX","canvasY","view","tree","layout","groups","groupIndexMap","candidates","topItem","topY","groupIndex","itemLayout","hitTestGroup","detectEdge","threshold","leftX","rightX","setupCanvas","canvas","dpr","targetW","targetH","clearCanvas","RenderScheduler","drawCallback","layer","flags","module","this","e","s","f","n","u","t","r","o","l","c","m","v","dayjs","utc","tz","toDayjs","ts","timezone","GridLayer","dayStyle","rowStyle","highlights","rowHeight","group","bgColor","customRow","x1","x2","w","opacity","g","visibleStart","visibleEnd","dayPixelWidth","stepUnit","batchColor","batchOpacity","batchStartX","customBorderLines","flushBatch","endX","date","custom","dow","line","padding","badgeWidth","badgeHeight","badgeX","badgeY","ITEM_FONT","createDrawHelpers","radius","text","maxWidth","candidate","color1","color2","grad","type","size","half","cx","cy","fillColor","stemW","stemX","paddingH","pillHeight","pillWidth","ItemsLayer","itemRenderer","groupRenderer","selected","hoveredItemId","dependencies","summaryRenderer","queryStart","queryEnd","visibleItems","selectedSet","itemBoundsMap","yMin","yMax","helpers","renderer","depItemIds","dep","itemMap","boundsMap","fromBounds","toBounds","isHighlighted","startX","startY","endY","dx","cpOffset","arrowSize","OverlayLayer","options","cursorX","snapX","markers","interaction","marker","maxBadgeWidth","MAX_DELTA","normalizeDelta","ZoomHandler","onZoom","visibleTimeStart","visibleTimeEnd","minZoom","maxZoom","cursorRatio","speed","scale","currentDuration","newDuration","newEnd","ACTIVATION_THRESHOLD","InteractionHandler","dragSnap","mode","pixelsPerMs","deltaMs","newStartTime","snapped","newGroupId","newTime","collectItemEdges","excludeItemId","timeToX","edges","findSnapTarget","currentX","edgeXPositions","thresholdPx","_pixelsPerMs","_dragSnap","closestX","closestDist","dist","OVERSCAN_PX","Sidebar","groupHeights","scrollTop","canvasHeight","onScroll","containerRef","useRef","isScrollingRef","useMemo","totalHeight","displayHeight","groupAtY","useCallback","handleScroll","useEffect","visibleGroups","top","_jsx","TodayMarker","_props","getTodayMarkerConfig","props","getTodayMarkerInterval","CustomMarker","getCustomMarkerConfig","isoWeek","mergeTheme","partial","HEADER_THROTTLE_MS","CanvasTimeline","React","forwardRef","ref","defaultTimeStart","defaultTimeEnd","sidebarWidth","canMove","canChangeGroup","canResize","themePartial","showCursorLine","sidebarGroupRenderer","onItemClick","onItemDoubleClick","onItemContextMenu","onItemMove","onItemResize","moveResizeValidator","onItemHover","onCanvasDoubleClick","onCanvasContextMenu","onTimeChange","selectedProp","rightSidebarWidth","rightSidebarGroupRenderer","onReady","maxHeight","devBadge","getGroupIndex","grps","selectedKey","gridCanvasRef","itemsCanvasRef","overlayCanvasRef","interactionRef","outerRef","containerWidth","setContainerWidth","useState","measuredHeight","setMeasuredHeight","container","obs","entries","entry","el","canvasWidth","hierarchyEngine","engine","intervalTree","layoutEngine","resolvedMaxHeight","viewStateRef","cursorXRef","hoveredItemIdRef","panRef","didPanRef","PAN_THRESHOLD","headerTimeStart","setHeaderTimeStart","headerTimeEnd","setHeaderTimeEnd","sidebarScrollTop","setSidebarScrollTop","headerTimerRef","syncHeaderState","vs","scheduleHeaderSync","resolvedSummaryRenderer","gridLayer","itemsLayer","overlayLayer","interactionHandler","markerConfigs","configs","displayName","markersKey","markersRef","todayMarkerInterval","interval","propsRef","drawGrid","p","drawItems","calculateSnapX","deltaX","draggedEdgeXs","otherEdges","edgeX","edgeTime","drawOverlay","interactionRender","origX","origWidth","targetGroupY","groupChanged","schedulerRef","scheduler","timer","highlightsKey","prevHighlightsKey","prevMarkersKey","prevControlledStart","prevControlledEnd","callbackTimerRef","scheduleCallbacks","_b","zoomHandlerRef","zoomHandler","handleVerticalScroll","deltaY","maxScroll","newScrollTop","handleHorizontalScroll","flushSync","_c","handleWheel","rect","touchRef","getDistance","t1","t2","getCenter","handleTouchStart","handleTouchMove","newDistance","cursorTime","handleTouchEnd","handlePointerMove","dy","moveDeltaX","moveDeltaY","newHoveredId","cr","handlePointerDown","handlePointerUp","wasPanning","validator","draggedStartX","draggedEndX","snappedStartTime","startSnap","endSnap","duration","validatedTime","childMoves","snap","constrainedTime","constraint","_d","_f","_e","handleDoubleClick","handleContextMenu","handlePointerLeave","headerChildren","headers","childProps","initialDrawDone","useImperativeHandle","timeStart","timeEnd","printSidebarWidth","headerRowHeight","headerHeight","printGroupHeights","printGroupOffsets","currentPixelsPerMs","printDuration","timelineWidth","compositeWidth","compositeHeight","style","groupType","fontWeight","indent","drawHeaderRow","rowY","getLabel","unit","cursor","pxPerMs","nextCursor","printViewState","api","fullWidth","fullHeight","rs","gt","fw","fs","units","row","hy","cur","endBound","next","sx","label","pv","canvasContainerStyle","canvasStyle","_jsxs","TimelineHeaders","className","_classNames","onZoomToInterval","enhancedChildren","enhanced","weekOfYear","DEFAULT_MIN_CELL_WIDTH","DateHeader","labelFormat","onIntervalClick","minCellWidth","minWidth","sampleStart","left","formatLabel","handleClick","_width","formatDefault","SidebarHeader","getRootProps","_Fragment","CustomHeader"],"mappings":"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","x_google_ignoreList":[8,9,18,24]}
|
|
1
|
+
{"version":3,"file":"canvas-timeline.es.js","sources":["../src/types.ts","../src/core/ViewState.ts","../src/core/IntervalTree.ts","../src/core/LayoutEngine.ts","../src/core/HierarchyEngine.ts","../src/canvas/defaultSummaryRenderer.ts","../src/core/HitTest.ts","../src/canvas/CanvasManager.ts","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/timezone.js","../src/utils/timezone.ts","../src/canvas/GridLayer.ts","../src/canvas/DrawHelpers.ts","../src/canvas/ItemsLayer.ts","../src/canvas/OverlayLayer.ts","../src/interaction/ZoomHandler.ts","../src/interaction/InteractionHandler.ts","../src/interaction/snapUtils.ts","../node_modules/dayjs/plugin/isoWeek.js","../src/dom/Sidebar.tsx","../src/dom/TodayMarker.tsx","../src/dom/CustomMarker.tsx","../src/CanvasTimeline.tsx","../src/dom/TimelineHeaders.tsx","../node_modules/dayjs/plugin/weekOfYear.js","../src/dom/DateHeader.tsx","../src/dom/SidebarHeader.tsx","../src/dom/CustomHeader.tsx"],"sourcesContent":["import type React from 'react'\n\nexport interface Group {\n id: number | string\n title: string\n type?: string\n hierarchy?: string\n root?: boolean\n [key: string]: unknown\n}\n\nexport interface Item {\n id: number\n group: number | string\n start_time: number\n end_time: number\n parentId?: number\n type?: string\n /** Per-item override of the timeline-wide `canResize` prop. When set, this\n * wins for this item; when omitted, the global `canResize` applies. */\n canResize?: false | 'left' | 'right' | 'both'\n /** Per-item override of the timeline-wide `canMove` prop. When set, this\n * wins for this item; when omitted, the global `canMove` applies. */\n canMove?: boolean\n [key: string]: unknown\n}\n\nexport interface ItemBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface ItemState {\n selected: boolean\n hovered: boolean\n dragging: boolean\n filtered: boolean\n}\n\nexport interface DrawHelpers {\n roundRect(x: number, y: number, w: number, h: number, radius?: number): void\n fillText(text: string, x: number, y: number, maxWidth?: number): void\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient\n leftBar(color: string, width?: number): void\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size?: number): void\n badge(text: string, x: number, y: number, bgColor: string): void\n}\n\nexport type CanvasItemRenderer = (\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n helpers: DrawHelpers,\n) => void\n\nexport type CanvasGroupItemRenderer = CanvasItemRenderer\n\nexport interface DayStyle {\n backgroundColor?: string\n borderColor?: string\n opacity?: number\n}\n\nexport interface RowStyle {\n backgroundColor?: string\n borderBottomColor?: string\n}\n\nexport interface Dependency {\n fromItemId: number\n toItemId: number\n type?: 'finish-to-start' | 'start-to-start' | 'finish-to-finish'\n color?: string\n}\n\nexport interface TimeRangeHighlight {\n start: number\n end: number\n color: string\n label?: string\n opacity?: number\n}\n\nexport interface TimelineTheme {\n primary: string\n trainColors: Record<string, string>\n status: { red: string; yellow: string; green: string }\n grid: { line: string; rowAlt: string; weekend: string }\n item: { radius: number; text: string; selectedRing: string }\n marker: { today: string; milestone: string; cursor: string }\n sidebar: { bg: string; border: string; text: string }\n header: { bg: string; border: string; text: string }\n}\n\nexport const DEFAULT_THEME: TimelineTheme = {\n primary: '#269bf7',\n trainColors: {},\n status: { red: '#EF5350', yellow: '#FBBF24', green: '#31c48d' },\n grid: { line: '#E5E5E5', rowAlt: '#F7F7F7', weekend: 'rgba(0,0,0,0.03)' },\n item: { radius: 3, text: '#374151', selectedRing: '#a3a3a3' },\n marker: { today: '#FD7171', milestone: '#3B82F6', cursor: '#269bf7' },\n sidebar: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n header: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n}\n\nexport interface MarkerConfig {\n date: number\n color: string\n width: number\n label?: string\n}\n\nexport interface CanvasTimelineProps {\n groups: Group[]\n items: Item[]\n defaultTimeStart: number\n defaultTimeEnd: number\n visibleTimeStart?: number\n visibleTimeEnd?: number\n sidebarWidth: number\n lineHeight: number\n itemHeightRatio: number\n stackItems: boolean\n buffer?: number\n canMove: boolean\n canResize: false | 'left' | 'right' | 'both'\n canChangeGroup: boolean\n dragSnap: number\n minZoom: number\n maxZoom: number\n theme?: Partial<TimelineTheme>\n dayStyle?: (date: Date) => DayStyle | null\n rowStyle?: (group: Group) => RowStyle | null\n showCursorLine?: boolean\n itemRenderer: CanvasItemRenderer\n groupRenderer?: CanvasGroupItemRenderer\n summaryRenderer?: CanvasItemRenderer\n sidebarGroupRenderer: (group: Group) => React.ReactNode\n rightSidebarWidth?: number\n rightSidebarGroupRenderer?: (group: Group) => React.ReactNode\n dependencies?: Dependency[]\n highlights?: TimeRangeHighlight[]\n onItemClick?: (itemId: number, e: PointerEvent) => void\n onItemDoubleClick?: (itemId: number, e: PointerEvent) => void\n onItemContextMenu?: (itemId: number, e: PointerEvent) => void\n onItemMove?: (itemId: number, newStartTime: number, newGroupId: string | number, childMoves?: { itemId: number; newStart: number }[]) => void\n onItemResize?: (itemId: number, newTime: number, edge: 'left' | 'right') => void\n /** Validate and optionally constrain move/resize. Return the (possibly modified) time. */\n moveResizeValidator?: (action: 'move' | 'resize', itemId: number, time: number, edge?: 'left' | 'right') => number\n onItemHover?: (itemId: number | null, e: PointerEvent) => void\n onCanvasDoubleClick?: (groupId: number, time: number) => void\n onCanvasContextMenu?: (groupId: number, time: number, e: PointerEvent) => void\n onTimeChange?: (start: number, end: number) => void\n onZoom?: (start: number, end: number) => void\n selected?: number[]\n /** Called when the timeline is ready, providing the capture API */\n onReady?: (api: CanvasTimelineRef) => void\n /** Dev-only: show a version + build-time badge in the top-left corner.\n * Wire to your app's dev flag, e.g. `devBadge={import.meta.env.DEV}`. */\n /** Maximum visible height for the timeline body. Accepts a number (px) or\n * a CSS string like `'calc(100vh - 98px)'`. When set, the canvas and sidebar\n * are clipped and internally scrollable via wheel, drag, or touch. */\n maxHeight?: number | string\n /** IANA timezone string (e.g. \"America/New_York\", \"UTC\").\n * When set, grid lines, headers, and day styling render in this timezone.\n * Defaults to the browser's local timezone. */\n timezone?: string\n devBadge?: boolean\n children?: React.ReactNode\n}\n\nexport interface CaptureOptions {\n timeStart: number\n timeEnd: number\n scale: number\n sidebarWidth: number\n}\n\nexport interface CanvasTimelineRef {\n captureToCanvas(options: CaptureOptions): HTMLCanvasElement\n}\n","export interface ViewStateConfig {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights?: number[]\n}\n\nexport class ViewState {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights: number[] | null\n\n private visibleDuration: number\n private pixelsPerMs: number\n // Cumulative top-edge offsets per group: length = groupCount + 1,\n // groupYOffsets[i] = sum of heights[0..i-1]; groupYOffsets[groupCount] = total.\n private groupYOffsets: number[]\n\n constructor(config: ViewStateConfig) {\n this.visibleTimeStart = config.visibleTimeStart\n this.visibleTimeEnd = config.visibleTimeEnd\n this.canvasWidth = config.canvasWidth\n this.canvasHeight = config.canvasHeight\n this.sidebarWidth = config.sidebarWidth\n this.lineHeight = config.lineHeight\n this.groupCount = config.groupCount\n this.buffer = config.buffer\n this.scrollTop = config.scrollTop\n this.groupHeights = config.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.groupYOffsets = []\n this.recomputeGroupYOffsets()\n }\n\n update(params: Partial<ViewStateConfig>): void {\n if (params.visibleTimeStart !== undefined) this.visibleTimeStart = params.visibleTimeStart\n if (params.visibleTimeEnd !== undefined) this.visibleTimeEnd = params.visibleTimeEnd\n if (params.canvasWidth !== undefined) this.canvasWidth = params.canvasWidth\n if (params.canvasHeight !== undefined) this.canvasHeight = params.canvasHeight\n if (params.sidebarWidth !== undefined) this.sidebarWidth = params.sidebarWidth\n if (params.lineHeight !== undefined) this.lineHeight = params.lineHeight\n if (params.groupCount !== undefined) this.groupCount = params.groupCount\n if (params.buffer !== undefined) this.buffer = params.buffer\n if (params.scrollTop !== undefined) this.scrollTop = params.scrollTop\n if (params.groupHeights !== undefined) this.groupHeights = params.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.recomputeGroupYOffsets()\n }\n\n private recomputeGroupYOffsets(): void {\n const offsets = new Array<number>(this.groupCount + 1)\n offsets[0] = 0\n for (let i = 0; i < this.groupCount; i++) {\n const h = this.groupHeights?.[i] ?? this.lineHeight\n offsets[i + 1] = offsets[i] + h\n }\n this.groupYOffsets = offsets\n }\n\n timeToX(time: number): number {\n return (time - this.visibleTimeStart) * this.pixelsPerMs\n }\n\n xToTime(x: number): number {\n return this.visibleTimeStart + x / this.pixelsPerMs\n }\n\n yToGroupIndex(y: number): number {\n if (this.groupCount === 0) return 0\n const target = y + this.scrollTop\n if (target <= 0) return 0\n if (target >= this.groupYOffsets[this.groupCount]) return this.groupCount - 1\n // Binary search: smallest i where groupYOffsets[i + 1] > target.\n let lo = 0\n let hi = this.groupCount - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (this.groupYOffsets[mid + 1] > target) hi = mid\n else lo = mid + 1\n }\n return lo\n }\n\n groupIndexToY(index: number): number {\n if (index < 0) return -this.scrollTop\n if (index >= this.groupCount) {\n return (this.groupYOffsets[this.groupCount] ?? 0) - this.scrollTop\n }\n return this.groupYOffsets[index] - this.scrollTop\n }\n\n groupIndexToHeight(index: number): number {\n if (index < 0 || index >= this.groupCount) return this.lineHeight\n return this.groupHeights?.[index] ?? this.lineHeight\n }\n\n getBufferBounds(): { bufferStart: number; bufferEnd: number } {\n const extend = this.visibleDuration * 1.5\n return {\n bufferStart: this.visibleTimeStart - extend,\n bufferEnd: this.visibleTimeEnd + extend,\n }\n }\n\n getVisibleGroupRange(): { firstVisible: number; lastVisible: number } {\n if (this.groupCount === 0) return { firstVisible: 0, lastVisible: -1 }\n const firstVisible = this.yToGroupIndex(0)\n const lastVisible = this.yToGroupIndex(this.canvasHeight)\n return { firstVisible, lastVisible }\n }\n\n isScrollInBuffer(scrollXOffset: number): boolean {\n const bufferPixels = this.visibleDuration * 1.5 * this.pixelsPerMs\n return Math.abs(scrollXOffset) < bufferPixels\n }\n\n getTotalHeight(): number {\n return this.groupYOffsets[this.groupCount] ?? 0\n }\n}\n","interface TreeNode<T> {\n center: number\n left: TreeNode<T> | null\n right: TreeNode<T> | null\n overlapping: Array<{ item: T; start: number; end: number }>\n}\n\nexport class IntervalTree<T> {\n private root: TreeNode<T> | null = null\n\n buildFromItems(\n items: T[],\n getStart: (item: T) => number,\n getEnd: (item: T) => number,\n ): void {\n const intervals = items.map((item) => ({\n item,\n start: getStart(item),\n end: getEnd(item),\n }))\n this.root = this.buildNode(intervals)\n }\n\n private buildNode(\n intervals: Array<{ item: T; start: number; end: number }>,\n ): TreeNode<T> | null {\n if (intervals.length === 0) return null\n\n let min = Infinity\n let max = -Infinity\n for (const iv of intervals) {\n if (iv.start < min) min = iv.start\n if (iv.end > max) max = iv.end\n }\n const center = (min + max) / 2\n\n const leftIntervals: Array<{ item: T; start: number; end: number }> = []\n const rightIntervals: Array<{ item: T; start: number; end: number }> = []\n const overlapping: Array<{ item: T; start: number; end: number }> = []\n\n for (const iv of intervals) {\n if (iv.end < center) {\n leftIntervals.push(iv)\n } else if (iv.start > center) {\n rightIntervals.push(iv)\n } else {\n overlapping.push(iv)\n }\n }\n\n return {\n center,\n left: this.buildNode(leftIntervals),\n right: this.buildNode(rightIntervals),\n overlapping,\n }\n }\n\n query(start: number, end: number): T[] {\n const results: T[] = []\n this.queryNode(this.root, start, end, results)\n return results\n }\n\n private queryNode(\n node: TreeNode<T> | null,\n start: number,\n end: number,\n results: T[],\n ): void {\n if (node === null) return\n\n for (const iv of node.overlapping) {\n if (iv.start <= end && iv.end >= start) {\n results.push(iv.item)\n }\n }\n\n if (start <= node.center && node.left !== null) {\n this.queryNode(node.left, start, end, results)\n }\n\n if (end >= node.center && node.right !== null) {\n this.queryNode(node.right, start, end, results)\n }\n }\n}\n","import type { Item } from '../types'\nimport type { HierarchyEngine } from './HierarchyEngine'\n\nexport interface ItemLayout {\n stackLevel: number\n itemHeight: number\n}\n\nexport class LayoutEngine {\n private readonly lineHeight: number\n private readonly itemHeightRatio: number\n private layoutCache: Map<number, ItemLayout> = new Map()\n private groupMaxStack: Map<string | number, number> = new Map()\n\n constructor(lineHeight: number, itemHeightRatio: number) {\n this.lineHeight = lineHeight\n this.itemHeightRatio = itemHeightRatio\n }\n\n computeLayout(items: Item[], stackItems: boolean, hierarchy?: HierarchyEngine): Map<number, ItemLayout> {\n this.layoutCache = new Map()\n this.groupMaxStack = new Map()\n\n const itemHeight = this.lineHeight * this.itemHeightRatio\n const summaryHeight = itemHeight * 0.6\n\n if (!stackItems) {\n for (const item of items) {\n const isSummary = hierarchy?.isParent(item.id) ?? false\n this.layoutCache.set(item.id, { stackLevel: 0, itemHeight: isSummary ? summaryHeight : itemHeight })\n this.groupMaxStack.set(item.group, 0)\n }\n return this.layoutCache\n }\n\n // Group items by group id\n const byGroup = new Map<string | number, Item[]>()\n for (const item of items) {\n let arr = byGroup.get(item.group)\n if (!arr) {\n arr = []\n byGroup.set(item.group, arr)\n }\n arr.push(item)\n }\n\n for (const [groupId, groupItems] of byGroup) {\n if (hierarchy) {\n this.computeHierarchyLayout(groupItems, hierarchy, itemHeight, summaryHeight, groupId)\n } else {\n this.computeFlatLayout(groupItems, itemHeight, groupId)\n }\n }\n\n return this.layoutCache\n }\n\n private computeFlatLayout(groupItems: Item[], itemHeight: number, groupId: string | number): void {\n groupItems.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of groupItems) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n private computeHierarchyLayout(\n groupItems: Item[],\n hierarchy: HierarchyEngine,\n itemHeight: number,\n summaryHeight: number,\n groupId: string | number,\n ): void {\n // Separate leaf items from parents\n const leaves: Item[] = []\n const parents: Item[] = []\n for (const item of groupItems) {\n if (hierarchy.isParent(item.id)) {\n parents.push(item)\n } else {\n leaves.push(item)\n }\n }\n\n // Stack leaves first using sweep-line\n leaves.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of leaves) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n // Stack parents above leaves, sorted by nesting depth\n // Deepest parents first (closest to children), shallowest last (on top)\n parents.sort((a, b) => hierarchy.getNestingDepth(b.id) - hierarchy.getNestingDepth(a.id))\n\n let nextLevel = leaves.length > 0 ? maxLevel + 1 : 0\n for (const parent of parents) {\n this.layoutCache.set(parent.id, { stackLevel: nextLevel, itemHeight: summaryHeight })\n if (nextLevel > maxLevel) maxLevel = nextLevel\n nextLevel++\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n getLayout(itemId: number): ItemLayout | undefined {\n return this.layoutCache.get(itemId)\n }\n\n getGroupHeight(groupId: string | number): number {\n const maxStack = this.groupMaxStack.get(groupId) ?? 0\n return (maxStack + 1) * this.lineHeight\n }\n}\n","interface HierarchyItem {\n id: number\n start_time: number\n end_time: number\n parentId?: number\n}\n\nexport class HierarchyEngine {\n private parentToChildren: Map<number, number[]> = new Map()\n private childToParent: Map<number, number> = new Map()\n private itemMap: Map<number, HierarchyItem> = new Map()\n private depthCache: Map<number, number> = new Map()\n\n rebuild(items: HierarchyItem[]): void {\n this.parentToChildren = new Map()\n this.childToParent = new Map()\n this.itemMap = new Map()\n this.depthCache = new Map()\n\n for (const item of items) {\n this.itemMap.set(item.id, item)\n }\n\n for (const item of items) {\n if (item.parentId !== undefined && this.itemMap.has(item.parentId)) {\n this.childToParent.set(item.id, item.parentId)\n let children = this.parentToChildren.get(item.parentId)\n if (!children) {\n children = []\n this.parentToChildren.set(item.parentId, children)\n }\n children.push(item.id)\n }\n }\n\n // Detect and break cycles\n for (const id of this.childToParent.keys()) {\n const visited = new Set<number>()\n let current: number | undefined = id\n while (current !== undefined) {\n if (visited.has(current)) {\n const parentId = this.childToParent.get(id)!\n this.childToParent.delete(id)\n const siblings = this.parentToChildren.get(parentId)\n if (siblings) {\n const idx = siblings.indexOf(id)\n if (idx !== -1) siblings.splice(idx, 1)\n if (siblings.length === 0) this.parentToChildren.delete(parentId)\n }\n break\n }\n visited.add(current)\n current = this.childToParent.get(current)\n }\n }\n }\n\n isParent(itemId: number): boolean {\n const children = this.parentToChildren.get(itemId)\n return children !== undefined && children.length > 0\n }\n\n getParent(itemId: number): number | undefined {\n return this.childToParent.get(itemId)\n }\n\n getChildren(itemId: number): number[] {\n return this.parentToChildren.get(itemId) ?? []\n }\n\n getDescendants(itemId: number): number[] {\n const result: number[] = []\n const stack = [...this.getChildren(itemId)]\n while (stack.length > 0) {\n const id = stack.pop()!\n result.push(id)\n const children = this.parentToChildren.get(id)\n if (children) stack.push(...children)\n }\n return result\n }\n\n getEffectiveSpan(itemId: number): { start: number; end: number } {\n const item = this.itemMap.get(itemId)\n if (!item) return { start: 0, end: 0 }\n\n let start = item.start_time\n let end = item.end_time\n\n const descendants = this.getDescendants(itemId)\n for (const descId of descendants) {\n const desc = this.itemMap.get(descId)\n if (!desc) continue\n if (desc.start_time < start) start = desc.start_time\n if (desc.end_time > end) end = desc.end_time\n }\n\n return { start, end }\n }\n\n getNestingDepth(itemId: number): number {\n const cached = this.depthCache.get(itemId)\n if (cached !== undefined) return cached\n\n let depth = 0\n let current = this.childToParent.get(itemId)\n while (current !== undefined) {\n depth++\n current = this.childToParent.get(current)\n }\n this.depthCache.set(itemId, depth)\n return depth\n }\n\n getMoveDelta(itemId: number, newStart: number): { itemId: number; newStart: number }[] {\n const item = this.itemMap.get(itemId)\n if (!item) return []\n\n const delta = newStart - item.start_time\n const descendants = this.getDescendants(itemId)\n return descendants.map(descId => {\n const desc = this.itemMap.get(descId)!\n return { itemId: descId, newStart: desc.start_time + delta }\n })\n }\n\n getResizeConstraint(itemId: number, edge: 'left' | 'right'): { min: number; max: number } {\n const children = this.getDescendants(itemId)\n if (children.length === 0) {\n return edge === 'left'\n ? { min: -Infinity, max: Infinity }\n : { min: -Infinity, max: Infinity }\n }\n\n if (edge === 'left') {\n let minChildStart = Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.start_time < minChildStart) {\n minChildStart = child.start_time\n }\n }\n return { min: -Infinity, max: minChildStart }\n } else {\n let maxChildEnd = -Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.end_time > maxChildEnd) {\n maxChildEnd = child.end_time\n }\n }\n return { min: maxChildEnd, max: Infinity }\n }\n }\n}\n","import type { Item, ItemBounds, ItemState, DrawHelpers, TimelineTheme } from '../types'\n\nexport function defaultSummaryRenderer(\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n _helpers: DrawHelpers,\n theme: TimelineTheme,\n): void {\n const { x, y, width, height } = bounds\n const color = theme.primary\n\n // Semi-transparent fill\n ctx.globalAlpha = 0.15\n ctx.fillStyle = color\n ctx.fillRect(x, y, width, height)\n ctx.globalAlpha = 1\n\n // Border\n ctx.strokeStyle = color\n ctx.lineWidth = 1.5\n ctx.strokeRect(x, y, width, height)\n\n // Diamond marker at start edge\n const diamondSize = Math.min(height * 0.5, 6)\n const midY = y + height / 2\n\n ctx.fillStyle = color\n // Left diamond\n ctx.beginPath()\n ctx.moveTo(x, midY)\n ctx.lineTo(x + diamondSize, midY - diamondSize)\n ctx.lineTo(x + diamondSize * 2, midY)\n ctx.lineTo(x + diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Right diamond\n ctx.beginPath()\n ctx.moveTo(x + width, midY)\n ctx.lineTo(x + width - diamondSize, midY - diamondSize)\n ctx.lineTo(x + width - diamondSize * 2, midY)\n ctx.lineTo(x + width - diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Title text centered\n const title = (item as { title?: string }).title\n if (title && width > 30) {\n ctx.fillStyle = theme.item.text\n ctx.font = '500 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n const textWidth = ctx.measureText(title).width\n const maxTextWidth = width - diamondSize * 4 - 4\n if (maxTextWidth > 20) {\n const displayText = textWidth > maxTextWidth\n ? title.slice(0, Math.floor(title.length * maxTextWidth / textWidth)) + '...'\n : title\n ctx.fillText(displayText, x + width / 2 - Math.min(textWidth, maxTextWidth) / 2, midY)\n }\n }\n\n // Selected ring\n if (state.selected) {\n ctx.strokeStyle = theme.item.selectedRing\n ctx.lineWidth = 2\n ctx.strokeRect(x - 1, y - 1, width + 2, height + 2)\n }\n}\n","import type { Item, Group } from '../types'\nimport type { ViewState } from './ViewState'\nimport type { IntervalTree } from './IntervalTree'\nimport type { LayoutEngine } from './LayoutEngine'\n\nexport function hitTest(\n canvasX: number,\n canvasY: number,\n view: ViewState,\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n groups: Group[],\n): Item | null {\n const time = view.xToTime(canvasX)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const candidates = tree.query(time, time)\n\n let topItem: Item | null = null\n let topY = -Infinity\n\n for (const item of candidates) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n if (canvasX < x || canvasX > x + width) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const height = itemLayout.itemHeight\n\n if (canvasY < y || canvasY > y + height) continue\n\n if (y > topY) {\n topY = y\n topItem = item\n }\n }\n\n return topItem\n}\n\nexport function hitTestGroup(\n canvasY: number,\n view: ViewState,\n groups: Group[],\n): Group | null {\n const groupIndex = view.yToGroupIndex(canvasY)\n return groups[groupIndex] ?? null\n}\n\nexport function detectEdge(\n canvasX: number,\n item: Item,\n view: ViewState,\n threshold: number = 6,\n): 'left' | 'right' | 'body' {\n const leftX = view.timeToX(item.start_time)\n const rightX = view.timeToX(item.end_time)\n if (canvasX - leftX <= threshold) return 'left'\n if (rightX - canvasX <= threshold) return 'right'\n return 'body'\n}\n\n/**\n * Resolve the effective `canResize` for an item: a per-item `item.canResize`\n * wins when present, otherwise the timeline-wide `globalCanResize` applies.\n * Uses `??` (not `||`) so an explicit per-item `false` disables resize rather\n * than falling through to the global value.\n */\nexport function resolveCanResize(\n item: Item,\n globalCanResize: false | 'left' | 'right' | 'both',\n): false | 'left' | 'right' | 'both' {\n return item.canResize ?? globalCanResize\n}\n\n/**\n * Resolve the effective `canMove` for an item: a per-item `item.canMove` wins\n * when present, otherwise the timeline-wide `globalCanMove` applies. Uses `??`\n * (not `||`) so an explicit per-item `false` disables moving rather than\n * falling through to the global value.\n */\nexport function resolveCanMove(item: Item, globalCanMove: boolean): boolean {\n return item.canMove ?? globalCanMove\n}\n","/**\n * Resize the canvas buffer only when dimensions actually change.\n * Setting canvas.width/height is destructive (clears buffer + resets state),\n * so we avoid it unless necessary.\n */\nexport function setupCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n): CanvasRenderingContext2D {\n const dpr = window.devicePixelRatio || 1\n const targetW = Math.round(width * dpr)\n const targetH = Math.round(height * dpr)\n\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW\n canvas.height = targetH\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n }\n\n const ctx = canvas.getContext('2d')!\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n return ctx\n}\n\nexport function clearCanvas(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const dpr = window.devicePixelRatio || 1\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr)\n}\n\nexport type LayerName = 'grid' | 'items' | 'overlay'\n\nexport interface DirtyFlags {\n grid: boolean\n items: boolean\n overlay: boolean\n}\n\nexport class RenderScheduler {\n private dirty: DirtyFlags = { grid: false, items: false, overlay: false }\n private rafId: number | null = null\n private drawCallback: (flags: DirtyFlags) => void\n\n constructor(drawCallback: (flags: DirtyFlags) => void) {\n this.drawCallback = drawCallback\n }\n\n markDirty(layer: LayerName): void {\n this.dirty[layer] = true\n this.schedule()\n }\n\n markAllDirty(): void {\n this.dirty.grid = true\n this.dirty.items = true\n this.dirty.overlay = true\n this.schedule()\n }\n\n dispose(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private schedule(): void {\n if (this.rafId !== null) return\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null\n const flags = { ...this.dirty }\n this.dirty.grid = false\n this.dirty.items = false\n this.dirty.overlay = false\n this.drawCallback(flags)\n })\n }\n}\n","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport tz from 'dayjs/plugin/timezone'\n\ndayjs.extend(utc)\ndayjs.extend(tz)\n\nexport function toDayjs(ts: number, timezone?: string): dayjs.Dayjs {\n return timezone ? dayjs(ts).tz(timezone) : dayjs(ts)\n}\n","import { toDayjs } from '../utils/timezone'\nimport type { Group, TimelineTheme, DayStyle, RowStyle, TimeRangeHighlight } from '../types'\nimport type { ViewState } from '../core/ViewState'\n\nexport class GridLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n theme: TimelineTheme,\n dayStyle?: (date: Date) => DayStyle | null,\n rowStyle?: (group: Group) => RowStyle | null,\n highlights?: TimeRangeHighlight[],\n timezone?: string,\n ): void {\n const { firstVisible, lastVisible } = view.getVisibleGroupRange()\n\n // Draw row backgrounds\n for (let i = firstVisible; i <= lastVisible; i++) {\n const y = view.groupIndexToY(i)\n const rowHeight = view.groupIndexToHeight(i)\n const group = groups[i]\n if (!group) continue\n\n let bgColor: string\n const customRow = rowStyle?.(group)\n if (customRow?.backgroundColor) {\n bgColor = customRow.backgroundColor\n } else {\n bgColor = i % 2 === 0 ? '#FFFFFF' : theme.grid.rowAlt\n }\n\n ctx.fillStyle = bgColor\n ctx.fillRect(0, y, view.canvasWidth, rowHeight)\n\n // Row separator\n ctx.strokeStyle = customRow?.borderBottomColor ?? theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(view.canvasWidth, y + rowHeight)\n ctx.stroke()\n }\n\n // Draw time range highlight backgrounds (under grid lines)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n const opacity = h.opacity ?? 0.12\n const r = parseInt(h.color.slice(1, 3), 16)\n const g = parseInt(h.color.slice(3, 5), 16)\n const b = parseInt(h.color.slice(5, 7), 16)\n ctx.fillStyle = `rgb(${Math.round(r * opacity + 255 * (1 - opacity))},${Math.round(g * opacity + 255 * (1 - opacity))},${Math.round(b * opacity + 255 * (1 - opacity))})`\n ctx.fillRect(x, 0, w, view.canvasHeight)\n }\n }\n\n // Draw day columns, backgrounds, and vertical grid lines\n const visibleStart = view.visibleTimeStart\n const visibleEnd = view.visibleTimeEnd\n const visibleDuration = visibleEnd - visibleStart\n const dayMs = 86400000\n const dayPixelWidth = (dayMs / visibleDuration) * view.canvasWidth\n\n // Determine grid line interval based on zoom level\n let stepUnit: 'day' | 'week' | 'month' = 'day'\n if (dayPixelWidth < 2) stepUnit = 'month'\n else if (dayPixelWidth < 8) stepUnit = 'week'\n\n // Draw day backgrounds (dayStyle + weekends) — batch consecutive same-style days\n if (dayStyle || true) { // always draw weekends\n let current = toDayjs(visibleStart, timezone).startOf('day')\n const end = toDayjs(visibleEnd, timezone).endOf('day')\n\n // Batch: track current fill color and start x\n let batchColor: string | null = null\n let batchOpacity = 1\n let batchStartX = 0\n const customBorderLines: { x: number; color: string }[] = []\n\n const flushBatch = (endX: number) => {\n if (batchColor !== null) {\n ctx.fillStyle = batchColor\n if (batchOpacity !== 1) ctx.globalAlpha = batchOpacity\n ctx.fillRect(batchStartX, 0, endX - batchStartX, view.canvasHeight)\n if (batchOpacity !== 1) ctx.globalAlpha = 1\n batchColor = null\n batchOpacity = 1\n }\n }\n\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n\n const date = current.toDate()\n const custom = dayStyle?.(date)\n let color: string | null = null\n let opacity = 1\n\n if (custom?.backgroundColor) {\n color = custom.backgroundColor\n opacity = custom.opacity ?? 1\n } else {\n const dow = current.day()\n if (dow === 0 || dow === 6) {\n color = theme.grid.weekend\n }\n }\n\n // Collect custom border colors for later drawing\n if (custom?.borderColor) {\n customBorderLines.push({ x, color: custom.borderColor })\n }\n\n // Batch consecutive same-color fills\n if (color === batchColor && opacity === batchOpacity) {\n // extend batch\n } else {\n flushBatch(x)\n if (color !== null) {\n batchColor = color\n batchOpacity = opacity\n batchStartX = x\n }\n }\n\n current = current.add(1, 'day')\n }\n // Flush remaining batch\n if (batchColor !== null) {\n flushBatch(view.timeToX(current.valueOf()))\n }\n\n // Draw custom border lines from dayStyle\n for (const line of customBorderLines) {\n ctx.strokeStyle = line.color\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(line.x, 0)\n ctx.lineTo(line.x, view.canvasHeight)\n ctx.stroke()\n }\n }\n\n // Draw vertical grid lines at appropriate interval\n let current = toDayjs(visibleStart, timezone).startOf(stepUnit)\n const end = toDayjs(visibleEnd, timezone).add(1, stepUnit)\n\n ctx.strokeStyle = theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n ctx.moveTo(x, 0)\n ctx.lineTo(x, view.canvasHeight)\n current = current.add(1, stepUnit)\n }\n ctx.stroke()\n\n // Draw time range highlight edge lines and labels (after grid lines so they render on top)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n // Edge lines\n ctx.strokeStyle = h.color\n ctx.globalAlpha = 0.4\n ctx.lineWidth = 1\n ctx.beginPath()\n if (x1 >= 0 && x1 <= view.canvasWidth) {\n ctx.moveTo(x1, 0)\n ctx.lineTo(x1, view.canvasHeight)\n }\n if (x2 >= 0 && x2 <= view.canvasWidth) {\n ctx.moveTo(x2, 0)\n ctx.lineTo(x2, view.canvasHeight)\n }\n ctx.stroke()\n ctx.globalAlpha = 1\n\n // Label badge\n if (h.label) {\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n ctx.save()\n ctx.font = '600 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(h.label).width\n const padding = 6\n const badgeWidth = textWidth + padding * 2\n const badgeHeight = 18\n const badgeX = x + (w - badgeWidth) / 2\n const badgeY = 4\n\n ctx.fillStyle = h.color\n ctx.globalAlpha = 0.9\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.globalAlpha = 1\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n ctx.fillText(h.label, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n }\n}\n","import type { DrawHelpers, ItemBounds } from '../types'\n\nconst ITEM_FONT = '500 12px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\n/**\n * Creates a DrawHelpers object bound to the given canvas context and optional item bounds.\n * These helpers are passed to every itemRenderer call to simplify common canvas operations.\n */\nexport function createDrawHelpers(\n ctx: CanvasRenderingContext2D,\n bounds?: ItemBounds,\n): DrawHelpers {\n return {\n /**\n * Draws a filled rounded rectangle.\n * Default corner radius is 3px.\n */\n roundRect(x: number, y: number, w: number, h: number, radius = 3): void {\n ctx.beginPath()\n ctx.roundRect(x, y, w, h, radius)\n ctx.fill()\n },\n\n /**\n * Draws text at (x, y) using the standard item font.\n * If maxWidth is provided and the text is too wide, binary-search truncates it\n * and appends '...' so it fits within maxWidth.\n */\n fillText(text: string, x: number, y: number, maxWidth?: number): void {\n ctx.font = ITEM_FONT\n\n if (maxWidth !== undefined && ctx.measureText(text).width > maxWidth) {\n // Binary-search for the longest prefix that fits with '...' appended\n let lo = 0\n let hi = text.length\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2)\n const candidate = text.slice(0, mid) + '...'\n if (ctx.measureText(candidate).width <= maxWidth) {\n lo = mid\n } else {\n hi = mid - 1\n }\n }\n ctx.fillText(text.slice(0, lo) + '...', x, y)\n } else {\n ctx.fillText(text, x, y)\n }\n },\n\n /**\n * Creates a 50/50 linear gradient from color1 (0%–50%) to color2 (50%–100%)\n * spanning the given x position and width.\n */\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient {\n const grad = ctx.createLinearGradient(x, 0, x + w, 0)\n grad.addColorStop(0, color1)\n grad.addColorStop(0.5, color1)\n grad.addColorStop(0.5, color2)\n grad.addColorStop(1, color2)\n return grad\n },\n\n /**\n * Draws a vertical colored bar on the left edge of the item bounds.\n * Does nothing if no bounds were provided.\n */\n leftBar(color: string, width = 3): void {\n if (!bounds) return\n ctx.save()\n ctx.fillStyle = color\n ctx.fillRect(bounds.x, bounds.y, width, bounds.height)\n ctx.restore()\n },\n\n /**\n * Draws a vector icon centered at (x, y).\n * Supported types: 'check', 'danger-red', 'danger-yellow'.\n * Default size is 14px.\n */\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size = 14): void {\n ctx.save()\n const half = size / 2\n\n if (type === 'check') {\n // Green circle with white checkmark\n ctx.fillStyle = '#31c48d'\n ctx.beginPath()\n ctx.arc(x + half, y + half, half, 0, Math.PI * 2)\n ctx.fill()\n\n // Draw checkmark path\n ctx.strokeStyle = '#ffffff'\n ctx.lineWidth = size * 0.12\n ctx.beginPath()\n const cx = x + half\n const cy = y + half\n ctx.moveTo(cx - half * 0.45, cy)\n ctx.lineTo(cx - half * 0.1, cy + half * 0.42)\n ctx.lineTo(cx + half * 0.45, cy - half * 0.35)\n ctx.stroke()\n } else if (type === 'danger-red' || type === 'danger-yellow') {\n const fillColor = type === 'danger-red' ? '#EF5350' : '#FBBF24'\n\n // Triangle background\n ctx.fillStyle = fillColor\n ctx.beginPath()\n ctx.moveTo(x + half, y) // top-center\n ctx.lineTo(x + size, y + size) // bottom-right\n ctx.lineTo(x, y + size) // bottom-left\n ctx.closePath()\n ctx.fill()\n\n // Exclamation mark stem\n ctx.fillStyle = '#ffffff'\n const stemW = size * 0.12\n const stemX = x + half - stemW / 2\n ctx.fillRect(stemX, y + size * 0.35, stemW, size * 0.35)\n\n // Exclamation mark dot\n ctx.beginPath()\n ctx.arc(x + half, y + size * 0.82, stemW * 0.7, 0, Math.PI * 2)\n ctx.fill()\n }\n\n ctx.restore()\n },\n\n /**\n * Draws a pill-shaped badge with centered white text on a colored background.\n */\n badge(text: string, x: number, y: number, bgColor: string): void {\n ctx.save()\n\n // Measure text to size the pill\n ctx.font = ITEM_FONT\n const textMetrics = ctx.measureText(text)\n const textWidth = textMetrics.width\n const paddingH = 8\n const paddingV = 3\n const pillHeight = 12 + paddingV * 2\n const pillWidth = textWidth + paddingH * 2\n const radius = pillHeight / 2\n\n // Draw pill background\n ctx.fillStyle = bgColor\n ctx.beginPath()\n ctx.roundRect(x, y, pillWidth, pillHeight, radius)\n ctx.fill()\n\n // Draw centered white text\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, x + pillWidth / 2, y + pillHeight / 2)\n\n ctx.restore()\n },\n }\n}\n","import type {\n Item, Group, TimelineTheme, CanvasItemRenderer, CanvasGroupItemRenderer,\n Dependency, ItemBounds, ItemState,\n} from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { IntervalTree } from '../core/IntervalTree'\nimport type { LayoutEngine } from '../core/LayoutEngine'\nimport type { HierarchyEngine } from '../core/HierarchyEngine'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport class ItemsLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n items: Item[],\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n itemRenderer: CanvasItemRenderer,\n groupRenderer: CanvasGroupItemRenderer | undefined,\n theme: TimelineTheme,\n selected: number[],\n hoveredItemId: number | undefined,\n dependencies?: Dependency[],\n summaryRenderer?: CanvasItemRenderer,\n hierarchy?: HierarchyEngine,\n ): void {\n // Query only visible time range + small padding (not the full 4x buffer)\n const padding = (view.visibleTimeEnd - view.visibleTimeStart) * 0.1\n const queryStart = view.visibleTimeStart - padding\n const queryEnd = view.visibleTimeEnd + padding\n const visibleItems = tree.query(queryStart, queryEnd)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const selectedSet = new Set(selected)\n const itemBoundsMap = new Map<number, ItemBounds>()\n\n // Vertical culling bounds\n const yMin = -view.lineHeight\n const yMax = view.canvasHeight + view.lineHeight\n\n for (const item of visibleItems) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n\n // Skip items that are entirely off-screen vertically\n const height = itemLayout.itemHeight\n if (y + height < yMin || y > yMax) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n const bounds: ItemBounds = { x, y, width, height }\n itemBoundsMap.set(item.id, bounds)\n\n const state: ItemState = {\n selected: selectedSet.has(item.id),\n hovered: hoveredItemId === item.id,\n dragging: false,\n filtered: item.filtered !== false,\n }\n\n ctx.save()\n const helpers = createDrawHelpers(ctx, bounds)\n let renderer: CanvasItemRenderer\n if (summaryRenderer && hierarchy?.isParent(item.id)) {\n renderer = summaryRenderer\n } else if (groupRenderer && (item.type === 'control_area_group' || item.type === 'construction_train')) {\n renderer = groupRenderer\n } else {\n renderer = itemRenderer\n }\n renderer(ctx, item, bounds, state, helpers)\n ctx.restore()\n }\n\n if (dependencies && dependencies.length > 0) {\n // Build a full item map for dependency endpoint lookup (off-screen items too)\n const depItemIds = new Set<number>()\n for (const dep of dependencies) {\n if (!itemBoundsMap.has(dep.fromItemId)) depItemIds.add(dep.fromItemId)\n if (!itemBoundsMap.has(dep.toItemId)) depItemIds.add(dep.toItemId)\n }\n if (depItemIds.size > 0) {\n const itemMap = new Map<number, Item>()\n for (const item of items) {\n if (depItemIds.has(item.id)) itemMap.set(item.id, item)\n }\n for (const [id, item] of itemMap) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n const itemLayout = layout.getLayout(id)\n if (!itemLayout) continue\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n itemBoundsMap.set(id, { x, y, width, height: itemLayout.itemHeight })\n }\n }\n this.drawDependencies(ctx, dependencies, itemBoundsMap, hoveredItemId, theme)\n }\n }\n\n private drawDependencies(\n ctx: CanvasRenderingContext2D,\n dependencies: Dependency[],\n boundsMap: Map<number, ItemBounds>,\n hoveredItemId: number | undefined,\n theme: TimelineTheme,\n ): void {\n for (const dep of dependencies) {\n const fromBounds = boundsMap.get(dep.fromItemId)\n const toBounds = boundsMap.get(dep.toItemId)\n if (!fromBounds || !toBounds) continue\n\n const isHighlighted = hoveredItemId === dep.fromItemId || hoveredItemId === dep.toItemId\n\n ctx.strokeStyle = isHighlighted ? theme.primary : (dep.color ?? '#94A3B8')\n ctx.lineWidth = isHighlighted ? 2 : 1.5\n ctx.setLineDash([])\n\n const startX = fromBounds.x + fromBounds.width\n const startY = fromBounds.y + fromBounds.height / 2\n const endX = toBounds.x\n const endY = toBounds.y + toBounds.height / 2\n\n const dx = Math.abs(endX - startX)\n const cpOffset = Math.max(dx * 0.4, 30)\n\n ctx.beginPath()\n ctx.moveTo(startX, startY)\n ctx.bezierCurveTo(startX + cpOffset, startY, endX - cpOffset, endY, endX, endY)\n ctx.stroke()\n\n // Arrowhead\n const arrowSize = 6\n ctx.fillStyle = ctx.strokeStyle\n ctx.beginPath()\n ctx.moveTo(endX, endY)\n ctx.lineTo(endX - arrowSize, endY - arrowSize / 2)\n ctx.lineTo(endX - arrowSize, endY + arrowSize / 2)\n ctx.closePath()\n ctx.fill()\n }\n }\n}\n","import type { TimelineTheme, MarkerConfig, ItemBounds, Item, CanvasItemRenderer } from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { InteractionMode } from '../interaction/InteractionHandler'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport interface InteractionRenderState {\n item: Item\n mode: InteractionMode\n bounds: ItemBounds\n renderer: CanvasItemRenderer\n targetGroupY?: number\n groupChanged?: boolean\n}\n\nexport interface OverlayDrawOptions {\n cursorX: number | null\n snapX?: number | null\n markers?: MarkerConfig[]\n\n interaction?: InteractionRenderState | null\n}\n\nexport class OverlayLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n theme: TimelineTheme,\n options: OverlayDrawOptions,\n ): void {\n const { cursorX, snapX, markers, interaction } = options\n\n // Draw markers\n if (markers) {\n for (const marker of markers) {\n const x = view.timeToX(marker.date)\n\n ctx.fillStyle = marker.color\n ctx.fillRect(x - marker.width / 2, 0, marker.width, view.canvasHeight)\n\n if (marker.label) {\n ctx.save()\n ctx.font = '500 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(marker.label).width\n const padding = 8\n const maxBadgeWidth = 200\n const badgeWidth = Math.min(textWidth + padding * 2, maxBadgeWidth)\n const badgeHeight = 20\n const badgeX = x - badgeWidth / 2\n const badgeY = 4\n\n ctx.fillStyle = marker.color\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n const maxTextWidth = maxBadgeWidth - padding * 2\n const displayText = textWidth > maxTextWidth\n ? marker.label.slice(0, Math.floor(marker.label.length * maxTextWidth / textWidth)) + '…'\n : marker.label\n ctx.fillText(displayText, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n\n // Draw cursor line\n if (cursorX !== null && cursorX !== undefined) {\n ctx.strokeStyle = theme.marker.cursor\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(cursorX, 0)\n ctx.lineTo(cursorX, view.canvasHeight)\n ctx.stroke()\n }\n\n // Draw snap guide line\n if (snapX !== null && snapX !== undefined) {\n ctx.strokeStyle = theme.primary\n ctx.lineWidth = 1\n ctx.setLineDash([4, 4])\n ctx.beginPath()\n ctx.moveTo(snapX, 0)\n ctx.lineTo(snapX, view.canvasHeight)\n ctx.stroke()\n ctx.setLineDash([])\n }\n\n // Draw interaction ghost (move, resize-left, resize-right)\n if (interaction) {\n // Group highlight band when moving to a different group\n if (interaction.groupChanged && interaction.targetGroupY !== undefined) {\n ctx.fillStyle = 'rgba(59, 130, 246, 0.08)'\n ctx.fillRect(0, interaction.targetGroupY, view.canvasWidth, view.lineHeight)\n }\n\n ctx.save()\n ctx.globalAlpha = 0.5\n const helpers = createDrawHelpers(ctx, interaction.bounds)\n interaction.renderer(\n ctx, interaction.item, interaction.bounds,\n { selected: false, hovered: false, dragging: true, filtered: true },\n helpers,\n )\n ctx.restore()\n }\n }\n}\n","const MAX_DELTA = 120\n\n/**\n * Normalize wheel delta across browsers/platforms.\n * deltaMode 0 = pixels, 1 = lines (×15), 2 = pages (×800).\n * Clamp to ±120 to prevent erratic jumps.\n */\nfunction normalizeDelta(e: WheelEvent): number {\n let delta = e.deltaY || e.deltaX\n if (e.deltaMode === 1) delta *= 15\n else if (e.deltaMode === 2) delta *= 800\n return Math.max(-MAX_DELTA, Math.min(MAX_DELTA, delta))\n}\n\nexport class ZoomHandler {\n private onZoom: (newStart: number, newEnd: number) => void\n private visibleTimeStart: number\n private visibleTimeEnd: number\n private minZoom: number\n private maxZoom: number\n\n constructor(\n onZoom: (newStart: number, newEnd: number) => void,\n visibleTimeStart: number,\n visibleTimeEnd: number,\n minZoom: number,\n maxZoom: number,\n ) {\n this.onZoom = onZoom\n this.visibleTimeStart = visibleTimeStart\n this.visibleTimeEnd = visibleTimeEnd\n this.minZoom = minZoom\n this.maxZoom = maxZoom\n }\n\n updateBounds(start: number, end: number): void {\n this.visibleTimeStart = start\n this.visibleTimeEnd = end\n }\n\n handleWheelZoom(e: WheelEvent, cursorRatio: number): void {\n const delta = normalizeDelta(e)\n // Speed: ctrlKey (trackpad pinch) = 10, metaKey = 3, altKey = 1\n const speed = e.ctrlKey ? 10 : e.metaKey ? 3 : 1\n\n // Reciprocal formula for symmetric zoom-in / zoom-out\n const scale = delta > 0\n ? 1.0 + (speed * delta) / 500\n : 1.0 / (1.0 + (speed * -delta) / 500)\n\n const currentDuration = this.visibleTimeEnd - this.visibleTimeStart\n let newDuration = Math.round(currentDuration * scale)\n newDuration = Math.max(this.minZoom, Math.min(this.maxZoom, newDuration))\n\n const newStart = Math.round(this.visibleTimeStart + (currentDuration - newDuration) * cursorRatio)\n const newEnd = newStart + newDuration\n\n this.onZoom(newStart, newEnd)\n }\n}\n","import type { Item } from '../types'\n\nconst ACTIVATION_THRESHOLD = 4\n\nexport type InteractionMode = 'move' | 'resize-left' | 'resize-right'\n\nexport interface InteractionState {\n item: Item\n mode: InteractionMode\n startX: number\n startY: number\n currentX: number\n currentY: number\n deltaX: number\n originalGroup: string | number\n currentGroup: string | number\n}\n\nexport class InteractionHandler {\n private state: InteractionState | null = null\n private dragSnap: number\n private activated = false\n\n constructor(dragSnap: number) {\n this.dragSnap = dragSnap\n }\n\n startInteraction(item: Item, mode: InteractionMode, x: number, y: number): void {\n this.state = {\n item, mode, startX: x, startY: y, currentX: x, currentY: y,\n deltaX: 0, originalGroup: item.group, currentGroup: item.group,\n }\n this.activated = false\n }\n\n update(x: number, y: number): void {\n if (!this.state) return\n this.state.currentX = x\n this.state.currentY = y\n this.state.deltaX = x - this.state.startX\n if (!this.activated && Math.abs(this.state.deltaX) >= ACTIVATION_THRESHOLD) {\n this.activated = true\n }\n }\n\n setCurrentGroup(groupId: string | number): void {\n if (this.state) this.state.currentGroup = groupId\n }\n\n endMove(pixelsPerMs: number): { newStartTime: number; newGroupId: string | number } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const newStartTime = this.state.item.start_time + deltaMs\n const snapped = Math.round(newStartTime / this.dragSnap) * this.dragSnap\n const newGroupId = this.state.currentGroup\n this.state = null\n this.activated = false\n return { newStartTime: snapped, newGroupId }\n }\n\n endResize(pixelsPerMs: number): { newTime: number; edge: 'left' | 'right' } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const edge = this.state.mode === 'resize-left' ? 'left' as const : 'right' as const\n const baseTime = edge === 'left' ? this.state.item.start_time : this.state.item.end_time\n const newTime = baseTime + deltaMs\n const snapped = Math.round(newTime / this.dragSnap) * this.dragSnap\n this.state = null\n this.activated = false\n return { newTime: snapped, edge }\n }\n\n cancel(): void {\n this.state = null\n this.activated = false\n }\n\n getState(): InteractionState | null {\n return this.state\n }\n\n getMode(): InteractionMode | null {\n return this.state?.mode ?? null\n }\n\n isActive(): boolean {\n return this.state !== null && this.activated\n }\n\n isPending(): boolean {\n return this.state !== null\n }\n}\n","interface SnapItem {\n id: number\n start_time: number\n end_time: number\n}\n\n/**\n * Collect start and end X positions from all items except the dragged item.\n */\nexport function collectItemEdges(\n items: SnapItem[],\n excludeItemId: number,\n timeToX: (time: number) => number,\n): number[] {\n const edges: number[] = []\n for (const item of items) {\n if (item.id === excludeItemId) continue\n edges.push(timeToX(item.start_time))\n edges.push(timeToX(item.end_time))\n }\n return edges\n}\n\n/**\n * Find the best snap target from a list of edge X positions.\n * Returns the snapped X position if an edge is within threshold, or null to fall back to time-grid snap.\n */\nexport function findSnapTarget(\n currentX: number,\n edgeXPositions: number[],\n thresholdPx: number,\n _pixelsPerMs: number,\n _dragSnap: number,\n): number | null {\n if (edgeXPositions.length === 0) return null\n\n let closestX = edgeXPositions[0]\n let closestDist = Math.abs(currentX - closestX)\n\n for (let i = 1; i < edgeXPositions.length; i++) {\n const dist = Math.abs(currentX - edgeXPositions[i])\n if (dist < closestDist) {\n closestDist = dist\n closestX = edgeXPositions[i]\n }\n }\n\n if (closestDist <= thresholdPx) {\n return closestX\n }\n\n return null\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){\"use strict\";var e=\"day\";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf(\"year\"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,\"week\")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return\"isoweek\"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf(\"day\"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf(\"day\"):n.bind(this)(e,t)}}}));","import React, { useRef, useCallback, useEffect, useMemo } from 'react'\nimport type { Group, TimelineTheme } from '../types'\n\ninterface SidebarProps {\n groups: Group[]\n width: number\n lineHeight: number\n groupHeights?: number[]\n scrollTop: number\n canvasHeight: number\n theme: TimelineTheme\n groupRenderer: (group: Group) => React.ReactNode\n onScroll: (scrollTop: number) => void\n}\n\nconst OVERSCAN_PX = 200\n\nexport function Sidebar({\n groups, width, lineHeight, groupHeights, scrollTop, canvasHeight, theme, groupRenderer, onScroll,\n}: SidebarProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false)\n\n // Cumulative top-edge offsets per group: length = groups.length + 1.\n const offsets = useMemo(() => {\n const arr = new Array<number>(groups.length + 1)\n arr[0] = 0\n for (let i = 0; i < groups.length; i++) {\n arr[i + 1] = arr[i] + (groupHeights?.[i] ?? lineHeight)\n }\n return arr\n }, [groups.length, groupHeights, lineHeight])\n\n const totalHeight = offsets[groups.length] ?? 0\n const displayHeight = canvasHeight\n\n // Binary search for the group containing a given y; clamped to [0, groups.length - 1].\n const groupAtY = useCallback((y: number): number => {\n if (groups.length === 0) return 0\n if (y <= 0) return 0\n if (y >= totalHeight) return groups.length - 1\n let lo = 0\n let hi = groups.length - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (offsets[mid + 1] > y) hi = mid\n else lo = mid + 1\n }\n return lo\n }, [groups.length, offsets, totalHeight])\n\n const firstVisible = groupAtY(scrollTop - OVERSCAN_PX)\n const lastVisible = groupAtY(scrollTop + canvasHeight + OVERSCAN_PX)\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n if (isScrollingRef.current) return\n onScroll(e.currentTarget.scrollTop)\n }, [onScroll])\n\n useEffect(() => {\n if (containerRef.current) {\n isScrollingRef.current = true\n containerRef.current.scrollTop = scrollTop\n requestAnimationFrame(() => { isScrollingRef.current = false })\n }\n }, [scrollTop])\n\n const visibleGroups = []\n for (let i = firstVisible; i <= lastVisible; i++) {\n const group = groups[i]\n if (!group) continue\n const top = offsets[i]\n const height = offsets[i + 1] - top\n visibleGroups.push(\n <div\n key={group.id}\n style={{\n position: 'absolute',\n top,\n height,\n width: '100%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n borderBottom: `1px solid ${theme.grid?.line ?? '#E5E5E5'}`,\n boxSizing: 'border-box',\n }}\n >\n {groupRenderer(group)}\n </div>,\n )\n }\n\n return (\n <div\n ref={containerRef}\n onScroll={handleScroll}\n style={{\n width,\n height: displayHeight,\n overflowY: totalHeight > canvasHeight ? 'auto' : 'hidden',\n overflowX: 'hidden',\n position: 'relative',\n borderRight: `1px solid ${theme.sidebar.border}`,\n backgroundColor: theme.sidebar.bg,\n }}\n >\n <div style={{ height: totalHeight, position: 'relative' }}>{visibleGroups}</div>\n </div>\n )\n}\n","import type { MarkerConfig } from '../types'\n\ninterface TodayMarkerProps {\n color?: string\n width?: number\n label?: string\n /** Auto-update interval in ms. Default 10000 (10s). Set 0 to disable. */\n interval?: number\n}\n\nexport function TodayMarker(_props: TodayMarkerProps) { return null }\nTodayMarker.displayName = 'TodayMarker'\n\nexport function getTodayMarkerConfig(props: TodayMarkerProps): MarkerConfig {\n // Snap to current minute to avoid unnecessary redraws\n const now = Math.floor(Date.now() / 60000) * 60000\n return { date: now, color: props.color ?? '#FD7171', width: props.width ?? 6, label: props.label }\n}\n\nexport function getTodayMarkerInterval(props: TodayMarkerProps): number {\n return props.interval ?? 10000\n}\n","import type { MarkerConfig } from '../types'\n\ninterface CustomMarkerProps {\n date: number\n color?: string\n width?: number\n label?: string\n}\n\nexport function CustomMarker(_props: CustomMarkerProps) { return null }\nCustomMarker.displayName = 'CustomMarker'\n\nexport function getCustomMarkerConfig(props: CustomMarkerProps): MarkerConfig {\n return {\n date: props.date,\n color: props.color ?? '#3B82F6',\n width: props.width ?? 4,\n label: props.label,\n }\n}\n","import React, { useRef, useEffect, useState, useCallback, useMemo, useImperativeHandle, forwardRef } from 'react'\nimport { flushSync } from 'react-dom'\nimport type {\n CanvasTimelineProps,\n CanvasTimelineRef,\n MarkerConfig,\n TimelineTheme,\n Item,\n ItemBounds,\n ItemState,\n DrawHelpers,\n} from './types'\nimport { DEFAULT_THEME } from './types'\nimport { ViewState } from './core/ViewState'\nimport { IntervalTree } from './core/IntervalTree'\nimport { LayoutEngine } from './core/LayoutEngine'\nimport { HierarchyEngine } from './core/HierarchyEngine'\nimport { defaultSummaryRenderer } from './canvas/defaultSummaryRenderer'\nimport { hitTest, hitTestGroup } from './core/HitTest'\nimport { setupCanvas, clearCanvas, RenderScheduler } from './canvas/CanvasManager'\nimport { GridLayer } from './canvas/GridLayer'\nimport { ItemsLayer } from './canvas/ItemsLayer'\nimport { OverlayLayer } from './canvas/OverlayLayer'\nimport { ZoomHandler } from './interaction/ZoomHandler'\nimport { InteractionHandler } from './interaction/InteractionHandler'\nimport type { InteractionMode } from './interaction/InteractionHandler'\nimport { findSnapTarget, collectItemEdges } from './interaction/snapUtils'\nimport { detectEdge, resolveCanResize, resolveCanMove } from './core/HitTest'\nimport dayjs from 'dayjs'\nimport isoWeek from 'dayjs/plugin/isoWeek'\nimport { toDayjs } from './utils/timezone'\nimport { Sidebar } from './dom/Sidebar'\nimport { getTodayMarkerConfig, getTodayMarkerInterval } from './dom/TodayMarker'\nimport { getCustomMarkerConfig } from './dom/CustomMarker'\n\ndayjs.extend(isoWeek)\n\nfunction mergeTheme(partial?: Partial<TimelineTheme>): TimelineTheme {\n if (!partial) return DEFAULT_THEME\n return {\n ...DEFAULT_THEME,\n ...partial,\n status: { ...DEFAULT_THEME.status, ...partial.status },\n grid: { ...DEFAULT_THEME.grid, ...partial.grid },\n item: { ...DEFAULT_THEME.item, ...partial.item },\n marker: { ...DEFAULT_THEME.marker, ...partial.marker },\n sidebar: { ...DEFAULT_THEME.sidebar, ...partial.sidebar },\n header: { ...DEFAULT_THEME.header, ...partial.header },\n }\n}\n\nconst HEADER_THROTTLE_MS = 32\n\nexport const CanvasTimeline = React.memo(forwardRef<CanvasTimelineRef, CanvasTimelineProps>(function CanvasTimeline(props, ref) {\n const {\n groups,\n items,\n defaultTimeStart,\n defaultTimeEnd,\n sidebarWidth,\n lineHeight,\n itemHeightRatio,\n stackItems,\n canMove,\n canChangeGroup,\n canResize,\n dragSnap,\n minZoom,\n maxZoom,\n theme: themePartial,\n dayStyle,\n rowStyle,\n showCursorLine,\n itemRenderer,\n groupRenderer,\n sidebarGroupRenderer,\n dependencies,\n highlights,\n onItemClick,\n onItemDoubleClick,\n onItemContextMenu,\n onItemMove,\n onItemResize,\n moveResizeValidator,\n onItemHover,\n onCanvasDoubleClick,\n onCanvasContextMenu,\n onTimeChange,\n onZoom,\n selected: selectedProp = [],\n rightSidebarWidth,\n rightSidebarGroupRenderer,\n onReady,\n maxHeight,\n timezone,\n devBadge,\n children,\n } = props\n\n const theme = useMemo(() => mergeTheme(themePartial), [themePartial])\n\n const getGroupIndex = useCallback((groupId: string | number, grps: typeof groups) => {\n for (let i = 0; i < grps.length; i++) {\n if (grps[i].id === groupId) return i\n }\n return 0\n }, [])\n\n const selectedKey = selectedProp.join(',')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const selected = useMemo(() => selectedProp, [selectedKey])\n\n const gridCanvasRef = useRef<HTMLCanvasElement>(null)\n const itemsCanvasRef = useRef<HTMLCanvasElement>(null)\n const overlayCanvasRef = useRef<HTMLCanvasElement>(null)\n const interactionRef = useRef<HTMLDivElement>(null)\n const outerRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const [containerWidth, setContainerWidth] = useState(800)\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null)\n\n useEffect(() => {\n const container = outerRef.current\n if (!container) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n setContainerWidth(entry.contentRect.width)\n }\n })\n obs.observe(container)\n return () => obs.disconnect()\n }, [])\n\n // Measure actual resolved height of the body container (handles CSS calc values)\n useEffect(() => {\n const el = containerRef.current\n if (!el || !maxHeight) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) setMeasuredHeight(entry.contentRect.height)\n })\n obs.observe(el)\n return () => obs.disconnect()\n }, [maxHeight])\n\n const canvasWidth = Math.max(0, containerWidth - sidebarWidth - (rightSidebarWidth ?? 0))\n\n // --- CORE DATA STRUCTURES ---\n const hierarchyEngine = useMemo(() => {\n const engine = new HierarchyEngine()\n engine.rebuild(items)\n return engine\n }, [items])\n\n const intervalTree = useMemo(() => {\n const tree = new IntervalTree<(typeof items)[0]>()\n tree.buildFromItems(\n items,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).start,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).end,\n )\n return tree\n }, [items, hierarchyEngine])\n\n const layoutEngine = useMemo(() => {\n const engine = new LayoutEngine(lineHeight, itemHeightRatio)\n engine.computeLayout(items, stackItems, hierarchyEngine)\n return engine\n }, [items, lineHeight, itemHeightRatio, stackItems, hierarchyEngine])\n\n const groupHeights = useMemo(\n () => groups.map((g) => layoutEngine.getGroupHeight(g.id)),\n [groups, layoutEngine],\n )\n const totalHeight = useMemo(\n () => groupHeights.reduce((a, b) => a + b, 0),\n [groupHeights],\n )\n const resolvedMaxHeight = typeof maxHeight === 'number' ? maxHeight : measuredHeight\n const canvasHeight = resolvedMaxHeight ? Math.min(totalHeight, resolvedMaxHeight) : totalHeight\n\n // --- MUTABLE VIEW STATE (hot path) ---\n const viewStateRef = useRef<ViewState>(\n new ViewState({\n visibleTimeStart: props.visibleTimeStart ?? defaultTimeStart,\n visibleTimeEnd: props.visibleTimeEnd ?? defaultTimeEnd,\n canvasWidth,\n canvasHeight,\n sidebarWidth,\n lineHeight,\n groupCount: groups.length,\n buffer: props.buffer ?? 3,\n scrollTop: 0,\n groupHeights,\n }),\n )\n\n const cursorXRef = useRef<number | null>(null)\n const hoveredItemIdRef = useRef<number | undefined>(undefined)\n\n // --- PAN STATE ---\n const panRef = useRef<{ startX: number; startY: number; lastX: number; lastY: number } | null>(null)\n const didPanRef = useRef(false)\n const PAN_THRESHOLD = 4\n\n // --- THROTTLED HEADER STATE ---\n const [headerTimeStart, setHeaderTimeStart] = useState(props.visibleTimeStart ?? defaultTimeStart)\n const [headerTimeEnd, setHeaderTimeEnd] = useState(props.visibleTimeEnd ?? defaultTimeEnd)\n const [sidebarScrollTop, setSidebarScrollTop] = useState(0)\n const headerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const syncHeaderState = useCallback(() => {\n const vs = viewStateRef.current\n setHeaderTimeStart(vs.visibleTimeStart)\n setHeaderTimeEnd(vs.visibleTimeEnd)\n setSidebarScrollTop(vs.scrollTop)\n headerTimerRef.current = null\n }, [])\n\n const scheduleHeaderSync = useCallback(() => {\n if (headerTimerRef.current !== null) return\n headerTimerRef.current = setTimeout(syncHeaderState, HEADER_THROTTLE_MS)\n }, [syncHeaderState])\n\n useEffect(() => {\n return () => { if (headerTimerRef.current !== null) clearTimeout(headerTimerRef.current) }\n }, [])\n\n const resolvedSummaryRenderer = useMemo(() => {\n if (props.summaryRenderer) return props.summaryRenderer\n return (ctx: CanvasRenderingContext2D, item: Item, bounds: ItemBounds, state: ItemState, helpers: DrawHelpers) => {\n defaultSummaryRenderer(ctx, item, bounds, state, helpers, theme)\n }\n }, [props.summaryRenderer, theme])\n\n const gridLayer = useMemo(() => new GridLayer(), [])\n const itemsLayer = useMemo(() => new ItemsLayer(), [])\n const overlayLayer = useMemo(() => new OverlayLayer(), [])\n const interactionHandler = useMemo(() => new InteractionHandler(dragSnap), [dragSnap])\n\n // --- MARKERS ---\n const markerConfigs = useMemo(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n return configs\n }, [children])\n const markersKey = useMemo(() => markerConfigs.map(m => `${m.date}|${m.color}|${m.width}|${m.label ?? ''}`).join(';'), [markerConfigs])\n const markersRef = useRef(markerConfigs)\n markersRef.current = markerConfigs\n\n // TodayMarker auto-update: refresh overlay on interval\n const todayMarkerInterval = useMemo(() => {\n let interval = 0\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n interval = getTodayMarkerInterval(child.props as { interval?: number })\n }\n })\n return interval\n }, [children])\n\n // --- PROPS REF ---\n const propsRef = useRef({\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n })\n propsRef.current = {\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n }\n\n // --- DRAW FUNCTIONS ---\n const drawGrid = useCallback(() => {\n const canvas = gridCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n gridLayer.draw(ctx, viewStateRef.current, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n }, [gridLayer])\n\n const drawItems = useCallback(() => {\n const canvas = itemsCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n itemsLayer.draw(\n ctx, viewStateRef.current, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, hoveredItemIdRef.current, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n }, [itemsLayer])\n\n const calculateSnapX = useCallback((item: (typeof items)[0], deltaX: number, mode: InteractionMode) => {\n const vs = viewStateRef.current\n const p = propsRef.current\n const pixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n\n // Determine which edges of the dragged item to check\n const draggedEdgeXs: number[] = []\n if (mode === 'move') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n } else if (mode === 'resize-left') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n } else {\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n }\n\n // Collect other items' edges\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, item.id, (t) => vs.timeToX(t))\n\n // Check each dragged edge against other items' edges\n for (const edgeX of draggedEdgeXs) {\n const snapX = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (snapX !== null) return snapX\n }\n\n // Fall back to time grid snap — snap the edge being dragged, not the start\n const edgeTime = mode === 'resize-right'\n ? item.end_time + deltaMs\n : item.start_time + deltaMs\n const snapped = Math.round(edgeTime / p.dragSnap) * p.dragSnap\n return vs.timeToX(snapped)\n }, [])\n\n const drawOverlay = useCallback(() => {\n const canvas = overlayCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n\n const vs = viewStateRef.current\n const state = interactionHandler.getState()\n let interactionRender = null\n if (state) {\n const origX = vs.timeToX(state.item.start_time)\n const origWidth = vs.timeToX(state.item.end_time) - origX\n let x: number, width: number\n if (state.mode === 'resize-left') {\n x = origX + state.deltaX\n width = origWidth - state.deltaX\n } else if (state.mode === 'resize-right') {\n x = origX\n width = origWidth + state.deltaX\n } else {\n // move\n x = origX + state.deltaX\n width = origWidth\n }\n const groupIndex = getGroupIndex(state.currentGroup, p.groups)\n const targetGroupY = vs.groupIndexToY(groupIndex)\n const groupChanged = state.currentGroup !== state.originalGroup\n interactionRender = {\n item: state.item,\n mode: state.mode,\n bounds: { x, y: targetGroupY + (p.lineHeight - p.lineHeight * p.itemHeightRatio) / 2, width, height: p.lineHeight * p.itemHeightRatio },\n renderer: p.itemRenderer,\n targetGroupY,\n groupChanged,\n }\n }\n\n overlayLayer.draw(ctx, vs, p.theme, {\n cursorX: p.showCursorLine ? cursorXRef.current : null,\n snapX: state ? calculateSnapX(state.item, state.deltaX, state.mode) : null,\n markers: markersRef.current,\n interaction: interactionRender,\n })\n }, [overlayLayer, interactionHandler, calculateSnapX, getGroupIndex])\n\n // --- RENDER SCHEDULER ---\n const schedulerRef = useRef<RenderScheduler | null>(null)\n if (!schedulerRef.current) {\n schedulerRef.current = new RenderScheduler((flags) => {\n if (flags.grid) drawGrid()\n if (flags.items) drawItems()\n if (flags.overlay) drawOverlay()\n })\n }\n const scheduler = schedulerRef.current\n\n useEffect(() => {\n return () => scheduler.dispose()\n }, [scheduler])\n\n // --- TODAY MARKER AUTO-UPDATE ---\n useEffect(() => {\n if (!todayMarkerInterval) return\n const timer = setInterval(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n markersRef.current = configs\n scheduler.markDirty('overlay')\n }, todayMarkerInterval)\n return () => clearInterval(timer)\n }, [todayMarkerInterval, children, scheduler])\n\n // --- SYNC ON DIMENSION/DATA CHANGES ---\n useEffect(() => {\n viewStateRef.current.update({\n canvasWidth, canvasHeight, sidebarWidth, lineHeight,\n groupCount: groups.length, groupHeights,\n })\n scheduler.markAllDirty()\n }, [canvasWidth, canvasHeight, sidebarWidth, lineHeight, groups.length, groupHeights, scheduler])\n\n useEffect(() => {\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n }, [items, groups, selected, theme, dayStyle, rowStyle, intervalTree, layoutEngine, scheduler])\n\n const highlightsKey = useMemo(\n () => props.highlights?.map(h => `${h.start}|${h.end}|${h.color}|${h.label ?? ''}|${h.opacity ?? ''}`).join(';') ?? '',\n [props.highlights],\n )\n\n const prevHighlightsKey = useRef(highlightsKey)\n useEffect(() => {\n if (highlightsKey !== prevHighlightsKey.current) {\n prevHighlightsKey.current = highlightsKey\n scheduler.markDirty('grid')\n }\n }, [highlightsKey, scheduler])\n\n const prevMarkersKey = useRef(markersKey)\n useEffect(() => {\n if (markersKey !== prevMarkersKey.current) {\n prevMarkersKey.current = markersKey\n scheduler.markDirty('overlay')\n }\n }, [markersKey, scheduler])\n\n // --- CONTROLLED MODE ---\n const prevControlledStart = useRef(props.visibleTimeStart)\n const prevControlledEnd = useRef(props.visibleTimeEnd)\n if (props.visibleTimeStart !== undefined && props.visibleTimeStart !== prevControlledStart.current) {\n prevControlledStart.current = props.visibleTimeStart\n viewStateRef.current.update({ visibleTimeStart: props.visibleTimeStart })\n scheduler.markAllDirty()\n }\n if (props.visibleTimeEnd !== undefined && props.visibleTimeEnd !== prevControlledEnd.current) {\n prevControlledEnd.current = props.visibleTimeEnd\n viewStateRef.current.update({ visibleTimeEnd: props.visibleTimeEnd })\n scheduler.markAllDirty()\n }\n\n // --- THROTTLED PARENT CALLBACKS ---\n const callbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const scheduleCallbacks = useCallback((type: 'zoom' | 'scroll') => {\n if (callbackTimerRef.current !== null) return\n callbackTimerRef.current = setTimeout(() => {\n callbackTimerRef.current = null\n const vs = viewStateRef.current\n const p = propsRef.current\n if (type === 'zoom') {\n p.onZoom?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n } else {\n p.onTimeChange?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n }\n }, HEADER_THROTTLE_MS)\n }, [])\n\n useEffect(() => {\n return () => { if (callbackTimerRef.current !== null) clearTimeout(callbackTimerRef.current) }\n }, [])\n\n // --- ZOOM HANDLER ---\n const zoomHandlerRef = useRef<ZoomHandler | null>(null)\n const zoomHandler = useMemo(() => {\n return new ZoomHandler(\n (newStart, newEnd) => {\n viewStateRef.current.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n },\n defaultTimeStart,\n defaultTimeEnd,\n minZoom,\n maxZoom,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n zoomHandlerRef.current = zoomHandler\n\n // --- WHEEL HANDLER ---\n const handleVerticalScroll = useCallback((deltaY: number) => {\n const vs = viewStateRef.current\n const totalHeight = vs.getTotalHeight()\n const maxScroll = Math.max(0, totalHeight - vs.canvasHeight)\n const newScrollTop = Math.max(0, Math.min(maxScroll, vs.scrollTop + deltaY))\n if (newScrollTop === vs.scrollTop) return\n vs.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }, [scheduler])\n\n const handleHorizontalScroll = useCallback((deltaX: number) => {\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n const newStart = vs.visibleTimeStart + deltaMs\n const newEnd = vs.visibleTimeEnd + deltaMs\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n flushSync(() => syncHeaderState())\n propsRef.current.onTimeChange?.(newStart, newEnd)\n }, [scheduler, syncHeaderState])\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey || e.altKey) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n const cursorRatio = (e.clientX - rect.left) / rect.width\n zoomHandler.handleWheelZoom(e, cursorRatio)\n } else if (e.shiftKey) {\n e.preventDefault()\n // Some browsers (Chrome/Edge on macOS) pre-translate shift + external mouse wheel\n // into deltaX with deltaY=0; trackpads keep the raw deltaY. Use whichever is non-zero.\n handleHorizontalScroll(e.deltaY || e.deltaX)\n } else {\n const deltaX = e.deltaX\n if (deltaX !== 0 && Math.abs(deltaX) > Math.abs(e.deltaY)) {\n e.preventDefault()\n handleHorizontalScroll(deltaX)\n } else if (e.deltaY !== 0) {\n const hasInternalScroll = totalHeight > canvasHeight\n if (hasInternalScroll) e.preventDefault()\n handleVerticalScroll(e.deltaY)\n }\n }\n }\n el.addEventListener('wheel', handleWheel, { passive: false })\n return () => el.removeEventListener('wheel', handleWheel)\n }, [zoomHandler, handleVerticalScroll, handleHorizontalScroll, totalHeight, canvasHeight])\n\n // --- TOUCH PINCH-TO-ZOOM ---\n const touchRef = useRef<{ lastDistance: number | null; lastCenter: number | null }>({ lastDistance: null, lastCenter: null })\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n\n const getDistance = (t1: Touch, t2: Touch) => Math.abs(t1.clientX - t2.clientX)\n const getCenter = (t1: Touch, t2: Touch, rect: DOMRect) => ((t1.clientX + t2.clientX) / 2) - rect.left\n\n const handleTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault()\n touchRef.current.lastDistance = getDistance(e.touches[0], e.touches[1])\n touchRef.current.lastCenter = null\n }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && touchRef.current.lastDistance !== null) {\n e.preventDefault()\n const newDistance = getDistance(e.touches[0], e.touches[1])\n const rect = el.getBoundingClientRect()\n const center = getCenter(e.touches[0], e.touches[1], rect)\n const cursorRatio = center / rect.width\n\n if (newDistance !== 0 && touchRef.current.lastDistance !== 0) {\n const scale = touchRef.current.lastDistance / newDistance\n const vs = viewStateRef.current\n const currentDuration = vs.visibleTimeEnd - vs.visibleTimeStart\n let newDuration = currentDuration * scale\n newDuration = Math.max(minZoom, Math.min(maxZoom, newDuration))\n\n const cursorTime = vs.visibleTimeStart + currentDuration * cursorRatio\n const newStart = cursorTime - newDuration * cursorRatio\n const newEnd = cursorTime + newDuration * (1 - cursorRatio)\n\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n }\n touchRef.current.lastDistance = newDistance\n }\n }\n\n const handleTouchEnd = () => {\n touchRef.current.lastDistance = null\n touchRef.current.lastCenter = null\n }\n\n el.addEventListener('touchstart', handleTouchStart, { passive: false })\n el.addEventListener('touchmove', handleTouchMove, { passive: false })\n el.addEventListener('touchend', handleTouchEnd)\n return () => {\n el.removeEventListener('touchstart', handleTouchStart)\n el.removeEventListener('touchmove', handleTouchMove)\n el.removeEventListener('touchend', handleTouchEnd)\n }\n }, [scheduler, scheduleHeaderSync, scheduleCallbacks])\n\n // --- POINTER HANDLERS ---\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n cursorXRef.current = x\n\n // --- Pan mode (drag on empty canvas) ---\n if (panRef.current) {\n const dx = e.clientX - panRef.current.startX\n const dy = e.clientY - panRef.current.startY\n if (!didPanRef.current && (Math.abs(dx) >= PAN_THRESHOLD || Math.abs(dy) >= PAN_THRESHOLD)) {\n didPanRef.current = true\n el.style.cursor = 'grabbing'\n el.setPointerCapture(e.pointerId)\n }\n if (didPanRef.current) {\n const moveDeltaX = e.clientX - panRef.current.lastX\n const moveDeltaY = e.clientY - panRef.current.lastY\n panRef.current.lastX = e.clientX\n panRef.current.lastY = e.clientY\n if (Math.abs(moveDeltaX) > 0) handleHorizontalScroll(-moveDeltaX)\n if (Math.abs(moveDeltaY) > 0) handleVerticalScroll(-moveDeltaY)\n }\n return\n }\n\n if (interactionHandler.isPending()) {\n interactionHandler.update(x, y)\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n if (state && state.mode === 'move' && propsRef.current.canChangeGroup) {\n const group = hitTestGroup(y, viewStateRef.current, propsRef.current.groups)\n if (group) interactionHandler.setCurrentGroup(group.id)\n }\n scheduler.markDirty('overlay')\n }\n return\n }\n\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n const newHoveredId = item?.id\n if (newHoveredId !== hoveredItemIdRef.current) {\n hoveredItemIdRef.current = newHoveredId\n scheduler.markDirty('items')\n p.onItemHover?.(newHoveredId ?? null, e.nativeEvent as unknown as PointerEvent)\n }\n\n // Cursor management\n if (item) {\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = resolveCanResize(item, p.canResize)\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (resolveCanMove(item, p.canMove)) {\n el.style.cursor = 'grab'\n } else {\n el.style.cursor = 'default'\n }\n } else {\n el.style.cursor = 'default'\n }\n }, [interactionHandler, scheduler, handleHorizontalScroll, handleVerticalScroll])\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const p = propsRef.current\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n\n if (!item) {\n // Start pan on empty canvas\n panRef.current = { startX: e.clientX, startY: e.clientY, lastX: e.clientX, lastY: e.clientY }\n didPanRef.current = false\n return\n }\n\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = resolveCanResize(item, p.canResize)\n\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-left', x, y)\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-right', x, y)\n } else if (resolveCanMove(item, p.canMove)) {\n interactionHandler.startInteraction(item, 'move', x, y)\n }\n }, [interactionHandler])\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n\n // --- End pan mode ---\n if (panRef.current) {\n const wasPanning = didPanRef.current\n panRef.current = null\n didPanRef.current = false\n el.style.cursor = 'default'\n if (wasPanning) return // suppress click after pan\n }\n\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n if (state) {\n const validator = propsRef.current.moveResizeValidator\n if (state.mode === 'move') {\n const result = interactionHandler.endMove(pixelsPerMs)\n if (result) {\n // Check for item-to-item snap\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const draggedStartX = vs.timeToX(state.item.start_time + deltaMs)\n const draggedEndX = vs.timeToX(state.item.end_time + deltaMs)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n let snappedStartTime = result.newStartTime\n // Check start edge\n const startSnap = findSnapTarget(draggedStartX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (startSnap !== null) {\n snappedStartTime = vs.xToTime(startSnap)\n } else {\n // Check end edge\n const endSnap = findSnapTarget(draggedEndX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (endSnap !== null) {\n const duration = state.item.end_time - state.item.start_time\n snappedStartTime = vs.xToTime(endSnap) - duration\n }\n }\n\n const validatedTime = validator ? validator('move', state.item.id, snappedStartTime) : snappedStartTime\n const childMoves = propsRef.current.hierarchyEngine.getMoveDelta(state.item.id, validatedTime)\n propsRef.current.onItemMove?.(state.item.id, validatedTime, result.newGroupId, childMoves.length > 0 ? childMoves : undefined)\n }\n } else {\n const result = interactionHandler.endResize(pixelsPerMs)\n if (result) {\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const edgeTime = result.edge === 'left' ? state.item.start_time + deltaMs : state.item.end_time + deltaMs\n const edgeX = vs.timeToX(edgeTime)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n const snap = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n let constrainedTime = snap !== null ? vs.xToTime(snap) : result.newTime\n // Apply hierarchy resize constraints\n const constraint = propsRef.current.hierarchyEngine.getResizeConstraint(state.item.id, result.edge)\n if (result.edge === 'left' && constrainedTime > constraint.max) {\n constrainedTime = constraint.max\n } else if (result.edge === 'right' && constrainedTime < constraint.min) {\n constrainedTime = constraint.min\n }\n\n const validatedTime = validator ? validator('resize', state.item.id, constrainedTime, result.edge) : constrainedTime\n propsRef.current.onItemResize?.(state.item.id, validatedTime, result.edge)\n }\n }\n }\n el.style.cursor = 'default'\n scheduler.markDirty('overlay')\n return\n }\n if (interactionHandler.isPending()) interactionHandler.cancel()\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, propsRef.current.intervalTree, propsRef.current.layoutEngine, propsRef.current.groups)\n if (item) propsRef.current.onItemClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n }, [interactionHandler, scheduler])\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemDoubleClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasDoubleClick?.(group.id as number, time)\n }\n }, [])\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemContextMenu?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasContextMenu?.(group.id as number, time, e.nativeEvent as unknown as PointerEvent)\n }\n }, [])\n\n const handlePointerLeave = useCallback(() => {\n panRef.current = null\n didPanRef.current = false\n cursorXRef.current = null\n if (interactionRef.current) interactionRef.current.style.cursor = 'default'\n if (hoveredItemIdRef.current !== undefined) {\n hoveredItemIdRef.current = undefined\n scheduler.markDirty('items')\n propsRef.current.onItemHover?.(null, new PointerEvent('pointerleave'))\n }\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n }, [scheduler])\n\n // --- HEADER CHILDREN ---\n const headerChildren = useMemo(() => {\n const headers: React.ReactNode[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TimelineHeaders') {\n const childProps = child.props as Record<string, unknown>\n headers.push(\n React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? headerTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? headerTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n sidebarWidth: childProps.sidebarWidth ?? sidebarWidth,\n theme: childProps.theme ?? theme,\n timezone: childProps.timezone ?? timezone,\n onZoomToInterval: childProps.onZoomToInterval ?? ((start: number, end: number) => {\n viewStateRef.current.update({ visibleTimeStart: start, visibleTimeEnd: end })\n scheduler.markAllDirty()\n syncHeaderState()\n propsRef.current.onTimeChange?.(start, end)\n propsRef.current.onZoom?.(start, end)\n }),\n }),\n )\n }\n })\n return headers\n }, [children, headerTimeStart, headerTimeEnd, canvasWidth, sidebarWidth, theme, timezone, scheduler, syncHeaderState])\n\n // --- INITIAL DRAW ---\n const initialDrawDone = useRef(false)\n useEffect(() => {\n if (!initialDrawDone.current) {\n initialDrawDone.current = true\n scheduler.markAllDirty()\n }\n }, [scheduler])\n\n // --- IMPERATIVE HANDLE (print capture) ---\n useImperativeHandle(ref, () => ({\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n\n // Preserve the current zoom level (pixels per ms) from the on-screen view\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n\n const compositeWidth = (printSidebarWidth + timelineWidth) * scale\n const compositeHeight = (headerHeight + totalHeight) * scale\n\n const canvas = document.createElement('canvas')\n canvas.width = compositeWidth\n canvas.height = compositeHeight\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n\n // --- Draw sidebar ---\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n\n // Row background from rowStyle\n if (p.rowStyle) {\n const style = p.rowStyle(group)\n if (style?.backgroundColor) {\n ctx.fillStyle = style.backgroundColor\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n }\n }\n\n // Group title\n const groupType = group.type as string | undefined\n let fontWeight = '400'\n let indent = 8\n if (groupType === 'project') {\n fontWeight = '700'\n } else if (groupType === 'CAG') {\n fontWeight = '600'\n } else if (groupType === 'CA') {\n fontWeight = '400'\n indent = 24\n }\n\n ctx.fillStyle = '#111'\n ctx.font = `${fontWeight} 12px sans-serif`\n ctx.textBaseline = 'middle'\n ctx.fillText(group.title, indent, y + rowHeight / 2, printSidebarWidth - indent - 4)\n }\n\n // --- Draw headers ---\n const drawHeaderRow = (rowY: number, getLabel: (time: dayjs.Dayjs) => string, unit: dayjs.ManipulateType) => {\n ctx.fillStyle = p.theme.header?.bg ?? '#f5f5f5'\n ctx.fillRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n ctx.strokeStyle = p.theme.grid?.line ?? '#e0e0e0'\n ctx.lineWidth = 1\n ctx.strokeRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n\n let cursor = toDayjs(timeStart, p.timezone).startOf(unit)\n if (cursor.valueOf() < timeStart) cursor = cursor.add(1, unit)\n\n const pxPerMs = timelineWidth / (timeEnd - timeStart)\n\n while (cursor.valueOf() < timeEnd) {\n const nextCursor = cursor.add(1, unit)\n const x = printSidebarWidth + (cursor.valueOf() - timeStart) * pxPerMs\n const endX = printSidebarWidth + (Math.min(nextCursor.valueOf(), timeEnd) - timeStart) * pxPerMs\n const width = endX - x\n\n // Vertical divider\n ctx.beginPath()\n ctx.moveTo(x, rowY)\n ctx.lineTo(x, rowY + headerRowHeight)\n ctx.stroke()\n\n // Label\n ctx.fillStyle = '#333'\n ctx.font = '600 11px sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n ctx.fillText(getLabel(cursor), x + width / 2, rowY + headerRowHeight / 2, width - 4)\n\n cursor = nextCursor\n }\n ctx.textAlign = 'start' // reset\n }\n\n drawHeaderRow(0, (d) => d.format('YYYY'), 'year')\n drawHeaderRow(headerRowHeight, (d) => d.format('MM'), 'month')\n drawHeaderRow(headerRowHeight * 2, (d) => String(d.isoWeek()), 'week')\n\n // --- Draw timeline layers ---\n const printViewState = new ViewState({\n visibleTimeStart: timeStart,\n visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth,\n canvasHeight: totalHeight,\n sidebarWidth: 0,\n lineHeight: p.lineHeight,\n groupCount: p.groups.length,\n buffer: 1,\n scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n\n // Offset context for timeline area\n ctx.save()\n ctx.translate(printSidebarWidth, headerHeight)\n\n // Clip to timeline area\n ctx.beginPath()\n ctx.rect(0, 0, timelineWidth, totalHeight)\n ctx.clip()\n\n gridLayer.draw(ctx, printViewState, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(\n ctx, printViewState, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n overlayLayer.draw(ctx, printViewState, p.theme, {\n cursorX: null,\n snapX: null,\n markers: markersRef.current,\n interaction: null,\n })\n\n ctx.restore()\n\n return canvas\n },\n }), [gridLayer, itemsLayer, overlayLayer])\n\n // --- ON READY CALLBACK ---\n useEffect(() => {\n const api: CanvasTimelineRef = {\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n const fullWidth = printSidebarWidth + timelineWidth\n const fullHeight = headerHeight + totalHeight\n\n const canvas = document.createElement('canvas')\n canvas.width = fullWidth * scale\n canvas.height = fullHeight * scale\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n ctx.fillStyle = '#FFFFFF'\n ctx.fillRect(0, 0, fullWidth, fullHeight)\n\n // Sidebar\n ctx.save()\n ctx.beginPath()\n ctx.rect(0, 0, printSidebarWidth, fullHeight)\n ctx.clip()\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(0, 0, printSidebarWidth, headerHeight)\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.strokeRect(0, 0, printSidebarWidth, headerHeight)\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n const rs = p.rowStyle?.(group)\n ctx.fillStyle = rs?.backgroundColor ?? (i % 2 === 0 ? '#FFFFFF' : '#F7F7F7')\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n ctx.strokeStyle = '#E5E5E5'\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(printSidebarWidth, y + rowHeight)\n ctx.stroke()\n const gt = (group.type as string) ?? ''\n let indent = 8, fw = '400', fs = 11\n if (gt === 'project') { fw = '700'; fs = 12 }\n else if (gt === 'control_area_group') { fw = '600' }\n else if (gt === 'control_area') { indent = 24 }\n ctx.fillStyle = '#374151'\n ctx.font = `${fw} ${fs}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`\n ctx.textBaseline = 'middle'\n const title = typeof group.title === 'string' ? group.title : String(group.title)\n ctx.fillText(title, indent, y + rowHeight / 2, printSidebarWidth - indent - 8)\n }\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(printSidebarWidth, 0)\n ctx.lineTo(printSidebarWidth, fullHeight)\n ctx.stroke()\n ctx.restore()\n\n // Headers\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, 0, timelineWidth, headerHeight)\n ctx.clip()\n const duration = timeEnd - timeStart\n const units: Array<{ unit: 'year' | 'month' | 'week'; row: number }> = [\n { unit: 'year', row: 0 }, { unit: 'month', row: 1 }, { unit: 'week', row: 2 },\n ]\n for (const { unit, row } of units) {\n const hy = row * headerRowHeight\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(printSidebarWidth, hy, timelineWidth, headerRowHeight)\n let cur = toDayjs(timeStart, p.timezone).startOf(unit)\n const endBound = toDayjs(timeEnd, p.timezone).add(1, unit)\n while (cur.isBefore(endBound)) {\n const next = cur.add(1, unit)\n const sx = printSidebarWidth + ((cur.valueOf() - timeStart) / duration) * timelineWidth\n const w = ((next.valueOf() - cur.valueOf()) / duration) * timelineWidth\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 0.5\n ctx.strokeRect(sx, hy, w, headerRowHeight)\n let label: string\n if (unit === 'year') label = cur.format('YYYY')\n else if (unit === 'month') label = cur.format('MM')\n else label = `${cur.week()}`\n ctx.fillStyle = '#6c737f'\n ctx.font = unit === 'year'\n ? '600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n : '400 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n if (w > 20) ctx.fillText(label, sx + w / 2, hy + headerRowHeight / 2)\n cur = next\n }\n }\n ctx.textAlign = 'start'\n ctx.restore()\n\n // Timeline\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, headerHeight, timelineWidth, totalHeight)\n ctx.clip()\n ctx.translate(printSidebarWidth, headerHeight)\n const pv = new ViewState({\n visibleTimeStart: timeStart, visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth, canvasHeight: totalHeight,\n sidebarWidth: 0, lineHeight: p.lineHeight,\n groupCount: p.groups.length, buffer: 1, scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n gridLayer.draw(ctx, pv, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(ctx, pv, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine)\n overlayLayer.draw(ctx, pv, p.theme, { cursorX: null, markers: markersRef.current })\n ctx.restore()\n\n return canvas\n },\n }\n onReady?.(api)\n }, [onReady, gridLayer, itemsLayer, overlayLayer])\n\n // --- RENDER ---\n const canvasContainerStyle: React.CSSProperties = {\n position: 'relative',\n width: canvasWidth,\n height: canvasHeight,\n overflow: 'hidden',\n cursor: 'default',\n }\n\n const canvasStyle: React.CSSProperties = { position: 'absolute', top: 0, left: 0 }\n\n return (\n <div ref={outerRef} style={{ display: 'flex', flexDirection: 'column', width: '100%', position: 'relative' }}>\n {(__LIB_DEV__ || devBadge) ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 9999,\n padding: '2px 6px',\n fontSize: 10,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n lineHeight: 1.4,\n color: '#fff',\n background: 'rgba(17, 24, 39, 0.78)',\n borderBottomRightRadius: 4,\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n v{__LIB_VERSION__} · {__LIB_BUILD__}\n </div>\n ) : null}\n {headerChildren}\n <div ref={containerRef} style={{ display: 'flex', overflow: 'hidden', maxHeight: maxHeight ?? undefined }}>\n <Sidebar\n groups={groups}\n width={sidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={sidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n <div\n ref={interactionRef}\n style={canvasContainerStyle}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n onPointerLeave={handlePointerLeave}\n >\n <canvas ref={gridCanvasRef} style={{ ...canvasStyle, zIndex: 0 }} />\n <canvas ref={itemsCanvasRef} style={{ ...canvasStyle, zIndex: 1 }} />\n <canvas ref={overlayCanvasRef} style={{ ...canvasStyle, zIndex: 2 }} />\n </div>\n {rightSidebarWidth && rightSidebarGroupRenderer ? (\n <Sidebar\n groups={groups}\n width={rightSidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={rightSidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n ) : null}\n </div>\n </div>\n )\n}))\n","import React from 'react'\nimport type { TimelineTheme } from '../types'\n\nexport interface TimelineHeadersProps {\n children: React.ReactNode\n theme?: TimelineTheme\n className?: string\n classNames?: string\n style?: React.CSSProperties\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n sidebarWidth?: number\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function TimelineHeaders({ children, theme, className, classNames: _classNames, style, visibleTimeStart, visibleTimeEnd, canvasWidth, sidebarWidth = 0, onZoomToInterval, timezone }: TimelineHeadersProps) {\n const enhancedChildren = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'DateHeader') {\n const childProps = child.props as Record<string, unknown>\n const enhanced = React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? visibleTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? visibleTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n theme: childProps.theme ?? theme,\n onZoomToInterval: childProps.onIntervalClick ?? childProps.onZoomToInterval ?? onZoomToInterval,\n timezone: childProps.timezone ?? timezone,\n })\n return (\n <div style={{ display: 'flex' }}>\n <div style={{ width: sidebarWidth, flexShrink: 0 }} />\n <div style={{ flex: 1, overflow: 'hidden' }}>{enhanced}</div>\n </div>\n )\n }\n return child\n })\n\n return (\n <div className={className} style={{\n position: 'sticky', top: 0, zIndex: 20, display: 'flex', flexDirection: 'column',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n borderTop: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n ...style,\n }}>\n {enhancedChildren}\n </div>\n )\n}\nTimelineHeaders.displayName = 'TimelineHeaders'\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){\"use strict\";var e=\"week\",t=\"year\";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),\"day\");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,\"millisecond\"),o=this.diff(a,e,!0);return o<0?r(this).startOf(\"week\").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));","import { useMemo, useCallback } from 'react'\nimport dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport type { TimelineTheme } from '../types'\nimport { toDayjs } from '../utils/timezone'\n\ndayjs.extend(weekOfYear)\n\nexport type DateUnit = 'year' | 'month' | 'week' | 'day' | 'hour'\n\n// Minimum cell width in pixels before the header auto-hides\nconst DEFAULT_MIN_CELL_WIDTH: Record<DateUnit, number> = {\n year: 30,\n month: 30,\n week: 20,\n day: 15,\n hour: 30,\n}\n\nexport interface DateHeaderProps {\n unit: DateUnit\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n theme?: TimelineTheme\n height?: number\n className?: string\n labelFormat?: string | ((start: Date, end: Date, unit: DateUnit) => string)\n onIntervalClick?: (startTime: number, endTime: number) => void\n /** Minimum cell width in pixels. Header auto-hides when cells are narrower. Set to 0 to disable. */\n minCellWidth?: number\n // Called by TimelineHeaders to inject zoom behavior\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function DateHeader({\n unit,\n visibleTimeStart = 0,\n visibleTimeEnd = 0,\n canvasWidth = 0,\n theme,\n height = 28,\n className,\n labelFormat,\n onIntervalClick,\n minCellWidth,\n onZoomToInterval,\n timezone,\n}: DateHeaderProps) {\n const intervals = useMemo(() => {\n if (!visibleTimeStart || !visibleTimeEnd || !canvasWidth) return []\n\n const duration = visibleTimeEnd - visibleTimeStart\n\n // Check average cell width — auto-hide if too narrow\n const minWidth = minCellWidth ?? DEFAULT_MIN_CELL_WIDTH[unit]\n if (minWidth > 0) {\n const sampleStart = toDayjs(visibleTimeStart, timezone).startOf(unit)\n const sampleEnd = sampleStart.add(1, unit)\n const avgCellWidth = ((sampleEnd.valueOf() - sampleStart.valueOf()) / duration) * canvasWidth\n if (avgCellWidth < minWidth) return []\n }\n\n const result: Array<{ start: number; end: number; label: string; left: number; width: number }> = []\n // Add buffer: 1 extra unit before and after visible range\n let current = toDayjs(visibleTimeStart, timezone).startOf(unit).subtract(1, unit)\n const endBound = toDayjs(visibleTimeEnd, timezone).add(2, unit).valueOf()\n\n while (current.valueOf() < endBound) {\n const next = current.add(1, unit)\n const start = current.valueOf()\n const end = next.valueOf()\n const left = ((start - visibleTimeStart) / duration) * canvasWidth\n const width = ((end - start) / duration) * canvasWidth\n const label = formatLabel(current, next, unit, labelFormat, width)\n result.push({ start, end, label, left, width })\n current = next\n }\n return result\n }, [visibleTimeStart, visibleTimeEnd, canvasWidth, unit, labelFormat, minCellWidth, timezone])\n\n const handleClick = useCallback((start: number, end: number) => {\n if (onIntervalClick) {\n onIntervalClick(start, end)\n } else if (onZoomToInterval) {\n onZoomToInterval(start, end)\n }\n }, [onIntervalClick, onZoomToInterval])\n\n // Auto-hide: return nothing if no intervals (cells too narrow)\n if (intervals.length === 0) return null\n\n return (\n <div style={{ display: 'flex', position: 'relative', height, overflow: 'hidden' }}>\n {intervals.map((interval) => (\n <div\n key={interval.start}\n className={className}\n onClick={() => handleClick(interval.start, interval.end)}\n style={{\n position: 'absolute',\n left: interval.left,\n width: interval.width,\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRight: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n fontSize: 12,\n color: theme?.header.text ?? '#6c737f',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n userSelect: 'none',\n padding: '0 4px',\n boxSizing: 'border-box',\n }}\n >\n <span>{interval.label}</span>\n </div>\n ))}\n </div>\n )\n}\nDateHeader.displayName = 'DateHeader'\n\nfunction formatLabel(\n start: dayjs.Dayjs,\n end: dayjs.Dayjs,\n unit: DateUnit,\n labelFormat: string | ((start: Date, end: Date, unit: DateUnit) => string) | undefined,\n _width: number,\n): string {\n if (typeof labelFormat === 'function') {\n return labelFormat(start.toDate(), end.toDate(), unit)\n }\n if (typeof labelFormat === 'string') {\n return start.format(labelFormat)\n }\n return formatDefault(start, unit)\n}\n\nfunction formatDefault(d: dayjs.Dayjs, unit: DateUnit): string {\n switch (unit) {\n case 'year': return d.format('YYYY')\n case 'month': return d.format('MM')\n case 'week': return `${d.week()}`\n case 'day': return d.format('D')\n case 'hour': return d.format('HH:mm')\n }\n}\n","import React from 'react'\n\ninterface SidebarHeaderProps {\n width: number\n children?: (props: { getRootProps: () => React.HTMLAttributes<HTMLDivElement> }) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function SidebarHeader({ width, children, style }: SidebarHeaderProps) {\n const getRootProps = (): React.HTMLAttributes<HTMLDivElement> => ({ style: { width, ...style } })\n if (children) return <>{children({ getRootProps })}</>\n return <div style={{ width }} />\n}\nSidebarHeader.displayName = 'SidebarHeader'\n","import React from 'react'\ninterface CustomHeaderProps { children: React.ReactNode }\nexport function CustomHeader({ children }: CustomHeaderProps) { return <>{children}</> }\nCustomHeader.displayName = 'CustomHeader'\n"],"names":["DEFAULT_THEME","ViewState","config","params","offsets","i","h","_a","time","x","y","target","lo","hi","mid","index","extend","firstVisible","lastVisible","scrollXOffset","bufferPixels","IntervalTree","items","getStart","getEnd","intervals","item","min","max","iv","center","leftIntervals","rightIntervals","overlapping","start","end","results","node","LayoutEngine","lineHeight","itemHeightRatio","stackItems","hierarchy","itemHeight","summaryHeight","isSummary","byGroup","arr","groupId","groupItems","a","b","d","levelEnds","maxLevel","level","leaves","parents","nextLevel","parent","itemId","HierarchyEngine","children","id","visited","current","parentId","siblings","idx","result","stack","descendants","descId","desc","cached","depth","newStart","delta","edge","minChildStart","childId","child","maxChildEnd","defaultSummaryRenderer","ctx","bounds","state","_helpers","theme","width","height","color","diamondSize","midY","title","textWidth","maxTextWidth","displayText","hitTest","canvasX","canvasY","view","tree","layout","groups","groupIndexMap","candidates","topItem","topY","groupIndex","itemLayout","hitTestGroup","detectEdge","threshold","leftX","rightX","resolveCanResize","globalCanResize","resolveCanMove","globalCanMove","setupCanvas","canvas","dpr","targetW","targetH","clearCanvas","RenderScheduler","drawCallback","layer","flags","module","this","e","s","f","n","u","t","r","o","l","c","m","v","dayjs","utc","tz","toDayjs","ts","timezone","GridLayer","dayStyle","rowStyle","highlights","rowHeight","group","bgColor","customRow","x1","x2","w","opacity","g","visibleStart","visibleEnd","dayPixelWidth","stepUnit","batchColor","batchOpacity","batchStartX","customBorderLines","flushBatch","endX","date","custom","dow","line","padding","badgeWidth","badgeHeight","badgeX","badgeY","ITEM_FONT","createDrawHelpers","radius","text","maxWidth","candidate","color1","color2","grad","type","size","half","cx","cy","fillColor","stemW","stemX","paddingH","pillHeight","pillWidth","ItemsLayer","itemRenderer","groupRenderer","selected","hoveredItemId","dependencies","summaryRenderer","queryStart","queryEnd","visibleItems","selectedSet","itemBoundsMap","yMin","yMax","helpers","renderer","depItemIds","dep","itemMap","boundsMap","fromBounds","toBounds","isHighlighted","startX","startY","endY","dx","cpOffset","arrowSize","OverlayLayer","options","cursorX","snapX","markers","interaction","marker","maxBadgeWidth","MAX_DELTA","normalizeDelta","ZoomHandler","onZoom","visibleTimeStart","visibleTimeEnd","minZoom","maxZoom","cursorRatio","speed","scale","currentDuration","newDuration","newEnd","ACTIVATION_THRESHOLD","InteractionHandler","dragSnap","mode","pixelsPerMs","deltaMs","newStartTime","snapped","newGroupId","newTime","collectItemEdges","excludeItemId","timeToX","edges","findSnapTarget","currentX","edgeXPositions","thresholdPx","_pixelsPerMs","_dragSnap","closestX","closestDist","dist","OVERSCAN_PX","Sidebar","groupHeights","scrollTop","canvasHeight","onScroll","containerRef","useRef","isScrollingRef","useMemo","totalHeight","displayHeight","groupAtY","useCallback","handleScroll","useEffect","visibleGroups","top","_jsx","TodayMarker","_props","getTodayMarkerConfig","props","getTodayMarkerInterval","CustomMarker","getCustomMarkerConfig","isoWeek","mergeTheme","partial","HEADER_THROTTLE_MS","CanvasTimeline","React","forwardRef","ref","defaultTimeStart","defaultTimeEnd","sidebarWidth","canMove","canChangeGroup","canResize","themePartial","showCursorLine","sidebarGroupRenderer","onItemClick","onItemDoubleClick","onItemContextMenu","onItemMove","onItemResize","moveResizeValidator","onItemHover","onCanvasDoubleClick","onCanvasContextMenu","onTimeChange","selectedProp","rightSidebarWidth","rightSidebarGroupRenderer","onReady","maxHeight","devBadge","getGroupIndex","grps","selectedKey","gridCanvasRef","itemsCanvasRef","overlayCanvasRef","interactionRef","outerRef","containerWidth","setContainerWidth","useState","measuredHeight","setMeasuredHeight","container","obs","entries","entry","el","canvasWidth","hierarchyEngine","engine","intervalTree","layoutEngine","resolvedMaxHeight","viewStateRef","cursorXRef","hoveredItemIdRef","panRef","didPanRef","PAN_THRESHOLD","headerTimeStart","setHeaderTimeStart","headerTimeEnd","setHeaderTimeEnd","sidebarScrollTop","setSidebarScrollTop","headerTimerRef","syncHeaderState","vs","scheduleHeaderSync","resolvedSummaryRenderer","gridLayer","itemsLayer","overlayLayer","interactionHandler","markerConfigs","configs","displayName","markersKey","markersRef","todayMarkerInterval","interval","propsRef","drawGrid","p","drawItems","calculateSnapX","deltaX","draggedEdgeXs","otherEdges","edgeX","edgeTime","drawOverlay","interactionRender","origX","origWidth","targetGroupY","groupChanged","schedulerRef","scheduler","timer","highlightsKey","prevHighlightsKey","prevMarkersKey","prevControlledStart","prevControlledEnd","callbackTimerRef","scheduleCallbacks","_b","zoomHandlerRef","zoomHandler","handleVerticalScroll","deltaY","maxScroll","newScrollTop","handleHorizontalScroll","flushSync","_c","handleWheel","rect","touchRef","getDistance","t1","t2","getCenter","handleTouchStart","handleTouchMove","newDistance","cursorTime","handleTouchEnd","handlePointerMove","dy","moveDeltaX","moveDeltaY","newHoveredId","cr","handlePointerDown","handlePointerUp","wasPanning","validator","draggedStartX","draggedEndX","snappedStartTime","startSnap","endSnap","duration","validatedTime","childMoves","snap","constrainedTime","constraint","_d","_f","_e","handleDoubleClick","handleContextMenu","handlePointerLeave","headerChildren","headers","childProps","initialDrawDone","useImperativeHandle","timeStart","timeEnd","printSidebarWidth","headerRowHeight","headerHeight","printGroupHeights","printGroupOffsets","currentPixelsPerMs","printDuration","timelineWidth","compositeWidth","compositeHeight","style","groupType","fontWeight","indent","drawHeaderRow","rowY","getLabel","unit","cursor","pxPerMs","nextCursor","printViewState","api","fullWidth","fullHeight","rs","gt","fw","fs","units","row","hy","cur","endBound","next","sx","label","pv","canvasContainerStyle","canvasStyle","_jsxs","TimelineHeaders","className","_classNames","onZoomToInterval","enhancedChildren","enhanced","weekOfYear","DEFAULT_MIN_CELL_WIDTH","DateHeader","labelFormat","onIntervalClick","minCellWidth","minWidth","sampleStart","left","formatLabel","handleClick","_width","formatDefault","SidebarHeader","getRootProps","_Fragment","CustomHeader"],"mappings":"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","x_google_ignoreList":[8,9,18,24]}
|