@ixfx/components 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-Bh0PhlKW.js","names":["#host","#config","#onTrackSelect","#bpm","#updateFormatLabel","#timeSignatureNumerator","#timeSignatureDenominator","#dragging","#startScreenY","#startHeight","#fireResizeEvent","#isInResizeZone","#pointerId","#resetDrag","#onPointerMove","#onPointerDown","#onPointerUp","#onPointerCancel","customElement","#debug","#hasInitializedZoom","#initZoomToFit","#initVerticalZoomToFit","#recomputeTrackLayout","#deriveViewRange","#deriveVerticalZoom","#syncVCanvas","#invalidateCanvas","#cssVarsCache","#getViewportWidth","#vcanvas","#axisHeight","#minPpu","#applyTrackResize","#tabWidth","#getTotalBaseHeight","#getViewportHeight","#getLargestBaseTrackHeight","#getSmallestBaseTrackHeight","#vScrollOffset","#fireSelectionChange","#pendingVerticalZoomToFit","#drawCallback","#onScrollVirtual","#cleanupInteractions","#resizeObserver","#onResize","#syncVCanvasVertical","#positionTabs","#syncVerticalScroll","#prevTickledId","#onVAxisPointerDown","#onVAxisPointerMove","#onVAxisPointerUp","#onTrackResizeMove","#onTrackResizeEnd","#onVZoomInput","#onHZoomInput","#syncVCanvasScroll","customElement"],"sources":["../src/timeline/timeline-controller.ts","../src/timeline/timeline-draw.ts","../src/timeline/timeline-interactions.ts","../src/timeline/timeline-styles.ts","../src/timeline/timeline-track-tabs.ts","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/convert.js","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/styles.js","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/tile-calculator.js","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/util/debouncer.js","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/util/draw.js","../node_modules/.pnpm/@clinth+vcanvas@0.0.3/node_modules/@clinth/vcanvas/dist/vcanvas.js","../src/timeline/timeline-element.ts"],"sourcesContent":["import type { GridResolution, TimelineEvent, TimelineTrackSelectDetail, UserScale, ViewRange } from './types.js';\n\n/**\n * Configuration for the TimelineController external adapter.\n */\nexport type TimelineControllerConfig = {\n readonly logicalMin: number;\n readonly logicalMax: number;\n readonly labelFormatter?: (value: number) => string;\n readonly gridResolver?: (viewRange: ViewRange, userScale: UserScale) => GridResolution;\n};\n\n/**\n * Minimal interface the controller expects from the timeline element.\n * Avoids coupling to the concrete element class.\n */\ntype TimelineHost = {\n formatLabel: (v: number) => string;\n setViewRange: (r: ViewRange) => void;\n min: number;\n max: number;\n userScale: string;\n getTrackEvents: (trackKey: string) => TimelineEvent[];\n get selectedIds(): readonly string[];\n set selectedIds(ids: readonly string[]);\n addEventListener: (type: string, listener: EventListener) => void;\n removeEventListener: (type: string, listener: EventListener) => void;\n};\n\n/**\n * External adapter class that can configure a timeline element\n * with musical time, custom label formatting, etc.\n *\n * The controller has no import of any timeline element type.\n * Users create a controller, pass it the component instance,\n * and the controller calls the component's public API.\n */\nexport class TimelineController {\n #host: TimelineHost;\n #config: TimelineControllerConfig;\n #bpm = 120;\n #timeSignatureNumerator = 4;\n #timeSignatureDenominator = 4;\n\n constructor(timeline: TimelineHost, config: TimelineControllerConfig) {\n this.#host = timeline;\n this.#config = config;\n\n // Apply initial configuration\n timeline.min = config.logicalMin;\n timeline.max = config.logicalMax;\n\n if (config.labelFormatter) {\n timeline.formatLabel = config.labelFormatter;\n }\n\n timeline.addEventListener(`track-select`, this.#onTrackSelect as EventListener);\n }\n\n /** Update the tempo (BPM) for musical time calculations. */\n setTempo(bpm: number): void {\n this.#bpm = bpm;\n this.#updateFormatLabel();\n }\n\n /** Update the time signature for musical time calculations. */\n setTimeSignature(numerator: number, denominator: number): void {\n this.#timeSignatureNumerator = numerator;\n this.#timeSignatureDenominator = denominator;\n this.#updateFormatLabel();\n }\n\n /** Set the visible view range on the timeline. */\n setViewRange(range: ViewRange): void {\n this.#host.setViewRange(range);\n }\n\n /** Clean up any resources held by the controller. */\n dispose(): void {\n this.#host.removeEventListener(`track-select`, this.#onTrackSelect as EventListener);\n }\n\n #onTrackSelect = (e: Event): void => {\n const detail = (e as CustomEvent<TimelineTrackSelectDetail>).detail;\n const trackEventIds = this.#host.getTrackEvents(detail.trackKey).map(e => e.id);\n\n if (detail.shiftKey) {\n const current = new Set(this.#host.selectedIds);\n for (const id of trackEventIds) {\n if (current.has(id)) {\n current.delete(id);\n } else {\n current.add(id);\n }\n }\n this.#host.selectedIds = [...current];\n } else {\n this.#host.selectedIds = trackEventIds;\n }\n };\n\n #updateFormatLabel(): void {\n if (this.#config.labelFormatter) {\n // User provided a custom formatter — don't override\n return;\n }\n\n const bpm = this.#bpm;\n const num = this.#timeSignatureNumerator;\n\n // Musical time formatter: convert logical units to bars:beats\n this.#host.formatLabel = (v: number) => {\n const beatsPerBar = num;\n const totalBeats = v; // Assume 1 logical unit = 1 beat\n const bar = Math.floor(totalBeats / beatsPerBar) + 1;\n const beat = Math.floor(totalBeats % beatsPerBar) + 1;\n return `${bar}.${beat}`;\n };\n }\n}\n","import type { DragTarget, GridMode, GridResolution, TimelineEvent, TrackLayout, UserScale, ViewRange } from './types.js';\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport type CssVars = Record<string, string>;\n\nexport type Rect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\n// ── Grid resolution ───────────────────────────────────────────────────\n\nconst NICE_STEPS = [1, 2, 5, 10];\n\n/**\n * Dispatch to adaptive or fixed grid mode.\n */\nexport function resolveGrid(viewRange: ViewRange, userScale: UserScale, viewportWidth: number, mode: GridMode = `adaptive`, fixedMinorStep?: number, ppu?: number): GridResolution {\n if (mode === `fixed` && fixedMinorStep !== undefined && ppu !== undefined) {\n return resolveFixedGrid(fixedMinorStep, ppu);\n }\n return resolveAdaptiveGrid(viewRange, userScale, viewportWidth);\n}\n\n/**\n * Compute a nice major/minor grid resolution for the current view.\n * Uses a 1-2-5-10 \"nice number\" algorithm.\n */\nfunction resolveAdaptiveGrid(viewRange: ViewRange, userScale: UserScale, viewportWidth: number): GridResolution {\n const span = viewRange.max - viewRange.min;\n if (span <= 0 || viewportWidth <= 0) {\n return { majorStep: 100, minorDivisions: 4, minorStep: 25 };\n }\n\n // Target ~60-120px between major gridlines\n const densityMultiplier = scaleMultiplier(userScale);\n const targetPx = 80 * densityMultiplier;\n const targetMajors = Math.max(2, Math.floor(viewportWidth / targetPx));\n const rawStep = span / targetMajors;\n\n // Find nearest \"nice\" step\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n let bestStep = magnitude;\n for (const n of NICE_STEPS) {\n const candidate = n * magnitude;\n if (candidate >= rawStep * 0.8) {\n bestStep = candidate;\n break;\n }\n }\n\n // Minor divisions: 4 for most, 5 for steps of 5/10\n const normalised = bestStep / magnitude;\n const minorDivisions = normalised === 5 || normalised === 10 ? 5 : 4;\n const minorStep = bestStep / minorDivisions;\n\n return { majorStep: bestStep, minorDivisions, minorStep };\n}\n\n/**\n * Fixed grid: user specifies a base minor step in logical units.\n * If the minor step at current zoom would produce lines < 5px apart,\n * double the effective step until they're >= 5px.\n * Major = 4× effective minor.\n */\nfunction resolveFixedGrid(baseMinorStep: number, ppu: number): GridResolution {\n const MIN_PX_BETWEEN = 5;\n let effectiveMinor = baseMinorStep;\n\n // Double until minor gridlines are at least MIN_PX_BETWEEN apart\n while (effectiveMinor * ppu < MIN_PX_BETWEEN && effectiveMinor < 1e12) {\n effectiveMinor *= 2;\n }\n\n const minorDivisions = 4;\n const majorStep = effectiveMinor * minorDivisions;\n return { majorStep, minorDivisions, minorStep: effectiveMinor };\n}\n\nfunction scaleMultiplier(scale: UserScale): number {\n switch (scale) {\n case `x-wide`: return 2.0;\n case `wide`: return 1.5;\n case `normal`: return 1.0;\n case `slim`: return 0.7;\n case `x-slim`: return 0.5;\n default: return 1.0;\n }\n}\n\n// ── Draw: major/minor grid ────────────────────────────────────────────\n\nexport function drawMajorMinorGrid(ctx: CanvasRenderingContext2D, region: Rect, resolution: GridResolution, altMajorBg: boolean, vars: CssVars, ppu: number): void {\n const { majorStep, minorStep } = resolution;\n if (majorStep <= 0)\n return;\n\n const regionEnd = region.x + region.width;\n\n // Draw alternating major background tints\n if (altMajorBg) {\n const altColor = vars[`--timeline-alt-major-bg`] ?? `rgba(255,255,255,0.03)`;\n ctx.fillStyle = altColor;\n const firstMajor = Math.floor(region.x / majorStep);\n for (let i = firstMajor; i * majorStep < regionEnd; i++) {\n if (i % 2 !== 0) {\n const x = i * majorStep * ppu;\n ctx.fillRect(x, region.y, majorStep * ppu, region.height);\n }\n }\n }\n\n // Minor gridlines\n if (minorStep > 0) {\n ctx.strokeStyle = vars[`--timeline-grid-minor-color`] ?? `rgba(255,255,255,0.05)`;\n ctx.lineWidth = Number.parseFloat(vars[`--timeline-grid-minor-width`] ?? `0.5`);\n ctx.beginPath();\n const firstMinor = Math.floor(region.x / minorStep) * minorStep;\n for (let val = firstMinor; val < regionEnd; val += minorStep) {\n // Skip positions that are major gridlines\n if (Math.abs(val % majorStep) < minorStep * 0.01)\n continue;\n const px = val * ppu;\n ctx.moveTo(px, region.y);\n ctx.lineTo(px, region.y + region.height);\n }\n ctx.stroke();\n }\n\n // Major gridlines\n ctx.strokeStyle = vars[`--timeline-grid-major-color`] ?? `rgba(255,255,255,0.12)`;\n ctx.lineWidth = Number.parseFloat(vars[`--timeline-grid-major-width`] ?? `1`);\n ctx.beginPath();\n const firstMajor = Math.floor(region.x / majorStep) * majorStep;\n for (let val = firstMajor; val < regionEnd; val += majorStep) {\n const px = val * ppu;\n ctx.moveTo(px, region.y);\n ctx.lineTo(px, region.y + region.height);\n }\n ctx.stroke();\n}\n\n// ── Draw: axis labels ─────────────────────────────────────────────────\n\n/**\n * Draw the axis header band. With 2D virtualization the axis is \"sticky\" —\n * it is always drawn at the current vertical scroll position (`scrollTop`)\n * so it appears fixed at the viewport top.\n */\nexport function drawAxis(ctx: CanvasRenderingContext2D, region: Rect, resolution: GridResolution, axisHeight: number, formatLabel: (v: number) => string, vars: CssVars, ppu: number, scrollTop = 0): void {\n const { majorStep } = resolution;\n if (majorStep <= 0 || axisHeight <= 0)\n return;\n\n // Axis band occupies [scrollTop, scrollTop + axisHeight] in logical Y\n const axisTop = scrollTop;\n const axisBottom = scrollTop + axisHeight;\n\n // Only draw if this tile's region overlaps the axis band\n if (region.y + region.height < axisTop || region.y > axisBottom)\n return;\n\n const regionEnd = region.x + region.width;\n\n // How far major gridlines extend into the axis band (from the bottom)\n const tickHeight = 6;\n const bgHeight = axisHeight - tickHeight;\n\n // 1. Solid background covers upper portion; leaves bottom strip for gridline ticks.\n const bgColor = vars[`--timeline-bg`] ?? `#111`;\n ctx.fillStyle = bgColor;\n const bgLeft = region.x * ppu;\n ctx.fillRect(bgLeft, axisTop, region.width * ppu, bgHeight);\n\n // 2. Major gridline ticks extending into the axis band\n ctx.strokeStyle = vars[`--timeline-grid-major-color`] ?? `rgba(255,255,255,0.12)`;\n ctx.lineWidth = Number.parseFloat(vars[`--timeline-grid-major-width`] ?? `1`);\n ctx.beginPath();\n const firstMajor = Math.ceil(region.x / majorStep) * majorStep;\n for (let val = firstMajor; val < regionEnd; val += majorStep) {\n const px = val * ppu;\n ctx.moveTo(px, axisTop + bgHeight);\n ctx.lineTo(px, axisBottom);\n }\n ctx.stroke();\n\n // 3. Bottom border\n ctx.strokeStyle = vars[`--timeline-grid-major-color`] ?? `rgba(255,255,255,0.12)`;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(bgLeft, axisBottom);\n ctx.lineTo(bgLeft + region.width * ppu, axisBottom);\n ctx.stroke();\n\n // 4. Labels to the right of each major gridline\n const labelColor = vars[`--timeline-axis-label-color`] ?? `rgba(255,255,255,0.5)`;\n ctx.fillStyle = labelColor;\n ctx.font = `11px system-ui, sans-serif`;\n ctx.textBaseline = `middle`;\n ctx.textAlign = `left`;\n\n const labelPadding = 4;\n for (let val = firstMajor; val < regionEnd; val += majorStep) {\n const px = val * ppu;\n ctx.fillText(formatLabel(val), px + labelPadding, axisTop + bgHeight / 2);\n }\n\n // Reset textAlign for subsequent draw calls\n ctx.textAlign = `start`;\n}\n\n// ── Draw: track backgrounds ───────────────────────────────────────────\n\nexport type TrackInfo = {\n readonly key: string;\n readonly color?: string;\n};\n\nexport function drawTrackBackgrounds(ctx: CanvasRenderingContext2D, region: Rect, trackLayout: readonly TrackLayout[], tracks: readonly TrackInfo[], vars: CssVars, ppu: number): void {\n const bgDefault = vars[`--timeline-track-bg`] ?? `#1a1a1a`;\n const bgAlt = vars[`--timeline-track-bg-alt`] ?? `#1e1e1e`;\n\n for (let i = 0; i < trackLayout.length; i++) {\n const layout = trackLayout[i];\n // Skip if entirely outside the drawn region vertically\n if (layout.y + layout.height < region.y)\n continue;\n if (layout.y > region.y + region.height)\n break;\n\n const track = tracks.find(t => t.key === layout.trackKey);\n const bg = track?.color ? `${track.color}22` : (i % 2 === 0 ? bgDefault : bgAlt);\n\n ctx.fillStyle = bg;\n ctx.fillRect(region.x * ppu, layout.y, region.width * ppu, layout.height);\n\n // Subtle separator line between tracks\n ctx.strokeStyle = vars[`--timeline-grid-major-color`] ?? `rgba(255,255,255,0.12)`;\n ctx.lineWidth = 0.5;\n ctx.beginPath();\n ctx.moveTo(region.x * ppu, layout.y + layout.height);\n ctx.lineTo((region.x + region.width) * ppu, layout.y + layout.height);\n ctx.stroke();\n }\n}\n\n// ── Draw: event rectangles ────────────────────────────────────────────\n\nexport function drawEventRects(ctx: CanvasRenderingContext2D, region: Rect, events: readonly TimelineEvent[], trackLayout: readonly TrackLayout[], selectedIds: ReadonlySet<string>, tickledId: string | undefined, drag: DragTarget, vars: CssVars, ppu: number): void {\n const eventBg = vars[`--timeline-event-bg`] ?? `#3498db`;\n const eventSelectedBg = vars[`--timeline-event-selected-bg`] ?? `#5dade2`;\n const eventTickledBg = vars[`--timeline-event-tickled-bg`] ?? `#444`;\n const eventLabelColor = vars[`--timeline-event-label-color`] ?? `#fff`;\n const radius = Number.parseFloat(vars[`--timeline-event-radius`] ?? `4`);\n\n const regionEnd = region.x + region.width;\n const padding = 3; // vertical padding inside track\n\n for (const evt of events) {\n // Skip events outside horizontal view\n if (evt.end < region.x || evt.start > regionEnd)\n continue;\n\n const layout = trackLayout.find(l => l.trackKey === evt.trackKey);\n if (!layout)\n continue;\n\n // Skip events outside vertical region\n if (layout.y + layout.height < region.y)\n continue;\n if (layout.y > region.y + region.height)\n continue;\n\n // Compute provisional position during drag\n let isDragging = false;\n\n if (drag.kind === `event-move` && drag.eventId === evt.id) {\n isDragging = true;\n } else if (drag.kind === `event-start` && drag.eventId === evt.id) {\n isDragging = true;\n } else if (drag.kind === `event-end` && drag.eventId === evt.id) {\n isDragging = true;\n }\n\n const x = evt.start * ppu;\n const w = (evt.end - evt.start) * ppu;\n const y = layout.y + padding;\n const h = layout.height - padding * 2;\n\n if (w < 1)\n continue;\n\n // Choose fill color\n const isSelected = selectedIds.has(evt.id);\n const isTickled = tickledId === evt.id;\n let fill: string;\n if (isSelected) {\n fill = eventSelectedBg;\n } else if (isTickled) {\n fill = eventTickledBg;\n } else {\n fill = evt.color ?? eventBg;\n }\n\n // Draw rounded rect\n ctx.fillStyle = fill;\n ctx.beginPath();\n drawRoundRect(ctx, x, y, w, h, Math.min(radius, w / 2, h / 2));\n ctx.fill();\n\n // Drag outline\n if (isDragging) {\n ctx.strokeStyle = `#fff`;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n drawRoundRect(ctx, x, y, w, h, Math.min(radius, w / 2, h / 2));\n ctx.stroke();\n }\n\n // Selection outline\n if (isSelected && !isDragging) {\n ctx.strokeStyle = eventSelectedBg;\n ctx.lineWidth = 1;\n ctx.beginPath();\n drawRoundRect(ctx, x, y, w, h, Math.min(radius, w / 2, h / 2));\n ctx.stroke();\n }\n\n // Label (only if wide enough in pixels)\n if (w >= 40 && evt.label) {\n ctx.fillStyle = eventLabelColor;\n ctx.font = `11px system-ui, sans-serif`;\n ctx.textBaseline = `middle`;\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 4, y, w - 8, h);\n ctx.clip();\n ctx.fillText(evt.label, x + 6, y + h / 2);\n ctx.restore();\n }\n }\n}\n\n// ── Draw: marquee selection rectangle ─────────────────────────────────\n\nexport function drawMarquee(ctx: CanvasRenderingContext2D, drag: DragTarget, ppu: number): void {\n if (drag.kind !== `marquee`)\n return;\n\n const x1 = Math.min(drag.startLogicalX, drag.currentLogicalX) * ppu;\n const x2 = Math.max(drag.startLogicalX, drag.currentLogicalX) * ppu;\n const y1 = Math.min(drag.startY, drag.currentY);\n const y2 = Math.max(drag.startY, drag.currentY);\n\n ctx.fillStyle = `rgba(100, 150, 255, 0.15)`;\n ctx.fillRect(x1, y1, x2 - x1, y2 - y1);\n\n ctx.strokeStyle = `rgba(100, 150, 255, 0.6)`;\n ctx.lineWidth = 1;\n ctx.strokeRect(x1, y1, x2 - x1, y2 - y1);\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction drawRoundRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number): void {\n r = Math.max(0, r);\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n ctx.closePath();\n}\n\n// ── CSS variable resolution helper ────────────────────────────────────\n\nconst TIMELINE_CSS_VARS = [\n `--timeline-bg`,\n `--timeline-track-bg`,\n `--timeline-track-bg-alt`,\n `--timeline-alt-major-bg`,\n `--timeline-grid-major-color`,\n `--timeline-grid-minor-color`,\n `--timeline-grid-major-width`,\n `--timeline-grid-minor-width`,\n `--timeline-event-bg`,\n `--timeline-event-selected-bg`,\n `--timeline-event-tickled-bg`,\n `--timeline-event-label-color`,\n `--timeline-event-radius`,\n `--timeline-axis-label-color`,\n] as const;\n\nexport function resolveCssVars(host: HTMLElement): CssVars {\n const computed = getComputedStyle(host);\n const vars: CssVars = {};\n for (const v of TIMELINE_CSS_VARS) {\n vars[v] = computed.getPropertyValue(v).trim();\n }\n return vars;\n}\n","import type { IxfxTimelineElement } from './timeline-element.js';\nimport type { GridResolution, TimelineEvent, TimelineEventMoveDetail, TimelineEventResizeDetail, TimelineSelectionChangeDetail, TrackLayout } from './types.js';\nimport { resolveGrid } from './timeline-draw.js';\n\n// Minimal type for the x-vcanvas element\ntype VCanvasElement = HTMLElement & {\n convertFromViewportToCanvas: (x: number, y: number) => { x: number; y: number };\n viewportWidth: number;\n viewportHeight: number;\n logicalScrollTop: number;\n invalidateAll: () => void;\n invalidateRegion: (x: number, y: number, w: number, h: number) => void;\n};\n\n/** Hit zone near the edge of an event (px in screen space) */\nconst EDGE_HIT_PX = 8;\n\n// ── Coordinate conversion ─────────────────────────────────────────────\n\n/**\n * Convert a vcanvas logical (pixel) coordinate to timeline logical units.\n * vcanvas pixel coordinates are in the 1:1 pixel space; divide by ppu then add min.\n */\nfunction canvasToTimeline(canvasX: number, ppu: number, min: number): number {\n return canvasX / ppu + min;\n}\n\n/**\n * Convert screen-space pixel distance to timeline logical units.\n * Used for edge hit threshold: how many logical units does EDGE_HIT_PX correspond to.\n */\nfunction pxToLogicalUnits(ppu: number): number {\n return ppu > 0 ? 1 / ppu : 1;\n}\n\n// ── Hit testing ───────────────────────────────────────────────────────\n\ntype HitResult\n = | { kind: `none` }\n | { kind: `event-move`; eventId: string; trackKey: string; offsetX: number }\n | { kind: `event-start`; eventId: string }\n | { kind: `event-end`; eventId: string }\n | { kind: `empty`; logicalX: number; y: number; trackKey: string | undefined };\n\nfunction hitTest(logicalX: number, y: number, events: readonly TimelineEvent[], trackLayout: readonly TrackLayout[], ppu: number): HitResult {\n // Find which track was clicked\n const track = trackLayout.find(tl => y >= tl.y && y < tl.y + tl.height);\n if (!track) {\n return { kind: `empty`, logicalX, y, trackKey: undefined };\n }\n\n // Edge threshold in logical units\n const edgeThreshold = EDGE_HIT_PX * pxToLogicalUnits(ppu);\n const trackEvents = events.filter(e => e.trackKey === track.trackKey);\n\n for (const evt of trackEvents) {\n if (logicalX < evt.start || logicalX > evt.end)\n continue;\n\n // Within event — check edges\n if (logicalX <= evt.start + edgeThreshold) {\n return { kind: `event-start`, eventId: evt.id };\n }\n if (logicalX >= evt.end - edgeThreshold) {\n return { kind: `event-end`, eventId: evt.id };\n }\n return {\n kind: `event-move`,\n eventId: evt.id,\n trackKey: track.trackKey,\n offsetX: logicalX - evt.start,\n };\n }\n\n return { kind: `empty`, logicalX, y, trackKey: track.trackKey };\n}\n\n// ── Find track at Y position ──────────────────────────────────────────\n\nfunction trackAtY(y: number, trackLayout: readonly TrackLayout[]): string | undefined {\n const track = trackLayout.find(tl => y >= tl.y && y < tl.y + tl.height);\n return track?.trackKey;\n}\n\n// ── Axis zoom helpers ─────────────────────────────────────────────────\n\n/** Sensitivity: how many pixels of vertical drag = 1 e-fold of zoom */\nconst ZOOM_SENSITIVITY_PX = 100;\n\n/** Total pointer movement (px) before an axis drag activates */\nexport const DRAG_ACTIVATION_PX = 5;\n\n/** Per-axis deadzone (px) — small off-axis movement is ignored */\nexport const AXIS_DEADZONE_PX = 4;\n\n/**\n * Subtract a deadzone from a value.\n * Returns 0 if |value| <= deadzone, otherwise value shifted toward zero by deadzone.\n */\nexport function applyDeadzone(value: number, deadzone: number): number {\n return Math.abs(value) > deadzone ? value - Math.sign(value) * deadzone : 0;\n}\n\n/**\n * Compute new ppu + viewMin from an axis-zoom drag.\n * Vertical delta (dy) controls zoom (up = zoom in, down = zoom out), anchored at `anchorUnit`.\n * Horizontal delta (dx) controls pan.\n *\n * Returns { ppu, viewMin } — the caller uses host.setZoomPan() to apply.\n */\nfunction computeAxisZoom(startViewMin: number, startPpu: number, anchorUnit: number, dx: number, dy: number): { ppu: number; viewMin: number } {\n // Zoom: exponential scale factor from vertical drag (drag up = zoom in)\n const zoomFactor = Math.exp(-dy / ZOOM_SENSITIVITY_PX);\n const newPpu = startPpu * zoomFactor;\n\n // Anchor: the anchorUnit should stay at the same fraction of the viewport.\n // At startPpu, its screen position was: (anchorUnit - startViewMin) * startPpu\n // At newPpu, we want the same screen position, so:\n // (anchorUnit - newMin) * newPpu = (anchorUnit - startViewMin) * startPpu\n // newMin = anchorUnit - (anchorUnit - startViewMin) * startPpu / newPpu\n const anchorScreenX = (anchorUnit - startViewMin) * startPpu;\n let newMin = anchorUnit - anchorScreenX / newPpu;\n\n // Pan: horizontal drag shifts the view in screen pixels, convert to timeline units\n if (newPpu > 0) {\n newMin += -dx / newPpu;\n }\n\n // Don't clamp here — host.setZoomPan() handles clamping via #deriveViewRange\n return { ppu: newPpu, viewMin: newMin };\n}\n\n/**\n * Compute new vertical view range from a v-axis-zoom drag.\n * Horizontal delta (dx) controls zoom (right = zoom in, left = zoom out),\n * anchored at `anchorBaseY` (a position in base-height units).\n * Vertical delta (dy) controls pan (drag down = scroll down through tracks).\n *\n * Returns { vMin, vMax } — the caller uses host.setVerticalZoomPan() to apply.\n */\nexport function computeVerticalAxisZoom(startVMin: number, startVMax: number, startVScale: number, anchorBaseY: number, dx: number, dy: number): { vMin: number; vMax: number } {\n const startSpan = startVMax - startVMin;\n\n // Zoom: exponential scale factor from horizontal drag (right = zoom in)\n const zoomFactor = Math.exp(-dx / ZOOM_SENSITIVITY_PX);\n const newSpan = startSpan * zoomFactor;\n\n // Anchor: keep anchorBaseY at the same visual fraction\n const anchorFrac = startSpan > 0\n ? (anchorBaseY - startVMin) / startSpan\n : 0.5;\n let newMin = anchorBaseY - anchorFrac * newSpan;\n\n // Pan: vertical drag shifts the view in screen pixels, convert to base-height units\n if (startVScale > 0) {\n newMin += dy / startVScale;\n }\n\n // Don't clamp here — host.setVerticalZoomPan() handles clamping via #deriveVerticalZoom\n return { vMin: newMin, vMax: newMin + newSpan };\n}\n\n// ── Attach interactions ───────────────────────────────────────────────\n\n/**\n * Attaches pointer and keyboard interaction handlers to the timeline.\n * Returns a cleanup function.\n */\nexport function attachTimelineInteractions(host: IxfxTimelineElement, vcanvasEl: VCanvasElement): (() => void) {\n const ac = new AbortController();\n const signal = ac.signal;\n\n // ── Pointer down on vcanvas ───────────────────────────────────────\n vcanvasEl.addEventListener(`pointerdown`, (e: PointerEvent) => {\n const ppu = host.pxPerUnit;\n const canvasCoord = vcanvasEl.convertFromViewportToCanvas(e.offsetX, e.offsetY);\n // canvasCoord.x is in vcanvas logical space which is pure timeline pixel space\n const lx = canvasToTimeline(canvasCoord.x, ppu, host.min);\n const ly = canvasCoord.y;\n\n // Check if click is in the axis header band → start axis-zoom\n // Axis is \"sticky\" at the current logicalScrollTop\n const axisTop = vcanvasEl.logicalScrollTop;\n if (ly >= axisTop && ly < axisTop + host.axisHeight) {\n vcanvasEl.setPointerCapture(e.pointerId);\n host._drag = {\n kind: `axis-zoom`,\n anchorUnit: lx,\n startScreenX: e.screenX,\n startScreenY: e.screenY,\n startViewMin: host._viewRange.min,\n startPpu: ppu,\n };\n return;\n }\n\n const hit = hitTest(lx, ly, host._internalEvents, host._trackLayout, ppu);\n\n if (e.shiftKey && hit.kind === `event-move`) {\n // SHIFT+click toggles selection\n toggleSelection(host, hit.eventId);\n return;\n }\n\n if (hit.kind === `event-move`) {\n // Start move drag\n vcanvasEl.setPointerCapture(e.pointerId);\n host._drag = {\n kind: `event-move`,\n eventId: hit.eventId,\n originTrackKey: hit.trackKey,\n offsetX: hit.offsetX,\n };\n return;\n }\n\n if (hit.kind === `event-start`) {\n vcanvasEl.setPointerCapture(e.pointerId);\n host._drag = { kind: `event-start`, eventId: hit.eventId };\n return;\n }\n\n if (hit.kind === `event-end`) {\n vcanvasEl.setPointerCapture(e.pointerId);\n host._drag = { kind: `event-end`, eventId: hit.eventId };\n return;\n }\n\n if (hit.kind === `empty`) {\n // Start marquee or clear selection\n vcanvasEl.setPointerCapture(e.pointerId);\n host._drag = {\n kind: `marquee`,\n startLogicalX: lx,\n startY: ly,\n currentLogicalX: lx,\n currentY: ly,\n };\n }\n }, { signal });\n\n // ── Pointer move ──────────────────────────────────────────────────\n vcanvasEl.addEventListener(`pointermove`, (e: PointerEvent) => {\n const drag = host._drag;\n if (drag.kind === `none`) {\n // Tickle (hover) detection\n handleHover(host, vcanvasEl, e);\n return;\n }\n\n const ppu = host.pxPerUnit;\n const canvasCoord = vcanvasEl.convertFromViewportToCanvas(e.offsetX, e.offsetY);\n // canvasCoord.x is in vcanvas logical space which is pure timeline pixel space\n const lx = canvasToTimeline(canvasCoord.x, ppu, host.min);\n const ly = canvasCoord.y;\n\n if (drag.kind === `axis-zoom`) {\n const rawDx = e.screenX - drag.startScreenX;\n const rawDy = e.screenY - drag.startScreenY;\n\n // Activation threshold — don't start until enough total movement\n if (Math.abs(rawDx) + Math.abs(rawDy) < DRAG_ACTIVATION_PX)\n return;\n\n // Per-axis deadzone — ignore small off-axis movement\n const dx = applyDeadzone(rawDx, AXIS_DEADZONE_PX);\n const dy = applyDeadzone(rawDy, AXIS_DEADZONE_PX);\n\n const result = computeAxisZoom(\n drag.startViewMin,\n drag.startPpu,\n drag.anchorUnit,\n dx,\n dy,\n );\n host.setZoomPan(result.viewMin, result.ppu);\n return;\n }\n\n if (drag.kind === `marquee`) {\n host._drag = { ...drag, currentLogicalX: lx, currentY: ly };\n vcanvasEl.invalidateAll();\n return;\n }\n\n if (drag.kind === `event-move`) {\n const evt = host._internalEvents.find(ev => ev.id === drag.eventId);\n if (!evt)\n return;\n const duration = evt.end - evt.start;\n const rawLx = lx;\n const rawLy = ly;\n const newStart = lx - drag.offsetX;\n const newEnd = newStart + duration;\n const newTrackKey = trackAtY(ly, host._trackLayout) ?? evt.trackKey;\n\n const ppu = host.pxPerUnit;\n const grid: GridResolution = resolveGrid(\n host._viewRange,\n host.userScale,\n vcanvasEl.viewportWidth,\n host.gridMode,\n host.minorStep,\n ppu,\n );\n\n const snapped = host.processDrag(\n drag.eventId,\n rawLx,\n rawLy,\n newStart,\n newEnd,\n newTrackKey,\n drag.originTrackKey,\n grid,\n );\n\n host._internalEvents = host._internalEvents.map(ev =>\n ev.id === drag.eventId\n ? { ...ev, start: snapped.start, end: snapped.end, trackKey: snapped.trackKey }\n : ev,\n );\n vcanvasEl.invalidateAll();\n return;\n }\n\n if (drag.kind === `event-start`) {\n const evt = host._internalEvents.find(ev => ev.id === drag.eventId);\n if (!evt)\n return;\n const newStart = Math.min(lx, evt.end - 1);\n host._internalEvents = host._internalEvents.map(ev =>\n ev.id === drag.eventId ? { ...ev, start: newStart } : ev,\n );\n vcanvasEl.invalidateAll();\n return;\n }\n\n if (drag.kind === `event-end`) {\n const evt = host._internalEvents.find(ev => ev.id === drag.eventId);\n if (!evt)\n return;\n const newEnd = Math.max(lx, evt.start + 1);\n host._internalEvents = host._internalEvents.map(ev =>\n ev.id === drag.eventId ? { ...ev, end: newEnd } : ev,\n );\n vcanvasEl.invalidateAll();\n }\n }, { signal });\n\n // ── Pointer up ────────────────────────────────────────────────────\n vcanvasEl.addEventListener(`pointerup`, (e: PointerEvent) => {\n const drag = host._drag;\n vcanvasEl.releasePointerCapture(e.pointerId);\n\n if (drag.kind === `axis-zoom`) {\n // Final zoom/pan is already applied continuously in pointermove\n host._drag = { kind: `none` };\n return;\n }\n\n if (drag.kind === `marquee`) {\n // Compute marquee selection\n const x1 = Math.min(drag.startLogicalX, drag.currentLogicalX);\n const x2 = Math.max(drag.startLogicalX, drag.currentLogicalX);\n const y1 = Math.min(drag.startY, drag.currentY);\n const y2 = Math.max(drag.startY, drag.currentY);\n\n // Check if it was just a click (no drag distance)\n if (Math.abs(x2 - x1) < 2 && Math.abs(y2 - y1) < 2) {\n // Click on empty space — clear selection\n host._selectedIds = new Set();\n fireSelectionChange(host);\n } else {\n // Select events intersecting the marquee\n const selected = new Set<string>();\n for (const evt of host._internalEvents) {\n const layout = host._trackLayout.find(l => l.trackKey === evt.trackKey);\n if (!layout)\n continue;\n const evtTop = layout.y + 3;\n const evtBottom = layout.y + layout.height - 3;\n\n // Intersection test\n if (evt.end >= x1 && evt.start <= x2 && evtBottom >= y1 && evtTop <= y2) {\n selected.add(evt.id);\n }\n }\n host._selectedIds = selected;\n fireSelectionChange(host);\n }\n\n host._drag = { kind: `none` };\n vcanvasEl.invalidateAll();\n return;\n }\n\n if (drag.kind === `event-move`) {\n const evt = host._internalEvents.find(ev => ev.id === drag.eventId);\n if (evt) {\n host.dispatchEvent(\n new CustomEvent<TimelineEventMoveDetail>(`event-move`, {\n detail: {\n eventId: evt.id,\n fromTrackKey: drag.originTrackKey,\n toTrackKey: evt.trackKey,\n start: evt.start,\n end: evt.end,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n host._drag = { kind: `none` };\n return;\n }\n\n if (drag.kind === `event-start` || drag.kind === `event-end`) {\n const evt = host._internalEvents.find(ev => ev.id === drag.eventId);\n if (evt) {\n host.dispatchEvent(\n new CustomEvent<TimelineEventResizeDetail>(`event-resize`, {\n detail: {\n eventId: evt.id,\n start: evt.start,\n end: evt.end,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n host._drag = { kind: `none` };\n return;\n }\n\n host._drag = { kind: `none` };\n }, { signal });\n\n // ── Pointer leave (clear tickle) ──────────────────────────────────\n vcanvasEl.addEventListener(`pointerleave`, () => {\n if (host._tickledId !== undefined) {\n host._tickledId = undefined;\n vcanvasEl.invalidateAll();\n }\n }, { signal });\n\n return () => ac.abort();\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction handleHover(host: IxfxTimelineElement, vcanvasEl: VCanvasElement, e: PointerEvent): void {\n const ppu = host.pxPerUnit;\n const canvasCoord = vcanvasEl.convertFromViewportToCanvas(e.offsetX, e.offsetY);\n // canvasCoord.x is in vcanvas logical space which is pure timeline pixel space\n const lx = canvasToTimeline(canvasCoord.x, ppu, host.min);\n const ly = canvasCoord.y;\n\n // Axis band: show appropriate cursor (sticky at logicalScrollTop)\n const axisTop = vcanvasEl.logicalScrollTop;\n if (ly >= axisTop && ly < axisTop + host.axisHeight) {\n vcanvasEl.style.cursor = `col-resize`;\n // Clear tickle if any\n if (host._tickledId !== undefined) {\n host._tickledId = undefined;\n vcanvasEl.invalidateAll();\n }\n return;\n }\n\n const hit = hitTest(lx, ly, host._internalEvents, host._trackLayout, ppu);\n\n let newTickledId: string | undefined;\n if (hit.kind === `event-move` || hit.kind === `event-start` || hit.kind === `event-end`) {\n newTickledId = hit.eventId;\n }\n\n // Update cursor\n if (hit.kind === `event-start` || hit.kind === `event-end`) {\n vcanvasEl.style.cursor = `ew-resize`;\n } else if (hit.kind === `event-move`) {\n vcanvasEl.style.cursor = `grab`;\n } else {\n vcanvasEl.style.cursor = `crosshair`;\n }\n\n if (newTickledId !== host._tickledId) {\n host._tickledId = newTickledId;\n vcanvasEl.invalidateAll();\n }\n}\n\nfunction toggleSelection(host: IxfxTimelineElement, eventId: string): void {\n const next = new Set(host._selectedIds);\n if (next.has(eventId)) {\n next.delete(eventId);\n } else {\n next.add(eventId);\n }\n host._selectedIds = next;\n fireSelectionChange(host);\n host.getVCanvas()?.invalidateAll();\n}\n\nfunction fireSelectionChange(host: IxfxTimelineElement): void {\n host.dispatchEvent(\n new CustomEvent<TimelineSelectionChangeDetail>(`selection-change`, {\n detail: { selectedIds: [...host._selectedIds] },\n bubbles: true,\n composed: true,\n }),\n );\n}\n","import { css } from 'lit';\n\nexport const timelineStyles = css`\n :host {\n /* Layout */\n --timeline-axis-height: 24px;\n --timeline-tab-width: 120px;\n\n /* Backgrounds */\n --timeline-bg: var(--content, #111);\n --timeline-track-bg: var(--surface-2);\n --timeline-track-bg-alt: var(--surface-3);\n --timeline-alt-major-bg: color-mix(in oklch, var(--surface-3) 40%, transparent);\n --timeline-meta-bg: var(--surface-2);\n\n /* Grid */\n --timeline-grid-major-color: var(--surface-5);\n --timeline-grid-minor-color: var(--surface-4);\n --timeline-grid-major-width: 1px;\n --timeline-grid-minor-width: 0.5px;\n\n /* Events */\n --timeline-event-bg: var(--accent);\n --timeline-event-selected-bg: color-mix(in oklch, var(--accent) 80%, white);\n --timeline-event-tickled-bg: var(--surface-6);\n --timeline-event-label-color: var(--accent-text);\n --timeline-event-radius: var(--radius-s, 4px);\n\n /* Tabs */\n --timeline-tab-bg: var(--surface-3);\n --timeline-tab-text: var(--surface-3-text);\n --timeline-tab-selected-bg: var(--accent);\n\n /* Axis */\n --timeline-axis-label-color: var(--surface-muted-text);\n\n /* Resizer */\n --timeline-resizer-color: var(--surface-5);\n\n display: grid;\n grid-template-rows: 1fr auto auto auto;\n background: var(--timeline-bg);\n overflow: hidden;\n position: relative;\n }\n\n /* ── Content wrapper ───────────────────────────────────────────────── */\n\n .content-wrapper {\n display: grid;\n grid-template-columns: 1fr auto;\n overflow: hidden;\n min-height: 0;\n }\n\n /* ── Vertical zoom (right sidebar) ─────────────────────────────────── */\n\n .v-zoom {\n padding: 6px 4px;\n padding-top: var(--timeline-axis-height);\n display: flex;\n align-items: stretch;\n width: 30px;\n box-sizing: content-box;\n }\n\n .v-zoom ixfx-range-multi {\n height: 100%;\n width: 100%;\n }\n\n /* ── Content area ──────────────────────────────────────────────────── */\n\n .content-area {\n position: relative;\n display: grid;\n grid-template-columns: var(--timeline-tab-width) 1fr;\n overflow: hidden;\n min-height: 0;\n }\n\n /* ── Tab column (sits beside vcanvas) ────────────────────────────── */\n\n .tab-column {\n position: relative;\n overflow: hidden;\n z-index: 2;\n }\n\n .tab-column ixfx-timeline-track-tab {\n position: absolute;\n left: 0;\n width: 100%;\n box-sizing: border-box;\n pointer-events: auto;\n }\n\n /* ── Vertical axis interaction zone ─────────────────────────────────── */\n\n .v-axis-zone {\n position: absolute;\n top: 0;\n left: 0;\n width: var(--timeline-tab-width);\n height: 100%;\n cursor: ns-resize;\n z-index: 3;\n }\n\n /* ── VCanvas ───────────────────────────────────────────────────────── */\n\n .content-area x-vcanvas {\n width: 100%;\n height: 100%;\n display: block;\n --scrollbar-width: none;\n }\n\n /* ── Horizontal zoom ───────────────────────────────────────────────── */\n\n .h-zoom {\n padding: 4px 8px;\n padding-left: var(--timeline-tab-width);\n padding-right: 38px; /* align with v-zoom column (30px + 2×4px padding) */\n }\n\n .h-zoom ixfx-range-multi {\n width: 100%;\n }\n\n /* ── Meta area ─────────────────────────────────────────────────────── */\n\n .meta-resizer {\n display: none;\n height: 6px;\n cursor: ns-resize;\n background: var(--timeline-resizer-color);\n }\n\n .meta-resizer.visible {\n display: block;\n }\n\n .meta-area {\n display: none;\n background: var(--timeline-meta-bg);\n overflow: hidden;\n }\n\n .meta-area.visible {\n display: block;\n }\n`;\n","import type { TimelineTrackResizeDetail } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n/** Minimum track height in px */\nconst MIN_TRACK_HEIGHT = 24;\n\n/** How close to the bottom edge the pointer must be (px) to trigger resize */\nconst EDGE_ZONE_PX = 6;\n\n/**\n * A single track tab in the timeline's left margin.\n * Displays the track label, optional drag handle for reordering,\n * and handles vertical resize via bottom-edge drag.\n *\n * Fires:\n * - `track-resize-move` (composed, bubbles) — live preview during drag\n * - `track-resize` (composed, bubbles) — final value on pointerup\n *\n * Both carry `TimelineTrackResizeDetail` in their `detail`.\n */\n@customElement(`ixfx-timeline-track-tab`)\nexport class TimelineTrackTabElement extends LitElement {\n static override styles = css`\n :host {\n display: flex;\n align-items: center;\n background: color-mix(in oklch, var(--timeline-tab-bg, #2a2a2a) 70%, transparent);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n color: var(--timeline-tab-text, #ccc);\n font-size: 0.75rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid var(--timeline-grid-major-color, rgba(255,255,255,0.12));\n box-sizing: border-box;\n position: relative;\n }\n\n :host([selected]) {\n background: color-mix(in oklch, var(--timeline-tab-selected-bg, #3498db) 75%, transparent);\n color: white;\n }\n\n .handle {\n display: none;\n cursor: grab;\n padding: 0 4px;\n opacity: 0.5;\n font-size: 0.65rem;\n }\n\n :host([reorderable]) .handle {\n display: block;\n }\n\n .label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0 8px;\n }\n `;\n\n @property({ type: String }) label = ``;\n @property({ type: String, attribute: `track-key` }) trackKey = ``;\n @property({ type: Boolean, reflect: true }) selected = false;\n @property({ type: Boolean, reflect: true }) reorderable = false;\n @property({ type: Boolean, reflect: true }) resizable = false;\n\n // ── Private drag state (not reactive — no re-render needed) ─────────\n #dragging = false;\n #startScreenY = 0;\n #startHeight = 0;\n #pointerId: number | undefined = undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointermove`, this.#onPointerMove);\n this.addEventListener(`pointerdown`, this.#onPointerDown);\n this.addEventListener(`pointerup`, this.#onPointerUp);\n this.addEventListener(`pointercancel`, this.#onPointerCancel);\n this.addEventListener(`lostpointercapture`, this.#onPointerCancel);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointermove`, this.#onPointerMove);\n this.removeEventListener(`pointerdown`, this.#onPointerDown);\n this.removeEventListener(`pointerup`, this.#onPointerUp);\n this.removeEventListener(`pointercancel`, this.#onPointerCancel);\n this.removeEventListener(`lostpointercapture`, this.#onPointerCancel);\n this.#dragging = false;\n }\n\n protected override render() {\n return html`\n <span class=\"handle\">\\u2630</span>\n <span class=\"label\">${this.label}</span>\n `;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────────\n\n /** Is the pointer within the bottom edge zone? */\n #isInResizeZone(e: PointerEvent): boolean {\n if (!this.resizable)\n return false;\n const rect = this.getBoundingClientRect();\n return e.clientY >= rect.bottom - EDGE_ZONE_PX;\n }\n\n #fireResizeEvent(eventName: string, height: number): void {\n this.dispatchEvent(\n new CustomEvent<TimelineTrackResizeDetail>(eventName, {\n detail: { trackKey: this.trackKey, height },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ── Pointer handlers ────────────────────────────────────────────────\n\n #onPointerMove = (e: PointerEvent): void => {\n if (this.#dragging) {\n // During drag: compute new height from delta\n const dy = e.screenY - this.#startScreenY;\n const newHeight = Math.max(MIN_TRACK_HEIGHT, this.#startHeight + dy);\n this.#fireResizeEvent(`track-resize-move`, newHeight);\n return;\n }\n\n // Hover: show ns-resize cursor when near bottom edge\n if (this.#isInResizeZone(e)) {\n this.style.cursor = `ns-resize`;\n } else {\n this.style.cursor = ``;\n }\n };\n\n #onPointerDown = (e: PointerEvent): void => {\n if (!this.#isInResizeZone(e))\n return;\n\n // Prevent the click handler on the parent from firing (track-select)\n e.stopPropagation();\n e.preventDefault();\n\n this.#dragging = true;\n this.#startScreenY = e.screenY;\n this.#startHeight = this.offsetHeight;\n this.#pointerId = e.pointerId;\n this.setPointerCapture(e.pointerId);\n };\n\n #onPointerUp = (e: PointerEvent): void => {\n if (!this.#dragging)\n return;\n\n const dy = e.screenY - this.#startScreenY;\n const finalHeight = Math.max(MIN_TRACK_HEIGHT, this.#startHeight + dy);\n\n this.#fireResizeEvent(`track-resize`, finalHeight);\n this.#resetDrag(e.pointerId);\n };\n\n #onPointerCancel = (_e: Event): void => {\n if (!this.#dragging)\n return;\n this.#resetDrag(this.#pointerId);\n };\n\n #resetDrag(pointerId?: number): void {\n this.#dragging = false;\n this.#startScreenY = 0;\n this.#startHeight = 0;\n if (pointerId !== undefined) {\n try {\n this.releasePointerCapture(pointerId);\n } catch { /* already released */ }\n }\n this.#pointerId = undefined;\n this.style.cursor = ``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-timeline-track-tab': TimelineTrackTabElement;\n }\n}\n","/**\n * Converts viewport-relative coordinates to canvas-relative (logical) coordinates.\n *\n * This function accounts for the current scroll position and content offset to translate\n * coordinates from the visible viewport space to the logical canvas space.\n *\n * @param x - The x-coordinate in viewport space (pixels from left edge of viewport)\n * @param y - The y-coordinate in viewport space (pixels from top)\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @param contentOffset - The horizontal offset applied to center content in single-tile mode\n * @param scrollTop - The current vertical scroll position in pixels\n * @param contentOffsetY - The vertical offset applied to center content in single-tile-row mode\n * @returns The point in canvas (logical) coordinate space\n *\n * @example\n * ```typescript\n * // Viewport coordinate (100, 50) with scroll at 500 and no offset\n * const canvasPoint = viewportToCanvas(100, 50, 500, 0, 0, 0);\n * // Returns: { x: 600, y: 50 }\n * ```\n */\nexport function viewportToCanvas(x, y, scrollLeft, contentOffset, scrollTop = 0, contentOffsetY = 0) {\n return {\n x: x + scrollLeft - contentOffset,\n y: y + scrollTop - contentOffsetY,\n };\n}\n/**\n * Converts canvas-relative (logical) coordinates to viewport-relative coordinates.\n *\n * This function translates coordinates from the logical canvas space back to the\n * visible viewport space, accounting for scroll position and content offset.\n *\n * @param x - The x-coordinate in canvas (logical) space\n * @param y - The y-coordinate in canvas (logical) space\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @param contentOffset - The horizontal offset applied to center content in single-tile mode\n * @param scrollTop - The current vertical scroll position in pixels\n * @param contentOffsetY - The vertical offset applied to center content in single-tile-row mode\n * @returns The point in viewport coordinate space\n *\n * @example\n * ```typescript\n * // Canvas coordinate (600, 50) with scroll at 500 and no offset\n * const viewportPoint = canvasToViewport(600, 50, 500, 0, 0, 0);\n * // Returns: { x: 100, y: 50 }\n * ```\n */\nexport function canvasToViewport(x, y, scrollLeft, contentOffset, scrollTop = 0, contentOffsetY = 0) {\n return {\n x: x - scrollLeft + contentOffset,\n y: y - scrollTop + contentOffsetY,\n };\n}\n/**\n * Converts a logical x-coordinate to screen coordinates.\n *\n * Screen coordinates represent the position on the physical display relative to\n * the viewport. A negative value indicates the position is outside the visible area.\n *\n * @param x - The x-coordinate in logical space\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @returns The x-coordinate in screen space (pixels from left edge of viewport)\n *\n * @example\n * ```typescript\n * // Logical position 500 with scroll at 100\n * const screenX = logicalToScreen(500, 100);\n * // Returns: 400 (400 pixels from left edge of viewport)\n * ```\n */\nexport function logicalToScreen(x, scrollLeft) {\n return x - scrollLeft;\n}\n/**\n * Converts a screen x-coordinate to logical coordinates.\n *\n * This is the inverse of `logicalToScreen`. It translates a screen position\n * (relative to the viewport) into the logical coordinate space.\n *\n * @param x - The x-coordinate in screen space (pixels from left edge of viewport)\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @returns The x-coordinate in logical space\n *\n * @example\n * ```typescript\n * // Screen position 400 with scroll at 100\n * const logicalX = screenToLogical(400, 100);\n * // Returns: 500\n * ```\n */\nexport function screenToLogical(x, scrollLeft) {\n return x + scrollLeft;\n}\n/**\n * Converts a rectangle from logical coordinates to screen coordinates.\n *\n * This transforms the x-coordinate of the rectangle while preserving its dimensions.\n * Useful for determining where a logical region appears on screen.\n *\n * @param rect - The rectangle in logical coordinates\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @returns The rectangle in screen coordinates\n *\n * @example\n * ```typescript\n * const rect = { x: 500, y: 0, width: 200, height: 100 };\n * const screenRect = logicalToScreenRect(rect, 100);\n * // Returns: { x: 400, y: 0, width: 200, height: 100 }\n * ```\n */\nexport function logicalToScreenRect(rect, scrollLeft) {\n return {\n x: rect.x - scrollLeft,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n}\n/**\n * Converts a rectangle from screen coordinates to logical coordinates.\n *\n * This is the inverse of `logicalToScreenRect`. It transforms the x-coordinate\n * from screen space back to logical space.\n *\n * @param rect - The rectangle in screen coordinates\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @returns The rectangle in logical coordinates\n *\n * @example\n * ```typescript\n * const rect = { x: 400, y: 0, width: 200, height: 100 };\n * const logicalRect = screenToLogicalRect(rect, 100);\n * // Returns: { x: 500, y: 0, width: 200, height: 100 }\n * ```\n */\nexport function screenToLogicalRect(rect, scrollLeft) {\n return {\n x: rect.x + scrollLeft,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n };\n}\n/**\n * Clamps a numeric value between a minimum and maximum bound.\n *\n * This is a utility function to constrain values within a valid range.\n *\n * @param value - The value to clamp\n * @param min - The minimum allowed value\n * @param max - The maximum allowed value\n * @returns The clamped value, guaranteed to be between min and max (inclusive)\n *\n * @example\n * ```typescript\n * clamp(15, 0, 10); // Returns: 10\n * clamp(-5, 0, 10); // Returns: 0\n * clamp(5, 0, 10); // Returns: 5\n * ```\n */\nexport function clamp(value, min, max) {\n return Math.max(min, Math.min(value, max));\n}\n","import { css } from 'lit';\n/**\n * CSS styles for the VCanvas component.\n *\n * These styles define the layout and positioning of:\n * - The host element (`:host`)\n * - The scroll container (`.scroll-container`)\n * - The content spacer (`.spacer`)\n * - The tile pool container (`.tile-pool`)\n * - Canvas elements\n * - The children container for slotted elements (`.children-container`)\n *\n * The styles use absolute positioning to create a virtualized scrolling experience\n * where tiles are rendered only when visible in the viewport.\n *\n * @example\n * ```typescript\n * import { vcanvasStyles } from '@clinth/vcanvas';\n *\n * // Styles are automatically applied when using the VCanvas component\n * // You typically don't need to use these directly unless extending the component\n * ```\n */\nexport const vcanvasStyles = css `\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n }\n\n .scroll-container {\n overflow-x: auto;\n overflow-y: clip;\n width: 100%;\n height: 100%;\n position: relative;\n touch-action: pan-x;\n scrollbar-width: var(--scrollbar-width, auto);\n scrollbar-color: var(--scrollbar-color, auto);\n }\n\n .scroll-container.vertical {\n overflow-y: auto;\n touch-action: pan-x pan-y;\n }\n\n .spacer {\n position: absolute;\n left: 0;\n top: 0;\n pointer-events: none;\n z-index: -1;\n }\n\n .tile-pool {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n pointer-events: none;\n }\n\n canvas {\n position: absolute;\n top: 0;\n pointer-events: auto;\n }\n\n .children-container {\n position: absolute;\n top: 0;\n height: 100%;\n left: 0;\n }\n\n @property --left-fade {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --right-fade {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0;\n}\n\n@keyframes scrollfade {\n 0% {\n --left-fade: 0;\n }\n 10%,\n 100% {\n --left-fade: 3rem;\n }\n 0%,\n 90% {\n --right-fade: 3rem;\n }\n 100% {\n --right-fade: 0;\n }\n}\n\n.scrollable {\n mask: linear-gradient(to right, #0000, #ffff var(--left-fade) calc(100% - var(--right-fade)), #0000);\n animation: scrollfade;\n animation-timeline: --scrollfade;\n scroll-timeline: --scrollfade x;\n}\n\n`;\n","/**\n * Calculates the width of a tile based on viewport width and multiplier.\n *\n * @param viewportWidth - The width of the viewport in pixels\n * @param multiplier - The multiplier to apply (typically 0.25 to 1.0)\n * @returns The calculated tile width in pixels\n *\n * @example\n * ```typescript\n * getTileWidth(1000, 0.5); // Returns: 500\n * ```\n */\nexport function getTileWidth(viewportWidth, multiplier) {\n return viewportWidth * multiplier;\n}\n/**\n * Determines if the content fits within a single tile (single-tile mode).\n *\n * In single-tile mode, the content is centered in the viewport rather than\n * being scrollable. This also returns true when viewport width is 0 as a\n * defensive edge case.\n *\n * @param logicalWidth - The total logical width of the content\n * @param viewportWidth - The width of the viewport in pixels\n * @returns `true` if content fits in single tile, `false` otherwise\n *\n * @example\n * ```typescript\n * isSingleTileMode(500, 1000); // Returns: true\n * isSingleTileMode(1500, 1000); // Returns: false\n * ```\n */\nexport function isSingleTileMode(logicalWidth, viewportWidth) {\n // When viewport is 0, content trivially fits (edge case)\n if (viewportWidth === 0)\n return true;\n return logicalWidth <= viewportWidth;\n}\n/**\n * Calculates the horizontal offset to center content in single-tile mode.\n *\n * In multi-tile mode (when content exceeds viewport), this returns 0.\n * In single-tile mode, this calculates the offset needed to center the content.\n *\n * @param logicalWidth - The total logical width of the content\n * @param viewportWidth - The width of the viewport in pixels\n * @returns The horizontal offset in pixels, or 0 in multi-tile mode\n *\n * @example\n * ```typescript\n * // Content width 500 in viewport 1000: center it with 250px offset\n * getContentOffset(500, 1000); // Returns: 250\n *\n * // Content width 2000 in viewport 1000: no offset needed\n * getContentOffset(2000, 1000); // Returns: 0\n * ```\n */\nexport function getContentOffset(logicalWidth, viewportWidth) {\n // Edge cases: negative logicalWidth or zero viewport should return 0\n if (logicalWidth < 0 || viewportWidth === 0)\n return 0;\n return isSingleTileMode(logicalWidth, viewportWidth)\n ? (viewportWidth - logicalWidth) / 2\n : 0;\n}\n/**\n * Calculates the clipped width of a tile at a specific logical position.\n *\n * This accounts for:\n * - Single-tile mode (returns logicalWidth)\n * - Content boundaries (clips tiles extending beyond content)\n * - Overscroll area (if enabled)\n *\n * @param logicalX - The x-coordinate of the tile's left edge in logical space\n * @param tileWidth - The full width of the tile\n * @param logicalWidth - The total logical width of the content\n * @param viewportWidth - The width of the viewport in pixels\n * @param overscrollMultiplier - Multiplier for overscroll padding\n * @returns The clipped width of the tile (may be 0 if tile is outside valid area)\n *\n * @example\n * ```typescript\n * // Standard tile within bounds\n * getTileClippedWidth(0, 500, 2000, 1000, 1); // Returns: 500\n *\n * // Tile at end of content that needs clipping\n * getTileClippedWidth(2950, 500, 2000, 1000, 1); // Returns: 50\n * ```\n */\nexport function getTileClippedWidth(logicalX, tileWidth, logicalWidth, viewportWidth, overscrollMultiplier) {\n // Edge cases: zero tile width or negative logicalX\n if (tileWidth === 0)\n return 0;\n if (logicalX < 0)\n return 0;\n const overscrollPad = viewportWidth * overscrollMultiplier;\n const maxLogicalX = logicalWidth + overscrollPad;\n // Edge case: logicalX beyond overscroll area\n if (logicalX >= maxLogicalX)\n return 0;\n if (isSingleTileMode(logicalWidth, viewportWidth)) {\n return logicalWidth;\n }\n const rightEdge = logicalX + tileWidth;\n if (rightEdge > maxLogicalX) {\n return Math.max(0, maxLogicalX - logicalX);\n }\n return tileWidth;\n}\n/**\n * Calculates the range of tiles needed to render the current viewport.\n *\n * This determines which tiles are visible based on scroll position and\n * includes buffer tiles for smooth scrolling. Respects maxPoolSize limits.\n *\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @param viewportWidth - The width of the viewport in pixels\n * @param logicalWidth - The total logical width of the content\n * @param options - Configuration options for tile calculation\n * @returns Information about the tile range including indices and positions\n *\n * @example\n * ```typescript\n * const options = {\n * tileWidthMultiplier: 0.5,\n * tilesBuffer: 2,\n * maxPoolSize: 5,\n * // ... other options\n * };\n * const result = calculateTileRange(600, 1000, 10000, options);\n * // Returns: { firstTile: 1, lastTile: 3, tiles: [...] }\n * ```\n */\nexport function calculateTileRange(scrollLeft, viewportWidth, logicalWidth, options) {\n // Edge case: zero logicalWidth should return empty tiles array\n if (logicalWidth === 0) {\n return {\n firstTile: 0,\n lastTile: 0,\n tiles: [],\n };\n }\n const tileWidth = getTileWidth(viewportWidth, options.tileWidthMultiplier);\n if (isSingleTileMode(logicalWidth, viewportWidth)) {\n return {\n firstTile: 0,\n lastTile: 0,\n tiles: [{ index: 0, logicalX: 0 }],\n };\n }\n const firstTile = Math.floor(scrollLeft / tileWidth);\n const lastTile = Math.floor((scrollLeft + viewportWidth - 1) / tileWidth);\n const maxTileIndex = Math.max(0, Math.ceil(logicalWidth / tileWidth) - 1);\n const tiles = [];\n const startI = firstTile;\n const endI = Math.min(lastTile + options.tilesBuffer, maxTileIndex);\n for (let i = startI; i <= endI; i++) {\n const logicalX = i * tileWidth;\n if (logicalX >= logicalWidth)\n continue;\n tiles.push({ index: i, logicalX });\n if (tiles.length >= options.maxPoolSize)\n break;\n }\n return {\n firstTile: Math.max(0, firstTile),\n lastTile: tiles.length > 0 ? tiles[tiles.length - 1].index : 0,\n tiles,\n };\n}\n/**\n * Determines if a rectangular region is visible within the current viewport.\n *\n * This checks if any part of the rectangle overlaps with the visible area,\n * accounting for the current scroll position.\n *\n * @param rect - The rectangular region to check, in logical coordinates\n * @param scrollLeft - The current horizontal scroll position in pixels\n * @param viewportWidth - The width of the viewport in pixels\n * @returns `true` if any part of the region is visible, `false` otherwise\n *\n * @example\n * ```typescript\n * const region = { x: 100, y: 0, width: 200, height: 100 };\n * isRegionVisible(region, 0, 1000); // Returns: true\n * isRegionVisible(region, 500, 1000); // Returns: false (region is left of viewport)\n * ```\n */\nexport function isRegionVisible(rect, scrollLeft, viewportWidth) {\n const viewportLeft = scrollLeft;\n const viewportRight = scrollLeft + viewportWidth;\n const rectRight = rect.x + rect.width;\n return rectRight > viewportLeft && rect.x < viewportRight;\n}\n/**\n * Calculates the height of a tile based on viewport height and multiplier.\n */\nexport function getTileHeight(viewportHeight, multiplier) {\n return viewportHeight * multiplier;\n}\n/**\n * Determines if content fits within a single tile row (no vertical virtualization needed).\n * Returns true when effectiveLogicalHeight fits within the viewport.\n */\nexport function isSingleTileModeY(effectiveLogicalHeight, viewportHeight) {\n if (viewportHeight === 0)\n return true;\n return effectiveLogicalHeight <= viewportHeight;\n}\n/**\n * Calculates the vertical offset to center content in single-tile-row mode.\n */\nexport function getContentOffsetY(effectiveLogicalHeight, viewportHeight) {\n if (effectiveLogicalHeight < 0 || viewportHeight === 0)\n return 0;\n return isSingleTileModeY(effectiveLogicalHeight, viewportHeight)\n ? (viewportHeight - effectiveLogicalHeight) / 2\n : 0;\n}\n/**\n * Calculates the clipped height of a tile at a specific logical Y position.\n */\nexport function getTileClippedHeight(logicalY, tileHeight, effectiveLogicalHeight, viewportHeight, overscrollMultiplier) {\n if (tileHeight === 0)\n return 0;\n if (logicalY < 0)\n return 0;\n const overscrollPad = viewportHeight * overscrollMultiplier;\n const maxLogicalY = effectiveLogicalHeight + overscrollPad;\n if (logicalY >= maxLogicalY)\n return 0;\n if (isSingleTileModeY(effectiveLogicalHeight, viewportHeight)) {\n return effectiveLogicalHeight;\n }\n const bottomEdge = logicalY + tileHeight;\n if (bottomEdge > maxLogicalY) {\n return Math.max(0, maxLogicalY - logicalY);\n }\n return tileHeight;\n}\n/**\n * Calculates the range of tile rows needed to render the current viewport vertically.\n *\n * @param scrollTop - The current vertical scroll position in pixels\n * @param viewportHeight - The height of the viewport in pixels\n * @param effectiveLogicalHeight - The effective total logical height (logicalHeight || viewportHeight)\n * @param options - Configuration options for tile calculation\n */\nexport function calculateTileRowRange(scrollTop, viewportHeight, effectiveLogicalHeight, options) {\n if (effectiveLogicalHeight === 0) {\n return { firstRow: 0, lastRow: 0, rows: [] };\n }\n const tileHeight = getTileHeight(viewportHeight, options.tileHeightMultiplier);\n if (isSingleTileModeY(effectiveLogicalHeight, viewportHeight)) {\n return {\n firstRow: 0,\n lastRow: 0,\n rows: [{ row: 0, logicalY: 0 }],\n };\n }\n const firstRow = Math.floor(scrollTop / tileHeight);\n const lastRow = Math.floor((scrollTop + viewportHeight - 1) / tileHeight);\n const maxRowIndex = Math.max(0, Math.ceil(effectiveLogicalHeight / tileHeight) - 1);\n const rows = [];\n const endI = Math.min(lastRow + options.tilesBuffer, maxRowIndex);\n for (let i = firstRow; i <= endI; i++) {\n const logicalY = i * tileHeight;\n if (logicalY >= effectiveLogicalHeight)\n continue;\n rows.push({ row: i, logicalY });\n if (rows.length >= options.maxPoolSize)\n break;\n }\n return {\n firstRow: Math.max(0, firstRow),\n lastRow: rows.length > 0 ? rows[rows.length - 1].row : 0,\n rows,\n };\n}\n","/**\n * Creates a debounced version of a function that delays execution until after\n * a specified timeout has elapsed since the last call.\n *\n * Debouncing is useful for handling rapidly firing events (like scroll or resize)\n * by ensuring the function only executes once after the event stream settles.\n *\n * @template T - The type of the function to debounce\n * @param fn - The function to debounce\n * @param timeoutMs - The delay in milliseconds before executing the function\n * @returns A debounced version of the function with a `cancel` method\n *\n * @example\n * ```typescript\n * const debouncedLog = debouncer((msg: string) => {\n * console.log(msg);\n * }, 100);\n *\n * debouncedLog('Hello'); // Will log after 100ms\n * debouncedLog('World'); // Resets timer, will log 'World' after 100ms\n *\n * // Cancel pending execution\n * debouncedLog.cancel();\n * ```\n */\nexport function debouncer(fn, timeoutMs) {\n let timer = null;\n const debounced = (...args) => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n fn(...args);\n }, timeoutMs);\n };\n debounced.cancel = () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n return debounced;\n}\n","/** Color palette for debug tile visualization */\nconst TILE_COLORS = [\n `#FF6B6B`,\n `#4ECDC4`,\n `#45B7D1`,\n `#96CEB4`,\n `#FFEAA7`,\n `#DDA0DD`,\n `#98D8C8`,\n `#F7DC6F`,\n `#BB8FCE`,\n `#85C1E9`,\n];\n/**\n * Gets a color for a tile based on its index.\n * Colors cycle through the TILE_COLORS palette.\n *\n * @param index - The tile index\n * @returns A hex color string\n */\nfunction getTileColor(index) {\n return TILE_COLORS[index % TILE_COLORS.length];\n}\n/**\n * Draws debug visualization graphics on a tile canvas.\n *\n * This function renders diagnostic information useful for debugging tile\n * boundaries, positions, and sizing. It draws:\n * - A colored background\n * - Diagonal cross lines\n * - Center crosshair\n * - Border rectangle\n * - Text information (tile index, position, size, total width)\n *\n * @param tileIndex - The index of the tile being drawn\n * @param tilesTotal - The total number of tiles in the pool\n * @param widthTotal - The total logical width of the virtual canvas\n * @param ctx - The canvas 2D rendering context\n * @param region - The rectangular region of the tile in logical coordinates\n *\n * @example\n * ```typescript\n * // Enable debug drawing\n * vcanvas.debugDraw = true;\n *\n * // The debug graphics will be drawn on each tile automatically\n * ```\n */\nexport function drawDebugGraphic(tileIndex, tilesTotal, widthTotal, ctx, region) {\n ctx.fillStyle = `whitesmoke`;\n ctx.fillRect(region.x, region.y, region.width, region.height);\n ctx.fillStyle = getTileColor(tileIndex);\n ctx.strokeStyle = getTileColor(tileIndex);\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(region.x, region.y);\n ctx.lineTo(region.x + region.width, region.y + region.height);\n ctx.moveTo(region.x + region.width, region.y);\n ctx.lineTo(region.x, region.y + region.height);\n ctx.stroke();\n ctx.font = `24pt system-ui`;\n ctx.textBaseline = `top`;\n ctx.fillText(`#${tileIndex}/${tilesTotal}`, region.x + 20, region.y + 20);\n ctx.font = `18pt system-ui`;\n ctx.fillText(`Pos: ${Math.round(region.x)},${Math.round(region.y)}`, region.x + 20, region.y + 60);\n ctx.fillText(`Size: ${Math.round(region.width)}x${Math.round(region.height)}`, region.x + 20, region.y + 90);\n ctx.fillText(`VCanvas width: ${Math.round(widthTotal)}`, region.x + 20, region.y + 120);\n const centerX = region.x + region.width / 2;\n const centerY = region.y + region.height / 2;\n ctx.beginPath();\n ctx.moveTo(region.x, centerY);\n ctx.lineTo(region.x + region.width, centerY);\n ctx.moveTo(centerX, region.y);\n ctx.lineTo(centerX, region.y + region.height);\n ctx.stroke();\n ctx.strokeRect(region.x, region.y, region.width, region.height);\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { canvasToViewport, clamp, viewportToCanvas } from './convert';\nimport { vcanvasStyles } from './styles';\nimport { calculateTileRange, calculateTileRowRange, getContentOffset, getContentOffsetY, getTileClippedHeight, getTileClippedWidth, getTileHeight, getTileWidth, isSingleTileMode, isSingleTileModeY, } from './tile-calculator';\nimport { debouncer } from './util/debouncer';\nimport { drawDebugGraphic } from './util/draw';\nconst tileKey = (col, row) => `${col},${row}`;\nconst DEFAULT_TILE_WIDTH_MULTIPLIER = 0.5;\nconst DEFAULT_TILE_HEIGHT_MULTIPLIER = 0.5;\nconst DEFAULT_TILES_BUFFER = 2;\nconst DEFAULT_OVERLAP_PERCENT = 0.01;\nconst DEFAULT_OVERSCROLL_PAD_MULTIPLIER = 1.0;\nconst DEFAULT_MAX_POOL_SIZE = 3;\nconst DEFAULT_SCROLL_DEBOUNCE_MS = 100;\nlet VCanvas = class VCanvas extends LitElement {\n _emitScrollEndEvent(userGesture) {\n const event = new CustomEvent(`scrollend-virtual`, {\n detail: {\n logicalScrollLeft: this._scrollLeft,\n logicalScrollTop: this._scrollTop,\n userGesture,\n containerScrollLeft: this._scrollContainer?.scrollLeft ?? 0,\n containerScrollTop: this._scrollContainer?.scrollTop ?? 0,\n },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n constructor() {\n super();\n /**\n * Enables detailed console logging of tile operations for debugging.\n *\n * When `true`, the component logs information about tile creation,\n * positioning, and rendering to the console. Useful for debugging\n * tile-related issues during development.\n *\n * @default false\n */\n this.debugTrace = false;\n this.debugDraw = false;\n /**\n * Enables visual hinting for scroll position at container edges.\n *\n * When `true`, applies the 'scrollable' class to the scroll container which\n * adds CSS scroll-driven fade animations at the left and right edges,\n * providing visual feedback about scroll availability.\n *\n * @default false\n */\n this.hinting = false;\n this._viewportWidth = 0;\n this._viewportHeight = 0;\n this._scrollLeft = 0;\n this._scrollTop = 0;\n this._logicalHeight = 0;\n this._tilePool = new Map();\n this._visibleTiles = new Set();\n this._pendingDraws = new Map();\n this._scrollContainer = null;\n this._spacer = null;\n this._tilePoolEl = null;\n this._childrenContainerEl = null;\n this._resizeObserver = null;\n this._positionedChildren = new Map();\n this._boundOnScroll = this._onScroll.bind(this);\n this._renderingOptions = {\n tileWidthMultiplier: DEFAULT_TILE_WIDTH_MULTIPLIER,\n tileHeightMultiplier: DEFAULT_TILE_HEIGHT_MULTIPLIER,\n tilesBuffer: DEFAULT_TILES_BUFFER,\n overlapPercent: DEFAULT_OVERLAP_PERCENT,\n overscrollPadMultiplier: DEFAULT_OVERSCROLL_PAD_MULTIPLIER,\n maxPoolSize: DEFAULT_MAX_POOL_SIZE,\n scrollDebounceMs: DEFAULT_SCROLL_DEBOUNCE_MS,\n };\n this._dpr = window.devicePixelRatio || 1;\n this._logicalWidth = 0;\n this.logicalWidth = 0;\n this.logicalHeight = 0;\n this.drawCallback = null;\n this._scrollDebounce = debouncer(() => {\n this._requestRedrawAll(`scrollDebounce`);\n }, this._renderingOptions.scrollDebounceMs);\n this._scrollEndDebounce = debouncer(() => {\n this._emitScrollEndEvent(true);\n }, this._renderingOptions.scrollDebounceMs);\n this._resizeDebounce = debouncer(() => {\n this._onResize();\n }, this._renderingOptions.scrollDebounceMs);\n }\n static { this.styles = vcanvasStyles; }\n connectedCallback() {\n super.connectedCallback();\n this._setupResizeObserver();\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this._scrollEndDebounce.cancel();\n this._pendingDraws.forEach(ctrl => ctrl.abort());\n this._tilePool.clear();\n this._scrollContainer?.removeEventListener(`scroll`, this._boundOnScroll);\n }\n firstUpdated() {\n const scrollContainer = this.shadowRoot?.querySelector(`.scroll-container`);\n this._scrollContainer = scrollContainer;\n this._spacer = this.shadowRoot?.querySelector(`.spacer`);\n this._tilePoolEl = this.shadowRoot?.querySelector(`.tile-pool`);\n this._childrenContainerEl = this.shadowRoot?.querySelector(`.children-container`);\n if (this._scrollContainer) {\n this._scrollContainer.addEventListener(`scroll`, this._boundOnScroll);\n }\n requestAnimationFrame(() => {\n this._updateViewportDimensions();\n this._updateSpacer();\n this._updateScrollContainerClass();\n this._recalculateTiles(`firstUpdated cb`);\n this._positionChildren(`firstUpdated cb`);\n });\n }\n /**\n * The total logical width of the virtual canvas content.\n *\n * This represents the full width of the scrollable content in logical units.\n * Setting this property triggers recalculation of tiles and updates the spacer\n * element that enables native scroll behavior.\n *\n * @example\n * ```typescript\n * // Create a virtual canvas 10,000 logical units wide\n * vcanvas.logicalWidth = 10000;\n * ```\n */\n set logicalWidth(value) {\n this._logicalWidth = value;\n this._updateSpacer();\n this._updateScrollContainerClass();\n if (this.hasUpdated) {\n this._updateTileWidths(`set logicalWidth`);\n this._recalculateTiles(`set logicalWidth`);\n }\n }\n get logicalWidth() {\n return this._logicalWidth;\n }\n /**\n * The total logical height of the virtual canvas content.\n *\n * When set to 0 (default), the component uses the actual viewport height,\n * meaning no vertical virtualization is applied. Set to a value greater than\n * the viewport height to enable vertical scrolling and tile-based virtualization.\n *\n * @example\n * ```typescript\n * // Create a canvas virtualized in both axes\n * vcanvas.logicalWidth = 10000;\n * vcanvas.logicalHeight = 5000;\n * ```\n */\n set logicalHeight(value) {\n this._logicalHeight = value;\n this._updateSpacer();\n this._updateScrollContainerClass();\n if (this.hasUpdated) {\n this._recalculateTiles(`set logicalHeight`);\n }\n }\n get logicalHeight() {\n return this._logicalHeight;\n }\n /** Effective logical width: uses viewport width when logicalWidth is 0 (no horizontal virtualization). */\n get effectiveLogicalWidth() {\n return this._logicalWidth || this._viewportWidth;\n }\n /** Effective logical height: uses viewport height when logicalHeight is 0 (no vertical virtualization). */\n get effectiveLogicalHeight() {\n return this._logicalHeight || this._viewportHeight;\n }\n _setupResizeObserver() {\n this._resizeObserver = new ResizeObserver(() => {\n this._resizeDebounce();\n });\n this._resizeObserver.observe(this);\n }\n _onResize() {\n const oldWidth = this._viewportWidth;\n const oldHeight = this._viewportHeight;\n this._updateViewportDimensions();\n const widthChanged = oldWidth !== this._viewportWidth;\n const heightChanged = oldHeight !== this._viewportHeight;\n if (widthChanged || heightChanged) {\n this._updateSpacer();\n this._updateScrollContainerClass();\n this._recalculateTiles(`onResize`);\n }\n }\n _updateTileWidths(reason) {\n const tileWidth = this._getTileWidth();\n for (const tile of this._tilePool.values()) {\n const clippedWidth = this._getTileClippedWidth(tile.logicalX, tileWidth);\n tile.canvas.width = clippedWidth * this._dpr;\n tile.canvas.style.width = `${clippedWidth}px`;\n tile.ctx.scale(this._dpr, this._dpr);\n }\n this._requestRedrawAll(`updateTileWidths (${reason})`);\n }\n _updateViewportDimensions() {\n const rect = this.getBoundingClientRect();\n this._viewportWidth = rect.width;\n this._viewportHeight = rect.height;\n }\n _onScroll() {\n if (!this._scrollContainer)\n return;\n const newScrollLeft = this._scrollContainer.scrollLeft;\n const newScrollTop = this._scrollContainer.scrollTop;\n if (newScrollLeft === this._scrollLeft && newScrollTop === this._scrollTop)\n return;\n this._scrollLeft = newScrollLeft;\n this._scrollTop = newScrollTop;\n this._recalculateTiles(`onScroll`);\n this._emitScrollEvent(true);\n this._scrollDebounce();\n this._scrollEndDebounce();\n }\n _updateSpacer() {\n if (!this._spacer)\n return;\n const noHorizontalScroll = isSingleTileMode(this.effectiveLogicalWidth, this._viewportWidth);\n const noVerticalScroll = isSingleTileModeY(this.effectiveLogicalHeight, this._viewportHeight);\n if (noHorizontalScroll && noVerticalScroll) {\n this._spacer.style.display = `none`;\n }\n else {\n this._spacer.style.display = `block`;\n this._spacer.style.width = `${this.effectiveLogicalWidth}px`;\n this._spacer.style.height = `${this.effectiveLogicalHeight}px`;\n }\n if (this._childrenContainerEl) {\n this._childrenContainerEl.style.width = `${this.effectiveLogicalWidth}px`;\n this._childrenContainerEl.style.height = `${this.effectiveLogicalHeight}px`;\n }\n }\n _updateScrollContainerClass() {\n if (!this._scrollContainer)\n return;\n const verticalScroll = this.effectiveLogicalHeight > this._viewportHeight;\n this._scrollContainer.classList.toggle(`vertical`, verticalScroll);\n }\n _getTileWidth() {\n return getTileWidth(this._viewportWidth, this._renderingOptions.tileWidthMultiplier);\n }\n _getTileHeight() {\n return getTileHeight(this._viewportHeight, this._renderingOptions.tileHeightMultiplier);\n }\n _getTileClippedWidth(logicalX, tileWidth) {\n return getTileClippedWidth(logicalX, tileWidth, this.effectiveLogicalWidth, this._viewportWidth, this._renderingOptions.overscrollPadMultiplier);\n }\n _getTileClippedHeight(logicalY, tileHeight) {\n return getTileClippedHeight(logicalY, tileHeight, this.effectiveLogicalHeight, this._viewportHeight, this._renderingOptions.overscrollPadMultiplier);\n }\n _calculateTileRange() {\n return calculateTileRange(this._scrollLeft, this._viewportWidth, this.effectiveLogicalWidth, this._renderingOptions);\n }\n _calculateTileRowRange() {\n return calculateTileRowRange(this._scrollTop, this._viewportHeight, this.effectiveLogicalHeight, this._renderingOptions);\n }\n _recalculateTiles(reason) {\n // Ensure viewport dimensions are current before tile calculations\n this._updateViewportDimensions();\n const { tiles } = this._calculateTileRange();\n const { rows } = this._calculateTileRowRange();\n // Build the full set of needed keys (cross-product of columns × rows)\n const neededKeys = new Set();\n for (const { index: col, logicalX } of tiles) {\n for (const { row, logicalY } of rows) {\n neededKeys.add(tileKey(col, row));\n // Ensure tile exists in pool\n if (!this._tilePool.has(tileKey(col, row))) {\n this._tilePool.set(tileKey(col, row), this._createTile(col, row, logicalX, logicalY));\n }\n }\n }\n // Remove tiles no longer needed, enforce maxPoolSize\n const maxPoolSize = this._renderingOptions.maxPoolSize * Math.max(1, rows.length);\n const currentKeys = [...this._tilePool.keys()];\n const reuseCandidates = currentKeys.filter(k => !neededKeys.has(k));\n const missingKeys = [...neededKeys].filter(k => !this._tilePool.has(k));\n // Reuse excess tiles for missing positions\n const tilesToReuse = Math.min(reuseCandidates.length, missingKeys.length);\n for (let i = 0; i < tilesToReuse; i++) {\n const oldKey = reuseCandidates[i];\n const newKey = missingKeys[i];\n const tile = this._tilePool.get(oldKey);\n if (tile && newKey) {\n const [colStr, rowStr] = newKey.split(`,`);\n const col = Number(colStr);\n const row = Number(rowStr);\n this._tilePool.delete(oldKey);\n tile.col = col;\n tile.row = row;\n tile.logicalX = col * this._getTileWidth();\n tile.logicalY = row * this._getTileHeight();\n tile.visible = false;\n tile.canvas.dataset.tileKey = newKey;\n this._tilePool.set(newKey, tile);\n }\n }\n // Prune pool if over limit\n const keysAfterReuse = [...this._tilePool.keys()];\n if (keysAfterReuse.length > maxPoolSize) {\n const excessCount = keysAfterReuse.length - maxPoolSize;\n keysAfterReuse\n .filter(k => !neededKeys.has(k))\n .slice(0, excessCount)\n .forEach((k) => {\n const tile = this._tilePool.get(k);\n if (tile) {\n this._tilePool.delete(k);\n tile.canvas.remove();\n }\n });\n }\n this._updateTiles(`recalculateTiles (${reason})`);\n }\n _createTile(col, row, logicalX, logicalY) {\n const canvas = document.createElement(`canvas`);\n const key = tileKey(col, row);\n canvas.dataset.tileKey = key;\n const tileWidth = this._getTileWidth();\n const tileHeight = this._getTileHeight();\n const clippedWidth = this._getTileClippedWidth(logicalX, tileWidth);\n const clippedHeight = this._getTileClippedHeight(logicalY, tileHeight);\n const ctx = canvas.getContext(`2d`);\n if (!ctx)\n throw new Error(`Could not get canvas context`);\n if (this._viewportHeight === 0) {\n this.#debug(`Warning: Creating tile ${key} with viewport height 0. `\n + `The VCanvas component may not be properly sized or visible.`);\n }\n canvas.width = clippedWidth * this._dpr;\n canvas.height = clippedHeight * this._dpr;\n canvas.style.width = `${clippedWidth}px`;\n canvas.style.height = `${clippedHeight}px`;\n ctx.scale(this._dpr, this._dpr);\n this.#debug(`Created tile ${key} at logicalX ${logicalX} logicalY ${logicalY}`);\n return { canvas, ctx, logicalX, logicalY, col, row, visible: false, isInDOM: false };\n }\n _updateTiles(reason) {\n const { tiles, firstTile, lastTile } = this._calculateTileRange();\n const { rows, firstRow, lastRow } = this._calculateTileRowRange();\n const tileWidth = this._getTileWidth();\n const tileHeight = this._getTileHeight();\n const isSingleTileX = isSingleTileMode(this.effectiveLogicalWidth, this._viewportWidth);\n const isSingleTileY = isSingleTileModeY(this.effectiveLogicalHeight, this._viewportHeight);\n const contentOffsetX = getContentOffset(this.effectiveLogicalWidth, this._viewportWidth);\n const contentOffsetY = getContentOffsetY(this.effectiveLogicalHeight, this._viewportHeight);\n const tilesBuffer = this._renderingOptions.tilesBuffer;\n const tilesRedrawn = [];\n for (const tile of this._tilePool.values()) {\n tile.visible = false;\n }\n this._visibleTiles.clear();\n for (const [key, tile] of this._tilePool) {\n const colVisible = isSingleTileX\n ? tile.col === 0\n : tile.col >= firstTile - tilesBuffer && tile.col <= lastTile + tilesBuffer;\n const rowVisible = isSingleTileY\n ? tile.row === 0\n : tile.row >= firstRow - tilesBuffer && tile.row <= lastRow + tilesBuffer;\n const isVisible = colVisible && rowVisible;\n if (isVisible) {\n this._visibleTiles.add(key);\n const newLogicalX = tile.col * tileWidth;\n const newLogicalY = tile.row * tileHeight;\n const visualX = isSingleTileX ? contentOffsetX : newLogicalX;\n const visualY = isSingleTileY ? contentOffsetY : newLogicalY;\n const clippedWidth = this._getTileClippedWidth(newLogicalX, tileWidth);\n const clippedHeight = this._getTileClippedHeight(newLogicalY, tileHeight);\n const needsUpdate = !tile.visible\n || tile.logicalX !== newLogicalX\n || tile.logicalY !== newLogicalY\n || tile.canvas.style.left !== `${visualX}px`\n || tile.canvas.style.top !== `${visualY}px`\n || tile.canvas.width !== clippedWidth * this._dpr\n || tile.canvas.height !== clippedHeight * this._dpr;\n if (needsUpdate) {\n tile.logicalX = newLogicalX;\n tile.logicalY = newLogicalY;\n tile.canvas.width = clippedWidth * this._dpr;\n tile.canvas.style.width = `${clippedWidth}px`;\n tile.canvas.height = clippedHeight * this._dpr;\n tile.canvas.style.height = `${clippedHeight}px`;\n tile.canvas.style.left = `${visualX}px`;\n tile.canvas.style.top = `${visualY}px`;\n tile.ctx.scale(this._dpr, this._dpr);\n if (!tile.isInDOM && this._tilePoolEl) {\n this._tilePoolEl.appendChild(tile.canvas);\n tile.isInDOM = true;\n }\n if (!tile.visible) {\n tilesRedrawn.push(key);\n this._requestTileDraw(`updateTiles(${reason})`, key);\n }\n }\n tile.visible = true;\n }\n else if (tile.visible) {\n tile.visible = false;\n tile.isInDOM = false;\n tile.canvas.remove();\n }\n }\n // Create any newly needed tiles not yet in pool\n for (const { index: col, logicalX } of tiles) {\n for (const { row, logicalY } of rows) {\n const key = tileKey(col, row);\n if (!this._tilePool.has(key) && this._tilePoolEl) {\n const newTile = this._createTile(col, row, logicalX, logicalY);\n const visualX = isSingleTileX ? contentOffsetX : logicalX;\n const visualY = isSingleTileY ? contentOffsetY : logicalY;\n newTile.canvas.style.left = `${visualX}px`;\n newTile.canvas.style.top = `${visualY}px`;\n newTile.visible = true;\n newTile.isInDOM = true;\n this._tilePoolEl.appendChild(newTile.canvas);\n this._tilePool.set(key, newTile);\n this._visibleTiles.add(key);\n tilesRedrawn.push(key);\n this._requestTileDraw(`updateTiles(${reason})`, key);\n }\n }\n }\n return tilesRedrawn;\n }\n _requestRedrawAll(reason) {\n this.#debug(`Requesting _requestRedrawAll: ${reason} visible tiles: ${this._visibleTiles.size} pending draws: ${this._pendingDraws.size}`);\n this._pendingDraws.forEach(ctrl => ctrl.abort());\n this._pendingDraws.clear();\n for (const tileIndex of this._visibleTiles) {\n this._requestTileDraw(`requestRedrawAll(${reason})`, tileIndex);\n }\n }\n #debug(msg) {\n if (!this.debugTrace)\n return;\n console.log(`[VCanvas]`, msg);\n }\n _requestTileDraw(_reason, tileKey, region) {\n const tile = this._tilePool.get(tileKey);\n if (!tile || !this.drawCallback)\n return;\n const abortCtrl = new AbortController();\n this._pendingDraws.set(tileKey, abortCtrl);\n const tileWidth = this._getTileWidth();\n const tileHeight = this._getTileHeight();\n const isSingleTileX = isSingleTileMode(this.effectiveLogicalWidth, this._viewportWidth);\n const isSingleTileY = isSingleTileModeY(this.effectiveLogicalHeight, this._viewportHeight);\n let drawRegion;\n if (region) {\n drawRegion = region;\n }\n else {\n const overlapX = tileWidth * this._renderingOptions.overlapPercent;\n const overlapY = tileHeight * this._renderingOptions.overlapPercent;\n drawRegion = {\n x: isSingleTileX ? 0 : tile.logicalX - overlapX,\n y: isSingleTileY ? 0 : tile.logicalY - overlapY,\n width: isSingleTileX ? this.effectiveLogicalWidth : tileWidth + overlapX * 2,\n height: isSingleTileY ? this.effectiveLogicalHeight : tileHeight + overlapY * 2,\n };\n }\n tile.ctx.save();\n tile.ctx.translate(-tile.logicalX, -tile.logicalY);\n const localX = drawRegion.x - tile.logicalX;\n const localY = drawRegion.y - tile.logicalY;\n if (region) {\n tile.ctx.beginPath();\n tile.ctx.rect(localX, localY, drawRegion.width, drawRegion.height);\n tile.ctx.clip();\n tile.ctx.clearRect(localX, localY, drawRegion.width, drawRegion.height);\n }\n else {\n tile.ctx.clearRect(0, 0, tile.canvas.width, tile.canvas.height);\n }\n if (this.debugDraw) {\n drawDebugGraphic(tile.col, this._tilePool.size, this.effectiveLogicalWidth, tile.ctx, drawRegion);\n }\n try {\n this.drawCallback(tile.ctx, drawRegion, abortCtrl.signal);\n }\n finally {\n if (tile) {\n tile.ctx.restore();\n }\n this._pendingDraws.delete(tileKey);\n }\n }\n _emitScrollEvent(userGesture) {\n const event = new CustomEvent(`scroll-virtual`, {\n detail: {\n logicalScrollLeft: this._scrollLeft,\n logicalScrollTop: this._scrollTop,\n userGesture,\n containerScrollLeft: this._scrollContainer?.scrollLeft ?? 0,\n containerScrollTop: this._scrollContainer?.scrollTop ?? 0,\n viewportStartLogical: this._scrollLeft,\n viewportEndLogical: this._scrollLeft + this._viewportWidth,\n viewportStartLogicalY: this._scrollTop,\n viewportEndLogicalY: this._scrollTop + this._viewportHeight,\n },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }\n /**\n * Checks if any part of a rectangular region is currently visible in the viewport.\n *\n * This method is useful for determining whether content needs to be rendered\n * or updated based on its visibility status. The region is specified using\n * logical coordinates relative to the virtual canvas content.\n *\n * @param rect - The rectangular region to check, in logical coordinates\n * @returns true if any part of the region overlaps with the visible viewport\n *\n * @example\n * ```typescript\n * const region = { x: 1000, y: 0, width: 500, height: 1000 };\n * if (vcanvas.isRegionVisible(region)) {\n * // Region is at least partially visible, render it\n * }\n * ```\n */\n isRegionVisible(rect) {\n const viewportLeft = this._scrollLeft;\n const viewportRight = this._scrollLeft + this._viewportWidth;\n const rectRight = rect.x + rect.width;\n const xVisible = rectRight > viewportLeft && rect.x < viewportRight;\n const viewportTop = this._scrollTop;\n const viewportBottom = this._scrollTop + this._viewportHeight;\n const rectBottom = rect.y + rect.height;\n const yVisible = rectBottom > viewportTop && rect.y < viewportBottom;\n return xVisible && yVisible;\n }\n _updateScrollPosition(userGesture) {\n if (this._scrollContainer) {\n this._scrollContainer.scrollLeft = this._scrollLeft;\n this._scrollContainer.scrollTop = this._scrollTop;\n }\n this._recalculateTiles(`updateScrollPosition`);\n this._emitScrollEvent(userGesture);\n this._scrollDebounce();\n }\n get logicalScrollLeft() {\n return this._scrollLeft;\n }\n /**\n * The current logical scroll position.\n *\n * Setting this property smoothly scrolls the virtual canvas to the specified\n * position. The value is automatically clamped to valid bounds (0 to\n * logicalWidth - viewportWidth).\n *\n * @example\n * ```typescript\n * // Scroll to position 5000\n * vcanvas.logicalScrollLeft = 5000;\n *\n * // Get current scroll position\n * console.log(vcanvas.logicalScrollLeft);\n * ```\n */\n set logicalScrollLeft(value) {\n const oldValue = this._scrollLeft;\n const maxScroll = Math.max(0, this.effectiveLogicalWidth - this._viewportWidth);\n const clampedValue = clamp(value, 0, maxScroll);\n if (clampedValue !== this._scrollLeft) {\n this._scrollLeft = clampedValue;\n this.requestUpdate(`logicalScrollLeft`, oldValue);\n this._updateScrollPosition(false);\n }\n }\n get logicalScrollTop() {\n return this._scrollTop;\n }\n set logicalScrollTop(value) {\n const oldValue = this._scrollTop;\n const maxScroll = Math.max(0, this.effectiveLogicalHeight - this._viewportHeight);\n const clampedValue = clamp(value, 0, maxScroll);\n if (clampedValue !== this._scrollTop) {\n this._scrollTop = clampedValue;\n this.requestUpdate(`logicalScrollTop`, oldValue);\n this._updateScrollPosition(false);\n }\n }\n get containerScrollLeft() {\n return this._scrollContainer?.scrollLeft ?? 0;\n }\n get containerScrollTop() {\n return this._scrollContainer?.scrollTop ?? 0;\n }\n /**\n * The current viewport width in pixels.\n *\n * This value is automatically updated when the component is resized.\n * Read-only - use CSS to control the component's size.\n *\n * @example\n * ```typescript\n * const vw = vcanvas.viewportWidth;\n * ```\n */\n get viewportWidth() {\n return this._viewportWidth;\n }\n /**\n * The current viewport height in pixels.\n *\n * This value is automatically updated when the component is resized.\n * Read-only - use CSS to control the component's size.\n *\n * @example\n * ```typescript\n * const vh = vcanvas.viewportHeight;\n * ```\n */\n get viewportHeight() {\n return this._viewportHeight;\n }\n /**\n * Updates rendering options for the virtual canvas.\n *\n * Pass a partial options object to update specific settings. Any options\n * not provided retain their current values. After updating options,\n * tiles are recalculated to reflect the new configuration.\n *\n * @param options - Partial options object specifying which settings to change\n *\n * @example\n * ```typescript\n * // Reduce tile size and increase pool for smoother scrolling\n * vcanvas.setRenderingOptions({\n * tileWidthMultiplier: 0.25,\n * maxPoolSize: 8,\n * });\n *\n * // Restore defaults\n * vcanvas.setRenderingOptions({\n * tileWidthMultiplier: 0.5,\n * tilesBuffer: 2,\n * maxPoolSize: 5,\n * });\n * ```\n */\n setRenderingOptions(options) {\n this._renderingOptions = { ...this._renderingOptions, ...options };\n this._recalculateTiles(`setRenderingOptions`);\n }\n /**\n * Gets the current rendering options.\n *\n * Returns a copy of the current configuration options controlling tile\n * rendering, pool management, and scroll behavior.\n *\n * @returns The current VCanvasRenderingOptions configuration\n *\n * @example\n * ```typescript\n * const options = vcanvas.getRenderingOptions();\n * console.log('Current tile width multiplier:', options.tileWidthMultiplier);\n * ```\n */\n getRenderingOptions() {\n return this._renderingOptions;\n }\n /**\n * Forces a complete redraw of all visible tiles.\n *\n * Call this when the visual appearance of the content needs to change\n * but the logical dimensions remain the same. This aborts any pending\n * draw operations and triggers new ones for all visible tiles.\n *\n * @example\n * ```typescript\n * // Redraw after theme change\n * theme.addEventListener('change', () => {\n * vcanvas.invalidateAll();\n * });\n * ```\n */\n invalidateAll() {\n this._requestRedrawAll(`invalidateAll`);\n }\n /**\n * Forces redraw of tiles that intersect with the specified region.\n *\n * Use this for partial invalidation when only a portion of the content\n * has changed. More efficient than invalidateAll() for localized updates.\n *\n * @param x - The x-coordinate of the region's left edge (logical coordinates)\n * @param y - The y-coordinate of the region's top edge (logical coordinates)\n * @param width - The width of the region to invalidate\n * @param height - The height of the region to invalidate\n *\n * @example\n * ```typescript\n * // Redraw a specific area after updating content\n * vcanvas.invalidateRegion(1000, 0, 500, 1000);\n * ```\n */\n invalidateRegion(x, y, width, height) {\n this.#debug(`invalidateRegion: ${x},${y},${width},${height}`);\n const tileWidth = this._getTileWidth();\n const tileHeight = this._getTileHeight();\n const { firstTile, lastTile } = this._calculateTileRange();\n const { firstRow, lastRow } = this._calculateTileRowRange();\n const overlap = this._renderingOptions.overlapPercent;\n const startCol = Math.floor(x / tileWidth);\n const endCol = Math.ceil((x + width) / tileWidth);\n const startRow = Math.floor(y / tileHeight);\n const endRow = Math.ceil((y + height) / tileHeight);\n for (let col = Math.max(firstTile, startCol); col <= Math.min(lastTile, endCol); col++) {\n for (let row = Math.max(firstRow, startRow); row <= Math.min(lastRow, endRow); row++) {\n const key = tileKey(col, row);\n if (this._visibleTiles.has(key)) {\n const tile = this._tilePool.get(key);\n if (tile) {\n const overlapX = tileWidth * overlap;\n const overlapY = tileHeight * overlap;\n const tileStartX = tile.logicalX - overlapX;\n const tileEndX = tile.logicalX + tileWidth + overlapX;\n const tileStartY = tile.logicalY - overlapY;\n const tileEndY = tile.logicalY + tileHeight + overlapY;\n const intersectX = Math.max(x, tileStartX);\n const intersectWidth = Math.min(x + width, tileEndX) - intersectX;\n const intersectY = Math.max(y, tileStartY);\n const intersectHeight = Math.min(y + height, tileEndY) - intersectY;\n if (intersectWidth > 0 && intersectHeight > 0) {\n const region = {\n x: intersectX,\n y: intersectY,\n width: intersectWidth,\n height: intersectHeight,\n };\n this._requestTileDraw(`invalidateRegion`, key, region);\n }\n }\n }\n }\n }\n }\n /**\n * Converts viewport-relative coordinates to canvas-relative (logical) coordinates.\n *\n * Viewport coordinates are relative to the visible area, while canvas coordinates\n * are in the logical coordinate system of the virtual canvas content.\n *\n * @param x - The x-coordinate in viewport space\n * @param y - The y-coordinate in viewport space\n * @returns The coordinates in canvas (logical) space\n *\n * @example\n * ```typescript\n * // Convert mouse position to logical coordinates for hit testing\n * vcanvas.addEventListener('click', (e) => {\n * const logical = vcanvas.convertFromViewportToCanvas(e.offsetX, e.offsetY);\n * console.log('Clicked at logical position:', logical.x);\n * });\n * ```\n */\n convertFromViewportToCanvas(x, y) {\n const contentOffsetX = getContentOffset(this.effectiveLogicalWidth, this._viewportWidth);\n const contentOffsetY = getContentOffsetY(this.effectiveLogicalHeight, this._viewportHeight);\n return viewportToCanvas(x, y, this._scrollLeft, contentOffsetX, this._scrollTop, contentOffsetY);\n }\n /**\n * Converts canvas-relative (logical) coordinates to viewport-relative coordinates.\n *\n * This is the inverse of `convertFromViewportToCanvas`. Use this to convert\n * logical positions back to viewport coordinates for positioning UI elements.\n *\n * @param x - The x-coordinate in logical space\n * @param y - The y-coordinate in logical space\n * @returns The coordinates in viewport space\n *\n * @example\n * ```typescript\n * // Convert logical marker position to viewport for tooltip positioning\n * const viewportPos = vcanvas.convertFromCanvasToViewport(markerX, 0);\n * tooltip.style.left = `${viewportPos.x}px`;\n * ```\n */\n convertFromCanvasToViewport(x, y) {\n const contentOffsetX = getContentOffset(this.effectiveLogicalWidth, this._viewportWidth);\n const contentOffsetY = getContentOffsetY(this.effectiveLogicalHeight, this._viewportHeight);\n return canvasToViewport(x, y, this._scrollLeft, contentOffsetX, this._scrollTop, contentOffsetY);\n }\n /**\n * Positions light DOM child elements matching the query within a logical coordinate range.\n *\n * This method allows you to position HTML elements (like tooltips, markers, or overlays)\n * at specific logical coordinates within the virtual canvas. The elements will scroll\n * with the canvas content, maintaining their logical position.\n *\n * @param query - A CSS selector string to match child elements\n * @param startX - The starting x-coordinate in logical space\n * @param endX - The ending x-coordinate in logical space (determines width)\n * @param startY - The starting y-coordinate in logical space (optional)\n * @param endY - The ending y-coordinate in logical space (optional)\n *\n * @example\n * ```typescript\n * // Position a marker element at logical position x=200 spanning 200px\n * vcanvas.positionChildRange('#marker', 200, 400);\n *\n * // Position multiple elements with a class\n * vcanvas.positionChildRange('.timeline-item', 0, 1000);\n * ```\n */\n positionChildRange(query, startX, endX, startY, endY) {\n if (Number.isNaN(startX) || Number.isNaN(endX)) {\n console.warn(`positionChildRange: Invalid startX or endX values: ${startX}, ${endX}`);\n return;\n }\n const children = Array.from(this.children).filter(child => child.matches?.(query));\n const resolvedStartY = startY ?? 0;\n const resolvedEndY = endY ?? this.effectiveLogicalHeight;\n for (const child of children) {\n this._positionedChildren.set(child, { startX, endX, startY: resolvedStartY, endY: resolvedEndY });\n }\n this._positionChildren(`positionChildRange`);\n }\n /**\n * Manually triggers an update of child element positioning.\n *\n * This is useful when the viewport dimensions have changed outside the normal\n * update cycle and you need to reposition slotted children immediately.\n * Normally, child positioning is automatically updated during scroll and resize.\n *\n * @example\n * ```typescript\n * // Force immediate update after custom layout changes\n * vcanvas.manualChildPositioningUpdate();\n * ```\n */\n manualChildPositioningUpdate() {\n this._positionChildren(`manualChildPositioningUpdate`);\n }\n /**\n * Stops positioning child elements matching the query and resets their styles.\n *\n * This removes children from the positioning system and clears any inline\n * styles that were applied by `positionChildRange()`. The children remain\n * in the DOM but are no longer positioned by the virtual canvas.\n *\n * @param query - A CSS selector string to match child elements\n *\n * @example\n * ```typescript\n * // Stop positioning a specific child element\n * vcanvas.positionChildClear('#child-0');\n *\n * // Stop positioning all children with a specific class\n * vcanvas.positionChildClear('.my-element');\n * ```\n */\n positionChildClear(query) {\n for (const [child] of this._positionedChildren) {\n if (child.matches?.(query)) {\n this._positionedChildren.delete(child);\n child.removeAttribute(`style`);\n }\n }\n }\n _positionChildren(source) {\n this.#debug(`_positionChildren: ${source} positionedChildren: ${this._positionedChildren.size}`);\n if (!this.hasUpdated)\n return;\n if (!this._childrenContainerEl)\n return;\n // console.log(`positionChildren`);\n for (const [child, config] of this._positionedChildren) {\n const width = config.endX - config.startX;\n const height = config.endY - config.startY;\n child.setAttribute(`style`, `position: absolute; left: ${config.startX}px; top: ${config.startY}px; width: ${width}px; height: ${height}px;`);\n }\n }\n render() {\n const scrollContainerClasses = classMap({\n 'scroll-container': true,\n 'scrollable': this.hinting,\n });\n return html `\n <div class=${scrollContainerClasses}>\n <div class=\"spacer\"></div>\n <div class=\"tile-pool\"></div>\n <div class=\"children-container\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n};\n__decorate([\n property({ type: Boolean })\n], VCanvas.prototype, \"hinting\", void 0);\n__decorate([\n property()\n], VCanvas.prototype, \"logicalWidth\", null);\n__decorate([\n property()\n], VCanvas.prototype, \"logicalHeight\", null);\n__decorate([\n property({ type: Number })\n], VCanvas.prototype, \"logicalScrollLeft\", null);\n__decorate([\n property({ type: Number })\n], VCanvas.prototype, \"logicalScrollTop\", null);\nVCanvas = __decorate([\n customElement(`x-vcanvas`)\n /**\n * A virtualized canvas component that efficiently renders large scrollable content\n * using a tiled approach with automatic viewport culling and tile recycling.\n *\n * The virtual canvas divides content into tiles that are only rendered when\n * visible in the viewport. As the user scrolls, tiles are repositioned and\n * recycled rather than destroyed and recreated, providing smooth performance\n * even with very large content areas.\n *\n * @example\n * ```html\n * <x-vcanvas logicalWidth=\"10000\"></x-vcanvas>\n * ```\n *\n * @example\n * ```typescript\n * const vcanvas = document.querySelector('x-vcanvas');\n * vcanvas.drawCallback = (ctx, region, signal) => {\n * ctx.fillStyle = 'blue';\n * ctx.fillRect(region.x, region.y, region.width, region.height);\n * };\n * ```\n */\n], VCanvas);\nexport { VCanvas };\n","import type { PropertyValues } from 'lit';\nimport type { CssVars, Rect } from './timeline-draw.js';\nimport type {\n DragSnappingFn,\n DragTarget,\n GridMode,\n GridResolution,\n TimelineElementEventMap,\n TimelineEvent,\n TimelineSelectionChangeDetail,\n TimelineTickleChangeDetail,\n TimelineTrack,\n TimelineTrackResizeDetail,\n TimelineTrackSelectDetail,\n TrackHeightMode,\n TrackLayout,\n UserScale,\n ViewRange,\n} from './types.js';\nimport { html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport {\n drawAxis,\n drawEventRects,\n drawMajorMinorGrid,\n drawMarquee,\n drawTrackBackgrounds,\n resolveCssVars,\n resolveGrid,\n} from './timeline-draw.js';\nimport { applyDeadzone, attachTimelineInteractions, AXIS_DEADZONE_PX, computeVerticalAxisZoom, DRAG_ACTIVATION_PX } from './timeline-interactions.js';\nimport { timelineStyles } from './timeline-styles.js';\nimport './timeline-track-tabs.js';\n\nimport '@clinth/vcanvas';\n\n// Minimal type for the x-vcanvas element we need\ntype VCanvasElement = HTMLElement & {\n logicalWidth: number;\n logicalHeight: number;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n drawCallback: ((ctx: CanvasRenderingContext2D, region: Rect, signal: AbortSignal) => void) | null;\n invalidateAll: () => void;\n invalidateRegion: (x: number, y: number, w: number, h: number) => void;\n convertFromViewportToCanvas: (x: number, y: number) => { x: number; y: number };\n convertFromCanvasToViewport: (x: number, y: number) => { x: number; y: number };\n};\n\n/** Reasonable maximum ppu to prevent infinite zoom-in */\nconst MAX_PPU = 10_000;\n\n/** Minimum rendered track height (~1.5em) at max zoom-out */\nconst MIN_TRACK_RENDER_HEIGHT = 24;\n\n@customElement(`ixfx-timeline`)\nexport class IxfxTimelineElement extends LitElement {\n static override styles = [timelineStyles];\n\n // ── Public properties ───────────────────────────────────────────────\n @property({ type: Array }) tracks: TimelineTrack[] = [];\n @property({ type: Array }) events: TimelineEvent[] = [];\n @property({ type: Number }) min = 0;\n @property({ type: Number }) max = 1000;\n @property({ type: String, attribute: `track-height` }) trackHeight: TrackHeightMode = `fixed`;\n @property({ type: String, attribute: `user-scale` }) userScale: UserScale = `normal`;\n @property({ type: Boolean }) reorderable = false;\n @property({ type: Boolean, attribute: `meta` }) metaEnabled = false;\n @property({ type: Boolean, attribute: `alt-major-bg` }) altMajorBg = false;\n @property({ type: Number, attribute: `default-track-height` }) defaultTrackHeight = 48;\n @property({ type: String, attribute: `grid-mode` }) gridMode: GridMode = `adaptive`;\n @property({ type: Number, attribute: `minor-step` }) minorStep = 10;\n @property({ type: Object }) onDragging: DragSnappingFn | null = null;\n\n /** Set by TimelineController — formats logical value to label string */\n formatLabel: (v: number) => string = String;\n\n // ── Internal state ──────────────────────────────────────────────────\n /**\n * _ppu (pixels per unit) is the PRIMARY horizontal zoom state.\n * _viewRange.min is the PRIMARY horizontal pan state.\n * _viewRange.max is DERIVED: min + viewportWidth / _ppu.\n */\n @state() _ppu = 1;\n @state() _viewRange: ViewRange = { min: 0, max: 4000 };\n\n /**\n * Vertical zoom/pan state. Analogous to horizontal:\n * - _vViewRange is in \"base height units\" (pre-scale track pixels).\n * - _vScale = viewportHeight / (b - a). When range spans all base height, all tracks fit.\n * - _vScrollOffset = _vViewRange.min * _vScale — the pixel offset applied to content.\n */\n @state() _vViewRange: ViewRange = { min: 0, max: 1 };\n @state() _vScale = 1.0;\n\n @state() _selectedIds: Set<string> = new Set();\n @state() _tickledId: string | undefined = undefined;\n @state() _drag: DragTarget = { kind: `none` };\n @state() _metaHeight = 120;\n @state() _trackHeightOverrides: Map<string, number> = new Map();\n @state() _trackLayout: TrackLayout[] = [];\n @state() _internalEvents: TimelineEvent[] = [];\n @state() _internalTracks: TimelineTrack[] = [];\n\n // ── Private refs ────────────────────────────────────────────────────\n #vcanvas: VCanvasElement | null = null;\n #cssVarsCache: CssVars = {};\n #cleanupInteractions: (() => void) | null = null;\n #axisHeight = 24;\n #prevTickledId: string | undefined = undefined;\n #resizeObserver: ResizeObserver | null = null;\n #pendingVerticalZoomToFit = false;\n #hasInitializedZoom = false;\n\n // ── Computed getters (for interactions module) ──────────────────────\n\n /** Pixels per logical unit — the zoom level */\n get pxPerUnit(): number {\n return this._ppu;\n }\n\n /** Height of the axis header band in pixels */\n get axisHeight(): number {\n return this.#axisHeight;\n }\n\n /** Width of the track tab area in pixels (from --timeline-tab-width CSS var) */\n get tabWidth(): number {\n return this.#tabWidth;\n }\n\n // ── Viewport helpers ────────────────────────────────────────────────\n\n #getViewportWidth(): number {\n const raw = this.#vcanvas?.viewportWidth\n ?? (this.#vcanvas as HTMLElement | null)?.clientWidth\n ?? 800;\n return raw;\n }\n\n /** Minimum ppu: fits the full total range into the viewport */\n #minPpu(): number {\n const totalSpan = this.max - this.min;\n if (totalSpan <= 0)\n return 1;\n const vpWidth = this.#getViewportWidth();\n return vpWidth / totalSpan;\n }\n\n // ── Vertical viewport helpers ───────────────────────────────────────\n\n /** Available vertical pixels for track content (excludes axis) */\n #getViewportHeight(): number {\n return this.#vcanvas?.viewportHeight\n ?? (this.#vcanvas as HTMLElement | null)?.clientHeight\n ?? 300;\n }\n\n /**\n * Total base height: sum of all visible track base heights (before vScale).\n * This is the \"total range\" for the vertical slider.\n */\n #getTotalBaseHeight(): number {\n let total = 0;\n for (const track of this._internalTracks) {\n if (track.hidden)\n continue;\n const override = this._trackHeightOverrides.get(track.key);\n total += override ?? track.height ?? this.defaultTrackHeight;\n }\n return total || 1; // avoid zero\n }\n\n /** Smallest base height among visible tracks (before vScale) */\n #getSmallestBaseTrackHeight(): number {\n let smallest = Infinity;\n for (const track of this._internalTracks) {\n if (track.hidden)\n continue;\n const override = this._trackHeightOverrides.get(track.key);\n const h = override ?? track.height ?? this.defaultTrackHeight;\n if (h < smallest)\n smallest = h;\n }\n return smallest === Infinity ? this.defaultTrackHeight : smallest;\n }\n\n /** Largest base height among visible tracks (before vScale) */\n #getLargestBaseTrackHeight(): number {\n let largest = 0;\n for (const track of this._internalTracks) {\n if (track.hidden)\n continue;\n const override = this._trackHeightOverrides.get(track.key);\n const h = override ?? track.height ?? this.defaultTrackHeight;\n if (h > largest)\n largest = h;\n }\n return largest || this.defaultTrackHeight;\n }\n\n /**\n * Derive vScale and vViewRange from a given vertical view range.\n * viewportHeight / span = scale factor applied to base track heights.\n * The axis header takes up fixed space, so available height for tracks is reduced.\n */\n #deriveVerticalZoom(vMin: number, vMax: number): void {\n const totalBase = this.#getTotalBaseHeight();\n const vpHeight = this.#getViewportHeight() - this.#axisHeight;\n\n // Clamp range to [0, totalBase]\n let a = vMin;\n let b = vMax;\n\n // Min span (max zoom-in): largest visible track fills the viewport\n const largestBase = this.#getLargestBaseTrackHeight();\n const minSpan = Math.max(largestBase, totalBase * 0.05);\n\n // Max span (max zoom-out): smallest visible track must not shrink below MIN_TRACK_RENDER_HEIGHT\n // Since renderedHeight = baseHeight * vScale and vScale = vpHeight / span,\n // we need: smallestBase * (vpHeight / span) >= MIN_TRACK_RENDER_HEIGHT\n // → span <= vpHeight * smallestBase / MIN_TRACK_RENDER_HEIGHT\n const smallestBase = this.#getSmallestBaseTrackHeight();\n const maxSpanFromMinHeight = vpHeight > 0\n ? vpHeight * smallestBase / MIN_TRACK_RENDER_HEIGHT\n : totalBase;\n const maxSpan = Math.min(totalBase, maxSpanFromMinHeight);\n\n let span = b - a;\n if (span < minSpan) {\n const center = (a + b) / 2;\n a = center - minSpan / 2;\n b = center + minSpan / 2;\n span = minSpan;\n }\n if (span > maxSpan) {\n const center = (a + b) / 2;\n a = center - maxSpan / 2;\n b = center + maxSpan / 2;\n span = maxSpan;\n }\n\n if (b > totalBase) {\n b = totalBase;\n a = Math.max(0, b - span);\n }\n if (a < 0) {\n a = 0;\n b = Math.min(totalBase, a + span);\n }\n\n this._vViewRange = { min: a, max: b };\n this._vScale = vpHeight > 0 ? vpHeight / (b - a) : 1;\n }\n\n /** Reset vertical zoom to fit all tracks */\n #initVerticalZoomToFit(): void {\n const totalBase = this.#getTotalBaseHeight();\n this.#deriveVerticalZoom(0, totalBase);\n }\n\n /** Pixel offset to scroll the content area */\n get #vScrollOffset(): number {\n return this._vViewRange.min * this._vScale;\n }\n\n /**\n * Derive viewRange from ppu + viewMin, clamped to [min, max].\n * Returns a new ViewRange.\n */\n #deriveViewRange(viewMin: number, ppu: number): ViewRange {\n const vpWidth = this.#getViewportWidth();\n const viewSpan = ppu > 0 ? vpWidth / ppu : (this.max - this.min);\n let newMin = viewMin;\n let newMax = newMin + viewSpan;\n\n // Clamp: don't let max exceed total max\n if (newMax > this.max) {\n newMax = this.max;\n newMin = Math.max(this.min, newMax - viewSpan);\n }\n // Clamp: don't let min go below total min\n if (newMin < this.min) {\n newMin = this.min;\n newMax = Math.min(this.max, newMin + viewSpan);\n }\n\n return { min: newMin, max: newMax };\n }\n\n // ── Public methods: zoom & pan ──────────────────────────────────────\n\n /** Set the zoom level (pixels per logical unit) */\n setPpu(ppu: number): void {\n this._ppu = Math.max(this.#minPpu(), Math.min(ppu, MAX_PPU));\n this._viewRange = this.#deriveViewRange(this._viewRange.min, this._ppu);\n }\n\n /**\n * Set the view range. ppu is back-computed from the span.\n * Use for programmatic view changes (e.g. TimelineController).\n */\n setViewRange(range: ViewRange): void {\n const vpWidth = this.#getViewportWidth();\n const span = range.max - range.min;\n if (span > 0) {\n this._ppu = Math.max(this.#minPpu(), Math.min(vpWidth / span, MAX_PPU));\n }\n this._viewRange = this.#deriveViewRange(range.min, this._ppu);\n }\n\n /**\n * Set zoom + pan atomically. Used by axis-zoom interaction.\n * viewMin is the left edge in timeline units; ppu is the new zoom level.\n */\n setZoomPan(viewMin: number, ppu: number): void {\n this._ppu = Math.max(this.#minPpu(), Math.min(ppu, MAX_PPU));\n this._viewRange = this.#deriveViewRange(viewMin, this._ppu);\n }\n\n /**\n * Set vertical zoom + pan atomically. Used by v-axis-zoom interaction.\n * vMin/vMax define the vertical view range in base-height units.\n */\n setVerticalZoomPan(vMin: number, vMax: number): void {\n this.#deriveVerticalZoom(vMin, vMax);\n }\n\n selectAll(): void {\n this._selectedIds = new Set(this._internalEvents.map(e => e.id));\n this.#fireSelectionChange();\n this.#invalidateCanvas();\n }\n\n deselectAll(): void {\n this._selectedIds = new Set();\n this.#fireSelectionChange();\n this.#invalidateCanvas();\n }\n\n getTrackEvents(trackKey: string): TimelineEvent[] {\n return this._internalEvents.filter(e => e.trackKey === trackKey);\n }\n\n get selectedIds(): readonly string[] {\n return [...this._selectedIds];\n }\n\n set selectedIds(ids: readonly string[]) {\n this._selectedIds = new Set(ids);\n this.#fireSelectionChange();\n this.#invalidateCanvas();\n }\n\n selectTrack(key: string, shiftKey: boolean = false): void {\n this.dispatchEvent(\n new CustomEvent<TimelineTrackSelectDetail>(`track-select`, {\n detail: { trackKey: key, shiftKey },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** Resets all track height overrides to the default height and resets vertical zoom. */\n resetTrackHeights(): void {\n this._trackHeightOverrides = new Map();\n this.#pendingVerticalZoomToFit = true;\n // willUpdate will see the flag and reset vertical zoom during the same update cycle\n }\n\n /** Default no-op snapping - no modification of drag values */\n static defaultDragSnapping: DragSnappingFn = () => ({});\n\n /** Grid-snapping - snaps start/end to nearest minor gridline */\n static gridSnapping: DragSnappingFn = (detail) => {\n const { gridResolution, currentStart, currentEnd } = detail;\n const { minorStep } = gridResolution;\n return {\n start: Math.round(currentStart / minorStep) * minorStep,\n end: Math.round(currentEnd / minorStep) * minorStep,\n };\n };\n\n /**\n * Called by timeline-interactions during drag.\n * Applies onDragging callback if set, then fires 'dragging' event.\n * Returns constrained values.\n */\n processDrag(\n eventId: string,\n rawLogicalX: number,\n rawY: number,\n currentStart: number,\n currentEnd: number,\n currentTrackKey: string,\n originTrackKey: string,\n gridResolution: GridResolution,\n ): { start: number; end: number; trackKey: string } {\n let constrainedStart = currentStart;\n let constrainedEnd = currentEnd;\n let constrainedTrackKey = currentTrackKey;\n\n if (this.onDragging) {\n const result = this.onDragging({\n eventId,\n rawLogicalX,\n rawY,\n currentStart,\n currentEnd,\n currentTrackKey,\n gridResolution,\n originTrackKey,\n });\n constrainedStart = result.start ?? currentStart;\n constrainedEnd = result.end ?? currentEnd;\n constrainedTrackKey = result.trackKey ?? currentTrackKey;\n }\n\n this.dispatchEvent(\n new CustomEvent(`dragging`, {\n detail: {\n eventId,\n start: constrainedStart,\n end: constrainedEnd,\n trackKey: constrainedTrackKey,\n rawLogicalX,\n rawY,\n originTrackKey,\n },\n bubbles: true,\n composed: true,\n }),\n );\n\n return {\n start: constrainedStart,\n end: constrainedEnd,\n trackKey: constrainedTrackKey,\n };\n }\n\n /** Returns the vcanvas element (for timeline-interactions) */\n getVCanvas(): VCanvasElement | null {\n return this.#vcanvas;\n }\n\n /** Returns the currently hovered (tickled) event, or null if none. */\n get tickledEvent(): TimelineEvent | null {\n if (this._tickledId === undefined)\n return null;\n return this._internalEvents.find(e => e.id === this._tickledId) ?? null;\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────\n\n protected override firstUpdated(): void {\n this.#vcanvas = this.shadowRoot?.querySelector(`x-vcanvas`) as VCanvasElement | null;\n\n if (this.#vcanvas) {\n this.#vcanvas.drawCallback = this.#drawCallback;\n this.#vcanvas.addEventListener(`scroll-virtual`, this.#onScrollVirtual as EventListener);\n this.#cleanupInteractions = attachTimelineInteractions(this, this.#vcanvas);\n\n // Watch for viewport resizes — adjust viewRange.max, keep ppu stable.\n // The observer fires immediately with the initial size, which handles\n // the initial zoom-to-fit without setting state in firstUpdated.\n this.#resizeObserver = new ResizeObserver(this.#onResize);\n this.#resizeObserver.observe(this.#vcanvas);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupInteractions?.();\n this.#cleanupInteractions = null;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n /**\n * willUpdate runs before render — safe to set @state() properties here\n * without triggering an additional update cycle. All state derivation\n * (internal copies, track layout, vertical zoom) happens here.\n */\n protected override willUpdate(changedProps: PropertyValues): void {\n // Sync external tracks/events into internal managed copies on shallow change\n let needsLayoutRecompute = false;\n let needsVerticalZoomReset = false;\n let needsHorizontalZoomToFit = false;\n\n if (changedProps.has(`tracks`)) {\n this._internalTracks = [...this.tracks];\n needsLayoutRecompute = true;\n needsVerticalZoomReset = true;\n }\n if (changedProps.has(`events`)) {\n this._internalEvents = [...this.events];\n }\n if (changedProps.has(`trackHeight`)) {\n // Mode changed — clear per-track overrides when leaving 'free' mode\n if (this.trackHeight !== `free` && this._trackHeightOverrides.size > 0) {\n this._trackHeightOverrides = new Map();\n }\n needsLayoutRecompute = true;\n needsVerticalZoomReset = true;\n }\n if (changedProps.has(`_vScale`) || changedProps.has(`defaultTrackHeight`) || changedProps.has(`_trackHeightOverrides`)) {\n needsLayoutRecompute = true;\n }\n if (changedProps.has(`min`) || changedProps.has(`max`)) {\n needsHorizontalZoomToFit = true;\n }\n\n // Consume pending zoom-to-fit flag (from resetTrackHeights)\n if (this.#pendingVerticalZoomToFit) {\n this.#pendingVerticalZoomToFit = false;\n needsVerticalZoomReset = true;\n }\n\n // Horizontal zoom-to-fit when total range changes\n if (needsHorizontalZoomToFit) {\n this.#initZoomToFit();\n }\n // Vertical zoom reset must happen BEFORE layout recompute (layout uses _vScale)\n if (needsVerticalZoomReset) {\n this.#initVerticalZoomToFit();\n }\n if (needsLayoutRecompute) {\n this.#recomputeTrackLayout();\n }\n }\n\n /**\n * updated runs after render — for DOM side-effects only (syncing vcanvas,\n * scrolling, invalidating canvas, dispatching events).\n */\n protected override updated(changedProps: PropertyValues): void {\n if (changedProps.has(`_ppu`) || changedProps.has(`_viewRange`) || changedProps.has(`min`) || changedProps.has(`max`)) {\n this.#syncVCanvas();\n this.#invalidateCanvas();\n }\n if (changedProps.has(`events`) || changedProps.has(`userScale`) || changedProps.has(`altMajorBg`) || changedProps.has(`gridMode`) || changedProps.has(`minorStep`)) {\n this.#invalidateCanvas();\n }\n if (changedProps.has(`_trackLayout`)) {\n this.#syncVCanvasVertical();\n this.#positionTabs();\n this.#invalidateCanvas();\n }\n\n // Sync vertical zoom/pan to vcanvas logicalScrollTop + logicalHeight\n if (changedProps.has(`_vViewRange`) || changedProps.has(`_vScale`)) {\n this.#syncVerticalScroll();\n this.#invalidateCanvas();\n }\n\n if (this._tickledId !== this.#prevTickledId) {\n this.#prevTickledId = this._tickledId;\n this.dispatchEvent(\n new CustomEvent<TimelineTickleChangeDetail>(`tickle-change`, {\n detail: { event: this.tickledEvent },\n bubbles: true,\n composed: true,\n }),\n );\n }\n }\n\n protected override render() {\n const totalBaseHeight = this.#getTotalBaseHeight();\n\n return html`\n <div class=\"content-wrapper\">\n <div class=\"content-area\">\n <div class=\"v-axis-zone\"\n @pointerdown=${this.#onVAxisPointerDown}\n @pointermove=${this.#onVAxisPointerMove}\n @pointerup=${this.#onVAxisPointerUp}\n @pointercancel=${this.#onVAxisPointerUp}\n ></div>\n <div class=\"tab-column\">\n ${this._internalTracks\n .filter(t => !t.hidden)\n .map((t) => {\n const layout = this._trackLayout.find(l => l.trackKey === t.key);\n if (!layout)\n return nothing;\n return html`\n <ixfx-timeline-track-tab\n .label=${t.label}\n track-key=\"${t.key}\"\n ?resizable=${this.trackHeight !== `none`}\n ?reorderable=${this.reorderable}\n @click=${(e: MouseEvent) => this.selectTrack(t.key, e.shiftKey)}\n @track-resize-move=${this.#onTrackResizeMove}\n @track-resize=${this.#onTrackResizeEnd}\n ></ixfx-timeline-track-tab>\n `;\n })}\n </div>\n <x-vcanvas></x-vcanvas>\n </div>\n <div class=\"v-zoom\">\n <ixfx-range-multi\n orientation=\"vertical\"\n min=\"0\"\n max=\"${totalBaseHeight}\"\n a=\"${this._vViewRange.min}\"\n b=\"${this._vViewRange.max}\"\n step=\"any\"\n crossover=\"stop\"\n resize-mode=\"bipolar-flex\"\n @input=${this.#onVZoomInput}\n ></ixfx-range-multi>\n </div>\n </div>\n\n <div class=\"h-zoom\">\n <ixfx-range-multi\n min=\"${this.min}\"\n max=\"${this.max}\"\n a=\"${this._viewRange.min}\"\n b=\"${this._viewRange.max}\"\n crossover=\"stop\"\n resize-mode=\"bipolar-flex\"\n @input=${this.#onHZoomInput}\n ></ixfx-range-multi>\n </div>\n\n <div class=\"meta-resizer ${this.metaEnabled ? `visible` : ``}\"></div>\n <div class=\"meta-area ${this.metaEnabled ? `visible` : ``}\" style=\"height:${this._metaHeight}px\"></div>\n `;\n }\n\n // ── VCanvas wiring ──────────────────────────────────────────────────\n\n /** Compute initial ppu to fit 80% of the range, then derive viewRange */\n #initZoomToFit(): void {\n const vpWidth = this.#getViewportWidth();\n const totalSpan = this.max - this.min;\n const zoomFactor = 0.8;\n this._ppu = totalSpan > 0 ? vpWidth / (totalSpan * zoomFactor) : 1;\n this._viewRange = { min: this.min, max: this.min + totalSpan * zoomFactor };\n this.#syncVCanvas();\n // ResizeObserver will re-derive viewRange once vcanvas has its final layout\n }\n\n #syncVCanvas(): void {\n if (!this.#vcanvas)\n return;\n const totalSpan = this.max - this.min;\n // logicalWidth = pure timeline content width in pixels (no tab offset)\n this.#vcanvas.logicalWidth = totalSpan * this._ppu;\n this.#syncVCanvasVertical();\n this.#syncVCanvasScroll();\n }\n\n /** Sync logicalHeight and logicalScrollTop to the vcanvas */\n #syncVCanvasVertical(): void {\n if (!this.#vcanvas)\n return;\n const totalHeight = this._trackLayout.reduce((sum, tl) => sum + tl.height, 0);\n const canvasHeight = Math.max(totalHeight, 40) + this.#axisHeight;\n this.#vcanvas.logicalHeight = canvasHeight;\n this.#vcanvas.logicalScrollTop = this.#vScrollOffset;\n }\n\n #syncVCanvasScroll(): void {\n if (!this.#vcanvas)\n return;\n // Scroll position in logical pixels: pure timeline scroll offset (no tab area)\n this.#vcanvas.logicalScrollLeft = (this._viewRange.min - this.min) * this._ppu;\n }\n\n #invalidateCanvas(): void {\n this.#vcanvas?.invalidateAll();\n }\n\n /** Called by ResizeObserver when vcanvas/content-area changes size */\n #onResize = (_entries: ResizeObserverEntry[]): void => {\n if (!this.#hasInitializedZoom) {\n // First resize after mount — compute initial zoom-to-fit\n this.#hasInitializedZoom = true;\n this.#initZoomToFit();\n this.#initVerticalZoomToFit();\n this.#recomputeTrackLayout();\n } else {\n // Subsequent resizes — keep ppu/vViewRange, re-derive from new viewport size\n this._viewRange = this.#deriveViewRange(this._viewRange.min, this._ppu);\n this.#deriveVerticalZoom(this._vViewRange.min, this._vViewRange.max);\n }\n this.#syncVCanvas();\n\n this.#invalidateCanvas();\n };\n\n #drawCallback = (ctx: CanvasRenderingContext2D, region: Rect, _signal: AbortSignal): void => {\n const ppu = this._ppu;\n\n // Convert pixel region back to timeline logical units for culling.\n // region.x is in vcanvas logical pixels (pure timeline content, no tab offset).\n const logicalRegion: Rect = {\n x: region.x / ppu + this.min,\n y: region.y,\n width: region.width / ppu,\n height: region.height,\n };\n\n // Resolve CSS vars once per frame\n this.#cssVarsCache = resolveCssVars(this);\n\n const grid = resolveGrid(\n this._viewRange,\n this.userScale,\n this.#getViewportWidth(),\n this.gridMode,\n this.minorStep,\n ppu,\n );\n\n // 1. Track backgrounds\n const trackInfos = this._internalTracks.map(t => ({ key: t.key, color: t.color }));\n drawTrackBackgrounds(ctx, logicalRegion, this._trackLayout, trackInfos, this.#cssVarsCache, ppu);\n\n // 2. Grid\n drawMajorMinorGrid(ctx, logicalRegion, grid, this.altMajorBg, this.#cssVarsCache, ppu);\n\n // 3. Event rects\n drawEventRects(\n ctx,\n logicalRegion,\n this._internalEvents,\n this._trackLayout,\n this._selectedIds,\n this._tickledId,\n this._drag,\n this.#cssVarsCache,\n ppu,\n );\n\n // 4. Marquee\n drawMarquee(ctx, this._drag, ppu);\n\n // 5. Axis (drawn last so it overlays grid lines in the axis band)\n const scrollTop = this.#vcanvas?.logicalScrollTop ?? 0;\n drawAxis(ctx, logicalRegion, grid, this.#axisHeight, this.formatLabel, this.#cssVarsCache, ppu, scrollTop);\n };\n\n // ── Scroll / axis labels ────────────────────────────────────────────\n\n #onScrollVirtual = (e: Event): void => {\n const detail = (e as CustomEvent<{\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportStartLogical: number;\n viewportEndLogical: number;\n userGesture?: boolean;\n }>).detail;\n\n // Only react to user-initiated scrolls to avoid feedback loops\n if (detail.userGesture === false)\n return;\n\n const ppu = this._ppu;\n if (ppu <= 0)\n return;\n\n // Horizontal: convert pixel scroll position to timeline units (no tab offset)\n const viewMin = detail.logicalScrollLeft / ppu + this.min;\n this._viewRange = this.#deriveViewRange(viewMin, ppu);\n\n // Vertical: reverse-derive _vViewRange from the new logicalScrollTop\n // logicalScrollTop = _vViewRange.min * _vScale, so _vViewRange.min = logicalScrollTop / _vScale\n if (this._vScale > 0) {\n const span = this._vViewRange.max - this._vViewRange.min;\n const newVMin = detail.logicalScrollTop / this._vScale;\n this.#deriveVerticalZoom(newVMin, newVMin + span);\n }\n };\n\n // ── Private helpers ─────────────────────────────────────────────────\n\n #recomputeTrackLayout(): void {\n const layout: TrackLayout[] = [];\n let y = this.#axisHeight;\n for (const track of this._internalTracks) {\n if (track.hidden)\n continue;\n const override = this._trackHeightOverrides.get(track.key);\n const baseHeight = override ?? track.height ?? this.defaultTrackHeight;\n const height = Math.round(baseHeight * this._vScale);\n layout.push({ trackKey: track.key, y, height });\n y += height;\n }\n this._trackLayout = layout;\n }\n\n /**\n * Range slider handler.\n * Slider controls zoom (via span) + pan (via position).\n * Derive ppu from the span the slider produces.\n */\n #onHZoomInput = (e: Event): void => {\n const detail = (e as CustomEvent<{ a: number; b: number }>).detail;\n const span = detail.b - detail.a;\n const vpWidth = this.#getViewportWidth();\n if (span > 0) {\n this._ppu = Math.max(this.#minPpu(), Math.min(vpWidth / span, MAX_PPU));\n }\n this._viewRange = this.#deriveViewRange(detail.a, this._ppu);\n this.#syncVCanvas();\n };\n\n /**\n * Vertical range slider handler.\n * Slider controls vertical zoom (via span) + vertical pan (via position).\n * Derive _vScale from the span the slider produces.\n */\n #onVZoomInput = (e: Event): void => {\n const detail = (e as CustomEvent<{ a: number; b: number }>).detail;\n this.#deriveVerticalZoom(detail.a, detail.b);\n };\n\n // ── Vertical axis drag-zoom handlers ──────────────────────────────────\n\n #onVAxisPointerDown = (e: PointerEvent): void => {\n const zone = e.currentTarget as HTMLElement;\n zone.setPointerCapture(e.pointerId);\n e.stopPropagation(); // prevent track-tab click/select\n e.preventDefault();\n\n // Compute anchor in base-height units from the click Y position\n // The zone covers the track area (below the axis header padding)\n const rect = zone.getBoundingClientRect();\n const clickFrac = rect.height > 0\n ? (e.clientY - rect.top) / rect.height\n : 0.5;\n const span = this._vViewRange.max - this._vViewRange.min;\n const anchorBaseY = this._vViewRange.min + clickFrac * span;\n\n this._drag = {\n kind: `v-axis-zoom`,\n anchorBaseY,\n startScreenX: e.screenX,\n startScreenY: e.screenY,\n startVMin: this._vViewRange.min,\n startVMax: this._vViewRange.max,\n startVScale: this._vScale,\n };\n };\n\n #onVAxisPointerMove = (e: PointerEvent): void => {\n if (this._drag.kind !== `v-axis-zoom`)\n return;\n const drag = this._drag;\n\n const rawDx = e.screenX - drag.startScreenX;\n const rawDy = e.screenY - drag.startScreenY;\n\n // Activation threshold — don't start until enough total movement\n if (Math.abs(rawDx) + Math.abs(rawDy) < DRAG_ACTIVATION_PX)\n return;\n\n // Per-axis deadzone — ignore small off-axis movement\n const dx = applyDeadzone(rawDx, AXIS_DEADZONE_PX);\n const dy = applyDeadzone(rawDy, AXIS_DEADZONE_PX);\n\n const result = computeVerticalAxisZoom(\n drag.startVMin,\n drag.startVMax,\n drag.startVScale,\n drag.anchorBaseY,\n dx,\n dy,\n );\n this.setVerticalZoomPan(result.vMin, result.vMax);\n };\n\n #onVAxisPointerUp = (e: PointerEvent): void => {\n if (this._drag.kind !== `v-axis-zoom`)\n return;\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n this._drag = { kind: `none` };\n };\n\n /** Sync vertical scroll position to vcanvas logicalScrollTop */\n #syncVerticalScroll(): void {\n this.#syncVCanvasVertical();\n this.#positionTabs();\n }\n\n /**\n * Position track tabs in the .tab-column via absolute CSS positioning.\n * Applies a vertical translateY to offset for the current vertical scroll.\n */\n #positionTabs(): void {\n const tabColumn = this.shadowRoot?.querySelector<HTMLElement>(`.tab-column`);\n if (!tabColumn)\n return;\n\n const scrollTop = this.#vcanvas?.logicalScrollTop ?? 0;\n tabColumn.style.transform = `translateY(${-scrollTop}px)`;\n\n for (const layout of this._trackLayout) {\n const tab = tabColumn.querySelector<HTMLElement>(\n `ixfx-timeline-track-tab[track-key=\"${layout.trackKey}\"]`,\n );\n if (!tab)\n continue;\n tab.style.top = `${layout.y}px`;\n tab.style.height = `${layout.height}px`;\n }\n }\n\n /** Read the tab width from the CSS custom property */\n get #tabWidth(): number {\n const raw = getComputedStyle(this).getPropertyValue(`--timeline-tab-width`).trim();\n return Number.parseInt(raw, 10) || 120;\n }\n\n // ── Track resize handlers ────────────────────────────────────────────\n\n /** Live preview during drag — update heights but don't fire public event */\n #onTrackResizeMove = (e: Event): void => {\n const { trackKey, height } = (e as CustomEvent<TimelineTrackResizeDetail>).detail;\n this.#applyTrackResize(trackKey, height);\n };\n\n /** Final resize on pointerup — apply height and fire public event */\n #onTrackResizeEnd = (e: Event): void => {\n const { trackKey, height } = (e as CustomEvent<TimelineTrackResizeDetail>).detail;\n this.#applyTrackResize(trackKey, height);\n\n this.dispatchEvent(\n new CustomEvent<TimelineTrackResizeDetail>(`track-resize`, {\n detail: { trackKey, height },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n /**\n * Apply track height based on the current `trackHeight` mode.\n * - `fixed`: sets `defaultTrackHeight` (all tracks change uniformly)\n * - `free`: sets per-track override in `_trackHeightOverrides`\n * - `none`: should never be called (resize is disabled)\n */\n #applyTrackResize(trackKey: string, height: number): void {\n if (this.trackHeight === `fixed`) {\n this.defaultTrackHeight = height;\n } else if (this.trackHeight === `free`) {\n const next = new Map(this._trackHeightOverrides);\n next.set(trackKey, height);\n this._trackHeightOverrides = next;\n }\n // `updated()` will trigger #recomputeTrackLayout via defaultTrackHeight or _trackHeightOverrides change\n }\n\n #fireSelectionChange(): void {\n this.dispatchEvent(\n new CustomEvent<TimelineSelectionChangeDetail>(`selection-change`, {\n detail: { selectedIds: [...this._selectedIds] },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\n// ── Global tag name registration ──────────────────────────────────────\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-timeline': IxfxTimelineElement;\n }\n}\n\n// ── Module-scope interface merge (typed addEventListener) ─────────────\nexport interface IxfxTimelineElement {\n addEventListener: (<K extends keyof TimelineElementEventMap>(\n type: K,\n listener: (this: IxfxTimelineElement, event: TimelineElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"x_google_ignoreList":[5,6,7,8,9,10],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { A as TimelineTrackReorderEvent, C as TimelineEventResizeEvent, D as TimelineTickleChangeEvent, E as TimelineTickleChangeDetail, F as TrackHeightMode, I as TrackLayout, L as UserScale, M as TimelineTrackResizeEvent, N as TimelineTrackSelectDetail, O as TimelineTrack, P as TimelineTrackSelectEvent, R as ViewRange, S as TimelineEventResizeDetail, T as TimelineSelectionChangeEvent, _ as TimelineDraggingEvent, a as CssVars, b as TimelineEventMoveDetail, c as resolveGrid, d as DragSnappingFn, f as DragTarget, g as TimelineDraggingDetail, h as TimelineDraggingCallbackDetail, i as TimelineTrackTabElement, j as TimelineTrackResizeDetail, k as TimelineTrackReorderDetail, l as TimelineController, m as GridResolution, n as attachTimelineInteractions, o as Rect, p as GridMode, r as IxfxTimelineElement, s as resolveCssVars, t as timelineStyles, u as TimelineControllerConfig, v as TimelineElementEventMap, w as TimelineSelectionChangeDetail, x as TimelineEventMoveEvent, y as TimelineEvent } from "./index--hrxPBkQ.js";
1
+ import { A as TimelineTrackReorderEvent, C as TimelineEventResizeEvent, D as TimelineTickleChangeEvent, E as TimelineTickleChangeDetail, F as TrackHeightMode, I as TrackLayout, L as UserScale, M as TimelineTrackResizeEvent, N as TimelineTrackSelectDetail, O as TimelineTrack, P as TimelineTrackSelectEvent, R as ViewRange, S as TimelineEventResizeDetail, T as TimelineSelectionChangeEvent, _ as TimelineDraggingEvent, a as CssVars, b as TimelineEventMoveDetail, c as resolveGrid, d as DragSnappingFn, f as DragTarget, g as TimelineDraggingDetail, h as TimelineDraggingCallbackDetail, i as TimelineTrackTabElement, j as TimelineTrackResizeDetail, k as TimelineTrackReorderDetail, l as TimelineController, m as GridResolution, n as attachTimelineInteractions, o as Rect, p as GridMode, r as IxfxTimelineElement, s as resolveCssVars, t as timelineStyles, u as TimelineControllerConfig, v as TimelineElementEventMap, w as TimelineSelectionChangeDetail, x as TimelineEventMoveEvent, y as TimelineEvent } from "./index-DLkSKL4T.js";
2
2
  export { type CssVars, DragSnappingFn, DragTarget, GridMode, GridResolution, IxfxTimelineElement, type Rect, TimelineController, TimelineControllerConfig, TimelineDraggingCallbackDetail, TimelineDraggingDetail, TimelineDraggingEvent, TimelineElementEventMap, TimelineEvent, TimelineEventMoveDetail, TimelineEventMoveEvent, TimelineEventResizeDetail, TimelineEventResizeEvent, TimelineSelectionChangeDetail, TimelineSelectionChangeEvent, TimelineTickleChangeDetail, TimelineTickleChangeEvent, TimelineTrack, TimelineTrackReorderDetail, TimelineTrackReorderEvent, TimelineTrackResizeDetail, TimelineTrackResizeEvent, TimelineTrackSelectDetail, TimelineTrackSelectEvent, TimelineTrackTabElement, TrackHeightMode, TrackLayout, UserScale, ViewRange, attachTimelineInteractions, resolveCssVars, resolveGrid, timelineStyles };
package/dist/timeline.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as resolveCssVars, i as attachTimelineInteractions, n as TimelineTrackTabElement, o as resolveGrid, r as timelineStyles, s as TimelineController, t as IxfxTimelineElement } from "./timeline-Cv75Th2U.js";
1
+ import { a as resolveCssVars, i as attachTimelineInteractions, n as TimelineTrackTabElement, o as resolveGrid, r as timelineStyles, s as TimelineController, t as IxfxTimelineElement } from "./timeline-Bh0PhlKW.js";
2
2
  export { IxfxTimelineElement, TimelineController, TimelineTrackTabElement, attachTimelineInteractions, resolveCssVars, resolveGrid, timelineStyles };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
3
  "type": "module",
4
- "version": "0.3.1",
4
+ "version": "0.3.2",
5
5
  "description": "",
6
6
  "author": "",
7
7
  "license": "ISC",
@@ -42,12 +42,12 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@clinth/ui-commands": "1.1.0",
45
- "@clinth/vcanvas": "link:../../../Library/pnpm/global/5/node_modules/@clinth/vcanvas",
46
45
  "fzf": "0.5.2",
47
46
  "lit": "3.3.3"
48
47
  },
49
48
  "devDependencies": {
50
49
  "@antfu/eslint-config": "^9.0.0",
50
+ "@clinth/vcanvas": "0.0.3",
51
51
  "@ixfx/arrays": "0.56.12",
52
52
  "@ixfx/collections": "0.56.12",
53
53
  "@ixfx/core": "0.56.12",
@@ -1 +0,0 @@
1
- {"version":3,"file":"icon-CeTDJhC7.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;;;;AAkBA;;;;;;;;;cACa,eAAA,SAAwB,UAAA;EAAA;EACvB,IAAA;EACgB,IAAA;EAChB,KAAA;EAC0C,UAAA;EACU,MAAA;EAQvD,iBAAA,CAAA;EAKA,oBAAA,CAAA;EAAA,UAKU,MAAA,CAAA,UAAM,OAAA,iBAAA,cAAA;EAAA,UAgBN,OAAA,CAAQ,OAAA,EAAS,GAAA;EAAA,OAWpB,MAAA,gBAAM,SAAA;AAAA;AAAA,QAsChB,MAAA;EAAA,UACI,qBAAA;IACR,WAAA,EAAa,eAAe;EAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index--hrxPBkQ.d.ts","names":[],"sources":["../src/timeline/types.ts","../src/timeline/timeline-controller.ts","../src/timeline/timeline-draw.ts","../src/timeline/timeline-track-tabs.ts","../src/timeline/timeline-element.ts","../src/timeline/timeline-interactions.ts","../src/timeline/timeline-styles.ts"],"mappings":"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"}