@taskctrl/canvas-timeline 0.4.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/GridLayer.d.ts +1 -1
- package/dist/canvas-timeline.cjs.js +1 -1
- package/dist/canvas-timeline.cjs.js.map +1 -1
- package/dist/canvas-timeline.es.js +1106 -877
- package/dist/canvas-timeline.es.js.map +1 -1
- package/dist/core/ViewState.d.ts +5 -0
- package/dist/dom/DateHeader.d.ts +2 -1
- package/dist/dom/Sidebar.d.ts +2 -1
- package/dist/dom/TimelineHeaders.d.ts +2 -1
- package/dist/types.d.ts +8 -0
- package/dist/utils/timezone.d.ts +2 -0
- package/package.json +1 -1
|
@@ -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 /** 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 // --- PAN STATE ---\n const panRef = useRef<{ startX: number; startY: number; lastX: number; lastY: number } | null>(null)\n const didPanRef = useRef(false)\n const PAN_THRESHOLD = 4\n\n // --- THROTTLED HEADER STATE ---\n const [headerTimeStart, setHeaderTimeStart] = useState(props.visibleTimeStart ?? defaultTimeStart)\n const [headerTimeEnd, setHeaderTimeEnd] = useState(props.visibleTimeEnd ?? defaultTimeEnd)\n const [sidebarScrollTop, setSidebarScrollTop] = useState(0)\n const headerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const syncHeaderState = useCallback(() => {\n const vs = viewStateRef.current\n setHeaderTimeStart(vs.visibleTimeStart)\n setHeaderTimeEnd(vs.visibleTimeEnd)\n setSidebarScrollTop(vs.scrollTop)\n headerTimerRef.current = null\n }, [])\n\n const scheduleHeaderSync = useCallback(() => {\n if (headerTimerRef.current !== null) return\n headerTimerRef.current = setTimeout(syncHeaderState, HEADER_THROTTLE_MS)\n }, [syncHeaderState])\n\n useEffect(() => {\n return () => { if (headerTimerRef.current !== null) clearTimeout(headerTimerRef.current) }\n }, [])\n\n // --- 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 // --- Pan mode (drag on empty canvas) ---\n if (panRef.current) {\n const dx = e.clientX - panRef.current.startX\n const dy = e.clientY - panRef.current.startY\n if (!didPanRef.current && (Math.abs(dx) >= PAN_THRESHOLD || Math.abs(dy) >= PAN_THRESHOLD)) {\n didPanRef.current = true\n el.style.cursor = 'grabbing'\n el.setPointerCapture(e.pointerId)\n }\n if (didPanRef.current) {\n const moveDeltaX = e.clientX - panRef.current.lastX\n const moveDeltaY = e.clientY - panRef.current.lastY\n panRef.current.lastX = e.clientX\n panRef.current.lastY = e.clientY\n if (Math.abs(moveDeltaX) > 0) handleHorizontalScroll(-moveDeltaX)\n if (Math.abs(moveDeltaY) > 0) handleVerticalScroll(-moveDeltaY)\n }\n return\n }\n\n if (interactionHandler.isPending()) {\n interactionHandler.update(x, y)\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n if (state && state.mode === 'move' && propsRef.current.canChangeGroup) {\n const group = hitTestGroup(y, viewStateRef.current, propsRef.current.groups)\n if (group) interactionHandler.setCurrentGroup(group.id)\n }\n scheduler.markDirty('overlay')\n }\n return\n }\n\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n const newHoveredId = item?.id\n if (newHoveredId !== hoveredItemIdRef.current) {\n hoveredItemIdRef.current = newHoveredId\n scheduler.markDirty('items')\n p.onItemHover?.(newHoveredId ?? null, e.nativeEvent as unknown as PointerEvent)\n }\n\n // Cursor management\n if (item) {\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (p.canMove) {\n el.style.cursor = 'grab'\n } else {\n el.style.cursor = 'default'\n }\n } else {\n el.style.cursor = 'default'\n }\n }, [interactionHandler, scheduler, handleHorizontalScroll, handleVerticalScroll])\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const p = propsRef.current\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n\n if (!item) {\n // Start pan on empty canvas\n panRef.current = { startX: e.clientX, startY: e.clientY, lastX: e.clientX, lastY: e.clientY }\n didPanRef.current = false\n return\n }\n\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-left', x, y)\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-right', x, y)\n } else if (p.canMove) {\n interactionHandler.startInteraction(item, 'move', x, y)\n }\n }, [interactionHandler])\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n\n // --- End pan mode ---\n if (panRef.current) {\n const wasPanning = didPanRef.current\n panRef.current = null\n didPanRef.current = false\n el.style.cursor = 'default'\n if (wasPanning) return // suppress click after pan\n }\n\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n if (state) {\n const validator = propsRef.current.moveResizeValidator\n if (state.mode === 'move') {\n const result = interactionHandler.endMove(pixelsPerMs)\n if (result) {\n // Check for item-to-item snap\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const draggedStartX = vs.timeToX(state.item.start_time + deltaMs)\n const draggedEndX = vs.timeToX(state.item.end_time + deltaMs)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n let snappedStartTime = result.newStartTime\n // Check start edge\n const startSnap = findSnapTarget(draggedStartX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (startSnap !== null) {\n snappedStartTime = vs.xToTime(startSnap)\n } else {\n // Check end edge\n const endSnap = findSnapTarget(draggedEndX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (endSnap !== null) {\n const duration = state.item.end_time - state.item.start_time\n snappedStartTime = vs.xToTime(endSnap) - duration\n }\n }\n\n const validatedTime = validator ? validator('move', state.item.id, snappedStartTime) : snappedStartTime\n const childMoves = propsRef.current.hierarchyEngine.getMoveDelta(state.item.id, validatedTime)\n propsRef.current.onItemMove?.(state.item.id, validatedTime, result.newGroupId, childMoves.length > 0 ? childMoves : undefined)\n }\n } else {\n const result = interactionHandler.endResize(pixelsPerMs)\n if (result) {\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const edgeTime = result.edge === 'left' ? state.item.start_time + deltaMs : state.item.end_time + deltaMs\n const edgeX = vs.timeToX(edgeTime)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n const snap = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n let constrainedTime = snap !== null ? vs.xToTime(snap) : result.newTime\n // Apply hierarchy resize constraints\n const constraint = propsRef.current.hierarchyEngine.getResizeConstraint(state.item.id, result.edge)\n if (result.edge === 'left' && constrainedTime > constraint.max) {\n constrainedTime = constraint.max\n } else if (result.edge === 'right' && constrainedTime < constraint.min) {\n constrainedTime = constraint.min\n }\n\n const validatedTime = validator ? validator('resize', state.item.id, constrainedTime, result.edge) : constrainedTime\n propsRef.current.onItemResize?.(state.item.id, validatedTime, result.edge)\n }\n }\n }\n el.style.cursor = 'default'\n scheduler.markDirty('overlay')\n return\n }\n if (interactionHandler.isPending()) interactionHandler.cancel()\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, propsRef.current.intervalTree, propsRef.current.layoutEngine, propsRef.current.groups)\n if (item) propsRef.current.onItemClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n }, [interactionHandler, scheduler])\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemDoubleClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasDoubleClick?.(group.id as number, time)\n }\n }, [])\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemContextMenu?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasContextMenu?.(group.id as number, time, e.nativeEvent as unknown as PointerEvent)\n }\n }, [])\n\n const handlePointerLeave = useCallback(() => {\n panRef.current = null\n didPanRef.current = false\n cursorXRef.current = null\n if (interactionRef.current) interactionRef.current.style.cursor = 'default'\n if (hoveredItemIdRef.current !== undefined) {\n hoveredItemIdRef.current = undefined\n scheduler.markDirty('items')\n propsRef.current.onItemHover?.(null, new PointerEvent('pointerleave'))\n }\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n }, [scheduler])\n\n // --- HEADER CHILDREN ---\n const headerChildren = useMemo(() => {\n const headers: React.ReactNode[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TimelineHeaders') {\n const childProps = child.props as Record<string, unknown>\n headers.push(\n React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? headerTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? headerTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n sidebarWidth: childProps.sidebarWidth ?? sidebarWidth,\n theme: childProps.theme ?? theme,\n 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","panRef","didPanRef","PAN_THRESHOLD","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","dy","moveDeltaX","moveDeltaY","newHoveredId","cr","handlePointerDown","handlePointerUp","wasPanning","validator","draggedStartX","draggedEndX","snappedStartTime","startSnap","endSnap","duration","validatedTime","childMoves","snap","constrainedTime","constraint","_d","_f","_e","handleDoubleClick","handleContextMenu","handlePointerLeave","headerChildren","headers","childProps","initialDrawDone","useImperativeHandle","timeStart","timeEnd","printSidebarWidth","headerRowHeight","headerHeight","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":";;;;AA2FO,MAAMA,KAA+B;AAAA,EAC1C,SAAS;AAAA,EACT,aAAa,CAAA;AAAA,EACb,QAAQ,EAAE,KAAK,WAAW,QAAQ,WAAW,OAAO,UAAA;AAAA,EACpD,MAAM,EAAE,MAAM,WAAW,QAAQ,WAAW,SAAS,mBAAA;AAAA,EACrD,MAAM,EAAE,QAAQ,GAAG,MAAM,WAAW,cAAc,UAAA;AAAA,EAClD,QAAQ,EAAE,OAAO,WAAW,WAAW,WAAW,QAAQ,UAAA;AAAA,EAC1D,SAAS,EAAE,IAAI,WAAW,QAAQ,WAAW,MAAM,UAAA;AAAA,EACnD,QAAQ,EAAE,IAAI,WAAW,QAAQ,WAAW,MAAM,UAAA;;MCvFvCC,GAAS;AAAA,EAcpB,YAAYC,GAAuB;AAbnC,WAAA,eAAA,MAAA,oBAAA;AAAA;;;;KAAwB,GACxB,OAAA,eAAA,MAAA,kBAAA;AAAA;;;;KAAsB,GACtB,OAAA,eAAA,MAAA,eAAA;AAAA;;;;KAAmB,GACnB,OAAA,eAAA,MAAA,gBAAA;AAAA;;;;KAAoB,GACpB,OAAA,eAAA,MAAA,gBAAA;AAAA;;;;KAAoB,GACpB,OAAA,eAAA,MAAA,cAAA;AAAA;;;;KAAkB,GAClB,OAAA,eAAA,MAAA,cAAA;AAAA;;;;KAAkB,GAClB,OAAA,eAAA,MAAA,UAAA;AAAA;;;;KAAc,GACd,OAAA,eAAA,MAAA,aAAA;AAAA;;;;KAAiB,GAET,OAAA,eAAA,MAAA,mBAAA;AAAA;;;;KAAuB,GACvB,OAAA,eAAA,MAAA,eAAA;AAAA;;;;KAAmB,GAGzB,KAAK,mBAAmBA,EAAO,kBAC/B,KAAK,iBAAiBA,EAAO,gBAC7B,KAAK,cAAcA,EAAO,aAC1B,KAAK,eAAeA,EAAO,cAC3B,KAAK,eAAeA,EAAO,cAC3B,KAAK,aAAaA,EAAO,YACzB,KAAK,aAAaA,EAAO,YACzB,KAAK,SAASA,EAAO,QACrB,KAAK,YAAYA,EAAO,WAExB,KAAK,kBAAkB,KAAK,iBAAiB,KAAK,kBAClD,KAAK,cAAc,KAAK,cAAc,KAAK;AAAA,EAC7C;AAAA,EAEA,OAAOC,GAAgC;AACrC,IAAIA,EAAO,qBAAqB,WAAW,KAAK,mBAAmBA,EAAO,mBACtEA,EAAO,mBAAmB,WAAW,KAAK,iBAAiBA,EAAO,iBAClEA,EAAO,gBAAgB,WAAW,KAAK,cAAcA,EAAO,cAC5DA,EAAO,iBAAiB,WAAW,KAAK,eAAeA,EAAO,eAC9DA,EAAO,iBAAiB,WAAW,KAAK,eAAeA,EAAO,eAC9DA,EAAO,eAAe,WAAW,KAAK,aAAaA,EAAO,aAC1DA,EAAO,eAAe,WAAW,KAAK,aAAaA,EAAO,aAC1DA,EAAO,WAAW,WAAW,KAAK,SAASA,EAAO,SAClDA,EAAO,cAAc,WAAW,KAAK,YAAYA,EAAO,YAE5D,KAAK,kBAAkB,KAAK,iBAAiB,KAAK,kBAClD,KAAK,cAAc,KAAK,cAAc,KAAK;AAAA,EAC7C;AAAA,EAEA,QAAQC,GAAY;AAClB,YAAQA,IAAO,KAAK,oBAAoB,KAAK;AAAA,EAC/C;AAAA,EAEA,QAAQC,GAAS;AACf,WAAO,KAAK,mBAAmBA,IAAI,KAAK;AAAA,EAC1C;AAAA,EAEA,cAAcC,GAAS;AACrB,UAAMC,IAAM,KAAK,OAAOD,IAAI,KAAK,aAAa,KAAK,UAAU;AAC7D,WAAO,KAAK,IAAI,GAAG,KAAK,IAAIC,GAAK,KAAK,aAAa,CAAC,CAAC;AAAA,EACvD;AAAA,EAEA,cAAcC,GAAa;AACzB,WAAOA,IAAQ,KAAK,aAAa,KAAK;AAAA,EACxC;AAAA,EAEA,kBAAe;AACb,UAAMC,IAAS,KAAK,kBAAkB;AACtC,WAAO;AAAA,MACL,aAAa,KAAK,mBAAmBA;AAAA,MACrC,WAAW,KAAK,iBAAiBA;AAAA,IAAA;AAAA,EAErC;AAAA,EAEA,uBAAoB;AAClB,UAAMC,IAAe,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,YAAY,KAAK,UAAU,CAAC,GACvEC,IAAe,KAAK,KAAK,KAAK,eAAe,KAAK,UAAU,GAC5DC,IAAc,KAAK,IAAI,KAAK,aAAa,GAAGF,IAAeC,CAAY;AAC7E,WAAO,EAAE,cAAAD,GAAc,aAAAE,EAAA;AAAA,EACzB;AAAA,EAEA,iBAAiBC,GAAqB;AACpC,UAAMC,IAAe,KAAK,kBAAkB,MAAM,KAAK;AACvD,WAAO,KAAK,IAAID,CAAa,IAAIC;AAAA,EACnC;AAAA,EAEA,iBAAc;AACZ,WAAO,KAAK,aAAa,KAAK;AAAA,EAChC;AACD;MCzFYC,GAAY;AAAA,EAAzB,cAAA;AACU,WAAA,eAAA,MAAA,QAAA;AAAA;;;aAA2B;AAAA,IAAA,CAAI;AAAA,EA8EzC;AAAA,EA5EE,eACEC,GACAC,GACAC,GAA2B;AAE3B,UAAMC,IAAYH,EAAM,IAAI,CAACI,OAAU;AAAA,MACrC,MAAAA;AAAA,MACA,OAAOH,EAASG,CAAI;AAAA,MACpB,KAAKF,EAAOE,CAAI;AAAA,IAAA,EAChB;AACF,SAAK,OAAO,KAAK,UAAUD,CAAS;AAAA,EACtC;AAAA,EAEQ,UACNA,GAAyD;AAEzD,QAAIA,EAAU,WAAW;AAAG,aAAO;AAEnC,QAAIE,IAAM,OACNC,IAAM;AACV,eAAWC,KAAMJ;AACf,MAAII,EAAG,QAAQF,MAAKA,IAAME,EAAG,QACzBA,EAAG,MAAMD,MAAKA,IAAMC,EAAG;AAE7B,UAAMC,KAAUH,IAAMC,KAAO,GAEvBG,IAAgE,CAAA,GAChEC,IAAiE,CAAA,GACjEC,IAA8D,CAAA;AAEpE,eAAWJ,KAAMJ;AACf,MAAII,EAAG,MAAMC,IACXC,EAAc,KAAKF,CAAE,IACZA,EAAG,QAAQC,IACpBE,EAAe,KAAKH,CAAE,IAEtBI,EAAY,KAAKJ,CAAE;AAIvB,WAAO;AAAA,MACL,QAAAC;AAAA,MACA,MAAM,KAAK,UAAUC,CAAa;AAAA,MAClC,OAAO,KAAK,UAAUC,CAAc;AAAA,MACpC,aAAAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAMC,GAAeC,GAAW;AAC9B,UAAMC,IAAe,CAAA;AACrB,gBAAK,UAAU,KAAK,MAAMF,GAAOC,GAAKC,CAAO,GACtCA;AAAA,EACT;AAAA,EAEQ,UACNC,GACAH,GACAC,GACAC,GAAY;AAEZ,QAAIC,MAAS,MAEb;AAAA,iBAAWR,KAAMQ,EAAK;AACpB,QAAIR,EAAG,SAASM,KAAON,EAAG,OAAOK,KAC/BE,EAAQ,KAAKP,EAAG,IAAI;AAIxB,MAAIK,KAASG,EAAK,UAAUA,EAAK,SAAS,QACxC,KAAK,UAAUA,EAAK,MAAMH,GAAOC,GAAKC,CAAO,GAG3CD,KAAOE,EAAK,UAAUA,EAAK,UAAU,QACvC,KAAK,UAAUA,EAAK,OAAOH,GAAOC,GAAKC,CAAO;AAAA;AAAA,EAElD;AACD;MC9EYE,GAAY;AAAA,EAMvB,YAAYC,GAAoBC,GAAuB;AALtC,WAAA,eAAA,MAAA,cAAA;AAAA;;;;KAAkB,GAClB,OAAA,eAAA,MAAA,mBAAA;AAAA;;;;KAAuB,GAChC,OAAA,eAAA,MAAA,eAAA;AAAA;;;MAAuC,2BAAI,IAAA;AAAA,IAAG,CAAE,GAChD,OAAA,eAAA,MAAA,iBAAA;AAAA;;;MAA8C,2BAAI,IAAA;AAAA,IAAG,CAAE,GAG7D,KAAK,aAAaD,GAClB,KAAK,kBAAkBC;AAAA,EACzB;AAAA,EAEA,cAAclB,GAAemB,GAAqBC,GAA2B;AAC3E,SAAK,kCAAkB,IAAA,GACvB,KAAK,oCAAoB,IAAA;AAEzB,UAAMC,IAAa,KAAK,aAAa,KAAK,iBACpCC,IAAgBD,IAAa;AAEnC,QAAI,CAACF,GAAY;AACf,iBAAWf,KAAQJ,GAAO;AACxB,cAAMuB,KAAYH,KAAA,gBAAAA,EAAW,SAAShB,EAAK,QAAO;AAClD,aAAK,YAAY,IAAIA,EAAK,IAAI,EAAE,YAAY,GAAG,YAAYmB,IAAYD,IAAgBD,EAAA,CAAY,GACnG,KAAK,cAAc,IAAIjB,EAAK,OAAO,CAAC;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,IACd;AAGA,UAAMoB,wBAAc,IAAA;AACpB,eAAWpB,KAAQJ,GAAO;AACxB,UAAIyB,IAAMD,EAAQ,IAAIpB,EAAK,KAAK;AAChC,MAAKqB,MACHA,IAAM,CAAA,GACND,EAAQ,IAAIpB,EAAK,OAAOqB,CAAG,IAE7BA,EAAI,KAAKrB,CAAI;AAAA,IACf;AAEA,eAAW,CAACsB,GAASC,CAAU,KAAKH;AAClC,MAAIJ,IACF,KAAK,uBAAuBO,GAAYP,GAAWC,GAAYC,GAAeI,CAAO,IAErF,KAAK,kBAAkBC,GAAYN,GAAYK,CAAO;AAI1D,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,kBAAkBC,GAAoBN,GAAoBK,GAAwB;AACxF,IAAAC,EAAW,KAAK,CAAC,GAAGC,MAAK;AACvB,YAAMC,IAAI,EAAE,aAAaD,EAAE;AAC3B,aAAIC,MAAM,IAAUA,IACZD,EAAE,WAAWA,EAAE,cAAe,EAAE,WAAW,EAAE;AAAA,IACvD,CAAC;AAED,UAAME,IAAsB,CAAA;AAC5B,QAAIC,IAAW;AAEf,eAAW3B,KAAQuB,GAAY;AAC7B,UAAIK,IAAQ;AACZ,eAASC,IAAI,GAAGA,IAAIH,EAAU,QAAQG;AACpC,YAAIH,EAAUG,CAAC,KAAK7B,EAAK,YAAY;AACnC,UAAA4B,IAAQC;AACR;AAAA,QACF;AAGF,MAAID,MAAU,MACZA,IAAQF,EAAU,QAClBA,EAAU,KAAK1B,EAAK,QAAQ,KAE5B0B,EAAUE,CAAK,IAAI5B,EAAK,UAGtB4B,IAAQD,MAAUA,IAAWC,IAEjC,KAAK,YAAY,IAAI5B,EAAK,IAAI,EAAE,YAAY4B,GAAO,YAAAX,GAAY;AAAA,IACjE;AAEA,SAAK,cAAc,IAAIK,GAASK,CAAQ;AAAA,EAC1C;AAAA,EAEQ,uBACNJ,GACAP,GACAC,GACAC,GACAI,GAAwB;AAGxB,UAAMQ,IAAiB,CAAA,GACjBC,IAAkB,CAAA;AACxB,eAAW/B,KAAQuB;AACjB,MAAIP,EAAU,SAAShB,EAAK,EAAE,IAC5B+B,EAAQ,KAAK/B,CAAI,IAEjB8B,EAAO,KAAK9B,CAAI;AAKpB,IAAA8B,EAAO,KAAK,CAACE,GAAG,MAAK;AACnB,YAAMP,IAAIO,EAAE,aAAa,EAAE;AAC3B,aAAIP,MAAM,IAAUA,IACZ,EAAE,WAAW,EAAE,cAAeO,EAAE,WAAWA,EAAE;AAAA,IACvD,CAAC;AAED,UAAMN,IAAsB,CAAA;AAC5B,QAAIC,IAAW;AAEf,eAAW3B,KAAQ8B,GAAQ;AACzB,UAAIF,IAAQ;AACZ,eAASC,IAAI,GAAGA,IAAIH,EAAU,QAAQG;AACpC,YAAIH,EAAUG,CAAC,KAAK7B,EAAK,YAAY;AACnC,UAAA4B,IAAQC;AACR;AAAA,QACF;AAGF,MAAID,MAAU,MACZA,IAAQF,EAAU,QAClBA,EAAU,KAAK1B,EAAK,QAAQ,KAE5B0B,EAAUE,CAAK,IAAI5B,EAAK,UAGtB4B,IAAQD,MAAUA,IAAWC,IAEjC,KAAK,YAAY,IAAI5B,EAAK,IAAI,EAAE,YAAY4B,GAAO,YAAAX,GAAY;AAAA,IACjE;AAIA,IAAAc,EAAQ,KAAK,CAACC,GAAG,MAAMhB,EAAU,gBAAgB,EAAE,EAAE,IAAIA,EAAU,gBAAgBgB,EAAE,EAAE,CAAC;AAExF,QAAIC,IAAYH,EAAO,SAAS,IAAIH,IAAW,IAAI;AACnD,eAAWO,KAAUH;AACnB,WAAK,YAAY,IAAIG,EAAO,IAAI,EAAE,YAAYD,GAAW,YAAYf,GAAe,GAChFe,IAAYN,MAAUA,IAAWM,IACrCA;AAGF,SAAK,cAAc,IAAIX,GAASK,CAAQ;AAAA,EAC1C;AAAA,EAEA,UAAUQ,GAAc;AACtB,WAAO,KAAK,YAAY,IAAIA,CAAM;AAAA,EACpC;AAAA,EAEA,eAAeb,GAAwB;AAErC,aADiB,KAAK,cAAc,IAAIA,CAAO,KAAK,KACjC,KAAK,KAAK;AAAA,EAC/B;AACD;MC3JYc,GAAe;AAAA,EAA5B,cAAA;AACU,WAAA,eAAA,MAAA,oBAAA;AAAA;;;MAA0C,2BAAI,IAAA;AAAA,IAAG,CAAE,GACnD,OAAA,eAAA,MAAA,iBAAA;AAAA;;;MAAqC,2BAAI,IAAA;AAAA,IAAG,CAAE,GAC9C,OAAA,eAAA,MAAA,WAAA;AAAA;;;MAAsC,2BAAI,IAAA;AAAA,IAAG,CAAE,GAC/C,OAAA,eAAA,MAAA,cAAA;AAAA;;;MAAkC,2BAAI,IAAA;AAAA,IAAG,CAAE;AAAA,EA+IrD;AAAA,EA7IE,QAAQxC,GAAsB;AAC5B,SAAK,uCAAuB,IAAA,GAC5B,KAAK,oCAAoB,IAAA,GACzB,KAAK,8BAAc,IAAA,GACnB,KAAK,iCAAiB,IAAA;AAEtB,eAAWI,KAAQJ;AACjB,WAAK,QAAQ,IAAII,EAAK,IAAIA,CAAI;AAGhC,eAAWA,KAAQJ;AACjB,UAAII,EAAK,aAAa,UAAa,KAAK,QAAQ,IAAIA,EAAK,QAAQ,GAAG;AAClE,aAAK,cAAc,IAAIA,EAAK,IAAIA,EAAK,QAAQ;AAC7C,YAAIqC,IAAW,KAAK,iBAAiB,IAAIrC,EAAK,QAAQ;AACtD,QAAKqC,MACHA,IAAW,CAAA,GACX,KAAK,iBAAiB,IAAIrC,EAAK,UAAUqC,CAAQ,IAEnDA,EAAS,KAAKrC,EAAK,EAAE;AAAA,MACvB;AAIF,eAAWsC,KAAM,KAAK,cAAc,KAAA,GAAQ;AAC1C,YAAMC,wBAAc,IAAA;AACpB,UAAIC,IAA8BF;AAClC,aAAOE,MAAY,UAAW;AAC5B,YAAID,EAAQ,IAAIC,CAAO,GAAG;AACxB,gBAAMC,IAAW,KAAK,cAAc,IAAIH,CAAE;AAC1C,eAAK,cAAc,OAAOA,CAAE;AAC5B,gBAAMI,IAAW,KAAK,iBAAiB,IAAID,CAAQ;AACnD,cAAIC,GAAU;AACZ,kBAAMC,IAAMD,EAAS,QAAQJ,CAAE;AAC/B,YAAIK,MAAQ,MAAID,EAAS,OAAOC,GAAK,CAAC,GAClCD,EAAS,WAAW,KAAG,KAAK,iBAAiB,OAAOD,CAAQ;AAAA,UAClE;AACA;AAAA,QACF;AACA,QAAAF,EAAQ,IAAIC,CAAO,GACnBA,IAAU,KAAK,cAAc,IAAIA,CAAO;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAASL,GAAc;AACrB,UAAME,IAAW,KAAK,iBAAiB,IAAIF,CAAM;AACjD,WAAOE,MAAa,UAAaA,EAAS,SAAS;AAAA,EACrD;AAAA,EAEA,UAAUF,GAAc;AACtB,WAAO,KAAK,cAAc,IAAIA,CAAM;AAAA,EACtC;AAAA,EAEA,YAAYA,GAAc;AACxB,WAAO,KAAK,iBAAiB,IAAIA,CAAM,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,eAAeA,GAAc;AAC3B,UAAMS,IAAmB,CAAA,GACnBC,IAAQ,CAAC,GAAG,KAAK,YAAYV,CAAM,CAAC;AAC1C,WAAOU,EAAM,SAAS,KAAG;AACvB,YAAMP,IAAKO,EAAM,IAAA;AACjB,MAAAD,EAAO,KAAKN,CAAE;AACd,YAAMD,IAAW,KAAK,iBAAiB,IAAIC,CAAE;AAC7C,MAAID,KAAUQ,EAAM,KAAK,GAAGR,CAAQ;AAAA,IACtC;AACA,WAAOO;AAAA,EACT;AAAA,EAEA,iBAAiBT,GAAc;AAC7B,UAAMnC,IAAO,KAAK,QAAQ,IAAImC,CAAM;AACpC,QAAI,CAACnC;AAAM,aAAO,EAAE,OAAO,GAAG,KAAK,EAAA;AAEnC,QAAIQ,IAAQR,EAAK,YACbS,IAAMT,EAAK;AAEf,UAAM8C,IAAc,KAAK,eAAeX,CAAM;AAC9C,eAAWY,KAAUD,GAAa;AAChC,YAAME,IAAO,KAAK,QAAQ,IAAID,CAAM;AACpC,MAAKC,MACDA,EAAK,aAAaxC,MAAOA,IAAQwC,EAAK,aACtCA,EAAK,WAAWvC,MAAKA,IAAMuC,EAAK;AAAA,IACtC;AAEA,WAAO,EAAE,OAAAxC,GAAO,KAAAC,EAAA;AAAA,EAClB;AAAA,EAEA,gBAAgB0B,GAAc;AAC5B,UAAMc,IAAS,KAAK,WAAW,IAAId,CAAM;AACzC,QAAIc,MAAW;AAAW,aAAOA;AAEjC,QAAIC,IAAQ,GACRV,IAAU,KAAK,cAAc,IAAIL,CAAM;AAC3C,WAAOK,MAAY;AACjB,MAAAU,KACAV,IAAU,KAAK,cAAc,IAAIA,CAAO;AAE1C,gBAAK,WAAW,IAAIL,GAAQe,CAAK,GAC1BA;AAAA,EACT;AAAA,EAEA,aAAaf,GAAgBgB,GAAgB;AAC3C,UAAMnD,IAAO,KAAK,QAAQ,IAAImC,CAAM;AACpC,QAAI,CAACnC;AAAM,aAAO,CAAA;AAElB,UAAMoD,IAAQD,IAAWnD,EAAK;AAE9B,WADoB,KAAK,eAAemC,CAAM,EAC3B,IAAI,CAAAY,MAAS;AAC9B,YAAMC,IAAO,KAAK,QAAQ,IAAID,CAAM;AACpC,aAAO,EAAE,QAAQA,GAAQ,UAAUC,EAAK,aAAaI,EAAA;AAAA,IACvD,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoBjB,GAAgBkB,GAAsB;AACxD,UAAMhB,IAAW,KAAK,eAAeF,CAAM;AAC3C,QAAIE,EAAS,WAAW;AACtB,aAAOgB,MAAS,SACZ,EAAE,KAAK,QAAW,KAAK,MAAA,IACvB,EAAE,KAAK,QAAW,KAAK,MAAA;AAG7B,QAAIA,MAAS,QAAQ;AACnB,UAAIC,IAAgB;AACpB,iBAAWC,KAAWlB,GAAU;AAC9B,cAAMmB,IAAQ,KAAK,QAAQ,IAAID,CAAO;AACtC,QAAIC,KAASA,EAAM,aAAaF,MAC9BA,IAAgBE,EAAM;AAAA,MAE1B;AACA,aAAO,EAAE,KAAK,QAAW,KAAKF,EAAA;AAAA,IAChC,OAAO;AACL,UAAIG,IAAc;AAClB,iBAAWF,KAAWlB,GAAU;AAC9B,cAAMmB,IAAQ,KAAK,QAAQ,IAAID,CAAO;AACtC,QAAIC,KAASA,EAAM,WAAWC,MAC5BA,IAAcD,EAAM;AAAA,MAExB;AACA,aAAO,EAAE,KAAKC,GAAa,KAAK,MAAA;AAAA,IAClC;AAAA,EACF;AACD;ACxJK,SAAUC,GACdC,GACA3D,GACA4D,GACAC,GACAC,GACAC,GAAoB;AAEpB,QAAM,EAAE,GAAA9E,GAAG,GAAAC,GAAG,OAAA8E,GAAO,QAAAC,MAAWL,GAC1BM,IAAQH,EAAM;AAGpB,EAAAJ,EAAI,cAAc,MAClBA,EAAI,YAAYO,GAChBP,EAAI,SAAS1E,GAAGC,GAAG8E,GAAOC,CAAM,GAChCN,EAAI,cAAc,GAGlBA,EAAI,cAAcO,GAClBP,EAAI,YAAY,KAChBA,EAAI,WAAW1E,GAAGC,GAAG8E,GAAOC,CAAM;AAGlC,QAAME,IAAc,KAAK,IAAIF,IAAS,KAAK,CAAC,GACtCG,IAAOlF,IAAI+E,IAAS;AAE1B,EAAAN,EAAI,YAAYO,GAEhBP,EAAI,UAAA,GACJA,EAAI,OAAO1E,GAAGmF,CAAI,GAClBT,EAAI,OAAO1E,IAAIkF,GAAaC,IAAOD,CAAW,GAC9CR,EAAI,OAAO1E,IAAIkF,IAAc,GAAGC,CAAI,GACpCT,EAAI,OAAO1E,IAAIkF,GAAaC,IAAOD,CAAW,GAC9CR,EAAI,UAAA,GACJA,EAAI,KAAA,GAGJA,EAAI,UAAA,GACJA,EAAI,OAAO1E,IAAI+E,GAAOI,CAAI,GAC1BT,EAAI,OAAO1E,IAAI+E,IAAQG,GAAaC,IAAOD,CAAW,GACtDR,EAAI,OAAO1E,IAAI+E,IAAQG,IAAc,GAAGC,CAAI,GAC5CT,EAAI,OAAO1E,IAAI+E,IAAQG,GAAaC,IAAOD,CAAW,GACtDR,EAAI,UAAA,GACJA,EAAI,KAAA;AAGJ,QAAMU,IAASrE,EAA4B;AAC3C,MAAIqE,KAASL,IAAQ,IAAI;AACvB,IAAAL,EAAI,YAAYI,EAAM,KAAK,MAC3BJ,EAAI,OAAO,8EACXA,EAAI,eAAe;AACnB,UAAMW,IAAYX,EAAI,YAAYU,CAAK,EAAE,OACnCE,IAAeP,IAAQG,IAAc,IAAI;AAC/C,QAAII,IAAe,IAAI;AACrB,YAAMC,IAAcF,IAAYC,IAC5BF,EAAM,MAAM,GAAG,KAAK,MAAMA,EAAM,SAASE,IAAeD,CAAS,CAAC,IAAI,QACtED;AACJ,MAAAV,EAAI,SAASa,GAAavF,IAAI+E,IAAQ,IAAI,KAAK,IAAIM,GAAWC,CAAY,IAAI,GAAGH,CAAI;AAAA,IACvF;AAAA,EACF;AAGA,EAAIP,EAAM,aACRF,EAAI,cAAcI,EAAM,KAAK,cAC7BJ,EAAI,YAAY,GAChBA,EAAI,WAAW1E,IAAI,GAAGC,IAAI,GAAG8E,IAAQ,GAAGC,IAAS,CAAC;AAEtD;AChEM,SAAUQ,GACdC,GACAC,GACAC,GACAC,GACAC,GACAC,GAAe;AAEf,QAAM/F,IAAO4F,EAAK,QAAQF,CAAO,GAE3BM,wBAAoB,IAAA;AAC1B,WAASnD,IAAI,GAAGA,IAAIkD,EAAO,QAAQlD;AACjC,IAAAmD,EAAc,IAAID,EAAOlD,CAAC,EAAE,IAAIA,CAAC;AAGnC,QAAMoD,IAAaJ,EAAK,MAAM7F,GAAMA,CAAI;AAExC,MAAIkG,IAAuB,MACvBC,IAAO;AAEX,aAAWnF,KAAQiF,GAAY;AAC7B,UAAMG,IAAaJ,EAAc,IAAIhF,EAAK,KAAK;AAC/C,QAAIoF,MAAe;AAAW;AAE9B,UAAMC,IAAaP,EAAO,UAAU9E,EAAK,EAAE;AAC3C,QAAI,CAACqF;AAAY;AAEjB,UAAMpG,IAAI2F,EAAK,QAAQ5E,EAAK,UAAU,GAChCgE,IAAQY,EAAK,QAAQ5E,EAAK,QAAQ,IAAIf;AAE5C,QAAIyF,IAAUzF,KAAKyF,IAAUzF,IAAI+E;AAAO;AAGxC,UAAM9E,IADS0F,EAAK,cAAcQ,CAAU,IACzBC,EAAW,aAAaT,EAAK,cAAcA,EAAK,aAAaS,EAAW,cAAc,GACnGpB,IAASoB,EAAW;AAE1B,IAAIV,IAAUzF,KAAKyF,IAAUzF,IAAI+E,KAE7B/E,IAAIiG,MACNA,IAAOjG,GACPgG,IAAUlF;AAAA,EAEd;AAEA,SAAOkF;AACT;SAEgBI,GACdX,GACAC,GACAG,GAAe;AAEf,QAAMK,IAAaR,EAAK,cAAcD,CAAO;AAC7C,SAAOI,EAAOK,CAAU,KAAK;AAC/B;AAEM,SAAUG,GACdb,GACA1E,GACA4E,GACAY,IAAoB,GAAC;AAErB,QAAMC,IAAQb,EAAK,QAAQ5E,EAAK,UAAU,GACpC0F,IAASd,EAAK,QAAQ5E,EAAK,QAAQ;AACzC,SAAI0E,IAAUe,KAASD,IAAkB,SACrCE,IAAShB,KAAWc,IAAkB,UACnC;AACT;SCnEgBG,GACdC,GACA5B,GACAC,GAAc;AAEd,QAAM4B,IAAM,OAAO,oBAAoB,GACjCC,IAAU,KAAK,MAAM9B,IAAQ6B,CAAG,GAChCE,IAAU,KAAK,MAAM9B,IAAS4B,CAAG;AAEvC,GAAID,EAAO,UAAUE,KAAWF,EAAO,WAAWG,OAChDH,EAAO,QAAQE,GACfF,EAAO,SAASG,GAChBH,EAAO,MAAM,QAAQ,GAAG5B,CAAK,MAC7B4B,EAAO,MAAM,SAAS,GAAG3B,CAAM;AAGjC,QAAMN,IAAMiC,EAAO,WAAW,IAAI;AAClC,SAAAjC,EAAI,aAAakC,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GAC9BlC;AACT;AAEM,SAAUqC,GAAYrC,GAA+BiC,GAAyB;AAClF,QAAMC,IAAM,OAAO,oBAAoB;AACvC,EAAAlC,EAAI,UAAU,GAAG,GAAGiC,EAAO,QAAQC,GAAKD,EAAO,SAASC,CAAG;AAC7D;MAUaI,GAAe;AAAA,EAK1B,YAAYC,GAAyC;AAJ7C,WAAA,eAAA,MAAA,SAAA;AAAA;;;aAAoB,EAAE,MAAM,IAAO,OAAO,IAAO,SAAS,GAAA;AAAA,IAAK,CAAE,GACjE,OAAA,eAAA,MAAA,SAAA;AAAA;;;aAAuB;AAAA,IAAA,CAAI,GAC3B,OAAA,eAAA,MAAA,gBAAA;AAAA;;;;KAAyC,GAG/C,KAAK,eAAeA;AAAA,EACtB;AAAA,EAEA,UAAUC,GAAgB;AACxB,SAAK,MAAMA,CAAK,IAAI,IACpB,KAAK,SAAA;AAAA,EACP;AAAA,EAEA,eAAY;AACV,SAAK,MAAM,OAAO,IAClB,KAAK,MAAM,QAAQ,IACnB,KAAK,MAAM,UAAU,IACrB,KAAK,SAAA;AAAA,EACP;AAAA,EAEA,UAAO;AACL,IAAI,KAAK,UAAU,SACjB,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ;AAAA,EAEjB;AAAA,EAEQ,WAAQ;AACd,IAAI,KAAK,UAAU,SACnB,KAAK,QAAQ,sBAAsB,MAAK;AACtC,WAAK,QAAQ;AACb,YAAMC,IAAQ,EAAE,GAAG,KAAK,MAAA;AACxB,WAAK,MAAM,OAAO,IAClB,KAAK,MAAM,QAAQ,IACnB,KAAK,MAAM,UAAU,IACrB,KAAK,aAAaA,CAAK;AAAA,IACzB,CAAC;AAAA,EACH;AACD;MC1EYC,GAAS;AAAA,EACpB,KACE1C,GACAiB,GACAG,GACAhB,GACAuC,GACAC,GACAC,GAAiC;AAEjC,UAAM,EAAE,cAAAlH,GAAc,aAAAE,MAAgBoF,EAAK,qBAAA;AAG3C,aAAS/C,IAAIvC,GAAcuC,KAAKrC,GAAaqC,KAAK;AAChD,YAAM3C,IAAI0F,EAAK,cAAc/C,CAAC,GACxB4E,IAAQ1B,EAAOlD,CAAC;AACtB,UAAI,CAAC4E;AAAO;AAEZ,UAAIC;AACJ,YAAMC,IAAYJ,KAAA,gBAAAA,EAAWE;AAC7B,MAAIE,KAAA,QAAAA,EAAW,kBACbD,IAAUC,EAAU,kBAEpBD,IAAU7E,IAAI,MAAM,IAAI,YAAYkC,EAAM,KAAK,QAGjDJ,EAAI,YAAY+C,GAChB/C,EAAI,SAAS,GAAGzE,GAAG0F,EAAK,aAAaA,EAAK,UAAU,GAGpDjB,EAAI,eAAcgD,KAAA,gBAAAA,EAAW,sBAAqB5C,EAAM,KAAK,MAC7DJ,EAAI,YAAY,KAChBA,EAAI,UAAA,GACJA,EAAI,OAAO,GAAGzE,IAAI0F,EAAK,UAAU,GACjCjB,EAAI,OAAOiB,EAAK,aAAa1F,IAAI0F,EAAK,UAAU,GAChDjB,EAAI,OAAA;AAAA,IACN;AAGA,QAAI6C,KAAcA,EAAW,SAAS;AACpC,iBAAWI,KAAKJ,GAAY;AAC1B,cAAMK,IAAKjC,EAAK,QAAQgC,EAAE,KAAK,GACzBE,IAAKlC,EAAK,QAAQgC,EAAE,GAAG;AAC7B,YAAIE,IAAK,KAAKD,IAAKjC,EAAK;AAAa;AAErC,cAAM3F,IAAI,KAAK,IAAI,GAAG4H,CAAE,GAClBE,IAAI,KAAK,IAAInC,EAAK,aAAakC,CAAE,IAAI7H,GAErC+H,KAAUJ,EAAE,WAAW,MACvBK,IAAI,SAASL,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GACpCM,IAAI,SAASN,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GACpCpF,IAAI,SAASoF,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAC1C,QAAAjD,EAAI,YAAY,OAAO,KAAK,MAAMsD,IAAID,KAAU,OAAO,IAAIA,GAAQ,CAAC,IAAI,KAAK,MAAME,IAAIF,KAAU,OAAO,IAAIA,GAAQ,CAAC,IAAI,KAAK,MAAMxF,IAAIwF,KAAU,OAAO,IAAIA,GAAQ,CAAC,KACtKrD,EAAI,SAAS1E,GAAG,GAAG8H,GAAGnC,EAAK,YAAY;AAAA,MACzC;AAIF,UAAMuC,IAAevC,EAAK,kBACpBwC,IAAaxC,EAAK,gBAGlByC,IADQ,SADUD,IAAaD,KAEavC,EAAK;AAGvD,QAAI0C,IAAqC;AACzC,IAAID,IAAgB,IAAGC,IAAW,UACzBD,IAAgB,MAAGC,IAAW;AAGjB;AACpB,UAAI9E,IAAU+E,GAAMJ,CAAY,EAAE,QAAQ,KAAK;AAC/C,YAAM1G,IAAM8G,GAAMH,CAAU,EAAE,MAAM,KAAK;AAGzC,UAAII,IAA4B,MAC5BC,IAAe,GACfC,IAAc;AAClB,YAAMC,KAAoD,CAAA,GAEpDC,IAAa,CAACC,MAAgB;AAClC,QAAIL,MAAe,SACjB7D,EAAI,YAAY6D,GACZC,MAAiB,MAAG9D,EAAI,cAAc8D,IAC1C9D,EAAI,SAAS+D,GAAa,GAAGG,IAAOH,GAAa9C,EAAK,YAAY,GAC9D6C,MAAiB,MAAG9D,EAAI,cAAc,IAC1C6D,IAAa,MACbC,IAAe;AAAA,MAEnB;AAEA,aAAOjF,EAAQ,SAAS/B,CAAG,KAAG;AAC5B,cAAMxB,IAAI2F,EAAK,QAAQpC,EAAQ,SAAS,GAElCsF,IAAOtF,EAAQ,OAAA,GACfuF,IAASzB,KAAA,gBAAAA,EAAWwB;AAC1B,YAAI5D,KAAuB,MACvB8C,KAAU;AAEd,YAAIe,KAAA,QAAAA,EAAQ;AACV,UAAA7D,KAAQ6D,EAAO,iBACff,KAAUe,EAAO,WAAW;AAAA,aACvB;AACL,gBAAMC,KAAMxF,EAAQ,IAAA;AACpB,WAAIwF,OAAQ,KAAKA,OAAQ,OACvB9D,KAAQH,EAAM,KAAK;AAAA,QAEvB;AAGA,QAAIgE,KAAA,QAAAA,EAAQ,eACVJ,GAAkB,KAAK,EAAE,GAAA1I,GAAG,OAAO8I,EAAO,aAAa,GAIrD7D,OAAUsD,KAAcR,OAAYS,MAGtCG,EAAW3I,CAAC,GACRiF,OAAU,SACZsD,IAAatD,IACbuD,IAAeT,IACfU,IAAczI,KAIlBuD,IAAUA,EAAQ,IAAI,GAAG,KAAK;AAAA,MAChC;AAEA,MAAIgF,MAAe,QACjBI,EAAWhD,EAAK,QAAQpC,EAAQ,QAAA,CAAS,CAAC;AAI5C,iBAAWyF,KAAQN;AACjB,QAAAhE,EAAI,cAAcsE,EAAK,OACvBtE,EAAI,YAAY,KAChBA,EAAI,UAAA,GACJA,EAAI,OAAOsE,EAAK,GAAG,CAAC,GACpBtE,EAAI,OAAOsE,EAAK,GAAGrD,EAAK,YAAY,GACpCjB,EAAI,OAAA;AAAA,IAER;AAGA,QAAInB,IAAU+E,GAAMJ,CAAY,EAAE,QAAQG,CAAQ;AAClD,UAAM7G,IAAM8G,GAAMH,CAAU,EAAE,IAAI,GAAGE,CAAQ;AAK7C,SAHA3D,EAAI,cAAcI,EAAM,KAAK,MAC7BJ,EAAI,YAAY,KAChBA,EAAI,UAAA,GACGnB,EAAQ,SAAS/B,CAAG,KAAG;AAC5B,YAAMxB,IAAI2F,EAAK,QAAQpC,EAAQ,SAAS;AACxC,MAAAmB,EAAI,OAAO1E,GAAG,CAAC,GACf0E,EAAI,OAAO1E,GAAG2F,EAAK,YAAY,GAC/BpC,IAAUA,EAAQ,IAAI,GAAG8E,CAAQ;AAAA,IACnC;AAIA,QAHA3D,EAAI,OAAA,GAGA6C,KAAcA,EAAW,SAAS;AACpC,iBAAWI,KAAKJ,GAAY;AAC1B,cAAMK,IAAKjC,EAAK,QAAQgC,EAAE,KAAK,GACzBE,IAAKlC,EAAK,QAAQgC,EAAE,GAAG;AAC7B,YAAI,EAAAE,IAAK,KAAKD,IAAKjC,EAAK,iBAGxBjB,EAAI,cAAciD,EAAE,OACpBjD,EAAI,cAAc,KAClBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACAkD,KAAM,KAAKA,KAAMjC,EAAK,gBACxBjB,EAAI,OAAOkD,GAAI,CAAC,GAChBlD,EAAI,OAAOkD,GAAIjC,EAAK,YAAY,IAE9BkC,KAAM,KAAKA,KAAMlC,EAAK,gBACxBjB,EAAI,OAAOmD,GAAI,CAAC,GAChBnD,EAAI,OAAOmD,GAAIlC,EAAK,YAAY,IAElCjB,EAAI,OAAA,GACJA,EAAI,cAAc,GAGdiD,EAAE,QAAO;AACX,gBAAM3H,IAAI,KAAK,IAAI,GAAG4H,CAAE,GAClBE,IAAI,KAAK,IAAInC,EAAK,aAAakC,CAAE,IAAI7H;AAE3C,UAAA0E,EAAI,KAAA,GACJA,EAAI,OAAO;AACX,gBAAMW,KAAYX,EAAI,YAAYiD,EAAE,KAAK,EAAE,OACrCsB,IAAU,GACVC,IAAa7D,KAAY4D,IAAU,GACnCE,IAAc,IACdC,IAASpJ,KAAK8H,IAAIoB,KAAc,GAChCG,KAAS;AAEf,UAAA3E,EAAI,YAAYiD,EAAE,OAClBjD,EAAI,cAAc,KAClBA,EAAI,UAAA,GACJA,EAAI,UAAU0E,GAAQC,IAAQH,GAAYC,GAAa,CAAC,GACxDzE,EAAI,KAAA,GAEJA,EAAI,cAAc,GAClBA,EAAI,YAAY,WAChBA,EAAI,eAAe,UACnBA,EAAI,SAASiD,EAAE,OAAOyB,IAASH,GAASI,KAASF,IAAc,CAAC,GAChEzE,EAAI,QAAA;AAAA,QACN;AAAA,MACF;AAAA,EAEJ;AACD;ACrND,MAAM4E,KAAY;AAMZ,SAAUC,GACd7E,GACAC,GAAmB;AAEnB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,UAAU3E,GAAWC,GAAW6H,GAAWH,GAAW6B,IAAS,GAAC;AAC9D,MAAA9E,EAAI,UAAA,GACJA,EAAI,UAAU1E,GAAGC,GAAG6H,GAAGH,GAAG6B,CAAM,GAChC9E,EAAI,KAAA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,SAAS+E,GAAczJ,GAAWC,GAAWyJ,GAAiB;AAG5D,UAFAhF,EAAI,OAAO4E,IAEPI,MAAa,UAAahF,EAAI,YAAY+E,CAAI,EAAE,QAAQC,GAAU;AAEpE,YAAIC,IAAK,GACLC,IAAKH,EAAK;AACd,eAAOE,IAAKC,KAAI;AACd,gBAAMC,IAAM,KAAK,MAAMF,IAAKC,KAAM,CAAC,GAC7BE,IAAYL,EAAK,MAAM,GAAGI,CAAG,IAAI;AACvC,UAAInF,EAAI,YAAYoF,CAAS,EAAE,SAASJ,IACtCC,IAAKE,IAELD,IAAKC,IAAM;AAAA,QAEf;AACA,QAAAnF,EAAI,SAAS+E,EAAK,MAAM,GAAGE,CAAE,IAAI,OAAO3J,GAAGC,CAAC;AAAA,MAC9C;AACE,QAAAyE,EAAI,SAAS+E,GAAMzJ,GAAGC,CAAC;AAAA,IAE3B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,SAASD,GAAW8H,GAAWiC,GAAgBC,GAAc;AAC3D,YAAMC,IAAOvF,EAAI,qBAAqB1E,GAAG,GAAGA,IAAI8H,GAAG,CAAC;AACpD,aAAAmC,EAAK,aAAa,GAAGF,CAAM,GAC3BE,EAAK,aAAa,KAAKF,CAAM,GAC7BE,EAAK,aAAa,KAAKD,CAAM,GAC7BC,EAAK,aAAa,GAAGD,CAAM,GACpBC;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,QAAQhF,GAAeF,IAAQ,GAAC;AAC9B,MAAKJ,MACLD,EAAI,KAAA,GACJA,EAAI,YAAYO,GAChBP,EAAI,SAASC,EAAO,GAAGA,EAAO,GAAGI,GAAOJ,EAAO,MAAM,GACrDD,EAAI,QAAA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KAAKwF,GAAgDlK,GAAWC,GAAWkK,IAAO,IAAE;AAClF,MAAAzF,EAAI,KAAA;AACJ,YAAM0F,IAAOD,IAAO;AAEpB,UAAID,MAAS,SAAS;AAEpB,QAAAxF,EAAI,YAAY,WAChBA,EAAI,UAAA,GACJA,EAAI,IAAI1E,IAAIoK,GAAMnK,IAAImK,GAAMA,GAAM,GAAG,KAAK,KAAK,CAAC,GAChD1F,EAAI,KAAA,GAGJA,EAAI,cAAc,WAClBA,EAAI,YAAYyF,IAAO,MACvBzF,EAAI,UAAA;AACJ,cAAM2F,IAAKrK,IAAIoK,GACTE,IAAKrK,IAAImK;AACf,QAAA1F,EAAI,OAAO2F,IAAKD,IAAO,MAAME,CAAE,GAC/B5F,EAAI,OAAO2F,IAAKD,IAAO,KAAKE,IAAKF,IAAO,IAAI,GAC5C1F,EAAI,OAAO2F,IAAKD,IAAO,MAAME,IAAKF,IAAO,IAAI,GAC7C1F,EAAI,OAAA;AAAA,MACN,WAAWwF,MAAS,gBAAgBA,MAAS,iBAAiB;AAC5D,cAAMK,IAAYL,MAAS,eAAe,YAAY;AAGtD,QAAAxF,EAAI,YAAY6F,GAChB7F,EAAI,UAAA,GACJA,EAAI,OAAO1E,IAAIoK,GAAMnK,CAAC,GACtByE,EAAI,OAAO1E,IAAImK,GAAMlK,IAAIkK,CAAI,GAC7BzF,EAAI,OAAO1E,GAAGC,IAAIkK,CAAI,GACtBzF,EAAI,UAAA,GACJA,EAAI,KAAA,GAGJA,EAAI,YAAY;AAChB,cAAM8F,IAAQL,IAAO,MACfM,IAAQzK,IAAIoK,IAAOI,IAAQ;AACjC,QAAA9F,EAAI,SAAS+F,GAAOxK,IAAIkK,IAAO,MAAMK,GAAOL,IAAO,IAAI,GAGvDzF,EAAI,UAAA,GACJA,EAAI,IAAI1E,IAAIoK,GAAMnK,IAAIkK,IAAO,MAAMK,IAAQ,KAAK,GAAG,KAAK,KAAK,CAAC,GAC9D9F,EAAI,KAAA;AAAA,MACN;AAEA,MAAAA,EAAI,QAAA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM+E,GAAczJ,GAAWC,GAAWwH,GAAe;AACvD,MAAA/C,EAAI,KAAA,GAGJA,EAAI,OAAO4E;AAEX,YAAMjE,IADcX,EAAI,YAAY+E,CAAI,EACV,OACxBiB,IAAW,GAEXC,IAAa,KADF,IACkB,GAC7BC,IAAYvF,IAAYqF,IAAW,GACnClB,IAASmB,IAAa;AAG5B,MAAAjG,EAAI,YAAY+C,GAChB/C,EAAI,UAAA,GACJA,EAAI,UAAU1E,GAAGC,GAAG2K,GAAWD,GAAYnB,CAAM,GACjD9E,EAAI,KAAA,GAGJA,EAAI,YAAY,WAChBA,EAAI,YAAY,UAChBA,EAAI,eAAe,UACnBA,EAAI,SAAS+E,GAAMzJ,IAAI4K,IAAY,GAAG3K,IAAI0K,IAAa,CAAC,GAExDjG,EAAI,QAAA;AAAA,IACN;AAAA,EAAA;AAEJ;MCrJamG,GAAU;AAAA,EACrB,KACEnG,GACAiB,GACAG,GACAnF,GACAiF,GACAC,GACAiF,GACAC,GACAjG,GACAkG,GACAC,GACAC,GACAC,GACApJ,GAA2B;AAG3B,UAAMkH,KAAWtD,EAAK,iBAAiBA,EAAK,oBAAoB,KAC1DyF,IAAazF,EAAK,mBAAmBsD,GACrCoC,IAAW1F,EAAK,iBAAiBsD,GACjCqC,IAAe1F,EAAK,MAAMwF,GAAYC,CAAQ,GAE9CtF,wBAAoB,IAAA;AAC1B,aAASnD,IAAI,GAAGA,IAAIkD,EAAO,QAAQlD;AACjC,MAAAmD,EAAc,IAAID,EAAOlD,CAAC,EAAE,IAAIA,CAAC;AAGnC,UAAM2I,IAAc,IAAI,IAAIP,CAAQ,GAC9BQ,wBAAoB,IAAA,GAGpBC,IAAO,CAAC9F,EAAK,YACb+F,KAAO/F,EAAK,eAAeA,EAAK;AAEtC,eAAW5E,KAAQuK,GAAc;AAC/B,YAAMnF,IAAaJ,EAAc,IAAIhF,EAAK,KAAK;AAC/C,UAAIoF,MAAe;AAAW;AAE9B,YAAMC,IAAaP,EAAO,UAAU9E,EAAK,EAAE;AAC3C,UAAI,CAACqF;AAAY;AAGjB,YAAMnG,KADS0F,EAAK,cAAcQ,CAAU,IACzBC,EAAW,aAAaT,EAAK,cAAcA,EAAK,aAAaS,EAAW,cAAc,GAGnGpB,KAASoB,EAAW;AAC1B,UAAInG,KAAI+E,KAASyG,KAAQxL,KAAIyL;AAAM;AAEnC,YAAM1L,KAAI2F,EAAK,QAAQ5E,EAAK,UAAU,GAChCgE,KAAQY,EAAK,QAAQ5E,EAAK,QAAQ,IAAIf,IAEtC2E,KAAqB,EAAE,GAAA3E,IAAG,GAAAC,IAAG,OAAA8E,IAAO,QAAAC,GAAA;AAC1C,MAAAwG,EAAc,IAAIzK,EAAK,IAAI4D,EAAM;AAEjC,YAAMC,KAAmB;AAAA,QACvB,UAAU2G,EAAY,IAAIxK,EAAK,EAAE;AAAA,QACjC,SAASkK,MAAkBlK,EAAK;AAAA,QAChC,UAAU;AAAA,QACV,UAAUA,EAAK,aAAa;AAAA,MAAA;AAG9B,MAAA2D,EAAI,KAAA;AACJ,YAAMiH,KAAUpC,GAAkB7E,GAAKC,EAAM;AAC7C,UAAIiH;AACJ,MAAIT,MAAmBpJ,KAAA,QAAAA,EAAW,SAAShB,EAAK,OAC9C6K,KAAWT,IACFJ,MAAkBhK,EAAK,SAAS,wBAAwBA,EAAK,SAAS,wBAC/E6K,KAAWb,IAEXa,KAAWd,GAEbc,GAASlH,GAAK3D,GAAM4D,IAAQC,IAAO+G,EAAO,GAC1CjH,EAAI,QAAA;AAAA,IACN;AAEA,QAAIwG,KAAgBA,EAAa,SAAS,GAAG;AAE3C,YAAMW,wBAAiB,IAAA;AACvB,iBAAWC,KAAOZ;AAChB,QAAKM,EAAc,IAAIM,EAAI,UAAU,KAAGD,EAAW,IAAIC,EAAI,UAAU,GAChEN,EAAc,IAAIM,EAAI,QAAQ,KAAGD,EAAW,IAAIC,EAAI,QAAQ;AAEnE,UAAID,EAAW,OAAO,GAAG;AACvB,cAAME,wBAAc,IAAA;AACpB,mBAAWhL,KAAQJ;AACjB,UAAIkL,EAAW,IAAI9K,EAAK,EAAE,KAAGgL,EAAQ,IAAIhL,EAAK,IAAIA,CAAI;AAExD,mBAAW,CAACsC,GAAItC,CAAI,KAAKgL,GAAS;AAChC,gBAAM5F,KAAaJ,EAAc,IAAIhF,EAAK,KAAK;AAC/C,cAAIoF,OAAe;AAAW;AAC9B,gBAAMC,KAAaP,EAAO,UAAUxC,CAAE;AACtC,cAAI,CAAC+C;AAAY;AAEjB,gBAAMnG,KADS0F,EAAK,cAAcQ,EAAU,IACzBC,GAAW,aAAaT,EAAK,cAAcA,EAAK,aAAaS,GAAW,cAAc,GACnGpG,KAAI2F,EAAK,QAAQ5E,EAAK,UAAU,GAChCgE,KAAQY,EAAK,QAAQ5E,EAAK,QAAQ,IAAIf;AAC5C,UAAAwL,EAAc,IAAInI,GAAI,EAAE,GAAArD,IAAG,GAAAC,IAAG,OAAA8E,IAAO,QAAQqB,GAAW,YAAY;AAAA,QACtE;AAAA,MACF;AACA,WAAK,iBAAiB1B,GAAKwG,GAAcM,GAAeP,GAAenG,CAAK;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,iBACNJ,GACAwG,GACAc,GACAf,GACAnG,GAAoB;AAEpB,eAAWgH,KAAOZ,GAAc;AAC9B,YAAMe,IAAaD,EAAU,IAAIF,EAAI,UAAU,GACzCI,IAAWF,EAAU,IAAIF,EAAI,QAAQ;AAC3C,UAAI,CAACG,KAAc,CAACC;AAAU;AAE9B,YAAMC,IAAgBlB,MAAkBa,EAAI,cAAcb,MAAkBa,EAAI;AAEhF,MAAApH,EAAI,cAAcyH,IAAgBrH,EAAM,UAAWgH,EAAI,SAAS,WAChEpH,EAAI,YAAYyH,IAAgB,IAAI,KACpCzH,EAAI,YAAY,EAAE;AAElB,YAAM0H,IAASH,EAAW,IAAIA,EAAW,OACnCI,IAASJ,EAAW,IAAIA,EAAW,SAAS,GAC5CrD,IAAOsD,EAAS,GAChBI,IAAOJ,EAAS,IAAIA,EAAS,SAAS,GAEtCK,IAAK,KAAK,IAAI3D,IAAOwD,CAAM,GAC3BI,IAAW,KAAK,IAAID,IAAK,KAAK,EAAE;AAEtC,MAAA7H,EAAI,UAAA,GACJA,EAAI,OAAO0H,GAAQC,CAAM,GACzB3H,EAAI,cAAc0H,IAASI,GAAUH,GAAQzD,IAAO4D,GAAUF,GAAM1D,GAAM0D,CAAI,GAC9E5H,EAAI,OAAA;AAGJ,YAAM+H,IAAY;AAClB,MAAA/H,EAAI,YAAYA,EAAI,aACpBA,EAAI,UAAA,GACJA,EAAI,OAAOkE,GAAM0D,CAAI,GACrB5H,EAAI,OAAOkE,IAAO6D,GAAWH,IAAOG,IAAY,CAAC,GACjD/H,EAAI,OAAOkE,IAAO6D,GAAWH,IAAOG,IAAY,CAAC,GACjD/H,EAAI,UAAA,GACJA,EAAI,KAAA;AAAA,IACN;AAAA,EACF;AACD;MCtIYgI,GAAY;AAAA,EACvB,KACEhI,GACAiB,GACAb,GACA6H,GAA2B;AAE3B,UAAM,EAAE,SAAAC,GAAS,OAAAC,GAAO,SAAAC,GAAS,aAAAC,MAAgBJ;AAGjD,QAAIG;AACF,iBAAWE,KAAUF,GAAS;AAC5B,cAAM9M,IAAI2F,EAAK,QAAQqH,EAAO,IAAI;AAKlC,YAHAtI,EAAI,YAAYsI,EAAO,OACvBtI,EAAI,SAAS1E,IAAIgN,EAAO,QAAQ,GAAG,GAAGA,EAAO,OAAOrH,EAAK,YAAY,GAEjEqH,EAAO,OAAO;AAChB,UAAAtI,EAAI,KAAA,GACJA,EAAI,OAAO;AACX,gBAAMW,IAAYX,EAAI,YAAYsI,EAAO,KAAK,EAAE,OAC1C/D,IAAU,GACVgE,IAAgB,KAChB/D,IAAa,KAAK,IAAI7D,IAAY4D,IAAU,GAAGgE,CAAa,GAC5D9D,IAAc,IACdC,IAASpJ,IAAIkJ,IAAa,GAC1BG,IAAS;AAEf,UAAA3E,EAAI,YAAYsI,EAAO,OACvBtI,EAAI,UAAA,GACJA,EAAI,UAAU0E,GAAQC,GAAQH,GAAYC,GAAa,CAAC,GACxDzE,EAAI,KAAA,GAEJA,EAAI,YAAY,WAChBA,EAAI,eAAe;AACnB,gBAAMY,IAAe2H,IAAgBhE,IAAU,GACzC1D,IAAcF,IAAYC,IAC5B0H,EAAO,MAAM,MAAM,GAAG,KAAK,MAAMA,EAAO,MAAM,SAAS1H,IAAeD,CAAS,CAAC,IAAI,MACpF2H,EAAO;AACX,UAAAtI,EAAI,SAASa,GAAa6D,IAASH,GAASI,IAASF,IAAc,CAAC,GACpEzE,EAAI,QAAA;AAAA,QACN;AAAA,MACF;AA0BF,QAtBIkI,KAAY,SACdlI,EAAI,cAAcI,EAAM,OAAO,QAC/BJ,EAAI,YAAY,GAChBA,EAAI,UAAA,GACJA,EAAI,OAAOkI,GAAS,CAAC,GACrBlI,EAAI,OAAOkI,GAASjH,EAAK,YAAY,GACrCjB,EAAI,OAAA,IAIFmI,KAAU,SACZnI,EAAI,cAAcI,EAAM,SACxBJ,EAAI,YAAY,GAChBA,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAA,GACJA,EAAI,OAAOmI,GAAO,CAAC,GACnBnI,EAAI,OAAOmI,GAAOlH,EAAK,YAAY,GACnCjB,EAAI,OAAA,GACJA,EAAI,YAAY,EAAE,IAIhBqI,GAAa;AAEf,MAAIA,EAAY,gBAAgBA,EAAY,iBAAiB,WAC3DrI,EAAI,YAAY,4BAChBA,EAAI,SAAS,GAAGqI,EAAY,cAAcpH,EAAK,aAAaA,EAAK,UAAU,IAG7EjB,EAAI,KAAA,GACJA,EAAI,cAAc;AAClB,YAAMiH,IAAUpC,GAAkB7E,GAAKqI,EAAY,MAAM;AACzD,MAAAA,EAAY,SACVrI,GAAKqI,EAAY,MAAMA,EAAY,QACnC,EAAE,UAAU,IAAO,SAAS,IAAO,UAAU,IAAM,UAAU,GAAA,GAC7DpB,CAAO,GAETjH,EAAI,QAAA;AAAA,IACN;AAAA,EACF;AACD;AC5GD,MAAMwI,KAAY;AAOlB,SAASC,GAAeC,GAAa;AACnC,MAAIjJ,IAAQiJ,EAAE,UAAUA,EAAE;AAC1B,SAAIA,EAAE,cAAc,IAAGjJ,KAAS,KACvBiJ,EAAE,cAAc,MAAGjJ,KAAS,MAC9B,KAAK,IAAI,CAAC+I,IAAW,KAAK,IAAIA,IAAW/I,CAAK,CAAC;AACxD;MAEakJ,GAAW;AAAA,EAOtB,YACEC,GACAC,GACAC,GACAC,GACAC,GAAe;AAXT,WAAA,eAAA,MAAA,UAAA;AAAA;;;;KAAkD,GAClD,OAAA,eAAA,MAAA,oBAAA;AAAA;;;;KAAwB,GACxB,OAAA,eAAA,MAAA,kBAAA;AAAA;;;;KAAsB,GACtB,OAAA,eAAA,MAAA,WAAA;AAAA;;;;KAAe,GACf,OAAA,eAAA,MAAA,WAAA;AAAA;;;;KAAe,GASrB,KAAK,SAASJ,GACd,KAAK,mBAAmBC,GACxB,KAAK,iBAAiBC,GACtB,KAAK,UAAUC,GACf,KAAK,UAAUC;AAAA,EACjB;AAAA,EAEA,aAAanM,GAAeC,GAAW;AACrC,SAAK,mBAAmBD,GACxB,KAAK,iBAAiBC;AAAA,EACxB;AAAA,EAEA,gBAAgB,GAAemM,GAAmB;AAChD,UAAMxJ,IAAQgJ,GAAe,CAAC,GAExBS,IAAQ,EAAE,UAAU,KAAK,EAAE,UAAU,IAAI,GAGzCC,IAAQ1J,IAAQ,IAClB,IAAOyJ,IAAQzJ,IAAS,MACxB,KAAO,IAAOyJ,IAAQ,CAACzJ,IAAS,MAE9B2J,IAAkB,KAAK,iBAAiB,KAAK;AACnD,QAAIC,IAAc,KAAK,MAAMD,IAAkBD,CAAK;AACpD,IAAAE,IAAc,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI,KAAK,SAASA,CAAW,CAAC;AAExE,UAAM7J,IAAW,KAAK,MAAM,KAAK,oBAAoB4J,IAAkBC,KAAeJ,CAAW,GAC3FK,IAAS9J,IAAW6J;AAE1B,SAAK,OAAO7J,GAAU8J,CAAM;AAAA,EAC9B;AACD;ACzDD,MAAMC,KAAuB;MAgBhBC,GAAkB;AAAA,EAK7B,YAAYC,GAAgB;AAJpB,WAAA,eAAA,MAAA,SAAA;AAAA;;;aAAiC;AAAA,IAAA,CAAI,GACrC,OAAA,eAAA,MAAA,YAAA;AAAA;;;;KAAgB,GAChB,OAAA,eAAA,MAAA,aAAA;AAAA;;;aAAY;AAAA,IAAA,CAAK,GAGvB,KAAK,WAAWA;AAAA,EAClB;AAAA,EAEA,iBAAiBpN,GAAYqN,GAAuBpO,GAAWC,GAAS;AACtE,SAAK,QAAQ;AAAA,MACX,MAAAc;AAAA,MAAM,MAAAqN;AAAA,MAAM,QAAQpO;AAAA,MAAG,QAAQC;AAAA,MAAG,UAAUD;AAAA,MAAG,UAAUC;AAAA,MACzD,QAAQ;AAAA,MAAG,eAAec,EAAK;AAAA,MAAO,cAAcA,EAAK;AAAA,IAAA,GAE3D,KAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAOf,GAAWC,GAAS;AACzB,IAAK,KAAK,UACV,KAAK,MAAM,WAAWD,GACtB,KAAK,MAAM,WAAWC,GACtB,KAAK,MAAM,SAASD,IAAI,KAAK,MAAM,QAC/B,CAAC,KAAK,aAAa,KAAK,IAAI,KAAK,MAAM,MAAM,KAAKiO,OACpD,KAAK,YAAY;AAAA,EAErB;AAAA,EAEA,gBAAgB5L,GAAwB;AACtC,IAAI,KAAK,UAAO,KAAK,MAAM,eAAeA;AAAA,EAC5C;AAAA,EAEA,QAAQgM,GAAmB;AACzB,QAAI,CAAC,KAAK;AAAO,aAAO;AACxB,UAAMC,IAAU,KAAK,MAAM,SAASD,GAC9BE,IAAe,KAAK,MAAM,KAAK,aAAaD,GAC5CE,IAAU,KAAK,MAAMD,IAAe,KAAK,QAAQ,IAAI,KAAK,UAC1DE,IAAa,KAAK,MAAM;AAC9B,gBAAK,QAAQ,MACb,KAAK,YAAY,IACV,EAAE,cAAcD,GAAS,YAAAC,EAAA;AAAA,EAClC;AAAA,EAEA,UAAUJ,GAAmB;AAC3B,QAAI,CAAC,KAAK;AAAO,aAAO;AACxB,UAAMC,IAAU,KAAK,MAAM,SAASD,GAC9BjK,IAAO,KAAK,MAAM,SAAS,gBAAgB,SAAkB,SAE7DsK,KADWtK,MAAS,SAAS,KAAK,MAAM,KAAK,aAAa,KAAK,MAAM,KAAK,YACrDkK,GACrBE,IAAU,KAAK,MAAME,IAAU,KAAK,QAAQ,IAAI,KAAK;AAC3D,gBAAK,QAAQ,MACb,KAAK,YAAY,IACV,EAAE,SAASF,GAAS,MAAApK,EAAA;AAAA,EAC7B;AAAA,EAEA,SAAM;AACJ,SAAK,QAAQ,MACb,KAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAQ;AACN,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAO;;AACL,aAAOuK,IAAA,KAAK,UAAL,gBAAAA,EAAY,SAAQ;AAAA,EAC7B;AAAA,EAEA,WAAQ;AACN,WAAO,KAAK,UAAU,QAAQ,KAAK;AAAA,EACrC;AAAA,EAEA,YAAS;AACP,WAAO,KAAK,UAAU;AAAA,EACxB;AACD;SCnFeC,GACdjO,GACAkO,GACAC,GAAiC;AAEjC,QAAMC,IAAkB,CAAA;AACxB,aAAWhO,KAAQJ;AACjB,IAAII,EAAK,OAAO8N,MAChBE,EAAM,KAAKD,EAAQ/N,EAAK,UAAU,CAAC,GACnCgO,EAAM,KAAKD,EAAQ/N,EAAK,QAAQ,CAAC;AAEnC,SAAOgO;AACT;AAMM,SAAUC,GACdC,GACAC,GACAC,GACAC,GACAC,GAAiB;AAEjB,MAAIH,EAAe,WAAW;AAAG,WAAO;AAExC,MAAII,IAAWJ,EAAe,CAAC,GAC3BK,IAAc,KAAK,IAAIN,IAAWK,CAAQ;AAE9C,WAAS1M,IAAI,GAAGA,IAAIsM,EAAe,QAAQtM,KAAK;AAC9C,UAAM4M,IAAO,KAAK,IAAIP,IAAWC,EAAetM,CAAC,CAAC;AAClD,IAAI4M,IAAOD,MACTA,IAAcC,GACdF,IAAWJ,EAAetM,CAAC;AAAA,EAE/B;AAEA,SAAI2M,KAAeJ,IACVG,IAGF;AACT;;;;;;;ACpDA,GAAC,SAASlC,GAAEqC,GAAE;AAAsD,IAAAC,EAAA,UAAeD;EAAkI,GAAEE,IAAM,WAAU;AAAc,QAAIvC,IAAE;AAAM,WAAO,SAASqC,GAAE7M,GAAEgN,GAAE;AAAC,UAAI,IAAE,SAASH,GAAE;AAAC,eAAOA,EAAE,IAAI,IAAEA,EAAE,cAAarC,CAAC;AAAA,MAAC,GAAE5K,IAAEI,EAAE;AAAU,MAAAJ,EAAE,cAAY,WAAU;AAAC,eAAO,EAAE,IAAI,EAAE,KAAI;AAAA,MAAE,GAAEA,EAAE,UAAQ,SAASiN,GAAE;AAAC,YAAG,CAAC,KAAK,OAAM,EAAG,EAAEA,CAAC,EAAE,QAAO,KAAK,IAAI,KAAGA,IAAE,KAAK,QAAO,IAAIrC,CAAC;AAAE,YAAIxK,GAAEJ,GAAEqN,GAAEC,GAAE9H,IAAE,EAAE,IAAI,GAAE+H,KAAGnN,IAAE,KAAK,YAAW,GAAGJ,IAAE,KAAK,IAAGqN,KAAGrN,IAAEoN,EAAE,MAAIA,GAAC,EAAI,KAAKhN,CAAC,EAAE,QAAQ,MAAM,GAAEkN,IAAE,IAAED,EAAE,WAAU,GAAGA,EAAE,WAAU,IAAG,MAAIC,KAAG,IAAGD,EAAE,IAAIC,GAAE1C,CAAC;AAAG,eAAOpF,EAAE,KAAK+H,GAAE,MAAM,IAAE;AAAA,MAAC,GAAEvN,EAAE,aAAW,SAAS4K,GAAE;AAAC,eAAO,KAAK,OAAM,EAAG,EAAEA,CAAC,IAAE,KAAK,SAAO,IAAE,KAAK,IAAI,KAAK,IAAG,IAAG,IAAEA,IAAEA,IAAE,CAAC;AAAA,MAAC;AAAE,UAAIyC,IAAErN,EAAE;AAAQ,MAAAA,EAAE,UAAQ,SAAS4K,GAAEqC,GAAE;AAAC,YAAI7M,IAAE,KAAK,OAAM,GAAGgN,IAAE,CAAC,CAAChN,EAAE,EAAE6M,CAAC,KAAGA;AAAE,eAAkB7M,EAAE,EAAEwK,CAAC,MAAjB,YAAmBwC,IAAE,KAAK,KAAK,KAAK,UAAQ,KAAK,WAAU,IAAG,EAAE,EAAE,QAAQ,KAAK,IAAE,KAAK,KAAK,KAAK,KAAI,IAAG,KAAG,KAAK,eAAa,KAAG,CAAC,EAAE,MAAM,KAAK,IAAEC,EAAE,KAAK,IAAI,EAAEzC,GAAEqC,CAAC;AAAA,MAAC;AAAA,IAAC;AAAA,EAAC;;;mCCc79BO,KAAW;SAEDC,GAAQ,EACtB,QAAAnK,GAAQ,OAAAf,GAAO,YAAAnD,GAAY,WAAAsO,GAAW,cAAAC,GAAc,OAAArL,GAAO,eAAAiG,GAAe,UAAAqF,KAC7D;;AACb,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAiBD,EAAO,EAAK,GAC7BE,IAAc1K,EAAO,SAASlE,GAC9B6O,IAAgBN,GAEhB9P,IAAe,KAAK,IAAI,GAAG,KAAK,MAAM6P,IAAYtO,CAAU,IAAIoO,EAAQ,GACxEzP,IAAc,KAAK,IAAIuF,EAAO,SAAS,GAAG,KAAK,MAAMoK,IAAYC,KAAgBvO,CAAU,IAAIoO,EAAQ,GAEvGU,IAAeC,GAAY,CAACvD,MAAoC;AACpE,IAAImD,EAAe,WACnBH,EAAShD,EAAE,cAAc,SAAS;AAAA,EACpC,GAAG,CAACgD,CAAQ,CAAC;AAEb,EAAAQ,GAAU,MAAK;AACb,IAAIP,EAAa,YACfE,EAAe,UAAU,IACzBF,EAAa,QAAQ,YAAYH,GACjC,sBAAsB,MAAK;AAAG,MAAAK,EAAe,UAAU;AAAA,IAAM,CAAC;AAAA,EAElE,GAAG,CAACL,CAAS,CAAC;AAEd,QAAMW,IAAgB,CAAA;AACtB,WAASjO,IAAIvC,GAAcuC,KAAKrC,GAAaqC,KAAK;AAChD,UAAM4E,IAAQ1B,EAAOlD,CAAC;AACtB,IAAK4E,KACLqJ,EAAc,KACZC,GAAA,OAAA,EAEE,OAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAKlO,IAAIhB;AAAA,MACT,QAAQA;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc,eAAa+M,IAAA7J,EAAM,SAAN,gBAAA6J,EAAY,SAAQ,SAAS;AAAA,MACxD,WAAW;AAAA,IAAA,GACZ,UAEA5D,EAAcvD,CAAK,KAbfA,EAAM,EAAE,CAcT;AAAA,EAEV;AAEA,SACEsJ,GAAA,OAAA,EACE,KAAKT,GACL,UAAUK,GACV,OAAO;AAAA,IACL,OAAA3L;AAAA,IACA,QAAQ0L;AAAA,IACR,WAAWD,IAAcL,IAAe,SAAS;AAAA,IACjD,WAAW;AAAA,IACX,UAAU;AAAA,IACV,aAAa,aAAarL,EAAM,QAAQ,MAAM;AAAA,IAC9C,iBAAiBA,EAAM,QAAQ;AAAA,EAAA,GAChC,UAEDgM,YAAK,OAAO,EAAE,QAAQN,GAAa,UAAU,cAAY,UAAGK,EAAA,CAAa,GAAO;AAGtF;ACvEM,SAAUE,GAAYC;AAA4B,SAAO;AAAK;AACpED,GAAY,cAAc;AAEpB,SAAUE,GAAqBC,GAAuB;AAG1D,SAAO,EAAE,MADG,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAK,IAAI,KACzB,OAAOA,EAAM,SAAS,WAAW,OAAOA,EAAM,SAAS,GAAG,OAAOA,EAAM,MAAA;AAC7F;AAEM,SAAUC,GAAuBD,GAAuB;AAC5D,SAAOA,EAAM,YAAY;AAC3B;ACZM,SAAUE,GAAaJ;AAA6B,SAAO;AAAK;AACtEI,GAAa,cAAc;AAErB,SAAUC,GAAsBH,GAAwB;AAC5D,SAAO;AAAA,IACL,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM,SAAS;AAAA,IACtB,OAAOA,EAAM,SAAS;AAAA,IACtB,OAAOA,EAAM;AAAA,EAAA;AAEjB;ACeA5I,GAAM,OAAOgJ,EAAO;AAEpB,SAASC,GAAWC,GAAgC;AAClD,SAAKA,IACE;AAAA,IACL,GAAG7R;AAAA,IACH,GAAG6R;AAAA,IACH,QAAQ,EAAE,GAAG7R,GAAc,QAAQ,GAAG6R,EAAQ,OAAA;AAAA,IAC9C,MAAM,EAAE,GAAG7R,GAAc,MAAM,GAAG6R,EAAQ,KAAA;AAAA,IAC1C,MAAM,EAAE,GAAG7R,GAAc,MAAM,GAAG6R,EAAQ,KAAA;AAAA,IAC1C,QAAQ,EAAE,GAAG7R,GAAc,QAAQ,GAAG6R,EAAQ,OAAA;AAAA,IAC9C,SAAS,EAAE,GAAG7R,GAAc,SAAS,GAAG6R,EAAQ,QAAA;AAAA,IAChD,QAAQ,EAAE,GAAG7R,GAAc,QAAQ,GAAG6R,EAAQ,OAAA;AAAA,EAAM,IATjC7R;AAWvB;AAEA,MAAM8R,KAAqB,IAEdC,KAAiBC,GAAM,KAAKC,GAAmD,SAAwBV,GAAOW,GAAG;AAC5H,QAAM,EACJ,QAAA/L,GACA,OAAAnF,GACA,kBAAAmR,GACA,gBAAAC,GACA,cAAAC,GACA,YAAApQ,GACA,iBAAAC,GACA,YAAAC,GACA,SAAAmQ,GACA,gBAAAC,GACA,WAAAC,GACA,UAAAhE,GACA,SAAAV,GACA,SAAAC,GACA,OAAO0E,GACP,UAAA/K,GACA,UAAAC,GACA,gBAAA+K,GACA,cAAAvH,GACA,eAAAC,GACA,sBAAAuH,IACA,cAAApH,GACA,YAAA3D,GACA,aAAAgL,GACA,mBAAAC,GACA,mBAAAC,IACA,YAAAC,IACA,cAAAC,IACA,qBAAAC,IACA,aAAAC,IACA,qBAAAC,IACA,qBAAAC,IACA,cAAAC,IACA,QAAA1F,IACA,UAAU2F,KAAe,IACzB,mBAAAC,IACA,2BAAAC,IACA,SAAAC,IACA,UAAAC,IACA,UAAAjQ,GAAA,IACE8N,GAEEpM,KAAQwO,GAAQ,MAAM/B,GAAWa,CAAY,GAAG,CAACA,CAAY,CAAC,GAE9DmB,KAAgB5C,GAAY,CAACtO,GAA0BmR,MAAuB;AAClF,aAAS5Q,IAAI,GAAGA,IAAI4Q,EAAK,QAAQ5Q;AAC/B,UAAI4Q,EAAK5Q,CAAC,EAAE,OAAOP;AAAS,eAAOO;AAErC,WAAO;AAAA,EACT,GAAG,CAAA,CAAE,GAEC6Q,KAAcR,GAAa,KAAK,GAAG,GAEnCjI,KAAWsI,GAAQ,MAAML,IAAc,CAACQ,EAAW,CAAC,GAEpDC,KAAgBpD,EAA0B,IAAI,GAC9CqD,KAAiBrD,EAA0B,IAAI,GAC/CsD,KAAmBtD,EAA0B,IAAI,GACjDuD,KAAiBvD,EAAuB,IAAI,GAC5CwD,KAAWxD,EAAuB,IAAI,GACtCD,KAAeC,EAAuB,IAAI,GAE1C,CAACyD,IAAgBC,EAAiB,IAAIC,GAAS,GAAG;AAExD,EAAArD,GAAU,MAAK;AACb,UAAMsD,IAAYJ,GAAS;AAC3B,QAAI,CAACI;AAAW;AAChB,UAAMC,IAAM,IAAI,eAAe,CAACC,MAAW;AACzC,YAAMC,IAAQD,EAAQ,CAAC;AACvB,MAAIC,KACFL,GAAkBK,EAAM,YAAY,KAAK;AAAA,IAE7C,CAAC;AACD,WAAAF,EAAI,QAAQD,CAAS,GACd,MAAMC,EAAI,WAAA;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,QAAMG,KAAc,KAAK,IAAI,GAAGP,KAAiB/B,KAAgBkB,MAAqB,EAAE,GAClF/C,KAAerK,EAAO,SAASlE,GAG/B2S,IAAejE,EACnB,IAAI1Q,GAAU;AAAA,IACZ,kBAAkBsR,EAAM,oBAAoBY;AAAA,IAC5C,gBAAgBZ,EAAM,kBAAkBa;AAAA,IACxC,aAAAuC;AAAA,IACA,cAAAnE;AAAA,IACA,cAAA6B;AAAA,IACA,YAAApQ;AAAA,IACA,YAAYkE,EAAO;AAAA,IACnB,QAAQoL,EAAM,UAAU;AAAA,IACxB,WAAW;AAAA,EAAA,CACZ,CAAC,GAGEsD,KAAalE,EAAsB,IAAI,GACvCmE,KAAmBnE,EAA2B,MAAS,GAGvDoE,KAASpE,EAAgF,IAAI,GAC7FqE,KAAYrE,EAAO,EAAK,GACxBsE,KAAgB,GAGhB,CAACC,IAAiBC,EAAkB,IAAIb,GAAS/C,EAAM,oBAAoBY,CAAgB,GAC3F,CAACiD,IAAeC,EAAgB,IAAIf,GAAS/C,EAAM,kBAAkBa,CAAc,GACnF,CAACkD,IAAkBC,EAAmB,IAAIjB,GAAS,CAAC,GACpDkB,KAAiB7E,EAA6C,IAAI,GAElE8E,KAAkBzE,GAAY,MAAK;AACvC,UAAM0E,IAAKd,EAAa;AACxB,IAAAO,GAAmBO,EAAG,gBAAgB,GACtCL,GAAiBK,EAAG,cAAc,GAClCH,GAAoBG,EAAG,SAAS,GAChCF,GAAe,UAAU;AAAA,EAC3B,GAAG,CAAA,CAAE,GAECG,KAAqB3E,GAAY,MAAK;AAC1C,IAAIwE,GAAe,YAAY,SAC/BA,GAAe,UAAU,WAAWC,IAAiB3D,EAAkB;AAAA,EACzE,GAAG,CAAC2D,EAAe,CAAC;AAEpB,EAAAxE,GAAU,MACD,MAAK;AAAG,IAAIuE,GAAe,YAAY,QAAM,aAAaA,GAAe,OAAO;AAAA,EAAE,GACxF,CAAA,CAAE;AAGL,QAAMI,KAAkBjC,GAAQ,MAAK;AACnC,UAAMkC,IAAS,IAAIrS,GAAA;AACnB,WAAAqS,EAAO,QAAQ7U,CAAK,GACb6U;AAAA,EACT,GAAG,CAAC7U,CAAK,CAAC,GAEJ8U,KAAenC,GAAQ,MAAK;AAChC,UAAM1N,IAAO,IAAIlF,GAAA;AACjB,WAAAkF,EAAK,eACHjF,GACA,CAACiC,MAAM2S,GAAgB,iBAAiB3S,EAAE,EAAE,EAAE,OAC9C,CAACA,MAAM2S,GAAgB,iBAAiB3S,EAAE,EAAE,EAAE,GAAG,GAE5CgD;AAAA,EACT,GAAG,CAACjF,GAAO4U,EAAe,CAAC,GAErBG,KAAepC,GAAQ,MAAK;AAChC,UAAMkC,IAAS,IAAI7T,GAAaC,GAAYC,CAAe;AAC3D,WAAA2T,EAAO,cAAc7U,GAAOmB,GAAYyT,EAAe,GAChDC;AAAA,EACT,GAAG,CAAC7U,GAAOiB,GAAYC,GAAiBC,GAAYyT,EAAe,CAAC,GAE9DI,KAA0BrC,GAAQ,MAClCpC,EAAM,kBAAwBA,EAAM,kBACjC,CAACxM,GAA+B3D,GAAY4D,GAAoBC,GAAkB+G,MAAwB;AAC/G,IAAAlH,GAAuBC,GAAK3D,GAAM4D,GAAQC,GAAO+G,GAAS7G,EAAK;AAAA,EACjE,GACC,CAACoM,EAAM,iBAAiBpM,EAAK,CAAC,GAE3B8Q,KAAYtC,GAAQ,MAAM,IAAIlM,GAAA,GAAa,CAAA,CAAE,GAC7CyO,KAAavC,GAAQ,MAAM,IAAIzI,GAAA,GAAc,CAAA,CAAE,GAC/CiL,KAAexC,GAAQ,MAAM,IAAI5G,GAAA,GAAgB,CAAA,CAAE,GACnDqJ,IAAqBzC,GAAQ,MAAM,IAAIpF,GAAmBC,CAAQ,GAAG,CAACA,CAAQ,CAAC,GAG/E6H,KAAgB1C,GAAQ,MAAK;AACjC,UAAM2C,IAA0B,CAAA;AAChC,WAAAtE,GAAM,SAAS,QAAQvO,IAAU,CAACmB,MAAS;;AACzC,UAAI,CAACoN,GAAM,eAAepN,CAAK;AAAG;AAClC,YAAM2R,KAAevH,IAAApK,EAAM,SAAN,gBAAAoK,EAAyC;AAC9D,MAAIuH,MAAgB,gBAClBD,EAAQ,KAAKhF,GAAqB1M,EAAM,KAA2D,CAAC,IAC3F2R,MAAgB,kBACzBD,EAAQ,KAAK5E,GAAsB9M,EAAM,KAAyE,CAAC;AAAA,IAEvH,CAAC,GACM0R;AAAA,EACT,GAAG,CAAC7S,EAAQ,CAAC,GACP+S,KAAa7C,GAAQ,MAAM0C,GAAc,IAAI,CAAAI,MAAK,GAAGA,EAAE,IAAI,IAAIA,EAAE,KAAK,IAAIA,EAAE,KAAK,IAAIA,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,GAAG,GAAG,CAACJ,EAAa,CAAC,GAChIK,KAAa/F,EAAO0F,EAAa;AACvC,EAAAK,GAAW,UAAUL;AAGrB,QAAMM,KAAsBhD,GAAQ,MAAK;AACvC,QAAIiD,IAAW;AACf,WAAA5E,GAAM,SAAS,QAAQvO,IAAU,CAACmB,MAAS;;AACzC,UAAI,CAACoN,GAAM,eAAepN,CAAK;AAAG;AAElC,QADqBoK,IAAApK,EAAM,SAAN,gBAAAoK,EAAyC,iBAC1C,kBAClB4H,IAAWpF,GAAuB5M,EAAM,KAA8B;AAAA,IAE1E,CAAC,GACMgS;AAAA,EACT,GAAG,CAACnT,EAAQ,CAAC,GAGPoT,IAAWlG,EAAO;AAAA,IACtB,QAAAxK;AAAA,IAAQ,OAAAnF;AAAA,IAAO,cAAA8U;AAAA,IAAc,cAAAC;AAAA,IAAc,cAAA5K;AAAA,IAAc,eAAAC;AAAA,IACzD,OAAAjG;AAAA,IAAO,UAAAkG;AAAA,IAAU,cAAAE;AAAA,IAAc,YAAA3D;AAAA,IAAY,UAAAF;AAAA,IAAU,UAAAC;AAAA,IAAU,gBAAA+K;AAAA,IAC/D,aAAAiC;AAAA,IAAa,cAAAnE;AAAA,IAAc,YAAAvO;AAAA,IAAY,iBAAAC;AAAA,IACvC,cAAAmR;AAAA,IAAc,QAAA1F;AAAA,IAAQ,aAAAuF;AAAA,IAAa,aAAAN;AAAA,IAAa,mBAAAC;AAAA,IAChD,mBAAAC;AAAA,IAAmB,YAAAC;AAAA,IAAY,cAAAC;AAAA,IAAc,qBAAAG;AAAA,IAAqB,qBAAAC;AAAA,IAClE,SAAAd;AAAA,IAAS,WAAAE;AAAA,IAAW,gBAAAD;AAAA,IAAgB,UAAA/D;AAAA,IAAU,cAAA6D;AAAA,IAAc,qBAAAY;AAAA,IAC5D,iBAAiB+C;AAAA,IAAyB,iBAAAJ;AAAA,EAAA,CAC3C;AACD,EAAAiB,EAAS,UAAU;AAAA,IACjB,QAAA1Q;AAAA,IAAQ,OAAAnF;AAAA,IAAO,cAAA8U;AAAA,IAAc,cAAAC;AAAA,IAAc,cAAA5K;AAAA,IAAc,eAAAC;AAAA,IACzD,OAAAjG;AAAA,IAAO,UAAAkG;AAAA,IAAU,cAAAE;AAAA,IAAc,YAAA3D;AAAA,IAAY,UAAAF;AAAA,IAAU,UAAAC;AAAA,IAAU,gBAAA+K;AAAA,IAC/D,aAAAiC;AAAA,IAAa,cAAAnE;AAAA,IAAc,YAAAvO;AAAA,IAAY,iBAAAC;AAAA,IACvC,cAAAmR;AAAA,IAAc,QAAA1F;AAAA,IAAQ,aAAAuF;AAAA,IAAa,aAAAN;AAAA,IAAa,mBAAAC;AAAA,IAChD,mBAAAC;AAAA,IAAmB,YAAAC;AAAA,IAAY,cAAAC;AAAA,IAAc,qBAAAG;AAAA,IAAqB,qBAAAC;AAAA,IAClE,SAAAd;AAAA,IAAS,WAAAE;AAAA,IAAW,gBAAAD;AAAA,IAAgB,UAAA/D;AAAA,IAAU,cAAA6D;AAAA,IAAc,qBAAAY;AAAA,IAC5D,iBAAiB+C;AAAA,IAAyB,iBAAAJ;AAAA,EAAA;AAI5C,QAAMkB,KAAW9F,GAAY,MAAK;AAChC,UAAMhK,IAAS+M,GAAc;AAC7B,QAAI,CAAC/M;AAAQ;AACb,UAAM+P,IAAIF,EAAS,SACb9R,IAAMgC,GAAYC,GAAQ+P,EAAE,aAAaA,EAAE,YAAY;AAC7D,IAAA3P,GAAYrC,GAAKiC,CAAM,GACvBiP,GAAU,KAAKlR,GAAK6P,EAAa,SAASmC,EAAE,QAAQA,EAAE,OAAOA,EAAE,UAAUA,EAAE,UAAUA,EAAE,UAAU;AAAA,EACnG,GAAG,CAACd,EAAS,CAAC,GAERe,KAAYhG,GAAY,MAAK;AACjC,UAAMhK,IAASgN,GAAe;AAC9B,QAAI,CAAChN;AAAQ;AACb,UAAM+P,IAAIF,EAAS,SACb9R,IAAMgC,GAAYC,GAAQ+P,EAAE,aAAaA,EAAE,YAAY;AAC7D,IAAA3P,GAAYrC,GAAKiC,CAAM,GACvBkP,GAAW,KACTnR,GAAK6P,EAAa,SAASmC,EAAE,QAAQA,EAAE,OAAOA,EAAE,cAAcA,EAAE,cAChEA,EAAE,cAAcA,EAAE,eAAeA,EAAE,OAAOA,EAAE,UAAUjC,GAAiB,SAASiC,EAAE,cAClFA,EAAE,iBAAiBA,EAAE,eAAe;AAAA,EAExC,GAAG,CAACb,EAAU,CAAC,GAETe,KAAiBjG,GAAY,CAAC5P,GAAyB8V,GAAgBzI,MAAyB;AACpG,UAAMiH,IAAKd,EAAa,SAClBmC,IAAIF,EAAS,SACbnI,IAAcqI,EAAE,eAAerB,EAAG,iBAAiBA,EAAG,mBACtD/G,IAAUuI,IAASxI,GAGnByI,IAA0B,CAAA;AAChC,IAAI1I,MAAS,UACX0I,EAAc,KAAKzB,EAAG,QAAQtU,EAAK,aAAauN,CAAO,CAAC,GACxDwI,EAAc,KAAKzB,EAAG,QAAQtU,EAAK,WAAWuN,CAAO,CAAC,KAC7CF,MAAS,gBAClB0I,EAAc,KAAKzB,EAAG,QAAQtU,EAAK,aAAauN,CAAO,CAAC,IAExDwI,EAAc,KAAKzB,EAAG,QAAQtU,EAAK,WAAWuN,CAAO,CAAC;AAIxD,UAAMrF,KAAWoM,EAAG,iBAAiBA,EAAG,oBAAoB,KACtD/J,IAAeoL,EAAE,aAAa,MAAMrB,EAAG,mBAAmBpM,GAASoM,EAAG,iBAAiBpM,CAAO,GAC9F8N,IAAanI,GAAiBtD,GAAcvK,EAAK,IAAI,CAAC0O,OAAM4F,EAAG,QAAQ5F,EAAC,CAAC;AAG/E,eAAWuH,MAASF,GAAe;AACjC,YAAMjK,IAAQmC,GAAegI,IAAOD,GAAY,GAAG1I,GAAaqI,EAAE,QAAQ;AAC1E,UAAI7J,MAAU;AAAM,eAAOA;AAAA,IAC7B;AAGA,UAAMoK,IAAW7I,MAAS,iBACtBrN,EAAK,WAAWuN,IAChBvN,EAAK,aAAauN,GAChBE,IAAU,KAAK,MAAMyI,IAAWP,EAAE,QAAQ,IAAIA,EAAE;AACtD,WAAOrB,EAAG,QAAQ7G,CAAO;AAAA,EAC3B,GAAG,CAAA,CAAE,GAEC0I,KAAcvG,GAAY,MAAK;AACnC,UAAMhK,IAASiN,GAAiB;AAChC,QAAI,CAACjN;AAAQ;AACb,UAAM+P,IAAIF,EAAS,SACb9R,IAAMgC,GAAYC,GAAQ+P,EAAE,aAAaA,EAAE,YAAY;AAC7D,IAAA3P,GAAYrC,GAAKiC,CAAM;AAEvB,UAAM0O,IAAKd,EAAa,SAClB3P,IAAQmR,EAAmB,SAAA;AACjC,QAAIoB,IAAoB;AACxB,QAAIvS,GAAO;AACT,YAAMwS,IAAQ/B,EAAG,QAAQzQ,EAAM,KAAK,UAAU,GACxCyS,IAAYhC,EAAG,QAAQzQ,EAAM,KAAK,QAAQ,IAAIwS;AACpD,UAAIpX,GAAW+E;AACf,MAAIH,EAAM,SAAS,iBACjB5E,IAAIoX,IAAQxS,EAAM,QAClBG,IAAQsS,IAAYzS,EAAM,UACjBA,EAAM,SAAS,kBACxB5E,IAAIoX,GACJrS,IAAQsS,IAAYzS,EAAM,WAG1B5E,IAAIoX,IAAQxS,EAAM,QAClBG,IAAQsS;AAEV,YAAMlR,IAAaoN,GAAc3O,EAAM,cAAc8R,EAAE,MAAM,GACvDY,IAAejC,EAAG,cAAclP,CAAU,GAC1CoR,IAAe3S,EAAM,iBAAiBA,EAAM;AAClD,MAAAuS,IAAoB;AAAA,QAClB,MAAMvS,EAAM;AAAA,QACZ,MAAMA,EAAM;AAAA,QACZ,QAAQ,EAAE,GAAA5E,GAAG,GAAGsX,KAAgBZ,EAAE,aAAaA,EAAE,aAAaA,EAAE,mBAAmB,GAAG,OAAA3R,GAAO,QAAQ2R,EAAE,aAAaA,EAAE,gBAAA;AAAA,QACtH,UAAUA,EAAE;AAAA,QACZ,cAAAY;AAAA,QACA,cAAAC;AAAA,MAAA;AAAA,IAEJ;AAEA,IAAAzB,GAAa,KAAKpR,GAAK2Q,GAAIqB,EAAE,OAAO;AAAA,MAClC,SAASA,EAAE,iBAAiBlC,GAAW,UAAU;AAAA,MACjD,OAAO5P,IAAQgS,GAAehS,EAAM,MAAMA,EAAM,QAAQA,EAAM,IAAI,IAAI;AAAA,MACtE,SAASyR,GAAW;AAAA,MACpB,aAAac;AAAA,IAAA,CACd;AAAA,EACH,GAAG,CAACrB,IAAcC,GAAoBa,IAAgBrD,EAAa,CAAC,GAG9DiE,KAAelH,EAA+B,IAAI;AACxD,EAAKkH,GAAa,YAChBA,GAAa,UAAU,IAAIxQ,GAAgB,CAACG,MAAS;AACnD,IAAIA,EAAM,QAAMsP,GAAA,GACZtP,EAAM,SAAOwP,GAAA,GACbxP,EAAM,WAAS+P,GAAA;AAAA,EACrB,CAAC;AAEH,QAAMO,IAAYD,GAAa;AAE/B,EAAA5G,GAAU,MACD,MAAM6G,EAAU,QAAA,GACtB,CAACA,CAAS,CAAC,GAGd7G,GAAU,MAAK;AACb,QAAI,CAAC0F;AAAqB;AAC1B,UAAMoB,IAAQ,YAAY,MAAK;AAC7B,YAAMzB,IAA0B,CAAA;AAChC,MAAAtE,GAAM,SAAS,QAAQvO,IAAU,CAACmB,MAAS;;AACzC,YAAI,CAACoN,GAAM,eAAepN,CAAK;AAAG;AAClC,cAAM2R,KAAevH,IAAApK,EAAM,SAAN,gBAAAoK,EAAyC;AAC9D,QAAIuH,MAAgB,gBAClBD,EAAQ,KAAKhF,GAAqB1M,EAAM,KAA2D,CAAC,IAC3F2R,MAAgB,kBACzBD,EAAQ,KAAK5E,GAAsB9M,EAAM,KAAyE,CAAC;AAAA,MAEvH,CAAC,GACD8R,GAAW,UAAUJ,GACrBwB,EAAU,UAAU,SAAS;AAAA,IAC/B,GAAGnB,EAAmB;AACtB,WAAO,MAAM,cAAcoB,CAAK;AAAA,EAClC,GAAG,CAACpB,IAAqBlT,IAAUqU,CAAS,CAAC,GAG7C7G,GAAU,MAAK;AACb,IAAA2D,EAAa,QAAQ,OAAO,EAAE,aAAAD,IAAa,cAAAnE,IAAc,cAAA6B,GAAc,YAAApQ,GAAY,YAAYkE,EAAO,OAAA,CAAQ,GAC9G2R,EAAU,aAAA;AAAA,EACZ,GAAG,CAACnD,IAAanE,IAAc6B,GAAcpQ,GAAYkE,EAAO,QAAQ2R,CAAS,CAAC,GAElF7G,GAAU,MAAK;AACb,IAAA6G,EAAU,UAAU,MAAM,GAC1BA,EAAU,UAAU,OAAO;AAAA,EAC7B,GAAG,CAAC9W,GAAOmF,GAAQkF,IAAUlG,IAAOuC,GAAUC,GAAUmO,IAAcC,IAAc+B,CAAS,CAAC;AAE9F,QAAME,KAAgBrE,GACpB,MAAA;;AAAM,aAAA3E,IAAAuC,EAAM,eAAN,gBAAAvC,EAAkB,IAAI,CAAAhH,MAAK,GAAGA,EAAE,KAAK,IAAIA,EAAE,GAAG,IAAIA,EAAE,KAAK,IAAIA,EAAE,SAAS,EAAE,IAAIA,EAAE,WAAW,EAAE,IAAI,KAAK,SAAQ;AAAA,KACpH,CAACuJ,EAAM,UAAU,CAAC,GAGd0G,KAAoBtH,EAAOqH,EAAa;AAC9C,EAAA/G,GAAU,MAAK;AACb,IAAI+G,OAAkBC,GAAkB,YACtCA,GAAkB,UAAUD,IAC5BF,EAAU,UAAU,MAAM;AAAA,EAE9B,GAAG,CAACE,IAAeF,CAAS,CAAC;AAE7B,QAAMI,KAAiBvH,EAAO6F,EAAU;AACxC,EAAAvF,GAAU,MAAK;AACb,IAAIuF,OAAe0B,GAAe,YAChCA,GAAe,UAAU1B,IACzBsB,EAAU,UAAU,SAAS;AAAA,EAEjC,GAAG,CAACtB,IAAYsB,CAAS,CAAC;AAG1B,QAAMK,KAAsBxH,EAAOY,EAAM,gBAAgB,GACnD6G,KAAoBzH,EAAOY,EAAM,cAAc;AACrD,EAAIA,EAAM,qBAAqB,UAAaA,EAAM,qBAAqB4G,GAAoB,YACzFA,GAAoB,UAAU5G,EAAM,kBACpCqD,EAAa,QAAQ,OAAO,EAAE,kBAAkBrD,EAAM,kBAAkB,GACxEuG,EAAU,aAAA,IAERvG,EAAM,mBAAmB,UAAaA,EAAM,mBAAmB6G,GAAkB,YACnFA,GAAkB,UAAU7G,EAAM,gBAClCqD,EAAa,QAAQ,OAAO,EAAE,gBAAgBrD,EAAM,gBAAgB,GACpEuG,EAAU,aAAA;AAIZ,QAAMO,KAAmB1H,EAA6C,IAAI,GACpE2H,KAAoBtH,GAAY,CAACzG,MAA2B;AAChE,IAAI8N,GAAiB,YAAY,SACjCA,GAAiB,UAAU,WAAW,MAAK;;AACzC,MAAAA,GAAiB,UAAU;AAC3B,YAAM3C,IAAKd,EAAa,SAClBmC,IAAIF,EAAS;AACnB,MAAItM,MAAS,UACXyE,IAAA+H,EAAE,WAAF,QAAA/H,EAAA,KAAA+H,GAAWrB,EAAG,kBAAkBA,EAAG,mBAEnC6C,IAAAxB,EAAE,iBAAF,QAAAwB,EAAA,KAAAxB,GAAiBrB,EAAG,kBAAkBA,EAAG;AAAA,IAE7C,GAAG5D,EAAkB;AAAA,EACvB,GAAG,CAAA,CAAE;AAEL,EAAAb,GAAU,MACD,MAAK;AAAG,IAAIoH,GAAiB,YAAY,QAAM,aAAaA,GAAiB,OAAO;AAAA,EAAE,GAC5F,CAAA,CAAE;AAGL,QAAMG,KAAiB7H,EAA2B,IAAI,GAChD8H,KAAc9E,GAAQ,MACnB,IAAIjG,GACT,CAACnJ,GAAU8J,MAAU;;AACnB,IAAAuG,EAAa,QAAQ,OAAO,EAAE,kBAAkBrQ,GAAU,gBAAgB8J,GAAQ,IAClFW,IAAAwJ,GAAe,YAAf,QAAAxJ,EAAwB,aAAazK,GAAU8J,IAC/CyJ,EAAU,aAAA,GACVnC,GAAA,GACA2C,GAAkB,MAAM;AAAA,EAC1B,GACAnG,GACAC,GACAtE,GACAC,CAAO,GAGR,CAAA,CAAE;AACL,EAAAyK,GAAe,UAAUC;AAGzB,QAAMC,KAAuB1H,GAAY,CAAC2H,MAAkB;AAC1D,UAAMjD,IAAKd,EAAa,SAClB/D,IAAc6E,EAAG,aAAaA,EAAG,YACjCkD,IAAY,KAAK,IAAI,GAAG/H,IAAc6E,EAAG,YAAY,GACrDmD,IAAe,KAAK,IAAI,GAAG,KAAK,IAAID,GAAWlD,EAAG,YAAYiD,CAAM,CAAC;AAC3E,IAAIE,MAAiBnD,EAAG,cACxBA,EAAG,OAAO,EAAE,WAAWmD,EAAA,CAAc,GACrCf,EAAU,UAAU,MAAM,GAC1BA,EAAU,UAAU,OAAO,GAC3BA,EAAU,UAAU,SAAS,GAC7BvC,GAAoBsD,CAAY;AAAA,EAClC,GAAG,CAACf,CAAS,CAAC,GAERgB,KAAyB9H,GAAY,CAACkG,MAAkB;;AAC5D,UAAMxB,IAAKd,EAAa,SAClBlG,IAAcgH,EAAG,eAAeA,EAAG,iBAAiBA,EAAG,mBACvD/G,IAAUuI,IAASxI,GACnBnK,IAAWmR,EAAG,mBAAmB/G,GACjCN,IAASqH,EAAG,iBAAiB/G;AACnC,IAAA+G,EAAG,OAAO,EAAE,kBAAkBnR,GAAU,gBAAgB8J,GAAQ,IAChEW,IAAAwJ,GAAe,YAAf,QAAAxJ,EAAwB,aAAazK,GAAU8J,IAC/CyJ,EAAU,aAAA,GACViB,GAAU,MAAMtD,IAAiB,IACjCuD,KAAAT,IAAA1B,EAAS,SAAQ,iBAAjB,QAAAmC,EAAA,KAAAT,GAAgChU,GAAU8J;AAAA,EAC5C,GAAG,CAACyJ,GAAWrC,EAAe,CAAC;AAE/B,EAAAxE,GAAU,MAAK;AACb,UAAMgI,IAAK/E,GAAe;AAC1B,QAAI,CAAC+E;AAAI;AACT,UAAMC,IAAc,CAACzL,MAAiB;AACpC,UAAIA,EAAE,WAAWA,EAAE,WAAWA,EAAE,QAAQ;AACtC,QAAAA,EAAE,eAAA;AACF,cAAM0L,IAAOF,EAAG,sBAAA,GACVjL,KAAeP,EAAE,UAAU0L,EAAK,QAAQA,EAAK;AACnD,QAAAV,GAAY,gBAAgBhL,GAAGO,CAAW;AAAA,MAC5C,WAAWP,EAAE;AACX,QAAAA,EAAE,eAAA,GACFqL,GAAuBrL,EAAE,MAAM;AAAA,WAC1B;AACL,cAAMyJ,IAASzJ,EAAE;AACjB,QAAIyJ,MAAW,KAAK,KAAK,IAAIA,CAAM,IAAI,KAAK,IAAIzJ,EAAE,MAAM,KACtDA,EAAE,eAAA,GACFqL,GAAuB5B,CAAM,KACpBzJ,EAAE,WAAW,KACtBiL,GAAqBjL,EAAE,MAAM;AAAA,MAEjC;AAAA,IACF;AACA,WAAAwL,EAAG,iBAAiB,SAASC,GAAa,EAAE,SAAS,IAAO,GACrD,MAAMD,EAAG,oBAAoB,SAASC,CAAW;AAAA,EAC1D,GAAG,CAACT,IAAaC,IAAsBI,EAAsB,CAAC;AAG9D,QAAMM,KAAWzI,EAAmE,EAAE,cAAc,MAAM,YAAY,MAAM;AAE5H,EAAAM,GAAU,MAAK;AACb,UAAMgI,IAAK/E,GAAe;AAC1B,QAAI,CAAC+E;AAAI;AAET,UAAMI,IAAc,CAACC,GAAWC,MAAc,KAAK,IAAID,EAAG,UAAUC,EAAG,OAAO,GACxEC,IAAY,CAACF,GAAWC,GAAWJ,OAAoBG,EAAG,UAAUC,EAAG,WAAW,IAAKJ,EAAK,MAE5FM,IAAmB,CAAChM,MAAiB;AACzC,MAAIA,EAAE,QAAQ,WAAW,MACvBA,EAAE,eAAA,GACF2L,GAAS,QAAQ,eAAeC,EAAY5L,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,CAAC,GACtE2L,GAAS,QAAQ,aAAa;AAAA,IAElC,GAEMM,IAAkB,CAACjM,MAAiB;;AACxC,UAAIA,EAAE,QAAQ,WAAW,KAAK2L,GAAS,QAAQ,iBAAiB,MAAM;AACpE,QAAA3L,EAAE,eAAA;AACF,cAAMkM,IAAcN,EAAY5L,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,CAAC,GACpD0L,IAAOF,EAAG,sBAAA,GAEVjL,IADSwL,EAAU/L,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,GAAG0L,CAAI,IAC5BA,EAAK;AAElC,YAAIQ,MAAgB,KAAKP,GAAS,QAAQ,iBAAiB,GAAG;AAC5D,gBAAMlL,IAAQkL,GAAS,QAAQ,eAAeO,GACxCjE,KAAKd,EAAa,SAClBzG,IAAkBuH,GAAG,iBAAiBA,GAAG;AAC/C,cAAItH,IAAcD,IAAkBD;AACpC,UAAAE,IAAc,KAAK,IAAIN,GAAS,KAAK,IAAIC,GAASK,CAAW,CAAC;AAE9D,gBAAMwL,IAAalE,GAAG,mBAAmBvH,IAAkBH,GACrDzJ,IAAWqV,IAAaxL,IAAcJ,GACtCK,IAASuL,IAAaxL,KAAe,IAAIJ;AAE/C,UAAA0H,GAAG,OAAO,EAAE,kBAAkBnR,GAAU,gBAAgB8J,GAAQ,IAChEW,IAAAwJ,GAAe,YAAf,QAAAxJ,EAAwB,aAAazK,GAAU8J,IAC/CyJ,EAAU,aAAA,GACVnC,GAAA,GACA2C,GAAkB,MAAM;AAAA,QAC1B;AACA,QAAAc,GAAS,QAAQ,eAAeO;AAAA,MAClC;AAAA,IACF,GAEME,IAAiB,MAAK;AAC1B,MAAAT,GAAS,QAAQ,eAAe,MAChCA,GAAS,QAAQ,aAAa;AAAA,IAChC;AAEA,WAAAH,EAAG,iBAAiB,cAAcQ,GAAkB,EAAE,SAAS,IAAO,GACtER,EAAG,iBAAiB,aAAaS,GAAiB,EAAE,SAAS,IAAO,GACpET,EAAG,iBAAiB,YAAYY,CAAc,GACvC,MAAK;AACV,MAAAZ,EAAG,oBAAoB,cAAcQ,CAAgB,GACrDR,EAAG,oBAAoB,aAAaS,CAAe,GACnDT,EAAG,oBAAoB,YAAYY,CAAc;AAAA,IACnD;AAAA,EACF,GAAG,CAAC/B,GAAWnC,IAAoB2C,EAAiB,CAAC;AAGrD,QAAMwB,KAAoB9I,GAAY,CAACvD,MAAyB;;AAC9D,UAAMwL,IAAKxL,EAAE,eACP0L,IAAOF,EAAG,sBAAA,GACV5Y,IAAIoN,EAAE,UAAU0L,EAAK,MACrB7Y,IAAImN,EAAE,UAAU0L,EAAK;AAI3B,QAHAtE,GAAW,UAAUxU,GAGjB0U,GAAO,SAAS;AAClB,YAAMnI,IAAKa,EAAE,UAAUsH,GAAO,QAAQ,QAChCgF,IAAKtM,EAAE,UAAUsH,GAAO,QAAQ;AAMtC,UALI,CAACC,GAAU,YAAY,KAAK,IAAIpI,CAAE,KAAKqI,MAAiB,KAAK,IAAI8E,CAAE,KAAK9E,QAC1ED,GAAU,UAAU,IACpBiE,EAAG,MAAM,SAAS,YAClBA,EAAG,kBAAkBxL,EAAE,SAAS,IAE9BuH,GAAU,SAAS;AACrB,cAAMgF,IAAavM,EAAE,UAAUsH,GAAO,QAAQ,OACxCkF,IAAaxM,EAAE,UAAUsH,GAAO,QAAQ;AAC9C,QAAAA,GAAO,QAAQ,QAAQtH,EAAE,SACzBsH,GAAO,QAAQ,QAAQtH,EAAE,SACrB,KAAK,IAAIuM,CAAU,IAAI,KAAGlB,GAAuB,CAACkB,CAAU,GAC5D,KAAK,IAAIC,CAAU,IAAI,KAAGvB,GAAqB,CAACuB,CAAU;AAAA,MAChE;AACA;AAAA,IACF;AAEA,QAAI7D,EAAmB,aAAa;AAElC,UADAA,EAAmB,OAAO/V,GAAGC,CAAC,GAC1B8V,EAAmB,YAAY;AACjC,cAAMnR,IAAQmR,EAAmB,SAAA;AACjC,YAAInR,KAASA,EAAM,SAAS,UAAU4R,EAAS,QAAQ,gBAAgB;AACrE,gBAAMhP,IAAQnB,GAAapG,GAAGsU,EAAa,SAASiC,EAAS,QAAQ,MAAM;AAC3E,UAAIhP,KAAOuO,EAAmB,gBAAgBvO,EAAM,EAAE;AAAA,QACxD;AACA,QAAAiQ,EAAU,UAAU,SAAS;AAAA,MAC/B;AACA;AAAA,IACF;AAEA,IAAIjB,EAAS,QAAQ,kBAAgBiB,EAAU,UAAU,SAAS;AAElE,UAAMf,IAAIF,EAAS,SACbzV,IAAOyE,GAAQxF,GAAGC,GAAGsU,EAAa,SAASmC,EAAE,cAAcA,EAAE,cAAcA,EAAE,MAAM,GACnFmD,IAAe9Y,KAAA,gBAAAA,EAAM;AAQ3B,QAPI8Y,MAAiBpF,GAAiB,YACpCA,GAAiB,UAAUoF,GAC3BpC,EAAU,UAAU,OAAO,IAC3B9I,IAAA+H,EAAE,gBAAF,QAAA/H,EAAA,KAAA+H,GAAgBmD,KAAgB,MAAMzM,EAAE,eAItCrM,GAAM;AACR,YAAMqD,IAAOkC,GAAWtG,GAAGe,GAAMwT,EAAa,OAAO,GAC/CuF,IAAKpD,EAAE;AACb,MAAItS,MAAS,WAAW0V,MAAO,UAAUA,MAAO,WAErC1V,MAAS,YAAY0V,MAAO,WAAWA,MAAO,UADvDlB,EAAG,MAAM,SAAS,eAGTlC,EAAE,UACXkC,EAAG,MAAM,SAAS,SAElBA,EAAG,MAAM,SAAS;AAAA,IAEtB;AACE,MAAAA,EAAG,MAAM,SAAS;AAAA,EAEtB,GAAG,CAAC7C,GAAoB0B,GAAWgB,IAAwBJ,EAAoB,CAAC,GAE1E0B,KAAoBpJ,GAAY,CAACvD,MAAyB;AAC9D,UAAMsJ,IAAIF,EAAS,SACbsC,IAAQ1L,EAAE,cAA8B,sBAAA,GACxCpN,IAAIoN,EAAE,UAAU0L,EAAK,MACrB7Y,IAAImN,EAAE,UAAU0L,EAAK,KACrB/X,IAAOyE,GAAQxF,GAAGC,GAAGsU,EAAa,SAASmC,EAAE,cAAcA,EAAE,cAAcA,EAAE,MAAM;AAEzF,QAAI,CAAC3V,GAAM;AAET,MAAA2T,GAAO,UAAU,EAAE,QAAQtH,EAAE,SAAS,QAAQA,EAAE,SAAS,OAAOA,EAAE,SAAS,OAAOA,EAAE,QAAA,GACpFuH,GAAU,UAAU;AACpB;AAAA,IACF;AAEA,UAAMvQ,IAAOkC,GAAWtG,GAAGe,GAAMwT,EAAa,OAAO,GAC/CuF,IAAKpD,EAAE;AAEb,IAAItS,MAAS,WAAW0V,MAAO,UAAUA,MAAO,UAC9C/D,EAAmB,iBAAiBhV,GAAM,eAAef,GAAGC,CAAC,IACpDmE,MAAS,YAAY0V,MAAO,WAAWA,MAAO,UACvD/D,EAAmB,iBAAiBhV,GAAM,gBAAgBf,GAAGC,CAAC,IACrDyW,EAAE,WACXX,EAAmB,iBAAiBhV,GAAM,QAAQf,GAAGC,CAAC;AAAA,EAE1D,GAAG,CAAC8V,CAAkB,CAAC,GAEjBiE,KAAkBrJ,GAAY,CAACvD,MAAyB;;AAC5D,UAAMwL,IAAKxL,EAAE;AAGb,QAAIsH,GAAO,SAAS;AAClB,YAAMuF,IAAatF,GAAU;AAI7B,UAHAD,GAAO,UAAU,MACjBC,GAAU,UAAU,IACpBiE,EAAG,MAAM,SAAS,WACdqB;AAAY;AAAA,IAClB;AAEA,QAAIlE,EAAmB,YAAY;AACjC,YAAMnR,IAAQmR,EAAmB,SAAA,GAC3BV,KAAKd,EAAa,SAClBlG,IAAcgH,GAAG,eAAeA,GAAG,iBAAiBA,GAAG;AAC7D,UAAIzQ,GAAO;AACT,cAAMsV,IAAY1D,EAAS,QAAQ;AACnC,YAAI5R,EAAM,SAAS,QAAQ;AACzB,gBAAMjB,IAASoS,EAAmB,QAAQ1H,CAAW;AACrD,cAAI1K,GAAQ;AAEV,kBAAM0R,IAAKd,EAAa,SAClBmC,IAAIF,EAAS,SACblI,KAAU1J,EAAM,SAASyJ,GACzB8L,KAAgB9E,EAAG,QAAQzQ,EAAM,KAAK,aAAa0J,EAAO,GAC1D8L,IAAc/E,EAAG,QAAQzQ,EAAM,KAAK,WAAW0J,EAAO,GACtDrF,KAAWoM,EAAG,iBAAiBA,EAAG,oBAAoB,KACtD/J,KAAeoL,EAAE,aAAa,MAAMrB,EAAG,mBAAmBpM,GAASoM,EAAG,iBAAiBpM,CAAO,GAC9F8N,IAAanI,GAAiBtD,IAAc1G,EAAM,KAAK,IAAI,CAAC6K,OAAc4F,EAAG,QAAQ5F,EAAC,CAAC;AAE7F,gBAAI4K,KAAmB1W,EAAO;AAE9B,kBAAM2W,IAAYtL,GAAemL,IAAepD,GAAY,GAAG1I,GAAaqI,EAAE,QAAQ;AACtF,gBAAI4D,MAAc;AAChB,cAAAD,KAAmBhF,EAAG,QAAQiF,CAAS;AAAA,iBAClC;AAEL,oBAAMC,KAAUvL,GAAeoL,GAAarD,GAAY,GAAG1I,GAAaqI,EAAE,QAAQ;AAClF,kBAAI6D,OAAY,MAAM;AACpB,sBAAMC,KAAW5V,EAAM,KAAK,WAAWA,EAAM,KAAK;AAClD,gBAAAyV,KAAmBhF,EAAG,QAAQkF,EAAO,IAAIC;AAAA,cAC3C;AAAA,YACF;AAEA,kBAAMC,KAAgBP,IAAYA,EAAU,QAAQtV,EAAM,KAAK,IAAIyV,EAAgB,IAAIA,IACjFK,KAAalE,EAAS,QAAQ,gBAAgB,aAAa5R,EAAM,KAAK,IAAI6V,EAAa;AAC7F,aAAAvC,KAAAvJ,IAAA6H,EAAS,SAAQ,eAAjB,QAAA0B,EAAA,KAAAvJ,GAA8B/J,EAAM,KAAK,IAAI6V,IAAe9W,EAAO,YAAY+W,GAAW,SAAS,IAAIA,KAAa;AAAA,UACtH;AAAA,QACF,OAAO;AACL,gBAAM/W,IAASoS,EAAmB,UAAU1H,CAAW;AACvD,cAAI1K,GAAQ;AACV,kBAAM0R,IAAKd,EAAa,SAClBmC,IAAIF,EAAS,SACblI,KAAU1J,EAAM,SAASyJ,GACzB4I,KAAWtT,EAAO,SAAS,SAASiB,EAAM,KAAK,aAAa0J,KAAU1J,EAAM,KAAK,WAAW0J,IAC5F0I,IAAQ3B,EAAG,QAAQ4B,EAAQ,GAC3BhO,KAAWoM,EAAG,iBAAiBA,EAAG,oBAAoB,KACtD/J,KAAeoL,EAAE,aAAa,MAAMrB,EAAG,mBAAmBpM,GAASoM,EAAG,iBAAiBpM,CAAO,GAC9F8N,IAAanI,GAAiBtD,IAAc1G,EAAM,KAAK,IAAI,CAAC6K,OAAc4F,EAAG,QAAQ5F,EAAC,CAAC,GAEvFkL,KAAO3L,GAAegI,GAAOD,GAAY,GAAG1I,GAAaqI,EAAE,QAAQ;AACzE,gBAAIkE,IAAkBD,OAAS,OAAOtF,EAAG,QAAQsF,EAAI,IAAIhX,EAAO;AAEhE,kBAAMkX,KAAarE,EAAS,QAAQ,gBAAgB,oBAAoB5R,EAAM,KAAK,IAAIjB,EAAO,IAAI;AAClG,YAAIA,EAAO,SAAS,UAAUiX,IAAkBC,GAAW,MACzDD,IAAkBC,GAAW,MACpBlX,EAAO,SAAS,WAAWiX,IAAkBC,GAAW,QACjED,IAAkBC,GAAW;AAG/B,kBAAMJ,KAAgBP,IAAYA,EAAU,UAAUtV,EAAM,KAAK,IAAIgW,GAAiBjX,EAAO,IAAI,IAAIiX;AACrG,aAAAE,KAAAnC,IAAAnC,EAAS,SAAQ,iBAAjB,QAAAsE,EAAA,KAAAnC,GAAgC/T,EAAM,KAAK,IAAI6V,IAAe9W,EAAO;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AACA,MAAAiV,EAAG,MAAM,SAAS,WAClBnB,EAAU,UAAU,SAAS;AAC7B;AAAA,IACF;AACA,IAAI1B,EAAmB,UAAA,KAAaA,EAAmB,OAAA;AACvD,UAAM+C,IAAOF,EAAG,sBAAA,GACV5Y,IAAIoN,EAAE,UAAU0L,EAAK,MACrB7Y,IAAImN,EAAE,UAAU0L,EAAK,KACrB/X,IAAOyE,GAAQxF,GAAGC,GAAGsU,EAAa,SAASiC,EAAS,QAAQ,cAAcA,EAAS,QAAQ,cAAcA,EAAS,QAAQ,MAAM;AACtI,IAAIzV,OAAMga,KAAAC,IAAAxE,EAAS,SAAQ,gBAAjB,QAAAuE,EAAA,KAAAC,GAA+Bja,EAAK,IAAIqM,EAAE;AAAA,EACtD,GAAG,CAAC2I,GAAoB0B,CAAS,CAAC,GAE5BwD,KAAoBtK,GAAY,CAACvD,MAAuB;;AAC5D,UAAM0L,IAAQ1L,EAAE,cAA8B,sBAAA,GACxCpN,IAAIoN,EAAE,UAAU0L,EAAK,MACrB7Y,IAAImN,EAAE,UAAU0L,EAAK,KACrBpC,IAAIF,EAAS,SACbzV,IAAOyE,GAAQxF,GAAGC,GAAGsU,EAAa,SAASmC,EAAE,cAAcA,EAAE,cAAcA,EAAE,MAAM;AACzF,QAAI3V;AACF,OAAA4N,IAAA+H,EAAE,sBAAF,QAAA/H,EAAA,KAAA+H,GAAsB3V,EAAK,IAAIqM,EAAE;AAAA,SAC5B;AACL,YAAM5F,IAAQnB,GAAapG,GAAGsU,EAAa,SAASmC,EAAE,MAAM,GACtD3W,IAAOwU,EAAa,QAAQ,QAAQvU,CAAC;AAC3C,MAAIwH,OAAO0Q,IAAAxB,EAAE,wBAAF,QAAAwB,EAAA,KAAAxB,GAAwBlP,EAAM,IAAczH;AAAA,IACzD;AAAA,EACF,GAAG,CAAA,CAAE,GAECmb,KAAoBvK,GAAY,CAACvD,MAAuB;;AAC5D,IAAAA,EAAE,eAAA;AACF,UAAM0L,IAAQ1L,EAAE,cAA8B,sBAAA,GACxCpN,IAAIoN,EAAE,UAAU0L,EAAK,MACrB7Y,IAAImN,EAAE,UAAU0L,EAAK,KACrBpC,IAAIF,EAAS,SACbzV,IAAOyE,GAAQxF,GAAGC,GAAGsU,EAAa,SAASmC,EAAE,cAAcA,EAAE,cAAcA,EAAE,MAAM;AACzF,QAAI3V;AACF,OAAA4N,IAAA+H,EAAE,sBAAF,QAAA/H,EAAA,KAAA+H,GAAsB3V,EAAK,IAAIqM,EAAE;AAAA,SAC5B;AACL,YAAM5F,IAAQnB,GAAapG,GAAGsU,EAAa,SAASmC,EAAE,MAAM,GACtD3W,IAAOwU,EAAa,QAAQ,QAAQvU,CAAC;AAC3C,MAAIwH,OAAO0Q,IAAAxB,EAAE,wBAAF,QAAAwB,EAAA,KAAAxB,GAAwBlP,EAAM,IAAczH,GAAMqN,EAAE;AAAA,IACjE;AAAA,EACF,GAAG,CAAA,CAAE,GAEC+N,KAAqBxK,GAAY,MAAK;;AAC1C,IAAA+D,GAAO,UAAU,MACjBC,GAAU,UAAU,IACpBH,GAAW,UAAU,MACjBX,GAAe,YAASA,GAAe,QAAQ,MAAM,SAAS,YAC9DY,GAAiB,YAAY,WAC/BA,GAAiB,UAAU,QAC3BgD,EAAU,UAAU,OAAO,IAC3BS,KAAAvJ,IAAA6H,EAAS,SAAQ,gBAAjB,QAAA0B,EAAA,KAAAvJ,GAA+B,MAAM,IAAI,aAAa,cAAc,KAElE6H,EAAS,QAAQ,kBAAgBiB,EAAU,UAAU,SAAS;AAAA,EACpE,GAAG,CAACA,CAAS,CAAC,GAGR2D,KAAiB9H,GAAQ,MAAK;AAClC,UAAM+H,IAA6B,CAAA;AACnC,WAAA1J,GAAM,SAAS,QAAQvO,IAAU,CAACmB,MAAS;;AACzC,UAAI,CAACoN,GAAM,eAAepN,CAAK;AAAG;AAElC,YADqBoK,IAAApK,EAAM,SAAN,gBAAAoK,EAAyC,iBAC1C,mBAAmB;AACrC,cAAM2M,IAAa/W,EAAM;AACzB,QAAA8W,EAAQ,KACN1J,GAAM,aAAapN,GAAsD;AAAA,UACvE,kBAAkB+W,EAAW,oBAAoBzG;AAAA,UACjD,gBAAgByG,EAAW,kBAAkBvG;AAAA,UAC7C,aAAauG,EAAW,eAAehH;AAAA,UACvC,cAAcgH,EAAW,gBAAgBtJ;AAAA,UACzC,OAAOsJ,EAAW,SAASxW;AAAA,UAC3B,kBAAkBwW,EAAW,qBAAqB,CAAC/Z,GAAeC,MAAe;;AAC/E,YAAA+S,EAAa,QAAQ,OAAO,EAAE,kBAAkBhT,GAAO,gBAAgBC,GAAK,GAC5EiW,EAAU,aAAA,GACVrC,GAAA,IACA8C,KAAAvJ,IAAA6H,EAAS,SAAQ,iBAAjB,QAAA0B,EAAA,KAAAvJ,GAAgCpN,GAAOC,KACvCsZ,KAAAnC,IAAAnC,EAAS,SAAQ,WAAjB,QAAAsE,EAAA,KAAAnC,GAA0BpX,GAAOC;AAAA,UACnC;AAAA,QAAA,CACD,CAAC;AAAA,MAEN;AAAA,IACF,CAAC,GACM6Z;AAAA,EACT,GAAG,CAACjY,IAAUyR,IAAiBE,IAAeT,IAAatC,GAAclN,IAAO2S,GAAWrC,EAAe,CAAC,GAGrGmG,KAAkBjL,EAAO,EAAK;AACpC,EAAAM,GAAU,MAAK;AACb,IAAK2K,GAAgB,YACnBA,GAAgB,UAAU,IAC1B9D,EAAU,aAAA;AAAA,EAEd,GAAG,CAACA,CAAS,CAAC,GAGd+D,GAAoB3J,GAAK,OAAO;AAAA,IAC9B,gBAAgB,EAAE,WAAA4J,GAAW,SAAAC,GAAS,OAAA7N,GAAO,cAAc8N,KAAmB;AAC5E,YAAMjF,IAAIF,EAAS,SACboF,IAAkB,IAClBC,IAAeD,IAAkB,GACjCpL,IAAckG,EAAE,OAAO,SAASA,EAAE,YAGlCrB,IAAKd,EAAa,SAClBuH,IAAqBpF,EAAE,eAAerB,EAAG,iBAAiBA,EAAG,mBAC7D0G,IAAgBL,IAAUD,GAC1BO,IAAgB,KAAK,IAAItF,EAAE,aAAa,KAAK,MAAMqF,IAAgBD,CAAkB,CAAC,GAEtFG,KAAkBN,IAAoBK,KAAiBnO,GACvDqO,MAAmBL,IAAerL,KAAe3C,GAEjDlH,IAAS,SAAS,cAAc,QAAQ;AAC9C,MAAAA,EAAO,QAAQsV,GACftV,EAAO,SAASuV;AAChB,YAAMxX,IAAMiC,EAAO,WAAW,IAAI;AAClC,MAAAjC,EAAI,MAAMmJ,GAAOA,CAAK;AAGtB,eAASjL,IAAI,GAAGA,IAAI8T,EAAE,OAAO,QAAQ9T,KAAK;AACxC,cAAM4E,KAAQkP,EAAE,OAAO9T,CAAC,GAClB3C,KAAI4b,IAAejZ,IAAI8T,EAAE;AAG/B,YAAIA,EAAE,UAAU;AACd,gBAAMyF,IAAQzF,EAAE,SAASlP,EAAK;AAC9B,UAAI2U,KAAA,QAAAA,EAAO,oBACTzX,EAAI,YAAYyX,EAAM,iBACtBzX,EAAI,SAAS,GAAGzE,IAAG0b,GAAmBjF,EAAE,UAAU;AAAA,QAEtD;AAGA,cAAM0F,IAAY5U,GAAM;AACxB,YAAI6U,IAAa,OACbC,KAAS;AACb,QAAIF,MAAc,YAChBC,IAAa,QACJD,MAAc,QACvBC,IAAa,QACJD,MAAc,SACvBC,IAAa,OACbC,KAAS,KAGX5X,EAAI,YAAY,QAChBA,EAAI,OAAO,GAAG2X,CAAU,oBACxB3X,EAAI,eAAe,UACnBA,EAAI,SAAS8C,GAAM,OAAO8U,IAAQrc,KAAIyW,EAAE,aAAa,GAAGiF,IAAoBW,KAAS,CAAC;AAAA,MACxF;AAGA,YAAMC,IAAgB,CAACC,GAAcC,IAAyCC,OAA8B;;AAC1G,QAAAhY,EAAI,cAAYiK,KAAA+H,EAAE,MAAM,WAAR,gBAAA/H,GAAgB,OAAM,WACtCjK,EAAI,SAASiX,GAAmBa,GAAMR,GAAeJ,CAAe,GACpElX,EAAI,gBAAcwT,IAAAxB,EAAE,MAAM,SAAR,gBAAAwB,EAAc,SAAQ,WACxCxT,EAAI,YAAY,GAChBA,EAAI,WAAWiX,GAAmBa,GAAMR,GAAeJ,CAAe;AAEtE,YAAIe,IAASrU,GAAMmT,CAAS,EAAE,QAAQiB,EAAI;AAC1C,QAAIC,EAAO,YAAYlB,MAAWkB,IAASA,EAAO,IAAI,GAAGD,EAAI;AAE7D,cAAME,IAAUZ,KAAiBN,IAAUD;AAE3C,eAAOkB,EAAO,QAAA,IAAYjB,KAAS;AACjC,gBAAMmB,KAAaF,EAAO,IAAI,GAAGD,EAAI,GAC/B1c,IAAI2b,KAAqBgB,EAAO,QAAA,IAAYlB,KAAamB,GAEzD7X,KADO4W,KAAqB,KAAK,IAAIkB,GAAW,WAAWnB,CAAO,IAAID,KAAamB,IACpE5c;AAGrB,UAAA0E,EAAI,UAAA,GACJA,EAAI,OAAO1E,GAAGwc,CAAI,GAClB9X,EAAI,OAAO1E,GAAGwc,IAAOZ,CAAe,GACpClX,EAAI,OAAA,GAGJA,EAAI,YAAY,QAChBA,EAAI,OAAO,uBACXA,EAAI,eAAe,UACnBA,EAAI,YAAY,UAChBA,EAAI,SAAS+X,GAASE,CAAM,GAAG3c,IAAI+E,KAAQ,GAAGyX,IAAOZ,IAAkB,GAAG7W,KAAQ,CAAC,GAEnF4X,IAASE;AAAA,QACX;AACA,QAAAnY,EAAI,YAAY;AAAA,MAClB;AAEA,MAAA6X,EAAc,GAAG,CAAC/Z,MAAMA,EAAE,OAAO,MAAM,GAAG,MAAM,GAChD+Z,EAAcX,GAAiB,CAACpZ,MAAMA,EAAE,OAAO,IAAI,GAAG,OAAO,GAC7D+Z,EAAcX,IAAkB,GAAG,CAACpZ,MAAM,OAAOA,EAAE,SAAS,GAAG,MAAM;AAGrE,YAAMsa,IAAiB,IAAIld,GAAU;AAAA,QACnC,kBAAkB6b;AAAA,QAClB,gBAAgBC;AAAA,QAChB,aAAaM;AAAA,QACb,cAAcxL;AAAA,QACd,cAAc;AAAA,QACd,YAAYkG,EAAE;AAAA,QACd,YAAYA,EAAE,OAAO;AAAA,QACrB,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA,CACZ;AAGD,aAAAhS,EAAI,KAAA,GACJA,EAAI,UAAUiX,GAAmBE,CAAY,GAG7CnX,EAAI,UAAA,GACJA,EAAI,KAAK,GAAG,GAAGsX,GAAexL,CAAW,GACzC9L,EAAI,KAAA,GAEJkR,GAAU,KAAKlR,GAAKoY,GAAgBpG,EAAE,QAAQA,EAAE,OAAOA,EAAE,UAAUA,EAAE,UAAUA,EAAE,UAAU,GAC3Fb,GAAW,KACTnR,GAAKoY,GAAgBpG,EAAE,QAAQA,EAAE,OAAOA,EAAE,cAAcA,EAAE,cAC1DA,EAAE,cAAcA,EAAE,eAAeA,EAAE,OAAOA,EAAE,UAAU,QAAWA,EAAE,cACnEA,EAAE,iBAAiBA,EAAE,eAAe,GAEtCZ,GAAa,KAAKpR,GAAKoY,GAAgBpG,EAAE,OAAO;AAAA,QAC9C,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAASL,GAAW;AAAA,QACpB,aAAa;AAAA,MAAA,CACd,GAED3R,EAAI,QAAA,GAEGiC;AAAA,IACT;AAAA,EAAA,IACE,CAACiP,IAAWC,IAAYC,EAAY,CAAC,GAGzClF,GAAU,MAAK;AACb,UAAMmM,IAAyB;AAAA,MAC7B,gBAAgB,EAAE,WAAAtB,GAAW,SAAAC,GAAS,OAAA7N,GAAO,cAAc8N,KAAmB;;AAC5E,cAAMjF,IAAIF,EAAS,SACboF,IAAkB,IAClBC,IAAeD,IAAkB,GACjCpL,IAAckG,EAAE,OAAO,SAASA,EAAE,YAClCrB,IAAKd,EAAa,SAClBuH,IAAqBpF,EAAE,eAAerB,EAAG,iBAAiBA,EAAG,mBAC7D0G,IAAgBL,IAAUD,GAC1BO,IAAgB,KAAK,IAAItF,EAAE,aAAa,KAAK,MAAMqF,IAAgBD,CAAkB,CAAC,GACtFkB,KAAYrB,IAAoBK,GAChCiB,IAAapB,IAAerL,GAE5B7J,IAAS,SAAS,cAAc,QAAQ;AAC9C,QAAAA,EAAO,QAAQqW,KAAYnP,GAC3BlH,EAAO,SAASsW,IAAapP;AAC7B,cAAMnJ,IAAMiC,EAAO,WAAW,IAAI;AAClC,QAAAjC,EAAI,MAAMmJ,GAAOA,CAAK,GACtBnJ,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAGsY,IAAWC,CAAU,GAGxCvY,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAK,GAAG,GAAGiX,GAAmBsB,CAAU,GAC5CvY,EAAI,KAAA,GACJA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAGiX,GAAmBE,CAAY,GAClDnX,EAAI,cAAc,WAClBA,EAAI,YAAY,GAChBA,EAAI,WAAW,GAAG,GAAGiX,GAAmBE,CAAY;AACpD,iBAASjZ,IAAI,GAAGA,IAAI8T,EAAE,OAAO,QAAQ9T,KAAK;AACxC,gBAAM4E,IAAQkP,EAAE,OAAO9T,CAAC,GAClB3C,KAAI4b,IAAejZ,IAAI8T,EAAE,YACzBwG,KAAKvO,KAAA+H,EAAE,aAAF,gBAAA/H,GAAA,KAAA+H,GAAalP;AACxB,UAAA9C,EAAI,aAAYwY,KAAA,gBAAAA,EAAI,qBAAoBta,IAAI,MAAM,IAAI,YAAY,YAClE8B,EAAI,SAAS,GAAGzE,IAAG0b,GAAmBjF,EAAE,UAAU,GAClDhS,EAAI,cAAc,WAClBA,EAAI,YAAY,KAChBA,EAAI,UAAA,GACJA,EAAI,OAAO,GAAGzE,KAAIyW,EAAE,UAAU,GAC9BhS,EAAI,OAAOiX,GAAmB1b,KAAIyW,EAAE,UAAU,GAC9ChS,EAAI,OAAA;AACJ,gBAAMyY,KAAM3V,EAAM,QAAmB;AACrC,cAAI8U,IAAS,GAAGc,KAAK,OAAOC,KAAK;AACjC,UAAIF,OAAO,aAAaC,KAAK,OAAOC,KAAK,MAChCF,OAAO,uBAAwBC,KAAK,QACpCD,OAAO,mBAAkBb,IAAS,KAC3C5X,EAAI,YAAY,WAChBA,EAAI,OAAO,GAAG0Y,EAAE,IAAIC,EAAE,wEACtB3Y,EAAI,eAAe;AACnB,gBAAMU,KAAQ,OAAOoC,EAAM,SAAU,WAAWA,EAAM,QAAQ,OAAOA,EAAM,KAAK;AAChF,UAAA9C,EAAI,SAASU,IAAOkX,GAAQrc,KAAIyW,EAAE,aAAa,GAAGiF,IAAoBW,IAAS,CAAC;AAAA,QAClF;AACA,QAAA5X,EAAI,cAAc,WAClBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACJA,EAAI,OAAOiX,GAAmB,CAAC,GAC/BjX,EAAI,OAAOiX,GAAmBsB,CAAU,GACxCvY,EAAI,OAAA,GACJA,EAAI,QAAA,GAGJA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAKiX,GAAmB,GAAGK,GAAeH,CAAY,GAC1DnX,EAAI,KAAA;AACJ,cAAM8V,IAAWkB,IAAUD,GACrB6B,IAAiE;AAAA,UACrE,EAAE,MAAM,QAAQ,KAAK,EAAA;AAAA,UAAK,EAAE,MAAM,SAAS,KAAK,EAAA;AAAA,UAAK,EAAE,MAAM,QAAQ,KAAK,EAAA;AAAA,QAAC;AAE7E,mBAAW,EAAE,MAAAZ,GAAM,KAAAa,EAAA,KAASD,GAAO;AACjC,gBAAME,KAAKD,IAAM3B;AACjB,UAAAlX,EAAI,YAAY,WAChBA,EAAI,SAASiX,GAAmB6B,IAAIxB,GAAeJ,CAAe;AAClE,cAAI6B,IAAMnV,GAAMmT,CAAS,EAAE,QAAQiB,CAAI;AACvC,gBAAMgB,KAAWpV,GAAMoT,CAAO,EAAE,IAAI,GAAGgB,CAAI;AAC3C,iBAAOe,EAAI,SAASC,EAAQ,KAAG;AAC7B,kBAAMC,IAAOF,EAAI,IAAI,GAAGf,CAAI,GACtBkB,KAAKjC,KAAsB8B,EAAI,YAAYhC,KAAajB,IAAYwB,GACpElU,MAAM6V,EAAK,QAAA,IAAYF,EAAI,QAAA,KAAajD,IAAYwB;AAC1D,YAAAtX,EAAI,cAAc,WAClBA,EAAI,YAAY,KAChBA,EAAI,WAAWkZ,IAAIJ,IAAI1V,IAAG8T,CAAe;AACzC,gBAAIiC;AACJ,YAAInB,MAAS,SAAQmB,KAAQJ,EAAI,OAAO,MAAM,IACrCf,MAAS,UAASmB,KAAQJ,EAAI,OAAO,IAAI,IAC7CI,KAAQ,GAAGJ,EAAI,KAAA,CAAM,IAC1B/Y,EAAI,YAAY,WAChBA,EAAI,OAAOgY,MAAS,SAChB,+EACA,8EACJhY,EAAI,eAAe,UACnBA,EAAI,YAAY,UACZoD,KAAI,MAAIpD,EAAI,SAASmZ,IAAOD,KAAK9V,KAAI,GAAG0V,KAAK5B,IAAkB,CAAC,GACpE6B,IAAME;AAAA,UACR;AAAA,QACF;AACA,QAAAjZ,EAAI,YAAY,SAChBA,EAAI,QAAA,GAGJA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAKiX,GAAmBE,GAAcG,GAAexL,CAAW,GACpE9L,EAAI,KAAA,GACJA,EAAI,UAAUiX,GAAmBE,CAAY;AAC7C,cAAMiC,KAAK,IAAIle,GAAU;AAAA,UACvB,kBAAkB6b;AAAA,UAAW,gBAAgBC;AAAA,UAC7C,aAAaM;AAAA,UAAe,cAAcxL;AAAA,UAC1C,cAAc;AAAA,UAAG,YAAYkG,EAAE;AAAA,UAC/B,YAAYA,EAAE,OAAO;AAAA,UAAQ,QAAQ;AAAA,UAAG,WAAW;AAAA,QAAA,CACpD;AACD,eAAAd,GAAU,KAAKlR,GAAKoZ,IAAIpH,EAAE,QAAQA,EAAE,OAAOA,EAAE,UAAUA,EAAE,UAAUA,EAAE,UAAU,GAC/Eb,GAAW,KAAKnR,GAAKoZ,IAAIpH,EAAE,QAAQA,EAAE,OAAOA,EAAE,cAAcA,EAAE,cAC5DA,EAAE,cAAcA,EAAE,eAAeA,EAAE,OAAOA,EAAE,UAAU,QAAWA,EAAE,cACnEA,EAAE,iBAAiBA,EAAE,eAAe,GACtCZ,GAAa,KAAKpR,GAAKoZ,IAAIpH,EAAE,OAAO,EAAE,SAAS,MAAM,SAASL,GAAW,QAAA,CAAS,GAClF3R,EAAI,QAAA,GAEGiC;AAAA,MACT;AAAA,IAAA;AAEF,IAAAyM,MAAA,QAAAA,GAAU2J;AAAA,EACZ,GAAG,CAAC3J,IAASwC,IAAWC,IAAYC,EAAY,CAAC;AAGjD,QAAMiI,KAA4C;AAAA,IAChD,UAAU;AAAA,IACV,OAAOzJ;AAAA,IACP,QAAQnE;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,GAGJ6N,KAAmC,EAAE,UAAU,YAAY,KAAK,GAAG,MAAM,EAAA;AAE/E,SACEC,GAAA,OAAA,EAAK,KAAKnK,IAAU,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,OAAO,QAAQ,UAAU,yBAC7ET,KACf4K,GAAA,OAAA,EACE,OAAO;AAAA,IACL,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,YAAY;AAAA,EAAA,GACb,UAAA,CAAA,KAEC,SAAe,OAAK,UAAa,EAAA,CAAA,IAEnC,MACH7C,IACD6C,YAAK,KAAK5N,IAAc,OAAO,EAAE,SAAS,QAAQ,UAAU,YAAU,UAAA,CACpES,GAACb,IAAO,EACN,QAAAnK,GACA,OAAOkM,GACP,YAAApQ,GACA,WAAWqT,IACX,cAAA9E,IACA,OAAArL,IACA,eAAewN,IACf,UAAU,CAACkG,MAAgB;AACzB,IAAAjE,EAAa,QAAQ,OAAO,EAAE,WAAWiE,GAAc,GACvDf,EAAU,UAAU,MAAM,GAC1BA,EAAU,UAAU,OAAO,GAC3BA,EAAU,UAAU,SAAS,GAC7BvC,GAAoBsD,CAAY;AAAA,EAClC,GAAC,GAEHyF,GAAA,OAAA,EACE,KAAKpK,IACL,OAAOkK,IACP,eAAetE,IACf,eAAeM,IACf,aAAaC,IACb,eAAeiB,IACf,eAAeC,IACf,gBAAgBC,IAAkB,UAAA,CAElCrK,GAAA,UAAA,EAAQ,KAAK4C,IAAe,OAAO,EAAE,GAAGsK,IAAa,QAAQ,IAAC,CAAE,GAChElN,GAAA,UAAA,EAAQ,KAAK6C,IAAgB,OAAO,EAAE,GAAGqK,IAAa,QAAQ,IAAC,CAAE,GACjElN,GAAA,UAAA,EAAQ,KAAK8C,IAAkB,OAAO,EAAE,GAAGoK,IAAa,QAAQ,KAAG,CAAI,EAAA,CAAA,GAExE9K,MAAqBC,KACpBrC,GAACb,IAAO,EACN,QAAAnK,GACA,OAAOoN,IACP,YAAAtR,GACA,WAAWqT,IACX,cAAA9E,IACA,OAAArL,IACA,eAAeqO,IACf,UAAU,CAACqF,MAAgB;AACzB,IAAAjE,EAAa,QAAQ,OAAO,EAAE,WAAWiE,GAAc,GACvDf,EAAU,UAAU,MAAM,GAC1BA,EAAU,UAAU,OAAO,GAC3BA,EAAU,UAAU,SAAS,GAC7BvC,GAAoBsD,CAAY;AAAA,EAClC,EAAA,CAAC,IAED,IAAI,GAAA,CACJ,GAAA;AAGZ,CAAC,CAAC;AC1rCI,SAAU0F,GAAgB,EAAE,UAAA9a,GAAU,OAAA0B,GAAO,WAAAqZ,GAAW,YAAYC,GAAa,OAAAjC,GAAO,kBAAA5O,GAAkB,gBAAAC,GAAgB,aAAA8G,GAAa,cAAAtC,IAAe,GAAG,kBAAAqM,KAAwC;AACrM,QAAMC,IAAmB3M,GAAM,SAAS,IAAIvO,GAAU,CAACmB,MAAS;;AAC9D,QAAI,CAACoN,GAAM,eAAepN,CAAK;AAAG,aAAOA;AAEzC,UADqBoK,IAAApK,EAAM,SAAN,gBAAAoK,EAAyC,iBAC1C,cAAc;AAChC,YAAM2M,IAAa/W,EAAM,OACnBga,IAAW5M,GAAM,aAAapN,GAAsD;AAAA,QACxF,kBAAkB+W,EAAW,oBAAoB/N;AAAA,QACjD,gBAAgB+N,EAAW,kBAAkB9N;AAAA,QAC7C,aAAa8N,EAAW,eAAehH;AAAA,QACvC,OAAOgH,EAAW,SAASxW;AAAA,QAC3B,kBAAkBwW,EAAW,mBAAmBA,EAAW,oBAAoB+C;AAAA,MAAA,CAChF;AACD,aACEJ,GAAA,OAAA,EAAK,OAAO,EAAE,SAAS,OAAA,GAAQ,UAAA,CAC7BnN,GAAA,OAAA,EAAK,OAAO,EAAE,OAAOkB,GAAc,YAAY,EAAA,EAAC,IAChDlB,GAAA,OAAA,EAAK,OAAO,EAAE,MAAM,GAAG,UAAU,YAAU,UAAGyN,GAAQ,CAAO,GAAA;AAAA,IAGnE;AACA,WAAOha;AAAA,EACT,CAAC;AAED,SACEuM,GAAA,OAAA,EAAK,WAAAqN,GAAsB,OAAO;AAAA,IAChC,UAAU;AAAA,IAAU,KAAK;AAAA,IAAG,QAAQ;AAAA,IAAI,SAAS;AAAA,IAAQ,eAAe;AAAA,IACxE,kBAAiBrZ,KAAA,gBAAAA,EAAO,OAAO,OAAM;AAAA,IACrC,WAAW,cAAaA,KAAA,gBAAAA,EAAO,OAAO,WAAU,SAAS;AAAA,IACzD,cAAc,cAAaA,KAAA,gBAAAA,EAAO,OAAO,WAAU,SAAS;AAAA,IAC5D,GAAGqX;AAAA,EAAA,GACJ,UACEmC,GAAgB;AAGvB;AACAJ,GAAgB,cAAc;;;ACnD9B,GAAC,SAAS9Q,GAAEqC,GAAE;AAAsD,IAAAC,EAAA,UAAeD,EAAC;AAAA,EAAoI,GAAEE,IAAM,WAAU;AAAc,QAAIvC,IAAE,QAAOqC,IAAE;AAAO,WAAO,SAAS7M,GAAEiN,GAAE7H,GAAE;AAAC,UAAIwW,IAAE3O,EAAE;AAAU,MAAA2O,EAAE,OAAK,SAAS5b,GAAE;AAAC,YAAYA,MAAT,WAAaA,IAAE,OAAaA,MAAP,KAAS,QAAO,KAAK,IAAI,KAAGA,IAAE,KAAK,KAAI,IAAI,KAAK;AAAE,YAAIiN,IAAE,KAAK,QAAO,EAAG,aAAW;AAAE,YAAQ,KAAK,MAAK,MAAf,MAAmB,KAAK,KAAI,IAAG,IAAG;AAAC,cAAI2O,IAAExW,EAAE,IAAI,EAAE,QAAQyH,CAAC,EAAE,IAAI,GAAEA,CAAC,EAAE,KAAKI,CAAC,GAAED,IAAE5H,EAAE,IAAI,EAAE,MAAMoF,CAAC;AAAE,cAAGoR,EAAE,SAAS5O,CAAC,EAAE,QAAO;AAAA,QAAC;AAAC,YAAI7M,IAAEiF,EAAE,IAAI,EAAE,QAAQyH,CAAC,EAAE,KAAKI,CAAC,EAAE,QAAQzC,CAAC,EAAE,SAAS,GAAE,aAAa,GAAE0C,IAAE,KAAK,KAAK/M,GAAEqK,GAAE,EAAE;AAAE,eAAO0C,IAAE,IAAE9H,EAAE,IAAI,EAAE,QAAQ,MAAM,EAAE,KAAI,IAAG,KAAK,KAAK8H,CAAC;AAAA,MAAC,GAAE0O,EAAE,QAAM,SAASpR,GAAE;AAAC,eAAgBA,MAAT,WAAaA,IAAE,OAAM,KAAK,KAAKA,CAAC;AAAA,MAAC;AAAA,IAAC;AAAA,EAAC;;;;ACKnwB9E,GAAM,OAAOmW,EAAU;AAKvB,MAAMC,KAAmD;AAAA,EACvD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;;AAmBF,SAAUC,GAAW,EACzB,MAAAjC,GACA,kBAAAnP,IAAmB,GACnB,gBAAAC,IAAiB,GACjB,aAAA8G,IAAc,GACd,OAAAxP,GACA,QAAAE,IAAS,IACT,WAAAmZ,GACA,aAAAS,GACA,iBAAAC,GACA,cAAAC,GACA,kBAAAT,KACgB;AAChB,QAAMvd,IAAYwS,GAAQ,MAAK;AAC7B,QAAI,CAAC/F,KAAoB,CAACC,KAAkB,CAAC8G;AAAa,aAAO,CAAA;AAEjE,UAAMkG,IAAWhN,IAAiBD,GAG5BwR,IAAWD,KAAgBJ,GAAuBhC,CAAI;AAC5D,QAAIqC,IAAW,GAAG;AAChB,YAAMC,IAAc1W,GAAMiF,CAAgB,EAAE,QAAQmP,CAAI;AAGxD,WAFkBsC,EAAY,IAAI,GAAGtC,CAAI,EACR,QAAA,IAAYsC,EAAY,QAAA,KAAaxE,IAAYlG,IAC/DyK;AAAU,eAAO,CAAA;AAAA,IACtC;AAEA,UAAMpb,IAA4F,CAAA;AAElG,QAAIJ,IAAU+E,GAAMiF,CAAgB,EAAE,QAAQmP,CAAI,EAAE,SAAS,GAAGA,CAAI;AACpE,UAAMgB,IAAWpV,GAAMkF,CAAc,EAAE,IAAI,GAAGkP,CAAI,EAAE,QAAA;AAEpD,WAAOnZ,EAAQ,QAAA,IAAYma,KAAU;AACnC,YAAMC,IAAOpa,EAAQ,IAAI,GAAGmZ,CAAI,GAC1Bnb,IAAQgC,EAAQ,QAAA,GAChB/B,IAAMmc,EAAK,QAAA,GACXsB,KAAS1d,IAAQgM,KAAoBiN,IAAYlG,GACjDvP,KAAUvD,IAAMD,KAASiZ,IAAYlG,GACrCuJ,KAAQqB,GAAY3b,GAASoa,GAAMjB,GAAMkC,CAAkB;AACjE,MAAAjb,EAAO,KAAK,EAAE,OAAApC,GAAO,KAAAC,GAAK,OAAAqc,IAAO,MAAAoB,GAAM,OAAAla,GAAO,GAC9CxB,IAAUoa;AAAA,IACZ;AACA,WAAOha;AAAA,EACT,GAAG,CAAC4J,GAAkBC,GAAgB8G,GAAaoI,GAAMkC,GAAaE,CAAY,CAAC,GAE7EK,IAAcxO,GAAY,CAACpP,GAAeC,MAAe;AAC7D,IAAIqd,IACFA,EAAgBtd,GAAOC,CAAG,IACjB6c,KACTA,EAAiB9c,GAAOC,CAAG;AAAA,EAE/B,GAAG,CAACqd,GAAiBR,CAAgB,CAAC;AAGtC,SAAIvd,EAAU,WAAW,IAAU,OAGjCgQ,GAAA,OAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,UAAU,YAAY,QAAA9L,GAAQ,UAAU,SAAA,aACpElE,EAAU,IAAI,CAACyV,MACdzF,GAAA,OAAA,EAEE,WAAAqN,GACA,SAAS,MAAMgB,EAAY5I,EAAS,OAAOA,EAAS,GAAG,GACvD,OAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAMA,EAAS;AAAA,IACf,OAAOA,EAAS;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,aAAa,cAAazR,KAAA,gBAAAA,EAAO,OAAO,WAAU,SAAS;AAAA,IAC3D,cAAc,cAAaA,KAAA,gBAAAA,EAAO,OAAO,WAAU,SAAS;AAAA,IAC5D,UAAU;AAAA,IACV,QAAOA,KAAA,gBAAAA,EAAO,OAAO,SAAQ;AAAA,IAC7B,kBAAiBA,KAAA,gBAAAA,EAAO,OAAO,OAAM;AAAA,IACrC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,EAAA,GACZ,UAEDgM,GAAA,QAAA,EAAA,UAAOyF,EAAS,MAAA,MAxBXA,EAAS,KAAK,CA0BtB,GAAC;AAGR;AACAoI,GAAW,cAAc;AAEzB,SAASO,GACP3d,GACAC,GACAkb,GACAkC,GACAQ,GAAc;AAEd,SAAI,OAAOR,KAAgB,aAClBA,EAAYrd,EAAM,OAAA,GAAUC,EAAI,OAAA,GAAUkb,CAAI,IAEnD,OAAOkC,KAAgB,WAClBrd,EAAM,OAAOqd,CAAW,IAE1BS,GAAc9d,GAAOmb,CAAI;AAClC;AAEA,SAAS2C,GAAc7c,GAAgBka,GAAc;AACnD,UAAQA,GAAA;AAAA,IACN,KAAK;AAAQ,aAAOla,EAAE,OAAO,MAAM;AAAA,IACnC,KAAK;AAAS,aAAOA,EAAE,OAAO,IAAI;AAAA,IAClC,KAAK;AAAQ,aAAO,GAAGA,EAAE,KAAA,CAAM;AAAA,IAC/B,KAAK;AAAO,aAAOA,EAAE,OAAO,GAAG;AAAA,IAC/B,KAAK;AAAQ,aAAOA,EAAE,OAAO,OAAO;AAAA,EAAA;AAExC;AC9IM,SAAU8c,GAAc,EAAE,OAAAva,GAAO,UAAA3B,GAAU,OAAA+Y,KAA2B;AAC1E,QAAMoD,IAAe,OAA6C,EAAE,OAAO,EAAE,OAAAxa,GAAO,GAAGoX;AACvF,SAAI/Y,IAAiB0N,GAAA0O,IAAA,EAAA,UAAGpc,EAAS,EAAE,cAAAmc,EAAA,CAAc,OAC1CzO,YAAK,OAAO,EAAE,OAAA/L,EAAA;AACvB;AACAua,GAAc,cAAc;ACXtB,SAAUG,GAAa,EAAE,UAAArc,KAA6B;AAAI,SAAO0N,GAAA0O,IAAA,EAAA,UAAApc,GAAW;AAAK;AACvFqc,GAAa,cAAc;","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","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/timezone.js","../src/utils/timezone.ts","../src/canvas/GridLayer.ts","../src/canvas/DrawHelpers.ts","../src/canvas/ItemsLayer.ts","../src/canvas/OverlayLayer.ts","../src/interaction/ZoomHandler.ts","../src/interaction/InteractionHandler.ts","../src/interaction/snapUtils.ts","../node_modules/dayjs/plugin/isoWeek.js","../src/dom/Sidebar.tsx","../src/dom/TodayMarker.tsx","../src/dom/CustomMarker.tsx","../src/CanvasTimeline.tsx","../src/dom/TimelineHeaders.tsx","../node_modules/dayjs/plugin/weekOfYear.js","../src/dom/DateHeader.tsx","../src/dom/SidebarHeader.tsx","../src/dom/CustomHeader.tsx"],"sourcesContent":["import type React from 'react'\n\nexport interface Group {\n id: number | string\n title: string\n type?: string\n hierarchy?: string\n root?: boolean\n [key: string]: unknown\n}\n\nexport interface Item {\n id: number\n group: number | string\n start_time: number\n end_time: number\n parentId?: number\n type?: string\n [key: string]: unknown\n}\n\nexport interface ItemBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface ItemState {\n selected: boolean\n hovered: boolean\n dragging: boolean\n filtered: boolean\n}\n\nexport interface DrawHelpers {\n roundRect(x: number, y: number, w: number, h: number, radius?: number): void\n fillText(text: string, x: number, y: number, maxWidth?: number): void\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient\n leftBar(color: string, width?: number): void\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size?: number): void\n badge(text: string, x: number, y: number, bgColor: string): void\n}\n\nexport type CanvasItemRenderer = (\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n helpers: DrawHelpers,\n) => void\n\nexport type CanvasGroupItemRenderer = CanvasItemRenderer\n\nexport interface DayStyle {\n backgroundColor?: string\n borderColor?: string\n opacity?: number\n}\n\nexport interface RowStyle {\n backgroundColor?: string\n borderBottomColor?: string\n}\n\nexport interface Dependency {\n fromItemId: number\n toItemId: number\n type?: 'finish-to-start' | 'start-to-start' | 'finish-to-finish'\n color?: string\n}\n\nexport interface TimeRangeHighlight {\n start: number\n end: number\n color: string\n label?: string\n opacity?: number\n}\n\nexport interface TimelineTheme {\n primary: string\n trainColors: Record<string, string>\n status: { red: string; yellow: string; green: string }\n grid: { line: string; rowAlt: string; weekend: string }\n item: { radius: number; text: string; selectedRing: string }\n marker: { today: string; milestone: string; cursor: string }\n sidebar: { bg: string; border: string; text: string }\n header: { bg: string; border: string; text: string }\n}\n\nexport const DEFAULT_THEME: TimelineTheme = {\n primary: '#269bf7',\n trainColors: {},\n status: { red: '#EF5350', yellow: '#FBBF24', green: '#31c48d' },\n grid: { line: '#E5E5E5', rowAlt: '#F7F7F7', weekend: 'rgba(0,0,0,0.03)' },\n item: { radius: 3, text: '#374151', selectedRing: '#a3a3a3' },\n marker: { today: '#FD7171', milestone: '#3B82F6', cursor: '#269bf7' },\n sidebar: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n header: { bg: '#F9FAFB', border: '#E5E7EB', text: '#6c737f' },\n}\n\nexport interface MarkerConfig {\n date: number\n color: string\n width: number\n label?: string\n}\n\nexport interface CanvasTimelineProps {\n groups: Group[]\n items: Item[]\n defaultTimeStart: number\n defaultTimeEnd: number\n visibleTimeStart?: number\n visibleTimeEnd?: number\n sidebarWidth: number\n lineHeight: number\n itemHeightRatio: number\n stackItems: boolean\n buffer?: number\n canMove: boolean\n canResize: false | 'left' | 'right' | 'both'\n canChangeGroup: boolean\n dragSnap: number\n minZoom: number\n maxZoom: number\n theme?: Partial<TimelineTheme>\n dayStyle?: (date: Date) => DayStyle | null\n rowStyle?: (group: Group) => RowStyle | null\n showCursorLine?: boolean\n itemRenderer: CanvasItemRenderer\n groupRenderer?: CanvasGroupItemRenderer\n summaryRenderer?: CanvasItemRenderer\n sidebarGroupRenderer: (group: Group) => React.ReactNode\n rightSidebarWidth?: number\n rightSidebarGroupRenderer?: (group: Group) => React.ReactNode\n dependencies?: Dependency[]\n highlights?: TimeRangeHighlight[]\n onItemClick?: (itemId: number, e: PointerEvent) => void\n onItemDoubleClick?: (itemId: number, e: PointerEvent) => void\n onItemContextMenu?: (itemId: number, e: PointerEvent) => void\n onItemMove?: (itemId: number, newStartTime: number, newGroupId: string | number, childMoves?: { itemId: number; newStart: number }[]) => void\n onItemResize?: (itemId: number, newTime: number, edge: 'left' | 'right') => void\n /** Validate and optionally constrain move/resize. Return the (possibly modified) time. */\n moveResizeValidator?: (action: 'move' | 'resize', itemId: number, time: number, edge?: 'left' | 'right') => number\n onItemHover?: (itemId: number | null, e: PointerEvent) => void\n onCanvasDoubleClick?: (groupId: number, time: number) => void\n onCanvasContextMenu?: (groupId: number, time: number, e: PointerEvent) => void\n onTimeChange?: (start: number, end: number) => void\n onZoom?: (start: number, end: number) => void\n selected?: number[]\n /** Called when the timeline is ready, providing the capture API */\n onReady?: (api: CanvasTimelineRef) => void\n /** Dev-only: show a version + build-time badge in the top-left corner.\n * Wire to your app's dev flag, e.g. `devBadge={import.meta.env.DEV}`. */\n /** Maximum visible height for the timeline body. Accepts a number (px) or\n * a CSS string like `'calc(100vh - 98px)'`. When set, the canvas and sidebar\n * are clipped and internally scrollable via wheel, drag, or touch. */\n maxHeight?: number | string\n /** IANA timezone string (e.g. \"America/New_York\", \"UTC\").\n * When set, grid lines, headers, and day styling render in this timezone.\n * Defaults to the browser's local timezone. */\n timezone?: string\n devBadge?: boolean\n children?: React.ReactNode\n}\n\nexport interface CaptureOptions {\n timeStart: number\n timeEnd: number\n scale: number\n sidebarWidth: number\n}\n\nexport interface CanvasTimelineRef {\n captureToCanvas(options: CaptureOptions): HTMLCanvasElement\n}\n","export interface ViewStateConfig {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights?: number[]\n}\n\nexport class ViewState {\n visibleTimeStart: number\n visibleTimeEnd: number\n canvasWidth: number\n canvasHeight: number\n sidebarWidth: number\n lineHeight: number\n groupCount: number\n buffer: number\n scrollTop: number\n groupHeights: number[] | null\n\n private visibleDuration: number\n private pixelsPerMs: number\n // Cumulative top-edge offsets per group: length = groupCount + 1,\n // groupYOffsets[i] = sum of heights[0..i-1]; groupYOffsets[groupCount] = total.\n private groupYOffsets: number[]\n\n constructor(config: ViewStateConfig) {\n this.visibleTimeStart = config.visibleTimeStart\n this.visibleTimeEnd = config.visibleTimeEnd\n this.canvasWidth = config.canvasWidth\n this.canvasHeight = config.canvasHeight\n this.sidebarWidth = config.sidebarWidth\n this.lineHeight = config.lineHeight\n this.groupCount = config.groupCount\n this.buffer = config.buffer\n this.scrollTop = config.scrollTop\n this.groupHeights = config.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.groupYOffsets = []\n this.recomputeGroupYOffsets()\n }\n\n update(params: Partial<ViewStateConfig>): void {\n if (params.visibleTimeStart !== undefined) this.visibleTimeStart = params.visibleTimeStart\n if (params.visibleTimeEnd !== undefined) this.visibleTimeEnd = params.visibleTimeEnd\n if (params.canvasWidth !== undefined) this.canvasWidth = params.canvasWidth\n if (params.canvasHeight !== undefined) this.canvasHeight = params.canvasHeight\n if (params.sidebarWidth !== undefined) this.sidebarWidth = params.sidebarWidth\n if (params.lineHeight !== undefined) this.lineHeight = params.lineHeight\n if (params.groupCount !== undefined) this.groupCount = params.groupCount\n if (params.buffer !== undefined) this.buffer = params.buffer\n if (params.scrollTop !== undefined) this.scrollTop = params.scrollTop\n if (params.groupHeights !== undefined) this.groupHeights = params.groupHeights ?? null\n\n this.visibleDuration = this.visibleTimeEnd - this.visibleTimeStart\n this.pixelsPerMs = this.canvasWidth / this.visibleDuration\n this.recomputeGroupYOffsets()\n }\n\n private recomputeGroupYOffsets(): void {\n const offsets = new Array<number>(this.groupCount + 1)\n offsets[0] = 0\n for (let i = 0; i < this.groupCount; i++) {\n const h = this.groupHeights?.[i] ?? this.lineHeight\n offsets[i + 1] = offsets[i] + h\n }\n this.groupYOffsets = offsets\n }\n\n timeToX(time: number): number {\n return (time - this.visibleTimeStart) * this.pixelsPerMs\n }\n\n xToTime(x: number): number {\n return this.visibleTimeStart + x / this.pixelsPerMs\n }\n\n yToGroupIndex(y: number): number {\n if (this.groupCount === 0) return 0\n const target = y + this.scrollTop\n if (target <= 0) return 0\n if (target >= this.groupYOffsets[this.groupCount]) return this.groupCount - 1\n // Binary search: smallest i where groupYOffsets[i + 1] > target.\n let lo = 0\n let hi = this.groupCount - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (this.groupYOffsets[mid + 1] > target) hi = mid\n else lo = mid + 1\n }\n return lo\n }\n\n groupIndexToY(index: number): number {\n if (index < 0) return -this.scrollTop\n if (index >= this.groupCount) {\n return (this.groupYOffsets[this.groupCount] ?? 0) - this.scrollTop\n }\n return this.groupYOffsets[index] - this.scrollTop\n }\n\n groupIndexToHeight(index: number): number {\n if (index < 0 || index >= this.groupCount) return this.lineHeight\n return this.groupHeights?.[index] ?? this.lineHeight\n }\n\n getBufferBounds(): { bufferStart: number; bufferEnd: number } {\n const extend = this.visibleDuration * 1.5\n return {\n bufferStart: this.visibleTimeStart - extend,\n bufferEnd: this.visibleTimeEnd + extend,\n }\n }\n\n getVisibleGroupRange(): { firstVisible: number; lastVisible: number } {\n if (this.groupCount === 0) return { firstVisible: 0, lastVisible: -1 }\n const firstVisible = this.yToGroupIndex(0)\n const lastVisible = this.yToGroupIndex(this.canvasHeight)\n return { firstVisible, lastVisible }\n }\n\n isScrollInBuffer(scrollXOffset: number): boolean {\n const bufferPixels = this.visibleDuration * 1.5 * this.pixelsPerMs\n return Math.abs(scrollXOffset) < bufferPixels\n }\n\n getTotalHeight(): number {\n return this.groupYOffsets[this.groupCount] ?? 0\n }\n}\n","interface TreeNode<T> {\n center: number\n left: TreeNode<T> | null\n right: TreeNode<T> | null\n overlapping: Array<{ item: T; start: number; end: number }>\n}\n\nexport class IntervalTree<T> {\n private root: TreeNode<T> | null = null\n\n buildFromItems(\n items: T[],\n getStart: (item: T) => number,\n getEnd: (item: T) => number,\n ): void {\n const intervals = items.map((item) => ({\n item,\n start: getStart(item),\n end: getEnd(item),\n }))\n this.root = this.buildNode(intervals)\n }\n\n private buildNode(\n intervals: Array<{ item: T; start: number; end: number }>,\n ): TreeNode<T> | null {\n if (intervals.length === 0) return null\n\n let min = Infinity\n let max = -Infinity\n for (const iv of intervals) {\n if (iv.start < min) min = iv.start\n if (iv.end > max) max = iv.end\n }\n const center = (min + max) / 2\n\n const leftIntervals: Array<{ item: T; start: number; end: number }> = []\n const rightIntervals: Array<{ item: T; start: number; end: number }> = []\n const overlapping: Array<{ item: T; start: number; end: number }> = []\n\n for (const iv of intervals) {\n if (iv.end < center) {\n leftIntervals.push(iv)\n } else if (iv.start > center) {\n rightIntervals.push(iv)\n } else {\n overlapping.push(iv)\n }\n }\n\n return {\n center,\n left: this.buildNode(leftIntervals),\n right: this.buildNode(rightIntervals),\n overlapping,\n }\n }\n\n query(start: number, end: number): T[] {\n const results: T[] = []\n this.queryNode(this.root, start, end, results)\n return results\n }\n\n private queryNode(\n node: TreeNode<T> | null,\n start: number,\n end: number,\n results: T[],\n ): void {\n if (node === null) return\n\n for (const iv of node.overlapping) {\n if (iv.start <= end && iv.end >= start) {\n results.push(iv.item)\n }\n }\n\n if (start <= node.center && node.left !== null) {\n this.queryNode(node.left, start, end, results)\n }\n\n if (end >= node.center && node.right !== null) {\n this.queryNode(node.right, start, end, results)\n }\n }\n}\n","import type { Item } from '../types'\nimport type { HierarchyEngine } from './HierarchyEngine'\n\nexport interface ItemLayout {\n stackLevel: number\n itemHeight: number\n}\n\nexport class LayoutEngine {\n private readonly lineHeight: number\n private readonly itemHeightRatio: number\n private layoutCache: Map<number, ItemLayout> = new Map()\n private groupMaxStack: Map<string | number, number> = new Map()\n\n constructor(lineHeight: number, itemHeightRatio: number) {\n this.lineHeight = lineHeight\n this.itemHeightRatio = itemHeightRatio\n }\n\n computeLayout(items: Item[], stackItems: boolean, hierarchy?: HierarchyEngine): Map<number, ItemLayout> {\n this.layoutCache = new Map()\n this.groupMaxStack = new Map()\n\n const itemHeight = this.lineHeight * this.itemHeightRatio\n const summaryHeight = itemHeight * 0.6\n\n if (!stackItems) {\n for (const item of items) {\n const isSummary = hierarchy?.isParent(item.id) ?? false\n this.layoutCache.set(item.id, { stackLevel: 0, itemHeight: isSummary ? summaryHeight : itemHeight })\n this.groupMaxStack.set(item.group, 0)\n }\n return this.layoutCache\n }\n\n // Group items by group id\n const byGroup = new Map<string | number, Item[]>()\n for (const item of items) {\n let arr = byGroup.get(item.group)\n if (!arr) {\n arr = []\n byGroup.set(item.group, arr)\n }\n arr.push(item)\n }\n\n for (const [groupId, groupItems] of byGroup) {\n if (hierarchy) {\n this.computeHierarchyLayout(groupItems, hierarchy, itemHeight, summaryHeight, groupId)\n } else {\n this.computeFlatLayout(groupItems, itemHeight, groupId)\n }\n }\n\n return this.layoutCache\n }\n\n private computeFlatLayout(groupItems: Item[], itemHeight: number, groupId: string | number): void {\n groupItems.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of groupItems) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n private computeHierarchyLayout(\n groupItems: Item[],\n hierarchy: HierarchyEngine,\n itemHeight: number,\n summaryHeight: number,\n groupId: string | number,\n ): void {\n // Separate leaf items from parents\n const leaves: Item[] = []\n const parents: Item[] = []\n for (const item of groupItems) {\n if (hierarchy.isParent(item.id)) {\n parents.push(item)\n } else {\n leaves.push(item)\n }\n }\n\n // Stack leaves first using sweep-line\n leaves.sort((a, b) => {\n const d = a.start_time - b.start_time\n if (d !== 0) return d\n return (b.end_time - b.start_time) - (a.end_time - a.start_time)\n })\n\n const levelEnds: number[] = []\n let maxLevel = 0\n\n for (const item of leaves) {\n let level = -1\n for (let i = 0; i < levelEnds.length; i++) {\n if (levelEnds[i] <= item.start_time) {\n level = i\n break\n }\n }\n\n if (level === -1) {\n level = levelEnds.length\n levelEnds.push(item.end_time)\n } else {\n levelEnds[level] = item.end_time\n }\n\n if (level > maxLevel) maxLevel = level\n\n this.layoutCache.set(item.id, { stackLevel: level, itemHeight })\n }\n\n // Stack parents above leaves, sorted by nesting depth\n // Deepest parents first (closest to children), shallowest last (on top)\n parents.sort((a, b) => hierarchy.getNestingDepth(b.id) - hierarchy.getNestingDepth(a.id))\n\n let nextLevel = leaves.length > 0 ? maxLevel + 1 : 0\n for (const parent of parents) {\n this.layoutCache.set(parent.id, { stackLevel: nextLevel, itemHeight: summaryHeight })\n if (nextLevel > maxLevel) maxLevel = nextLevel\n nextLevel++\n }\n\n this.groupMaxStack.set(groupId, maxLevel)\n }\n\n getLayout(itemId: number): ItemLayout | undefined {\n return this.layoutCache.get(itemId)\n }\n\n getGroupHeight(groupId: string | number): number {\n const maxStack = this.groupMaxStack.get(groupId) ?? 0\n return (maxStack + 1) * this.lineHeight\n }\n}\n","interface HierarchyItem {\n id: number\n start_time: number\n end_time: number\n parentId?: number\n}\n\nexport class HierarchyEngine {\n private parentToChildren: Map<number, number[]> = new Map()\n private childToParent: Map<number, number> = new Map()\n private itemMap: Map<number, HierarchyItem> = new Map()\n private depthCache: Map<number, number> = new Map()\n\n rebuild(items: HierarchyItem[]): void {\n this.parentToChildren = new Map()\n this.childToParent = new Map()\n this.itemMap = new Map()\n this.depthCache = new Map()\n\n for (const item of items) {\n this.itemMap.set(item.id, item)\n }\n\n for (const item of items) {\n if (item.parentId !== undefined && this.itemMap.has(item.parentId)) {\n this.childToParent.set(item.id, item.parentId)\n let children = this.parentToChildren.get(item.parentId)\n if (!children) {\n children = []\n this.parentToChildren.set(item.parentId, children)\n }\n children.push(item.id)\n }\n }\n\n // Detect and break cycles\n for (const id of this.childToParent.keys()) {\n const visited = new Set<number>()\n let current: number | undefined = id\n while (current !== undefined) {\n if (visited.has(current)) {\n const parentId = this.childToParent.get(id)!\n this.childToParent.delete(id)\n const siblings = this.parentToChildren.get(parentId)\n if (siblings) {\n const idx = siblings.indexOf(id)\n if (idx !== -1) siblings.splice(idx, 1)\n if (siblings.length === 0) this.parentToChildren.delete(parentId)\n }\n break\n }\n visited.add(current)\n current = this.childToParent.get(current)\n }\n }\n }\n\n isParent(itemId: number): boolean {\n const children = this.parentToChildren.get(itemId)\n return children !== undefined && children.length > 0\n }\n\n getParent(itemId: number): number | undefined {\n return this.childToParent.get(itemId)\n }\n\n getChildren(itemId: number): number[] {\n return this.parentToChildren.get(itemId) ?? []\n }\n\n getDescendants(itemId: number): number[] {\n const result: number[] = []\n const stack = [...this.getChildren(itemId)]\n while (stack.length > 0) {\n const id = stack.pop()!\n result.push(id)\n const children = this.parentToChildren.get(id)\n if (children) stack.push(...children)\n }\n return result\n }\n\n getEffectiveSpan(itemId: number): { start: number; end: number } {\n const item = this.itemMap.get(itemId)\n if (!item) return { start: 0, end: 0 }\n\n let start = item.start_time\n let end = item.end_time\n\n const descendants = this.getDescendants(itemId)\n for (const descId of descendants) {\n const desc = this.itemMap.get(descId)\n if (!desc) continue\n if (desc.start_time < start) start = desc.start_time\n if (desc.end_time > end) end = desc.end_time\n }\n\n return { start, end }\n }\n\n getNestingDepth(itemId: number): number {\n const cached = this.depthCache.get(itemId)\n if (cached !== undefined) return cached\n\n let depth = 0\n let current = this.childToParent.get(itemId)\n while (current !== undefined) {\n depth++\n current = this.childToParent.get(current)\n }\n this.depthCache.set(itemId, depth)\n return depth\n }\n\n getMoveDelta(itemId: number, newStart: number): { itemId: number; newStart: number }[] {\n const item = this.itemMap.get(itemId)\n if (!item) return []\n\n const delta = newStart - item.start_time\n const descendants = this.getDescendants(itemId)\n return descendants.map(descId => {\n const desc = this.itemMap.get(descId)!\n return { itemId: descId, newStart: desc.start_time + delta }\n })\n }\n\n getResizeConstraint(itemId: number, edge: 'left' | 'right'): { min: number; max: number } {\n const children = this.getDescendants(itemId)\n if (children.length === 0) {\n return edge === 'left'\n ? { min: -Infinity, max: Infinity }\n : { min: -Infinity, max: Infinity }\n }\n\n if (edge === 'left') {\n let minChildStart = Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.start_time < minChildStart) {\n minChildStart = child.start_time\n }\n }\n return { min: -Infinity, max: minChildStart }\n } else {\n let maxChildEnd = -Infinity\n for (const childId of children) {\n const child = this.itemMap.get(childId)\n if (child && child.end_time > maxChildEnd) {\n maxChildEnd = child.end_time\n }\n }\n return { min: maxChildEnd, max: Infinity }\n }\n }\n}\n","import type { Item, ItemBounds, ItemState, DrawHelpers, TimelineTheme } from '../types'\n\nexport function defaultSummaryRenderer(\n ctx: CanvasRenderingContext2D,\n item: Item,\n bounds: ItemBounds,\n state: ItemState,\n _helpers: DrawHelpers,\n theme: TimelineTheme,\n): void {\n const { x, y, width, height } = bounds\n const color = theme.primary\n\n // Semi-transparent fill\n ctx.globalAlpha = 0.15\n ctx.fillStyle = color\n ctx.fillRect(x, y, width, height)\n ctx.globalAlpha = 1\n\n // Border\n ctx.strokeStyle = color\n ctx.lineWidth = 1.5\n ctx.strokeRect(x, y, width, height)\n\n // Diamond marker at start edge\n const diamondSize = Math.min(height * 0.5, 6)\n const midY = y + height / 2\n\n ctx.fillStyle = color\n // Left diamond\n ctx.beginPath()\n ctx.moveTo(x, midY)\n ctx.lineTo(x + diamondSize, midY - diamondSize)\n ctx.lineTo(x + diamondSize * 2, midY)\n ctx.lineTo(x + diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Right diamond\n ctx.beginPath()\n ctx.moveTo(x + width, midY)\n ctx.lineTo(x + width - diamondSize, midY - diamondSize)\n ctx.lineTo(x + width - diamondSize * 2, midY)\n ctx.lineTo(x + width - diamondSize, midY + diamondSize)\n ctx.closePath()\n ctx.fill()\n\n // Title text centered\n const title = (item as { title?: string }).title\n if (title && width > 30) {\n ctx.fillStyle = theme.item.text\n ctx.font = '500 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n const textWidth = ctx.measureText(title).width\n const maxTextWidth = width - diamondSize * 4 - 4\n if (maxTextWidth > 20) {\n const displayText = textWidth > maxTextWidth\n ? title.slice(0, Math.floor(title.length * maxTextWidth / textWidth)) + '...'\n : title\n ctx.fillText(displayText, x + width / 2 - Math.min(textWidth, maxTextWidth) / 2, midY)\n }\n }\n\n // Selected ring\n if (state.selected) {\n ctx.strokeStyle = theme.item.selectedRing\n ctx.lineWidth = 2\n ctx.strokeRect(x - 1, y - 1, width + 2, height + 2)\n }\n}\n","import type { Item, Group } from '../types'\nimport type { ViewState } from './ViewState'\nimport type { IntervalTree } from './IntervalTree'\nimport type { LayoutEngine } from './LayoutEngine'\n\nexport function hitTest(\n canvasX: number,\n canvasY: number,\n view: ViewState,\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n groups: Group[],\n): Item | null {\n const time = view.xToTime(canvasX)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const candidates = tree.query(time, time)\n\n let topItem: Item | null = null\n let topY = -Infinity\n\n for (const item of candidates) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n if (canvasX < x || canvasX > x + width) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const height = itemLayout.itemHeight\n\n if (canvasY < y || canvasY > y + height) continue\n\n if (y > topY) {\n topY = y\n topItem = item\n }\n }\n\n return topItem\n}\n\nexport function hitTestGroup(\n canvasY: number,\n view: ViewState,\n groups: Group[],\n): Group | null {\n const groupIndex = view.yToGroupIndex(canvasY)\n return groups[groupIndex] ?? null\n}\n\nexport function detectEdge(\n canvasX: number,\n item: Item,\n view: ViewState,\n threshold: number = 6,\n): 'left' | 'right' | 'body' {\n const leftX = view.timeToX(item.start_time)\n const rightX = view.timeToX(item.end_time)\n if (canvasX - leftX <= threshold) return 'left'\n if (rightX - canvasX <= threshold) return 'right'\n return 'body'\n}\n","/**\n * Resize the canvas buffer only when dimensions actually change.\n * Setting canvas.width/height is destructive (clears buffer + resets state),\n * so we avoid it unless necessary.\n */\nexport function setupCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n): CanvasRenderingContext2D {\n const dpr = window.devicePixelRatio || 1\n const targetW = Math.round(width * dpr)\n const targetH = Math.round(height * dpr)\n\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW\n canvas.height = targetH\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n }\n\n const ctx = canvas.getContext('2d')!\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n return ctx\n}\n\nexport function clearCanvas(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const dpr = window.devicePixelRatio || 1\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr)\n}\n\nexport type LayerName = 'grid' | 'items' | 'overlay'\n\nexport interface DirtyFlags {\n grid: boolean\n items: boolean\n overlay: boolean\n}\n\nexport class RenderScheduler {\n private dirty: DirtyFlags = { grid: false, items: false, overlay: false }\n private rafId: number | null = null\n private drawCallback: (flags: DirtyFlags) => void\n\n constructor(drawCallback: (flags: DirtyFlags) => void) {\n this.drawCallback = drawCallback\n }\n\n markDirty(layer: LayerName): void {\n this.dirty[layer] = true\n this.schedule()\n }\n\n markAllDirty(): void {\n this.dirty.grid = true\n this.dirty.items = true\n this.dirty.overlay = true\n this.schedule()\n }\n\n dispose(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private schedule(): void {\n if (this.rafId !== null) return\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null\n const flags = { ...this.dirty }\n this.dirty.grid = false\n this.dirty.items = false\n this.dirty.overlay = false\n this.drawCallback(flags)\n })\n }\n}\n","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport tz from 'dayjs/plugin/timezone'\n\ndayjs.extend(utc)\ndayjs.extend(tz)\n\nexport function toDayjs(ts: number, timezone?: string): dayjs.Dayjs {\n return timezone ? dayjs(ts).tz(timezone) : dayjs(ts)\n}\n","import { toDayjs } from '../utils/timezone'\nimport type { Group, TimelineTheme, DayStyle, RowStyle, TimeRangeHighlight } from '../types'\nimport type { ViewState } from '../core/ViewState'\n\nexport class GridLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n theme: TimelineTheme,\n dayStyle?: (date: Date) => DayStyle | null,\n rowStyle?: (group: Group) => RowStyle | null,\n highlights?: TimeRangeHighlight[],\n timezone?: string,\n ): void {\n const { firstVisible, lastVisible } = view.getVisibleGroupRange()\n\n // Draw row backgrounds\n for (let i = firstVisible; i <= lastVisible; i++) {\n const y = view.groupIndexToY(i)\n const rowHeight = view.groupIndexToHeight(i)\n const group = groups[i]\n if (!group) continue\n\n let bgColor: string\n const customRow = rowStyle?.(group)\n if (customRow?.backgroundColor) {\n bgColor = customRow.backgroundColor\n } else {\n bgColor = i % 2 === 0 ? '#FFFFFF' : theme.grid.rowAlt\n }\n\n ctx.fillStyle = bgColor\n ctx.fillRect(0, y, view.canvasWidth, rowHeight)\n\n // Row separator\n ctx.strokeStyle = customRow?.borderBottomColor ?? theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(view.canvasWidth, y + rowHeight)\n ctx.stroke()\n }\n\n // Draw time range highlight backgrounds (under grid lines)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n const opacity = h.opacity ?? 0.12\n const r = parseInt(h.color.slice(1, 3), 16)\n const g = parseInt(h.color.slice(3, 5), 16)\n const b = parseInt(h.color.slice(5, 7), 16)\n ctx.fillStyle = `rgb(${Math.round(r * opacity + 255 * (1 - opacity))},${Math.round(g * opacity + 255 * (1 - opacity))},${Math.round(b * opacity + 255 * (1 - opacity))})`\n ctx.fillRect(x, 0, w, view.canvasHeight)\n }\n }\n\n // Draw day columns, backgrounds, and vertical grid lines\n const visibleStart = view.visibleTimeStart\n const visibleEnd = view.visibleTimeEnd\n const visibleDuration = visibleEnd - visibleStart\n const dayMs = 86400000\n const dayPixelWidth = (dayMs / visibleDuration) * view.canvasWidth\n\n // Determine grid line interval based on zoom level\n let stepUnit: 'day' | 'week' | 'month' = 'day'\n if (dayPixelWidth < 2) stepUnit = 'month'\n else if (dayPixelWidth < 8) stepUnit = 'week'\n\n // Draw day backgrounds (dayStyle + weekends) — batch consecutive same-style days\n if (dayStyle || true) { // always draw weekends\n let current = toDayjs(visibleStart, timezone).startOf('day')\n const end = toDayjs(visibleEnd, timezone).endOf('day')\n\n // Batch: track current fill color and start x\n let batchColor: string | null = null\n let batchOpacity = 1\n let batchStartX = 0\n const customBorderLines: { x: number; color: string }[] = []\n\n const flushBatch = (endX: number) => {\n if (batchColor !== null) {\n ctx.fillStyle = batchColor\n if (batchOpacity !== 1) ctx.globalAlpha = batchOpacity\n ctx.fillRect(batchStartX, 0, endX - batchStartX, view.canvasHeight)\n if (batchOpacity !== 1) ctx.globalAlpha = 1\n batchColor = null\n batchOpacity = 1\n }\n }\n\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n\n const date = current.toDate()\n const custom = dayStyle?.(date)\n let color: string | null = null\n let opacity = 1\n\n if (custom?.backgroundColor) {\n color = custom.backgroundColor\n opacity = custom.opacity ?? 1\n } else {\n const dow = current.day()\n if (dow === 0 || dow === 6) {\n color = theme.grid.weekend\n }\n }\n\n // Collect custom border colors for later drawing\n if (custom?.borderColor) {\n customBorderLines.push({ x, color: custom.borderColor })\n }\n\n // Batch consecutive same-color fills\n if (color === batchColor && opacity === batchOpacity) {\n // extend batch\n } else {\n flushBatch(x)\n if (color !== null) {\n batchColor = color\n batchOpacity = opacity\n batchStartX = x\n }\n }\n\n current = current.add(1, 'day')\n }\n // Flush remaining batch\n if (batchColor !== null) {\n flushBatch(view.timeToX(current.valueOf()))\n }\n\n // Draw custom border lines from dayStyle\n for (const line of customBorderLines) {\n ctx.strokeStyle = line.color\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(line.x, 0)\n ctx.lineTo(line.x, view.canvasHeight)\n ctx.stroke()\n }\n }\n\n // Draw vertical grid lines at appropriate interval\n let current = toDayjs(visibleStart, timezone).startOf(stepUnit)\n const end = toDayjs(visibleEnd, timezone).add(1, stepUnit)\n\n ctx.strokeStyle = theme.grid.line\n ctx.lineWidth = 0.5\n ctx.beginPath()\n while (current.isBefore(end)) {\n const x = view.timeToX(current.valueOf())\n ctx.moveTo(x, 0)\n ctx.lineTo(x, view.canvasHeight)\n current = current.add(1, stepUnit)\n }\n ctx.stroke()\n\n // Draw time range highlight edge lines and labels (after grid lines so they render on top)\n if (highlights && highlights.length > 0) {\n for (const h of highlights) {\n const x1 = view.timeToX(h.start)\n const x2 = view.timeToX(h.end)\n if (x2 < 0 || x1 > view.canvasWidth) continue\n\n // Edge lines\n ctx.strokeStyle = h.color\n ctx.globalAlpha = 0.4\n ctx.lineWidth = 1\n ctx.beginPath()\n if (x1 >= 0 && x1 <= view.canvasWidth) {\n ctx.moveTo(x1, 0)\n ctx.lineTo(x1, view.canvasHeight)\n }\n if (x2 >= 0 && x2 <= view.canvasWidth) {\n ctx.moveTo(x2, 0)\n ctx.lineTo(x2, view.canvasHeight)\n }\n ctx.stroke()\n ctx.globalAlpha = 1\n\n // Label badge\n if (h.label) {\n const x = Math.max(0, x1)\n const w = Math.min(view.canvasWidth, x2) - x\n\n ctx.save()\n ctx.font = '600 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(h.label).width\n const padding = 6\n const badgeWidth = textWidth + padding * 2\n const badgeHeight = 18\n const badgeX = x + (w - badgeWidth) / 2\n const badgeY = 4\n\n ctx.fillStyle = h.color\n ctx.globalAlpha = 0.9\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.globalAlpha = 1\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n ctx.fillText(h.label, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n }\n}\n","import type { DrawHelpers, ItemBounds } from '../types'\n\nconst ITEM_FONT = '500 12px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\n/**\n * Creates a DrawHelpers object bound to the given canvas context and optional item bounds.\n * These helpers are passed to every itemRenderer call to simplify common canvas operations.\n */\nexport function createDrawHelpers(\n ctx: CanvasRenderingContext2D,\n bounds?: ItemBounds,\n): DrawHelpers {\n return {\n /**\n * Draws a filled rounded rectangle.\n * Default corner radius is 3px.\n */\n roundRect(x: number, y: number, w: number, h: number, radius = 3): void {\n ctx.beginPath()\n ctx.roundRect(x, y, w, h, radius)\n ctx.fill()\n },\n\n /**\n * Draws text at (x, y) using the standard item font.\n * If maxWidth is provided and the text is too wide, binary-search truncates it\n * and appends '...' so it fits within maxWidth.\n */\n fillText(text: string, x: number, y: number, maxWidth?: number): void {\n ctx.font = ITEM_FONT\n\n if (maxWidth !== undefined && ctx.measureText(text).width > maxWidth) {\n // Binary-search for the longest prefix that fits with '...' appended\n let lo = 0\n let hi = text.length\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2)\n const candidate = text.slice(0, mid) + '...'\n if (ctx.measureText(candidate).width <= maxWidth) {\n lo = mid\n } else {\n hi = mid - 1\n }\n }\n ctx.fillText(text.slice(0, lo) + '...', x, y)\n } else {\n ctx.fillText(text, x, y)\n }\n },\n\n /**\n * Creates a 50/50 linear gradient from color1 (0%–50%) to color2 (50%–100%)\n * spanning the given x position and width.\n */\n gradient(x: number, w: number, color1: string, color2: string): CanvasGradient {\n const grad = ctx.createLinearGradient(x, 0, x + w, 0)\n grad.addColorStop(0, color1)\n grad.addColorStop(0.5, color1)\n grad.addColorStop(0.5, color2)\n grad.addColorStop(1, color2)\n return grad\n },\n\n /**\n * Draws a vertical colored bar on the left edge of the item bounds.\n * Does nothing if no bounds were provided.\n */\n leftBar(color: string, width = 3): void {\n if (!bounds) return\n ctx.save()\n ctx.fillStyle = color\n ctx.fillRect(bounds.x, bounds.y, width, bounds.height)\n ctx.restore()\n },\n\n /**\n * Draws a vector icon centered at (x, y).\n * Supported types: 'check', 'danger-red', 'danger-yellow'.\n * Default size is 14px.\n */\n icon(type: 'check' | 'danger-red' | 'danger-yellow', x: number, y: number, size = 14): void {\n ctx.save()\n const half = size / 2\n\n if (type === 'check') {\n // Green circle with white checkmark\n ctx.fillStyle = '#31c48d'\n ctx.beginPath()\n ctx.arc(x + half, y + half, half, 0, Math.PI * 2)\n ctx.fill()\n\n // Draw checkmark path\n ctx.strokeStyle = '#ffffff'\n ctx.lineWidth = size * 0.12\n ctx.beginPath()\n const cx = x + half\n const cy = y + half\n ctx.moveTo(cx - half * 0.45, cy)\n ctx.lineTo(cx - half * 0.1, cy + half * 0.42)\n ctx.lineTo(cx + half * 0.45, cy - half * 0.35)\n ctx.stroke()\n } else if (type === 'danger-red' || type === 'danger-yellow') {\n const fillColor = type === 'danger-red' ? '#EF5350' : '#FBBF24'\n\n // Triangle background\n ctx.fillStyle = fillColor\n ctx.beginPath()\n ctx.moveTo(x + half, y) // top-center\n ctx.lineTo(x + size, y + size) // bottom-right\n ctx.lineTo(x, y + size) // bottom-left\n ctx.closePath()\n ctx.fill()\n\n // Exclamation mark stem\n ctx.fillStyle = '#ffffff'\n const stemW = size * 0.12\n const stemX = x + half - stemW / 2\n ctx.fillRect(stemX, y + size * 0.35, stemW, size * 0.35)\n\n // Exclamation mark dot\n ctx.beginPath()\n ctx.arc(x + half, y + size * 0.82, stemW * 0.7, 0, Math.PI * 2)\n ctx.fill()\n }\n\n ctx.restore()\n },\n\n /**\n * Draws a pill-shaped badge with centered white text on a colored background.\n */\n badge(text: string, x: number, y: number, bgColor: string): void {\n ctx.save()\n\n // Measure text to size the pill\n ctx.font = ITEM_FONT\n const textMetrics = ctx.measureText(text)\n const textWidth = textMetrics.width\n const paddingH = 8\n const paddingV = 3\n const pillHeight = 12 + paddingV * 2\n const pillWidth = textWidth + paddingH * 2\n const radius = pillHeight / 2\n\n // Draw pill background\n ctx.fillStyle = bgColor\n ctx.beginPath()\n ctx.roundRect(x, y, pillWidth, pillHeight, radius)\n ctx.fill()\n\n // Draw centered white text\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, x + pillWidth / 2, y + pillHeight / 2)\n\n ctx.restore()\n },\n }\n}\n","import type {\n Item, Group, TimelineTheme, CanvasItemRenderer, CanvasGroupItemRenderer,\n Dependency, ItemBounds, ItemState,\n} from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { IntervalTree } from '../core/IntervalTree'\nimport type { LayoutEngine } from '../core/LayoutEngine'\nimport type { HierarchyEngine } from '../core/HierarchyEngine'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport class ItemsLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n groups: Group[],\n items: Item[],\n tree: IntervalTree<Item>,\n layout: LayoutEngine,\n itemRenderer: CanvasItemRenderer,\n groupRenderer: CanvasGroupItemRenderer | undefined,\n theme: TimelineTheme,\n selected: number[],\n hoveredItemId: number | undefined,\n dependencies?: Dependency[],\n summaryRenderer?: CanvasItemRenderer,\n hierarchy?: HierarchyEngine,\n ): void {\n // Query only visible time range + small padding (not the full 4x buffer)\n const padding = (view.visibleTimeEnd - view.visibleTimeStart) * 0.1\n const queryStart = view.visibleTimeStart - padding\n const queryEnd = view.visibleTimeEnd + padding\n const visibleItems = tree.query(queryStart, queryEnd)\n\n const groupIndexMap = new Map<string | number, number>()\n for (let i = 0; i < groups.length; i++) {\n groupIndexMap.set(groups[i].id, i)\n }\n\n const selectedSet = new Set(selected)\n const itemBoundsMap = new Map<number, ItemBounds>()\n\n // Vertical culling bounds\n const yMin = -view.lineHeight\n const yMax = view.canvasHeight + view.lineHeight\n\n for (const item of visibleItems) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n\n const itemLayout = layout.getLayout(item.id)\n if (!itemLayout) continue\n\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n\n // Skip items that are entirely off-screen vertically\n const height = itemLayout.itemHeight\n if (y + height < yMin || y > yMax) continue\n\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n\n const bounds: ItemBounds = { x, y, width, height }\n itemBoundsMap.set(item.id, bounds)\n\n const state: ItemState = {\n selected: selectedSet.has(item.id),\n hovered: hoveredItemId === item.id,\n dragging: false,\n filtered: item.filtered !== false,\n }\n\n ctx.save()\n const helpers = createDrawHelpers(ctx, bounds)\n let renderer: CanvasItemRenderer\n if (summaryRenderer && hierarchy?.isParent(item.id)) {\n renderer = summaryRenderer\n } else if (groupRenderer && (item.type === 'control_area_group' || item.type === 'construction_train')) {\n renderer = groupRenderer\n } else {\n renderer = itemRenderer\n }\n renderer(ctx, item, bounds, state, helpers)\n ctx.restore()\n }\n\n if (dependencies && dependencies.length > 0) {\n // Build a full item map for dependency endpoint lookup (off-screen items too)\n const depItemIds = new Set<number>()\n for (const dep of dependencies) {\n if (!itemBoundsMap.has(dep.fromItemId)) depItemIds.add(dep.fromItemId)\n if (!itemBoundsMap.has(dep.toItemId)) depItemIds.add(dep.toItemId)\n }\n if (depItemIds.size > 0) {\n const itemMap = new Map<number, Item>()\n for (const item of items) {\n if (depItemIds.has(item.id)) itemMap.set(item.id, item)\n }\n for (const [id, item] of itemMap) {\n const groupIndex = groupIndexMap.get(item.group)\n if (groupIndex === undefined) continue\n const itemLayout = layout.getLayout(id)\n if (!itemLayout) continue\n const groupY = view.groupIndexToY(groupIndex)\n const y = groupY + itemLayout.stackLevel * view.lineHeight + (view.lineHeight - itemLayout.itemHeight) / 2\n const x = view.timeToX(item.start_time)\n const width = view.timeToX(item.end_time) - x\n itemBoundsMap.set(id, { x, y, width, height: itemLayout.itemHeight })\n }\n }\n this.drawDependencies(ctx, dependencies, itemBoundsMap, hoveredItemId, theme)\n }\n }\n\n private drawDependencies(\n ctx: CanvasRenderingContext2D,\n dependencies: Dependency[],\n boundsMap: Map<number, ItemBounds>,\n hoveredItemId: number | undefined,\n theme: TimelineTheme,\n ): void {\n for (const dep of dependencies) {\n const fromBounds = boundsMap.get(dep.fromItemId)\n const toBounds = boundsMap.get(dep.toItemId)\n if (!fromBounds || !toBounds) continue\n\n const isHighlighted = hoveredItemId === dep.fromItemId || hoveredItemId === dep.toItemId\n\n ctx.strokeStyle = isHighlighted ? theme.primary : (dep.color ?? '#94A3B8')\n ctx.lineWidth = isHighlighted ? 2 : 1.5\n ctx.setLineDash([])\n\n const startX = fromBounds.x + fromBounds.width\n const startY = fromBounds.y + fromBounds.height / 2\n const endX = toBounds.x\n const endY = toBounds.y + toBounds.height / 2\n\n const dx = Math.abs(endX - startX)\n const cpOffset = Math.max(dx * 0.4, 30)\n\n ctx.beginPath()\n ctx.moveTo(startX, startY)\n ctx.bezierCurveTo(startX + cpOffset, startY, endX - cpOffset, endY, endX, endY)\n ctx.stroke()\n\n // Arrowhead\n const arrowSize = 6\n ctx.fillStyle = ctx.strokeStyle\n ctx.beginPath()\n ctx.moveTo(endX, endY)\n ctx.lineTo(endX - arrowSize, endY - arrowSize / 2)\n ctx.lineTo(endX - arrowSize, endY + arrowSize / 2)\n ctx.closePath()\n ctx.fill()\n }\n }\n}\n","import type { TimelineTheme, MarkerConfig, ItemBounds, Item, CanvasItemRenderer } from '../types'\nimport type { ViewState } from '../core/ViewState'\nimport type { InteractionMode } from '../interaction/InteractionHandler'\nimport { createDrawHelpers } from './DrawHelpers'\n\nexport interface InteractionRenderState {\n item: Item\n mode: InteractionMode\n bounds: ItemBounds\n renderer: CanvasItemRenderer\n targetGroupY?: number\n groupChanged?: boolean\n}\n\nexport interface OverlayDrawOptions {\n cursorX: number | null\n snapX?: number | null\n markers?: MarkerConfig[]\n\n interaction?: InteractionRenderState | null\n}\n\nexport class OverlayLayer {\n draw(\n ctx: CanvasRenderingContext2D,\n view: ViewState,\n theme: TimelineTheme,\n options: OverlayDrawOptions,\n ): void {\n const { cursorX, snapX, markers, interaction } = options\n\n // Draw markers\n if (markers) {\n for (const marker of markers) {\n const x = view.timeToX(marker.date)\n\n ctx.fillStyle = marker.color\n ctx.fillRect(x - marker.width / 2, 0, marker.width, view.canvasHeight)\n\n if (marker.label) {\n ctx.save()\n ctx.font = '500 10px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n const textWidth = ctx.measureText(marker.label).width\n const padding = 8\n const maxBadgeWidth = 200\n const badgeWidth = Math.min(textWidth + padding * 2, maxBadgeWidth)\n const badgeHeight = 20\n const badgeX = x - badgeWidth / 2\n const badgeY = 4\n\n ctx.fillStyle = marker.color\n ctx.beginPath()\n ctx.roundRect(badgeX, badgeY, badgeWidth, badgeHeight, 3)\n ctx.fill()\n\n ctx.fillStyle = '#FFFFFF'\n ctx.textBaseline = 'middle'\n const maxTextWidth = maxBadgeWidth - padding * 2\n const displayText = textWidth > maxTextWidth\n ? marker.label.slice(0, Math.floor(marker.label.length * maxTextWidth / textWidth)) + '…'\n : marker.label\n ctx.fillText(displayText, badgeX + padding, badgeY + badgeHeight / 2)\n ctx.restore()\n }\n }\n }\n\n // Draw cursor line\n if (cursorX !== null && cursorX !== undefined) {\n ctx.strokeStyle = theme.marker.cursor\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(cursorX, 0)\n ctx.lineTo(cursorX, view.canvasHeight)\n ctx.stroke()\n }\n\n // Draw snap guide line\n if (snapX !== null && snapX !== undefined) {\n ctx.strokeStyle = theme.primary\n ctx.lineWidth = 1\n ctx.setLineDash([4, 4])\n ctx.beginPath()\n ctx.moveTo(snapX, 0)\n ctx.lineTo(snapX, view.canvasHeight)\n ctx.stroke()\n ctx.setLineDash([])\n }\n\n // Draw interaction ghost (move, resize-left, resize-right)\n if (interaction) {\n // Group highlight band when moving to a different group\n if (interaction.groupChanged && interaction.targetGroupY !== undefined) {\n ctx.fillStyle = 'rgba(59, 130, 246, 0.08)'\n ctx.fillRect(0, interaction.targetGroupY, view.canvasWidth, view.lineHeight)\n }\n\n ctx.save()\n ctx.globalAlpha = 0.5\n const helpers = createDrawHelpers(ctx, interaction.bounds)\n interaction.renderer(\n ctx, interaction.item, interaction.bounds,\n { selected: false, hovered: false, dragging: true, filtered: true },\n helpers,\n )\n ctx.restore()\n }\n }\n}\n","const MAX_DELTA = 120\n\n/**\n * Normalize wheel delta across browsers/platforms.\n * deltaMode 0 = pixels, 1 = lines (×15), 2 = pages (×800).\n * Clamp to ±120 to prevent erratic jumps.\n */\nfunction normalizeDelta(e: WheelEvent): number {\n let delta = e.deltaY || e.deltaX\n if (e.deltaMode === 1) delta *= 15\n else if (e.deltaMode === 2) delta *= 800\n return Math.max(-MAX_DELTA, Math.min(MAX_DELTA, delta))\n}\n\nexport class ZoomHandler {\n private onZoom: (newStart: number, newEnd: number) => void\n private visibleTimeStart: number\n private visibleTimeEnd: number\n private minZoom: number\n private maxZoom: number\n\n constructor(\n onZoom: (newStart: number, newEnd: number) => void,\n visibleTimeStart: number,\n visibleTimeEnd: number,\n minZoom: number,\n maxZoom: number,\n ) {\n this.onZoom = onZoom\n this.visibleTimeStart = visibleTimeStart\n this.visibleTimeEnd = visibleTimeEnd\n this.minZoom = minZoom\n this.maxZoom = maxZoom\n }\n\n updateBounds(start: number, end: number): void {\n this.visibleTimeStart = start\n this.visibleTimeEnd = end\n }\n\n handleWheelZoom(e: WheelEvent, cursorRatio: number): void {\n const delta = normalizeDelta(e)\n // Speed: ctrlKey (trackpad pinch) = 10, metaKey = 3, altKey = 1\n const speed = e.ctrlKey ? 10 : e.metaKey ? 3 : 1\n\n // Reciprocal formula for symmetric zoom-in / zoom-out\n const scale = delta > 0\n ? 1.0 + (speed * delta) / 500\n : 1.0 / (1.0 + (speed * -delta) / 500)\n\n const currentDuration = this.visibleTimeEnd - this.visibleTimeStart\n let newDuration = Math.round(currentDuration * scale)\n newDuration = Math.max(this.minZoom, Math.min(this.maxZoom, newDuration))\n\n const newStart = Math.round(this.visibleTimeStart + (currentDuration - newDuration) * cursorRatio)\n const newEnd = newStart + newDuration\n\n this.onZoom(newStart, newEnd)\n }\n}\n","import type { Item } from '../types'\n\nconst ACTIVATION_THRESHOLD = 4\n\nexport type InteractionMode = 'move' | 'resize-left' | 'resize-right'\n\nexport interface InteractionState {\n item: Item\n mode: InteractionMode\n startX: number\n startY: number\n currentX: number\n currentY: number\n deltaX: number\n originalGroup: string | number\n currentGroup: string | number\n}\n\nexport class InteractionHandler {\n private state: InteractionState | null = null\n private dragSnap: number\n private activated = false\n\n constructor(dragSnap: number) {\n this.dragSnap = dragSnap\n }\n\n startInteraction(item: Item, mode: InteractionMode, x: number, y: number): void {\n this.state = {\n item, mode, startX: x, startY: y, currentX: x, currentY: y,\n deltaX: 0, originalGroup: item.group, currentGroup: item.group,\n }\n this.activated = false\n }\n\n update(x: number, y: number): void {\n if (!this.state) return\n this.state.currentX = x\n this.state.currentY = y\n this.state.deltaX = x - this.state.startX\n if (!this.activated && Math.abs(this.state.deltaX) >= ACTIVATION_THRESHOLD) {\n this.activated = true\n }\n }\n\n setCurrentGroup(groupId: string | number): void {\n if (this.state) this.state.currentGroup = groupId\n }\n\n endMove(pixelsPerMs: number): { newStartTime: number; newGroupId: string | number } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const newStartTime = this.state.item.start_time + deltaMs\n const snapped = Math.round(newStartTime / this.dragSnap) * this.dragSnap\n const newGroupId = this.state.currentGroup\n this.state = null\n this.activated = false\n return { newStartTime: snapped, newGroupId }\n }\n\n endResize(pixelsPerMs: number): { newTime: number; edge: 'left' | 'right' } | null {\n if (!this.state) return null\n const deltaMs = this.state.deltaX / pixelsPerMs\n const edge = this.state.mode === 'resize-left' ? 'left' as const : 'right' as const\n const baseTime = edge === 'left' ? this.state.item.start_time : this.state.item.end_time\n const newTime = baseTime + deltaMs\n const snapped = Math.round(newTime / this.dragSnap) * this.dragSnap\n this.state = null\n this.activated = false\n return { newTime: snapped, edge }\n }\n\n cancel(): void {\n this.state = null\n this.activated = false\n }\n\n getState(): InteractionState | null {\n return this.state\n }\n\n getMode(): InteractionMode | null {\n return this.state?.mode ?? null\n }\n\n isActive(): boolean {\n return this.state !== null && this.activated\n }\n\n isPending(): boolean {\n return this.state !== null\n }\n}\n","interface SnapItem {\n id: number\n start_time: number\n end_time: number\n}\n\n/**\n * Collect start and end X positions from all items except the dragged item.\n */\nexport function collectItemEdges(\n items: SnapItem[],\n excludeItemId: number,\n timeToX: (time: number) => number,\n): number[] {\n const edges: number[] = []\n for (const item of items) {\n if (item.id === excludeItemId) continue\n edges.push(timeToX(item.start_time))\n edges.push(timeToX(item.end_time))\n }\n return edges\n}\n\n/**\n * Find the best snap target from a list of edge X positions.\n * Returns the snapped X position if an edge is within threshold, or null to fall back to time-grid snap.\n */\nexport function findSnapTarget(\n currentX: number,\n edgeXPositions: number[],\n thresholdPx: number,\n _pixelsPerMs: number,\n _dragSnap: number,\n): number | null {\n if (edgeXPositions.length === 0) return null\n\n let closestX = edgeXPositions[0]\n let closestDist = Math.abs(currentX - closestX)\n\n for (let i = 1; i < edgeXPositions.length; i++) {\n const dist = Math.abs(currentX - edgeXPositions[i])\n if (dist < closestDist) {\n closestDist = dist\n closestX = edgeXPositions[i]\n }\n }\n\n if (closestDist <= thresholdPx) {\n return closestX\n }\n\n return null\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){\"use strict\";var e=\"day\";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf(\"year\"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,\"week\")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return\"isoweek\"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf(\"day\"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf(\"day\"):n.bind(this)(e,t)}}}));","import React, { useRef, useCallback, useEffect, useMemo } from 'react'\nimport type { Group, TimelineTheme } from '../types'\n\ninterface SidebarProps {\n groups: Group[]\n width: number\n lineHeight: number\n groupHeights?: number[]\n scrollTop: number\n canvasHeight: number\n theme: TimelineTheme\n groupRenderer: (group: Group) => React.ReactNode\n onScroll: (scrollTop: number) => void\n}\n\nconst OVERSCAN_PX = 200\n\nexport function Sidebar({\n groups, width, lineHeight, groupHeights, scrollTop, canvasHeight, theme, groupRenderer, onScroll,\n}: SidebarProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const isScrollingRef = useRef(false)\n\n // Cumulative top-edge offsets per group: length = groups.length + 1.\n const offsets = useMemo(() => {\n const arr = new Array<number>(groups.length + 1)\n arr[0] = 0\n for (let i = 0; i < groups.length; i++) {\n arr[i + 1] = arr[i] + (groupHeights?.[i] ?? lineHeight)\n }\n return arr\n }, [groups.length, groupHeights, lineHeight])\n\n const totalHeight = offsets[groups.length] ?? 0\n const displayHeight = canvasHeight\n\n // Binary search for the group containing a given y; clamped to [0, groups.length - 1].\n const groupAtY = useCallback((y: number): number => {\n if (groups.length === 0) return 0\n if (y <= 0) return 0\n if (y >= totalHeight) return groups.length - 1\n let lo = 0\n let hi = groups.length - 1\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (offsets[mid + 1] > y) hi = mid\n else lo = mid + 1\n }\n return lo\n }, [groups.length, offsets, totalHeight])\n\n const firstVisible = groupAtY(scrollTop - OVERSCAN_PX)\n const lastVisible = groupAtY(scrollTop + canvasHeight + OVERSCAN_PX)\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n if (isScrollingRef.current) return\n onScroll(e.currentTarget.scrollTop)\n }, [onScroll])\n\n useEffect(() => {\n if (containerRef.current) {\n isScrollingRef.current = true\n containerRef.current.scrollTop = scrollTop\n requestAnimationFrame(() => { isScrollingRef.current = false })\n }\n }, [scrollTop])\n\n const visibleGroups = []\n for (let i = firstVisible; i <= lastVisible; i++) {\n const group = groups[i]\n if (!group) continue\n const top = offsets[i]\n const height = offsets[i + 1] - top\n visibleGroups.push(\n <div\n key={group.id}\n style={{\n position: 'absolute',\n top,\n height,\n width: '100%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n borderBottom: `1px solid ${theme.grid?.line ?? '#E5E5E5'}`,\n boxSizing: 'border-box',\n }}\n >\n {groupRenderer(group)}\n </div>,\n )\n }\n\n return (\n <div\n ref={containerRef}\n onScroll={handleScroll}\n style={{\n width,\n height: displayHeight,\n overflowY: totalHeight > canvasHeight ? 'auto' : 'hidden',\n overflowX: 'hidden',\n position: 'relative',\n borderRight: `1px solid ${theme.sidebar.border}`,\n backgroundColor: theme.sidebar.bg,\n }}\n >\n <div style={{ height: totalHeight, position: 'relative' }}>{visibleGroups}</div>\n </div>\n )\n}\n","import type { MarkerConfig } from '../types'\n\ninterface TodayMarkerProps {\n color?: string\n width?: number\n label?: string\n /** Auto-update interval in ms. Default 10000 (10s). Set 0 to disable. */\n interval?: number\n}\n\nexport function TodayMarker(_props: TodayMarkerProps) { return null }\nTodayMarker.displayName = 'TodayMarker'\n\nexport function getTodayMarkerConfig(props: TodayMarkerProps): MarkerConfig {\n // Snap to current minute to avoid unnecessary redraws\n const now = Math.floor(Date.now() / 60000) * 60000\n return { date: now, color: props.color ?? '#FD7171', width: props.width ?? 6, label: props.label }\n}\n\nexport function getTodayMarkerInterval(props: TodayMarkerProps): number {\n return props.interval ?? 10000\n}\n","import type { MarkerConfig } from '../types'\n\ninterface CustomMarkerProps {\n date: number\n color?: string\n width?: number\n label?: string\n}\n\nexport function CustomMarker(_props: CustomMarkerProps) { return null }\nCustomMarker.displayName = 'CustomMarker'\n\nexport function getCustomMarkerConfig(props: CustomMarkerProps): MarkerConfig {\n return {\n date: props.date,\n color: props.color ?? '#3B82F6',\n width: props.width ?? 4,\n label: props.label,\n }\n}\n","import React, { useRef, useEffect, useState, useCallback, useMemo, useImperativeHandle, forwardRef } from 'react'\nimport { flushSync } from 'react-dom'\nimport type {\n CanvasTimelineProps,\n CanvasTimelineRef,\n MarkerConfig,\n TimelineTheme,\n Item,\n ItemBounds,\n ItemState,\n DrawHelpers,\n} from './types'\nimport { DEFAULT_THEME } from './types'\nimport { ViewState } from './core/ViewState'\nimport { IntervalTree } from './core/IntervalTree'\nimport { LayoutEngine } from './core/LayoutEngine'\nimport { HierarchyEngine } from './core/HierarchyEngine'\nimport { defaultSummaryRenderer } from './canvas/defaultSummaryRenderer'\nimport { hitTest, hitTestGroup } from './core/HitTest'\nimport { setupCanvas, clearCanvas, RenderScheduler } from './canvas/CanvasManager'\nimport { GridLayer } from './canvas/GridLayer'\nimport { ItemsLayer } from './canvas/ItemsLayer'\nimport { OverlayLayer } from './canvas/OverlayLayer'\nimport { ZoomHandler } from './interaction/ZoomHandler'\nimport { InteractionHandler } from './interaction/InteractionHandler'\nimport type { InteractionMode } from './interaction/InteractionHandler'\nimport { findSnapTarget, collectItemEdges } from './interaction/snapUtils'\nimport { detectEdge } from './core/HitTest'\nimport dayjs from 'dayjs'\nimport isoWeek from 'dayjs/plugin/isoWeek'\nimport { toDayjs } from './utils/timezone'\nimport { Sidebar } from './dom/Sidebar'\nimport { getTodayMarkerConfig, getTodayMarkerInterval } from './dom/TodayMarker'\nimport { getCustomMarkerConfig } from './dom/CustomMarker'\n\ndayjs.extend(isoWeek)\n\nfunction mergeTheme(partial?: Partial<TimelineTheme>): TimelineTheme {\n if (!partial) return DEFAULT_THEME\n return {\n ...DEFAULT_THEME,\n ...partial,\n status: { ...DEFAULT_THEME.status, ...partial.status },\n grid: { ...DEFAULT_THEME.grid, ...partial.grid },\n item: { ...DEFAULT_THEME.item, ...partial.item },\n marker: { ...DEFAULT_THEME.marker, ...partial.marker },\n sidebar: { ...DEFAULT_THEME.sidebar, ...partial.sidebar },\n header: { ...DEFAULT_THEME.header, ...partial.header },\n }\n}\n\nconst HEADER_THROTTLE_MS = 32\n\nexport const CanvasTimeline = React.memo(forwardRef<CanvasTimelineRef, CanvasTimelineProps>(function CanvasTimeline(props, ref) {\n const {\n groups,\n items,\n defaultTimeStart,\n defaultTimeEnd,\n sidebarWidth,\n lineHeight,\n itemHeightRatio,\n stackItems,\n canMove,\n canChangeGroup,\n canResize,\n dragSnap,\n minZoom,\n maxZoom,\n theme: themePartial,\n dayStyle,\n rowStyle,\n showCursorLine,\n itemRenderer,\n groupRenderer,\n sidebarGroupRenderer,\n dependencies,\n highlights,\n onItemClick,\n onItemDoubleClick,\n onItemContextMenu,\n onItemMove,\n onItemResize,\n moveResizeValidator,\n onItemHover,\n onCanvasDoubleClick,\n onCanvasContextMenu,\n onTimeChange,\n onZoom,\n selected: selectedProp = [],\n rightSidebarWidth,\n rightSidebarGroupRenderer,\n onReady,\n maxHeight,\n timezone,\n devBadge,\n children,\n } = props\n\n const theme = useMemo(() => mergeTheme(themePartial), [themePartial])\n\n const getGroupIndex = useCallback((groupId: string | number, grps: typeof groups) => {\n for (let i = 0; i < grps.length; i++) {\n if (grps[i].id === groupId) return i\n }\n return 0\n }, [])\n\n const selectedKey = selectedProp.join(',')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const selected = useMemo(() => selectedProp, [selectedKey])\n\n const gridCanvasRef = useRef<HTMLCanvasElement>(null)\n const itemsCanvasRef = useRef<HTMLCanvasElement>(null)\n const overlayCanvasRef = useRef<HTMLCanvasElement>(null)\n const interactionRef = useRef<HTMLDivElement>(null)\n const outerRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const [containerWidth, setContainerWidth] = useState(800)\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null)\n\n useEffect(() => {\n const container = outerRef.current\n if (!container) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n setContainerWidth(entry.contentRect.width)\n }\n })\n obs.observe(container)\n return () => obs.disconnect()\n }, [])\n\n // Measure actual resolved height of the body container (handles CSS calc values)\n useEffect(() => {\n const el = containerRef.current\n if (!el || !maxHeight) return\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) setMeasuredHeight(entry.contentRect.height)\n })\n obs.observe(el)\n return () => obs.disconnect()\n }, [maxHeight])\n\n const canvasWidth = Math.max(0, containerWidth - sidebarWidth - (rightSidebarWidth ?? 0))\n\n // --- CORE DATA STRUCTURES ---\n const hierarchyEngine = useMemo(() => {\n const engine = new HierarchyEngine()\n engine.rebuild(items)\n return engine\n }, [items])\n\n const intervalTree = useMemo(() => {\n const tree = new IntervalTree<(typeof items)[0]>()\n tree.buildFromItems(\n items,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).start,\n (i) => hierarchyEngine.getEffectiveSpan(i.id).end,\n )\n return tree\n }, [items, hierarchyEngine])\n\n const layoutEngine = useMemo(() => {\n const engine = new LayoutEngine(lineHeight, itemHeightRatio)\n engine.computeLayout(items, stackItems, hierarchyEngine)\n return engine\n }, [items, lineHeight, itemHeightRatio, stackItems, hierarchyEngine])\n\n const groupHeights = useMemo(\n () => groups.map((g) => layoutEngine.getGroupHeight(g.id)),\n [groups, layoutEngine],\n )\n const totalHeight = useMemo(\n () => groupHeights.reduce((a, b) => a + b, 0),\n [groupHeights],\n )\n const resolvedMaxHeight = typeof maxHeight === 'number' ? maxHeight : measuredHeight\n const canvasHeight = resolvedMaxHeight ? Math.min(totalHeight, resolvedMaxHeight) : totalHeight\n\n // --- MUTABLE VIEW STATE (hot path) ---\n const viewStateRef = useRef<ViewState>(\n new ViewState({\n visibleTimeStart: props.visibleTimeStart ?? defaultTimeStart,\n visibleTimeEnd: props.visibleTimeEnd ?? defaultTimeEnd,\n canvasWidth,\n canvasHeight,\n sidebarWidth,\n lineHeight,\n groupCount: groups.length,\n buffer: props.buffer ?? 3,\n scrollTop: 0,\n groupHeights,\n }),\n )\n\n const cursorXRef = useRef<number | null>(null)\n const hoveredItemIdRef = useRef<number | undefined>(undefined)\n\n // --- PAN STATE ---\n const panRef = useRef<{ startX: number; startY: number; lastX: number; lastY: number } | null>(null)\n const didPanRef = useRef(false)\n const PAN_THRESHOLD = 4\n\n // --- THROTTLED HEADER STATE ---\n const [headerTimeStart, setHeaderTimeStart] = useState(props.visibleTimeStart ?? defaultTimeStart)\n const [headerTimeEnd, setHeaderTimeEnd] = useState(props.visibleTimeEnd ?? defaultTimeEnd)\n const [sidebarScrollTop, setSidebarScrollTop] = useState(0)\n const headerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const syncHeaderState = useCallback(() => {\n const vs = viewStateRef.current\n setHeaderTimeStart(vs.visibleTimeStart)\n setHeaderTimeEnd(vs.visibleTimeEnd)\n setSidebarScrollTop(vs.scrollTop)\n headerTimerRef.current = null\n }, [])\n\n const scheduleHeaderSync = useCallback(() => {\n if (headerTimerRef.current !== null) return\n headerTimerRef.current = setTimeout(syncHeaderState, HEADER_THROTTLE_MS)\n }, [syncHeaderState])\n\n useEffect(() => {\n return () => { if (headerTimerRef.current !== null) clearTimeout(headerTimerRef.current) }\n }, [])\n\n const resolvedSummaryRenderer = useMemo(() => {\n if (props.summaryRenderer) return props.summaryRenderer\n return (ctx: CanvasRenderingContext2D, item: Item, bounds: ItemBounds, state: ItemState, helpers: DrawHelpers) => {\n defaultSummaryRenderer(ctx, item, bounds, state, helpers, theme)\n }\n }, [props.summaryRenderer, theme])\n\n const gridLayer = useMemo(() => new GridLayer(), [])\n const itemsLayer = useMemo(() => new ItemsLayer(), [])\n const overlayLayer = useMemo(() => new OverlayLayer(), [])\n const interactionHandler = useMemo(() => new InteractionHandler(dragSnap), [dragSnap])\n\n // --- MARKERS ---\n const markerConfigs = useMemo(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n return configs\n }, [children])\n const markersKey = useMemo(() => markerConfigs.map(m => `${m.date}|${m.color}|${m.width}|${m.label ?? ''}`).join(';'), [markerConfigs])\n const markersRef = useRef(markerConfigs)\n markersRef.current = markerConfigs\n\n // TodayMarker auto-update: refresh overlay on interval\n const todayMarkerInterval = useMemo(() => {\n let interval = 0\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n interval = getTodayMarkerInterval(child.props as { interval?: number })\n }\n })\n return interval\n }, [children])\n\n // --- PROPS REF ---\n const propsRef = useRef({\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n })\n propsRef.current = {\n groups, items, intervalTree, layoutEngine, itemRenderer, groupRenderer,\n theme, selected, dependencies, highlights, dayStyle, rowStyle, showCursorLine,\n canvasWidth, canvasHeight, lineHeight, itemHeightRatio,\n onTimeChange, onZoom, onItemHover, onItemClick, onItemDoubleClick,\n onItemContextMenu, onItemMove, onItemResize, onCanvasDoubleClick, onCanvasContextMenu,\n canMove, canResize, canChangeGroup, dragSnap, sidebarWidth, moveResizeValidator,\n summaryRenderer: resolvedSummaryRenderer, hierarchyEngine, timezone,\n }\n\n // --- DRAW FUNCTIONS ---\n const drawGrid = useCallback(() => {\n const canvas = gridCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n gridLayer.draw(ctx, viewStateRef.current, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n }, [gridLayer])\n\n const drawItems = useCallback(() => {\n const canvas = itemsCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n itemsLayer.draw(\n ctx, viewStateRef.current, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, hoveredItemIdRef.current, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n }, [itemsLayer])\n\n const calculateSnapX = useCallback((item: (typeof items)[0], deltaX: number, mode: InteractionMode) => {\n const vs = viewStateRef.current\n const p = propsRef.current\n const pixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n\n // Determine which edges of the dragged item to check\n const draggedEdgeXs: number[] = []\n if (mode === 'move') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n } else if (mode === 'resize-left') {\n draggedEdgeXs.push(vs.timeToX(item.start_time + deltaMs))\n } else {\n draggedEdgeXs.push(vs.timeToX(item.end_time + deltaMs))\n }\n\n // Collect other items' edges\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, item.id, (t) => vs.timeToX(t))\n\n // Check each dragged edge against other items' edges\n for (const edgeX of draggedEdgeXs) {\n const snapX = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (snapX !== null) return snapX\n }\n\n // Fall back to time grid snap — snap the edge being dragged, not the start\n const edgeTime = mode === 'resize-right'\n ? item.end_time + deltaMs\n : item.start_time + deltaMs\n const snapped = Math.round(edgeTime / p.dragSnap) * p.dragSnap\n return vs.timeToX(snapped)\n }, [])\n\n const drawOverlay = useCallback(() => {\n const canvas = overlayCanvasRef.current\n if (!canvas) return\n const p = propsRef.current\n const ctx = setupCanvas(canvas, p.canvasWidth, p.canvasHeight)\n clearCanvas(ctx, canvas)\n\n const vs = viewStateRef.current\n const state = interactionHandler.getState()\n let interactionRender = null\n if (state) {\n const origX = vs.timeToX(state.item.start_time)\n const origWidth = vs.timeToX(state.item.end_time) - origX\n let x: number, width: number\n if (state.mode === 'resize-left') {\n x = origX + state.deltaX\n width = origWidth - state.deltaX\n } else if (state.mode === 'resize-right') {\n x = origX\n width = origWidth + state.deltaX\n } else {\n // move\n x = origX + state.deltaX\n width = origWidth\n }\n const groupIndex = getGroupIndex(state.currentGroup, p.groups)\n const targetGroupY = vs.groupIndexToY(groupIndex)\n const groupChanged = state.currentGroup !== state.originalGroup\n interactionRender = {\n item: state.item,\n mode: state.mode,\n bounds: { x, y: targetGroupY + (p.lineHeight - p.lineHeight * p.itemHeightRatio) / 2, width, height: p.lineHeight * p.itemHeightRatio },\n renderer: p.itemRenderer,\n targetGroupY,\n groupChanged,\n }\n }\n\n overlayLayer.draw(ctx, vs, p.theme, {\n cursorX: p.showCursorLine ? cursorXRef.current : null,\n snapX: state ? calculateSnapX(state.item, state.deltaX, state.mode) : null,\n markers: markersRef.current,\n interaction: interactionRender,\n })\n }, [overlayLayer, interactionHandler, calculateSnapX, getGroupIndex])\n\n // --- RENDER SCHEDULER ---\n const schedulerRef = useRef<RenderScheduler | null>(null)\n if (!schedulerRef.current) {\n schedulerRef.current = new RenderScheduler((flags) => {\n if (flags.grid) drawGrid()\n if (flags.items) drawItems()\n if (flags.overlay) drawOverlay()\n })\n }\n const scheduler = schedulerRef.current\n\n useEffect(() => {\n return () => scheduler.dispose()\n }, [scheduler])\n\n // --- TODAY MARKER AUTO-UPDATE ---\n useEffect(() => {\n if (!todayMarkerInterval) return\n const timer = setInterval(() => {\n const configs: MarkerConfig[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TodayMarker') {\n configs.push(getTodayMarkerConfig(child.props as { color?: string; width?: number; label?: string }))\n } else if (displayName === 'CustomMarker') {\n configs.push(getCustomMarkerConfig(child.props as { date: number; color?: string; width?: number; label?: string }))\n }\n })\n markersRef.current = configs\n scheduler.markDirty('overlay')\n }, todayMarkerInterval)\n return () => clearInterval(timer)\n }, [todayMarkerInterval, children, scheduler])\n\n // --- SYNC ON DIMENSION/DATA CHANGES ---\n useEffect(() => {\n viewStateRef.current.update({\n canvasWidth, canvasHeight, sidebarWidth, lineHeight,\n groupCount: groups.length, groupHeights,\n })\n scheduler.markAllDirty()\n }, [canvasWidth, canvasHeight, sidebarWidth, lineHeight, groups.length, groupHeights, scheduler])\n\n useEffect(() => {\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n }, [items, groups, selected, theme, dayStyle, rowStyle, intervalTree, layoutEngine, scheduler])\n\n const highlightsKey = useMemo(\n () => props.highlights?.map(h => `${h.start}|${h.end}|${h.color}|${h.label ?? ''}|${h.opacity ?? ''}`).join(';') ?? '',\n [props.highlights],\n )\n\n const prevHighlightsKey = useRef(highlightsKey)\n useEffect(() => {\n if (highlightsKey !== prevHighlightsKey.current) {\n prevHighlightsKey.current = highlightsKey\n scheduler.markDirty('grid')\n }\n }, [highlightsKey, scheduler])\n\n const prevMarkersKey = useRef(markersKey)\n useEffect(() => {\n if (markersKey !== prevMarkersKey.current) {\n prevMarkersKey.current = markersKey\n scheduler.markDirty('overlay')\n }\n }, [markersKey, scheduler])\n\n // --- CONTROLLED MODE ---\n const prevControlledStart = useRef(props.visibleTimeStart)\n const prevControlledEnd = useRef(props.visibleTimeEnd)\n if (props.visibleTimeStart !== undefined && props.visibleTimeStart !== prevControlledStart.current) {\n prevControlledStart.current = props.visibleTimeStart\n viewStateRef.current.update({ visibleTimeStart: props.visibleTimeStart })\n scheduler.markAllDirty()\n }\n if (props.visibleTimeEnd !== undefined && props.visibleTimeEnd !== prevControlledEnd.current) {\n prevControlledEnd.current = props.visibleTimeEnd\n viewStateRef.current.update({ visibleTimeEnd: props.visibleTimeEnd })\n scheduler.markAllDirty()\n }\n\n // --- THROTTLED PARENT CALLBACKS ---\n const callbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const scheduleCallbacks = useCallback((type: 'zoom' | 'scroll') => {\n if (callbackTimerRef.current !== null) return\n callbackTimerRef.current = setTimeout(() => {\n callbackTimerRef.current = null\n const vs = viewStateRef.current\n const p = propsRef.current\n if (type === 'zoom') {\n p.onZoom?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n } else {\n p.onTimeChange?.(vs.visibleTimeStart, vs.visibleTimeEnd)\n }\n }, HEADER_THROTTLE_MS)\n }, [])\n\n useEffect(() => {\n return () => { if (callbackTimerRef.current !== null) clearTimeout(callbackTimerRef.current) }\n }, [])\n\n // --- ZOOM HANDLER ---\n const zoomHandlerRef = useRef<ZoomHandler | null>(null)\n const zoomHandler = useMemo(() => {\n return new ZoomHandler(\n (newStart, newEnd) => {\n viewStateRef.current.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n },\n defaultTimeStart,\n defaultTimeEnd,\n minZoom,\n maxZoom,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n zoomHandlerRef.current = zoomHandler\n\n // --- WHEEL HANDLER ---\n const handleVerticalScroll = useCallback((deltaY: number) => {\n const vs = viewStateRef.current\n const totalHeight = vs.getTotalHeight()\n const maxScroll = Math.max(0, totalHeight - vs.canvasHeight)\n const newScrollTop = Math.max(0, Math.min(maxScroll, vs.scrollTop + deltaY))\n if (newScrollTop === vs.scrollTop) return\n vs.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }, [scheduler])\n\n const handleHorizontalScroll = useCallback((deltaX: number) => {\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const deltaMs = deltaX / pixelsPerMs\n const newStart = vs.visibleTimeStart + deltaMs\n const newEnd = vs.visibleTimeEnd + deltaMs\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n flushSync(() => syncHeaderState())\n propsRef.current.onTimeChange?.(newStart, newEnd)\n }, [scheduler, syncHeaderState])\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey || e.altKey) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n const cursorRatio = (e.clientX - rect.left) / rect.width\n zoomHandler.handleWheelZoom(e, cursorRatio)\n } else if (e.shiftKey) {\n e.preventDefault()\n // Some browsers (Chrome/Edge on macOS) pre-translate shift + external mouse wheel\n // into deltaX with deltaY=0; trackpads keep the raw deltaY. Use whichever is non-zero.\n handleHorizontalScroll(e.deltaY || e.deltaX)\n } else {\n const deltaX = e.deltaX\n if (deltaX !== 0 && Math.abs(deltaX) > Math.abs(e.deltaY)) {\n e.preventDefault()\n handleHorizontalScroll(deltaX)\n } else if (e.deltaY !== 0) {\n const hasInternalScroll = totalHeight > canvasHeight\n if (hasInternalScroll) e.preventDefault()\n handleVerticalScroll(e.deltaY)\n }\n }\n }\n el.addEventListener('wheel', handleWheel, { passive: false })\n return () => el.removeEventListener('wheel', handleWheel)\n }, [zoomHandler, handleVerticalScroll, handleHorizontalScroll, totalHeight, canvasHeight])\n\n // --- TOUCH PINCH-TO-ZOOM ---\n const touchRef = useRef<{ lastDistance: number | null; lastCenter: number | null }>({ lastDistance: null, lastCenter: null })\n\n useEffect(() => {\n const el = interactionRef.current\n if (!el) return\n\n const getDistance = (t1: Touch, t2: Touch) => Math.abs(t1.clientX - t2.clientX)\n const getCenter = (t1: Touch, t2: Touch, rect: DOMRect) => ((t1.clientX + t2.clientX) / 2) - rect.left\n\n const handleTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault()\n touchRef.current.lastDistance = getDistance(e.touches[0], e.touches[1])\n touchRef.current.lastCenter = null\n }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && touchRef.current.lastDistance !== null) {\n e.preventDefault()\n const newDistance = getDistance(e.touches[0], e.touches[1])\n const rect = el.getBoundingClientRect()\n const center = getCenter(e.touches[0], e.touches[1], rect)\n const cursorRatio = center / rect.width\n\n if (newDistance !== 0 && touchRef.current.lastDistance !== 0) {\n const scale = touchRef.current.lastDistance / newDistance\n const vs = viewStateRef.current\n const currentDuration = vs.visibleTimeEnd - vs.visibleTimeStart\n let newDuration = currentDuration * scale\n newDuration = Math.max(minZoom, Math.min(maxZoom, newDuration))\n\n const cursorTime = vs.visibleTimeStart + currentDuration * cursorRatio\n const newStart = cursorTime - newDuration * cursorRatio\n const newEnd = cursorTime + newDuration * (1 - cursorRatio)\n\n vs.update({ visibleTimeStart: newStart, visibleTimeEnd: newEnd })\n zoomHandlerRef.current?.updateBounds(newStart, newEnd)\n scheduler.markAllDirty()\n scheduleHeaderSync()\n scheduleCallbacks('zoom')\n }\n touchRef.current.lastDistance = newDistance\n }\n }\n\n const handleTouchEnd = () => {\n touchRef.current.lastDistance = null\n touchRef.current.lastCenter = null\n }\n\n el.addEventListener('touchstart', handleTouchStart, { passive: false })\n el.addEventListener('touchmove', handleTouchMove, { passive: false })\n el.addEventListener('touchend', handleTouchEnd)\n return () => {\n el.removeEventListener('touchstart', handleTouchStart)\n el.removeEventListener('touchmove', handleTouchMove)\n el.removeEventListener('touchend', handleTouchEnd)\n }\n }, [scheduler, scheduleHeaderSync, scheduleCallbacks])\n\n // --- POINTER HANDLERS ---\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n cursorXRef.current = x\n\n // --- Pan mode (drag on empty canvas) ---\n if (panRef.current) {\n const dx = e.clientX - panRef.current.startX\n const dy = e.clientY - panRef.current.startY\n if (!didPanRef.current && (Math.abs(dx) >= PAN_THRESHOLD || Math.abs(dy) >= PAN_THRESHOLD)) {\n didPanRef.current = true\n el.style.cursor = 'grabbing'\n el.setPointerCapture(e.pointerId)\n }\n if (didPanRef.current) {\n const moveDeltaX = e.clientX - panRef.current.lastX\n const moveDeltaY = e.clientY - panRef.current.lastY\n panRef.current.lastX = e.clientX\n panRef.current.lastY = e.clientY\n if (Math.abs(moveDeltaX) > 0) handleHorizontalScroll(-moveDeltaX)\n if (Math.abs(moveDeltaY) > 0) handleVerticalScroll(-moveDeltaY)\n }\n return\n }\n\n if (interactionHandler.isPending()) {\n interactionHandler.update(x, y)\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n if (state && state.mode === 'move' && propsRef.current.canChangeGroup) {\n const group = hitTestGroup(y, viewStateRef.current, propsRef.current.groups)\n if (group) interactionHandler.setCurrentGroup(group.id)\n }\n scheduler.markDirty('overlay')\n }\n return\n }\n\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n const newHoveredId = item?.id\n if (newHoveredId !== hoveredItemIdRef.current) {\n hoveredItemIdRef.current = newHoveredId\n scheduler.markDirty('items')\n p.onItemHover?.(newHoveredId ?? null, e.nativeEvent as unknown as PointerEvent)\n }\n\n // Cursor management\n if (item) {\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n el.style.cursor = 'col-resize'\n } else if (p.canMove) {\n el.style.cursor = 'grab'\n } else {\n el.style.cursor = 'default'\n }\n } else {\n el.style.cursor = 'default'\n }\n }, [interactionHandler, scheduler, handleHorizontalScroll, handleVerticalScroll])\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const p = propsRef.current\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n\n if (!item) {\n // Start pan on empty canvas\n panRef.current = { startX: e.clientX, startY: e.clientY, lastX: e.clientX, lastY: e.clientY }\n didPanRef.current = false\n return\n }\n\n const edge = detectEdge(x, item, viewStateRef.current)\n const cr = p.canResize\n\n if (edge === 'left' && (cr === 'left' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-left', x, y)\n } else if (edge === 'right' && (cr === 'right' || cr === 'both')) {\n interactionHandler.startInteraction(item, 'resize-right', x, y)\n } else if (p.canMove) {\n interactionHandler.startInteraction(item, 'move', x, y)\n }\n }, [interactionHandler])\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n const el = e.currentTarget as HTMLElement\n\n // --- End pan mode ---\n if (panRef.current) {\n const wasPanning = didPanRef.current\n panRef.current = null\n didPanRef.current = false\n el.style.cursor = 'default'\n if (wasPanning) return // suppress click after pan\n }\n\n if (interactionHandler.isActive()) {\n const state = interactionHandler.getState()\n const vs = viewStateRef.current\n const pixelsPerMs = vs.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n if (state) {\n const validator = propsRef.current.moveResizeValidator\n if (state.mode === 'move') {\n const result = interactionHandler.endMove(pixelsPerMs)\n if (result) {\n // Check for item-to-item snap\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const draggedStartX = vs.timeToX(state.item.start_time + deltaMs)\n const draggedEndX = vs.timeToX(state.item.end_time + deltaMs)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n let snappedStartTime = result.newStartTime\n // Check start edge\n const startSnap = findSnapTarget(draggedStartX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (startSnap !== null) {\n snappedStartTime = vs.xToTime(startSnap)\n } else {\n // Check end edge\n const endSnap = findSnapTarget(draggedEndX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n if (endSnap !== null) {\n const duration = state.item.end_time - state.item.start_time\n snappedStartTime = vs.xToTime(endSnap) - duration\n }\n }\n\n const validatedTime = validator ? validator('move', state.item.id, snappedStartTime) : snappedStartTime\n const childMoves = propsRef.current.hierarchyEngine.getMoveDelta(state.item.id, validatedTime)\n propsRef.current.onItemMove?.(state.item.id, validatedTime, result.newGroupId, childMoves.length > 0 ? childMoves : undefined)\n }\n } else {\n const result = interactionHandler.endResize(pixelsPerMs)\n if (result) {\n const vs = viewStateRef.current\n const p = propsRef.current\n const deltaMs = state.deltaX / pixelsPerMs\n const edgeTime = result.edge === 'left' ? state.item.start_time + deltaMs : state.item.end_time + deltaMs\n const edgeX = vs.timeToX(edgeTime)\n const padding = (vs.visibleTimeEnd - vs.visibleTimeStart) * 0.1\n const visibleItems = p.intervalTree.query(vs.visibleTimeStart - padding, vs.visibleTimeEnd + padding)\n const otherEdges = collectItemEdges(visibleItems, state.item.id, (t: number) => vs.timeToX(t))\n\n const snap = findSnapTarget(edgeX, otherEdges, 8, pixelsPerMs, p.dragSnap)\n let constrainedTime = snap !== null ? vs.xToTime(snap) : result.newTime\n // Apply hierarchy resize constraints\n const constraint = propsRef.current.hierarchyEngine.getResizeConstraint(state.item.id, result.edge)\n if (result.edge === 'left' && constrainedTime > constraint.max) {\n constrainedTime = constraint.max\n } else if (result.edge === 'right' && constrainedTime < constraint.min) {\n constrainedTime = constraint.min\n }\n\n const validatedTime = validator ? validator('resize', state.item.id, constrainedTime, result.edge) : constrainedTime\n propsRef.current.onItemResize?.(state.item.id, validatedTime, result.edge)\n }\n }\n }\n el.style.cursor = 'default'\n scheduler.markDirty('overlay')\n return\n }\n if (interactionHandler.isPending()) interactionHandler.cancel()\n const rect = el.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const item = hitTest(x, y, viewStateRef.current, propsRef.current.intervalTree, propsRef.current.layoutEngine, propsRef.current.groups)\n if (item) propsRef.current.onItemClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n }, [interactionHandler, scheduler])\n\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemDoubleClick?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasDoubleClick?.(group.id as number, time)\n }\n }, [])\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const p = propsRef.current\n const item = hitTest(x, y, viewStateRef.current, p.intervalTree, p.layoutEngine, p.groups)\n if (item) {\n p.onItemContextMenu?.(item.id, e.nativeEvent as unknown as PointerEvent)\n } else {\n const group = hitTestGroup(y, viewStateRef.current, p.groups)\n const time = viewStateRef.current.xToTime(x)\n if (group) p.onCanvasContextMenu?.(group.id as number, time, e.nativeEvent as unknown as PointerEvent)\n }\n }, [])\n\n const handlePointerLeave = useCallback(() => {\n panRef.current = null\n didPanRef.current = false\n cursorXRef.current = null\n if (interactionRef.current) interactionRef.current.style.cursor = 'default'\n if (hoveredItemIdRef.current !== undefined) {\n hoveredItemIdRef.current = undefined\n scheduler.markDirty('items')\n propsRef.current.onItemHover?.(null, new PointerEvent('pointerleave'))\n }\n if (propsRef.current.showCursorLine) scheduler.markDirty('overlay')\n }, [scheduler])\n\n // --- HEADER CHILDREN ---\n const headerChildren = useMemo(() => {\n const headers: React.ReactNode[] = []\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'TimelineHeaders') {\n const childProps = child.props as Record<string, unknown>\n headers.push(\n React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? headerTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? headerTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n sidebarWidth: childProps.sidebarWidth ?? sidebarWidth,\n theme: childProps.theme ?? theme,\n timezone: childProps.timezone ?? timezone,\n onZoomToInterval: childProps.onZoomToInterval ?? ((start: number, end: number) => {\n viewStateRef.current.update({ visibleTimeStart: start, visibleTimeEnd: end })\n scheduler.markAllDirty()\n syncHeaderState()\n propsRef.current.onTimeChange?.(start, end)\n propsRef.current.onZoom?.(start, end)\n }),\n }),\n )\n }\n })\n return headers\n }, [children, headerTimeStart, headerTimeEnd, canvasWidth, sidebarWidth, theme, timezone, scheduler, syncHeaderState])\n\n // --- INITIAL DRAW ---\n const initialDrawDone = useRef(false)\n useEffect(() => {\n if (!initialDrawDone.current) {\n initialDrawDone.current = true\n scheduler.markAllDirty()\n }\n }, [scheduler])\n\n // --- IMPERATIVE HANDLE (print capture) ---\n useImperativeHandle(ref, () => ({\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n\n // Preserve the current zoom level (pixels per ms) from the on-screen view\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n\n const compositeWidth = (printSidebarWidth + timelineWidth) * scale\n const compositeHeight = (headerHeight + totalHeight) * scale\n\n const canvas = document.createElement('canvas')\n canvas.width = compositeWidth\n canvas.height = compositeHeight\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n\n // --- Draw sidebar ---\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n\n // Row background from rowStyle\n if (p.rowStyle) {\n const style = p.rowStyle(group)\n if (style?.backgroundColor) {\n ctx.fillStyle = style.backgroundColor\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n }\n }\n\n // Group title\n const groupType = group.type as string | undefined\n let fontWeight = '400'\n let indent = 8\n if (groupType === 'project') {\n fontWeight = '700'\n } else if (groupType === 'CAG') {\n fontWeight = '600'\n } else if (groupType === 'CA') {\n fontWeight = '400'\n indent = 24\n }\n\n ctx.fillStyle = '#111'\n ctx.font = `${fontWeight} 12px sans-serif`\n ctx.textBaseline = 'middle'\n ctx.fillText(group.title, indent, y + rowHeight / 2, printSidebarWidth - indent - 4)\n }\n\n // --- Draw headers ---\n const drawHeaderRow = (rowY: number, getLabel: (time: dayjs.Dayjs) => string, unit: dayjs.ManipulateType) => {\n ctx.fillStyle = p.theme.header?.bg ?? '#f5f5f5'\n ctx.fillRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n ctx.strokeStyle = p.theme.grid?.line ?? '#e0e0e0'\n ctx.lineWidth = 1\n ctx.strokeRect(printSidebarWidth, rowY, timelineWidth, headerRowHeight)\n\n let cursor = toDayjs(timeStart, p.timezone).startOf(unit)\n if (cursor.valueOf() < timeStart) cursor = cursor.add(1, unit)\n\n const pxPerMs = timelineWidth / (timeEnd - timeStart)\n\n while (cursor.valueOf() < timeEnd) {\n const nextCursor = cursor.add(1, unit)\n const x = printSidebarWidth + (cursor.valueOf() - timeStart) * pxPerMs\n const endX = printSidebarWidth + (Math.min(nextCursor.valueOf(), timeEnd) - timeStart) * pxPerMs\n const width = endX - x\n\n // Vertical divider\n ctx.beginPath()\n ctx.moveTo(x, rowY)\n ctx.lineTo(x, rowY + headerRowHeight)\n ctx.stroke()\n\n // Label\n ctx.fillStyle = '#333'\n ctx.font = '600 11px sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n ctx.fillText(getLabel(cursor), x + width / 2, rowY + headerRowHeight / 2, width - 4)\n\n cursor = nextCursor\n }\n ctx.textAlign = 'start' // reset\n }\n\n drawHeaderRow(0, (d) => d.format('YYYY'), 'year')\n drawHeaderRow(headerRowHeight, (d) => d.format('MM'), 'month')\n drawHeaderRow(headerRowHeight * 2, (d) => String(d.isoWeek()), 'week')\n\n // --- Draw timeline layers ---\n const printViewState = new ViewState({\n visibleTimeStart: timeStart,\n visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth,\n canvasHeight: totalHeight,\n sidebarWidth: 0,\n lineHeight: p.lineHeight,\n groupCount: p.groups.length,\n buffer: 1,\n scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n\n // Offset context for timeline area\n ctx.save()\n ctx.translate(printSidebarWidth, headerHeight)\n\n // Clip to timeline area\n ctx.beginPath()\n ctx.rect(0, 0, timelineWidth, totalHeight)\n ctx.clip()\n\n gridLayer.draw(ctx, printViewState, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(\n ctx, printViewState, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine,\n )\n overlayLayer.draw(ctx, printViewState, p.theme, {\n cursorX: null,\n snapX: null,\n markers: markersRef.current,\n interaction: null,\n })\n\n ctx.restore()\n\n return canvas\n },\n }), [gridLayer, itemsLayer, overlayLayer])\n\n // --- ON READY CALLBACK ---\n useEffect(() => {\n const api: CanvasTimelineRef = {\n captureToCanvas({ timeStart, timeEnd, scale, sidebarWidth: printSidebarWidth }) {\n const p = propsRef.current\n const headerRowHeight = 28\n const headerHeight = headerRowHeight * 3\n const printGroupHeights = p.groups.map((g) => p.layoutEngine.getGroupHeight(g.id))\n const printGroupOffsets: number[] = [0]\n for (let i = 0; i < printGroupHeights.length; i++) {\n printGroupOffsets.push(printGroupOffsets[i] + printGroupHeights[i])\n }\n const totalHeight = printGroupOffsets[printGroupHeights.length]\n const vs = viewStateRef.current\n const currentPixelsPerMs = p.canvasWidth / (vs.visibleTimeEnd - vs.visibleTimeStart)\n const printDuration = timeEnd - timeStart\n const timelineWidth = Math.max(p.canvasWidth, Math.round(printDuration * currentPixelsPerMs))\n const fullWidth = printSidebarWidth + timelineWidth\n const fullHeight = headerHeight + totalHeight\n\n const canvas = document.createElement('canvas')\n canvas.width = fullWidth * scale\n canvas.height = fullHeight * scale\n const ctx = canvas.getContext('2d')!\n ctx.scale(scale, scale)\n ctx.fillStyle = '#FFFFFF'\n ctx.fillRect(0, 0, fullWidth, fullHeight)\n\n // Sidebar\n ctx.save()\n ctx.beginPath()\n ctx.rect(0, 0, printSidebarWidth, fullHeight)\n ctx.clip()\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(0, 0, printSidebarWidth, headerHeight)\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.strokeRect(0, 0, printSidebarWidth, headerHeight)\n for (let i = 0; i < p.groups.length; i++) {\n const group = p.groups[i]\n const rowHeight = printGroupHeights[i]\n const y = headerHeight + printGroupOffsets[i]\n const rs = p.rowStyle?.(group)\n ctx.fillStyle = rs?.backgroundColor ?? (i % 2 === 0 ? '#FFFFFF' : '#F7F7F7')\n ctx.fillRect(0, y, printSidebarWidth, rowHeight)\n ctx.strokeStyle = '#E5E5E5'\n ctx.lineWidth = 0.5\n ctx.beginPath()\n ctx.moveTo(0, y + rowHeight)\n ctx.lineTo(printSidebarWidth, y + rowHeight)\n ctx.stroke()\n const gt = (group.type as string) ?? ''\n let indent = 8, fw = '400', fs = 11\n if (gt === 'project') { fw = '700'; fs = 12 }\n else if (gt === 'control_area_group') { fw = '600' }\n else if (gt === 'control_area') { indent = 24 }\n ctx.fillStyle = '#374151'\n ctx.font = `${fw} ${fs}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`\n ctx.textBaseline = 'middle'\n const title = typeof group.title === 'string' ? group.title : String(group.title)\n ctx.fillText(title, indent, y + rowHeight / 2, printSidebarWidth - indent - 8)\n }\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(printSidebarWidth, 0)\n ctx.lineTo(printSidebarWidth, fullHeight)\n ctx.stroke()\n ctx.restore()\n\n // Headers\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, 0, timelineWidth, headerHeight)\n ctx.clip()\n const duration = timeEnd - timeStart\n const units: Array<{ unit: 'year' | 'month' | 'week'; row: number }> = [\n { unit: 'year', row: 0 }, { unit: 'month', row: 1 }, { unit: 'week', row: 2 },\n ]\n for (const { unit, row } of units) {\n const hy = row * headerRowHeight\n ctx.fillStyle = '#F9FAFB'\n ctx.fillRect(printSidebarWidth, hy, timelineWidth, headerRowHeight)\n let cur = toDayjs(timeStart, p.timezone).startOf(unit)\n const endBound = toDayjs(timeEnd, p.timezone).add(1, unit)\n while (cur.isBefore(endBound)) {\n const next = cur.add(1, unit)\n const sx = printSidebarWidth + ((cur.valueOf() - timeStart) / duration) * timelineWidth\n const w = ((next.valueOf() - cur.valueOf()) / duration) * timelineWidth\n ctx.strokeStyle = '#E5E7EB'\n ctx.lineWidth = 0.5\n ctx.strokeRect(sx, hy, w, headerRowHeight)\n let label: string\n if (unit === 'year') label = cur.format('YYYY')\n else if (unit === 'month') label = cur.format('MM')\n else label = `${cur.week()}`\n ctx.fillStyle = '#6c737f'\n ctx.font = unit === 'year'\n ? '600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n : '400 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n if (w > 20) ctx.fillText(label, sx + w / 2, hy + headerRowHeight / 2)\n cur = next\n }\n }\n ctx.textAlign = 'start'\n ctx.restore()\n\n // Timeline\n ctx.save()\n ctx.beginPath()\n ctx.rect(printSidebarWidth, headerHeight, timelineWidth, totalHeight)\n ctx.clip()\n ctx.translate(printSidebarWidth, headerHeight)\n const pv = new ViewState({\n visibleTimeStart: timeStart, visibleTimeEnd: timeEnd,\n canvasWidth: timelineWidth, canvasHeight: totalHeight,\n sidebarWidth: 0, lineHeight: p.lineHeight,\n groupCount: p.groups.length, buffer: 1, scrollTop: 0,\n groupHeights: printGroupHeights,\n })\n gridLayer.draw(ctx, pv, p.groups, p.theme, p.dayStyle, p.rowStyle, p.highlights, p.timezone)\n itemsLayer.draw(ctx, pv, p.groups, p.items, p.intervalTree, p.layoutEngine,\n p.itemRenderer, p.groupRenderer, p.theme, p.selected, undefined, p.dependencies,\n p.summaryRenderer, p.hierarchyEngine)\n overlayLayer.draw(ctx, pv, p.theme, { cursorX: null, markers: markersRef.current })\n ctx.restore()\n\n return canvas\n },\n }\n onReady?.(api)\n }, [onReady, gridLayer, itemsLayer, overlayLayer])\n\n // --- RENDER ---\n const canvasContainerStyle: React.CSSProperties = {\n position: 'relative',\n width: canvasWidth,\n height: canvasHeight,\n overflow: 'hidden',\n cursor: 'default',\n }\n\n const canvasStyle: React.CSSProperties = { position: 'absolute', top: 0, left: 0 }\n\n return (\n <div ref={outerRef} style={{ display: 'flex', flexDirection: 'column', width: '100%', position: 'relative' }}>\n {(__LIB_DEV__ || devBadge) ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 9999,\n padding: '2px 6px',\n fontSize: 10,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n lineHeight: 1.4,\n color: '#fff',\n background: 'rgba(17, 24, 39, 0.78)',\n borderBottomRightRadius: 4,\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n v{__LIB_VERSION__} · {__LIB_BUILD__}\n </div>\n ) : null}\n {headerChildren}\n <div ref={containerRef} style={{ display: 'flex', overflow: 'hidden', maxHeight: maxHeight ?? undefined }}>\n <Sidebar\n groups={groups}\n width={sidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={sidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n <div\n ref={interactionRef}\n style={canvasContainerStyle}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n onPointerLeave={handlePointerLeave}\n >\n <canvas ref={gridCanvasRef} style={{ ...canvasStyle, zIndex: 0 }} />\n <canvas ref={itemsCanvasRef} style={{ ...canvasStyle, zIndex: 1 }} />\n <canvas ref={overlayCanvasRef} style={{ ...canvasStyle, zIndex: 2 }} />\n </div>\n {rightSidebarWidth && rightSidebarGroupRenderer ? (\n <Sidebar\n groups={groups}\n width={rightSidebarWidth}\n lineHeight={lineHeight}\n groupHeights={groupHeights}\n scrollTop={sidebarScrollTop}\n canvasHeight={canvasHeight}\n theme={theme}\n groupRenderer={rightSidebarGroupRenderer}\n onScroll={(newScrollTop) => {\n viewStateRef.current.update({ scrollTop: newScrollTop })\n scheduler.markDirty('grid')\n scheduler.markDirty('items')\n scheduler.markDirty('overlay')\n setSidebarScrollTop(newScrollTop)\n }}\n />\n ) : null}\n </div>\n </div>\n )\n}))\n","import React from 'react'\nimport type { TimelineTheme } from '../types'\n\nexport interface TimelineHeadersProps {\n children: React.ReactNode\n theme?: TimelineTheme\n className?: string\n classNames?: string\n style?: React.CSSProperties\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n sidebarWidth?: number\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function TimelineHeaders({ children, theme, className, classNames: _classNames, style, visibleTimeStart, visibleTimeEnd, canvasWidth, sidebarWidth = 0, onZoomToInterval, timezone }: TimelineHeadersProps) {\n const enhancedChildren = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'DateHeader') {\n const childProps = child.props as Record<string, unknown>\n const enhanced = React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n visibleTimeStart: childProps.visibleTimeStart ?? visibleTimeStart,\n visibleTimeEnd: childProps.visibleTimeEnd ?? visibleTimeEnd,\n canvasWidth: childProps.canvasWidth ?? canvasWidth,\n theme: childProps.theme ?? theme,\n onZoomToInterval: childProps.onIntervalClick ?? childProps.onZoomToInterval ?? onZoomToInterval,\n timezone: childProps.timezone ?? timezone,\n })\n return (\n <div style={{ display: 'flex' }}>\n <div style={{ width: sidebarWidth, flexShrink: 0 }} />\n <div style={{ flex: 1, overflow: 'hidden' }}>{enhanced}</div>\n </div>\n )\n }\n return child\n })\n\n return (\n <div className={className} style={{\n position: 'sticky', top: 0, zIndex: 20, display: 'flex', flexDirection: 'column',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n borderTop: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n ...style,\n }}>\n {enhancedChildren}\n </div>\n )\n}\nTimelineHeaders.displayName = 'TimelineHeaders'\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){\"use strict\";var e=\"week\",t=\"year\";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),\"day\");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,\"millisecond\"),o=this.diff(a,e,!0);return o<0?r(this).startOf(\"week\").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));","import { useMemo, useCallback } from 'react'\nimport dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport type { TimelineTheme } from '../types'\nimport { toDayjs } from '../utils/timezone'\n\ndayjs.extend(weekOfYear)\n\nexport type DateUnit = 'year' | 'month' | 'week' | 'day' | 'hour'\n\n// Minimum cell width in pixels before the header auto-hides\nconst DEFAULT_MIN_CELL_WIDTH: Record<DateUnit, number> = {\n year: 30,\n month: 30,\n week: 20,\n day: 15,\n hour: 30,\n}\n\nexport interface DateHeaderProps {\n unit: DateUnit\n visibleTimeStart?: number\n visibleTimeEnd?: number\n canvasWidth?: number\n theme?: TimelineTheme\n height?: number\n className?: string\n labelFormat?: string | ((start: Date, end: Date, unit: DateUnit) => string)\n onIntervalClick?: (startTime: number, endTime: number) => void\n /** Minimum cell width in pixels. Header auto-hides when cells are narrower. Set to 0 to disable. */\n minCellWidth?: number\n // Called by TimelineHeaders to inject zoom behavior\n onZoomToInterval?: (start: number, end: number) => void\n timezone?: string\n}\n\nexport function DateHeader({\n unit,\n visibleTimeStart = 0,\n visibleTimeEnd = 0,\n canvasWidth = 0,\n theme,\n height = 28,\n className,\n labelFormat,\n onIntervalClick,\n minCellWidth,\n onZoomToInterval,\n timezone,\n}: DateHeaderProps) {\n const intervals = useMemo(() => {\n if (!visibleTimeStart || !visibleTimeEnd || !canvasWidth) return []\n\n const duration = visibleTimeEnd - visibleTimeStart\n\n // Check average cell width — auto-hide if too narrow\n const minWidth = minCellWidth ?? DEFAULT_MIN_CELL_WIDTH[unit]\n if (minWidth > 0) {\n const sampleStart = toDayjs(visibleTimeStart, timezone).startOf(unit)\n const sampleEnd = sampleStart.add(1, unit)\n const avgCellWidth = ((sampleEnd.valueOf() - sampleStart.valueOf()) / duration) * canvasWidth\n if (avgCellWidth < minWidth) return []\n }\n\n const result: Array<{ start: number; end: number; label: string; left: number; width: number }> = []\n // Add buffer: 1 extra unit before and after visible range\n let current = toDayjs(visibleTimeStart, timezone).startOf(unit).subtract(1, unit)\n const endBound = toDayjs(visibleTimeEnd, timezone).add(2, unit).valueOf()\n\n while (current.valueOf() < endBound) {\n const next = current.add(1, unit)\n const start = current.valueOf()\n const end = next.valueOf()\n const left = ((start - visibleTimeStart) / duration) * canvasWidth\n const width = ((end - start) / duration) * canvasWidth\n const label = formatLabel(current, next, unit, labelFormat, width)\n result.push({ start, end, label, left, width })\n current = next\n }\n return result\n }, [visibleTimeStart, visibleTimeEnd, canvasWidth, unit, labelFormat, minCellWidth, timezone])\n\n const handleClick = useCallback((start: number, end: number) => {\n if (onIntervalClick) {\n onIntervalClick(start, end)\n } else if (onZoomToInterval) {\n onZoomToInterval(start, end)\n }\n }, [onIntervalClick, onZoomToInterval])\n\n // Auto-hide: return nothing if no intervals (cells too narrow)\n if (intervals.length === 0) return null\n\n return (\n <div style={{ display: 'flex', position: 'relative', height, overflow: 'hidden' }}>\n {intervals.map((interval) => (\n <div\n key={interval.start}\n className={className}\n onClick={() => handleClick(interval.start, interval.end)}\n style={{\n position: 'absolute',\n left: interval.left,\n width: interval.width,\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRight: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n borderBottom: `1px solid ${theme?.header.border ?? '#E5E7EB'}`,\n fontSize: 12,\n color: theme?.header.text ?? '#6c737f',\n backgroundColor: theme?.header.bg ?? '#F9FAFB',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n userSelect: 'none',\n padding: '0 4px',\n boxSizing: 'border-box',\n }}\n >\n <span>{interval.label}</span>\n </div>\n ))}\n </div>\n )\n}\nDateHeader.displayName = 'DateHeader'\n\nfunction formatLabel(\n start: dayjs.Dayjs,\n end: dayjs.Dayjs,\n unit: DateUnit,\n labelFormat: string | ((start: Date, end: Date, unit: DateUnit) => string) | undefined,\n _width: number,\n): string {\n if (typeof labelFormat === 'function') {\n return labelFormat(start.toDate(), end.toDate(), unit)\n }\n if (typeof labelFormat === 'string') {\n return start.format(labelFormat)\n }\n return formatDefault(start, unit)\n}\n\nfunction formatDefault(d: dayjs.Dayjs, unit: DateUnit): string {\n switch (unit) {\n case 'year': return d.format('YYYY')\n case 'month': return d.format('MM')\n case 'week': return `${d.week()}`\n case 'day': return d.format('D')\n case 'hour': return d.format('HH:mm')\n }\n}\n","import React from 'react'\n\ninterface SidebarHeaderProps {\n width: number\n children?: (props: { getRootProps: () => React.HTMLAttributes<HTMLDivElement> }) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function SidebarHeader({ width, children, style }: SidebarHeaderProps) {\n const getRootProps = (): React.HTMLAttributes<HTMLDivElement> => ({ style: { width, ...style } })\n if (children) return <>{children({ getRootProps })}</>\n return <div style={{ width }} />\n}\nSidebarHeader.displayName = 'SidebarHeader'\n","import React from 'react'\ninterface CustomHeaderProps { children: React.ReactNode }\nexport function CustomHeader({ children }: CustomHeaderProps) { return <>{children}</> }\nCustomHeader.displayName = 'CustomHeader'\n"],"names":["DEFAULT_THEME","ViewState","config","params","offsets","i","h","_a","time","x","y","target","lo","hi","mid","index","extend","firstVisible","lastVisible","scrollXOffset","bufferPixels","IntervalTree","items","getStart","getEnd","intervals","item","min","max","iv","center","leftIntervals","rightIntervals","overlapping","start","end","results","node","LayoutEngine","lineHeight","itemHeightRatio","stackItems","hierarchy","itemHeight","summaryHeight","isSummary","byGroup","arr","groupId","groupItems","a","b","d","levelEnds","maxLevel","level","leaves","parents","nextLevel","parent","itemId","HierarchyEngine","children","id","visited","current","parentId","siblings","idx","result","stack","descendants","descId","desc","cached","depth","newStart","delta","edge","minChildStart","childId","child","maxChildEnd","defaultSummaryRenderer","ctx","bounds","state","_helpers","theme","width","height","color","diamondSize","midY","title","textWidth","maxTextWidth","displayText","hitTest","canvasX","canvasY","view","tree","layout","groups","groupIndexMap","candidates","topItem","topY","groupIndex","itemLayout","hitTestGroup","detectEdge","threshold","leftX","rightX","setupCanvas","canvas","dpr","targetW","targetH","clearCanvas","RenderScheduler","drawCallback","layer","flags","module","this","e","s","f","n","u","t","r","o","l","c","m","v","dayjs","utc","tz","toDayjs","ts","timezone","GridLayer","dayStyle","rowStyle","highlights","rowHeight","group","bgColor","customRow","x1","x2","w","opacity","g","visibleStart","visibleEnd","dayPixelWidth","stepUnit","batchColor","batchOpacity","batchStartX","customBorderLines","flushBatch","endX","date","custom","dow","line","padding","badgeWidth","badgeHeight","badgeX","badgeY","ITEM_FONT","createDrawHelpers","radius","text","maxWidth","candidate","color1","color2","grad","type","size","half","cx","cy","fillColor","stemW","stemX","paddingH","pillHeight","pillWidth","ItemsLayer","itemRenderer","groupRenderer","selected","hoveredItemId","dependencies","summaryRenderer","queryStart","queryEnd","visibleItems","selectedSet","itemBoundsMap","yMin","yMax","helpers","renderer","depItemIds","dep","itemMap","boundsMap","fromBounds","toBounds","isHighlighted","startX","startY","endY","dx","cpOffset","arrowSize","OverlayLayer","options","cursorX","snapX","markers","interaction","marker","maxBadgeWidth","MAX_DELTA","normalizeDelta","ZoomHandler","onZoom","visibleTimeStart","visibleTimeEnd","minZoom","maxZoom","cursorRatio","speed","scale","currentDuration","newDuration","newEnd","ACTIVATION_THRESHOLD","InteractionHandler","dragSnap","mode","pixelsPerMs","deltaMs","newStartTime","snapped","newGroupId","newTime","collectItemEdges","excludeItemId","timeToX","edges","findSnapTarget","currentX","edgeXPositions","thresholdPx","_pixelsPerMs","_dragSnap","closestX","closestDist","dist","OVERSCAN_PX","Sidebar","groupHeights","scrollTop","canvasHeight","onScroll","containerRef","useRef","isScrollingRef","useMemo","totalHeight","displayHeight","groupAtY","useCallback","handleScroll","useEffect","visibleGroups","top","_jsx","TodayMarker","_props","getTodayMarkerConfig","props","getTodayMarkerInterval","CustomMarker","getCustomMarkerConfig","isoWeek","mergeTheme","partial","HEADER_THROTTLE_MS","CanvasTimeline","React","forwardRef","ref","defaultTimeStart","defaultTimeEnd","sidebarWidth","canMove","canChangeGroup","canResize","themePartial","showCursorLine","sidebarGroupRenderer","onItemClick","onItemDoubleClick","onItemContextMenu","onItemMove","onItemResize","moveResizeValidator","onItemHover","onCanvasDoubleClick","onCanvasContextMenu","onTimeChange","selectedProp","rightSidebarWidth","rightSidebarGroupRenderer","onReady","maxHeight","devBadge","getGroupIndex","grps","selectedKey","gridCanvasRef","itemsCanvasRef","overlayCanvasRef","interactionRef","outerRef","containerWidth","setContainerWidth","useState","measuredHeight","setMeasuredHeight","container","obs","entries","entry","el","canvasWidth","hierarchyEngine","engine","intervalTree","layoutEngine","resolvedMaxHeight","viewStateRef","cursorXRef","hoveredItemIdRef","panRef","didPanRef","PAN_THRESHOLD","headerTimeStart","setHeaderTimeStart","headerTimeEnd","setHeaderTimeEnd","sidebarScrollTop","setSidebarScrollTop","headerTimerRef","syncHeaderState","vs","scheduleHeaderSync","resolvedSummaryRenderer","gridLayer","itemsLayer","overlayLayer","interactionHandler","markerConfigs","configs","displayName","markersKey","markersRef","todayMarkerInterval","interval","propsRef","drawGrid","p","drawItems","calculateSnapX","deltaX","draggedEdgeXs","otherEdges","edgeX","edgeTime","drawOverlay","interactionRender","origX","origWidth","targetGroupY","groupChanged","schedulerRef","scheduler","timer","highlightsKey","prevHighlightsKey","prevMarkersKey","prevControlledStart","prevControlledEnd","callbackTimerRef","scheduleCallbacks","_b","zoomHandlerRef","zoomHandler","handleVerticalScroll","deltaY","maxScroll","newScrollTop","handleHorizontalScroll","flushSync","_c","handleWheel","rect","touchRef","getDistance","t1","t2","getCenter","handleTouchStart","handleTouchMove","newDistance","cursorTime","handleTouchEnd","handlePointerMove","dy","moveDeltaX","moveDeltaY","newHoveredId","cr","handlePointerDown","handlePointerUp","wasPanning","validator","draggedStartX","draggedEndX","snappedStartTime","startSnap","endSnap","duration","validatedTime","childMoves","snap","constrainedTime","constraint","_d","_f","_e","handleDoubleClick","handleContextMenu","handlePointerLeave","headerChildren","headers","childProps","initialDrawDone","useImperativeHandle","timeStart","timeEnd","printSidebarWidth","headerRowHeight","headerHeight","printGroupHeights","printGroupOffsets","currentPixelsPerMs","printDuration","timelineWidth","compositeWidth","compositeHeight","style","groupType","fontWeight","indent","drawHeaderRow","rowY","getLabel","unit","cursor","pxPerMs","nextCursor","printViewState","api","fullWidth","fullHeight","rs","gt","fw","fs","units","row","hy","cur","endBound","next","sx","label","pv","canvasContainerStyle","canvasStyle","_jsxs","TimelineHeaders","className","_classNames","onZoomToInterval","enhancedChildren","enhanced","weekOfYear","DEFAULT_MIN_CELL_WIDTH","DateHeader","labelFormat","onIntervalClick","minCellWidth","minWidth","sampleStart","left","formatLabel","handleClick","_width","formatDefault","SidebarHeader","getRootProps","_Fragment","CustomHeader"],"mappings":"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","x_google_ignoreList":[8,9,18,24]}
|