dialkit 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/useDialKit.ts","../src/store/DialStore.ts","../src/hooks/useDialStorePanel.ts","../src/components/DialRoot.tsx","../src/store/TimelineStore.ts","../src/env.ts","../src/components/Folder.tsx","../src/icons.ts","../src/components/Panel.tsx","../src/copy-instruction.ts","../src/components/ControlRenderer.tsx","../src/components/ShortcutListener.tsx","../src/shortcut-utils.ts","../src/components/Slider.tsx","../src/components/SegmentedControl.tsx","../src/components/Toggle.tsx","../src/transition-math.ts","../src/components/SpringVisualization.tsx","../src/components/SpringControl.tsx","../src/components/EasingVisualization.tsx","../src/components/TransitionControl.tsx","../src/components/TextControl.tsx","../src/components/SelectControl.tsx","../src/dropdown-position.ts","../src/components/ColorControl.tsx","../src/components/PresetManager.tsx","../src/components/Timeline/TimelineToggleButton.tsx","../src/store/TimelineUiStore.ts","../src/panel-drag.ts","../src/hooks/useDialTimeline.ts","../src/timeline-core.ts","../src/timeline/adapter.ts","../src/components/Timeline/DialTimeline.tsx","../src/components/ButtonGroup.tsx","../src/components/ShortcutsMenu.tsx"],"sourcesContent":["// Main hook\nexport { useDialKit, useDialKitController } from './hooks/useDialKit';\nexport type { DialKitController, UseDialOptions } from './hooks/useDialKit';\n\n// Root component (user mounts once)\nexport { DialRoot } from './components/DialRoot';\nexport type { DialPosition, DialMode, DialTheme } from './components/DialRoot';\n\n// Timeline (prototype)\nexport { useDialTimeline } from './hooks/useDialTimeline';\nexport type {\n TimelineClipConfig,\n TimelineClipCss,\n TimelineClipLoop,\n TimelineConfig,\n TimelineClipValues,\n TimelineGroupConfig,\n TimelineGroupValues,\n TimelinePropConfig,\n TimelinePropStepConfig,\n TimelineStepConfig,\n TimelineStepValues,\n DialTimelineValues,\n UseDialTimelineOptions,\n} from './hooks/useDialTimeline';\nexport { DialTimeline } from './components/Timeline/DialTimeline';\nexport type { DialTimelineProps } from './components/Timeline/DialTimeline';\nexport { formatClock } from './timeline-core';\nexport { TimelineStore } from './store/TimelineStore';\nexport type {\n TimelineMeta,\n TimelineClipMeta,\n TimelineClipTrackMeta,\n TimelineTransport,\n} from './store/TimelineStore';\n\n// Individual components (for advanced usage)\nexport { ControlRenderer } from './components/ControlRenderer';\nexport { Slider } from './components/Slider';\nexport { Toggle } from './components/Toggle';\nexport { Folder } from './components/Folder';\nexport { ButtonGroup } from './components/ButtonGroup';\nexport { SpringControl } from './components/SpringControl';\nexport { SpringVisualization } from './components/SpringVisualization';\nexport { TransitionControl } from './components/TransitionControl';\nexport { EasingVisualization } from './components/EasingVisualization';\nexport { TextControl } from './components/TextControl';\nexport { SelectControl } from './components/SelectControl';\nexport { ColorControl } from './components/ColorControl';\nexport { PresetManager } from './components/PresetManager';\nexport { ShortcutsMenu } from './components/ShortcutsMenu';\n\n// Store (for advanced usage)\nexport { DialStore } from './store/DialStore';\nexport type {\n SpringConfig,\n EasingConfig,\n TransitionConfig,\n ActionConfig,\n SelectConfig,\n ColorConfig,\n TextConfig,\n DialKitPersistOptions,\n ShortcutConfig,\n ShortcutMode,\n ShortcutInteraction,\n Preset,\n DialValue,\n DialConfig,\n DialKitValueUpdates,\n ResolvedValues,\n ControlMeta,\n PanelConfig,\n} from './store/DialStore';\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { DialStore, flattenDialValueUpdates, resolveDialValues } from '../store/DialStore';\nimport type {\n DialConfig,\n DialKitPersistOptions,\n DialKitValueUpdates,\n DialValue,\n ResolvedValues,\n ShortcutConfig,\n} from '../store/DialStore';\nimport { useDialStorePanel } from './useDialStorePanel';\n\nexport interface UseDialOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n onAction?: (action: string) => void;\n shortcuts?: Record<string, ShortcutConfig>;\n}\n\nexport interface DialKitController<T extends DialConfig> {\n values: ResolvedValues<T>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ResolvedValues<T> {\n return useDialKitController(name, config, options).values;\n}\n\nexport function useDialKitController<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): DialKitController<T> {\n const { panelId, flatValues, serializedConfig } = useDialStorePanel(name, config, {\n id: options?.id,\n persist: options?.persist,\n shortcuts: options?.shortcuts,\n });\n\n const configRef = useRef(config);\n configRef.current = config;\n const onActionRef = useRef(options?.onAction);\n onActionRef.current = options?.onAction;\n\n // Subscribe to action events\n useEffect(() => {\n return DialStore.subscribeActions(panelId, (action) => {\n onActionRef.current?.(action);\n });\n }, [panelId]);\n\n const values = useMemo(\n () => resolveDialValues(configRef.current, flatValues),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [flatValues, serializedConfig]\n );\n\n const setValue = useCallback(\n (path: string, value: DialValue) => {\n DialStore.updateValue(panelId, path, value);\n },\n [panelId]\n );\n\n const setValues = useCallback(\n (nextValues: DialKitValueUpdates<T>) => {\n DialStore.updateValues(panelId, flattenDialValueUpdates(configRef.current, nextValues));\n },\n [panelId]\n );\n\n const resetValues = useCallback(() => {\n DialStore.resetValues(panelId);\n }, [panelId]);\n\n const getValues = useCallback(\n () => resolveDialValues(configRef.current, DialStore.getValues(panelId)),\n [panelId]\n );\n\n return useMemo(\n () => ({\n values,\n setValue,\n setValues,\n resetValues,\n getValues,\n }),\n [getValues, resetValues, setValue, setValues, values]\n );\n}\n","// Lightweight state store with subscriptions for dialkit\n\nexport type SpringConfig = {\n type: 'spring';\n stiffness?: number;\n damping?: number;\n mass?: number;\n visualDuration?: number;\n bounce?: number;\n};\n\nexport type EasingConfig = {\n type: 'easing';\n duration: number;\n ease: [number, number, number, number];\n};\n\nexport type TransitionConfig = SpringConfig | EasingConfig;\n\nexport type ActionConfig = {\n type: 'action';\n label?: string;\n};\n\nexport type SelectConfig = {\n type: 'select';\n options: (string | { value: string; label: string })[];\n default?: string;\n};\n\nexport type ColorConfig = {\n type: 'color';\n default?: string;\n};\n\nexport type TextConfig = {\n type: 'text';\n default?: string;\n placeholder?: string;\n};\n\nexport type DialValue = number | boolean | string | SpringConfig | EasingConfig | ActionConfig | SelectConfig | ColorConfig | TextConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number, number?] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig\n ? TransitionConfig\n : T[K] extends EasingConfig\n ? TransitionConfig\n : T[K] extends SelectConfig\n ? string\n : T[K] extends ColorConfig\n ? string\n : T[K] extends TextConfig\n ? string\n : T[K] extends DialConfig\n ? ResolvedValues<T[K]>\n : T[K];\n};\n\nexport type DialKitValueUpdates<T extends DialConfig> = {\n [K in keyof T as K extends '_collapsed' ? never : K]?: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig | EasingConfig\n ? TransitionConfig\n : T[K] extends ActionConfig\n ? never\n : T[K] extends SelectConfig | ColorConfig | TextConfig\n ? string\n : T[K] extends DialConfig\n ? DialKitValueUpdates<T[K]>\n : T[K];\n};\n\nexport type ShortcutMode = 'fine' | 'normal' | 'coarse';\nexport type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';\n\nexport type ShortcutConfig = {\n key?: string;\n modifier?: 'alt' | 'shift' | 'meta';\n mode?: ShortcutMode;\n interaction?: ShortcutInteraction;\n};\n\nexport type ControlMeta = {\n type: 'slider' | 'toggle' | 'spring' | 'transition' | 'folder' | 'action' | 'select' | 'color' | 'text';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\n defaultOpen?: boolean;\n options?: (string | { value: string; label: string })[];\n placeholder?: string;\n shortcut?: ShortcutConfig;\n};\n\nexport type PanelConfig = {\n id: string;\n name: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n shortcuts: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n};\n\ntype Listener = () => void;\ntype ActionListener = (action: string) => void;\n\nexport type Preset = {\n id: string;\n name: string;\n values: Record<string, DialValue>;\n};\n\nexport type DialKitPersistOptions = boolean | {\n key?: string;\n storage?: 'localStorage' | 'sessionStorage';\n presets?: boolean;\n};\n\nexport type DialStorePanelOptions = {\n retainOnUnmount?: boolean;\n persist?: DialKitPersistOptions;\n kind?: 'timeline';\n};\n\ntype PersistConfig = {\n key: string;\n storage: 'localStorage' | 'sessionStorage';\n presets: boolean;\n};\n\ntype PersistedPanelState = {\n version: 1;\n values?: Record<string, DialValue>;\n baseValues?: Record<string, DialValue>;\n presets?: Preset[];\n activePresetId?: string | null;\n};\n\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nexport function resolveDialValues<T extends DialConfig>(\n config: T,\n flatValues: Record<string, DialValue>\n): ResolvedValues<T> {\n return resolveConfigValues(config, flatValues, '') as ResolvedValues<T>;\n}\n\nexport function flattenDialValueUpdates<T extends DialConfig>(\n config: T,\n updates: DialKitValueUpdates<T>\n): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n if (typeof updates === 'object' && updates !== null) {\n flattenConfigUpdates(config, updates as Record<string, unknown>, '', values);\n }\n return values;\n}\n\nfunction resolveConfigValues(\n config: DialConfig,\n flatValues: Record<string, DialValue>,\n prefix: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length <= 4 && typeof configValue[0] === 'number') {\n result[key] = flatValues[path] ?? configValue[0];\n } else if (typeof configValue === 'number' || typeof configValue === 'boolean' || typeof configValue === 'string') {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSpringConfigValue(configValue) || isEasingConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfigValue(configValue)) {\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n result[key] = resolveConfigValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\n}\n\nfunction flattenConfigUpdates(\n config: DialConfig,\n updates: Record<string, unknown>,\n prefix: string,\n values: Record<string, DialValue>\n): void {\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed' || !(key in updates)) continue;\n\n const nextValue = updates[key];\n if (nextValue === undefined) continue;\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (isActionConfigValue(configValue)) {\n continue;\n }\n\n if (isLeafConfigValue(configValue)) {\n values[path] = nextValue as DialValue;\n continue;\n }\n\n if (\n typeof configValue === 'object' &&\n configValue !== null &&\n typeof nextValue === 'object' &&\n nextValue !== null &&\n !Array.isArray(nextValue)\n ) {\n flattenConfigUpdates(configValue as DialConfig, nextValue as Record<string, unknown>, path, values);\n }\n }\n}\n\nfunction isLeafConfigValue(value: unknown): boolean {\n return (\n (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isSpringConfigValue(value) ||\n isEasingConfigValue(value) ||\n isActionConfigValue(value) ||\n isSelectConfigValue(value) ||\n isColorConfigValue(value) ||\n isTextConfigValue(value)\n );\n}\n\nfunction hasType(value: unknown, type: string): boolean {\n return typeof value === 'object' && value !== null && 'type' in value && (value as { type: string }).type === type;\n}\n\nexport function isSpringConfigValue(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nexport function isEasingConfigValue(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nexport function isHexColor(value: string): boolean {\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n}\n\n/** camelCase → Title Case, the label rule used everywhere a key becomes UI text. */\nexport function formatLabel(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n}\n\n/** Default slider step for a numeric range. */\nexport function inferStep(min: number, max: number): number {\n const range = max - min;\n if (range <= 1) return 0.01;\n if (range <= 10) return 0.1;\n if (range <= 100) return 1;\n return 10;\n}\n\nfunction isActionConfigValue(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfigValue(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfigValue(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfigValue(value: unknown): value is TextConfig {\n return hasType(value, 'text');\n}\n\nfunction getFirstOptionValue(options: (string | { value: string; label: string })[]): string {\n const first = options[0];\n if (first === undefined) return '';\n return typeof first === 'string' ? first : first.value;\n}\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\n private panelsSnapshot: PanelConfig[] = [];\n private standardPanelsSnapshot: PanelConfig[] = [];\n private timelinePanelsSnapshot: PanelConfig[] = [];\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private snapshots: Map<string, Record<string, DialValue>> = new Map();\n private actionListeners: Map<string, Set<ActionListener>> = new Map();\n private presets: Map<string, Preset[]> = new Map();\n private activePreset: Map<string, string | null> = new Map();\n private baseValues: Map<string, Record<string, DialValue>> = new Map();\n private defaultValues: Map<string, Record<string, DialValue>> = new Map();\n private registrationCounts: Map<string, number> = new Map();\n private retainedPanels: Set<string> = new Set();\n private persistConfigs: Map<string, PersistConfig> = new Map();\n\n registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n const existingPanel = this.panels.get(id);\n if (existingPanel && existingPanel.kind !== options.kind) {\n console.warn(\n `[dialkit] Panel id \"${id}\" cannot be shared by a timeline and a standard panel; ` +\n `the most recent registration controls where it renders.`\n );\n }\n this.configurePanelRetention(id, options);\n this.registrationCounts.set(id, (this.registrationCounts.get(id) ?? 0) + 1);\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', defaultValues);\n\n const persisted = this.loadPersistedPanel(id);\n const previousValues = this.panels.get(id)?.values ?? this.snapshots.get(id) ?? persisted?.values ?? {};\n const values = this.reconcileValues(defaultValues, previousValues, controlsByPath);\n\n const previousBaseValues = this.baseValues.get(id) ?? persisted?.baseValues ?? persisted?.values ?? {};\n const baseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n this.panels.set(id, { id, name, controls, values, shortcuts: shortcuts ?? {}, kind: options.kind });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, baseValues);\n this.defaultValues.set(id, { ...defaultValues });\n\n const existingPresets = this.presets.get(id) ?? persisted?.presets;\n if (existingPresets) {\n this.presets.set(id, this.reconcilePresets(existingPresets, defaultValues, controlsByPath));\n }\n if (!this.activePreset.has(id) && persisted?.activePresetId !== undefined) {\n this.activePreset.set(id, persisted.activePresetId);\n }\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n this.configurePanelRetention(id, options);\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config, shortcuts, options);\n return;\n }\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n this.initTransitionModes(config, '', defaultValues);\n const nextValues = this.reconcileValues(defaultValues, existing.values, controlsByPath);\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues, shortcuts: shortcuts ?? existing.shortcuts, kind: options.kind ?? existing.kind };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n for (const [path, value] of Object.entries(nextValues)) {\n if (path.endsWith('.__mode')) {\n nextBaseValues[path] = value;\n }\n }\n\n this.baseValues.set(id, nextBaseValues);\n this.defaultValues.set(id, { ...defaultValues });\n this.presets.set(id, this.reconcilePresets(this.presets.get(id) ?? [], defaultValues, controlsByPath));\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.panels.delete(id);\n // Keep listener sets: subscribed components can outlive the registration\n // (HMR unregister/re-register of the same id) and must keep receiving\n // notifications. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n if (this.actionListeners.get(id)?.size === 0) this.actionListeners.delete(id);\n\n if (!this.retainedPanels.has(id)) {\n this.snapshots.delete(id);\n this.baseValues.delete(id);\n this.defaultValues.delete(id);\n this.presets.delete(id);\n this.activePreset.delete(id);\n this.persistConfigs.delete(id);\n }\n\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n this.updateValues(panelId, { [path]: value });\n }\n\n updateValues(panelId: string, updates: Record<string, DialValue>): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const validUpdates: Record<string, DialValue> = {};\n\n for (const [path, value] of Object.entries(updates)) {\n if (!Object.prototype.hasOwnProperty.call(panel.values, path)) {\n continue;\n }\n\n const control = this.findControlByPath(panel.controls, path);\n if (control?.type === 'action') {\n continue;\n }\n\n panel.values[path] = value;\n validUpdates[path] = value;\n }\n\n if (Object.keys(validUpdates).length === 0) {\n return;\n }\n\n // Auto-save to active preset or base values\n const activeId = this.activePreset.get(panelId);\n if (activeId) {\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === activeId);\n if (preset) {\n for (const [path, value] of Object.entries(validUpdates)) {\n preset.values[path] = value;\n }\n }\n } else {\n const base = this.baseValues.get(panelId);\n if (base) {\n for (const [path, value] of Object.entries(validUpdates)) {\n base[path] = value;\n }\n }\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resetValues(panelId: string): void {\n const panel = this.panels.get(panelId);\n const defaults = this.defaultValues.get(panelId);\n if (!panel || !defaults) return;\n\n panel.values = { ...defaults };\n this.snapshots.set(panelId, { ...panel.values });\n this.baseValues.set(panelId, { ...defaults });\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n updateSpringMode(panelId: string, path: string, mode: 'simple' | 'advanced'): void {\n this.updateTransitionMode(panelId, path, mode);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const mode = this.getTransitionMode(panelId, path);\n if (mode === 'easing') return 'simple';\n return mode;\n }\n\n updateTransitionMode(panelId: string, path: string, mode: 'easing' | 'simple' | 'advanced'): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[`${path}.__mode`] = mode;\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getTransitionMode(panelId: string, path: string): 'easing' | 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as 'easing' | 'simple' | 'advanced') || 'simple';\n }\n\n getValue(panelId: string, path: string): DialValue | undefined {\n const panel = this.panels.get(panelId);\n return panel?.values[path];\n }\n\n getValues(panelId: string): Record<string, DialValue> {\n // Return the snapshot for useSyncExternalStore compatibility\n // Use stable EMPTY_VALUES to avoid infinite loop in React 19\n return this.snapshots.get(panelId) ?? EMPTY_VALUES;\n }\n\n getPanels(kind?: 'panel' | 'timeline'): PanelConfig[] {\n // Stable reference between global notifications: getSnapshot-style\n // consumers (React useSyncExternalStore, Solid `from`) compare by\n // identity, and a fresh array on every call makes them loop or re-render.\n if (kind === 'panel') return this.standardPanelsSnapshot;\n if (kind === 'timeline') return this.timelinePanelsSnapshot;\n return this.panelsSnapshot;\n }\n\n getPanel(id: string): PanelConfig | undefined {\n return this.panels.get(id);\n }\n\n subscribe(panelId: string, listener: Listener): () => void {\n if (!this.listeners.has(panelId)) {\n this.listeners.set(panelId, new Set());\n }\n this.listeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.listeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.listeners.delete(panelId);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => this.globalListeners.delete(listener);\n }\n\n subscribeActions(panelId: string, listener: ActionListener): () => void {\n if (!this.actionListeners.has(panelId)) {\n this.actionListeners.set(panelId, new Set());\n }\n this.actionListeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.actionListeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.actionListeners.delete(panelId);\n }\n };\n }\n\n triggerAction(panelId: string, path: string): void {\n this.actionListeners.get(panelId)?.forEach(fn => fn(path));\n }\n\n savePreset(panelId: string, name: string): string {\n const panel = this.panels.get(panelId);\n if (!panel) throw new Error(`Panel ${panelId} not found`);\n\n const id = `preset-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const preset: Preset = {\n id,\n name,\n values: { ...panel.values },\n };\n\n const existing = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, [...existing, preset]);\n this.activePreset.set(panelId, id);\n\n // Force re-render by creating new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n\n return id;\n }\n\n loadPreset(panelId: string, presetId: string): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === presetId);\n if (!preset) return;\n\n // Apply preset values\n panel.values = { ...preset.values };\n this.snapshots.set(panelId, { ...panel.values });\n this.activePreset.set(panelId, presetId);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n deletePreset(panelId: string, presetId: string): void {\n const presets = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, presets.filter(p => p.id !== presetId));\n\n // Clear active if deleted\n if (this.activePreset.get(panelId) === presetId) {\n this.activePreset.set(panelId, null);\n }\n\n // Force re-render by creating new snapshot reference\n const panel = this.panels.get(panelId);\n if (panel) {\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getPresets(panelId: string): Preset[] {\n return this.presets.get(panelId) ?? [];\n }\n\n getActivePresetId(panelId: string): string | null {\n return this.activePreset.get(panelId) ?? null;\n }\n\n clearActivePreset(panelId: string): void {\n const panel = this.panels.get(panelId);\n const base = this.baseValues.get(panelId);\n if (panel && base) {\n panel.values = { ...base };\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resolveShortcutTarget(key: string, modifier?: 'alt' | 'shift' | 'meta'): {\n panelId: string;\n path: string;\n control: ControlMeta;\n } | null {\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue; // skip keyless shortcuts\n if (shortcut.key.toLowerCase() !== key.toLowerCase()) continue;\n const scMod = shortcut.modifier ?? undefined;\n if (scMod !== modifier) continue;\n\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n return { panelId: panel.id, path, control };\n }\n }\n }\n return null;\n }\n\n resolveScrollOnlyTargets(): Array<{\n panelId: string;\n path: string;\n control: ControlMeta;\n shortcut: ShortcutConfig;\n }> {\n const results: Array<{ panelId: string; path: string; control: ControlMeta; shortcut: ShortcutConfig }> = [];\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if ((shortcut.interaction ?? 'scroll') !== 'scroll-only') continue;\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n results.push({ panelId: panel.id, path, control, shortcut });\n }\n }\n }\n return results;\n }\n\n private configurePanelRetention(id: string, options: DialStorePanelOptions): void {\n if (options.retainOnUnmount) {\n this.retainedPanels.add(id);\n }\n\n const persistConfig = this.normalizePersistConfig(id, options.persist);\n if (persistConfig) {\n this.persistConfigs.set(id, persistConfig);\n this.retainedPanels.add(id);\n }\n }\n\n private reconcileValues(\n defaultValues: Record<string, DialValue>,\n previousValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Record<string, DialValue> {\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n if (path.endsWith('.__mode')) {\n const transitionPath = path.slice(0, -'.__mode'.length);\n const transitionControl = controlsByPath.get(transitionPath);\n nextValues[path] = transitionControl?.type === 'transition' && previousValues[path] !== undefined\n ? previousValues[path]\n : defaultValue;\n continue;\n }\n\n nextValues[path] = this.normalizePreservedValue(\n previousValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n return nextValues;\n }\n\n private reconcilePresets(\n presets: Preset[],\n defaultValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Preset[] {\n return presets.map((preset) => ({\n ...preset,\n values: this.reconcileValues(defaultValues, preset.values, controlsByPath),\n }));\n }\n\n private normalizePersistConfig(id: string, persist: DialKitPersistOptions | undefined): PersistConfig | null {\n if (!persist) return null;\n const options = typeof persist === 'object' ? persist : {};\n return {\n key: options.key ?? `dialkit:${id}`,\n storage: options.storage ?? 'localStorage',\n presets: options.presets ?? true,\n };\n }\n\n private loadPersistedPanel(id: string): PersistedPanelState | null {\n const config = this.persistConfigs.get(id);\n if (!config) return null;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(config.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as PersistedPanelState;\n if (parsed?.version !== 1 || typeof parsed !== 'object') return null;\n return parsed;\n } catch {\n return null;\n }\n }\n\n private persistPanel(id: string): void {\n const config = this.persistConfigs.get(id);\n if (!config) return;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return;\n\n const values = this.snapshots.get(id) ?? this.panels.get(id)?.values;\n if (!values) return;\n\n const state: PersistedPanelState = {\n version: 1,\n values,\n baseValues: this.baseValues.get(id) ?? values,\n activePresetId: this.activePreset.get(id) ?? null,\n };\n\n if (config.presets) {\n state.presets = this.presets.get(id) ?? [];\n }\n\n try {\n storage.setItem(config.key, JSON.stringify(state));\n } catch {\n // Ignore storage quota/security errors; DialKit should still work in-memory.\n }\n }\n\n private getStorage(kind: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof globalThis === 'undefined' || !('window' in globalThis)) {\n return null;\n }\n\n try {\n return kind === 'sessionStorage'\n ? globalThis.window?.sessionStorage ?? null\n : globalThis.window?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private findControlByPath(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = this.findControlByPath(control.children, path);\n if (found) return found;\n }\n }\n return null;\n }\n\n private notify(panelId: string): void {\n this.listeners.get(panelId)?.forEach(fn => fn());\n }\n\n private notifyGlobal(): void {\n this.panelsSnapshot = Array.from(this.panels.values());\n this.standardPanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind !== 'timeline');\n this.timelinePanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind === 'timeline');\n this.globalListeners.forEach(fn => fn());\n }\n\n private initTransitionModes(config: DialConfig, prefix: string, values: Record<string, DialValue>): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (this.isEasingConfig(value)) {\n values[`${path}.__mode`] = 'easing';\n } else if (this.isSpringConfig(value)) {\n // Detect physics mode from config\n const hasPhysics = value.stiffness !== undefined || value.damping !== undefined || value.mass !== undefined;\n const hasTime = value.visualDuration !== undefined || value.bounce !== undefined;\n values[`${path}.__mode`] = hasPhysics && !hasTime ? 'advanced' : 'simple';\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value) && !this.isActionConfig(value) && !this.isSelectConfig(value) && !this.isColorConfig(value) && !this.isTextConfig(value)) {\n this.initTransitionModes(value as DialConfig, path, values);\n }\n }\n }\n\n private parseConfig(config: DialConfig, prefix: string, shortcuts?: Record<string, ShortcutConfig>): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n const shortcut = shortcuts?.[path];\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n // Range tuple: [default, min, max]\n controls.push({\n type: 'slider',\n path,\n label,\n min: value[1],\n max: value[2],\n step: value[3] ?? this.inferStep(value[1], value[2]),\n shortcut,\n });\n } else if (typeof value === 'number') {\n // Single number - auto-infer range\n const { min, max, step } = this.inferRange(value);\n controls.push({ type: 'slider', path, label, min, max, step, shortcut });\n } else if (typeof value === 'boolean') {\n controls.push({ type: 'toggle', path, label, shortcut });\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n controls.push({ type: 'transition', path, label });\n } else if (this.isActionConfig(value)) {\n controls.push({ type: 'action', path, label: (value as ActionConfig).label || label });\n } else if (this.isSelectConfig(value)) {\n controls.push({ type: 'select', path, label, options: value.options });\n } else if (this.isColorConfig(value)) {\n controls.push({ type: 'color', path, label });\n } else if (this.isTextConfig(value)) {\n controls.push({ type: 'text', path, label, placeholder: value.placeholder });\n } else if (typeof value === 'string') {\n // Auto-detect: hex color vs text\n if (this.isHexColor(value)) {\n controls.push({ type: 'color', path, label });\n } else {\n controls.push({ type: 'text', path, label });\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object becomes a folder\n const folderConfig = value as DialConfig;\n const defaultOpen = '_collapsed' in folderConfig ? !(folderConfig._collapsed as boolean) : true;\n controls.push({\n type: 'folder',\n path,\n label,\n defaultOpen,\n children: this.parseConfig(folderConfig, path, shortcuts),\n });\n }\n }\n\n return controls;\n }\n\n private flattenValues(config: DialConfig, prefix: string): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n values[path] = value[0]; // Default value\n } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n values[path] = value;\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n values[path] = value;\n } else if (this.isActionConfig(value)) {\n // Actions don't need stored values - they're just triggers\n values[path] = value;\n } else if (this.isSelectConfig(value)) {\n // Use default or first option's value\n const firstOption = value.options[0];\n const firstValue = typeof firstOption === 'string' ? firstOption : firstOption.value;\n values[path] = value.default ?? firstValue;\n } else if (this.isColorConfig(value)) {\n values[path] = value.default ?? '#000000';\n } else if (this.isTextConfig(value)) {\n values[path] = value.default ?? '';\n } else if (typeof value === 'object' && value !== null) {\n Object.assign(values, this.flattenValues(value as DialConfig, path));\n }\n }\n\n return values;\n }\n\n private isSpringConfig(value: unknown): value is SpringConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SpringConfig).type === 'spring'\n );\n }\n\n private isEasingConfig(value: unknown): value is EasingConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as EasingConfig).type === 'easing'\n );\n }\n\n private isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ActionConfig).type === 'action'\n );\n }\n\n private isSelectConfig(value: unknown): value is SelectConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SelectConfig).type === 'select' &&\n 'options' in value &&\n Array.isArray((value as SelectConfig).options)\n );\n }\n\n private isColorConfig(value: unknown): value is ColorConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ColorConfig).type === 'color'\n );\n }\n\n private isTextConfig(value: unknown): value is TextConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as TextConfig).type === 'text'\n );\n }\n\n private isHexColor(value: string): boolean {\n return isHexColor(value);\n }\n\n private formatLabel(key: string): string {\n return formatLabel(key);\n }\n\n private inferRange(value: number): { min: number; max: number; step: number } {\n // Infer reasonable range based on value\n if (value >= 0 && value <= 1) {\n return { min: 0, max: 1, step: 0.01 };\n } else if (value >= 0 && value <= 10) {\n return { min: 0, max: value * 3 || 10, step: 0.1 };\n } else if (value >= 0 && value <= 100) {\n return { min: 0, max: value * 3 || 100, step: 1 };\n } else if (value >= 0) {\n return { min: 0, max: value * 3 || 1000, step: 10 };\n } else {\n return { min: value * 3, max: -value * 3, step: 1 };\n }\n }\n\n private inferStep(min: number, max: number): number {\n return inferStep(min, max);\n }\n\n private normalizePreservedValue(\n existingValue: DialValue | undefined,\n defaultValue: DialValue,\n control: ControlMeta | undefined\n ): DialValue {\n if (existingValue === undefined || !control) {\n return defaultValue;\n }\n\n switch (control.type) {\n case 'slider': {\n if (typeof existingValue !== 'number' || typeof defaultValue !== 'number') {\n return defaultValue;\n }\n\n const min = control.min ?? Number.NEGATIVE_INFINITY;\n const max = control.max ?? Number.POSITIVE_INFINITY;\n const clamped = Math.min(max, Math.max(min, existingValue));\n\n if (typeof control.step !== 'number' || control.step <= 0) {\n return clamped;\n }\n\n return this.roundToStep(clamped, min, max, control.step);\n }\n case 'toggle':\n return typeof existingValue === 'boolean' ? existingValue : defaultValue;\n case 'select': {\n if (typeof existingValue !== 'string') {\n return defaultValue;\n }\n\n const options = control.options ?? [];\n const validValues = new Set(options.map((option) => (typeof option === 'string' ? option : option.value)));\n return validValues.has(existingValue) ? existingValue : defaultValue;\n }\n case 'color':\n case 'text':\n return typeof existingValue === 'string' ? existingValue : defaultValue;\n case 'transition':\n if (this.isSpringConfig(defaultValue)) {\n return this.isSpringConfig(existingValue) ? existingValue : defaultValue;\n }\n if (this.isEasingConfig(defaultValue)) {\n return this.isEasingConfig(existingValue) ? existingValue : defaultValue;\n }\n return defaultValue;\n case 'action':\n return defaultValue;\n default:\n return defaultValue;\n }\n }\n\n private roundToStep(value: number, min: number, max: number, step: number): number {\n const snapped = min + Math.round((value - min) / step) * step;\n const clamped = Math.min(max, Math.max(min, snapped));\n const precision = this.stepPrecision(step);\n return Number(clamped.toFixed(precision));\n }\n\n private stepPrecision(step: number): number {\n const text = String(step);\n const decimalIndex = text.indexOf('.');\n return decimalIndex === -1 ? 0 : text.length - decimalIndex - 1;\n }\n\n private mapControlsByPath(controls: ControlMeta[]): Map<string, ControlMeta> {\n const map = new Map<string, ControlMeta>();\n\n const visit = (nodes: ControlMeta[]) => {\n for (const node of nodes) {\n if (node.type === 'folder' && node.children) {\n visit(node.children);\n continue;\n }\n\n map.set(node.path, node);\n }\n };\n\n visit(controls);\n return map;\n }\n\n}\n\n// Singleton instance\nexport const DialStore = /* @__PURE__ */ new DialStoreClass();\n","import { useCallback, useEffect, useId, useRef, useSyncExternalStore } from 'react';\nimport { DialStore } from '../store/DialStore';\nimport type { DialConfig, DialKitPersistOptions, DialValue, ShortcutConfig } from '../store/DialStore';\n\nexport interface UseDialStorePanelOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n shortcuts?: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n}\n\n// Serialize with a referential short-circuit: consumers can re-render at 60Hz\n// during timeline playback, and re-stringifying an unchanged config every\n// frame is wasted work whenever the object is memoized or module-stable.\nexport function useSerialized(value: unknown): string {\n const ref = useRef<{ value: unknown; text: string }>();\n if (!ref.current || !Object.is(ref.current.value, value)) {\n ref.current = { value, text: JSON.stringify(value) };\n }\n return ref.current.text;\n}\n\n// The DialStore panel lifecycle shared by useDialKit and useDialTimeline:\n// stable panel id, register on mount / unregister on unmount, push structure\n// changes on config edits, and subscribe to the flat value snapshot.\n// Fixes to StrictMode/HMR behavior belong here so every panel-backed hook\n// gets them.\nexport function useDialStorePanel(\n name: string,\n config: DialConfig,\n options: UseDialStorePanelOptions = {}\n): { panelId: string; flatValues: Record<string, DialValue>; serializedConfig: string } {\n const instanceId = useId();\n const hasStableId = options.id !== undefined;\n const panelId = options.id ?? `${name}-${instanceId}`;\n\n const configRef = useRef(config);\n configRef.current = config;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const serializedConfig = useSerialized(config);\n const serializedShortcuts = useSerialized(options.shortcuts);\n const serializedPersist = useSerialized(options.persist);\n\n // Register on mount\n useEffect(() => {\n DialStore.registerPanel(panelId, name, configRef.current, optionsRef.current.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: optionsRef.current.persist,\n kind: optionsRef.current.kind,\n });\n return () => DialStore.unregisterPanel(panelId);\n }, [hasStableId, panelId, name]);\n\n // Push structure changes without re-registering\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n DialStore.updatePanel(panelId, name, configRef.current, optionsRef.current.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: optionsRef.current.persist,\n kind: optionsRef.current.kind,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasStableId, panelId, name, serializedConfig, serializedShortcuts, serializedPersist]);\n\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(() => DialStore.getValues(panelId), [panelId]);\n\n // DialStore.getValues returns a stable empty object when panel is not registered.\n const flatValues = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return { panelId, flatValues, serializedConfig };\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport { isDevDefault } from '../env';\nimport { Folder } from './Folder';\nimport { Panel } from './Panel';\nimport { ShortcutListener } from './ShortcutListener';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport { blockPanelDragClick, getPanelDragHandle, getPanelDragOffset, getPanelDragStart, getPanelOriginX, hasPanelDragMoved } from '../panel-drag';\n\nexport type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\nexport type DialMode = 'popover' | 'inline';\nexport type DialTheme = 'light' | 'dark' | 'system';\n\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n theme?: DialTheme;\n productionEnabled?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function DialRoot({ position = 'top-right', defaultOpen = true, mode = 'popover', theme = 'system', productionEnabled = isDevDefault, onOpenChange }: DialRootProps) {\n if (!productionEnabled) return null;\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [timelineCount, setTimelineCount] = useState(0);\n const [mounted, setMounted] = useState(false);\n const inline = mode === 'inline';\n\n // Drag state\n const panelRef = useRef<HTMLDivElement>(null);\n const [dragOffset, setDragOffset] = useState<{ x: number; y: number } | null>(null);\n const [activePosition, setActivePosition] = useState(position);\n const lastDragOffset = useRef<{ x: number; y: number } | null>(null);\n const draggingRef = useRef(false);\n const dragStartRef = useRef<{ pointerX: number; pointerY: number; elX: number; elY: number } | null>(null);\n const didDragRef = useRef(false);\n const dragTargetRef = useRef<HTMLElement | null>(null);\n const panelOpenStatesRef = useRef<Map<string, boolean>>(new Map());\n const rootOpenRef = useRef<boolean | null>(null);\n\n // Subscribe to registered editing surfaces. Timeline-backed panels render\n // in DialTimeline, but their presence adds a visibility toggle here.\n useEffect(() => {\n setMounted(true);\n setPanels(DialStore.getPanels('panel'));\n setTimelineCount(TimelineStore.getTimelines().length);\n\n const unsubscribePanels = DialStore.subscribeGlobal(() => {\n setPanels(DialStore.getPanels('panel'));\n });\n const unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n setTimelineCount(TimelineStore.getTimelines().length);\n });\n\n return () => {\n unsubscribePanels();\n unsubscribeTimelines();\n };\n }, []);\n\n useEffect(() => {\n const fallbackOpen = inline || defaultOpen;\n const nextStates = new Map<string, boolean>();\n for (const panel of panels) {\n nextStates.set(panel.id, panelOpenStatesRef.current.get(panel.id) ?? fallbackOpen);\n }\n panelOpenStatesRef.current = nextStates;\n rootOpenRef.current = Array.from(nextStates.values()).some(Boolean);\n }, [defaultOpen, inline, panels]);\n\n // Watch for panel open/close — snap to corner on open, restore drag position on close\n useEffect(() => {\n if (!panelRef.current || inline) return;\n const observer = new MutationObserver(() => {\n const inners = panelRef.current?.querySelectorAll('.dialkit-panel-inner');\n if (!inners || inners.length === 0) return;\n const collapsed = Array.from(inners).every(\n (el) => el.getAttribute('data-collapsed') === 'true'\n );\n const currentDragOffset = dragOffset;\n\n if (!collapsed) {\n // Opening — save drag position, determine corner, snap\n if (currentDragOffset) {\n lastDragOffset.current = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n const midX = window.innerWidth / 2;\n setActivePosition(bubbleCenterX < midX ? 'top-left' : 'top-right');\n } else {\n setActivePosition(position);\n }\n setDragOffset(null);\n } else if (currentDragOffset) {\n lastDragOffset.current = currentDragOffset;\n } else if (lastDragOffset.current) {\n // Closing — restore the dragged position\n setDragOffset(lastDragOffset.current);\n }\n });\n observer.observe(panelRef.current, { subtree: true, attributes: true, attributeFilter: ['data-collapsed'] });\n return () => observer.disconnect();\n }, [inline, dragOffset, position]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const panel = panelRef.current;\n const handle = getPanelDragHandle(e.target, panel);\n if (!panel || !handle) return;\n\n dragTargetRef.current = handle;\n dragStartRef.current = getPanelDragStart(e.clientX, e.clientY, panel);\n didDragRef.current = false;\n draggingRef.current = true;\n handle.setPointerCapture(e.pointerId);\n }, []);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current || !dragStartRef.current) return;\n\n if (!didDragRef.current && !hasPanelDragMoved(dragStartRef.current, e.clientX, e.clientY)) return;\n didDragRef.current = true;\n\n setDragOffset(getPanelDragOffset(dragStartRef.current, e.clientX, e.clientY));\n }, []);\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n dragStartRef.current = null;\n const dragTarget = dragTargetRef.current;\n\n if (dragTarget?.hasPointerCapture(e.pointerId)) {\n dragTarget.releasePointerCapture(e.pointerId);\n }\n\n // If we actually dragged, prevent the click from opening the panel\n if (didDragRef.current) {\n e.stopPropagation();\n if (dragTarget) {\n blockPanelDragClick(dragTarget);\n }\n }\n dragTargetRef.current = null;\n }, []);\n\n const handlePanelOpenChange = useCallback((panelId: string, open: boolean) => {\n panelOpenStatesRef.current.set(panelId, open);\n const fallbackOpen = inline || defaultOpen;\n const nextRootOpen = panels.some((panel) => (\n panelOpenStatesRef.current.get(panel.id) ?? fallbackOpen\n ));\n\n if (rootOpenRef.current === nextRootOpen) return;\n rootOpenRef.current = nextRootOpen;\n onOpenChange?.(nextRootOpen);\n }, [defaultOpen, inline, onOpenChange, panels]);\n\n const handleRootOpenChange = useCallback((open: boolean) => {\n if (rootOpenRef.current === open) return;\n rootOpenRef.current = open;\n onOpenChange?.(open);\n }, [onOpenChange]);\n\n // Don't render on server\n if (!mounted || typeof window === 'undefined') {\n return null;\n }\n\n // Don't render if no editing surfaces are registered.\n if (panels.length === 0 && timelineCount === 0) {\n return null;\n }\n\n const dragStyle = dragOffset ? {\n top: dragOffset.y,\n left: dragOffset.x,\n right: 'auto' as const,\n bottom: 'auto' as const,\n } : undefined;\n const originX = getPanelOriginX(activePosition, dragOffset);\n const hasMultiplePanels = panels.length > 1;\n const timelineToggle = timelineCount > 0 ? <TimelineToggleButton /> : null;\n\n const content = (\n <ShortcutListener>\n <div className=\"dialkit-root\" data-mode={mode} data-theme={theme}>\n <div\n ref={panelRef}\n className=\"dialkit-panel\"\n data-position={inline ? undefined : (dragOffset ? undefined : activePosition)}\n data-origin-x={inline ? undefined : originX}\n data-mode={mode}\n data-multiple={hasMultiplePanels ? 'true' : undefined}\n style={dragStyle}\n onPointerDown={!inline ? handlePointerDown : undefined}\n onPointerMove={!inline ? handlePointerMove : undefined}\n onPointerUp={!inline ? handlePointerUp : undefined}\n onPointerCancel={!inline ? handlePointerUp : undefined}\n >\n {panels.length === 0 ? (\n <div className=\"dialkit-panel-wrapper\">\n <Folder\n title=\"DialKit\"\n defaultOpen={inline || defaultOpen}\n isRoot={true}\n inline={inline}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle}\n panelHeightOffset={2}\n >\n <div className=\"dialkit-timeline-toolkit-only\">Timeline</div>\n </Folder>\n </div>\n ) : hasMultiplePanels ? (\n <div className=\"dialkit-panel-wrapper\">\n <Folder\n title=\"DialKit\"\n defaultOpen={inline || defaultOpen}\n isRoot={true}\n inline={inline}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle}\n panelHeightOffset={2}\n >\n {panels.map((panel) => (\n <Panel\n key={panel.id}\n panel={panel}\n defaultOpen={true}\n variant=\"section\"\n />\n ))}\n </Folder>\n </div>\n ) : (\n panels.map((panel) => (\n <Panel\n key={panel.id}\n panel={panel}\n defaultOpen={inline || defaultOpen}\n inline={inline}\n toolbarExtra={timelineToggle}\n onOpenChange={(open) => handlePanelOpenChange(panel.id, open)}\n />\n ))\n )}\n </div>\n </div>\n </ShortcutListener>\n );\n\n if (inline) {\n return content;\n }\n\n return createPortal(content, document.body);\n}\n","// Playback transport + registry for DialKit timelines.\n// Clip values (at/duration/from/to) live in DialStore under the timeline's\n// panel id — this store only owns time: the clock, play state, and the\n// track/clip structure the dock UI renders.\n\nexport type TimelineClipTrackMeta = {\n prop: string;\n /** Step folder keys when the track is a sequence. */\n stepKeys?: string[];\n};\n\nexport type TimelineClipMeta = {\n key: string; // config path; also the DialStore path prefix, e.g. \"cardEnter\" or \"circle.path\"\n label: string;\n color: string;\n /** Code-defined playback behavior; intentionally not exposed as a dial. */\n loop: 'off' | 'repeat';\n /** Group key when the clip lives inside a nested layer, e.g. \"circle\". */\n group?: string;\n /** Step folder keys for sequence clips, e.g. [\"step1\", \"step2\"]. */\n stepKeys?: string[];\n /** Independent property tracks of a props clip — full rows when expanded. */\n tracks?: TimelineClipTrackMeta[];\n};\n\nexport type TimelineMeta = {\n id: string; // same id as the DialStore panel\n name: string;\n duration: number; // seconds\n loop: boolean;\n /** Loop wraps back to this time, not 0 — clips before it play once\n * (intro-then-idle). 0 loops the whole timeline. */\n loopStart: number;\n clips: TimelineClipMeta[]; // one row each\n};\n\nexport type TimelineTransport = {\n time: number;\n playing: boolean;\n duration: number;\n /** Completed loop passes — keeps looping clips phase-continuous across\n * timeline wraps. Reset by seek/replay so scrubbing stays deterministic. */\n wraps: number;\n};\n\ntype Listener = () => void;\n\n/** Length of the repeating span — the whole timeline unless a loop region\n * narrows it. Degenerate regions (start ≥ duration) fall back to the whole\n * timeline so a bad `from` never stalls the clock. */\nexport function loopSpan(duration: number, loopStart: number): number {\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n if (!Number.isFinite(loopStart)) loopStart = 0;\n const start = Math.min(Math.max(0, loopStart), duration);\n return duration - start > 0 ? duration - start : duration;\n}\n\n/** Folds an over-run playhead back into the loop region, reporting how many\n * spans were crossed so continuous time (wraps × span + time) never jumps. */\nexport function foldLoopTime(\n time: number,\n duration: number,\n loopStart = 0\n): { time: number; wraps: number } {\n if (!Number.isFinite(time) || !Number.isFinite(duration) || duration <= 0) {\n return { time: 0, wraps: 0 };\n }\n if (time < duration) return { time, wraps: 0 };\n const span = loopSpan(duration, loopStart);\n const base = duration - span;\n const over = time - base;\n return { time: base + (over % span), wraps: Math.floor(over / span) };\n}\n\nexport const TIMELINE_CLIP_COLORS = [\n '#E8E8E8', // neutral white — slightly off-white so the pure-white selection ring still reads\n];\n\nconst EMPTY_TRANSPORT: TimelineTransport = Object.freeze({ time: 0, playing: false, duration: 0, wraps: 0 });\n\nclass TimelineStoreClass {\n private timelines: Map<string, TimelineMeta> = new Map();\n private transports: Map<string, TimelineTransport> = new Map();\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private registrationCounts: Map<string, number> = new Map();\n private listCache: TimelineMeta[] | null = null;\n private rafId: number | null = null;\n private lastTick = 0;\n\n register(meta: TimelineMeta, options: { autoplay: boolean }): void {\n const existing = this.timelines.get(meta.id);\n if (existing && existing.name !== meta.name) {\n console.warn(\n `[dialkit] Timeline id \"${meta.id}\" is already registered by \"${existing.name}\"; ` +\n `\"${meta.name}\" will share and overwrite that transport.`\n );\n }\n this.registrationCounts.set(meta.id, (this.registrationCounts.get(meta.id) ?? 0) + 1);\n this.applyMeta(meta, options.autoplay);\n }\n\n update(meta: TimelineMeta): void {\n if (!this.timelines.has(meta.id)) return;\n this.applyMeta(meta, false);\n }\n\n unregister(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.timelines.delete(id);\n this.transports.delete(id);\n // Keep listener sets: subscribers (e.g. a mounted dock) may outlive the\n // registration — HMR tears down and re-registers the same id, and their\n // subscriptions must survive it. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n this.listCache = null;\n this.notifyGlobal();\n }\n\n play(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0 || transport.playing) return;\n // Play from the top when the playhead is parked at the end\n const restart = transport.time >= transport.duration;\n this.transports.set(id, {\n ...transport,\n time: restart ? 0 : transport.time,\n wraps: restart ? 0 : transport.wraps,\n playing: true,\n });\n this.notify(id);\n this.ensureLoop();\n }\n\n pause(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || !transport.playing) return;\n this.transports.set(id, { ...transport, playing: false });\n this.notify(id);\n }\n\n replay(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0) return;\n this.transports.set(id, { ...transport, time: 0, wraps: 0, playing: true });\n this.notify(id);\n this.ensureLoop();\n }\n\n seek(id: string, time: number): void {\n const transport = this.transports.get(id);\n if (!transport || !Number.isFinite(time)) return;\n const clamped = Math.min(transport.duration, Math.max(0, time));\n // Scrubbing pins the deterministic first-pass state\n this.transports.set(id, { ...transport, time: clamped, wraps: 0 });\n this.notify(id);\n }\n\n getTransport(id: string): TimelineTransport {\n return this.transports.get(id) ?? EMPTY_TRANSPORT;\n }\n\n getTimeline(id: string): TimelineMeta | undefined {\n return this.timelines.get(id);\n }\n\n getTimelines(): TimelineMeta[] {\n if (!this.listCache) {\n this.listCache = Array.from(this.timelines.values());\n }\n return this.listCache;\n }\n\n subscribe(id: string, listener: Listener): () => void {\n if (!this.listeners.has(id)) {\n this.listeners.set(id, new Set());\n }\n this.listeners.get(id)!.add(listener);\n return () => {\n const listeners = this.listeners.get(id);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.timelines.has(id)) {\n this.listeners.delete(id);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private applyMeta(meta: TimelineMeta, autoplay: boolean): void {\n const duration = Number.isFinite(meta.duration) ? Math.max(0, meta.duration) : 0;\n const loopStart = Number.isFinite(meta.loopStart)\n ? Math.min(duration, Math.max(0, meta.loopStart))\n : 0;\n const safeMeta = { ...meta, duration, loopStart };\n this.timelines.set(meta.id, safeMeta);\n\n const existing = this.transports.get(meta.id);\n if (existing) {\n // Structure changed or remounted — keep the playhead, clamp to the new length\n this.transports.set(meta.id, {\n time: Math.min(existing.time, duration),\n playing: duration > 0 && existing.playing,\n duration,\n wraps: existing.wraps,\n });\n } else {\n const playing = duration > 0 && autoplay;\n this.transports.set(meta.id, { time: 0, playing, duration, wraps: 0 });\n if (playing) this.ensureLoop();\n }\n\n this.listCache = null;\n this.notify(meta.id);\n this.notifyGlobal();\n }\n\n private ensureLoop(): void {\n if (this.rafId !== null || typeof window === 'undefined') return;\n this.lastTick = performance.now();\n this.rafId = window.requestAnimationFrame(this.tick);\n }\n\n private tick = (now: number): void => {\n // Advance by wall time. A backgrounded tab lands at the state it would\n // have reached, rather than silently slowing the animation on return.\n const dt = Math.max(0, (now - this.lastTick) / 1000);\n this.lastTick = now;\n\n let anyPlaying = false;\n for (const [id, transport] of this.transports) {\n if (!transport.playing) continue;\n\n const meta = this.timelines.get(id);\n const duration = meta?.duration ?? transport.duration;\n if (!Number.isFinite(duration) || duration <= 0) {\n this.transports.set(id, { time: 0, playing: false, duration: 0, wraps: 0 });\n this.notify(id);\n continue;\n }\n let time = transport.time + dt;\n let playing = true;\n let wraps = transport.wraps;\n\n if (time >= duration) {\n if (meta?.loop) {\n const folded = foldLoopTime(time, duration, meta.loopStart);\n time = folded.time;\n wraps += folded.wraps;\n } else {\n time = duration;\n playing = false;\n }\n }\n\n this.transports.set(id, { time, playing, duration, wraps });\n if (playing) anyPlaying = true;\n this.notify(id);\n }\n\n this.rafId = anyPlaying ? window.requestAnimationFrame(this.tick) : null;\n };\n\n private notify(id: string): void {\n this.listeners.get(id)?.forEach((fn) => fn());\n }\n\n private notifyGlobal(): void {\n this.globalListeners.forEach((fn) => fn());\n }\n}\n\n// PURE lets bundlers drop the timeline entirely for panel-only users.\nexport const TimelineStore = /* @__PURE__ */ new TimelineStoreClass();\n","// Shared environment detection for dev-only rendering.\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nexport const isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n","import { useState, useRef, useEffect, ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ICON_PANEL, ICON_CHEVRON } from '../icons';\n\ninterface FolderProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n isRoot?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: ReactNode;\n panelHeightOffset?: number;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = false, inline = false, onOpenChange, toolbar, panelHeightOffset = 10 }: FolderProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isCollapsed, setIsCollapsed] = useState(!defaultOpen);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n const [windowHeight, setWindowHeight] = useState(typeof window !== 'undefined' ? window.innerHeight : 800);\n\n useEffect(() => {\n if (!isRoot) return;\n const onResize = () => setWindowHeight(window.innerHeight);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, [isRoot]);\n\n // Track content height for explicit panel sizing (no height: 'auto')\n useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n if (isOpen) {\n const h = el.offsetHeight;\n setContentHeight(prev => prev === h ? prev : h);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen]);\n\n const handleToggle = () => {\n if (inline && isRoot) return;\n const next = !isOpen;\n setIsOpen(next);\n if (next) {\n setIsCollapsed(false);\n } else {\n setIsCollapsed(true);\n }\n onOpenChange?.(next);\n };\n\n const folderContent = (\n <div\n ref={isRoot ? contentRef : undefined}\n className={`dialkit-folder ${isRoot ? 'dialkit-folder-root' : ''}`}\n data-open={String(isOpen)}\n >\n <div className={`dialkit-folder-header ${isRoot ? 'dialkit-panel-header' : ''}`} onClick={handleToggle}>\n <div className=\"dialkit-folder-header-top\">\n {isRoot ? (\n isOpen && (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title dialkit-folder-title-root\">\n {title}\n </span>\n </div>\n )\n ) : (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title\">\n {title}\n </span>\n </div>\n )}\n {isRoot && !inline && (\n <svg\n className=\"dialkit-panel-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path opacity=\"0.5\" d={ICON_PANEL.path} fill=\"currentColor\"/>\n {ICON_PANEL.circles.map((c, i) => (\n <circle key={i} cx={c.cx} cy={c.cy} r={c.r} fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n ))}\n </svg>\n )}\n {!isRoot && (\n <motion.svg\n className=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n initial={false}\n animate={{ rotate: isOpen ? 0 : 180 }}\n transition={{ type: 'spring', visualDuration: 0.35, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n )}\n </div>\n\n {isRoot && toolbar && isOpen && (\n <div className=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={isRoot ? undefined : { height: 0, opacity: 0 }}\n animate={isRoot ? undefined : { height: 'auto', opacity: 1 }}\n exit={isRoot ? undefined : { height: 0, opacity: 0 }}\n transition={isRoot ? undefined : { type: 'spring', visualDuration: 0.35, bounce: 0.1 }}\n style={isRoot ? undefined : { clipPath: 'inset(0 -20px)' }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n if (isRoot) {\n if (inline) {\n return (\n <div className=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent}\n </div>\n );\n }\n\n const panelStyle = isOpen\n ? { width: 280, height: contentHeight !== undefined ? Math.min(contentHeight + panelHeightOffset, windowHeight - 32) : 'auto' as const, borderRadius: 14, boxShadow: 'var(--dial-shadow)', cursor: undefined as string | undefined, overflowY: 'auto' as const }\n : { width: 42, height: 42, borderRadius: '50%', boxSizing: 'border-box' as const, boxShadow: 'var(--dial-shadow-collapsed)', overflow: 'hidden' as const, cursor: 'pointer' as const };\n\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n style={panelStyle}\n onClick={!isOpen ? handleToggle : undefined}\n data-collapsed={isCollapsed}\n whileTap={!isOpen ? { scale: 0.9 } : undefined}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n {folderContent}\n </motion.div>\n );\n }\n\n return folderContent;\n}\n","// Shared SVG icon geometry — single source of truth across all framework adapters.\n\nexport const ICON_CHEVRON = 'M6 9.5L12 15.5L18 9.5';\n\nexport const ICON_CHECK = 'M5 12.75L10 19L19 5';\n\nexport const ICON_PAUSE = [\n 'M6.75 3C5.23122 3 4 4.23122 4 5.75V18.25C4 19.7688 5.23122 21 6.75 21H7.25C8.76878 21 10 19.7688 10 18.25V5.75C10 4.23122 8.76878 3 7.25 3H6.75Z',\n 'M16.75 3C15.2312 3 14 4.23122 14 5.75V18.25C14 19.7688 15.2312 21 16.75 21H17.25C18.7688 21 20 19.7688 20 18.25V5.75C20 4.23122 18.7688 3 17.25 3H16.75Z',\n];\n\nexport const ICON_PLAY = 'M9.24394 2.36758C7.41419 1.18362 5 2.49701 5 4.67639V19.3238C5 21.5032 7.41419 22.8166 9.24394 21.6326L20.5624 14.3089C22.2371 13.2253 22.2372 10.775 20.5624 9.69129L9.24394 2.36758Z';\n\nexport const ICON_REPLAY = [\n 'M12 2.5C17.2466 2.50016 21.5 6.7534 21.5 12C21.5 17.2466 17.2466 21.4998 12 21.5C7.52191 21.5 3.76987 18.4025 2.76465 14.2344C2.63517 13.6975 2.96508 13.1578 3.50195 13.0283C4.03883 12.8988 4.57851 13.2288 4.70801 13.7656C5.5016 17.0563 8.46701 19.5 12 19.5C16.142 19.4998 19.5 16.142 19.5 12C19.5 7.85796 16.142 4.50016 12 4.5C9.32981 4.5 6.98389 5.89541 5.6543 8H7.5C8.05228 8 8.5 8.44772 8.5 9C8.5 9.55228 8.05228 10 7.5 10H3.5C2.94772 10 2.5 9.55228 2.5 9V5C2.5 4.44772 2.94772 4 3.5 4C4.05228 4 4.5 4.44772 4.5 5V6.16797C6.2376 3.93677 8.95063 2.5 12 2.5Z',\n 'M10 9.94043C10 9.33379 10.6826 8.97849 11.1797 9.32617L14.1221 11.3857C14.5486 11.6843 14.5486 12.3157 14.1221 12.6143L11.1797 14.6738C10.6826 15.0215 10 14.6662 10 14.0596V9.94043Z',\n];\n\nexport const ICON_TIMELINE = [\n 'M18.868 10C20.8517 10.0003 22.2886 11.8914 21.7577 13.8027L20.369 18.8027C20.0083 20.1012 18.826 20.9999 17.4784 21H6.51941C5.17179 21 3.98948 20.1012 3.62878 18.8027L2.24011 13.8027C1.7092 11.8913 3.14603 10.0003 5.12976 10H18.868Z',\n 'M18.9989 6.5C19.5511 6.50007 19.9989 6.94776 19.9989 7.5C19.9989 8.05224 19.5511 8.49993 18.9989 8.5H4.9989C4.44661 8.5 3.9989 8.05228 3.9989 7.5C3.9989 6.94772 4.44661 6.5 4.9989 6.5H18.9989Z',\n 'M16.9989 3C17.5511 3.00007 17.9989 3.44776 17.9989 4C17.9989 4.55224 17.5511 4.99993 16.9989 5H6.9989C6.44661 5 5.9989 4.55228 5.9989 4C5.9989 3.44772 6.44661 3 6.9989 3H16.9989Z',\n];\n\nexport const ICON_CLIPBOARD = {\n board: 'M8 6C8 4.34315 9.34315 3 11 3H13C14.6569 3 16 4.34315 16 6V7H8V6Z',\n sparkle: 'M19.2405 16.1852L18.5436 14.3733C18.4571 14.1484 18.241 14 18 14C17.759 14 17.5429 14.1484 17.4564 14.3733L16.7595 16.1852C16.658 16.4493 16.4493 16.658 16.1852 16.7595L14.3733 17.4564C14.1484 17.5429 14 17.759 14 18C14 18.241 14.1484 18.4571 14.3733 18.5436L16.1852 19.2405C16.4493 19.342 16.658 19.5507 16.7595 19.8148L17.4564 21.6267C17.5429 21.8516 17.759 22 18 22C18.241 22 18.4571 21.8516 18.5436 21.6267L19.2405 19.8148C19.342 19.5507 19.5507 19.342 19.8148 19.2405L21.6267 18.5436C21.8516 18.4571 22 18.241 22 18C22 17.759 21.8516 17.5429 21.6267 17.4564L19.8148 16.7595C19.5507 16.658 19.342 16.4493 19.2405 16.1852Z',\n body: 'M16 5H17C18.6569 5 20 6.34315 20 8V11M8 5H7C5.34315 5 4 6.34315 4 8V18C4 19.6569 5.34315 21 7 21H12',\n};\n\nexport const ICON_ADD_PRESET = [\n 'M4 6H20',\n 'M4 12H10',\n 'M15 15L21 15',\n 'M18 12V18',\n 'M4 18H10',\n];\n\nexport const ICON_TRASH = [\n 'M5 6.5L5.80734 18.2064C5.91582 19.7794 7.22348 21 8.80023 21H15.1998C16.7765 21 18.0842 19.7794 18.1927 18.2064L19 6.5',\n 'M10 11V16',\n 'M14 11V16',\n 'M3.5 6H20.5',\n 'M8.07092 5.74621C8.42348 3.89745 10.0485 2.5 12 2.5C13.9515 2.5 15.5765 3.89745 15.9291 5.74621',\n];\n\nexport const ICON_PANEL = {\n path: 'M6.84766 11.75C6.78583 11.9899 6.75 12.2408 6.75 12.5C6.75 12.7592 6.78583 13.0101 6.84766 13.25H2C1.58579 13.25 1.25 12.9142 1.25 12.5C1.25 12.0858 1.58579 11.75 2 11.75H6.84766ZM14 11.75C14.4142 11.75 14.75 12.0858 14.75 12.5C14.75 12.9142 14.4142 13.25 14 13.25H12.6523C12.7142 13.0101 12.75 12.7592 12.75 12.5C12.75 12.2408 12.7142 11.9899 12.6523 11.75H14ZM3.09766 7.25C3.03583 7.48994 3 7.74075 3 8C3 8.25925 3.03583 8.51006 3.09766 8.75H2C1.58579 8.75 1.25 8.41421 1.25 8C1.25 7.58579 1.58579 7.25 2 7.25H3.09766ZM14 7.25C14.4142 7.25 14.75 7.58579 14.75 8C14.75 8.41421 14.4142 8.75 14 8.75H8.90234C8.96417 8.51006 9 8.25925 9 8C9 7.74075 8.96417 7.48994 8.90234 7.25H14ZM7.59766 2.75C7.53583 2.98994 7.5 3.24075 7.5 3.5C7.5 3.75925 7.53583 4.01006 7.59766 4.25H2C1.58579 4.25 1.25 3.91421 1.25 3.5C1.25 3.08579 1.58579 2.75 2 2.75H7.59766ZM14 2.75C14.4142 2.75 14.75 3.08579 14.75 3.5C14.75 3.91421 14.4142 4.25 14 4.25H13.4023C13.4642 4.01006 13.5 3.75925 13.5 3.5C13.5 3.24075 13.4642 2.98994 13.4023 2.75H14Z',\n circles: [\n { cx: '6', cy: '8', r: '0.998596' },\n { cx: '10.4999', cy: '3.5', r: '0.998657' },\n { cx: '9.75015', cy: '12.5', r: '0.997986' },\n ],\n};\n","import { useCallback, useState, useSyncExternalStore } from 'react';\nimport type { ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { buildCopyInstruction } from '../copy-instruction';\nimport { ShortcutsMenu } from './ShortcutsMenu';\nimport { ICON_CLIPBOARD, ICON_CHECK, ICON_ADD_PRESET } from '../icons';\nimport { ControlRenderer } from './ControlRenderer';\nimport { Folder } from './Folder';\nimport { PresetManager } from './PresetManager';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'root' | 'section';\n toolbarExtra?: ReactNode;\n}\n\nexport function Panel({ panel, defaultOpen = true, inline = false, onOpenChange, variant = 'root', toolbarExtra }: PanelProps) {\n const [copied, setCopied] = useState(false);\n const [isPanelOpen, setIsPanelOpen] = useState(defaultOpen);\n const hasShortcuts = Object.keys(panel.shortcuts).length > 0;\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panel.id, callback),\n [panel.id]\n );\n const getSnapshot = useCallback(\n () => DialStore.getValues(panel.id),\n [panel.id]\n );\n\n // Subscribe to panel value changes\n const values = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const presets = DialStore.getPresets(panel.id);\n const activePresetId = DialStore.getActivePresetId(panel.id);\n\n const handleAddPreset = () => {\n const nextNum = presets.length + 2;\n DialStore.savePreset(panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n navigator.clipboard.writeText(buildCopyInstruction('useDialKit', panel.name, values));\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleOpenChange = useCallback((open: boolean) => {\n setIsPanelOpen(open);\n onOpenChange?.(open);\n }, [onOpenChange]);\n\n const renderControls = () => (\n <ControlRenderer panelId={panel.id} controls={panel.controls} values={values} />\n );\n\n const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const toolbar = (\n <>\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add preset\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_ADD_PRESET.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </motion.button>\n\n <PresetManager\n panelId={panel.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {copied ? (\n <motion.svg\n key=\"check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CHECK} />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"/>\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\"/>\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n\n {toolbarExtra}\n </>\n );\n\n if (variant === 'section') {\n return (\n <Folder title={panel.name} defaultOpen={defaultOpen} onOpenChange={handleOpenChange}>\n <div className=\"dialkit-panel-section-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n {renderControls()}\n </Folder>\n );\n }\n\n return (\n <div className=\"dialkit-panel-wrapper\">\n <Folder title={panel.name} defaultOpen={defaultOpen} isRoot={true} inline={inline} onOpenChange={handleOpenChange} toolbar={toolbar}>\n {renderControls()}\n </Folder>\n </div>\n );\n}\n","import type { DialValue } from './store/DialStore';\n\n// The copy-for-agent export shared by the panel toolbar and the timeline dock.\nexport function buildCopyInstruction(\n hookName: string,\n panelName: string,\n values: Record<string, DialValue>\n): string {\n const jsonStr = JSON.stringify(values, null, 2);\n\n if (hookName === 'useDialTimeline' || hookName === 'createDialTimeline') {\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call. Keep the existing \\`clip.current\\` bindings while this timeline is being authored; do not convert the animation or remove DialKit yet.\n\nAdd this comment immediately above the ${hookName} call as a production handoff note:\n\n\\`\\`\\`tsx\n// TODO(production): DialKit's clip.current values are the scrubbable authoring preview.\n// Replace them with equivalent real Motion animations using the tuned timeline\n// timings and transitions, then remove ${hookName} and <DialTimeline />.\n\\`\\`\\``;\n }\n\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call.`;\n}\n","import { useContext } from 'react';\nimport { DialStore, ControlMeta, DialValue, SpringConfig, TransitionConfig } from '../store/DialStore';\nimport { ShortcutContext } from './ShortcutListener';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { TransitionControl } from './TransitionControl';\nimport { TextControl } from './TextControl';\nimport { SelectControl } from './SelectControl';\nimport { ColorControl } from './ColorControl';\n\ninterface ControlRendererProps {\n panelId: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n /** Optional timeline-owned duration rendered inside the transition editor. */\n transitionDuration?: {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n };\n}\n\n// Renders a ControlMeta tree with the standard DialKit controls.\n// Shared by the panel and the timeline clip popover.\nexport function ControlRenderer({ panelId, controls, values, transitionDuration }: ControlRendererProps) {\n const shortcutCtx = useContext(ShortcutContext);\n\n const renderControl = (control: ControlMeta) => {\n const value = values[control.path];\n\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n key={control.path}\n label={control.label}\n value={value as number}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panelId && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n key={control.path}\n label={control.label}\n checked={value as boolean}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panelId && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n key={control.path}\n panelId={panelId}\n path={control.path}\n label={control.label}\n spring={value as SpringConfig}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n key={control.path}\n panelId={panelId}\n path={control.path}\n label={control.label}\n value={value as TransitionConfig}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n durationControl={transitionDuration}\n />\n );\n\n case 'folder':\n return (\n <Folder key={control.path} title={control.label} defaultOpen={control.defaultOpen ?? true}>\n {control.children?.map(renderControl)}\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n key={control.path}\n label={control.label}\n value={value as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'action':\n return (\n <button\n key={control.path}\n className=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(panelId, control.path)}\n >\n {control.label}\n </button>\n );\n\n default:\n return null;\n }\n };\n\n return <>{controls.map(renderControl)}</>;\n}\n","import { createContext, useEffect, useRef, useState, useCallback } from 'react';\nimport { DialStore } from '../store/DialStore';\nimport {\n getEffectiveStep,\n applySliderDelta,\n isInputFocused,\n getActiveModifier,\n findControl,\n DRAG_SENSITIVITY,\n} from '../shortcut-utils';\n\nexport const ShortcutContext = createContext<{\n activePanelId: string | null;\n activePath: string | null;\n}>({ activePanelId: null, activePath: null });\n\nexport function ShortcutListener({ children }: { children: React.ReactNode }) {\n const [activeShortcut, setActiveShortcut] = useState<{\n activePanelId: string | null;\n activePath: string | null;\n }>({ activePanelId: null, activePath: null });\n\n const activeKeysRef = useRef<Set<string>>(new Set());\n const isDraggingRef = useRef(false);\n const lastMouseXRef = useRef<number | null>(null);\n const dragAccumulatorRef = useRef(0);\n\n // Find the active target for key-based interactions (scroll, drag, move)\n const resolveActiveTarget = useCallback((interaction: string) => {\n for (const key of activeKeysRef.current) {\n // We can't get the modifier from a stored key, so we check all panels\n const panels = DialStore.getPanels();\n for (const panel of panels) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue;\n if (shortcut.key.toLowerCase() !== key) continue;\n if ((shortcut.interaction ?? 'scroll') !== interaction) continue;\n const control = findControl(panel.controls, path);\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isInputFocused()) return;\n\n const key = e.key.toLowerCase();\n\n // Arrow keys adjust the active shortcut's slider\n if (key === 'arrowleft' || key === 'arrowright' || key === 'arrowup' || key === 'arrowdown') {\n if (activeKeysRef.current.size > 0) {\n const target = resolveActiveTarget('scroll') || resolveActiveTarget('drag') || resolveActiveTarget('move');\n if (target && target.control.type === 'slider') {\n e.preventDefault();\n const direction = (key === 'arrowright' || key === 'arrowup') ? 1 : -1;\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, direction);\n return;\n }\n }\n }\n\n const wasAlreadyHeld = activeKeysRef.current.has(key);\n activeKeysRef.current.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n\n // Toggle: flip on first keydown only (not on key repeat)\n if (!wasAlreadyHeld && target.control.type === 'toggle') {\n const currentValue = DialStore.getValue(target.panelId, target.path) as boolean;\n DialStore.updateValue(target.panelId, target.path, !currentValue);\n }\n }\n\n // Reset mouse tracking when a new key is pressed (for move/drag)\n if (!wasAlreadyHeld) {\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeysRef.current.delete(key);\n\n // Reset drag state when key is released\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n\n if (activeKeysRef.current.size === 0) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n } else {\n let found = false;\n for (const remainingKey of activeKeysRef.current) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n found = true;\n break;\n }\n }\n if (!found) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n }\n }\n };\n\n // ── Scroll: key+scroll and scroll-only ──\n const handleWheel = (e: WheelEvent) => {\n if (isInputFocused()) return;\n\n const modifier = getActiveModifier(e);\n\n // Key+scroll shortcuts\n if (activeKeysRef.current.size > 0) {\n for (const key of activeKeysRef.current) {\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (!target) continue;\n\n const { panelId, path, control } = target;\n const interaction = control.shortcut?.interaction ?? 'scroll';\n if (interaction !== 'scroll' || control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, control.shortcut!);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n }\n\n // Scroll-only shortcuts (no key needed)\n const scrollOnlyTargets = DialStore.resolveScrollOnlyTargets();\n for (const { panelId, path, control, shortcut } of scrollOnlyTargets) {\n if (control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, shortcut);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n };\n\n // ── Drag: key+mousedown starts, mousemove adjusts, mouseup stops ──\n const handleMouseDown = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDraggingRef.current = true;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n };\n\n // ── Move + Drag: mousemove handles both ──\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDraggingRef.current) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseXRef.current !== null) {\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, steps);\n }\n }\n return;\n }\n\n // Move interaction (no click needed, just key held + mouse movement)\n const moveTarget = resolveActiveTarget('move');\n if (moveTarget) {\n if (lastMouseXRef.current === null) {\n lastMouseXRef.current = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeysRef.current.clear();\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n setActiveShortcut({ activePanelId: null, activePath: null });\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('wheel', handleWheel, { passive: false });\n window.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('wheel', handleWheel);\n window.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [resolveActiveTarget]);\n\n return (\n <ShortcutContext.Provider value={activeShortcut}>\n {children}\n </ShortcutContext.Provider>\n );\n}","// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { motion, useMotionValue, useTransform, animate } from 'motion/react';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { decimalsForStep, roundValue, snapToDecile, formatSliderShortcut } from '../shortcut-utils';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 1,\n step = 0.01,\n unit,\n shortcut,\n shortcutActive,\n}: SliderProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const valueSpanRef = useRef<HTMLSpanElement>(null);\n const [isInteracting, setIsInteracting] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isValueHovered, setIsValueHovered] = useState(false);\n const [isValueEditable, setIsValueEditable] = useState(false);\n const [showInput, setShowInput] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Click-vs-drag detection refs\n const pointerDownPos = useRef<{ x: number; y: number } | null>(null);\n const isClickRef = useRef(true);\n const animRef = useRef<ReturnType<typeof animate> | null>(null);\n const wrapperRectRef = useRef<DOMRect | null>(null);\n const scaleRef = useRef(1);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const isActive = isInteracting || isHovered;\n\n // Motion values for imperative animation\n const fillPercent = useMotionValue(percentage);\n const fillWidth = useTransform(fillPercent, (pct) => `${pct}%`);\n const handleLeft = useTransform(fillPercent, (pct) =>\n `max(5px, calc(${pct}% - 9px))`\n );\n\n // Rubber band motion values\n const rubberStretchPx = useMotionValue(0);\n const rubberBandWidth = useTransform(\n rubberStretchPx,\n (stretch) => `calc(100% + ${Math.abs(stretch)}px)`\n );\n const rubberBandX = useTransform(\n rubberStretchPx,\n (stretch) => (stretch < 0 ? stretch : 0)\n );\n\n // Sync from props when not interacting (skip if spring animation is active)\n useEffect(() => {\n if (!isInteracting && !animRef.current) {\n fillPercent.jump(percentage);\n }\n }, [percentage, isInteracting, fillPercent]);\n\n const positionToValue = useCallback(\n (clientX: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return value;\n const screenX = clientX - rect.left;\n const sceneX = screenX / scaleRef.current;\n const nativeWidth = wrapperRef.current ? wrapperRef.current.offsetWidth : rect.width;\n const percent = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min + percent * (max - min);\n return Math.max(min, Math.min(max, rawValue));\n },\n [min, max, value]\n );\n\n const percentFromValue = useCallback(\n (v: number) => ((v - min) / (max - min)) * 100,\n [min, max]\n );\n\n const computeRubberStretch = useCallback(\n (clientX: number, sign: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return 0;\n const distancePast =\n sign < 0 ? rect.left - clientX : clientX - rect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return (\n sign *\n MAX_STRETCH *\n Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0))\n );\n },\n []\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (showInput) return;\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos.current = { x: e.clientX, y: e.clientY };\n isClickRef.current = true;\n setIsInteracting(true);\n\n // Capture wrapper rect at pointer down for stable reference\n if (wrapperRef.current) {\n wrapperRectRef.current = wrapperRef.current.getBoundingClientRect();\n const nativeWidth = wrapperRef.current.offsetWidth;\n scaleRef.current = wrapperRectRef.current.width / nativeWidth;\n }\n },\n [showInput]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting || !pointerDownPos.current) return;\n\n const dx = e.clientX - pointerDownPos.current.x;\n const dy = e.clientY - pointerDownPos.current.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickRef.current && distance > CLICK_THRESHOLD) {\n isClickRef.current = false;\n setIsDragging(true);\n }\n\n if (!isClickRef.current) {\n // Drag mode — instant update\n const rect = wrapperRectRef.current;\n if (rect) {\n if (e.clientX < rect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > rect.right) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const newValue = positionToValue(e.clientX);\n const newPct = percentFromValue(newValue);\n if (animRef.current) {\n animRef.current.stop();\n animRef.current = null;\n }\n fillPercent.jump(newPct);\n onChange(roundValue(newValue, step));\n }\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n fillPercent,\n rubberStretchPx,\n computeRubberStretch,\n ]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting) return;\n\n if (isClickRef.current) {\n // When steps are coarse (≤10 positions), click snaps to the nearest step.\n // Otherwise, the original decile-magnetic behavior is preserved\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max - min) / step;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min, Math.min(max, min + Math.round((rawValue - min) / step) * step))\n : snapToDecile(rawValue, min, max);\n\n const newPct = percentFromValue(snappedValue);\n\n if (animRef.current) {\n animRef.current.stop();\n }\n animRef.current = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => { animRef.current = null; },\n });\n onChange(roundValue(snappedValue, step));\n }\n\n // Spring rubber band back\n if (rubberStretchPx.get() !== 0) {\n animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n setIsInteracting(false);\n setIsDragging(false);\n pointerDownPos.current = null;\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n min,\n max,\n fillPercent,\n rubberStretchPx,\n ]\n );\n\n // Handle value hover delay for editable state\n useEffect(() => {\n if (isValueHovered && !showInput && !isValueEditable) {\n hoverTimeoutRef.current = setTimeout(() => {\n setIsValueEditable(true);\n }, 800);\n } else if (!isValueHovered && !showInput) {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setIsValueEditable(false);\n }\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n }, [isValueHovered, showInput, isValueEditable]);\n\n // Focus input when it appears\n useEffect(() => {\n if (showInput && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [showInput]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue);\n if (!isNaN(parsed)) {\n const clamped = Math.max(min, Math.min(max, parsed));\n onChange(roundValue(clamped, step));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: React.MouseEvent) => {\n if (isValueEditable) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(value.toFixed(decimalsForStep(step)));\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleInputSubmit();\n } else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const handleInputBlur = () => {\n handleInputSubmit();\n };\n\n const displayValue = value.toFixed(decimalsForStep(step));\n\n // Handle opacity: not active → 0, active → 0.5, dragging → 0.9\n // Value dodge: fade when handle overlaps label (left) or value (right)\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n let leftThreshold = 30;\n let rightThreshold = 78;\n const trackWidth = wrapperRef.current?.offsetWidth;\n if (trackWidth && trackWidth > 0) {\n if (labelRef.current) {\n leftThreshold = ((LABEL_CSS_LEFT + labelRef.current.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n if (valueSpanRef.current) {\n rightThreshold = ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.current.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n }\n const valueDodge = percentage < leftThreshold || percentage > rightThreshold;\n const handleOpacity = !isActive\n ? 0\n : valueDodge\n ? 0.1\n : isDragging\n ? 0.9\n : 0.5;\n\n // The ≤ 10 threshold separates discrete sliders\n // (like step=2 on a 0–10 range → 5 steps) from continuous ones.\n const discreteSteps = (max - min) / step;\n const hashMarks = discreteSteps <= 10\n ? Array.from({ length: discreteSteps - 1 }, (_, i) => {\n const pct = ((i + 1) * step) / (max - min) * 100;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n })\n : Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"dialkit-slider-wrapper\">\n <motion.div\n ref={trackRef}\n className={`dialkit-slider ${isActive ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ width: rubberBandWidth, x: rubberBandX }}\n >\n <div className=\"dialkit-slider-hashmarks\">{hashMarks}</div>\n\n <motion.div\n className=\"dialkit-slider-fill\"\n style={{\n width: fillWidth,\n }}\n />\n\n <motion.div\n className=\"dialkit-slider-handle\"\n style={{\n left: handleLeft,\n y: '-50%',\n }}\n animate={{\n opacity: handleOpacity,\n scaleX: isActive ? 1 : 0.25,\n scaleY: isActive && valueDodge ? 0.75 : 1,\n }}\n transition={{\n scaleX: { type: 'spring', visualDuration: 0.25, bounce: 0.15 },\n scaleY: { type: 'spring', visualDuration: 0.2, bounce: 0.1 },\n opacity: { duration: 0.15 },\n }}\n />\n\n <span ref={labelRef} className=\"dialkit-slider-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatSliderShortcut(shortcut)}\n </span>\n )}\n </span>\n\n {showInput ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dialkit-slider-input\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputBlur}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n className={`dialkit-slider-value ${isValueEditable ? 'dialkit-slider-value-editable' : ''}`}\n onMouseEnter={() => setIsValueHovered(true)}\n onMouseLeave={() => setIsValueHovered(false)}\n onClick={handleValueClick}\n onMouseDown={(e) => isValueEditable && e.stopPropagation()}\n style={{ cursor: isValueEditable ? 'text' : 'default' }}\n >\n {displayValue}\n </span>\n )}\n </motion.div>\n </div>\n );\n}\n","import { useRef, useState, useLayoutEffect, useCallback } from 'react';\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: SegmentedControlProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const hasAnimated = useRef(false);\n const [pillStyle, setPillStyle] = useState<{ left: number; width: number } | null>(null);\n\n const measure = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n const activeButton = container.querySelector('[data-active=\"true\"]') as HTMLElement | null;\n if (!activeButton) return;\n setPillStyle({\n left: activeButton.offsetLeft,\n width: activeButton.offsetWidth,\n });\n }, []);\n\n useLayoutEffect(() => {\n measure();\n }, [value, options.length, measure]);\n\n // Enable transition after first render\n const shouldAnimate = hasAnimated.current;\n hasAnimated.current = true;\n\n return (\n <div className=\"dialkit-segmented\" ref={containerRef}>\n {pillStyle && (\n <div\n className=\"dialkit-segmented-pill\"\n style={{\n left: pillStyle.left,\n width: pillStyle.width,\n transition: shouldAnimate\n ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'\n : 'none',\n }}\n />\n )}\n\n {options.map((option) => {\n const isActive = value === option.value;\n return (\n <button\n key={option.value}\n onClick={() => onChange(option.value)}\n className=\"dialkit-segmented-button\"\n data-active={String(isActive)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { formatToggleShortcut } from '../shortcut-utils';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nexport function Toggle({ label, checked, onChange, shortcut, shortcutActive }: ToggleProps) {\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatToggleShortcut(shortcut)}\n </span>\n )}\n </span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={checked ? 'on' : 'off'}\n onChange={(val) => onChange(val === 'on')}\n />\n </div>\n );\n}\n","// Deterministic sampling of transition curves, used for timeline scrubbing.\n// Springs use the closed-form damped-harmonic-oscillator solution with\n// Motion's own visualDuration/bounce → stiffness/damping mapping, so a\n// scrubbed position matches what Motion plays.\n\nimport { isEasingConfigValue, isSpringConfigValue } from './store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from './store/DialStore';\n\nexport type SpringParams = { stiffness: number; damping: number; mass: number };\n\nexport function round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function isTransitionConfig(value: unknown): value is TransitionConfig {\n return isSpringConfigValue(value) || isEasingConfigValue(value);\n}\n\nexport function isPhysicsSpring(transition: TransitionConfig): boolean {\n return (\n transition.type === 'spring' &&\n (transition.stiffness !== undefined || transition.damping !== undefined || transition.mass !== undefined)\n );\n}\n\nexport function springParams(spring: SpringConfig): SpringParams {\n if (isPhysicsSpring(spring)) {\n return { stiffness: spring.stiffness ?? 200, damping: spring.damping ?? 25, mass: spring.mass ?? 1 };\n }\n // Motion's mapping (motion-dom spring generator)\n const visualDuration = Math.max(0.05, spring.visualDuration ?? 0.3);\n const bounce = spring.bounce ?? 0.3;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 * Math.min(1, Math.max(0.05, 1 - bounce)) * Math.sqrt(stiffness);\n return { stiffness, damping, mass: 1 };\n}\n\n/** Normalized spring position 0 → 1 (may overshoot), starting at rest. */\nexport function springProgress(t: number, { stiffness, damping, mass }: SpringParams): number {\n if (t <= 0) return 0;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n if (zeta < 0.9999) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta < 1.0001) {\n return 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n }\n const wd = w0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * w0 + wd;\n const r2 = -zeta * w0 - wd;\n return 1 + (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r1 - r2);\n}\n\n/** Estimated time for a spring to visually settle (within 0.5% of target). */\nexport function springSettleDuration(params: SpringParams): number {\n const w0 = Math.sqrt(params.stiffness / params.mass);\n const zeta = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const decay =\n zeta >= 1\n ? zeta * w0 - w0 * Math.sqrt(Math.max(0, zeta * zeta - 1)) // slowest exponent\n : zeta * w0;\n const duration = Math.log(200) / Math.max(decay, 1e-6);\n return round2(clamp(duration, 0.05, 10));\n}\n\n/** Eased progress of a cubic-bezier easing at linear progress p (0–1). */\nexport function cubicBezierProgress(p: number, [x1, y1, x2, y2]: [number, number, number, number]): number {\n if (p <= 0) return 0;\n if (p >= 1) return 1;\n // Solve the bezier's parameter t for x = p (Newton-Raphson, bisection fallback)\n const sampleX = (t: number) => bezierAxis(t, x1, x2);\n const sampleY = (t: number) => bezierAxis(t, y1, y2);\n\n let t = p;\n for (let i = 0; i < 8; i++) {\n const x = sampleX(t) - p;\n if (Math.abs(x) < 1e-5) return sampleY(t);\n const dx = bezierAxisDerivative(t, x1, x2);\n if (Math.abs(dx) < 1e-6) break;\n t -= x / dx;\n }\n\n let lo = 0;\n let hi = 1;\n t = p;\n while (hi - lo > 1e-5) {\n if (sampleX(t) < p) lo = t;\n else hi = t;\n t = (lo + hi) / 2;\n }\n return sampleY(t);\n}\n\nfunction bezierAxis(t: number, a1: number, a2: number): number {\n return ((1 - 3 * a2 + 3 * a1) * t * t * t) + ((3 * a2 - 6 * a1) * t * t) + (3 * a1 * t);\n}\n\nfunction bezierAxisDerivative(t: number, a1: number, a2: number): number {\n return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1;\n}\n\nexport type ResolvedClipTransition = {\n /** Motion-ready transition with its duration driven by the clip length. */\n transition: TransitionConfig;\n /** Effective clip duration — the bar length. Derived for physics springs. */\n duration: number;\n /** Physics springs have emergent duration; the bar is derived, not resizable. */\n isPhysics: boolean;\n};\n\n// The bar IS the duration: time-mode springs get visualDuration from the\n// clip length, easings get duration from it, and physics springs derive\n// the clip length from their settle time.\nexport function resolveClipTransition(\n raw: TransitionConfig,\n clipDuration: number\n): ResolvedClipTransition {\n const safeDuration = Math.max(0.05, clipDuration);\n\n if (raw.type === 'easing') {\n return {\n transition: { ...raw, duration: safeDuration } as EasingConfig,\n duration: safeDuration,\n isPhysics: false,\n };\n }\n if (isPhysicsSpring(raw)) {\n return {\n transition: raw,\n duration: springSettleDuration(springParams(raw)),\n isPhysics: true,\n };\n }\n return {\n transition: { type: 'spring', bounce: raw.bounce ?? 0.2, visualDuration: safeDuration },\n duration: safeDuration,\n isPhysics: false,\n };\n}\n\n/**\n * Eased progress of a clip's transition at `elapsed` seconds after its start.\n * Springs keep evolving past the bar (bounce tail) and converge to 1;\n * easings clamp at 1. May overshoot 1 for bouncy curves.\n */\nexport function transitionProgress(\n elapsed: number,\n duration: number,\n transition: TransitionConfig | undefined\n): number {\n if (elapsed <= 0) return 0;\n if (!transition) {\n return duration > 0 ? Math.min(1, elapsed / duration) : 1;\n }\n if (transition.type === 'easing') {\n return cubicBezierProgress(Math.min(1, duration > 0 ? elapsed / duration : 1), transition.ease);\n }\n const params = springParams(transition);\n // Snap to done once settled so late samples are exactly 1\n if (elapsed >= springSettleDuration(params)) return 1;\n return springProgress(elapsed, params);\n}\n","import { SpringConfig } from '../store/DialStore';\nimport { springParams, springProgress } from '../transition-math';\n\ninterface SpringVisualizationProps {\n spring: SpringConfig;\n isSimpleMode: boolean;\n}\n\nexport function SpringVisualization({ spring, isSimpleMode }: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n // Same param mapping and closed-form curve as timeline scrubbing, so the\n // preview shows exactly the physics that plays.\n const params = isSimpleMode\n ? springParams({ type: 'spring', visualDuration: spring.visualDuration ?? 0.3, bounce: spring.bounce ?? 0.2 })\n : springParams({ type: 'spring', stiffness: spring.stiffness ?? 400, damping: spring.damping ?? 17, mass: spring.mass ?? 1 });\n\n const duration = 2;\n const steps = 100;\n const points: [number, number][] = [];\n for (let i = 0; i <= steps; i++) {\n const time = (i / steps) * duration;\n points.push([time, springProgress(time, params)]);\n }\n\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n const pathData = points\n .map(([time, value], i) => {\n const x = (time / duration) * width;\n const normalizedValue = (value - minValue) / (valueRange || 1);\n const y = height - (normalizedValue * height * 0.6 + height * 0.2);\n return `${i === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n\n const gridLines = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n gridLines.push(\n <line key={`v-${i}`} x1={x} y1={0} x2={x} y2={height} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />,\n <line key={`h-${i}`} x1={0} y1={y} x2={width} y2={y} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} className=\"dialkit-spring-viz\">\n {gridLines}\n <line\n x1={0}\n y1={height / 2}\n x2={width}\n y2={height / 2}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n <path\n d={pathData}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SpringConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\n\ninterface SpringControlProps {\n panelId: string;\n path: string;\n label: string;\n spring: SpringConfig;\n onChange: (spring: SpringConfig) => void;\n}\n\nexport function SpringControl({ panelId, path, label, spring, onChange }: SpringControlProps) {\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(\n () => DialStore.getSpringMode(panelId, path),\n [panelId, path]\n );\n const mode = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const isSimpleMode = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n simple: spring.visualDuration !== undefined ? spring : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: spring.stiffness !== undefined ? spring : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n if (isSimpleMode) {\n cache.current.simple = spring;\n } else {\n cache.current.advanced = spring;\n }\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n DialStore.updateSpringMode(panelId, path, newMode);\n\n if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n // When updating in simple mode, ensure physics props are removed\n if (isSimpleMode) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n } else {\n // When updating in physics mode, ensure time-based props are removed\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <SpringVisualization spring={spring} isSimpleMode={isSimpleMode} />\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isSimpleMode ? (\n <>\n <Slider\n label=\"Duration\"\n value={spring.visualDuration ?? 0.3}\n onChange={(v) => handleUpdate('visualDuration', v)}\n min={0.1}\n max={1}\n step={0.05}\n unit=\"s\"\n />\n <Slider\n label=\"Bounce\"\n value={spring.bounce ?? 0.2}\n onChange={(v) => handleUpdate('bounce', v)}\n min={0}\n max={1}\n step={0.05}\n />\n </>\n ) : (\n <>\n <Slider\n label=\"Stiffness\"\n value={spring.stiffness ?? 400}\n onChange={(v) => handleUpdate('stiffness', v)}\n min={1}\n max={1000}\n step={10}\n />\n <Slider\n label=\"Damping\"\n value={spring.damping ?? 17}\n onChange={(v) => handleUpdate('damping', v)}\n min={1}\n max={100}\n step={1}\n />\n <Slider\n label=\"Mass\"\n value={spring.mass ?? 1}\n onChange={(v) => handleUpdate('mass', v)}\n min={0.1}\n max={10}\n step={0.1}\n />\n </>\n )}\n </div>\n </Folder>\n );\n}\n","import { EasingConfig } from '../store/DialStore';\n\ninterface EasingVisualizationProps {\n easing: EasingConfig;\n}\n\nconst easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization({ easing }: EasingVisualizationProps) {\n const ease = easing.ease;\n\n const s = 200;\n const pad = 10;\n const inner = s - pad * 2;\n const unit = inner / 2; // [-0.5, 1.5] = 2 units on each axis\n\n // Equal scaling on both axes → 45° diagonal. [0,1] centered in [-0.5, 1.5].\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(ease[0], ease[1]);\n const p2 = toSvg(ease[2], ease[3]);\n\n const curvePath = `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n\n return (\n <svg\n viewBox={`0 0 ${s} ${s}`}\n preserveAspectRatio=\"xMidYMid slice\"\n className=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x} y1={start.y} x2={end.x} y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n\n <path d={curvePath} fill=\"none\" stroke=\"rgba(255, 255, 255, 0.6)\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport { easingPresets };\n","import { SpringConfig, EasingConfig, TransitionConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\nimport { useCallback, useRef, useState, useSyncExternalStore } from 'react';\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n /** Hide duration sliders when something else owns the duration (e.g. a timeline clip bar). */\n hideDuration?: boolean;\n /** Route duration edits through an external owner while keeping this control's layout. */\n durationControl?: {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n };\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl({\n panelId,\n path,\n label,\n value,\n onChange,\n hideDuration = false,\n durationControl,\n}: TransitionControlProps) {\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(\n () => DialStore.getTransitionMode(panelId, path),\n [panelId, path]\n );\n const mode = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const isEasing = mode === 'easing';\n const isSimpleSpring = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n easing: EasingConfig;\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n easing: value.type === 'easing' ? value : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] },\n simple: value.type === 'spring' && value.visualDuration !== undefined ? value : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: value.type === 'spring' && value.stiffness !== undefined ? value : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n // Keep cache up to date with current edits\n if (isEasing && value.type === 'easing') {\n cache.current.easing = value;\n } else if (isSimpleSpring && value.type === 'spring') {\n cache.current.simple = value;\n } else if (mode === 'advanced' && value.type === 'spring') {\n cache.current.advanced = value;\n }\n\n const spring: SpringConfig = value.type === 'spring' ? value : cache.current.simple;\n const easing: EasingConfig = value.type === 'easing' ? value : cache.current.easing;\n\n const handleModeChange = (newMode: CurveMode) => {\n DialStore.updateTransitionMode(panelId, path, newMode);\n\n if (newMode === 'easing') {\n onChange(cache.current.easing);\n } else if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, val: number) => {\n if (isSimpleSpring) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n } else {\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n }\n };\n\n const updateEase = (index: number, val: number) => {\n const newEase = [...easing.ease] as [number, number, number, number];\n newEase[index] = val;\n onChange({ ...easing, ease: newEase });\n };\n\n const durationSlider = !hideDuration && (isEasing || isSimpleSpring) ? (\n <Slider\n label=\"Duration\"\n value={durationControl?.value ?? (isEasing ? easing.duration : spring.visualDuration ?? 0.3)}\n onChange={durationControl?.onChange ?? ((next) => {\n if (isEasing) onChange({ ...easing, duration: next });\n else handleSpringUpdate('visualDuration', next);\n })}\n min={durationControl?.min ?? 0.1}\n max={durationControl?.max ?? (isEasing ? 2 : 1)}\n step={durationControl?.step ?? 0.05}\n unit=\"s\"\n />\n ) : null;\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {isEasing ? (\n <EasingVisualization easing={easing} />\n ) : (\n <SpringVisualization spring={spring} isSimpleMode={isSimpleSpring} />\n )}\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing' as const, label: 'Easing' },\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isEasing ? (\n <>\n <Slider label=\"x1\" value={easing.ease[0]} onChange={(v) => updateEase(0, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing.ease[1]} onChange={(v) => updateEase(1, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing.ease[2]} onChange={(v) => updateEase(2, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing.ease[3]} onChange={(v) => updateEase(3, v)} min={-1} max={2} step={0.01} />\n <EaseTextInput ease={easing.ease} onChange={(newEase) => onChange({ ...easing, ease: newEase })} />\n </>\n ) : isSimpleSpring ? (\n <Slider label=\"Bounce\" value={spring.bounce ?? 0.2} onChange={(v) => handleSpringUpdate('bounce', v)} min={0} max={1} step={0.05} />\n ) : (\n <>\n <Slider label=\"Stiffness\" value={spring.stiffness ?? 400} onChange={(v) => handleSpringUpdate('stiffness', v)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring.damping ?? 17} onChange={(v) => handleSpringUpdate('damping', v)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring.mass ?? 1} onChange={(v) => handleSpringUpdate('mass', v)} min={0.1} max={10} step={0.1} />\n </>\n )}\n {durationSlider}\n </div>\n </Folder>\n );\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map(v => parseFloat(v.toFixed(2))).join(', ');\n}\n\nfunction parseEase(str: string): [number, number, number, number] | null {\n const parts = str.split(',').map(s => parseFloat(s.trim()));\n if (parts.length === 4 && parts.every(n => !isNaN(n))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nfunction EaseTextInput({ ease, onChange }: { ease: [number, number, number, number]; onChange: (ease: [number, number, number, number]) => void }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const handleFocus = () => {\n setDraft(formatEase(ease));\n setEditing(true);\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft);\n if (parsed) onChange(parsed);\n setEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={editing ? draft : formatEase(ease)}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n />\n </div>\n );\n}\n","interface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl({ label, value, onChange, placeholder }: TextControlProps) {\n return (\n <div className=\"dialkit-text-control\">\n <label className=\"dialkit-text-label\">{label}</label>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../dropdown-position';\nimport { ICON_CHEVRON } from '../icons';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl({ label, value, options, onChange }: SelectControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n const [pos, setPos] = useState<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const normalized = normalizeOptions(options);\n const selectedOption = normalized.find((o) => o.value === value);\n\n const updatePos = useCallback(() => {\n const el = triggerRef.current;\n if (!el || !portalTarget) return;\n // Estimate dropdown height: 8px padding + 36px per option\n const dropdownHeight = 8 + normalized.length * 36;\n setPos(getDropdownPosition(el, portalTarget, { dropdownHeight }));\n }, [normalized.length, portalTarget]);\n\n // Resolve portal target (closest .dialkit-root)\n useEffect(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef.current) ?? document.body);\n }, []);\n\n // Position dropdown when opening\n useEffect(() => {\n if (!isOpen) return;\n updatePos();\n }, [isOpen, updatePos]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n dropdownRef.current && !dropdownRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n return (\n <div className=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n className=\"dialkit-select-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n data-open={String(isOpen)}\n >\n <span className=\"dialkit-select-label\">{label}</span>\n <div className=\"dialkit-select-right\">\n <span className=\"dialkit-select-value\">{selectedOption?.label ?? value}</span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </div>\n </button>\n\n {portalTarget && createPortal(\n <AnimatePresence>\n {isOpen && pos && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-select-dropdown\"\n initial={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n style={{\n position: 'absolute',\n left: pos.left,\n top: pos.top,\n width: pos.width,\n transformOrigin: pos.above ? 'bottom' : 'top',\n }}\n >\n {normalized.map((option) => (\n <button\n key={option.value}\n className=\"dialkit-select-option\"\n data-selected={String(option.value === value)}\n onClick={() => {\n onChange(option.value);\n setIsOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n portalTarget\n )}\n </div>\n );\n}\n","export type DropdownPosition = {\n top: number;\n left: number;\n width: number;\n above: boolean;\n};\n\nexport type DropdownPositionOptions = {\n dropdownHeight?: number;\n gap?: number;\n allowAbove?: boolean;\n};\n\nexport function getDropdownPosition(\n trigger: HTMLElement,\n portalRoot: HTMLElement,\n options: DropdownPositionOptions = {}\n): DropdownPosition {\n const { dropdownHeight = 0, gap = 4, allowAbove = true } = options;\n const triggerRect = trigger.getBoundingClientRect();\n const rootRect = portalRoot.getBoundingClientRect();\n const spaceBelow = window.innerHeight - triggerRect.bottom - gap;\n const above = allowAbove && spaceBelow < dropdownHeight && triggerRect.top > spaceBelow;\n\n return {\n top: above\n ? triggerRect.top - rootRect.top - dropdownHeight - gap\n : triggerRect.bottom - rootRect.top + gap,\n left: triggerRect.left - rootRect.left,\n width: triggerRect.width,\n above,\n };\n}\n\nexport function getDialKitPortalRoot(trigger: HTMLElement | null | undefined): HTMLElement | null {\n return (trigger?.closest('.dialkit-root') as HTMLElement | null) ?? null;\n}\n","import { useState, useRef, useEffect } from 'react';\n\ninterface ColorControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\n\nexport function ColorControl({ label, value, onChange }: ColorControlProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const colorInputRef = useRef<HTMLInputElement>(null);\n\n // Sync editValue when value changes externally\n useEffect(() => {\n if (!isEditing) {\n setEditValue(value);\n }\n }, [value, isEditing]);\n\n function handleTextSubmit() {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue)) {\n onChange(editValue);\n } else {\n setEditValue(value);\n }\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleTextSubmit();\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(value);\n }\n }\n\n return (\n <div className=\"dialkit-color-control\">\n <span className=\"dialkit-color-label\">{label}</span>\n <div className=\"dialkit-color-inputs\">\n {isEditing ? (\n <input\n type=\"text\"\n className=\"dialkit-color-hex-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autoFocus\n />\n ) : (\n <span\n className=\"dialkit-color-hex\"\n onClick={() => setIsEditing(true)}\n >\n {(value ?? '').toUpperCase()}\n </span>\n )}\n <button\n className=\"dialkit-color-swatch\"\n style={{ backgroundColor: value }}\n onClick={() => colorInputRef.current?.click()}\n title=\"Pick color\"\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n className=\"dialkit-color-picker-native\"\n value={value.length === 4 ? expandShorthandHex(value) : value.slice(0, 7)}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n );\n}\n\nfunction expandShorthandHex(hex: string): string {\n if (hex.length !== 4) return hex;\n return `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, Preset } from '../store/DialStore';\nimport { ICON_CHEVRON, ICON_TRASH } from '../icons';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager({ panelId, presets, activePresetId, onAdd }: PresetManagerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, left: 0, width: 0 });\n\n const hasPresets = presets.length > 0;\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n const open = useCallback(() => {\n if (!hasPresets) return;\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }\n setIsOpen(true);\n }, [hasPresets]);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on any mousedown outside trigger + dropdown\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(panelId, presetId);\n } else {\n DialStore.clearActivePreset(panelId);\n }\n close();\n };\n\n const handleDelete = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(panelId, presetId);\n };\n\n return (\n <div className=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n className=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(isOpen)}\n data-has-preset={String(!!activePreset)}\n data-disabled={String(!hasPresets)}\n >\n <span className=\"dialkit-preset-label\">\n {activePreset ? activePreset.name : 'Version 1'}\n </span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0, opacity: hasPresets ? 0.6 : 0.25 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-preset-dropdown\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, minWidth: pos.width }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div\n className=\"dialkit-preset-item\"\n data-active={String(!activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span className=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n {presets.map((preset) => (\n <div\n key={preset.id}\n className=\"dialkit-preset-item\"\n data-active={String(preset.id === activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span className=\"dialkit-preset-name\">{preset.name}</span>\n <button\n className=\"dialkit-preset-delete\"\n onClick={(e) => handleDelete(e, preset.id)}\n title=\"Delete preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_TRASH.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </button>\n </div>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </div>\n );\n}\n","import { useCallback, useSyncExternalStore } from 'react';\nimport { motion } from 'motion/react';\nimport { ICON_TIMELINE } from '../../icons';\nimport { TimelineUiStore } from '../../store/TimelineUiStore';\n\nexport function TimelineToggleButton() {\n const subscribe = useCallback(\n (listener: () => void) => TimelineUiStore.subscribe(listener),\n []\n );\n const getVisible = useCallback(() => TimelineUiStore.getVisible(), []);\n const visible = useSyncExternalStore(subscribe, getVisible, getVisible);\n const label = visible ? 'Hide timeline' : 'Show timeline';\n\n return (\n <motion.button\n className=\"dialkit-toolbar-add dialkit-timeline-toolbar-toggle\"\n data-active={visible || undefined}\n aria-pressed={visible}\n aria-label={label}\n title={label}\n onClick={() => TimelineUiStore.toggle()}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n {ICON_TIMELINE.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </svg>\n </motion.button>\n );\n}\n","type Listener = () => void;\n\ntype VisibilityController = {\n visible?: boolean;\n defaultVisible: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n};\n\n/**\n * UI-only state shared by the toolkit root and the timeline portal.\n * Playback deliberately lives elsewhere: hiding the editor must never pause\n * or otherwise change the animation it is inspecting.\n */\nclass TimelineUiStoreClass {\n private visible = true;\n private initialized = false;\n private controllers = new Map<symbol, VisibilityController>();\n private listeners = new Set<Listener>();\n\n getVisible(): boolean {\n for (const controller of this.controllers.values()) {\n if (controller.visible !== undefined) return controller.visible;\n }\n return this.visible;\n }\n\n registerController(id: symbol, controller: VisibilityController): () => void {\n const previous = this.getVisible();\n if (!this.initialized) {\n this.visible = controller.defaultVisible;\n this.initialized = true;\n }\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n\n return () => {\n const before = this.getVisible();\n this.controllers.delete(id);\n if (this.controllers.size === 0) this.initialized = false;\n if (before !== this.getVisible()) this.notify();\n };\n }\n\n updateController(id: symbol, controller: VisibilityController): void {\n if (!this.controllers.has(id)) return;\n const previous = this.getVisible();\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n }\n\n requestVisible(visible: boolean): void {\n const current = this.getVisible();\n if (current === visible) return;\n\n const controlled = Array.from(this.controllers.values()).filter(\n (controller) => controller.visible !== undefined\n );\n if (controlled.length > 0) {\n controlled.forEach((controller) => controller.onVisibilityChange?.(visible));\n return;\n }\n\n this.visible = visible;\n this.controllers.forEach((controller) => controller.onVisibilityChange?.(visible));\n this.notify();\n }\n\n toggle(): void {\n this.requestVisible(!this.getVisible());\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport const TimelineUiStore = /* @__PURE__ */ new TimelineUiStoreClass();\n","export type PanelDragOffset = {\n x: number;\n y: number;\n};\n\nexport type PanelDragStart = {\n pointerX: number;\n pointerY: number;\n elX: number;\n elY: number;\n};\n\nexport type PanelDragOriginX = 'left' | 'right';\n\nconst PANEL_DRAG_THRESHOLD = 8;\nconst COLLAPSED_PANEL_SIZE = 42;\n\nconst DRAG_EXCLUSION_SELECTOR = [\n '.dialkit-panel-icon',\n '.dialkit-panel-toolbar',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n '[role=\"button\"]',\n '[contenteditable=\"true\"]',\n].join(',');\n\nexport function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null {\n if (!(target instanceof Element) || !panel) return null;\n\n const inner = target.closest<HTMLElement>('.dialkit-panel-inner');\n if (!inner || !panel.contains(inner)) return null;\n\n if (inner.getAttribute('data-collapsed') === 'true') {\n return inner;\n }\n\n const header = target.closest<HTMLElement>('.dialkit-panel-header');\n if (!header || !inner.contains(header)) return null;\n\n if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;\n\n return header;\n}\n\nexport function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart {\n const rect = panel.getBoundingClientRect();\n return {\n pointerX,\n pointerY,\n elX: rect.left,\n elY: rect.top,\n };\n}\n\nexport function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset {\n return {\n x: start.elX + pointerX - start.pointerX,\n y: start.elY + pointerY - start.pointerY,\n };\n}\n\nexport function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean {\n const dx = pointerX - start.pointerX;\n const dy = pointerY - start.pointerY;\n return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;\n}\n\nexport function getPanelOriginX(\n position: string,\n offset: PanelDragOffset | null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : undefined\n): PanelDragOriginX {\n if (offset && viewportWidth) {\n return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? 'left' : 'right';\n }\n\n return position.endsWith('left') ? 'left' : 'right';\n}\n\nexport function blockPanelDragClick(handle: HTMLElement) {\n const blocker = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n handle.addEventListener('click', blocker, { capture: true, once: true });\n window.setTimeout(() => {\n handle.removeEventListener('click', blocker, true);\n }, 0);\n}\n","import { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { TimelineStore } from '../store/TimelineStore';\nimport { computeStaticTimeline, parseTimelineConfig } from '../timeline-core';\nimport type { DialTimelineValues, TimelineConfig } from '../timeline-core';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n resolveTimelineLoop,\n type DialTimelineOptions,\n} from '../timeline/adapter';\nimport { useDialStorePanel, useSerialized } from './useDialStorePanel';\n\nexport type {\n TimelineClipConfig,\n TimelineClipCss,\n TimelineClipLoop,\n TimelineClipValues,\n TimelineConfig,\n TimelineGroupConfig,\n TimelineGroupValues,\n TimelinePropConfig,\n TimelinePropStepConfig,\n TimelineStepConfig,\n TimelineStepValues,\n DialTimelineValues,\n} from '../timeline-core';\n\nexport type UseDialTimelineOptions = DialTimelineOptions;\n\nexport function useDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: UseDialTimelineOptions\n): DialTimelineValues<T> {\n const serializedConfig = useSerialized(config);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const parsed = useMemo(() => parseTimelineConfig(config), [serializedConfig]);\n\n // Clip values live in DialStore under the timeline's panel id, so presets,\n // persistence, reset, and copy all work on timing data for free.\n const { panelId, flatValues } = useDialStorePanel(name, parsed.dialConfig, {\n id: options?.id,\n persist: options?.persist,\n kind: 'timeline',\n });\n\n // Edit-time pass: resolve all stored values and let live, emergent durations\n // (notably physics springs) extend the authored timeline window. This only\n // re-runs when a value is edited — never merely because the clock ticks.\n const staticTimeline = useMemo(\n () => computeStaticTimeline(parsed, flatValues),\n [parsed, flatValues]\n );\n const timelineDuration = staticTimeline.duration;\n const staticClips = staticTimeline.clips;\n\n const parsedRef = useRef(parsed);\n parsedRef.current = parsed;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const { start: loopStart } = resolveTimelineLoop(options?.loop);\n\n const buildMeta = useCallback(\n () => buildTimelineMeta(panelId, name, timelineDuration, parsedRef.current, options?.loop),\n [panelId, name, timelineDuration, options?.loop]\n );\n\n // Transport registration mirrors the panel lifecycle: register on mount,\n // push structure changes without resetting the playhead. The register\n // effect reads buildMeta through a ref so meta changes (loop, structure)\n // flow through update() below instead of re-registering — a re-register\n // would reset the playhead.\n const buildMetaRef = useRef(buildMeta);\n buildMetaRef.current = buildMeta;\n useEffect(() => {\n TimelineStore.register(buildMetaRef.current(), { autoplay: optionsRef.current?.autoplay ?? true });\n return () => TimelineStore.unregister(panelId);\n }, [panelId, name]);\n\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n TimelineStore.update(buildMeta());\n }, [buildMeta, parsed]);\n\n const subscribeTransport = useCallback(\n (callback: () => void) => TimelineStore.subscribe(panelId, callback),\n [panelId]\n );\n const getTransport = useCallback(() => TimelineStore.getTransport(panelId), [panelId]);\n const transport = useSyncExternalStore(subscribeTransport, getTransport, getTransport);\n\n const play = useCallback(() => TimelineStore.play(panelId), [panelId]);\n const pause = useCallback(() => TimelineStore.pause(panelId), [panelId]);\n const replay = useCallback(() => TimelineStore.replay(panelId), [panelId]);\n const seek = useCallback((time: number) => TimelineStore.seek(panelId, time), [panelId]);\n\n // Frame pass: only the time-dependent fields, sampling cached curve params.\n return useMemo(\n () => buildTimelineValues<T>(staticClips, transport, timelineDuration, loopStart, {\n play,\n pause,\n replay,\n seek,\n }),\n [staticClips, transport, timelineDuration, loopStart, play, pause, replay, seek]\n );\n}\n","// Framework-agnostic timeline logic: config parsing, value interpolation,\n// and per-frame clip-state derivation. The React hook (and future Solid/\n// Svelte/Vue adapters) stay thin wrappers over this module.\n//\n// The computation is split in two so the 60Hz clock stays cheap:\n// computeStaticClips — everything derivable from stored values alone\n// (runs only when a value is edited)\n// computeClipState — the time-dependent fields for one clip\n// (runs per frame, sampling cached curve params)\n//\n// Internally every animating clip is a sequence of steps: a from/to clip is\n// one implicit step, a `steps` clip is several chained ones, and a `props`\n// clip holds one step-list per property track (each with its own cycle and\n// phase offset). Untouched properties hold their prior value through a step.\n\nimport { formatLabel, inferStep, isHexColor, resolveDialValues } from './store/DialStore';\nimport type { DialConfig, DialValue, ResolvedValues, TransitionConfig } from './store/DialStore';\nimport {\n clamp,\n cubicBezierProgress,\n isPhysicsSpring,\n isTransitionConfig,\n resolveClipTransition,\n round2,\n springParams,\n springProgress,\n springSettleDuration,\n} from './transition-math';\nimport type { SpringParams } from './transition-math';\nimport { TIMELINE_CLIP_COLORS } from './store/TimelineStore';\nimport type { TimelineClipMeta, TimelineClipTrackMeta } from './store/TimelineStore';\n\n// ── Public config types ──\n\n// A clip is a named span on the timeline — one row each: when it starts, how\n// long it runs, and (optionally) the values it animates between plus the\n// curve it animates with. `from`/`to` accept any normal DialKit leaf values\n// (numbers, colors, etc.). Everything is editable by clicking the clip in\n// the dock. Clips with from/to get a default spring transition when none is\n// specified.\n//\n// A looping clip repeats its cycle from `at` until the timeline ends: the\n// bar is one cycle, so dragging it longer slows the loop. A loop that should\n// return to where it started (a bob, a pulse) is written as a sequence whose\n// last step lands back on the starting values — there is no mirror mode.\nexport type TimelineClipLoop = 'off' | 'repeat';\n\n// One leg of a sequence. Only the properties named in `to` animate; every\n// other property holds its value from the previous leg (or `from`).\n// The index allows `undefined` because TypeScript synthesizes `prop?:\n// undefined` union arms for legs that touch different property sets.\nexport type TimelineStepValues = {\n [key: string]: DialConfig[string] | undefined;\n};\n\nexport type TimelineStepConfig = {\n duration?: number;\n to?: TimelineStepValues;\n transition?: TransitionConfig;\n};\n\n// Independent per-property tracks. When one object's properties animate\n// with different timing, each property is a full track: its own values,\n// duration, curve, and a `delay` offset from the clip's `at` (a phase shift\n// for looping clips). The clip row becomes a read-only composite of its\n// tracks; editing happens on the tracks. Properties that share timing\n// belong in a plain from/to/steps clip instead.\nexport type TimelinePropStepConfig = {\n duration?: number;\n to?: number | string;\n transition?: TransitionConfig;\n};\n\nexport type TimelinePropConfig = {\n from?: number | string;\n to?: number | string;\n duration?: number;\n /** Offset from the clip's `at` in seconds. */\n delay?: number;\n transition?: TransitionConfig;\n steps?: TimelinePropStepConfig[];\n};\n\ntype TimelineClipBase = {\n at: number;\n duration?: number;\n transition?: TransitionConfig;\n loop?: boolean | TimelineClipLoop;\n};\n\n// The three clip shapes are mutually exclusive, encoded with optional-never\n// fields so TypeScript rejects ambiguous combinations (`steps` + `to`,\n// `props` + `from`, …) at the call site. Parse warns for untyped consumers.\nexport type TimelineClipConfig = TimelineClipBase &\n (\n | {\n from?: DialConfig;\n to?: DialConfig;\n steps?: never;\n props?: never;\n }\n | {\n from?: DialConfig;\n to?: never;\n /** Sequential legs on one row — a segmented bar; boundaries retime legs. */\n steps: TimelineStepConfig[];\n props?: never;\n }\n | {\n from?: never;\n to?: never;\n steps?: never;\n /** Independent per-property tracks — mutually exclusive with from/to/steps. */\n props: { [prop: string]: TimelinePropConfig };\n }\n );\n\n/** Nested keys group clips into a collapsible layer — purely presentational. */\nexport type TimelineGroupConfig = {\n [key: string]: TimelineClipConfig;\n};\n\nexport type TimelineConfig = {\n /** Total timeline length in seconds. Inferred from the last clip when omitted. */\n duration?: number;\n} & {\n [key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;\n};\n\n/** CSS-friendly output for consumers not using Motion — spread into a style. */\nexport type TimelineClipCss = {\n transitionDuration: string;\n transitionTimingFunction: string;\n};\n\nexport type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {\n at: number;\n duration: number;\n /** Effective code-defined loop mode. */\n loop: TimelineClipLoop;\n /** Playhead is at or past the clip start. */\n started: boolean;\n /** Playhead is inside the clip — for looping clips, inside any cycle. */\n active: boolean;\n /** Playhead is past the clip end (for looping clips, past the timeline end). */\n done: boolean;\n /**\n * 0–1 position of the playhead within the clip — cycle progress (a\n * sawtooth) for looping clips, sequence progress for steps clips.\n */\n progress: number;\n /** Index of the leg under the playhead, for sequence clips. */\n step: C['steps'] extends TimelineStepConfig[] ? number : undefined;\n from: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : undefined;\n to: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? ResolvedValues<C['to']>\n : undefined;\n /** `to` once the clip has started, `from` before — hand it to Motion's animate.\n * For sequences this is the final merged state; for props clips, per-track\n * endpoint records. */\n animate: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string> | undefined\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : ResolvedValues<C['to']> | undefined\n : undefined;\n /** The clip's editable curve — single-curve clips only. */\n transition: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TransitionConfig\n : undefined;\n /** Duration + timing-function for native CSS transitions — single-curve clips only. */\n css: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TimelineClipCss\n : undefined;\n /**\n * Values interpolated through the clip's curves at the current playhead —\n * bind to style for true scrubbing: the element is exactly at this point\n * in time whether playing, paused, or scrubbing. Sequence clips report the\n * merged state of all legs (declare every animated property in `from`);\n * props clips report every track's value.\n */\n current: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : undefined\n : undefined;\n};\n\nexport type TimelineGroupValues<G extends TimelineGroupConfig> = {\n [K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<G[K], TimelineClipConfig>\n >;\n};\n\nexport type DialTimelineValues<T extends TimelineConfig> = {\n time: number;\n playing: boolean;\n duration: number;\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<T[K], TimelineClipConfig>\n >;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig\n ? never\n : T[K] extends TimelineGroupConfig\n ? K\n : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;\n};\n\nexport const CLIP_VALUE_STEP = 0.01;\nexport const TIMELINE_MIN_CLIP_DURATION = 0.05;\nconst DEFAULT_STEP_DURATION = 0.3;\nconst DEFAULT_CLIP_TRANSITION: TransitionConfig = { type: 'spring', bounce: 0.2 };\nconst RESERVED_KEYS = new Set(['time', 'playing', 'duration', 'play', 'pause', 'replay', 'seek']);\n\n// ── Config parsing ──\n\nexport type ParsedTimeline = {\n duration: number;\n dialConfig: DialConfig;\n clips: TimelineClipMeta[];\n};\n\nfunction isClipConfig(value: unknown): value is TimelineClipConfig {\n return isPlainObject(value) && Number.isFinite((value as TimelineClipConfig).at);\n}\n\n// A group is a plain object (no `at`) with at least one clip entry — nested\n// one level. Non-clip children are skipped individually (with a warning)\n// rather than invalidating the whole group.\nfunction isGroupConfig(value: unknown): value is TimelineGroupConfig {\n if (!isPlainObject(value) || 'at' in value) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.some(isClipConfig);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, value)\n : fallback;\n}\n\nfunction animatedDuration(value: unknown, fallback = DEFAULT_STEP_DURATION): number {\n return Math.max(TIMELINE_MIN_CLIP_DURATION, nonNegativeFinite(value, fallback));\n}\n\nfunction transitionDefaultDuration(transition: TransitionConfig): number {\n if (transition.type === 'easing') return animatedDuration(transition.duration);\n // Motion gives physics parameters precedence over time parameters when a\n // mixed config reaches it, so duration inference must make the same choice.\n if (isPhysicsSpring(transition)) {\n return animatedDuration(springSettleDuration(springParams(transition)));\n }\n if (transition.visualDuration !== undefined) return animatedDuration(transition.visualDuration);\n return animatedDuration(springSettleDuration(springParams(transition)));\n}\n\n// Bar length defaults: physics always owns its emergent duration. Time-based\n// curves use an explicit bar duration first, then their own duration, then the\n// standard step duration. `inheritedTransition` matters for physics because a\n// step/track can inherit an advanced spring from its parent.\nfunction defaultStepDuration(\n step: { duration?: number; transition?: TransitionConfig },\n inheritedTransition?: TransitionConfig\n): number {\n const curve = step.transition ?? inheritedTransition;\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (step.duration !== undefined) return animatedDuration(step.duration);\n if (step.transition) return transitionDefaultDuration(step.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultTrackDuration(\n track: TimelinePropConfig,\n inheritedTransition?: TransitionConfig\n): number {\n const curve = track.transition ?? inheritedTransition;\n if (track.steps?.length) {\n return track.steps.reduce((sum, step) => sum + defaultStepDuration(step, curve), 0);\n }\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (track.duration !== undefined) return animatedDuration(track.duration);\n if (track.transition) return transitionDefaultDuration(track.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultClipDuration(clip: TimelineClipConfig): number {\n const defaultCurve = isTransitionConfig(clip.transition)\n ? clip.transition\n : DEFAULT_CLIP_TRANSITION;\n if (clip.props) {\n return Object.values(clip.props).reduce(\n (max, track) => Math.max(\n max,\n nonNegativeFinite(track.delay) + defaultTrackDuration(track, defaultCurve)\n ),\n 0\n );\n }\n if (clip.steps?.length) {\n return clip.steps.reduce((sum, step) => sum + defaultStepDuration(step, defaultCurve), 0);\n }\n\n const animating = Boolean(clip.transition || clip.from || clip.to);\n // Marker windows are allowed to be zero-length; actual animations are not.\n if (!animating) return nonNegativeFinite(clip.duration);\n if (isPhysicsSpring(defaultCurve)) return transitionDefaultDuration(defaultCurve);\n if (clip.duration !== undefined) return animatedDuration(clip.duration);\n if (isTransitionConfig(clip.transition)) return transitionDefaultDuration(clip.transition);\n // A from/to clip with neither duration nor transition animates with the\n // default spring, so its bar defaults to that spring's settle time instead\n // of collapsing to the minimum bar length. Markers stay zero-length.\n return clip.from || clip.to ? transitionDefaultDuration(DEFAULT_CLIP_TRANSITION) : 0;\n}\n\nexport function normalizeLoopMode(value: unknown): TimelineClipLoop {\n // `mirror` no longer exists — sequences whose last step returns home\n // replaced it. Legacy values fold into `repeat`.\n if (value === true || value === 'mirror' || value === 'repeat') return 'repeat';\n return 'off';\n}\n\n// The bar owns the duration, so stored transitions carry only their shape:\n// bounce for time springs, physics params as-is, and easings keep their\n// (structural) duration field pinned to the clip length.\nfunction normalizeStoredTransition(transition: TransitionConfig, clipDuration: number): TransitionConfig {\n if (transition.type === 'easing') {\n return { ...transition, duration: clipDuration };\n }\n if (isPhysicsSpring(transition)) {\n return transition;\n }\n return { type: 'spring', bounce: transition.bounce ?? 0.2 };\n}\n\ntype ClipParseEntry = {\n path: string;\n childKey: string;\n group?: string;\n clip: TimelineClipConfig;\n};\n\nfunction collectClipEntries(config: TimelineConfig): ClipParseEntry[] {\n const entries: ClipParseEntry[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (key === 'duration') continue;\n if (RESERVED_KEYS.has(key)) {\n console.warn(`[dialkit] Timeline key \"${key}\" collides with a reserved key and was skipped.`);\n continue;\n }\n if (isClipConfig(value)) {\n entries.push({ path: key, childKey: key, clip: value });\n } else if (isGroupConfig(value)) {\n for (const [childKey, childClip] of Object.entries(value)) {\n if (isClipConfig(childClip)) {\n entries.push({ path: `${key}.${childKey}`, childKey, group: key, clip: childClip });\n } else {\n console.warn(\n `[dialkit] Timeline clip \"${key}.${childKey}\" is missing a numeric \"at\" and was skipped.`\n );\n }\n }\n } else {\n console.warn(\n `[dialkit] Timeline entry \"${key}\" is neither a clip (needs a numeric \"at\") nor a group of clips and was skipped.`\n );\n }\n }\n return entries;\n}\n\n/** Strips explicit-undefined leaves so step targets are safe to merge/range. */\nfunction definedValues(values: TimelineStepValues | undefined): DialConfig | undefined {\n if (!values) return undefined;\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\n\nfunction setDialPath(dialConfig: DialConfig, path: string, value: DialConfig): void {\n const segments = path.split('.');\n let node = dialConfig;\n for (const segment of segments.slice(0, -1)) {\n node = (node[segment] ??= {}) as DialConfig;\n }\n node[segments[segments.length - 1]] = value;\n}\n\nexport function parseTimelineConfig(config: TimelineConfig): ParsedTimeline {\n const entries = collectClipEntries(config);\n\n let maxEnd = 0;\n for (const { clip } of entries) {\n maxEnd = Math.max(maxEnd, nonNegativeFinite(clip.at) + defaultClipDuration(clip));\n }\n\n // Exact fit: the window ends when the content does, so a looping timeline\n // plays one full pass and wraps with no dead tail. Ceil (never round) to\n // 2dp — undershooting the content end would clip loops and drift their\n // phase every wrap. Set `duration` in config for slack to drag clips later.\n const duration =\n typeof config.duration === 'number' && Number.isFinite(config.duration) && config.duration > 0\n ? config.duration\n : maxEnd > 0\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : 1;\n\n const dialConfig: DialConfig = {};\n const clips: TimelineClipMeta[] = [];\n\n entries.forEach(({ path, childKey, group, clip }, index) => {\n // These combinations are untypeable (optional-never fields) but reachable\n // from plain JS — warn and pick a deterministic winner.\n const raw = clip as TimelineClipBase & {\n from?: DialConfig;\n to?: DialConfig;\n steps?: TimelineStepConfig[];\n props?: Record<string, TimelinePropConfig>;\n };\n if (raw.props && (raw.steps?.length || raw.from || raw.to)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"props\" is mutually exclusive with from/to/steps — using \"props\".`\n );\n } else if (raw.steps?.length && raw.to) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"to\" is ignored when \"steps\" is present — each leg's \"to\" defines its targets.`\n );\n }\n\n const hasSteps = Boolean(clip.steps?.length) && !clip.props;\n const hasProps = Boolean(clip.props);\n const single = isTransitionConfig(clip.transition) ? clip.transition : undefined;\n const total = defaultClipDuration(clip);\n const defaultCurve = single ?? DEFAULT_CLIP_TRANSITION;\n const clipAt = nonNegativeFinite(clip.at);\n\n const clipDial: DialConfig = {\n at: [clipAt, 0, duration, CLIP_VALUE_STEP],\n };\n // Sequence and props clips derive their length from their parts — no\n // duration dial.\n if (!hasSteps && !hasProps) {\n clipDial.duration = [total, 0, duration, CLIP_VALUE_STEP];\n }\n\n // Every animating single-curve clip gets an editable curve; the bar\n // drives its duration.\n if (!hasSteps && !hasProps && (clip.transition || clip.from || clip.to)) {\n clipDial.transition = normalizeStoredTransition(defaultCurve, total);\n }\n\n // Independent property tracks: each is a full mini-clip folder — delay\n // (bar position), from/to or steps, and its own curve. The parent row\n // is a read-only composite.\n let tracks: TimelineClipTrackMeta[] | undefined;\n if (clip.props) {\n tracks = [];\n for (const [prop, track] of Object.entries(clip.props)) {\n if (TRACK_RESERVED.has(prop) || /^step\\d+$/.test(prop)) {\n console.warn(`[dialkit] Timeline property \"${prop}\" collides with a clip field and was skipped.`);\n continue;\n }\n const trackDuration = defaultTrackDuration(track, defaultCurve);\n const trackCurve = track.transition ?? defaultCurve;\n const hasTrackSteps = Boolean(track.steps?.length);\n const trackDial: DialConfig = {\n delay: [nonNegativeFinite(track.delay), 0, duration, CLIP_VALUE_STEP],\n };\n if (!hasTrackSteps) {\n trackDial.duration = [trackDuration, 0, duration, CLIP_VALUE_STEP];\n trackDial.transition = normalizeStoredTransition(trackCurve, trackDuration);\n }\n const fromValue = track.from ?? (hasTrackSteps ? undefined : track.to);\n if (hasTrackSteps && fromValue === undefined) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": track \"${prop}\" has steps but no \"from\" — declare its starting value.`\n );\n }\n if (fromValue !== undefined) {\n trackDial.from = scalarDial(prop, fromValue, hasTrackSteps ? track.steps![0]?.to : track.to);\n }\n if (!hasTrackSteps && track.to !== undefined) {\n trackDial.to = scalarDial(prop, track.to, fromValue);\n }\n let trackStepKeys: string[] | undefined;\n if (hasTrackSteps) {\n trackStepKeys = [];\n let previous = fromValue;\n track.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n trackStepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, trackCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? trackCurve, stepDuration),\n };\n if (step.to !== undefined) {\n stepDial.to = scalarDial(prop, step.to, previous);\n previous = step.to;\n }\n trackDial[stepKey] = stepDial;\n });\n }\n clipDial[prop] = trackDial;\n tracks.push({ prop, stepKeys: trackStepKeys });\n }\n }\n\n if (clip.from && !hasProps) {\n clipDial.from = withFromToRanges(\n clip.from,\n hasSteps ? definedValues(clip.steps![0]?.to) : clip.to\n );\n }\n if (!hasSteps && !hasProps && clip.to) {\n clipDial.to = withFromToRanges(clip.to, clip.from);\n }\n\n // One folder per leg: duration (the segment), target values, curve.\n // Untouched properties hold — the running state feeds slider ranges.\n let stepKeys: string[] | undefined;\n if (hasSteps) {\n stepKeys = [];\n let running: DialConfig | undefined = clip.from;\n clip.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n stepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, defaultCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? defaultCurve, stepDuration),\n };\n const stepTo = definedValues(step.to);\n if (stepTo) {\n // The hold rule needs a starting value: a property first animated\n // mid-sequence has nothing to interpolate from and jumps instead.\n for (const prop of Object.keys(stepTo)) {\n if (!running || !(prop in running)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": property \"${prop}\" first animates in step ${stepIndex + 1} with no starting value — declare it in \"from\".`\n );\n }\n }\n stepDial.to = withFromToRanges(stepTo, running);\n }\n clipDial[stepKey] = stepDial;\n running = { ...(running ?? {}), ...(stepTo ?? {}) };\n });\n }\n\n setDialPath(dialConfig, path, clipDial);\n\n clips.push({\n key: path,\n label: formatLabel(childKey),\n color: TIMELINE_CLIP_COLORS[index % TIMELINE_CLIP_COLORS.length],\n loop: normalizeLoopMode(clip.loop),\n group,\n stepKeys,\n tracks,\n });\n });\n\n return { duration, dialConfig, clips };\n}\n\nconst TRACK_RESERVED = new Set(['at', 'duration', 'loop', 'from', 'to', 'transition', 'delay']);\n\n// A scalar track value as a dial — wraps it in a single-key record so\n// tracks and clips share exactly one range-inference policy.\nfunction scalarDial(prop: string, value: number | string, counterpart: number | string | undefined): DialConfig[string] {\n const record = withFromToRanges(\n { [prop]: value } as DialConfig,\n counterpart === undefined ? undefined : ({ [prop]: counterpart } as DialConfig)\n );\n return record[prop];\n}\n\n// ── from/to slider ranges ──\n\n// Bare numbers in from/to get property-aware slider ranges (the generic\n// DialKit inference is value-based, which turns `y: 0` into a 0–1 slider).\n// Ranges expand to include the actual from/to endpoints when they fall outside.\nconst FROM_TO_RANGE_PRESETS: [RegExp, { min: number; max: number; step: number }][] = [\n [/^(x|y|z|tx|ty|offsetx|offsety|translatex|translatey)$/i, { min: -100, max: 100, step: 1 }],\n [/rotat|angle|skew/i, { min: -180, max: 180, step: 1 }],\n [/^scale/i, { min: 0, max: 2, step: 0.01 }],\n [/opacity|alpha/i, { min: 0, max: 1, step: 0.01 }],\n [/blur|radius|spread/i, { min: 0, max: 100, step: 1 }],\n];\n\nfunction inferFromToRange(key: string, value: number, counterpart: number | undefined): [number, number, number, number] {\n const lo = Math.min(value, counterpart ?? value);\n const hi = Math.max(value, counterpart ?? value);\n\n const preset = FROM_TO_RANGE_PRESETS.find(([pattern]) => pattern.test(key))?.[1];\n if (preset) {\n return [value, Math.min(preset.min, lo), Math.max(preset.max, hi), preset.step];\n }\n\n // Generic fallback: unit-ish values get 0–1, everything else a range\n // spanning both endpoints with room to overshoot.\n if (lo >= 0 && hi <= 1) {\n return [value, 0, 1, 0.01];\n }\n const extent = Math.max(Math.abs(lo), Math.abs(hi), 1);\n const min = lo < 0 ? -extent * 2 : 0;\n const max = Math.max(extent * 2, hi);\n return [value, min, max, inferStep(min, max)];\n}\n\n// Rewrites bare-number leaves in a from/to config as explicit range tuples,\n// using the matching key in the counterpart config to size the range.\nfunction withFromToRanges(config: DialConfig, counterpart: DialConfig | undefined): DialConfig {\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(config)) {\n const other = counterpart?.[key];\n if (typeof value === 'number') {\n result[key] = inferFromToRange(key, value, typeof other === 'number' ? other : undefined);\n } else if (isPlainObject(value) && !('type' in value)) {\n result[key] = withFromToRanges(\n value as DialConfig,\n isPlainObject(other) && !('type' in other) ? (other as DialConfig) : undefined\n );\n } else {\n result[key] = value as DialConfig[string];\n }\n }\n return result;\n}\n\n// ── Static clip data (edit-time) ──\n\n// A curve ready to sample: cached spring params or bezier points, plus the\n// duration easings normalize against.\ntype CurveStatic = {\n duration: number;\n spring?: SpringParams;\n settle?: number;\n ease?: [number, number, number, number];\n};\n\nfunction curveStatic(transition: TransitionConfig | undefined, duration: number): CurveStatic {\n if (!transition) return { duration };\n if (transition.type === 'easing') return { duration, ease: transition.ease };\n const spring = springParams(transition);\n return { duration, spring, settle: springSettleDuration(spring) };\n}\n\nfunction sampleCurve(curve: CurveStatic, elapsed: number): number {\n if (elapsed <= 0) return 0;\n if (curve.spring) {\n // Snap to done once settled so late samples are exactly 1\n if (curve.settle !== undefined && elapsed >= curve.settle) return 1;\n return springProgress(elapsed, curve.spring);\n }\n if (curve.ease) {\n return cubicBezierProgress(clamp(curve.duration > 0 ? elapsed / curve.duration : 1, 0, 1), curve.ease);\n }\n return curve.duration > 0 ? Math.min(1, elapsed / curve.duration) : 1;\n}\n\nexport type TimelineStepStatic = {\n key: string | null; // null for the implicit single step of a from/to clip\n offset: number; // seconds from clip/track start\n duration: number; // effective — physics-resolved\n isPhysics: boolean;\n /** Full property state at step start — the hold rule made concrete. */\n start: Record<string, unknown>;\n /** Targets this step animates; untouched properties hold `start`. */\n to: Record<string, unknown>;\n curve: CurveStatic;\n};\n\n/**\n * One track: a step chain with its own cycle length and phase offset from\n * the clip's `at`. This is the unified runtime model — a shared-timing clip\n * is exactly one track (prop unset, delay 0) whose steps carry the full\n * property record; a props clip is one single-property track per entry.\n */\nexport type TimelineTrackStatic = {\n /** Set for a props clip's single-property tracks; unset for the shared track. */\n prop?: string;\n delay: number;\n duration: number;\n steps: TimelineStepStatic[];\n};\n\nexport type TimelineClipStatic = {\n key: string;\n childKey: string;\n group?: string;\n at: number;\n /** Effective total duration — the bar length (one cycle for looping clips;\n * the widest track extent for props clips). */\n duration: number;\n loop: TimelineClipLoop;\n /** Where the clip stops affecting values: at + duration, or the timeline end when looping. */\n end: number;\n isPhysics: boolean;\n /** Motion-ready transition, its duration injected from the bar — single-curve clips only. */\n transition?: TransitionConfig;\n css?: TimelineClipCss;\n from?: Record<string, unknown>;\n /** Final merged state (the last leg's landing values for sequences). */\n to?: Record<string, unknown>;\n /** Every animating clip is tracks; empty for markers. */\n tracks: TimelineTrackStatic[];\n explicitSteps: boolean;\n /** Union of every property the clip touches. */\n props?: string[];\n};\n\nfunction resolvedAtPath(resolved: Record<string, unknown>, path: string): Record<string, unknown> {\n let node: unknown = resolved;\n for (const segment of path.split('.')) {\n node = isPlainObject(node) ? node[segment] : undefined;\n }\n return isPlainObject(node) ? node : {};\n}\n\nexport function computeStaticClips(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineClipStatic[] {\n const resolved = resolveDialValues(parsed.dialConfig, flatValues) as Record<string, unknown>;\n return parsed.clips.map((clip) =>\n buildClipStatic(resolvedAtPath(resolved, clip.key), clip, parsed.duration)\n );\n}\n\nexport type TimelineStaticState = {\n duration: number;\n clips: TimelineClipStatic[];\n};\n\n/**\n * Resolves the editable clip model and grows the timeline when a live value\n * creates content beyond its authored window. This is most important for\n * physics springs: changing stiffness/damping changes their emergent length.\n * The parsed duration remains the minimum, so shortening a clip never removes\n * the original editing room.\n */\nexport function computeStaticTimeline(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineStaticState {\n let clips = computeStaticClips(parsed, flatValues);\n const maxEnd = clips.reduce(\n (end, clip) => Math.max(end, clip.at + clip.duration),\n parsed.duration\n );\n const duration = maxEnd > parsed.duration\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : parsed.duration;\n\n if (duration !== parsed.duration) {\n clips = clips.map((clip) =>\n clip.loop === 'repeat' ? { ...clip, end: duration } : clip\n );\n }\n\n return { duration, clips };\n}\n\n/** The dock's resolver: the same static model the hook animates with,\n * rebuilt from flat stored values — bars, popovers, and playback can never\n * disagree about geometry. */\nexport function computeClipStaticFromValues(\n values: Record<string, DialValue>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n return buildClipStatic(unflattenClipValues(values, clip.key), clip, timelineDuration);\n}\n\nfunction buildClipStatic(\n clipResolved: Record<string, unknown>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n {\n const at = typeof clipResolved.at === 'number' ? clipResolved.at : 0;\n const from = isPlainObject(clipResolved.from) ? clipResolved.from : undefined;\n const single = isTransitionConfig(clipResolved.transition) ? clipResolved.transition : undefined;\n\n const staticClip: TimelineClipStatic = {\n key: clip.key,\n childKey: clip.group ? clip.key.slice(clip.group.length + 1) : clip.key,\n group: clip.group,\n at,\n duration: 0,\n loop: 'off',\n end: 0,\n isPhysics: false,\n from,\n tracks: [],\n explicitSteps: Boolean(clip.stepKeys?.length),\n };\n\n if (clip.tracks?.length) {\n // Independent property tracks: each chains its own scalar steps and\n // carries its own cycle length and phase offset.\n const tracks: (TimelineTrackStatic & { prop: string })[] = clip.tracks.map(({ prop, stepKeys }) => {\n const trackResolved = isPlainObject(clipResolved[prop])\n ? (clipResolved[prop] as Record<string, unknown>)\n : {};\n const delay = typeof trackResolved.delay === 'number' ? trackResolved.delay : 0;\n const fromValue = trackResolved.from;\n let steps: TimelineStepStatic[];\n let trackDuration = 0;\n\n if (stepKeys?.length) {\n let running = fromValue;\n steps = stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(trackResolved[stepKey])\n ? (trackResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = stepResolved.to;\n const step: TimelineStepStatic = {\n key: stepKey,\n offset: trackDuration,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running === undefined ? {} : { [prop]: running },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n };\n if (toValue !== undefined) running = toValue;\n trackDuration += effective.duration;\n return step;\n });\n } else {\n const storedDuration =\n typeof trackResolved.duration === 'number' ? trackResolved.duration : 0;\n const raw = isTransitionConfig(trackResolved.transition) ? trackResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = trackResolved.to;\n trackDuration = effective.duration;\n steps = [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: fromValue === undefined ? {} : { [prop]: fromValue },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n },\n ];\n }\n\n return { prop, delay, duration: trackDuration, steps };\n });\n\n staticClip.tracks = tracks;\n staticClip.props = tracks.map((track) => track.prop);\n staticClip.duration = tracks.reduce((max, track) => Math.max(max, track.delay + track.duration), 0);\n staticClip.from = Object.fromEntries(\n tracks.map((track) => [track.prop, track.steps[0].start[track.prop]])\n );\n staticClip.to = Object.fromEntries(\n tracks.map((track) => {\n const last = track.steps[track.steps.length - 1];\n return [track.prop, last.to[track.prop] ?? last.start[track.prop]];\n })\n );\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n return staticClip;\n }\n\n if (clip.stepKeys?.length) {\n // Sequence: chain the legs, threading the running state through so\n // untouched properties hold their prior value.\n let running: Record<string, unknown> = { ...(from ?? {}) };\n let offset = 0;\n const steps: TimelineStepStatic[] = clip.stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(clipResolved[stepKey])\n ? (clipResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const to = isPlainObject(stepResolved.to) ? stepResolved.to : {};\n const step: TimelineStepStatic = {\n key: stepKey,\n offset,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n };\n running = { ...running, ...to };\n offset += effective.duration;\n return step;\n });\n\n staticClip.tracks = [{ delay: 0, duration: offset, steps }];\n staticClip.duration = offset;\n staticClip.to = running;\n } else {\n const storedDuration = typeof clipResolved.duration === 'number' ? clipResolved.duration : 0;\n const to = isPlainObject(clipResolved.to) ? clipResolved.to : undefined;\n\n if (single) {\n const effective = resolveClipTransition(single, storedDuration);\n staticClip.duration = effective.duration;\n staticClip.isPhysics = effective.isPhysics;\n staticClip.transition = effective.transition;\n staticClip.css = transitionToCss(effective.transition);\n staticClip.to = to;\n if (from && to) {\n staticClip.tracks = [\n {\n delay: 0,\n duration: effective.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: from,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n },\n ],\n },\n ];\n }\n } else {\n // Curveless clip (markers, or defensive fallback): the bar is the\n // stored duration; from/to animate with the default spring.\n staticClip.duration = storedDuration;\n staticClip.to = to;\n if (from && to) {\n const base = resolveClipTransition(DEFAULT_CLIP_TRANSITION, storedDuration);\n staticClip.duration = base.duration;\n staticClip.tracks = [\n {\n delay: 0,\n duration: base.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: base.duration,\n isPhysics: false,\n start: from,\n to,\n curve: curveStatic(base.transition, base.duration),\n },\n ],\n },\n ];\n }\n }\n }\n\n if (staticClip.tracks.length) {\n const props = new Set<string>(Object.keys(from ?? {}));\n for (const track of staticClip.tracks) {\n for (const step of track.steps) {\n for (const prop of Object.keys(step.to)) props.add(prop);\n }\n }\n staticClip.props = Array.from(props);\n }\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n\n return staticClip;\n }\n}\n\n// ── Per-frame clip state ──\n\nfunction stepAtPosition(steps: TimelineStepStatic[], pos: number): TimelineStepStatic {\n for (const step of steps) {\n if (pos < step.offset + step.duration) return step;\n }\n return steps[steps.length - 1];\n}\n\n/** One property's value at a cycle position — the hold rule in one place,\n * shared by the frame pass and the waveform sampler. */\nfunction evalPropAtPos(steps: TimelineStepStatic[], prop: string, pos: number): unknown {\n const step = stepAtPosition(steps, pos);\n const within = Math.max(0, pos - step.offset);\n if (prop in step.to) {\n const eased = sampleCurve(step.curve, within);\n return interpolateResolved(step.start[prop], step.to[prop], eased);\n }\n return step.start[prop];\n}\n\n/**\n * `time` is the playhead (what the dock shows); `cycleTime` is continuous\n * time across timeline wraps (wraps × duration + time). Looping clips fold\n * against `cycleTime`, so a looping timeline never snaps their phase — the\n * window is a viewport onto animations that repeat forever. Scrubbing seeks\n * with cycleTime === time, which is the deterministic first-pass state.\n */\nexport function computeClipState(\n clip: TimelineClipStatic,\n time: number,\n cycleTime = time\n): Record<string, unknown> {\n const total = clip.duration;\n const looping = clip.loop === 'repeat' && total > 0;\n // Once the timeline has wrapped, a looping clip is already running even\n // before its `at` — it has been repeating since the previous pass.\n const started = time >= clip.at || (looping && cycleTime > time);\n const done = time >= clip.end;\n const elapsed = time - clip.at;\n const phaseElapsed = looping ? cycleTime - clip.at : elapsed;\n\n const fold = (e: number): number => (looping ? e % total : e);\n\n const basePos = started ? fold(Math.max(0, phaseElapsed)) : 0;\n const progress = total > 0 ? clamp(basePos / total, 0, 1) : started ? 1 : 0;\n\n let current: Record<string, unknown> | undefined;\n let stepIndex = 0;\n\n if (clip.tracks.length && clip.props?.length) {\n // One loop for every clip kind: each track folds against its own cycle,\n // offset by its delay. The delay applies once, then cycles fold — with\n // equal periods that is a permanent phase shift (Motion's semantics). A\n // shared-timing clip is a single track whose steps carry every property.\n current = {};\n for (const track of clip.tracks) {\n const props = track.prop !== undefined ? [track.prop] : clip.props;\n for (const prop of props) {\n const startValue = track.steps[0]?.start[prop];\n if (!started) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const phase = phaseElapsed - track.delay;\n if (phase <= 0) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const pos = looping && track.duration > 0 ? phase % track.duration : phase;\n const value = evalPropAtPos(track.steps, prop, pos);\n if (value !== undefined) current[prop] = value;\n }\n }\n const shared = clip.tracks[0];\n if (started && clip.explicitSteps && shared.prop === undefined) {\n stepIndex = shared.steps.indexOf(stepAtPosition(shared.steps, basePos));\n }\n }\n\n return {\n at: clip.at,\n duration: clip.duration,\n loop: clip.loop,\n started,\n active: started && !done,\n done,\n progress,\n step: clip.explicitSteps ? stepIndex : undefined,\n from: clip.from,\n to: clip.to,\n animate: started ? clip.to : clip.from,\n transition: clip.transition,\n css: clip.css,\n current,\n };\n}\n\n// ── Value interpolation ──\n\n// Mixes two resolved from/to value trees at eased progress p.\n// Numbers lerp (and can overshoot), hex colors mix in clamped RGB,\n// anything else switches at the midpoint.\nexport function interpolateResolved(from: unknown, to: unknown, p: number): unknown {\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * p;\n }\n if (typeof from === 'string' && typeof to === 'string') {\n const mixed = mixHexColors(from, to, p);\n if (mixed) return mixed;\n }\n if (isPlainObject(from) && isPlainObject(to)) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(from)) {\n result[key] = key in to ? interpolateResolved(from[key], to[key], p) : from[key];\n }\n for (const key of Object.keys(to)) {\n if (!(key in from)) result[key] = to[key];\n }\n return result;\n }\n return p < 0.5 ? from : to;\n}\n\nfunction parseHex(hex: string): [number, number, number, number] | null {\n if (!isHexColor(hex)) return null;\n let h = hex.slice(1);\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255,\n ];\n}\n\nfunction mixHexColors(a: string, b: string, p: number): string | null {\n const ca = parseHex(a);\n const cb = parseHex(b);\n if (!ca || !cb) return null;\n const t = clamp(p, 0, 1);\n const mixed = ca.map((v, i) => Math.round(v + (cb[i] - v) * t));\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n const rgb = `#${hex(mixed[0])}${hex(mixed[1])}${hex(mixed[2])}`;\n return mixed[3] === 255 ? rgb : `${rgb}${hex(mixed[3])}`;\n}\n\n// ── CSS output ──\n\n// Approximates the clip's transition as CSS transition properties so\n// non-Motion consumers can use native CSS. Easing configs map exactly;\n// springs are approximated with an overshoot bezier scaled by bounce.\nexport function transitionToCss(transition: TransitionConfig | undefined): TimelineClipCss | undefined {\n if (!transition) return undefined;\n\n if (transition.type === 'easing') {\n return {\n transitionDuration: `${round2(transition.duration)}s`,\n transitionTimingFunction: `cubic-bezier(${transition.ease.map((v) => round2(v)).join(', ')})`,\n };\n }\n\n const params = springParams(transition);\n const dampingRatio = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const duration = transition.visualDuration ?? springSettleDuration(params);\n const bounce = transition.bounce ?? Math.max(0, round2(1 - dampingRatio));\n\n return {\n transitionDuration: `${round2(duration)}s`,\n transitionTimingFunction:\n bounce > 0.05\n ? `cubic-bezier(0.34, ${round2(1.2 + bounce)}, 0.64, 1)`\n : 'cubic-bezier(0.25, 0.6, 0.35, 1)',\n };\n}\n\n// ── Dock helpers ──\n\n/** Popover display values: swap stored shape-only transitions for their\n * effective configs (duration injected from the bar/segment) so the curve\n * editor shows the transition as it actually runs. */\nexport function timelinePopoverDisplayValues(\n values: Record<string, DialValue>,\n clipKey: string,\n stepKeys?: string[],\n stepKey?: string\n): Record<string, DialValue> {\n const display = { ...values };\n const swap = (path: string, duration: number) => {\n const raw = display[path];\n if (isTransitionConfig(raw)) display[path] = resolveClipTransition(raw, duration).transition;\n };\n\n if (stepKey) {\n swap(`${clipKey}.${stepKey}.transition`, numberValue(values[`${clipKey}.${stepKey}.duration`]));\n return display;\n }\n\n const cycle = stepKeys?.length\n ? stepKeys.reduce((sum, sk) => sum + numberValue(values[`${clipKey}.${sk}.duration`]), 0)\n : numberValue(values[`${clipKey}.duration`]);\n\n swap(`${clipKey}.transition`, cycle);\n return display;\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : 0;\n}\n\n// ── Property lanes ──\n\n/** Rebuilds the nested resolved shape for one clip from flat stored values —\n * the dock's inverse of the panel's path flattening. */\nfunction unflattenClipValues(\n values: Record<string, DialValue>,\n clipKey: string\n): Record<string, unknown> {\n const prefix = `${clipKey}.`;\n const result: Record<string, unknown> = {};\n const entries = Object.entries(values)\n .filter(([path]) => path.startsWith(prefix))\n .map(([path, value]) => ({ segments: path.slice(prefix.length).split('.'), value }))\n .sort((a, b) => a.segments.length - b.segments.length);\n\n for (const { segments, value } of entries) {\n let node = result;\n for (let i = 0; i < segments.length - 1; i++) {\n const existing = node[segments[i]];\n node = (isPlainObject(existing) ? existing : (node[segments[i]] = {})) as Record<string, unknown>;\n }\n node[segments[segments.length - 1]] = cloneTimelineValue(value);\n }\n return result;\n}\n\nfunction cloneTimelineValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneTimelineValue);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, cloneTimelineValue(nested)])\n );\n}\n\n/** Dragging a track bar edits the property's phase offset. */\nexport function clampTrackDelay(\n delay: number,\n at: number,\n trackDuration: number,\n timelineDuration: number\n): number {\n return clamp(round2(delay), 0, Math.max(0, round2(timelineDuration - at - trackDuration)));\n}\n\n// Clip-edit clamp policy — one place, shared by every gesture/consumer.\nexport function clampClipMove(at: number, duration: number, timelineDuration: number): number {\n return clamp(round2(at), 0, Math.max(0, timelineDuration - duration));\n}\n\nexport function clampClipResizeEnd(duration: number, at: number, timelineDuration: number): number {\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, timelineDuration - at);\n}\n\nexport function clampClipResizeStart(\n newAt: number,\n at: number,\n duration: number\n): { at: number; duration: number } {\n const clampedAt = clamp(round2(newAt), 0, at + duration - TIMELINE_MIN_CLIP_DURATION);\n return { at: clampedAt, duration: round2(at + duration - clampedAt) };\n}\n\n/** Resizing one leg of a sequence: the other legs keep their length, the\n * whole bar must still fit the timeline. */\nexport function clampStepResize(\n duration: number,\n at: number,\n otherStepsTotal: number,\n timelineDuration: number\n): number {\n const max = Math.max(TIMELINE_MIN_CLIP_DURATION, timelineDuration - at - otherStepsTotal);\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, max);\n}\n\n/** Copy-for-agent export: strip editor-only state, normalize shape-only\n * transitions, resolve physics durations, and drop zero-value defaults. */\nexport function normalizeTimelineValuesForCopy(\n values: Record<string, DialValue>,\n clips: TimelineClipMeta[]\n): Record<string, DialValue> {\n const normalized: Record<string, DialValue> = { ...values };\n\n // Transition mode is editor UI state, not part of a DialKit config. It is\n // stored beside values so mode switches survive presets, but must never be\n // included in the tune → copy → remove payload.\n for (const path of Object.keys(normalized)) {\n if (path.endsWith('.__mode')) delete normalized[path];\n }\n\n const normalizeTransitionAt = (transitionPath: string, durationPath: string) => {\n const raw = normalized[transitionPath];\n if (!isTransitionConfig(raw)) return;\n if (isPhysicsSpring(raw)) {\n // A mode switch can leave the previous time-based bar duration stored.\n // Export the spring's actual derived length so the copied config exactly\n // matches the timeline the author just tuned.\n normalized[durationPath] = transitionDefaultDuration(raw);\n }\n normalized[transitionPath] = normalizeStoredTransition(\n raw,\n numberValue(normalized[durationPath])\n );\n };\n\n for (const clip of clips) {\n for (const stepKey of clip.stepKeys ?? []) {\n normalizeTransitionAt(\n `${clip.key}.${stepKey}.transition`,\n `${clip.key}.${stepKey}.duration`\n );\n }\n\n normalizeTransitionAt(`${clip.key}.transition`, `${clip.key}.duration`);\n\n // Property tracks: normalize each track's transitions against its own\n // durations, drop zero delays (the config default).\n for (const track of clip.tracks ?? []) {\n const trackKey = `${clip.key}.${track.prop}`;\n for (const stepKey of track.stepKeys ?? []) {\n normalizeTransitionAt(\n `${trackKey}.${stepKey}.transition`,\n `${trackKey}.${stepKey}.duration`\n );\n }\n normalizeTransitionAt(`${trackKey}.transition`, `${trackKey}.duration`);\n if (normalized[`${trackKey}.delay`] === 0) {\n delete normalized[`${trackKey}.delay`];\n }\n }\n\n delete normalized[`${clip.key}.loop`];\n }\n return normalized;\n}\n\n// ── Formatting ──\n\nexport function formatClock(time: number, tenths = false): string {\n const safe = Math.max(0, time);\n const minutes = Math.floor(safe / 60);\n const seconds = safe - minutes * 60;\n const secondsText = tenths\n ? seconds.toFixed(1).padStart(4, '0')\n : String(Math.floor(seconds)).padStart(2, '0');\n return `${String(minutes).padStart(2, '0')}:${secondsText}`;\n}\n\nexport function formatSeconds(value: number): string {\n return `${round2(value)}s`;\n}\n\nexport function formatStepLabel(stepKey: string): string {\n const match = /^step(\\d+)$/.exec(stepKey);\n return match ? `Step ${match[1]}` : formatLabel(stepKey);\n}\n","import type { DialKitPersistOptions } from '../store/DialStore';\nimport type { TimelineMeta, TimelineTransport } from '../store/TimelineStore';\nimport { loopSpan } from '../store/TimelineStore';\nimport {\n computeClipState,\n type DialTimelineValues,\n type ParsedTimeline,\n type TimelineClipStatic,\n type TimelineConfig,\n} from '../timeline-core';\n\nexport interface DialTimelineOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n /** Start playing on mount. Defaults to true. */\n autoplay?: boolean;\n /**\n * Loop when the playhead reaches the end. `true` restarts the whole\n * timeline; `{ from }` wraps back to that time instead, so clips before it\n * play once and looping clips keep cycling forever. Defaults to false.\n */\n loop?: boolean | { from: number };\n}\n\nexport type TimelineActions = {\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n};\n\n/** One resolution of the public loop option, shared by every adapter. */\nexport function resolveTimelineLoop(\n loop: DialTimelineOptions['loop']\n): { enabled: boolean; start: number } {\n if (typeof loop === 'object' && loop !== null) {\n return {\n enabled: true,\n start: Number.isFinite(loop.from) ? Math.max(0, loop.from) : 0,\n };\n }\n return { enabled: Boolean(loop), start: 0 };\n}\n\nexport function buildTimelineMeta(\n id: string,\n name: string,\n duration: number,\n parsed: ParsedTimeline,\n loop: DialTimelineOptions['loop']\n): TimelineMeta {\n const resolvedLoop = resolveTimelineLoop(loop);\n return {\n id,\n name,\n duration,\n loop: resolvedLoop.enabled,\n loopStart: resolvedLoop.start,\n clips: parsed.clips,\n };\n}\n\n/**\n * Framework-neutral frame pass. Adapters only own lifecycle and reactivity;\n * the value shape and loop-cycle math stay identical everywhere.\n */\nexport function buildTimelineValues<T extends TimelineConfig>(\n staticClips: TimelineClipStatic[],\n transport: TimelineTransport,\n timelineDuration: number,\n loopStart: number,\n actions: TimelineActions\n): DialTimelineValues<T> {\n const result: Record<string, unknown> = {\n time: transport.time,\n playing: transport.playing,\n duration: timelineDuration,\n ...actions,\n };\n\n const span = loopSpan(transport.duration, loopStart);\n const cycleTime = (span > 0 ? transport.wraps * span : 0) + transport.time;\n for (const clip of staticClips) {\n const state = computeClipState(clip, transport.time, cycleTime);\n if (clip.group) {\n const bucket = (result[clip.group] ??= {}) as Record<string, unknown>;\n bucket[clip.childKey] = state;\n } else {\n result[clip.key] = state;\n }\n }\n\n return result as DialTimelineValues<T>;\n}\n","import { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { DialStore, formatLabel } from '../../store/DialStore';\nimport type { ControlMeta, DialValue } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport type { TimelineClipMeta, TimelineMeta } from '../../store/TimelineStore';\nimport { TimelineUiStore } from '../../store/TimelineUiStore';\nimport {\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n formatClock,\n formatSeconds,\n formatStepLabel,\n computeClipStaticFromValues,\n normalizeTimelineValuesForCopy,\n TIMELINE_MIN_CLIP_DURATION,\n timelinePopoverDisplayValues,\n} from '../../timeline-core';\nimport type { TimelineClipLoop, TimelineStepStatic } from '../../timeline-core';\nimport { clamp } from '../../transition-math';\nimport { buildCopyInstruction } from '../../copy-instruction';\nimport { isDevDefault } from '../../env';\nimport { ICON_ADD_PRESET, ICON_CHEVRON, ICON_CHECK, ICON_CLIPBOARD, ICON_PAUSE, ICON_PLAY, ICON_REPLAY } from '../../icons';\nimport { findControl } from '../../shortcut-utils';\nimport { ControlRenderer } from '../ControlRenderer';\nimport { PresetManager } from '../PresetManager';\nimport type { DialTheme } from '../DialRoot';\n\nconst DRAG_THRESHOLD_PX = 3;\nconst MAJOR_TICK_TARGET_PX = 140;\nconst MILLISECOND_STEP = 0.001;\nconst SECOND_TICK_STEPS = [\n 0.001, 0.002, 0.005,\n 0.01, 0.02, 0.05,\n 0.1, 0.2, 0.5,\n 1, 2, 5, 10, 15, 30, 60, 120, 300, 600,\n];\nconst MIN_TIMELINE_MAX_ZOOM = 8;\nconst PLAYHEAD_FLAG_WIDTH = 52;\nconst PLAYHEAD_FLAG_EDGE_OVERHANG = 1;\nconst POPOVER_WIDTH = 280;\nconst ZOOM_DRAG_DISTANCE = 180;\nconst DEFAULT_DOCK_MAX_HEIGHT = 400;\nconst MIN_DOCK_MAX_HEIGHT = 120;\n\nconst subscribeGlobalTimelines = (callback: () => void) => TimelineStore.subscribeGlobal(callback);\nconst getTimelines = () => TimelineStore.getTimelines();\nconst subscribeTimelineVisibility = (callback: () => void) => TimelineUiStore.subscribe(callback);\nconst getTimelineVisibility = () => TimelineUiStore.getVisible();\n\nexport interface DialTimelineProps {\n theme?: DialTheme;\n /** Initial dock visibility. Expansion is controlled separately by defaultOpen. */\n defaultVisible?: boolean;\n /** Controlled dock visibility. */\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen?: boolean;\n productionEnabled?: boolean;\n}\n\n// Memoized: hosts that bind `current` re-render every frame, and the dock\n// must not reconcile with them — only its transport leaves tick.\n// The production gate is a hook-free wrapper so its conditional return can\n// never change hook order in the component that actually uses hooks.\nexport const DialTimeline = memo(function DialTimeline({\n theme = 'system',\n defaultVisible = true,\n visible,\n onVisibilityChange,\n defaultOpen = true,\n productionEnabled = isDevDefault,\n}: DialTimelineProps) {\n if (!productionEnabled) return null;\n return (\n <DialTimelineDock\n theme={theme}\n defaultVisible={defaultVisible}\n visible={visible}\n onVisibilityChange={onVisibilityChange}\n defaultOpen={defaultOpen}\n />\n );\n});\n\nfunction DialTimelineDock({\n theme,\n defaultVisible,\n visible,\n onVisibilityChange,\n defaultOpen,\n}: {\n theme: DialTheme;\n defaultVisible: boolean;\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen: boolean;\n}) {\n const [mounted, setMounted] = useState(false);\n const [dockMaxHeight, setDockMaxHeight] = useState(DEFAULT_DOCK_MAX_HEIGHT);\n const visibilityControllerId = useRef(Symbol('dialkit-timeline-visibility'));\n const dockRef = useRef<HTMLDivElement>(null);\n const resizeCleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => TimelineUiStore.registerController(visibilityControllerId.current, {\n visible,\n defaultVisible,\n onVisibilityChange,\n }), []);\n\n useEffect(() => {\n TimelineUiStore.updateController(visibilityControllerId.current, {\n visible,\n defaultVisible,\n onVisibilityChange,\n });\n }, [defaultVisible, onVisibilityChange, visible]);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => () => resizeCleanupRef.current?.(), []);\n\n const handleResizePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const dock = dockRef.current;\n if (!dock) return;\n e.preventDefault();\n e.stopPropagation();\n resizeCleanupRef.current?.();\n\n const pointerY = e.clientY;\n const startHeight = dock.getBoundingClientRect().height;\n const handlePointerMove = (event: PointerEvent) => {\n event.preventDefault();\n const viewportMax = Math.max(MIN_DOCK_MAX_HEIGHT, window.innerHeight - 24);\n setDockMaxHeight(clamp(startHeight + pointerY - event.clientY, MIN_DOCK_MAX_HEIGHT, viewportMax));\n };\n const finishResize = () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', finishResize);\n window.removeEventListener('pointercancel', finishResize);\n resizeCleanupRef.current = null;\n };\n\n window.addEventListener('pointermove', handlePointerMove, { passive: false });\n window.addEventListener('pointerup', finishResize);\n window.addEventListener('pointercancel', finishResize);\n resizeCleanupRef.current = finishResize;\n }, []);\n\n const timelines = useSyncExternalStore(subscribeGlobalTimelines, getTimelines, getTimelines);\n const dockVisible = useSyncExternalStore(\n subscribeTimelineVisibility,\n getTimelineVisibility,\n getTimelineVisibility\n );\n\n if (!mounted || typeof window === 'undefined' || timelines.length === 0) {\n return null;\n }\n\n return createPortal(\n <div className=\"dialkit-root dialkit-timeline\" data-theme={theme} hidden={!dockVisible}>\n <div\n className=\"dialkit-timeline-resize-handle\"\n onPointerDown={handleResizePointerDown}\n role=\"separator\"\n aria-label=\"Resize timeline height\"\n aria-orientation=\"horizontal\"\n title=\"Drag to resize timeline\"\n />\n <div\n ref={dockRef}\n className=\"dialkit-timeline-dock\"\n style={{ maxHeight: `min(${dockMaxHeight}px, calc(100vh - 24px))` }}\n >\n {timelines.map((timeline) => (\n <TimelineSection\n key={timeline.id}\n meta={timeline}\n defaultOpen={defaultOpen}\n theme={theme}\n dockVisible={dockVisible}\n />\n ))}\n </div>\n </div>,\n document.body\n );\n}\n\n// ── Transport leaves ──\n// The 60Hz clock is consumed only by these leaf components (and the per-clip\n// active flag), each with a snapshot that changes identity exactly as often\n// as its output — the section itself stays static during playback.\n\nfunction useTransportSubscribe(id: string) {\n return useCallback((callback: () => void) => TimelineStore.subscribe(id, callback), [id]);\n}\n\nfunction PlayPauseButton({ id }: { id: string }) {\n const subscribe = useTransportSubscribe(id);\n // Boolean snapshot: re-renders only when play state flips\n const getPlaying = useCallback(() => TimelineStore.getTransport(id).playing, [id]);\n const playing = useSyncExternalStore(subscribe, getPlaying, getPlaying);\n\n return (\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={() => (playing ? TimelineStore.pause(id) : TimelineStore.play(id))}\n title={playing ? 'Pause' : 'Play'}\n aria-label={playing ? 'Pause' : 'Play'}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {playing ? (\n <motion.svg\n key=\"pause\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n {ICON_PAUSE.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </motion.svg>\n ) : (\n <motion.svg\n key=\"play\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_PLAY} fill=\"currentColor\" />\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n );\n}\n\nfunction ReplayButton({ onReplay }: { onReplay: () => void }) {\n return (\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={onReplay}\n title=\"Replay\"\n aria-label=\"Replay\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n {ICON_REPLAY.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </svg>\n </motion.button>\n );\n}\n\nfunction TimelinePlayheadFlag({\n id,\n duration,\n pxPerSecond,\n viewStart,\n viewEnd,\n laneWidth,\n rulerRef,\n onResetView,\n}: {\n id: string;\n duration: number;\n pxPerSecond: number;\n viewStart: number;\n viewEnd: number;\n laneWidth: number;\n rulerRef: React.RefObject<HTMLDivElement>;\n onResetView: () => void;\n}) {\n const subscribe = useTransportSubscribe(id);\n const getTime = useCallback(() => TimelineStore.getTransport(id).time, [id]);\n const time = useSyncExternalStore(subscribe, getTime, getTime);\n const scrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n viewEnd: number;\n } | null>(null);\n const cleanupScrubRef = useRef<(() => void) | null>(null);\n\n const seekFromClientX = useCallback((clientX: number) => {\n const rect = scrubRef.current?.rect;\n const scrub = scrubRef.current;\n const contentWidth = rect?.width ?? 0;\n if (!rect || !scrub || contentWidth <= 0) return;\n const nextTime = clamp(\n scrub.viewStart + ((clientX - rect.left) / contentWidth) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n );\n TimelineStore.seek(id, nextTime);\n }, [id]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const rect = rulerRef.current?.getBoundingClientRect();\n if (!rect) return;\n e.preventDefault();\n e.stopPropagation();\n cleanupScrubRef.current?.();\n const resetView = e.shiftKey;\n scrubRef.current = {\n wasPlaying: TimelineStore.getTransport(id).playing,\n rect,\n viewStart: resetView ? 0 : viewStart,\n viewEnd: resetView ? duration : viewEnd,\n };\n if (resetView) onResetView();\n TimelineStore.pause(id);\n seekFromClientX(e.clientX);\n\n const handleWindowPointerMove = (event: PointerEvent) => {\n event.preventDefault();\n seekFromClientX(event.clientX);\n };\n const finishWindowScrub = () => {\n window.removeEventListener('pointermove', handleWindowPointerMove);\n window.removeEventListener('pointerup', finishWindowScrub);\n window.removeEventListener('pointercancel', finishWindowScrub);\n if (scrubRef.current?.wasPlaying) TimelineStore.play(id);\n scrubRef.current = null;\n cleanupScrubRef.current = null;\n };\n\n window.addEventListener('pointermove', handleWindowPointerMove, { passive: false });\n window.addEventListener('pointerup', finishWindowScrub);\n window.addEventListener('pointercancel', finishWindowScrub);\n cleanupScrubRef.current = finishWindowScrub;\n }, [duration, id, onResetView, rulerRef, seekFromClientX, viewEnd, viewStart]);\n\n useEffect(() => () => cleanupScrubRef.current?.(), []);\n\n if (time < viewStart || time > viewEnd || laneWidth <= 0) return null;\n\n const x = clamp(\n (time - viewStart) * pxPerSecond,\n 0,\n laneWidth\n );\n const flagCenter = clamp(\n x,\n PLAYHEAD_FLAG_WIDTH / 2 - PLAYHEAD_FLAG_EDGE_OVERHANG,\n laneWidth - PLAYHEAD_FLAG_WIDTH / 2 + PLAYHEAD_FLAG_EDGE_OVERHANG\n );\n const flagOffset = flagCenter - x;\n const edge = flagOffset > 0.5 ? 'start' : flagOffset < -0.5 ? 'end' : 'center';\n\n return (\n <div\n className=\"dialkit-timeline-playhead-control\"\n data-edge={edge}\n style={{\n left: `calc(var(--dial-timeline-label-w) + ${x}px)`,\n '--dial-timeline-playhead-flag-offset': `${flagOffset}px`,\n } as CSSProperties}\n onPointerDown={handlePointerDown}\n role=\"slider\"\n aria-label=\"Timeline current time\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={time}\n title=\"Drag to scrub the timeline\"\n >\n <div className=\"dialkit-timeline-playhead-stem\" />\n <div className=\"dialkit-timeline-playhead-anchor\">\n <div className=\"dialkit-timeline-playhead-flag\">{time.toFixed(2)}</div>\n </div>\n </div>\n );\n}\n\nfunction TimelineOverview({\n id,\n duration,\n viewStart,\n viewEnd,\n onNavigate,\n}: {\n id: string;\n duration: number;\n viewStart: number;\n viewEnd: number;\n onNavigate: (time: number) => void;\n}) {\n const subscribe = useTransportSubscribe(id);\n const getTime = useCallback(() => TimelineStore.getTransport(id).time, [id]);\n const time = useSyncExternalStore(subscribe, getTime, getTime);\n const scrubRef = useRef<{ wasPlaying: boolean; rect: DOMRect } | null>(null);\n\n const seekFromClientX = useCallback((clientX: number) => {\n const rect = scrubRef.current?.rect;\n if (!rect || rect.width <= 0 || duration <= 0) return;\n const nextTime = clamp(((clientX - rect.left) / rect.width) * duration, 0, duration);\n TimelineStore.seek(id, nextTime);\n onNavigate(nextTime);\n }, [duration, id, onNavigate]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n scrubRef.current = {\n wasPlaying: TimelineStore.getTransport(id).playing,\n rect: e.currentTarget.getBoundingClientRect(),\n };\n TimelineStore.pause(id);\n seekFromClientX(e.clientX);\n }, [id, seekFromClientX]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (scrubRef.current) seekFromClientX(e.clientX);\n }, [seekFromClientX]);\n\n const finishScrub = useCallback(() => {\n if (scrubRef.current?.wasPlaying) TimelineStore.play(id);\n scrubRef.current = null;\n }, [id]);\n\n const viewportLeft = duration > 0 ? (viewStart / duration) * 100 : 0;\n const viewportWidth = duration > 0 ? ((viewEnd - viewStart) / duration) * 100 : 100;\n const playheadLeft = duration > 0 ? (time / duration) * 100 : 0;\n\n return (\n <div\n className=\"dialkit-timeline-overview\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={finishScrub}\n onPointerCancel={finishScrub}\n onLostPointerCapture={finishScrub}\n title=\"Drag to scrub the full timeline\"\n >\n <div\n className=\"dialkit-timeline-overview-viewport\"\n data-zoomed={viewportWidth < 99.999 || undefined}\n style={{ left: `${viewportLeft}%`, width: `${viewportWidth}%` }}\n />\n <div className=\"dialkit-timeline-overview-progress\" style={{ width: `${playheadLeft}%` }} />\n <div className=\"dialkit-timeline-overview-playhead\" style={{ left: `${playheadLeft}%` }} />\n </div>\n );\n}\n\n// ── Section ──\n\ntype PopoverState = {\n clip: TimelineClipMeta;\n /** Set when the popover edits one leg of a sequence. */\n stepKey?: string;\n anchor: { left: number; top: number; right: number; bottom: number; width: number; height: number };\n};\n\ntype ZoomDragState = {\n pointerX: number;\n rect: DOMRect;\n zoom: number;\n viewStart: number;\n anchorRatio: number;\n anchorTime: number;\n moved: boolean;\n};\n\nfunction clampViewStart(start: number, duration: number, visibleDuration: number): number {\n return clamp(start, 0, Math.max(0, duration - visibleDuration));\n}\n\nfunction formatRulerSeconds(time: number, step: number): string {\n if (step >= 1 && Number.isInteger(time)) return formatClock(time);\n const decimals = Math.min(3, Math.max(1, Math.ceil(-Math.log10(step))));\n return `${time.toFixed(decimals)}s`;\n}\n\nconst TimelineSection = memo(function TimelineSection({\n meta,\n defaultOpen,\n theme,\n dockVisible,\n}: {\n meta: TimelineMeta;\n defaultOpen: boolean;\n theme: DialTheme;\n dockVisible: boolean;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n const [copied, setCopied] = useState(false);\n const [popover, setPopover] = useState<PopoverState | null>(null);\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(() => new Set());\n const [expandedTracks, setExpandedTracks] = useState<Set<string>>(() => new Set());\n const [zoom, setZoom] = useState(1);\n const [viewStart, setViewStart] = useState(0);\n\n const subscribeValues = useCallback(\n (callback: () => void) => DialStore.subscribe(meta.id, callback),\n [meta.id]\n );\n const getValues = useCallback(() => DialStore.getValues(meta.id), [meta.id]);\n const values = useSyncExternalStore(subscribeValues, getValues, getValues);\n const presets = DialStore.getPresets(meta.id);\n const activePresetId = DialStore.getActivePresetId(meta.id);\n\n // Measure the shared ruler/track span so seconds map to pixels.\n const laneAreaRef = useRef<HTMLDivElement>(null);\n const horizontalScrollRef = useRef<HTMLDivElement>(null);\n const [laneWidth, setLaneWidth] = useState(0);\n\n useLayoutEffect(() => {\n if (!open) return;\n const ruler = laneAreaRef.current;\n if (!ruler) return;\n const measure = () => {\n setLaneWidth(ruler.getBoundingClientRect().width);\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(ruler);\n return () => observer.disconnect();\n }, [open]);\n\n const visibleDuration = meta.duration > 0 ? meta.duration / zoom : meta.duration;\n const safeViewStart = clampViewStart(viewStart, meta.duration, visibleDuration);\n const viewEnd = safeViewStart + visibleDuration;\n const pxPerSecond = visibleDuration > 0 && laneWidth > 0 ? laneWidth / visibleDuration : 0;\n const millisecondReadableZoom = laneWidth > 0 && meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * meta.duration) / (MILLISECOND_STEP * 10 * laneWidth)\n : MIN_TIMELINE_MAX_ZOOM;\n const maxZoom = Math.max(MIN_TIMELINE_MAX_ZOOM, millisecondReadableZoom);\n\n useEffect(() => {\n setZoom((current) => clamp(current, 1, maxZoom));\n }, [maxZoom]);\n\n useEffect(() => {\n setViewStart((current) => clampViewStart(current, meta.duration, meta.duration / zoom));\n }, [meta.duration, zoom]);\n\n useLayoutEffect(() => {\n const scroller = horizontalScrollRef.current;\n if (!scroller || pxPerSecond <= 0) return;\n const nextScrollLeft = safeViewStart * pxPerSecond;\n if (Math.abs(scroller.scrollLeft - nextScrollLeft) > 0.5) {\n scroller.scrollLeft = nextScrollLeft;\n }\n }, [open, pxPerSecond, safeViewStart]);\n\n useEffect(() => {\n if (!dockVisible) setPopover(null);\n }, [dockVisible]);\n\n const centerViewAt = useCallback((time: number) => {\n if (zoom <= 1 || meta.duration <= 0) return;\n const windowDuration = meta.duration / zoom;\n setViewStart(clampViewStart(time - windowDuration / 2, meta.duration, windowDuration));\n }, [meta.duration, zoom]);\n\n const resetView = useCallback(() => {\n setZoom(1);\n setViewStart(0);\n }, []);\n\n const handleReplay = useCallback(() => {\n setViewStart(0);\n TimelineStore.replay(meta.id);\n }, [meta.id]);\n\n const handleHorizontalScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n if (pxPerSecond <= 0) return;\n setViewStart(clampViewStart(\n e.currentTarget.scrollLeft / pxPerSecond,\n meta.duration,\n visibleDuration\n ));\n }, [meta.duration, pxPerSecond, visibleDuration]);\n\n const handleTimelineWheel = useCallback((e: React.WheelEvent<HTMLDivElement>) => {\n const scroller = horizontalScrollRef.current;\n if (!scroller || zoom <= 1) return;\n const horizontalDelta = Math.abs(e.deltaX) > Math.abs(e.deltaY)\n ? e.deltaX\n : e.shiftKey\n ? e.deltaY\n : 0;\n if (horizontalDelta === 0) return;\n e.preventDefault();\n scroller.scrollLeft += horizontalDelta;\n }, [zoom]);\n\n // Dragging scrubs. Option/Alt-drag preserves detailed zooming, while\n // Shift-drag first restores the full 1x range.\n const zoomDragRef = useRef<ZoomDragState | null>(null);\n const rulerScrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n visibleDuration: number;\n } | null>(null);\n\n const seekRulerFromClientX = useCallback((clientX: number) => {\n const scrub = rulerScrubRef.current;\n const contentWidth = scrub?.rect.width ?? 0;\n if (!scrub || contentWidth <= 0) return;\n TimelineStore.seek(\n meta.id,\n clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / contentWidth) * scrub.visibleDuration,\n scrub.viewStart,\n scrub.viewStart + scrub.visibleDuration\n )\n );\n }, [meta.id]);\n\n const handleRulerPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const contentWidth = rect.width;\n if (contentWidth <= 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (!e.altKey) {\n const resetView = e.shiftKey;\n rulerScrubRef.current = {\n wasPlaying: TimelineStore.getTransport(meta.id).playing,\n rect,\n viewStart: resetView ? 0 : safeViewStart,\n visibleDuration: resetView ? meta.duration : visibleDuration,\n };\n if (resetView) {\n setZoom(1);\n setViewStart(0);\n }\n TimelineStore.pause(meta.id);\n seekRulerFromClientX(e.clientX);\n return;\n }\n\n const anchorRatio = clamp((e.clientX - rect.left) / contentWidth, 0, 1);\n zoomDragRef.current = {\n pointerX: e.clientX,\n rect,\n zoom,\n viewStart: safeViewStart,\n anchorRatio,\n anchorTime: safeViewStart + anchorRatio * visibleDuration,\n moved: false,\n };\n }, [meta.duration, meta.id, safeViewStart, seekRulerFromClientX, visibleDuration, zoom]);\n\n const handleRulerPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (rulerScrubRef.current) {\n seekRulerFromClientX(e.clientX);\n return;\n }\n const drag = zoomDragRef.current;\n if (!drag || meta.duration <= 0) return;\n const dx = e.clientX - drag.pointerX;\n if (!drag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n\n const nextZoom = clamp(drag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom);\n const nextVisibleDuration = meta.duration / nextZoom;\n const nextStart = clampViewStart(\n drag.anchorTime - drag.anchorRatio * nextVisibleDuration,\n meta.duration,\n nextVisibleDuration\n );\n setZoom(nextZoom);\n setViewStart(nextStart);\n }, [maxZoom, meta.duration, seekRulerFromClientX]);\n\n const handleRulerPointerUp = useCallback(() => {\n if (rulerScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n rulerScrubRef.current = null;\n zoomDragRef.current = null;\n }, [meta.id]);\n\n const handleRulerPointerCancel = useCallback(() => {\n if (rulerScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n rulerScrubRef.current = null;\n zoomDragRef.current = null;\n }, [meta.id]);\n\n const trackScrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n visibleDuration: number;\n } | null>(null);\n\n const seekTrackFromClientX = useCallback((clientX: number) => {\n const scrub = trackScrubRef.current;\n const contentWidth = scrub?.rect.width ?? 0;\n if (!scrub || contentWidth <= 0) return;\n const nextTime = clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / contentWidth) * scrub.visibleDuration,\n scrub.viewStart,\n scrub.viewStart + scrub.visibleDuration\n );\n TimelineStore.seek(meta.id, nextTime);\n }, [meta.id]);\n\n const handleTrackPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!e.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef.current?.getBoundingClientRect();\n if (!rect) return;\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n const resetView = e.shiftKey;\n trackScrubRef.current = {\n wasPlaying: TimelineStore.getTransport(meta.id).playing,\n rect,\n viewStart: resetView ? 0 : safeViewStart,\n visibleDuration: resetView ? meta.duration : visibleDuration,\n };\n if (resetView) {\n setZoom(1);\n setViewStart(0);\n }\n setPopover(null);\n TimelineStore.pause(meta.id);\n seekTrackFromClientX(e.clientX);\n }, [meta.duration, meta.id, safeViewStart, seekTrackFromClientX, visibleDuration]);\n\n const handleTrackPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (trackScrubRef.current) seekTrackFromClientX(e.clientX);\n }, [seekTrackFromClientX]);\n\n const finishTrackScrub = useCallback(() => {\n if (trackScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n trackScrubRef.current = null;\n }, [meta.id]);\n\n const handleCopy = useCallback(() => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(meta.id), meta.clips);\n navigator.clipboard.writeText(buildCopyInstruction('useDialTimeline', meta.name, normalized));\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [meta.clips, meta.id, meta.name]);\n\n const handleAddPreset = useCallback(() => {\n DialStore.savePreset(meta.id, `Version ${presets.length + 2}`);\n }, [meta.id, presets.length]);\n\n const closePopover = useCallback(() => setPopover(null), []);\n\n const openClipPopover = useCallback(\n (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const exclude = stepKey ? undefined : clipPopoverExclusions(clip);\n // Guard clips whose folder has not registered yet.\n if (getClipControls(meta.id, targetPath, exclude).length === 0) return;\n setPopover((prev) =>\n prev?.clip.key === clip.key && prev?.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n }\n );\n },\n [meta.id]\n );\n\n const toggleTracks = useCallback((clipKey: string) => {\n setExpandedTracks((prev) => {\n const next = new Set(prev);\n if (next.has(clipKey)) next.delete(clipKey);\n else next.add(clipKey);\n return next;\n });\n }, []);\n\n // A props clip's bar is a read-only composite — clicking it expands the\n // tracks instead of opening an editor.\n const handleBarClick = useCallback(\n (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) {\n toggleTracks(clip.key);\n return;\n }\n openClipPopover(clip, rect, stepKey);\n },\n [openClipPopover, toggleTracks]\n );\n\n const toggleGroup = useCallback((group: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(group)) next.delete(group);\n else next.add(group);\n return next;\n });\n }, []);\n\n // Ruler ticks\n const rawStep = pxPerSecond > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond : 1;\n const adaptiveMajorStep = SECOND_TICK_STEPS.find((step) => step >= rawStep) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom < 1.5 && meta.duration >= 1 ? Math.max(1, adaptiveMajorStep) : adaptiveMajorStep;\n const fineTickStep = majorStep / 10;\n const majorTicks: number[] = [];\n const mediumTicks: number[] = [];\n const fineTicks: number[] = [];\n const firstMajorTick = Math.ceil((safeViewStart - 1e-6) / majorStep) * majorStep;\n for (let t = firstMajorTick; t <= viewEnd + 1e-6; t += majorStep) {\n majorTicks.push(Number(t.toFixed(4)));\n }\n const firstFineIndex = Math.ceil((safeViewStart - 1e-6) / fineTickStep);\n const lastFineIndex = Math.floor((viewEnd + 1e-6) / fineTickStep);\n for (let index = firstFineIndex; index <= lastFineIndex; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineTickStep).toFixed(6));\n if (index % 5 === 0) mediumTicks.push(tick);\n else fineTicks.push(tick);\n }\n\n // Rows: clips in config order, grouped clips under a collapsible header,\n // props clips expandable into full per-property track rows.\n const rows: ReactNode[] = [];\n let lastGroup: string | undefined;\n for (const clip of meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const isCollapsed = collapsedGroups.has(group);\n rows.push(\n <div key={`group:${group}`} className=\"dialkit-timeline-row dialkit-timeline-group-row\">\n <div className=\"dialkit-timeline-label\">\n <button\n className=\"dialkit-timeline-group-toggle\"\n data-open={!isCollapsed}\n onClick={() => toggleGroup(group)}\n title={isCollapsed ? 'Expand layer' : 'Collapse layer'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n <span>{formatLabel(group)}</span>\n </div>\n <div className=\"dialkit-timeline-lane\" />\n </div>\n );\n }\n }\n if (clip.group && collapsedGroups.has(clip.group)) continue;\n\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks.has(clip.key);\n const stat = computeClipStaticFromValues(values, clip, meta.duration);\n\n rows.push(\n <div key={clip.key} className=\"dialkit-timeline-row\" data-grouped={clip.group ? '' : undefined}>\n <div className=\"dialkit-timeline-label\">\n {isProps ? (\n <button\n className=\"dialkit-timeline-group-toggle\"\n data-open={tracksOpen}\n onClick={(e) => {\n e.stopPropagation();\n toggleTracks(clip.key);\n }}\n title={tracksOpen ? 'Collapse properties' : 'Expand properties'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n ) : null}\n {clip.label}\n </div>\n <div className=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={meta.id}\n clip={clip}\n at={stat.at}\n duration={stat.duration}\n loop={stat.loop}\n steps={clip.stepKeys?.length ? stat.tracks[0]?.steps : undefined}\n fixedDuration={isProps ? true : stat.isPhysics}\n composite={isProps}\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n timelineDuration={meta.duration}\n selected={popover?.clip.key === clip.key}\n selectedStepKey={popover?.clip.key === clip.key ? popover.stepKey : undefined}\n onClick={handleBarClick}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n\n // Expanded tracks: each property is a full clip row of its own — its\n // values, curve, and duration are all editable; the bar position is the\n // track's delay (its phase offset from the clip's `at`).\n if (tracksOpen) {\n for (const trackRef of clip.tracks ?? []) {\n const track = stat.tracks.find((candidate) => candidate.prop === trackRef.prop);\n if (!track) continue;\n const trackKey = `${clip.key}.${trackRef.prop}`;\n const trackMeta: TimelineClipMeta = {\n key: trackKey,\n label: `${clip.label} · ${formatLabel(trackRef.prop)}`,\n color: clip.color,\n loop: clip.loop,\n group: clip.group,\n stepKeys: trackRef.stepKeys,\n };\n rows.push(\n <div\n key={trackKey}\n className=\"dialkit-timeline-row dialkit-timeline-track-row\"\n data-grouped={clip.group ? '' : undefined}\n >\n <div className=\"dialkit-timeline-label\">{formatLabel(trackRef.prop)}</div>\n <div className=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={meta.id}\n clip={trackMeta}\n at={stat.at + track.delay}\n duration={track.duration}\n loop={stat.loop}\n steps={trackRef.stepKeys?.length ? track.steps : undefined}\n fixedDuration={!trackRef.stepKeys?.length && track.steps[0]?.isPhysics === true}\n baseAt={stat.at}\n delayMode\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n timelineDuration={meta.duration}\n selected={popover?.clip.key === trackKey}\n selectedStepKey={popover?.clip.key === trackKey ? popover.stepKey : undefined}\n onClick={openClipPopover}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n }\n }\n }\n\n return (\n <div className=\"dialkit-timeline-section\">\n <div className=\"dialkit-timeline-header\" data-open={open || undefined}>\n <div className=\"dialkit-timeline-identity\">\n <span className=\"dialkit-timeline-title\">{meta.name}</span>\n </div>\n {!open && (\n <TimelineOverview\n id={meta.id}\n duration={meta.duration}\n viewStart={safeViewStart}\n viewEnd={viewEnd}\n onNavigate={centerViewAt}\n />\n )}\n <div className=\"dialkit-timeline-actions\">\n <PlayPauseButton id={meta.id} />\n <ReplayButton onReplay={handleReplay} />\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add timeline version\"\n aria-label=\"Add timeline version\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {ICON_ADD_PRESET.map((d, i) => <path key={i} d={d} />)}\n </svg>\n </motion.button>\n <PresetManager\n panelId={meta.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n aria-label={copied ? 'Copied parameters' : 'Copy parameters'}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {copied ? (\n <motion.svg\n key=\"check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CHECK} />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n <button\n className=\"dialkit-timeline-chevron\"\n data-open={open}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n title={open ? 'Collapse timeline' : 'Expand timeline'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n </div>\n </div>\n\n {open && (\n <div\n className=\"dialkit-timeline-body\"\n onWheel={handleTimelineWheel}\n onPointerDown={handleTrackPointerDown}\n onPointerMove={handleTrackPointerMove}\n onPointerUp={finishTrackScrub}\n onPointerCancel={finishTrackScrub}\n onLostPointerCapture={finishTrackScrub}\n >\n <div className=\"dialkit-timeline-grid\">\n <div className=\"dialkit-timeline-row dialkit-timeline-ruler-row\">\n <div className=\"dialkit-timeline-label\" />\n <div\n ref={laneAreaRef}\n className=\"dialkit-timeline-ruler\"\n onPointerDown={handleRulerPointerDown}\n onPointerMove={handleRulerPointerMove}\n onPointerUp={handleRulerPointerUp}\n onPointerCancel={handleRulerPointerCancel}\n onLostPointerCapture={handleRulerPointerCancel}\n title=\"Drag to seek · Option-drag to zoom · Shift-drag to reset zoom\"\n >\n {fineTicks.map((t) => (\n <div key={`fine:${t}`} className=\"dialkit-timeline-tick dialkit-timeline-tick-fine\" style={{ left: (t - safeViewStart) * pxPerSecond }} />\n ))}\n {mediumTicks.map((t) => (\n <div key={`medium:${t}`} className=\"dialkit-timeline-tick dialkit-timeline-tick-medium\" style={{ left: (t - safeViewStart) * pxPerSecond }} />\n ))}\n {majorTicks.map((t) => (\n <div key={t} className=\"dialkit-timeline-tick\" style={{ left: (t - safeViewStart) * pxPerSecond }}>\n <span className=\"dialkit-timeline-tick-label\">{formatRulerSeconds(t, majorStep)}</span>\n </div>\n ))}\n </div>\n </div>\n {rows}\n\n {pxPerSecond > 0 && (\n <TimelinePlayheadFlag\n id={meta.id}\n duration={meta.duration}\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n viewEnd={viewEnd}\n laneWidth={laneWidth}\n rulerRef={laneAreaRef}\n onResetView={resetView}\n />\n )}\n </div>\n {zoom > 1 && (\n <div className=\"dialkit-timeline-scroll-row\">\n <div className=\"dialkit-timeline-label\" />\n <div\n ref={horizontalScrollRef}\n className=\"dialkit-timeline-horizontal-scroll\"\n onScroll={handleHorizontalScroll}\n aria-label=\"Timeline horizontal scroll\"\n >\n <div style={{ width: laneWidth * zoom }} />\n </div>\n </div>\n )}\n </div>\n )}\n\n {popover && (\n <ClipPopover\n panelId={meta.id}\n popover={popover}\n values={values}\n theme={theme}\n onClose={closePopover}\n />\n )}\n </div>\n );\n});\n\n// ── Clip popover ──\n\n// Popover anchored above a clip (or one leg of a sequence), reusing the\n// standard DialKit controls for the target's transition/from/to values.\n// Portaled to <body> because the dock's backdrop-filter creates a containing\n// block for fixed positioning.\nfunction ClipPopover({\n panelId,\n popover,\n values,\n theme,\n onClose,\n}: {\n panelId: string;\n popover: PopoverState;\n values: Record<string, DialValue>;\n theme: DialTheme;\n onClose: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [naturalHeight, setNaturalHeight] = useState(0);\n const [viewport, setViewport] = useState(() => ({\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n }));\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n const measure = () => setNaturalHeight(element.scrollHeight + 2);\n measure();\n const observer = new ResizeObserver(measure);\n const body = element.querySelector('.dialkit-timeline-popover-body');\n observer.observe(body ?? element);\n return () => observer.disconnect();\n }, [popover.clip.key, popover.stepKey]);\n\n useEffect(() => {\n const updateViewport = () => setViewport({\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n });\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n return () => {\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n };\n }, []);\n\n useEffect(() => {\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n if (ref.current?.contains(target)) return;\n // Let clip clicks handle their own toggle/switch\n if (target.closest?.('.dialkit-timeline-clip')) return;\n if (target.closest?.('.dialkit-timeline-label')) return;\n onClose();\n };\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [onClose]);\n\n const { clip, stepKey } = popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(panelId, `${clip.key}.${stepKey}`);\n // The first leg starts from the clip's `from` — show it where you edit\n // the leg, just above its targets.\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(panelId, `${clip.key}.from`);\n if (from) {\n const toIndex = controls.findIndex((control) => control.path === `${clip.key}.${stepKey}.to`);\n controls = toIndex >= 0\n ? [...controls.slice(0, toIndex), from, ...controls.slice(toIndex)]\n : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n if (controls.length === 0) return null;\n\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(panelId, `${targetPath}.duration`);\n const durationValue = durationMeta ? values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(panelId, durationMeta.path, next),\n min: Math.max(TIMELINE_MIN_CLIP_DURATION, durationMeta.min ?? 0),\n max: durationMeta.max,\n step: durationMeta.step,\n }\n : undefined;\n\n // The bar owns the durations, so show transitions as they actually run:\n // swap in the effective configs (durations injected from the clip/segment\n // lengths) for the visualization while edits still write through.\n const displayValues = timelinePopoverDisplayValues(values, clip.key, clip.stepKeys, stepKey);\n\n const viewportRight = viewport.offsetLeft + viewport.width;\n const viewportBottom = viewport.offsetTop + viewport.height;\n const popoverWidth = Math.min(POPOVER_WIDTH, Math.max(220, viewport.width - 24));\n const left = clamp(\n popover.anchor.left + popover.anchor.width / 2 - popoverWidth / 2,\n viewport.offsetLeft + 12,\n Math.max(viewport.offsetLeft + 12, viewportRight - popoverWidth - 12)\n );\n const spaceAbove = Math.max(0, popover.anchor.top - viewport.offsetTop - 22);\n const spaceBelow = Math.max(0, viewportBottom - popover.anchor.bottom - 22);\n const placeAbove = naturalHeight === 0\n ? spaceAbove >= spaceBelow\n : naturalHeight <= spaceAbove || (naturalHeight > spaceBelow && spaceAbove >= spaceBelow);\n const availableHeight = placeAbove ? spaceAbove : spaceBelow;\n const renderedHeight = Math.min(naturalHeight || availableHeight, availableHeight);\n const unclampedTop = placeAbove\n ? popover.anchor.top - 10 - renderedHeight\n : popover.anchor.bottom + 10;\n const top = clamp(\n unclampedTop,\n viewport.offsetTop + 12,\n Math.max(viewport.offsetTop + 12, viewportBottom - renderedHeight - 12)\n );\n\n return createPortal(\n <div className=\"dialkit-root\" data-theme={theme}>\n <div\n ref={ref}\n className=\"dialkit-timeline-popover\"\n data-placement={placeAbove ? 'above' : 'below'}\n style={{\n left,\n top,\n width: popoverWidth,\n maxHeight: availableHeight,\n visibility: naturalHeight > 0 ? 'visible' : 'hidden',\n }}\n role=\"dialog\"\n aria-label={`Edit ${title}`}\n >\n <div className=\"dialkit-timeline-popover-header\">\n <span className=\"dialkit-timeline-popover-title\">{title}</span>\n <button className=\"dialkit-timeline-popover-close\" onClick={onClose} title=\"Close editor\" aria-label=\"Close editor\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M6 6L18 18M18 6L6 18\" />\n </svg>\n </button>\n </div>\n <div className=\"dialkit-timeline-popover-body\">\n <ControlRenderer\n panelId={panelId}\n controls={controls}\n values={displayValues}\n transitionDuration={transitionDuration}\n />\n </div>\n </div>\n </div>,\n document.body\n );\n}\n\n// A clip-level popover hides its step folders (each leg has its own popover)\n// and its track folders (each track is its own row).\nfunction clipPopoverExclusions(clip: TimelineClipMeta): Set<string> {\n return new Set([\n ...(clip.stepKeys ?? []),\n ...(clip.tracks?.map((track) => track.prop) ?? []),\n ]);\n}\n\n// A target's non-timing properties. The timeline bars own clip and segment\n// timing, so their start and duration controls stay out of the popover.\nfunction getClipControls(\n panelId: string,\n controlPath: string,\n excludeChildren?: Set<string>\n): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, controlPath) : null;\n if (!folder?.children) return [];\n return folder.children\n .filter((control) => {\n const childKey = control.path.slice(controlPath.length + 1);\n if (childKey === 'at' || childKey === 'duration') return false;\n return !excludeChildren?.has(childKey);\n });\n}\n\nfunction getControlAt(panelId: string, path: string): ControlMeta | null {\n const panel = DialStore.getPanel(panelId);\n return panel ? findControl(panel.controls, path) : null;\n}\n\n// ── Clip bar ──\n\ntype DragState = {\n mode: 'move' | 'start' | 'end' | 'boundary';\n boundaryIndex?: number;\n pointerX: number;\n at: number;\n duration: number;\n stepDurations?: number[];\n clickEl: HTMLElement | null;\n moved: boolean;\n};\n\nfunction TimelineClip({\n timelineId,\n clip,\n at,\n duration,\n loop,\n steps,\n fixedDuration,\n composite = false,\n baseAt = 0,\n delayMode = false,\n pxPerSecond,\n viewStart,\n timelineDuration,\n selected,\n selectedStepKey,\n onClick,\n onDrag,\n}: {\n timelineId: string;\n clip: TimelineClipMeta;\n at: number;\n duration: number;\n loop: TimelineClipLoop;\n steps?: TimelineStepStatic[];\n fixedDuration: boolean;\n /** Read-only composite bar of a props clip — no handles, no editor. */\n composite?: boolean;\n /** Track rows: position = baseAt + delay; dragging edits the delay. */\n baseAt?: number;\n delayMode?: boolean;\n pxPerSecond: number;\n viewStart: number;\n timelineDuration: number;\n selected: boolean;\n selectedStepKey?: string;\n onClick: (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void;\n onDrag: () => void;\n}) {\n const dragRef = useRef<DragState | null>(null);\n const [dragging, setDragging] = useState(false);\n const isSteps = Boolean(steps?.length);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.shiftKey) return;\n e.stopPropagation();\n const target = e.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n const boundary = target.dataset?.boundary;\n if (boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(boundary);\n } else if (!fixedDuration) {\n const edge = target.dataset?.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n dragRef.current = {\n mode,\n boundaryIndex,\n pointerX: e.clientX,\n at,\n duration,\n stepDurations: steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]') ?? null,\n moved: false,\n };\n e.currentTarget.setPointerCapture(e.pointerId);\n },\n [at, duration, fixedDuration, steps]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag || pxPerSecond <= 0) return;\n\n const dx = e.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n setDragging(true);\n onDrag();\n }\n\n const dt = dx / pxPerSecond;\n if (drag.mode === 'boundary' && steps && drag.stepDurations) {\n // Trimming a leg ripples the later legs — the bar grows or shrinks.\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, d, j) => (j === index ? sum : sum + d), 0);\n DialStore.updateValue(\n timelineId,\n `${clip.key}.${steps[index].key ?? ''}.duration`,\n clampStepResize(drag.stepDurations[index] + dt, drag.at, others, timelineDuration)\n );\n } else if (drag.mode === 'move') {\n if (delayMode) {\n DialStore.updateValue(\n timelineId,\n `${clip.key}.delay`,\n clampTrackDelay(drag.at + dt - baseAt, baseAt, drag.duration, timelineDuration)\n );\n } else {\n DialStore.updateValue(timelineId, `${clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, timelineDuration));\n }\n } else if (drag.mode === 'end') {\n DialStore.updateValue(\n timelineId,\n `${clip.key}.duration`,\n clampClipResizeEnd(drag.duration + dt, drag.at, timelineDuration)\n );\n } else if (steps && drag.stepDurations) {\n // Start edge of a sequence: trade time between position and the\n // first leg.\n const limit = Math.max(baseAt, 0);\n const next = clampClipResizeStart(Math.max(drag.at + dt, limit), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(timelineId, {\n [delayMode ? `${clip.key}.delay` : `${clip.key}.at`]: delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${clip.key}.${steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const limit = Math.max(baseAt, 0);\n const next = clampClipResizeStart(Math.max(drag.at + dt, limit), drag.at, drag.duration);\n DialStore.updateValues(timelineId, {\n [delayMode ? `${clip.key}.delay` : `${clip.key}.at`]: delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${clip.key}.duration`]: next.duration,\n });\n }\n },\n [baseAt, clip.key, delayMode, onDrag, pxPerSecond, steps, timelineId, timelineDuration]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n dragRef.current = null;\n setDragging(false);\n if (drag && !drag.moved) {\n const stepKey = drag.clickEl?.dataset?.step;\n const anchorEl = drag.clickEl ?? e.currentTarget;\n onClick(clip, anchorEl.getBoundingClientRect(), stepKey);\n }\n },\n [clip, onClick]\n );\n\n const handlePointerCancel = useCallback(() => {\n dragRef.current = null;\n setDragging(false);\n }, []);\n\n const width = Math.max(duration * pxPerSecond, 14);\n const resizable = duration > 0 && !fixedDuration && !composite;\n const durationText = `${fixedDuration && !composite ? '~' : ''}${formatSeconds(duration)}`;\n const looping = loop === 'repeat' && duration > 0;\n const ghostCycles: Array<{ start: number; duration: number; index: number }> = [];\n if (looping) {\n const maxGhostCycles = 256;\n const firstGhostIndex = Math.max(1, Math.floor((viewStart - at) / duration));\n for (let offset = 0; offset < maxGhostCycles; offset++) {\n const index = firstGhostIndex + offset;\n const start = at + duration * index;\n if (start >= timelineDuration - 1e-6) break;\n ghostCycles.push({\n start,\n duration: Math.min(duration, timelineDuration - start),\n index,\n });\n }\n }\n // Boundary handles sit at each leg's right edge (the last one resizes the\n // final leg — the end of the bar).\n const boundaryOffsets: number[] = [];\n if (steps) {\n let cumulative = 0;\n for (const step of steps) {\n cumulative += step.duration;\n boundaryOffsets.push(cumulative);\n }\n }\n\n const barTitle = composite\n ? `${clip.label} — composite of its property tracks${looping ? ' · repeats through timeline' : ''} · click to expand`\n : `${clip.label} — ${formatSeconds(at)} for ${durationText}${fixedDuration ? ' (duration set by spring physics)' : ''}${looping ? ' · repeats through timeline' : ''}${delayMode ? ' · drag to phase-shift' : ''}`;\n\n return (\n <>\n {ghostCycles.map((cycle) => {\n const ghostWidth = Math.max(1, cycle.duration * pxPerSecond - 2);\n return (\n <div\n key={`ghost:${cycle.index}`}\n className=\"dialkit-timeline-clip-ghost\"\n data-steps={isSteps || undefined}\n aria-hidden=\"true\"\n style={{\n left: (cycle.start - viewStart) * pxPerSecond + 1,\n width: ghostWidth,\n background: clip.color,\n }}\n >\n {steps?.map((step, stepIndex) => (\n <span\n key={step.key ?? `step:${stepIndex}`}\n className=\"dialkit-timeline-clip-ghost-segment\"\n style={{ width: step.duration * pxPerSecond }}\n />\n ))}\n </div>\n );\n })}\n <div\n className=\"dialkit-timeline-clip\"\n data-steps={isSteps || undefined}\n data-composite={composite || undefined}\n data-selected={selected || undefined}\n data-dragging={dragging || undefined}\n style={{\n left: (at - viewStart) * pxPerSecond,\n width,\n background: composite ? `${clip.color}80` : clip.color,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handlePointerCancel}\n title={barTitle}\n >\n {composite ? (\n <>{width > 56 && <span className=\"dialkit-timeline-clip-duration\">{durationText}</span>}</>\n ) : isSteps ? (\n <>\n {steps!.map((step) => {\n const segmentWidth = step.duration * pxPerSecond;\n return (\n <div\n key={step.key ?? 'step'}\n className=\"dialkit-timeline-clip-segment\"\n data-step={step.key ?? undefined}\n data-selected={selectedStepKey === step.key || undefined}\n style={{ width: segmentWidth }}\n >\n {segmentWidth > 52 && (\n <span className=\"dialkit-timeline-clip-duration\">{formatSeconds(step.duration)}</span>\n )}\n </div>\n );\n })}\n {steps!.map((step, index) =>\n step.isPhysics ? null : (\n <div\n key={`boundary:${step.key}`}\n className=\"dialkit-timeline-clip-handle\"\n data-boundary={index}\n style={{ left: boundaryOffsets[index] * pxPerSecond - 4 }}\n />\n )\n )}\n {!steps![0].isPhysics && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"start\" />}\n </>\n ) : (\n <>\n {resizable && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"start\" />}\n {width > 56 && <span className=\"dialkit-timeline-clip-duration\">{durationText}</span>}\n {resizable && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"end\" />}\n </>\n )}\n </div>\n {looping && (\n <span className=\"dialkit-timeline-loop-infinity\" aria-hidden=\"true\" title=\"Repeats indefinitely\">\n ∞\n </span>\n )}\n </>\n );\n}\n","interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup({ buttons }: ButtonGroupProps) {\n return (\n <div className=\"dialkit-button-group\">\n {buttons.map((button, index) => (\n <button\n key={index}\n className=\"dialkit-button\"\n onClick={button.onClick}\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, ShortcutConfig } from '../store/DialStore';\n\ninterface ShortcutsMenuProps {\n panelId: string;\n}\n\nfunction formatShortcutKey(sc: ShortcutConfig): string {\n if (!sc.key) return '—';\n const mod = sc.modifier === 'alt' ? '⌥'\n : sc.modifier === 'shift' ? '⇧'\n : sc.modifier === 'meta' ? '⌘'\n : '';\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatInteraction(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n switch (interaction) {\n case 'scroll': return sc.key ? 'key+scroll' : 'scroll';\n case 'drag': return 'key+drag';\n case 'move': return 'key+move';\n case 'scroll-only': return 'scroll';\n }\n}\n\nexport function ShortcutsMenu({ panelId }: ShortcutsMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n\n const open = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, right: window.innerWidth - rect.right });\n }\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on mousedown outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const panel = DialStore.getPanel(panelId);\n if (!panel) return null;\n\n const shortcuts = Object.entries(panel.shortcuts);\n if (shortcuts.length === 0) return null;\n\n // Build shortcut rows with labels from controls\n const rows = shortcuts.map(([path, shortcut]) => {\n // Find control label\n const findLabel = (controls: typeof panel.controls): string => {\n for (const c of controls) {\n if (c.path === path) return c.label;\n if (c.type === 'folder' && c.children) {\n const found = findLabel(c.children);\n if (found) return found;\n }\n }\n return path;\n };\n return {\n path,\n shortcut,\n label: findLabel(panel.controls),\n };\n });\n\n return (\n <>\n <motion.button\n ref={triggerRef}\n className=\"dialkit-shortcuts-trigger\"\n onClick={toggle}\n title=\"Keyboard shortcuts\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" />\n <path d=\"M6 10H6.01\" />\n <path d=\"M10 10H10.01\" />\n <path d=\"M14 10H14.01\" />\n <path d=\"M18 10H18.01\" />\n <path d=\"M8 14H16\" />\n </svg>\n </motion.button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-shortcuts-dropdown\"\n style={{ position: 'fixed', top: pos.top, right: pos.right }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div className=\"dialkit-shortcuts-title\">Keyboard Shortcuts</div>\n <div className=\"dialkit-shortcuts-list\">\n {rows.map((row) => (\n <div key={row.path} className=\"dialkit-shortcuts-row\">\n <span className=\"dialkit-shortcuts-row-key\">\n {formatShortcutKey(row.shortcut)}\n </span>\n <span className=\"dialkit-shortcuts-row-label\">{row.label}</span>\n <span className=\"dialkit-shortcuts-row-mode\">{formatInteraction(row.shortcut)}</span>\n </div>\n ))}\n </div>\n <div className=\"dialkit-shortcuts-hint\">See pill badges on controls for keys</div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_react_dom","import_react","import_react","import_react","import_react","import_jsx_runtime","target","import_react","import_jsx_runtime","discreteSteps","import_react","import_jsx_runtime","import_jsx_runtime","wd","t","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_dom","import_jsx_runtime","DialTimeline","TimelineSection","resetView","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useDialKit.ts","../src/store/DialStore.ts","../src/hooks/useDialStorePanel.ts","../src/components/DialRoot.tsx","../src/store/TimelineStore.ts","../src/env.ts","../src/components/Folder.tsx","../src/icons.ts","../src/components/Panel.tsx","../src/copy-instruction.ts","../src/components/ControlRenderer.tsx","../src/components/ShortcutListener.tsx","../src/shortcut-utils.ts","../src/components/Slider.tsx","../src/components/SegmentedControl.tsx","../src/components/Toggle.tsx","../src/transition-math.ts","../src/components/SpringVisualization.tsx","../src/components/SpringControl.tsx","../src/components/EasingVisualization.tsx","../src/components/TransitionControl.tsx","../src/components/TextControl.tsx","../src/components/SelectControl.tsx","../src/dropdown-position.ts","../src/components/ColorControl.tsx","../src/components/PresetManager.tsx","../src/components/Timeline/TimelineToggleButton.tsx","../src/store/TimelineUiStore.ts","../src/panel-drag.ts","../src/hooks/useDialTimeline.ts","../src/timeline-core.ts","../src/timeline/adapter.ts","../src/components/Timeline/DialTimeline.tsx","../src/components/ButtonGroup.tsx","../src/components/ShortcutsMenu.tsx"],"sourcesContent":["// Main hook\nexport { useDialKit, useDialKitController } from './hooks/useDialKit';\nexport type { DialKitController, UseDialOptions } from './hooks/useDialKit';\n\n// Root component (user mounts once)\nexport { DialRoot } from './components/DialRoot';\nexport type { DialPosition, DialMode, DialTheme } from './components/DialRoot';\n\n// Timeline (prototype)\nexport { useDialTimeline } from './hooks/useDialTimeline';\nexport type {\n TimelineClipConfig,\n TimelineClipCss,\n TimelineClipLoop,\n TimelineConfig,\n TimelineClipValues,\n TimelineGroupConfig,\n TimelineGroupValues,\n TimelinePropConfig,\n TimelinePropStepConfig,\n TimelineStepConfig,\n TimelineStepValues,\n DialTimelineValues,\n UseDialTimelineOptions,\n} from './hooks/useDialTimeline';\nexport { DialTimeline } from './components/Timeline/DialTimeline';\nexport type { DialTimelineProps } from './components/Timeline/DialTimeline';\nexport { formatClock } from './timeline-core';\nexport { TimelineStore } from './store/TimelineStore';\nexport type {\n TimelineMeta,\n TimelineClipMeta,\n TimelineClipTrackMeta,\n TimelineTransport,\n} from './store/TimelineStore';\n\n// Individual components (for advanced usage)\nexport { ControlRenderer } from './components/ControlRenderer';\nexport { Slider } from './components/Slider';\nexport { Toggle } from './components/Toggle';\nexport { Folder } from './components/Folder';\nexport { ButtonGroup } from './components/ButtonGroup';\nexport { SpringControl } from './components/SpringControl';\nexport { SpringVisualization } from './components/SpringVisualization';\nexport { TransitionControl } from './components/TransitionControl';\nexport { EasingVisualization } from './components/EasingVisualization';\nexport { TextControl } from './components/TextControl';\nexport { SelectControl } from './components/SelectControl';\nexport { ColorControl } from './components/ColorControl';\nexport { PresetManager } from './components/PresetManager';\nexport { ShortcutsMenu } from './components/ShortcutsMenu';\n\n// Store (for advanced usage)\nexport { DialStore } from './store/DialStore';\nexport type {\n SpringConfig,\n EasingConfig,\n TransitionConfig,\n ActionConfig,\n SelectConfig,\n ColorConfig,\n TextConfig,\n DialKitPersistOptions,\n ShortcutConfig,\n ShortcutMode,\n ShortcutInteraction,\n Preset,\n DialValue,\n DialConfig,\n DialKitValueUpdates,\n ResolvedValues,\n ControlMeta,\n PanelConfig,\n} from './store/DialStore';\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { DialStore, flattenDialValueUpdates, resolveDialValues } from '../store/DialStore';\nimport type {\n DialConfig,\n DialKitPersistOptions,\n DialKitValueUpdates,\n DialValue,\n ResolvedValues,\n ShortcutConfig,\n} from '../store/DialStore';\nimport { useDialStorePanel } from './useDialStorePanel';\n\nexport interface UseDialOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n onAction?: (action: string) => void;\n shortcuts?: Record<string, ShortcutConfig>;\n}\n\nexport interface DialKitController<T extends DialConfig> {\n values: ResolvedValues<T>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ResolvedValues<T> {\n return useDialKitController(name, config, options).values;\n}\n\nexport function useDialKitController<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): DialKitController<T> {\n const { panelId, flatValues, serializedConfig } = useDialStorePanel(name, config, {\n id: options?.id,\n persist: options?.persist,\n shortcuts: options?.shortcuts,\n });\n\n const configRef = useRef(config);\n configRef.current = config;\n const onActionRef = useRef(options?.onAction);\n onActionRef.current = options?.onAction;\n\n // Subscribe to action events\n useEffect(() => {\n return DialStore.subscribeActions(panelId, (action) => {\n onActionRef.current?.(action);\n });\n }, [panelId]);\n\n const values = useMemo(\n () => resolveDialValues(configRef.current, flatValues),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [flatValues, serializedConfig]\n );\n\n const setValue = useCallback(\n (path: string, value: DialValue) => {\n DialStore.updateValue(panelId, path, value);\n },\n [panelId]\n );\n\n const setValues = useCallback(\n (nextValues: DialKitValueUpdates<T>) => {\n DialStore.updateValues(panelId, flattenDialValueUpdates(configRef.current, nextValues));\n },\n [panelId]\n );\n\n const resetValues = useCallback(() => {\n DialStore.resetValues(panelId);\n }, [panelId]);\n\n const getValues = useCallback(\n () => resolveDialValues(configRef.current, DialStore.getValues(panelId)),\n [panelId]\n );\n\n return useMemo(\n () => ({\n values,\n setValue,\n setValues,\n resetValues,\n getValues,\n }),\n [getValues, resetValues, setValue, setValues, values]\n );\n}\n","// Lightweight state store with subscriptions for dialkit\n\nexport type SpringConfig = {\n type: 'spring';\n stiffness?: number;\n damping?: number;\n mass?: number;\n visualDuration?: number;\n bounce?: number;\n};\n\nexport type EasingConfig = {\n type: 'easing';\n duration: number;\n ease: [number, number, number, number];\n};\n\nexport type TransitionConfig = SpringConfig | EasingConfig;\n\nexport type ActionConfig = {\n type: 'action';\n label?: string;\n};\n\nexport type SelectConfig = {\n type: 'select';\n options: (string | { value: string; label: string })[];\n default?: string;\n};\n\nexport type ColorConfig = {\n type: 'color';\n default?: string;\n};\n\nexport type TextConfig = {\n type: 'text';\n default?: string;\n placeholder?: string;\n};\n\nexport type DialValue = number | boolean | string | SpringConfig | EasingConfig | ActionConfig | SelectConfig | ColorConfig | TextConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number, number?] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig\n ? TransitionConfig\n : T[K] extends EasingConfig\n ? TransitionConfig\n : T[K] extends SelectConfig\n ? string\n : T[K] extends ColorConfig\n ? string\n : T[K] extends TextConfig\n ? string\n : T[K] extends DialConfig\n ? ResolvedValues<T[K]>\n : T[K];\n};\n\nexport type DialKitValueUpdates<T extends DialConfig> = {\n [K in keyof T as K extends '_collapsed' ? never : K]?: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig | EasingConfig\n ? TransitionConfig\n : T[K] extends ActionConfig\n ? never\n : T[K] extends SelectConfig | ColorConfig | TextConfig\n ? string\n : T[K] extends DialConfig\n ? DialKitValueUpdates<T[K]>\n : T[K];\n};\n\nexport type ShortcutMode = 'fine' | 'normal' | 'coarse';\nexport type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';\n\nexport type ShortcutConfig = {\n key?: string;\n modifier?: 'alt' | 'shift' | 'meta';\n mode?: ShortcutMode;\n interaction?: ShortcutInteraction;\n};\n\nexport type ControlMeta = {\n type: 'slider' | 'toggle' | 'spring' | 'transition' | 'folder' | 'action' | 'select' | 'color' | 'text';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\n defaultOpen?: boolean;\n options?: (string | { value: string; label: string })[];\n placeholder?: string;\n shortcut?: ShortcutConfig;\n};\n\nexport type PanelConfig = {\n id: string;\n name: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n shortcuts: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n};\n\ntype Listener = () => void;\ntype ActionListener = (action: string) => void;\n\nexport type Preset = {\n id: string;\n name: string;\n values: Record<string, DialValue>;\n};\n\nexport type DialKitPersistOptions = boolean | {\n key?: string;\n storage?: 'localStorage' | 'sessionStorage';\n presets?: boolean;\n};\n\nexport type DialStorePanelOptions = {\n retainOnUnmount?: boolean;\n persist?: DialKitPersistOptions;\n kind?: 'timeline';\n};\n\ntype PersistConfig = {\n key: string;\n storage: 'localStorage' | 'sessionStorage';\n presets: boolean;\n};\n\ntype PersistedPanelState = {\n version: 1;\n values?: Record<string, DialValue>;\n baseValues?: Record<string, DialValue>;\n presets?: Preset[];\n activePresetId?: string | null;\n};\n\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nexport function resolveDialValues<T extends DialConfig>(\n config: T,\n flatValues: Record<string, DialValue>\n): ResolvedValues<T> {\n return resolveConfigValues(config, flatValues, '') as ResolvedValues<T>;\n}\n\nexport function flattenDialValueUpdates<T extends DialConfig>(\n config: T,\n updates: DialKitValueUpdates<T>\n): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n if (typeof updates === 'object' && updates !== null) {\n flattenConfigUpdates(config, updates as Record<string, unknown>, '', values);\n }\n return values;\n}\n\nfunction resolveConfigValues(\n config: DialConfig,\n flatValues: Record<string, DialValue>,\n prefix: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length <= 4 && typeof configValue[0] === 'number') {\n result[key] = flatValues[path] ?? configValue[0];\n } else if (typeof configValue === 'number' || typeof configValue === 'boolean' || typeof configValue === 'string') {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSpringConfigValue(configValue) || isEasingConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfigValue(configValue)) {\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n result[key] = resolveConfigValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\n}\n\nfunction flattenConfigUpdates(\n config: DialConfig,\n updates: Record<string, unknown>,\n prefix: string,\n values: Record<string, DialValue>\n): void {\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed' || !(key in updates)) continue;\n\n const nextValue = updates[key];\n if (nextValue === undefined) continue;\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (isActionConfigValue(configValue)) {\n continue;\n }\n\n if (isLeafConfigValue(configValue)) {\n values[path] = nextValue as DialValue;\n continue;\n }\n\n if (\n typeof configValue === 'object' &&\n configValue !== null &&\n typeof nextValue === 'object' &&\n nextValue !== null &&\n !Array.isArray(nextValue)\n ) {\n flattenConfigUpdates(configValue as DialConfig, nextValue as Record<string, unknown>, path, values);\n }\n }\n}\n\nfunction isLeafConfigValue(value: unknown): boolean {\n return (\n (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isSpringConfigValue(value) ||\n isEasingConfigValue(value) ||\n isActionConfigValue(value) ||\n isSelectConfigValue(value) ||\n isColorConfigValue(value) ||\n isTextConfigValue(value)\n );\n}\n\nfunction hasType(value: unknown, type: string): boolean {\n return typeof value === 'object' && value !== null && 'type' in value && (value as { type: string }).type === type;\n}\n\nexport function isSpringConfigValue(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nexport function isEasingConfigValue(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nexport function isHexColor(value: string): boolean {\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n}\n\n/** camelCase → Title Case, the label rule used everywhere a key becomes UI text. */\nexport function formatLabel(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n}\n\n/** Default slider step for a numeric range. */\nexport function inferStep(min: number, max: number): number {\n const range = max - min;\n if (range <= 1) return 0.01;\n if (range <= 10) return 0.1;\n if (range <= 100) return 1;\n return 10;\n}\n\nfunction isActionConfigValue(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfigValue(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfigValue(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfigValue(value: unknown): value is TextConfig {\n return hasType(value, 'text');\n}\n\nfunction getFirstOptionValue(options: (string | { value: string; label: string })[]): string {\n const first = options[0];\n if (first === undefined) return '';\n return typeof first === 'string' ? first : first.value;\n}\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\n private panelsSnapshot: PanelConfig[] = [];\n private standardPanelsSnapshot: PanelConfig[] = [];\n private timelinePanelsSnapshot: PanelConfig[] = [];\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private snapshots: Map<string, Record<string, DialValue>> = new Map();\n private actionListeners: Map<string, Set<ActionListener>> = new Map();\n private presets: Map<string, Preset[]> = new Map();\n private activePreset: Map<string, string | null> = new Map();\n private baseValues: Map<string, Record<string, DialValue>> = new Map();\n private defaultValues: Map<string, Record<string, DialValue>> = new Map();\n private registrationCounts: Map<string, number> = new Map();\n private retainedPanels: Set<string> = new Set();\n private persistConfigs: Map<string, PersistConfig> = new Map();\n\n registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n const existingPanel = this.panels.get(id);\n if (existingPanel && existingPanel.kind !== options.kind) {\n console.warn(\n `[dialkit] Panel id \"${id}\" cannot be shared by a timeline and a standard panel; ` +\n `the most recent registration controls where it renders.`\n );\n }\n this.configurePanelRetention(id, options);\n this.registrationCounts.set(id, (this.registrationCounts.get(id) ?? 0) + 1);\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', defaultValues);\n\n const persisted = this.loadPersistedPanel(id);\n const previousValues = this.panels.get(id)?.values ?? this.snapshots.get(id) ?? persisted?.values ?? {};\n const values = this.reconcileValues(defaultValues, previousValues, controlsByPath);\n\n const previousBaseValues = this.baseValues.get(id) ?? persisted?.baseValues ?? persisted?.values ?? {};\n const baseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n this.panels.set(id, { id, name, controls, values, shortcuts: shortcuts ?? {}, kind: options.kind });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, baseValues);\n this.defaultValues.set(id, { ...defaultValues });\n\n const existingPresets = this.presets.get(id) ?? persisted?.presets;\n if (existingPresets) {\n this.presets.set(id, this.reconcilePresets(existingPresets, defaultValues, controlsByPath));\n }\n if (!this.activePreset.has(id) && persisted?.activePresetId !== undefined) {\n this.activePreset.set(id, persisted.activePresetId);\n }\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n this.configurePanelRetention(id, options);\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config, shortcuts, options);\n return;\n }\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n this.initTransitionModes(config, '', defaultValues);\n const nextValues = this.reconcileValues(defaultValues, existing.values, controlsByPath);\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues, shortcuts: shortcuts ?? existing.shortcuts, kind: options.kind ?? existing.kind };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n for (const [path, value] of Object.entries(nextValues)) {\n if (path.endsWith('.__mode')) {\n nextBaseValues[path] = value;\n }\n }\n\n this.baseValues.set(id, nextBaseValues);\n this.defaultValues.set(id, { ...defaultValues });\n this.presets.set(id, this.reconcilePresets(this.presets.get(id) ?? [], defaultValues, controlsByPath));\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.panels.delete(id);\n // Keep listener sets: subscribed components can outlive the registration\n // (HMR unregister/re-register of the same id) and must keep receiving\n // notifications. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n if (this.actionListeners.get(id)?.size === 0) this.actionListeners.delete(id);\n\n if (!this.retainedPanels.has(id)) {\n this.snapshots.delete(id);\n this.baseValues.delete(id);\n this.defaultValues.delete(id);\n this.presets.delete(id);\n this.activePreset.delete(id);\n this.persistConfigs.delete(id);\n }\n\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n this.updateValues(panelId, { [path]: value });\n }\n\n updateValues(panelId: string, updates: Record<string, DialValue>): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const validUpdates: Record<string, DialValue> = {};\n\n for (const [path, value] of Object.entries(updates)) {\n if (!Object.prototype.hasOwnProperty.call(panel.values, path)) {\n continue;\n }\n\n const control = this.findControlByPath(panel.controls, path);\n if (control?.type === 'action') {\n continue;\n }\n\n panel.values[path] = value;\n validUpdates[path] = value;\n }\n\n if (Object.keys(validUpdates).length === 0) {\n return;\n }\n\n // Auto-save to active preset or base values\n const activeId = this.activePreset.get(panelId);\n if (activeId) {\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === activeId);\n if (preset) {\n for (const [path, value] of Object.entries(validUpdates)) {\n preset.values[path] = value;\n }\n }\n } else {\n const base = this.baseValues.get(panelId);\n if (base) {\n for (const [path, value] of Object.entries(validUpdates)) {\n base[path] = value;\n }\n }\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resetValues(panelId: string): void {\n const panel = this.panels.get(panelId);\n const defaults = this.defaultValues.get(panelId);\n if (!panel || !defaults) return;\n\n panel.values = { ...defaults };\n this.snapshots.set(panelId, { ...panel.values });\n this.baseValues.set(panelId, { ...defaults });\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n updateSpringMode(panelId: string, path: string, mode: 'simple' | 'advanced'): void {\n this.updateTransitionMode(panelId, path, mode);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const mode = this.getTransitionMode(panelId, path);\n if (mode === 'easing') return 'simple';\n return mode;\n }\n\n updateTransitionMode(panelId: string, path: string, mode: 'easing' | 'simple' | 'advanced'): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[`${path}.__mode`] = mode;\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getTransitionMode(panelId: string, path: string): 'easing' | 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as 'easing' | 'simple' | 'advanced') || 'simple';\n }\n\n getValue(panelId: string, path: string): DialValue | undefined {\n const panel = this.panels.get(panelId);\n return panel?.values[path];\n }\n\n getValues(panelId: string): Record<string, DialValue> {\n // Return the snapshot for useSyncExternalStore compatibility\n // Use stable EMPTY_VALUES to avoid infinite loop in React 19\n return this.snapshots.get(panelId) ?? EMPTY_VALUES;\n }\n\n getPanels(kind?: 'panel' | 'timeline'): PanelConfig[] {\n // Stable reference between global notifications: getSnapshot-style\n // consumers (React useSyncExternalStore, Solid `from`) compare by\n // identity, and a fresh array on every call makes them loop or re-render.\n if (kind === 'panel') return this.standardPanelsSnapshot;\n if (kind === 'timeline') return this.timelinePanelsSnapshot;\n return this.panelsSnapshot;\n }\n\n getPanel(id: string): PanelConfig | undefined {\n return this.panels.get(id);\n }\n\n subscribe(panelId: string, listener: Listener): () => void {\n if (!this.listeners.has(panelId)) {\n this.listeners.set(panelId, new Set());\n }\n this.listeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.listeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.listeners.delete(panelId);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => this.globalListeners.delete(listener);\n }\n\n subscribeActions(panelId: string, listener: ActionListener): () => void {\n if (!this.actionListeners.has(panelId)) {\n this.actionListeners.set(panelId, new Set());\n }\n this.actionListeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.actionListeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.actionListeners.delete(panelId);\n }\n };\n }\n\n triggerAction(panelId: string, path: string): void {\n this.actionListeners.get(panelId)?.forEach(fn => fn(path));\n }\n\n savePreset(panelId: string, name: string): string {\n const panel = this.panels.get(panelId);\n if (!panel) throw new Error(`Panel ${panelId} not found`);\n\n const id = `preset-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const preset: Preset = {\n id,\n name,\n values: { ...panel.values },\n };\n\n const existing = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, [...existing, preset]);\n this.activePreset.set(panelId, id);\n\n // Force re-render by creating new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n\n return id;\n }\n\n loadPreset(panelId: string, presetId: string): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === presetId);\n if (!preset) return;\n\n // Apply preset values\n panel.values = { ...preset.values };\n this.snapshots.set(panelId, { ...panel.values });\n this.activePreset.set(panelId, presetId);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n deletePreset(panelId: string, presetId: string): void {\n const presets = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, presets.filter(p => p.id !== presetId));\n\n // Clear active if deleted\n if (this.activePreset.get(panelId) === presetId) {\n this.activePreset.set(panelId, null);\n }\n\n // Force re-render by creating new snapshot reference\n const panel = this.panels.get(panelId);\n if (panel) {\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getPresets(panelId: string): Preset[] {\n return this.presets.get(panelId) ?? [];\n }\n\n getActivePresetId(panelId: string): string | null {\n return this.activePreset.get(panelId) ?? null;\n }\n\n clearActivePreset(panelId: string): void {\n const panel = this.panels.get(panelId);\n const base = this.baseValues.get(panelId);\n if (panel && base) {\n panel.values = { ...base };\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resolveShortcutTarget(key: string, modifier?: 'alt' | 'shift' | 'meta'): {\n panelId: string;\n path: string;\n control: ControlMeta;\n } | null {\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue; // skip keyless shortcuts\n if (shortcut.key.toLowerCase() !== key.toLowerCase()) continue;\n const scMod = shortcut.modifier ?? undefined;\n if (scMod !== modifier) continue;\n\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n return { panelId: panel.id, path, control };\n }\n }\n }\n return null;\n }\n\n resolveScrollOnlyTargets(): Array<{\n panelId: string;\n path: string;\n control: ControlMeta;\n shortcut: ShortcutConfig;\n }> {\n const results: Array<{ panelId: string; path: string; control: ControlMeta; shortcut: ShortcutConfig }> = [];\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if ((shortcut.interaction ?? 'scroll') !== 'scroll-only') continue;\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n results.push({ panelId: panel.id, path, control, shortcut });\n }\n }\n }\n return results;\n }\n\n private configurePanelRetention(id: string, options: DialStorePanelOptions): void {\n if (options.retainOnUnmount) {\n this.retainedPanels.add(id);\n }\n\n const persistConfig = this.normalizePersistConfig(id, options.persist);\n if (persistConfig) {\n this.persistConfigs.set(id, persistConfig);\n this.retainedPanels.add(id);\n }\n }\n\n private reconcileValues(\n defaultValues: Record<string, DialValue>,\n previousValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Record<string, DialValue> {\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n if (path.endsWith('.__mode')) {\n const transitionPath = path.slice(0, -'.__mode'.length);\n const transitionControl = controlsByPath.get(transitionPath);\n nextValues[path] = transitionControl?.type === 'transition' && previousValues[path] !== undefined\n ? previousValues[path]\n : defaultValue;\n continue;\n }\n\n nextValues[path] = this.normalizePreservedValue(\n previousValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n return nextValues;\n }\n\n private reconcilePresets(\n presets: Preset[],\n defaultValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Preset[] {\n return presets.map((preset) => ({\n ...preset,\n values: this.reconcileValues(defaultValues, preset.values, controlsByPath),\n }));\n }\n\n private normalizePersistConfig(id: string, persist: DialKitPersistOptions | undefined): PersistConfig | null {\n if (!persist) return null;\n const options = typeof persist === 'object' ? persist : {};\n return {\n key: options.key ?? `dialkit:${id}`,\n storage: options.storage ?? 'localStorage',\n presets: options.presets ?? true,\n };\n }\n\n private loadPersistedPanel(id: string): PersistedPanelState | null {\n const config = this.persistConfigs.get(id);\n if (!config) return null;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(config.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as PersistedPanelState;\n if (parsed?.version !== 1 || typeof parsed !== 'object') return null;\n return parsed;\n } catch {\n return null;\n }\n }\n\n private persistPanel(id: string): void {\n const config = this.persistConfigs.get(id);\n if (!config) return;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return;\n\n const values = this.snapshots.get(id) ?? this.panels.get(id)?.values;\n if (!values) return;\n\n const state: PersistedPanelState = {\n version: 1,\n values,\n baseValues: this.baseValues.get(id) ?? values,\n activePresetId: this.activePreset.get(id) ?? null,\n };\n\n if (config.presets) {\n state.presets = this.presets.get(id) ?? [];\n }\n\n try {\n storage.setItem(config.key, JSON.stringify(state));\n } catch {\n // Ignore storage quota/security errors; DialKit should still work in-memory.\n }\n }\n\n private getStorage(kind: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof globalThis === 'undefined' || !('window' in globalThis)) {\n return null;\n }\n\n try {\n return kind === 'sessionStorage'\n ? globalThis.window?.sessionStorage ?? null\n : globalThis.window?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private findControlByPath(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = this.findControlByPath(control.children, path);\n if (found) return found;\n }\n }\n return null;\n }\n\n private notify(panelId: string): void {\n this.listeners.get(panelId)?.forEach(fn => fn());\n }\n\n private notifyGlobal(): void {\n this.panelsSnapshot = Array.from(this.panels.values());\n this.standardPanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind !== 'timeline');\n this.timelinePanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind === 'timeline');\n this.globalListeners.forEach(fn => fn());\n }\n\n private initTransitionModes(config: DialConfig, prefix: string, values: Record<string, DialValue>): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (this.isEasingConfig(value)) {\n values[`${path}.__mode`] = 'easing';\n } else if (this.isSpringConfig(value)) {\n // Detect physics mode from config\n const hasPhysics = value.stiffness !== undefined || value.damping !== undefined || value.mass !== undefined;\n const hasTime = value.visualDuration !== undefined || value.bounce !== undefined;\n values[`${path}.__mode`] = hasPhysics && !hasTime ? 'advanced' : 'simple';\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value) && !this.isActionConfig(value) && !this.isSelectConfig(value) && !this.isColorConfig(value) && !this.isTextConfig(value)) {\n this.initTransitionModes(value as DialConfig, path, values);\n }\n }\n }\n\n private parseConfig(config: DialConfig, prefix: string, shortcuts?: Record<string, ShortcutConfig>): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n const shortcut = shortcuts?.[path];\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n // Range tuple: [default, min, max]\n controls.push({\n type: 'slider',\n path,\n label,\n min: value[1],\n max: value[2],\n step: value[3] ?? this.inferStep(value[1], value[2]),\n shortcut,\n });\n } else if (typeof value === 'number') {\n // Single number - auto-infer range\n const { min, max, step } = this.inferRange(value);\n controls.push({ type: 'slider', path, label, min, max, step, shortcut });\n } else if (typeof value === 'boolean') {\n controls.push({ type: 'toggle', path, label, shortcut });\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n controls.push({ type: 'transition', path, label });\n } else if (this.isActionConfig(value)) {\n controls.push({ type: 'action', path, label: (value as ActionConfig).label || label });\n } else if (this.isSelectConfig(value)) {\n controls.push({ type: 'select', path, label, options: value.options });\n } else if (this.isColorConfig(value)) {\n controls.push({ type: 'color', path, label });\n } else if (this.isTextConfig(value)) {\n controls.push({ type: 'text', path, label, placeholder: value.placeholder });\n } else if (typeof value === 'string') {\n // Auto-detect: hex color vs text\n if (this.isHexColor(value)) {\n controls.push({ type: 'color', path, label });\n } else {\n controls.push({ type: 'text', path, label });\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object becomes a folder\n const folderConfig = value as DialConfig;\n const defaultOpen = '_collapsed' in folderConfig ? !(folderConfig._collapsed as boolean) : true;\n controls.push({\n type: 'folder',\n path,\n label,\n defaultOpen,\n children: this.parseConfig(folderConfig, path, shortcuts),\n });\n }\n }\n\n return controls;\n }\n\n private flattenValues(config: DialConfig, prefix: string): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n values[path] = value[0]; // Default value\n } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n values[path] = value;\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n values[path] = value;\n } else if (this.isActionConfig(value)) {\n // Actions don't need stored values - they're just triggers\n values[path] = value;\n } else if (this.isSelectConfig(value)) {\n // Use default or first option's value\n const firstOption = value.options[0];\n const firstValue = typeof firstOption === 'string' ? firstOption : firstOption.value;\n values[path] = value.default ?? firstValue;\n } else if (this.isColorConfig(value)) {\n values[path] = value.default ?? '#000000';\n } else if (this.isTextConfig(value)) {\n values[path] = value.default ?? '';\n } else if (typeof value === 'object' && value !== null) {\n Object.assign(values, this.flattenValues(value as DialConfig, path));\n }\n }\n\n return values;\n }\n\n private isSpringConfig(value: unknown): value is SpringConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SpringConfig).type === 'spring'\n );\n }\n\n private isEasingConfig(value: unknown): value is EasingConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as EasingConfig).type === 'easing'\n );\n }\n\n private isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ActionConfig).type === 'action'\n );\n }\n\n private isSelectConfig(value: unknown): value is SelectConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SelectConfig).type === 'select' &&\n 'options' in value &&\n Array.isArray((value as SelectConfig).options)\n );\n }\n\n private isColorConfig(value: unknown): value is ColorConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ColorConfig).type === 'color'\n );\n }\n\n private isTextConfig(value: unknown): value is TextConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as TextConfig).type === 'text'\n );\n }\n\n private isHexColor(value: string): boolean {\n return isHexColor(value);\n }\n\n private formatLabel(key: string): string {\n return formatLabel(key);\n }\n\n private inferRange(value: number): { min: number; max: number; step: number } {\n // Infer reasonable range based on value\n if (value >= 0 && value <= 1) {\n return { min: 0, max: 1, step: 0.01 };\n } else if (value >= 0 && value <= 10) {\n return { min: 0, max: value * 3 || 10, step: 0.1 };\n } else if (value >= 0 && value <= 100) {\n return { min: 0, max: value * 3 || 100, step: 1 };\n } else if (value >= 0) {\n return { min: 0, max: value * 3 || 1000, step: 10 };\n } else {\n return { min: value * 3, max: -value * 3, step: 1 };\n }\n }\n\n private inferStep(min: number, max: number): number {\n return inferStep(min, max);\n }\n\n private normalizePreservedValue(\n existingValue: DialValue | undefined,\n defaultValue: DialValue,\n control: ControlMeta | undefined\n ): DialValue {\n if (existingValue === undefined || !control) {\n return defaultValue;\n }\n\n switch (control.type) {\n case 'slider': {\n if (typeof existingValue !== 'number' || typeof defaultValue !== 'number') {\n return defaultValue;\n }\n\n const min = control.min ?? Number.NEGATIVE_INFINITY;\n const max = control.max ?? Number.POSITIVE_INFINITY;\n const clamped = Math.min(max, Math.max(min, existingValue));\n\n if (typeof control.step !== 'number' || control.step <= 0) {\n return clamped;\n }\n\n return this.roundToStep(clamped, min, max, control.step);\n }\n case 'toggle':\n return typeof existingValue === 'boolean' ? existingValue : defaultValue;\n case 'select': {\n if (typeof existingValue !== 'string') {\n return defaultValue;\n }\n\n const options = control.options ?? [];\n const validValues = new Set(options.map((option) => (typeof option === 'string' ? option : option.value)));\n return validValues.has(existingValue) ? existingValue : defaultValue;\n }\n case 'color':\n case 'text':\n return typeof existingValue === 'string' ? existingValue : defaultValue;\n case 'transition':\n if (this.isSpringConfig(defaultValue)) {\n return this.isSpringConfig(existingValue) ? existingValue : defaultValue;\n }\n if (this.isEasingConfig(defaultValue)) {\n return this.isEasingConfig(existingValue) ? existingValue : defaultValue;\n }\n return defaultValue;\n case 'action':\n return defaultValue;\n default:\n return defaultValue;\n }\n }\n\n private roundToStep(value: number, min: number, max: number, step: number): number {\n const snapped = min + Math.round((value - min) / step) * step;\n const clamped = Math.min(max, Math.max(min, snapped));\n const precision = this.stepPrecision(step);\n return Number(clamped.toFixed(precision));\n }\n\n private stepPrecision(step: number): number {\n const text = String(step);\n const decimalIndex = text.indexOf('.');\n return decimalIndex === -1 ? 0 : text.length - decimalIndex - 1;\n }\n\n private mapControlsByPath(controls: ControlMeta[]): Map<string, ControlMeta> {\n const map = new Map<string, ControlMeta>();\n\n const visit = (nodes: ControlMeta[]) => {\n for (const node of nodes) {\n if (node.type === 'folder' && node.children) {\n visit(node.children);\n continue;\n }\n\n map.set(node.path, node);\n }\n };\n\n visit(controls);\n return map;\n }\n\n}\n\n// Singleton instance\nexport const DialStore = /* @__PURE__ */ new DialStoreClass();\n","import { useCallback, useEffect, useId, useRef, useSyncExternalStore } from 'react';\nimport { DialStore } from '../store/DialStore';\nimport type { DialConfig, DialKitPersistOptions, DialValue, ShortcutConfig } from '../store/DialStore';\n\nexport interface UseDialStorePanelOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n shortcuts?: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n}\n\n// Serialize with a referential short-circuit: consumers can re-render at 60Hz\n// during timeline playback, and re-stringifying an unchanged config every\n// frame is wasted work whenever the object is memoized or module-stable.\nexport function useSerialized(value: unknown): string {\n const ref = useRef<{ value: unknown; text: string }>();\n if (!ref.current || !Object.is(ref.current.value, value)) {\n ref.current = { value, text: JSON.stringify(value) };\n }\n return ref.current.text;\n}\n\n// The DialStore panel lifecycle shared by useDialKit and useDialTimeline:\n// stable panel id, register on mount / unregister on unmount, push structure\n// changes on config edits, and subscribe to the flat value snapshot.\n// Fixes to StrictMode/HMR behavior belong here so every panel-backed hook\n// gets them.\nexport function useDialStorePanel(\n name: string,\n config: DialConfig,\n options: UseDialStorePanelOptions = {}\n): { panelId: string; flatValues: Record<string, DialValue>; serializedConfig: string } {\n const instanceId = useId();\n const hasStableId = options.id !== undefined;\n const panelId = options.id ?? `${name}-${instanceId}`;\n\n const configRef = useRef(config);\n configRef.current = config;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const serializedConfig = useSerialized(config);\n const serializedShortcuts = useSerialized(options.shortcuts);\n const serializedPersist = useSerialized(options.persist);\n\n // Register on mount\n useEffect(() => {\n DialStore.registerPanel(panelId, name, configRef.current, optionsRef.current.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: optionsRef.current.persist,\n kind: optionsRef.current.kind,\n });\n return () => DialStore.unregisterPanel(panelId);\n }, [hasStableId, panelId, name]);\n\n // Push structure changes without re-registering\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n DialStore.updatePanel(panelId, name, configRef.current, optionsRef.current.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: optionsRef.current.persist,\n kind: optionsRef.current.kind,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasStableId, panelId, name, serializedConfig, serializedShortcuts, serializedPersist]);\n\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(() => DialStore.getValues(panelId), [panelId]);\n\n // DialStore.getValues returns a stable empty object when panel is not registered.\n const flatValues = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return { panelId, flatValues, serializedConfig };\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport { isDevDefault } from '../env';\nimport { Folder } from './Folder';\nimport { Panel } from './Panel';\nimport { ShortcutListener } from './ShortcutListener';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport { blockPanelDragClick, getPanelDragHandle, getPanelDragOffset, getPanelDragStart, getPanelOriginX, hasPanelDragMoved } from '../panel-drag';\n\nexport type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\nexport type DialMode = 'popover' | 'inline';\nexport type DialTheme = 'light' | 'dark' | 'system';\n\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n theme?: DialTheme;\n productionEnabled?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function DialRoot({ position = 'top-right', defaultOpen = true, mode = 'popover', theme = 'system', productionEnabled = isDevDefault, onOpenChange }: DialRootProps) {\n if (!productionEnabled) return null;\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [timelineCount, setTimelineCount] = useState(0);\n const [mounted, setMounted] = useState(false);\n const inline = mode === 'inline';\n\n // Drag state\n const panelRef = useRef<HTMLDivElement>(null);\n const [dragOffset, setDragOffset] = useState<{ x: number; y: number } | null>(null);\n const [activePosition, setActivePosition] = useState(position);\n const lastDragOffset = useRef<{ x: number; y: number } | null>(null);\n const draggingRef = useRef(false);\n const dragStartRef = useRef<{ pointerX: number; pointerY: number; elX: number; elY: number } | null>(null);\n const didDragRef = useRef(false);\n const dragTargetRef = useRef<HTMLElement | null>(null);\n const panelOpenStatesRef = useRef<Map<string, boolean>>(new Map());\n const rootOpenRef = useRef<boolean | null>(null);\n\n // Subscribe to registered editing surfaces. Timeline-backed panels render\n // in DialTimeline, but their presence adds a visibility toggle here.\n useEffect(() => {\n setMounted(true);\n setPanels(DialStore.getPanels('panel'));\n setTimelineCount(TimelineStore.getTimelines().length);\n\n const unsubscribePanels = DialStore.subscribeGlobal(() => {\n setPanels(DialStore.getPanels('panel'));\n });\n const unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n setTimelineCount(TimelineStore.getTimelines().length);\n });\n\n return () => {\n unsubscribePanels();\n unsubscribeTimelines();\n };\n }, []);\n\n useEffect(() => {\n const fallbackOpen = inline || defaultOpen;\n const nextStates = new Map<string, boolean>();\n for (const panel of panels) {\n nextStates.set(panel.id, panelOpenStatesRef.current.get(panel.id) ?? fallbackOpen);\n }\n panelOpenStatesRef.current = nextStates;\n rootOpenRef.current = Array.from(nextStates.values()).some(Boolean);\n }, [defaultOpen, inline, panels]);\n\n // Watch for panel open/close — snap to corner on open, restore drag position on close\n useEffect(() => {\n if (!panelRef.current || inline) return;\n const observer = new MutationObserver(() => {\n const inners = panelRef.current?.querySelectorAll('.dialkit-panel-inner');\n if (!inners || inners.length === 0) return;\n const collapsed = Array.from(inners).every(\n (el) => el.getAttribute('data-collapsed') === 'true'\n );\n const currentDragOffset = dragOffset;\n\n if (!collapsed) {\n // Opening — save drag position, determine corner, snap\n if (currentDragOffset) {\n lastDragOffset.current = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n const midX = window.innerWidth / 2;\n setActivePosition(bubbleCenterX < midX ? 'top-left' : 'top-right');\n } else {\n setActivePosition(position);\n }\n setDragOffset(null);\n } else if (currentDragOffset) {\n lastDragOffset.current = currentDragOffset;\n } else if (lastDragOffset.current) {\n // Closing — restore the dragged position\n setDragOffset(lastDragOffset.current);\n }\n });\n observer.observe(panelRef.current, { subtree: true, attributes: true, attributeFilter: ['data-collapsed'] });\n return () => observer.disconnect();\n }, [inline, dragOffset, position]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n const panel = panelRef.current;\n const handle = getPanelDragHandle(e.target, panel);\n if (!panel || !handle) return;\n\n dragTargetRef.current = handle;\n dragStartRef.current = getPanelDragStart(e.clientX, e.clientY, panel);\n didDragRef.current = false;\n draggingRef.current = true;\n handle.setPointerCapture(e.pointerId);\n }, []);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current || !dragStartRef.current) return;\n\n if (!didDragRef.current && !hasPanelDragMoved(dragStartRef.current, e.clientX, e.clientY)) return;\n didDragRef.current = true;\n\n setDragOffset(getPanelDragOffset(dragStartRef.current, e.clientX, e.clientY));\n }, []);\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n dragStartRef.current = null;\n const dragTarget = dragTargetRef.current;\n\n if (dragTarget?.hasPointerCapture(e.pointerId)) {\n dragTarget.releasePointerCapture(e.pointerId);\n }\n\n // If we actually dragged, prevent the click from opening the panel\n if (didDragRef.current) {\n e.stopPropagation();\n if (dragTarget) {\n blockPanelDragClick(dragTarget);\n }\n }\n dragTargetRef.current = null;\n }, []);\n\n const handlePanelOpenChange = useCallback((panelId: string, open: boolean) => {\n panelOpenStatesRef.current.set(panelId, open);\n const fallbackOpen = inline || defaultOpen;\n const nextRootOpen = panels.some((panel) => (\n panelOpenStatesRef.current.get(panel.id) ?? fallbackOpen\n ));\n\n if (rootOpenRef.current === nextRootOpen) return;\n rootOpenRef.current = nextRootOpen;\n onOpenChange?.(nextRootOpen);\n }, [defaultOpen, inline, onOpenChange, panels]);\n\n const handleRootOpenChange = useCallback((open: boolean) => {\n if (rootOpenRef.current === open) return;\n rootOpenRef.current = open;\n onOpenChange?.(open);\n }, [onOpenChange]);\n\n // Don't render on server\n if (!mounted || typeof window === 'undefined') {\n return null;\n }\n\n // Don't render if no editing surfaces are registered.\n if (panels.length === 0 && timelineCount === 0) {\n return null;\n }\n\n const dragStyle = dragOffset ? {\n top: dragOffset.y,\n left: dragOffset.x,\n right: 'auto' as const,\n bottom: 'auto' as const,\n } : undefined;\n const originX = getPanelOriginX(activePosition, dragOffset);\n const hasMultiplePanels = panels.length > 1;\n const timelineToggle = timelineCount > 0 ? <TimelineToggleButton /> : null;\n\n const content = (\n <ShortcutListener>\n <div className=\"dialkit-root\" data-mode={mode} data-theme={theme}>\n <div\n ref={panelRef}\n className=\"dialkit-panel\"\n data-position={inline ? undefined : (dragOffset ? undefined : activePosition)}\n data-origin-x={inline ? undefined : originX}\n data-mode={mode}\n data-multiple={hasMultiplePanels ? 'true' : undefined}\n style={dragStyle}\n onPointerDown={!inline ? handlePointerDown : undefined}\n onPointerMove={!inline ? handlePointerMove : undefined}\n onPointerUp={!inline ? handlePointerUp : undefined}\n onPointerCancel={!inline ? handlePointerUp : undefined}\n >\n {panels.length === 0 ? (\n <div className=\"dialkit-panel-wrapper\">\n <Folder\n title=\"DialKit\"\n defaultOpen={inline || defaultOpen}\n isRoot={true}\n inline={inline}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle}\n panelHeightOffset={2}\n >\n <div className=\"dialkit-timeline-toolkit-only\">Timeline</div>\n </Folder>\n </div>\n ) : hasMultiplePanels ? (\n <div className=\"dialkit-panel-wrapper\">\n <Folder\n title=\"DialKit\"\n defaultOpen={inline || defaultOpen}\n isRoot={true}\n inline={inline}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle}\n panelHeightOffset={2}\n >\n {panels.map((panel) => (\n <Panel\n key={panel.id}\n panel={panel}\n defaultOpen={true}\n variant=\"section\"\n />\n ))}\n </Folder>\n </div>\n ) : (\n panels.map((panel) => (\n <Panel\n key={panel.id}\n panel={panel}\n defaultOpen={inline || defaultOpen}\n inline={inline}\n toolbarExtra={timelineToggle}\n onOpenChange={(open) => handlePanelOpenChange(panel.id, open)}\n />\n ))\n )}\n </div>\n </div>\n </ShortcutListener>\n );\n\n if (inline) {\n return content;\n }\n\n return createPortal(content, document.body);\n}\n","// Playback transport + registry for DialKit timelines.\n// Clip values (at/duration/from/to) live in DialStore under the timeline's\n// panel id — this store only owns time: the clock, play state, and the\n// track/clip structure the dock UI renders.\n\nexport type TimelineClipTrackMeta = {\n prop: string;\n /** Step folder keys when the track is a sequence. */\n stepKeys?: string[];\n};\n\nexport type TimelineClipMeta = {\n key: string; // config path; also the DialStore path prefix, e.g. \"cardEnter\" or \"circle.path\"\n label: string;\n color: string;\n /** Code-defined playback behavior; intentionally not exposed as a dial. */\n loop: 'off' | 'repeat';\n /** Group key when the clip lives inside a nested layer, e.g. \"circle\". */\n group?: string;\n /** Step folder keys for sequence clips, e.g. [\"step1\", \"step2\"]. */\n stepKeys?: string[];\n /** Independent property tracks of a props clip — full rows when expanded. */\n tracks?: TimelineClipTrackMeta[];\n};\n\nexport type TimelineMeta = {\n id: string; // same id as the DialStore panel\n name: string;\n duration: number; // seconds\n loop: boolean;\n /** Loop wraps back to this time, not 0 — clips before it play once\n * (intro-then-idle). 0 loops the whole timeline. */\n loopStart: number;\n clips: TimelineClipMeta[]; // one row each\n};\n\nexport type TimelineTransport = {\n time: number;\n playing: boolean;\n duration: number;\n /** Completed loop passes — keeps looping clips phase-continuous across\n * timeline wraps. Reset by seek/replay so scrubbing stays deterministic. */\n wraps: number;\n};\n\ntype Listener = () => void;\n\n/** Length of the repeating span — the whole timeline unless a loop region\n * narrows it. Degenerate regions (start ≥ duration) fall back to the whole\n * timeline so a bad `from` never stalls the clock. */\nexport function loopSpan(duration: number, loopStart: number): number {\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n if (!Number.isFinite(loopStart)) loopStart = 0;\n const start = Math.min(Math.max(0, loopStart), duration);\n return duration - start > 0 ? duration - start : duration;\n}\n\n/** Folds an over-run playhead back into the loop region, reporting how many\n * spans were crossed so continuous time (wraps × span + time) never jumps. */\nexport function foldLoopTime(\n time: number,\n duration: number,\n loopStart = 0\n): { time: number; wraps: number } {\n if (!Number.isFinite(time) || !Number.isFinite(duration) || duration <= 0) {\n return { time: 0, wraps: 0 };\n }\n if (time < duration) return { time, wraps: 0 };\n const span = loopSpan(duration, loopStart);\n const base = duration - span;\n const over = time - base;\n return { time: base + (over % span), wraps: Math.floor(over / span) };\n}\n\nexport const TIMELINE_CLIP_COLORS = [\n '#E8E8E8', // neutral white — slightly off-white so the pure-white selection ring still reads\n];\n\nconst EMPTY_TRANSPORT: TimelineTransport = Object.freeze({ time: 0, playing: false, duration: 0, wraps: 0 });\n\nclass TimelineStoreClass {\n private timelines: Map<string, TimelineMeta> = new Map();\n private transports: Map<string, TimelineTransport> = new Map();\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private registrationCounts: Map<string, number> = new Map();\n private listCache: TimelineMeta[] | null = null;\n private rafId: number | null = null;\n private lastTick = 0;\n\n register(meta: TimelineMeta, options: { autoplay: boolean }): void {\n const existing = this.timelines.get(meta.id);\n if (existing && existing.name !== meta.name) {\n console.warn(\n `[dialkit] Timeline id \"${meta.id}\" is already registered by \"${existing.name}\"; ` +\n `\"${meta.name}\" will share and overwrite that transport.`\n );\n }\n this.registrationCounts.set(meta.id, (this.registrationCounts.get(meta.id) ?? 0) + 1);\n this.applyMeta(meta, options.autoplay);\n }\n\n update(meta: TimelineMeta): void {\n if (!this.timelines.has(meta.id)) return;\n this.applyMeta(meta, false);\n }\n\n unregister(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.timelines.delete(id);\n this.transports.delete(id);\n // Keep listener sets: subscribers (e.g. a mounted dock) may outlive the\n // registration — HMR tears down and re-registers the same id, and their\n // subscriptions must survive it. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n this.listCache = null;\n this.notifyGlobal();\n }\n\n play(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0 || transport.playing) return;\n // Play from the top when the playhead is parked at the end\n const restart = transport.time >= transport.duration;\n this.transports.set(id, {\n ...transport,\n time: restart ? 0 : transport.time,\n wraps: restart ? 0 : transport.wraps,\n playing: true,\n });\n this.notify(id);\n this.ensureLoop();\n }\n\n pause(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || !transport.playing) return;\n this.transports.set(id, { ...transport, playing: false });\n this.notify(id);\n }\n\n replay(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0) return;\n this.transports.set(id, { ...transport, time: 0, wraps: 0, playing: true });\n this.notify(id);\n this.ensureLoop();\n }\n\n seek(id: string, time: number): void {\n const transport = this.transports.get(id);\n if (!transport || !Number.isFinite(time)) return;\n const clamped = Math.min(transport.duration, Math.max(0, time));\n // Scrubbing pins the deterministic first-pass state\n this.transports.set(id, { ...transport, time: clamped, wraps: 0 });\n this.notify(id);\n }\n\n getTransport(id: string): TimelineTransport {\n return this.transports.get(id) ?? EMPTY_TRANSPORT;\n }\n\n getTimeline(id: string): TimelineMeta | undefined {\n return this.timelines.get(id);\n }\n\n getTimelines(): TimelineMeta[] {\n if (!this.listCache) {\n this.listCache = Array.from(this.timelines.values());\n }\n return this.listCache;\n }\n\n subscribe(id: string, listener: Listener): () => void {\n if (!this.listeners.has(id)) {\n this.listeners.set(id, new Set());\n }\n this.listeners.get(id)!.add(listener);\n return () => {\n const listeners = this.listeners.get(id);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.timelines.has(id)) {\n this.listeners.delete(id);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private applyMeta(meta: TimelineMeta, autoplay: boolean): void {\n const duration = Number.isFinite(meta.duration) ? Math.max(0, meta.duration) : 0;\n const loopStart = Number.isFinite(meta.loopStart)\n ? Math.min(duration, Math.max(0, meta.loopStart))\n : 0;\n const safeMeta = { ...meta, duration, loopStart };\n this.timelines.set(meta.id, safeMeta);\n\n const existing = this.transports.get(meta.id);\n if (existing) {\n // Structure changed or remounted — keep the playhead, clamp to the new length\n this.transports.set(meta.id, {\n time: Math.min(existing.time, duration),\n playing: duration > 0 && existing.playing,\n duration,\n wraps: existing.wraps,\n });\n } else {\n const playing = duration > 0 && autoplay;\n this.transports.set(meta.id, { time: 0, playing, duration, wraps: 0 });\n if (playing) this.ensureLoop();\n }\n\n this.listCache = null;\n this.notify(meta.id);\n this.notifyGlobal();\n }\n\n private ensureLoop(): void {\n if (this.rafId !== null || typeof window === 'undefined') return;\n this.lastTick = performance.now();\n this.rafId = window.requestAnimationFrame(this.tick);\n }\n\n private tick = (now: number): void => {\n // Advance by wall time. A backgrounded tab lands at the state it would\n // have reached, rather than silently slowing the animation on return.\n const dt = Math.max(0, (now - this.lastTick) / 1000);\n this.lastTick = now;\n\n let anyPlaying = false;\n for (const [id, transport] of this.transports) {\n if (!transport.playing) continue;\n\n const meta = this.timelines.get(id);\n const duration = meta?.duration ?? transport.duration;\n if (!Number.isFinite(duration) || duration <= 0) {\n this.transports.set(id, { time: 0, playing: false, duration: 0, wraps: 0 });\n this.notify(id);\n continue;\n }\n let time = transport.time + dt;\n let playing = true;\n let wraps = transport.wraps;\n\n if (time >= duration) {\n if (meta?.loop) {\n const folded = foldLoopTime(time, duration, meta.loopStart);\n time = folded.time;\n wraps += folded.wraps;\n } else {\n time = duration;\n playing = false;\n }\n }\n\n this.transports.set(id, { time, playing, duration, wraps });\n if (playing) anyPlaying = true;\n this.notify(id);\n }\n\n this.rafId = anyPlaying ? window.requestAnimationFrame(this.tick) : null;\n };\n\n private notify(id: string): void {\n this.listeners.get(id)?.forEach((fn) => fn());\n }\n\n private notifyGlobal(): void {\n this.globalListeners.forEach((fn) => fn());\n }\n}\n\n// PURE lets bundlers drop the timeline entirely for panel-only users.\nexport const TimelineStore = /* @__PURE__ */ new TimelineStoreClass();\n","// Shared environment detection for dev-only rendering.\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nexport const isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n","import { useState, useRef, useEffect, ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ICON_PANEL, ICON_CHEVRON } from '../icons';\n\ninterface FolderProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n isRoot?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: ReactNode;\n panelHeightOffset?: number;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = false, inline = false, onOpenChange, toolbar, panelHeightOffset = 10 }: FolderProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isCollapsed, setIsCollapsed] = useState(!defaultOpen);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n const [windowHeight, setWindowHeight] = useState(typeof window !== 'undefined' ? window.innerHeight : 800);\n\n useEffect(() => {\n if (!isRoot) return;\n const onResize = () => setWindowHeight(window.innerHeight);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, [isRoot]);\n\n // Track content height for explicit panel sizing (no height: 'auto')\n useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n if (isOpen) {\n const h = el.offsetHeight;\n setContentHeight(prev => prev === h ? prev : h);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen]);\n\n const handleToggle = () => {\n if (inline && isRoot) return;\n const next = !isOpen;\n setIsOpen(next);\n if (next) {\n setIsCollapsed(false);\n } else {\n setIsCollapsed(true);\n }\n onOpenChange?.(next);\n };\n\n const folderContent = (\n <div\n ref={isRoot ? contentRef : undefined}\n className={`dialkit-folder ${isRoot ? 'dialkit-folder-root' : ''}`}\n data-open={String(isOpen)}\n >\n <div className={`dialkit-folder-header ${isRoot ? 'dialkit-panel-header' : ''}`} onClick={handleToggle}>\n <div className=\"dialkit-folder-header-top\">\n {isRoot ? (\n isOpen && (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title dialkit-folder-title-root\">\n {title}\n </span>\n </div>\n )\n ) : (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title\">\n {title}\n </span>\n </div>\n )}\n {isRoot && !inline && (\n <svg\n className=\"dialkit-panel-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path opacity=\"0.5\" d={ICON_PANEL.path} fill=\"currentColor\"/>\n {ICON_PANEL.circles.map((c, i) => (\n <circle key={i} cx={c.cx} cy={c.cy} r={c.r} fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n ))}\n </svg>\n )}\n {!isRoot && (\n <motion.svg\n className=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n initial={false}\n animate={{ rotate: isOpen ? 0 : 180 }}\n transition={{ type: 'spring', visualDuration: 0.35, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n )}\n </div>\n\n {isRoot && toolbar && isOpen && (\n <div className=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={isRoot ? undefined : { height: 0, opacity: 0 }}\n animate={isRoot ? undefined : { height: 'auto', opacity: 1 }}\n exit={isRoot ? undefined : { height: 0, opacity: 0 }}\n transition={isRoot ? undefined : { type: 'spring', visualDuration: 0.35, bounce: 0.1 }}\n style={isRoot ? undefined : { clipPath: 'inset(0 -20px)' }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n if (isRoot) {\n if (inline) {\n return (\n <div className=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent}\n </div>\n );\n }\n\n const panelStyle = isOpen\n ? { width: 280, height: contentHeight !== undefined ? Math.min(contentHeight + panelHeightOffset, windowHeight - 32) : 'auto' as const, borderRadius: 14, boxShadow: 'var(--dial-shadow)', cursor: undefined as string | undefined, overflowY: 'auto' as const }\n : { width: 42, height: 42, borderRadius: '50%', boxSizing: 'border-box' as const, boxShadow: 'var(--dial-shadow-collapsed)', overflow: 'hidden' as const, cursor: 'pointer' as const };\n\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n style={panelStyle}\n onClick={!isOpen ? handleToggle : undefined}\n data-collapsed={isCollapsed}\n whileTap={!isOpen ? { scale: 0.9 } : undefined}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n {folderContent}\n </motion.div>\n );\n }\n\n return folderContent;\n}\n","// Shared SVG icon geometry — single source of truth across all framework adapters.\n\nexport const ICON_CHEVRON = 'M6 9.5L12 15.5L18 9.5';\n\nexport const ICON_CHECK = 'M5 12.75L10 19L19 5';\n\nexport const ICON_PAUSE = [\n 'M6.75 3C5.23122 3 4 4.23122 4 5.75V18.25C4 19.7688 5.23122 21 6.75 21H7.25C8.76878 21 10 19.7688 10 18.25V5.75C10 4.23122 8.76878 3 7.25 3H6.75Z',\n 'M16.75 3C15.2312 3 14 4.23122 14 5.75V18.25C14 19.7688 15.2312 21 16.75 21H17.25C18.7688 21 20 19.7688 20 18.25V5.75C20 4.23122 18.7688 3 17.25 3H16.75Z',\n];\n\nexport const ICON_PLAY = 'M9.24394 2.36758C7.41419 1.18362 5 2.49701 5 4.67639V19.3238C5 21.5032 7.41419 22.8166 9.24394 21.6326L20.5624 14.3089C22.2371 13.2253 22.2372 10.775 20.5624 9.69129L9.24394 2.36758Z';\n\nexport const ICON_REPLAY = [\n 'M12 2.5C17.2466 2.50016 21.5 6.7534 21.5 12C21.5 17.2466 17.2466 21.4998 12 21.5C7.52191 21.5 3.76987 18.4025 2.76465 14.2344C2.63517 13.6975 2.96508 13.1578 3.50195 13.0283C4.03883 12.8988 4.57851 13.2288 4.70801 13.7656C5.5016 17.0563 8.46701 19.5 12 19.5C16.142 19.4998 19.5 16.142 19.5 12C19.5 7.85796 16.142 4.50016 12 4.5C9.32981 4.5 6.98389 5.89541 5.6543 8H7.5C8.05228 8 8.5 8.44772 8.5 9C8.5 9.55228 8.05228 10 7.5 10H3.5C2.94772 10 2.5 9.55228 2.5 9V5C2.5 4.44772 2.94772 4 3.5 4C4.05228 4 4.5 4.44772 4.5 5V6.16797C6.2376 3.93677 8.95063 2.5 12 2.5Z',\n 'M10 9.94043C10 9.33379 10.6826 8.97849 11.1797 9.32617L14.1221 11.3857C14.5486 11.6843 14.5486 12.3157 14.1221 12.6143L11.1797 14.6738C10.6826 15.0215 10 14.6662 10 14.0596V9.94043Z',\n];\n\nexport const ICON_TIMELINE = [\n 'M18.868 10C20.8517 10.0003 22.2886 11.8914 21.7577 13.8027L20.369 18.8027C20.0083 20.1012 18.826 20.9999 17.4784 21H6.51941C5.17179 21 3.98948 20.1012 3.62878 18.8027L2.24011 13.8027C1.7092 11.8913 3.14603 10.0003 5.12976 10H18.868Z',\n 'M18.9989 6.5C19.5511 6.50007 19.9989 6.94776 19.9989 7.5C19.9989 8.05224 19.5511 8.49993 18.9989 8.5H4.9989C4.44661 8.5 3.9989 8.05228 3.9989 7.5C3.9989 6.94772 4.44661 6.5 4.9989 6.5H18.9989Z',\n 'M16.9989 3C17.5511 3.00007 17.9989 3.44776 17.9989 4C17.9989 4.55224 17.5511 4.99993 16.9989 5H6.9989C6.44661 5 5.9989 4.55228 5.9989 4C5.9989 3.44772 6.44661 3 6.9989 3H16.9989Z',\n];\n\nexport const ICON_CLIPBOARD = {\n board: 'M8 6C8 4.34315 9.34315 3 11 3H13C14.6569 3 16 4.34315 16 6V7H8V6Z',\n sparkle: 'M19.2405 16.1852L18.5436 14.3733C18.4571 14.1484 18.241 14 18 14C17.759 14 17.5429 14.1484 17.4564 14.3733L16.7595 16.1852C16.658 16.4493 16.4493 16.658 16.1852 16.7595L14.3733 17.4564C14.1484 17.5429 14 17.759 14 18C14 18.241 14.1484 18.4571 14.3733 18.5436L16.1852 19.2405C16.4493 19.342 16.658 19.5507 16.7595 19.8148L17.4564 21.6267C17.5429 21.8516 17.759 22 18 22C18.241 22 18.4571 21.8516 18.5436 21.6267L19.2405 19.8148C19.342 19.5507 19.5507 19.342 19.8148 19.2405L21.6267 18.5436C21.8516 18.4571 22 18.241 22 18C22 17.759 21.8516 17.5429 21.6267 17.4564L19.8148 16.7595C19.5507 16.658 19.342 16.4493 19.2405 16.1852Z',\n body: 'M16 5H17C18.6569 5 20 6.34315 20 8V11M8 5H7C5.34315 5 4 6.34315 4 8V18C4 19.6569 5.34315 21 7 21H12',\n};\n\nexport const ICON_ADD_PRESET = [\n 'M4 6H20',\n 'M4 12H10',\n 'M15 15L21 15',\n 'M18 12V18',\n 'M4 18H10',\n];\n\nexport const ICON_TRASH = [\n 'M5 6.5L5.80734 18.2064C5.91582 19.7794 7.22348 21 8.80023 21H15.1998C16.7765 21 18.0842 19.7794 18.1927 18.2064L19 6.5',\n 'M10 11V16',\n 'M14 11V16',\n 'M3.5 6H20.5',\n 'M8.07092 5.74621C8.42348 3.89745 10.0485 2.5 12 2.5C13.9515 2.5 15.5765 3.89745 15.9291 5.74621',\n];\n\nexport const ICON_PANEL = {\n path: 'M6.84766 11.75C6.78583 11.9899 6.75 12.2408 6.75 12.5C6.75 12.7592 6.78583 13.0101 6.84766 13.25H2C1.58579 13.25 1.25 12.9142 1.25 12.5C1.25 12.0858 1.58579 11.75 2 11.75H6.84766ZM14 11.75C14.4142 11.75 14.75 12.0858 14.75 12.5C14.75 12.9142 14.4142 13.25 14 13.25H12.6523C12.7142 13.0101 12.75 12.7592 12.75 12.5C12.75 12.2408 12.7142 11.9899 12.6523 11.75H14ZM3.09766 7.25C3.03583 7.48994 3 7.74075 3 8C3 8.25925 3.03583 8.51006 3.09766 8.75H2C1.58579 8.75 1.25 8.41421 1.25 8C1.25 7.58579 1.58579 7.25 2 7.25H3.09766ZM14 7.25C14.4142 7.25 14.75 7.58579 14.75 8C14.75 8.41421 14.4142 8.75 14 8.75H8.90234C8.96417 8.51006 9 8.25925 9 8C9 7.74075 8.96417 7.48994 8.90234 7.25H14ZM7.59766 2.75C7.53583 2.98994 7.5 3.24075 7.5 3.5C7.5 3.75925 7.53583 4.01006 7.59766 4.25H2C1.58579 4.25 1.25 3.91421 1.25 3.5C1.25 3.08579 1.58579 2.75 2 2.75H7.59766ZM14 2.75C14.4142 2.75 14.75 3.08579 14.75 3.5C14.75 3.91421 14.4142 4.25 14 4.25H13.4023C13.4642 4.01006 13.5 3.75925 13.5 3.5C13.5 3.24075 13.4642 2.98994 13.4023 2.75H14Z',\n circles: [\n { cx: '6', cy: '8', r: '0.998596' },\n { cx: '10.4999', cy: '3.5', r: '0.998657' },\n { cx: '9.75015', cy: '12.5', r: '0.997986' },\n ],\n};\n","import { useCallback, useState, useSyncExternalStore } from 'react';\nimport type { ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { buildCopyInstruction } from '../copy-instruction';\nimport { ShortcutsMenu } from './ShortcutsMenu';\nimport { ICON_CLIPBOARD, ICON_CHECK, ICON_ADD_PRESET } from '../icons';\nimport { ControlRenderer } from './ControlRenderer';\nimport { Folder } from './Folder';\nimport { PresetManager } from './PresetManager';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'root' | 'section';\n toolbarExtra?: ReactNode;\n}\n\nexport function Panel({ panel, defaultOpen = true, inline = false, onOpenChange, variant = 'root', toolbarExtra }: PanelProps) {\n const [copied, setCopied] = useState(false);\n const [isPanelOpen, setIsPanelOpen] = useState(defaultOpen);\n const hasShortcuts = Object.keys(panel.shortcuts).length > 0;\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panel.id, callback),\n [panel.id]\n );\n const getSnapshot = useCallback(\n () => DialStore.getValues(panel.id),\n [panel.id]\n );\n\n // Subscribe to panel value changes\n const values = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const presets = DialStore.getPresets(panel.id);\n const activePresetId = DialStore.getActivePresetId(panel.id);\n\n const handleAddPreset = () => {\n const nextNum = presets.length + 2;\n DialStore.savePreset(panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n navigator.clipboard.writeText(buildCopyInstruction('useDialKit', panel.name, values));\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleOpenChange = useCallback((open: boolean) => {\n setIsPanelOpen(open);\n onOpenChange?.(open);\n }, [onOpenChange]);\n\n const renderControls = () => (\n <ControlRenderer panelId={panel.id} controls={panel.controls} values={values} />\n );\n\n const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const toolbar = (\n <>\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add preset\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_ADD_PRESET.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </motion.button>\n\n <PresetManager\n panelId={panel.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {copied ? (\n <motion.svg\n key=\"check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CHECK} />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"/>\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\"/>\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n\n {toolbarExtra}\n </>\n );\n\n if (variant === 'section') {\n return (\n <Folder title={panel.name} defaultOpen={defaultOpen} onOpenChange={handleOpenChange}>\n <div className=\"dialkit-panel-section-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n {renderControls()}\n </Folder>\n );\n }\n\n return (\n <div className=\"dialkit-panel-wrapper\">\n <Folder title={panel.name} defaultOpen={defaultOpen} isRoot={true} inline={inline} onOpenChange={handleOpenChange} toolbar={toolbar}>\n {renderControls()}\n </Folder>\n </div>\n );\n}\n","import type { DialValue } from './store/DialStore';\n\n// The copy-for-agent export shared by the panel toolbar and the timeline dock.\nexport function buildCopyInstruction(\n hookName: string,\n panelName: string,\n values: Record<string, DialValue>\n): string {\n const jsonStr = JSON.stringify(values, null, 2);\n\n if (hookName === 'useDialTimeline' || hookName === 'createDialTimeline') {\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call. Keep the existing \\`clip.current\\` bindings while this timeline is being authored; do not convert the animation or remove DialKit yet.\n\nAdd this comment immediately above the ${hookName} call as a production handoff note:\n\n\\`\\`\\`tsx\n// TODO(production): DialKit's clip.current values are the scrubbable authoring preview.\n// Replace them with equivalent real Motion animations using the tuned timeline\n// timings and transitions, then remove ${hookName} and <DialTimeline />.\n\\`\\`\\``;\n }\n\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call.`;\n}\n","import { useContext } from 'react';\nimport { DialStore, ControlMeta, DialValue, SpringConfig, TransitionConfig } from '../store/DialStore';\nimport { ShortcutContext } from './ShortcutListener';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { TransitionControl } from './TransitionControl';\nimport { TextControl } from './TextControl';\nimport { SelectControl } from './SelectControl';\nimport { ColorControl } from './ColorControl';\n\ninterface ControlRendererProps {\n panelId: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n /** Optional timeline-owned duration rendered inside the transition editor. */\n transitionDuration?: {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n };\n}\n\n// Renders a ControlMeta tree with the standard DialKit controls.\n// Shared by the panel and the timeline clip popover.\nexport function ControlRenderer({ panelId, controls, values, transitionDuration }: ControlRendererProps) {\n const shortcutCtx = useContext(ShortcutContext);\n\n const renderControl = (control: ControlMeta) => {\n const value = values[control.path];\n\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n key={control.path}\n label={control.label}\n value={value as number}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panelId && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n key={control.path}\n label={control.label}\n checked={value as boolean}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panelId && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n key={control.path}\n panelId={panelId}\n path={control.path}\n label={control.label}\n spring={value as SpringConfig}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n key={control.path}\n panelId={panelId}\n path={control.path}\n label={control.label}\n value={value as TransitionConfig}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n durationControl={transitionDuration}\n />\n );\n\n case 'folder':\n return (\n <Folder key={control.path} title={control.label} defaultOpen={control.defaultOpen ?? true}>\n {control.children?.map(renderControl)}\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n key={control.path}\n label={control.label}\n value={value as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panelId, control.path, v)}\n />\n );\n\n case 'action':\n return (\n <button\n key={control.path}\n className=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(panelId, control.path)}\n >\n {control.label}\n </button>\n );\n\n default:\n return null;\n }\n };\n\n return <>{controls.map(renderControl)}</>;\n}\n","import { createContext, useEffect, useRef, useState, useCallback } from 'react';\nimport { DialStore } from '../store/DialStore';\nimport {\n getEffectiveStep,\n applySliderDelta,\n isInputFocused,\n getActiveModifier,\n findControl,\n DRAG_SENSITIVITY,\n} from '../shortcut-utils';\n\nexport const ShortcutContext = createContext<{\n activePanelId: string | null;\n activePath: string | null;\n}>({ activePanelId: null, activePath: null });\n\nexport function ShortcutListener({ children }: { children: React.ReactNode }) {\n const [activeShortcut, setActiveShortcut] = useState<{\n activePanelId: string | null;\n activePath: string | null;\n }>({ activePanelId: null, activePath: null });\n\n const activeKeysRef = useRef<Set<string>>(new Set());\n const isDraggingRef = useRef(false);\n const lastMouseXRef = useRef<number | null>(null);\n const dragAccumulatorRef = useRef(0);\n\n // Find the active target for key-based interactions (scroll, drag, move)\n const resolveActiveTarget = useCallback((interaction: string) => {\n for (const key of activeKeysRef.current) {\n // We can't get the modifier from a stored key, so we check all panels\n const panels = DialStore.getPanels();\n for (const panel of panels) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue;\n if (shortcut.key.toLowerCase() !== key) continue;\n if ((shortcut.interaction ?? 'scroll') !== interaction) continue;\n const control = findControl(panel.controls, path);\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isInputFocused()) return;\n\n const key = e.key.toLowerCase();\n\n // Arrow keys adjust the active shortcut's slider\n if (key === 'arrowleft' || key === 'arrowright' || key === 'arrowup' || key === 'arrowdown') {\n if (activeKeysRef.current.size > 0) {\n const target = resolveActiveTarget('scroll') || resolveActiveTarget('drag') || resolveActiveTarget('move');\n if (target && target.control.type === 'slider') {\n e.preventDefault();\n const direction = (key === 'arrowright' || key === 'arrowup') ? 1 : -1;\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, direction);\n return;\n }\n }\n }\n\n const wasAlreadyHeld = activeKeysRef.current.has(key);\n activeKeysRef.current.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n\n // Toggle: flip on first keydown only (not on key repeat)\n if (!wasAlreadyHeld && target.control.type === 'toggle') {\n const currentValue = DialStore.getValue(target.panelId, target.path) as boolean;\n DialStore.updateValue(target.panelId, target.path, !currentValue);\n }\n }\n\n // Reset mouse tracking when a new key is pressed (for move/drag)\n if (!wasAlreadyHeld) {\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeysRef.current.delete(key);\n\n // Reset drag state when key is released\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n\n if (activeKeysRef.current.size === 0) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n } else {\n let found = false;\n for (const remainingKey of activeKeysRef.current) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n found = true;\n break;\n }\n }\n if (!found) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n }\n }\n };\n\n // ── Scroll: key+scroll and scroll-only ──\n const handleWheel = (e: WheelEvent) => {\n if (isInputFocused()) return;\n\n const modifier = getActiveModifier(e);\n\n // Key+scroll shortcuts\n if (activeKeysRef.current.size > 0) {\n for (const key of activeKeysRef.current) {\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (!target) continue;\n\n const { panelId, path, control } = target;\n const interaction = control.shortcut?.interaction ?? 'scroll';\n if (interaction !== 'scroll' || control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, control.shortcut!);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n }\n\n // Scroll-only shortcuts (no key needed)\n const scrollOnlyTargets = DialStore.resolveScrollOnlyTargets();\n for (const { panelId, path, control, shortcut } of scrollOnlyTargets) {\n if (control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, shortcut);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n };\n\n // ── Drag: key+mousedown starts, mousemove adjusts, mouseup stops ──\n const handleMouseDown = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDraggingRef.current = true;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n };\n\n // ── Move + Drag: mousemove handles both ──\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDraggingRef.current) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseXRef.current !== null) {\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, steps);\n }\n }\n return;\n }\n\n // Move interaction (no click needed, just key held + mouse movement)\n const moveTarget = resolveActiveTarget('move');\n if (moveTarget) {\n if (lastMouseXRef.current === null) {\n lastMouseXRef.current = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeysRef.current.clear();\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n setActiveShortcut({ activePanelId: null, activePath: null });\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('wheel', handleWheel, { passive: false });\n window.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('wheel', handleWheel);\n window.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [resolveActiveTarget]);\n\n return (\n <ShortcutContext.Provider value={activeShortcut}>\n {children}\n </ShortcutContext.Provider>\n );\n}","// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { motion, useMotionValue, useTransform, animate } from 'motion/react';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { decimalsForStep, roundValue, snapToDecile, formatSliderShortcut } from '../shortcut-utils';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 1,\n step = 0.01,\n unit,\n shortcut,\n shortcutActive,\n}: SliderProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const valueSpanRef = useRef<HTMLSpanElement>(null);\n const [isInteracting, setIsInteracting] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isValueHovered, setIsValueHovered] = useState(false);\n const [isValueEditable, setIsValueEditable] = useState(false);\n const [showInput, setShowInput] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Click-vs-drag detection refs\n const pointerDownPos = useRef<{ x: number; y: number } | null>(null);\n const isClickRef = useRef(true);\n const animRef = useRef<ReturnType<typeof animate> | null>(null);\n const wrapperRectRef = useRef<DOMRect | null>(null);\n const scaleRef = useRef(1);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const isActive = isInteracting || isHovered;\n\n // Motion values for imperative animation\n const fillPercent = useMotionValue(percentage);\n const fillWidth = useTransform(fillPercent, (pct) => `${pct}%`);\n const handleLeft = useTransform(fillPercent, (pct) =>\n `max(5px, calc(${pct}% - 9px))`\n );\n\n // Rubber band motion values\n const rubberStretchPx = useMotionValue(0);\n const rubberBandWidth = useTransform(\n rubberStretchPx,\n (stretch) => `calc(100% + ${Math.abs(stretch)}px)`\n );\n const rubberBandX = useTransform(\n rubberStretchPx,\n (stretch) => (stretch < 0 ? stretch : 0)\n );\n\n // Sync from props when not interacting (skip if spring animation is active)\n useEffect(() => {\n if (!isInteracting && !animRef.current) {\n fillPercent.jump(percentage);\n }\n }, [percentage, isInteracting, fillPercent]);\n\n const positionToValue = useCallback(\n (clientX: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return value;\n const screenX = clientX - rect.left;\n const sceneX = screenX / scaleRef.current;\n const nativeWidth = wrapperRef.current ? wrapperRef.current.offsetWidth : rect.width;\n const percent = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min + percent * (max - min);\n return Math.max(min, Math.min(max, rawValue));\n },\n [min, max, value]\n );\n\n const percentFromValue = useCallback(\n (v: number) => ((v - min) / (max - min)) * 100,\n [min, max]\n );\n\n const computeRubberStretch = useCallback(\n (clientX: number, sign: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return 0;\n const distancePast =\n sign < 0 ? rect.left - clientX : clientX - rect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return (\n sign *\n MAX_STRETCH *\n Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0))\n );\n },\n []\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (showInput) return;\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos.current = { x: e.clientX, y: e.clientY };\n isClickRef.current = true;\n setIsInteracting(true);\n\n // Capture wrapper rect at pointer down for stable reference\n if (wrapperRef.current) {\n wrapperRectRef.current = wrapperRef.current.getBoundingClientRect();\n const nativeWidth = wrapperRef.current.offsetWidth;\n scaleRef.current = wrapperRectRef.current.width / nativeWidth;\n }\n },\n [showInput]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting || !pointerDownPos.current) return;\n\n const dx = e.clientX - pointerDownPos.current.x;\n const dy = e.clientY - pointerDownPos.current.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickRef.current && distance > CLICK_THRESHOLD) {\n isClickRef.current = false;\n setIsDragging(true);\n }\n\n if (!isClickRef.current) {\n // Drag mode — instant update\n const rect = wrapperRectRef.current;\n if (rect) {\n if (e.clientX < rect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > rect.right) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const newValue = positionToValue(e.clientX);\n const newPct = percentFromValue(newValue);\n if (animRef.current) {\n animRef.current.stop();\n animRef.current = null;\n }\n fillPercent.jump(newPct);\n onChange(roundValue(newValue, step));\n }\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n fillPercent,\n rubberStretchPx,\n computeRubberStretch,\n ]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting) return;\n\n if (isClickRef.current) {\n // When steps are coarse (≤10 positions), click snaps to the nearest step.\n // Otherwise, the original decile-magnetic behavior is preserved\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max - min) / step;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min, Math.min(max, min + Math.round((rawValue - min) / step) * step))\n : snapToDecile(rawValue, min, max);\n\n const newPct = percentFromValue(snappedValue);\n\n if (animRef.current) {\n animRef.current.stop();\n }\n animRef.current = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => { animRef.current = null; },\n });\n onChange(roundValue(snappedValue, step));\n }\n\n // Spring rubber band back\n if (rubberStretchPx.get() !== 0) {\n animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n setIsInteracting(false);\n setIsDragging(false);\n pointerDownPos.current = null;\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n min,\n max,\n fillPercent,\n rubberStretchPx,\n ]\n );\n\n // Handle value hover delay for editable state\n useEffect(() => {\n if (isValueHovered && !showInput && !isValueEditable) {\n hoverTimeoutRef.current = setTimeout(() => {\n setIsValueEditable(true);\n }, 800);\n } else if (!isValueHovered && !showInput) {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setIsValueEditable(false);\n }\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n }, [isValueHovered, showInput, isValueEditable]);\n\n // Focus input when it appears\n useEffect(() => {\n if (showInput && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [showInput]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue);\n if (!isNaN(parsed)) {\n const clamped = Math.max(min, Math.min(max, parsed));\n onChange(roundValue(clamped, step));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: React.MouseEvent) => {\n if (isValueEditable) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(value.toFixed(decimalsForStep(step)));\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleInputSubmit();\n } else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const handleInputBlur = () => {\n handleInputSubmit();\n };\n\n const displayValue = value.toFixed(decimalsForStep(step));\n\n // Handle opacity: not active → 0, active → 0.5, dragging → 0.9\n // Value dodge: fade when handle overlaps label (left) or value (right)\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n let leftThreshold = 30;\n let rightThreshold = 78;\n const trackWidth = wrapperRef.current?.offsetWidth;\n if (trackWidth && trackWidth > 0) {\n if (labelRef.current) {\n leftThreshold = ((LABEL_CSS_LEFT + labelRef.current.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n if (valueSpanRef.current) {\n rightThreshold = ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.current.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n }\n const valueDodge = percentage < leftThreshold || percentage > rightThreshold;\n const handleOpacity = !isActive\n ? 0\n : valueDodge\n ? 0.1\n : isDragging\n ? 0.9\n : 0.5;\n\n // The ≤ 10 threshold separates discrete sliders\n // (like step=2 on a 0–10 range → 5 steps) from continuous ones.\n const discreteSteps = (max - min) / step;\n const hashMarks = discreteSteps <= 10\n ? Array.from({ length: discreteSteps - 1 }, (_, i) => {\n const pct = ((i + 1) * step) / (max - min) * 100;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n })\n : Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"dialkit-slider-wrapper\">\n <motion.div\n ref={trackRef}\n className={`dialkit-slider ${isActive ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ width: rubberBandWidth, x: rubberBandX }}\n >\n <div className=\"dialkit-slider-hashmarks\">{hashMarks}</div>\n\n <motion.div\n className=\"dialkit-slider-fill\"\n style={{\n width: fillWidth,\n }}\n />\n\n <motion.div\n className=\"dialkit-slider-handle\"\n style={{\n left: handleLeft,\n y: '-50%',\n }}\n animate={{\n opacity: handleOpacity,\n scaleX: isActive ? 1 : 0.25,\n scaleY: isActive && valueDodge ? 0.75 : 1,\n }}\n transition={{\n scaleX: { type: 'spring', visualDuration: 0.25, bounce: 0.15 },\n scaleY: { type: 'spring', visualDuration: 0.2, bounce: 0.1 },\n opacity: { duration: 0.15 },\n }}\n />\n\n <span ref={labelRef} className=\"dialkit-slider-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatSliderShortcut(shortcut)}\n </span>\n )}\n </span>\n\n {showInput ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dialkit-slider-input\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputBlur}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n className={`dialkit-slider-value ${isValueEditable ? 'dialkit-slider-value-editable' : ''}`}\n onMouseEnter={() => setIsValueHovered(true)}\n onMouseLeave={() => setIsValueHovered(false)}\n onClick={handleValueClick}\n onPointerDown={(e) => isValueEditable && e.stopPropagation()}\n onMouseDown={(e) => isValueEditable && e.stopPropagation()}\n style={{ cursor: isValueEditable ? 'text' : 'default' }}\n >\n {displayValue}\n </span>\n )}\n </motion.div>\n </div>\n );\n}\n","import { useRef, useState, useLayoutEffect, useCallback } from 'react';\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: SegmentedControlProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const hasAnimated = useRef(false);\n const [pillStyle, setPillStyle] = useState<{ left: number; width: number } | null>(null);\n\n const measure = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n const activeButton = container.querySelector('[data-active=\"true\"]') as HTMLElement | null;\n if (!activeButton) return;\n setPillStyle({\n left: activeButton.offsetLeft,\n width: activeButton.offsetWidth,\n });\n }, []);\n\n useLayoutEffect(() => {\n measure();\n }, [value, options.length, measure]);\n\n // Enable transition after first render\n const shouldAnimate = hasAnimated.current;\n hasAnimated.current = true;\n\n return (\n <div className=\"dialkit-segmented\" ref={containerRef}>\n {pillStyle && (\n <div\n className=\"dialkit-segmented-pill\"\n style={{\n left: pillStyle.left,\n width: pillStyle.width,\n transition: shouldAnimate\n ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'\n : 'none',\n }}\n />\n )}\n\n {options.map((option) => {\n const isActive = value === option.value;\n return (\n <button\n key={option.value}\n onClick={() => onChange(option.value)}\n className=\"dialkit-segmented-button\"\n data-active={String(isActive)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { formatToggleShortcut } from '../shortcut-utils';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nexport function Toggle({ label, checked, onChange, shortcut, shortcutActive }: ToggleProps) {\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatToggleShortcut(shortcut)}\n </span>\n )}\n </span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={checked ? 'on' : 'off'}\n onChange={(val) => onChange(val === 'on')}\n />\n </div>\n );\n}\n","// Deterministic sampling of transition curves, used for timeline scrubbing.\n// Springs use the closed-form damped-harmonic-oscillator solution with\n// Motion's own visualDuration/bounce → stiffness/damping mapping, so a\n// scrubbed position matches what Motion plays.\n\nimport { isEasingConfigValue, isSpringConfigValue } from './store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from './store/DialStore';\n\nexport type SpringParams = { stiffness: number; damping: number; mass: number };\n\nexport function round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function isTransitionConfig(value: unknown): value is TransitionConfig {\n return isSpringConfigValue(value) || isEasingConfigValue(value);\n}\n\nexport function isPhysicsSpring(transition: TransitionConfig): boolean {\n return (\n transition.type === 'spring' &&\n (transition.stiffness !== undefined || transition.damping !== undefined || transition.mass !== undefined)\n );\n}\n\nexport function springParams(spring: SpringConfig): SpringParams {\n if (isPhysicsSpring(spring)) {\n return { stiffness: spring.stiffness ?? 200, damping: spring.damping ?? 25, mass: spring.mass ?? 1 };\n }\n // Motion's mapping (motion-dom spring generator)\n const visualDuration = Math.max(0.05, spring.visualDuration ?? 0.3);\n const bounce = spring.bounce ?? 0.3;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 * Math.min(1, Math.max(0.05, 1 - bounce)) * Math.sqrt(stiffness);\n return { stiffness, damping, mass: 1 };\n}\n\n/** Normalized spring position 0 → 1 (may overshoot), starting at rest. */\nexport function springProgress(t: number, { stiffness, damping, mass }: SpringParams): number {\n if (t <= 0) return 0;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n if (zeta < 0.9999) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta < 1.0001) {\n return 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n }\n const wd = w0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * w0 + wd;\n const r2 = -zeta * w0 - wd;\n return 1 + (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r1 - r2);\n}\n\n/** Estimated time for a spring to visually settle (within 0.5% of target). */\nexport function springSettleDuration(params: SpringParams): number {\n const w0 = Math.sqrt(params.stiffness / params.mass);\n const zeta = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const decay =\n zeta >= 1\n ? zeta * w0 - w0 * Math.sqrt(Math.max(0, zeta * zeta - 1)) // slowest exponent\n : zeta * w0;\n const duration = Math.log(200) / Math.max(decay, 1e-6);\n return round2(clamp(duration, 0.05, 10));\n}\n\n/** Eased progress of a cubic-bezier easing at linear progress p (0–1). */\nexport function cubicBezierProgress(p: number, [x1, y1, x2, y2]: [number, number, number, number]): number {\n if (p <= 0) return 0;\n if (p >= 1) return 1;\n // Solve the bezier's parameter t for x = p (Newton-Raphson, bisection fallback)\n const sampleX = (t: number) => bezierAxis(t, x1, x2);\n const sampleY = (t: number) => bezierAxis(t, y1, y2);\n\n let t = p;\n for (let i = 0; i < 8; i++) {\n const x = sampleX(t) - p;\n if (Math.abs(x) < 1e-5) return sampleY(t);\n const dx = bezierAxisDerivative(t, x1, x2);\n if (Math.abs(dx) < 1e-6) break;\n t -= x / dx;\n }\n\n let lo = 0;\n let hi = 1;\n t = p;\n while (hi - lo > 1e-5) {\n if (sampleX(t) < p) lo = t;\n else hi = t;\n t = (lo + hi) / 2;\n }\n return sampleY(t);\n}\n\nfunction bezierAxis(t: number, a1: number, a2: number): number {\n return ((1 - 3 * a2 + 3 * a1) * t * t * t) + ((3 * a2 - 6 * a1) * t * t) + (3 * a1 * t);\n}\n\nfunction bezierAxisDerivative(t: number, a1: number, a2: number): number {\n return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1;\n}\n\nexport type ResolvedClipTransition = {\n /** Motion-ready transition with its duration driven by the clip length. */\n transition: TransitionConfig;\n /** Effective clip duration — the bar length. Derived for physics springs. */\n duration: number;\n /** Physics springs have emergent duration; the bar is derived, not resizable. */\n isPhysics: boolean;\n};\n\n// The bar IS the duration: time-mode springs get visualDuration from the\n// clip length, easings get duration from it, and physics springs derive\n// the clip length from their settle time.\nexport function resolveClipTransition(\n raw: TransitionConfig,\n clipDuration: number\n): ResolvedClipTransition {\n const safeDuration = Math.max(0.05, clipDuration);\n\n if (raw.type === 'easing') {\n return {\n transition: { ...raw, duration: safeDuration } as EasingConfig,\n duration: safeDuration,\n isPhysics: false,\n };\n }\n if (isPhysicsSpring(raw)) {\n return {\n transition: raw,\n duration: springSettleDuration(springParams(raw)),\n isPhysics: true,\n };\n }\n return {\n transition: { type: 'spring', bounce: raw.bounce ?? 0.2, visualDuration: safeDuration },\n duration: safeDuration,\n isPhysics: false,\n };\n}\n\n/**\n * Eased progress of a clip's transition at `elapsed` seconds after its start.\n * Springs keep evolving past the bar (bounce tail) and converge to 1;\n * easings clamp at 1. May overshoot 1 for bouncy curves.\n */\nexport function transitionProgress(\n elapsed: number,\n duration: number,\n transition: TransitionConfig | undefined\n): number {\n if (elapsed <= 0) return 0;\n if (!transition) {\n return duration > 0 ? Math.min(1, elapsed / duration) : 1;\n }\n if (transition.type === 'easing') {\n return cubicBezierProgress(Math.min(1, duration > 0 ? elapsed / duration : 1), transition.ease);\n }\n const params = springParams(transition);\n // Snap to done once settled so late samples are exactly 1\n if (elapsed >= springSettleDuration(params)) return 1;\n return springProgress(elapsed, params);\n}\n","import { SpringConfig } from '../store/DialStore';\nimport { springParams, springProgress } from '../transition-math';\n\ninterface SpringVisualizationProps {\n spring: SpringConfig;\n isSimpleMode: boolean;\n}\n\nexport function SpringVisualization({ spring, isSimpleMode }: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n // Same param mapping and closed-form curve as timeline scrubbing, so the\n // preview shows exactly the physics that plays.\n const params = isSimpleMode\n ? springParams({ type: 'spring', visualDuration: spring.visualDuration ?? 0.3, bounce: spring.bounce ?? 0.2 })\n : springParams({ type: 'spring', stiffness: spring.stiffness ?? 400, damping: spring.damping ?? 17, mass: spring.mass ?? 1 });\n\n const duration = 2;\n const steps = 100;\n const points: [number, number][] = [];\n for (let i = 0; i <= steps; i++) {\n const time = (i / steps) * duration;\n points.push([time, springProgress(time, params)]);\n }\n\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n const pathData = points\n .map(([time, value], i) => {\n const x = (time / duration) * width;\n const normalizedValue = (value - minValue) / (valueRange || 1);\n const y = height - (normalizedValue * height * 0.6 + height * 0.2);\n return `${i === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n\n const gridLines = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n gridLines.push(\n <line key={`v-${i}`} x1={x} y1={0} x2={x} y2={height} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />,\n <line key={`h-${i}`} x1={0} y1={y} x2={width} y2={y} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} className=\"dialkit-spring-viz\">\n {gridLines}\n <line\n x1={0}\n y1={height / 2}\n x2={width}\n y2={height / 2}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n <path\n d={pathData}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SpringConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\n\ninterface SpringControlProps {\n panelId: string;\n path: string;\n label: string;\n spring: SpringConfig;\n onChange: (spring: SpringConfig) => void;\n}\n\nexport function SpringControl({ panelId, path, label, spring, onChange }: SpringControlProps) {\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(\n () => DialStore.getSpringMode(panelId, path),\n [panelId, path]\n );\n const mode = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const isSimpleMode = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n simple: spring.visualDuration !== undefined ? spring : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: spring.stiffness !== undefined ? spring : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n if (isSimpleMode) {\n cache.current.simple = spring;\n } else {\n cache.current.advanced = spring;\n }\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n DialStore.updateSpringMode(panelId, path, newMode);\n\n if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n // When updating in simple mode, ensure physics props are removed\n if (isSimpleMode) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n } else {\n // When updating in physics mode, ensure time-based props are removed\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <SpringVisualization spring={spring} isSimpleMode={isSimpleMode} />\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isSimpleMode ? (\n <>\n <Slider\n label=\"Duration\"\n value={spring.visualDuration ?? 0.3}\n onChange={(v) => handleUpdate('visualDuration', v)}\n min={0.1}\n max={1}\n step={0.05}\n unit=\"s\"\n />\n <Slider\n label=\"Bounce\"\n value={spring.bounce ?? 0.2}\n onChange={(v) => handleUpdate('bounce', v)}\n min={0}\n max={1}\n step={0.05}\n />\n </>\n ) : (\n <>\n <Slider\n label=\"Stiffness\"\n value={spring.stiffness ?? 400}\n onChange={(v) => handleUpdate('stiffness', v)}\n min={1}\n max={1000}\n step={10}\n />\n <Slider\n label=\"Damping\"\n value={spring.damping ?? 17}\n onChange={(v) => handleUpdate('damping', v)}\n min={1}\n max={100}\n step={1}\n />\n <Slider\n label=\"Mass\"\n value={spring.mass ?? 1}\n onChange={(v) => handleUpdate('mass', v)}\n min={0.1}\n max={10}\n step={0.1}\n />\n </>\n )}\n </div>\n </Folder>\n );\n}\n","import { EasingConfig } from '../store/DialStore';\n\ninterface EasingVisualizationProps {\n easing: EasingConfig;\n}\n\nconst easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization({ easing }: EasingVisualizationProps) {\n const ease = easing.ease;\n\n const s = 200;\n const pad = 10;\n const inner = s - pad * 2;\n const unit = inner / 2; // [-0.5, 1.5] = 2 units on each axis\n\n // Equal scaling on both axes → 45° diagonal. [0,1] centered in [-0.5, 1.5].\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(ease[0], ease[1]);\n const p2 = toSvg(ease[2], ease[3]);\n\n const curvePath = `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n\n return (\n <svg\n viewBox={`0 0 ${s} ${s}`}\n preserveAspectRatio=\"xMidYMid slice\"\n className=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x} y1={start.y} x2={end.x} y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n\n <path d={curvePath} fill=\"none\" stroke=\"rgba(255, 255, 255, 0.6)\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport { easingPresets };\n","import { SpringConfig, EasingConfig, TransitionConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\nimport { useCallback, useRef, useState, useSyncExternalStore } from 'react';\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n /** Hide duration sliders when something else owns the duration (e.g. a timeline clip bar). */\n hideDuration?: boolean;\n /** Route duration edits through an external owner while keeping this control's layout. */\n durationControl?: {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n };\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl({\n panelId,\n path,\n label,\n value,\n onChange,\n hideDuration = false,\n durationControl,\n}: TransitionControlProps) {\n const subscribe = useCallback(\n (callback: () => void) => DialStore.subscribe(panelId, callback),\n [panelId]\n );\n const getSnapshot = useCallback(\n () => DialStore.getTransitionMode(panelId, path),\n [panelId, path]\n );\n const mode = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const isEasing = mode === 'easing';\n const isSimpleSpring = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n easing: EasingConfig;\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n easing: value.type === 'easing' ? value : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] },\n simple: value.type === 'spring' && value.visualDuration !== undefined ? value : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: value.type === 'spring' && value.stiffness !== undefined ? value : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n // Keep cache up to date with current edits\n if (isEasing && value.type === 'easing') {\n cache.current.easing = value;\n } else if (isSimpleSpring && value.type === 'spring') {\n cache.current.simple = value;\n } else if (mode === 'advanced' && value.type === 'spring') {\n cache.current.advanced = value;\n }\n\n const spring: SpringConfig = value.type === 'spring' ? value : cache.current.simple;\n const easing: EasingConfig = value.type === 'easing' ? value : cache.current.easing;\n\n const handleModeChange = (newMode: CurveMode) => {\n DialStore.updateTransitionMode(panelId, path, newMode);\n\n if (newMode === 'easing') {\n onChange(cache.current.easing);\n } else if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, val: number) => {\n if (isSimpleSpring) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n } else {\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n }\n };\n\n const updateEase = (index: number, val: number) => {\n const newEase = [...easing.ease] as [number, number, number, number];\n newEase[index] = val;\n onChange({ ...easing, ease: newEase });\n };\n\n const durationSlider = !hideDuration && (isEasing || isSimpleSpring) ? (\n <Slider\n label=\"Duration\"\n value={durationControl?.value ?? (isEasing ? easing.duration : spring.visualDuration ?? 0.3)}\n onChange={durationControl?.onChange ?? ((next) => {\n if (isEasing) onChange({ ...easing, duration: next });\n else handleSpringUpdate('visualDuration', next);\n })}\n min={durationControl?.min ?? 0.1}\n max={durationControl?.max ?? (isEasing ? 2 : 1)}\n step={durationControl?.step ?? 0.05}\n unit=\"s\"\n />\n ) : null;\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {isEasing ? (\n <EasingVisualization easing={easing} />\n ) : (\n <SpringVisualization spring={spring} isSimpleMode={isSimpleSpring} />\n )}\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing' as const, label: 'Easing' },\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isEasing ? (\n <>\n <Slider label=\"x1\" value={easing.ease[0]} onChange={(v) => updateEase(0, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing.ease[1]} onChange={(v) => updateEase(1, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing.ease[2]} onChange={(v) => updateEase(2, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing.ease[3]} onChange={(v) => updateEase(3, v)} min={-1} max={2} step={0.01} />\n <EaseTextInput ease={easing.ease} onChange={(newEase) => onChange({ ...easing, ease: newEase })} />\n </>\n ) : isSimpleSpring ? (\n <Slider label=\"Bounce\" value={spring.bounce ?? 0.2} onChange={(v) => handleSpringUpdate('bounce', v)} min={0} max={1} step={0.05} />\n ) : (\n <>\n <Slider label=\"Stiffness\" value={spring.stiffness ?? 400} onChange={(v) => handleSpringUpdate('stiffness', v)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring.damping ?? 17} onChange={(v) => handleSpringUpdate('damping', v)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring.mass ?? 1} onChange={(v) => handleSpringUpdate('mass', v)} min={0.1} max={10} step={0.1} />\n </>\n )}\n {durationSlider}\n </div>\n </Folder>\n );\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map(v => parseFloat(v.toFixed(2))).join(', ');\n}\n\nfunction parseEase(str: string): [number, number, number, number] | null {\n const parts = str.split(',').map(s => parseFloat(s.trim()));\n if (parts.length === 4 && parts.every(n => !isNaN(n))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nfunction EaseTextInput({ ease, onChange }: { ease: [number, number, number, number]; onChange: (ease: [number, number, number, number]) => void }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const handleFocus = () => {\n setDraft(formatEase(ease));\n setEditing(true);\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft);\n if (parsed) onChange(parsed);\n setEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={editing ? draft : formatEase(ease)}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n />\n </div>\n );\n}\n","interface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl({ label, value, onChange, placeholder }: TextControlProps) {\n return (\n <div className=\"dialkit-text-control\">\n <label className=\"dialkit-text-label\">{label}</label>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../dropdown-position';\nimport { ICON_CHEVRON } from '../icons';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl({ label, value, options, onChange }: SelectControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n const [pos, setPos] = useState<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const normalized = normalizeOptions(options);\n const selectedOption = normalized.find((o) => o.value === value);\n\n const updatePos = useCallback(() => {\n const el = triggerRef.current;\n if (!el || !portalTarget) return;\n // Estimate dropdown height: 8px padding + 36px per option\n const dropdownHeight = 8 + normalized.length * 36;\n setPos(getDropdownPosition(el, portalTarget, { dropdownHeight }));\n }, [normalized.length, portalTarget]);\n\n // Resolve portal target (closest .dialkit-root)\n useEffect(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef.current) ?? document.body);\n }, []);\n\n // Position dropdown when opening\n useEffect(() => {\n if (!isOpen) return;\n updatePos();\n }, [isOpen, updatePos]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n dropdownRef.current && !dropdownRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n return (\n <div className=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n className=\"dialkit-select-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n data-open={String(isOpen)}\n >\n <span className=\"dialkit-select-label\">{label}</span>\n <div className=\"dialkit-select-right\">\n <span className=\"dialkit-select-value\">{selectedOption?.label ?? value}</span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </div>\n </button>\n\n {portalTarget && createPortal(\n <AnimatePresence>\n {isOpen && pos && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-select-dropdown\"\n initial={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n style={{\n position: 'absolute',\n left: pos.left,\n top: pos.top,\n width: pos.width,\n transformOrigin: pos.above ? 'bottom' : 'top',\n }}\n >\n {normalized.map((option) => (\n <button\n key={option.value}\n className=\"dialkit-select-option\"\n data-selected={String(option.value === value)}\n onClick={() => {\n onChange(option.value);\n setIsOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n portalTarget\n )}\n </div>\n );\n}\n","export type DropdownPosition = {\n top: number;\n left: number;\n width: number;\n above: boolean;\n};\n\nexport type DropdownPositionOptions = {\n dropdownHeight?: number;\n gap?: number;\n allowAbove?: boolean;\n};\n\nexport function getDropdownPosition(\n trigger: HTMLElement,\n portalRoot: HTMLElement,\n options: DropdownPositionOptions = {}\n): DropdownPosition {\n const { dropdownHeight = 0, gap = 4, allowAbove = true } = options;\n const triggerRect = trigger.getBoundingClientRect();\n const rootRect = portalRoot.getBoundingClientRect();\n const spaceBelow = window.innerHeight - triggerRect.bottom - gap;\n const above = allowAbove && spaceBelow < dropdownHeight && triggerRect.top > spaceBelow;\n\n return {\n top: above\n ? triggerRect.top - rootRect.top - dropdownHeight - gap\n : triggerRect.bottom - rootRect.top + gap,\n left: triggerRect.left - rootRect.left,\n width: triggerRect.width,\n above,\n };\n}\n\nexport function getDialKitPortalRoot(trigger: HTMLElement | null | undefined): HTMLElement | null {\n return (trigger?.closest('.dialkit-root') as HTMLElement | null) ?? null;\n}\n","import { useState, useRef, useEffect } from 'react';\n\ninterface ColorControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\n\nexport function ColorControl({ label, value, onChange }: ColorControlProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const colorInputRef = useRef<HTMLInputElement>(null);\n\n // Sync editValue when value changes externally\n useEffect(() => {\n if (!isEditing) {\n setEditValue(value);\n }\n }, [value, isEditing]);\n\n function handleTextSubmit() {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue)) {\n onChange(editValue);\n } else {\n setEditValue(value);\n }\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleTextSubmit();\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(value);\n }\n }\n\n return (\n <div className=\"dialkit-color-control\">\n <span className=\"dialkit-color-label\">{label}</span>\n <div className=\"dialkit-color-inputs\">\n {isEditing ? (\n <input\n type=\"text\"\n className=\"dialkit-color-hex-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autoFocus\n />\n ) : (\n <span\n className=\"dialkit-color-hex\"\n onClick={() => setIsEditing(true)}\n >\n {(value ?? '').toUpperCase()}\n </span>\n )}\n <button\n className=\"dialkit-color-swatch\"\n style={{ backgroundColor: value }}\n onClick={() => colorInputRef.current?.click()}\n title=\"Pick color\"\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n className=\"dialkit-color-picker-native\"\n value={value.length === 4 ? expandShorthandHex(value) : value.slice(0, 7)}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n );\n}\n\nfunction expandShorthandHex(hex: string): string {\n if (hex.length !== 4) return hex;\n return `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, Preset } from '../store/DialStore';\nimport { ICON_CHEVRON, ICON_TRASH } from '../icons';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager({ panelId, presets, activePresetId, onAdd }: PresetManagerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, left: 0, width: 0 });\n\n const hasPresets = presets.length > 0;\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n const open = useCallback(() => {\n if (!hasPresets) return;\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }\n setIsOpen(true);\n }, [hasPresets]);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on any mousedown outside trigger + dropdown\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(panelId, presetId);\n } else {\n DialStore.clearActivePreset(panelId);\n }\n close();\n };\n\n const handleDelete = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(panelId, presetId);\n };\n\n return (\n <div className=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n className=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(isOpen)}\n data-has-preset={String(!!activePreset)}\n data-disabled={String(!hasPresets)}\n >\n <span className=\"dialkit-preset-label\">\n {activePreset ? activePreset.name : 'Version 1'}\n </span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0, opacity: hasPresets ? 0.6 : 0.25 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-preset-dropdown\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, minWidth: pos.width }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div\n className=\"dialkit-preset-item\"\n data-active={String(!activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span className=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n {presets.map((preset) => (\n <div\n key={preset.id}\n className=\"dialkit-preset-item\"\n data-active={String(preset.id === activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span className=\"dialkit-preset-name\">{preset.name}</span>\n <button\n className=\"dialkit-preset-delete\"\n onClick={(e) => handleDelete(e, preset.id)}\n title=\"Delete preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_TRASH.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </button>\n </div>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </div>\n );\n}\n","import { useCallback, useSyncExternalStore } from 'react';\nimport { motion } from 'motion/react';\nimport { ICON_TIMELINE } from '../../icons';\nimport { TimelineUiStore } from '../../store/TimelineUiStore';\n\nexport function TimelineToggleButton() {\n const subscribe = useCallback(\n (listener: () => void) => TimelineUiStore.subscribe(listener),\n []\n );\n const getVisible = useCallback(() => TimelineUiStore.getVisible(), []);\n const visible = useSyncExternalStore(subscribe, getVisible, getVisible);\n const label = visible ? 'Hide timeline' : 'Show timeline';\n\n return (\n <motion.button\n className=\"dialkit-toolbar-add dialkit-timeline-toolbar-toggle\"\n data-active={visible || undefined}\n aria-pressed={visible}\n aria-label={label}\n title={label}\n onClick={() => TimelineUiStore.toggle()}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n {ICON_TIMELINE.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </svg>\n </motion.button>\n );\n}\n","type Listener = () => void;\n\ntype VisibilityController = {\n visible?: boolean;\n defaultVisible: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n};\n\n/**\n * UI-only state shared by the toolkit root and the timeline portal.\n * Playback deliberately lives elsewhere: hiding the editor must never pause\n * or otherwise change the animation it is inspecting.\n */\nclass TimelineUiStoreClass {\n private visible = true;\n private initialized = false;\n private controllers = new Map<symbol, VisibilityController>();\n private listeners = new Set<Listener>();\n\n getVisible(): boolean {\n for (const controller of this.controllers.values()) {\n if (controller.visible !== undefined) return controller.visible;\n }\n return this.visible;\n }\n\n registerController(id: symbol, controller: VisibilityController): () => void {\n const previous = this.getVisible();\n if (!this.initialized) {\n this.visible = controller.defaultVisible;\n this.initialized = true;\n }\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n\n return () => {\n const before = this.getVisible();\n this.controllers.delete(id);\n if (this.controllers.size === 0) this.initialized = false;\n if (before !== this.getVisible()) this.notify();\n };\n }\n\n updateController(id: symbol, controller: VisibilityController): void {\n if (!this.controllers.has(id)) return;\n const previous = this.getVisible();\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n }\n\n requestVisible(visible: boolean): void {\n const current = this.getVisible();\n if (current === visible) return;\n\n const controlled = Array.from(this.controllers.values()).filter(\n (controller) => controller.visible !== undefined\n );\n if (controlled.length > 0) {\n controlled.forEach((controller) => controller.onVisibilityChange?.(visible));\n return;\n }\n\n this.visible = visible;\n this.controllers.forEach((controller) => controller.onVisibilityChange?.(visible));\n this.notify();\n }\n\n toggle(): void {\n this.requestVisible(!this.getVisible());\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport const TimelineUiStore = /* @__PURE__ */ new TimelineUiStoreClass();\n","export type PanelDragOffset = {\n x: number;\n y: number;\n};\n\nexport type PanelDragStart = {\n pointerX: number;\n pointerY: number;\n elX: number;\n elY: number;\n};\n\nexport type PanelDragOriginX = 'left' | 'right';\n\nconst PANEL_DRAG_THRESHOLD = 8;\nconst COLLAPSED_PANEL_SIZE = 42;\n\nconst DRAG_EXCLUSION_SELECTOR = [\n '.dialkit-panel-icon',\n '.dialkit-panel-toolbar',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n '[role=\"button\"]',\n '[contenteditable=\"true\"]',\n].join(',');\n\nexport function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null {\n if (!(target instanceof Element) || !panel) return null;\n\n const inner = target.closest<HTMLElement>('.dialkit-panel-inner');\n if (!inner || !panel.contains(inner)) return null;\n\n if (inner.getAttribute('data-collapsed') === 'true') {\n return inner;\n }\n\n const header = target.closest<HTMLElement>('.dialkit-panel-header');\n if (!header || !inner.contains(header)) return null;\n\n if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;\n\n return header;\n}\n\nexport function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart {\n const rect = panel.getBoundingClientRect();\n return {\n pointerX,\n pointerY,\n elX: rect.left,\n elY: rect.top,\n };\n}\n\nexport function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset {\n return {\n x: start.elX + pointerX - start.pointerX,\n y: start.elY + pointerY - start.pointerY,\n };\n}\n\nexport function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean {\n const dx = pointerX - start.pointerX;\n const dy = pointerY - start.pointerY;\n return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;\n}\n\nexport function getPanelOriginX(\n position: string,\n offset: PanelDragOffset | null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : undefined\n): PanelDragOriginX {\n if (offset && viewportWidth) {\n return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? 'left' : 'right';\n }\n\n return position.endsWith('left') ? 'left' : 'right';\n}\n\nexport function blockPanelDragClick(handle: HTMLElement) {\n const blocker = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n handle.addEventListener('click', blocker, { capture: true, once: true });\n window.setTimeout(() => {\n handle.removeEventListener('click', blocker, true);\n }, 0);\n}\n","import { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { TimelineStore } from '../store/TimelineStore';\nimport { computeStaticTimeline, parseTimelineConfig } from '../timeline-core';\nimport type { DialTimelineValues, TimelineConfig } from '../timeline-core';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n resolveTimelineLoop,\n type DialTimelineOptions,\n} from '../timeline/adapter';\nimport { useDialStorePanel, useSerialized } from './useDialStorePanel';\n\nexport type {\n TimelineClipConfig,\n TimelineClipCss,\n TimelineClipLoop,\n TimelineClipValues,\n TimelineConfig,\n TimelineGroupConfig,\n TimelineGroupValues,\n TimelinePropConfig,\n TimelinePropStepConfig,\n TimelineStepConfig,\n TimelineStepValues,\n DialTimelineValues,\n} from '../timeline-core';\n\nexport type UseDialTimelineOptions = DialTimelineOptions;\n\nexport function useDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: UseDialTimelineOptions\n): DialTimelineValues<T> {\n const serializedConfig = useSerialized(config);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const parsed = useMemo(() => parseTimelineConfig(config), [serializedConfig]);\n\n // Clip values live in DialStore under the timeline's panel id, so presets,\n // persistence, reset, and copy all work on timing data for free.\n const { panelId, flatValues } = useDialStorePanel(name, parsed.dialConfig, {\n id: options?.id,\n persist: options?.persist,\n kind: 'timeline',\n });\n\n // Edit-time pass: resolve all stored values and let live, emergent durations\n // (notably physics springs) extend the authored timeline window. This only\n // re-runs when a value is edited — never merely because the clock ticks.\n const staticTimeline = useMemo(\n () => computeStaticTimeline(parsed, flatValues),\n [parsed, flatValues]\n );\n const timelineDuration = staticTimeline.duration;\n const staticClips = staticTimeline.clips;\n\n const parsedRef = useRef(parsed);\n parsedRef.current = parsed;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const { start: loopStart } = resolveTimelineLoop(options?.loop);\n\n const buildMeta = useCallback(\n () => buildTimelineMeta(panelId, name, timelineDuration, parsedRef.current, options?.loop),\n [panelId, name, timelineDuration, options?.loop]\n );\n\n // Transport registration mirrors the panel lifecycle: register on mount,\n // push structure changes without resetting the playhead. The register\n // effect reads buildMeta through a ref so meta changes (loop, structure)\n // flow through update() below instead of re-registering — a re-register\n // would reset the playhead.\n const buildMetaRef = useRef(buildMeta);\n buildMetaRef.current = buildMeta;\n useEffect(() => {\n TimelineStore.register(buildMetaRef.current(), { autoplay: optionsRef.current?.autoplay ?? true });\n return () => TimelineStore.unregister(panelId);\n }, [panelId, name]);\n\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n TimelineStore.update(buildMeta());\n }, [buildMeta, parsed]);\n\n const subscribeTransport = useCallback(\n (callback: () => void) => TimelineStore.subscribe(panelId, callback),\n [panelId]\n );\n const getTransport = useCallback(() => TimelineStore.getTransport(panelId), [panelId]);\n const transport = useSyncExternalStore(subscribeTransport, getTransport, getTransport);\n\n const play = useCallback(() => TimelineStore.play(panelId), [panelId]);\n const pause = useCallback(() => TimelineStore.pause(panelId), [panelId]);\n const replay = useCallback(() => TimelineStore.replay(panelId), [panelId]);\n const seek = useCallback((time: number) => TimelineStore.seek(panelId, time), [panelId]);\n\n // Frame pass: only the time-dependent fields, sampling cached curve params.\n return useMemo(\n () => buildTimelineValues<T>(staticClips, transport, timelineDuration, loopStart, {\n play,\n pause,\n replay,\n seek,\n }),\n [staticClips, transport, timelineDuration, loopStart, play, pause, replay, seek]\n );\n}\n","// Framework-agnostic timeline logic: config parsing, value interpolation,\n// and per-frame clip-state derivation. The React hook (and future Solid/\n// Svelte/Vue adapters) stay thin wrappers over this module.\n//\n// The computation is split in two so the 60Hz clock stays cheap:\n// computeStaticClips — everything derivable from stored values alone\n// (runs only when a value is edited)\n// computeClipState — the time-dependent fields for one clip\n// (runs per frame, sampling cached curve params)\n//\n// Internally every animating clip is a sequence of steps: a from/to clip is\n// one implicit step, a `steps` clip is several chained ones, and a `props`\n// clip holds one step-list per property track (each with its own cycle and\n// phase offset). Untouched properties hold their prior value through a step.\n\nimport { formatLabel, inferStep, isHexColor, resolveDialValues } from './store/DialStore';\nimport type { DialConfig, DialValue, ResolvedValues, TransitionConfig } from './store/DialStore';\nimport {\n clamp,\n cubicBezierProgress,\n isPhysicsSpring,\n isTransitionConfig,\n resolveClipTransition,\n round2,\n springParams,\n springProgress,\n springSettleDuration,\n} from './transition-math';\nimport type { SpringParams } from './transition-math';\nimport { TIMELINE_CLIP_COLORS } from './store/TimelineStore';\nimport type { TimelineClipMeta, TimelineClipTrackMeta } from './store/TimelineStore';\n\n// ── Public config types ──\n\n// A clip is a named span on the timeline — one row each: when it starts, how\n// long it runs, and (optionally) the values it animates between plus the\n// curve it animates with. `from`/`to` accept any normal DialKit leaf values\n// (numbers, colors, etc.). Everything is editable by clicking the clip in\n// the dock. Clips with from/to get a default spring transition when none is\n// specified.\n//\n// A looping clip repeats its cycle from `at` until the timeline ends: the\n// bar is one cycle, so dragging it longer slows the loop. A loop that should\n// return to where it started (a bob, a pulse) is written as a sequence whose\n// last step lands back on the starting values — there is no mirror mode.\nexport type TimelineClipLoop = 'off' | 'repeat';\n\n// One leg of a sequence. Only the properties named in `to` animate; every\n// other property holds its value from the previous leg (or `from`).\n// The index allows `undefined` because TypeScript synthesizes `prop?:\n// undefined` union arms for legs that touch different property sets.\nexport type TimelineStepValues = {\n [key: string]: DialConfig[string] | undefined;\n};\n\nexport type TimelineStepConfig = {\n duration?: number;\n to?: TimelineStepValues;\n transition?: TransitionConfig;\n};\n\n// Independent per-property tracks. When one object's properties animate\n// with different timing, each property is a full track: its own values,\n// duration, curve, and a `delay` offset from the clip's `at` (a phase shift\n// for looping clips). The clip row becomes a read-only composite of its\n// tracks; editing happens on the tracks. Properties that share timing\n// belong in a plain from/to/steps clip instead.\nexport type TimelinePropStepConfig = {\n duration?: number;\n to?: number | string;\n transition?: TransitionConfig;\n};\n\nexport type TimelinePropConfig = {\n from?: number | string;\n to?: number | string;\n duration?: number;\n /** Offset from the clip's `at` in seconds. */\n delay?: number;\n transition?: TransitionConfig;\n steps?: TimelinePropStepConfig[];\n};\n\ntype TimelineClipBase = {\n at: number;\n duration?: number;\n transition?: TransitionConfig;\n loop?: boolean | TimelineClipLoop;\n};\n\n// The three clip shapes are mutually exclusive, encoded with optional-never\n// fields so TypeScript rejects ambiguous combinations (`steps` + `to`,\n// `props` + `from`, …) at the call site. Parse warns for untyped consumers.\nexport type TimelineClipConfig = TimelineClipBase &\n (\n | {\n from?: DialConfig;\n to?: DialConfig;\n steps?: never;\n props?: never;\n }\n | {\n from?: DialConfig;\n to?: never;\n /** Sequential legs on one row — a segmented bar; boundaries retime legs. */\n steps: TimelineStepConfig[];\n props?: never;\n }\n | {\n from?: never;\n to?: never;\n steps?: never;\n /** Independent per-property tracks — mutually exclusive with from/to/steps. */\n props: { [prop: string]: TimelinePropConfig };\n }\n );\n\n/** Nested keys group clips into a collapsible layer — purely presentational. */\nexport type TimelineGroupConfig = {\n [key: string]: TimelineClipConfig;\n};\n\nexport type TimelineConfig = {\n /** Total timeline length in seconds. Inferred from the last clip when omitted. */\n duration?: number;\n} & {\n [key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;\n};\n\n/** CSS-friendly output for consumers not using Motion — spread into a style. */\nexport type TimelineClipCss = {\n transitionDuration: string;\n transitionTimingFunction: string;\n};\n\nexport type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {\n at: number;\n duration: number;\n /** Effective code-defined loop mode. */\n loop: TimelineClipLoop;\n /** Playhead is at or past the clip start. */\n started: boolean;\n /** Playhead is inside the clip — for looping clips, inside any cycle. */\n active: boolean;\n /** Playhead is past the clip end (for looping clips, past the timeline end). */\n done: boolean;\n /**\n * 0–1 position of the playhead within the clip — cycle progress (a\n * sawtooth) for looping clips, sequence progress for steps clips.\n */\n progress: number;\n /** Index of the leg under the playhead, for sequence clips. */\n step: C['steps'] extends TimelineStepConfig[] ? number : undefined;\n from: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : undefined;\n to: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? ResolvedValues<C['to']>\n : undefined;\n /** `to` once the clip has started, `from` before — hand it to Motion's animate.\n * For sequences this is the final merged state; for props clips, per-track\n * endpoint records. */\n animate: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string> | undefined\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : ResolvedValues<C['to']> | undefined\n : undefined;\n /** The clip's editable curve — single-curve clips only. */\n transition: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TransitionConfig\n : undefined;\n /** Duration + timing-function for native CSS transitions — single-curve clips only. */\n css: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TimelineClipCss\n : undefined;\n /**\n * Values interpolated through the clip's curves at the current playhead —\n * bind to style for true scrubbing: the element is exactly at this point\n * in time whether playing, paused, or scrubbing. Sequence clips report the\n * merged state of all legs (declare every animated property in `from`);\n * props clips report every track's value.\n */\n current: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : undefined\n : undefined;\n};\n\nexport type TimelineGroupValues<G extends TimelineGroupConfig> = {\n [K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<G[K], TimelineClipConfig>\n >;\n};\n\nexport type DialTimelineValues<T extends TimelineConfig> = {\n time: number;\n playing: boolean;\n duration: number;\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<T[K], TimelineClipConfig>\n >;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig\n ? never\n : T[K] extends TimelineGroupConfig\n ? K\n : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;\n};\n\nexport const CLIP_VALUE_STEP = 0.01;\nexport const TIMELINE_MIN_CLIP_DURATION = 0.05;\nconst DEFAULT_STEP_DURATION = 0.3;\nconst DEFAULT_CLIP_TRANSITION: TransitionConfig = { type: 'spring', bounce: 0.2 };\nconst RESERVED_KEYS = new Set(['time', 'playing', 'duration', 'play', 'pause', 'replay', 'seek']);\n\n// ── Config parsing ──\n\nexport type ParsedTimeline = {\n duration: number;\n dialConfig: DialConfig;\n clips: TimelineClipMeta[];\n};\n\nfunction isClipConfig(value: unknown): value is TimelineClipConfig {\n return isPlainObject(value) && Number.isFinite((value as TimelineClipConfig).at);\n}\n\n// A group is a plain object (no `at`) with at least one clip entry — nested\n// one level. Non-clip children are skipped individually (with a warning)\n// rather than invalidating the whole group.\nfunction isGroupConfig(value: unknown): value is TimelineGroupConfig {\n if (!isPlainObject(value) || 'at' in value) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.some(isClipConfig);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, value)\n : fallback;\n}\n\nfunction animatedDuration(value: unknown, fallback = DEFAULT_STEP_DURATION): number {\n return Math.max(TIMELINE_MIN_CLIP_DURATION, nonNegativeFinite(value, fallback));\n}\n\nfunction transitionDefaultDuration(transition: TransitionConfig): number {\n if (transition.type === 'easing') return animatedDuration(transition.duration);\n // Motion gives physics parameters precedence over time parameters when a\n // mixed config reaches it, so duration inference must make the same choice.\n if (isPhysicsSpring(transition)) {\n return animatedDuration(springSettleDuration(springParams(transition)));\n }\n if (transition.visualDuration !== undefined) return animatedDuration(transition.visualDuration);\n return animatedDuration(springSettleDuration(springParams(transition)));\n}\n\n// Bar length defaults: physics always owns its emergent duration. Time-based\n// curves use an explicit bar duration first, then their own duration, then the\n// standard step duration. `inheritedTransition` matters for physics because a\n// step/track can inherit an advanced spring from its parent.\nfunction defaultStepDuration(\n step: { duration?: number; transition?: TransitionConfig },\n inheritedTransition?: TransitionConfig\n): number {\n const curve = step.transition ?? inheritedTransition;\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (step.duration !== undefined) return animatedDuration(step.duration);\n if (step.transition) return transitionDefaultDuration(step.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultTrackDuration(\n track: TimelinePropConfig,\n inheritedTransition?: TransitionConfig\n): number {\n const curve = track.transition ?? inheritedTransition;\n if (track.steps?.length) {\n return track.steps.reduce((sum, step) => sum + defaultStepDuration(step, curve), 0);\n }\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (track.duration !== undefined) return animatedDuration(track.duration);\n if (track.transition) return transitionDefaultDuration(track.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultClipDuration(clip: TimelineClipConfig): number {\n const defaultCurve = isTransitionConfig(clip.transition)\n ? clip.transition\n : DEFAULT_CLIP_TRANSITION;\n if (clip.props) {\n return Object.values(clip.props).reduce(\n (max, track) => Math.max(\n max,\n nonNegativeFinite(track.delay) + defaultTrackDuration(track, defaultCurve)\n ),\n 0\n );\n }\n if (clip.steps?.length) {\n return clip.steps.reduce((sum, step) => sum + defaultStepDuration(step, defaultCurve), 0);\n }\n\n const animating = Boolean(clip.transition || clip.from || clip.to);\n // Marker windows are allowed to be zero-length; actual animations are not.\n if (!animating) return nonNegativeFinite(clip.duration);\n if (isPhysicsSpring(defaultCurve)) return transitionDefaultDuration(defaultCurve);\n if (clip.duration !== undefined) return animatedDuration(clip.duration);\n if (isTransitionConfig(clip.transition)) return transitionDefaultDuration(clip.transition);\n // A from/to clip with neither duration nor transition animates with the\n // default spring, so its bar defaults to that spring's settle time instead\n // of collapsing to the minimum bar length. Markers stay zero-length.\n return clip.from || clip.to ? transitionDefaultDuration(DEFAULT_CLIP_TRANSITION) : 0;\n}\n\nexport function normalizeLoopMode(value: unknown): TimelineClipLoop {\n // `mirror` no longer exists — sequences whose last step returns home\n // replaced it. Legacy values fold into `repeat`.\n if (value === true || value === 'mirror' || value === 'repeat') return 'repeat';\n return 'off';\n}\n\n// The bar owns the duration, so stored transitions carry only their shape:\n// bounce for time springs, physics params as-is, and easings keep their\n// (structural) duration field pinned to the clip length.\nfunction normalizeStoredTransition(transition: TransitionConfig, clipDuration: number): TransitionConfig {\n if (transition.type === 'easing') {\n return { ...transition, duration: clipDuration };\n }\n if (isPhysicsSpring(transition)) {\n return transition;\n }\n return { type: 'spring', bounce: transition.bounce ?? 0.2 };\n}\n\ntype ClipParseEntry = {\n path: string;\n childKey: string;\n group?: string;\n clip: TimelineClipConfig;\n};\n\nfunction collectClipEntries(config: TimelineConfig): ClipParseEntry[] {\n const entries: ClipParseEntry[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (key === 'duration') continue;\n if (RESERVED_KEYS.has(key)) {\n console.warn(`[dialkit] Timeline key \"${key}\" collides with a reserved key and was skipped.`);\n continue;\n }\n if (isClipConfig(value)) {\n entries.push({ path: key, childKey: key, clip: value });\n } else if (isGroupConfig(value)) {\n for (const [childKey, childClip] of Object.entries(value)) {\n if (isClipConfig(childClip)) {\n entries.push({ path: `${key}.${childKey}`, childKey, group: key, clip: childClip });\n } else {\n console.warn(\n `[dialkit] Timeline clip \"${key}.${childKey}\" is missing a numeric \"at\" and was skipped.`\n );\n }\n }\n } else {\n console.warn(\n `[dialkit] Timeline entry \"${key}\" is neither a clip (needs a numeric \"at\") nor a group of clips and was skipped.`\n );\n }\n }\n return entries;\n}\n\n/** Strips explicit-undefined leaves so step targets are safe to merge/range. */\nfunction definedValues(values: TimelineStepValues | undefined): DialConfig | undefined {\n if (!values) return undefined;\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\n\nfunction setDialPath(dialConfig: DialConfig, path: string, value: DialConfig): void {\n const segments = path.split('.');\n let node = dialConfig;\n for (const segment of segments.slice(0, -1)) {\n node = (node[segment] ??= {}) as DialConfig;\n }\n node[segments[segments.length - 1]] = value;\n}\n\nexport function parseTimelineConfig(config: TimelineConfig): ParsedTimeline {\n const entries = collectClipEntries(config);\n\n let maxEnd = 0;\n for (const { clip } of entries) {\n maxEnd = Math.max(maxEnd, nonNegativeFinite(clip.at) + defaultClipDuration(clip));\n }\n\n // Exact fit: the window ends when the content does, so a looping timeline\n // plays one full pass and wraps with no dead tail. Ceil (never round) to\n // 2dp — undershooting the content end would clip loops and drift their\n // phase every wrap. Set `duration` in config for slack to drag clips later.\n const duration =\n typeof config.duration === 'number' && Number.isFinite(config.duration) && config.duration > 0\n ? config.duration\n : maxEnd > 0\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : 1;\n\n const dialConfig: DialConfig = {};\n const clips: TimelineClipMeta[] = [];\n\n entries.forEach(({ path, childKey, group, clip }, index) => {\n // These combinations are untypeable (optional-never fields) but reachable\n // from plain JS — warn and pick a deterministic winner.\n const raw = clip as TimelineClipBase & {\n from?: DialConfig;\n to?: DialConfig;\n steps?: TimelineStepConfig[];\n props?: Record<string, TimelinePropConfig>;\n };\n if (raw.props && (raw.steps?.length || raw.from || raw.to)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"props\" is mutually exclusive with from/to/steps — using \"props\".`\n );\n } else if (raw.steps?.length && raw.to) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"to\" is ignored when \"steps\" is present — each leg's \"to\" defines its targets.`\n );\n }\n\n const hasSteps = Boolean(clip.steps?.length) && !clip.props;\n const hasProps = Boolean(clip.props);\n const single = isTransitionConfig(clip.transition) ? clip.transition : undefined;\n const total = defaultClipDuration(clip);\n const defaultCurve = single ?? DEFAULT_CLIP_TRANSITION;\n const clipAt = nonNegativeFinite(clip.at);\n\n const clipDial: DialConfig = {\n at: [clipAt, 0, duration, CLIP_VALUE_STEP],\n };\n // Sequence and props clips derive their length from their parts — no\n // duration dial.\n if (!hasSteps && !hasProps) {\n clipDial.duration = [total, 0, duration, CLIP_VALUE_STEP];\n }\n\n // Every animating single-curve clip gets an editable curve; the bar\n // drives its duration.\n if (!hasSteps && !hasProps && (clip.transition || clip.from || clip.to)) {\n clipDial.transition = normalizeStoredTransition(defaultCurve, total);\n }\n\n // Independent property tracks: each is a full mini-clip folder — delay\n // (bar position), from/to or steps, and its own curve. The parent row\n // is a read-only composite.\n let tracks: TimelineClipTrackMeta[] | undefined;\n if (clip.props) {\n tracks = [];\n for (const [prop, track] of Object.entries(clip.props)) {\n if (TRACK_RESERVED.has(prop) || /^step\\d+$/.test(prop)) {\n console.warn(`[dialkit] Timeline property \"${prop}\" collides with a clip field and was skipped.`);\n continue;\n }\n const trackDuration = defaultTrackDuration(track, defaultCurve);\n const trackCurve = track.transition ?? defaultCurve;\n const hasTrackSteps = Boolean(track.steps?.length);\n const trackDial: DialConfig = {\n delay: [nonNegativeFinite(track.delay), 0, duration, CLIP_VALUE_STEP],\n };\n if (!hasTrackSteps) {\n trackDial.duration = [trackDuration, 0, duration, CLIP_VALUE_STEP];\n trackDial.transition = normalizeStoredTransition(trackCurve, trackDuration);\n }\n const fromValue = track.from ?? (hasTrackSteps ? undefined : track.to);\n if (hasTrackSteps && fromValue === undefined) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": track \"${prop}\" has steps but no \"from\" — declare its starting value.`\n );\n }\n if (fromValue !== undefined) {\n trackDial.from = scalarDial(prop, fromValue, hasTrackSteps ? track.steps![0]?.to : track.to);\n }\n if (!hasTrackSteps && track.to !== undefined) {\n trackDial.to = scalarDial(prop, track.to, fromValue);\n }\n let trackStepKeys: string[] | undefined;\n if (hasTrackSteps) {\n trackStepKeys = [];\n let previous = fromValue;\n track.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n trackStepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, trackCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? trackCurve, stepDuration),\n };\n if (step.to !== undefined) {\n stepDial.to = scalarDial(prop, step.to, previous);\n previous = step.to;\n }\n trackDial[stepKey] = stepDial;\n });\n }\n clipDial[prop] = trackDial;\n tracks.push({ prop, stepKeys: trackStepKeys });\n }\n }\n\n if (clip.from && !hasProps) {\n clipDial.from = withFromToRanges(\n clip.from,\n hasSteps ? definedValues(clip.steps![0]?.to) : clip.to\n );\n }\n if (!hasSteps && !hasProps && clip.to) {\n clipDial.to = withFromToRanges(clip.to, clip.from);\n }\n\n // One folder per leg: duration (the segment), target values, curve.\n // Untouched properties hold — the running state feeds slider ranges.\n let stepKeys: string[] | undefined;\n if (hasSteps) {\n stepKeys = [];\n let running: DialConfig | undefined = clip.from;\n clip.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n stepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, defaultCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? defaultCurve, stepDuration),\n };\n const stepTo = definedValues(step.to);\n if (stepTo) {\n // The hold rule needs a starting value: a property first animated\n // mid-sequence has nothing to interpolate from and jumps instead.\n for (const prop of Object.keys(stepTo)) {\n if (!running || !(prop in running)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": property \"${prop}\" first animates in step ${stepIndex + 1} with no starting value — declare it in \"from\".`\n );\n }\n }\n stepDial.to = withFromToRanges(stepTo, running);\n }\n clipDial[stepKey] = stepDial;\n running = { ...(running ?? {}), ...(stepTo ?? {}) };\n });\n }\n\n setDialPath(dialConfig, path, clipDial);\n\n clips.push({\n key: path,\n label: formatLabel(childKey),\n color: TIMELINE_CLIP_COLORS[index % TIMELINE_CLIP_COLORS.length],\n loop: normalizeLoopMode(clip.loop),\n group,\n stepKeys,\n tracks,\n });\n });\n\n return { duration, dialConfig, clips };\n}\n\nconst TRACK_RESERVED = new Set(['at', 'duration', 'loop', 'from', 'to', 'transition', 'delay']);\n\n// A scalar track value as a dial — wraps it in a single-key record so\n// tracks and clips share exactly one range-inference policy.\nfunction scalarDial(prop: string, value: number | string, counterpart: number | string | undefined): DialConfig[string] {\n const record = withFromToRanges(\n { [prop]: value } as DialConfig,\n counterpart === undefined ? undefined : ({ [prop]: counterpart } as DialConfig)\n );\n return record[prop];\n}\n\n// ── from/to slider ranges ──\n\n// Bare numbers in from/to get property-aware slider ranges (the generic\n// DialKit inference is value-based, which turns `y: 0` into a 0–1 slider).\n// Ranges expand to include the actual from/to endpoints when they fall outside.\nconst FROM_TO_RANGE_PRESETS: [RegExp, { min: number; max: number; step: number }][] = [\n [/^(x|y|z|tx|ty|offsetx|offsety|translatex|translatey)$/i, { min: -100, max: 100, step: 1 }],\n [/rotat|angle|skew/i, { min: -180, max: 180, step: 1 }],\n [/^scale/i, { min: 0, max: 2, step: 0.01 }],\n [/opacity|alpha/i, { min: 0, max: 1, step: 0.01 }],\n [/blur|radius|spread/i, { min: 0, max: 100, step: 1 }],\n];\n\nfunction inferFromToRange(key: string, value: number, counterpart: number | undefined): [number, number, number, number] {\n const lo = Math.min(value, counterpart ?? value);\n const hi = Math.max(value, counterpart ?? value);\n\n const preset = FROM_TO_RANGE_PRESETS.find(([pattern]) => pattern.test(key))?.[1];\n if (preset) {\n return [value, Math.min(preset.min, lo), Math.max(preset.max, hi), preset.step];\n }\n\n // Generic fallback: unit-ish values get 0–1, everything else a range\n // spanning both endpoints with room to overshoot.\n if (lo >= 0 && hi <= 1) {\n return [value, 0, 1, 0.01];\n }\n const extent = Math.max(Math.abs(lo), Math.abs(hi), 1);\n const min = lo < 0 ? -extent * 2 : 0;\n const max = Math.max(extent * 2, hi);\n return [value, min, max, inferStep(min, max)];\n}\n\n// Rewrites bare-number leaves in a from/to config as explicit range tuples,\n// using the matching key in the counterpart config to size the range.\nfunction withFromToRanges(config: DialConfig, counterpart: DialConfig | undefined): DialConfig {\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(config)) {\n const other = counterpart?.[key];\n if (typeof value === 'number') {\n result[key] = inferFromToRange(key, value, typeof other === 'number' ? other : undefined);\n } else if (isPlainObject(value) && !('type' in value)) {\n result[key] = withFromToRanges(\n value as DialConfig,\n isPlainObject(other) && !('type' in other) ? (other as DialConfig) : undefined\n );\n } else {\n result[key] = value as DialConfig[string];\n }\n }\n return result;\n}\n\n// ── Static clip data (edit-time) ──\n\n// A curve ready to sample: cached spring params or bezier points, plus the\n// duration easings normalize against.\ntype CurveStatic = {\n duration: number;\n spring?: SpringParams;\n settle?: number;\n ease?: [number, number, number, number];\n};\n\nfunction curveStatic(transition: TransitionConfig | undefined, duration: number): CurveStatic {\n if (!transition) return { duration };\n if (transition.type === 'easing') return { duration, ease: transition.ease };\n const spring = springParams(transition);\n return { duration, spring, settle: springSettleDuration(spring) };\n}\n\nfunction sampleCurve(curve: CurveStatic, elapsed: number): number {\n if (elapsed <= 0) return 0;\n if (curve.spring) {\n // Snap to done once settled so late samples are exactly 1\n if (curve.settle !== undefined && elapsed >= curve.settle) return 1;\n return springProgress(elapsed, curve.spring);\n }\n if (curve.ease) {\n return cubicBezierProgress(clamp(curve.duration > 0 ? elapsed / curve.duration : 1, 0, 1), curve.ease);\n }\n return curve.duration > 0 ? Math.min(1, elapsed / curve.duration) : 1;\n}\n\nexport type TimelineStepStatic = {\n key: string | null; // null for the implicit single step of a from/to clip\n offset: number; // seconds from clip/track start\n duration: number; // effective — physics-resolved\n isPhysics: boolean;\n /** Full property state at step start — the hold rule made concrete. */\n start: Record<string, unknown>;\n /** Targets this step animates; untouched properties hold `start`. */\n to: Record<string, unknown>;\n curve: CurveStatic;\n};\n\n/**\n * One track: a step chain with its own cycle length and phase offset from\n * the clip's `at`. This is the unified runtime model — a shared-timing clip\n * is exactly one track (prop unset, delay 0) whose steps carry the full\n * property record; a props clip is one single-property track per entry.\n */\nexport type TimelineTrackStatic = {\n /** Set for a props clip's single-property tracks; unset for the shared track. */\n prop?: string;\n delay: number;\n duration: number;\n steps: TimelineStepStatic[];\n};\n\nexport type TimelineClipStatic = {\n key: string;\n childKey: string;\n group?: string;\n at: number;\n /** Effective total duration — the bar length (one cycle for looping clips;\n * the widest track extent for props clips). */\n duration: number;\n loop: TimelineClipLoop;\n /** Where the clip stops affecting values: at + duration, or the timeline end when looping. */\n end: number;\n isPhysics: boolean;\n /** Motion-ready transition, its duration injected from the bar — single-curve clips only. */\n transition?: TransitionConfig;\n css?: TimelineClipCss;\n from?: Record<string, unknown>;\n /** Final merged state (the last leg's landing values for sequences). */\n to?: Record<string, unknown>;\n /** Every animating clip is tracks; empty for markers. */\n tracks: TimelineTrackStatic[];\n explicitSteps: boolean;\n /** Union of every property the clip touches. */\n props?: string[];\n};\n\nfunction resolvedAtPath(resolved: Record<string, unknown>, path: string): Record<string, unknown> {\n let node: unknown = resolved;\n for (const segment of path.split('.')) {\n node = isPlainObject(node) ? node[segment] : undefined;\n }\n return isPlainObject(node) ? node : {};\n}\n\nexport function computeStaticClips(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineClipStatic[] {\n const resolved = resolveDialValues(parsed.dialConfig, flatValues) as Record<string, unknown>;\n return parsed.clips.map((clip) =>\n buildClipStatic(resolvedAtPath(resolved, clip.key), clip, parsed.duration)\n );\n}\n\nexport type TimelineStaticState = {\n duration: number;\n clips: TimelineClipStatic[];\n};\n\n/**\n * Resolves the editable clip model and grows the timeline when a live value\n * creates content beyond its authored window. This is most important for\n * physics springs: changing stiffness/damping changes their emergent length.\n * The parsed duration remains the minimum, so shortening a clip never removes\n * the original editing room.\n */\nexport function computeStaticTimeline(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineStaticState {\n let clips = computeStaticClips(parsed, flatValues);\n const maxEnd = clips.reduce(\n (end, clip) => Math.max(end, clip.at + clip.duration),\n parsed.duration\n );\n const duration = maxEnd > parsed.duration\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : parsed.duration;\n\n if (duration !== parsed.duration) {\n clips = clips.map((clip) =>\n clip.loop === 'repeat' ? { ...clip, end: duration } : clip\n );\n }\n\n return { duration, clips };\n}\n\n/** The dock's resolver: the same static model the hook animates with,\n * rebuilt from flat stored values — bars, popovers, and playback can never\n * disagree about geometry. */\nexport function computeClipStaticFromValues(\n values: Record<string, DialValue>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n return buildClipStatic(unflattenClipValues(values, clip.key), clip, timelineDuration);\n}\n\nfunction buildClipStatic(\n clipResolved: Record<string, unknown>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n {\n const at = typeof clipResolved.at === 'number' ? clipResolved.at : 0;\n const from = isPlainObject(clipResolved.from) ? clipResolved.from : undefined;\n const single = isTransitionConfig(clipResolved.transition) ? clipResolved.transition : undefined;\n\n const staticClip: TimelineClipStatic = {\n key: clip.key,\n childKey: clip.group ? clip.key.slice(clip.group.length + 1) : clip.key,\n group: clip.group,\n at,\n duration: 0,\n loop: 'off',\n end: 0,\n isPhysics: false,\n from,\n tracks: [],\n explicitSteps: Boolean(clip.stepKeys?.length),\n };\n\n if (clip.tracks?.length) {\n // Independent property tracks: each chains its own scalar steps and\n // carries its own cycle length and phase offset.\n const tracks: (TimelineTrackStatic & { prop: string })[] = clip.tracks.map(({ prop, stepKeys }) => {\n const trackResolved = isPlainObject(clipResolved[prop])\n ? (clipResolved[prop] as Record<string, unknown>)\n : {};\n const delay = typeof trackResolved.delay === 'number' ? trackResolved.delay : 0;\n const fromValue = trackResolved.from;\n let steps: TimelineStepStatic[];\n let trackDuration = 0;\n\n if (stepKeys?.length) {\n let running = fromValue;\n steps = stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(trackResolved[stepKey])\n ? (trackResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = stepResolved.to;\n const step: TimelineStepStatic = {\n key: stepKey,\n offset: trackDuration,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running === undefined ? {} : { [prop]: running },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n };\n if (toValue !== undefined) running = toValue;\n trackDuration += effective.duration;\n return step;\n });\n } else {\n const storedDuration =\n typeof trackResolved.duration === 'number' ? trackResolved.duration : 0;\n const raw = isTransitionConfig(trackResolved.transition) ? trackResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = trackResolved.to;\n trackDuration = effective.duration;\n steps = [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: fromValue === undefined ? {} : { [prop]: fromValue },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n },\n ];\n }\n\n return { prop, delay, duration: trackDuration, steps };\n });\n\n staticClip.tracks = tracks;\n staticClip.props = tracks.map((track) => track.prop);\n staticClip.duration = tracks.reduce((max, track) => Math.max(max, track.delay + track.duration), 0);\n staticClip.from = Object.fromEntries(\n tracks.map((track) => [track.prop, track.steps[0].start[track.prop]])\n );\n staticClip.to = Object.fromEntries(\n tracks.map((track) => {\n const last = track.steps[track.steps.length - 1];\n return [track.prop, last.to[track.prop] ?? last.start[track.prop]];\n })\n );\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n return staticClip;\n }\n\n if (clip.stepKeys?.length) {\n // Sequence: chain the legs, threading the running state through so\n // untouched properties hold their prior value.\n let running: Record<string, unknown> = { ...(from ?? {}) };\n let offset = 0;\n const steps: TimelineStepStatic[] = clip.stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(clipResolved[stepKey])\n ? (clipResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const to = isPlainObject(stepResolved.to) ? stepResolved.to : {};\n const step: TimelineStepStatic = {\n key: stepKey,\n offset,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n };\n running = { ...running, ...to };\n offset += effective.duration;\n return step;\n });\n\n staticClip.tracks = [{ delay: 0, duration: offset, steps }];\n staticClip.duration = offset;\n staticClip.to = running;\n } else {\n const storedDuration = typeof clipResolved.duration === 'number' ? clipResolved.duration : 0;\n const to = isPlainObject(clipResolved.to) ? clipResolved.to : undefined;\n\n if (single) {\n const effective = resolveClipTransition(single, storedDuration);\n staticClip.duration = effective.duration;\n staticClip.isPhysics = effective.isPhysics;\n staticClip.transition = effective.transition;\n staticClip.css = transitionToCss(effective.transition);\n staticClip.to = to;\n if (from && to) {\n staticClip.tracks = [\n {\n delay: 0,\n duration: effective.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: from,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n },\n ],\n },\n ];\n }\n } else {\n // Curveless clip (markers, or defensive fallback): the bar is the\n // stored duration; from/to animate with the default spring.\n staticClip.duration = storedDuration;\n staticClip.to = to;\n if (from && to) {\n const base = resolveClipTransition(DEFAULT_CLIP_TRANSITION, storedDuration);\n staticClip.duration = base.duration;\n staticClip.tracks = [\n {\n delay: 0,\n duration: base.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: base.duration,\n isPhysics: false,\n start: from,\n to,\n curve: curveStatic(base.transition, base.duration),\n },\n ],\n },\n ];\n }\n }\n }\n\n if (staticClip.tracks.length) {\n const props = new Set<string>(Object.keys(from ?? {}));\n for (const track of staticClip.tracks) {\n for (const step of track.steps) {\n for (const prop of Object.keys(step.to)) props.add(prop);\n }\n }\n staticClip.props = Array.from(props);\n }\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n\n return staticClip;\n }\n}\n\n// ── Per-frame clip state ──\n\nfunction stepAtPosition(steps: TimelineStepStatic[], pos: number): TimelineStepStatic {\n for (const step of steps) {\n if (pos < step.offset + step.duration) return step;\n }\n return steps[steps.length - 1];\n}\n\n/** One property's value at a cycle position — the hold rule in one place,\n * shared by the frame pass and the waveform sampler. */\nfunction evalPropAtPos(steps: TimelineStepStatic[], prop: string, pos: number): unknown {\n const step = stepAtPosition(steps, pos);\n const within = Math.max(0, pos - step.offset);\n if (prop in step.to) {\n const eased = sampleCurve(step.curve, within);\n return interpolateResolved(step.start[prop], step.to[prop], eased);\n }\n return step.start[prop];\n}\n\n/**\n * `time` is the playhead (what the dock shows); `cycleTime` is continuous\n * time across timeline wraps (wraps × duration + time). Looping clips fold\n * against `cycleTime`, so a looping timeline never snaps their phase — the\n * window is a viewport onto animations that repeat forever. Scrubbing seeks\n * with cycleTime === time, which is the deterministic first-pass state.\n */\nexport function computeClipState(\n clip: TimelineClipStatic,\n time: number,\n cycleTime = time\n): Record<string, unknown> {\n const total = clip.duration;\n const looping = clip.loop === 'repeat' && total > 0;\n // Once the timeline has wrapped, a looping clip is already running even\n // before its `at` — it has been repeating since the previous pass.\n const started = time >= clip.at || (looping && cycleTime > time);\n const done = time >= clip.end;\n const elapsed = time - clip.at;\n const phaseElapsed = looping ? cycleTime - clip.at : elapsed;\n\n const fold = (e: number): number => (looping ? e % total : e);\n\n const basePos = started ? fold(Math.max(0, phaseElapsed)) : 0;\n const progress = total > 0 ? clamp(basePos / total, 0, 1) : started ? 1 : 0;\n\n let current: Record<string, unknown> | undefined;\n let stepIndex = 0;\n\n if (clip.tracks.length && clip.props?.length) {\n // One loop for every clip kind: each track folds against its own cycle,\n // offset by its delay. The delay applies once, then cycles fold — with\n // equal periods that is a permanent phase shift (Motion's semantics). A\n // shared-timing clip is a single track whose steps carry every property.\n current = {};\n for (const track of clip.tracks) {\n const props = track.prop !== undefined ? [track.prop] : clip.props;\n for (const prop of props) {\n const startValue = track.steps[0]?.start[prop];\n if (!started) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const phase = phaseElapsed - track.delay;\n if (phase <= 0) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const pos = looping && track.duration > 0 ? phase % track.duration : phase;\n const value = evalPropAtPos(track.steps, prop, pos);\n if (value !== undefined) current[prop] = value;\n }\n }\n const shared = clip.tracks[0];\n if (started && clip.explicitSteps && shared.prop === undefined) {\n stepIndex = shared.steps.indexOf(stepAtPosition(shared.steps, basePos));\n }\n }\n\n return {\n at: clip.at,\n duration: clip.duration,\n loop: clip.loop,\n started,\n active: started && !done,\n done,\n progress,\n step: clip.explicitSteps ? stepIndex : undefined,\n from: clip.from,\n to: clip.to,\n animate: started ? clip.to : clip.from,\n transition: clip.transition,\n css: clip.css,\n current,\n };\n}\n\n// ── Value interpolation ──\n\n// Mixes two resolved from/to value trees at eased progress p.\n// Numbers lerp (and can overshoot), hex colors mix in clamped RGB,\n// anything else switches at the midpoint.\nexport function interpolateResolved(from: unknown, to: unknown, p: number): unknown {\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * p;\n }\n if (typeof from === 'string' && typeof to === 'string') {\n const mixed = mixHexColors(from, to, p);\n if (mixed) return mixed;\n }\n if (isPlainObject(from) && isPlainObject(to)) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(from)) {\n result[key] = key in to ? interpolateResolved(from[key], to[key], p) : from[key];\n }\n for (const key of Object.keys(to)) {\n if (!(key in from)) result[key] = to[key];\n }\n return result;\n }\n return p < 0.5 ? from : to;\n}\n\nfunction parseHex(hex: string): [number, number, number, number] | null {\n if (!isHexColor(hex)) return null;\n let h = hex.slice(1);\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255,\n ];\n}\n\nfunction mixHexColors(a: string, b: string, p: number): string | null {\n const ca = parseHex(a);\n const cb = parseHex(b);\n if (!ca || !cb) return null;\n const t = clamp(p, 0, 1);\n const mixed = ca.map((v, i) => Math.round(v + (cb[i] - v) * t));\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n const rgb = `#${hex(mixed[0])}${hex(mixed[1])}${hex(mixed[2])}`;\n return mixed[3] === 255 ? rgb : `${rgb}${hex(mixed[3])}`;\n}\n\n// ── CSS output ──\n\n// Approximates the clip's transition as CSS transition properties so\n// non-Motion consumers can use native CSS. Easing configs map exactly;\n// springs are approximated with an overshoot bezier scaled by bounce.\nexport function transitionToCss(transition: TransitionConfig | undefined): TimelineClipCss | undefined {\n if (!transition) return undefined;\n\n if (transition.type === 'easing') {\n return {\n transitionDuration: `${round2(transition.duration)}s`,\n transitionTimingFunction: `cubic-bezier(${transition.ease.map((v) => round2(v)).join(', ')})`,\n };\n }\n\n const params = springParams(transition);\n const dampingRatio = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const duration = transition.visualDuration ?? springSettleDuration(params);\n const bounce = transition.bounce ?? Math.max(0, round2(1 - dampingRatio));\n\n return {\n transitionDuration: `${round2(duration)}s`,\n transitionTimingFunction:\n bounce > 0.05\n ? `cubic-bezier(0.34, ${round2(1.2 + bounce)}, 0.64, 1)`\n : 'cubic-bezier(0.25, 0.6, 0.35, 1)',\n };\n}\n\n// ── Dock helpers ──\n\n/** Popover display values: swap stored shape-only transitions for their\n * effective configs (duration injected from the bar/segment) so the curve\n * editor shows the transition as it actually runs. */\nexport function timelinePopoverDisplayValues(\n values: Record<string, DialValue>,\n clipKey: string,\n stepKeys?: string[],\n stepKey?: string\n): Record<string, DialValue> {\n const display = { ...values };\n const swap = (path: string, duration: number) => {\n const raw = display[path];\n if (isTransitionConfig(raw)) display[path] = resolveClipTransition(raw, duration).transition;\n };\n\n if (stepKey) {\n swap(`${clipKey}.${stepKey}.transition`, numberValue(values[`${clipKey}.${stepKey}.duration`]));\n return display;\n }\n\n const cycle = stepKeys?.length\n ? stepKeys.reduce((sum, sk) => sum + numberValue(values[`${clipKey}.${sk}.duration`]), 0)\n : numberValue(values[`${clipKey}.duration`]);\n\n swap(`${clipKey}.transition`, cycle);\n return display;\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : 0;\n}\n\n// ── Property lanes ──\n\n/** Rebuilds the nested resolved shape for one clip from flat stored values —\n * the dock's inverse of the panel's path flattening. */\nfunction unflattenClipValues(\n values: Record<string, DialValue>,\n clipKey: string\n): Record<string, unknown> {\n const prefix = `${clipKey}.`;\n const result: Record<string, unknown> = {};\n const entries = Object.entries(values)\n .filter(([path]) => path.startsWith(prefix))\n .map(([path, value]) => ({ segments: path.slice(prefix.length).split('.'), value }))\n .sort((a, b) => a.segments.length - b.segments.length);\n\n for (const { segments, value } of entries) {\n let node = result;\n for (let i = 0; i < segments.length - 1; i++) {\n const existing = node[segments[i]];\n node = (isPlainObject(existing) ? existing : (node[segments[i]] = {})) as Record<string, unknown>;\n }\n node[segments[segments.length - 1]] = cloneTimelineValue(value);\n }\n return result;\n}\n\nfunction cloneTimelineValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneTimelineValue);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, cloneTimelineValue(nested)])\n );\n}\n\n/** Dragging a track bar edits the property's phase offset. */\nexport function clampTrackDelay(\n delay: number,\n at: number,\n trackDuration: number,\n timelineDuration: number\n): number {\n return clamp(round2(delay), 0, Math.max(0, round2(timelineDuration - at - trackDuration)));\n}\n\n// Clip-edit clamp policy — one place, shared by every gesture/consumer.\nexport function clampClipMove(at: number, duration: number, timelineDuration: number): number {\n return clamp(round2(at), 0, Math.max(0, timelineDuration - duration));\n}\n\nexport function clampClipResizeEnd(duration: number, at: number, timelineDuration: number): number {\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, timelineDuration - at);\n}\n\nexport function clampClipResizeStart(\n newAt: number,\n at: number,\n duration: number\n): { at: number; duration: number } {\n const clampedAt = clamp(round2(newAt), 0, at + duration - TIMELINE_MIN_CLIP_DURATION);\n return { at: clampedAt, duration: round2(at + duration - clampedAt) };\n}\n\n/** Resizing one leg of a sequence: the other legs keep their length, the\n * whole bar must still fit the timeline. */\nexport function clampStepResize(\n duration: number,\n at: number,\n otherStepsTotal: number,\n timelineDuration: number\n): number {\n const max = Math.max(TIMELINE_MIN_CLIP_DURATION, timelineDuration - at - otherStepsTotal);\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, max);\n}\n\n/** Copy-for-agent export: strip editor-only state, normalize shape-only\n * transitions, resolve physics durations, and drop zero-value defaults. */\nexport function normalizeTimelineValuesForCopy(\n values: Record<string, DialValue>,\n clips: TimelineClipMeta[]\n): Record<string, DialValue> {\n const normalized: Record<string, DialValue> = { ...values };\n\n // Transition mode is editor UI state, not part of a DialKit config. It is\n // stored beside values so mode switches survive presets, but must never be\n // included in the tune → copy → remove payload.\n for (const path of Object.keys(normalized)) {\n if (path.endsWith('.__mode')) delete normalized[path];\n }\n\n const normalizeTransitionAt = (transitionPath: string, durationPath: string) => {\n const raw = normalized[transitionPath];\n if (!isTransitionConfig(raw)) return;\n if (isPhysicsSpring(raw)) {\n // A mode switch can leave the previous time-based bar duration stored.\n // Export the spring's actual derived length so the copied config exactly\n // matches the timeline the author just tuned.\n normalized[durationPath] = transitionDefaultDuration(raw);\n }\n normalized[transitionPath] = normalizeStoredTransition(\n raw,\n numberValue(normalized[durationPath])\n );\n };\n\n for (const clip of clips) {\n for (const stepKey of clip.stepKeys ?? []) {\n normalizeTransitionAt(\n `${clip.key}.${stepKey}.transition`,\n `${clip.key}.${stepKey}.duration`\n );\n }\n\n normalizeTransitionAt(`${clip.key}.transition`, `${clip.key}.duration`);\n\n // Property tracks: normalize each track's transitions against its own\n // durations, drop zero delays (the config default).\n for (const track of clip.tracks ?? []) {\n const trackKey = `${clip.key}.${track.prop}`;\n for (const stepKey of track.stepKeys ?? []) {\n normalizeTransitionAt(\n `${trackKey}.${stepKey}.transition`,\n `${trackKey}.${stepKey}.duration`\n );\n }\n normalizeTransitionAt(`${trackKey}.transition`, `${trackKey}.duration`);\n if (normalized[`${trackKey}.delay`] === 0) {\n delete normalized[`${trackKey}.delay`];\n }\n }\n\n delete normalized[`${clip.key}.loop`];\n }\n return normalized;\n}\n\n// ── Formatting ──\n\nexport function formatClock(time: number, tenths = false): string {\n const safe = Math.max(0, time);\n const minutes = Math.floor(safe / 60);\n const seconds = safe - minutes * 60;\n const secondsText = tenths\n ? seconds.toFixed(1).padStart(4, '0')\n : String(Math.floor(seconds)).padStart(2, '0');\n return `${String(minutes).padStart(2, '0')}:${secondsText}`;\n}\n\nexport function formatSeconds(value: number): string {\n return `${round2(value)}s`;\n}\n\nexport function formatStepLabel(stepKey: string): string {\n const match = /^step(\\d+)$/.exec(stepKey);\n return match ? `Step ${match[1]}` : formatLabel(stepKey);\n}\n","import type { DialKitPersistOptions } from '../store/DialStore';\nimport type { TimelineMeta, TimelineTransport } from '../store/TimelineStore';\nimport { loopSpan } from '../store/TimelineStore';\nimport {\n computeClipState,\n type DialTimelineValues,\n type ParsedTimeline,\n type TimelineClipStatic,\n type TimelineConfig,\n} from '../timeline-core';\n\nexport interface DialTimelineOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n /** Start playing on mount. Defaults to true. */\n autoplay?: boolean;\n /**\n * Loop when the playhead reaches the end. `true` restarts the whole\n * timeline; `{ from }` wraps back to that time instead, so clips before it\n * play once and looping clips keep cycling forever. Defaults to false.\n */\n loop?: boolean | { from: number };\n}\n\nexport type TimelineActions = {\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n};\n\n/** One resolution of the public loop option, shared by every adapter. */\nexport function resolveTimelineLoop(\n loop: DialTimelineOptions['loop']\n): { enabled: boolean; start: number } {\n if (typeof loop === 'object' && loop !== null) {\n return {\n enabled: true,\n start: Number.isFinite(loop.from) ? Math.max(0, loop.from) : 0,\n };\n }\n return { enabled: Boolean(loop), start: 0 };\n}\n\nexport function buildTimelineMeta(\n id: string,\n name: string,\n duration: number,\n parsed: ParsedTimeline,\n loop: DialTimelineOptions['loop']\n): TimelineMeta {\n const resolvedLoop = resolveTimelineLoop(loop);\n return {\n id,\n name,\n duration,\n loop: resolvedLoop.enabled,\n loopStart: resolvedLoop.start,\n clips: parsed.clips,\n };\n}\n\n/**\n * Framework-neutral frame pass. Adapters only own lifecycle and reactivity;\n * the value shape and loop-cycle math stay identical everywhere.\n */\nexport function buildTimelineValues<T extends TimelineConfig>(\n staticClips: TimelineClipStatic[],\n transport: TimelineTransport,\n timelineDuration: number,\n loopStart: number,\n actions: TimelineActions\n): DialTimelineValues<T> {\n const result: Record<string, unknown> = {\n time: transport.time,\n playing: transport.playing,\n duration: timelineDuration,\n ...actions,\n };\n\n const span = loopSpan(transport.duration, loopStart);\n const cycleTime = (span > 0 ? transport.wraps * span : 0) + transport.time;\n for (const clip of staticClips) {\n const state = computeClipState(clip, transport.time, cycleTime);\n if (clip.group) {\n const bucket = (result[clip.group] ??= {}) as Record<string, unknown>;\n bucket[clip.childKey] = state;\n } else {\n result[clip.key] = state;\n }\n }\n\n return result as DialTimelineValues<T>;\n}\n","import { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { DialStore, formatLabel } from '../../store/DialStore';\nimport type { ControlMeta, DialValue } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport type { TimelineClipMeta, TimelineMeta } from '../../store/TimelineStore';\nimport { TimelineUiStore } from '../../store/TimelineUiStore';\nimport {\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n formatClock,\n formatSeconds,\n formatStepLabel,\n computeClipStaticFromValues,\n normalizeTimelineValuesForCopy,\n TIMELINE_MIN_CLIP_DURATION,\n timelinePopoverDisplayValues,\n} from '../../timeline-core';\nimport type { TimelineClipLoop, TimelineStepStatic } from '../../timeline-core';\nimport { clamp } from '../../transition-math';\nimport { buildCopyInstruction } from '../../copy-instruction';\nimport { isDevDefault } from '../../env';\nimport { ICON_ADD_PRESET, ICON_CHEVRON, ICON_CHECK, ICON_CLIPBOARD, ICON_PAUSE, ICON_PLAY, ICON_REPLAY } from '../../icons';\nimport { findControl } from '../../shortcut-utils';\nimport { ControlRenderer } from '../ControlRenderer';\nimport { PresetManager } from '../PresetManager';\nimport type { DialTheme } from '../DialRoot';\n\nconst DRAG_THRESHOLD_PX = 3;\nconst MAJOR_TICK_TARGET_PX = 140;\nconst MILLISECOND_STEP = 0.001;\nconst SECOND_TICK_STEPS = [\n 0.001, 0.002, 0.005,\n 0.01, 0.02, 0.05,\n 0.1, 0.2, 0.5,\n 1, 2, 5, 10, 15, 30, 60, 120, 300, 600,\n];\nconst MIN_TIMELINE_MAX_ZOOM = 8;\nconst PLAYHEAD_FLAG_WIDTH = 52;\nconst PLAYHEAD_FLAG_EDGE_OVERHANG = 1;\nconst POPOVER_WIDTH = 280;\nconst ZOOM_DRAG_DISTANCE = 180;\nconst DEFAULT_DOCK_MAX_HEIGHT = 400;\nconst MIN_DOCK_MAX_HEIGHT = 120;\n\nconst subscribeGlobalTimelines = (callback: () => void) => TimelineStore.subscribeGlobal(callback);\nconst getTimelines = () => TimelineStore.getTimelines();\nconst subscribeTimelineVisibility = (callback: () => void) => TimelineUiStore.subscribe(callback);\nconst getTimelineVisibility = () => TimelineUiStore.getVisible();\n\nexport interface DialTimelineProps {\n theme?: DialTheme;\n /** Initial dock visibility. Expansion is controlled separately by defaultOpen. */\n defaultVisible?: boolean;\n /** Controlled dock visibility. */\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen?: boolean;\n productionEnabled?: boolean;\n}\n\n// Memoized: hosts that bind `current` re-render every frame, and the dock\n// must not reconcile with them — only its transport leaves tick.\n// The production gate is a hook-free wrapper so its conditional return can\n// never change hook order in the component that actually uses hooks.\nexport const DialTimeline = memo(function DialTimeline({\n theme = 'system',\n defaultVisible = true,\n visible,\n onVisibilityChange,\n defaultOpen = true,\n productionEnabled = isDevDefault,\n}: DialTimelineProps) {\n if (!productionEnabled) return null;\n return (\n <DialTimelineDock\n theme={theme}\n defaultVisible={defaultVisible}\n visible={visible}\n onVisibilityChange={onVisibilityChange}\n defaultOpen={defaultOpen}\n />\n );\n});\n\nfunction DialTimelineDock({\n theme,\n defaultVisible,\n visible,\n onVisibilityChange,\n defaultOpen,\n}: {\n theme: DialTheme;\n defaultVisible: boolean;\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen: boolean;\n}) {\n const [mounted, setMounted] = useState(false);\n const [dockMaxHeight, setDockMaxHeight] = useState(DEFAULT_DOCK_MAX_HEIGHT);\n const visibilityControllerId = useRef(Symbol('dialkit-timeline-visibility'));\n const dockRef = useRef<HTMLDivElement>(null);\n const resizeCleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => TimelineUiStore.registerController(visibilityControllerId.current, {\n visible,\n defaultVisible,\n onVisibilityChange,\n }), []);\n\n useEffect(() => {\n TimelineUiStore.updateController(visibilityControllerId.current, {\n visible,\n defaultVisible,\n onVisibilityChange,\n });\n }, [defaultVisible, onVisibilityChange, visible]);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => () => resizeCleanupRef.current?.(), []);\n\n const handleResizePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const dock = dockRef.current;\n if (!dock) return;\n e.preventDefault();\n e.stopPropagation();\n resizeCleanupRef.current?.();\n\n const pointerY = e.clientY;\n const startHeight = dock.getBoundingClientRect().height;\n const handlePointerMove = (event: PointerEvent) => {\n event.preventDefault();\n const viewportMax = Math.max(MIN_DOCK_MAX_HEIGHT, window.innerHeight - 24);\n setDockMaxHeight(clamp(startHeight + pointerY - event.clientY, MIN_DOCK_MAX_HEIGHT, viewportMax));\n };\n const finishResize = () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', finishResize);\n window.removeEventListener('pointercancel', finishResize);\n resizeCleanupRef.current = null;\n };\n\n window.addEventListener('pointermove', handlePointerMove, { passive: false });\n window.addEventListener('pointerup', finishResize);\n window.addEventListener('pointercancel', finishResize);\n resizeCleanupRef.current = finishResize;\n }, []);\n\n const timelines = useSyncExternalStore(subscribeGlobalTimelines, getTimelines, getTimelines);\n const dockVisible = useSyncExternalStore(\n subscribeTimelineVisibility,\n getTimelineVisibility,\n getTimelineVisibility\n );\n\n if (!mounted || typeof window === 'undefined' || timelines.length === 0) {\n return null;\n }\n\n return createPortal(\n <div className=\"dialkit-root dialkit-timeline\" data-theme={theme} hidden={!dockVisible}>\n <div\n className=\"dialkit-timeline-resize-handle\"\n onPointerDown={handleResizePointerDown}\n role=\"separator\"\n aria-label=\"Resize timeline height\"\n aria-orientation=\"horizontal\"\n title=\"Drag to resize timeline\"\n />\n <div\n ref={dockRef}\n className=\"dialkit-timeline-dock\"\n style={{ maxHeight: `min(${dockMaxHeight}px, calc(100vh - 24px))` }}\n >\n {timelines.map((timeline) => (\n <TimelineSection\n key={timeline.id}\n meta={timeline}\n defaultOpen={defaultOpen}\n theme={theme}\n dockVisible={dockVisible}\n />\n ))}\n </div>\n </div>,\n document.body\n );\n}\n\n// ── Transport leaves ──\n// The 60Hz clock is consumed only by these leaf components (and the per-clip\n// active flag), each with a snapshot that changes identity exactly as often\n// as its output — the section itself stays static during playback.\n\nfunction useTransportSubscribe(id: string) {\n return useCallback((callback: () => void) => TimelineStore.subscribe(id, callback), [id]);\n}\n\nfunction PlayPauseButton({ id }: { id: string }) {\n const subscribe = useTransportSubscribe(id);\n // Boolean snapshot: re-renders only when play state flips\n const getPlaying = useCallback(() => TimelineStore.getTransport(id).playing, [id]);\n const playing = useSyncExternalStore(subscribe, getPlaying, getPlaying);\n\n return (\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={() => (playing ? TimelineStore.pause(id) : TimelineStore.play(id))}\n title={playing ? 'Pause' : 'Play'}\n aria-label={playing ? 'Pause' : 'Play'}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {playing ? (\n <motion.svg\n key=\"pause\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n {ICON_PAUSE.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </motion.svg>\n ) : (\n <motion.svg\n key=\"play\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_PLAY} fill=\"currentColor\" />\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n );\n}\n\nfunction ReplayButton({ onReplay }: { onReplay: () => void }) {\n return (\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={onReplay}\n title=\"Replay\"\n aria-label=\"Replay\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n {ICON_REPLAY.map((d, i) => <path key={i} d={d} fill=\"currentColor\" />)}\n </svg>\n </motion.button>\n );\n}\n\nfunction TimelinePlayheadFlag({\n id,\n duration,\n pxPerSecond,\n viewStart,\n viewEnd,\n laneWidth,\n rulerRef,\n onResetView,\n}: {\n id: string;\n duration: number;\n pxPerSecond: number;\n viewStart: number;\n viewEnd: number;\n laneWidth: number;\n rulerRef: React.RefObject<HTMLDivElement>;\n onResetView: () => void;\n}) {\n const subscribe = useTransportSubscribe(id);\n const getTime = useCallback(() => TimelineStore.getTransport(id).time, [id]);\n const time = useSyncExternalStore(subscribe, getTime, getTime);\n const scrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n viewEnd: number;\n } | null>(null);\n const cleanupScrubRef = useRef<(() => void) | null>(null);\n\n const seekFromClientX = useCallback((clientX: number) => {\n const rect = scrubRef.current?.rect;\n const scrub = scrubRef.current;\n const contentWidth = rect?.width ?? 0;\n if (!rect || !scrub || contentWidth <= 0) return;\n const nextTime = clamp(\n scrub.viewStart + ((clientX - rect.left) / contentWidth) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n );\n TimelineStore.seek(id, nextTime);\n }, [id]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const rect = rulerRef.current?.getBoundingClientRect();\n if (!rect) return;\n e.preventDefault();\n e.stopPropagation();\n cleanupScrubRef.current?.();\n const resetView = e.shiftKey;\n scrubRef.current = {\n wasPlaying: TimelineStore.getTransport(id).playing,\n rect,\n viewStart: resetView ? 0 : viewStart,\n viewEnd: resetView ? duration : viewEnd,\n };\n if (resetView) onResetView();\n TimelineStore.pause(id);\n seekFromClientX(e.clientX);\n\n const handleWindowPointerMove = (event: PointerEvent) => {\n event.preventDefault();\n seekFromClientX(event.clientX);\n };\n const finishWindowScrub = () => {\n window.removeEventListener('pointermove', handleWindowPointerMove);\n window.removeEventListener('pointerup', finishWindowScrub);\n window.removeEventListener('pointercancel', finishWindowScrub);\n if (scrubRef.current?.wasPlaying) TimelineStore.play(id);\n scrubRef.current = null;\n cleanupScrubRef.current = null;\n };\n\n window.addEventListener('pointermove', handleWindowPointerMove, { passive: false });\n window.addEventListener('pointerup', finishWindowScrub);\n window.addEventListener('pointercancel', finishWindowScrub);\n cleanupScrubRef.current = finishWindowScrub;\n }, [duration, id, onResetView, rulerRef, seekFromClientX, viewEnd, viewStart]);\n\n useEffect(() => () => cleanupScrubRef.current?.(), []);\n\n if (time < viewStart || time > viewEnd || laneWidth <= 0) return null;\n\n const x = clamp(\n (time - viewStart) * pxPerSecond,\n 0,\n laneWidth\n );\n const flagCenter = clamp(\n x,\n PLAYHEAD_FLAG_WIDTH / 2 - PLAYHEAD_FLAG_EDGE_OVERHANG,\n laneWidth - PLAYHEAD_FLAG_WIDTH / 2 + PLAYHEAD_FLAG_EDGE_OVERHANG\n );\n const flagOffset = flagCenter - x;\n const edge = flagOffset > 0.5 ? 'start' : flagOffset < -0.5 ? 'end' : 'center';\n\n return (\n <div\n className=\"dialkit-timeline-playhead-control\"\n data-edge={edge}\n style={{\n left: `calc(var(--dial-timeline-label-w) + ${x}px)`,\n '--dial-timeline-playhead-flag-offset': `${flagOffset}px`,\n } as CSSProperties}\n onPointerDown={handlePointerDown}\n role=\"slider\"\n aria-label=\"Timeline current time\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={time}\n title=\"Drag to scrub the timeline\"\n >\n <div className=\"dialkit-timeline-playhead-stem\" />\n <div className=\"dialkit-timeline-playhead-anchor\">\n <div className=\"dialkit-timeline-playhead-flag\">{time.toFixed(2)}</div>\n </div>\n </div>\n );\n}\n\nfunction TimelineOverview({\n id,\n duration,\n viewStart,\n viewEnd,\n onNavigate,\n}: {\n id: string;\n duration: number;\n viewStart: number;\n viewEnd: number;\n onNavigate: (time: number) => void;\n}) {\n const subscribe = useTransportSubscribe(id);\n const getTime = useCallback(() => TimelineStore.getTransport(id).time, [id]);\n const time = useSyncExternalStore(subscribe, getTime, getTime);\n const scrubRef = useRef<{ wasPlaying: boolean; rect: DOMRect } | null>(null);\n\n const seekFromClientX = useCallback((clientX: number) => {\n const rect = scrubRef.current?.rect;\n if (!rect || rect.width <= 0 || duration <= 0) return;\n const nextTime = clamp(((clientX - rect.left) / rect.width) * duration, 0, duration);\n TimelineStore.seek(id, nextTime);\n onNavigate(nextTime);\n }, [duration, id, onNavigate]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n scrubRef.current = {\n wasPlaying: TimelineStore.getTransport(id).playing,\n rect: e.currentTarget.getBoundingClientRect(),\n };\n TimelineStore.pause(id);\n seekFromClientX(e.clientX);\n }, [id, seekFromClientX]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (scrubRef.current) seekFromClientX(e.clientX);\n }, [seekFromClientX]);\n\n const finishScrub = useCallback(() => {\n if (scrubRef.current?.wasPlaying) TimelineStore.play(id);\n scrubRef.current = null;\n }, [id]);\n\n const viewportLeft = duration > 0 ? (viewStart / duration) * 100 : 0;\n const viewportWidth = duration > 0 ? ((viewEnd - viewStart) / duration) * 100 : 100;\n const playheadLeft = duration > 0 ? (time / duration) * 100 : 0;\n\n return (\n <div\n className=\"dialkit-timeline-overview\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={finishScrub}\n onPointerCancel={finishScrub}\n onLostPointerCapture={finishScrub}\n title=\"Drag to scrub the full timeline\"\n >\n <div\n className=\"dialkit-timeline-overview-viewport\"\n data-zoomed={viewportWidth < 99.999 || undefined}\n style={{ left: `${viewportLeft}%`, width: `${viewportWidth}%` }}\n />\n <div className=\"dialkit-timeline-overview-progress\" style={{ width: `${playheadLeft}%` }} />\n <div className=\"dialkit-timeline-overview-playhead\" style={{ left: `${playheadLeft}%` }} />\n </div>\n );\n}\n\n// ── Section ──\n\ntype PopoverState = {\n clip: TimelineClipMeta;\n /** Set when the popover edits one leg of a sequence. */\n stepKey?: string;\n anchor: { left: number; top: number; right: number; bottom: number; width: number; height: number };\n};\n\ntype ZoomDragState = {\n pointerX: number;\n rect: DOMRect;\n zoom: number;\n viewStart: number;\n anchorRatio: number;\n anchorTime: number;\n moved: boolean;\n};\n\nfunction clampViewStart(start: number, duration: number, visibleDuration: number): number {\n return clamp(start, 0, Math.max(0, duration - visibleDuration));\n}\n\nfunction formatRulerSeconds(time: number, step: number): string {\n if (step >= 1 && Number.isInteger(time)) return formatClock(time);\n const decimals = Math.min(3, Math.max(1, Math.ceil(-Math.log10(step))));\n return `${time.toFixed(decimals)}s`;\n}\n\nconst TimelineSection = memo(function TimelineSection({\n meta,\n defaultOpen,\n theme,\n dockVisible,\n}: {\n meta: TimelineMeta;\n defaultOpen: boolean;\n theme: DialTheme;\n dockVisible: boolean;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n const [copied, setCopied] = useState(false);\n const [popover, setPopover] = useState<PopoverState | null>(null);\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(() => new Set());\n const [expandedTracks, setExpandedTracks] = useState<Set<string>>(() => new Set());\n const [zoom, setZoom] = useState(1);\n const [viewStart, setViewStart] = useState(0);\n\n const subscribeValues = useCallback(\n (callback: () => void) => DialStore.subscribe(meta.id, callback),\n [meta.id]\n );\n const getValues = useCallback(() => DialStore.getValues(meta.id), [meta.id]);\n const values = useSyncExternalStore(subscribeValues, getValues, getValues);\n const presets = DialStore.getPresets(meta.id);\n const activePresetId = DialStore.getActivePresetId(meta.id);\n\n // Measure the shared ruler/track span so seconds map to pixels.\n const laneAreaRef = useRef<HTMLDivElement>(null);\n const horizontalScrollRef = useRef<HTMLDivElement>(null);\n const [laneWidth, setLaneWidth] = useState(0);\n\n useLayoutEffect(() => {\n if (!open) return;\n const ruler = laneAreaRef.current;\n if (!ruler) return;\n const measure = () => {\n setLaneWidth(ruler.getBoundingClientRect().width);\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(ruler);\n return () => observer.disconnect();\n }, [open]);\n\n const visibleDuration = meta.duration > 0 ? meta.duration / zoom : meta.duration;\n const safeViewStart = clampViewStart(viewStart, meta.duration, visibleDuration);\n const viewEnd = safeViewStart + visibleDuration;\n const pxPerSecond = visibleDuration > 0 && laneWidth > 0 ? laneWidth / visibleDuration : 0;\n const millisecondReadableZoom = laneWidth > 0 && meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * meta.duration) / (MILLISECOND_STEP * 10 * laneWidth)\n : MIN_TIMELINE_MAX_ZOOM;\n const maxZoom = Math.max(MIN_TIMELINE_MAX_ZOOM, millisecondReadableZoom);\n\n useEffect(() => {\n setZoom((current) => clamp(current, 1, maxZoom));\n }, [maxZoom]);\n\n useEffect(() => {\n setViewStart((current) => clampViewStart(current, meta.duration, meta.duration / zoom));\n }, [meta.duration, zoom]);\n\n useLayoutEffect(() => {\n const scroller = horizontalScrollRef.current;\n if (!scroller || pxPerSecond <= 0) return;\n const nextScrollLeft = safeViewStart * pxPerSecond;\n if (Math.abs(scroller.scrollLeft - nextScrollLeft) > 0.5) {\n scroller.scrollLeft = nextScrollLeft;\n }\n }, [open, pxPerSecond, safeViewStart]);\n\n useEffect(() => {\n if (!dockVisible) setPopover(null);\n }, [dockVisible]);\n\n const centerViewAt = useCallback((time: number) => {\n if (zoom <= 1 || meta.duration <= 0) return;\n const windowDuration = meta.duration / zoom;\n setViewStart(clampViewStart(time - windowDuration / 2, meta.duration, windowDuration));\n }, [meta.duration, zoom]);\n\n const resetView = useCallback(() => {\n setZoom(1);\n setViewStart(0);\n }, []);\n\n const handleReplay = useCallback(() => {\n setViewStart(0);\n TimelineStore.replay(meta.id);\n }, [meta.id]);\n\n const handleHorizontalScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n if (pxPerSecond <= 0) return;\n setViewStart(clampViewStart(\n e.currentTarget.scrollLeft / pxPerSecond,\n meta.duration,\n visibleDuration\n ));\n }, [meta.duration, pxPerSecond, visibleDuration]);\n\n const handleTimelineWheel = useCallback((e: React.WheelEvent<HTMLDivElement>) => {\n const scroller = horizontalScrollRef.current;\n if (!scroller || zoom <= 1) return;\n const horizontalDelta = Math.abs(e.deltaX) > Math.abs(e.deltaY)\n ? e.deltaX\n : e.shiftKey\n ? e.deltaY\n : 0;\n if (horizontalDelta === 0) return;\n e.preventDefault();\n scroller.scrollLeft += horizontalDelta;\n }, [zoom]);\n\n // Dragging scrubs. Option/Alt-drag preserves detailed zooming, while\n // Shift-drag first restores the full 1x range.\n const zoomDragRef = useRef<ZoomDragState | null>(null);\n const rulerScrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n visibleDuration: number;\n } | null>(null);\n\n const seekRulerFromClientX = useCallback((clientX: number) => {\n const scrub = rulerScrubRef.current;\n const contentWidth = scrub?.rect.width ?? 0;\n if (!scrub || contentWidth <= 0) return;\n TimelineStore.seek(\n meta.id,\n clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / contentWidth) * scrub.visibleDuration,\n scrub.viewStart,\n scrub.viewStart + scrub.visibleDuration\n )\n );\n }, [meta.id]);\n\n const handleRulerPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const contentWidth = rect.width;\n if (contentWidth <= 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (!e.altKey) {\n const resetView = e.shiftKey;\n rulerScrubRef.current = {\n wasPlaying: TimelineStore.getTransport(meta.id).playing,\n rect,\n viewStart: resetView ? 0 : safeViewStart,\n visibleDuration: resetView ? meta.duration : visibleDuration,\n };\n if (resetView) {\n setZoom(1);\n setViewStart(0);\n }\n TimelineStore.pause(meta.id);\n seekRulerFromClientX(e.clientX);\n return;\n }\n\n const anchorRatio = clamp((e.clientX - rect.left) / contentWidth, 0, 1);\n zoomDragRef.current = {\n pointerX: e.clientX,\n rect,\n zoom,\n viewStart: safeViewStart,\n anchorRatio,\n anchorTime: safeViewStart + anchorRatio * visibleDuration,\n moved: false,\n };\n }, [meta.duration, meta.id, safeViewStart, seekRulerFromClientX, visibleDuration, zoom]);\n\n const handleRulerPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (rulerScrubRef.current) {\n seekRulerFromClientX(e.clientX);\n return;\n }\n const drag = zoomDragRef.current;\n if (!drag || meta.duration <= 0) return;\n const dx = e.clientX - drag.pointerX;\n if (!drag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n\n const nextZoom = clamp(drag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom);\n const nextVisibleDuration = meta.duration / nextZoom;\n const nextStart = clampViewStart(\n drag.anchorTime - drag.anchorRatio * nextVisibleDuration,\n meta.duration,\n nextVisibleDuration\n );\n setZoom(nextZoom);\n setViewStart(nextStart);\n }, [maxZoom, meta.duration, seekRulerFromClientX]);\n\n const handleRulerPointerUp = useCallback(() => {\n if (rulerScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n rulerScrubRef.current = null;\n zoomDragRef.current = null;\n }, [meta.id]);\n\n const handleRulerPointerCancel = useCallback(() => {\n if (rulerScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n rulerScrubRef.current = null;\n zoomDragRef.current = null;\n }, [meta.id]);\n\n const trackScrubRef = useRef<{\n wasPlaying: boolean;\n rect: DOMRect;\n viewStart: number;\n visibleDuration: number;\n } | null>(null);\n\n const seekTrackFromClientX = useCallback((clientX: number) => {\n const scrub = trackScrubRef.current;\n const contentWidth = scrub?.rect.width ?? 0;\n if (!scrub || contentWidth <= 0) return;\n const nextTime = clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / contentWidth) * scrub.visibleDuration,\n scrub.viewStart,\n scrub.viewStart + scrub.visibleDuration\n );\n TimelineStore.seek(meta.id, nextTime);\n }, [meta.id]);\n\n const handleTrackPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!e.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef.current?.getBoundingClientRect();\n if (!rect) return;\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n const resetView = e.shiftKey;\n trackScrubRef.current = {\n wasPlaying: TimelineStore.getTransport(meta.id).playing,\n rect,\n viewStart: resetView ? 0 : safeViewStart,\n visibleDuration: resetView ? meta.duration : visibleDuration,\n };\n if (resetView) {\n setZoom(1);\n setViewStart(0);\n }\n setPopover(null);\n TimelineStore.pause(meta.id);\n seekTrackFromClientX(e.clientX);\n }, [meta.duration, meta.id, safeViewStart, seekTrackFromClientX, visibleDuration]);\n\n const handleTrackPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (trackScrubRef.current) seekTrackFromClientX(e.clientX);\n }, [seekTrackFromClientX]);\n\n const finishTrackScrub = useCallback(() => {\n if (trackScrubRef.current?.wasPlaying) TimelineStore.play(meta.id);\n trackScrubRef.current = null;\n }, [meta.id]);\n\n const handleCopy = useCallback(() => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(meta.id), meta.clips);\n navigator.clipboard.writeText(buildCopyInstruction('useDialTimeline', meta.name, normalized));\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [meta.clips, meta.id, meta.name]);\n\n const handleAddPreset = useCallback(() => {\n DialStore.savePreset(meta.id, `Version ${presets.length + 2}`);\n }, [meta.id, presets.length]);\n\n const closePopover = useCallback(() => setPopover(null), []);\n\n const openClipPopover = useCallback(\n (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const exclude = stepKey ? undefined : clipPopoverExclusions(clip);\n // Guard clips whose folder has not registered yet.\n if (getClipControls(meta.id, targetPath, exclude).length === 0) return;\n setPopover((prev) =>\n prev?.clip.key === clip.key && prev?.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n }\n );\n },\n [meta.id]\n );\n\n const toggleTracks = useCallback((clipKey: string) => {\n setExpandedTracks((prev) => {\n const next = new Set(prev);\n if (next.has(clipKey)) next.delete(clipKey);\n else next.add(clipKey);\n return next;\n });\n }, []);\n\n // A props clip's bar is a read-only composite — clicking it expands the\n // tracks instead of opening an editor.\n const handleBarClick = useCallback(\n (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) {\n toggleTracks(clip.key);\n return;\n }\n openClipPopover(clip, rect, stepKey);\n },\n [openClipPopover, toggleTracks]\n );\n\n const toggleGroup = useCallback((group: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(group)) next.delete(group);\n else next.add(group);\n return next;\n });\n }, []);\n\n // Ruler ticks\n const rawStep = pxPerSecond > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond : 1;\n const adaptiveMajorStep = SECOND_TICK_STEPS.find((step) => step >= rawStep) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom < 1.5 && meta.duration >= 1 ? Math.max(1, adaptiveMajorStep) : adaptiveMajorStep;\n const fineTickStep = majorStep / 10;\n const majorTicks: number[] = [];\n const mediumTicks: number[] = [];\n const fineTicks: number[] = [];\n const firstMajorTick = Math.ceil((safeViewStart - 1e-6) / majorStep) * majorStep;\n for (let t = firstMajorTick; t <= viewEnd + 1e-6; t += majorStep) {\n majorTicks.push(Number(t.toFixed(4)));\n }\n const firstFineIndex = Math.ceil((safeViewStart - 1e-6) / fineTickStep);\n const lastFineIndex = Math.floor((viewEnd + 1e-6) / fineTickStep);\n for (let index = firstFineIndex; index <= lastFineIndex; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineTickStep).toFixed(6));\n if (index % 5 === 0) mediumTicks.push(tick);\n else fineTicks.push(tick);\n }\n\n // Rows: clips in config order, grouped clips under a collapsible header,\n // props clips expandable into full per-property track rows.\n const rows: ReactNode[] = [];\n let lastGroup: string | undefined;\n for (const clip of meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const isCollapsed = collapsedGroups.has(group);\n rows.push(\n <div key={`group:${group}`} className=\"dialkit-timeline-row dialkit-timeline-group-row\">\n <div className=\"dialkit-timeline-label\">\n <button\n className=\"dialkit-timeline-group-toggle\"\n data-open={!isCollapsed}\n onClick={() => toggleGroup(group)}\n title={isCollapsed ? 'Expand layer' : 'Collapse layer'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n <span>{formatLabel(group)}</span>\n </div>\n <div className=\"dialkit-timeline-lane\" />\n </div>\n );\n }\n }\n if (clip.group && collapsedGroups.has(clip.group)) continue;\n\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks.has(clip.key);\n const stat = computeClipStaticFromValues(values, clip, meta.duration);\n\n rows.push(\n <div key={clip.key} className=\"dialkit-timeline-row\" data-grouped={clip.group ? '' : undefined}>\n <div className=\"dialkit-timeline-label\">\n {isProps ? (\n <button\n className=\"dialkit-timeline-group-toggle\"\n data-open={tracksOpen}\n onClick={(e) => {\n e.stopPropagation();\n toggleTracks(clip.key);\n }}\n title={tracksOpen ? 'Collapse properties' : 'Expand properties'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n ) : null}\n {clip.label}\n </div>\n <div className=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={meta.id}\n clip={clip}\n at={stat.at}\n duration={stat.duration}\n loop={stat.loop}\n steps={clip.stepKeys?.length ? stat.tracks[0]?.steps : undefined}\n fixedDuration={isProps ? true : stat.isPhysics}\n composite={isProps}\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n timelineDuration={meta.duration}\n selected={popover?.clip.key === clip.key}\n selectedStepKey={popover?.clip.key === clip.key ? popover.stepKey : undefined}\n onClick={handleBarClick}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n\n // Expanded tracks: each property is a full clip row of its own — its\n // values, curve, and duration are all editable; the bar position is the\n // track's delay (its phase offset from the clip's `at`).\n if (tracksOpen) {\n for (const trackRef of clip.tracks ?? []) {\n const track = stat.tracks.find((candidate) => candidate.prop === trackRef.prop);\n if (!track) continue;\n const trackKey = `${clip.key}.${trackRef.prop}`;\n const trackMeta: TimelineClipMeta = {\n key: trackKey,\n label: `${clip.label} · ${formatLabel(trackRef.prop)}`,\n color: clip.color,\n loop: clip.loop,\n group: clip.group,\n stepKeys: trackRef.stepKeys,\n };\n rows.push(\n <div\n key={trackKey}\n className=\"dialkit-timeline-row dialkit-timeline-track-row\"\n data-grouped={clip.group ? '' : undefined}\n >\n <div className=\"dialkit-timeline-label\">{formatLabel(trackRef.prop)}</div>\n <div className=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={meta.id}\n clip={trackMeta}\n at={stat.at + track.delay}\n duration={track.duration}\n loop={stat.loop}\n steps={trackRef.stepKeys?.length ? track.steps : undefined}\n fixedDuration={!trackRef.stepKeys?.length && track.steps[0]?.isPhysics === true}\n baseAt={stat.at}\n delayMode\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n timelineDuration={meta.duration}\n selected={popover?.clip.key === trackKey}\n selectedStepKey={popover?.clip.key === trackKey ? popover.stepKey : undefined}\n onClick={openClipPopover}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n }\n }\n }\n\n return (\n <div className=\"dialkit-timeline-section\">\n <div className=\"dialkit-timeline-header\" data-open={open || undefined}>\n <div className=\"dialkit-timeline-identity\">\n <span className=\"dialkit-timeline-title\">{meta.name}</span>\n </div>\n {!open && (\n <TimelineOverview\n id={meta.id}\n duration={meta.duration}\n viewStart={safeViewStart}\n viewEnd={viewEnd}\n onNavigate={centerViewAt}\n />\n )}\n <div className=\"dialkit-timeline-actions\">\n <PlayPauseButton id={meta.id} />\n <ReplayButton onReplay={handleReplay} />\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add timeline version\"\n aria-label=\"Add timeline version\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {ICON_ADD_PRESET.map((d, i) => <path key={i} d={d} />)}\n </svg>\n </motion.button>\n <PresetManager\n panelId={meta.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n aria-label={copied ? 'Copied parameters' : 'Copy parameters'}\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {copied ? (\n <motion.svg\n key=\"check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CHECK} />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n <button\n className=\"dialkit-timeline-chevron\"\n data-open={open}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n title={open ? 'Collapse timeline' : 'Expand timeline'}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n </div>\n </div>\n\n {open && (\n <div\n className=\"dialkit-timeline-body\"\n onWheel={handleTimelineWheel}\n onPointerDown={handleTrackPointerDown}\n onPointerMove={handleTrackPointerMove}\n onPointerUp={finishTrackScrub}\n onPointerCancel={finishTrackScrub}\n onLostPointerCapture={finishTrackScrub}\n >\n <div className=\"dialkit-timeline-grid\">\n <div className=\"dialkit-timeline-row dialkit-timeline-ruler-row\">\n <div className=\"dialkit-timeline-label\" />\n <div\n ref={laneAreaRef}\n className=\"dialkit-timeline-ruler\"\n onPointerDown={handleRulerPointerDown}\n onPointerMove={handleRulerPointerMove}\n onPointerUp={handleRulerPointerUp}\n onPointerCancel={handleRulerPointerCancel}\n onLostPointerCapture={handleRulerPointerCancel}\n title=\"Drag to seek · Option-drag to zoom · Shift-drag to reset zoom\"\n >\n {fineTicks.map((t) => (\n <div key={`fine:${t}`} className=\"dialkit-timeline-tick dialkit-timeline-tick-fine\" style={{ left: (t - safeViewStart) * pxPerSecond }} />\n ))}\n {mediumTicks.map((t) => (\n <div key={`medium:${t}`} className=\"dialkit-timeline-tick dialkit-timeline-tick-medium\" style={{ left: (t - safeViewStart) * pxPerSecond }} />\n ))}\n {majorTicks.map((t) => (\n <div key={t} className=\"dialkit-timeline-tick\" style={{ left: (t - safeViewStart) * pxPerSecond }}>\n <span className=\"dialkit-timeline-tick-label\">{formatRulerSeconds(t, majorStep)}</span>\n </div>\n ))}\n </div>\n </div>\n {rows}\n\n {pxPerSecond > 0 && (\n <TimelinePlayheadFlag\n id={meta.id}\n duration={meta.duration}\n pxPerSecond={pxPerSecond}\n viewStart={safeViewStart}\n viewEnd={viewEnd}\n laneWidth={laneWidth}\n rulerRef={laneAreaRef}\n onResetView={resetView}\n />\n )}\n </div>\n {zoom > 1 && (\n <div className=\"dialkit-timeline-scroll-row\">\n <div className=\"dialkit-timeline-label\" />\n <div\n ref={horizontalScrollRef}\n className=\"dialkit-timeline-horizontal-scroll\"\n onScroll={handleHorizontalScroll}\n aria-label=\"Timeline horizontal scroll\"\n >\n <div style={{ width: laneWidth * zoom }} />\n </div>\n </div>\n )}\n </div>\n )}\n\n {popover && (\n <ClipPopover\n panelId={meta.id}\n popover={popover}\n values={values}\n theme={theme}\n onClose={closePopover}\n />\n )}\n </div>\n );\n});\n\n// ── Clip popover ──\n\n// Popover anchored above a clip (or one leg of a sequence), reusing the\n// standard DialKit controls for the target's transition/from/to values.\n// Portaled to <body> because the dock's backdrop-filter creates a containing\n// block for fixed positioning.\nfunction ClipPopover({\n panelId,\n popover,\n values,\n theme,\n onClose,\n}: {\n panelId: string;\n popover: PopoverState;\n values: Record<string, DialValue>;\n theme: DialTheme;\n onClose: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [naturalHeight, setNaturalHeight] = useState(0);\n const [viewport, setViewport] = useState(() => ({\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n }));\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n const measure = () => setNaturalHeight(element.scrollHeight + 2);\n measure();\n const observer = new ResizeObserver(measure);\n const body = element.querySelector('.dialkit-timeline-popover-body');\n observer.observe(body ?? element);\n return () => observer.disconnect();\n }, [popover.clip.key, popover.stepKey]);\n\n useEffect(() => {\n const updateViewport = () => setViewport({\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n });\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n return () => {\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n };\n }, []);\n\n useEffect(() => {\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n if (ref.current?.contains(target)) return;\n // Let clip clicks handle their own toggle/switch\n if (target.closest?.('.dialkit-timeline-clip')) return;\n if (target.closest?.('.dialkit-timeline-label')) return;\n onClose();\n };\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [onClose]);\n\n const { clip, stepKey } = popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(panelId, `${clip.key}.${stepKey}`);\n // The first leg starts from the clip's `from` — show it where you edit\n // the leg, just above its targets.\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(panelId, `${clip.key}.from`);\n if (from) {\n const toIndex = controls.findIndex((control) => control.path === `${clip.key}.${stepKey}.to`);\n controls = toIndex >= 0\n ? [...controls.slice(0, toIndex), from, ...controls.slice(toIndex)]\n : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n if (controls.length === 0) return null;\n\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(panelId, `${targetPath}.duration`);\n const durationValue = durationMeta ? values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(panelId, durationMeta.path, next),\n min: Math.max(TIMELINE_MIN_CLIP_DURATION, durationMeta.min ?? 0),\n max: durationMeta.max,\n step: durationMeta.step,\n }\n : undefined;\n\n // The bar owns the durations, so show transitions as they actually run:\n // swap in the effective configs (durations injected from the clip/segment\n // lengths) for the visualization while edits still write through.\n const displayValues = timelinePopoverDisplayValues(values, clip.key, clip.stepKeys, stepKey);\n\n const viewportRight = viewport.offsetLeft + viewport.width;\n const viewportBottom = viewport.offsetTop + viewport.height;\n const popoverWidth = Math.min(POPOVER_WIDTH, Math.max(220, viewport.width - 24));\n const left = clamp(\n popover.anchor.left + popover.anchor.width / 2 - popoverWidth / 2,\n viewport.offsetLeft + 12,\n Math.max(viewport.offsetLeft + 12, viewportRight - popoverWidth - 12)\n );\n const spaceAbove = Math.max(0, popover.anchor.top - viewport.offsetTop - 22);\n const spaceBelow = Math.max(0, viewportBottom - popover.anchor.bottom - 22);\n const placeAbove = naturalHeight === 0\n ? spaceAbove >= spaceBelow\n : naturalHeight <= spaceAbove || (naturalHeight > spaceBelow && spaceAbove >= spaceBelow);\n const availableHeight = placeAbove ? spaceAbove : spaceBelow;\n const renderedHeight = Math.min(naturalHeight || availableHeight, availableHeight);\n const unclampedTop = placeAbove\n ? popover.anchor.top - 10 - renderedHeight\n : popover.anchor.bottom + 10;\n const top = clamp(\n unclampedTop,\n viewport.offsetTop + 12,\n Math.max(viewport.offsetTop + 12, viewportBottom - renderedHeight - 12)\n );\n\n return createPortal(\n <div className=\"dialkit-root\" data-theme={theme}>\n <div\n ref={ref}\n className=\"dialkit-timeline-popover\"\n data-placement={placeAbove ? 'above' : 'below'}\n style={{\n left,\n top,\n width: popoverWidth,\n maxHeight: availableHeight,\n visibility: naturalHeight > 0 ? 'visible' : 'hidden',\n }}\n role=\"dialog\"\n aria-label={`Edit ${title}`}\n >\n <div className=\"dialkit-timeline-popover-header\">\n <span className=\"dialkit-timeline-popover-title\">{title}</span>\n <button className=\"dialkit-timeline-popover-close\" onClick={onClose} title=\"Close editor\" aria-label=\"Close editor\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M6 6L18 18M18 6L6 18\" />\n </svg>\n </button>\n </div>\n <div className=\"dialkit-timeline-popover-body\">\n <ControlRenderer\n panelId={panelId}\n controls={controls}\n values={displayValues}\n transitionDuration={transitionDuration}\n />\n </div>\n </div>\n </div>,\n document.body\n );\n}\n\n// A clip-level popover hides its step folders (each leg has its own popover)\n// and its track folders (each track is its own row).\nfunction clipPopoverExclusions(clip: TimelineClipMeta): Set<string> {\n return new Set([\n ...(clip.stepKeys ?? []),\n ...(clip.tracks?.map((track) => track.prop) ?? []),\n ]);\n}\n\n// A target's non-timing properties. The timeline bars own clip and segment\n// timing, so their start and duration controls stay out of the popover.\nfunction getClipControls(\n panelId: string,\n controlPath: string,\n excludeChildren?: Set<string>\n): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, controlPath) : null;\n if (!folder?.children) return [];\n return folder.children\n .filter((control) => {\n const childKey = control.path.slice(controlPath.length + 1);\n if (childKey === 'at' || childKey === 'duration') return false;\n return !excludeChildren?.has(childKey);\n });\n}\n\nfunction getControlAt(panelId: string, path: string): ControlMeta | null {\n const panel = DialStore.getPanel(panelId);\n return panel ? findControl(panel.controls, path) : null;\n}\n\n// ── Clip bar ──\n\ntype DragState = {\n mode: 'move' | 'start' | 'end' | 'boundary';\n boundaryIndex?: number;\n pointerX: number;\n at: number;\n duration: number;\n stepDurations?: number[];\n clickEl: HTMLElement | null;\n moved: boolean;\n};\n\nfunction TimelineClip({\n timelineId,\n clip,\n at,\n duration,\n loop,\n steps,\n fixedDuration,\n composite = false,\n baseAt = 0,\n delayMode = false,\n pxPerSecond,\n viewStart,\n timelineDuration,\n selected,\n selectedStepKey,\n onClick,\n onDrag,\n}: {\n timelineId: string;\n clip: TimelineClipMeta;\n at: number;\n duration: number;\n loop: TimelineClipLoop;\n steps?: TimelineStepStatic[];\n fixedDuration: boolean;\n /** Read-only composite bar of a props clip — no handles, no editor. */\n composite?: boolean;\n /** Track rows: position = baseAt + delay; dragging edits the delay. */\n baseAt?: number;\n delayMode?: boolean;\n pxPerSecond: number;\n viewStart: number;\n timelineDuration: number;\n selected: boolean;\n selectedStepKey?: string;\n onClick: (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void;\n onDrag: () => void;\n}) {\n const dragRef = useRef<DragState | null>(null);\n const [dragging, setDragging] = useState(false);\n const isSteps = Boolean(steps?.length);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.shiftKey) return;\n e.stopPropagation();\n const target = e.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n const boundary = target.dataset?.boundary;\n if (boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(boundary);\n } else if (!fixedDuration) {\n const edge = target.dataset?.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n dragRef.current = {\n mode,\n boundaryIndex,\n pointerX: e.clientX,\n at,\n duration,\n stepDurations: steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]') ?? null,\n moved: false,\n };\n e.currentTarget.setPointerCapture(e.pointerId);\n },\n [at, duration, fixedDuration, steps]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag || pxPerSecond <= 0) return;\n\n const dx = e.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n setDragging(true);\n onDrag();\n }\n\n const dt = dx / pxPerSecond;\n if (drag.mode === 'boundary' && steps && drag.stepDurations) {\n // Trimming a leg ripples the later legs — the bar grows or shrinks.\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, d, j) => (j === index ? sum : sum + d), 0);\n DialStore.updateValue(\n timelineId,\n `${clip.key}.${steps[index].key ?? ''}.duration`,\n clampStepResize(drag.stepDurations[index] + dt, drag.at, others, timelineDuration)\n );\n } else if (drag.mode === 'move') {\n if (delayMode) {\n DialStore.updateValue(\n timelineId,\n `${clip.key}.delay`,\n clampTrackDelay(drag.at + dt - baseAt, baseAt, drag.duration, timelineDuration)\n );\n } else {\n DialStore.updateValue(timelineId, `${clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, timelineDuration));\n }\n } else if (drag.mode === 'end') {\n DialStore.updateValue(\n timelineId,\n `${clip.key}.duration`,\n clampClipResizeEnd(drag.duration + dt, drag.at, timelineDuration)\n );\n } else if (steps && drag.stepDurations) {\n // Start edge of a sequence: trade time between position and the\n // first leg.\n const limit = Math.max(baseAt, 0);\n const next = clampClipResizeStart(Math.max(drag.at + dt, limit), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(timelineId, {\n [delayMode ? `${clip.key}.delay` : `${clip.key}.at`]: delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${clip.key}.${steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const limit = Math.max(baseAt, 0);\n const next = clampClipResizeStart(Math.max(drag.at + dt, limit), drag.at, drag.duration);\n DialStore.updateValues(timelineId, {\n [delayMode ? `${clip.key}.delay` : `${clip.key}.at`]: delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${clip.key}.duration`]: next.duration,\n });\n }\n },\n [baseAt, clip.key, delayMode, onDrag, pxPerSecond, steps, timelineId, timelineDuration]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n dragRef.current = null;\n setDragging(false);\n if (drag && !drag.moved) {\n const stepKey = drag.clickEl?.dataset?.step;\n const anchorEl = drag.clickEl ?? e.currentTarget;\n onClick(clip, anchorEl.getBoundingClientRect(), stepKey);\n }\n },\n [clip, onClick]\n );\n\n const handlePointerCancel = useCallback(() => {\n dragRef.current = null;\n setDragging(false);\n }, []);\n\n const width = Math.max(duration * pxPerSecond, 14);\n const resizable = duration > 0 && !fixedDuration && !composite;\n const durationText = `${fixedDuration && !composite ? '~' : ''}${formatSeconds(duration)}`;\n const looping = loop === 'repeat' && duration > 0;\n const ghostCycles: Array<{ start: number; duration: number; index: number }> = [];\n if (looping) {\n const maxGhostCycles = 256;\n const firstGhostIndex = Math.max(1, Math.floor((viewStart - at) / duration));\n for (let offset = 0; offset < maxGhostCycles; offset++) {\n const index = firstGhostIndex + offset;\n const start = at + duration * index;\n if (start >= timelineDuration - 1e-6) break;\n ghostCycles.push({\n start,\n duration: Math.min(duration, timelineDuration - start),\n index,\n });\n }\n }\n // Boundary handles sit at each leg's right edge (the last one resizes the\n // final leg — the end of the bar).\n const boundaryOffsets: number[] = [];\n if (steps) {\n let cumulative = 0;\n for (const step of steps) {\n cumulative += step.duration;\n boundaryOffsets.push(cumulative);\n }\n }\n\n const barTitle = composite\n ? `${clip.label} — composite of its property tracks${looping ? ' · repeats through timeline' : ''} · click to expand`\n : `${clip.label} — ${formatSeconds(at)} for ${durationText}${fixedDuration ? ' (duration set by spring physics)' : ''}${looping ? ' · repeats through timeline' : ''}${delayMode ? ' · drag to phase-shift' : ''}`;\n\n return (\n <>\n {ghostCycles.map((cycle) => {\n const ghostWidth = Math.max(1, cycle.duration * pxPerSecond - 2);\n return (\n <div\n key={`ghost:${cycle.index}`}\n className=\"dialkit-timeline-clip-ghost\"\n data-steps={isSteps || undefined}\n aria-hidden=\"true\"\n style={{\n left: (cycle.start - viewStart) * pxPerSecond + 1,\n width: ghostWidth,\n background: clip.color,\n }}\n >\n {steps?.map((step, stepIndex) => (\n <span\n key={step.key ?? `step:${stepIndex}`}\n className=\"dialkit-timeline-clip-ghost-segment\"\n style={{ width: step.duration * pxPerSecond }}\n />\n ))}\n </div>\n );\n })}\n <div\n className=\"dialkit-timeline-clip\"\n data-steps={isSteps || undefined}\n data-composite={composite || undefined}\n data-selected={selected || undefined}\n data-dragging={dragging || undefined}\n style={{\n left: (at - viewStart) * pxPerSecond,\n width,\n background: composite ? `${clip.color}80` : clip.color,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handlePointerCancel}\n title={barTitle}\n >\n {composite ? (\n <>{width > 56 && <span className=\"dialkit-timeline-clip-duration\">{durationText}</span>}</>\n ) : isSteps ? (\n <>\n {steps!.map((step) => {\n const segmentWidth = step.duration * pxPerSecond;\n return (\n <div\n key={step.key ?? 'step'}\n className=\"dialkit-timeline-clip-segment\"\n data-step={step.key ?? undefined}\n data-selected={selectedStepKey === step.key || undefined}\n style={{ width: segmentWidth }}\n >\n {segmentWidth > 52 && (\n <span className=\"dialkit-timeline-clip-duration\">{formatSeconds(step.duration)}</span>\n )}\n </div>\n );\n })}\n {steps!.map((step, index) =>\n step.isPhysics ? null : (\n <div\n key={`boundary:${step.key}`}\n className=\"dialkit-timeline-clip-handle\"\n data-boundary={index}\n style={{ left: boundaryOffsets[index] * pxPerSecond - 4 }}\n />\n )\n )}\n {!steps![0].isPhysics && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"start\" />}\n </>\n ) : (\n <>\n {resizable && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"start\" />}\n {width > 56 && <span className=\"dialkit-timeline-clip-duration\">{durationText}</span>}\n {resizable && <div className=\"dialkit-timeline-clip-handle\" data-edge=\"end\" />}\n </>\n )}\n </div>\n {looping && (\n <span className=\"dialkit-timeline-loop-infinity\" aria-hidden=\"true\" title=\"Repeats indefinitely\">\n ∞\n </span>\n )}\n </>\n );\n}\n","interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup({ buttons }: ButtonGroupProps) {\n return (\n <div className=\"dialkit-button-group\">\n {buttons.map((button, index) => (\n <button\n key={index}\n className=\"dialkit-button\"\n onClick={button.onClick}\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, ShortcutConfig } from '../store/DialStore';\n\ninterface ShortcutsMenuProps {\n panelId: string;\n}\n\nfunction formatShortcutKey(sc: ShortcutConfig): string {\n if (!sc.key) return '—';\n const mod = sc.modifier === 'alt' ? '⌥'\n : sc.modifier === 'shift' ? '⇧'\n : sc.modifier === 'meta' ? '⌘'\n : '';\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatInteraction(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n switch (interaction) {\n case 'scroll': return sc.key ? 'key+scroll' : 'scroll';\n case 'drag': return 'key+drag';\n case 'move': return 'key+move';\n case 'scroll-only': return 'scroll';\n }\n}\n\nexport function ShortcutsMenu({ panelId }: ShortcutsMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n\n const open = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, right: window.innerWidth - rect.right });\n }\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on mousedown outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const panel = DialStore.getPanel(panelId);\n if (!panel) return null;\n\n const shortcuts = Object.entries(panel.shortcuts);\n if (shortcuts.length === 0) return null;\n\n // Build shortcut rows with labels from controls\n const rows = shortcuts.map(([path, shortcut]) => {\n // Find control label\n const findLabel = (controls: typeof panel.controls): string => {\n for (const c of controls) {\n if (c.path === path) return c.label;\n if (c.type === 'folder' && c.children) {\n const found = findLabel(c.children);\n if (found) return found;\n }\n }\n return path;\n };\n return {\n path,\n shortcut,\n label: findLabel(panel.controls),\n };\n });\n\n return (\n <>\n <motion.button\n ref={triggerRef}\n className=\"dialkit-shortcuts-trigger\"\n onClick={toggle}\n title=\"Keyboard shortcuts\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" />\n <path d=\"M6 10H6.01\" />\n <path d=\"M10 10H10.01\" />\n <path d=\"M14 10H14.01\" />\n <path d=\"M18 10H18.01\" />\n <path d=\"M8 14H16\" />\n </svg>\n </motion.button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-shortcuts-dropdown\"\n style={{ position: 'fixed', top: pos.top, right: pos.right }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div className=\"dialkit-shortcuts-title\">Keyboard Shortcuts</div>\n <div className=\"dialkit-shortcuts-list\">\n {rows.map((row) => (\n <div key={row.path} className=\"dialkit-shortcuts-row\">\n <span className=\"dialkit-shortcuts-row-key\">\n {formatShortcutKey(row.shortcut)}\n </span>\n <span className=\"dialkit-shortcuts-row-label\">{row.label}</span>\n <span className=\"dialkit-shortcuts-row-mode\">{formatInteraction(row.shortcut)}</span>\n </div>\n ))}\n </div>\n <div className=\"dialkit-shortcuts-hint\">See pill badges on controls for keys</div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_react_dom","import_react","import_react","import_react","import_react","import_jsx_runtime","target","import_react","import_jsx_runtime","discreteSteps","import_react","import_jsx_runtime","import_jsx_runtime","wd","t","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_dom","import_jsx_runtime","DialTimeline","TimelineSection","resetView","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime"]}