@aicut/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/events.ts","../src/history.ts","../src/ids.ts","../src/model.ts","../src/timeline/layout.ts","../src/playback.ts","../src/theme.ts","../src/i18n.ts","../src/ui/thumbnails.ts","../src/ui/format.ts","../src/timeline/draw.ts","../src/timeline/hit.ts","../src/timeline/index.ts","../src/ui/icons.ts","../src/ui/toolbar.ts","../src/ui/index.ts","../src/editor.ts"],"names":["c","ti","track","SCALE_MIN","SCALE_MAX","SNAP_PX","clampScale","opts"],"mappings":"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","file":"index.js","sourcesContent":["type Handler<T> = (payload: T) => void;\n\n/**\n * Minimal typed event bus. Returns an unsubscribe function from `on` so\n * callers don't have to retain the handler reference. No once/wildcard\n * by design — keep the surface small until something needs them.\n *\n * EventMap is intentionally unconstrained — its keys are the event\n * names and values are payload types. An explicit `Record` constraint\n * would force consumers to add an index signature, which would in turn\n * mask typos in `emit` / `on`.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventBus<EventMap extends Record<string, any>> {\n private listeners = new Map<keyof EventMap, Set<Handler<any>>>();\n\n on<K extends keyof EventMap>(\n event: K,\n handler: Handler<EventMap[K]>,\n ): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const h of set) {\n try {\n h(payload);\n } catch (err) {\n // Swallow handler errors so one broken listener can't kill the editor.\n // eslint-disable-next-line no-console\n console.error(\"[aicut] event handler threw\", event, err);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { Project } from \"./types.js\";\n\n/**\n * Snapshot-based undo/redo. Each mutation pushes the *previous*\n * project onto the undo stack and clears redo. Cheap enough for\n * v1: deep cloning a project JSON of a few dozen clips is O(<1ms).\n *\n * Capped to prevent unbounded memory growth on long sessions.\n */\nexport class HistoryStack {\n private undoStack: Project[] = [];\n private redoStack: Project[] = [];\n private readonly limit: number;\n\n constructor(limit = 50) {\n this.limit = limit;\n }\n\n /** Call BEFORE applying a mutation. */\n push(previous: Project): void {\n this.undoStack.push(clone(previous));\n if (this.undoStack.length > this.limit) this.undoStack.shift();\n this.redoStack.length = 0;\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** Returns the project to restore, or null if nothing to undo. */\n undo(current: Project): Project | null {\n const prev = this.undoStack.pop();\n if (!prev) return null;\n this.redoStack.push(clone(current));\n return prev;\n }\n\n redo(current: Project): Project | null {\n const next = this.redoStack.pop();\n if (!next) return null;\n this.undoStack.push(clone(current));\n return next;\n }\n\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n}\n\nfunction clone(p: Project): Project {\n return JSON.parse(JSON.stringify(p)) as Project;\n}\n","/**\n * Short, stable, URL-safe ID. Not cryptographic — fine for client IDs\n * that get persisted in the project JSON.\n */\nexport function createId(prefix = \"id\"): string {\n const rand = Math.random().toString(36).slice(2, 8);\n const t = Date.now().toString(36).slice(-4);\n return `${prefix}_${t}${rand}`;\n}\n","import { createId } from \"./ids.js\";\nimport type { Clip, Ms, Project, Track } from \"./types.js\";\n\nexport function createEmptyProject(): Project {\n return {\n version: 1,\n sources: [],\n tracks: [{ id: createId(\"track\"), kind: \"video\", clips: [] }],\n };\n}\n\nexport function clipDuration(c: Clip): Ms {\n return c.out - c.in;\n}\n\n/** End of a clip on the timeline (start + duration). */\nexport function clipEnd(c: Clip): Ms {\n return c.start + clipDuration(c);\n}\n\nexport function trackEnd(track: Track): Ms {\n let max = 0;\n for (const c of track.clips) {\n const end = clipEnd(c);\n if (end > max) max = end;\n }\n return max;\n}\n\n/**\n * Find which clip on the track contains `timeMs`. Edges:\n * - start inclusive\n * - end exclusive (a clip ending at T does not contain T)\n */\nexport function findClipContaining(track: Track, timeMs: Ms): Clip | null {\n for (const c of track.clips) {\n if (timeMs >= c.start && timeMs < clipEnd(c)) return c;\n }\n return null;\n}\n\nexport function findTrackOfClip(\n project: Project,\n clipId: string,\n): Track | null {\n for (const t of project.tracks) {\n if (t.clips.some((c) => c.id === clipId)) return t;\n }\n return null;\n}\n\n/**\n * Defensive normalization — ensures clips on each track are sorted by\n * `start`, IDs exist, and trivially-empty clips (out <= in) are dropped.\n * Called from `Editor.setProject` so consumers can hand us loosely-formed\n * JSON without risking inconsistent internal state.\n */\nexport function normalizeProject(project: Project): Project {\n const sources = project.sources.map((s) => ({ ...s }));\n const tracks = project.tracks.map<Track>((t) => {\n const clips = t.clips\n .filter((c) => c.out > c.in)\n .map<Clip>((c) => ({ ...c, id: c.id || createId(\"clip\") }))\n .sort((a, b) => a.start - b.start);\n return { ...t, id: t.id || createId(\"track\"), clips };\n });\n return { version: 1, sources, tracks };\n}\n\n/** Splits a clip at `localOffset` ms (measured from clip.start on the timeline). */\nexport function splitClipAt(clip: Clip, localOffset: Ms): [Clip, Clip] | null {\n const sourceLen = clip.out - clip.in;\n if (localOffset <= 0 || localOffset >= sourceLen) return null;\n const left: Clip = { ...clip, out: clip.in + localOffset };\n const right: Clip = {\n ...clip,\n id: createId(\"clip\"),\n in: clip.in + localOffset,\n start: clip.start + localOffset,\n };\n return [left, right];\n}\n\n/** Alias retained for back-compat with existing call sites. */\nexport function findClipAt(track: Track, timeMs: Ms): Clip | null {\n return findClipContaining(track, timeMs);\n}\n\nexport function projectDuration(project: Project): Ms {\n let max = 0;\n for (const t of project.tracks) {\n const e = trackEnd(t);\n if (e > max) max = e;\n }\n return max;\n}\n","import type { Clip, Ms, Project, Track } from \"../types.js\";\n\n/** Visual constants — kept here so draw + hit-test share one source of truth. */\nexport const TRACK_HEIGHT = 56;\nexport const RULER_HEIGHT = 24;\nexport const HEADER_WIDTH = 96;\nexport const HANDLE_PX = 8;\nexport const CLIP_INSET = 6;\nexport const SCALE_MIN = 10;\nexport const SCALE_MAX = 400;\n\n/** Scrollbar geometry. */\nexport const SCROLLBAR_THICKNESS = 10;\n/** Minimum thumb length so it stays grabbable at large content sizes. */\nexport const SCROLLBAR_MIN_THUMB = 24;\n/** Gutter inset from the canvas edges so the bar doesn't clip. */\nexport const SCROLLBAR_INSET = 2;\n\n/** Total height = ruler + sum of tracks. Caller decides if it wants more. */\nexport function totalHeight(tracks: Track[]): number {\n return RULER_HEIGHT + tracks.length * TRACK_HEIGHT;\n}\n\n/**\n * Track-stack content height — what the scrollbars compare against\n * the visible track region. Includes one extra TRACK_HEIGHT when a\n * drag is in flight so the \"+ 新轨道\" phantom row is reachable.\n */\nexport function contentHeight(tracks: Track[], isDragging: boolean): number {\n return tracks.length * TRACK_HEIGHT + (isDragging ? TRACK_HEIGHT : 0);\n}\n\n/** Pixels of timeline content along the X axis at the given zoom. */\nexport function contentWidth(project: Project, pxPerSec: number): number {\n let max = 0;\n for (const t of project.tracks) {\n for (const c of t.clips) {\n const end = c.start + (c.out - c.in);\n if (end > max) max = end;\n }\n }\n return (max / 1000) * pxPerSec;\n}\n\n/** Top-edge y for a track at `index`. */\nexport function trackY(index: number): number {\n return RULER_HEIGHT + index * TRACK_HEIGHT;\n}\n\n/** Inverse of trackY — which track index (or -1) does a given y fall in.\n * `scrollTop` shifts the visible window down; pass 0 if not scrolling. */\nexport function trackIndexAt(\n y: number,\n trackCount: number,\n scrollTop = 0,\n): number {\n if (y < RULER_HEIGHT) return -1;\n const contentY = y - RULER_HEIGHT + scrollTop;\n const idx = Math.floor(contentY / TRACK_HEIGHT);\n if (idx < 0 || idx >= trackCount) return -1;\n return idx;\n}\n\n/** Convert timeline ms → x pixel coordinate, accounting for header + scroll. */\nexport function msToX(\n timeMs: Ms,\n pxPerSec: number,\n scrollLeft: number,\n showHeader: boolean,\n): number {\n const base = showHeader ? HEADER_WIDTH : 0;\n return base + (timeMs / 1000) * pxPerSec - scrollLeft;\n}\n\n/** Convert x pixel coordinate back → timeline ms. */\nexport function xToMs(\n x: number,\n pxPerSec: number,\n scrollLeft: number,\n showHeader: boolean,\n): Ms {\n const base = showHeader ? HEADER_WIDTH : 0;\n return Math.max(0, ((x - base + scrollLeft) / pxPerSec) * 1000);\n}\n\n/**\n * Choose a \"nice\" major-tick interval covering at least `targetSec`.\n * Drives the ruler so it never shows ugly intervals like every 3.7s.\n */\nexport function niceTickSeconds(targetSec: number): number {\n if (targetSec <= 0) return 1;\n const exp = Math.floor(Math.log10(targetSec));\n const base = targetSec / Math.pow(10, exp);\n let nice: number;\n if (base < 1.5) nice = 1;\n else if (base < 3) nice = 2;\n else if (base < 7) nice = 5;\n else nice = 10;\n return nice * Math.pow(10, exp);\n}\n\nexport function formatRulerLabel(sec: number): string {\n if (sec < 60) return `${Math.round(sec * 10) / 10}s`;\n const m = Math.floor(sec / 60);\n const s = Math.round(sec - m * 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n\nexport function clampScale(s: number): number {\n return Math.max(SCALE_MIN, Math.min(SCALE_MAX, s));\n}\n\n/**\n * Snap targets aggregated from all clips in the project plus the\n * playhead and origin. Excludes the dragged clip (caller passes its id).\n */\nexport function snapTargets(\n project: Project,\n playheadMs: Ms,\n ignoreClipId: string | null,\n): Ms[] {\n const arr: Ms[] = [0, playheadMs];\n for (const t of project.tracks) {\n for (const c of t.clips) {\n if (c.id === ignoreClipId) continue;\n arr.push(c.start, c.start + (c.out - c.in));\n }\n }\n return arr;\n}\n\n/**\n * Return whether placing `clip` at `start..end` on `track` would\n * collide with any *other* clip already on that track.\n */\nexport function wouldOverlap(\n track: Track,\n clipId: string,\n start: Ms,\n end: Ms,\n): boolean {\n for (const c of track.clips) {\n if (c.id === clipId) continue;\n const cEnd = c.start + (c.out - c.in);\n if (start < cEnd && end > c.start) return true;\n }\n return false;\n}\n\n/** Look up `(track, clip)` for `clipId` across the project. */\nexport function findClip(\n project: Project,\n clipId: string,\n): { track: Track; clip: Clip; trackIndex: number } | null {\n for (let i = 0; i < project.tracks.length; i++) {\n const t = project.tracks[i]!;\n const c = t.clips.find((c) => c.id === clipId);\n if (c) return { track: t, clip: c, trackIndex: i };\n }\n return null;\n}\n\n/**\n * Uncovered intervals across the whole video timeline, in ms — i.e.\n * spans where no clip on any video track plays. Returned in time\n * order, half-open `[start, end)`. Used by the drawer to highlight\n * gaps in warning color so the user notices accidentally orphaned\n * regions.\n */\nexport function uncoveredIntervals(project: Project): Array<[Ms, Ms]> {\n const intervals: Array<[Ms, Ms]> = [];\n for (const t of project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n const end = c.start + (c.out - c.in);\n if (end > c.start) intervals.push([c.start, end]);\n }\n }\n if (intervals.length === 0) return [];\n intervals.sort((a, b) => a[0] - b[0]);\n const merged: Array<[Ms, Ms]> = [];\n for (const [s, e] of intervals) {\n const last = merged[merged.length - 1];\n if (last && s <= last[1]) last[1] = Math.max(last[1], e);\n else merged.push([s, e]);\n }\n const gaps: Array<[Ms, Ms]> = [];\n let cursor = 0;\n for (const [s, e] of merged) {\n if (s > cursor) gaps.push([cursor, s]);\n cursor = e;\n }\n // Trailing gap (after last clip) is intentionally NOT reported —\n // that's \"the end of the timeline\", not a coverage hole.\n return gaps;\n}\n","import type { Clip, Ms, Project } from \"./types.js\";\n\n/**\n * v1 preview engine. Strategy:\n * - one hidden <video> per MediaSource, kept warm so swapping clips\n * doesn't trigger a fresh network fetch.\n * - the \"active\" video for the current playhead is shown, others\n * are visibility:hidden behind it.\n * - tick loop drives a single video track's playhead, advancing\n * through clips end-to-end. When the playhead crosses a clip\n * boundary we pause the outgoing video and resume the next at\n * `clip.in`.\n *\n * Single video track only for v1 — extending to multi-track requires\n * a compositor (Canvas/WebGL), see project notes.\n */\nexport class PlaybackEngine {\n private host: HTMLElement;\n private mount: HTMLDivElement;\n private videos = new Map<string, HTMLVideoElement>();\n private project: Project;\n private currentClipId: string | null = null;\n private playing = false;\n private timeMs: Ms = 0;\n private rafHandle: number | null = null;\n private lastFrameTs = 0;\n\n /** Public event hooks — set by Editor. */\n onTimeUpdate?: (ms: Ms) => void;\n onEnded?: () => void;\n onError?: (err: Error) => void;\n onReady?: () => void;\n onSourceMetadata?: (sourceId: string, durationMs: Ms) => void;\n\n constructor(host: HTMLElement, project: Project) {\n this.host = host;\n this.project = project;\n this.mount = document.createElement(\"div\");\n this.mount.className = \"aicut-preview\";\n this.host.appendChild(this.mount);\n this.syncSources();\n }\n\n setProject(next: Project): void {\n this.project = next;\n this.syncSources();\n // Re-resolve the active clip for the current playhead across ALL\n // video tracks. If the clip we were on was removed, snap back to 0.\n const clip = this.clipAtTime(this.timeMs);\n if (!clip) {\n this.timeMs = 0;\n this.activate(null);\n this.onTimeUpdate?.(0);\n } else {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n }\n }\n\n play(): void {\n if (this.playing) return;\n if (this.totalDuration() <= 0) return;\n let clip = this.clipAtTime(this.timeMs) ?? this.nextClipAfterTime(this.timeMs);\n if (!clip) return;\n if (this.timeMs < clip.start) this.timeMs = clip.start;\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n const v = this.videos.get(clip.sourceId);\n if (!v) return;\n void v.play().catch((err) => this.onError?.(err as Error));\n this.playing = true;\n this.startTickLoop();\n }\n\n pause(): void {\n if (!this.playing) return;\n this.playing = false;\n this.stopTickLoop();\n if (this.currentClipId) {\n const clip = this.clipById(this.currentClipId);\n if (clip) {\n const v = this.videos.get(clip.sourceId);\n v?.pause();\n }\n }\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n getTime(): Ms {\n return this.timeMs;\n }\n\n seek(timeMs: Ms): void {\n const total = this.totalDuration();\n if (total <= 0) {\n this.timeMs = 0;\n return;\n }\n const clamped = Math.max(0, Math.min(timeMs, total));\n this.timeMs = clamped;\n const clip = this.clipAtTime(clamped);\n if (clip) {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, clamped - clip.start);\n } else {\n this.activate(null);\n }\n this.onTimeUpdate?.(clamped);\n }\n\n destroy(): void {\n this.stopTickLoop();\n for (const v of this.videos.values()) {\n v.pause();\n v.removeAttribute(\"src\");\n v.load();\n v.remove();\n }\n this.videos.clear();\n this.mount.remove();\n }\n\n // --- internals -------------------------------------------------------\n\n private syncSources(): void {\n const wanted = new Set(this.project.sources.map((s) => s.id));\n for (const [id, v] of this.videos) {\n if (!wanted.has(id)) {\n v.pause();\n v.remove();\n this.videos.delete(id);\n }\n }\n for (const src of this.project.sources) {\n if (src.kind !== \"video\") continue;\n if (this.videos.has(src.id)) continue;\n const v = document.createElement(\"video\");\n v.preload = \"auto\";\n // Intentionally no `crossOrigin` here. Setting it forces the\n // browser to require CORS headers on the source, which most\n // pre-existing video CDNs do not serve. Pure <video> playback\n // works fine cross-origin without it — we'll only need it once\n // the preview moves to a Canvas/WebGL compositor that has to\n // read pixels back. Hosts that need it can override post-mount.\n v.playsInline = true;\n v.muted = false;\n v.src = src.url;\n v.style.position = \"absolute\";\n v.style.inset = \"0\";\n v.style.width = \"100%\";\n v.style.height = \"100%\";\n v.style.objectFit = \"contain\";\n v.style.visibility = \"hidden\";\n const sourceId = src.id;\n v.addEventListener(\"error\", () =>\n this.onError?.(new Error(`Failed to load ${src.url}`)),\n );\n v.addEventListener(\"loadedmetadata\", () => {\n this.onReady?.();\n const durMs = Math.round(v.duration * 1000);\n if (Number.isFinite(durMs) && durMs > 0) {\n this.onSourceMetadata?.(sourceId, durMs);\n }\n });\n this.mount.appendChild(v);\n this.videos.set(src.id, v);\n }\n }\n\n private activate(clip: Clip | null): void {\n if (clip?.id === this.currentClipId) return;\n if (this.currentClipId) {\n const prev = this.clipById(this.currentClipId);\n if (prev) {\n const v = this.videos.get(prev.sourceId);\n if (v) {\n v.pause();\n v.style.visibility = \"hidden\";\n }\n }\n }\n this.currentClipId = clip ? clip.id : null;\n if (clip) {\n const v = this.videos.get(clip.sourceId);\n if (v) v.style.visibility = \"visible\";\n }\n }\n\n private seekVideoToClipOffset(clip: Clip, offsetMs: Ms): void {\n const v = this.videos.get(clip.sourceId);\n if (!v) return;\n const target = (clip.in + Math.max(0, offsetMs)) / 1000;\n if (Math.abs(v.currentTime - target) > 0.05) {\n v.currentTime = target;\n }\n }\n\n private clipById(id: string): Clip | null {\n for (const t of this.project.tracks) {\n for (const c of t.clips) if (c.id === id) return c;\n }\n return null;\n }\n\n /**\n * Find the clip whose timeline range contains `timeMs`, searching\n * across ALL video tracks. If multiple tracks have a clip at this\n * moment, the lowest-index track wins (matches the \"Track 1 is\n * background\" convention used in the auto-split UX — overlapping\n * placements would have created a new track on top, but here we\n * fall back to the underlying clip).\n */\n private clipAtTime(timeMs: Ms): Clip | null {\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n if (timeMs >= c.start && timeMs < c.start + (c.out - c.in)) return c;\n }\n }\n return null;\n }\n\n /** Earliest clip starting at-or-after `timeMs` across all video tracks. */\n private nextClipAfterTime(timeMs: Ms): Clip | null {\n let best: Clip | null = null;\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n if (c.start >= timeMs && (!best || c.start < best.start)) best = c;\n }\n }\n return best;\n }\n\n /** Max clip end across all video tracks. */\n private totalDuration(): Ms {\n let max = 0;\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n const e = c.start + (c.out - c.in);\n if (e > max) max = e;\n }\n }\n return max;\n }\n\n private startTickLoop(): void {\n this.lastFrameTs = performance.now();\n const tick = (now: number) => {\n if (!this.playing) return;\n const dtMs = now - this.lastFrameTs;\n this.lastFrameTs = now;\n this.advance(dtMs);\n this.rafHandle = requestAnimationFrame(tick);\n };\n this.rafHandle = requestAnimationFrame(tick);\n }\n\n private stopTickLoop(): void {\n if (this.rafHandle != null) {\n cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n }\n\n private advance(dtMs: number): void {\n if (this.project.tracks.length === 0) return;\n this.timeMs += dtMs;\n const totalDur = this.totalDuration();\n if (this.timeMs >= totalDur) {\n this.timeMs = totalDur;\n this.onTimeUpdate?.(this.timeMs);\n this.pause();\n this.onEnded?.();\n return;\n }\n const clip = this.clipAtTime(this.timeMs);\n if (!clip) {\n // Gap — jump forward to the next clip on any track.\n const next = this.nextClipAfterTime(this.timeMs);\n if (next) {\n this.timeMs = next.start;\n this.activate(next);\n this.seekVideoToClipOffset(next, 0);\n const v = this.videos.get(next.sourceId);\n if (v) void v.play().catch((err) => this.onError?.(err as Error));\n } else {\n this.pause();\n this.onEnded?.();\n return;\n }\n } else if (clip.id !== this.currentClipId) {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n const v = this.videos.get(clip.sourceId);\n if (v) void v.play().catch((err) => this.onError?.(err as Error));\n }\n this.onTimeUpdate?.(this.timeMs);\n }\n}\n\n// Per-track helpers moved into class methods now that playback spans\n// all video tracks — kept the file free of dangling unused exports.\n","import type { Theme } from \"./types.js\";\n\n/**\n * Map `Theme` keys to the CSS custom property they write.\n *\n * Brand/palette keys share names with iqvise's globals.css so hosts\n * that already define `--color-brand` etc. at the page level get the\n * editor in their palette for free — `theme` props ONLY needed when\n * scoping to this editor instance.\n *\n * Chrome keys keep the `--aicut-controls-*` prefix because they have\n * no analogue in the host palette.\n */\nconst THEME_VARS: Record<keyof Theme, string> = {\n brand: \"--color-brand\",\n secondary: \"--color-secondary\",\n surface: \"--color-surface\",\n dark: \"--color-dark\",\n muted: \"--color-muted\",\n card: \"--color-card\",\n success: \"--color-success\",\n warning: \"--color-warning\",\n info: \"--color-info\",\n error: \"--color-error\",\n controlsBg: \"--aicut-controls-bg\",\n controlsBorder: \"--aicut-controls-border\",\n controlsText: \"--aicut-controls-text\",\n controlsHover: \"--aicut-controls-hover\",\n controlsActive: \"--aicut-controls-active\",\n previewBg: \"--aicut-preview-bg\",\n radiusSm: \"--aicut-radius-sm\",\n radiusMd: \"--aicut-radius-md\",\n radiusLg: \"--aicut-radius-lg\",\n};\n\nexport function applyTheme(root: HTMLElement, theme: Theme | undefined): void {\n if (!theme) return;\n for (const key of Object.keys(theme) as Array<keyof Theme>) {\n const cssVar = THEME_VARS[key];\n const value = theme[key];\n if (cssVar && value) root.style.setProperty(cssVar, value);\n }\n}\n","/**\n * UI strings the editor paints into the DOM (toolbar tooltips, the\n * fullscreen exit button) and onto the timeline canvas (phantom new-\n * track label, track header labels). Every user-visible literal in\n * `@aicut/core` flows through this interface — there are no hidden\n * hard-coded translations elsewhere in the library.\n *\n * Defaults to English. Hosts that want Chinese (or any other locale)\n * pass `locale: localeZh` to `Editor.create` / `Timeline.create`, or\n * override individual keys with `locale: { undo: \"撤销\" }`.\n */\nexport interface Locale {\n // Toolbar tooltips\n undo: string;\n redo: string;\n split: string;\n trimLeft: string;\n trimRight: string;\n speedComingSoon: string;\n playPause: string;\n fullscreen: string;\n snap: string;\n /** Title shown on the snap button when snap is ON (clicking turns OFF). */\n snapOnTitle: string;\n /** Title shown when snap is OFF (clicking turns ON). */\n snapOffTitle: string;\n zoomOut: string;\n zoomIn: string;\n reset: string;\n\n // Fullscreen exit overlay\n exitFullscreen: string;\n exitFullscreenTitle: string;\n\n // Timeline canvas labels\n /** Phantom row that appears under the last track during a drag. */\n newTrack: string;\n /** Track header — `{n}` is replaced with the 1-based track index. */\n videoTrackLabel: string;\n /** Same template format as videoTrackLabel. */\n audioTrackLabel: string;\n}\n\n/** English. The library default — chosen over Chinese as the OSS norm. */\nexport const localeEn: Locale = {\n undo: \"Undo\",\n redo: \"Redo\",\n split: \"Split\",\n trimLeft: \"Trim left edge\",\n trimRight: \"Trim right edge\",\n speedComingSoon: \"Speed (coming soon)\",\n playPause: \"Play / Pause (Space)\",\n fullscreen: \"Fullscreen preview\",\n snap: \"Snap\",\n snapOnTitle: \"Turn off snap\",\n snapOffTitle: \"Turn on snap\",\n zoomOut: \"Zoom out\",\n zoomIn: \"Zoom in\",\n reset: \"Reset edits (keep sources)\",\n exitFullscreen: \"Exit fullscreen\",\n exitFullscreenTitle: \"Exit fullscreen (Esc)\",\n newTrack: \"+ New track\",\n videoTrackLabel: \"Video {n}\",\n audioTrackLabel: \"Audio {n}\",\n};\n\n/** Simplified Chinese. */\nexport const localeZh: Locale = {\n undo: \"撤销\",\n redo: \"重做\",\n split: \"分割\",\n trimLeft: \"向左裁剪\",\n trimRight: \"向右裁剪\",\n speedComingSoon: \"变速(即将到来)\",\n playPause: \"播放 / 暂停 (Space)\",\n fullscreen: \"全屏预览\",\n snap: \"吸附\",\n snapOnTitle: \"关闭吸附\",\n snapOffTitle: \"开启吸附\",\n zoomOut: \"缩小\",\n zoomIn: \"放大\",\n reset: \"重置编辑(保留视频源)\",\n exitFullscreen: \"退出全屏\",\n exitFullscreenTitle: \"退出全屏 (Esc)\",\n newTrack: \"+ 新轨道\",\n videoTrackLabel: \"视频 {n}\",\n audioTrackLabel: \"音频 {n}\",\n};\n\n/** Spread defaults under host overrides — host can supply a partial. */\nexport function mergeLocale(partial: Partial<Locale> | undefined): Locale {\n return partial ? { ...localeEn, ...partial } : localeEn;\n}\n\n/**\n * Replace `{key}` placeholders in a template. We only need `{n}`\n * substitution today; the implementation is generic so additional\n * keys (e.g. `{name}`) won't need a second pass.\n */\nexport function formatLabel(\n template: string,\n vars: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, k) =>\n k in vars ? String(vars[k]) : `{${k}}`,\n );\n}\n","import type { Ms } from \"../types.js\";\n\nconst THUMB_HEIGHT = 44;\nconst THUMB_WIDTH = Math.round(THUMB_HEIGHT * (16 / 9));\n/**\n * Round all sample times to this bucket so multiple zoom levels share\n * cache hits. 250ms means at the highest zoom (400 px/s) we still get\n * a fresh thumbnail roughly every 100px — plenty of visual continuity.\n */\nconst BUCKET_MS = 250;\n\ninterface SourceState {\n video: HTMLVideoElement;\n /** Bucketed ms → bitmap, once extracted. */\n cache: Map<number, ImageBitmap>;\n /** Times currently being extracted. */\n inflight: Set<number>;\n /** Resolved when the video is past readyState=1 (have metadata). */\n ready: Promise<void>;\n /** Pending samples to extract, FIFO. */\n queue: number[];\n /** True while a seek/draw cycle is in progress. */\n busy: boolean;\n}\n\n/**\n * Extracts frame thumbnails from a hidden `<video>` per source and\n * paints them onto a per-clip strip canvas. Decoupled from the main\n * `PlaybackEngine` videos so seeking-for-thumbnails doesn't disturb\n * playback.\n *\n * Strategy: lazy, only extract what the timeline asks for via\n * `paintStrip`. Missing thumbnails get queued; when extraction\n * completes, we call `onUpdate` so the host can request another\n * paint with the now-available bitmap.\n */\nexport class ThumbnailRibbon {\n private host: HTMLElement;\n private sources = new Map<string, SourceState>();\n private onUpdate: () => void;\n\n static get THUMB_HEIGHT(): number {\n return THUMB_HEIGHT;\n }\n static get THUMB_WIDTH(): number {\n return THUMB_WIDTH;\n }\n\n constructor(host: HTMLElement, onUpdate: () => void) {\n this.host = host;\n this.onUpdate = onUpdate;\n }\n\n syncSources(sources: Array<{ id: string; url: string; kind: string }>): void {\n const wanted = new Set(sources.map((s) => s.id));\n for (const [id, st] of this.sources) {\n if (!wanted.has(id)) {\n st.video.remove();\n for (const bmp of st.cache.values()) bmp.close();\n this.sources.delete(id);\n }\n }\n for (const src of sources) {\n if (src.kind !== \"video\") continue;\n if (this.sources.has(src.id)) continue;\n const v = document.createElement(\"video\");\n v.src = src.url;\n v.preload = \"auto\";\n v.muted = true;\n v.playsInline = true;\n // Off-screen but in the layout so the browser actually decodes it.\n v.style.position = \"absolute\";\n v.style.left = \"-9999px\";\n v.style.top = \"-9999px\";\n v.style.width = \"160px\";\n v.style.height = \"90px\";\n this.host.appendChild(v);\n const ready = new Promise<void>((resolve) => {\n if (v.readyState >= 1) resolve();\n else v.addEventListener(\"loadedmetadata\", () => resolve(), { once: true });\n });\n this.sources.set(src.id, {\n video: v,\n cache: new Map(),\n inflight: new Set(),\n ready,\n queue: [],\n busy: false,\n });\n }\n }\n\n /**\n * Paint thumbnails for the clip's visible window onto `ctx`. The\n * canvas is the per-clip strip — width = clip's px width, height =\n * THUMB_HEIGHT. Source-time range derives from the clip's `in/out`\n * and the px range we're drawing into.\n */\n paintStrip(\n ctx: CanvasRenderingContext2D,\n sourceId: string,\n sourceInMs: Ms,\n sourceOutMs: Ms,\n pxWidth: number,\n ): void {\n ctx.clearRect(0, 0, pxWidth, THUMB_HEIGHT);\n const st = this.sources.get(sourceId);\n if (!st) return;\n if (sourceOutMs <= sourceInMs || pxWidth <= 0) return;\n\n const count = Math.max(1, Math.ceil(pxWidth / THUMB_WIDTH));\n const spanMs = sourceOutMs - sourceInMs;\n for (let i = 0; i < count; i++) {\n const tMs = sourceInMs + (spanMs * i) / count;\n const bucket = Math.round(tMs / BUCKET_MS) * BUCKET_MS;\n const bmp = st.cache.get(bucket);\n const x = Math.round((i * pxWidth) / count);\n const w =\n Math.round(((i + 1) * pxWidth) / count) - x;\n if (bmp) {\n ctx.drawImage(bmp, x, 0, w, THUMB_HEIGHT);\n } else {\n // Placeholder shimmer block — same color as track surface.\n ctx.fillStyle = \"rgba(255,255,255,0.04)\";\n ctx.fillRect(x, 0, w, THUMB_HEIGHT);\n this.enqueue(st, bucket);\n }\n }\n }\n\n destroy(): void {\n for (const st of this.sources.values()) {\n st.video.remove();\n for (const bmp of st.cache.values()) bmp.close();\n }\n this.sources.clear();\n }\n\n // ---- internals ------------------------------------------------------\n\n private enqueue(st: SourceState, bucketMs: number): void {\n if (st.cache.has(bucketMs) || st.inflight.has(bucketMs)) return;\n st.inflight.add(bucketMs);\n st.queue.push(bucketMs);\n void this.drain(st);\n }\n\n private async drain(st: SourceState): Promise<void> {\n if (st.busy) return;\n st.busy = true;\n try {\n await st.ready;\n while (st.queue.length > 0) {\n const t = st.queue.shift()!;\n try {\n const bmp = await this.extractFrame(st.video, t);\n st.cache.set(t, bmp);\n } catch {\n // ignore — failed extractions just leave the placeholder\n } finally {\n st.inflight.delete(t);\n }\n this.onUpdate();\n }\n } finally {\n st.busy = false;\n }\n }\n\n private extractFrame(\n video: HTMLVideoElement,\n timeMs: Ms,\n ): Promise<ImageBitmap> {\n const targetSec = Math.max(\n 0,\n Math.min((video.duration || Infinity) - 0.05, timeMs / 1000),\n );\n return new Promise((resolve, reject) => {\n const onSeeked = () => {\n try {\n const cnv = document.createElement(\"canvas\");\n cnv.width = THUMB_WIDTH;\n cnv.height = THUMB_HEIGHT;\n const cx = cnv.getContext(\"2d\");\n if (!cx) return reject(new Error(\"no 2d ctx\"));\n cx.drawImage(video, 0, 0, THUMB_WIDTH, THUMB_HEIGHT);\n // createImageBitmap is async but cheap and gives a portable\n // GPU-friendly handle the strip canvas can blit fast.\n createImageBitmap(cnv).then(resolve, reject);\n } catch (e) {\n reject(e as Error);\n }\n };\n video.addEventListener(\"seeked\", onSeeked, { once: true });\n try {\n video.currentTime = targetSec;\n } catch (e) {\n video.removeEventListener(\"seeked\", onSeeked);\n reject(e as Error);\n }\n });\n }\n}\n","import type { Ms } from \"../types.js\";\n\n/** mm:ss (rounded to seconds) — matches the toolbar reference. */\nexport function fmtClock(ms: Ms): string {\n const total = Math.max(0, Math.round(ms / 1000));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${pad2(m)}:${pad2(s)}`;\n}\n\n/** mm:ss.mmm with millisecond precision — used in the time label. */\nexport function fmtClockMs(ms: Ms): string {\n const total = Math.max(0, Math.round(ms));\n const m = Math.floor(total / 60000);\n const s = Math.floor((total % 60000) / 1000);\n const r = total % 1000;\n return `${pad2(m)}:${pad2(s)}.${pad3(r)}`;\n}\n\nconst pad2 = (n: number) => (n < 10 ? `0${n}` : `${n}`);\nconst pad3 = (n: number) => n.toString().padStart(3, \"0\");\n","import { formatLabel, type Locale } from \"../i18n.js\";\nimport type { Clip, MediaSource, Project, Track } from \"../types.js\";\nimport { fmtClockMs } from \"../ui/format.js\";\nimport type { ThumbnailRibbon } from \"../ui/thumbnails.js\";\nimport {\n CLIP_INSET,\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n TRACK_HEIGHT,\n contentHeight,\n contentWidth,\n formatRulerLabel,\n niceTickSeconds,\n trackY,\n uncoveredIntervals,\n} from \"./layout.js\";\n\nexport interface DrawStyle {\n bg: string;\n border: string;\n text: string;\n textMuted: string;\n trackBg: string;\n brand: string;\n brandTo: string;\n info: string;\n clipText: string;\n selectedRing: string;\n playhead: string;\n}\n\nexport interface DrawState {\n project: Project;\n pxPerSec: number;\n scrollLeft: number;\n scrollTop: number;\n timeMs: number;\n selectedClipId: string | null;\n hoveredClipId: string | null;\n hoveredTrackIndex: number | null;\n dropTargetTrackIndex: number | null;\n /** While any drag is in flight, draw a \"+ 新轨道\" phantom row at the\n * bottom that the user can drop into to explicitly create a track. */\n isDragging: boolean;\n snapX: number | null;\n showHeader: boolean;\n viewportWidth: number;\n viewportHeight: number;\n /** 0–1 fade opacity for each scrollbar. 0 hides it entirely. */\n scrollbarOpacityY: number;\n scrollbarOpacityX: number;\n /** Active = currently being dragged → render at full opacity + emphasized. */\n scrollbarActiveY: boolean;\n scrollbarActiveX: boolean;\n /** Resolved locale used for canvas-painted labels. */\n locale: Locale;\n /**\n * In-flight drag preview. While set, the clip with `clipId` is\n * drawn faded at its real position AND a fully-opaque \"ghost\" of it\n * is drawn at (ghostStart, ghostTrackIndex). `wouldOverlap` flips\n * the ghost to a warning color so users see auto-split coming.\n */\n dragGhost: {\n clipId: string;\n ghostStart: number;\n ghostTrackIndex: number;\n wouldOverlap: boolean;\n } | null;\n}\n\n/**\n * Paint the entire timeline. Stateless — given the same DrawState\n * twice you get the same pixels.\n *\n * Layout has FOUR regions with different sticky behavior:\n * - Ruler band (top, scrolls X only)\n * - Headers col (left, scrolls Y only — when showHeader)\n * - Tracks (the main grid, scrolls both)\n * - Scrollbars (edge overlays, never scroll)\n *\n * We render in passes; each pass `clip`s to its region and (where\n * needed) translates by `-scrollTop` so paint functions can keep\n * working in their natural untranslated coordinates.\n */\nexport function drawAll(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { viewportWidth: W, viewportHeight: H } = state;\n ctx.fillStyle = style.bg;\n ctx.fillRect(0, 0, W, H);\n\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const trackAreaW = W - baseX - SCROLLBAR_THICKNESS;\n const trackAreaH = H - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n\n // --- Pass 1: Track grid (scrolls X + Y) -----------------------------\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, RULER_HEIGHT, trackAreaW, trackAreaH);\n ctx.clip();\n ctx.translate(0, -state.scrollTop);\n drawTracks(ctx, state, style, thumbs);\n if (state.isDragging) {\n drawPhantomRow(ctx, state.project.tracks.length, baseX, state, style);\n }\n if (state.dragGhost) drawDragGhost(ctx, state, style, thumbs);\n ctx.restore();\n\n // --- Pass 2: Headers column (sticky X, scrolls Y) -------------------\n if (state.showHeader) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, RULER_HEIGHT, HEADER_WIDTH, trackAreaH);\n ctx.clip();\n ctx.translate(0, -state.scrollTop);\n drawHeaders(ctx, state, style);\n ctx.restore();\n }\n\n // --- Pass 3: Ruler (sticky Y, scrolls X) ----------------------------\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, RULER_HEIGHT);\n ctx.clip();\n drawRuler(ctx, state, style);\n ctx.restore();\n\n // --- Pass 4: Coverage-gap warning (scrolls X, full visible height) --\n // Painted AFTER both tracks and the ruler so the amber tint + the\n // diagonal \"broken teeth\" hatch sit on top of timecode markings —\n // that's what makes a missing segment instantly catchable when the\n // user is scanning the ruler row.\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, H - SCROLLBAR_THICKNESS);\n ctx.clip();\n drawCoverageGaps(ctx, state, style);\n ctx.restore();\n\n // --- Pass 5: Snap guide + playhead (scroll X, full visible track Y) -\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, H - SCROLLBAR_THICKNESS);\n ctx.clip();\n drawSnapGuide(ctx, state, style);\n drawPlayhead(ctx, state, style);\n ctx.restore();\n\n // --- Pass 6: Scrollbars (no clip — overlay at edges) ---------------\n drawScrollbarV(ctx, state, style);\n drawScrollbarH(ctx, state, style);\n}\n\n/**\n * Highlight time spans where no video clip is present anywhere on any\n * track — a warning to the user that the export will have a hard cut\n * to black at this point. Painted as a translucent amber vertical\n * strip spanning the full track stack, plus a slightly more saturated\n * strip in the ruler band so it's catchable even when the user is\n * scanning the timecode row.\n */\nfunction drawCoverageGaps(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const gaps = uncoveredIntervals(state.project);\n if (gaps.length === 0) return;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n // Span the visible track area, not the (potentially huge) total —\n // pre-clipped by drawAll's pass-2 region anyway, but explicit\n // height keeps the hatch math clean.\n const trackStackH =\n state.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n for (const [s, e] of gaps) {\n const x1 = Math.max(\n baseX,\n baseX + (s / 1000) * state.pxPerSec - state.scrollLeft,\n );\n const x2 = Math.min(\n state.viewportWidth,\n baseX + (e / 1000) * state.pxPerSec - state.scrollLeft,\n );\n if (x2 <= x1) continue;\n // Ruler band — stronger so it's the first thing the eye catches.\n ctx.fillStyle = \"rgba(250, 167, 0, 0.35)\";\n ctx.fillRect(x1, 0, x2 - x1, RULER_HEIGHT);\n // Track band — faint so it doesn't fight the clip thumbnails on\n // adjacent rows.\n ctx.fillStyle = \"rgba(250, 167, 0, 0.12)\";\n ctx.fillRect(x1, RULER_HEIGHT, x2 - x1, trackStackH);\n // Hatched marker on the ruler so it reads as a problem, not a\n // selection. Diagonal lines at 6px spacing.\n ctx.save();\n ctx.strokeStyle = \"rgba(250, 167, 0, 0.6)\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (let hx = Math.floor(x1); hx < x2; hx += 6) {\n ctx.moveTo(hx, RULER_HEIGHT - 1);\n ctx.lineTo(hx + 6, RULER_HEIGHT - 7);\n }\n ctx.stroke();\n ctx.restore();\n void style;\n }\n}\n\nfunction drawDragGhost(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const ghost = state.dragGhost!;\n // Locate the real clip so the ghost reuses its source / duration.\n let real: Clip | null = null;\n for (const t of state.project.tracks) {\n const c = t.clips.find((c) => c.id === ghost.clipId);\n if (c) {\n real = c;\n break;\n }\n }\n if (!real) return;\n\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const widthPx = Math.max(2, ((real.out - real.in) / 1000) * state.pxPerSec);\n const startX =\n baseX + (ghost.ghostStart / 1000) * state.pxPerSec - state.scrollLeft;\n\n // ---- Drop-slot outline ------------------------------------------------\n // Always paint a dashed rectangle where the clip will land — the\n // outline is the \"slot\" and the solid ghost above it is the clip.\n // When the drop would overlap (→ Editor will auto-split onto a\n // brand-new track below), draw an ADDITIONAL phantom row at the\n // bottom + outline there, so the user sees the new track coming.\n const overlap = ghost.wouldOverlap;\n // Phantom row is now drawn unconditionally during drag (see drawAll);\n // we only need the dashed drop outline here, on whichever row the\n // ghost is currently above.\n drawDropOutline(\n ctx,\n startX,\n overlap ? state.project.tracks.length : ghost.ghostTrackIndex,\n widthPx,\n style.info,\n overlap,\n );\n\n // ---- Ghost clip body --------------------------------------------------\n // Slight transparency so the user reads it as \"preview\" rather than\n // the committed clip. The drop outline + phantom row carry the rest\n // of the wayfinding.\n ctx.save();\n ctx.globalAlpha = 0.85;\n drawClipAt(\n ctx,\n real,\n overlap ? state.project.tracks.length : ghost.ghostTrackIndex,\n ghost.ghostStart,\n state.project.sources,\n state,\n style,\n thumbs,\n /* dim = */ false,\n /* warn = */ overlap,\n );\n ctx.restore();\n}\n\nfunction drawDropOutline(\n ctx: CanvasRenderingContext2D,\n startX: number,\n trackIndex: number,\n widthPx: number,\n color: string,\n emphasized: boolean,\n): void {\n // 1px solid info-tinted outline — present, but doesn't shout.\n // `emphasized` (used when the drop would land on the phantom new\n // track) bumps to a slightly thicker stroke + a faint glow halo.\n const y = trackY(trackIndex) + CLIP_INSET - 1;\n const h = TRACK_HEIGHT - CLIP_INSET * 2 + 2;\n ctx.save();\n if (emphasized) {\n ctx.shadowColor = withAlpha(color, 0.45);\n ctx.shadowBlur = 6;\n }\n ctx.strokeStyle = withAlpha(color, emphasized ? 0.9 : 0.7);\n ctx.lineWidth = 1;\n roundRect(ctx, startX - 0.5, y, widthPx + 1, h, 6);\n ctx.stroke();\n ctx.restore();\n}\n\n/**\n * Hairline placeholder row beneath the existing tracks, visible only\n * while a drag is active. Deliberately understated — top + bottom\n * dashed borders + a tiny label, no fill — so it reads as \"available\n * slot\" rather than \"selection target\".\n */\nfunction drawPhantomRow(\n ctx: CanvasRenderingContext2D,\n trackIndex: number,\n baseX: number,\n state: DrawState,\n style: DrawStyle,\n): void {\n const y = trackY(trackIndex);\n const w = state.viewportWidth - baseX;\n ctx.save();\n // Very faint background tint — keeps the row visually grouped with\n // the rest of the timeline without competing with clip thumbnails.\n ctx.fillStyle = withAlpha(style.info, 0.04);\n ctx.fillRect(baseX, y, w, TRACK_HEIGHT);\n // Dashed top + bottom hairlines so the eye reads it as a slot.\n ctx.strokeStyle = withAlpha(style.info, 0.35);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 4]);\n ctx.beginPath();\n ctx.moveTo(baseX, y + 0.5);\n ctx.lineTo(baseX + w, y + 0.5);\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(baseX + w, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n ctx.setLineDash([]);\n if (state.showHeader) {\n ctx.fillStyle = withAlpha(style.info, 0.7);\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(state.locale.newTrack, 12, y + TRACK_HEIGHT / 2);\n }\n ctx.restore();\n}\n\n// ---- ruler ----------------------------------------------------------------\n\nfunction drawRuler(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const { pxPerSec, scrollLeft, viewportWidth: W } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const rulerW = W - baseX;\n\n ctx.fillStyle = style.bg;\n ctx.fillRect(baseX, 0, rulerW, RULER_HEIGHT);\n\n // Bottom border under the ruler.\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, RULER_HEIGHT - 0.5);\n ctx.lineTo(W, RULER_HEIGHT - 0.5);\n ctx.stroke();\n\n const minPx = 80;\n const tickSec = niceTickSeconds(minPx / pxPerSec);\n const subSec = tickSec / 5;\n\n const firstVisibleSec = Math.max(0, scrollLeft / pxPerSec - subSec);\n const lastVisibleSec = (scrollLeft + rulerW) / pxPerSec + subSec;\n\n ctx.textBaseline = \"bottom\";\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n\n // Sub + major ticks in one pass.\n const startStep = Math.floor(firstVisibleSec / subSec);\n const endStep = Math.ceil(lastVisibleSec / subSec);\n\n for (let i = startStep; i <= endStep; i++) {\n const s = i * subSec;\n if (s < 0) continue;\n const x = baseX + s * pxPerSec - scrollLeft;\n if (x < baseX || x > W) continue;\n const isMajor = Math.abs(((s / tickSec) % 1)) < 1e-3;\n ctx.strokeStyle = isMajor\n ? withAlpha(style.text, 0.5)\n : withAlpha(style.text, 0.25);\n ctx.lineWidth = 1;\n const h = isMajor ? 10 : 6;\n ctx.beginPath();\n ctx.moveTo(x + 0.5, RULER_HEIGHT - h);\n ctx.lineTo(x + 0.5, RULER_HEIGHT - 1);\n ctx.stroke();\n if (isMajor) {\n ctx.fillStyle = withAlpha(style.textMuted, 0.85);\n ctx.fillText(formatRulerLabel(s), x + 3, RULER_HEIGHT - 12);\n }\n }\n}\n\n// ---- tracks + clips -------------------------------------------------------\n\nfunction drawTracks(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { project } = state;\n for (let ti = 0; ti < project.tracks.length; ti++) {\n drawTrackRow(ctx, ti, project.tracks[ti]!, project.sources, state, style, thumbs);\n }\n}\n\nfunction drawTrackRow(\n ctx: CanvasRenderingContext2D,\n trackIndex: number,\n track: Track,\n sources: MediaSource[],\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { viewportWidth: W } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const y = trackY(trackIndex);\n\n // Track surface: just the default tint. Drop-target highlight is now\n // limited to a 1px top + bottom info-tinted hairline (instead of a\n // brand-color flood) so the dragged ghost reads as primary content\n // and the row hint stays quiet.\n ctx.fillStyle = style.trackBg;\n ctx.fillRect(baseX, y, W - baseX, TRACK_HEIGHT);\n\n // Row separator (bottom border).\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(W, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n\n if (state.dropTargetTrackIndex === trackIndex) {\n ctx.strokeStyle = withAlpha(style.info, 0.45);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, y + 0.5);\n ctx.lineTo(W, y + 0.5);\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(W, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n }\n\n for (const clip of track.clips) {\n const dim = state.dragGhost?.clipId === clip.id;\n drawClipAt(\n ctx,\n clip,\n trackIndex,\n clip.start,\n sources,\n state,\n style,\n thumbs,\n dim,\n false,\n );\n }\n}\n\n/**\n * Paint a clip at a virtual `(trackIndex, startMs)` that may differ\n * from its data position. Used for both normal clip rendering (passing\n * the clip's real `start` + `trackIndex`) and for the in-flight drag\n * ghost (where the values come from pointer position).\n *\n * `dim` — render at low opacity (the \"leave-behind\" at the drag's\n * origin so the user sees where the clip will return if\n * they release without moving).\n * `warn` — paint the body in warning color (orange-ish) to telegraph\n * \"if you drop here, this will create a new track because\n * of the overlap rule.\"\n */\nfunction drawClipAt(\n ctx: CanvasRenderingContext2D,\n clip: Clip,\n trackIndex: number,\n startMs: number,\n sources: MediaSource[],\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n dim: boolean,\n warn: boolean,\n): void {\n const { pxPerSec, scrollLeft } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const startX = baseX + (startMs / 1000) * pxPerSec - scrollLeft;\n const widthPx = Math.max(2, ((clip.out - clip.in) / 1000) * pxPerSec);\n const y = trackY(trackIndex) + CLIP_INSET;\n const h = TRACK_HEIGHT - CLIP_INSET * 2;\n if (startX + widthPx < baseX || startX > state.viewportWidth) return;\n\n ctx.save();\n if (dim) ctx.globalAlpha = 0.3;\n\n // Body fill — brand gradient by default. `warn` (drop would\n // auto-create a new track) tints toward a soft amber rather than\n // the previous loud red/orange.\n const grad = ctx.createLinearGradient(0, y, 0, y + h);\n if (warn) {\n grad.addColorStop(0, \"rgba(250, 175, 70, 0.7)\");\n grad.addColorStop(1, \"rgba(240, 145, 50, 0.62)\");\n } else {\n grad.addColorStop(0, withAlpha(style.brand, 0.8));\n grad.addColorStop(1, withAlpha(style.brandTo, 0.7));\n }\n ctx.fillStyle = grad;\n roundRect(ctx, startX, y, widthPx, h, 6);\n ctx.fill();\n\n // Thumbnail strip.\n ctx.save();\n roundRect(ctx, startX, y, widthPx, h, 6);\n ctx.clip();\n ctx.translate(startX, y);\n thumbs.paintStrip(ctx, clip.sourceId, clip.in, clip.out, widthPx);\n ctx.restore();\n\n // Inner highlight (1px white inset).\n ctx.strokeStyle = \"rgba(255,255,255,0.2)\";\n ctx.lineWidth = 1;\n roundRect(ctx, startX + 0.5, y + 0.5, widthPx - 1, h - 1, 6);\n ctx.stroke();\n\n // Label.\n const src = sources.find((s) => s.id === clip.sourceId);\n const label = src?.name ?? src?.url.split(\"/\").pop() ?? clip.id;\n ctx.font = \"11px system-ui, -apple-system, sans-serif\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = \"rgba(0,0,0,0.6)\";\n ctx.fillText(label, startX + 9, y + 5);\n ctx.fillStyle = \"#fff\";\n ctx.fillText(label, startX + 8, y + 4);\n\n // Selection ring (skip when dimmed — selection has no meaning on a\n // ghost source clip; the ghost itself draws its own ring if you add\n // one later).\n if (!dim && state.selectedClipId === clip.id) {\n ctx.strokeStyle = style.selectedRing;\n ctx.lineWidth = 2;\n roundRect(ctx, startX - 1, y - 1, widthPx + 2, h + 2, 7);\n ctx.stroke();\n }\n\n // Edge handles on hover or selection.\n const showHandles =\n !dim && (state.selectedClipId === clip.id || state.hoveredClipId === clip.id);\n if (showHandles) {\n ctx.fillStyle = \"rgba(255,255,255,0.75)\";\n ctx.fillRect(startX + 2, y + 12, 2, h - 24);\n ctx.fillRect(startX + widthPx - 4, y + 12, 2, h - 24);\n }\n ctx.restore();\n}\n\n// ---- headers --------------------------------------------------------------\n\nfunction drawHeaders(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n ctx.fillStyle = style.bg;\n ctx.fillRect(0, 0, HEADER_WIDTH, state.viewportHeight);\n\n // Right border separating headers from scrollable area.\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(HEADER_WIDTH - 0.5, 0);\n ctx.lineTo(HEADER_WIDTH - 0.5, state.viewportHeight);\n ctx.stroke();\n\n ctx.textBaseline = \"middle\";\n ctx.font = \"11px system-ui, -apple-system, sans-serif\";\n for (let i = 0; i < state.project.tracks.length; i++) {\n const t = state.project.tracks[i]!;\n const y = trackY(i);\n // Track row separator.\n ctx.strokeStyle = style.border;\n ctx.beginPath();\n ctx.moveTo(0, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(HEADER_WIDTH, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n\n ctx.fillStyle = withAlpha(style.text, 0.7);\n const template =\n t.kind === \"video\"\n ? state.locale.videoTrackLabel\n : state.locale.audioTrackLabel;\n const label = formatLabel(template, { n: i + 1 });\n ctx.fillText(label, 12, y + TRACK_HEIGHT / 2);\n\n // Delete-track button — × icon at the right edge. Only painted\n // for empty tracks (hit-test agrees) so a busy row's UI doesn't\n // dangle a destructive button next to actual content.\n if (t.clips.length === 0) {\n const hovered = state.hoveredTrackIndex === i;\n const btnSize = 18;\n const btnLeft = HEADER_WIDTH - btnSize - 6;\n const btnTop = y + (TRACK_HEIGHT - btnSize) / 2;\n ctx.save();\n if (hovered) {\n ctx.fillStyle = withAlpha(style.text, 0.1);\n roundRect(ctx, btnLeft, btnTop, btnSize, btnSize, 5);\n ctx.fill();\n }\n ctx.strokeStyle = withAlpha(style.text, hovered ? 0.85 : 0.4);\n ctx.lineWidth = 1.4;\n const pad = 5;\n ctx.beginPath();\n ctx.moveTo(btnLeft + pad, btnTop + pad);\n ctx.lineTo(btnLeft + btnSize - pad, btnTop + btnSize - pad);\n ctx.moveTo(btnLeft + btnSize - pad, btnTop + pad);\n ctx.lineTo(btnLeft + pad, btnTop + btnSize - pad);\n ctx.stroke();\n ctx.restore();\n }\n }\n}\n\n// ---- playhead -------------------------------------------------------------\n\nfunction drawPlayhead(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const x = baseX + (state.timeMs / 1000) * state.pxPerSec - state.scrollLeft;\n if (x < baseX - 2 || x > state.viewportWidth + 2) return;\n\n // Vertical line through ruler + tracks.\n ctx.strokeStyle = style.playhead;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, state.viewportHeight);\n ctx.stroke();\n\n // Time bubble centered on the playhead at the top of the ruler.\n const label = fmtClockMs(state.timeMs);\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n const padX = 6;\n const w = ctx.measureText(label).width + padX * 2;\n const h = 14;\n const bx = x - w / 2;\n const by = 2;\n ctx.fillStyle = style.playhead;\n roundRect(ctx, bx, by, w, h, 4);\n ctx.fill();\n // Triangle hanging below the bubble.\n ctx.beginPath();\n ctx.moveTo(x - 4, by + h);\n ctx.lineTo(x + 4, by + h);\n ctx.lineTo(x, by + h + 4);\n ctx.closePath();\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, bx + padX, by + h / 2);\n}\n\n// ---- snap guide -----------------------------------------------------------\n\nfunction drawSnapGuide(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.snapX == null) return;\n ctx.strokeStyle = style.info;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(state.snapX + 0.5, 0);\n ctx.lineTo(state.snapX + 0.5, state.viewportHeight);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n\n// ---- utilities ------------------------------------------------------------\n\n// ---- scrollbars -----------------------------------------------------------\n\n/**\n * Right-edge vertical scrollbar. Opacity is host-controlled (set by\n * Timeline based on time-since-interaction + hover). Thumb position\n * and length derive from scrollTop / contentHeight / visibleHeight.\n */\nfunction drawScrollbarV(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.scrollbarOpacityY <= 0.01) return;\n const visibleH = state.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(state.project.tracks, state.isDragging);\n if (contentH <= visibleH) return;\n const trackX = state.viewportWidth - SCROLLBAR_THICKNESS + SCROLLBAR_INSET;\n const trackY0 = RULER_HEIGHT + SCROLLBAR_INSET;\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = contentH - visibleH;\n const thumbY =\n trackY0 + (maxScroll > 0 ? (state.scrollTop / maxScroll) * (trackLen - thumbLen) : 0);\n paintScrollbar(\n ctx,\n style,\n trackX,\n trackY0,\n SCROLLBAR_THICKNESS - SCROLLBAR_INSET * 2,\n trackLen,\n thumbY - trackY0,\n thumbLen,\n state.scrollbarOpacityY,\n state.scrollbarActiveY,\n \"v\",\n );\n}\n\nfunction drawScrollbarH(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.scrollbarOpacityX <= 0.01) return;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const visibleW = state.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(state.project, state.pxPerSec);\n if (contentW <= visibleW) return;\n const trackY0 = state.viewportHeight - SCROLLBAR_THICKNESS + SCROLLBAR_INSET;\n const trackX0 = baseX + SCROLLBAR_INSET;\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = contentW - visibleW;\n const thumbX =\n trackX0 + (maxScroll > 0 ? (state.scrollLeft / maxScroll) * (trackLen - thumbLen) : 0);\n paintScrollbar(\n ctx,\n style,\n trackX0,\n trackY0,\n trackLen,\n SCROLLBAR_THICKNESS - SCROLLBAR_INSET * 2,\n thumbX - trackX0,\n thumbLen,\n state.scrollbarOpacityX,\n state.scrollbarActiveX,\n \"h\",\n );\n}\n\n/**\n * Common drawing for both scrollbars. The thumb fades with `opacity`;\n * `active` (dragging) emphasizes via thicker stroke. Gutter is a\n * subtle background — visible to suggest \"you can grab here\" but\n * never loud enough to fight clip content.\n */\nfunction paintScrollbar(\n ctx: CanvasRenderingContext2D,\n style: DrawStyle,\n trackX: number,\n trackY0: number,\n trackW: number,\n trackH: number,\n thumbOffset: number,\n thumbLen: number,\n opacity: number,\n active: boolean,\n axis: \"h\" | \"v\",\n): void {\n ctx.save();\n ctx.globalAlpha = opacity;\n // Gutter — barely visible track lane.\n ctx.fillStyle = withAlpha(style.text, 0.06);\n roundRect(ctx, trackX, trackY0, trackW, trackH, Math.min(trackW, trackH) / 2);\n ctx.fill();\n // Thumb — neutral by default, info-tinted when actively dragged.\n ctx.fillStyle = active\n ? withAlpha(style.info, 0.85)\n : withAlpha(style.text, 0.4);\n if (axis === \"v\") {\n roundRect(ctx, trackX, trackY0 + thumbOffset, trackW, thumbLen, trackW / 2);\n } else {\n roundRect(ctx, trackX + thumbOffset, trackY0, thumbLen, trackH, trackH / 2);\n }\n ctx.fill();\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const rr = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n ctx.moveTo(x + rr, y);\n ctx.lineTo(x + w - rr, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + rr);\n ctx.lineTo(x + w, y + h - rr);\n ctx.quadraticCurveTo(x + w, y + h, x + w - rr, y + h);\n ctx.lineTo(x + rr, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - rr);\n ctx.lineTo(x, y + rr);\n ctx.quadraticCurveTo(x, y, x + rr, y);\n ctx.closePath();\n}\n\n/** color-mix substitute that works directly on hex/rgba strings via\n * canvas — quick & dirty: parse-or-pass-through. For named css colors\n * we fall back to the original. Good enough for our palette. */\nfunction mix(a: string, b: string, t: number): string {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return a;\n const r = Math.round(ca[0] + (cb[0] - ca[0]) * (1 - t));\n const g = Math.round(ca[1] + (cb[1] - ca[1]) * (1 - t));\n const bl = Math.round(ca[2] + (cb[2] - ca[2]) * (1 - t));\n return `rgb(${r}, ${g}, ${bl})`;\n}\n\nfunction withAlpha(color: string, alpha: number): string {\n const c = parseColor(color);\n if (!c) return color;\n return `rgba(${c[0]}, ${c[1]}, ${c[2]}, ${alpha})`;\n}\n\nfunction parseColor(s: string): [number, number, number] | null {\n if (s.startsWith(\"#\")) {\n const hex = s.slice(1);\n if (hex.length === 3) {\n return [\n parseInt(hex[0]! + hex[0]!, 16),\n parseInt(hex[1]! + hex[1]!, 16),\n parseInt(hex[2]! + hex[2]!, 16),\n ];\n }\n if (hex.length === 6) {\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n }\n const m = s.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (m) return [Number(m[1]), Number(m[2]), Number(m[3])];\n return null;\n}\n","import type { Project } from \"../types.js\";\nimport {\n HANDLE_PX,\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n contentHeight,\n contentWidth,\n trackIndexAt,\n trackY,\n xToMs,\n} from \"./layout.js\";\n\nexport type HitTarget =\n | { kind: \"ruler\" }\n | { kind: \"header\"; trackIndex: number }\n | { kind: \"header-delete\"; trackIndex: number }\n | { kind: \"track-empty\"; trackIndex: number }\n | { kind: \"clip\"; trackIndex: number; clipId: string }\n | { kind: \"clip-handle-left\"; trackIndex: number; clipId: string }\n | { kind: \"clip-handle-right\"; trackIndex: number; clipId: string }\n | { kind: \"phantom-new-track\" }\n /** Drag the thumb itself — caller stores pointerStart + scrollStart. */\n | { kind: \"scrollbar-thumb-v\"; thumbY: number; thumbLen: number }\n | { kind: \"scrollbar-thumb-h\"; thumbX: number; thumbLen: number }\n /** Click the gutter (anywhere on the bar that isn't the thumb) →\n * page-jump by one viewport in the direction of the click. */\n | { kind: \"scrollbar-track-v\"; before: boolean }\n | { kind: \"scrollbar-track-h\"; before: boolean }\n | { kind: \"outside\" };\n\nexport interface HitContext {\n project: Project;\n pxPerSec: number;\n scrollLeft: number;\n scrollTop: number;\n showHeader: boolean;\n viewportWidth: number;\n viewportHeight: number;\n isDragging: boolean;\n}\n\n/**\n * Pixel → semantic target. Branches in roughly this order:\n * 1. Ruler band (top RULER_HEIGHT px) → scrub\n * 2. Header column (left HEADER_WIDTH px, when visible) → track header\n * 3. Track row contents → clip body / edge handle / empty space\n *\n * The handle-edge check is generous (HANDLE_PX) so users can grab a\n * trim handle even on a clip that's only a few px wide at low zoom.\n */\nexport function hitTest(x: number, y: number, ctx: HitContext): HitTarget {\n if (y < 0 || x < 0) return { kind: \"outside\" };\n\n // ---- Scrollbars first ----------------------------------------------\n // The bars overlay everything else, so a click on the thumb must NEVER\n // fall through to \"select clip\" / \"seek\". Check them before any other\n // region resolves.\n const baseX = ctx.showHeader ? HEADER_WIDTH : 0;\n const visibleH = ctx.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(ctx.project.tracks, ctx.isDragging);\n // Vertical bar\n if (\n contentH > visibleH &&\n x >= ctx.viewportWidth - SCROLLBAR_THICKNESS &&\n x < ctx.viewportWidth &&\n y >= RULER_HEIGHT &&\n y < ctx.viewportHeight - SCROLLBAR_THICKNESS\n ) {\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = contentH - visibleH;\n const thumbY =\n RULER_HEIGHT +\n SCROLLBAR_INSET +\n (maxScroll > 0 ? (ctx.scrollTop / maxScroll) * (trackLen - thumbLen) : 0);\n if (y >= thumbY && y <= thumbY + thumbLen) {\n return { kind: \"scrollbar-thumb-v\", thumbY, thumbLen };\n }\n return { kind: \"scrollbar-track-v\", before: y < thumbY };\n }\n // Horizontal bar\n const visibleW = ctx.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(ctx.project, ctx.pxPerSec);\n if (\n contentW > visibleW &&\n y >= ctx.viewportHeight - SCROLLBAR_THICKNESS &&\n y < ctx.viewportHeight &&\n x >= baseX &&\n x < ctx.viewportWidth - SCROLLBAR_THICKNESS\n ) {\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = contentW - visibleW;\n const thumbX =\n baseX +\n SCROLLBAR_INSET +\n (maxScroll > 0\n ? (ctx.scrollLeft / maxScroll) * (trackLen - thumbLen)\n : 0);\n if (x >= thumbX && x <= thumbX + thumbLen) {\n return { kind: \"scrollbar-thumb-h\", thumbX, thumbLen };\n }\n return { kind: \"scrollbar-track-h\", before: x < thumbX };\n }\n\n if (ctx.showHeader && x < HEADER_WIDTH && y >= RULER_HEIGHT) {\n const ti = trackIndexAt(y, ctx.project.tracks.length, ctx.scrollTop);\n if (ti >= 0) {\n const track = ctx.project.tracks[ti]!;\n if (track.clips.length === 0) {\n const btnSize = 18;\n const btnLeft = HEADER_WIDTH - btnSize - 6;\n // Header rows are translated by -scrollTop when painted, so\n // their visible top in viewport coords is `trackY(i) - scrollTop`.\n const btnTop =\n RULER_HEIGHT + ti * 56 + (56 - btnSize) / 2 - ctx.scrollTop;\n if (\n x >= btnLeft &&\n x <= btnLeft + btnSize &&\n y >= btnTop &&\n y <= btnTop + btnSize\n ) {\n return { kind: \"header-delete\", trackIndex: ti };\n }\n }\n return { kind: \"header\", trackIndex: ti };\n }\n return { kind: \"outside\" };\n }\n\n if (y < RULER_HEIGHT) return { kind: \"ruler\" };\n\n const ti = trackIndexAt(y, ctx.project.tracks.length, ctx.scrollTop);\n if (ti < 0) return { kind: \"outside\" };\n const track = ctx.project.tracks[ti]!;\n const ms = xToMs(x, ctx.pxPerSec, ctx.scrollLeft, ctx.showHeader);\n\n // Closest clip whose timeline range contains `ms`, or whose edge is\n // within HANDLE_PX of the cursor (so resize handles are grabbable\n // even slightly outside the clip body).\n for (const clip of track.clips) {\n const start = clip.start;\n const end = clip.start + (clip.out - clip.in);\n const startX = msToXLocal(start, ctx);\n const endX = msToXLocal(end, ctx);\n\n if (x >= startX - HANDLE_PX && x <= startX + HANDLE_PX) {\n return { kind: \"clip-handle-left\", trackIndex: ti, clipId: clip.id };\n }\n if (x >= endX - HANDLE_PX && x <= endX + HANDLE_PX) {\n return { kind: \"clip-handle-right\", trackIndex: ti, clipId: clip.id };\n }\n if (ms >= start && ms < end) {\n return { kind: \"clip\", trackIndex: ti, clipId: clip.id };\n }\n }\n return { kind: \"track-empty\", trackIndex: ti };\n}\n\nfunction msToXLocal(ms: number, ctx: HitContext): number {\n const base = ctx.showHeader ? HEADER_WIDTH : 0;\n return base + (ms / 1000) * ctx.pxPerSec - ctx.scrollLeft;\n}\n","import { type Locale, mergeLocale } from \"../i18n.js\";\nimport { normalizeProject, projectDuration } from \"../model.js\";\nimport type { Clip, Ms, Project } from \"../types.js\";\nimport { ThumbnailRibbon } from \"../ui/thumbnails.js\";\nimport {\n drawAll,\n type DrawState,\n type DrawStyle,\n} from \"./draw.js\";\nimport { hitTest, type HitTarget } from \"./hit.js\";\nimport {\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n TRACK_HEIGHT,\n clampScale,\n contentHeight,\n contentWidth,\n findClip,\n snapTargets,\n trackIndexAt,\n wouldOverlap,\n xToMs,\n} from \"./layout.js\";\n\n/**\n * Public options for the standalone `Timeline` component. The class\n * is framework-agnostic — `@aicut/react` and `@aicut/vue` wrap it,\n * and the built-in `Editor` composes one internally for its timeline\n * panel. Reuse the same instance for a \"frame-picker\" use case by\n * loading a project with a single video clip and `readOnly: true`.\n */\nexport interface TimelineOptions {\n /** Host element. Will be wiped on init. */\n container: HTMLElement;\n project: Project;\n /** Pixels per second. Defaults to 80; auto-fits on mount when possible. */\n pxPerSec?: number;\n /** Initial playhead position. */\n time?: Ms;\n /** Initially selected clip. */\n selectedClipId?: string | null;\n /** Show the track-name header column (left). Default true. */\n showHeader?: boolean;\n /** Disable interactions — useful for read-only preview / frame picker. */\n readOnly?: boolean;\n /** Snap to clip edges + playhead when dragging. Default true. */\n snap?: boolean;\n /** Compute and apply fit-to-window on first project change. Default true. */\n autoFit?: boolean;\n /** UI string overrides (English defaults). Use `localeZh` for Chinese. */\n locale?: Partial<Locale>;\n /**\n * Render an empty 36px toolbar strip at the top of the host element\n * with `toolbarLeft` / `toolbarRight` flex slots. The library paints\n * NOTHING into either slot — hosts append their own controls (an\n * export button, a size/aspect dropdown, etc.). Default false; the\n * canvas takes the full host height when the toolbar is off, so\n * adopting the slot later is a non-breaking opt-in.\n */\n toolbar?: boolean;\n\n onSeek?: (timeMs: Ms) => void;\n onSelectClip?: (clipId: string | null) => void;\n onScaleChange?: (pxPerSec: number) => void;\n onDeleteTrack?: (trackId: string) => void;\n onMoveClip?: (\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ) => void;\n onResizeClip?: (\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ) => void;\n onChange?: (project: Project) => void;\n\n /**\n * Lets the host predict where a drop will actually land — used to\n * keep the drag-ghost visual honest. The Editor wires this to its\n * smart routing (intended → source → other → new track), so the\n * ghost shows the real outcome rather than just the user's hover.\n *\n * Return `{ trackIndex }` for an existing track, or\n * `{ wouldCreateNew: true }` for the auto-split case.\n */\n resolveDrop?: (\n clipId: string,\n intent: { start: Ms; intendedTrackIndex: number },\n ) => { trackIndex: number; wouldCreateNew: boolean };\n}\n\ninterface DragMove {\n kind: \"move\";\n clipId: string;\n trackIndex: number;\n pointerStartX: number;\n pointerStartY: number;\n originalStart: Ms;\n}\ninterface DragTrim {\n kind: \"trim-left\" | \"trim-right\";\n clipId: string;\n trackIndex: number;\n pointerStartX: number;\n originalStart: Ms;\n originalIn: Ms;\n originalOut: Ms;\n}\ninterface DragScrub {\n kind: \"scrub\";\n}\ntype DragCtx = DragMove | DragTrim | DragScrub;\n\nconst SNAP_PX = 8;\nconst DEFAULT_SCALE = 80;\nconst WHEEL_ZOOM_RATE = 0.012;\nconst SCROLLBAR_FADE_HOLD_MS = 800;\nconst SCROLLBAR_FADE_OUT_MS = 400;\n\n/**\n * Canvas-rendered, framework-free timeline. Owns ruler, multi-track\n * layout, headers, frame-thumbnails, playhead, snap, and all pointer\n * gestures. No DOM children for clips/ticks/etc — every pixel is\n * painted via 2D canvas, so even hundreds of clips render in <2ms.\n */\nexport class Timeline {\n private root: HTMLElement;\n private opts: TimelineOptions;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private thumbs: ThumbnailRibbon;\n private hiddenHost: HTMLDivElement;\n private toolbarEl: HTMLDivElement | null = null;\n /**\n * Public flex slot at the left of the top toolbar. `null` when\n * `toolbar` is disabled. Hosts append their own elements (e.g. a\n * size/aspect dropdown). React/Vue wrappers portal children here.\n */\n readonly toolbarLeft: HTMLDivElement | null = null;\n /** Right-side counterpart — conventionally used for export/save. */\n readonly toolbarRight: HTMLDivElement | null = null;\n\n private project: Project;\n private pxPerSec: number;\n private timeMs: Ms;\n private selectedClipId: string | null;\n private snapEnabled: boolean;\n private showHeader: boolean;\n private readOnly: boolean;\n private autoFitEnabled: boolean;\n private locale: Locale;\n\n private scrollLeft = 0;\n private scrollTop = 0;\n private viewportWidth = 0;\n private viewportHeight = 0;\n /**\n * `Date.now()` of the last interaction with each scrollbar (scroll\n * change OR hover OR drag). Drives the macOS-style fade — bars are\n * fully opaque for SCROLLBAR_FADE_HOLD_MS after activity, then ease\n * out over the next SCROLLBAR_FADE_OUT_MS.\n */\n private lastScrollInteractY = 0;\n private lastScrollInteractX = 0;\n private hoverScrollbarY = false;\n private hoverScrollbarX = false;\n /** When set, pointer is dragging a scrollbar thumb. */\n private scrollbarDrag: {\n axis: \"v\" | \"h\";\n pointerStart: number;\n scrollStart: number;\n } | null = null;\n private hoveredClipId: string | null = null;\n private hoveredTrackIndex: number | null = null;\n private hoverCursor: string = \"default\";\n private dropTargetTrackIndex: number | null = null;\n private snapX: number | null = null;\n private drag: DragCtx | null = null;\n /**\n * In-flight ghost of the clip being dragged. Decoupled from the\n * project data so the data stays clean and undo-able only commits\n * on release. Has both the proposed `start` (X) and `trackIndex`\n * (Y), so the rendered ghost follows the cursor across tracks.\n */\n private dragGhost: {\n clipId: string;\n ghostStart: Ms;\n ghostTrackIndex: number;\n wouldOverlap: boolean;\n } | null = null;\n /**\n * Most recent local pointer coords during a move drag — used by the\n * edge-autoscroll loop to re-run drop-target resolution between\n * pointermove events while scrollTop ticks under a stationary cursor.\n */\n private lastDragPointerX = 0;\n private lastDragPointerY = 0;\n private dragScrollRafPending = false;\n private rafPending = false;\n private hasAutoFitted = false;\n private resizeObs: ResizeObserver | null = null;\n private destroyed = false;\n\n static create(opts: TimelineOptions): Timeline {\n return new Timeline(opts);\n }\n\n constructor(opts: TimelineOptions) {\n this.opts = opts;\n this.root = opts.container;\n this.project = normalizeProject(opts.project);\n this.pxPerSec = clampScale(opts.pxPerSec ?? DEFAULT_SCALE);\n this.timeMs = opts.time ?? 0;\n this.selectedClipId = opts.selectedClipId ?? null;\n this.snapEnabled = opts.snap !== false;\n this.showHeader = opts.showHeader !== false;\n this.readOnly = opts.readOnly === true;\n this.autoFitEnabled = opts.autoFit !== false;\n this.locale = mergeLocale(opts.locale);\n\n this.root.classList.add(\"aicut-timeline-canvas\");\n this.root.innerHTML = \"\";\n this.root.style.position = this.root.style.position || \"relative\";\n\n // Toolbar strip — opt-in. When enabled the root becomes a flex\n // column so the toolbar reserves vertical space and the canvas\n // gets whatever's left via flex:1. When off, the canvas keeps\n // its old 100%-height layout — zero-cost for existing callers.\n if (opts.toolbar) {\n this.root.style.display = \"flex\";\n this.root.style.flexDirection = \"column\";\n const bar = document.createElement(\"div\");\n bar.className = \"aicut-timeline-toolbar\";\n const left = document.createElement(\"div\");\n left.className = \"aicut-timeline-toolbar-left\";\n const right = document.createElement(\"div\");\n right.className = \"aicut-timeline-toolbar-right\";\n bar.appendChild(left);\n bar.appendChild(right);\n this.root.appendChild(bar);\n this.toolbarEl = bar;\n (this as { toolbarLeft: HTMLDivElement | null }).toolbarLeft = left;\n (this as { toolbarRight: HTMLDivElement | null }).toolbarRight = right;\n }\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n if (opts.toolbar) {\n // Flex child: take remaining height; min-height:0 lets us shrink\n // below content size when the host is constrained.\n this.canvas.style.flex = \"1 1 0\";\n this.canvas.style.minHeight = \"0\";\n } else {\n this.canvas.style.height = \"100%\";\n }\n this.canvas.style.touchAction = \"none\";\n // No data-testid on the canvas itself — both the editor's and a\n // standalone frame-picker timeline would collide. Tests select via\n // the host element instead (e.g. `[data-testid=\"aicut-timeline\"] canvas`).\n this.root.appendChild(this.canvas);\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"2d context unavailable\");\n this.ctx = ctx;\n\n // Off-screen <video> elements for thumbnail extraction live here.\n this.hiddenHost = document.createElement(\"div\");\n this.hiddenHost.style.position = \"absolute\";\n this.hiddenHost.style.overflow = \"hidden\";\n this.hiddenHost.style.width = \"0\";\n this.hiddenHost.style.height = \"0\";\n this.hiddenHost.style.pointerEvents = \"none\";\n this.root.appendChild(this.hiddenHost);\n\n this.thumbs = new ThumbnailRibbon(this.hiddenHost, () =>\n this.scheduleRender(),\n );\n this.thumbs.syncSources(this.project.sources);\n\n this.attachPointer();\n this.attachWheel();\n this.attachResize();\n this.resizeCanvas();\n this.scheduleRender();\n }\n\n // ---- public API -----------------------------------------------------\n\n /**\n * Sync the project data. Does NOT reset the auto-fit latch — that's\n * what caused the editor-side zoom feedback loop: every Editor\n * mutation called `ui.render() → timeline.setProject()` which used\n * to reset auto-fit, refit on the next frame, emit a new scale,\n * which re-rendered… and round we went. Callers that genuinely\n * want a re-fit (e.g. when the host swaps to a brand-new project)\n * should call `refit()` explicitly.\n */\n setProject(p: Project): void {\n this.project = normalizeProject(p);\n this.thumbs.syncSources(this.project.sources);\n this.scheduleRender();\n }\n\n /** Force a re-fit on the next render. */\n refit(): void {\n if (!this.autoFitEnabled) return;\n this.hasAutoFitted = false;\n this.scheduleRender();\n }\n\n getProject(): Project {\n return JSON.parse(JSON.stringify(this.project)) as Project;\n }\n\n setTime(timeMs: Ms): void {\n this.timeMs = Math.max(0, timeMs);\n this.scheduleRender();\n }\n\n getTime(): Ms {\n return this.timeMs;\n }\n\n setScale(pxPerSec: number): void {\n const next = clampScale(pxPerSec);\n if (next === this.pxPerSec) return;\n this.pxPerSec = next;\n this.hasAutoFitted = true;\n this.scheduleRender();\n }\n\n getScale(): number {\n return this.pxPerSec;\n }\n\n setSelection(id: string | null): void {\n if (id === this.selectedClipId) return;\n this.selectedClipId = id;\n this.scheduleRender();\n }\n\n getSelection(): string | null {\n return this.selectedClipId;\n }\n\n setSnap(snap: boolean): void {\n this.snapEnabled = snap;\n }\n\n getSnap(): boolean {\n return this.snapEnabled;\n }\n\n setLocale(locale: Partial<Locale>): void {\n this.locale = mergeLocale(locale);\n this.scheduleRender();\n }\n\n /** Fit the project's full duration into the current viewport width. */\n fitToWindow(): void {\n const fit = this.computeFitScale();\n if (fit == null) return;\n this.pxPerSec = fit;\n this.hasAutoFitted = true;\n this.scrollLeft = 0;\n this.opts.onScaleChange?.(this.pxPerSec);\n this.scheduleRender();\n }\n\n /**\n * Test/debug introspection — pixel coordinates of every visible clip,\n * the playhead, and the headers. Because clips are canvas-painted\n * there are no DOM nodes to query in e2e; tests use this instead.\n * Exposed publicly so React/Vue wrappers can forward it to a ref.\n */\n getDebugInfo(): {\n pxPerSec: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n playheadX: number;\n clips: Array<{\n id: string;\n trackIndex: number;\n x: number;\n width: number;\n y: number;\n height: number;\n }>;\n } {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const clips: Array<{\n id: string;\n trackIndex: number;\n x: number;\n width: number;\n y: number;\n height: number;\n }> = [];\n for (let ti = 0; ti < this.project.tracks.length; ti++) {\n const t = this.project.tracks[ti]!;\n for (const c of t.clips) {\n const x = baseX + (c.start / 1000) * this.pxPerSec - this.scrollLeft;\n const width = ((c.out - c.in) / 1000) * this.pxPerSec;\n const y = RULER_HEIGHT + ti * TRACK_HEIGHT + 6;\n clips.push({\n id: c.id,\n trackIndex: ti,\n x,\n width,\n y,\n height: TRACK_HEIGHT - 12,\n });\n }\n }\n return {\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n playheadX:\n baseX + (this.timeMs / 1000) * this.pxPerSec - this.scrollLeft,\n clips,\n };\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.resizeObs?.disconnect();\n this.thumbs.destroy();\n this.root.innerHTML = \"\";\n this.root.classList.remove(\"aicut-timeline-canvas\");\n if (this.opts.toolbar) {\n this.root.style.display = \"\";\n this.root.style.flexDirection = \"\";\n }\n }\n\n // ---- size / layout --------------------------------------------------\n\n private resizeCanvas(): void {\n // Read the canvas's own box, not the root's — when the toolbar\n // strip is enabled the root flex-allots part of its height to it,\n // and the canvas's rect is the only honest source of the drawing\n // area. With no toolbar, canvas fills root, so this still matches.\n const rect = this.canvas.getBoundingClientRect();\n this.viewportWidth = Math.max(1, Math.floor(rect.width));\n this.viewportHeight = Math.max(\n Math.floor(rect.height) || RULER_HEIGHT + TRACK_HEIGHT + SCROLLBAR_THICKNESS,\n RULER_HEIGHT + TRACK_HEIGHT + SCROLLBAR_THICKNESS,\n );\n const dpr = window.devicePixelRatio || 1;\n this.canvas.width = Math.floor(this.viewportWidth * dpr);\n this.canvas.height = Math.floor(this.viewportHeight * dpr);\n this.canvas.style.height = `${this.viewportHeight}px`;\n this.ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n private computeFitScale(): number | null {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const w = this.viewportWidth - baseX - 24;\n const dur = projectDuration(this.project);\n if (w <= 0 || dur <= 0) return null;\n return clampScale(w / (dur / 1000));\n }\n\n private maxScrollLeft(): number {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const visibleW = this.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const cw = contentWidth(this.project, this.pxPerSec);\n return Math.max(0, cw - visibleW + 24);\n }\n\n private maxScrollTop(): number {\n const visibleH =\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const ch = contentHeight(this.project.tracks, this.drag?.kind === \"move\");\n return Math.max(0, ch - visibleH);\n }\n\n private clampScroll(): void {\n this.scrollLeft = Math.max(0, Math.min(this.scrollLeft, this.maxScrollLeft()));\n this.scrollTop = Math.max(0, Math.min(this.scrollTop, this.maxScrollTop()));\n }\n\n /**\n * Scrollbar opacity = full for SCROLLBAR_FADE_HOLD_MS after last\n * interaction, then linearly fades to 0 over SCROLLBAR_FADE_OUT_MS.\n * Hovering or actively dragging the bar pins opacity at 1. Returns\n * 0 if the bar isn't needed (content fits).\n */\n private scrollbarOpacity(axis: \"v\" | \"h\"): number {\n if (axis === \"v\" && this.maxScrollTop() <= 0) return 0;\n if (axis === \"h\" && this.maxScrollLeft() <= 0) return 0;\n if (\n (axis === \"v\" && (this.hoverScrollbarY || this.scrollbarDrag?.axis === \"v\")) ||\n (axis === \"h\" && (this.hoverScrollbarX || this.scrollbarDrag?.axis === \"h\"))\n ) {\n return 1;\n }\n const last = axis === \"v\" ? this.lastScrollInteractY : this.lastScrollInteractX;\n const elapsed = Date.now() - last;\n if (elapsed < SCROLLBAR_FADE_HOLD_MS) return 1;\n const fade = elapsed - SCROLLBAR_FADE_HOLD_MS;\n if (fade >= SCROLLBAR_FADE_OUT_MS) return 0;\n return 1 - fade / SCROLLBAR_FADE_OUT_MS;\n }\n\n /** Mark a scrollbar axis as just-touched so its fade timer restarts. */\n private touchScrollbar(axis: \"v\" | \"h\"): void {\n if (axis === \"v\") this.lastScrollInteractY = Date.now();\n else this.lastScrollInteractX = Date.now();\n this.scheduleRender();\n }\n\n // ---- rendering ------------------------------------------------------\n\n private scheduleRender(): void {\n if (this.rafPending) return;\n this.rafPending = true;\n requestAnimationFrame(() => {\n this.rafPending = false;\n if (this.destroyed) return;\n this.maybeAutoFit();\n this.resizeCanvas();\n this.clampScroll();\n drawAll(\n this.ctx,\n this.buildDrawState(),\n this.readStyle(),\n this.thumbs,\n );\n this.canvas.style.cursor = this.hoverCursor;\n this.maybeContinueFade();\n });\n }\n\n /**\n * Keep the raf loop alive while a scrollbar is still in its HOLD or\n * fade-out window. Without this, opacity is sampled once and the\n * bar would freeze at whatever value it had at the last input event\n * instead of smoothly fading out. Skipped when a bar is pinned\n * (hover or active drag) since opacity is constant there.\n */\n private maybeContinueFade(): void {\n const total = SCROLLBAR_FADE_HOLD_MS + SCROLLBAR_FADE_OUT_MS;\n const now = Date.now();\n const needV =\n this.maxScrollTop() > 0 &&\n !this.hoverScrollbarY &&\n this.scrollbarDrag?.axis !== \"v\" &&\n now - this.lastScrollInteractY < total;\n const needH =\n this.maxScrollLeft() > 0 &&\n !this.hoverScrollbarX &&\n this.scrollbarDrag?.axis !== \"h\" &&\n now - this.lastScrollInteractX < total;\n if (needV || needH) this.scheduleRender();\n }\n\n private maybeAutoFit(): void {\n if (!this.autoFitEnabled || this.hasAutoFitted) return;\n if (projectDuration(this.project) <= 0) return;\n const fit = this.computeFitScale();\n if (fit == null) return;\n this.hasAutoFitted = true;\n if (Math.abs(fit - this.pxPerSec) > 0.5) {\n this.pxPerSec = fit;\n this.opts.onScaleChange?.(fit);\n }\n }\n\n private buildDrawState(): DrawState {\n return {\n project: this.project,\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n scrollTop: this.scrollTop,\n timeMs: this.timeMs,\n selectedClipId: this.selectedClipId,\n hoveredClipId: this.hoveredClipId,\n hoveredTrackIndex: this.hoveredTrackIndex,\n dropTargetTrackIndex: this.dropTargetTrackIndex,\n isDragging: this.drag?.kind === \"move\",\n snapX: this.snapX,\n showHeader: this.showHeader,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n dragGhost: this.dragGhost,\n scrollbarOpacityY: this.scrollbarOpacity(\"v\"),\n scrollbarOpacityX: this.scrollbarOpacity(\"h\"),\n scrollbarActiveY: this.scrollbarDrag?.axis === \"v\",\n scrollbarActiveX: this.scrollbarDrag?.axis === \"h\",\n locale: this.locale,\n };\n }\n\n private readStyle(): DrawStyle {\n const cs = getComputedStyle(this.root);\n const v = (name: string, fallback: string) =>\n cs.getPropertyValue(name).trim() || fallback;\n return {\n bg: v(\"--aicut-controls-bg\", \"#1f1f22\"),\n border: v(\"--aicut-controls-border\", \"rgba(255,255,255,0.08)\"),\n // Pass the resolved text color straight through — draw.ts'\n // withAlpha can adjust it for tick / muted variants.\n text: v(\"--aicut-controls-text\", \"rgba(255,255,255,0.85)\"),\n textMuted: v(\"--color-muted\", \"#999999\"),\n trackBg: \"rgba(255,255,255,0.06)\",\n brand: v(\"--color-brand\", \"#ff3386\"),\n brandTo: v(\"--color-secondary\", \"#9a31f4\"),\n info: v(\"--color-info\", \"#1077ff\"),\n clipText: \"#fff\",\n selectedRing: v(\"--color-info\", \"#1077ff\"),\n playhead: v(\"--color-brand\", \"#ff3386\"),\n };\n }\n\n // ---- pointer / wheel ------------------------------------------------\n\n private attachPointer(): void {\n this.canvas.addEventListener(\"pointerdown\", (e) => this.onPointerDown(e));\n this.canvas.addEventListener(\"pointermove\", (e) => this.onPointerMove(e));\n this.canvas.addEventListener(\"pointerup\", (e) => this.onPointerUp(e));\n this.canvas.addEventListener(\"pointercancel\", (e) => this.onPointerUp(e));\n this.canvas.addEventListener(\"pointerleave\", () => {\n if (!this.drag && !this.scrollbarDrag) {\n this.hoveredClipId = null;\n this.hoverCursor = \"default\";\n this.hoverScrollbarY = false;\n this.hoverScrollbarX = false;\n this.scheduleRender();\n }\n });\n }\n\n private onPointerDown(e: PointerEvent): void {\n const { x, y } = this.localCoords(e);\n const target = this.hitTarget(x, y);\n this.canvas.setPointerCapture(e.pointerId);\n\n // Scrollbar hits are handled BEFORE readOnly / other targets so the\n // bar works as a regular scroll affordance even in frame-picker mode.\n if (target.kind === \"scrollbar-thumb-v\") {\n this.scrollbarDrag = {\n axis: \"v\",\n pointerStart: y,\n scrollStart: this.scrollTop,\n };\n this.touchScrollbar(\"v\");\n return;\n }\n if (target.kind === \"scrollbar-thumb-h\") {\n this.scrollbarDrag = {\n axis: \"h\",\n pointerStart: x,\n scrollStart: this.scrollLeft,\n };\n this.touchScrollbar(\"h\");\n return;\n }\n if (target.kind === \"scrollbar-track-v\") {\n const page = Math.max(\n TRACK_HEIGHT,\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS,\n );\n this.scrollTop += target.before ? -page : page;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n return;\n }\n if (target.kind === \"scrollbar-track-h\") {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const page = Math.max(\n 80,\n this.viewportWidth - baseX - SCROLLBAR_THICKNESS,\n );\n this.scrollLeft += target.before ? -page : page;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n return;\n }\n\n // Read-only mode (e.g. frame-picker) — every click in the track\n // area becomes a seek. Drag = scrub. No selection / move / trim.\n if (this.readOnly) {\n if (\n target.kind === \"ruler\" ||\n target.kind === \"clip\" ||\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\" ||\n target.kind === \"track-empty\"\n ) {\n this.drag = { kind: \"scrub\" };\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n }\n return;\n }\n\n if (target.kind === \"header-delete\") {\n const t = this.project.tracks[target.trackIndex];\n if (t) this.opts.onDeleteTrack?.(t.id);\n return;\n }\n\n if (target.kind === \"header\") return;\n\n if (target.kind === \"ruler\") {\n this.drag = { kind: \"scrub\" };\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n return;\n }\n\n if (target.kind === \"clip\") {\n const found = findClip(this.project, target.clipId);\n if (!found) return;\n this.selectedClipId = target.clipId;\n this.opts.onSelectClip?.(target.clipId);\n this.drag = {\n kind: \"move\",\n clipId: target.clipId,\n trackIndex: target.trackIndex,\n pointerStartX: x,\n pointerStartY: y,\n originalStart: found.clip.start,\n };\n this.scheduleRender();\n return;\n }\n\n if (\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\"\n ) {\n const found = findClip(this.project, target.clipId);\n if (!found) return;\n this.selectedClipId = target.clipId;\n this.opts.onSelectClip?.(target.clipId);\n this.drag = {\n kind: target.kind === \"clip-handle-left\" ? \"trim-left\" : \"trim-right\",\n clipId: target.clipId,\n trackIndex: target.trackIndex,\n pointerStartX: x,\n originalStart: found.clip.start,\n originalIn: found.clip.in,\n originalOut: found.clip.out,\n };\n this.scheduleRender();\n return;\n }\n\n if (target.kind === \"track-empty\") {\n // Bare-track click = deselect + seek to clicked time.\n this.selectedClipId = null;\n this.opts.onSelectClip?.(null);\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.drag = { kind: \"scrub\" };\n this.scheduleRender();\n return;\n }\n }\n\n private onPointerMove(e: PointerEvent): void {\n const { x, y } = this.localCoords(e);\n\n // Scrollbar thumb drag has priority — pointer delta along the bar's\n // axis maps to a scroll delta scaled by (maxScroll / freeTrackLen).\n // freeTrackLen is the gutter length minus the thumb length, i.e.\n // how far the thumb can actually travel.\n if (this.scrollbarDrag) {\n if (this.scrollbarDrag.axis === \"v\") {\n const visibleH =\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(\n this.project.tracks,\n this.drag?.kind === \"move\",\n );\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = Math.max(0, contentH - visibleH);\n const free = Math.max(1, trackLen - thumbLen);\n const ratio = maxScroll / free;\n this.scrollTop =\n this.scrollbarDrag.scrollStart +\n (y - this.scrollbarDrag.pointerStart) * ratio;\n } else {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const visibleW = this.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(this.project, this.pxPerSec);\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = Math.max(0, contentW - visibleW);\n const free = Math.max(1, trackLen - thumbLen);\n const ratio = maxScroll / free;\n this.scrollLeft =\n this.scrollbarDrag.scrollStart +\n (x - this.scrollbarDrag.pointerStart) * ratio;\n }\n this.clampScroll();\n this.touchScrollbar(this.scrollbarDrag.axis);\n return;\n }\n\n if (!this.drag) {\n // Hover-only — update cursor + hoveredClipId + hoveredTrackIndex.\n const target = this.hitTarget(x, y);\n let nextHover: string | null = null;\n let nextHoverTrack: number | null = null;\n let cursor = \"default\";\n let onScrollbarV = false;\n let onScrollbarH = false;\n if (target.kind === \"clip\") {\n nextHover = target.clipId;\n nextHoverTrack = target.trackIndex;\n cursor = this.readOnly ? \"pointer\" : \"grab\";\n } else if (\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\"\n ) {\n nextHover = target.clipId;\n nextHoverTrack = target.trackIndex;\n cursor = \"ew-resize\";\n } else if (target.kind === \"ruler\") {\n cursor = \"ew-resize\";\n } else if (target.kind === \"track-empty\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"crosshair\";\n } else if (target.kind === \"header\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"default\";\n } else if (target.kind === \"header-delete\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"pointer\";\n } else if (\n target.kind === \"scrollbar-thumb-v\" ||\n target.kind === \"scrollbar-track-v\"\n ) {\n onScrollbarV = true;\n cursor = \"default\";\n } else if (\n target.kind === \"scrollbar-thumb-h\" ||\n target.kind === \"scrollbar-track-h\"\n ) {\n onScrollbarH = true;\n cursor = \"default\";\n }\n const hoverChanged =\n onScrollbarV !== this.hoverScrollbarY ||\n onScrollbarH !== this.hoverScrollbarX;\n if (\n nextHover !== this.hoveredClipId ||\n nextHoverTrack !== this.hoveredTrackIndex ||\n cursor !== this.hoverCursor ||\n hoverChanged\n ) {\n this.hoveredClipId = nextHover;\n this.hoveredTrackIndex = nextHoverTrack;\n this.hoverCursor = cursor;\n this.hoverScrollbarY = onScrollbarV;\n this.hoverScrollbarX = onScrollbarH;\n this.scheduleRender();\n }\n return;\n }\n\n if (this.drag.kind === \"scrub\") {\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n return;\n }\n\n if (this.drag.kind === \"move\") {\n this.lastDragPointerX = x;\n this.lastDragPointerY = y;\n this.processMoveDrag(x, y);\n this.scheduleRender();\n this.maybeStartDragAutoScroll();\n return;\n }\n\n if (this.drag.kind === \"trim-left\" || this.drag.kind === \"trim-right\") {\n const dxPx = x - this.drag.pointerStartX;\n const dxMs = (dxPx / this.pxPerSec) * 1000;\n const found = findClip(this.project, this.drag.clipId);\n if (!found) return;\n const c = found.clip;\n if (this.drag.kind === \"trim-left\") {\n // Move start + in by the same delta; clip's right edge stays put.\n let nextStart = Math.max(0, this.drag.originalStart + dxMs);\n nextStart = this.applySnap(nextStart, this.drag.clipId);\n const delta = nextStart - this.drag.originalStart;\n const nextIn = Math.max(\n 0,\n Math.min(this.drag.originalIn + delta, this.drag.originalOut - 50),\n );\n const adjStart = this.drag.originalStart + (nextIn - this.drag.originalIn);\n c.in = nextIn;\n c.start = adjStart;\n } else {\n // trim-right — move out only.\n const nextOut = Math.max(\n this.drag.originalIn + 50,\n this.drag.originalOut + dxMs,\n );\n c.out = nextOut;\n }\n this.scheduleRender();\n return;\n }\n }\n\n /**\n * Update dragGhost + dropTargetTrackIndex for the in-flight move\n * drag, given the current viewport pointer position. Pulled out of\n * onPointerMove so the edge-autoscroll loop can re-run it on each\n * tick — autoscroll moves scrollTop under a stationary cursor, and\n * the ghost must follow the new row under that cursor.\n */\n private processMoveDrag(x: number, y: number): void {\n if (!this.drag || this.drag.kind !== \"move\") return;\n const drag = this.drag;\n const dxPx = x - drag.pointerStartX;\n const dxMs = (dxPx / this.pxPerSec) * 1000;\n let nextStart = Math.max(0, drag.originalStart + dxMs);\n nextStart = this.applySnap(nextStart, drag.clipId);\n\n const tiRaw = this.trackIndexAtY(y);\n const phantomIdx = this.project.tracks.length;\n const phantomScreenY =\n RULER_HEIGHT + phantomIdx * TRACK_HEIGHT - this.scrollTop;\n const onPhantom =\n y >= phantomScreenY && y < phantomScreenY + TRACK_HEIGHT;\n const intendedTrackIndex = onPhantom\n ? phantomIdx\n : tiRaw >= 0\n ? tiRaw\n : drag.trackIndex;\n\n let ghostTrackIndex = intendedTrackIndex;\n let overlap = false;\n if (onPhantom) {\n ghostTrackIndex = phantomIdx;\n overlap = true;\n } else if (this.opts.resolveDrop) {\n const r = this.opts.resolveDrop(drag.clipId, {\n start: nextStart,\n intendedTrackIndex,\n });\n ghostTrackIndex = r.trackIndex;\n overlap = r.wouldCreateNew;\n } else {\n const found = findClip(this.project, drag.clipId);\n const dur = found ? found.clip.out - found.clip.in : 0;\n const targetTrack = this.project.tracks[intendedTrackIndex];\n overlap = targetTrack\n ? wouldOverlap(targetTrack, drag.clipId, nextStart, nextStart + dur)\n : false;\n }\n\n this.dragGhost = {\n clipId: drag.clipId,\n ghostStart: nextStart,\n ghostTrackIndex,\n wouldOverlap: overlap,\n };\n this.dropTargetTrackIndex =\n ghostTrackIndex !== drag.trackIndex ? ghostTrackIndex : null;\n }\n\n /**\n * Px-per-frame scroll speed when the pointer is in a vertical edge\n * zone of the track region. Returns 0 outside the zone. Speed ramps\n * linearly from 0 at the zone's inner edge to ~16 px/frame at the\n * outer edge, so brushing the edge gives a gentle nudge and parking\n * deep at it gives a brisk auto-scroll.\n */\n private dragScrollSpeedY(): number {\n if (!this.drag || this.drag.kind !== \"move\") return 0;\n const y = this.lastDragPointerY;\n const top = RULER_HEIGHT;\n const bottom = this.viewportHeight - SCROLLBAR_THICKNESS;\n const zone = 36;\n const maxSpeed = 16;\n if (y >= top && y < top + zone) {\n // Top zone — scroll up (decrease scrollTop), but only if there's\n // somewhere to go (otherwise the loop would tick forever).\n if (this.scrollTop <= 0) return 0;\n const depth = (top + zone - y) / zone;\n return -Math.max(2, maxSpeed * depth);\n }\n if (y <= bottom && y > bottom - zone) {\n if (this.scrollTop >= this.maxScrollTop()) return 0;\n const depth = (y - (bottom - zone)) / zone;\n return Math.max(2, maxSpeed * depth);\n }\n return 0;\n }\n\n /**\n * Drive vertical auto-scroll while the user holds a clip near the\n * top/bottom edge of the track area. Self-stopping — exits the loop\n * once the pointer leaves the zone, the drag ends, or scroll bottoms\n * out at the clamp.\n */\n private maybeStartDragAutoScroll(): void {\n if (this.dragScrollRafPending) return;\n if (this.dragScrollSpeedY() === 0) return;\n this.dragScrollRafPending = true;\n requestAnimationFrame(() => {\n this.dragScrollRafPending = false;\n if (this.destroyed) return;\n const speed = this.dragScrollSpeedY();\n if (speed === 0 || !this.drag || this.drag.kind !== \"move\") return;\n this.scrollTop += speed;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n this.processMoveDrag(this.lastDragPointerX, this.lastDragPointerY);\n this.scheduleRender();\n this.maybeStartDragAutoScroll();\n });\n }\n\n private onPointerUp(_e: PointerEvent): void {\n if (this.scrollbarDrag) {\n const axis = this.scrollbarDrag.axis;\n this.scrollbarDrag = null;\n this.touchScrollbar(axis);\n return;\n }\n if (!this.drag) return;\n const drag = this.drag;\n const ghost = this.dragGhost;\n this.drag = null;\n this.dragGhost = null;\n this.dropTargetTrackIndex = null;\n this.snapX = null;\n\n if (drag.kind === \"move\") {\n if (ghost) {\n const isPhantom = ghost.ghostTrackIndex >= this.project.tracks.length;\n const finalTrackId = isPhantom\n ? undefined\n : ghost.ghostTrackIndex !== drag.trackIndex\n ? this.project.tracks[ghost.ghostTrackIndex]?.id\n : undefined;\n this.opts.onMoveClip?.(drag.clipId, {\n start: ghost.ghostStart,\n trackId: finalTrackId,\n // Phantom row drop is the user explicitly asking for a new\n // track — bypass the editor's smart routing in that case\n // (which would otherwise route back to the source track and\n // make the gesture a no-op).\n newTrack: isPhantom,\n });\n this.opts.onChange?.(this.getProject());\n }\n } else if (drag.kind === \"trim-left\" || drag.kind === \"trim-right\") {\n const found = findClip(this.project, drag.clipId);\n if (found) {\n this.opts.onResizeClip?.(drag.clipId, {\n in: found.clip.in,\n out: found.clip.out,\n start: found.clip.start,\n });\n this.opts.onChange?.(this.getProject());\n }\n }\n this.scheduleRender();\n }\n\n private attachWheel(): void {\n this.canvas.addEventListener(\n \"wheel\",\n (e) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const rect = this.canvas.getBoundingClientRect();\n const cursorX = e.clientX - rect.left;\n const anchorMs = xToMs(\n cursorX,\n this.pxPerSec,\n this.scrollLeft,\n this.showHeader,\n );\n const dy = Math.max(-50, Math.min(50, e.deltaY));\n const factor = Math.exp(-dy * WHEEL_ZOOM_RATE);\n const next = clampScale(this.pxPerSec * factor);\n if (Math.abs(next - this.pxPerSec) < 0.01) return;\n this.pxPerSec = next;\n this.hasAutoFitted = true;\n // Re-anchor: keep the time under the cursor visually pinned.\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n this.scrollLeft =\n (anchorMs / 1000) * this.pxPerSec - (cursorX - baseX);\n this.clampScroll();\n this.touchScrollbar(\"h\");\n this.opts.onScaleChange?.(this.pxPerSec);\n this.scheduleRender();\n return;\n }\n // Pan. Trackpad horizontal swipe (|deltaX|>|deltaY|) → X axis.\n // Otherwise vertical wheel/swipe → Y axis when tracks overflow,\n // falling through to X when there's no Y to scroll (preserves\n // the single-track UX where a mouse wheel pans horizontally).\n const horizDominant = Math.abs(e.deltaX) > Math.abs(e.deltaY);\n if (horizDominant) {\n if (e.deltaX === 0) return;\n e.preventDefault();\n this.scrollLeft += e.deltaX;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n this.scheduleRender();\n return;\n }\n if (e.deltaY === 0) return;\n e.preventDefault();\n if (this.maxScrollTop() > 0) {\n this.scrollTop += e.deltaY;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n } else {\n this.scrollLeft += e.deltaY;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n }\n this.scheduleRender();\n },\n { passive: false },\n );\n }\n\n private attachResize(): void {\n if (typeof ResizeObserver === \"undefined\") return;\n this.resizeObs = new ResizeObserver(() => {\n this.resizeCanvas();\n if (!this.hasAutoFitted && this.autoFitEnabled) {\n const fit = this.computeFitScale();\n if (fit != null) {\n this.pxPerSec = fit;\n this.opts.onScaleChange?.(fit);\n }\n }\n this.scheduleRender();\n });\n this.resizeObs.observe(this.root);\n }\n\n // ---- helpers --------------------------------------------------------\n\n private localCoords(e: PointerEvent): { x: number; y: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n private hitTarget(x: number, y: number): HitTarget {\n return hitTest(x, y, {\n project: this.project,\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n scrollTop: this.scrollTop,\n showHeader: this.showHeader,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n isDragging: this.drag?.kind === \"move\",\n });\n }\n\n private trackIndexAtY(y: number): number {\n return trackIndexAt(y, this.project.tracks.length, this.scrollTop);\n }\n\n private applySnap(ms: Ms, ignoreClipId: string | null): Ms {\n if (!this.snapEnabled) {\n this.snapX = null;\n return ms;\n }\n const tolMs = Math.max(20, (SNAP_PX / this.pxPerSec) * 1000);\n const targets = snapTargets(this.project, this.timeMs, ignoreClipId);\n let best = ms;\n let bestDist = tolMs;\n for (const t of targets) {\n const d = Math.abs(t - ms);\n if (d < bestDist) {\n bestDist = d;\n best = t;\n }\n }\n if (best !== ms) {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n this.snapX = baseX + (best / 1000) * this.pxPerSec - this.scrollLeft;\n } else {\n this.snapX = null;\n }\n return best;\n }\n}\n\n// Expose helpers from layout.ts via a deep import for consumers who\n// want the px math without instantiating Timeline.\nexport { TRACK_HEIGHT, RULER_HEIGHT, HEADER_WIDTH } from \"./layout.js\";\n","/**\n * Inline SVG icon set. Strings, not JSX, since core has no framework.\n * Each icon is 14×14 paint-area inside a 16×16 viewbox; `currentColor`\n * so toolbar buttons can recolor by `color`.\n */\n\nconst wrap = (path: string) =>\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">${path}</svg>`;\n\nexport const ICONS = {\n undo: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.66577 1.38721L2.85034 4.20264H9.64624C11.8471 4.20264 13.6313 5.98724 13.6316 8.18799C13.6315 10.3889 11.8472 12.1733 9.64624 12.1733H7.19116V11.1235H9.64624C11.2673 11.1235 12.5817 9.80904 12.5818 8.18799C12.5815 6.56714 11.2672 5.25342 9.64624 5.25342H2.85034L5.66577 8.06885L4.92358 8.81201L0.8396 4.72803L4.92358 0.644043L5.66577 1.38721Z\" fill=\"currentColor\"/></g>`,\n ),\n redo: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M8.55005 2.04655L11.3659 4.86239L4.56982 4.86239C2.36897 4.86251 0.584578 6.64687 0.584473 8.84774C0.584646 11.0485 2.36901 12.833 4.56982 12.8331L7.0245 12.8331L7.0245 11.7832H4.56982C2.94891 11.7831 1.63453 10.4686 1.63436 8.84774C1.63446 7.22677 2.94886 5.91297 4.56982 5.91284H11.3659L8.55005 8.72811L9.29289 9.47095L13.3768 5.38761L9.29289 1.30371L8.55005 2.04655Z\" fill=\"currentColor\"/></g>`,\n ),\n split: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.7168 12.7754H1.75V11.7246H4.68164V2.27539H1.75V1.22461H5.7168V12.7754ZM12.25 2.27539H9.31836V11.7246H12.25V12.7754H8.2832V1.22461H12.25V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n trimLeft: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M2.7998 12.7754H1.75V11.7246H2.7998V12.7754ZM4.25781 12.7754H3.20801V11.7246H4.25781V12.7754ZM5.7168 12.7754H4.66699V11.7246H5.7168V12.7754ZM12.25 2.27539H9.31836V11.7246H12.25V12.7754H8.2832V1.22461H12.25V2.27539ZM5.7168 11.0254H4.66699V9.97461H5.7168V11.0254ZM5.7168 9.27539H4.66699V8.22461H5.7168V9.27539ZM5.7168 7.52539H4.66699V6.47461H5.7168V7.52539ZM5.7168 5.77539H4.66699V4.72461H5.7168V5.77539ZM5.7168 4.02539H4.66699V2.97461H5.7168V4.02539ZM2.7998 2.27539H1.75V1.22461H2.7998V2.27539ZM4.25781 2.27539H3.20801V1.22461H4.25781V2.27539ZM5.7168 2.27539H4.66699V1.22461H5.7168V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n trimRight: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.7168 12.7754H1.75V11.7246H4.68164V2.27539H1.75V1.22461H5.7168V12.7754ZM9.33301 12.7754H8.2832V11.7246H9.33301V12.7754ZM10.792 12.7754H9.74219V11.7246H10.792V12.7754ZM12.25 12.7754H11.2002V11.7246H12.25V12.7754ZM9.33301 11.0254H8.2832V9.97461H9.33301V11.0254ZM9.33301 9.27539H8.2832V8.22461H9.33301V9.27539ZM9.33301 7.52539H8.2832V6.47461H9.33301V7.52539ZM9.33301 5.77539H8.2832V4.72461H9.33301V5.77539ZM9.33301 4.02539H8.2832V2.97461H9.33301V4.02539ZM9.33301 2.27539H8.2832V1.22461H9.33301V2.27539ZM10.792 2.27539H9.74219V1.22461H10.792V2.27539ZM12.25 2.27539H11.2002V1.22461H12.25V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n speed: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M7.00175 0.595229C7.32353 0.596316 7.58439 0.858333 7.58378 1.18019C7.583 1.50212 7.32071 1.76265 6.99882 1.76222C6.45361 1.76108 5.90722 1.8449 5.38065 2.01417C4.23393 2.38294 3.24874 3.13519 2.59061 4.14406C1.93249 5.15302 1.64169 6.35801 1.76639 7.55617C1.89121 8.75413 2.4235 9.87343 3.27518 10.7251C4.12694 11.5767 5.24613 12.1092 6.44413 12.2339C7.6422 12.3585 8.84735 12.0678 9.85624 11.4097C10.8649 10.7516 11.6173 9.76618 11.9861 8.61964C12.5967 6.72047 12.1219 5.04361 11.0633 3.76124L8.57792 6.24757C8.68682 6.4756 8.74974 6.72999 8.74979 6.99953C8.74979 7.9659 7.96612 8.74933 6.99979 8.74953C6.03345 8.74934 5.24979 7.96591 5.24979 6.99953C5.24997 6.03329 6.03356 5.24971 6.99979 5.24953C7.26941 5.24958 7.52464 5.31244 7.75272 5.4214L10.6707 2.50441L10.7137 2.46535C10.8174 2.38043 10.9485 2.33351 11.0838 2.33351C11.2382 2.33369 11.3867 2.39519 11.4959 2.50441C13.0855 4.09426 13.9307 6.38102 13.0965 8.97609C12.6458 10.3776 11.726 11.5819 10.493 12.3862C9.25989 13.1905 7.7873 13.5464 6.32303 13.3941C4.8588 13.2416 3.49099 12.5903 2.44999 11.5493C1.40904 10.5083 0.757676 9.14058 0.605261 7.67628C0.452904 6.21196 0.808759 4.73947 1.61307 3.50636C2.41742 2.27338 3.62178 1.35455 5.02323 0.903823C5.66695 0.696861 6.33524 0.593807 7.00175 0.595229Z\" fill=\"currentColor\"/></g>`,\n ),\n play: wrap(\n // Triangle bbox center at viewBox x=9.4 vs viewBox center 8 — the\n // raw path leans right. Optical centering: translate by half the\n // bbox offset (-0.7) so the centroid stays near 7.5 (slight left\n // of center, which the eye accepts as balanced for a right-pointing\n // triangle) while the bbox is no longer obviously off to one side.\n `<g transform=\"translate(-0.7 0)\"><path d=\"M4.66699 2.64248C4.66717 1.82358 5.59736 1.35167 6.25781 1.83584L13.5674 7.19619C14.1117 7.59579 14.1118 8.40897 13.5674 8.8085L6.25781 14.1688C5.59734 14.6528 4.6671 14.1811 4.66699 13.3622V2.64248Z\" fill=\"currentColor\"/></g>`,\n ),\n pause: wrap(\n `<path d=\"M4 3h2.5v10H4V3zm5.5 0H12v10H9.5V3z\" fill=\"currentColor\"/>`,\n ),\n fullscreen:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 3H5a2 2 0 00-2 2v3\"/><path d=\"M21 8V5a2 2 0 00-2-2h-3\"/><path d=\"M3 16v3a2 2 0 002 2h3\"/><path d=\"M16 21h3a2 2 0 002-2v-3\"/></svg>`,\n snap:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M8.275.783a5.07 5.07 0 0 1 4.929 4.927 5.07 5.07 0 0 1-1.311 3.542l-3.937 3.95a.526.526 0 0 1-.744 0l-2.334-2.334a.525.525 0 0 1 .001-.743l2.55-2.538a.5.5 0 0 1 .171-.17l.976-.97a.723.723 0 0 0-1.01-1.008L3.87 9.12a.526.526 0 0 1-.743 0L.795 6.784a.526.526 0 0 1 0-.742l3.937-3.95.022-.02a5.07 5.07 0 0 1 3.52-1.29m-2.281 9.715 1.588 1.589 1.884-1.889-1.583-1.583zm2.253-8.666a4.02 4.02 0 0 0-2.785 1.017l-.936.939 1.602 1.603.729-.726.052-.045a1.776 1.776 0 0 1 2.33.154 1.775 1.775 0 0 1 .155 2.332 1 1 0 0 1-.046.053l-.72.716 1.58 1.58.924-.929a4.019 4.019 0 0 0-2.885-6.694M1.909 6.413 3.5 8.005 5.384 6.13l-1.6-1.6z\"/></svg>`,\n zoomOut:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 20.2618 20.2564\" fill=\"none\" aria-hidden=\"true\"><path d=\"M9 0C13.9706 0 18 4.02944 18 9C18 11.1612 17.2374 13.1438 15.9678 14.6953L19.998 18.7197C20.3494 19.071 20.3498 19.6404 19.999 19.9922C19.6476 20.3441 19.0775 20.3446 18.7256 19.9932L14.6953 15.9678C13.1438 17.2374 11.1612 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0ZM9 1.7998C5.02355 1.7998 1.7998 5.02355 1.7998 9C1.7998 12.9765 5.02355 16.2002 9 16.2002C12.9765 16.2002 16.2002 12.9765 16.2002 9C16.2002 5.02355 12.9765 1.7998 9 1.7998ZM12.5996 8.09961C13.0969 8.09961 13.5 8.50273 13.5 9C13.5 9.49727 13.0969 9.90039 12.5996 9.90039H5.40039C4.90312 9.90039 4.5 9.49727 4.5 9C4.5 8.50273 4.90312 8.09961 5.40039 8.09961H12.5996Z\" fill=\"currentColor\"/></svg>`,\n zoomIn:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 20.2613 20.2565\" fill=\"none\" aria-hidden=\"true\"><path d=\"M9 0C13.9705 6.59711e-05 18 4.02948 18 9C18 11.1612 17.2374 13.1438 15.9678 14.6953L19.9971 18.7197C20.3489 19.0711 20.3494 19.6403 19.998 19.9922C19.6466 20.3441 19.0765 20.3446 18.7246 19.9932L14.6953 15.9678C13.1438 17.2374 11.1611 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0ZM9 1.7998C5.02355 1.7998 1.7998 5.02355 1.7998 9C1.7998 12.9765 5.02355 16.2002 9 16.2002C12.9764 16.2001 16.2002 12.9764 16.2002 9C16.2002 5.02359 12.9764 1.79987 9 1.7998ZM8.99512 4.50488C9.49233 4.50495 9.89551 4.90804 9.89551 5.40527V8.09961H12.5996C13.0968 8.09968 13.5 8.50277 13.5 9C13.5 9.49723 13.0968 9.90032 12.5996 9.90039H9.89551V12.6045C9.89551 13.1017 9.49233 13.5048 8.99512 13.5049C8.49785 13.5049 8.09473 13.1018 8.09473 12.6045V9.90039H5.40039C4.90312 9.90039 4.5 9.49727 4.5 9C4.5 8.50273 4.90312 8.09961 5.40039 8.09961H8.09473V5.40527C8.09473 4.908 8.49785 4.50488 8.99512 4.50488Z\" fill=\"currentColor\"/></svg>`,\n export:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n addTrack: wrap(\n `<g transform=\"translate(2 2)\"><rect x=\"0\" y=\"1.5\" width=\"12\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\"/><rect x=\"0\" y=\"8\" width=\"12\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.55\"/><circle cx=\"10\" cy=\"10\" r=\"3.4\" fill=\"currentColor\"/><rect x=\"9.4\" y=\"8.5\" width=\"1.2\" height=\"3\" rx=\"0.4\" fill=\"#fff\"/><rect x=\"8.5\" y=\"9.4\" width=\"3\" height=\"1.2\" rx=\"0.4\" fill=\"#fff\"/></g>`,\n ),\n trash: wrap(\n `<g transform=\"translate(1 1)\" fill=\"currentColor\"><path d=\"M5 1.25h4v.9H13v1.05H1V2.15h4v-.9zM2.4 4.1h9.2l-.65 8.9c-.04.55-.5.96-1.05.96H4.1c-.55 0-1.01-.41-1.05-.96L2.4 4.1zm2.3 1.7l.35 7.1h1l-.35-7.1h-1zm2.65 0v7.1h1V5.8h-1zm2.3 0l-.35 7.1h1l.35-7.1h-1z\"/></g>`,\n ),\n /** Counter-clockwise circular arrow — \"reset to initial layout\". */\n reset:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"1 4 1 10 7 10\"/><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"/></svg>`,\n};\n\nexport type IconName = keyof typeof ICONS;\n","import type { Locale } from \"../i18n.js\";\nimport { fmtClock } from \"./format.js\";\nimport { ICONS, type IconName } from \"./icons.js\";\n\nconst SCALE_MIN = 10;\nconst SCALE_MAX = 400;\n\nexport interface ToolbarCallbacks {\n onUndo: () => void;\n onRedo: () => void;\n onSplit: () => void;\n onTrimLeft: () => void;\n onTrimRight: () => void;\n onPlayToggle: () => void;\n onFullscreen: () => void;\n onReset: () => void;\n onSnapToggle: () => void;\n onScaleChange: (pxPerSec: number) => void;\n}\n\ninterface ToolbarState {\n playing: boolean;\n time: number;\n duration: number;\n canUndo: boolean;\n canRedo: boolean;\n canSplit: boolean;\n canTrim: boolean;\n snap: boolean;\n pxPerSec: number;\n}\n\n/**\n * Top toolbar — three groups laid out per the reference:\n * left: [undo] [redo] [split] [trim-left] [trim-right] [speed]\n * center: [time] ▶ [duration] [fullscreen]\n * right: [snap] [zoom-out] [zoom-slider] [zoom-in] [reset]\n *\n * Export is intentionally NOT built-in — every host has its own\n * pipeline (download, server pipeline, etc.). Drop a custom button\n * into `editor.toolbarRight` or call `editor.requestExport()` from\n * any host UI to fire the `export` event.\n */\nexport class Toolbar {\n private root: HTMLDivElement;\n private cb: ToolbarCallbacks;\n private locale: Locale;\n\n /**\n * Bookend slots reserved for host-supplied controls. The library\n * paints nothing into either — hosts (React/Vue wrappers or plain\n * JS) append their own buttons / dropdowns. `extrasLeft` sits at\n * the very start of the toolbar; `extrasRight` at the very end.\n * Empty by default and visually hidden (no separator) until they\n * actually contain children.\n */\n readonly extrasLeft: HTMLDivElement;\n readonly extrasRight: HTMLDivElement;\n\n private undoBtn!: HTMLButtonElement;\n private redoBtn!: HTMLButtonElement;\n private splitBtn!: HTMLButtonElement;\n private trimLeftBtn!: HTMLButtonElement;\n private trimRightBtn!: HTMLButtonElement;\n private playBtn!: HTMLButtonElement;\n private playIcon!: HTMLSpanElement;\n private timeLabel!: HTMLSpanElement;\n private durationLabel!: HTMLSpanElement;\n private fullscreenBtn!: HTMLButtonElement;\n private snapBtn!: HTMLButtonElement;\n private zoomOutBtn!: HTMLButtonElement;\n private zoomSlider!: HTMLInputElement;\n private zoomInBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private lastState: ToolbarState | null = null;\n\n constructor(host: HTMLElement, cb: ToolbarCallbacks, locale: Locale) {\n this.cb = cb;\n this.locale = locale;\n this.root = document.createElement(\"div\");\n this.root.className = \"aicut-toolbar\";\n this.root.setAttribute(\"data-testid\", \"aicut-toolbar\");\n\n this.extrasLeft = mkGroup(\"aicut-toolbar-extras aicut-toolbar-extras-left\");\n this.extrasRight = mkGroup(\"aicut-toolbar-extras aicut-toolbar-extras-right\");\n\n const left = mkGroup(\"aicut-toolbar-left\");\n this.undoBtn = mkIconButton(\"undo\", locale.undo, () => cb.onUndo(), \"aicut-undo\");\n this.redoBtn = mkIconButton(\"redo\", locale.redo, () => cb.onRedo(), \"aicut-redo\");\n this.splitBtn = mkIconButton(\"split\", locale.split, () => cb.onSplit(), \"aicut-split\");\n this.trimLeftBtn = mkIconButton(\"trimLeft\", locale.trimLeft, () => cb.onTrimLeft(), \"aicut-trim-left\");\n this.trimRightBtn = mkIconButton(\"trimRight\", locale.trimRight, () => cb.onTrimRight(), \"aicut-trim-right\");\n const speedBtn = mkIconButton(\"speed\", locale.speedComingSoon, () => undefined, \"aicut-speed\");\n speedBtn.disabled = true;\n left.append(this.undoBtn, this.redoBtn, this.splitBtn, this.trimLeftBtn, this.trimRightBtn, speedBtn);\n\n const center = mkGroup(\"aicut-toolbar-center\");\n this.timeLabel = mkSpan(\"aicut-time-current\", \"00:00\", \"aicut-time-current\");\n this.playBtn = document.createElement(\"button\");\n this.playBtn.type = \"button\";\n this.playBtn.className = \"aicut-play-btn\";\n this.playBtn.title = locale.playPause;\n this.playBtn.setAttribute(\"data-testid\", \"aicut-play\");\n this.playIcon = document.createElement(\"span\");\n this.playIcon.innerHTML = ICONS.play;\n this.playBtn.appendChild(this.playIcon);\n this.playBtn.addEventListener(\"click\", () => cb.onPlayToggle());\n this.durationLabel = mkSpan(\"aicut-time-total\", \"00:00\", \"aicut-time-total\");\n this.fullscreenBtn = mkIconButton(\"fullscreen\", locale.fullscreen, () => cb.onFullscreen(), \"aicut-fullscreen\");\n center.append(this.timeLabel, this.playBtn, this.durationLabel, this.fullscreenBtn);\n\n const right = mkGroup(\"aicut-toolbar-right\");\n this.snapBtn = mkIconButton(\"snap\", locale.snap, () => cb.onSnapToggle(), \"aicut-snap\");\n this.zoomOutBtn = mkIconButton(\"zoomOut\", locale.zoomOut, () => this.nudgeZoom(-1), \"aicut-zoom-out\");\n this.zoomSlider = document.createElement(\"input\");\n this.zoomSlider.type = \"range\";\n this.zoomSlider.min = \"0\";\n this.zoomSlider.max = \"100\";\n this.zoomSlider.className = \"aicut-zoom-slider\";\n this.zoomSlider.setAttribute(\"data-testid\", \"aicut-zoom-slider\");\n this.zoomSlider.addEventListener(\"input\", () => {\n const ratio = Number(this.zoomSlider.value) / 100;\n cb.onScaleChange(sliderToScale(ratio));\n });\n this.zoomInBtn = mkIconButton(\"zoomIn\", locale.zoomIn, () => this.nudgeZoom(1), \"aicut-zoom-in\");\n this.resetBtn = mkIconButton(\"reset\", locale.reset, () => cb.onReset(), \"aicut-reset\");\n right.append(this.snapBtn, this.zoomOutBtn, this.zoomSlider, this.zoomInBtn, this.resetBtn);\n\n this.root.append(this.extrasLeft, left, center, right, this.extrasRight);\n host.appendChild(this.root);\n }\n\n get element(): HTMLDivElement {\n return this.root;\n }\n\n /**\n * Idempotent render. Critically: only mutates DOM when a state\n * field actually changed. Without this, `playIcon.innerHTML = ICONS`\n * re-parsed the SVG every playback tick (~60Hz) — and replacing the\n * element between a user's mousedown and mouseup meant the browser\n * never fired `click` (the two events landed on different element\n * identities). That manifested as \"needs 3 clicks to pause\".\n *\n * Rule of thumb here: any `innerHTML =` / element rebuild MUST be\n * behind a \"did the input change\" guard. Plain `.disabled` /\n * `.textContent` writes are idempotent in browsers and safe to set\n * unconditionally, but we still diff them for cheap CPU.\n */\n render(state: ToolbarState): void {\n if (!this.lastState || this.lastState.time !== state.time) {\n this.timeLabel.textContent = fmtClock(state.time);\n }\n if (!this.lastState || this.lastState.duration !== state.duration) {\n this.durationLabel.textContent = fmtClock(state.duration);\n }\n if (!this.lastState || this.lastState.playing !== state.playing) {\n this.playIcon.innerHTML = state.playing ? ICONS.pause : ICONS.play;\n this.playBtn.setAttribute(\n \"data-state\",\n state.playing ? \"playing\" : \"paused\",\n );\n }\n if (!this.lastState || this.lastState.canUndo !== state.canUndo) {\n this.undoBtn.disabled = !state.canUndo;\n }\n if (!this.lastState || this.lastState.canRedo !== state.canRedo) {\n this.redoBtn.disabled = !state.canRedo;\n }\n if (!this.lastState || this.lastState.canSplit !== state.canSplit) {\n this.splitBtn.disabled = !state.canSplit;\n }\n if (!this.lastState || this.lastState.canTrim !== state.canTrim) {\n this.trimLeftBtn.disabled = !state.canTrim;\n this.trimRightBtn.disabled = !state.canTrim;\n }\n if (!this.lastState || this.lastState.snap !== state.snap) {\n this.snapBtn.setAttribute(\"aria-pressed\", state.snap ? \"true\" : \"false\");\n this.snapBtn.classList.toggle(\"aicut-toggle-on\", state.snap);\n this.snapBtn.title = state.snap\n ? this.locale.snapOnTitle\n : this.locale.snapOffTitle;\n }\n if (!this.lastState || this.lastState.pxPerSec !== state.pxPerSec) {\n const ratio = scaleToSlider(state.pxPerSec);\n const nextVal = String(Math.round(ratio * 100));\n if (this.zoomSlider.value !== nextVal) this.zoomSlider.value = nextVal;\n this.zoomSlider.style.setProperty(\n \"--aicut-zoom-fill\",\n `${Math.round(ratio * 100)}%`,\n );\n }\n this.lastState = { ...state };\n }\n\n destroy(): void {\n this.root.remove();\n }\n\n /**\n * Apply a new locale to all already-mounted controls. Re-uses the\n * same DOM elements (so event listeners and pointer-capture state\n * stay intact) — only writes `title` / `aria-label`. Snap toggle\n * title is then refreshed via the next render pass.\n */\n setLocale(locale: Locale): void {\n this.locale = locale;\n const applyTitle = (\n el: HTMLElement | undefined,\n title: string,\n ): void => {\n if (!el) return;\n el.title = title;\n el.setAttribute(\"aria-label\", title);\n };\n applyTitle(this.undoBtn, locale.undo);\n applyTitle(this.redoBtn, locale.redo);\n applyTitle(this.splitBtn, locale.split);\n applyTitle(this.trimLeftBtn, locale.trimLeft);\n applyTitle(this.trimRightBtn, locale.trimRight);\n applyTitle(this.playBtn, locale.playPause);\n applyTitle(this.fullscreenBtn, locale.fullscreen);\n applyTitle(this.snapBtn, locale.snap);\n applyTitle(this.zoomOutBtn, locale.zoomOut);\n applyTitle(this.zoomInBtn, locale.zoomIn);\n applyTitle(this.resetBtn, locale.reset);\n // Force snap title re-evaluation on next render.\n if (this.lastState) {\n this.snapBtn.title = this.lastState.snap\n ? locale.snapOnTitle\n : locale.snapOffTitle;\n }\n }\n\n private nudgeZoom(dir: -1 | 1): void {\n const cur = Number(this.zoomSlider.value);\n const next = Math.max(0, Math.min(100, cur + dir * 8));\n this.zoomSlider.value = String(next);\n this.cb.onScaleChange(sliderToScale(next / 100));\n }\n}\n\nfunction mkGroup(cls: string): HTMLDivElement {\n const d = document.createElement(\"div\");\n d.className = cls;\n return d;\n}\n\nfunction mkSpan(cls: string, text: string, testId?: string): HTMLSpanElement {\n const s = document.createElement(\"span\");\n s.className = cls;\n s.textContent = text;\n if (testId) s.setAttribute(\"data-testid\", testId);\n return s;\n}\n\nfunction mkIconButton(\n icon: IconName,\n title: string,\n onClick: () => void,\n testId?: string,\n): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = \"aicut-icon-btn\";\n b.title = title;\n b.setAttribute(\"aria-label\", title);\n b.innerHTML = ICONS[icon];\n if (testId) b.setAttribute(\"data-testid\", testId);\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\n/**\n * Slider ↔ scale mapping is exponential so the slider feels uniform\n * across a wide zoom range. Matches the figma reference (exp-based\n * zoom step). 0 → SCALE_MIN, 1 → SCALE_MAX.\n */\nfunction sliderToScale(ratio: number): number {\n const lo = Math.log(SCALE_MIN);\n const hi = Math.log(SCALE_MAX);\n return Math.exp(lo + (hi - lo) * ratio);\n}\n\nfunction scaleToSlider(scale: number): number {\n const lo = Math.log(SCALE_MIN);\n const hi = Math.log(SCALE_MAX);\n return (Math.log(Math.max(SCALE_MIN, Math.min(SCALE_MAX, scale))) - lo) /\n (hi - lo);\n}\n","import { clipDuration, findClipContaining, findTrackOfClip } from \"../model.js\";\nimport type { Editor } from \"../editor.js\";\nimport { Timeline } from \"../timeline/index.js\";\nimport type { Clip, Ms } from \"../types.js\";\nimport type { Locale } from \"../i18n.js\";\nimport { Toolbar, type ToolbarCallbacks } from \"./toolbar.js\";\n\n/**\n * Callbacks the editor wires into the UI. The toolbar contributes the\n * top-bar buttons; the timeline contributes click/drag intents that\n * the editor turns into model mutations (with overlap → new-track\n * routing centralised in `Editor.moveClip`).\n */\nexport interface UICallbacks extends ToolbarCallbacks {\n onSeek: (timeMs: Ms) => void;\n onSelectClip: (clipId: string | null) => void;\n onDeleteClip: (clipId: string) => void;\n onMoveClip: (\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ) => void;\n onResizeClip: (\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ) => void;\n}\n\n/**\n * Composes the editor: preview host on top, toolbar middle, canvas\n * Timeline at the bottom. Single source of repaint via `render()`;\n * frequent `onTimeTick()` is the playback-fast path that only nudges\n * the playhead-related surfaces.\n */\nexport class EditorUI {\n private root: HTMLElement;\n private editor: Editor;\n private preview: HTMLDivElement;\n private fullscreenExitBtn: HTMLButtonElement;\n private toolbar: Toolbar;\n private timelineHost: HTMLDivElement;\n private timeline: Timeline;\n private fullscreen = false;\n private onDocKeydown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(root: HTMLElement, editor: Editor, cb: UICallbacks) {\n this.root = root;\n this.editor = editor;\n const locale = editor.getLocale();\n\n root.classList.add(\"aicut-root\");\n root.innerHTML = \"\";\n\n this.preview = document.createElement(\"div\");\n this.preview.className = \"aicut-preview-host\";\n this.preview.setAttribute(\"data-testid\", \"aicut-preview\");\n root.appendChild(this.preview);\n\n this.fullscreenExitBtn = document.createElement(\"button\");\n this.fullscreenExitBtn.type = \"button\";\n this.fullscreenExitBtn.className = \"aicut-fullscreen-exit\";\n this.fullscreenExitBtn.title = locale.exitFullscreenTitle;\n this.fullscreenExitBtn.setAttribute(\"data-testid\", \"aicut-fullscreen-exit\");\n this.fullscreenExitBtn.textContent = locale.exitFullscreen;\n this.fullscreenExitBtn.addEventListener(\"click\", () =>\n this.setFullscreen(false),\n );\n this.preview.appendChild(this.fullscreenExitBtn);\n\n this.toolbar = new Toolbar(root, cb, locale);\n\n this.timelineHost = document.createElement(\"div\");\n this.timelineHost.className = \"aicut-timeline\";\n this.timelineHost.setAttribute(\"data-testid\", \"aicut-timeline\");\n root.appendChild(this.timelineHost);\n\n this.timeline = Timeline.create({\n container: this.timelineHost,\n project: editor.getProject(),\n pxPerSec: editor.getScale(),\n time: editor.getTime(),\n selectedClipId: editor.getSelection(),\n snap: editor.getSnap(),\n autoFit: true,\n locale,\n onSeek: cb.onSeek,\n onSelectClip: cb.onSelectClip,\n onMoveClip: cb.onMoveClip,\n onResizeClip: cb.onResizeClip,\n onScaleChange: cb.onScaleChange,\n onDeleteTrack: (trackId) => editor.removeTrack(trackId),\n // Mirror the editor's smart routing into the drag preview so\n // the ghost lands on the same row the commit will pick.\n resolveDrop: (clipId, intent) => {\n const proj = editor.getProject();\n const intendedTrack = proj.tracks[intent.intendedTrackIndex];\n const pred = editor.previewMoveTarget(\n clipId,\n intent.start,\n intendedTrack?.id,\n );\n if (!pred) {\n return {\n trackIndex: intent.intendedTrackIndex,\n wouldCreateNew: false,\n };\n }\n return {\n trackIndex: pred.trackIndex,\n wouldCreateNew: pred.wouldCreateNew,\n };\n },\n });\n\n this.attachKeyboard(cb);\n }\n\n // ---- fullscreen -----------------------------------------------------\n\n isFullscreen(): boolean {\n return this.fullscreen;\n }\n\n toggleFullscreen(): void {\n this.setFullscreen(!this.fullscreen);\n }\n\n setFullscreen(on: boolean): void {\n if (on === this.fullscreen) return;\n this.fullscreen = on;\n this.root.classList.toggle(\"aicut-fullscreen\", on);\n if (on) {\n this.onDocKeydown = (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.setFullscreen(false);\n }\n };\n document.addEventListener(\"keydown\", this.onDocKeydown);\n } else if (this.onDocKeydown) {\n document.removeEventListener(\"keydown\", this.onDocKeydown);\n this.onDocKeydown = null;\n }\n }\n\n get previewHost(): HTMLElement {\n return this.preview;\n }\n\n /** Host-extensible slot at the very left of the top toolbar. */\n get toolbarLeft(): HTMLElement {\n return this.toolbar.extrasLeft;\n }\n\n /** Host-extensible slot at the very right of the top toolbar. */\n get toolbarRight(): HTMLElement {\n return this.toolbar.extrasRight;\n }\n\n /** Public for e2e — read-back of timeline canvas state (no DOM clips). */\n getTimelineDebug(): ReturnType<Timeline[\"getDebugInfo\"]> {\n return this.timeline.getDebugInfo();\n }\n\n /** Full sync from editor state. Idempotent. */\n render(): void {\n const project = this.editor.getProject();\n const time = this.editor.getTime();\n const duration = this.editor.getDuration();\n const selectedClipId = this.editor.getSelection();\n const pxPerSec = this.editor.getScale();\n const snap = this.editor.getSnap();\n\n this.toolbar.render({\n playing: this.editor.isPlaying(),\n time,\n duration,\n canUndo: this.editor.canUndo(),\n canRedo: this.editor.canRedo(),\n canSplit: this.canSplitAt(time),\n canTrim: this.canTrimAt(time, selectedClipId),\n snap,\n pxPerSec,\n });\n\n this.timeline.setProject(project);\n this.timeline.setTime(time);\n this.timeline.setScale(pxPerSec);\n this.timeline.setSelection(selectedClipId);\n this.timeline.setSnap(snap);\n }\n\n /** Playback-fast path: nudge playhead + toolbar time label only. */\n onTimeTick(timeMs: Ms): void {\n this.timeline.setTime(timeMs);\n this.toolbar.render({\n playing: this.editor.isPlaying(),\n time: timeMs,\n duration: this.editor.getDuration(),\n canUndo: this.editor.canUndo(),\n canRedo: this.editor.canRedo(),\n canSplit: this.canSplitAt(timeMs),\n canTrim: this.canTrimAt(timeMs, this.editor.getSelection()),\n snap: this.editor.getSnap(),\n pxPerSec: this.editor.getScale(),\n });\n }\n\n /** Explicit re-fit — Editor calls this when a brand-new project replaces the current one. */\n resetAutoFit(): void {\n this.timeline.refit();\n }\n\n setLocale(locale: Locale): void {\n this.toolbar.setLocale(locale);\n this.fullscreenExitBtn.title = locale.exitFullscreenTitle;\n this.fullscreenExitBtn.textContent = locale.exitFullscreen;\n this.timeline.setLocale(locale);\n this.render();\n }\n\n destroy(): void {\n if (this.onDocKeydown) {\n document.removeEventListener(\"keydown\", this.onDocKeydown);\n this.onDocKeydown = null;\n }\n this.toolbar.destroy();\n this.timeline.destroy();\n this.root.innerHTML = \"\";\n this.root.classList.remove(\"aicut-root\", \"aicut-fullscreen\");\n }\n\n // ---- helpers --------------------------------------------------------\n\n private canSplitAt(timeMs: Ms): boolean {\n const project = this.editor.getProject();\n for (const t of project.tracks) {\n for (const c of t.clips) {\n if (timeMs > c.start && timeMs < c.start + clipDuration(c)) return true;\n }\n }\n return false;\n }\n\n private canTrimAt(timeMs: Ms, selectedClipId: string | null): boolean {\n const project = this.editor.getProject();\n if (selectedClipId) {\n const trk = findTrackOfClip(project, selectedClipId);\n const cl = trk?.clips.find((c: Clip) => c.id === selectedClipId);\n if (cl && timeMs > cl.start && timeMs < cl.start + clipDuration(cl)) {\n return true;\n }\n }\n for (const t of project.tracks) {\n const cl = findClipContaining(t, timeMs);\n if (cl) return true;\n }\n return false;\n }\n\n private attachKeyboard(cb: UICallbacks): void {\n this.root.tabIndex = 0;\n this.root.addEventListener(\"keydown\", (e) => {\n const target = e.target as HTMLElement | null;\n if (target && [\"INPUT\", \"TEXTAREA\"].includes(target.tagName)) return;\n if (e.code === \"Space\") {\n e.preventDefault();\n cb.onPlayToggle();\n } else if (e.code === \"KeyK\") {\n e.preventDefault();\n cb.onSplit();\n } else if (e.code === \"KeyQ\") {\n e.preventDefault();\n cb.onTrimLeft();\n } else if (e.code === \"KeyW\") {\n e.preventDefault();\n cb.onTrimRight();\n } else if ((e.metaKey || e.ctrlKey) && e.code === \"KeyZ\") {\n e.preventDefault();\n if (e.shiftKey) cb.onRedo();\n else cb.onUndo();\n } else if (e.code === \"Delete\" || e.code === \"Backspace\") {\n const sel = this.editor.getSelection();\n if (sel) {\n e.preventDefault();\n cb.onDeleteClip(sel);\n }\n }\n });\n }\n}\n","import { EventBus } from \"./events.js\";\nimport { HistoryStack } from \"./history.js\";\nimport { createId } from \"./ids.js\";\nimport {\n clipDuration,\n clipEnd,\n createEmptyProject,\n findClipContaining,\n findTrackOfClip,\n normalizeProject,\n projectDuration,\n splitClipAt,\n trackEnd,\n} from \"./model.js\";\nimport { wouldOverlap } from \"./timeline/layout.js\";\nimport { PlaybackEngine } from \"./playback.js\";\nimport { applyTheme } from \"./theme.js\";\nimport { type Locale, mergeLocale } from \"./i18n.js\";\nimport type {\n Clip,\n MediaSource,\n Ms,\n Project,\n Theme,\n Track,\n} from \"./types.js\";\nimport { EditorUI } from \"./ui/index.js\";\n\nexport interface EditorOptions {\n /** Host element to mount the editor into. Will be wiped on init. */\n container: HTMLElement;\n /** Initial project state. Falls back to an empty single-track project. */\n project?: Project;\n /** CSS variable overrides. */\n theme?: Theme;\n /** Initial playhead position (ms). */\n initialTime?: Ms;\n /** Initial timeline zoom (pixels per second). Defaults to 80. */\n initialScale?: number;\n /** Initial snap toggle. Defaults to true. */\n initialSnap?: boolean;\n /**\n * UI string overrides. Falls back to English (`localeEn`) for any\n * keys not provided. Use `localeZh` as the value for full Chinese.\n * Call `editor.setLocale(...)` to switch at runtime.\n */\n locale?: Partial<Locale>;\n}\n\nexport interface EditorEventMap {\n /** Emitted whenever the project mutates. */\n change: { project: Project };\n /** Playhead position update — driven by the playback tick loop. */\n time: { timeMs: Ms };\n play: void;\n pause: void;\n /** A source's metadata finished loading (duration etc). */\n ready: { sourceId: string | null };\n /** User clicked the Export button. Host decides what to do with the JSON. */\n export: { project: Project };\n error: { error: Error };\n /** Currently selected clip id, or null. */\n selectionChange: { clipId: string | null };\n /** Zoom (px/sec) changed. */\n scaleChange: { pxPerSec: number };\n /** Snap toggle changed. */\n snapChange: { snap: boolean };\n /** Undo/redo stack states changed (button enablement). */\n historyChange: { canUndo: boolean; canRedo: boolean };\n}\n\nexport type EditorEventName = keyof EditorEventMap;\n\nexport interface EditorApi {\n // playback\n play(): void;\n pause(): void;\n togglePlay(): void;\n seek(timeMs: Ms): void;\n getTime(): Ms;\n getDuration(): Ms;\n isPlaying(): boolean;\n enterFullscreen(): Promise<void>;\n exitFullscreen(): Promise<void>;\n isFullscreen(): boolean;\n\n // editing\n split(timeMs?: Ms): string[] | null;\n /** Alias of split, kept for back-compat. */\n cut(timeMs?: Ms): string[] | null;\n /** Trim the selected clip's left edge to the given time (or playhead). */\n trimLeft(timeMs?: Ms): boolean;\n /** Trim the selected clip's right edge to the given time (or playhead). */\n trimRight(timeMs?: Ms): boolean;\n removeClip(clipId: string): boolean;\n setClipSpeed(clipId: string, speed: number): boolean;\n previewMoveTarget(\n clipId: string,\n start: Ms,\n intendedTrackId?: string,\n ): { trackIndex: number; trackId: string; wouldCreateNew: boolean } | null;\n\n // tracks\n addTrack(kind: Track[\"kind\"]): Track;\n removeTrack(trackId: string): boolean;\n moveClip(\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ): boolean;\n resizeClip(clipId: string, edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>): boolean;\n\n // sources & state\n addSource(source: MediaSource, opts?: { appendClip?: boolean }): MediaSource;\n setProject(project: Project): void;\n getProject(): Project;\n /** Replace the project with a brand-new empty one. */\n reset(): void;\n setTheme(theme: Theme): void;\n /**\n * Swap the UI locale at runtime. Partial overrides merge with the\n * English default. Triggers a re-render so the toolbar tooltips\n * and timeline canvas labels pick up the new strings immediately.\n */\n setLocale(locale: Partial<Locale>): void;\n /**\n * Fire the `export` event with the current project JSON. Hosts call\n * this from their own export button (built into their toolbarRight\n * slot, a keyboard shortcut, a menu item, etc.) to surface project\n * data to whatever pipeline they own. The library never invokes\n * this on its own — it has no UI for export.\n */\n requestExport(): void;\n\n // viewport\n getScale(): number;\n setScale(pxPerSec: number): void;\n getSnap(): boolean;\n setSnap(snap: boolean): void;\n\n // selection\n getSelection(): string | null;\n setSelection(clipId: string | null): void;\n\n // history\n canUndo(): boolean;\n canRedo(): boolean;\n undo(): boolean;\n redo(): boolean;\n\n /**\n * Bookend slot at the very left of the top toolbar — host appends\n * its own controls (e.g. an aspect-ratio dropdown). Empty by default\n * and renders no separator until populated.\n */\n readonly toolbarLeft: HTMLElement;\n /** Right-side bookend slot — conventionally export / save / share. */\n readonly toolbarRight: HTMLElement;\n\n // events\n on<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): () => void;\n off<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): void;\n destroy(): void;\n}\n\nconst DEFAULT_PX_PER_SEC = 80;\nconst MIN_PX_PER_SEC = 10;\nconst MAX_PX_PER_SEC = 400;\n/** Snap distance in pixels at the current zoom. Converted to ms per call. */\nconst SNAP_PX = 8;\n\n/**\n * Top-level editor instance — the only stateful object a host app\n * interacts with. Owns the project, the playback engine, the vanilla\n * DOM UI, plus viewport (zoom/snap), selection, and history state.\n *\n * Framework wrappers (`@aicut/react`, `@aicut/vue`) should mount a\n * container, instantiate this once, mirror prop changes (`theme`)\n * into it, and forward events as framework-native callbacks.\n */\nexport class Editor implements EditorApi {\n private container: HTMLElement;\n private project: Project;\n private engine: PlaybackEngine;\n private ui: EditorUI;\n private bus = new EventBus<EditorEventMap>();\n private history = new HistoryStack();\n\n private selectedClipId: string | null = null;\n private pxPerSec: number;\n private snap: boolean;\n private locale: Locale;\n private destroyed = false;\n\n constructor(opts: EditorOptions) {\n this.container = opts.container;\n this.project = normalizeProject(opts.project ?? createEmptyProject());\n this.pxPerSec = clampScale(opts.initialScale ?? DEFAULT_PX_PER_SEC);\n this.snap = opts.initialSnap !== false;\n this.locale = mergeLocale(opts.locale);\n\n applyTheme(this.container, opts.theme);\n\n this.ui = new EditorUI(this.container, this, {\n onPlayToggle: () => this.togglePlay(),\n onSplit: () => this.split(),\n onTrimLeft: () => this.trimLeft(),\n onTrimRight: () => this.trimRight(),\n onUndo: () => this.undo(),\n onRedo: () => this.redo(),\n onReset: () => this.reset(),\n onFullscreen: () => this.ui.toggleFullscreen(),\n onSnapToggle: () => this.setSnap(!this.snap),\n onScaleChange: (s) => this.setScale(s),\n onSeek: (t) => this.seek(t),\n onSelectClip: (id) => this.setSelection(id),\n onDeleteClip: (id) => this.removeClip(id),\n onMoveClip: (id, opts) => this.moveClip(id, opts),\n onResizeClip: (id, edits) => this.resizeClip(id, edits),\n });\n\n this.engine = new PlaybackEngine(this.ui.previewHost, this.project);\n this.engine.onTimeUpdate = (ms) => {\n this.bus.emit(\"time\", { timeMs: ms });\n this.ui.onTimeTick(ms);\n };\n this.engine.onEnded = () => this.bus.emit(\"pause\", undefined);\n this.engine.onError = (err) => this.bus.emit(\"error\", { error: err });\n this.engine.onReady = () => this.bus.emit(\"ready\", { sourceId: null });\n this.engine.onSourceMetadata = (sourceId, durMs) =>\n this.handleSourceMetadata(sourceId, durMs);\n\n if (opts.initialTime) this.engine.seek(opts.initialTime);\n this.ui.render();\n }\n\n static create(opts: EditorOptions): Editor {\n return new Editor(opts);\n }\n\n get toolbarLeft(): HTMLElement {\n return this.ui.toolbarLeft;\n }\n\n get toolbarRight(): HTMLElement {\n return this.ui.toolbarRight;\n }\n\n // ---- playback -------------------------------------------------------\n\n play(): void {\n this.engine.play();\n this.bus.emit(\"play\", undefined);\n this.ui.render();\n }\n\n pause(): void {\n this.engine.pause();\n this.bus.emit(\"pause\", undefined);\n this.ui.render();\n }\n\n togglePlay(): void {\n if (this.engine.isPlaying()) this.pause();\n else this.play();\n }\n\n seek(timeMs: Ms): void {\n this.engine.seek(timeMs);\n this.ui.render();\n }\n\n getTime(): Ms {\n // Engine may not exist yet during UI construction (we build UI\n // first to get its previewHost). Treat as 0 in that case.\n return this.engine?.getTime() ?? 0;\n }\n\n getDuration(): Ms {\n return projectDuration(this.project);\n }\n\n isPlaying(): boolean {\n return this.engine?.isPlaying() ?? false;\n }\n\n /**\n * In-tab \"fullscreen\" — covers the browser viewport via fixed\n * positioning, NOT the OS Fullscreen API. This is what the reference\n * UI calls \"全屏预览\": the user stays in their tab, no browser\n * permission prompt, ESC exits. Browser fullscreen would also work\n * but is heavier UX and gets blocked in iframes.\n */\n async enterFullscreen(): Promise<void> {\n this.ui.setFullscreen(true);\n }\n\n async exitFullscreen(): Promise<void> {\n this.ui.setFullscreen(false);\n }\n\n isFullscreen(): boolean {\n return this.ui.isFullscreen();\n }\n\n // ---- editing --------------------------------------------------------\n\n /**\n * Split the clip at `timeMs` (or playhead). Returns the two new clip ids\n * or null if there's no clip to split at that time.\n */\n split(timeMs?: Ms): string[] | null {\n const t = timeMs ?? this.engine.getTime();\n // Pick the track of the currently selected clip, else the first\n // video track that has a clip at this time.\n let target: { track: Track; clip: Clip } | null = null;\n if (this.selectedClipId) {\n const trk = findTrackOfClip(this.project, this.selectedClipId);\n const cl = trk?.clips.find((c) => c.id === this.selectedClipId) ?? null;\n if (trk && cl && t > cl.start && t < clipEnd(cl)) target = { track: trk, clip: cl };\n }\n if (!target) {\n for (const trk of this.project.tracks) {\n const cl = findClipContaining(trk, t);\n if (cl && t > cl.start && t < clipEnd(cl)) {\n target = { track: trk, clip: cl };\n break;\n }\n }\n }\n if (!target) return null;\n const split = splitClipAt(target.clip, t - target.clip.start);\n if (!split) return null;\n this.pushHistory();\n const [left, right] = split;\n target.track.clips = target.track.clips\n .filter((c) => c.id !== target!.clip.id)\n .concat(left, right)\n .sort((a, b) => a.start - b.start);\n this.afterMutation();\n return [left.id, right.id];\n }\n\n cut(timeMs?: Ms): string[] | null {\n return this.split(timeMs);\n }\n\n trimLeft(timeMs?: Ms): boolean {\n const t = timeMs ?? this.engine.getTime();\n const target = this.resolveTrimTarget(t);\n if (!target) return false;\n const { clip } = target;\n const delta = t - clip.start;\n if (delta <= 0 || delta >= clipDuration(clip)) return false;\n this.pushHistory();\n const oldStart = clip.start;\n clip.in += delta;\n clip.start += delta;\n\n // Ripple-close the gap [oldStart, oldStart + delta] when it isn't\n // covered by any clip on any other track. The user's mental model:\n // \"trim away the lead-in and tighten the timeline\" — but only if\n // we're not stranding material on a parallel track that was lining\n // up with the trimmed region.\n const gapStart = oldStart;\n const gapEnd = clip.start;\n let covered = false;\n outer: for (const trk of this.project.tracks) {\n for (const c of trk.clips) {\n if (c.id === clip.id) continue;\n const cEnd = c.start + clipDuration(c);\n if (c.start < gapEnd && cEnd > gapStart) {\n covered = true;\n break outer;\n }\n }\n }\n if (!covered) {\n clip.start = gapStart;\n for (const trk of this.project.tracks) {\n for (const c of trk.clips) {\n if (c.id === clip.id) continue;\n if (c.start >= gapEnd) c.start -= delta;\n }\n trk.clips.sort((a, b) => a.start - b.start);\n }\n }\n\n this.afterMutation();\n return true;\n }\n\n trimRight(timeMs?: Ms): boolean {\n const t = timeMs ?? this.engine.getTime();\n const target = this.resolveTrimTarget(t);\n if (!target) return false;\n const { clip } = target;\n const delta = clipEnd(clip) - t;\n if (delta <= 0 || delta >= clipDuration(clip)) return false;\n this.pushHistory();\n clip.out -= delta;\n this.afterMutation();\n return true;\n }\n\n removeClip(clipId: string): boolean {\n let removed = false;\n const before = JSON.stringify(this.project);\n for (const t of this.project.tracks) {\n const len = t.clips.length;\n t.clips = t.clips.filter((c) => c.id !== clipId);\n if (t.clips.length !== len) removed = true;\n }\n if (!removed) return false;\n // Restore previous state in `history` keyed off the pre-mutation\n // snapshot for accurate undo.\n this.history.push(JSON.parse(before) as Project);\n if (this.selectedClipId === clipId) {\n this.selectedClipId = null;\n this.bus.emit(\"selectionChange\", { clipId: null });\n }\n this.afterMutation();\n return true;\n }\n\n setClipSpeed(clipId: string, speed: number): boolean {\n if (!Number.isFinite(speed) || speed <= 0) return false;\n const trk = findTrackOfClip(this.project, clipId);\n const cl = trk?.clips.find((c) => c.id === clipId);\n if (!trk || !cl) return false;\n this.pushHistory();\n cl.speed = speed === 1 ? undefined : speed;\n this.afterMutation();\n return true;\n }\n\n // ---- tracks ---------------------------------------------------------\n\n addTrack(kind: Track[\"kind\"]): Track {\n this.pushHistory();\n const t: Track = { id: createId(\"track\"), kind, clips: [] };\n this.project.tracks.push(t);\n this.afterMutation();\n return t;\n }\n\n removeTrack(trackId: string): boolean {\n const idx = this.project.tracks.findIndex((t) => t.id === trackId);\n if (idx < 0) return false;\n this.pushHistory();\n this.project.tracks.splice(idx, 1);\n this.afterMutation();\n return true;\n }\n\n /**\n * Pure prediction of where a `moveClip(...)` would land — same smart\n * routing as the real move (intended → source → other → new track),\n * just no mutation, no history. Lets the Timeline preview the\n * ACTUAL outcome of a drop so the ghost stops lying about new\n * tracks that won't get created.\n */\n previewMoveTarget(\n clipId: string,\n start: Ms,\n intendedTrackId?: string,\n ): { trackIndex: number; trackId: string; wouldCreateNew: boolean } | null {\n const fromTrack = findTrackOfClip(this.project, clipId);\n const clip = fromTrack?.clips.find((c) => c.id === clipId);\n if (!fromTrack || !clip) return null;\n const nextStart = Math.max(0, start);\n const nextEnd = nextStart + clipDuration(clip);\n const intended = intendedTrackId\n ? this.project.tracks.find((t) => t.id === intendedTrackId)\n : fromTrack;\n const candidates: Track[] = [];\n const seen = new Set<string>();\n const push = (t: Track | undefined) => {\n if (!t || seen.has(t.id)) return;\n seen.add(t.id);\n candidates.push(t);\n };\n push(intended);\n push(fromTrack);\n for (const t of this.project.tracks) {\n if (t.kind === fromTrack.kind) push(t);\n }\n for (const c of candidates) {\n if (!wouldOverlap(c, clipId, nextStart, nextEnd)) {\n const idx = this.project.tracks.indexOf(c);\n return { trackIndex: idx, trackId: c.id, wouldCreateNew: false };\n }\n }\n // No fit → preview a brand-new track appended at the end.\n return {\n trackIndex: this.project.tracks.length,\n trackId: \"\",\n wouldCreateNew: true,\n };\n }\n\n moveClip(\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ): boolean {\n const fromTrack = findTrackOfClip(this.project, clipId);\n const clip = fromTrack?.clips.find((c) => c.id === clipId);\n if (!fromTrack || !clip) return false;\n const nextStart = Math.max(0, opts.start ?? clip.start);\n const nextEnd = nextStart + clipDuration(clip);\n\n // Explicit \"new track\" intent from the UI's phantom-row drop —\n // bypass smart routing entirely, append a fresh track, move there.\n if (opts.newTrack) {\n this.pushHistory();\n const created = this.appendTrack({ kind: fromTrack.kind });\n clip.start = nextStart;\n fromTrack.clips = fromTrack.clips.filter((c) => c.id !== clipId);\n created.clips.push(clip);\n if (\n fromTrack.clips.length === 0 &&\n this.project.tracks.filter((t) => t.kind === fromTrack.kind).length > 1\n ) {\n this.project.tracks = this.project.tracks.filter(\n (t) => t.id !== fromTrack.id,\n );\n }\n this.afterMutation();\n return true;\n }\n\n const intended = opts.trackId\n ? this.project.tracks.find((t) => t.id === opts.trackId)\n : fromTrack;\n if (!intended) return false;\n\n this.pushHistory();\n\n // Smart routing — prefer in priority:\n // 1. intended track (user's hover target)\n // 2. the source track (because vacating it for a brand-new track\n // would be wasteful when there's room on the original row)\n // 3. any other existing track of the same kind\n // 4. as a last resort, a freshly-appended track\n //\n // `wouldOverlap` excludes the dragged clip itself, so the source\n // track always has room for it back where it started (the user\n // can effectively cancel a cross-track drag by hovering somewhere\n // crowded — we drop back onto source).\n const candidates: Track[] = [];\n const seen = new Set<string>();\n const push = (t: Track | undefined) => {\n if (!t || seen.has(t.id)) return;\n seen.add(t.id);\n candidates.push(t);\n };\n push(intended);\n push(fromTrack);\n for (const t of this.project.tracks) {\n if (t.kind === fromTrack.kind) push(t);\n }\n\n let targetTrack: Track | null = null;\n for (const c of candidates) {\n if (!wouldOverlap(c, clipId, nextStart, nextEnd)) {\n targetTrack = c;\n break;\n }\n }\n if (!targetTrack) {\n targetTrack = this.appendTrack({ kind: fromTrack.kind });\n }\n\n // Apply the move.\n clip.start = nextStart;\n if (targetTrack !== fromTrack) {\n fromTrack.clips = fromTrack.clips.filter((c) => c.id !== clipId);\n targetTrack.clips.push(clip);\n }\n targetTrack.clips.sort((a, b) => a.start - b.start);\n\n // Auto-prune: if the source track is now empty AND it isn't the\n // only track of its kind, drop it. Keeps the UI compact when the\n // user is shuffling clips around — without this the track count\n // monotonically grows.\n if (\n fromTrack !== targetTrack &&\n fromTrack.clips.length === 0 &&\n this.project.tracks.filter((t) => t.kind === fromTrack.kind).length > 1\n ) {\n this.project.tracks = this.project.tracks.filter(\n (t) => t.id !== fromTrack.id,\n );\n }\n\n this.afterMutation();\n return true;\n }\n\n resizeClip(\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ): boolean {\n const trk = findTrackOfClip(this.project, clipId);\n const cl = trk?.clips.find((c) => c.id === clipId);\n if (!trk || !cl) return false;\n const next: Clip = { ...cl, ...edits };\n if (next.out <= next.in) return false;\n if (next.start < 0) return false;\n this.pushHistory();\n Object.assign(cl, next);\n trk.clips.sort((a, b) => a.start - b.start);\n this.afterMutation();\n return true;\n }\n\n addSource(\n source: MediaSource,\n opts: { appendClip?: boolean } = {},\n ): MediaSource {\n const src: MediaSource = { ...source, id: source.id || createId(\"src\") };\n this.pushHistory();\n this.project.sources.push(src);\n const append = opts.appendClip !== false;\n if (append && src.kind === \"video\") {\n const track =\n this.project.tracks.find((t) => t.kind === \"video\") ??\n this.appendTrack({ kind: \"video\" });\n const start = trackEnd(track);\n track.clips.push({\n id: createId(\"clip\"),\n sourceId: src.id,\n in: 0,\n out: src.duration ?? 0,\n start,\n });\n }\n this.afterMutation();\n return src;\n }\n\n // ---- project --------------------------------------------------------\n\n setProject(project: Project): void {\n this.pushHistory();\n this.project = normalizeProject(project);\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n // Re-fit on project swap — the new project's duration is likely\n // different so the previous scale is meaningless.\n this.ui.resetAutoFit();\n this.ui.render();\n }\n\n getProject(): Project {\n return JSON.parse(JSON.stringify(this.project)) as Project;\n }\n\n /**\n * Restore the \"fresh import\" state: same media library, single\n * default video track, one full-length clip per video source laid\n * end-to-end. This mirrors the initial layout a host would get\n * after dropping their videos in, so \"reset\" feels like \"start\n * over without re-importing\" rather than \"wipe everything\".\n *\n * Goes through the regular history stack — ⌘Z brings the previous\n * edit back. Sources without a known duration are skipped (they'd\n * render as zero-width clips, which is worse than absent).\n */\n reset(): void {\n const sources = this.project.sources.map((s) => ({ ...s }));\n const trackId = createId(\"track\");\n const clips: Clip[] = [];\n let start = 0;\n for (const src of sources) {\n if (src.kind !== \"video\") continue;\n const dur = src.duration;\n if (!dur || dur <= 0) continue;\n clips.push({\n id: createId(\"clip\"),\n sourceId: src.id,\n in: 0,\n out: dur,\n start,\n });\n start += dur;\n }\n this.setProject({\n version: 1,\n sources,\n tracks: [{ id: trackId, kind: \"video\", clips }],\n });\n }\n\n setTheme(theme: Theme): void {\n applyTheme(this.container, theme);\n // The timeline canvas reads CSS vars at paint time and bakes them\n // into pixels — it has no way to know the vars just changed.\n // Without this re-render, the chrome (toolbar/headers) flips\n // immediately via CSS but the canvas keeps its last colours until\n // the next interaction (wheel, click, etc.). Force a repaint now.\n this.ui.render();\n }\n\n setLocale(locale: Partial<Locale>): void {\n this.locale = mergeLocale(locale);\n this.ui.setLocale(this.locale);\n }\n\n /** Internal — UI reads the resolved locale here on each render. */\n getLocale(): Locale {\n return this.locale;\n }\n\n requestExport(): void {\n this.bus.emit(\"export\", { project: this.getProject() });\n }\n\n // ---- viewport -------------------------------------------------------\n\n getScale(): number {\n return this.pxPerSec;\n }\n\n setScale(pxPerSec: number): void {\n const next = clampScale(pxPerSec);\n if (next === this.pxPerSec) return;\n this.pxPerSec = next;\n this.bus.emit(\"scaleChange\", { pxPerSec: next });\n this.ui.render();\n }\n\n getSnap(): boolean {\n return this.snap;\n }\n\n setSnap(snap: boolean): void {\n if (snap === this.snap) return;\n this.snap = snap;\n this.bus.emit(\"snapChange\", { snap });\n this.ui.render();\n }\n\n /** Snap a candidate ms to the nearest snappable surface within SNAP_PX. */\n snapMs(timeMs: Ms, ignoreClipId?: string | null): Ms {\n if (!this.snap) return timeMs;\n const snapTol = Math.max(20, (SNAP_PX / this.pxPerSec) * 1000);\n const targets: Ms[] = [0, this.engine.getTime()];\n for (const t of this.project.tracks) {\n for (const c of t.clips) {\n if (c.id === ignoreClipId) continue;\n targets.push(c.start, clipEnd(c));\n }\n }\n let best: Ms = timeMs;\n let bestDist = snapTol;\n for (const t of targets) {\n const d = Math.abs(t - timeMs);\n if (d < bestDist) {\n bestDist = d;\n best = t;\n }\n }\n return best;\n }\n\n // ---- selection ------------------------------------------------------\n\n getSelection(): string | null {\n return this.selectedClipId;\n }\n\n setSelection(clipId: string | null): void {\n if (clipId === this.selectedClipId) return;\n this.selectedClipId = clipId;\n this.bus.emit(\"selectionChange\", { clipId });\n this.ui.render();\n }\n\n // ---- history --------------------------------------------------------\n\n canUndo(): boolean {\n return this.history.canUndo();\n }\n\n canRedo(): boolean {\n return this.history.canRedo();\n }\n\n undo(): boolean {\n const prev = this.history.undo(this.project);\n if (!prev) return false;\n this.project = prev;\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n this.ui.render();\n return true;\n }\n\n redo(): boolean {\n const next = this.history.redo(this.project);\n if (!next) return false;\n this.project = next;\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n this.ui.render();\n return true;\n }\n\n // ---- events ---------------------------------------------------------\n\n on<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): () => void {\n return this.bus.on(event, handler);\n }\n\n off<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): void {\n this.bus.off(event, handler);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.engine.destroy();\n this.ui.destroy();\n this.bus.clear();\n this.history.clear();\n }\n\n // ---- internals ------------------------------------------------------\n\n private appendTrack(opts: { kind: Track[\"kind\"] }): Track {\n const t: Track = { id: createId(\"track\"), kind: opts.kind, clips: [] };\n this.project.tracks.push(t);\n return t;\n }\n\n private resolveTrimTarget(\n timeMs: Ms,\n ): { track: Track; clip: Clip } | null {\n if (this.selectedClipId) {\n const trk = findTrackOfClip(this.project, this.selectedClipId);\n const cl = trk?.clips.find((c) => c.id === this.selectedClipId);\n if (trk && cl && timeMs >= cl.start && timeMs <= clipEnd(cl)) {\n return { track: trk, clip: cl };\n }\n }\n for (const trk of this.project.tracks) {\n const cl = findClipContaining(trk, timeMs);\n if (cl) return { track: trk, clip: cl };\n }\n return null;\n }\n\n private pushHistory(): void {\n this.history.push(this.project);\n this.emitHistory();\n }\n\n private emitHistory(): void {\n this.bus.emit(\"historyChange\", {\n canUndo: this.history.canUndo(),\n canRedo: this.history.canRedo(),\n });\n }\n\n private afterMutation(): void {\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.ui.render();\n }\n\n private handleSourceMetadata(sourceId: string, durMs: Ms): void {\n const src = this.project.sources.find((s) => s.id === sourceId);\n let mutated = false;\n if (src && !src.duration) {\n src.duration = durMs;\n mutated = true;\n }\n for (const t of this.project.tracks) {\n for (const c of t.clips) {\n if (c.sourceId === sourceId && c.out === 0) {\n c.out = durMs;\n mutated = true;\n }\n }\n }\n this.bus.emit(\"ready\", { sourceId });\n if (mutated) {\n // Source metadata patching is not a user action — don't pollute\n // the undo stack with it.\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.ui.render();\n }\n }\n}\n\nfunction clampScale(s: number): number {\n return Math.max(MIN_PX_PER_SEC, Math.min(MAX_PX_PER_SEC, s));\n}\n"]}
1
+ {"version":3,"sources":["../src/events.ts","../src/history.ts","../src/ids.ts","../src/model.ts","../src/timeline/layout.ts","../src/playback.ts","../src/ui/thumbnails.ts","../src/ui/format.ts","../src/timeline/draw.ts","../src/timeline/hit.ts","../src/timeline/index.ts","../src/ui/icons.ts","../src/ui/toolbar.ts","../src/ui/index.ts","../src/editor.ts"],"names":["c","ti","track","SCALE_MIN","SCALE_MAX","SNAP_PX","clampScale","opts"],"mappings":"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","file":"index.js","sourcesContent":["type Handler<T> = (payload: T) => void;\n\n/**\n * Minimal typed event bus. Returns an unsubscribe function from `on` so\n * callers don't have to retain the handler reference. No once/wildcard\n * by design — keep the surface small until something needs them.\n *\n * EventMap is intentionally unconstrained — its keys are the event\n * names and values are payload types. An explicit `Record` constraint\n * would force consumers to add an index signature, which would in turn\n * mask typos in `emit` / `on`.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventBus<EventMap extends Record<string, any>> {\n private listeners = new Map<keyof EventMap, Set<Handler<any>>>();\n\n on<K extends keyof EventMap>(\n event: K,\n handler: Handler<EventMap[K]>,\n ): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const h of set) {\n try {\n h(payload);\n } catch (err) {\n // Swallow handler errors so one broken listener can't kill the editor.\n // eslint-disable-next-line no-console\n console.error(\"[aicut] event handler threw\", event, err);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { Project } from \"./types.js\";\n\n/**\n * Snapshot-based undo/redo. Each mutation pushes the *previous*\n * project onto the undo stack and clears redo. Cheap enough for\n * v1: deep cloning a project JSON of a few dozen clips is O(<1ms).\n *\n * Capped to prevent unbounded memory growth on long sessions.\n */\nexport class HistoryStack {\n private undoStack: Project[] = [];\n private redoStack: Project[] = [];\n private readonly limit: number;\n\n constructor(limit = 50) {\n this.limit = limit;\n }\n\n /** Call BEFORE applying a mutation. */\n push(previous: Project): void {\n this.undoStack.push(clone(previous));\n if (this.undoStack.length > this.limit) this.undoStack.shift();\n this.redoStack.length = 0;\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** Returns the project to restore, or null if nothing to undo. */\n undo(current: Project): Project | null {\n const prev = this.undoStack.pop();\n if (!prev) return null;\n this.redoStack.push(clone(current));\n return prev;\n }\n\n redo(current: Project): Project | null {\n const next = this.redoStack.pop();\n if (!next) return null;\n this.undoStack.push(clone(current));\n return next;\n }\n\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n}\n\nfunction clone(p: Project): Project {\n return JSON.parse(JSON.stringify(p)) as Project;\n}\n","/**\n * Short, stable, URL-safe ID. Not cryptographic — fine for client IDs\n * that get persisted in the project JSON.\n */\nexport function createId(prefix = \"id\"): string {\n const rand = Math.random().toString(36).slice(2, 8);\n const t = Date.now().toString(36).slice(-4);\n return `${prefix}_${t}${rand}`;\n}\n","import { createId } from \"./ids.js\";\nimport type { Clip, Ms, Project, Track } from \"./types.js\";\n\nexport function createEmptyProject(): Project {\n return {\n version: 1,\n sources: [],\n tracks: [{ id: createId(\"track\"), kind: \"video\", clips: [] }],\n };\n}\n\nexport function clipDuration(c: Clip): Ms {\n return c.out - c.in;\n}\n\n/** End of a clip on the timeline (start + duration). */\nexport function clipEnd(c: Clip): Ms {\n return c.start + clipDuration(c);\n}\n\nexport function trackEnd(track: Track): Ms {\n let max = 0;\n for (const c of track.clips) {\n const end = clipEnd(c);\n if (end > max) max = end;\n }\n return max;\n}\n\n/**\n * Find which clip on the track contains `timeMs`. Edges:\n * - start inclusive\n * - end exclusive (a clip ending at T does not contain T)\n */\nexport function findClipContaining(track: Track, timeMs: Ms): Clip | null {\n for (const c of track.clips) {\n if (timeMs >= c.start && timeMs < clipEnd(c)) return c;\n }\n return null;\n}\n\nexport function findTrackOfClip(\n project: Project,\n clipId: string,\n): Track | null {\n for (const t of project.tracks) {\n if (t.clips.some((c) => c.id === clipId)) return t;\n }\n return null;\n}\n\n/**\n * Defensive normalization — ensures clips on each track are sorted by\n * `start`, IDs exist, and trivially-empty clips (out <= in) are dropped.\n * Called from `Editor.setProject` so consumers can hand us loosely-formed\n * JSON without risking inconsistent internal state.\n */\nexport function normalizeProject(project: Project): Project {\n const sources = project.sources.map((s) => ({ ...s }));\n const tracks = project.tracks.map<Track>((t) => {\n const clips = t.clips\n .filter((c) => c.out > c.in)\n .map<Clip>((c) => ({ ...c, id: c.id || createId(\"clip\") }))\n .sort((a, b) => a.start - b.start);\n return { ...t, id: t.id || createId(\"track\"), clips };\n });\n return { version: 1, sources, tracks };\n}\n\n/** Splits a clip at `localOffset` ms (measured from clip.start on the timeline). */\nexport function splitClipAt(clip: Clip, localOffset: Ms): [Clip, Clip] | null {\n const sourceLen = clip.out - clip.in;\n if (localOffset <= 0 || localOffset >= sourceLen) return null;\n const left: Clip = { ...clip, out: clip.in + localOffset };\n const right: Clip = {\n ...clip,\n id: createId(\"clip\"),\n in: clip.in + localOffset,\n start: clip.start + localOffset,\n };\n return [left, right];\n}\n\n/** Alias retained for back-compat with existing call sites. */\nexport function findClipAt(track: Track, timeMs: Ms): Clip | null {\n return findClipContaining(track, timeMs);\n}\n\nexport function projectDuration(project: Project): Ms {\n let max = 0;\n for (const t of project.tracks) {\n const e = trackEnd(t);\n if (e > max) max = e;\n }\n return max;\n}\n","import type { Clip, Ms, Project, Track } from \"../types.js\";\n\n/** Visual constants — kept here so draw + hit-test share one source of truth. */\nexport const TRACK_HEIGHT = 56;\nexport const RULER_HEIGHT = 24;\nexport const HEADER_WIDTH = 96;\nexport const HANDLE_PX = 8;\nexport const CLIP_INSET = 6;\nexport const SCALE_MIN = 10;\nexport const SCALE_MAX = 400;\n\n/** Scrollbar geometry. */\nexport const SCROLLBAR_THICKNESS = 10;\n/** Minimum thumb length so it stays grabbable at large content sizes. */\nexport const SCROLLBAR_MIN_THUMB = 24;\n/** Gutter inset from the canvas edges so the bar doesn't clip. */\nexport const SCROLLBAR_INSET = 2;\n\n/** Total height = ruler + sum of tracks. Caller decides if it wants more. */\nexport function totalHeight(tracks: Track[]): number {\n return RULER_HEIGHT + tracks.length * TRACK_HEIGHT;\n}\n\n/**\n * Track-stack content height — what the scrollbars compare against\n * the visible track region. Includes one extra TRACK_HEIGHT when a\n * drag is in flight so the \"+ 新轨道\" phantom row is reachable.\n */\nexport function contentHeight(tracks: Track[], isDragging: boolean): number {\n return tracks.length * TRACK_HEIGHT + (isDragging ? TRACK_HEIGHT : 0);\n}\n\n/** Pixels of timeline content along the X axis at the given zoom. */\nexport function contentWidth(project: Project, pxPerSec: number): number {\n let max = 0;\n for (const t of project.tracks) {\n for (const c of t.clips) {\n const end = c.start + (c.out - c.in);\n if (end > max) max = end;\n }\n }\n return (max / 1000) * pxPerSec;\n}\n\n/** Top-edge y for a track at `index`. */\nexport function trackY(index: number): number {\n return RULER_HEIGHT + index * TRACK_HEIGHT;\n}\n\n/** Inverse of trackY — which track index (or -1) does a given y fall in.\n * `scrollTop` shifts the visible window down; pass 0 if not scrolling. */\nexport function trackIndexAt(\n y: number,\n trackCount: number,\n scrollTop = 0,\n): number {\n if (y < RULER_HEIGHT) return -1;\n const contentY = y - RULER_HEIGHT + scrollTop;\n const idx = Math.floor(contentY / TRACK_HEIGHT);\n if (idx < 0 || idx >= trackCount) return -1;\n return idx;\n}\n\n/** Convert timeline ms → x pixel coordinate, accounting for header + scroll. */\nexport function msToX(\n timeMs: Ms,\n pxPerSec: number,\n scrollLeft: number,\n showHeader: boolean,\n): number {\n const base = showHeader ? HEADER_WIDTH : 0;\n return base + (timeMs / 1000) * pxPerSec - scrollLeft;\n}\n\n/** Convert x pixel coordinate back → timeline ms. */\nexport function xToMs(\n x: number,\n pxPerSec: number,\n scrollLeft: number,\n showHeader: boolean,\n): Ms {\n const base = showHeader ? HEADER_WIDTH : 0;\n return Math.max(0, ((x - base + scrollLeft) / pxPerSec) * 1000);\n}\n\n/**\n * Choose a \"nice\" major-tick interval covering at least `targetSec`.\n * Drives the ruler so it never shows ugly intervals like every 3.7s.\n */\nexport function niceTickSeconds(targetSec: number): number {\n if (targetSec <= 0) return 1;\n const exp = Math.floor(Math.log10(targetSec));\n const base = targetSec / Math.pow(10, exp);\n let nice: number;\n if (base < 1.5) nice = 1;\n else if (base < 3) nice = 2;\n else if (base < 7) nice = 5;\n else nice = 10;\n return nice * Math.pow(10, exp);\n}\n\nexport function formatRulerLabel(sec: number): string {\n if (sec < 60) return `${Math.round(sec * 10) / 10}s`;\n const m = Math.floor(sec / 60);\n const s = Math.round(sec - m * 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n\nexport function clampScale(s: number): number {\n return Math.max(SCALE_MIN, Math.min(SCALE_MAX, s));\n}\n\n/**\n * Snap targets aggregated from all clips in the project plus the\n * playhead and origin. Excludes the dragged clip (caller passes its id).\n */\nexport function snapTargets(\n project: Project,\n playheadMs: Ms,\n ignoreClipId: string | null,\n): Ms[] {\n const arr: Ms[] = [0, playheadMs];\n for (const t of project.tracks) {\n for (const c of t.clips) {\n if (c.id === ignoreClipId) continue;\n arr.push(c.start, c.start + (c.out - c.in));\n }\n }\n return arr;\n}\n\n/**\n * Return whether placing `clip` at `start..end` on `track` would\n * collide with any *other* clip already on that track.\n */\nexport function wouldOverlap(\n track: Track,\n clipId: string,\n start: Ms,\n end: Ms,\n): boolean {\n for (const c of track.clips) {\n if (c.id === clipId) continue;\n const cEnd = c.start + (c.out - c.in);\n if (start < cEnd && end > c.start) return true;\n }\n return false;\n}\n\n/** Look up `(track, clip)` for `clipId` across the project. */\nexport function findClip(\n project: Project,\n clipId: string,\n): { track: Track; clip: Clip; trackIndex: number } | null {\n for (let i = 0; i < project.tracks.length; i++) {\n const t = project.tracks[i]!;\n const c = t.clips.find((c) => c.id === clipId);\n if (c) return { track: t, clip: c, trackIndex: i };\n }\n return null;\n}\n\n/**\n * Uncovered intervals across the whole video timeline, in ms — i.e.\n * spans where no clip on any video track plays. Returned in time\n * order, half-open `[start, end)`. Used by the drawer to highlight\n * gaps in warning color so the user notices accidentally orphaned\n * regions.\n */\nexport function uncoveredIntervals(project: Project): Array<[Ms, Ms]> {\n const intervals: Array<[Ms, Ms]> = [];\n for (const t of project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n const end = c.start + (c.out - c.in);\n if (end > c.start) intervals.push([c.start, end]);\n }\n }\n if (intervals.length === 0) return [];\n intervals.sort((a, b) => a[0] - b[0]);\n const merged: Array<[Ms, Ms]> = [];\n for (const [s, e] of intervals) {\n const last = merged[merged.length - 1];\n if (last && s <= last[1]) last[1] = Math.max(last[1], e);\n else merged.push([s, e]);\n }\n const gaps: Array<[Ms, Ms]> = [];\n let cursor = 0;\n for (const [s, e] of merged) {\n if (s > cursor) gaps.push([cursor, s]);\n cursor = e;\n }\n // Trailing gap (after last clip) is intentionally NOT reported —\n // that's \"the end of the timeline\", not a coverage hole.\n return gaps;\n}\n","import type { Clip, Ms, Project } from \"./types.js\";\n\n/**\n * v1 preview engine. Strategy:\n * - one hidden <video> per MediaSource, kept warm so swapping clips\n * doesn't trigger a fresh network fetch.\n * - the \"active\" video for the current playhead is shown, others\n * are visibility:hidden behind it.\n * - tick loop drives a single video track's playhead, advancing\n * through clips end-to-end. When the playhead crosses a clip\n * boundary we pause the outgoing video and resume the next at\n * `clip.in`.\n *\n * Single video track only for v1 — extending to multi-track requires\n * a compositor (Canvas/WebGL), see project notes.\n */\nexport class PlaybackEngine {\n private host: HTMLElement;\n private mount: HTMLDivElement;\n private videos = new Map<string, HTMLVideoElement>();\n private project: Project;\n private currentClipId: string | null = null;\n private playing = false;\n private timeMs: Ms = 0;\n private rafHandle: number | null = null;\n private lastFrameTs = 0;\n\n /** Public event hooks — set by Editor. */\n onTimeUpdate?: (ms: Ms) => void;\n onEnded?: () => void;\n onError?: (err: Error) => void;\n onReady?: () => void;\n onSourceMetadata?: (sourceId: string, durationMs: Ms) => void;\n\n constructor(host: HTMLElement, project: Project) {\n this.host = host;\n this.project = project;\n this.mount = document.createElement(\"div\");\n this.mount.className = \"aicut-preview\";\n this.host.appendChild(this.mount);\n this.syncSources();\n }\n\n setProject(next: Project): void {\n this.project = next;\n this.syncSources();\n // Re-resolve the active clip for the current playhead across ALL\n // video tracks. If the clip we were on was removed, snap back to 0.\n const clip = this.clipAtTime(this.timeMs);\n if (!clip) {\n this.timeMs = 0;\n this.activate(null);\n this.onTimeUpdate?.(0);\n } else {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n }\n }\n\n play(): void {\n if (this.playing) return;\n if (this.totalDuration() <= 0) return;\n let clip = this.clipAtTime(this.timeMs) ?? this.nextClipAfterTime(this.timeMs);\n if (!clip) return;\n if (this.timeMs < clip.start) this.timeMs = clip.start;\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n const v = this.videos.get(clip.sourceId);\n if (!v) return;\n void v.play().catch((err) => this.onError?.(err as Error));\n this.playing = true;\n this.startTickLoop();\n }\n\n pause(): void {\n if (!this.playing) return;\n this.playing = false;\n this.stopTickLoop();\n if (this.currentClipId) {\n const clip = this.clipById(this.currentClipId);\n if (clip) {\n const v = this.videos.get(clip.sourceId);\n v?.pause();\n }\n }\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n getTime(): Ms {\n return this.timeMs;\n }\n\n seek(timeMs: Ms): void {\n const total = this.totalDuration();\n if (total <= 0) {\n this.timeMs = 0;\n return;\n }\n const clamped = Math.max(0, Math.min(timeMs, total));\n this.timeMs = clamped;\n const clip = this.clipAtTime(clamped);\n if (clip) {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, clamped - clip.start);\n } else {\n this.activate(null);\n }\n this.onTimeUpdate?.(clamped);\n }\n\n destroy(): void {\n this.stopTickLoop();\n for (const v of this.videos.values()) {\n v.pause();\n v.removeAttribute(\"src\");\n v.load();\n v.remove();\n }\n this.videos.clear();\n this.mount.remove();\n }\n\n // --- internals -------------------------------------------------------\n\n private syncSources(): void {\n const wanted = new Set(this.project.sources.map((s) => s.id));\n for (const [id, v] of this.videos) {\n if (!wanted.has(id)) {\n v.pause();\n v.remove();\n this.videos.delete(id);\n }\n }\n for (const src of this.project.sources) {\n if (src.kind !== \"video\") continue;\n if (this.videos.has(src.id)) continue;\n const v = document.createElement(\"video\");\n v.preload = \"auto\";\n // Intentionally no `crossOrigin` here. Setting it forces the\n // browser to require CORS headers on the source, which most\n // pre-existing video CDNs do not serve. Pure <video> playback\n // works fine cross-origin without it — we'll only need it once\n // the preview moves to a Canvas/WebGL compositor that has to\n // read pixels back. Hosts that need it can override post-mount.\n v.playsInline = true;\n v.muted = false;\n v.src = src.url;\n v.style.position = \"absolute\";\n v.style.inset = \"0\";\n v.style.width = \"100%\";\n v.style.height = \"100%\";\n v.style.objectFit = \"contain\";\n v.style.visibility = \"hidden\";\n const sourceId = src.id;\n v.addEventListener(\"error\", () =>\n this.onError?.(new Error(`Failed to load ${src.url}`)),\n );\n v.addEventListener(\"loadedmetadata\", () => {\n this.onReady?.();\n const durMs = Math.round(v.duration * 1000);\n if (Number.isFinite(durMs) && durMs > 0) {\n this.onSourceMetadata?.(sourceId, durMs);\n }\n });\n this.mount.appendChild(v);\n this.videos.set(src.id, v);\n }\n }\n\n private activate(clip: Clip | null): void {\n if (clip?.id === this.currentClipId) return;\n if (this.currentClipId) {\n const prev = this.clipById(this.currentClipId);\n if (prev) {\n const v = this.videos.get(prev.sourceId);\n if (v) {\n v.pause();\n v.style.visibility = \"hidden\";\n }\n }\n }\n this.currentClipId = clip ? clip.id : null;\n if (clip) {\n const v = this.videos.get(clip.sourceId);\n if (v) v.style.visibility = \"visible\";\n }\n }\n\n private seekVideoToClipOffset(clip: Clip, offsetMs: Ms): void {\n const v = this.videos.get(clip.sourceId);\n if (!v) return;\n const target = (clip.in + Math.max(0, offsetMs)) / 1000;\n if (Math.abs(v.currentTime - target) > 0.05) {\n v.currentTime = target;\n }\n }\n\n private clipById(id: string): Clip | null {\n for (const t of this.project.tracks) {\n for (const c of t.clips) if (c.id === id) return c;\n }\n return null;\n }\n\n /**\n * Find the clip whose timeline range contains `timeMs`, searching\n * across ALL video tracks. If multiple tracks have a clip at this\n * moment, the lowest-index track wins (matches the \"Track 1 is\n * background\" convention used in the auto-split UX — overlapping\n * placements would have created a new track on top, but here we\n * fall back to the underlying clip).\n */\n private clipAtTime(timeMs: Ms): Clip | null {\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n if (timeMs >= c.start && timeMs < c.start + (c.out - c.in)) return c;\n }\n }\n return null;\n }\n\n /** Earliest clip starting at-or-after `timeMs` across all video tracks. */\n private nextClipAfterTime(timeMs: Ms): Clip | null {\n let best: Clip | null = null;\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n if (c.start >= timeMs && (!best || c.start < best.start)) best = c;\n }\n }\n return best;\n }\n\n /** Max clip end across all video tracks. */\n private totalDuration(): Ms {\n let max = 0;\n for (const t of this.project.tracks) {\n if (t.kind !== \"video\") continue;\n for (const c of t.clips) {\n const e = c.start + (c.out - c.in);\n if (e > max) max = e;\n }\n }\n return max;\n }\n\n private startTickLoop(): void {\n this.lastFrameTs = performance.now();\n const tick = (now: number) => {\n if (!this.playing) return;\n const dtMs = now - this.lastFrameTs;\n this.lastFrameTs = now;\n this.advance(dtMs);\n this.rafHandle = requestAnimationFrame(tick);\n };\n this.rafHandle = requestAnimationFrame(tick);\n }\n\n private stopTickLoop(): void {\n if (this.rafHandle != null) {\n cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n }\n\n private advance(dtMs: number): void {\n if (this.project.tracks.length === 0) return;\n this.timeMs += dtMs;\n const totalDur = this.totalDuration();\n if (this.timeMs >= totalDur) {\n this.timeMs = totalDur;\n this.onTimeUpdate?.(this.timeMs);\n this.pause();\n this.onEnded?.();\n return;\n }\n const clip = this.clipAtTime(this.timeMs);\n if (!clip) {\n // Gap — jump forward to the next clip on any track.\n const next = this.nextClipAfterTime(this.timeMs);\n if (next) {\n this.timeMs = next.start;\n this.activate(next);\n this.seekVideoToClipOffset(next, 0);\n const v = this.videos.get(next.sourceId);\n if (v) void v.play().catch((err) => this.onError?.(err as Error));\n } else {\n this.pause();\n this.onEnded?.();\n return;\n }\n } else if (clip.id !== this.currentClipId) {\n this.activate(clip);\n this.seekVideoToClipOffset(clip, this.timeMs - clip.start);\n const v = this.videos.get(clip.sourceId);\n if (v) void v.play().catch((err) => this.onError?.(err as Error));\n }\n this.onTimeUpdate?.(this.timeMs);\n }\n}\n\n// Per-track helpers moved into class methods now that playback spans\n// all video tracks — kept the file free of dangling unused exports.\n","import type { Ms } from \"../types.js\";\n\nconst THUMB_HEIGHT = 44;\nconst THUMB_WIDTH = Math.round(THUMB_HEIGHT * (16 / 9));\n/**\n * Round all sample times to this bucket so multiple zoom levels share\n * cache hits. 250ms means at the highest zoom (400 px/s) we still get\n * a fresh thumbnail roughly every 100px — plenty of visual continuity.\n */\nconst BUCKET_MS = 250;\n\ninterface SourceState {\n video: HTMLVideoElement;\n /** Bucketed ms → bitmap, once extracted. */\n cache: Map<number, ImageBitmap>;\n /** Times currently being extracted. */\n inflight: Set<number>;\n /** Resolved when the video is past readyState=1 (have metadata). */\n ready: Promise<void>;\n /** Pending samples to extract, FIFO. */\n queue: number[];\n /** True while a seek/draw cycle is in progress. */\n busy: boolean;\n}\n\n/**\n * Extracts frame thumbnails from a hidden `<video>` per source and\n * paints them onto a per-clip strip canvas. Decoupled from the main\n * `PlaybackEngine` videos so seeking-for-thumbnails doesn't disturb\n * playback.\n *\n * Strategy: lazy, only extract what the timeline asks for via\n * `paintStrip`. Missing thumbnails get queued; when extraction\n * completes, we call `onUpdate` so the host can request another\n * paint with the now-available bitmap.\n */\nexport class ThumbnailRibbon {\n private host: HTMLElement;\n private sources = new Map<string, SourceState>();\n private onUpdate: () => void;\n\n static get THUMB_HEIGHT(): number {\n return THUMB_HEIGHT;\n }\n static get THUMB_WIDTH(): number {\n return THUMB_WIDTH;\n }\n\n constructor(host: HTMLElement, onUpdate: () => void) {\n this.host = host;\n this.onUpdate = onUpdate;\n }\n\n syncSources(sources: Array<{ id: string; url: string; kind: string }>): void {\n const wanted = new Set(sources.map((s) => s.id));\n for (const [id, st] of this.sources) {\n if (!wanted.has(id)) {\n st.video.remove();\n for (const bmp of st.cache.values()) bmp.close();\n this.sources.delete(id);\n }\n }\n for (const src of sources) {\n if (src.kind !== \"video\") continue;\n if (this.sources.has(src.id)) continue;\n const v = document.createElement(\"video\");\n v.src = src.url;\n v.preload = \"auto\";\n v.muted = true;\n v.playsInline = true;\n // Off-screen but in the layout so the browser actually decodes it.\n v.style.position = \"absolute\";\n v.style.left = \"-9999px\";\n v.style.top = \"-9999px\";\n v.style.width = \"160px\";\n v.style.height = \"90px\";\n this.host.appendChild(v);\n const ready = new Promise<void>((resolve) => {\n if (v.readyState >= 1) resolve();\n else v.addEventListener(\"loadedmetadata\", () => resolve(), { once: true });\n });\n this.sources.set(src.id, {\n video: v,\n cache: new Map(),\n inflight: new Set(),\n ready,\n queue: [],\n busy: false,\n });\n }\n }\n\n /**\n * Paint thumbnails for the clip's visible window onto `ctx`. The\n * canvas is the per-clip strip — width = clip's px width, height =\n * THUMB_HEIGHT. Source-time range derives from the clip's `in/out`\n * and the px range we're drawing into.\n */\n paintStrip(\n ctx: CanvasRenderingContext2D,\n sourceId: string,\n sourceInMs: Ms,\n sourceOutMs: Ms,\n pxWidth: number,\n ): void {\n ctx.clearRect(0, 0, pxWidth, THUMB_HEIGHT);\n const st = this.sources.get(sourceId);\n if (!st) return;\n if (sourceOutMs <= sourceInMs || pxWidth <= 0) return;\n\n const count = Math.max(1, Math.ceil(pxWidth / THUMB_WIDTH));\n const spanMs = sourceOutMs - sourceInMs;\n for (let i = 0; i < count; i++) {\n const tMs = sourceInMs + (spanMs * i) / count;\n const bucket = Math.round(tMs / BUCKET_MS) * BUCKET_MS;\n const bmp = st.cache.get(bucket);\n const x = Math.round((i * pxWidth) / count);\n const w =\n Math.round(((i + 1) * pxWidth) / count) - x;\n if (bmp) {\n ctx.drawImage(bmp, x, 0, w, THUMB_HEIGHT);\n } else {\n // Placeholder shimmer block — same color as track surface.\n ctx.fillStyle = \"rgba(255,255,255,0.04)\";\n ctx.fillRect(x, 0, w, THUMB_HEIGHT);\n this.enqueue(st, bucket);\n }\n }\n }\n\n destroy(): void {\n for (const st of this.sources.values()) {\n st.video.remove();\n for (const bmp of st.cache.values()) bmp.close();\n }\n this.sources.clear();\n }\n\n // ---- internals ------------------------------------------------------\n\n private enqueue(st: SourceState, bucketMs: number): void {\n if (st.cache.has(bucketMs) || st.inflight.has(bucketMs)) return;\n st.inflight.add(bucketMs);\n st.queue.push(bucketMs);\n void this.drain(st);\n }\n\n private async drain(st: SourceState): Promise<void> {\n if (st.busy) return;\n st.busy = true;\n try {\n await st.ready;\n while (st.queue.length > 0) {\n const t = st.queue.shift()!;\n try {\n const bmp = await this.extractFrame(st.video, t);\n st.cache.set(t, bmp);\n } catch {\n // ignore — failed extractions just leave the placeholder\n } finally {\n st.inflight.delete(t);\n }\n this.onUpdate();\n }\n } finally {\n st.busy = false;\n }\n }\n\n private extractFrame(\n video: HTMLVideoElement,\n timeMs: Ms,\n ): Promise<ImageBitmap> {\n const targetSec = Math.max(\n 0,\n Math.min((video.duration || Infinity) - 0.05, timeMs / 1000),\n );\n return new Promise((resolve, reject) => {\n const onSeeked = () => {\n try {\n const cnv = document.createElement(\"canvas\");\n cnv.width = THUMB_WIDTH;\n cnv.height = THUMB_HEIGHT;\n const cx = cnv.getContext(\"2d\");\n if (!cx) return reject(new Error(\"no 2d ctx\"));\n cx.drawImage(video, 0, 0, THUMB_WIDTH, THUMB_HEIGHT);\n // createImageBitmap is async but cheap and gives a portable\n // GPU-friendly handle the strip canvas can blit fast.\n createImageBitmap(cnv).then(resolve, reject);\n } catch (e) {\n reject(e as Error);\n }\n };\n video.addEventListener(\"seeked\", onSeeked, { once: true });\n try {\n video.currentTime = targetSec;\n } catch (e) {\n video.removeEventListener(\"seeked\", onSeeked);\n reject(e as Error);\n }\n });\n }\n}\n","import type { Ms } from \"../types.js\";\n\n/** mm:ss (rounded to seconds) — matches the toolbar reference. */\nexport function fmtClock(ms: Ms): string {\n const total = Math.max(0, Math.round(ms / 1000));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${pad2(m)}:${pad2(s)}`;\n}\n\n/** mm:ss.mmm with millisecond precision — used in the time label. */\nexport function fmtClockMs(ms: Ms): string {\n const total = Math.max(0, Math.round(ms));\n const m = Math.floor(total / 60000);\n const s = Math.floor((total % 60000) / 1000);\n const r = total % 1000;\n return `${pad2(m)}:${pad2(s)}.${pad3(r)}`;\n}\n\nconst pad2 = (n: number) => (n < 10 ? `0${n}` : `${n}`);\nconst pad3 = (n: number) => n.toString().padStart(3, \"0\");\n","import { formatLabel, type Locale } from \"../i18n.js\";\nimport type { Clip, MediaSource, Project, Track } from \"../types.js\";\nimport { fmtClockMs } from \"../ui/format.js\";\nimport type { ThumbnailRibbon } from \"../ui/thumbnails.js\";\nimport {\n CLIP_INSET,\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n TRACK_HEIGHT,\n contentHeight,\n contentWidth,\n formatRulerLabel,\n niceTickSeconds,\n trackY,\n uncoveredIntervals,\n} from \"./layout.js\";\n\nexport interface DrawStyle {\n bg: string;\n border: string;\n text: string;\n textMuted: string;\n trackBg: string;\n brand: string;\n brandTo: string;\n info: string;\n clipText: string;\n selectedRing: string;\n playhead: string;\n}\n\nexport interface DrawState {\n project: Project;\n pxPerSec: number;\n scrollLeft: number;\n scrollTop: number;\n timeMs: number;\n selectedClipId: string | null;\n hoveredClipId: string | null;\n hoveredTrackIndex: number | null;\n dropTargetTrackIndex: number | null;\n /** While any drag is in flight, draw a \"+ 新轨道\" phantom row at the\n * bottom that the user can drop into to explicitly create a track. */\n isDragging: boolean;\n snapX: number | null;\n showHeader: boolean;\n viewportWidth: number;\n viewportHeight: number;\n /** 0–1 fade opacity for each scrollbar. 0 hides it entirely. */\n scrollbarOpacityY: number;\n scrollbarOpacityX: number;\n /** Active = currently being dragged → render at full opacity + emphasized. */\n scrollbarActiveY: boolean;\n scrollbarActiveX: boolean;\n /** Resolved locale used for canvas-painted labels. */\n locale: Locale;\n /**\n * In-flight drag preview. While set, the clip with `clipId` is\n * drawn faded at its real position AND a fully-opaque \"ghost\" of it\n * is drawn at (ghostStart, ghostTrackIndex). `wouldOverlap` flips\n * the ghost to a warning color so users see auto-split coming.\n */\n dragGhost: {\n clipId: string;\n ghostStart: number;\n ghostTrackIndex: number;\n wouldOverlap: boolean;\n } | null;\n}\n\n/**\n * Paint the entire timeline. Stateless — given the same DrawState\n * twice you get the same pixels.\n *\n * Layout has FOUR regions with different sticky behavior:\n * - Ruler band (top, scrolls X only)\n * - Headers col (left, scrolls Y only — when showHeader)\n * - Tracks (the main grid, scrolls both)\n * - Scrollbars (edge overlays, never scroll)\n *\n * We render in passes; each pass `clip`s to its region and (where\n * needed) translates by `-scrollTop` so paint functions can keep\n * working in their natural untranslated coordinates.\n */\nexport function drawAll(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { viewportWidth: W, viewportHeight: H } = state;\n ctx.fillStyle = style.bg;\n ctx.fillRect(0, 0, W, H);\n\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const trackAreaW = W - baseX - SCROLLBAR_THICKNESS;\n const trackAreaH = H - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n\n // --- Pass 1: Track grid (scrolls X + Y) -----------------------------\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, RULER_HEIGHT, trackAreaW, trackAreaH);\n ctx.clip();\n ctx.translate(0, -state.scrollTop);\n drawTracks(ctx, state, style, thumbs);\n if (state.isDragging) {\n drawPhantomRow(ctx, state.project.tracks.length, baseX, state, style);\n }\n if (state.dragGhost) drawDragGhost(ctx, state, style, thumbs);\n ctx.restore();\n\n // --- Pass 2: Headers column (sticky X, scrolls Y) -------------------\n if (state.showHeader) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, RULER_HEIGHT, HEADER_WIDTH, trackAreaH);\n ctx.clip();\n ctx.translate(0, -state.scrollTop);\n drawHeaders(ctx, state, style);\n ctx.restore();\n }\n\n // --- Pass 3: Ruler (sticky Y, scrolls X) ----------------------------\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, RULER_HEIGHT);\n ctx.clip();\n drawRuler(ctx, state, style);\n ctx.restore();\n\n // --- Pass 4: Coverage-gap warning (scrolls X, full visible height) --\n // Painted AFTER both tracks and the ruler so the amber tint + the\n // diagonal \"broken teeth\" hatch sit on top of timecode markings —\n // that's what makes a missing segment instantly catchable when the\n // user is scanning the ruler row.\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, H - SCROLLBAR_THICKNESS);\n ctx.clip();\n drawCoverageGaps(ctx, state, style);\n ctx.restore();\n\n // --- Pass 5: Snap guide + playhead (scroll X, full visible track Y) -\n ctx.save();\n ctx.beginPath();\n ctx.rect(baseX, 0, trackAreaW, H - SCROLLBAR_THICKNESS);\n ctx.clip();\n drawSnapGuide(ctx, state, style);\n drawPlayhead(ctx, state, style);\n ctx.restore();\n\n // --- Pass 6: Scrollbars (no clip — overlay at edges) ---------------\n drawScrollbarV(ctx, state, style);\n drawScrollbarH(ctx, state, style);\n}\n\n/**\n * Highlight time spans where no video clip is present anywhere on any\n * track — a warning to the user that the export will have a hard cut\n * to black at this point. Painted as a translucent amber vertical\n * strip spanning the full track stack, plus a slightly more saturated\n * strip in the ruler band so it's catchable even when the user is\n * scanning the timecode row.\n */\nfunction drawCoverageGaps(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const gaps = uncoveredIntervals(state.project);\n if (gaps.length === 0) return;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n // Span the visible track area, not the (potentially huge) total —\n // pre-clipped by drawAll's pass-2 region anyway, but explicit\n // height keeps the hatch math clean.\n const trackStackH =\n state.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n for (const [s, e] of gaps) {\n const x1 = Math.max(\n baseX,\n baseX + (s / 1000) * state.pxPerSec - state.scrollLeft,\n );\n const x2 = Math.min(\n state.viewportWidth,\n baseX + (e / 1000) * state.pxPerSec - state.scrollLeft,\n );\n if (x2 <= x1) continue;\n // Ruler band — stronger so it's the first thing the eye catches.\n ctx.fillStyle = \"rgba(250, 167, 0, 0.35)\";\n ctx.fillRect(x1, 0, x2 - x1, RULER_HEIGHT);\n // Track band — faint so it doesn't fight the clip thumbnails on\n // adjacent rows.\n ctx.fillStyle = \"rgba(250, 167, 0, 0.12)\";\n ctx.fillRect(x1, RULER_HEIGHT, x2 - x1, trackStackH);\n // Hatched marker on the ruler so it reads as a problem, not a\n // selection. Diagonal lines at 6px spacing.\n ctx.save();\n ctx.strokeStyle = \"rgba(250, 167, 0, 0.6)\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (let hx = Math.floor(x1); hx < x2; hx += 6) {\n ctx.moveTo(hx, RULER_HEIGHT - 1);\n ctx.lineTo(hx + 6, RULER_HEIGHT - 7);\n }\n ctx.stroke();\n ctx.restore();\n void style;\n }\n}\n\nfunction drawDragGhost(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const ghost = state.dragGhost!;\n // Locate the real clip so the ghost reuses its source / duration.\n let real: Clip | null = null;\n for (const t of state.project.tracks) {\n const c = t.clips.find((c) => c.id === ghost.clipId);\n if (c) {\n real = c;\n break;\n }\n }\n if (!real) return;\n\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const widthPx = Math.max(2, ((real.out - real.in) / 1000) * state.pxPerSec);\n const startX =\n baseX + (ghost.ghostStart / 1000) * state.pxPerSec - state.scrollLeft;\n\n // ---- Drop-slot outline ------------------------------------------------\n // Always paint a dashed rectangle where the clip will land — the\n // outline is the \"slot\" and the solid ghost above it is the clip.\n // When the drop would overlap (→ Editor will auto-split onto a\n // brand-new track below), draw an ADDITIONAL phantom row at the\n // bottom + outline there, so the user sees the new track coming.\n const overlap = ghost.wouldOverlap;\n // Phantom row is now drawn unconditionally during drag (see drawAll);\n // we only need the dashed drop outline here, on whichever row the\n // ghost is currently above.\n drawDropOutline(\n ctx,\n startX,\n overlap ? state.project.tracks.length : ghost.ghostTrackIndex,\n widthPx,\n style.info,\n overlap,\n );\n\n // ---- Ghost clip body --------------------------------------------------\n // Slight transparency so the user reads it as \"preview\" rather than\n // the committed clip. The drop outline + phantom row carry the rest\n // of the wayfinding.\n ctx.save();\n ctx.globalAlpha = 0.85;\n drawClipAt(\n ctx,\n real,\n overlap ? state.project.tracks.length : ghost.ghostTrackIndex,\n ghost.ghostStart,\n state.project.sources,\n state,\n style,\n thumbs,\n /* dim = */ false,\n /* warn = */ overlap,\n );\n ctx.restore();\n}\n\nfunction drawDropOutline(\n ctx: CanvasRenderingContext2D,\n startX: number,\n trackIndex: number,\n widthPx: number,\n color: string,\n emphasized: boolean,\n): void {\n // 1px solid info-tinted outline — present, but doesn't shout.\n // `emphasized` (used when the drop would land on the phantom new\n // track) bumps to a slightly thicker stroke + a faint glow halo.\n const y = trackY(trackIndex) + CLIP_INSET - 1;\n const h = TRACK_HEIGHT - CLIP_INSET * 2 + 2;\n ctx.save();\n if (emphasized) {\n ctx.shadowColor = withAlpha(color, 0.45);\n ctx.shadowBlur = 6;\n }\n ctx.strokeStyle = withAlpha(color, emphasized ? 0.9 : 0.7);\n ctx.lineWidth = 1;\n roundRect(ctx, startX - 0.5, y, widthPx + 1, h, 6);\n ctx.stroke();\n ctx.restore();\n}\n\n/**\n * Hairline placeholder row beneath the existing tracks, visible only\n * while a drag is active. Deliberately understated — top + bottom\n * dashed borders + a tiny label, no fill — so it reads as \"available\n * slot\" rather than \"selection target\".\n */\nfunction drawPhantomRow(\n ctx: CanvasRenderingContext2D,\n trackIndex: number,\n baseX: number,\n state: DrawState,\n style: DrawStyle,\n): void {\n const y = trackY(trackIndex);\n const w = state.viewportWidth - baseX;\n ctx.save();\n // Very faint background tint — keeps the row visually grouped with\n // the rest of the timeline without competing with clip thumbnails.\n ctx.fillStyle = withAlpha(style.info, 0.04);\n ctx.fillRect(baseX, y, w, TRACK_HEIGHT);\n // Dashed top + bottom hairlines so the eye reads it as a slot.\n ctx.strokeStyle = withAlpha(style.info, 0.35);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 4]);\n ctx.beginPath();\n ctx.moveTo(baseX, y + 0.5);\n ctx.lineTo(baseX + w, y + 0.5);\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(baseX + w, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n ctx.setLineDash([]);\n if (state.showHeader) {\n ctx.fillStyle = withAlpha(style.info, 0.7);\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(state.locale.newTrack, 12, y + TRACK_HEIGHT / 2);\n }\n ctx.restore();\n}\n\n// ---- ruler ----------------------------------------------------------------\n\nfunction drawRuler(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const { pxPerSec, scrollLeft, viewportWidth: W } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const rulerW = W - baseX;\n\n ctx.fillStyle = style.bg;\n ctx.fillRect(baseX, 0, rulerW, RULER_HEIGHT);\n\n // Bottom border under the ruler.\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, RULER_HEIGHT - 0.5);\n ctx.lineTo(W, RULER_HEIGHT - 0.5);\n ctx.stroke();\n\n const minPx = 80;\n const tickSec = niceTickSeconds(minPx / pxPerSec);\n const subSec = tickSec / 5;\n\n const firstVisibleSec = Math.max(0, scrollLeft / pxPerSec - subSec);\n const lastVisibleSec = (scrollLeft + rulerW) / pxPerSec + subSec;\n\n ctx.textBaseline = \"bottom\";\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n\n // Sub + major ticks in one pass.\n const startStep = Math.floor(firstVisibleSec / subSec);\n const endStep = Math.ceil(lastVisibleSec / subSec);\n\n for (let i = startStep; i <= endStep; i++) {\n const s = i * subSec;\n if (s < 0) continue;\n const x = baseX + s * pxPerSec - scrollLeft;\n if (x < baseX || x > W) continue;\n const isMajor = Math.abs(((s / tickSec) % 1)) < 1e-3;\n ctx.strokeStyle = isMajor\n ? withAlpha(style.text, 0.5)\n : withAlpha(style.text, 0.25);\n ctx.lineWidth = 1;\n const h = isMajor ? 10 : 6;\n ctx.beginPath();\n ctx.moveTo(x + 0.5, RULER_HEIGHT - h);\n ctx.lineTo(x + 0.5, RULER_HEIGHT - 1);\n ctx.stroke();\n if (isMajor) {\n ctx.fillStyle = withAlpha(style.textMuted, 0.85);\n ctx.fillText(formatRulerLabel(s), x + 3, RULER_HEIGHT - 12);\n }\n }\n}\n\n// ---- tracks + clips -------------------------------------------------------\n\nfunction drawTracks(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { project } = state;\n for (let ti = 0; ti < project.tracks.length; ti++) {\n drawTrackRow(ctx, ti, project.tracks[ti]!, project.sources, state, style, thumbs);\n }\n}\n\nfunction drawTrackRow(\n ctx: CanvasRenderingContext2D,\n trackIndex: number,\n track: Track,\n sources: MediaSource[],\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n): void {\n const { viewportWidth: W } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const y = trackY(trackIndex);\n\n // Track surface: just the default tint. Drop-target highlight is now\n // limited to a 1px top + bottom info-tinted hairline (instead of a\n // brand-color flood) so the dragged ghost reads as primary content\n // and the row hint stays quiet.\n ctx.fillStyle = style.trackBg;\n ctx.fillRect(baseX, y, W - baseX, TRACK_HEIGHT);\n\n // Row separator (bottom border).\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(W, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n\n if (state.dropTargetTrackIndex === trackIndex) {\n ctx.strokeStyle = withAlpha(style.info, 0.45);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(baseX, y + 0.5);\n ctx.lineTo(W, y + 0.5);\n ctx.moveTo(baseX, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(W, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n }\n\n for (const clip of track.clips) {\n const dim = state.dragGhost?.clipId === clip.id;\n drawClipAt(\n ctx,\n clip,\n trackIndex,\n clip.start,\n sources,\n state,\n style,\n thumbs,\n dim,\n false,\n );\n }\n}\n\n/**\n * Paint a clip at a virtual `(trackIndex, startMs)` that may differ\n * from its data position. Used for both normal clip rendering (passing\n * the clip's real `start` + `trackIndex`) and for the in-flight drag\n * ghost (where the values come from pointer position).\n *\n * `dim` — render at low opacity (the \"leave-behind\" at the drag's\n * origin so the user sees where the clip will return if\n * they release without moving).\n * `warn` — paint the body in warning color (orange-ish) to telegraph\n * \"if you drop here, this will create a new track because\n * of the overlap rule.\"\n */\nfunction drawClipAt(\n ctx: CanvasRenderingContext2D,\n clip: Clip,\n trackIndex: number,\n startMs: number,\n sources: MediaSource[],\n state: DrawState,\n style: DrawStyle,\n thumbs: ThumbnailRibbon,\n dim: boolean,\n warn: boolean,\n): void {\n const { pxPerSec, scrollLeft } = state;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const startX = baseX + (startMs / 1000) * pxPerSec - scrollLeft;\n const widthPx = Math.max(2, ((clip.out - clip.in) / 1000) * pxPerSec);\n const y = trackY(trackIndex) + CLIP_INSET;\n const h = TRACK_HEIGHT - CLIP_INSET * 2;\n if (startX + widthPx < baseX || startX > state.viewportWidth) return;\n\n ctx.save();\n if (dim) ctx.globalAlpha = 0.3;\n\n // Body fill — brand gradient by default. `warn` (drop would\n // auto-create a new track) tints toward a soft amber rather than\n // the previous loud red/orange.\n const grad = ctx.createLinearGradient(0, y, 0, y + h);\n if (warn) {\n grad.addColorStop(0, \"rgba(250, 175, 70, 0.7)\");\n grad.addColorStop(1, \"rgba(240, 145, 50, 0.62)\");\n } else {\n grad.addColorStop(0, withAlpha(style.brand, 0.8));\n grad.addColorStop(1, withAlpha(style.brandTo, 0.7));\n }\n ctx.fillStyle = grad;\n roundRect(ctx, startX, y, widthPx, h, 6);\n ctx.fill();\n\n // Thumbnail strip.\n ctx.save();\n roundRect(ctx, startX, y, widthPx, h, 6);\n ctx.clip();\n ctx.translate(startX, y);\n thumbs.paintStrip(ctx, clip.sourceId, clip.in, clip.out, widthPx);\n ctx.restore();\n\n // Inner highlight (1px white inset).\n ctx.strokeStyle = \"rgba(255,255,255,0.2)\";\n ctx.lineWidth = 1;\n roundRect(ctx, startX + 0.5, y + 0.5, widthPx - 1, h - 1, 6);\n ctx.stroke();\n\n // Label.\n const src = sources.find((s) => s.id === clip.sourceId);\n const label = src?.name ?? src?.url.split(\"/\").pop() ?? clip.id;\n ctx.font = \"11px system-ui, -apple-system, sans-serif\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = \"rgba(0,0,0,0.6)\";\n ctx.fillText(label, startX + 9, y + 5);\n ctx.fillStyle = \"#fff\";\n ctx.fillText(label, startX + 8, y + 4);\n\n // Selection ring (skip when dimmed — selection has no meaning on a\n // ghost source clip; the ghost itself draws its own ring if you add\n // one later).\n if (!dim && state.selectedClipId === clip.id) {\n ctx.strokeStyle = style.selectedRing;\n ctx.lineWidth = 2;\n roundRect(ctx, startX - 1, y - 1, widthPx + 2, h + 2, 7);\n ctx.stroke();\n }\n\n // Edge handles on hover or selection.\n const showHandles =\n !dim && (state.selectedClipId === clip.id || state.hoveredClipId === clip.id);\n if (showHandles) {\n ctx.fillStyle = \"rgba(255,255,255,0.75)\";\n ctx.fillRect(startX + 2, y + 12, 2, h - 24);\n ctx.fillRect(startX + widthPx - 4, y + 12, 2, h - 24);\n }\n ctx.restore();\n}\n\n// ---- headers --------------------------------------------------------------\n\nfunction drawHeaders(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n ctx.fillStyle = style.bg;\n ctx.fillRect(0, 0, HEADER_WIDTH, state.viewportHeight);\n\n // Right border separating headers from scrollable area.\n ctx.strokeStyle = style.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(HEADER_WIDTH - 0.5, 0);\n ctx.lineTo(HEADER_WIDTH - 0.5, state.viewportHeight);\n ctx.stroke();\n\n ctx.textBaseline = \"middle\";\n ctx.font = \"11px system-ui, -apple-system, sans-serif\";\n for (let i = 0; i < state.project.tracks.length; i++) {\n const t = state.project.tracks[i]!;\n const y = trackY(i);\n // Track row separator.\n ctx.strokeStyle = style.border;\n ctx.beginPath();\n ctx.moveTo(0, y + TRACK_HEIGHT - 0.5);\n ctx.lineTo(HEADER_WIDTH, y + TRACK_HEIGHT - 0.5);\n ctx.stroke();\n\n ctx.fillStyle = withAlpha(style.text, 0.7);\n const template =\n t.kind === \"video\"\n ? state.locale.videoTrackLabel\n : state.locale.audioTrackLabel;\n const label = formatLabel(template, { n: i + 1 });\n ctx.fillText(label, 12, y + TRACK_HEIGHT / 2);\n\n // Delete-track button — × icon at the right edge. Only painted\n // for empty tracks (hit-test agrees) so a busy row's UI doesn't\n // dangle a destructive button next to actual content.\n if (t.clips.length === 0) {\n const hovered = state.hoveredTrackIndex === i;\n const btnSize = 18;\n const btnLeft = HEADER_WIDTH - btnSize - 6;\n const btnTop = y + (TRACK_HEIGHT - btnSize) / 2;\n ctx.save();\n if (hovered) {\n ctx.fillStyle = withAlpha(style.text, 0.1);\n roundRect(ctx, btnLeft, btnTop, btnSize, btnSize, 5);\n ctx.fill();\n }\n ctx.strokeStyle = withAlpha(style.text, hovered ? 0.85 : 0.4);\n ctx.lineWidth = 1.4;\n const pad = 5;\n ctx.beginPath();\n ctx.moveTo(btnLeft + pad, btnTop + pad);\n ctx.lineTo(btnLeft + btnSize - pad, btnTop + btnSize - pad);\n ctx.moveTo(btnLeft + btnSize - pad, btnTop + pad);\n ctx.lineTo(btnLeft + pad, btnTop + btnSize - pad);\n ctx.stroke();\n ctx.restore();\n }\n }\n}\n\n// ---- playhead -------------------------------------------------------------\n\nfunction drawPlayhead(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const x = baseX + (state.timeMs / 1000) * state.pxPerSec - state.scrollLeft;\n if (x < baseX - 2 || x > state.viewportWidth + 2) return;\n\n // Vertical line through ruler + tracks.\n ctx.strokeStyle = style.playhead;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, state.viewportHeight);\n ctx.stroke();\n\n // Time bubble centered on the playhead at the top of the ruler.\n const label = fmtClockMs(state.timeMs);\n ctx.font = \"10px system-ui, -apple-system, sans-serif\";\n const padX = 6;\n const w = ctx.measureText(label).width + padX * 2;\n const h = 14;\n const bx = x - w / 2;\n const by = 2;\n ctx.fillStyle = style.playhead;\n roundRect(ctx, bx, by, w, h, 4);\n ctx.fill();\n // Triangle hanging below the bubble.\n ctx.beginPath();\n ctx.moveTo(x - 4, by + h);\n ctx.lineTo(x + 4, by + h);\n ctx.lineTo(x, by + h + 4);\n ctx.closePath();\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, bx + padX, by + h / 2);\n}\n\n// ---- snap guide -----------------------------------------------------------\n\nfunction drawSnapGuide(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.snapX == null) return;\n ctx.strokeStyle = style.info;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(state.snapX + 0.5, 0);\n ctx.lineTo(state.snapX + 0.5, state.viewportHeight);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n\n// ---- utilities ------------------------------------------------------------\n\n// ---- scrollbars -----------------------------------------------------------\n\n/**\n * Right-edge vertical scrollbar. Opacity is host-controlled (set by\n * Timeline based on time-since-interaction + hover). Thumb position\n * and length derive from scrollTop / contentHeight / visibleHeight.\n */\nfunction drawScrollbarV(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.scrollbarOpacityY <= 0.01) return;\n const visibleH = state.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(state.project.tracks, state.isDragging);\n if (contentH <= visibleH) return;\n const trackX = state.viewportWidth - SCROLLBAR_THICKNESS + SCROLLBAR_INSET;\n const trackY0 = RULER_HEIGHT + SCROLLBAR_INSET;\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = contentH - visibleH;\n const thumbY =\n trackY0 + (maxScroll > 0 ? (state.scrollTop / maxScroll) * (trackLen - thumbLen) : 0);\n paintScrollbar(\n ctx,\n style,\n trackX,\n trackY0,\n SCROLLBAR_THICKNESS - SCROLLBAR_INSET * 2,\n trackLen,\n thumbY - trackY0,\n thumbLen,\n state.scrollbarOpacityY,\n state.scrollbarActiveY,\n \"v\",\n );\n}\n\nfunction drawScrollbarH(\n ctx: CanvasRenderingContext2D,\n state: DrawState,\n style: DrawStyle,\n): void {\n if (state.scrollbarOpacityX <= 0.01) return;\n const baseX = state.showHeader ? HEADER_WIDTH : 0;\n const visibleW = state.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(state.project, state.pxPerSec);\n if (contentW <= visibleW) return;\n const trackY0 = state.viewportHeight - SCROLLBAR_THICKNESS + SCROLLBAR_INSET;\n const trackX0 = baseX + SCROLLBAR_INSET;\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = contentW - visibleW;\n const thumbX =\n trackX0 + (maxScroll > 0 ? (state.scrollLeft / maxScroll) * (trackLen - thumbLen) : 0);\n paintScrollbar(\n ctx,\n style,\n trackX0,\n trackY0,\n trackLen,\n SCROLLBAR_THICKNESS - SCROLLBAR_INSET * 2,\n thumbX - trackX0,\n thumbLen,\n state.scrollbarOpacityX,\n state.scrollbarActiveX,\n \"h\",\n );\n}\n\n/**\n * Common drawing for both scrollbars. The thumb fades with `opacity`;\n * `active` (dragging) emphasizes via thicker stroke. Gutter is a\n * subtle background — visible to suggest \"you can grab here\" but\n * never loud enough to fight clip content.\n */\nfunction paintScrollbar(\n ctx: CanvasRenderingContext2D,\n style: DrawStyle,\n trackX: number,\n trackY0: number,\n trackW: number,\n trackH: number,\n thumbOffset: number,\n thumbLen: number,\n opacity: number,\n active: boolean,\n axis: \"h\" | \"v\",\n): void {\n ctx.save();\n ctx.globalAlpha = opacity;\n // Gutter — barely visible track lane.\n ctx.fillStyle = withAlpha(style.text, 0.06);\n roundRect(ctx, trackX, trackY0, trackW, trackH, Math.min(trackW, trackH) / 2);\n ctx.fill();\n // Thumb — neutral by default, info-tinted when actively dragged.\n ctx.fillStyle = active\n ? withAlpha(style.info, 0.85)\n : withAlpha(style.text, 0.4);\n if (axis === \"v\") {\n roundRect(ctx, trackX, trackY0 + thumbOffset, trackW, thumbLen, trackW / 2);\n } else {\n roundRect(ctx, trackX + thumbOffset, trackY0, thumbLen, trackH, trackH / 2);\n }\n ctx.fill();\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const rr = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n ctx.moveTo(x + rr, y);\n ctx.lineTo(x + w - rr, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + rr);\n ctx.lineTo(x + w, y + h - rr);\n ctx.quadraticCurveTo(x + w, y + h, x + w - rr, y + h);\n ctx.lineTo(x + rr, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - rr);\n ctx.lineTo(x, y + rr);\n ctx.quadraticCurveTo(x, y, x + rr, y);\n ctx.closePath();\n}\n\n/** color-mix substitute that works directly on hex/rgba strings via\n * canvas — quick & dirty: parse-or-pass-through. For named css colors\n * we fall back to the original. Good enough for our palette. */\nfunction mix(a: string, b: string, t: number): string {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return a;\n const r = Math.round(ca[0] + (cb[0] - ca[0]) * (1 - t));\n const g = Math.round(ca[1] + (cb[1] - ca[1]) * (1 - t));\n const bl = Math.round(ca[2] + (cb[2] - ca[2]) * (1 - t));\n return `rgb(${r}, ${g}, ${bl})`;\n}\n\nfunction withAlpha(color: string, alpha: number): string {\n const c = parseColor(color);\n if (!c) return color;\n return `rgba(${c[0]}, ${c[1]}, ${c[2]}, ${alpha})`;\n}\n\nfunction parseColor(s: string): [number, number, number] | null {\n if (s.startsWith(\"#\")) {\n const hex = s.slice(1);\n if (hex.length === 3) {\n return [\n parseInt(hex[0]! + hex[0]!, 16),\n parseInt(hex[1]! + hex[1]!, 16),\n parseInt(hex[2]! + hex[2]!, 16),\n ];\n }\n if (hex.length === 6) {\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n }\n const m = s.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (m) return [Number(m[1]), Number(m[2]), Number(m[3])];\n return null;\n}\n","import type { Project } from \"../types.js\";\nimport {\n HANDLE_PX,\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n contentHeight,\n contentWidth,\n trackIndexAt,\n trackY,\n xToMs,\n} from \"./layout.js\";\n\nexport type HitTarget =\n | { kind: \"ruler\" }\n | { kind: \"header\"; trackIndex: number }\n | { kind: \"header-delete\"; trackIndex: number }\n | { kind: \"track-empty\"; trackIndex: number }\n | { kind: \"clip\"; trackIndex: number; clipId: string }\n | { kind: \"clip-handle-left\"; trackIndex: number; clipId: string }\n | { kind: \"clip-handle-right\"; trackIndex: number; clipId: string }\n | { kind: \"phantom-new-track\" }\n /** Drag the thumb itself — caller stores pointerStart + scrollStart. */\n | { kind: \"scrollbar-thumb-v\"; thumbY: number; thumbLen: number }\n | { kind: \"scrollbar-thumb-h\"; thumbX: number; thumbLen: number }\n /** Click the gutter (anywhere on the bar that isn't the thumb) →\n * page-jump by one viewport in the direction of the click. */\n | { kind: \"scrollbar-track-v\"; before: boolean }\n | { kind: \"scrollbar-track-h\"; before: boolean }\n | { kind: \"outside\" };\n\nexport interface HitContext {\n project: Project;\n pxPerSec: number;\n scrollLeft: number;\n scrollTop: number;\n showHeader: boolean;\n viewportWidth: number;\n viewportHeight: number;\n isDragging: boolean;\n}\n\n/**\n * Pixel → semantic target. Branches in roughly this order:\n * 1. Ruler band (top RULER_HEIGHT px) → scrub\n * 2. Header column (left HEADER_WIDTH px, when visible) → track header\n * 3. Track row contents → clip body / edge handle / empty space\n *\n * The handle-edge check is generous (HANDLE_PX) so users can grab a\n * trim handle even on a clip that's only a few px wide at low zoom.\n */\nexport function hitTest(x: number, y: number, ctx: HitContext): HitTarget {\n if (y < 0 || x < 0) return { kind: \"outside\" };\n\n // ---- Scrollbars first ----------------------------------------------\n // The bars overlay everything else, so a click on the thumb must NEVER\n // fall through to \"select clip\" / \"seek\". Check them before any other\n // region resolves.\n const baseX = ctx.showHeader ? HEADER_WIDTH : 0;\n const visibleH = ctx.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(ctx.project.tracks, ctx.isDragging);\n // Vertical bar\n if (\n contentH > visibleH &&\n x >= ctx.viewportWidth - SCROLLBAR_THICKNESS &&\n x < ctx.viewportWidth &&\n y >= RULER_HEIGHT &&\n y < ctx.viewportHeight - SCROLLBAR_THICKNESS\n ) {\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = contentH - visibleH;\n const thumbY =\n RULER_HEIGHT +\n SCROLLBAR_INSET +\n (maxScroll > 0 ? (ctx.scrollTop / maxScroll) * (trackLen - thumbLen) : 0);\n if (y >= thumbY && y <= thumbY + thumbLen) {\n return { kind: \"scrollbar-thumb-v\", thumbY, thumbLen };\n }\n return { kind: \"scrollbar-track-v\", before: y < thumbY };\n }\n // Horizontal bar\n const visibleW = ctx.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(ctx.project, ctx.pxPerSec);\n if (\n contentW > visibleW &&\n y >= ctx.viewportHeight - SCROLLBAR_THICKNESS &&\n y < ctx.viewportHeight &&\n x >= baseX &&\n x < ctx.viewportWidth - SCROLLBAR_THICKNESS\n ) {\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = contentW - visibleW;\n const thumbX =\n baseX +\n SCROLLBAR_INSET +\n (maxScroll > 0\n ? (ctx.scrollLeft / maxScroll) * (trackLen - thumbLen)\n : 0);\n if (x >= thumbX && x <= thumbX + thumbLen) {\n return { kind: \"scrollbar-thumb-h\", thumbX, thumbLen };\n }\n return { kind: \"scrollbar-track-h\", before: x < thumbX };\n }\n\n if (ctx.showHeader && x < HEADER_WIDTH && y >= RULER_HEIGHT) {\n const ti = trackIndexAt(y, ctx.project.tracks.length, ctx.scrollTop);\n if (ti >= 0) {\n const track = ctx.project.tracks[ti]!;\n if (track.clips.length === 0) {\n const btnSize = 18;\n const btnLeft = HEADER_WIDTH - btnSize - 6;\n // Header rows are translated by -scrollTop when painted, so\n // their visible top in viewport coords is `trackY(i) - scrollTop`.\n const btnTop =\n RULER_HEIGHT + ti * 56 + (56 - btnSize) / 2 - ctx.scrollTop;\n if (\n x >= btnLeft &&\n x <= btnLeft + btnSize &&\n y >= btnTop &&\n y <= btnTop + btnSize\n ) {\n return { kind: \"header-delete\", trackIndex: ti };\n }\n }\n return { kind: \"header\", trackIndex: ti };\n }\n return { kind: \"outside\" };\n }\n\n if (y < RULER_HEIGHT) return { kind: \"ruler\" };\n\n const ti = trackIndexAt(y, ctx.project.tracks.length, ctx.scrollTop);\n if (ti < 0) return { kind: \"outside\" };\n const track = ctx.project.tracks[ti]!;\n const ms = xToMs(x, ctx.pxPerSec, ctx.scrollLeft, ctx.showHeader);\n\n // Closest clip whose timeline range contains `ms`, or whose edge is\n // within HANDLE_PX of the cursor (so resize handles are grabbable\n // even slightly outside the clip body).\n for (const clip of track.clips) {\n const start = clip.start;\n const end = clip.start + (clip.out - clip.in);\n const startX = msToXLocal(start, ctx);\n const endX = msToXLocal(end, ctx);\n\n if (x >= startX - HANDLE_PX && x <= startX + HANDLE_PX) {\n return { kind: \"clip-handle-left\", trackIndex: ti, clipId: clip.id };\n }\n if (x >= endX - HANDLE_PX && x <= endX + HANDLE_PX) {\n return { kind: \"clip-handle-right\", trackIndex: ti, clipId: clip.id };\n }\n if (ms >= start && ms < end) {\n return { kind: \"clip\", trackIndex: ti, clipId: clip.id };\n }\n }\n return { kind: \"track-empty\", trackIndex: ti };\n}\n\nfunction msToXLocal(ms: number, ctx: HitContext): number {\n const base = ctx.showHeader ? HEADER_WIDTH : 0;\n return base + (ms / 1000) * ctx.pxPerSec - ctx.scrollLeft;\n}\n","import { type Locale, mergeLocale } from \"../i18n.js\";\nimport { normalizeProject, projectDuration } from \"../model.js\";\nimport type { Clip, Ms, Project } from \"../types.js\";\nimport { ThumbnailRibbon } from \"../ui/thumbnails.js\";\nimport {\n drawAll,\n type DrawState,\n type DrawStyle,\n} from \"./draw.js\";\nimport { hitTest, type HitTarget } from \"./hit.js\";\nimport {\n HEADER_WIDTH,\n RULER_HEIGHT,\n SCROLLBAR_INSET,\n SCROLLBAR_MIN_THUMB,\n SCROLLBAR_THICKNESS,\n TRACK_HEIGHT,\n clampScale,\n contentHeight,\n contentWidth,\n findClip,\n snapTargets,\n trackIndexAt,\n wouldOverlap,\n xToMs,\n} from \"./layout.js\";\n\n/**\n * Public options for the standalone `Timeline` component. The class\n * is framework-agnostic — `@aicut/react` and `@aicut/vue` wrap it,\n * and the built-in `Editor` composes one internally for its timeline\n * panel. Reuse the same instance for a \"frame-picker\" use case by\n * loading a project with a single video clip and `readOnly: true`.\n */\nexport interface TimelineOptions {\n /** Host element. Will be wiped on init. */\n container: HTMLElement;\n project: Project;\n /** Pixels per second. Defaults to 80; auto-fits on mount when possible. */\n pxPerSec?: number;\n /** Initial playhead position. */\n time?: Ms;\n /** Initially selected clip. */\n selectedClipId?: string | null;\n /** Show the track-name header column (left). Default true. */\n showHeader?: boolean;\n /** Disable interactions — useful for read-only preview / frame picker. */\n readOnly?: boolean;\n /** Snap to clip edges + playhead when dragging. Default true. */\n snap?: boolean;\n /** Compute and apply fit-to-window on first project change. Default true. */\n autoFit?: boolean;\n /** UI string overrides (English defaults). Use `localeZh` for Chinese. */\n locale?: Partial<Locale>;\n /**\n * Render an empty 36px toolbar strip at the top of the host element\n * with `toolbarLeft` / `toolbarRight` flex slots. The library paints\n * NOTHING into either slot — hosts append their own controls (an\n * export button, a size/aspect dropdown, etc.). Default false; the\n * canvas takes the full host height when the toolbar is off, so\n * adopting the slot later is a non-breaking opt-in.\n */\n toolbar?: boolean;\n\n onSeek?: (timeMs: Ms) => void;\n onSelectClip?: (clipId: string | null) => void;\n onScaleChange?: (pxPerSec: number) => void;\n onDeleteTrack?: (trackId: string) => void;\n onMoveClip?: (\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ) => void;\n onResizeClip?: (\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ) => void;\n onChange?: (project: Project) => void;\n\n /**\n * Lets the host predict where a drop will actually land — used to\n * keep the drag-ghost visual honest. The Editor wires this to its\n * smart routing (intended → source → other → new track), so the\n * ghost shows the real outcome rather than just the user's hover.\n *\n * Return `{ trackIndex }` for an existing track, or\n * `{ wouldCreateNew: true }` for the auto-split case.\n */\n resolveDrop?: (\n clipId: string,\n intent: { start: Ms; intendedTrackIndex: number },\n ) => { trackIndex: number; wouldCreateNew: boolean };\n}\n\ninterface DragMove {\n kind: \"move\";\n clipId: string;\n trackIndex: number;\n pointerStartX: number;\n pointerStartY: number;\n originalStart: Ms;\n}\ninterface DragTrim {\n kind: \"trim-left\" | \"trim-right\";\n clipId: string;\n trackIndex: number;\n pointerStartX: number;\n originalStart: Ms;\n originalIn: Ms;\n originalOut: Ms;\n}\ninterface DragScrub {\n kind: \"scrub\";\n}\ntype DragCtx = DragMove | DragTrim | DragScrub;\n\nconst SNAP_PX = 8;\nconst DEFAULT_SCALE = 80;\nconst WHEEL_ZOOM_RATE = 0.012;\nconst SCROLLBAR_FADE_HOLD_MS = 800;\nconst SCROLLBAR_FADE_OUT_MS = 400;\n\n/**\n * Canvas-rendered, framework-free timeline. Owns ruler, multi-track\n * layout, headers, frame-thumbnails, playhead, snap, and all pointer\n * gestures. No DOM children for clips/ticks/etc — every pixel is\n * painted via 2D canvas, so even hundreds of clips render in <2ms.\n */\nexport class Timeline {\n private root: HTMLElement;\n private opts: TimelineOptions;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private thumbs: ThumbnailRibbon;\n private hiddenHost: HTMLDivElement;\n private toolbarEl: HTMLDivElement | null = null;\n /**\n * Public flex slot at the left of the top toolbar. `null` when\n * `toolbar` is disabled. Hosts append their own elements (e.g. a\n * size/aspect dropdown). React/Vue wrappers portal children here.\n */\n readonly toolbarLeft: HTMLDivElement | null = null;\n /** Right-side counterpart — conventionally used for export/save. */\n readonly toolbarRight: HTMLDivElement | null = null;\n\n private project: Project;\n private pxPerSec: number;\n private timeMs: Ms;\n private selectedClipId: string | null;\n private snapEnabled: boolean;\n private showHeader: boolean;\n private readOnly: boolean;\n private autoFitEnabled: boolean;\n private locale: Locale;\n\n private scrollLeft = 0;\n private scrollTop = 0;\n private viewportWidth = 0;\n private viewportHeight = 0;\n /**\n * `Date.now()` of the last interaction with each scrollbar (scroll\n * change OR hover OR drag). Drives the macOS-style fade — bars are\n * fully opaque for SCROLLBAR_FADE_HOLD_MS after activity, then ease\n * out over the next SCROLLBAR_FADE_OUT_MS.\n */\n private lastScrollInteractY = 0;\n private lastScrollInteractX = 0;\n private hoverScrollbarY = false;\n private hoverScrollbarX = false;\n /** When set, pointer is dragging a scrollbar thumb. */\n private scrollbarDrag: {\n axis: \"v\" | \"h\";\n pointerStart: number;\n scrollStart: number;\n } | null = null;\n private hoveredClipId: string | null = null;\n private hoveredTrackIndex: number | null = null;\n private hoverCursor: string = \"default\";\n private dropTargetTrackIndex: number | null = null;\n private snapX: number | null = null;\n private drag: DragCtx | null = null;\n /**\n * In-flight ghost of the clip being dragged. Decoupled from the\n * project data so the data stays clean and undo-able only commits\n * on release. Has both the proposed `start` (X) and `trackIndex`\n * (Y), so the rendered ghost follows the cursor across tracks.\n */\n private dragGhost: {\n clipId: string;\n ghostStart: Ms;\n ghostTrackIndex: number;\n wouldOverlap: boolean;\n } | null = null;\n /**\n * Most recent local pointer coords during a move drag — used by the\n * edge-autoscroll loop to re-run drop-target resolution between\n * pointermove events while scrollTop ticks under a stationary cursor.\n */\n private lastDragPointerX = 0;\n private lastDragPointerY = 0;\n private dragScrollRafPending = false;\n private rafPending = false;\n private hasAutoFitted = false;\n private resizeObs: ResizeObserver | null = null;\n private destroyed = false;\n\n static create(opts: TimelineOptions): Timeline {\n return new Timeline(opts);\n }\n\n constructor(opts: TimelineOptions) {\n this.opts = opts;\n this.root = opts.container;\n this.project = normalizeProject(opts.project);\n this.pxPerSec = clampScale(opts.pxPerSec ?? DEFAULT_SCALE);\n this.timeMs = opts.time ?? 0;\n this.selectedClipId = opts.selectedClipId ?? null;\n this.snapEnabled = opts.snap !== false;\n this.showHeader = opts.showHeader !== false;\n this.readOnly = opts.readOnly === true;\n this.autoFitEnabled = opts.autoFit !== false;\n this.locale = mergeLocale(opts.locale);\n\n this.root.classList.add(\"aicut-timeline-canvas\");\n this.root.innerHTML = \"\";\n this.root.style.position = this.root.style.position || \"relative\";\n\n // Toolbar strip — opt-in. When enabled the root becomes a flex\n // column so the toolbar reserves vertical space and the canvas\n // gets whatever's left via flex:1. When off, the canvas keeps\n // its old 100%-height layout — zero-cost for existing callers.\n if (opts.toolbar) {\n this.root.style.display = \"flex\";\n this.root.style.flexDirection = \"column\";\n const bar = document.createElement(\"div\");\n bar.className = \"aicut-timeline-toolbar\";\n const left = document.createElement(\"div\");\n left.className = \"aicut-timeline-toolbar-left\";\n const right = document.createElement(\"div\");\n right.className = \"aicut-timeline-toolbar-right\";\n bar.appendChild(left);\n bar.appendChild(right);\n this.root.appendChild(bar);\n this.toolbarEl = bar;\n (this as { toolbarLeft: HTMLDivElement | null }).toolbarLeft = left;\n (this as { toolbarRight: HTMLDivElement | null }).toolbarRight = right;\n }\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n if (opts.toolbar) {\n // Flex child: take remaining height; min-height:0 lets us shrink\n // below content size when the host is constrained.\n this.canvas.style.flex = \"1 1 0\";\n this.canvas.style.minHeight = \"0\";\n } else {\n this.canvas.style.height = \"100%\";\n }\n this.canvas.style.touchAction = \"none\";\n // No data-testid on the canvas itself — both the editor's and a\n // standalone frame-picker timeline would collide. Tests select via\n // the host element instead (e.g. `[data-testid=\"aicut-timeline\"] canvas`).\n this.root.appendChild(this.canvas);\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"2d context unavailable\");\n this.ctx = ctx;\n\n // Off-screen <video> elements for thumbnail extraction live here.\n this.hiddenHost = document.createElement(\"div\");\n this.hiddenHost.style.position = \"absolute\";\n this.hiddenHost.style.overflow = \"hidden\";\n this.hiddenHost.style.width = \"0\";\n this.hiddenHost.style.height = \"0\";\n this.hiddenHost.style.pointerEvents = \"none\";\n this.root.appendChild(this.hiddenHost);\n\n this.thumbs = new ThumbnailRibbon(this.hiddenHost, () =>\n this.scheduleRender(),\n );\n this.thumbs.syncSources(this.project.sources);\n\n this.attachPointer();\n this.attachWheel();\n this.attachResize();\n this.resizeCanvas();\n this.scheduleRender();\n }\n\n // ---- public API -----------------------------------------------------\n\n /**\n * Sync the project data. Does NOT reset the auto-fit latch — that's\n * what caused the editor-side zoom feedback loop: every Editor\n * mutation called `ui.render() → timeline.setProject()` which used\n * to reset auto-fit, refit on the next frame, emit a new scale,\n * which re-rendered… and round we went. Callers that genuinely\n * want a re-fit (e.g. when the host swaps to a brand-new project)\n * should call `refit()` explicitly.\n */\n setProject(p: Project): void {\n this.project = normalizeProject(p);\n this.thumbs.syncSources(this.project.sources);\n this.scheduleRender();\n }\n\n /** Force a re-fit on the next render. */\n refit(): void {\n if (!this.autoFitEnabled) return;\n this.hasAutoFitted = false;\n this.scheduleRender();\n }\n\n getProject(): Project {\n return JSON.parse(JSON.stringify(this.project)) as Project;\n }\n\n setTime(timeMs: Ms): void {\n this.timeMs = Math.max(0, timeMs);\n this.scheduleRender();\n }\n\n getTime(): Ms {\n return this.timeMs;\n }\n\n setScale(pxPerSec: number): void {\n const next = clampScale(pxPerSec);\n if (next === this.pxPerSec) return;\n this.pxPerSec = next;\n this.hasAutoFitted = true;\n this.scheduleRender();\n }\n\n getScale(): number {\n return this.pxPerSec;\n }\n\n setSelection(id: string | null): void {\n if (id === this.selectedClipId) return;\n this.selectedClipId = id;\n this.scheduleRender();\n }\n\n getSelection(): string | null {\n return this.selectedClipId;\n }\n\n setSnap(snap: boolean): void {\n this.snapEnabled = snap;\n }\n\n getSnap(): boolean {\n return this.snapEnabled;\n }\n\n setLocale(locale: Partial<Locale>): void {\n this.locale = mergeLocale(locale);\n this.scheduleRender();\n }\n\n /** Fit the project's full duration into the current viewport width. */\n fitToWindow(): void {\n const fit = this.computeFitScale();\n if (fit == null) return;\n this.pxPerSec = fit;\n this.hasAutoFitted = true;\n this.scrollLeft = 0;\n this.opts.onScaleChange?.(this.pxPerSec);\n this.scheduleRender();\n }\n\n /**\n * Test/debug introspection — pixel coordinates of every visible clip,\n * the playhead, and the headers. Because clips are canvas-painted\n * there are no DOM nodes to query in e2e; tests use this instead.\n * Exposed publicly so React/Vue wrappers can forward it to a ref.\n */\n getDebugInfo(): {\n pxPerSec: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n playheadX: number;\n clips: Array<{\n id: string;\n trackIndex: number;\n x: number;\n width: number;\n y: number;\n height: number;\n }>;\n } {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const clips: Array<{\n id: string;\n trackIndex: number;\n x: number;\n width: number;\n y: number;\n height: number;\n }> = [];\n for (let ti = 0; ti < this.project.tracks.length; ti++) {\n const t = this.project.tracks[ti]!;\n for (const c of t.clips) {\n const x = baseX + (c.start / 1000) * this.pxPerSec - this.scrollLeft;\n const width = ((c.out - c.in) / 1000) * this.pxPerSec;\n const y = RULER_HEIGHT + ti * TRACK_HEIGHT + 6;\n clips.push({\n id: c.id,\n trackIndex: ti,\n x,\n width,\n y,\n height: TRACK_HEIGHT - 12,\n });\n }\n }\n return {\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n playheadX:\n baseX + (this.timeMs / 1000) * this.pxPerSec - this.scrollLeft,\n clips,\n };\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.resizeObs?.disconnect();\n this.thumbs.destroy();\n this.root.innerHTML = \"\";\n this.root.classList.remove(\"aicut-timeline-canvas\");\n if (this.opts.toolbar) {\n this.root.style.display = \"\";\n this.root.style.flexDirection = \"\";\n }\n }\n\n // ---- size / layout --------------------------------------------------\n\n private resizeCanvas(): void {\n // Read the canvas's own box, not the root's — when the toolbar\n // strip is enabled the root flex-allots part of its height to it,\n // and the canvas's rect is the only honest source of the drawing\n // area. With no toolbar, canvas fills root, so this still matches.\n const rect = this.canvas.getBoundingClientRect();\n this.viewportWidth = Math.max(1, Math.floor(rect.width));\n this.viewportHeight = Math.max(\n Math.floor(rect.height) || RULER_HEIGHT + TRACK_HEIGHT + SCROLLBAR_THICKNESS,\n RULER_HEIGHT + TRACK_HEIGHT + SCROLLBAR_THICKNESS,\n );\n const dpr = window.devicePixelRatio || 1;\n this.canvas.width = Math.floor(this.viewportWidth * dpr);\n this.canvas.height = Math.floor(this.viewportHeight * dpr);\n this.canvas.style.height = `${this.viewportHeight}px`;\n this.ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n private computeFitScale(): number | null {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const w = this.viewportWidth - baseX - 24;\n const dur = projectDuration(this.project);\n if (w <= 0 || dur <= 0) return null;\n return clampScale(w / (dur / 1000));\n }\n\n private maxScrollLeft(): number {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const visibleW = this.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const cw = contentWidth(this.project, this.pxPerSec);\n return Math.max(0, cw - visibleW + 24);\n }\n\n private maxScrollTop(): number {\n const visibleH =\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const ch = contentHeight(this.project.tracks, this.drag?.kind === \"move\");\n return Math.max(0, ch - visibleH);\n }\n\n private clampScroll(): void {\n this.scrollLeft = Math.max(0, Math.min(this.scrollLeft, this.maxScrollLeft()));\n this.scrollTop = Math.max(0, Math.min(this.scrollTop, this.maxScrollTop()));\n }\n\n /**\n * Scrollbar opacity = full for SCROLLBAR_FADE_HOLD_MS after last\n * interaction, then linearly fades to 0 over SCROLLBAR_FADE_OUT_MS.\n * Hovering or actively dragging the bar pins opacity at 1. Returns\n * 0 if the bar isn't needed (content fits).\n */\n private scrollbarOpacity(axis: \"v\" | \"h\"): number {\n if (axis === \"v\" && this.maxScrollTop() <= 0) return 0;\n if (axis === \"h\" && this.maxScrollLeft() <= 0) return 0;\n if (\n (axis === \"v\" && (this.hoverScrollbarY || this.scrollbarDrag?.axis === \"v\")) ||\n (axis === \"h\" && (this.hoverScrollbarX || this.scrollbarDrag?.axis === \"h\"))\n ) {\n return 1;\n }\n const last = axis === \"v\" ? this.lastScrollInteractY : this.lastScrollInteractX;\n const elapsed = Date.now() - last;\n if (elapsed < SCROLLBAR_FADE_HOLD_MS) return 1;\n const fade = elapsed - SCROLLBAR_FADE_HOLD_MS;\n if (fade >= SCROLLBAR_FADE_OUT_MS) return 0;\n return 1 - fade / SCROLLBAR_FADE_OUT_MS;\n }\n\n /** Mark a scrollbar axis as just-touched so its fade timer restarts. */\n private touchScrollbar(axis: \"v\" | \"h\"): void {\n if (axis === \"v\") this.lastScrollInteractY = Date.now();\n else this.lastScrollInteractX = Date.now();\n this.scheduleRender();\n }\n\n // ---- rendering ------------------------------------------------------\n\n private scheduleRender(): void {\n if (this.rafPending) return;\n this.rafPending = true;\n requestAnimationFrame(() => {\n this.rafPending = false;\n if (this.destroyed) return;\n this.maybeAutoFit();\n this.resizeCanvas();\n this.clampScroll();\n drawAll(\n this.ctx,\n this.buildDrawState(),\n this.readStyle(),\n this.thumbs,\n );\n this.canvas.style.cursor = this.hoverCursor;\n this.maybeContinueFade();\n });\n }\n\n /**\n * Keep the raf loop alive while a scrollbar is still in its HOLD or\n * fade-out window. Without this, opacity is sampled once and the\n * bar would freeze at whatever value it had at the last input event\n * instead of smoothly fading out. Skipped when a bar is pinned\n * (hover or active drag) since opacity is constant there.\n */\n private maybeContinueFade(): void {\n const total = SCROLLBAR_FADE_HOLD_MS + SCROLLBAR_FADE_OUT_MS;\n const now = Date.now();\n const needV =\n this.maxScrollTop() > 0 &&\n !this.hoverScrollbarY &&\n this.scrollbarDrag?.axis !== \"v\" &&\n now - this.lastScrollInteractY < total;\n const needH =\n this.maxScrollLeft() > 0 &&\n !this.hoverScrollbarX &&\n this.scrollbarDrag?.axis !== \"h\" &&\n now - this.lastScrollInteractX < total;\n if (needV || needH) this.scheduleRender();\n }\n\n private maybeAutoFit(): void {\n if (!this.autoFitEnabled || this.hasAutoFitted) return;\n if (projectDuration(this.project) <= 0) return;\n const fit = this.computeFitScale();\n if (fit == null) return;\n this.hasAutoFitted = true;\n if (Math.abs(fit - this.pxPerSec) > 0.5) {\n this.pxPerSec = fit;\n this.opts.onScaleChange?.(fit);\n }\n }\n\n private buildDrawState(): DrawState {\n return {\n project: this.project,\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n scrollTop: this.scrollTop,\n timeMs: this.timeMs,\n selectedClipId: this.selectedClipId,\n hoveredClipId: this.hoveredClipId,\n hoveredTrackIndex: this.hoveredTrackIndex,\n dropTargetTrackIndex: this.dropTargetTrackIndex,\n isDragging: this.drag?.kind === \"move\",\n snapX: this.snapX,\n showHeader: this.showHeader,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n dragGhost: this.dragGhost,\n scrollbarOpacityY: this.scrollbarOpacity(\"v\"),\n scrollbarOpacityX: this.scrollbarOpacity(\"h\"),\n scrollbarActiveY: this.scrollbarDrag?.axis === \"v\",\n scrollbarActiveX: this.scrollbarDrag?.axis === \"h\",\n locale: this.locale,\n };\n }\n\n private readStyle(): DrawStyle {\n const cs = getComputedStyle(this.root);\n const v = (name: string, fallback: string) =>\n cs.getPropertyValue(name).trim() || fallback;\n return {\n bg: v(\"--aicut-controls-bg\", \"#1f1f22\"),\n border: v(\"--aicut-controls-border\", \"rgba(255,255,255,0.08)\"),\n // Pass the resolved text color straight through — draw.ts'\n // withAlpha can adjust it for tick / muted variants.\n text: v(\"--aicut-controls-text\", \"rgba(255,255,255,0.85)\"),\n textMuted: v(\"--color-muted\", \"#999999\"),\n trackBg: \"rgba(255,255,255,0.06)\",\n brand: v(\"--color-brand\", \"#ff3386\"),\n brandTo: v(\"--color-secondary\", \"#9a31f4\"),\n info: v(\"--color-info\", \"#1077ff\"),\n clipText: \"#fff\",\n selectedRing: v(\"--color-info\", \"#1077ff\"),\n playhead: v(\"--color-brand\", \"#ff3386\"),\n };\n }\n\n // ---- pointer / wheel ------------------------------------------------\n\n private attachPointer(): void {\n this.canvas.addEventListener(\"pointerdown\", (e) => this.onPointerDown(e));\n this.canvas.addEventListener(\"pointermove\", (e) => this.onPointerMove(e));\n this.canvas.addEventListener(\"pointerup\", (e) => this.onPointerUp(e));\n this.canvas.addEventListener(\"pointercancel\", (e) => this.onPointerUp(e));\n this.canvas.addEventListener(\"pointerleave\", () => {\n if (!this.drag && !this.scrollbarDrag) {\n this.hoveredClipId = null;\n this.hoverCursor = \"default\";\n this.hoverScrollbarY = false;\n this.hoverScrollbarX = false;\n this.scheduleRender();\n }\n });\n }\n\n private onPointerDown(e: PointerEvent): void {\n const { x, y } = this.localCoords(e);\n const target = this.hitTarget(x, y);\n this.canvas.setPointerCapture(e.pointerId);\n\n // Scrollbar hits are handled BEFORE readOnly / other targets so the\n // bar works as a regular scroll affordance even in frame-picker mode.\n if (target.kind === \"scrollbar-thumb-v\") {\n this.scrollbarDrag = {\n axis: \"v\",\n pointerStart: y,\n scrollStart: this.scrollTop,\n };\n this.touchScrollbar(\"v\");\n return;\n }\n if (target.kind === \"scrollbar-thumb-h\") {\n this.scrollbarDrag = {\n axis: \"h\",\n pointerStart: x,\n scrollStart: this.scrollLeft,\n };\n this.touchScrollbar(\"h\");\n return;\n }\n if (target.kind === \"scrollbar-track-v\") {\n const page = Math.max(\n TRACK_HEIGHT,\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS,\n );\n this.scrollTop += target.before ? -page : page;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n return;\n }\n if (target.kind === \"scrollbar-track-h\") {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const page = Math.max(\n 80,\n this.viewportWidth - baseX - SCROLLBAR_THICKNESS,\n );\n this.scrollLeft += target.before ? -page : page;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n return;\n }\n\n // Read-only mode (e.g. frame-picker) — every click in the track\n // area becomes a seek. Drag = scrub. No selection / move / trim.\n if (this.readOnly) {\n if (\n target.kind === \"ruler\" ||\n target.kind === \"clip\" ||\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\" ||\n target.kind === \"track-empty\"\n ) {\n this.drag = { kind: \"scrub\" };\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n }\n return;\n }\n\n if (target.kind === \"header-delete\") {\n const t = this.project.tracks[target.trackIndex];\n if (t) this.opts.onDeleteTrack?.(t.id);\n return;\n }\n\n if (target.kind === \"header\") return;\n\n if (target.kind === \"ruler\") {\n this.drag = { kind: \"scrub\" };\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n return;\n }\n\n if (target.kind === \"clip\") {\n const found = findClip(this.project, target.clipId);\n if (!found) return;\n this.selectedClipId = target.clipId;\n this.opts.onSelectClip?.(target.clipId);\n this.drag = {\n kind: \"move\",\n clipId: target.clipId,\n trackIndex: target.trackIndex,\n pointerStartX: x,\n pointerStartY: y,\n originalStart: found.clip.start,\n };\n this.scheduleRender();\n return;\n }\n\n if (\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\"\n ) {\n const found = findClip(this.project, target.clipId);\n if (!found) return;\n this.selectedClipId = target.clipId;\n this.opts.onSelectClip?.(target.clipId);\n this.drag = {\n kind: target.kind === \"clip-handle-left\" ? \"trim-left\" : \"trim-right\",\n clipId: target.clipId,\n trackIndex: target.trackIndex,\n pointerStartX: x,\n originalStart: found.clip.start,\n originalIn: found.clip.in,\n originalOut: found.clip.out,\n };\n this.scheduleRender();\n return;\n }\n\n if (target.kind === \"track-empty\") {\n // Bare-track click = deselect + seek to clicked time.\n this.selectedClipId = null;\n this.opts.onSelectClip?.(null);\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.drag = { kind: \"scrub\" };\n this.scheduleRender();\n return;\n }\n }\n\n private onPointerMove(e: PointerEvent): void {\n const { x, y } = this.localCoords(e);\n\n // Scrollbar thumb drag has priority — pointer delta along the bar's\n // axis maps to a scroll delta scaled by (maxScroll / freeTrackLen).\n // freeTrackLen is the gutter length minus the thumb length, i.e.\n // how far the thumb can actually travel.\n if (this.scrollbarDrag) {\n if (this.scrollbarDrag.axis === \"v\") {\n const visibleH =\n this.viewportHeight - RULER_HEIGHT - SCROLLBAR_THICKNESS;\n const contentH = contentHeight(\n this.project.tracks,\n this.drag?.kind === \"move\",\n );\n const trackLen = visibleH - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleH / contentH),\n );\n const maxScroll = Math.max(0, contentH - visibleH);\n const free = Math.max(1, trackLen - thumbLen);\n const ratio = maxScroll / free;\n this.scrollTop =\n this.scrollbarDrag.scrollStart +\n (y - this.scrollbarDrag.pointerStart) * ratio;\n } else {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n const visibleW = this.viewportWidth - baseX - SCROLLBAR_THICKNESS;\n const contentW = contentWidth(this.project, this.pxPerSec);\n const trackLen = visibleW - SCROLLBAR_INSET * 2;\n const thumbLen = Math.max(\n SCROLLBAR_MIN_THUMB,\n trackLen * (visibleW / contentW),\n );\n const maxScroll = Math.max(0, contentW - visibleW);\n const free = Math.max(1, trackLen - thumbLen);\n const ratio = maxScroll / free;\n this.scrollLeft =\n this.scrollbarDrag.scrollStart +\n (x - this.scrollbarDrag.pointerStart) * ratio;\n }\n this.clampScroll();\n this.touchScrollbar(this.scrollbarDrag.axis);\n return;\n }\n\n if (!this.drag) {\n // Hover-only — update cursor + hoveredClipId + hoveredTrackIndex.\n const target = this.hitTarget(x, y);\n let nextHover: string | null = null;\n let nextHoverTrack: number | null = null;\n let cursor = \"default\";\n let onScrollbarV = false;\n let onScrollbarH = false;\n if (target.kind === \"clip\") {\n nextHover = target.clipId;\n nextHoverTrack = target.trackIndex;\n cursor = this.readOnly ? \"pointer\" : \"grab\";\n } else if (\n target.kind === \"clip-handle-left\" ||\n target.kind === \"clip-handle-right\"\n ) {\n nextHover = target.clipId;\n nextHoverTrack = target.trackIndex;\n cursor = \"ew-resize\";\n } else if (target.kind === \"ruler\") {\n cursor = \"ew-resize\";\n } else if (target.kind === \"track-empty\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"crosshair\";\n } else if (target.kind === \"header\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"default\";\n } else if (target.kind === \"header-delete\") {\n nextHoverTrack = target.trackIndex;\n cursor = \"pointer\";\n } else if (\n target.kind === \"scrollbar-thumb-v\" ||\n target.kind === \"scrollbar-track-v\"\n ) {\n onScrollbarV = true;\n cursor = \"default\";\n } else if (\n target.kind === \"scrollbar-thumb-h\" ||\n target.kind === \"scrollbar-track-h\"\n ) {\n onScrollbarH = true;\n cursor = \"default\";\n }\n const hoverChanged =\n onScrollbarV !== this.hoverScrollbarY ||\n onScrollbarH !== this.hoverScrollbarX;\n if (\n nextHover !== this.hoveredClipId ||\n nextHoverTrack !== this.hoveredTrackIndex ||\n cursor !== this.hoverCursor ||\n hoverChanged\n ) {\n this.hoveredClipId = nextHover;\n this.hoveredTrackIndex = nextHoverTrack;\n this.hoverCursor = cursor;\n this.hoverScrollbarY = onScrollbarV;\n this.hoverScrollbarX = onScrollbarH;\n this.scheduleRender();\n }\n return;\n }\n\n if (this.drag.kind === \"scrub\") {\n const ms = this.applySnap(\n xToMs(x, this.pxPerSec, this.scrollLeft, this.showHeader),\n null,\n );\n this.timeMs = ms;\n this.opts.onSeek?.(ms);\n this.scheduleRender();\n return;\n }\n\n if (this.drag.kind === \"move\") {\n this.lastDragPointerX = x;\n this.lastDragPointerY = y;\n this.processMoveDrag(x, y);\n this.scheduleRender();\n this.maybeStartDragAutoScroll();\n return;\n }\n\n if (this.drag.kind === \"trim-left\" || this.drag.kind === \"trim-right\") {\n const dxPx = x - this.drag.pointerStartX;\n const dxMs = (dxPx / this.pxPerSec) * 1000;\n const found = findClip(this.project, this.drag.clipId);\n if (!found) return;\n const c = found.clip;\n if (this.drag.kind === \"trim-left\") {\n // Move start + in by the same delta; clip's right edge stays put.\n let nextStart = Math.max(0, this.drag.originalStart + dxMs);\n nextStart = this.applySnap(nextStart, this.drag.clipId);\n const delta = nextStart - this.drag.originalStart;\n const nextIn = Math.max(\n 0,\n Math.min(this.drag.originalIn + delta, this.drag.originalOut - 50),\n );\n const adjStart = this.drag.originalStart + (nextIn - this.drag.originalIn);\n c.in = nextIn;\n c.start = adjStart;\n } else {\n // trim-right — move out only.\n const nextOut = Math.max(\n this.drag.originalIn + 50,\n this.drag.originalOut + dxMs,\n );\n c.out = nextOut;\n }\n this.scheduleRender();\n return;\n }\n }\n\n /**\n * Update dragGhost + dropTargetTrackIndex for the in-flight move\n * drag, given the current viewport pointer position. Pulled out of\n * onPointerMove so the edge-autoscroll loop can re-run it on each\n * tick — autoscroll moves scrollTop under a stationary cursor, and\n * the ghost must follow the new row under that cursor.\n */\n private processMoveDrag(x: number, y: number): void {\n if (!this.drag || this.drag.kind !== \"move\") return;\n const drag = this.drag;\n const dxPx = x - drag.pointerStartX;\n const dxMs = (dxPx / this.pxPerSec) * 1000;\n let nextStart = Math.max(0, drag.originalStart + dxMs);\n nextStart = this.applySnap(nextStart, drag.clipId);\n\n const tiRaw = this.trackIndexAtY(y);\n const phantomIdx = this.project.tracks.length;\n const phantomScreenY =\n RULER_HEIGHT + phantomIdx * TRACK_HEIGHT - this.scrollTop;\n const onPhantom =\n y >= phantomScreenY && y < phantomScreenY + TRACK_HEIGHT;\n const intendedTrackIndex = onPhantom\n ? phantomIdx\n : tiRaw >= 0\n ? tiRaw\n : drag.trackIndex;\n\n let ghostTrackIndex = intendedTrackIndex;\n let overlap = false;\n if (onPhantom) {\n ghostTrackIndex = phantomIdx;\n overlap = true;\n } else if (this.opts.resolveDrop) {\n const r = this.opts.resolveDrop(drag.clipId, {\n start: nextStart,\n intendedTrackIndex,\n });\n ghostTrackIndex = r.trackIndex;\n overlap = r.wouldCreateNew;\n } else {\n const found = findClip(this.project, drag.clipId);\n const dur = found ? found.clip.out - found.clip.in : 0;\n const targetTrack = this.project.tracks[intendedTrackIndex];\n overlap = targetTrack\n ? wouldOverlap(targetTrack, drag.clipId, nextStart, nextStart + dur)\n : false;\n }\n\n this.dragGhost = {\n clipId: drag.clipId,\n ghostStart: nextStart,\n ghostTrackIndex,\n wouldOverlap: overlap,\n };\n this.dropTargetTrackIndex =\n ghostTrackIndex !== drag.trackIndex ? ghostTrackIndex : null;\n }\n\n /**\n * Px-per-frame scroll speed when the pointer is in a vertical edge\n * zone of the track region. Returns 0 outside the zone. Speed ramps\n * linearly from 0 at the zone's inner edge to ~16 px/frame at the\n * outer edge, so brushing the edge gives a gentle nudge and parking\n * deep at it gives a brisk auto-scroll.\n */\n private dragScrollSpeedY(): number {\n if (!this.drag || this.drag.kind !== \"move\") return 0;\n const y = this.lastDragPointerY;\n const top = RULER_HEIGHT;\n const bottom = this.viewportHeight - SCROLLBAR_THICKNESS;\n const zone = 36;\n const maxSpeed = 16;\n if (y >= top && y < top + zone) {\n // Top zone — scroll up (decrease scrollTop), but only if there's\n // somewhere to go (otherwise the loop would tick forever).\n if (this.scrollTop <= 0) return 0;\n const depth = (top + zone - y) / zone;\n return -Math.max(2, maxSpeed * depth);\n }\n if (y <= bottom && y > bottom - zone) {\n if (this.scrollTop >= this.maxScrollTop()) return 0;\n const depth = (y - (bottom - zone)) / zone;\n return Math.max(2, maxSpeed * depth);\n }\n return 0;\n }\n\n /**\n * Drive vertical auto-scroll while the user holds a clip near the\n * top/bottom edge of the track area. Self-stopping — exits the loop\n * once the pointer leaves the zone, the drag ends, or scroll bottoms\n * out at the clamp.\n */\n private maybeStartDragAutoScroll(): void {\n if (this.dragScrollRafPending) return;\n if (this.dragScrollSpeedY() === 0) return;\n this.dragScrollRafPending = true;\n requestAnimationFrame(() => {\n this.dragScrollRafPending = false;\n if (this.destroyed) return;\n const speed = this.dragScrollSpeedY();\n if (speed === 0 || !this.drag || this.drag.kind !== \"move\") return;\n this.scrollTop += speed;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n this.processMoveDrag(this.lastDragPointerX, this.lastDragPointerY);\n this.scheduleRender();\n this.maybeStartDragAutoScroll();\n });\n }\n\n private onPointerUp(_e: PointerEvent): void {\n if (this.scrollbarDrag) {\n const axis = this.scrollbarDrag.axis;\n this.scrollbarDrag = null;\n this.touchScrollbar(axis);\n return;\n }\n if (!this.drag) return;\n const drag = this.drag;\n const ghost = this.dragGhost;\n this.drag = null;\n this.dragGhost = null;\n this.dropTargetTrackIndex = null;\n this.snapX = null;\n\n if (drag.kind === \"move\") {\n if (ghost) {\n const isPhantom = ghost.ghostTrackIndex >= this.project.tracks.length;\n const finalTrackId = isPhantom\n ? undefined\n : ghost.ghostTrackIndex !== drag.trackIndex\n ? this.project.tracks[ghost.ghostTrackIndex]?.id\n : undefined;\n this.opts.onMoveClip?.(drag.clipId, {\n start: ghost.ghostStart,\n trackId: finalTrackId,\n // Phantom row drop is the user explicitly asking for a new\n // track — bypass the editor's smart routing in that case\n // (which would otherwise route back to the source track and\n // make the gesture a no-op).\n newTrack: isPhantom,\n });\n this.opts.onChange?.(this.getProject());\n }\n } else if (drag.kind === \"trim-left\" || drag.kind === \"trim-right\") {\n const found = findClip(this.project, drag.clipId);\n if (found) {\n this.opts.onResizeClip?.(drag.clipId, {\n in: found.clip.in,\n out: found.clip.out,\n start: found.clip.start,\n });\n this.opts.onChange?.(this.getProject());\n }\n }\n this.scheduleRender();\n }\n\n private attachWheel(): void {\n this.canvas.addEventListener(\n \"wheel\",\n (e) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const rect = this.canvas.getBoundingClientRect();\n const cursorX = e.clientX - rect.left;\n const anchorMs = xToMs(\n cursorX,\n this.pxPerSec,\n this.scrollLeft,\n this.showHeader,\n );\n const dy = Math.max(-50, Math.min(50, e.deltaY));\n const factor = Math.exp(-dy * WHEEL_ZOOM_RATE);\n const next = clampScale(this.pxPerSec * factor);\n if (Math.abs(next - this.pxPerSec) < 0.01) return;\n this.pxPerSec = next;\n this.hasAutoFitted = true;\n // Re-anchor: keep the time under the cursor visually pinned.\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n this.scrollLeft =\n (anchorMs / 1000) * this.pxPerSec - (cursorX - baseX);\n this.clampScroll();\n this.touchScrollbar(\"h\");\n this.opts.onScaleChange?.(this.pxPerSec);\n this.scheduleRender();\n return;\n }\n // Pan. Trackpad horizontal swipe (|deltaX|>|deltaY|) → X axis.\n // Otherwise vertical wheel/swipe → Y axis when tracks overflow,\n // falling through to X when there's no Y to scroll (preserves\n // the single-track UX where a mouse wheel pans horizontally).\n const horizDominant = Math.abs(e.deltaX) > Math.abs(e.deltaY);\n if (horizDominant) {\n if (e.deltaX === 0) return;\n e.preventDefault();\n this.scrollLeft += e.deltaX;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n this.scheduleRender();\n return;\n }\n if (e.deltaY === 0) return;\n e.preventDefault();\n if (this.maxScrollTop() > 0) {\n this.scrollTop += e.deltaY;\n this.clampScroll();\n this.touchScrollbar(\"v\");\n } else {\n this.scrollLeft += e.deltaY;\n this.clampScroll();\n this.touchScrollbar(\"h\");\n }\n this.scheduleRender();\n },\n { passive: false },\n );\n }\n\n private attachResize(): void {\n if (typeof ResizeObserver === \"undefined\") return;\n this.resizeObs = new ResizeObserver(() => {\n this.resizeCanvas();\n if (!this.hasAutoFitted && this.autoFitEnabled) {\n const fit = this.computeFitScale();\n if (fit != null) {\n this.pxPerSec = fit;\n this.opts.onScaleChange?.(fit);\n }\n }\n this.scheduleRender();\n });\n this.resizeObs.observe(this.root);\n }\n\n // ---- helpers --------------------------------------------------------\n\n private localCoords(e: PointerEvent): { x: number; y: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n private hitTarget(x: number, y: number): HitTarget {\n return hitTest(x, y, {\n project: this.project,\n pxPerSec: this.pxPerSec,\n scrollLeft: this.scrollLeft,\n scrollTop: this.scrollTop,\n showHeader: this.showHeader,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n isDragging: this.drag?.kind === \"move\",\n });\n }\n\n private trackIndexAtY(y: number): number {\n return trackIndexAt(y, this.project.tracks.length, this.scrollTop);\n }\n\n private applySnap(ms: Ms, ignoreClipId: string | null): Ms {\n if (!this.snapEnabled) {\n this.snapX = null;\n return ms;\n }\n const tolMs = Math.max(20, (SNAP_PX / this.pxPerSec) * 1000);\n const targets = snapTargets(this.project, this.timeMs, ignoreClipId);\n let best = ms;\n let bestDist = tolMs;\n for (const t of targets) {\n const d = Math.abs(t - ms);\n if (d < bestDist) {\n bestDist = d;\n best = t;\n }\n }\n if (best !== ms) {\n const baseX = this.showHeader ? HEADER_WIDTH : 0;\n this.snapX = baseX + (best / 1000) * this.pxPerSec - this.scrollLeft;\n } else {\n this.snapX = null;\n }\n return best;\n }\n}\n\n// Expose helpers from layout.ts via a deep import for consumers who\n// want the px math without instantiating Timeline.\nexport { TRACK_HEIGHT, RULER_HEIGHT, HEADER_WIDTH } from \"./layout.js\";\n","/**\n * Inline SVG icon set. Strings, not JSX, since core has no framework.\n * Each icon is 14×14 paint-area inside a 16×16 viewbox; `currentColor`\n * so toolbar buttons can recolor by `color`.\n */\n\nconst wrap = (path: string) =>\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">${path}</svg>`;\n\nexport const ICONS = {\n undo: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.66577 1.38721L2.85034 4.20264H9.64624C11.8471 4.20264 13.6313 5.98724 13.6316 8.18799C13.6315 10.3889 11.8472 12.1733 9.64624 12.1733H7.19116V11.1235H9.64624C11.2673 11.1235 12.5817 9.80904 12.5818 8.18799C12.5815 6.56714 11.2672 5.25342 9.64624 5.25342H2.85034L5.66577 8.06885L4.92358 8.81201L0.8396 4.72803L4.92358 0.644043L5.66577 1.38721Z\" fill=\"currentColor\"/></g>`,\n ),\n redo: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M8.55005 2.04655L11.3659 4.86239L4.56982 4.86239C2.36897 4.86251 0.584578 6.64687 0.584473 8.84774C0.584646 11.0485 2.36901 12.833 4.56982 12.8331L7.0245 12.8331L7.0245 11.7832H4.56982C2.94891 11.7831 1.63453 10.4686 1.63436 8.84774C1.63446 7.22677 2.94886 5.91297 4.56982 5.91284H11.3659L8.55005 8.72811L9.29289 9.47095L13.3768 5.38761L9.29289 1.30371L8.55005 2.04655Z\" fill=\"currentColor\"/></g>`,\n ),\n split: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.7168 12.7754H1.75V11.7246H4.68164V2.27539H1.75V1.22461H5.7168V12.7754ZM12.25 2.27539H9.31836V11.7246H12.25V12.7754H8.2832V1.22461H12.25V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n trimLeft: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M2.7998 12.7754H1.75V11.7246H2.7998V12.7754ZM4.25781 12.7754H3.20801V11.7246H4.25781V12.7754ZM5.7168 12.7754H4.66699V11.7246H5.7168V12.7754ZM12.25 2.27539H9.31836V11.7246H12.25V12.7754H8.2832V1.22461H12.25V2.27539ZM5.7168 11.0254H4.66699V9.97461H5.7168V11.0254ZM5.7168 9.27539H4.66699V8.22461H5.7168V9.27539ZM5.7168 7.52539H4.66699V6.47461H5.7168V7.52539ZM5.7168 5.77539H4.66699V4.72461H5.7168V5.77539ZM5.7168 4.02539H4.66699V2.97461H5.7168V4.02539ZM2.7998 2.27539H1.75V1.22461H2.7998V2.27539ZM4.25781 2.27539H3.20801V1.22461H4.25781V2.27539ZM5.7168 2.27539H4.66699V1.22461H5.7168V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n trimRight: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M5.7168 12.7754H1.75V11.7246H4.68164V2.27539H1.75V1.22461H5.7168V12.7754ZM9.33301 12.7754H8.2832V11.7246H9.33301V12.7754ZM10.792 12.7754H9.74219V11.7246H10.792V12.7754ZM12.25 12.7754H11.2002V11.7246H12.25V12.7754ZM9.33301 11.0254H8.2832V9.97461H9.33301V11.0254ZM9.33301 9.27539H8.2832V8.22461H9.33301V9.27539ZM9.33301 7.52539H8.2832V6.47461H9.33301V7.52539ZM9.33301 5.77539H8.2832V4.72461H9.33301V5.77539ZM9.33301 4.02539H8.2832V2.97461H9.33301V4.02539ZM9.33301 2.27539H8.2832V1.22461H9.33301V2.27539ZM10.792 2.27539H9.74219V1.22461H10.792V2.27539ZM12.25 2.27539H11.2002V1.22461H12.25V2.27539Z\" fill=\"currentColor\"/></g>`,\n ),\n speed: wrap(\n `<g transform=\"translate(1 1)\"><path d=\"M7.00175 0.595229C7.32353 0.596316 7.58439 0.858333 7.58378 1.18019C7.583 1.50212 7.32071 1.76265 6.99882 1.76222C6.45361 1.76108 5.90722 1.8449 5.38065 2.01417C4.23393 2.38294 3.24874 3.13519 2.59061 4.14406C1.93249 5.15302 1.64169 6.35801 1.76639 7.55617C1.89121 8.75413 2.4235 9.87343 3.27518 10.7251C4.12694 11.5767 5.24613 12.1092 6.44413 12.2339C7.6422 12.3585 8.84735 12.0678 9.85624 11.4097C10.8649 10.7516 11.6173 9.76618 11.9861 8.61964C12.5967 6.72047 12.1219 5.04361 11.0633 3.76124L8.57792 6.24757C8.68682 6.4756 8.74974 6.72999 8.74979 6.99953C8.74979 7.9659 7.96612 8.74933 6.99979 8.74953C6.03345 8.74934 5.24979 7.96591 5.24979 6.99953C5.24997 6.03329 6.03356 5.24971 6.99979 5.24953C7.26941 5.24958 7.52464 5.31244 7.75272 5.4214L10.6707 2.50441L10.7137 2.46535C10.8174 2.38043 10.9485 2.33351 11.0838 2.33351C11.2382 2.33369 11.3867 2.39519 11.4959 2.50441C13.0855 4.09426 13.9307 6.38102 13.0965 8.97609C12.6458 10.3776 11.726 11.5819 10.493 12.3862C9.25989 13.1905 7.7873 13.5464 6.32303 13.3941C4.8588 13.2416 3.49099 12.5903 2.44999 11.5493C1.40904 10.5083 0.757676 9.14058 0.605261 7.67628C0.452904 6.21196 0.808759 4.73947 1.61307 3.50636C2.41742 2.27338 3.62178 1.35455 5.02323 0.903823C5.66695 0.696861 6.33524 0.593807 7.00175 0.595229Z\" fill=\"currentColor\"/></g>`,\n ),\n play: wrap(\n // Triangle bbox center at viewBox x=9.4 vs viewBox center 8 — the\n // raw path leans right. Optical centering: translate by half the\n // bbox offset (-0.7) so the centroid stays near 7.5 (slight left\n // of center, which the eye accepts as balanced for a right-pointing\n // triangle) while the bbox is no longer obviously off to one side.\n `<g transform=\"translate(-0.7 0)\"><path d=\"M4.66699 2.64248C4.66717 1.82358 5.59736 1.35167 6.25781 1.83584L13.5674 7.19619C14.1117 7.59579 14.1118 8.40897 13.5674 8.8085L6.25781 14.1688C5.59734 14.6528 4.6671 14.1811 4.66699 13.3622V2.64248Z\" fill=\"currentColor\"/></g>`,\n ),\n pause: wrap(\n `<path d=\"M4 3h2.5v10H4V3zm5.5 0H12v10H9.5V3z\" fill=\"currentColor\"/>`,\n ),\n fullscreen:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 3H5a2 2 0 00-2 2v3\"/><path d=\"M21 8V5a2 2 0 00-2-2h-3\"/><path d=\"M3 16v3a2 2 0 002 2h3\"/><path d=\"M16 21h3a2 2 0 002-2v-3\"/></svg>`,\n snap:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M8.275.783a5.07 5.07 0 0 1 4.929 4.927 5.07 5.07 0 0 1-1.311 3.542l-3.937 3.95a.526.526 0 0 1-.744 0l-2.334-2.334a.525.525 0 0 1 .001-.743l2.55-2.538a.5.5 0 0 1 .171-.17l.976-.97a.723.723 0 0 0-1.01-1.008L3.87 9.12a.526.526 0 0 1-.743 0L.795 6.784a.526.526 0 0 1 0-.742l3.937-3.95.022-.02a5.07 5.07 0 0 1 3.52-1.29m-2.281 9.715 1.588 1.589 1.884-1.889-1.583-1.583zm2.253-8.666a4.02 4.02 0 0 0-2.785 1.017l-.936.939 1.602 1.603.729-.726.052-.045a1.776 1.776 0 0 1 2.33.154 1.775 1.775 0 0 1 .155 2.332 1 1 0 0 1-.046.053l-.72.716 1.58 1.58.924-.929a4.019 4.019 0 0 0-2.885-6.694M1.909 6.413 3.5 8.005 5.384 6.13l-1.6-1.6z\"/></svg>`,\n zoomOut:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 20.2618 20.2564\" fill=\"none\" aria-hidden=\"true\"><path d=\"M9 0C13.9706 0 18 4.02944 18 9C18 11.1612 17.2374 13.1438 15.9678 14.6953L19.998 18.7197C20.3494 19.071 20.3498 19.6404 19.999 19.9922C19.6476 20.3441 19.0775 20.3446 18.7256 19.9932L14.6953 15.9678C13.1438 17.2374 11.1612 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0ZM9 1.7998C5.02355 1.7998 1.7998 5.02355 1.7998 9C1.7998 12.9765 5.02355 16.2002 9 16.2002C12.9765 16.2002 16.2002 12.9765 16.2002 9C16.2002 5.02355 12.9765 1.7998 9 1.7998ZM12.5996 8.09961C13.0969 8.09961 13.5 8.50273 13.5 9C13.5 9.49727 13.0969 9.90039 12.5996 9.90039H5.40039C4.90312 9.90039 4.5 9.49727 4.5 9C4.5 8.50273 4.90312 8.09961 5.40039 8.09961H12.5996Z\" fill=\"currentColor\"/></svg>`,\n zoomIn:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 20.2613 20.2565\" fill=\"none\" aria-hidden=\"true\"><path d=\"M9 0C13.9705 6.59711e-05 18 4.02948 18 9C18 11.1612 17.2374 13.1438 15.9678 14.6953L19.9971 18.7197C20.3489 19.0711 20.3494 19.6403 19.998 19.9922C19.6466 20.3441 19.0765 20.3446 18.7246 19.9932L14.6953 15.9678C13.1438 17.2374 11.1611 18 9 18C4.02944 18 0 13.9706 0 9C0 4.02944 4.02944 0 9 0ZM9 1.7998C5.02355 1.7998 1.7998 5.02355 1.7998 9C1.7998 12.9765 5.02355 16.2002 9 16.2002C12.9764 16.2001 16.2002 12.9764 16.2002 9C16.2002 5.02359 12.9764 1.79987 9 1.7998ZM8.99512 4.50488C9.49233 4.50495 9.89551 4.90804 9.89551 5.40527V8.09961H12.5996C13.0968 8.09968 13.5 8.50277 13.5 9C13.5 9.49723 13.0968 9.90032 12.5996 9.90039H9.89551V12.6045C9.89551 13.1017 9.49233 13.5048 8.99512 13.5049C8.49785 13.5049 8.09473 13.1018 8.09473 12.6045V9.90039H5.40039C4.90312 9.90039 4.5 9.49727 4.5 9C4.5 8.50273 4.90312 8.09961 5.40039 8.09961H8.09473V5.40527C8.09473 4.908 8.49785 4.50488 8.99512 4.50488Z\" fill=\"currentColor\"/></svg>`,\n export:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n addTrack: wrap(\n `<g transform=\"translate(2 2)\"><rect x=\"0\" y=\"1.5\" width=\"12\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\"/><rect x=\"0\" y=\"8\" width=\"12\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.55\"/><circle cx=\"10\" cy=\"10\" r=\"3.4\" fill=\"currentColor\"/><rect x=\"9.4\" y=\"8.5\" width=\"1.2\" height=\"3\" rx=\"0.4\" fill=\"#fff\"/><rect x=\"8.5\" y=\"9.4\" width=\"3\" height=\"1.2\" rx=\"0.4\" fill=\"#fff\"/></g>`,\n ),\n trash: wrap(\n `<g transform=\"translate(1 1)\" fill=\"currentColor\"><path d=\"M5 1.25h4v.9H13v1.05H1V2.15h4v-.9zM2.4 4.1h9.2l-.65 8.9c-.04.55-.5.96-1.05.96H4.1c-.55 0-1.01-.41-1.05-.96L2.4 4.1zm2.3 1.7l.35 7.1h1l-.35-7.1h-1zm2.65 0v7.1h1V5.8h-1zm2.3 0l-.35 7.1h1l.35-7.1h-1z\"/></g>`,\n ),\n /** Counter-clockwise circular arrow — \"reset to initial layout\". */\n reset:\n `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"1 4 1 10 7 10\"/><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"/></svg>`,\n};\n\nexport type IconName = keyof typeof ICONS;\n","import type { Locale } from \"../i18n.js\";\nimport { fmtClock } from \"./format.js\";\nimport { ICONS, type IconName } from \"./icons.js\";\n\nconst SCALE_MIN = 10;\nconst SCALE_MAX = 400;\n\nexport interface ToolbarCallbacks {\n onUndo: () => void;\n onRedo: () => void;\n onSplit: () => void;\n onTrimLeft: () => void;\n onTrimRight: () => void;\n onPlayToggle: () => void;\n onFullscreen: () => void;\n onReset: () => void;\n onSnapToggle: () => void;\n onScaleChange: (pxPerSec: number) => void;\n}\n\ninterface ToolbarState {\n playing: boolean;\n time: number;\n duration: number;\n canUndo: boolean;\n canRedo: boolean;\n canSplit: boolean;\n canTrim: boolean;\n snap: boolean;\n pxPerSec: number;\n}\n\n/**\n * Top toolbar — three groups laid out per the reference:\n * left: [undo] [redo] [split] [trim-left] [trim-right] [speed]\n * center: [time] ▶ [duration] [fullscreen]\n * right: [snap] [zoom-out] [zoom-slider] [zoom-in] [reset]\n *\n * Export is intentionally NOT built-in — every host has its own\n * pipeline (download, server pipeline, etc.). Drop a custom button\n * into `editor.toolbarRight` or call `editor.requestExport()` from\n * any host UI to fire the `export` event.\n */\nexport class Toolbar {\n private root: HTMLDivElement;\n private cb: ToolbarCallbacks;\n private locale: Locale;\n\n /**\n * Bookend slots reserved for host-supplied controls. The library\n * paints nothing into either — hosts (React/Vue wrappers or plain\n * JS) append their own buttons / dropdowns. `extrasLeft` sits at\n * the very start of the toolbar; `extrasRight` at the very end.\n * Empty by default and visually hidden (no separator) until they\n * actually contain children.\n */\n readonly extrasLeft: HTMLDivElement;\n readonly extrasRight: HTMLDivElement;\n\n private undoBtn!: HTMLButtonElement;\n private redoBtn!: HTMLButtonElement;\n private splitBtn!: HTMLButtonElement;\n private trimLeftBtn!: HTMLButtonElement;\n private trimRightBtn!: HTMLButtonElement;\n private playBtn!: HTMLButtonElement;\n private playIcon!: HTMLSpanElement;\n private timeLabel!: HTMLSpanElement;\n private durationLabel!: HTMLSpanElement;\n private fullscreenBtn!: HTMLButtonElement;\n private snapBtn!: HTMLButtonElement;\n private zoomOutBtn!: HTMLButtonElement;\n private zoomSlider!: HTMLInputElement;\n private zoomInBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private lastState: ToolbarState | null = null;\n\n constructor(host: HTMLElement, cb: ToolbarCallbacks, locale: Locale) {\n this.cb = cb;\n this.locale = locale;\n this.root = document.createElement(\"div\");\n this.root.className = \"aicut-toolbar\";\n this.root.setAttribute(\"data-testid\", \"aicut-toolbar\");\n\n this.extrasLeft = mkGroup(\"aicut-toolbar-extras aicut-toolbar-extras-left\");\n this.extrasRight = mkGroup(\"aicut-toolbar-extras aicut-toolbar-extras-right\");\n\n const left = mkGroup(\"aicut-toolbar-left\");\n this.undoBtn = mkIconButton(\"undo\", locale.undo, () => cb.onUndo(), \"aicut-undo\");\n this.redoBtn = mkIconButton(\"redo\", locale.redo, () => cb.onRedo(), \"aicut-redo\");\n this.splitBtn = mkIconButton(\"split\", locale.split, () => cb.onSplit(), \"aicut-split\");\n this.trimLeftBtn = mkIconButton(\"trimLeft\", locale.trimLeft, () => cb.onTrimLeft(), \"aicut-trim-left\");\n this.trimRightBtn = mkIconButton(\"trimRight\", locale.trimRight, () => cb.onTrimRight(), \"aicut-trim-right\");\n const speedBtn = mkIconButton(\"speed\", locale.speedComingSoon, () => undefined, \"aicut-speed\");\n speedBtn.disabled = true;\n left.append(this.undoBtn, this.redoBtn, this.splitBtn, this.trimLeftBtn, this.trimRightBtn, speedBtn);\n\n const center = mkGroup(\"aicut-toolbar-center\");\n this.timeLabel = mkSpan(\"aicut-time-current\", \"00:00\", \"aicut-time-current\");\n this.playBtn = document.createElement(\"button\");\n this.playBtn.type = \"button\";\n this.playBtn.className = \"aicut-play-btn\";\n this.playBtn.title = locale.playPause;\n this.playBtn.setAttribute(\"data-testid\", \"aicut-play\");\n this.playIcon = document.createElement(\"span\");\n this.playIcon.innerHTML = ICONS.play;\n this.playBtn.appendChild(this.playIcon);\n this.playBtn.addEventListener(\"click\", () => cb.onPlayToggle());\n this.durationLabel = mkSpan(\"aicut-time-total\", \"00:00\", \"aicut-time-total\");\n this.fullscreenBtn = mkIconButton(\"fullscreen\", locale.fullscreen, () => cb.onFullscreen(), \"aicut-fullscreen\");\n center.append(this.timeLabel, this.playBtn, this.durationLabel, this.fullscreenBtn);\n\n const right = mkGroup(\"aicut-toolbar-right\");\n this.snapBtn = mkIconButton(\"snap\", locale.snap, () => cb.onSnapToggle(), \"aicut-snap\");\n this.zoomOutBtn = mkIconButton(\"zoomOut\", locale.zoomOut, () => this.nudgeZoom(-1), \"aicut-zoom-out\");\n this.zoomSlider = document.createElement(\"input\");\n this.zoomSlider.type = \"range\";\n this.zoomSlider.min = \"0\";\n this.zoomSlider.max = \"100\";\n this.zoomSlider.className = \"aicut-zoom-slider\";\n this.zoomSlider.setAttribute(\"data-testid\", \"aicut-zoom-slider\");\n this.zoomSlider.addEventListener(\"input\", () => {\n const ratio = Number(this.zoomSlider.value) / 100;\n cb.onScaleChange(sliderToScale(ratio));\n });\n this.zoomInBtn = mkIconButton(\"zoomIn\", locale.zoomIn, () => this.nudgeZoom(1), \"aicut-zoom-in\");\n this.resetBtn = mkIconButton(\"reset\", locale.reset, () => cb.onReset(), \"aicut-reset\");\n right.append(this.snapBtn, this.zoomOutBtn, this.zoomSlider, this.zoomInBtn, this.resetBtn);\n\n this.root.append(this.extrasLeft, left, center, right, this.extrasRight);\n host.appendChild(this.root);\n }\n\n get element(): HTMLDivElement {\n return this.root;\n }\n\n /**\n * Idempotent render. Critically: only mutates DOM when a state\n * field actually changed. Without this, `playIcon.innerHTML = ICONS`\n * re-parsed the SVG every playback tick (~60Hz) — and replacing the\n * element between a user's mousedown and mouseup meant the browser\n * never fired `click` (the two events landed on different element\n * identities). That manifested as \"needs 3 clicks to pause\".\n *\n * Rule of thumb here: any `innerHTML =` / element rebuild MUST be\n * behind a \"did the input change\" guard. Plain `.disabled` /\n * `.textContent` writes are idempotent in browsers and safe to set\n * unconditionally, but we still diff them for cheap CPU.\n */\n render(state: ToolbarState): void {\n if (!this.lastState || this.lastState.time !== state.time) {\n this.timeLabel.textContent = fmtClock(state.time);\n }\n if (!this.lastState || this.lastState.duration !== state.duration) {\n this.durationLabel.textContent = fmtClock(state.duration);\n }\n if (!this.lastState || this.lastState.playing !== state.playing) {\n this.playIcon.innerHTML = state.playing ? ICONS.pause : ICONS.play;\n this.playBtn.setAttribute(\n \"data-state\",\n state.playing ? \"playing\" : \"paused\",\n );\n }\n if (!this.lastState || this.lastState.canUndo !== state.canUndo) {\n this.undoBtn.disabled = !state.canUndo;\n }\n if (!this.lastState || this.lastState.canRedo !== state.canRedo) {\n this.redoBtn.disabled = !state.canRedo;\n }\n if (!this.lastState || this.lastState.canSplit !== state.canSplit) {\n this.splitBtn.disabled = !state.canSplit;\n }\n if (!this.lastState || this.lastState.canTrim !== state.canTrim) {\n this.trimLeftBtn.disabled = !state.canTrim;\n this.trimRightBtn.disabled = !state.canTrim;\n }\n if (!this.lastState || this.lastState.snap !== state.snap) {\n this.snapBtn.setAttribute(\"aria-pressed\", state.snap ? \"true\" : \"false\");\n this.snapBtn.classList.toggle(\"aicut-toggle-on\", state.snap);\n this.snapBtn.title = state.snap\n ? this.locale.snapOnTitle\n : this.locale.snapOffTitle;\n }\n if (!this.lastState || this.lastState.pxPerSec !== state.pxPerSec) {\n const ratio = scaleToSlider(state.pxPerSec);\n const nextVal = String(Math.round(ratio * 100));\n if (this.zoomSlider.value !== nextVal) this.zoomSlider.value = nextVal;\n this.zoomSlider.style.setProperty(\n \"--aicut-zoom-fill\",\n `${Math.round(ratio * 100)}%`,\n );\n }\n this.lastState = { ...state };\n }\n\n destroy(): void {\n this.root.remove();\n }\n\n /**\n * Apply a new locale to all already-mounted controls. Re-uses the\n * same DOM elements (so event listeners and pointer-capture state\n * stay intact) — only writes `title` / `aria-label`. Snap toggle\n * title is then refreshed via the next render pass.\n */\n setLocale(locale: Locale): void {\n this.locale = locale;\n const applyTitle = (\n el: HTMLElement | undefined,\n title: string,\n ): void => {\n if (!el) return;\n el.title = title;\n el.setAttribute(\"aria-label\", title);\n };\n applyTitle(this.undoBtn, locale.undo);\n applyTitle(this.redoBtn, locale.redo);\n applyTitle(this.splitBtn, locale.split);\n applyTitle(this.trimLeftBtn, locale.trimLeft);\n applyTitle(this.trimRightBtn, locale.trimRight);\n applyTitle(this.playBtn, locale.playPause);\n applyTitle(this.fullscreenBtn, locale.fullscreen);\n applyTitle(this.snapBtn, locale.snap);\n applyTitle(this.zoomOutBtn, locale.zoomOut);\n applyTitle(this.zoomInBtn, locale.zoomIn);\n applyTitle(this.resetBtn, locale.reset);\n // Force snap title re-evaluation on next render.\n if (this.lastState) {\n this.snapBtn.title = this.lastState.snap\n ? locale.snapOnTitle\n : locale.snapOffTitle;\n }\n }\n\n private nudgeZoom(dir: -1 | 1): void {\n const cur = Number(this.zoomSlider.value);\n const next = Math.max(0, Math.min(100, cur + dir * 8));\n this.zoomSlider.value = String(next);\n this.cb.onScaleChange(sliderToScale(next / 100));\n }\n}\n\nfunction mkGroup(cls: string): HTMLDivElement {\n const d = document.createElement(\"div\");\n d.className = cls;\n return d;\n}\n\nfunction mkSpan(cls: string, text: string, testId?: string): HTMLSpanElement {\n const s = document.createElement(\"span\");\n s.className = cls;\n s.textContent = text;\n if (testId) s.setAttribute(\"data-testid\", testId);\n return s;\n}\n\nfunction mkIconButton(\n icon: IconName,\n title: string,\n onClick: () => void,\n testId?: string,\n): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = \"aicut-icon-btn\";\n b.title = title;\n b.setAttribute(\"aria-label\", title);\n b.innerHTML = ICONS[icon];\n if (testId) b.setAttribute(\"data-testid\", testId);\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\n/**\n * Slider ↔ scale mapping is exponential so the slider feels uniform\n * across a wide zoom range. Matches the figma reference (exp-based\n * zoom step). 0 → SCALE_MIN, 1 → SCALE_MAX.\n */\nfunction sliderToScale(ratio: number): number {\n const lo = Math.log(SCALE_MIN);\n const hi = Math.log(SCALE_MAX);\n return Math.exp(lo + (hi - lo) * ratio);\n}\n\nfunction scaleToSlider(scale: number): number {\n const lo = Math.log(SCALE_MIN);\n const hi = Math.log(SCALE_MAX);\n return (Math.log(Math.max(SCALE_MIN, Math.min(SCALE_MAX, scale))) - lo) /\n (hi - lo);\n}\n","import { clipDuration, findClipContaining, findTrackOfClip } from \"../model.js\";\nimport type { Editor } from \"../editor.js\";\nimport { Timeline } from \"../timeline/index.js\";\nimport type { Clip, Ms } from \"../types.js\";\nimport type { Locale } from \"../i18n.js\";\nimport { Toolbar, type ToolbarCallbacks } from \"./toolbar.js\";\n\n/**\n * Callbacks the editor wires into the UI. The toolbar contributes the\n * top-bar buttons; the timeline contributes click/drag intents that\n * the editor turns into model mutations (with overlap → new-track\n * routing centralised in `Editor.moveClip`).\n */\nexport interface UICallbacks extends ToolbarCallbacks {\n onSeek: (timeMs: Ms) => void;\n onSelectClip: (clipId: string | null) => void;\n onDeleteClip: (clipId: string) => void;\n onMoveClip: (\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ) => void;\n onResizeClip: (\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ) => void;\n}\n\n/**\n * Composes the editor: preview host on top, toolbar middle, canvas\n * Timeline at the bottom. Single source of repaint via `render()`;\n * frequent `onTimeTick()` is the playback-fast path that only nudges\n * the playhead-related surfaces.\n */\nexport class EditorUI {\n private root: HTMLElement;\n private editor: Editor;\n private preview: HTMLDivElement;\n private fullscreenExitBtn: HTMLButtonElement;\n private toolbar: Toolbar;\n private timelineHost: HTMLDivElement;\n private timeline: Timeline;\n private fullscreen = false;\n private onDocKeydown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(root: HTMLElement, editor: Editor, cb: UICallbacks) {\n this.root = root;\n this.editor = editor;\n const locale = editor.getLocale();\n\n root.classList.add(\"aicut-root\");\n root.innerHTML = \"\";\n\n this.preview = document.createElement(\"div\");\n this.preview.className = \"aicut-preview-host\";\n this.preview.setAttribute(\"data-testid\", \"aicut-preview\");\n root.appendChild(this.preview);\n\n this.fullscreenExitBtn = document.createElement(\"button\");\n this.fullscreenExitBtn.type = \"button\";\n this.fullscreenExitBtn.className = \"aicut-fullscreen-exit\";\n this.fullscreenExitBtn.title = locale.exitFullscreenTitle;\n this.fullscreenExitBtn.setAttribute(\"data-testid\", \"aicut-fullscreen-exit\");\n this.fullscreenExitBtn.textContent = locale.exitFullscreen;\n this.fullscreenExitBtn.addEventListener(\"click\", () =>\n this.setFullscreen(false),\n );\n this.preview.appendChild(this.fullscreenExitBtn);\n\n this.toolbar = new Toolbar(root, cb, locale);\n\n this.timelineHost = document.createElement(\"div\");\n this.timelineHost.className = \"aicut-timeline\";\n this.timelineHost.setAttribute(\"data-testid\", \"aicut-timeline\");\n root.appendChild(this.timelineHost);\n\n this.timeline = Timeline.create({\n container: this.timelineHost,\n project: editor.getProject(),\n pxPerSec: editor.getScale(),\n time: editor.getTime(),\n selectedClipId: editor.getSelection(),\n snap: editor.getSnap(),\n autoFit: true,\n locale,\n onSeek: cb.onSeek,\n onSelectClip: cb.onSelectClip,\n onMoveClip: cb.onMoveClip,\n onResizeClip: cb.onResizeClip,\n onScaleChange: cb.onScaleChange,\n onDeleteTrack: (trackId) => editor.removeTrack(trackId),\n // Mirror the editor's smart routing into the drag preview so\n // the ghost lands on the same row the commit will pick.\n resolveDrop: (clipId, intent) => {\n const proj = editor.getProject();\n const intendedTrack = proj.tracks[intent.intendedTrackIndex];\n const pred = editor.previewMoveTarget(\n clipId,\n intent.start,\n intendedTrack?.id,\n );\n if (!pred) {\n return {\n trackIndex: intent.intendedTrackIndex,\n wouldCreateNew: false,\n };\n }\n return {\n trackIndex: pred.trackIndex,\n wouldCreateNew: pred.wouldCreateNew,\n };\n },\n });\n\n this.attachKeyboard(cb);\n }\n\n // ---- fullscreen -----------------------------------------------------\n\n isFullscreen(): boolean {\n return this.fullscreen;\n }\n\n toggleFullscreen(): void {\n this.setFullscreen(!this.fullscreen);\n }\n\n setFullscreen(on: boolean): void {\n if (on === this.fullscreen) return;\n this.fullscreen = on;\n this.root.classList.toggle(\"aicut-fullscreen\", on);\n if (on) {\n this.onDocKeydown = (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.setFullscreen(false);\n }\n };\n document.addEventListener(\"keydown\", this.onDocKeydown);\n } else if (this.onDocKeydown) {\n document.removeEventListener(\"keydown\", this.onDocKeydown);\n this.onDocKeydown = null;\n }\n }\n\n get previewHost(): HTMLElement {\n return this.preview;\n }\n\n /** Host-extensible slot at the very left of the top toolbar. */\n get toolbarLeft(): HTMLElement {\n return this.toolbar.extrasLeft;\n }\n\n /** Host-extensible slot at the very right of the top toolbar. */\n get toolbarRight(): HTMLElement {\n return this.toolbar.extrasRight;\n }\n\n /** Public for e2e — read-back of timeline canvas state (no DOM clips). */\n getTimelineDebug(): ReturnType<Timeline[\"getDebugInfo\"]> {\n return this.timeline.getDebugInfo();\n }\n\n /** Full sync from editor state. Idempotent. */\n render(): void {\n const project = this.editor.getProject();\n const time = this.editor.getTime();\n const duration = this.editor.getDuration();\n const selectedClipId = this.editor.getSelection();\n const pxPerSec = this.editor.getScale();\n const snap = this.editor.getSnap();\n\n this.toolbar.render({\n playing: this.editor.isPlaying(),\n time,\n duration,\n canUndo: this.editor.canUndo(),\n canRedo: this.editor.canRedo(),\n canSplit: this.canSplitAt(time),\n canTrim: this.canTrimAt(time, selectedClipId),\n snap,\n pxPerSec,\n });\n\n this.timeline.setProject(project);\n this.timeline.setTime(time);\n this.timeline.setScale(pxPerSec);\n this.timeline.setSelection(selectedClipId);\n this.timeline.setSnap(snap);\n }\n\n /** Playback-fast path: nudge playhead + toolbar time label only. */\n onTimeTick(timeMs: Ms): void {\n this.timeline.setTime(timeMs);\n this.toolbar.render({\n playing: this.editor.isPlaying(),\n time: timeMs,\n duration: this.editor.getDuration(),\n canUndo: this.editor.canUndo(),\n canRedo: this.editor.canRedo(),\n canSplit: this.canSplitAt(timeMs),\n canTrim: this.canTrimAt(timeMs, this.editor.getSelection()),\n snap: this.editor.getSnap(),\n pxPerSec: this.editor.getScale(),\n });\n }\n\n /** Explicit re-fit — Editor calls this when a brand-new project replaces the current one. */\n resetAutoFit(): void {\n this.timeline.refit();\n }\n\n setLocale(locale: Locale): void {\n this.toolbar.setLocale(locale);\n this.fullscreenExitBtn.title = locale.exitFullscreenTitle;\n this.fullscreenExitBtn.textContent = locale.exitFullscreen;\n this.timeline.setLocale(locale);\n this.render();\n }\n\n destroy(): void {\n if (this.onDocKeydown) {\n document.removeEventListener(\"keydown\", this.onDocKeydown);\n this.onDocKeydown = null;\n }\n this.toolbar.destroy();\n this.timeline.destroy();\n this.root.innerHTML = \"\";\n this.root.classList.remove(\"aicut-root\", \"aicut-fullscreen\");\n }\n\n // ---- helpers --------------------------------------------------------\n\n private canSplitAt(timeMs: Ms): boolean {\n const project = this.editor.getProject();\n for (const t of project.tracks) {\n for (const c of t.clips) {\n if (timeMs > c.start && timeMs < c.start + clipDuration(c)) return true;\n }\n }\n return false;\n }\n\n private canTrimAt(timeMs: Ms, selectedClipId: string | null): boolean {\n const project = this.editor.getProject();\n if (selectedClipId) {\n const trk = findTrackOfClip(project, selectedClipId);\n const cl = trk?.clips.find((c: Clip) => c.id === selectedClipId);\n if (cl && timeMs > cl.start && timeMs < cl.start + clipDuration(cl)) {\n return true;\n }\n }\n for (const t of project.tracks) {\n const cl = findClipContaining(t, timeMs);\n if (cl) return true;\n }\n return false;\n }\n\n private attachKeyboard(cb: UICallbacks): void {\n this.root.tabIndex = 0;\n this.root.addEventListener(\"keydown\", (e) => {\n const target = e.target as HTMLElement | null;\n if (target && [\"INPUT\", \"TEXTAREA\"].includes(target.tagName)) return;\n if (e.code === \"Space\") {\n e.preventDefault();\n cb.onPlayToggle();\n } else if (e.code === \"KeyK\") {\n e.preventDefault();\n cb.onSplit();\n } else if (e.code === \"KeyQ\") {\n e.preventDefault();\n cb.onTrimLeft();\n } else if (e.code === \"KeyW\") {\n e.preventDefault();\n cb.onTrimRight();\n } else if ((e.metaKey || e.ctrlKey) && e.code === \"KeyZ\") {\n e.preventDefault();\n if (e.shiftKey) cb.onRedo();\n else cb.onUndo();\n } else if (e.code === \"Delete\" || e.code === \"Backspace\") {\n const sel = this.editor.getSelection();\n if (sel) {\n e.preventDefault();\n cb.onDeleteClip(sel);\n }\n }\n });\n }\n}\n","import { EventBus } from \"./events.js\";\nimport { HistoryStack } from \"./history.js\";\nimport { createId } from \"./ids.js\";\nimport {\n clipDuration,\n clipEnd,\n createEmptyProject,\n findClipContaining,\n findTrackOfClip,\n normalizeProject,\n projectDuration,\n splitClipAt,\n trackEnd,\n} from \"./model.js\";\nimport { wouldOverlap } from \"./timeline/layout.js\";\nimport { PlaybackEngine } from \"./playback.js\";\nimport { applyTheme } from \"./theme.js\";\nimport { type Locale, mergeLocale } from \"./i18n.js\";\nimport type {\n Clip,\n MediaSource,\n Ms,\n Project,\n Theme,\n Track,\n} from \"./types.js\";\nimport { EditorUI } from \"./ui/index.js\";\n\nexport interface EditorOptions {\n /** Host element to mount the editor into. Will be wiped on init. */\n container: HTMLElement;\n /** Initial project state. Falls back to an empty single-track project. */\n project?: Project;\n /** CSS variable overrides. */\n theme?: Theme;\n /** Initial playhead position (ms). */\n initialTime?: Ms;\n /** Initial timeline zoom (pixels per second). Defaults to 80. */\n initialScale?: number;\n /** Initial snap toggle. Defaults to true. */\n initialSnap?: boolean;\n /**\n * UI string overrides. Falls back to English (`localeEn`) for any\n * keys not provided. Use `localeZh` as the value for full Chinese.\n * Call `editor.setLocale(...)` to switch at runtime.\n */\n locale?: Partial<Locale>;\n}\n\nexport interface EditorEventMap {\n /** Emitted whenever the project mutates. */\n change: { project: Project };\n /** Playhead position update — driven by the playback tick loop. */\n time: { timeMs: Ms };\n play: void;\n pause: void;\n /** A source's metadata finished loading (duration etc). */\n ready: { sourceId: string | null };\n /** User clicked the Export button. Host decides what to do with the JSON. */\n export: { project: Project };\n error: { error: Error };\n /** Currently selected clip id, or null. */\n selectionChange: { clipId: string | null };\n /** Zoom (px/sec) changed. */\n scaleChange: { pxPerSec: number };\n /** Snap toggle changed. */\n snapChange: { snap: boolean };\n /** Undo/redo stack states changed (button enablement). */\n historyChange: { canUndo: boolean; canRedo: boolean };\n}\n\nexport type EditorEventName = keyof EditorEventMap;\n\nexport interface EditorApi {\n // playback\n play(): void;\n pause(): void;\n togglePlay(): void;\n seek(timeMs: Ms): void;\n getTime(): Ms;\n getDuration(): Ms;\n isPlaying(): boolean;\n enterFullscreen(): Promise<void>;\n exitFullscreen(): Promise<void>;\n isFullscreen(): boolean;\n\n // editing\n split(timeMs?: Ms): string[] | null;\n /** Alias of split, kept for back-compat. */\n cut(timeMs?: Ms): string[] | null;\n /** Trim the selected clip's left edge to the given time (or playhead). */\n trimLeft(timeMs?: Ms): boolean;\n /** Trim the selected clip's right edge to the given time (or playhead). */\n trimRight(timeMs?: Ms): boolean;\n removeClip(clipId: string): boolean;\n setClipSpeed(clipId: string, speed: number): boolean;\n previewMoveTarget(\n clipId: string,\n start: Ms,\n intendedTrackId?: string,\n ): { trackIndex: number; trackId: string; wouldCreateNew: boolean } | null;\n\n // tracks\n addTrack(kind: Track[\"kind\"]): Track;\n removeTrack(trackId: string): boolean;\n moveClip(\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ): boolean;\n resizeClip(clipId: string, edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>): boolean;\n\n // sources & state\n addSource(source: MediaSource, opts?: { appendClip?: boolean }): MediaSource;\n setProject(project: Project): void;\n getProject(): Project;\n /** Replace the project with a brand-new empty one. */\n reset(): void;\n setTheme(theme: Theme): void;\n /**\n * Swap the UI locale at runtime. Partial overrides merge with the\n * English default. Triggers a re-render so the toolbar tooltips\n * and timeline canvas labels pick up the new strings immediately.\n */\n setLocale(locale: Partial<Locale>): void;\n /**\n * Fire the `export` event with the current project JSON. Hosts call\n * this from their own export button (built into their toolbarRight\n * slot, a keyboard shortcut, a menu item, etc.) to surface project\n * data to whatever pipeline they own. The library never invokes\n * this on its own — it has no UI for export.\n */\n requestExport(): void;\n\n // viewport\n getScale(): number;\n setScale(pxPerSec: number): void;\n getSnap(): boolean;\n setSnap(snap: boolean): void;\n\n // selection\n getSelection(): string | null;\n setSelection(clipId: string | null): void;\n\n // history\n canUndo(): boolean;\n canRedo(): boolean;\n undo(): boolean;\n redo(): boolean;\n\n /**\n * Bookend slot at the very left of the top toolbar — host appends\n * its own controls (e.g. an aspect-ratio dropdown). Empty by default\n * and renders no separator until populated.\n */\n readonly toolbarLeft: HTMLElement;\n /** Right-side bookend slot — conventionally export / save / share. */\n readonly toolbarRight: HTMLElement;\n\n // events\n on<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): () => void;\n off<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): void;\n destroy(): void;\n}\n\nconst DEFAULT_PX_PER_SEC = 80;\nconst MIN_PX_PER_SEC = 10;\nconst MAX_PX_PER_SEC = 400;\n/** Snap distance in pixels at the current zoom. Converted to ms per call. */\nconst SNAP_PX = 8;\n\n/**\n * Top-level editor instance — the only stateful object a host app\n * interacts with. Owns the project, the playback engine, the vanilla\n * DOM UI, plus viewport (zoom/snap), selection, and history state.\n *\n * Framework wrappers (`@aicut/react`, `@aicut/vue`) should mount a\n * container, instantiate this once, mirror prop changes (`theme`)\n * into it, and forward events as framework-native callbacks.\n */\nexport class Editor implements EditorApi {\n private container: HTMLElement;\n private project: Project;\n private engine: PlaybackEngine;\n private ui: EditorUI;\n private bus = new EventBus<EditorEventMap>();\n private history = new HistoryStack();\n\n private selectedClipId: string | null = null;\n private pxPerSec: number;\n private snap: boolean;\n private locale: Locale;\n private destroyed = false;\n\n constructor(opts: EditorOptions) {\n this.container = opts.container;\n this.project = normalizeProject(opts.project ?? createEmptyProject());\n this.pxPerSec = clampScale(opts.initialScale ?? DEFAULT_PX_PER_SEC);\n this.snap = opts.initialSnap !== false;\n this.locale = mergeLocale(opts.locale);\n\n applyTheme(this.container, opts.theme);\n\n this.ui = new EditorUI(this.container, this, {\n onPlayToggle: () => this.togglePlay(),\n onSplit: () => this.split(),\n onTrimLeft: () => this.trimLeft(),\n onTrimRight: () => this.trimRight(),\n onUndo: () => this.undo(),\n onRedo: () => this.redo(),\n onReset: () => this.reset(),\n onFullscreen: () => this.ui.toggleFullscreen(),\n onSnapToggle: () => this.setSnap(!this.snap),\n onScaleChange: (s) => this.setScale(s),\n onSeek: (t) => this.seek(t),\n onSelectClip: (id) => this.setSelection(id),\n onDeleteClip: (id) => this.removeClip(id),\n onMoveClip: (id, opts) => this.moveClip(id, opts),\n onResizeClip: (id, edits) => this.resizeClip(id, edits),\n });\n\n this.engine = new PlaybackEngine(this.ui.previewHost, this.project);\n this.engine.onTimeUpdate = (ms) => {\n this.bus.emit(\"time\", { timeMs: ms });\n this.ui.onTimeTick(ms);\n };\n this.engine.onEnded = () => this.bus.emit(\"pause\", undefined);\n this.engine.onError = (err) => this.bus.emit(\"error\", { error: err });\n this.engine.onReady = () => this.bus.emit(\"ready\", { sourceId: null });\n this.engine.onSourceMetadata = (sourceId, durMs) =>\n this.handleSourceMetadata(sourceId, durMs);\n\n if (opts.initialTime) this.engine.seek(opts.initialTime);\n this.ui.render();\n }\n\n static create(opts: EditorOptions): Editor {\n return new Editor(opts);\n }\n\n get toolbarLeft(): HTMLElement {\n return this.ui.toolbarLeft;\n }\n\n get toolbarRight(): HTMLElement {\n return this.ui.toolbarRight;\n }\n\n // ---- playback -------------------------------------------------------\n\n play(): void {\n this.engine.play();\n this.bus.emit(\"play\", undefined);\n this.ui.render();\n }\n\n pause(): void {\n this.engine.pause();\n this.bus.emit(\"pause\", undefined);\n this.ui.render();\n }\n\n togglePlay(): void {\n if (this.engine.isPlaying()) this.pause();\n else this.play();\n }\n\n seek(timeMs: Ms): void {\n this.engine.seek(timeMs);\n this.ui.render();\n }\n\n getTime(): Ms {\n // Engine may not exist yet during UI construction (we build UI\n // first to get its previewHost). Treat as 0 in that case.\n return this.engine?.getTime() ?? 0;\n }\n\n getDuration(): Ms {\n return projectDuration(this.project);\n }\n\n isPlaying(): boolean {\n return this.engine?.isPlaying() ?? false;\n }\n\n /**\n * In-tab \"fullscreen\" — covers the browser viewport via fixed\n * positioning, NOT the OS Fullscreen API. This is what the reference\n * UI calls \"全屏预览\": the user stays in their tab, no browser\n * permission prompt, ESC exits. Browser fullscreen would also work\n * but is heavier UX and gets blocked in iframes.\n */\n async enterFullscreen(): Promise<void> {\n this.ui.setFullscreen(true);\n }\n\n async exitFullscreen(): Promise<void> {\n this.ui.setFullscreen(false);\n }\n\n isFullscreen(): boolean {\n return this.ui.isFullscreen();\n }\n\n // ---- editing --------------------------------------------------------\n\n /**\n * Split the clip at `timeMs` (or playhead). Returns the two new clip ids\n * or null if there's no clip to split at that time.\n */\n split(timeMs?: Ms): string[] | null {\n const t = timeMs ?? this.engine.getTime();\n // Pick the track of the currently selected clip, else the first\n // video track that has a clip at this time.\n let target: { track: Track; clip: Clip } | null = null;\n if (this.selectedClipId) {\n const trk = findTrackOfClip(this.project, this.selectedClipId);\n const cl = trk?.clips.find((c) => c.id === this.selectedClipId) ?? null;\n if (trk && cl && t > cl.start && t < clipEnd(cl)) target = { track: trk, clip: cl };\n }\n if (!target) {\n for (const trk of this.project.tracks) {\n const cl = findClipContaining(trk, t);\n if (cl && t > cl.start && t < clipEnd(cl)) {\n target = { track: trk, clip: cl };\n break;\n }\n }\n }\n if (!target) return null;\n const split = splitClipAt(target.clip, t - target.clip.start);\n if (!split) return null;\n this.pushHistory();\n const [left, right] = split;\n target.track.clips = target.track.clips\n .filter((c) => c.id !== target!.clip.id)\n .concat(left, right)\n .sort((a, b) => a.start - b.start);\n this.afterMutation();\n return [left.id, right.id];\n }\n\n cut(timeMs?: Ms): string[] | null {\n return this.split(timeMs);\n }\n\n trimLeft(timeMs?: Ms): boolean {\n const t = timeMs ?? this.engine.getTime();\n const target = this.resolveTrimTarget(t);\n if (!target) return false;\n const { clip } = target;\n const delta = t - clip.start;\n if (delta <= 0 || delta >= clipDuration(clip)) return false;\n this.pushHistory();\n const oldStart = clip.start;\n clip.in += delta;\n clip.start += delta;\n\n // Ripple-close the gap [oldStart, oldStart + delta] when it isn't\n // covered by any clip on any other track. The user's mental model:\n // \"trim away the lead-in and tighten the timeline\" — but only if\n // we're not stranding material on a parallel track that was lining\n // up with the trimmed region.\n const gapStart = oldStart;\n const gapEnd = clip.start;\n let covered = false;\n outer: for (const trk of this.project.tracks) {\n for (const c of trk.clips) {\n if (c.id === clip.id) continue;\n const cEnd = c.start + clipDuration(c);\n if (c.start < gapEnd && cEnd > gapStart) {\n covered = true;\n break outer;\n }\n }\n }\n if (!covered) {\n clip.start = gapStart;\n for (const trk of this.project.tracks) {\n for (const c of trk.clips) {\n if (c.id === clip.id) continue;\n if (c.start >= gapEnd) c.start -= delta;\n }\n trk.clips.sort((a, b) => a.start - b.start);\n }\n }\n\n this.afterMutation();\n return true;\n }\n\n trimRight(timeMs?: Ms): boolean {\n const t = timeMs ?? this.engine.getTime();\n const target = this.resolveTrimTarget(t);\n if (!target) return false;\n const { clip } = target;\n const delta = clipEnd(clip) - t;\n if (delta <= 0 || delta >= clipDuration(clip)) return false;\n this.pushHistory();\n clip.out -= delta;\n this.afterMutation();\n return true;\n }\n\n removeClip(clipId: string): boolean {\n let removed = false;\n const before = JSON.stringify(this.project);\n for (const t of this.project.tracks) {\n const len = t.clips.length;\n t.clips = t.clips.filter((c) => c.id !== clipId);\n if (t.clips.length !== len) removed = true;\n }\n if (!removed) return false;\n // Restore previous state in `history` keyed off the pre-mutation\n // snapshot for accurate undo.\n this.history.push(JSON.parse(before) as Project);\n if (this.selectedClipId === clipId) {\n this.selectedClipId = null;\n this.bus.emit(\"selectionChange\", { clipId: null });\n }\n this.afterMutation();\n return true;\n }\n\n setClipSpeed(clipId: string, speed: number): boolean {\n if (!Number.isFinite(speed) || speed <= 0) return false;\n const trk = findTrackOfClip(this.project, clipId);\n const cl = trk?.clips.find((c) => c.id === clipId);\n if (!trk || !cl) return false;\n this.pushHistory();\n cl.speed = speed === 1 ? undefined : speed;\n this.afterMutation();\n return true;\n }\n\n // ---- tracks ---------------------------------------------------------\n\n addTrack(kind: Track[\"kind\"]): Track {\n this.pushHistory();\n const t: Track = { id: createId(\"track\"), kind, clips: [] };\n this.project.tracks.push(t);\n this.afterMutation();\n return t;\n }\n\n removeTrack(trackId: string): boolean {\n const idx = this.project.tracks.findIndex((t) => t.id === trackId);\n if (idx < 0) return false;\n this.pushHistory();\n this.project.tracks.splice(idx, 1);\n this.afterMutation();\n return true;\n }\n\n /**\n * Pure prediction of where a `moveClip(...)` would land — same smart\n * routing as the real move (intended → source → other → new track),\n * just no mutation, no history. Lets the Timeline preview the\n * ACTUAL outcome of a drop so the ghost stops lying about new\n * tracks that won't get created.\n */\n previewMoveTarget(\n clipId: string,\n start: Ms,\n intendedTrackId?: string,\n ): { trackIndex: number; trackId: string; wouldCreateNew: boolean } | null {\n const fromTrack = findTrackOfClip(this.project, clipId);\n const clip = fromTrack?.clips.find((c) => c.id === clipId);\n if (!fromTrack || !clip) return null;\n const nextStart = Math.max(0, start);\n const nextEnd = nextStart + clipDuration(clip);\n const intended = intendedTrackId\n ? this.project.tracks.find((t) => t.id === intendedTrackId)\n : fromTrack;\n const candidates: Track[] = [];\n const seen = new Set<string>();\n const push = (t: Track | undefined) => {\n if (!t || seen.has(t.id)) return;\n seen.add(t.id);\n candidates.push(t);\n };\n push(intended);\n push(fromTrack);\n for (const t of this.project.tracks) {\n if (t.kind === fromTrack.kind) push(t);\n }\n for (const c of candidates) {\n if (!wouldOverlap(c, clipId, nextStart, nextEnd)) {\n const idx = this.project.tracks.indexOf(c);\n return { trackIndex: idx, trackId: c.id, wouldCreateNew: false };\n }\n }\n // No fit → preview a brand-new track appended at the end.\n return {\n trackIndex: this.project.tracks.length,\n trackId: \"\",\n wouldCreateNew: true,\n };\n }\n\n moveClip(\n clipId: string,\n opts: { start?: Ms; trackId?: string; newTrack?: boolean },\n ): boolean {\n const fromTrack = findTrackOfClip(this.project, clipId);\n const clip = fromTrack?.clips.find((c) => c.id === clipId);\n if (!fromTrack || !clip) return false;\n const nextStart = Math.max(0, opts.start ?? clip.start);\n const nextEnd = nextStart + clipDuration(clip);\n\n // Explicit \"new track\" intent from the UI's phantom-row drop —\n // bypass smart routing entirely, append a fresh track, move there.\n if (opts.newTrack) {\n this.pushHistory();\n const created = this.appendTrack({ kind: fromTrack.kind });\n clip.start = nextStart;\n fromTrack.clips = fromTrack.clips.filter((c) => c.id !== clipId);\n created.clips.push(clip);\n if (\n fromTrack.clips.length === 0 &&\n this.project.tracks.filter((t) => t.kind === fromTrack.kind).length > 1\n ) {\n this.project.tracks = this.project.tracks.filter(\n (t) => t.id !== fromTrack.id,\n );\n }\n this.afterMutation();\n return true;\n }\n\n const intended = opts.trackId\n ? this.project.tracks.find((t) => t.id === opts.trackId)\n : fromTrack;\n if (!intended) return false;\n\n this.pushHistory();\n\n // Smart routing — prefer in priority:\n // 1. intended track (user's hover target)\n // 2. the source track (because vacating it for a brand-new track\n // would be wasteful when there's room on the original row)\n // 3. any other existing track of the same kind\n // 4. as a last resort, a freshly-appended track\n //\n // `wouldOverlap` excludes the dragged clip itself, so the source\n // track always has room for it back where it started (the user\n // can effectively cancel a cross-track drag by hovering somewhere\n // crowded — we drop back onto source).\n const candidates: Track[] = [];\n const seen = new Set<string>();\n const push = (t: Track | undefined) => {\n if (!t || seen.has(t.id)) return;\n seen.add(t.id);\n candidates.push(t);\n };\n push(intended);\n push(fromTrack);\n for (const t of this.project.tracks) {\n if (t.kind === fromTrack.kind) push(t);\n }\n\n let targetTrack: Track | null = null;\n for (const c of candidates) {\n if (!wouldOverlap(c, clipId, nextStart, nextEnd)) {\n targetTrack = c;\n break;\n }\n }\n if (!targetTrack) {\n targetTrack = this.appendTrack({ kind: fromTrack.kind });\n }\n\n // Apply the move.\n clip.start = nextStart;\n if (targetTrack !== fromTrack) {\n fromTrack.clips = fromTrack.clips.filter((c) => c.id !== clipId);\n targetTrack.clips.push(clip);\n }\n targetTrack.clips.sort((a, b) => a.start - b.start);\n\n // Auto-prune: if the source track is now empty AND it isn't the\n // only track of its kind, drop it. Keeps the UI compact when the\n // user is shuffling clips around — without this the track count\n // monotonically grows.\n if (\n fromTrack !== targetTrack &&\n fromTrack.clips.length === 0 &&\n this.project.tracks.filter((t) => t.kind === fromTrack.kind).length > 1\n ) {\n this.project.tracks = this.project.tracks.filter(\n (t) => t.id !== fromTrack.id,\n );\n }\n\n this.afterMutation();\n return true;\n }\n\n resizeClip(\n clipId: string,\n edits: Partial<Pick<Clip, \"in\" | \"out\" | \"start\">>,\n ): boolean {\n const trk = findTrackOfClip(this.project, clipId);\n const cl = trk?.clips.find((c) => c.id === clipId);\n if (!trk || !cl) return false;\n const next: Clip = { ...cl, ...edits };\n if (next.out <= next.in) return false;\n if (next.start < 0) return false;\n this.pushHistory();\n Object.assign(cl, next);\n trk.clips.sort((a, b) => a.start - b.start);\n this.afterMutation();\n return true;\n }\n\n addSource(\n source: MediaSource,\n opts: { appendClip?: boolean } = {},\n ): MediaSource {\n const src: MediaSource = { ...source, id: source.id || createId(\"src\") };\n this.pushHistory();\n this.project.sources.push(src);\n const append = opts.appendClip !== false;\n if (append && src.kind === \"video\") {\n const track =\n this.project.tracks.find((t) => t.kind === \"video\") ??\n this.appendTrack({ kind: \"video\" });\n const start = trackEnd(track);\n track.clips.push({\n id: createId(\"clip\"),\n sourceId: src.id,\n in: 0,\n out: src.duration ?? 0,\n start,\n });\n }\n this.afterMutation();\n return src;\n }\n\n // ---- project --------------------------------------------------------\n\n setProject(project: Project): void {\n this.pushHistory();\n this.project = normalizeProject(project);\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n // Re-fit on project swap — the new project's duration is likely\n // different so the previous scale is meaningless.\n this.ui.resetAutoFit();\n this.ui.render();\n }\n\n getProject(): Project {\n return JSON.parse(JSON.stringify(this.project)) as Project;\n }\n\n /**\n * Restore the \"fresh import\" state: same media library, single\n * default video track, one full-length clip per video source laid\n * end-to-end. This mirrors the initial layout a host would get\n * after dropping their videos in, so \"reset\" feels like \"start\n * over without re-importing\" rather than \"wipe everything\".\n *\n * Goes through the regular history stack — ⌘Z brings the previous\n * edit back. Sources without a known duration are skipped (they'd\n * render as zero-width clips, which is worse than absent).\n */\n reset(): void {\n const sources = this.project.sources.map((s) => ({ ...s }));\n const trackId = createId(\"track\");\n const clips: Clip[] = [];\n let start = 0;\n for (const src of sources) {\n if (src.kind !== \"video\") continue;\n const dur = src.duration;\n if (!dur || dur <= 0) continue;\n clips.push({\n id: createId(\"clip\"),\n sourceId: src.id,\n in: 0,\n out: dur,\n start,\n });\n start += dur;\n }\n this.setProject({\n version: 1,\n sources,\n tracks: [{ id: trackId, kind: \"video\", clips }],\n });\n }\n\n setTheme(theme: Theme): void {\n applyTheme(this.container, theme);\n // The timeline canvas reads CSS vars at paint time and bakes them\n // into pixels — it has no way to know the vars just changed.\n // Without this re-render, the chrome (toolbar/headers) flips\n // immediately via CSS but the canvas keeps its last colours until\n // the next interaction (wheel, click, etc.). Force a repaint now.\n this.ui.render();\n }\n\n setLocale(locale: Partial<Locale>): void {\n this.locale = mergeLocale(locale);\n this.ui.setLocale(this.locale);\n }\n\n /** Internal — UI reads the resolved locale here on each render. */\n getLocale(): Locale {\n return this.locale;\n }\n\n requestExport(): void {\n this.bus.emit(\"export\", { project: this.getProject() });\n }\n\n // ---- viewport -------------------------------------------------------\n\n getScale(): number {\n return this.pxPerSec;\n }\n\n setScale(pxPerSec: number): void {\n const next = clampScale(pxPerSec);\n if (next === this.pxPerSec) return;\n this.pxPerSec = next;\n this.bus.emit(\"scaleChange\", { pxPerSec: next });\n this.ui.render();\n }\n\n getSnap(): boolean {\n return this.snap;\n }\n\n setSnap(snap: boolean): void {\n if (snap === this.snap) return;\n this.snap = snap;\n this.bus.emit(\"snapChange\", { snap });\n this.ui.render();\n }\n\n /** Snap a candidate ms to the nearest snappable surface within SNAP_PX. */\n snapMs(timeMs: Ms, ignoreClipId?: string | null): Ms {\n if (!this.snap) return timeMs;\n const snapTol = Math.max(20, (SNAP_PX / this.pxPerSec) * 1000);\n const targets: Ms[] = [0, this.engine.getTime()];\n for (const t of this.project.tracks) {\n for (const c of t.clips) {\n if (c.id === ignoreClipId) continue;\n targets.push(c.start, clipEnd(c));\n }\n }\n let best: Ms = timeMs;\n let bestDist = snapTol;\n for (const t of targets) {\n const d = Math.abs(t - timeMs);\n if (d < bestDist) {\n bestDist = d;\n best = t;\n }\n }\n return best;\n }\n\n // ---- selection ------------------------------------------------------\n\n getSelection(): string | null {\n return this.selectedClipId;\n }\n\n setSelection(clipId: string | null): void {\n if (clipId === this.selectedClipId) return;\n this.selectedClipId = clipId;\n this.bus.emit(\"selectionChange\", { clipId });\n this.ui.render();\n }\n\n // ---- history --------------------------------------------------------\n\n canUndo(): boolean {\n return this.history.canUndo();\n }\n\n canRedo(): boolean {\n return this.history.canRedo();\n }\n\n undo(): boolean {\n const prev = this.history.undo(this.project);\n if (!prev) return false;\n this.project = prev;\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n this.ui.render();\n return true;\n }\n\n redo(): boolean {\n const next = this.history.redo(this.project);\n if (!next) return false;\n this.project = next;\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.emitHistory();\n this.ui.render();\n return true;\n }\n\n // ---- events ---------------------------------------------------------\n\n on<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): () => void {\n return this.bus.on(event, handler);\n }\n\n off<K extends EditorEventName>(\n event: K,\n handler: (payload: EditorEventMap[K]) => void,\n ): void {\n this.bus.off(event, handler);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.engine.destroy();\n this.ui.destroy();\n this.bus.clear();\n this.history.clear();\n }\n\n // ---- internals ------------------------------------------------------\n\n private appendTrack(opts: { kind: Track[\"kind\"] }): Track {\n const t: Track = { id: createId(\"track\"), kind: opts.kind, clips: [] };\n this.project.tracks.push(t);\n return t;\n }\n\n private resolveTrimTarget(\n timeMs: Ms,\n ): { track: Track; clip: Clip } | null {\n if (this.selectedClipId) {\n const trk = findTrackOfClip(this.project, this.selectedClipId);\n const cl = trk?.clips.find((c) => c.id === this.selectedClipId);\n if (trk && cl && timeMs >= cl.start && timeMs <= clipEnd(cl)) {\n return { track: trk, clip: cl };\n }\n }\n for (const trk of this.project.tracks) {\n const cl = findClipContaining(trk, timeMs);\n if (cl) return { track: trk, clip: cl };\n }\n return null;\n }\n\n private pushHistory(): void {\n this.history.push(this.project);\n this.emitHistory();\n }\n\n private emitHistory(): void {\n this.bus.emit(\"historyChange\", {\n canUndo: this.history.canUndo(),\n canRedo: this.history.canRedo(),\n });\n }\n\n private afterMutation(): void {\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.ui.render();\n }\n\n private handleSourceMetadata(sourceId: string, durMs: Ms): void {\n const src = this.project.sources.find((s) => s.id === sourceId);\n let mutated = false;\n if (src && !src.duration) {\n src.duration = durMs;\n mutated = true;\n }\n for (const t of this.project.tracks) {\n for (const c of t.clips) {\n if (c.sourceId === sourceId && c.out === 0) {\n c.out = durMs;\n mutated = true;\n }\n }\n }\n this.bus.emit(\"ready\", { sourceId });\n if (mutated) {\n // Source metadata patching is not a user action — don't pollute\n // the undo stack with it.\n this.engine.setProject(this.project);\n this.bus.emit(\"change\", { project: this.getProject() });\n this.ui.render();\n }\n }\n}\n\nfunction clampScale(s: number): number {\n return Math.max(MIN_PX_PER_SEC, Math.min(MAX_PX_PER_SEC, s));\n}\n"]}