@taskctrl/canvas-timeline 0.3.0 → 0.4.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","../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 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}\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\n private visibleDuration: number\n private pixelsPerMs: 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\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\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\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\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 const raw = Math.floor((y + this.scrollTop) / this.lineHeight)\n return Math.max(0, Math.min(raw, this.groupCount - 1))\n }\n\n groupIndexToY(index: number): number {\n return index * this.lineHeight - this.scrollTop\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 const firstVisible = Math.max(0, Math.floor(this.scrollTop / this.lineHeight))\n const visibleCount = Math.ceil(this.canvasHeight / this.lineHeight)\n const lastVisible = Math.min(this.groupCount - 1, firstVisible + visibleCount)\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.groupCount * this.lineHeight\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","import dayjs from 'dayjs'\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 ): 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 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, view.lineHeight)\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 + view.lineHeight)\n ctx.lineTo(view.canvasWidth, y + view.lineHeight)\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 = dayjs(visibleStart).startOf('day')\n const end = dayjs(visibleEnd).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 = dayjs(visibleStart).startOf(stepUnit)\n const end = dayjs(visibleEnd).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 } from 'react'\nimport type { Group, TimelineTheme } from '../types'\n\ninterface SidebarProps {\n groups: Group[]\n width: number\n lineHeight: 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 = 5\n\nexport function Sidebar({\n groups, width, lineHeight, scrollTop, canvasHeight, theme, groupRenderer, onScroll,\n}: SidebarProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false)\n const totalHeight = groups.length * lineHeight\n const displayHeight = canvasHeight\n\n const firstVisible = Math.max(0, Math.floor(scrollTop / lineHeight) - OVERSCAN)\n const lastVisible = Math.min(groups.length - 1, Math.ceil((scrollTop + canvasHeight) / lineHeight) + OVERSCAN)\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 visibleGroups.push(\n <div\n key={group.id}\n style={{\n position: 'absolute',\n top: i * lineHeight,\n height: lineHeight,\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 { 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 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\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 const canvasWidth = Math.max(0, containerWidth - sidebarWidth - (rightSidebarWidth ?? 0))\n const canvasHeight = groups.length * lineHeight\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 }),\n )\n\n const cursorXRef = useRef<number | null>(null)\n const hoveredItemIdRef = useRef<number | undefined>(undefined)\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 // --- 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 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,\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,\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)\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\n const newStart = item.start_time + deltaMs\n const snapped = Math.round(newStart / 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({ canvasWidth, canvasHeight, sidebarWidth, lineHeight, groupCount: groups.length })\n scheduler.markAllDirty()\n }, [canvasWidth, canvasHeight, sidebarWidth, lineHeight, groups.length, 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.groupCount * vs.lineHeight\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 handleHorizontalScroll(e.deltaY)\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 handleVerticalScroll(e.deltaY)\n }\n }\n }\n el.addEventListener('wheel', handleWheel, { passive: false })\n return () => el.removeEventListener('wheel', handleWheel)\n }, [zoomHandler, handleVerticalScroll, handleHorizontalScroll])\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 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])\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 if (!item) return\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 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 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 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, 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 totalHeight = p.groups.length * p.lineHeight\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 y = headerHeight + i * p.lineHeight\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, p.lineHeight)\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 + p.lineHeight / 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 = dayjs(timeStart).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 })\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)\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 totalHeight = p.groups.length * p.lineHeight\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 y = headerHeight + i * p.lineHeight\n const rs = p.rowStyle?.(group)\n ctx.fillStyle = rs?.backgroundColor ?? (i % 2 === 0 ? '#FFFFFF' : '#F7F7F7')\n ctx.fillRect(0, y, printSidebarWidth, p.lineHeight)\n ctx.strokeStyle = '#E5E5E5'\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + p.lineHeight)\n ctx.lineTo(printSidebarWidth, y + p.lineHeight)\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 + p.lineHeight / 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 = dayjs(timeStart).startOf(unit)\n const endBound = dayjs(timeEnd).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 })\n gridLayer.draw(ctx, pv, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights)\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%' }}>\n {headerChildren}\n <div ref={containerRef} style={{ display: 'flex', overflow: 'hidden' }}>\n <Sidebar\n groups={groups}\n width={sidebarWidth}\n lineHeight={lineHeight}\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 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}\n\nexport function TimelineHeaders({ children, theme, className, classNames: _classNames, style, visibleTimeStart, visibleTimeEnd, canvasWidth, sidebarWidth = 0, onZoomToInterval }: 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 })\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'\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}\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}: 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 = dayjs(visibleTimeStart).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 = dayjs(visibleTimeStart).startOf(unit).subtract(1, unit)\n const endBound = dayjs(visibleTimeEnd).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])\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","time","x","y","raw","index","extend","firstVisible","visibleCount","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","i","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","GridLayer","dayStyle","rowStyle","highlights","group","bgColor","customRow","h","x1","x2","w","opacity","r","g","visibleStart","visibleEnd","dayPixelWidth","stepUnit","dayjs","batchColor","batchOpacity","batchStartX","customBorderLines","flushBatch","endX","date","custom","dow","line","padding","badgeWidth","badgeHeight","badgeX","badgeY","ITEM_FONT","createDrawHelpers","radius","text","maxWidth","lo","hi","mid","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","e","ZoomHandler","onZoom","visibleTimeStart","visibleTimeEnd","minZoom","maxZoom","cursorRatio","speed","scale","currentDuration","newDuration","newEnd","ACTIVATION_THRESHOLD","InteractionHandler","dragSnap","mode","pixelsPerMs","deltaMs","newStartTime","snapped","newGroupId","newTime","_a","collectItemEdges","excludeItemId","timeToX","edges","findSnapTarget","currentX","edgeXPositions","thresholdPx","_pixelsPerMs","_dragSnap","closestX","closestDist","dist","t","module","this","s","n","o","u","OVERSCAN","Sidebar","scrollTop","canvasHeight","onScroll","containerRef","useRef","isScrollingRef","totalHeight","displayHeight","handleScroll","useCallback","useEffect","visibleGroups","_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","useMemo","getGroupIndex","grps","selectedKey","gridCanvasRef","itemsCanvasRef","overlayCanvasRef","interactionRef","outerRef","containerWidth","setContainerWidth","useState","container","obs","entries","entry","canvasWidth","viewStateRef","cursorXRef","hoveredItemIdRef","headerTimeStart","setHeaderTimeStart","headerTimeEnd","setHeaderTimeEnd","sidebarScrollTop","setSidebarScrollTop","headerTimerRef","syncHeaderState","vs","scheduleHeaderSync","hierarchyEngine","engine","intervalTree","layoutEngine","resolvedSummaryRenderer","gridLayer","itemsLayer","overlayLayer","interactionHandler","markerConfigs","configs","displayName","markersKey","m","markersRef","todayMarkerInterval","interval","propsRef","drawGrid","p","drawItems","calculateSnapX","deltaX","draggedEdgeXs","otherEdges","edgeX","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","el","handleWheel","rect","touchRef","getDistance","t1","t2","getCenter","handleTouchStart","handleTouchMove","newDistance","cursorTime","handleTouchEnd","handlePointerMove","newHoveredId","cr","handlePointerDown","handlePointerUp","validator","draggedStartX","draggedEndX","snappedStartTime","startSnap","endSnap","duration","validatedTime","childMoves","edgeTime","snap","constrainedTime","constraint","_d","_f","_e","handleDoubleClick","handleContextMenu","handlePointerLeave","headerChildren","headers","childProps","initialDrawDone","useImperativeHandle","timeStart","timeEnd","printSidebarWidth","headerRowHeight","headerHeight","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","f","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":[15,21]}
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","../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 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}\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\n private visibleDuration: number\n private pixelsPerMs: 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\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\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\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\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 const raw = Math.floor((y + this.scrollTop) / this.lineHeight)\n return Math.max(0, Math.min(raw, this.groupCount - 1))\n }\n\n groupIndexToY(index: number): number {\n return index * this.lineHeight - this.scrollTop\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 const firstVisible = Math.max(0, Math.floor(this.scrollTop / this.lineHeight))\n const visibleCount = Math.ceil(this.canvasHeight / this.lineHeight)\n const lastVisible = Math.min(this.groupCount - 1, firstVisible + visibleCount)\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.groupCount * this.lineHeight\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","import dayjs from 'dayjs'\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 ): 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 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, view.lineHeight)\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 + view.lineHeight)\n ctx.lineTo(view.canvasWidth, y + view.lineHeight)\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 = dayjs(visibleStart).startOf('day')\n const end = dayjs(visibleEnd).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 = dayjs(visibleStart).startOf(stepUnit)\n const end = dayjs(visibleEnd).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 } from 'react'\nimport type { Group, TimelineTheme } from '../types'\n\ninterface SidebarProps {\n groups: Group[]\n width: number\n lineHeight: 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 = 5\n\nexport function Sidebar({\n groups, width, lineHeight, scrollTop, canvasHeight, theme, groupRenderer, onScroll,\n}: SidebarProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false)\n const totalHeight = groups.length * lineHeight\n const displayHeight = canvasHeight\n\n const firstVisible = Math.max(0, Math.floor(scrollTop / lineHeight) - OVERSCAN)\n const lastVisible = Math.min(groups.length - 1, Math.ceil((scrollTop + canvasHeight) / lineHeight) + OVERSCAN)\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 visibleGroups.push(\n <div\n key={group.id}\n style={{\n position: 'absolute',\n top: i * lineHeight,\n height: lineHeight,\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 { 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 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\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 const canvasWidth = Math.max(0, containerWidth - sidebarWidth - (rightSidebarWidth ?? 0))\n const canvasHeight = groups.length * lineHeight\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 }),\n )\n\n const cursorXRef = useRef<number | null>(null)\n const hoveredItemIdRef = useRef<number | undefined>(undefined)\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 // --- 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 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,\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,\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)\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({ canvasWidth, canvasHeight, sidebarWidth, lineHeight, groupCount: groups.length })\n scheduler.markAllDirty()\n }, [canvasWidth, canvasHeight, sidebarWidth, lineHeight, groups.length, 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.groupCount * vs.lineHeight\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 handleHorizontalScroll(e.deltaY)\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 handleVerticalScroll(e.deltaY)\n }\n }\n }\n el.addEventListener('wheel', handleWheel, { passive: false })\n return () => el.removeEventListener('wheel', handleWheel)\n }, [zoomHandler, handleVerticalScroll, handleHorizontalScroll])\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 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])\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 if (!item) return\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 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 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 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, 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 totalHeight = p.groups.length * p.lineHeight\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 y = headerHeight + i * p.lineHeight\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, p.lineHeight)\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 + p.lineHeight / 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 = dayjs(timeStart).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 })\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)\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 totalHeight = p.groups.length * p.lineHeight\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 y = headerHeight + i * p.lineHeight\n const rs = p.rowStyle?.(group)\n ctx.fillStyle = rs?.backgroundColor ?? (i % 2 === 0 ? '#FFFFFF' : '#F7F7F7')\n ctx.fillRect(0, y, printSidebarWidth, p.lineHeight)\n ctx.strokeStyle = '#E5E5E5'\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + p.lineHeight)\n ctx.lineTo(printSidebarWidth, y + p.lineHeight)\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 + p.lineHeight / 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 = dayjs(timeStart).startOf(unit)\n const endBound = dayjs(timeEnd).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 })\n gridLayer.draw(ctx, pv, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights)\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' }}>\n <Sidebar\n groups={groups}\n width={sidebarWidth}\n lineHeight={lineHeight}\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 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}\n\nexport function TimelineHeaders({ children, theme, className, classNames: _classNames, style, visibleTimeStart, visibleTimeEnd, canvasWidth, sidebarWidth = 0, onZoomToInterval }: 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 })\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'\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}\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}: 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 = dayjs(visibleTimeStart).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 = dayjs(visibleTimeStart).startOf(unit).subtract(1, unit)\n const endBound = dayjs(visibleTimeEnd).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])\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","time","x","y","raw","index","extend","firstVisible","visibleCount","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","b","d","levelEnds","maxLevel","level","i","leaves","parents","a","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","GridLayer","dayStyle","rowStyle","highlights","group","bgColor","customRow","h","x1","x2","w","opacity","r","g","visibleStart","visibleEnd","dayPixelWidth","stepUnit","dayjs","batchColor","batchOpacity","batchStartX","customBorderLines","flushBatch","endX","date","custom","dow","line","padding","badgeWidth","badgeHeight","badgeX","badgeY","ITEM_FONT","createDrawHelpers","radius","text","maxWidth","lo","hi","mid","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","e","ZoomHandler","onZoom","visibleTimeStart","visibleTimeEnd","minZoom","maxZoom","cursorRatio","speed","scale","currentDuration","newDuration","newEnd","ACTIVATION_THRESHOLD","InteractionHandler","dragSnap","mode","pixelsPerMs","deltaMs","newStartTime","snapped","newGroupId","newTime","_a","collectItemEdges","excludeItemId","timeToX","edges","findSnapTarget","currentX","edgeXPositions","thresholdPx","_pixelsPerMs","_dragSnap","closestX","closestDist","dist","t","module","this","s","n","o","u","OVERSCAN","Sidebar","scrollTop","canvasHeight","onScroll","containerRef","useRef","isScrollingRef","totalHeight","displayHeight","handleScroll","useCallback","useEffect","visibleGroups","_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","devBadge","useMemo","getGroupIndex","grps","selectedKey","gridCanvasRef","itemsCanvasRef","overlayCanvasRef","interactionRef","outerRef","containerWidth","setContainerWidth","useState","container","obs","entries","entry","canvasWidth","viewStateRef","cursorXRef","hoveredItemIdRef","headerTimeStart","setHeaderTimeStart","headerTimeEnd","setHeaderTimeEnd","sidebarScrollTop","setSidebarScrollTop","headerTimerRef","syncHeaderState","vs","scheduleHeaderSync","hierarchyEngine","engine","intervalTree","layoutEngine","resolvedSummaryRenderer","gridLayer","itemsLayer","overlayLayer","interactionHandler","markerConfigs","configs","displayName","markersKey","m","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","el","handleWheel","rect","touchRef","getDistance","t1","t2","getCenter","handleTouchStart","handleTouchMove","newDistance","cursorTime","handleTouchEnd","handlePointerMove","newHoveredId","cr","handlePointerDown","handlePointerUp","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","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","f","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":[15,21]}