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.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/solid/index.js +2 -0
- package/dist/solid/index.js.map +1 -1
- package/dist/styles.css +6 -8
- package/dist/svelte/components/Slider.svelte +2 -0
- package/dist/svelte/theme-css.d.ts +1 -1
- package/dist/svelte/theme-css.d.ts.map +1 -1
- package/dist/svelte/theme-css.js +6 -8
- package/dist/vue/index.js +4 -0
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/dist/vue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/vue/useDialKit.ts","../../src/store/DialStore.ts","../../src/vue/useDialTimeline.ts","../../src/store/TimelineStore.ts","../../src/transition-math.ts","../../src/timeline-core.ts","../../src/timeline/adapter.ts","../../src/store/TimelineUiStore.ts","../../src/copy-instruction.ts","../../src/env.ts","../../src/vue/directives/dialkit.ts","../../src/vue/components/DialRoot.ts","../../src/vue/components/Folder.ts","../../src/icons.ts","../../src/vue/components/Panel.ts","../../src/vue/components/Slider.ts","../../src/shortcut-utils.ts","../../src/vue/components/Toggle.ts","../../src/vue/components/SegmentedControl.ts","../../src/vue/components/SpringControl.ts","../../src/vue/components/SpringVisualization.ts","../../src/vue/components/TransitionControl.ts","../../src/vue/components/EasingVisualization.ts","../../src/vue/components/TextControl.ts","../../src/vue/components/SelectControl.ts","../../src/dropdown-position.ts","../../src/vue/components/ColorControl.ts","../../src/vue/components/PresetManager.ts","../../src/vue/components/ShortcutListener.ts","../../src/vue/components/Timeline/TimelineToggleButton.ts","../../src/panel-drag.ts","../../src/vue/components/Timeline/DialTimeline.ts","../../src/vue/components/ControlRenderer.ts","../../src/vue/components/ShortcutsMenu.ts","../../src/vue/components/ButtonGroup.ts"],"sourcesContent":["import { computed, onMounted, onUnmounted, ref, shallowRef, watch, type ComputedRef } from 'vue';\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';\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: ComputedRef<ResolvedValues<T>>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nlet dialKitInstance = 0;\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ComputedRef<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 hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${++dialKitInstance}`;\n const configRef = shallowRef(config);\n const onActionRef = ref(options?.onAction);\n const shortcutsRef = shallowRef(options?.shortcuts);\n const persistRef = shallowRef(options?.persist);\n const flatValues = ref<Record<string, DialValue>>(DialStore.getValues(panelId));\n const mounted = ref(false);\n const serializedConfig = computed(() => JSON.stringify(config));\n const serializedShortcuts = computed(() => JSON.stringify(options?.shortcuts));\n const serializedPersist = computed(() => JSON.stringify(options?.persist));\n\n let unsubscribeValues: (() => void) | undefined;\n let unsubscribeActions: (() => void) | undefined;\n\n const register = () => {\n DialStore.registerPanel(panelId, name, configRef.value, shortcutsRef.value, {\n retainOnUnmount: hasStableId,\n persist: persistRef.value,\n });\n flatValues.value = DialStore.getValues(panelId);\n\n unsubscribeValues = DialStore.subscribe(panelId, () => {\n flatValues.value = DialStore.getValues(panelId);\n });\n\n unsubscribeActions = DialStore.subscribeActions(panelId, (action) => {\n onActionRef.value?.(action);\n });\n };\n\n watch(() => options?.onAction, (next) => {\n onActionRef.value = next;\n });\n\n watch(() => options?.shortcuts, (next) => {\n shortcutsRef.value = next;\n });\n\n watch(() => options?.persist, (next) => {\n persistRef.value = next;\n });\n\n watch([serializedConfig, serializedShortcuts, serializedPersist], () => {\n configRef.value = config;\n shortcutsRef.value = options?.shortcuts;\n persistRef.value = options?.persist;\n if (mounted.value) {\n DialStore.updatePanel(panelId, name, configRef.value, shortcutsRef.value, {\n retainOnUnmount: hasStableId,\n persist: persistRef.value,\n });\n flatValues.value = DialStore.getValues(panelId);\n }\n });\n\n onMounted(register);\n onMounted(() => {\n mounted.value = true;\n });\n\n onUnmounted(() => {\n unsubscribeValues?.();\n unsubscribeActions?.();\n DialStore.unregisterPanel(panelId);\n });\n\n const values = computed(() => resolveDialValues(configRef.value, flatValues.value));\n\n return {\n values,\n setValue(path, value) {\n DialStore.updateValue(panelId, path, value);\n },\n setValues(nextValues) {\n DialStore.updateValues(panelId, flattenDialValueUpdates(configRef.value, nextValues));\n },\n resetValues() {\n DialStore.resetValues(panelId);\n },\n getValues() {\n return resolveDialValues(configRef.value, DialStore.getValues(panelId));\n },\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 { computed, onMounted, onUnmounted, shallowRef, watch, type ComputedRef } from 'vue';\nimport { DialStore } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n computeStaticTimeline,\n parseTimelineConfig,\n resolveTimelineLoop,\n type DialTimelineOptions,\n type DialTimelineValues,\n type TimelineConfig,\n} from '../timeline';\n\nexport type UseDialTimelineOptions = DialTimelineOptions;\n\nlet timelineInstance = 0;\n\nexport function useDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: UseDialTimelineOptions\n): ComputedRef<DialTimelineValues<T>> {\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${++timelineInstance}`;\n const serializedConfig = computed(() => JSON.stringify(config));\n const serializedPersist = computed(() => JSON.stringify(options?.persist));\n const serializedLoop = computed(() => JSON.stringify(options?.loop));\n const parsed = computed(() => {\n serializedConfig.value;\n return parseTimelineConfig(config);\n });\n const flatValues = shallowRef(DialStore.getValues(panelId));\n const transport = shallowRef(TimelineStore.getTransport(panelId));\n const staticTimeline = computed(() => computeStaticTimeline(parsed.value, flatValues.value));\n const meta = computed(() => {\n serializedLoop.value;\n return buildTimelineMeta(\n panelId,\n name,\n staticTimeline.value.duration,\n parsed.value,\n options?.loop\n );\n });\n let mounted = false;\n let unsubscribeValues: (() => void) | undefined;\n let unsubscribeTransport: (() => void) | undefined;\n\n const play = () => TimelineStore.play(panelId);\n const pause = () => TimelineStore.pause(panelId);\n const replay = () => TimelineStore.replay(panelId);\n const seek = (time: number) => TimelineStore.seek(panelId, time);\n\n watch([serializedConfig, serializedPersist], () => {\n if (!mounted) return;\n DialStore.updatePanel(panelId, name, parsed.value.dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n flatValues.value = DialStore.getValues(panelId);\n });\n\n watch(meta, (nextMeta) => {\n if (mounted) TimelineStore.update(nextMeta);\n });\n\n onMounted(() => {\n unsubscribeValues = DialStore.subscribe(panelId, () => {\n flatValues.value = DialStore.getValues(panelId);\n });\n unsubscribeTransport = TimelineStore.subscribe(panelId, () => {\n transport.value = TimelineStore.getTransport(panelId);\n });\n\n DialStore.registerPanel(panelId, name, parsed.value.dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n flatValues.value = DialStore.getValues(panelId);\n TimelineStore.register(meta.value, { autoplay: options?.autoplay ?? true });\n transport.value = TimelineStore.getTransport(panelId);\n mounted = true;\n });\n\n onUnmounted(() => {\n mounted = false;\n unsubscribeValues?.();\n unsubscribeTransport?.();\n TimelineStore.unregister(panelId);\n DialStore.unregisterPanel(panelId);\n });\n\n return computed(() => {\n const currentStatic = staticTimeline.value;\n return buildTimelineValues<T>(\n currentStatic.clips,\n transport.value,\n currentStatic.duration,\n resolveTimelineLoop(options?.loop).start,\n { play, pause, replay, seek }\n );\n });\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","// 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","// 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","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","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","// 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 {\n createApp,\n defineComponent,\n h,\n shallowRef,\n type App,\n type ObjectDirective,\n type ShallowRef,\n} from 'vue';\nimport { DialRoot, type DialMode, type DialPosition } from '../components/DialRoot';\n\nexport interface DialKitDirectiveOptions {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport type DialKitDirectiveValue = DialMode | DialKitDirectiveOptions | undefined;\n\ntype DirectiveState = {\n app: App;\n host: HTMLDivElement;\n props: ShallowRef<DialKitDirectiveOptions>;\n};\n\nconst states = new WeakMap<HTMLElement, DirectiveState>();\n\nfunction normalizeDirectiveValue(value: DialKitDirectiveValue): DialKitDirectiveOptions {\n if (!value) return {};\n if (value === 'inline' || value === 'popover') {\n return { mode: value };\n }\n return value;\n}\n\nfunction mountDialRoot(el: HTMLElement, value: DialKitDirectiveValue) {\n if (typeof window === 'undefined') return;\n\n const host = document.createElement('div');\n el.appendChild(host);\n\n const props = shallowRef<DialKitDirectiveOptions>(normalizeDirectiveValue(value));\n const RootHost = defineComponent({\n name: 'DialKitDirectiveHost',\n setup() {\n return () => h(DialRoot, props.value);\n },\n });\n\n const app = createApp(RootHost);\n app.mount(host);\n\n states.set(el, { app, host, props });\n}\n\nfunction unmountDialRoot(el: HTMLElement) {\n const state = states.get(el);\n if (!state) return;\n\n state.app.unmount();\n state.host.remove();\n states.delete(el);\n}\n\nexport const vDialKit: ObjectDirective<HTMLElement, DialKitDirectiveValue> = {\n mounted(el, binding) {\n mountDialRoot(el, binding.value);\n },\n updated(el, binding) {\n const state = states.get(el);\n if (!state) {\n mountDialRoot(el, binding.value);\n return;\n }\n state.props.value = normalizeDirectiveValue(binding.value);\n },\n beforeUnmount(el) {\n unmountDialRoot(el);\n },\n};\n","import { computed, defineComponent, h, nextTick, onMounted, onUnmounted, ref, Teleport } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { PanelConfig } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport type { TimelineMeta } from '../../store/TimelineStore';\nimport { Folder } from './Folder';\nimport { Panel } from './Panel';\nimport { ShortcutListener } from './ShortcutListener';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport {\n blockPanelDragClick,\n getPanelDragHandle,\n getPanelDragOffset,\n getPanelDragStart,\n getPanelOriginX,\n hasPanelDragMoved,\n type PanelDragOffset,\n type PanelDragStart,\n} 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\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nconst 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\nexport const DialRoot = defineComponent({\n name: 'DialKitDialRoot',\n props: {\n position: {\n type: String as () => DialPosition,\n default: 'top-right',\n },\n defaultOpen: {\n type: Boolean,\n default: true,\n },\n mode: {\n type: String as () => DialMode,\n default: 'popover',\n },\n theme: {\n type: String as () => DialTheme,\n default: 'system',\n },\n productionEnabled: {\n type: Boolean,\n default: isDevDefault,\n },\n },\n emits: ['openChange'],\n setup(props, { emit }) {\n const panels = ref<PanelConfig[]>([]);\n const timelines = ref<TimelineMeta[]>([]);\n const mounted = ref(false);\n const panelRef = ref<HTMLDivElement | null>(null);\n const dragOffset = ref<PanelDragOffset | null>(null);\n const activePosition = ref<DialPosition>(props.position);\n let unsubscribePanels: (() => void) | undefined;\n let unsubscribeTimelines: (() => void) | undefined;\n let observer: MutationObserver | undefined;\n let lastDragOffset: PanelDragOffset | null = null;\n let dragging = false;\n let dragStart: PanelDragStart | null = null;\n let didDrag = false;\n let dragTarget: HTMLElement | null = null;\n let panelOpenStates = new Map<string, boolean>();\n let rootOpen: boolean | undefined;\n\n const syncPanelOpenStates = () => {\n const fallbackOpen = props.mode === 'inline' || props.defaultOpen;\n const nextStates = new Map<string, boolean>();\n for (const panel of panels.value) {\n nextStates.set(panel.id, panelOpenStates.get(panel.id) ?? fallbackOpen);\n }\n panelOpenStates = nextStates;\n rootOpen = Array.from(nextStates.values()).some(Boolean);\n };\n\n const connectObserver = () => {\n if (observer || props.mode === 'inline' || !panelRef.value) return;\n\n observer = new MutationObserver(() => {\n const inners = panelRef.value?.querySelectorAll('.dialkit-panel-inner');\n if (!inners || inners.length === 0) return;\n const collapsed = Array.from(inners).every((el) => el.getAttribute('data-collapsed') === 'true');\n const currentDragOffset = dragOffset.value;\n\n if (!collapsed) {\n if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n activePosition.value = bubbleCenterX < window.innerWidth / 2 ? 'top-left' : 'top-right';\n } else {\n activePosition.value = props.position;\n }\n dragOffset.value = null;\n } else if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n } else if (lastDragOffset) {\n dragOffset.value = lastDragOffset;\n }\n });\n\n observer.observe(panelRef.value, { subtree: true, attributes: true, attributeFilter: ['data-collapsed'] });\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n const panel = panelRef.value;\n const handle = getPanelDragHandle(event.target, panel);\n if (!panel || !handle) return;\n\n dragTarget = handle;\n dragStart = getPanelDragStart(event.clientX, event.clientY, panel);\n didDrag = false;\n dragging = true;\n handle.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging || !dragStart) return;\n\n if (!didDrag && !hasPanelDragMoved(dragStart, event.clientX, event.clientY)) return;\n didDrag = true;\n\n dragOffset.value = getPanelDragOffset(dragStart, event.clientX, event.clientY);\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = false;\n dragStart = null;\n const handle = dragTarget;\n\n if (handle?.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n\n if (didDrag) {\n event.stopPropagation();\n if (handle) {\n blockPanelDragClick(handle);\n }\n }\n\n dragTarget = null;\n };\n\n const handlePanelOpenChange = (panelId: string, open: boolean) => {\n panelOpenStates.set(panelId, open);\n const fallbackOpen = props.mode === 'inline' || props.defaultOpen;\n const nextRootOpen = panels.value.some((panel) => (\n panelOpenStates.get(panel.id) ?? fallbackOpen\n ));\n\n if (rootOpen === nextRootOpen) return;\n rootOpen = nextRootOpen;\n emit('openChange', nextRootOpen);\n };\n\n const handleRootOpenChange = (open: boolean) => {\n if (rootOpen === open) return;\n rootOpen = open;\n emit('openChange', open);\n };\n\n const getDragStyle = () => dragOffset.value\n ? {\n top: `${dragOffset.value.y}px`,\n left: `${dragOffset.value.x}px`,\n right: 'auto',\n bottom: 'auto',\n }\n : undefined;\n const originX = computed(() => props.mode === 'inline' ? undefined : getPanelOriginX(activePosition.value, dragOffset.value));\n\n onMounted(() => {\n mounted.value = true;\n panels.value = DialStore.getPanels('panel');\n timelines.value = TimelineStore.getTimelines();\n syncPanelOpenStates();\n unsubscribePanels = DialStore.subscribeGlobal(() => {\n panels.value = DialStore.getPanels('panel');\n syncPanelOpenStates();\n });\n unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n timelines.value = TimelineStore.getTimelines();\n });\n nextTick(connectObserver);\n });\n\n onUnmounted(() => {\n unsubscribePanels?.();\n unsubscribeTimelines?.();\n observer?.disconnect();\n });\n\n const timelineToggle = () => timelines.value.length > 0 ? h(TimelineToggleButton) : null;\n\n const renderPanels = () => {\n if (panels.value.length === 0) {\n return [h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: 'DialKit',\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n isRoot: true,\n inline: props.mode === 'inline',\n toolbar: timelineToggle,\n onOpenChange: handleRootOpenChange,\n panelHeightOffset: 2,\n }, { default: () => [h('div', { class: 'dialkit-timeline-toolkit-only' }, 'Timeline')] }),\n ])];\n }\n if (panels.value.length > 1) {\n return [h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: 'DialKit',\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n isRoot: true,\n inline: props.mode === 'inline',\n toolbar: timelineToggle,\n onOpenChange: handleRootOpenChange,\n panelHeightOffset: 2,\n }, {\n default: () => panels.value.map((panel) => h(Panel, {\n key: panel.id,\n panel,\n defaultOpen: true,\n variant: 'section',\n })),\n }),\n ])];\n }\n return panels.value.map((panel) => h(Panel, {\n key: panel.id,\n panel,\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n inline: props.mode === 'inline',\n toolbarExtra: timelineToggle,\n onOpenChange: (open: boolean) => handlePanelOpenChange(panel.id, open),\n }));\n };\n\n const renderContent = () => h(ShortcutListener, null, {\n default: () => h('div', { class: 'dialkit-root', 'data-mode': props.mode, 'data-theme': props.theme }, [\n h('div', {\n ref: (el) => {\n panelRef.value = el as HTMLDivElement | null;\n connectObserver();\n },\n class: 'dialkit-panel',\n 'data-position': props.mode === 'inline' ? undefined : (dragOffset.value ? undefined : activePosition.value),\n 'data-origin-x': originX.value,\n 'data-mode': props.mode,\n 'data-multiple': panels.value.length > 1 ? 'true' : undefined,\n style: getDragStyle(),\n onPointerdown: props.mode === 'inline' ? undefined : handlePointerDown,\n onPointermove: props.mode === 'inline' ? undefined : handlePointerMove,\n onPointerup: props.mode === 'inline' ? undefined : handlePointerUp,\n onPointercancel: props.mode === 'inline' ? undefined : handlePointerUp,\n }, renderPanels()),\n ]),\n });\n\n return () => {\n if (!props.productionEnabled || !mounted.value || typeof window === 'undefined' || (panels.value.length === 0 && timelines.value.length === 0)) {\n return null;\n }\n\n if (props.mode === 'inline') {\n return renderContent();\n }\n\n return h(Teleport, { to: 'body' }, renderContent());\n };\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType, type VNodeChild } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_CHEVRON, ICON_PANEL } from '../../icons';\n\nexport const Folder = defineComponent({\n name: 'DialKitFolder',\n props: {\n title: { type: String, required: true },\n defaultOpen: { type: Boolean, default: true },\n isRoot: { type: Boolean, default: false },\n inline: { type: Boolean, default: false },\n toolbar: {\n type: null as unknown as PropType<(() => VNodeChild) | null>,\n required: false,\n default: null,\n },\n panelHeightOffset: {\n type: Number,\n default: 10,\n },\n },\n emits: ['openChange'],\n setup(props, { emit, slots }) {\n const isOpen = ref(props.defaultOpen);\n const isCollapsed = ref(!props.defaultOpen);\n const contentRef = ref<HTMLElement | null>(null);\n const contentHeight = ref<number | undefined>(undefined);\n const windowHeight = ref(typeof window !== 'undefined' ? window.innerHeight : 800);\n\n let resizeHandler: (() => void) | null = null;\n if (props.isRoot) {\n resizeHandler = () => { windowHeight.value = window.innerHeight; };\n window.addEventListener('resize', resizeHandler);\n }\n\n onUnmounted(() => {\n if (resizeHandler) window.removeEventListener('resize', resizeHandler);\n });\n\n const handleToggle = () => {\n if (props.inline && props.isRoot) return;\n const next = !isOpen.value;\n isOpen.value = next;\n isCollapsed.value = !next;\n emit('openChange', next);\n };\n\n let ro: ResizeObserver | null = null;\n\n onMounted(() => {\n if (!props.isRoot || typeof ResizeObserver === 'undefined') return;\n const el = contentRef.value;\n if (!el) return;\n\n ro = new ResizeObserver(() => {\n if (isOpen.value) {\n const next = el.offsetHeight;\n if (contentHeight.value !== next) {\n contentHeight.value = next;\n }\n }\n });\n\n ro.observe(el);\n\n if (isOpen.value) {\n contentHeight.value = el.offsetHeight;\n }\n });\n\n onUnmounted(() => {\n ro?.disconnect();\n });\n\n const renderHeader = () => h('div', {\n class: `dialkit-folder-header ${props.isRoot ? 'dialkit-panel-header' : ''}`,\n onClick: handleToggle,\n }, [\n h('div', { class: 'dialkit-folder-header-top' }, [\n props.isRoot\n ? (isOpen.value\n ? h('div', { class: 'dialkit-folder-title-row' }, [\n h('span', { class: 'dialkit-folder-title dialkit-folder-title-root' }, props.title),\n ])\n : null)\n : h('div', { class: 'dialkit-folder-title-row' }, [\n h('span', { class: 'dialkit-folder-title' }, props.title),\n ]),\n props.isRoot && !props.inline\n ? h('svg', { class: 'dialkit-panel-icon', viewBox: '0 0 16 16', fill: 'none' }, [\n h('path', {\n opacity: '0.5',\n d: ICON_PANEL.path,\n fill: 'currentColor',\n }),\n ...ICON_PANEL.circles.map((c) => h('circle', { cx: c.cx, cy: c.cy, r: c.r, fill: 'currentColor', stroke: 'currentColor', 'stroke-width': '1.25' })),\n ])\n : null,\n !props.isRoot\n ? h(motion.svg, {\n class: 'dialkit-folder-icon',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n initial: false,\n animate: { rotate: isOpen.value ? 0 : 180 },\n transition: { type: 'spring', visualDuration: 0.35, bounce: 0.15 },\n }, [h('path', { d: ICON_CHEVRON })])\n : null,\n ]),\n props.isRoot && props.toolbar && isOpen.value\n ? h('div', { class: 'dialkit-panel-toolbar', onClick: (event: Event) => event.stopPropagation() }, [props.toolbar()])\n : null,\n ]);\n\n const renderChildren = () => h('div', { class: 'dialkit-folder-inner' }, slots.default ? slots.default() : []);\n\n const renderContent = () => {\n if (props.isRoot) {\n return isOpen.value\n ? h('div', { class: 'dialkit-folder-content' }, [renderChildren()])\n : null;\n }\n\n return h(AnimatePresence, { initial: false }, {\n default: () => isOpen.value\n ? [h(motion.div, {\n key: 'dialkit-folder-content',\n class: 'dialkit-folder-content',\n initial: { height: 0, opacity: 0 },\n animate: { height: 'auto', opacity: 1 },\n exit: { height: 0, opacity: 0 },\n transition: { type: 'spring', visualDuration: 0.35, bounce: 0.1 },\n style: { clipPath: 'inset(0 -20px)' },\n }, [renderChildren()])]\n : [],\n });\n };\n\n const folderContent = () => h('div', {\n ref: props.isRoot ? contentRef : undefined,\n class: `dialkit-folder ${props.isRoot ? 'dialkit-folder-root' : ''}`,\n 'data-open': String(isOpen.value),\n }, [\n renderHeader(),\n renderContent(),\n ]);\n\n return () => {\n if (props.isRoot) {\n if (props.inline) {\n return h('div', { class: 'dialkit-panel-inner dialkit-panel-inline' }, [folderContent()]);\n }\n\n const panelStyle = isOpen.value\n ? {\n width: 280,\n height: contentHeight.value !== undefined ? Math.min(contentHeight.value + props.panelHeightOffset, windowHeight.value - 32) : 'auto',\n borderRadius: 14,\n boxShadow: 'var(--dial-shadow)',\n cursor: undefined as string | undefined,\n overflowY: 'auto' as const,\n }\n : {\n width: 42,\n height: 42,\n borderRadius: 21,\n boxShadow: 'var(--dial-shadow-collapsed)',\n overflow: 'hidden',\n cursor: 'pointer',\n };\n\n return h(motion.div, {\n class: 'dialkit-panel-inner',\n style: panelStyle,\n onClick: !isOpen.value ? handleToggle : undefined,\n 'data-collapsed': String(isCollapsed.value),\n whilePress: !isOpen.value ? { scale: 0.9 } : undefined,\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [folderContent()]);\n }\n\n return folderContent();\n };\n },\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 { Fragment, defineComponent, h, onMounted, onUnmounted, ref, type PropType, type VNodeChild } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_ADD_PRESET, ICON_CHECK, ICON_CLIPBOARD } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, DialValue, PanelConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\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';\nimport { PresetManager } from './PresetManager';\nimport { useShortcutContext } from './ShortcutListener';\nimport { ShortcutsMenu } from './ShortcutsMenu';\n\nexport const Panel = defineComponent({\n name: 'DialKitPanel',\n props: {\n panel: {\n type: Object as PropType<PanelConfig>,\n required: true,\n },\n defaultOpen: {\n type: Boolean,\n default: true,\n },\n inline: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<'root' | 'section'>,\n default: 'root',\n },\n toolbarExtra: Function as PropType<() => VNodeChild>,\n },\n emits: ['openChange'],\n setup(props, { emit }) {\n const shortcutCtx = useShortcutContext();\n const values = ref<Record<string, DialValue>>(DialStore.getValues(props.panel.id));\n const presets = ref(DialStore.getPresets(props.panel.id));\n const activePresetId = ref<string | null>(DialStore.getActivePresetId(props.panel.id));\n const copied = ref(false);\n const hasShortcuts = () => Object.keys(DialStore.getPanel(props.panel.id)?.shortcuts ?? {}).length > 0;\n\n let unsubscribe: (() => void) | undefined;\n let copiedTimeout: ReturnType<typeof window.setTimeout> | null = null;\n\n onMounted(() => {\n unsubscribe = DialStore.subscribe(props.panel.id, () => {\n values.value = DialStore.getValues(props.panel.id);\n presets.value = DialStore.getPresets(props.panel.id);\n activePresetId.value = DialStore.getActivePresetId(props.panel.id);\n });\n });\n\n onUnmounted(() => {\n unsubscribe?.();\n if (copiedTimeout) {\n window.clearTimeout(copiedTimeout);\n }\n });\n\n const handleAddPreset = () => {\n const nextNum = presets.value.length + 2;\n DialStore.savePreset(props.panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const json = JSON.stringify(values.value, null, 2);\n const instruction = `Update the useDialKit configuration for \"${props.panel.name}\" with these values:\\n\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\`\\n\\nApply these values as the new defaults in the useDialKit call.`;\n\n try {\n if (navigator.clipboard?.writeText) {\n void navigator.clipboard.writeText(instruction).catch(() => undefined);\n }\n } catch {\n // Ignore clipboard errors; the UI confirmation should still run.\n }\n\n copied.value = true;\n if (copiedTimeout) {\n window.clearTimeout(copiedTimeout);\n }\n copiedTimeout = window.setTimeout(() => {\n copied.value = false;\n }, 1500);\n };\n\n const handleOpenChange = (open: boolean) => {\n emit('openChange', open);\n };\n\n const renderControl = (control: ControlMeta) => {\n const value = values.value[control.path];\n\n switch (control.type) {\n case 'slider':\n return h(Slider, {\n key: control.path,\n label: control.label,\n value: value as number,\n min: control.min,\n max: control.max,\n step: control.step,\n shortcut: control.shortcut,\n shortcutActive: shortcutCtx.activePanelId.value === props.panel.id && shortcutCtx.activePath.value === control.path,\n onChange: (next: number) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'toggle':\n return h(Toggle, {\n key: control.path,\n label: control.label,\n checked: value as boolean,\n shortcut: control.shortcut,\n shortcutActive: shortcutCtx.activePanelId.value === props.panel.id && shortcutCtx.activePath.value === control.path,\n onChange: (next: boolean) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'spring':\n return h(SpringControl, {\n key: control.path,\n panelId: props.panel.id,\n path: control.path,\n label: control.label,\n spring: value as SpringConfig,\n onChange: (next: SpringConfig) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'transition':\n return h(TransitionControl, {\n key: control.path,\n panelId: props.panel.id,\n path: control.path,\n label: control.label,\n value: value as TransitionConfig,\n onChange: (next: TransitionConfig) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'folder':\n return h(Folder, {\n key: control.path,\n title: control.label,\n defaultOpen: control.defaultOpen ?? true,\n }, {\n default: () => (control.children ?? []).map(renderControl),\n });\n case 'text':\n return h(TextControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n placeholder: control.placeholder,\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'select':\n return h(SelectControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n options: control.options ?? [],\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'color':\n return h(ColorControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'action':\n return h('button', {\n key: control.path,\n class: 'dialkit-button',\n onClick: () => DialStore.triggerAction(props.panel.id, control.path),\n }, control.label);\n default:\n return null;\n }\n };\n\n return () => {\n const toolbarNode = h(Fragment, null, [\n h(motion.button, {\n class: 'dialkit-toolbar-add',\n onClick: handleAddPreset,\n title: 'Add preset',\n whilePress: { scale: 0.9 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, ICON_ADD_PRESET.map((d) => h('path', { d }))),\n ]),\n h(PresetManager, {\n panelId: props.panel.id,\n presets: presets.value,\n activePresetId: activePresetId.value,\n }),\n h(motion.button, {\n class: 'dialkit-toolbar-copy',\n onClick: handleCopy,\n title: 'Copy parameters',\n whilePress: { scale: 0.95 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [\n h('span', { class: 'dialkit-toolbar-copy-icon-wrap' }, [\n h('span', {\n class: 'dialkit-toolbar-copy-icon',\n style: { opacity: copied.value ? 0 : 1, transition: 'opacity 120ms ease' },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n width: 16,\n height: 16,\n }, [\n h('path', {\n d: ICON_CLIPBOARD.board,\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linejoin': 'round',\n }),\n h('path', {\n d: ICON_CLIPBOARD.sparkle,\n fill: 'currentColor',\n }),\n h('path', {\n d: ICON_CLIPBOARD.body,\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]),\n ]),\n h(AnimatePresence, { initial: false, mode: 'popLayout' }, {\n default: () => copied.value\n ? [h(motion.span, {\n key: 'check',\n class: 'dialkit-toolbar-copy-icon',\n initial: { scale: 0.5, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.5, opacity: 0 },\n transition: { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n width: 16,\n height: 16,\n }, [h('path', { d: ICON_CHECK })]),\n ])]\n : [],\n }),\n ]),\n 'Copy',\n ]),\n props.toolbarExtra?.(),\n ]);\n\n if (props.variant === 'section') {\n return h(Folder, {\n title: props.panel.name,\n defaultOpen: props.defaultOpen,\n onOpenChange: handleOpenChange,\n }, {\n default: () => [\n h('div', {\n class: 'dialkit-panel-section-toolbar',\n onClick: (event: Event) => event.stopPropagation(),\n }, [toolbarNode]),\n ...props.panel.controls.map(renderControl),\n ],\n });\n }\n\n return h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: props.panel.name,\n defaultOpen: props.defaultOpen,\n isRoot: true,\n inline: props.inline,\n toolbar: () => toolbarNode,\n onOpenChange: handleOpenChange,\n }, {\n default: () => props.panel.controls.map(renderControl),\n }),\n ]);\n };\n },\n});\n","import { defineComponent, h, computed, nextTick, onMounted, onUnmounted, ref, watch, type PropType } from 'vue';\nimport { animate, motionValue } from 'motion-v';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { decimalsForStep, roundValue, snapToDecile, formatSliderShortcut } from '../../shortcut-utils';\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport const Slider = defineComponent({\n name: 'DialKitSlider',\n props: {\n label: { type: String, required: true },\n value: { type: Number, required: true },\n min: { type: Number, required: false },\n max: { type: Number, required: false },\n step: { type: Number, required: false },\n unit: { type: String, required: false },\n shortcut: { type: Object as PropType<ShortcutConfig>, default: undefined },\n shortcutActive: { type: Boolean, default: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const min = computed(() => props.min ?? 0);\n const max = computed(() => props.max ?? 1);\n const step = computed(() => props.step ?? 0.01);\n\n const wrapperRef = ref<HTMLElement | null>(null);\n const trackRef = ref<HTMLElement | null>(null);\n const fillRef = ref<HTMLElement | null>(null);\n const handleRef = ref<HTMLElement | null>(null);\n const labelRef = ref<HTMLElement | null>(null);\n const valueSpanRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n\n const isInteracting = ref(false);\n const isDragging = ref(false);\n const isHovered = ref(false);\n const isValueHovered = ref(false);\n const isValueEditable = ref(false);\n const showInput = ref(false);\n const inputValue = ref('');\n\n const fillPercent = motionValue(((props.value - min.value) / (max.value - min.value)) * 100);\n const rubberStretchPx = motionValue(0);\n const handleOpacityMv = motionValue(0);\n const handleScaleXMv = motionValue(0.25);\n const handleScaleYMv = motionValue(1);\n\n const percentage = computed(() => ((props.value - min.value) / (max.value - min.value)) * 100);\n const isActive = computed(() => isInteracting.value || isHovered.value);\n const displayValue = computed(() => props.value.toFixed(decimalsForStep(step.value)));\n let pointerDownPos: { x: number; y: number } | null = null;\n let isClickFlag = true;\n let wrapperRect: DOMRect | null = null;\n let scaleVal = 1;\n let hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n\n let snapAnim: ReturnType<typeof animate> | null = null;\n let rubberAnim: ReturnType<typeof animate> | null = null;\n let handleOpacityAnim: ReturnType<typeof animate> | null = null;\n let handleScaleXAnim: ReturnType<typeof animate> | null = null;\n let handleScaleYAnim: ReturnType<typeof animate> | null = null;\n\n const applyFillStyles = (pct: number) => {\n if (fillRef.value) fillRef.value.style.width = `${pct}%`;\n if (handleRef.value) handleRef.value.style.left = `max(5px, calc(${pct}% - 9px))`;\n };\n\n const applyRubberStyles = (stretch: number) => {\n if (!trackRef.value) return;\n trackRef.value.style.width = `calc(100% + ${Math.abs(stretch)}px)`;\n trackRef.value.style.transform = `translateX(${stretch < 0 ? stretch : 0}px)`;\n };\n\n const applyHandleVisualStyles = () => {\n if (!handleRef.value) return;\n handleRef.value.style.opacity = String(handleOpacityMv.get());\n handleRef.value.style.transform = `translateY(-50%) scaleX(${handleScaleXMv.get()}) scaleY(${handleScaleYMv.get()})`;\n };\n\n const positionToValue = (clientX: number) => {\n if (!wrapperRect) return props.value;\n const screenX = clientX - wrapperRect.left;\n const sceneX = screenX / scaleVal;\n const nativeWidth = wrapperRef.value ? wrapperRef.value.offsetWidth : wrapperRect.width;\n const pct = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min.value + pct * (max.value - min.value);\n return Math.max(min.value, Math.min(max.value, rawValue));\n };\n\n const percentFromValue = (value: number) => ((value - min.value) / (max.value - min.value)) * 100;\n\n const computeRubberStretch = (clientX: number, sign: number) => {\n if (!wrapperRect) return 0;\n const distancePast = sign < 0 ? wrapperRect.left - clientX : clientX - wrapperRect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return sign * MAX_STRETCH * Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1));\n };\n\n const leftThreshold = () => {\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const trackWidth = wrapperRef.value?.offsetWidth;\n if (trackWidth && labelRef.value) {\n return ((LABEL_CSS_LEFT + labelRef.value.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 30;\n };\n\n const rightThreshold = () => {\n const HANDLE_BUFFER = 8;\n const VALUE_CSS_RIGHT = 10;\n const trackWidth = wrapperRef.value?.offsetWidth;\n if (trackWidth && valueSpanRef.value) {\n return ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.value.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 78;\n };\n\n const valueDodge = () => percentage.value < leftThreshold() || percentage.value > rightThreshold();\n\n const handleOpacity = () => {\n if (!isActive.value) return 0;\n if (valueDodge()) return 0.1;\n if (isDragging.value) return 0.9;\n return 0.5;\n };\n\n const animateHandleState = () => {\n const targetOpacity = handleOpacity();\n const targetScaleX = isActive.value ? 1 : 0.25;\n const targetScaleY = isActive.value && valueDodge() ? 0.75 : 1;\n\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n handleOpacityAnim = animate(handleOpacityMv, targetOpacity, { duration: 0.15 });\n handleScaleXAnim = animate(handleScaleXMv, targetScaleX, {\n type: 'spring',\n visualDuration: 0.25,\n bounce: 0.15,\n });\n handleScaleYAnim = animate(handleScaleYMv, targetScaleY, {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.1,\n });\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (showInput.value) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n pointerDownPos = { x: event.clientX, y: event.clientY };\n isClickFlag = true;\n isInteracting.value = true;\n\n if (wrapperRef.value) {\n wrapperRect = wrapperRef.value.getBoundingClientRect();\n scaleVal = wrapperRect.width / wrapperRef.value.offsetWidth;\n }\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isInteracting.value || !pointerDownPos) return;\n\n const dx = event.clientX - pointerDownPos.x;\n const dy = event.clientY - pointerDownPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickFlag && distance > CLICK_THRESHOLD) {\n isClickFlag = false;\n isDragging.value = true;\n }\n\n if (!isClickFlag) {\n if (wrapperRect) {\n if (event.clientX < wrapperRect.left) {\n rubberStretchPx.jump(computeRubberStretch(event.clientX, -1));\n } else if (event.clientX > wrapperRect.right) {\n rubberStretchPx.jump(computeRubberStretch(event.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const nextValue = positionToValue(event.clientX);\n const nextPct = percentFromValue(nextValue);\n if (snapAnim) {\n snapAnim.stop();\n snapAnim = null;\n }\n fillPercent.jump(nextPct);\n emit('change', roundValue(nextValue, step.value));\n }\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!isInteracting.value) return;\n\n if (isClickFlag) {\n const rawValue = positionToValue(event.clientX);\n const discreteSteps = (max.value - min.value) / step.value;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min.value, Math.min(max.value, min.value + Math.round((rawValue - min.value) / step.value) * step.value))\n : snapToDecile(rawValue, min.value, max.value);\n\n const nextPct = percentFromValue(snappedValue);\n\n snapAnim?.stop();\n snapAnim = animate(fillPercent, nextPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => {\n snapAnim = null;\n },\n });\n\n emit('change', roundValue(snappedValue, step.value));\n }\n\n if (rubberStretchPx.get() !== 0) {\n rubberAnim?.stop();\n rubberAnim = animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n isInteracting.value = false;\n isDragging.value = false;\n pointerDownPos = null;\n };\n\n const handlePointerCancel = () => {\n if (!isInteracting.value) return;\n isInteracting.value = false;\n isDragging.value = false;\n rubberStretchPx.jump(0);\n pointerDownPos = null;\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue.value);\n if (!Number.isNaN(parsed)) {\n const clamped = Math.max(min.value, Math.min(max.value, parsed));\n emit('change', roundValue(clamped, step.value));\n }\n showInput.value = false;\n isValueHovered.value = false;\n isValueEditable.value = false;\n };\n\n const handleValueClick = (event: MouseEvent) => {\n if (!isValueEditable.value) return;\n event.stopPropagation();\n event.preventDefault();\n showInput.value = true;\n inputValue.value = props.value.toFixed(decimalsForStep(step.value));\n };\n\n const handleInputKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleInputSubmit();\n } else if (event.key === 'Escape') {\n showInput.value = false;\n isValueHovered.value = false;\n }\n };\n\n watch(() => props.value, () => {\n if (!isInteracting.value && !snapAnim) {\n fillPercent.jump(percentage.value);\n }\n });\n\n watch([isInteracting, isHovered, isDragging, () => props.value], () => {\n animateHandleState();\n });\n\n watch([isValueHovered, showInput, isValueEditable], () => {\n if (hoverTimeout) {\n clearTimeout(hoverTimeout);\n hoverTimeout = null;\n }\n\n if (isValueHovered.value && !showInput.value && !isValueEditable.value) {\n hoverTimeout = setTimeout(() => {\n isValueEditable.value = true;\n animateHandleState();\n }, 800);\n } else if (!isValueHovered.value && !showInput.value) {\n isValueEditable.value = false;\n }\n });\n\n watch(showInput, async (visible) => {\n if (!visible) return;\n await nextTick();\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n\n const discreteSteps = computed(() => (max.value - min.value) / step.value);\n const hashMarks = computed(() => {\n const marks: ReturnType<typeof h>[] = [];\n if (discreteSteps.value <= 10) {\n const count = Math.max(0, Math.floor(discreteSteps.value) - 1);\n for (let i = 0; i < count; i += 1) {\n const pct = ((i + 1) * step.value) / (max.value - min.value) * 100;\n marks.push(h('div', { class: 'dialkit-slider-hashmark', style: { left: `${pct}%` } }));\n }\n return marks;\n }\n\n for (let i = 0; i < 9; i += 1) {\n const pct = (i + 1) * 10;\n marks.push(h('div', { class: 'dialkit-slider-hashmark', style: { left: `${pct}%` } }));\n }\n return marks;\n });\n\n let unsubFill: (() => void) | null = null;\n let unsubRubber: (() => void) | null = null;\n let unsubHandleOpacity: (() => void) | null = null;\n let unsubHandleScaleX: (() => void) | null = null;\n let unsubHandleScaleY: (() => void) | null = null;\n\n onMounted(() => {\n unsubFill = fillPercent.on('change', applyFillStyles);\n unsubRubber = rubberStretchPx.on('change', applyRubberStyles);\n unsubHandleOpacity = handleOpacityMv.on('change', applyHandleVisualStyles);\n unsubHandleScaleX = handleScaleXMv.on('change', applyHandleVisualStyles);\n unsubHandleScaleY = handleScaleYMv.on('change', applyHandleVisualStyles);\n\n applyFillStyles(fillPercent.get());\n applyRubberStyles(rubberStretchPx.get());\n applyHandleVisualStyles();\n animateHandleState();\n });\n\n onUnmounted(() => {\n if (hoverTimeout) clearTimeout(hoverTimeout);\n snapAnim?.stop();\n rubberAnim?.stop();\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n unsubFill?.();\n unsubRubber?.();\n unsubHandleOpacity?.();\n unsubHandleScaleX?.();\n unsubHandleScaleY?.();\n });\n\n return () => h('div', { ref: wrapperRef, class: 'dialkit-slider-wrapper' }, [\n h('div', {\n ref: trackRef,\n class: `dialkit-slider ${isActive.value ? 'dialkit-slider-active' : ''}`,\n onPointerdown: handlePointerDown,\n onPointermove: handlePointerMove,\n onPointerup: handlePointerUp,\n onPointercancel: handlePointerCancel,\n onMouseenter: () => {\n isHovered.value = true;\n animateHandleState();\n },\n onMouseleave: () => {\n isHovered.value = false;\n animateHandleState();\n },\n }, [\n h('div', { class: 'dialkit-slider-hashmarks' }, hashMarks.value),\n h('div', {\n ref: fillRef,\n class: 'dialkit-slider-fill',\n style: {\n width: `${fillPercent.get()}%`,\n },\n }),\n h('div', {\n ref: handleRef,\n class: 'dialkit-slider-handle',\n style: {\n left: `max(5px, calc(${fillPercent.get()}% - 9px))`,\n transform: 'translateY(-50%) scaleX(0.25) scaleY(1)',\n opacity: 0,\n },\n }),\n h('span', { ref: labelRef, class: 'dialkit-slider-label' }, [\n props.label,\n props.shortcut\n ? h('span', {\n class: `dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`,\n }, formatSliderShortcut(props.shortcut))\n : null,\n ]),\n showInput.value\n ? h('input', {\n ref: inputRef,\n type: 'text',\n class: 'dialkit-slider-input',\n value: inputValue.value,\n onInput: (event: Event) => {\n inputValue.value = (event.target as HTMLInputElement).value;\n },\n onKeydown: handleInputKeydown,\n onBlur: handleInputSubmit,\n onClick: (event: MouseEvent) => event.stopPropagation(),\n onMousedown: (event: MouseEvent) => event.stopPropagation(),\n })\n : h('span', {\n ref: valueSpanRef,\n class: `dialkit-slider-value ${isValueEditable.value ? 'dialkit-slider-value-editable' : ''}`,\n onMouseenter: () => {\n isValueHovered.value = true;\n },\n onMouseleave: () => {\n isValueHovered.value = false;\n },\n onClick: handleValueClick,\n onMousedown: (event: MouseEvent) => {\n if (isValueEditable.value) event.stopPropagation();\n },\n style: { cursor: isValueEditable.value ? 'text' : 'default' },\n }, displayValue.value),\n ]),\n ]);\n },\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 { defineComponent, h, type PropType } from 'vue';\nimport { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { formatToggleShortcut } from '../../shortcut-utils';\n\nexport const Toggle = defineComponent({\n name: 'DialKitToggle',\n props: {\n label: { type: String, required: true },\n checked: { type: Boolean, required: true },\n shortcut: { type: Object as PropType<ShortcutConfig>, default: undefined },\n shortcutActive: { type: Boolean, default: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n return () => h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, [\n props.label,\n props.shortcut\n ? h('span', {\n class: `dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`,\n }, formatToggleShortcut(props.shortcut))\n : null,\n ]),\n h(SegmentedControl, {\n options: [\n { value: 'off', label: 'Off' },\n { value: 'on', label: 'On' },\n ],\n value: props.checked ? 'on' : 'off',\n onChange: (value: string) => emit('change', value === 'on'),\n }),\n ]);\n },\n});\n","import { defineComponent, h, nextTick, onMounted, onUnmounted, ref, watch, type PropType } from 'vue';\nimport { animate } from 'motion';\n\ntype SegmentedControlOption<T extends string> = {\n value: T;\n label: string;\n};\n\nexport const SegmentedControl = defineComponent({\n name: 'DialKitSegmentedControl',\n props: {\n options: {\n type: Array as PropType<SegmentedControlOption<string>[]>,\n required: true,\n },\n value: {\n type: String,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const containerRef = ref<HTMLElement | null>(null);\n const pillRef = ref<HTMLElement | null>(null);\n const buttonRefs = new Map<string, HTMLElement>();\n\n const pillReady = ref(false);\n let hasAnimated = false;\n let pillAnim: ReturnType<typeof animate> | null = null;\n\n const measurePill = () => {\n const button = buttonRefs.get(props.value);\n const container = containerRef.value;\n if (!button || !container) return null;\n\n const containerRect = container.getBoundingClientRect();\n const buttonRect = button.getBoundingClientRect();\n return {\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n };\n };\n\n const setPillImmediate = (left: number, width: number) => {\n if (!pillRef.value) return;\n pillRef.value.style.left = `${left}px`;\n pillRef.value.style.width = `${width}px`;\n pillRef.value.style.visibility = 'visible';\n };\n\n const updatePill = (shouldAnimate: boolean) => {\n const next = measurePill();\n if (!next) return;\n\n if (!pillReady.value) {\n setPillImmediate(next.left, next.width);\n pillReady.value = true;\n return;\n }\n\n if (!shouldAnimate || !hasAnimated || !pillRef.value) {\n pillAnim?.stop();\n pillAnim = null;\n setPillImmediate(next.left, next.width);\n return;\n }\n\n pillAnim?.stop();\n pillAnim = animate(\n pillRef.value,\n {\n left: next.left,\n width: next.width,\n },\n {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.15,\n onComplete: () => {\n pillAnim = null;\n },\n }\n );\n };\n\n let ro: ResizeObserver | undefined;\n\n onMounted(() => {\n nextTick(() => {\n updatePill(false);\n hasAnimated = true;\n });\n\n if (typeof ResizeObserver !== 'undefined' && containerRef.value) {\n ro = new ResizeObserver(() => updatePill(false));\n ro.observe(containerRef.value);\n }\n });\n\n onUnmounted(() => {\n pillAnim?.stop();\n ro?.disconnect();\n });\n\n watch(\n () => props.value,\n () => {\n updatePill(true);\n },\n { flush: 'post' }\n );\n\n return () => h('div', { ref: containerRef, class: 'dialkit-segmented' }, [\n h('div', {\n ref: pillRef,\n class: 'dialkit-segmented-pill',\n style: {\n left: '0px',\n width: '0px',\n visibility: pillReady.value ? 'visible' : 'hidden',\n },\n }),\n ...props.options.map((option) => h('button', {\n ref: ((el: Element | null) => {\n if (el instanceof HTMLElement) {\n buttonRefs.set(option.value, el);\n return;\n }\n\n buttonRefs.delete(option.value);\n }) as any,\n class: 'dialkit-segmented-button',\n 'data-active': String(props.value === option.value),\n onClick: () => emit('change', option.value),\n }, option.label)),\n ]);\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { SpringConfig } from '../../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\n\nexport const SpringControl = defineComponent({\n name: 'DialKitSpringControl',\n props: {\n panelId: { type: String, required: true },\n path: { type: String, required: true },\n label: { type: String, required: true },\n spring: {\n type: Object as PropType<SpringConfig>,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const mode = ref<'simple' | 'advanced'>(DialStore.getSpringMode(props.panelId, props.path));\n let unsub: (() => void) | undefined;\n\n onMounted(() => {\n unsub = DialStore.subscribe(props.panelId, () => {\n mode.value = DialStore.getSpringMode(props.panelId, props.path);\n });\n });\n\n onUnmounted(() => {\n unsub?.();\n });\n\n const isSimpleMode = () => mode.value === 'simple';\n\n const cache = {\n simple: props.spring.visualDuration !== undefined ? { ...props.spring } : { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 },\n advanced: props.spring.stiffness !== undefined ? { ...props.spring } : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 },\n };\n\n const handleModeChange = (nextMode: 'simple' | 'advanced') => {\n if (isSimpleMode()) {\n cache.simple = { ...props.spring };\n } else {\n cache.advanced = { ...props.spring };\n }\n\n DialStore.updateSpringMode(props.panelId, props.path, nextMode);\n\n if (nextMode === 'simple') {\n emit('change', cache.simple);\n } else {\n emit('change', cache.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n if (isSimpleMode()) {\n const { stiffness, damping, mass, ...rest } = props.spring;\n emit('change', { ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = props.spring;\n emit('change', { ...rest, [key]: value });\n }\n };\n\n return () => h(Folder, { title: props.label, defaultOpen: true }, {\n default: () => [\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } }, [\n h(SpringVisualization, { spring: props.spring, isSimpleMode: isSimpleMode() }),\n h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Type'),\n h(SegmentedControl, {\n options: [\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ],\n value: mode.value,\n onChange: handleModeChange,\n }),\n ]),\n ...(isSimpleMode()\n ? [\n h(Slider, {\n label: 'Duration',\n value: props.spring.visualDuration ?? 0.3,\n min: 0.1,\n max: 1,\n step: 0.05,\n unit: 's',\n onChange: (next: number) => handleUpdate('visualDuration', next),\n }),\n h(Slider, {\n label: 'Bounce',\n value: props.spring.bounce ?? 0.2,\n min: 0,\n max: 1,\n step: 0.05,\n onChange: (next: number) => handleUpdate('bounce', next),\n }),\n ]\n : [\n h(Slider, {\n label: 'Stiffness',\n value: props.spring.stiffness ?? 400,\n min: 1,\n max: 1000,\n step: 10,\n onChange: (next: number) => handleUpdate('stiffness', next),\n }),\n h(Slider, {\n label: 'Damping',\n value: props.spring.damping ?? 17,\n min: 1,\n max: 100,\n step: 1,\n onChange: (next: number) => handleUpdate('damping', next),\n }),\n h(Slider, {\n label: 'Mass',\n value: props.spring.mass ?? 1,\n min: 0.1,\n max: 10,\n step: 0.1,\n onChange: (next: number) => handleUpdate('mass', next),\n }),\n ]),\n ]),\n ],\n });\n },\n});\n","import { defineComponent, h, computed, type PropType } from 'vue';\nimport type { SpringConfig } from '../../store/DialStore';\n\nfunction generateSpringCurve(\n stiffness: number,\n damping: number,\n mass: number,\n duration: number\n): [number, number][] {\n const points: [number, number][] = [];\n const steps = 100;\n const dt = duration / steps;\n\n let position = 0;\n let velocity = 0;\n const target = 1;\n\n for (let i = 0; i <= steps; i += 1) {\n const time = i * dt;\n points.push([time, position]);\n\n const springForce = -stiffness * (position - target);\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * dt;\n position += velocity * dt;\n }\n\n return points;\n}\n\nexport const SpringVisualization = defineComponent({\n name: 'DialKitSpringVisualization',\n props: {\n spring: {\n type: Object as PropType<SpringConfig>,\n required: true,\n },\n isSimpleMode: {\n type: Boolean,\n required: true,\n },\n },\n setup(props) {\n const width = 256;\n const height = 140;\n\n const pathData = computed(() => {\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (props.isSimpleMode) {\n const visualDuration = props.spring.visualDuration ?? 0.3;\n const bounce = props.spring.bounce ?? 0.2;\n mass = 1;\n stiffness = ((2 * Math.PI) / visualDuration) ** 2;\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = props.spring.stiffness ?? 400;\n damping = props.spring.damping ?? 17;\n mass = props.spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\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 return points\n .map(([time, value], index) => {\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 `${index === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n });\n\n return () => h('svg', { viewBox: `0 0 ${width} ${height}`, class: 'dialkit-spring-viz' }, [\n ...Array.from({ length: 3 }).flatMap((_, index) => {\n const lineIndex = index + 1;\n const x = (width / 4) * lineIndex;\n const y = (height / 4) * lineIndex;\n return [\n h('line', { x1: x, y1: 0, x2: x, y2: height, stroke: 'rgba(255, 255, 255, 0.08)', 'stroke-width': 1 }),\n h('line', { x1: 0, y1: y, x2: width, y2: y, stroke: 'rgba(255, 255, 255, 0.08)', 'stroke-width': 1 }),\n ];\n }),\n h('line', {\n x1: 0,\n y1: height / 2,\n x2: width,\n y2: height / 2,\n stroke: 'rgba(255, 255, 255, 0.15)',\n 'stroke-width': 1,\n 'stroke-dasharray': '4,4',\n }),\n h('path', {\n d: pathData.value,\n fill: 'none',\n stroke: 'rgba(255, 255, 255, 0.6)',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]);\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport interface TransitionDurationControl {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map((value) => Number(value.toFixed(2))).join(', ');\n}\n\nfunction parseEase(value: string): [number, number, number, number] | null {\n const parts = value.split(',').map((part) => Number.parseFloat(part.trim()));\n if (parts.length === 4 && parts.every((part) => Number.isFinite(part))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nconst EaseTextInput = defineComponent({\n name: 'DialKitEaseTextInput',\n props: {\n ease: {\n type: Array as unknown as PropType<[number, number, number, number]>,\n required: true,\n },\n onChange: {\n type: Function as PropType<(ease: [number, number, number, number]) => void>,\n required: true,\n },\n },\n setup(props) {\n const editing = ref(false);\n const draft = ref('');\n\n const handleFocus = () => {\n draft.value = formatEase(props.ease);\n editing.value = true;\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft.value);\n if (parsed) props.onChange(parsed);\n editing.value = false;\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n (event.target as HTMLInputElement).blur();\n }\n };\n\n return () => h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Ease'),\n h('input', {\n type: 'text',\n class: 'dialkit-text-input',\n value: editing.value ? draft.value : formatEase(props.ease),\n spellcheck: false,\n onInput: (event: Event) => {\n draft.value = (event.target as HTMLInputElement).value;\n },\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n }),\n ]);\n },\n});\n\nexport const TransitionControl = defineComponent({\n name: 'DialKitTransitionControl',\n props: {\n panelId: { type: String, required: true },\n path: { type: String, required: true },\n label: { type: String, required: true },\n value: {\n type: Object as PropType<TransitionConfig>,\n required: true,\n },\n hideDuration: { type: Boolean, default: false },\n durationControl: Object as PropType<TransitionDurationControl>,\n },\n emits: ['change'],\n setup(props, { emit }) {\n const mode = ref<CurveMode>(DialStore.getTransitionMode(props.panelId, props.path));\n let unsub: (() => void) | undefined;\n\n onMounted(() => {\n unsub = DialStore.subscribe(props.panelId, () => {\n mode.value = DialStore.getTransitionMode(props.panelId, props.path);\n });\n });\n\n onUnmounted(() => unsub?.());\n\n const cache = {\n easing: (props.value.type === 'easing' ? { ...props.value } : { type: 'easing' as const, duration: 0.3, ease: [1, -0.4, 0.5, 1] as [number, number, number, number] }) as EasingConfig,\n simple: (props.value.type === 'spring' && props.value.visualDuration !== undefined ? { ...props.value } : { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 }) as SpringConfig,\n advanced: (props.value.type === 'spring' && props.value.stiffness !== undefined ? { ...props.value } : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 }) as SpringConfig,\n };\n\n const spring = (): SpringConfig => {\n if (props.value.type === 'spring') {\n // Keep cache updated\n if (mode.value === 'simple') cache.simple = props.value;\n else if (mode.value === 'advanced') cache.advanced = props.value;\n return props.value;\n }\n return cache.simple;\n };\n\n const easing = (): EasingConfig => {\n if (props.value.type === 'easing') {\n cache.easing = props.value;\n return props.value;\n }\n return cache.easing;\n };\n\n const handleModeChange = (nextMode: CurveMode) => {\n DialStore.updateTransitionMode(props.panelId, props.path, nextMode);\n\n if (nextMode === 'easing') {\n emit('change', cache.easing);\n } else if (nextMode === 'simple') {\n emit('change', cache.simple);\n } else {\n emit('change', cache.advanced);\n }\n };\n\n const updateEase = (index: number, value: number) => {\n const current = easing();\n const next = [...current.ease] as [number, number, number, number];\n next[index] = value;\n emit('change', { ...current, ease: next });\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, value: number) => {\n const current = spring();\n if (mode.value === 'simple') {\n const { stiffness, damping, mass, ...rest } = current;\n emit('change', { ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = current;\n emit('change', { ...rest, [key]: value });\n }\n };\n\n return () => {\n const isEasing = mode.value === 'easing';\n const isSimpleSpring = mode.value === 'simple';\n const currentSpring = spring();\n const currentEasing = easing();\n const durationSlider = !props.hideDuration && (isEasing || isSimpleSpring)\n ? h(Slider, {\n label: 'Duration',\n value: props.durationControl?.value ?? (isEasing ? currentEasing.duration : currentSpring.visualDuration ?? 0.3),\n min: props.durationControl?.min ?? 0.1,\n max: props.durationControl?.max ?? (isEasing ? 2 : 1),\n step: props.durationControl?.step ?? 0.05,\n unit: 's',\n onChange: props.durationControl?.onChange ?? ((next: number) => {\n if (isEasing) emit('change', { ...currentEasing, duration: next });\n else handleSpringUpdate('visualDuration', next);\n }),\n })\n : null;\n\n return h(Folder, { title: props.label, defaultOpen: true }, {\n default: () => [\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } }, [\n isEasing\n ? h(EasingVisualization, { easing: currentEasing })\n : h(SpringVisualization, { spring: currentSpring, isSimpleMode: isSimpleSpring }),\n h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Type'),\n h(SegmentedControl, {\n options: [\n { value: 'easing', label: 'Easing' },\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ],\n value: mode.value,\n onChange: handleModeChange,\n }),\n ]),\n ...(isEasing\n ? [\n h(Slider, { label: 'x1', value: currentEasing.ease[0], min: 0, max: 1, step: 0.01, onChange: (next: number) => updateEase(0, next) }),\n h(Slider, { label: 'y1', value: currentEasing.ease[1], min: -1, max: 2, step: 0.01, onChange: (next: number) => updateEase(1, next) }),\n h(Slider, { label: 'x2', value: currentEasing.ease[2], min: 0, max: 1, step: 0.01, onChange: (next: number) => updateEase(2, next) }),\n h(Slider, { label: 'y2', value: currentEasing.ease[3], min: -1, max: 2, step: 0.01, onChange: (next: number) => updateEase(3, next) }),\n h(EaseTextInput, {\n ease: currentEasing.ease,\n onChange: (next: [number, number, number, number]) => emit('change', { ...currentEasing, ease: next }),\n }),\n ]\n : isSimpleSpring\n ? [\n h(Slider, {\n label: 'Bounce',\n value: currentSpring.bounce ?? 0.2,\n min: 0,\n max: 1,\n step: 0.05,\n onChange: (next: number) => handleSpringUpdate('bounce', next),\n }),\n ]\n : [\n h(Slider, {\n label: 'Stiffness',\n value: currentSpring.stiffness ?? 400,\n min: 1,\n max: 1000,\n step: 10,\n onChange: (next: number) => handleSpringUpdate('stiffness', next),\n }),\n h(Slider, {\n label: 'Damping',\n value: currentSpring.damping ?? 17,\n min: 1,\n max: 100,\n step: 1,\n onChange: (next: number) => handleSpringUpdate('damping', next),\n }),\n h(Slider, {\n label: 'Mass',\n value: currentSpring.mass ?? 1,\n min: 0.1,\n max: 10,\n step: 0.1,\n onChange: (next: number) => handleSpringUpdate('mass', next),\n }),\n ]),\n durationSlider,\n ]),\n ],\n });\n };\n },\n});\n","import { defineComponent, h, computed, type PropType } from 'vue';\nimport type { EasingConfig } from '../../store/DialStore';\n\nexport const 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 const EasingVisualization = defineComponent({\n name: 'DialKitEasingVisualization',\n props: {\n easing: {\n type: Object as PropType<EasingConfig>,\n required: true,\n },\n },\n setup(props) {\n const size = 200;\n const pad = 10;\n const inner = size - pad * 2;\n const unit = inner / 2;\n\n const curve = computed(() => {\n const [x1, y1, x2, y2] = props.easing.ease;\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(x1, y1);\n const p2 = toSvg(x2, y2);\n return `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n });\n\n return () => h('svg', {\n viewBox: `0 0 ${size} ${size}`,\n preserveAspectRatio: 'xMidYMid slice',\n class: 'dialkit-spring-viz dialkit-easing-viz',\n }, [\n h('line', {\n x1: pad + (0 + 0.5) * unit,\n y1: pad + (1.5 - 0) * unit,\n x2: pad + (1 + 0.5) * unit,\n y2: pad + (1.5 - 1) * unit,\n stroke: 'rgba(255, 255, 255, 0.15)',\n 'stroke-width': 1,\n 'stroke-dasharray': '4,4',\n }),\n h('path', {\n d: curve.value,\n fill: 'none',\n stroke: 'rgba(255, 255, 255, 0.6)',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n }),\n ]);\n },\n});\n","import { defineComponent, h, ref } from 'vue';\n\nlet textControlInstance = 0;\n\nexport const TextControl = defineComponent({\n name: 'DialKitTextControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n placeholder: { type: String, required: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const inputId = ref(`dialkit-text-${++textControlInstance}`);\n\n return () => h('div', { class: 'dialkit-text-control' }, [\n h('label', { class: 'dialkit-text-label', for: inputId.value }, props.label),\n h('input', {\n id: inputId.value,\n type: 'text',\n class: 'dialkit-text-input',\n value: props.value,\n placeholder: props.placeholder,\n onInput: (event: Event) => emit('change', (event.target as HTMLInputElement).value),\n }),\n ]);\n },\n});\n","import { Teleport, defineComponent, h, onMounted, ref, watch, type PropType } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\n\ntype SelectOption = string | { value: string; label: string };\n\nfunction toTitleCase(value: string): string {\n return value.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((option) =>\n typeof option === 'string' ? { value: option, label: toTitleCase(option) } : option\n );\n}\n\nexport const SelectControl = defineComponent({\n name: 'DialKitSelectControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n options: {\n type: Array as PropType<SelectOption[]>,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const isOpen = ref(false);\n const pos = ref<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const portalTarget = ref<HTMLElement | null>(null);\n\n const triggerRef = ref<HTMLElement | null>(null);\n const dropdownRef = ref<HTMLElement | null>(null);\n\n const normalizedOptions = () => normalizeOptions(props.options);\n const selectedLabel = () => normalizedOptions().find((option) => option.value === props.value)?.label ?? props.value;\n\n const updatePos = () => {\n if (!triggerRef.value || !portalTarget.value) return;\n const dropdownHeight = 8 + normalizedOptions().length * 36;\n pos.value = getDropdownPosition(triggerRef.value, portalTarget.value, { dropdownHeight });\n };\n\n const openDropdown = () => {\n updatePos();\n isOpen.value = true;\n };\n\n const closeDropdown = () => {\n isOpen.value = false;\n };\n\n const setDropdownRef = (node: unknown) => {\n if (node instanceof HTMLElement) {\n dropdownRef.value = node;\n return;\n }\n\n if (node && typeof node === 'object' && '$el' in node) {\n const el = (node as { $el?: unknown }).$el;\n dropdownRef.value = el instanceof HTMLElement ? el : null;\n return;\n }\n\n dropdownRef.value = null;\n };\n\n const toggleDropdown = () => {\n if (isOpen.value) closeDropdown();\n else openDropdown();\n };\n\n watch(isOpen, (open, _, onCleanup) => {\n if (!open) return;\n\n const handleViewportChange = () => updatePos();\n const handleDocumentClick = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.value?.contains(target) || dropdownRef.value?.contains(target)) return;\n closeDropdown();\n };\n\n updatePos();\n document.addEventListener('mousedown', handleDocumentClick);\n window.addEventListener('resize', handleViewportChange);\n window.addEventListener('scroll', handleViewportChange, true);\n\n onCleanup(() => {\n document.removeEventListener('mousedown', handleDocumentClick);\n window.removeEventListener('resize', handleViewportChange);\n window.removeEventListener('scroll', handleViewportChange, true);\n });\n });\n\n onMounted(() => {\n portalTarget.value = getDialKitPortalRoot(triggerRef.value) ?? document.body;\n });\n\n return () => h('div', { class: 'dialkit-select-row' }, [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-select-trigger',\n 'data-open': String(isOpen.value),\n onClick: toggleDropdown,\n }, [\n h('span', { class: 'dialkit-select-label' }, props.label),\n h('div', { class: 'dialkit-select-right' }, [\n h('span', { class: 'dialkit-select-value' }, selectedLabel()),\n h(motion.svg, {\n class: 'dialkit-select-chevron',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n animate: { rotate: isOpen.value ? 180 : 0 },\n transition: { type: 'spring', visualDuration: 0.2, bounce: 0.15 },\n }, [h('path', { d: 'M6 9.5L12 15.5L18 9.5' })]),\n ]),\n ]),\n portalTarget.value\n ? h(Teleport, { to: portalTarget.value }, [\n h(AnimatePresence, null, {\n default: () => (isOpen.value && pos.value)\n ? [h(motion.div, {\n key: 'dialkit-select-dropdown',\n ref: setDropdownRef,\n class: 'dialkit-select-dropdown',\n initial: { opacity: 0, y: pos.value.above ? 8 : -8, scale: 0.95 },\n animate: { opacity: 1, y: 0, scale: 1 },\n exit: { opacity: 0, y: pos.value.above ? 8 : -8, scale: 0.95 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0 },\n style: {\n position: 'absolute',\n left: `${pos.value.left}px`,\n top: `${pos.value.top}px`,\n width: `${pos.value.width}px`,\n transformOrigin: pos.value.above ? 'bottom' : 'top',\n },\n }, normalizedOptions().map((option) => h('button', {\n key: option.value,\n class: 'dialkit-select-option',\n 'data-selected': String(option.value === props.value),\n onClick: () => {\n emit('change', option.value);\n closeDropdown();\n },\n }, option.label)))]\n : [],\n }),\n ])\n : null,\n ]);\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 { defineComponent, h, ref, watch } from 'vue';\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\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\nlet colorControlInstance = 0;\n\nexport const ColorControl = defineComponent({\n name: 'DialKitColorControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const textInputId = ref(`dialkit-color-${++colorControlInstance}`);\n const isEditing = ref(false);\n const editValue = ref(props.value);\n const colorInputRef = ref<HTMLInputElement | null>(null);\n\n watch(() => props.value, (value) => {\n if (!isEditing.value) editValue.value = value;\n });\n\n const submit = () => {\n isEditing.value = false;\n if (HEX_COLOR_REGEX.test(editValue.value)) {\n emit('change', editValue.value);\n } else {\n editValue.value = props.value;\n }\n };\n\n return () => h('div', { class: 'dialkit-color-control' }, [\n h('label', { class: 'dialkit-color-label', for: textInputId.value }, props.label),\n h('div', { class: 'dialkit-color-inputs' }, [\n isEditing.value\n ? h('input', {\n id: textInputId.value,\n type: 'text',\n class: 'dialkit-color-hex-input',\n value: editValue.value,\n autofocus: true,\n onInput: (event: Event) => {\n editValue.value = (event.target as HTMLInputElement).value;\n },\n onBlur: submit,\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter') submit();\n if (event.key === 'Escape') {\n isEditing.value = false;\n editValue.value = props.value;\n }\n },\n })\n : h('span', { class: 'dialkit-color-hex', onClick: () => { isEditing.value = true; } }, (props.value ?? '').toUpperCase()),\n h('button', {\n class: 'dialkit-color-swatch',\n style: { backgroundColor: props.value },\n title: 'Pick color',\n 'aria-label': `Pick color for ${props.label}`,\n onClick: () => colorInputRef.value?.click(),\n }),\n h('input', {\n ref: colorInputRef,\n type: 'color',\n class: 'dialkit-color-picker-native',\n 'aria-label': `${props.label} color picker`,\n value: props.value.length === 4 ? expandShorthandHex(props.value) : props.value.slice(0, 7),\n onInput: (event: Event) => emit('change', (event.target as HTMLInputElement).value),\n }),\n ]),\n ]);\n },\n});\n","import { Teleport, defineComponent, h, ref, watch, type PropType } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_CHEVRON, ICON_TRASH } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { Preset } from '../../store/DialStore';\n\nexport const PresetManager = defineComponent({\n name: 'DialKitPresetManager',\n props: {\n panelId: { type: String, required: true },\n presets: {\n type: Array as PropType<Preset[]>,\n required: true,\n },\n activePresetId: {\n type: String as PropType<string | null>,\n required: false,\n default: null,\n },\n },\n setup(props) {\n const isOpen = ref(false);\n const pos = ref({ top: 0, left: 0, width: 0 });\n\n const triggerRef = ref<HTMLElement | null>(null);\n const dropdownRef = ref<HTMLElement | null>(null);\n\n const hasPresets = () => props.presets.length > 0;\n const activePreset = () => props.presets.find((preset) => preset.id === props.activePresetId);\n\n const open = () => {\n if (!hasPresets()) return;\n const rect = triggerRef.value?.getBoundingClientRect();\n if (rect) {\n pos.value = { top: rect.bottom + 4, left: rect.left, width: rect.width };\n }\n isOpen.value = true;\n };\n\n const close = () => {\n isOpen.value = false;\n };\n\n const setDropdownRef = (node: unknown) => {\n if (node instanceof HTMLElement) {\n dropdownRef.value = node;\n return;\n }\n\n if (node && typeof node === 'object' && '$el' in node) {\n const el = (node as { $el?: unknown }).$el;\n dropdownRef.value = el instanceof HTMLElement ? el : null;\n return;\n }\n\n dropdownRef.value = null;\n };\n\n const toggle = () => {\n if (isOpen.value) close();\n else open();\n };\n\n watch(isOpen, (open, _, onCleanup) => {\n if (!open) return;\n\n const handler = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.value?.contains(target) || dropdownRef.value?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n onCleanup(() => {\n document.removeEventListener('mousedown', handler);\n });\n });\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(props.panelId, presetId);\n } else {\n DialStore.clearActivePreset(props.panelId);\n }\n close();\n };\n\n const handleDelete = (event: MouseEvent, presetId: string) => {\n event.stopPropagation();\n DialStore.deletePreset(props.panelId, presetId);\n };\n\n return () => h('div', { class: 'dialkit-preset-manager' }, [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-preset-trigger',\n onClick: toggle,\n 'data-open': String(isOpen.value),\n 'data-has-preset': String(!!activePreset()),\n 'data-disabled': String(!hasPresets()),\n }, [\n h('span', { class: 'dialkit-preset-label' }, activePreset()?.name ?? 'Version 1'),\n h(motion.svg, {\n class: 'dialkit-select-chevron',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n animate: { rotate: isOpen.value ? 180 : 0, opacity: hasPresets() ? 0.6 : 0.25 },\n transition: { type: 'spring', visualDuration: 0.2, bounce: 0.15 },\n }, [h('path', { d: ICON_CHEVRON })]),\n ]),\n\n h(Teleport, { to: 'body' }, [\n h(AnimatePresence, null, {\n default: () => isOpen.value\n ? [h(motion.div, {\n key: 'dialkit-preset-dropdown',\n ref: setDropdownRef,\n class: 'dialkit-root dialkit-preset-dropdown',\n style: {\n position: 'fixed',\n top: `${pos.value.top}px`,\n left: `${pos.value.left}px`,\n minWidth: `${pos.value.width}px`,\n },\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' },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0 },\n }, [\n h('div', {\n class: 'dialkit-preset-item',\n 'data-active': String(!props.activePresetId),\n onClick: () => handleSelect(null),\n }, [h('span', { class: 'dialkit-preset-name' }, 'Version 1')]),\n\n ...props.presets.map((preset) => h('div', {\n key: preset.id,\n class: 'dialkit-preset-item',\n 'data-active': String(preset.id === props.activePresetId),\n onClick: () => handleSelect(preset.id),\n }, [\n h('span', { class: 'dialkit-preset-name' }, preset.name),\n h('button', {\n class: 'dialkit-preset-delete',\n onClick: (event: MouseEvent) => handleDelete(event, preset.id),\n title: 'Delete preset',\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, ICON_TRASH.map((d) => h('path', { d }))),\n ]),\n ])),\n ])]\n : [],\n }),\n ]),\n ]);\n },\n});\n","import { defineComponent, h, inject, onMounted, onUnmounted, provide, ref, type InjectionKey, type Ref } from 'vue';\nimport { DialStore, ControlMeta, ShortcutConfig } from '../../store/DialStore';\nimport { getEffectiveStep, applySliderDelta, findControl, isInputFocused, getActiveModifier, DRAG_SENSITIVITY } from '../../shortcut-utils';\n\nexport interface ShortcutState {\n activePanelId: Ref<string | null>;\n activePath: Ref<string | null>;\n}\n\nexport const ShortcutKey: InjectionKey<ShortcutState> = Symbol('DialKitShortcut');\n\nexport function useShortcutContext(): ShortcutState {\n return inject(ShortcutKey, {\n activePanelId: ref(null),\n activePath: ref(null),\n });\n}\n\nexport const ShortcutListener = defineComponent({\n name: 'DialKitShortcutListener',\n setup(_, { slots }) {\n const activePanelId = ref<string | null>(null);\n const activePath = ref<string | null>(null);\n\n const activeKeys = new Set<string>();\n let isDragging = false;\n let lastMouseX: number | null = null;\n let dragAccumulator = 0;\n\n provide(ShortcutKey, { activePanelId, activePath });\n\n const resolveActiveTarget = (interaction: string) => {\n for (const key of activeKeys) {\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 = DialStore.getPanel(panel.id)?.controls\n ? findControl(panel.controls, path)\n : null;\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n };\n\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 (activeKeys.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 = activeKeys.has(key);\n activeKeys.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n activePanelId.value = target.panelId;\n activePath.value = 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 lastMouseX = null;\n dragAccumulator = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeys.delete(key);\n\n // Reset drag state when key is released\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n\n if (activeKeys.size === 0) {\n activePanelId.value = null;\n activePath.value = null;\n } else {\n let found = false;\n for (const remainingKey of activeKeys) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n activePanelId.value = target.panelId;\n activePath.value = target.path;\n found = true;\n break;\n }\n }\n if (!found) {\n activePanelId.value = null;\n activePath.value = 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 (activeKeys.size > 0) {\n for (const key of activeKeys) {\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 (activeKeys.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDragging = true;\n lastMouseX = e.clientX;\n dragAccumulator = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n };\n\n // Move + Drag: mousemove handles both\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDragging) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseX !== null) {\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= 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 (lastMouseX === null) {\n lastMouseX = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeys.clear();\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n activePanelId.value = null;\n activePath.value = null;\n };\n\n onMounted(() => {\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\n onUnmounted(() => {\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\n return () => slots.default?.();\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref } from 'vue';\nimport { ICON_TIMELINE } from '../../../icons';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\n\nexport const TimelineToggleButton = defineComponent({\n name: 'DialKitTimelineToggleButton',\n setup() {\n const visible = ref(TimelineUiStore.getVisible());\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineUiStore.subscribe(() => {\n visible.value = TimelineUiStore.getVisible();\n });\n });\n onUnmounted(() => unsubscribe?.());\n return () => {\n const label = visible.value ? 'Hide timeline' : 'Show timeline';\n return h('button', {\n class: 'dialkit-toolbar-add dialkit-timeline-toolbar-toggle',\n 'data-active': visible.value || undefined,\n 'aria-pressed': visible.value,\n 'aria-label': label,\n title: label,\n onClick: () => TimelineUiStore.toggle(),\n }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n ICON_TIMELINE.map((path) => h('path', { d: path, fill: 'currentColor' }))),\n ]);\n };\n },\n});\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 {\n Teleport,\n computed,\n defineComponent,\n h,\n nextTick,\n onMounted,\n onUnmounted,\n ref,\n watch,\n type PropType,\n type VNodeChild,\n} from 'vue';\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 TIMELINE_MIN_CLIP_DURATION,\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n computeClipStaticFromValues,\n formatClock,\n formatSeconds,\n formatStepLabel,\n normalizeTimelineValuesForCopy,\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 {\n ICON_ADD_PRESET,\n ICON_CHEVRON,\n ICON_CHECK,\n ICON_CLIPBOARD,\n ICON_PAUSE,\n ICON_PLAY,\n ICON_REPLAY,\n} 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\nexport const DialTimeline = defineComponent({\n name: 'DialKitTimeline',\n props: {\n theme: { type: String as PropType<DialTheme>, default: 'system' },\n defaultVisible: { type: Boolean, default: true },\n visible: {\n type: Boolean as PropType<boolean | undefined>,\n default: undefined,\n },\n onVisibilityChange: Function as PropType<(visible: boolean) => void>,\n defaultOpen: { type: Boolean, default: true },\n productionEnabled: { type: Boolean, default: isDevDefault },\n },\n setup(props) {\n const timelines = ref<TimelineMeta[]>(TimelineStore.getTimelines());\n const dockVisible = ref(TimelineUiStore.getVisible());\n const mounted = ref(false);\n const dockMaxHeight = ref(DEFAULT_DOCK_MAX_HEIGHT);\n const dockRef = ref<HTMLDivElement | null>(null);\n const controllerId = Symbol('dialkit-timeline-visibility');\n let unsubscribeTimelines: (() => void) | undefined;\n let unsubscribeVisibility: (() => void) | undefined;\n let unregisterController: (() => void) | undefined;\n let resizeCleanup: (() => void) | null = null;\n\n const handleResizePointerDown = (event: PointerEvent) => {\n if (!dockRef.value) return;\n event.preventDefault();\n event.stopPropagation();\n resizeCleanup?.();\n\n const pointerY = event.clientY;\n const startHeight = dockRef.value.getBoundingClientRect().height;\n const move = (next: PointerEvent) => {\n next.preventDefault();\n const viewportMax = Math.max(MIN_DOCK_MAX_HEIGHT, window.innerHeight - 24);\n dockMaxHeight.value = clamp(startHeight + pointerY - next.clientY, MIN_DOCK_MAX_HEIGHT, viewportMax);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n resizeCleanup = null;\n };\n\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n resizeCleanup = finish;\n };\n\n onMounted(() => {\n mounted.value = true;\n unsubscribeVisibility = TimelineUiStore.subscribe(() => {\n dockVisible.value = TimelineUiStore.getVisible();\n });\n unregisterController = TimelineUiStore.registerController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible,\n onVisibilityChange: props.onVisibilityChange,\n });\n dockVisible.value = TimelineUiStore.getVisible();\n unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n timelines.value = TimelineStore.getTimelines();\n });\n });\n watch(() => [props.visible, props.defaultVisible, props.onVisibilityChange] as const, () => {\n TimelineUiStore.updateController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible,\n onVisibilityChange: props.onVisibilityChange,\n });\n });\n onUnmounted(() => {\n unregisterController?.();\n unsubscribeTimelines?.();\n unsubscribeVisibility?.();\n resizeCleanup?.();\n });\n\n return () => {\n if (!props.productionEnabled || !mounted.value || timelines.value.length === 0) return null;\n return h(Teleport, { to: 'body' }, [\n h('div', {\n class: 'dialkit-root dialkit-timeline',\n 'data-theme': props.theme,\n hidden: !dockVisible.value,\n }, [\n h('div', {\n class: 'dialkit-timeline-resize-handle',\n role: 'separator',\n 'aria-label': 'Resize timeline height',\n 'aria-orientation': 'horizontal',\n title: 'Drag to resize timeline',\n onPointerdown: handleResizePointerDown,\n }),\n h('div', {\n ref: dockRef,\n class: 'dialkit-timeline-dock',\n style: { maxHeight: `min(${dockMaxHeight.value}px, calc(100vh - 24px))` },\n }, timelines.value.map((meta) => h(TimelineSection, {\n key: meta.id,\n meta,\n defaultOpen: props.defaultOpen,\n theme: props.theme,\n dockVisible: dockVisible.value,\n }))),\n ]),\n ]);\n };\n },\n});\n\nconst PlayPauseButton = defineComponent({\n props: { id: { type: String, required: true } },\n setup(props) {\n const playing = ref(TimelineStore.getTransport(props.id).playing);\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n playing.value = TimelineStore.getTransport(props.id).playing;\n });\n });\n onUnmounted(() => unsubscribe?.());\n return () => {\n const label = playing.value ? 'Pause' : 'Play';\n const icon = playing.value\n ? h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true', style: iconStyle },\n ICON_PAUSE.map((path) => h('path', { d: path, fill: 'currentColor' })))\n : h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true', style: iconStyle }, [\n h('path', { d: ICON_PLAY, fill: 'currentColor' }),\n ]);\n return h('button', {\n class: 'dialkit-toolbar-add',\n title: label,\n 'aria-label': label,\n onClick: () => playing.value ? TimelineStore.pause(props.id) : TimelineStore.play(props.id),\n }, [h('span', { style: { position: 'relative', width: '16px', height: '16px' } }, [icon])]);\n };\n },\n});\n\nconst ReplayButton = defineComponent({\n props: { onReplay: { type: Function as PropType<() => void>, required: true } },\n setup(props) {\n return () => h('button', {\n class: 'dialkit-toolbar-add',\n title: 'Replay',\n 'aria-label': 'Replay',\n onClick: props.onReplay,\n }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n ICON_REPLAY.map((path) => h('path', { d: path, fill: 'currentColor' }))),\n ]);\n },\n});\n\nconst iconStyle = {\n position: 'absolute', inset: 0, width: '16px', height: '16px', color: 'var(--dial-text-label)',\n};\n\nconst TimelineOverview = defineComponent({\n props: {\n id: { type: String, required: true },\n duration: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n viewEnd: { type: Number, required: true },\n onNavigate: { type: Function as PropType<(time: number) => void>, required: true },\n },\n setup(props) {\n const time = ref(TimelineStore.getTransport(props.id).time);\n let scrub: { wasPlaying: boolean; rect: DOMRect } | null = null;\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n time.value = TimelineStore.getTransport(props.id).time;\n });\n });\n onUnmounted(() => unsubscribe?.());\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0 || props.duration <= 0) return;\n const next = clamp(((clientX - scrub.rect.left) / scrub.rect.width) * props.duration, 0, props.duration);\n TimelineStore.seek(props.id, next);\n props.onNavigate(next);\n };\n const finish = () => {\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n };\n return () => {\n const viewportWidth = props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100;\n const playhead = props.duration > 0 ? (time.value / props.duration) * 100 : 0;\n return h('div', {\n class: 'dialkit-timeline-overview',\n title: 'Drag to scrub the full timeline',\n onPointerdown: (event: PointerEvent) => {\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect: (event.currentTarget as HTMLElement).getBoundingClientRect(),\n };\n TimelineStore.pause(props.id);\n seek(event.clientX);\n },\n onPointermove: (event: PointerEvent) => scrub && seek(event.clientX),\n onPointerup: finish,\n onPointercancel: finish,\n onLostpointercapture: finish,\n }, [\n h('div', {\n class: 'dialkit-timeline-overview-viewport',\n 'data-zoomed': viewportWidth < 99.999 || undefined,\n style: { left: `${props.duration > 0 ? (props.viewStart / props.duration) * 100 : 0}%`, width: `${viewportWidth}%` },\n }),\n h('div', { class: 'dialkit-timeline-overview-progress', style: { width: `${playhead}%` } }),\n h('div', { class: 'dialkit-timeline-overview-playhead', style: { left: `${playhead}%` } }),\n ]);\n };\n },\n});\n\nconst TimelinePlayheadFlag = defineComponent({\n props: {\n id: { type: String, required: true },\n duration: { type: Number, required: true },\n pxPerSecond: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n viewEnd: { type: Number, required: true },\n laneWidth: { type: Number, required: true },\n ruler: Object as PropType<HTMLDivElement>,\n onResetView: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const time = ref(TimelineStore.getTransport(props.id).time);\n let unsubscribe: (() => void) | undefined;\n let scrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; viewEnd: number } | null = null;\n let cleanup: (() => void) | null = null;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n time.value = TimelineStore.getTransport(props.id).time;\n });\n });\n onUnmounted(() => {\n unsubscribe?.();\n cleanup?.();\n });\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0) return;\n TimelineStore.seek(props.id, clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / scrub.rect.width) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n ));\n };\n return () => {\n if (time.value < props.viewStart || time.value > props.viewEnd || props.laneWidth <= 0) return null;\n const x = clamp((time.value - props.viewStart) * props.pxPerSecond, 0, props.laneWidth);\n const flagCenter = clamp(\n x,\n PLAYHEAD_FLAG_WIDTH / 2 - PLAYHEAD_FLAG_EDGE_OVERHANG,\n props.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 return h('div', {\n class: '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 },\n role: 'slider',\n 'aria-label': 'Timeline current time',\n 'aria-valuemin': 0,\n 'aria-valuemax': props.duration,\n 'aria-valuenow': time.value,\n title: 'Drag to scrub the timeline',\n onPointerdown: (event: PointerEvent) => {\n const rect = props.ruler?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.stopPropagation();\n cleanup?.();\n const reset = event.shiftKey;\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect,\n viewStart: reset ? 0 : props.viewStart,\n viewEnd: reset ? props.duration : props.viewEnd,\n };\n if (reset) props.onResetView();\n TimelineStore.pause(props.id);\n seek(event.clientX);\n const move = (next: PointerEvent) => {\n next.preventDefault();\n seek(next.clientX);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n cleanup = null;\n };\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n cleanup = finish;\n },\n }, [\n h('div', { class: 'dialkit-timeline-playhead-stem' }),\n h('div', { class: 'dialkit-timeline-playhead-anchor' }, [\n h('div', { class: 'dialkit-timeline-playhead-flag' }, time.value.toFixed(2)),\n ]),\n ]);\n };\n },\n});\n\ntype PopoverState = {\n clip: TimelineClipMeta;\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 zoom: 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 = defineComponent({\n props: {\n meta: { type: Object as PropType<TimelineMeta>, required: true },\n defaultOpen: { type: Boolean, required: true },\n theme: { type: String as PropType<DialTheme>, required: true },\n dockVisible: { type: Boolean, required: true },\n },\n setup(props) {\n const open = ref(props.defaultOpen);\n const copied = ref(false);\n const popover = ref<PopoverState | null>(null);\n const collapsedGroups = ref(new Set<string>());\n const expandedTracks = ref(new Set<string>());\n const zoom = ref(1);\n const viewStart = ref(0);\n const values = ref<Record<string, DialValue>>(DialStore.getValues(props.meta.id));\n const presets = ref(DialStore.getPresets(props.meta.id));\n const activePresetId = ref(DialStore.getActivePresetId(props.meta.id));\n const laneAreaRef = ref<HTMLDivElement | null>(null);\n const horizontalScrollRef = ref<HTMLDivElement | null>(null);\n const laneWidth = ref(0);\n let unsubscribeValues: (() => void) | undefined;\n let resizeObserver: ResizeObserver | undefined;\n\n const measure = () => {\n if (laneAreaRef.value) laneWidth.value = laneAreaRef.value.getBoundingClientRect().width;\n };\n const connectMeasure = async () => {\n resizeObserver?.disconnect();\n if (!open.value) return;\n await nextTick();\n if (!laneAreaRef.value) return;\n measure();\n resizeObserver = new ResizeObserver(measure);\n resizeObserver.observe(laneAreaRef.value);\n };\n\n onMounted(() => {\n unsubscribeValues = DialStore.subscribe(props.meta.id, () => {\n values.value = DialStore.getValues(props.meta.id);\n presets.value = DialStore.getPresets(props.meta.id);\n activePresetId.value = DialStore.getActivePresetId(props.meta.id);\n });\n void connectMeasure();\n });\n onUnmounted(() => {\n unsubscribeValues?.();\n resizeObserver?.disconnect();\n });\n watch(open, connectMeasure);\n watch(() => props.dockVisible, (visible) => {\n if (!visible) popover.value = null;\n });\n\n const visibleDuration = computed(() => props.meta.duration > 0 ? props.meta.duration / zoom.value : props.meta.duration);\n const safeViewStart = computed(() => clampViewStart(viewStart.value, props.meta.duration, visibleDuration.value));\n const viewEnd = computed(() => safeViewStart.value + visibleDuration.value);\n const pxPerSecond = computed(() => visibleDuration.value > 0 && laneWidth.value > 0 ? laneWidth.value / visibleDuration.value : 0);\n const maxZoom = computed(() => Math.max(\n MIN_TIMELINE_MAX_ZOOM,\n laneWidth.value > 0 && props.meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * props.meta.duration) / (MILLISECOND_STEP * 10 * laneWidth.value)\n : MIN_TIMELINE_MAX_ZOOM\n ));\n watch(maxZoom, (next) => { zoom.value = clamp(zoom.value, 1, next); }, { immediate: true });\n watch([() => props.meta.duration, zoom], () => {\n viewStart.value = clampViewStart(viewStart.value, props.meta.duration, props.meta.duration / zoom.value);\n });\n watch([open, pxPerSecond, safeViewStart], async () => {\n await nextTick();\n const scroller = horizontalScrollRef.value;\n if (!scroller || pxPerSecond.value <= 0) return;\n const next = safeViewStart.value * pxPerSecond.value;\n if (Math.abs(scroller.scrollLeft - next) > 0.5) scroller.scrollLeft = next;\n });\n\n const centerViewAt = (time: number) => {\n if (zoom.value <= 1 || props.meta.duration <= 0) return;\n const duration = props.meta.duration / zoom.value;\n viewStart.value = clampViewStart(time - duration / 2, props.meta.duration, duration);\n };\n const resetView = () => {\n zoom.value = 1;\n viewStart.value = 0;\n };\n const handleReplay = () => {\n viewStart.value = 0;\n TimelineStore.replay(props.meta.id);\n };\n const handleHorizontalScroll = (event: Event) => {\n if (pxPerSecond.value <= 0) return;\n viewStart.value = clampViewStart(\n (event.currentTarget as HTMLDivElement).scrollLeft / pxPerSecond.value,\n props.meta.duration,\n visibleDuration.value\n );\n };\n const handleTimelineWheel = (event: WheelEvent) => {\n const scroller = horizontalScrollRef.value;\n if (!scroller || zoom.value <= 1) return;\n const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY)\n ? event.deltaX\n : event.shiftKey\n ? event.deltaY\n : 0;\n if (delta === 0) return;\n event.preventDefault();\n scroller.scrollLeft += delta;\n };\n\n let zoomDrag: ZoomDragState | null = null;\n let rulerScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n let trackScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n const seekRuler = (clientX: number) => {\n if (!rulerScrub || rulerScrub.rect.width <= 0) return;\n TimelineStore.seek(props.meta.id, clamp(\n rulerScrub.viewStart + ((clientX - rulerScrub.rect.left) / rulerScrub.rect.width) * rulerScrub.visibleDuration,\n rulerScrub.viewStart,\n rulerScrub.viewStart + rulerScrub.visibleDuration\n ));\n };\n const seekTrack = (clientX: number) => {\n if (!trackScrub || trackScrub.rect.width <= 0) return;\n TimelineStore.seek(props.meta.id, clamp(\n trackScrub.viewStart + ((clientX - trackScrub.rect.left) / trackScrub.rect.width) * trackScrub.visibleDuration,\n trackScrub.viewStart,\n trackScrub.viewStart + trackScrub.visibleDuration\n ));\n };\n const finishRuler = () => {\n if (rulerScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n rulerScrub = null;\n zoomDrag = null;\n };\n const finishTrack = () => {\n if (trackScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n trackScrub = null;\n };\n\n const handleCopy = () => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(props.meta.id), props.meta.clips);\n void navigator.clipboard.writeText(buildCopyInstruction('useDialTimeline', props.meta.name, normalized));\n copied.value = true;\n window.setTimeout(() => { copied.value = false; }, 1500);\n };\n const handleAddPreset = () => DialStore.savePreset(props.meta.id, `Version ${presets.value.length + 2}`);\n const closePopover = () => { popover.value = null; };\n const openClipPopover = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const target = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n if (getClipControls(props.meta.id, target, stepKey ? undefined : clipPopoverExclusions(clip)).length === 0) return;\n popover.value = popover.value?.clip.key === clip.key && popover.value.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height },\n };\n };\n const toggleSet = (state: typeof expandedTracks, key: string) => {\n const next = new Set(state.value);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n state.value = next;\n };\n const toggleTracks = (key: string) => toggleSet(expandedTracks, key);\n const toggleGroup = (key: string) => toggleSet(collapsedGroups, key);\n const handleBarClick = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) toggleTracks(clip.key);\n else openClipPopover(clip, rect, stepKey);\n };\n\n const ticks = computed(() => {\n const raw = pxPerSecond.value > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond.value : 1;\n const adaptive = SECOND_TICK_STEPS.find((step) => step >= raw) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom.value < 1.5 && props.meta.duration >= 1 ? Math.max(1, adaptive) : adaptive;\n const fineStep = majorStep / 10;\n const major: number[] = [];\n const medium: number[] = [];\n const fine: number[] = [];\n for (let time = Math.ceil((safeViewStart.value - 1e-6) / majorStep) * majorStep; time <= viewEnd.value + 1e-6; time += majorStep) {\n major.push(Number(time.toFixed(4)));\n }\n const first = Math.ceil((safeViewStart.value - 1e-6) / fineStep);\n const last = Math.floor((viewEnd.value + 1e-6) / fineStep);\n for (let index = first; index <= last; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineStep).toFixed(6));\n if (index % 5 === 0) medium.push(tick);\n else fine.push(tick);\n }\n return { major, medium, fine, majorStep };\n });\n\n const renderRows = (): VNodeChild[] => {\n const rows: VNodeChild[] = [];\n let lastGroup: string | undefined;\n for (const clip of props.meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const collapsed = collapsedGroups.value.has(group);\n rows.push(h('div', { key: `group:${group}`, class: 'dialkit-timeline-row dialkit-timeline-group-row' }, [\n h('div', { class: 'dialkit-timeline-label' }, [\n h('button', {\n class: 'dialkit-timeline-group-toggle',\n 'data-open': !collapsed,\n title: collapsed ? 'Expand layer' : 'Collapse layer',\n onClick: () => toggleGroup(group),\n }, [chevronIcon()]),\n h('span', formatLabel(group)),\n ]),\n h('div', { class: 'dialkit-timeline-lane' }),\n ]));\n }\n }\n if (clip.group && collapsedGroups.value.has(clip.group)) continue;\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks.value.has(clip.key);\n const stat = computeClipStaticFromValues(values.value, clip, props.meta.duration);\n const selected = popover.value?.clip.key === clip.key;\n rows.push(h('div', { key: clip.key, class: 'dialkit-timeline-row', 'data-grouped': clip.group ? '' : undefined }, [\n h('div', { class: 'dialkit-timeline-label' }, [\n isProps ? h('button', {\n class: 'dialkit-timeline-group-toggle',\n 'data-open': tracksOpen,\n title: tracksOpen ? 'Collapse properties' : 'Expand properties',\n onClick: (event: Event) => {\n event.stopPropagation();\n toggleTracks(clip.key);\n },\n }, [chevronIcon()]) : null,\n clip.label,\n ]),\n h('div', { class: 'dialkit-timeline-lane' }, [h(TimelineClip, {\n timelineId: props.meta.id,\n 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.value,\n viewStart: safeViewStart.value,\n timelineDuration: props.meta.duration,\n selected,\n selectedStepKey: selected ? popover.value?.stepKey : undefined,\n onClick: handleBarClick,\n onDrag: closePopover,\n })]),\n ]));\n if (!tracksOpen) continue;\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 const trackSelected = popover.value?.clip.key === trackKey;\n rows.push(h('div', { key: trackKey, class: 'dialkit-timeline-row dialkit-timeline-track-row', 'data-grouped': clip.group ? '' : undefined }, [\n h('div', { class: 'dialkit-timeline-label' }, formatLabel(trackRef.prop)),\n h('div', { class: 'dialkit-timeline-lane' }, [h(TimelineClip, {\n timelineId: props.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: true,\n pxPerSecond: pxPerSecond.value,\n viewStart: safeViewStart.value,\n timelineDuration: props.meta.duration,\n selected: trackSelected,\n selectedStepKey: trackSelected ? popover.value?.stepKey : undefined,\n onClick: openClipPopover,\n onDrag: closePopover,\n })]),\n ]));\n }\n }\n return rows;\n };\n\n return () => h('div', { class: 'dialkit-timeline-section' }, [\n h('div', { class: 'dialkit-timeline-header', 'data-open': open.value || undefined }, [\n h('div', { class: 'dialkit-timeline-identity' }, [\n h('span', { class: 'dialkit-timeline-title' }, props.meta.name),\n ]),\n !open.value ? h(TimelineOverview, {\n id: props.meta.id,\n duration: props.meta.duration,\n viewStart: safeViewStart.value,\n viewEnd: viewEnd.value,\n onNavigate: centerViewAt,\n }) : null,\n h('div', { class: 'dialkit-timeline-actions' }, [\n h(PlayPauseButton, { id: props.meta.id }),\n h(ReplayButton, { onReplay: handleReplay }),\n h('button', { class: 'dialkit-toolbar-add', title: 'Add timeline version', 'aria-label': 'Add timeline version', onClick: handleAddPreset }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', 'aria-hidden': 'true' },\n ICON_ADD_PRESET.map((path) => h('path', { d: path }))),\n ]),\n h(PresetManager, { panelId: props.meta.id, presets: presets.value, activePresetId: activePresetId.value }),\n h('button', {\n class: 'dialkit-toolbar-add',\n title: 'Copy parameters',\n 'aria-label': copied.value ? 'Copied parameters' : 'Copy parameters',\n onClick: handleCopy,\n }, [h('span', { style: { position: 'relative', width: '16px', height: '16px' } }, [\n copied.value\n ? h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', style: iconStyle }, [h('path', { d: ICON_CHECK })])\n : h('svg', { viewBox: '0 0 24 24', fill: 'none', style: iconStyle }, [\n h('path', { d: ICON_CLIPBOARD.board, stroke: 'currentColor', 'stroke-width': '2', 'stroke-linejoin': 'round' }),\n h('path', { d: ICON_CLIPBOARD.sparkle, fill: 'currentColor' }),\n h('path', { d: ICON_CLIPBOARD.body, stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }),\n ]),\n ])]),\n h('button', {\n class: 'dialkit-timeline-chevron',\n 'data-open': open.value,\n 'aria-expanded': open.value,\n title: open.value ? 'Collapse timeline' : 'Expand timeline',\n onClick: () => { open.value = !open.value; },\n }, [chevronIcon()]),\n ]),\n ]),\n open.value ? h('div', {\n class: 'dialkit-timeline-body',\n onWheel: handleTimelineWheel,\n onPointerdown: (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!event.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef.value?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n const reset = event.shiftKey;\n trackScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart.value,\n visibleDuration: reset ? props.meta.duration : visibleDuration.value,\n };\n if (reset) resetView();\n popover.value = null;\n TimelineStore.pause(props.meta.id);\n seekTrack(event.clientX);\n },\n onPointermove: (event: PointerEvent) => trackScrub && seekTrack(event.clientX),\n onPointerup: finishTrack,\n onPointercancel: finishTrack,\n onLostpointercapture: finishTrack,\n }, [h('div', { class: 'dialkit-timeline-grid' }, [\n h('div', { class: 'dialkit-timeline-row dialkit-timeline-ruler-row' }, [\n h('div', { class: 'dialkit-timeline-label' }),\n h('div', {\n ref: laneAreaRef,\n class: 'dialkit-timeline-ruler',\n title: 'Drag to seek · Option-drag to zoom · Shift-drag to reset zoom',\n onPointerdown: (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n if (rect.width <= 0) return;\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n if (!event.altKey) {\n const reset = event.shiftKey;\n rulerScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart.value,\n visibleDuration: reset ? props.meta.duration : visibleDuration.value,\n };\n if (reset) resetView();\n TimelineStore.pause(props.meta.id);\n seekRuler(event.clientX);\n return;\n }\n const ratio = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n zoomDrag = {\n pointerX: event.clientX,\n zoom: zoom.value,\n anchorRatio: ratio,\n anchorTime: safeViewStart.value + ratio * visibleDuration.value,\n moved: false,\n };\n },\n onPointermove: (event: PointerEvent) => {\n if (rulerScrub) {\n seekRuler(event.clientX);\n return;\n }\n if (!zoomDrag || props.meta.duration <= 0) return;\n const dx = event.clientX - zoomDrag.pointerX;\n if (!zoomDrag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n zoomDrag.moved = true;\n const nextZoom = clamp(zoomDrag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom.value);\n const duration = props.meta.duration / nextZoom;\n zoom.value = nextZoom;\n viewStart.value = clampViewStart(zoomDrag.anchorTime - zoomDrag.anchorRatio * duration, props.meta.duration, duration);\n },\n onPointerup: finishRuler,\n onPointercancel: finishRuler,\n onLostpointercapture: finishRuler,\n }, [\n ...ticks.value.fine.map((time) => h('div', { key: `fine:${time}`, class: 'dialkit-timeline-tick dialkit-timeline-tick-fine', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } })),\n ...ticks.value.medium.map((time) => h('div', { key: `medium:${time}`, class: 'dialkit-timeline-tick dialkit-timeline-tick-medium', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } })),\n ...ticks.value.major.map((time) => h('div', { key: time, class: 'dialkit-timeline-tick', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } }, [\n h('span', { class: 'dialkit-timeline-tick-label' }, formatRulerSeconds(time, ticks.value.majorStep)),\n ])),\n ]),\n ]),\n ...renderRows(),\n pxPerSecond.value > 0 ? h(TimelinePlayheadFlag, {\n id: props.meta.id,\n duration: props.meta.duration,\n pxPerSecond: pxPerSecond.value,\n viewStart: safeViewStart.value,\n viewEnd: viewEnd.value,\n laneWidth: laneWidth.value,\n ruler: laneAreaRef.value ?? undefined,\n onResetView: resetView,\n }) : null,\n ]), zoom.value > 1 ? h('div', { class: 'dialkit-timeline-scroll-row' }, [\n h('div', { class: 'dialkit-timeline-label' }),\n h('div', {\n ref: horizontalScrollRef,\n class: 'dialkit-timeline-horizontal-scroll',\n 'aria-label': 'Timeline horizontal scroll',\n onScroll: handleHorizontalScroll,\n }, [h('div', { style: { width: `${laneWidth.value * zoom.value}px` } })]),\n ]) : null]) : null,\n popover.value ? h(ClipPopover, {\n panelId: props.meta.id,\n popover: popover.value,\n values: values.value,\n theme: props.theme,\n onClose: closePopover,\n }) : null,\n ]);\n },\n});\n\nfunction chevronIcon() {\n return h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, [\n h('path', { d: ICON_CHEVRON }),\n ]);\n}\n\nconst ClipPopover = defineComponent({\n props: {\n panelId: { type: String, required: true },\n popover: { type: Object as PropType<PopoverState>, required: true },\n values: { type: Object as PropType<Record<string, DialValue>>, required: true },\n theme: { type: String as PropType<DialTheme>, required: true },\n onClose: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const element = ref<HTMLDivElement | null>(null);\n const naturalHeight = ref(0);\n const viewport = ref(readViewport());\n let observer: ResizeObserver | undefined;\n const measure = () => {\n if (element.value) naturalHeight.value = element.value.scrollHeight + 2;\n };\n const updateViewport = () => { viewport.value = readViewport(); };\n const outside = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (element.value?.contains(target) || target.closest?.('.dialkit-timeline-clip') || target.closest?.('.dialkit-timeline-label')) return;\n props.onClose();\n };\n const keydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') props.onClose();\n };\n onMounted(() => {\n measure();\n observer = new ResizeObserver(measure);\n if (element.value) observer.observe(element.value.querySelector('.dialkit-timeline-popover-body') ?? element.value);\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', keydown);\n });\n onUnmounted(() => {\n observer?.disconnect();\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n document.removeEventListener('pointerdown', outside, true);\n document.removeEventListener('keydown', keydown);\n });\n\n return () => {\n const { clip, stepKey } = props.popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(props.panelId, `${clip.key}.${stepKey}`);\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(props.panelId, `${clip.key}.from`);\n if (from) {\n const index = controls.findIndex((control) => control.path === `${clip.key}.${stepKey}.to`);\n controls = index >= 0 ? [...controls.slice(0, index), from, ...controls.slice(index)] : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(props.panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n if (controls.length === 0) return null;\n const target = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(props.panelId, `${target}.duration`);\n const durationValue = durationMeta ? props.values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(props.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 const current = viewport.value;\n const right = current.offsetLeft + current.width;\n const bottom = current.offsetTop + current.height;\n const width = Math.min(POPOVER_WIDTH, Math.max(220, current.width - 24));\n const left = clamp(props.popover.anchor.left + props.popover.anchor.width / 2 - width / 2, current.offsetLeft + 12, Math.max(current.offsetLeft + 12, right - width - 12));\n const above = Math.max(0, props.popover.anchor.top - current.offsetTop - 22);\n const below = Math.max(0, bottom - props.popover.anchor.bottom - 22);\n const placeAbove = naturalHeight.value === 0 ? above >= below : naturalHeight.value <= above || (naturalHeight.value > below && above >= below);\n const availableHeight = placeAbove ? above : below;\n const renderedHeight = Math.min(naturalHeight.value || availableHeight, availableHeight);\n const rawTop = placeAbove ? props.popover.anchor.top - 10 - renderedHeight : props.popover.anchor.bottom + 10;\n const top = clamp(rawTop, current.offsetTop + 12, Math.max(current.offsetTop + 12, bottom - renderedHeight - 12));\n\n return h(Teleport, { to: 'body' }, [h('div', { class: 'dialkit-root', 'data-theme': props.theme }, [\n h('div', {\n ref: element,\n class: 'dialkit-timeline-popover',\n 'data-placement': placeAbove ? 'above' : 'below',\n style: { left: `${left}px`, top: `${top}px`, width: `${width}px`, maxHeight: `${availableHeight}px`, visibility: naturalHeight.value > 0 ? 'visible' : 'hidden' },\n role: 'dialog',\n 'aria-label': `Edit ${title}`,\n }, [\n h('div', { class: 'dialkit-timeline-popover-header' }, [\n h('span', { class: 'dialkit-timeline-popover-title' }, title),\n h('button', { class: 'dialkit-timeline-popover-close', title: 'Close editor', 'aria-label': 'Close editor', onClick: props.onClose }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round' }, [h('path', { d: 'M6 6L18 18M18 6L6 18' })]),\n ]),\n ]),\n h('div', { class: 'dialkit-timeline-popover-body' }, [h(ControlRenderer, {\n panelId: props.panelId,\n controls,\n values: timelinePopoverDisplayValues(props.values, clip.key, clip.stepKeys, stepKey),\n transitionDuration,\n })]),\n ]),\n ])]);\n };\n },\n});\n\nfunction readViewport() {\n return {\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\nfunction clipPopoverExclusions(clip: TimelineClipMeta) {\n return new Set([...(clip.stepKeys ?? []), ...(clip.tracks?.map((track) => track.prop) ?? [])]);\n}\n\nfunction getClipControls(panelId: string, path: string, exclusions?: Set<string>): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, path) : null;\n if (!folder?.children) return [];\n return folder.children.filter((control) => {\n const key = control.path.slice(path.length + 1);\n return key !== 'at' && key !== 'duration' && !exclusions?.has(key);\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\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\nconst TimelineClip = defineComponent({\n props: {\n timelineId: { type: String, required: true },\n clip: { type: Object as PropType<TimelineClipMeta>, required: true },\n at: { type: Number, required: true },\n duration: { type: Number, required: true },\n loop: { type: String as PropType<TimelineClipLoop>, required: true },\n steps: Array as PropType<TimelineStepStatic[]>,\n fixedDuration: { type: Boolean, required: true },\n composite: Boolean,\n baseAt: { type: Number, default: 0 },\n delayMode: Boolean,\n pxPerSecond: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n timelineDuration: { type: Number, required: true },\n selected: { type: Boolean, required: true },\n selectedStepKey: String,\n onClick: { type: Function as PropType<(clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void>, required: true },\n onDrag: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const dragging = ref(false);\n let drag: DragState | null = null;\n const finish = (event?: PointerEvent) => {\n const previous = drag;\n drag = null;\n dragging.value = false;\n if (previous && !previous.moved && event) {\n const anchor = previous.clickEl ?? event.currentTarget as HTMLElement;\n props.onClick(props.clip, anchor.getBoundingClientRect(), previous.clickEl?.dataset.step);\n }\n };\n return () => {\n const width = Math.max(props.duration * props.pxPerSecond, 14);\n const isSteps = Boolean(props.steps?.length);\n const looping = props.loop === 'repeat' && props.duration > 0;\n const resizable = props.duration > 0 && !props.fixedDuration && !props.composite;\n const durationText = `${props.fixedDuration && !props.composite ? '~' : ''}${formatSeconds(props.duration)}`;\n const ghosts: VNodeChild[] = [];\n if (looping) {\n const first = Math.max(1, Math.floor((props.viewStart - props.at) / props.duration));\n for (let offset = 0; offset < 256; offset++) {\n const index = first + offset;\n const start = props.at + props.duration * index;\n if (start >= props.timelineDuration - 1e-6) break;\n const duration = Math.min(props.duration, props.timelineDuration - start);\n ghosts.push(h('div', {\n key: `ghost:${index}`,\n class: 'dialkit-timeline-clip-ghost',\n 'data-steps': isSteps || undefined,\n 'aria-hidden': 'true',\n style: { left: `${(start - props.viewStart) * props.pxPerSecond + 1}px`, width: `${Math.max(1, duration * props.pxPerSecond - 2)}px`, background: props.clip.color },\n }, props.steps?.map((step) => h('span', { class: 'dialkit-timeline-clip-ghost-segment', style: { width: `${step.duration * props.pxPerSecond}px` } }))));\n }\n }\n let cumulative = 0;\n const boundaries = props.steps?.map((step) => (cumulative += step.duration)) ?? [];\n const children: VNodeChild[] = [];\n if (props.composite) {\n if (width > 56) children.push(h('span', { class: 'dialkit-timeline-clip-duration' }, durationText));\n } else if (isSteps) {\n for (const step of props.steps ?? []) {\n const segmentWidth = step.duration * props.pxPerSecond;\n children.push(h('div', {\n key: step.key ?? 'step',\n class: 'dialkit-timeline-clip-segment',\n 'data-step': step.key,\n 'data-selected': props.selectedStepKey === step.key || undefined,\n style: { width: `${segmentWidth}px` },\n }, segmentWidth > 52 ? [h('span', { class: 'dialkit-timeline-clip-duration' }, formatSeconds(step.duration))] : []));\n }\n (props.steps ?? []).forEach((step, index) => {\n if (!step.isPhysics) children.push(h('div', { key: `boundary:${step.key}`, class: 'dialkit-timeline-clip-handle', 'data-boundary': index, style: { left: `${boundaries[index] * props.pxPerSecond - 4}px` } }));\n });\n if (!props.steps?.[0]?.isPhysics) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'start' }));\n } else {\n if (resizable) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'start' }));\n if (width > 56) children.push(h('span', { class: 'dialkit-timeline-clip-duration' }, durationText));\n if (resizable) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'end' }));\n }\n const title = props.composite\n ? `${props.clip.label} — composite of its property tracks${looping ? ' · repeats through timeline' : ''} · click to expand`\n : `${props.clip.label} — ${formatSeconds(props.at)} for ${durationText}${props.fixedDuration ? ' (duration set by spring physics)' : ''}${looping ? ' · repeats through timeline' : ''}${props.delayMode ? ' · drag to phase-shift' : ''}`;\n return [...ghosts, h('div', {\n class: 'dialkit-timeline-clip',\n 'data-steps': isSteps || undefined,\n 'data-composite': props.composite || undefined,\n 'data-selected': props.selected || undefined,\n 'data-dragging': dragging.value || undefined,\n style: { left: `${(props.at - props.viewStart) * props.pxPerSecond}px`, width: `${width}px`, background: props.composite ? `${props.clip.color}80` : props.clip.color },\n title,\n onPointerdown: (event: PointerEvent) => {\n if (event.shiftKey) return;\n event.stopPropagation();\n const target = event.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n if (target.dataset.boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(target.dataset.boundary);\n } else if (!props.fixedDuration) {\n const edge = target.dataset.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n drag = {\n mode,\n boundaryIndex,\n pointerX: event.clientX,\n at: props.at,\n duration: props.duration,\n stepDurations: props.steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]'),\n moved: false,\n };\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n },\n onPointermove: (event: PointerEvent) => {\n if (!drag || props.pxPerSecond <= 0) return;\n const dx = event.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n dragging.value = true;\n props.onDrag();\n }\n const dt = dx / props.pxPerSecond;\n if (drag.mode === 'boundary' && props.steps && drag.stepDurations) {\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, duration, stepIndex) => stepIndex === index ? sum : sum + duration, 0);\n DialStore.updateValue(props.timelineId, `${props.clip.key}.${props.steps[index].key ?? ''}.duration`, clampStepResize(drag.stepDurations[index] + dt, drag.at, others, props.timelineDuration));\n } else if (drag.mode === 'move') {\n if (props.delayMode) DialStore.updateValue(props.timelineId, `${props.clip.key}.delay`, clampTrackDelay(drag.at + dt - props.baseAt, props.baseAt, drag.duration, props.timelineDuration));\n else DialStore.updateValue(props.timelineId, `${props.clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, props.timelineDuration));\n } else if (drag.mode === 'end') {\n DialStore.updateValue(props.timelineId, `${props.clip.key}.duration`, clampClipResizeEnd(drag.duration + dt, drag.at, props.timelineDuration));\n } else if (props.steps && drag.stepDurations) {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(props.baseAt, 0)), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - props.baseAt) : next.at,\n [`${props.clip.key}.${props.steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(props.baseAt, 0)), drag.at, drag.duration);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - props.baseAt) : next.at,\n [`${props.clip.key}.duration`]: next.duration,\n });\n }\n },\n onPointerup: finish,\n onPointercancel: () => finish(),\n onLostpointercapture: () => finish(),\n }, children), looping ? h('span', { class: 'dialkit-timeline-loop-infinity', 'aria-hidden': 'true', title: 'Repeats indefinitely' }, '∞') : null];\n };\n },\n});\n","import { Fragment, defineComponent, h, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, DialValue, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { ColorControl } from './ColorControl';\nimport { Folder } from './Folder';\nimport { SelectControl } from './SelectControl';\nimport { ShortcutKey } from './ShortcutListener';\nimport { Slider } from './Slider';\nimport { SpringControl } from './SpringControl';\nimport { TextControl } from './TextControl';\nimport { Toggle } from './Toggle';\nimport { TransitionControl, type TransitionDurationControl } from './TransitionControl';\nimport { inject } from 'vue';\n\nexport const ControlRenderer = defineComponent({\n name: 'DialKitControlRenderer',\n props: {\n panelId: { type: String, required: true },\n controls: { type: Array as PropType<ControlMeta[]>, required: true },\n values: { type: Object as PropType<Record<string, DialValue>>, required: true },\n transitionDuration: Object as PropType<TransitionDurationControl>,\n },\n setup(props) {\n const shortcut = inject(ShortcutKey, undefined);\n const renderControl = (control: ControlMeta): ReturnType<typeof h> | null => {\n const value = props.values[control.path];\n switch (control.type) {\n case 'slider':\n return h(Slider, {\n key: control.path,\n label: control.label,\n value: value as number,\n min: control.min,\n max: control.max,\n step: control.step,\n shortcut: control.shortcut,\n shortcutActive: shortcut?.activePanelId.value === props.panelId && shortcut.activePath.value === control.path,\n onChange: (next: number) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'toggle':\n return h(Toggle, {\n key: control.path,\n label: control.label,\n checked: value as boolean,\n shortcut: control.shortcut,\n shortcutActive: shortcut?.activePanelId.value === props.panelId && shortcut.activePath.value === control.path,\n onChange: (next: boolean) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'spring':\n return h(SpringControl, {\n key: control.path,\n panelId: props.panelId,\n path: control.path,\n label: control.label,\n spring: value as SpringConfig,\n onChange: (next: SpringConfig) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'transition':\n return h(TransitionControl, {\n key: control.path,\n panelId: props.panelId,\n path: control.path,\n label: control.label,\n value: value as TransitionConfig,\n durationControl: props.transitionDuration,\n onChange: (next: TransitionConfig) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'folder':\n return h(Folder, {\n key: control.path,\n title: control.label,\n defaultOpen: control.defaultOpen ?? true,\n }, { default: () => (control.children ?? []).map(renderControl) });\n case 'text':\n return h(TextControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n placeholder: control.placeholder,\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'select':\n return h(SelectControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n options: control.options ?? [],\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'color':\n return h(ColorControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'action':\n return h('button', {\n key: control.path,\n class: 'dialkit-button',\n onClick: () => DialStore.triggerAction(props.panelId, control.path),\n }, control.label);\n default:\n return null;\n }\n };\n return () => h(Fragment, null, props.controls.map(renderControl));\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, Teleport, type PropType } from 'vue';\nimport { DialStore, ShortcutConfig } from '../../store/DialStore';\n\nfunction formatShortcutKey(sc: ShortcutConfig): string {\n if (!sc.key) return '\\u2014';\n const mod = sc.modifier === 'alt' ? '\\u2325'\n : sc.modifier === 'shift' ? '\\u21E7'\n : sc.modifier === 'meta' ? '\\u2318'\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 const ShortcutsMenu = defineComponent({\n name: 'DialKitShortcutsMenu',\n props: {\n panelId: {\n type: String as PropType<string>,\n required: true,\n },\n },\n setup(props) {\n const isOpen = ref(false);\n const triggerRef = ref<HTMLButtonElement | null>(null);\n const dropdownRef = ref<HTMLDivElement | null>(null);\n const pos = ref({ top: 0, right: 0 });\n\n const open = () => {\n const rect = triggerRef.value?.getBoundingClientRect();\n if (rect) {\n pos.value = { top: rect.bottom + 4, right: window.innerWidth - rect.right };\n }\n isOpen.value = true;\n };\n\n const close = () => {\n isOpen.value = false;\n };\n\n const toggle = () => {\n if (isOpen.value) close();\n else open();\n };\n\n let mousedownHandler: ((e: MouseEvent) => void) | null = null;\n\n const addOutsideClickListener = () => {\n mousedownHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.value?.contains(target) ||\n dropdownRef.value?.contains(target)\n ) return;\n close();\n };\n document.addEventListener('mousedown', mousedownHandler);\n };\n\n const removeOutsideClickListener = () => {\n if (mousedownHandler) {\n document.removeEventListener('mousedown', mousedownHandler);\n mousedownHandler = null;\n }\n };\n\n onUnmounted(() => {\n removeOutsideClickListener();\n });\n\n return () => {\n const panel = DialStore.getPanel(props.panelId);\n if (!panel) return null;\n\n const shortcuts = Object.entries(panel.shortcuts);\n if (shortcuts.length === 0) return null;\n\n // Find control label\n const findLabel = (controls: typeof panel.controls, path: string): 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, path);\n if (found) return found;\n }\n }\n return path;\n };\n\n const rows = shortcuts.map(([path, shortcut]) => ({\n path,\n shortcut,\n label: findLabel(panel.controls, path),\n }));\n\n // Manage outside click listener based on open state\n if (isOpen.value) {\n if (!mousedownHandler) addOutsideClickListener();\n } else {\n removeOutsideClickListener();\n }\n\n return [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-shortcuts-trigger',\n onClick: toggle,\n title: 'Keyboard shortcuts',\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, [\n h('rect', { x: '2', y: '6', width: '20', height: '12', rx: '2' }),\n h('path', { d: 'M6 10H6.01' }),\n h('path', { d: 'M10 10H10.01' }),\n h('path', { d: 'M14 10H14.01' }),\n h('path', { d: 'M18 10H18.01' }),\n h('path', { d: 'M8 14H16' }),\n ]),\n ]),\n isOpen.value\n ? h(Teleport, { to: 'body' }, [\n h('div', {\n ref: dropdownRef,\n class: 'dialkit-root dialkit-shortcuts-dropdown',\n style: {\n position: 'fixed',\n top: `${pos.value.top}px`,\n right: `${pos.value.right}px`,\n },\n }, [\n h('div', { class: 'dialkit-shortcuts-title' }, 'Keyboard Shortcuts'),\n h('div', { class: 'dialkit-shortcuts-list' },\n rows.map((row) =>\n h('div', { key: row.path, class: 'dialkit-shortcuts-row' }, [\n h('span', { class: 'dialkit-shortcuts-row-key' }, formatShortcutKey(row.shortcut)),\n h('span', { class: 'dialkit-shortcuts-row-label' }, row.label),\n h('span', { class: 'dialkit-shortcuts-row-mode' }, formatInteraction(row.shortcut)),\n ])\n )\n ),\n h('div', { class: 'dialkit-shortcuts-hint' }, 'See pill badges on controls for keys'),\n ]),\n ])\n : null,\n ];\n };\n },\n});\n","import { defineComponent, h, type PropType } from 'vue';\n\nexport type ButtonGroupButton = {\n label: string;\n onClick: () => void;\n};\n\nexport const ButtonGroup = defineComponent({\n name: 'DialKitButtonGroup',\n props: {\n buttons: {\n type: Array as PropType<ButtonGroupButton[]>,\n required: true,\n },\n },\n setup(props) {\n return () => h(\n 'div',\n { class: 'dialkit-button-group' },\n props.buttons.map((button) =>\n h('button', { class: 'dialkit-button', onClick: button.onClick }, button.label)\n )\n );\n },\n});\n"],"mappings":"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","names":["computed","onMounted","onUnmounted","shallowRef","watch","wd","t","h","computed","shallowRef","watch","onMounted","onUnmounted","defineComponent","h","shallowRef","computed","defineComponent","h","nextTick","onMounted","onUnmounted","ref","Teleport","onMounted","onUnmounted","ref","ref","onUnmounted","onMounted","defineComponent","h","onMounted","onUnmounted","ref","AnimatePresence","motion","defineComponent","h","computed","onMounted","onUnmounted","ref","watch","defineComponent","computed","ref","discreteSteps","watch","h","onMounted","onUnmounted","defineComponent","h","defineComponent","h","nextTick","onMounted","onUnmounted","ref","watch","animate","defineComponent","h","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","h","computed","defineComponent","ref","onMounted","onUnmounted","h","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","h","computed","defineComponent","computed","h","defineComponent","ref","h","onMounted","onUnmounted","defineComponent","h","ref","defineComponent","h","onMounted","ref","watch","AnimatePresence","motion","defineComponent","ref","watch","onMounted","h","motion","AnimatePresence","defineComponent","h","ref","watch","Teleport","defineComponent","h","ref","watch","AnimatePresence","motion","defineComponent","ref","watch","open","h","motion","Teleport","AnimatePresence","defineComponent","onMounted","onUnmounted","ref","ref","defineComponent","target","onMounted","onUnmounted","defineComponent","ref","onMounted","onUnmounted","h","motion","AnimatePresence","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","ref","onMounted","onUnmounted","h","isDevDefault","defineComponent","ref","computed","onMounted","nextTick","onUnmounted","h","Teleport","shallowRef","defineComponent","h","Teleport","computed","defineComponent","h","nextTick","onMounted","onUnmounted","ref","watch","Fragment","defineComponent","h","inject","defineComponent","h","Fragment","defineComponent","ref","onMounted","watch","onUnmounted","h","Teleport","nextTick","computed","defineComponent","h","onUnmounted","ref","Teleport","defineComponent","ref","onUnmounted","h","Teleport","defineComponent","h"]}
|
|
1
|
+
{"version":3,"sources":["../../src/vue/useDialKit.ts","../../src/store/DialStore.ts","../../src/vue/useDialTimeline.ts","../../src/store/TimelineStore.ts","../../src/transition-math.ts","../../src/timeline-core.ts","../../src/timeline/adapter.ts","../../src/store/TimelineUiStore.ts","../../src/copy-instruction.ts","../../src/env.ts","../../src/vue/directives/dialkit.ts","../../src/vue/components/DialRoot.ts","../../src/vue/components/Folder.ts","../../src/icons.ts","../../src/vue/components/Panel.ts","../../src/vue/components/Slider.ts","../../src/shortcut-utils.ts","../../src/vue/components/Toggle.ts","../../src/vue/components/SegmentedControl.ts","../../src/vue/components/SpringControl.ts","../../src/vue/components/SpringVisualization.ts","../../src/vue/components/TransitionControl.ts","../../src/vue/components/EasingVisualization.ts","../../src/vue/components/TextControl.ts","../../src/vue/components/SelectControl.ts","../../src/dropdown-position.ts","../../src/vue/components/ColorControl.ts","../../src/vue/components/PresetManager.ts","../../src/vue/components/ShortcutListener.ts","../../src/vue/components/Timeline/TimelineToggleButton.ts","../../src/panel-drag.ts","../../src/vue/components/Timeline/DialTimeline.ts","../../src/vue/components/ControlRenderer.ts","../../src/vue/components/ShortcutsMenu.ts","../../src/vue/components/ButtonGroup.ts"],"sourcesContent":["import { computed, onMounted, onUnmounted, ref, shallowRef, watch, type ComputedRef } from 'vue';\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';\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: ComputedRef<ResolvedValues<T>>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nlet dialKitInstance = 0;\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ComputedRef<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 hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${++dialKitInstance}`;\n const configRef = shallowRef(config);\n const onActionRef = ref(options?.onAction);\n const shortcutsRef = shallowRef(options?.shortcuts);\n const persistRef = shallowRef(options?.persist);\n const flatValues = ref<Record<string, DialValue>>(DialStore.getValues(panelId));\n const mounted = ref(false);\n const serializedConfig = computed(() => JSON.stringify(config));\n const serializedShortcuts = computed(() => JSON.stringify(options?.shortcuts));\n const serializedPersist = computed(() => JSON.stringify(options?.persist));\n\n let unsubscribeValues: (() => void) | undefined;\n let unsubscribeActions: (() => void) | undefined;\n\n const register = () => {\n DialStore.registerPanel(panelId, name, configRef.value, shortcutsRef.value, {\n retainOnUnmount: hasStableId,\n persist: persistRef.value,\n });\n flatValues.value = DialStore.getValues(panelId);\n\n unsubscribeValues = DialStore.subscribe(panelId, () => {\n flatValues.value = DialStore.getValues(panelId);\n });\n\n unsubscribeActions = DialStore.subscribeActions(panelId, (action) => {\n onActionRef.value?.(action);\n });\n };\n\n watch(() => options?.onAction, (next) => {\n onActionRef.value = next;\n });\n\n watch(() => options?.shortcuts, (next) => {\n shortcutsRef.value = next;\n });\n\n watch(() => options?.persist, (next) => {\n persistRef.value = next;\n });\n\n watch([serializedConfig, serializedShortcuts, serializedPersist], () => {\n configRef.value = config;\n shortcutsRef.value = options?.shortcuts;\n persistRef.value = options?.persist;\n if (mounted.value) {\n DialStore.updatePanel(panelId, name, configRef.value, shortcutsRef.value, {\n retainOnUnmount: hasStableId,\n persist: persistRef.value,\n });\n flatValues.value = DialStore.getValues(panelId);\n }\n });\n\n onMounted(register);\n onMounted(() => {\n mounted.value = true;\n });\n\n onUnmounted(() => {\n unsubscribeValues?.();\n unsubscribeActions?.();\n DialStore.unregisterPanel(panelId);\n });\n\n const values = computed(() => resolveDialValues(configRef.value, flatValues.value));\n\n return {\n values,\n setValue(path, value) {\n DialStore.updateValue(panelId, path, value);\n },\n setValues(nextValues) {\n DialStore.updateValues(panelId, flattenDialValueUpdates(configRef.value, nextValues));\n },\n resetValues() {\n DialStore.resetValues(panelId);\n },\n getValues() {\n return resolveDialValues(configRef.value, DialStore.getValues(panelId));\n },\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 { computed, onMounted, onUnmounted, shallowRef, watch, type ComputedRef } from 'vue';\nimport { DialStore } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n computeStaticTimeline,\n parseTimelineConfig,\n resolveTimelineLoop,\n type DialTimelineOptions,\n type DialTimelineValues,\n type TimelineConfig,\n} from '../timeline';\n\nexport type UseDialTimelineOptions = DialTimelineOptions;\n\nlet timelineInstance = 0;\n\nexport function useDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: UseDialTimelineOptions\n): ComputedRef<DialTimelineValues<T>> {\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${++timelineInstance}`;\n const serializedConfig = computed(() => JSON.stringify(config));\n const serializedPersist = computed(() => JSON.stringify(options?.persist));\n const serializedLoop = computed(() => JSON.stringify(options?.loop));\n const parsed = computed(() => {\n serializedConfig.value;\n return parseTimelineConfig(config);\n });\n const flatValues = shallowRef(DialStore.getValues(panelId));\n const transport = shallowRef(TimelineStore.getTransport(panelId));\n const staticTimeline = computed(() => computeStaticTimeline(parsed.value, flatValues.value));\n const meta = computed(() => {\n serializedLoop.value;\n return buildTimelineMeta(\n panelId,\n name,\n staticTimeline.value.duration,\n parsed.value,\n options?.loop\n );\n });\n let mounted = false;\n let unsubscribeValues: (() => void) | undefined;\n let unsubscribeTransport: (() => void) | undefined;\n\n const play = () => TimelineStore.play(panelId);\n const pause = () => TimelineStore.pause(panelId);\n const replay = () => TimelineStore.replay(panelId);\n const seek = (time: number) => TimelineStore.seek(panelId, time);\n\n watch([serializedConfig, serializedPersist], () => {\n if (!mounted) return;\n DialStore.updatePanel(panelId, name, parsed.value.dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n flatValues.value = DialStore.getValues(panelId);\n });\n\n watch(meta, (nextMeta) => {\n if (mounted) TimelineStore.update(nextMeta);\n });\n\n onMounted(() => {\n unsubscribeValues = DialStore.subscribe(panelId, () => {\n flatValues.value = DialStore.getValues(panelId);\n });\n unsubscribeTransport = TimelineStore.subscribe(panelId, () => {\n transport.value = TimelineStore.getTransport(panelId);\n });\n\n DialStore.registerPanel(panelId, name, parsed.value.dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n flatValues.value = DialStore.getValues(panelId);\n TimelineStore.register(meta.value, { autoplay: options?.autoplay ?? true });\n transport.value = TimelineStore.getTransport(panelId);\n mounted = true;\n });\n\n onUnmounted(() => {\n mounted = false;\n unsubscribeValues?.();\n unsubscribeTransport?.();\n TimelineStore.unregister(panelId);\n DialStore.unregisterPanel(panelId);\n });\n\n return computed(() => {\n const currentStatic = staticTimeline.value;\n return buildTimelineValues<T>(\n currentStatic.clips,\n transport.value,\n currentStatic.duration,\n resolveTimelineLoop(options?.loop).start,\n { play, pause, replay, seek }\n );\n });\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","// 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","// 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","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","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","// 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 {\n createApp,\n defineComponent,\n h,\n shallowRef,\n type App,\n type ObjectDirective,\n type ShallowRef,\n} from 'vue';\nimport { DialRoot, type DialMode, type DialPosition } from '../components/DialRoot';\n\nexport interface DialKitDirectiveOptions {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport type DialKitDirectiveValue = DialMode | DialKitDirectiveOptions | undefined;\n\ntype DirectiveState = {\n app: App;\n host: HTMLDivElement;\n props: ShallowRef<DialKitDirectiveOptions>;\n};\n\nconst states = new WeakMap<HTMLElement, DirectiveState>();\n\nfunction normalizeDirectiveValue(value: DialKitDirectiveValue): DialKitDirectiveOptions {\n if (!value) return {};\n if (value === 'inline' || value === 'popover') {\n return { mode: value };\n }\n return value;\n}\n\nfunction mountDialRoot(el: HTMLElement, value: DialKitDirectiveValue) {\n if (typeof window === 'undefined') return;\n\n const host = document.createElement('div');\n el.appendChild(host);\n\n const props = shallowRef<DialKitDirectiveOptions>(normalizeDirectiveValue(value));\n const RootHost = defineComponent({\n name: 'DialKitDirectiveHost',\n setup() {\n return () => h(DialRoot, props.value);\n },\n });\n\n const app = createApp(RootHost);\n app.mount(host);\n\n states.set(el, { app, host, props });\n}\n\nfunction unmountDialRoot(el: HTMLElement) {\n const state = states.get(el);\n if (!state) return;\n\n state.app.unmount();\n state.host.remove();\n states.delete(el);\n}\n\nexport const vDialKit: ObjectDirective<HTMLElement, DialKitDirectiveValue> = {\n mounted(el, binding) {\n mountDialRoot(el, binding.value);\n },\n updated(el, binding) {\n const state = states.get(el);\n if (!state) {\n mountDialRoot(el, binding.value);\n return;\n }\n state.props.value = normalizeDirectiveValue(binding.value);\n },\n beforeUnmount(el) {\n unmountDialRoot(el);\n },\n};\n","import { computed, defineComponent, h, nextTick, onMounted, onUnmounted, ref, Teleport } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { PanelConfig } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport type { TimelineMeta } from '../../store/TimelineStore';\nimport { Folder } from './Folder';\nimport { Panel } from './Panel';\nimport { ShortcutListener } from './ShortcutListener';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport {\n blockPanelDragClick,\n getPanelDragHandle,\n getPanelDragOffset,\n getPanelDragStart,\n getPanelOriginX,\n hasPanelDragMoved,\n type PanelDragOffset,\n type PanelDragStart,\n} 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\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nconst 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\nexport const DialRoot = defineComponent({\n name: 'DialKitDialRoot',\n props: {\n position: {\n type: String as () => DialPosition,\n default: 'top-right',\n },\n defaultOpen: {\n type: Boolean,\n default: true,\n },\n mode: {\n type: String as () => DialMode,\n default: 'popover',\n },\n theme: {\n type: String as () => DialTheme,\n default: 'system',\n },\n productionEnabled: {\n type: Boolean,\n default: isDevDefault,\n },\n },\n emits: ['openChange'],\n setup(props, { emit }) {\n const panels = ref<PanelConfig[]>([]);\n const timelines = ref<TimelineMeta[]>([]);\n const mounted = ref(false);\n const panelRef = ref<HTMLDivElement | null>(null);\n const dragOffset = ref<PanelDragOffset | null>(null);\n const activePosition = ref<DialPosition>(props.position);\n let unsubscribePanels: (() => void) | undefined;\n let unsubscribeTimelines: (() => void) | undefined;\n let observer: MutationObserver | undefined;\n let lastDragOffset: PanelDragOffset | null = null;\n let dragging = false;\n let dragStart: PanelDragStart | null = null;\n let didDrag = false;\n let dragTarget: HTMLElement | null = null;\n let panelOpenStates = new Map<string, boolean>();\n let rootOpen: boolean | undefined;\n\n const syncPanelOpenStates = () => {\n const fallbackOpen = props.mode === 'inline' || props.defaultOpen;\n const nextStates = new Map<string, boolean>();\n for (const panel of panels.value) {\n nextStates.set(panel.id, panelOpenStates.get(panel.id) ?? fallbackOpen);\n }\n panelOpenStates = nextStates;\n rootOpen = Array.from(nextStates.values()).some(Boolean);\n };\n\n const connectObserver = () => {\n if (observer || props.mode === 'inline' || !panelRef.value) return;\n\n observer = new MutationObserver(() => {\n const inners = panelRef.value?.querySelectorAll('.dialkit-panel-inner');\n if (!inners || inners.length === 0) return;\n const collapsed = Array.from(inners).every((el) => el.getAttribute('data-collapsed') === 'true');\n const currentDragOffset = dragOffset.value;\n\n if (!collapsed) {\n if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n activePosition.value = bubbleCenterX < window.innerWidth / 2 ? 'top-left' : 'top-right';\n } else {\n activePosition.value = props.position;\n }\n dragOffset.value = null;\n } else if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n } else if (lastDragOffset) {\n dragOffset.value = lastDragOffset;\n }\n });\n\n observer.observe(panelRef.value, { subtree: true, attributes: true, attributeFilter: ['data-collapsed'] });\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n const panel = panelRef.value;\n const handle = getPanelDragHandle(event.target, panel);\n if (!panel || !handle) return;\n\n dragTarget = handle;\n dragStart = getPanelDragStart(event.clientX, event.clientY, panel);\n didDrag = false;\n dragging = true;\n handle.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging || !dragStart) return;\n\n if (!didDrag && !hasPanelDragMoved(dragStart, event.clientX, event.clientY)) return;\n didDrag = true;\n\n dragOffset.value = getPanelDragOffset(dragStart, event.clientX, event.clientY);\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = false;\n dragStart = null;\n const handle = dragTarget;\n\n if (handle?.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n\n if (didDrag) {\n event.stopPropagation();\n if (handle) {\n blockPanelDragClick(handle);\n }\n }\n\n dragTarget = null;\n };\n\n const handlePanelOpenChange = (panelId: string, open: boolean) => {\n panelOpenStates.set(panelId, open);\n const fallbackOpen = props.mode === 'inline' || props.defaultOpen;\n const nextRootOpen = panels.value.some((panel) => (\n panelOpenStates.get(panel.id) ?? fallbackOpen\n ));\n\n if (rootOpen === nextRootOpen) return;\n rootOpen = nextRootOpen;\n emit('openChange', nextRootOpen);\n };\n\n const handleRootOpenChange = (open: boolean) => {\n if (rootOpen === open) return;\n rootOpen = open;\n emit('openChange', open);\n };\n\n const getDragStyle = () => dragOffset.value\n ? {\n top: `${dragOffset.value.y}px`,\n left: `${dragOffset.value.x}px`,\n right: 'auto',\n bottom: 'auto',\n }\n : undefined;\n const originX = computed(() => props.mode === 'inline' ? undefined : getPanelOriginX(activePosition.value, dragOffset.value));\n\n onMounted(() => {\n mounted.value = true;\n panels.value = DialStore.getPanels('panel');\n timelines.value = TimelineStore.getTimelines();\n syncPanelOpenStates();\n unsubscribePanels = DialStore.subscribeGlobal(() => {\n panels.value = DialStore.getPanels('panel');\n syncPanelOpenStates();\n });\n unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n timelines.value = TimelineStore.getTimelines();\n });\n nextTick(connectObserver);\n });\n\n onUnmounted(() => {\n unsubscribePanels?.();\n unsubscribeTimelines?.();\n observer?.disconnect();\n });\n\n const timelineToggle = () => timelines.value.length > 0 ? h(TimelineToggleButton) : null;\n\n const renderPanels = () => {\n if (panels.value.length === 0) {\n return [h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: 'DialKit',\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n isRoot: true,\n inline: props.mode === 'inline',\n toolbar: timelineToggle,\n onOpenChange: handleRootOpenChange,\n panelHeightOffset: 2,\n }, { default: () => [h('div', { class: 'dialkit-timeline-toolkit-only' }, 'Timeline')] }),\n ])];\n }\n if (panels.value.length > 1) {\n return [h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: 'DialKit',\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n isRoot: true,\n inline: props.mode === 'inline',\n toolbar: timelineToggle,\n onOpenChange: handleRootOpenChange,\n panelHeightOffset: 2,\n }, {\n default: () => panels.value.map((panel) => h(Panel, {\n key: panel.id,\n panel,\n defaultOpen: true,\n variant: 'section',\n })),\n }),\n ])];\n }\n return panels.value.map((panel) => h(Panel, {\n key: panel.id,\n panel,\n defaultOpen: props.mode === 'inline' || props.defaultOpen,\n inline: props.mode === 'inline',\n toolbarExtra: timelineToggle,\n onOpenChange: (open: boolean) => handlePanelOpenChange(panel.id, open),\n }));\n };\n\n const renderContent = () => h(ShortcutListener, null, {\n default: () => h('div', { class: 'dialkit-root', 'data-mode': props.mode, 'data-theme': props.theme }, [\n h('div', {\n ref: (el) => {\n panelRef.value = el as HTMLDivElement | null;\n connectObserver();\n },\n class: 'dialkit-panel',\n 'data-position': props.mode === 'inline' ? undefined : (dragOffset.value ? undefined : activePosition.value),\n 'data-origin-x': originX.value,\n 'data-mode': props.mode,\n 'data-multiple': panels.value.length > 1 ? 'true' : undefined,\n style: getDragStyle(),\n onPointerdown: props.mode === 'inline' ? undefined : handlePointerDown,\n onPointermove: props.mode === 'inline' ? undefined : handlePointerMove,\n onPointerup: props.mode === 'inline' ? undefined : handlePointerUp,\n onPointercancel: props.mode === 'inline' ? undefined : handlePointerUp,\n }, renderPanels()),\n ]),\n });\n\n return () => {\n if (!props.productionEnabled || !mounted.value || typeof window === 'undefined' || (panels.value.length === 0 && timelines.value.length === 0)) {\n return null;\n }\n\n if (props.mode === 'inline') {\n return renderContent();\n }\n\n return h(Teleport, { to: 'body' }, renderContent());\n };\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType, type VNodeChild } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_CHEVRON, ICON_PANEL } from '../../icons';\n\nexport const Folder = defineComponent({\n name: 'DialKitFolder',\n props: {\n title: { type: String, required: true },\n defaultOpen: { type: Boolean, default: true },\n isRoot: { type: Boolean, default: false },\n inline: { type: Boolean, default: false },\n toolbar: {\n type: null as unknown as PropType<(() => VNodeChild) | null>,\n required: false,\n default: null,\n },\n panelHeightOffset: {\n type: Number,\n default: 10,\n },\n },\n emits: ['openChange'],\n setup(props, { emit, slots }) {\n const isOpen = ref(props.defaultOpen);\n const isCollapsed = ref(!props.defaultOpen);\n const contentRef = ref<HTMLElement | null>(null);\n const contentHeight = ref<number | undefined>(undefined);\n const windowHeight = ref(typeof window !== 'undefined' ? window.innerHeight : 800);\n\n let resizeHandler: (() => void) | null = null;\n if (props.isRoot) {\n resizeHandler = () => { windowHeight.value = window.innerHeight; };\n window.addEventListener('resize', resizeHandler);\n }\n\n onUnmounted(() => {\n if (resizeHandler) window.removeEventListener('resize', resizeHandler);\n });\n\n const handleToggle = () => {\n if (props.inline && props.isRoot) return;\n const next = !isOpen.value;\n isOpen.value = next;\n isCollapsed.value = !next;\n emit('openChange', next);\n };\n\n let ro: ResizeObserver | null = null;\n\n onMounted(() => {\n if (!props.isRoot || typeof ResizeObserver === 'undefined') return;\n const el = contentRef.value;\n if (!el) return;\n\n ro = new ResizeObserver(() => {\n if (isOpen.value) {\n const next = el.offsetHeight;\n if (contentHeight.value !== next) {\n contentHeight.value = next;\n }\n }\n });\n\n ro.observe(el);\n\n if (isOpen.value) {\n contentHeight.value = el.offsetHeight;\n }\n });\n\n onUnmounted(() => {\n ro?.disconnect();\n });\n\n const renderHeader = () => h('div', {\n class: `dialkit-folder-header ${props.isRoot ? 'dialkit-panel-header' : ''}`,\n onClick: handleToggle,\n }, [\n h('div', { class: 'dialkit-folder-header-top' }, [\n props.isRoot\n ? (isOpen.value\n ? h('div', { class: 'dialkit-folder-title-row' }, [\n h('span', { class: 'dialkit-folder-title dialkit-folder-title-root' }, props.title),\n ])\n : null)\n : h('div', { class: 'dialkit-folder-title-row' }, [\n h('span', { class: 'dialkit-folder-title' }, props.title),\n ]),\n props.isRoot && !props.inline\n ? h('svg', { class: 'dialkit-panel-icon', viewBox: '0 0 16 16', fill: 'none' }, [\n h('path', {\n opacity: '0.5',\n d: ICON_PANEL.path,\n fill: 'currentColor',\n }),\n ...ICON_PANEL.circles.map((c) => h('circle', { cx: c.cx, cy: c.cy, r: c.r, fill: 'currentColor', stroke: 'currentColor', 'stroke-width': '1.25' })),\n ])\n : null,\n !props.isRoot\n ? h(motion.svg, {\n class: 'dialkit-folder-icon',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n initial: false,\n animate: { rotate: isOpen.value ? 0 : 180 },\n transition: { type: 'spring', visualDuration: 0.35, bounce: 0.15 },\n }, [h('path', { d: ICON_CHEVRON })])\n : null,\n ]),\n props.isRoot && props.toolbar && isOpen.value\n ? h('div', { class: 'dialkit-panel-toolbar', onClick: (event: Event) => event.stopPropagation() }, [props.toolbar()])\n : null,\n ]);\n\n const renderChildren = () => h('div', { class: 'dialkit-folder-inner' }, slots.default ? slots.default() : []);\n\n const renderContent = () => {\n if (props.isRoot) {\n return isOpen.value\n ? h('div', { class: 'dialkit-folder-content' }, [renderChildren()])\n : null;\n }\n\n return h(AnimatePresence, { initial: false }, {\n default: () => isOpen.value\n ? [h(motion.div, {\n key: 'dialkit-folder-content',\n class: 'dialkit-folder-content',\n initial: { height: 0, opacity: 0 },\n animate: { height: 'auto', opacity: 1 },\n exit: { height: 0, opacity: 0 },\n transition: { type: 'spring', visualDuration: 0.35, bounce: 0.1 },\n style: { clipPath: 'inset(0 -20px)' },\n }, [renderChildren()])]\n : [],\n });\n };\n\n const folderContent = () => h('div', {\n ref: props.isRoot ? contentRef : undefined,\n class: `dialkit-folder ${props.isRoot ? 'dialkit-folder-root' : ''}`,\n 'data-open': String(isOpen.value),\n }, [\n renderHeader(),\n renderContent(),\n ]);\n\n return () => {\n if (props.isRoot) {\n if (props.inline) {\n return h('div', { class: 'dialkit-panel-inner dialkit-panel-inline' }, [folderContent()]);\n }\n\n const panelStyle = isOpen.value\n ? {\n width: 280,\n height: contentHeight.value !== undefined ? Math.min(contentHeight.value + props.panelHeightOffset, windowHeight.value - 32) : 'auto',\n borderRadius: 14,\n boxShadow: 'var(--dial-shadow)',\n cursor: undefined as string | undefined,\n overflowY: 'auto' as const,\n }\n : {\n width: 42,\n height: 42,\n borderRadius: 21,\n boxShadow: 'var(--dial-shadow-collapsed)',\n overflow: 'hidden',\n cursor: 'pointer',\n };\n\n return h(motion.div, {\n class: 'dialkit-panel-inner',\n style: panelStyle,\n onClick: !isOpen.value ? handleToggle : undefined,\n 'data-collapsed': String(isCollapsed.value),\n whilePress: !isOpen.value ? { scale: 0.9 } : undefined,\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [folderContent()]);\n }\n\n return folderContent();\n };\n },\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 { Fragment, defineComponent, h, onMounted, onUnmounted, ref, type PropType, type VNodeChild } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_ADD_PRESET, ICON_CHECK, ICON_CLIPBOARD } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, DialValue, PanelConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\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';\nimport { PresetManager } from './PresetManager';\nimport { useShortcutContext } from './ShortcutListener';\nimport { ShortcutsMenu } from './ShortcutsMenu';\n\nexport const Panel = defineComponent({\n name: 'DialKitPanel',\n props: {\n panel: {\n type: Object as PropType<PanelConfig>,\n required: true,\n },\n defaultOpen: {\n type: Boolean,\n default: true,\n },\n inline: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<'root' | 'section'>,\n default: 'root',\n },\n toolbarExtra: Function as PropType<() => VNodeChild>,\n },\n emits: ['openChange'],\n setup(props, { emit }) {\n const shortcutCtx = useShortcutContext();\n const values = ref<Record<string, DialValue>>(DialStore.getValues(props.panel.id));\n const presets = ref(DialStore.getPresets(props.panel.id));\n const activePresetId = ref<string | null>(DialStore.getActivePresetId(props.panel.id));\n const copied = ref(false);\n const hasShortcuts = () => Object.keys(DialStore.getPanel(props.panel.id)?.shortcuts ?? {}).length > 0;\n\n let unsubscribe: (() => void) | undefined;\n let copiedTimeout: ReturnType<typeof window.setTimeout> | null = null;\n\n onMounted(() => {\n unsubscribe = DialStore.subscribe(props.panel.id, () => {\n values.value = DialStore.getValues(props.panel.id);\n presets.value = DialStore.getPresets(props.panel.id);\n activePresetId.value = DialStore.getActivePresetId(props.panel.id);\n });\n });\n\n onUnmounted(() => {\n unsubscribe?.();\n if (copiedTimeout) {\n window.clearTimeout(copiedTimeout);\n }\n });\n\n const handleAddPreset = () => {\n const nextNum = presets.value.length + 2;\n DialStore.savePreset(props.panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const json = JSON.stringify(values.value, null, 2);\n const instruction = `Update the useDialKit configuration for \"${props.panel.name}\" with these values:\\n\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\`\\n\\nApply these values as the new defaults in the useDialKit call.`;\n\n try {\n if (navigator.clipboard?.writeText) {\n void navigator.clipboard.writeText(instruction).catch(() => undefined);\n }\n } catch {\n // Ignore clipboard errors; the UI confirmation should still run.\n }\n\n copied.value = true;\n if (copiedTimeout) {\n window.clearTimeout(copiedTimeout);\n }\n copiedTimeout = window.setTimeout(() => {\n copied.value = false;\n }, 1500);\n };\n\n const handleOpenChange = (open: boolean) => {\n emit('openChange', open);\n };\n\n const renderControl = (control: ControlMeta) => {\n const value = values.value[control.path];\n\n switch (control.type) {\n case 'slider':\n return h(Slider, {\n key: control.path,\n label: control.label,\n value: value as number,\n min: control.min,\n max: control.max,\n step: control.step,\n shortcut: control.shortcut,\n shortcutActive: shortcutCtx.activePanelId.value === props.panel.id && shortcutCtx.activePath.value === control.path,\n onChange: (next: number) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'toggle':\n return h(Toggle, {\n key: control.path,\n label: control.label,\n checked: value as boolean,\n shortcut: control.shortcut,\n shortcutActive: shortcutCtx.activePanelId.value === props.panel.id && shortcutCtx.activePath.value === control.path,\n onChange: (next: boolean) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'spring':\n return h(SpringControl, {\n key: control.path,\n panelId: props.panel.id,\n path: control.path,\n label: control.label,\n spring: value as SpringConfig,\n onChange: (next: SpringConfig) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'transition':\n return h(TransitionControl, {\n key: control.path,\n panelId: props.panel.id,\n path: control.path,\n label: control.label,\n value: value as TransitionConfig,\n onChange: (next: TransitionConfig) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'folder':\n return h(Folder, {\n key: control.path,\n title: control.label,\n defaultOpen: control.defaultOpen ?? true,\n }, {\n default: () => (control.children ?? []).map(renderControl),\n });\n case 'text':\n return h(TextControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n placeholder: control.placeholder,\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'select':\n return h(SelectControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n options: control.options ?? [],\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'color':\n return h(ColorControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n onChange: (next: string) => DialStore.updateValue(props.panel.id, control.path, next),\n });\n case 'action':\n return h('button', {\n key: control.path,\n class: 'dialkit-button',\n onClick: () => DialStore.triggerAction(props.panel.id, control.path),\n }, control.label);\n default:\n return null;\n }\n };\n\n return () => {\n const toolbarNode = h(Fragment, null, [\n h(motion.button, {\n class: 'dialkit-toolbar-add',\n onClick: handleAddPreset,\n title: 'Add preset',\n whilePress: { scale: 0.9 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, ICON_ADD_PRESET.map((d) => h('path', { d }))),\n ]),\n h(PresetManager, {\n panelId: props.panel.id,\n presets: presets.value,\n activePresetId: activePresetId.value,\n }),\n h(motion.button, {\n class: 'dialkit-toolbar-copy',\n onClick: handleCopy,\n title: 'Copy parameters',\n whilePress: { scale: 0.95 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0.3 },\n }, [\n h('span', { class: 'dialkit-toolbar-copy-icon-wrap' }, [\n h('span', {\n class: 'dialkit-toolbar-copy-icon',\n style: { opacity: copied.value ? 0 : 1, transition: 'opacity 120ms ease' },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n width: 16,\n height: 16,\n }, [\n h('path', {\n d: ICON_CLIPBOARD.board,\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linejoin': 'round',\n }),\n h('path', {\n d: ICON_CLIPBOARD.sparkle,\n fill: 'currentColor',\n }),\n h('path', {\n d: ICON_CLIPBOARD.body,\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]),\n ]),\n h(AnimatePresence, { initial: false, mode: 'popLayout' }, {\n default: () => copied.value\n ? [h(motion.span, {\n key: 'check',\n class: 'dialkit-toolbar-copy-icon',\n initial: { scale: 0.5, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.5, opacity: 0 },\n transition: { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n width: 16,\n height: 16,\n }, [h('path', { d: ICON_CHECK })]),\n ])]\n : [],\n }),\n ]),\n 'Copy',\n ]),\n props.toolbarExtra?.(),\n ]);\n\n if (props.variant === 'section') {\n return h(Folder, {\n title: props.panel.name,\n defaultOpen: props.defaultOpen,\n onOpenChange: handleOpenChange,\n }, {\n default: () => [\n h('div', {\n class: 'dialkit-panel-section-toolbar',\n onClick: (event: Event) => event.stopPropagation(),\n }, [toolbarNode]),\n ...props.panel.controls.map(renderControl),\n ],\n });\n }\n\n return h('div', { class: 'dialkit-panel-wrapper' }, [\n h(Folder, {\n title: props.panel.name,\n defaultOpen: props.defaultOpen,\n isRoot: true,\n inline: props.inline,\n toolbar: () => toolbarNode,\n onOpenChange: handleOpenChange,\n }, {\n default: () => props.panel.controls.map(renderControl),\n }),\n ]);\n };\n },\n});\n","import { defineComponent, h, computed, nextTick, onMounted, onUnmounted, ref, watch, type PropType } from 'vue';\nimport { animate, motionValue } from 'motion-v';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { decimalsForStep, roundValue, snapToDecile, formatSliderShortcut } from '../../shortcut-utils';\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport const Slider = defineComponent({\n name: 'DialKitSlider',\n props: {\n label: { type: String, required: true },\n value: { type: Number, required: true },\n min: { type: Number, required: false },\n max: { type: Number, required: false },\n step: { type: Number, required: false },\n unit: { type: String, required: false },\n shortcut: { type: Object as PropType<ShortcutConfig>, default: undefined },\n shortcutActive: { type: Boolean, default: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const min = computed(() => props.min ?? 0);\n const max = computed(() => props.max ?? 1);\n const step = computed(() => props.step ?? 0.01);\n\n const wrapperRef = ref<HTMLElement | null>(null);\n const trackRef = ref<HTMLElement | null>(null);\n const fillRef = ref<HTMLElement | null>(null);\n const handleRef = ref<HTMLElement | null>(null);\n const labelRef = ref<HTMLElement | null>(null);\n const valueSpanRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n\n const isInteracting = ref(false);\n const isDragging = ref(false);\n const isHovered = ref(false);\n const isValueHovered = ref(false);\n const isValueEditable = ref(false);\n const showInput = ref(false);\n const inputValue = ref('');\n\n const fillPercent = motionValue(((props.value - min.value) / (max.value - min.value)) * 100);\n const rubberStretchPx = motionValue(0);\n const handleOpacityMv = motionValue(0);\n const handleScaleXMv = motionValue(0.25);\n const handleScaleYMv = motionValue(1);\n\n const percentage = computed(() => ((props.value - min.value) / (max.value - min.value)) * 100);\n const isActive = computed(() => isInteracting.value || isHovered.value);\n const displayValue = computed(() => props.value.toFixed(decimalsForStep(step.value)));\n let pointerDownPos: { x: number; y: number } | null = null;\n let isClickFlag = true;\n let wrapperRect: DOMRect | null = null;\n let scaleVal = 1;\n let hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n\n let snapAnim: ReturnType<typeof animate> | null = null;\n let rubberAnim: ReturnType<typeof animate> | null = null;\n let handleOpacityAnim: ReturnType<typeof animate> | null = null;\n let handleScaleXAnim: ReturnType<typeof animate> | null = null;\n let handleScaleYAnim: ReturnType<typeof animate> | null = null;\n\n const applyFillStyles = (pct: number) => {\n if (fillRef.value) fillRef.value.style.width = `${pct}%`;\n if (handleRef.value) handleRef.value.style.left = `max(5px, calc(${pct}% - 9px))`;\n };\n\n const applyRubberStyles = (stretch: number) => {\n if (!trackRef.value) return;\n trackRef.value.style.width = `calc(100% + ${Math.abs(stretch)}px)`;\n trackRef.value.style.transform = `translateX(${stretch < 0 ? stretch : 0}px)`;\n };\n\n const applyHandleVisualStyles = () => {\n if (!handleRef.value) return;\n handleRef.value.style.opacity = String(handleOpacityMv.get());\n handleRef.value.style.transform = `translateY(-50%) scaleX(${handleScaleXMv.get()}) scaleY(${handleScaleYMv.get()})`;\n };\n\n const positionToValue = (clientX: number) => {\n if (!wrapperRect) return props.value;\n const screenX = clientX - wrapperRect.left;\n const sceneX = screenX / scaleVal;\n const nativeWidth = wrapperRef.value ? wrapperRef.value.offsetWidth : wrapperRect.width;\n const pct = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min.value + pct * (max.value - min.value);\n return Math.max(min.value, Math.min(max.value, rawValue));\n };\n\n const percentFromValue = (value: number) => ((value - min.value) / (max.value - min.value)) * 100;\n\n const computeRubberStretch = (clientX: number, sign: number) => {\n if (!wrapperRect) return 0;\n const distancePast = sign < 0 ? wrapperRect.left - clientX : clientX - wrapperRect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return sign * MAX_STRETCH * Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1));\n };\n\n const leftThreshold = () => {\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const trackWidth = wrapperRef.value?.offsetWidth;\n if (trackWidth && labelRef.value) {\n return ((LABEL_CSS_LEFT + labelRef.value.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 30;\n };\n\n const rightThreshold = () => {\n const HANDLE_BUFFER = 8;\n const VALUE_CSS_RIGHT = 10;\n const trackWidth = wrapperRef.value?.offsetWidth;\n if (trackWidth && valueSpanRef.value) {\n return ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.value.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 78;\n };\n\n const valueDodge = () => percentage.value < leftThreshold() || percentage.value > rightThreshold();\n\n const handleOpacity = () => {\n if (!isActive.value) return 0;\n if (valueDodge()) return 0.1;\n if (isDragging.value) return 0.9;\n return 0.5;\n };\n\n const animateHandleState = () => {\n const targetOpacity = handleOpacity();\n const targetScaleX = isActive.value ? 1 : 0.25;\n const targetScaleY = isActive.value && valueDodge() ? 0.75 : 1;\n\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n handleOpacityAnim = animate(handleOpacityMv, targetOpacity, { duration: 0.15 });\n handleScaleXAnim = animate(handleScaleXMv, targetScaleX, {\n type: 'spring',\n visualDuration: 0.25,\n bounce: 0.15,\n });\n handleScaleYAnim = animate(handleScaleYMv, targetScaleY, {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.1,\n });\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (showInput.value) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n pointerDownPos = { x: event.clientX, y: event.clientY };\n isClickFlag = true;\n isInteracting.value = true;\n\n if (wrapperRef.value) {\n wrapperRect = wrapperRef.value.getBoundingClientRect();\n scaleVal = wrapperRect.width / wrapperRef.value.offsetWidth;\n }\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isInteracting.value || !pointerDownPos) return;\n\n const dx = event.clientX - pointerDownPos.x;\n const dy = event.clientY - pointerDownPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickFlag && distance > CLICK_THRESHOLD) {\n isClickFlag = false;\n isDragging.value = true;\n }\n\n if (!isClickFlag) {\n if (wrapperRect) {\n if (event.clientX < wrapperRect.left) {\n rubberStretchPx.jump(computeRubberStretch(event.clientX, -1));\n } else if (event.clientX > wrapperRect.right) {\n rubberStretchPx.jump(computeRubberStretch(event.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const nextValue = positionToValue(event.clientX);\n const nextPct = percentFromValue(nextValue);\n if (snapAnim) {\n snapAnim.stop();\n snapAnim = null;\n }\n fillPercent.jump(nextPct);\n emit('change', roundValue(nextValue, step.value));\n }\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!isInteracting.value) return;\n\n if (isClickFlag) {\n const rawValue = positionToValue(event.clientX);\n const discreteSteps = (max.value - min.value) / step.value;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min.value, Math.min(max.value, min.value + Math.round((rawValue - min.value) / step.value) * step.value))\n : snapToDecile(rawValue, min.value, max.value);\n\n const nextPct = percentFromValue(snappedValue);\n\n snapAnim?.stop();\n snapAnim = animate(fillPercent, nextPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => {\n snapAnim = null;\n },\n });\n\n emit('change', roundValue(snappedValue, step.value));\n }\n\n if (rubberStretchPx.get() !== 0) {\n rubberAnim?.stop();\n rubberAnim = animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n isInteracting.value = false;\n isDragging.value = false;\n pointerDownPos = null;\n };\n\n const handlePointerCancel = () => {\n if (!isInteracting.value) return;\n isInteracting.value = false;\n isDragging.value = false;\n rubberStretchPx.jump(0);\n pointerDownPos = null;\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue.value);\n if (!Number.isNaN(parsed)) {\n const clamped = Math.max(min.value, Math.min(max.value, parsed));\n emit('change', roundValue(clamped, step.value));\n }\n showInput.value = false;\n isValueHovered.value = false;\n isValueEditable.value = false;\n };\n\n const handleValueClick = (event: MouseEvent) => {\n if (!isValueEditable.value) return;\n event.stopPropagation();\n event.preventDefault();\n showInput.value = true;\n inputValue.value = props.value.toFixed(decimalsForStep(step.value));\n };\n\n const handleInputKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleInputSubmit();\n } else if (event.key === 'Escape') {\n showInput.value = false;\n isValueHovered.value = false;\n }\n };\n\n watch(() => props.value, () => {\n if (!isInteracting.value && !snapAnim) {\n fillPercent.jump(percentage.value);\n }\n });\n\n watch([isInteracting, isHovered, isDragging, () => props.value], () => {\n animateHandleState();\n });\n\n watch([isValueHovered, showInput, isValueEditable], () => {\n if (hoverTimeout) {\n clearTimeout(hoverTimeout);\n hoverTimeout = null;\n }\n\n if (isValueHovered.value && !showInput.value && !isValueEditable.value) {\n hoverTimeout = setTimeout(() => {\n isValueEditable.value = true;\n animateHandleState();\n }, 800);\n } else if (!isValueHovered.value && !showInput.value) {\n isValueEditable.value = false;\n }\n });\n\n watch(showInput, async (visible) => {\n if (!visible) return;\n await nextTick();\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n\n const discreteSteps = computed(() => (max.value - min.value) / step.value);\n const hashMarks = computed(() => {\n const marks: ReturnType<typeof h>[] = [];\n if (discreteSteps.value <= 10) {\n const count = Math.max(0, Math.floor(discreteSteps.value) - 1);\n for (let i = 0; i < count; i += 1) {\n const pct = ((i + 1) * step.value) / (max.value - min.value) * 100;\n marks.push(h('div', { class: 'dialkit-slider-hashmark', style: { left: `${pct}%` } }));\n }\n return marks;\n }\n\n for (let i = 0; i < 9; i += 1) {\n const pct = (i + 1) * 10;\n marks.push(h('div', { class: 'dialkit-slider-hashmark', style: { left: `${pct}%` } }));\n }\n return marks;\n });\n\n let unsubFill: (() => void) | null = null;\n let unsubRubber: (() => void) | null = null;\n let unsubHandleOpacity: (() => void) | null = null;\n let unsubHandleScaleX: (() => void) | null = null;\n let unsubHandleScaleY: (() => void) | null = null;\n\n onMounted(() => {\n unsubFill = fillPercent.on('change', applyFillStyles);\n unsubRubber = rubberStretchPx.on('change', applyRubberStyles);\n unsubHandleOpacity = handleOpacityMv.on('change', applyHandleVisualStyles);\n unsubHandleScaleX = handleScaleXMv.on('change', applyHandleVisualStyles);\n unsubHandleScaleY = handleScaleYMv.on('change', applyHandleVisualStyles);\n\n applyFillStyles(fillPercent.get());\n applyRubberStyles(rubberStretchPx.get());\n applyHandleVisualStyles();\n animateHandleState();\n });\n\n onUnmounted(() => {\n if (hoverTimeout) clearTimeout(hoverTimeout);\n snapAnim?.stop();\n rubberAnim?.stop();\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n unsubFill?.();\n unsubRubber?.();\n unsubHandleOpacity?.();\n unsubHandleScaleX?.();\n unsubHandleScaleY?.();\n });\n\n return () => h('div', { ref: wrapperRef, class: 'dialkit-slider-wrapper' }, [\n h('div', {\n ref: trackRef,\n class: `dialkit-slider ${isActive.value ? 'dialkit-slider-active' : ''}`,\n onPointerdown: handlePointerDown,\n onPointermove: handlePointerMove,\n onPointerup: handlePointerUp,\n onPointercancel: handlePointerCancel,\n onMouseenter: () => {\n isHovered.value = true;\n animateHandleState();\n },\n onMouseleave: () => {\n isHovered.value = false;\n animateHandleState();\n },\n }, [\n h('div', { class: 'dialkit-slider-hashmarks' }, hashMarks.value),\n h('div', {\n ref: fillRef,\n class: 'dialkit-slider-fill',\n style: {\n width: `${fillPercent.get()}%`,\n },\n }),\n h('div', {\n ref: handleRef,\n class: 'dialkit-slider-handle',\n style: {\n left: `max(5px, calc(${fillPercent.get()}% - 9px))`,\n transform: 'translateY(-50%) scaleX(0.25) scaleY(1)',\n opacity: 0,\n },\n }),\n h('span', { ref: labelRef, class: 'dialkit-slider-label' }, [\n props.label,\n props.shortcut\n ? h('span', {\n class: `dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`,\n }, formatSliderShortcut(props.shortcut))\n : null,\n ]),\n showInput.value\n ? h('input', {\n ref: inputRef,\n type: 'text',\n class: 'dialkit-slider-input',\n value: inputValue.value,\n onInput: (event: Event) => {\n inputValue.value = (event.target as HTMLInputElement).value;\n },\n onKeydown: handleInputKeydown,\n onBlur: handleInputSubmit,\n onPointerdown: (event: PointerEvent) => event.stopPropagation(),\n onClick: (event: MouseEvent) => event.stopPropagation(),\n onMousedown: (event: MouseEvent) => event.stopPropagation(),\n })\n : h('span', {\n ref: valueSpanRef,\n class: `dialkit-slider-value ${isValueEditable.value ? 'dialkit-slider-value-editable' : ''}`,\n onMouseenter: () => {\n isValueHovered.value = true;\n },\n onMouseleave: () => {\n isValueHovered.value = false;\n },\n onClick: handleValueClick,\n onPointerdown: (event: PointerEvent) => {\n if (isValueEditable.value) event.stopPropagation();\n },\n onMousedown: (event: MouseEvent) => {\n if (isValueEditable.value) event.stopPropagation();\n },\n style: { cursor: isValueEditable.value ? 'text' : 'default' },\n }, displayValue.value),\n ]),\n ]);\n },\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 { defineComponent, h, type PropType } from 'vue';\nimport { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { formatToggleShortcut } from '../../shortcut-utils';\n\nexport const Toggle = defineComponent({\n name: 'DialKitToggle',\n props: {\n label: { type: String, required: true },\n checked: { type: Boolean, required: true },\n shortcut: { type: Object as PropType<ShortcutConfig>, default: undefined },\n shortcutActive: { type: Boolean, default: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n return () => h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, [\n props.label,\n props.shortcut\n ? h('span', {\n class: `dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`,\n }, formatToggleShortcut(props.shortcut))\n : null,\n ]),\n h(SegmentedControl, {\n options: [\n { value: 'off', label: 'Off' },\n { value: 'on', label: 'On' },\n ],\n value: props.checked ? 'on' : 'off',\n onChange: (value: string) => emit('change', value === 'on'),\n }),\n ]);\n },\n});\n","import { defineComponent, h, nextTick, onMounted, onUnmounted, ref, watch, type PropType } from 'vue';\nimport { animate } from 'motion';\n\ntype SegmentedControlOption<T extends string> = {\n value: T;\n label: string;\n};\n\nexport const SegmentedControl = defineComponent({\n name: 'DialKitSegmentedControl',\n props: {\n options: {\n type: Array as PropType<SegmentedControlOption<string>[]>,\n required: true,\n },\n value: {\n type: String,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const containerRef = ref<HTMLElement | null>(null);\n const pillRef = ref<HTMLElement | null>(null);\n const buttonRefs = new Map<string, HTMLElement>();\n\n const pillReady = ref(false);\n let hasAnimated = false;\n let pillAnim: ReturnType<typeof animate> | null = null;\n\n const measurePill = () => {\n const button = buttonRefs.get(props.value);\n const container = containerRef.value;\n if (!button || !container) return null;\n\n const containerRect = container.getBoundingClientRect();\n const buttonRect = button.getBoundingClientRect();\n return {\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n };\n };\n\n const setPillImmediate = (left: number, width: number) => {\n if (!pillRef.value) return;\n pillRef.value.style.left = `${left}px`;\n pillRef.value.style.width = `${width}px`;\n pillRef.value.style.visibility = 'visible';\n };\n\n const updatePill = (shouldAnimate: boolean) => {\n const next = measurePill();\n if (!next) return;\n\n if (!pillReady.value) {\n setPillImmediate(next.left, next.width);\n pillReady.value = true;\n return;\n }\n\n if (!shouldAnimate || !hasAnimated || !pillRef.value) {\n pillAnim?.stop();\n pillAnim = null;\n setPillImmediate(next.left, next.width);\n return;\n }\n\n pillAnim?.stop();\n pillAnim = animate(\n pillRef.value,\n {\n left: next.left,\n width: next.width,\n },\n {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.15,\n onComplete: () => {\n pillAnim = null;\n },\n }\n );\n };\n\n let ro: ResizeObserver | undefined;\n\n onMounted(() => {\n nextTick(() => {\n updatePill(false);\n hasAnimated = true;\n });\n\n if (typeof ResizeObserver !== 'undefined' && containerRef.value) {\n ro = new ResizeObserver(() => updatePill(false));\n ro.observe(containerRef.value);\n }\n });\n\n onUnmounted(() => {\n pillAnim?.stop();\n ro?.disconnect();\n });\n\n watch(\n () => props.value,\n () => {\n updatePill(true);\n },\n { flush: 'post' }\n );\n\n return () => h('div', { ref: containerRef, class: 'dialkit-segmented' }, [\n h('div', {\n ref: pillRef,\n class: 'dialkit-segmented-pill',\n style: {\n left: '0px',\n width: '0px',\n visibility: pillReady.value ? 'visible' : 'hidden',\n },\n }),\n ...props.options.map((option) => h('button', {\n ref: ((el: Element | null) => {\n if (el instanceof HTMLElement) {\n buttonRefs.set(option.value, el);\n return;\n }\n\n buttonRefs.delete(option.value);\n }) as any,\n class: 'dialkit-segmented-button',\n 'data-active': String(props.value === option.value),\n onClick: () => emit('change', option.value),\n }, option.label)),\n ]);\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { SpringConfig } from '../../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\n\nexport const SpringControl = defineComponent({\n name: 'DialKitSpringControl',\n props: {\n panelId: { type: String, required: true },\n path: { type: String, required: true },\n label: { type: String, required: true },\n spring: {\n type: Object as PropType<SpringConfig>,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const mode = ref<'simple' | 'advanced'>(DialStore.getSpringMode(props.panelId, props.path));\n let unsub: (() => void) | undefined;\n\n onMounted(() => {\n unsub = DialStore.subscribe(props.panelId, () => {\n mode.value = DialStore.getSpringMode(props.panelId, props.path);\n });\n });\n\n onUnmounted(() => {\n unsub?.();\n });\n\n const isSimpleMode = () => mode.value === 'simple';\n\n const cache = {\n simple: props.spring.visualDuration !== undefined ? { ...props.spring } : { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 },\n advanced: props.spring.stiffness !== undefined ? { ...props.spring } : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 },\n };\n\n const handleModeChange = (nextMode: 'simple' | 'advanced') => {\n if (isSimpleMode()) {\n cache.simple = { ...props.spring };\n } else {\n cache.advanced = { ...props.spring };\n }\n\n DialStore.updateSpringMode(props.panelId, props.path, nextMode);\n\n if (nextMode === 'simple') {\n emit('change', cache.simple);\n } else {\n emit('change', cache.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n if (isSimpleMode()) {\n const { stiffness, damping, mass, ...rest } = props.spring;\n emit('change', { ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = props.spring;\n emit('change', { ...rest, [key]: value });\n }\n };\n\n return () => h(Folder, { title: props.label, defaultOpen: true }, {\n default: () => [\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } }, [\n h(SpringVisualization, { spring: props.spring, isSimpleMode: isSimpleMode() }),\n h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Type'),\n h(SegmentedControl, {\n options: [\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ],\n value: mode.value,\n onChange: handleModeChange,\n }),\n ]),\n ...(isSimpleMode()\n ? [\n h(Slider, {\n label: 'Duration',\n value: props.spring.visualDuration ?? 0.3,\n min: 0.1,\n max: 1,\n step: 0.05,\n unit: 's',\n onChange: (next: number) => handleUpdate('visualDuration', next),\n }),\n h(Slider, {\n label: 'Bounce',\n value: props.spring.bounce ?? 0.2,\n min: 0,\n max: 1,\n step: 0.05,\n onChange: (next: number) => handleUpdate('bounce', next),\n }),\n ]\n : [\n h(Slider, {\n label: 'Stiffness',\n value: props.spring.stiffness ?? 400,\n min: 1,\n max: 1000,\n step: 10,\n onChange: (next: number) => handleUpdate('stiffness', next),\n }),\n h(Slider, {\n label: 'Damping',\n value: props.spring.damping ?? 17,\n min: 1,\n max: 100,\n step: 1,\n onChange: (next: number) => handleUpdate('damping', next),\n }),\n h(Slider, {\n label: 'Mass',\n value: props.spring.mass ?? 1,\n min: 0.1,\n max: 10,\n step: 0.1,\n onChange: (next: number) => handleUpdate('mass', next),\n }),\n ]),\n ]),\n ],\n });\n },\n});\n","import { defineComponent, h, computed, type PropType } from 'vue';\nimport type { SpringConfig } from '../../store/DialStore';\n\nfunction generateSpringCurve(\n stiffness: number,\n damping: number,\n mass: number,\n duration: number\n): [number, number][] {\n const points: [number, number][] = [];\n const steps = 100;\n const dt = duration / steps;\n\n let position = 0;\n let velocity = 0;\n const target = 1;\n\n for (let i = 0; i <= steps; i += 1) {\n const time = i * dt;\n points.push([time, position]);\n\n const springForce = -stiffness * (position - target);\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * dt;\n position += velocity * dt;\n }\n\n return points;\n}\n\nexport const SpringVisualization = defineComponent({\n name: 'DialKitSpringVisualization',\n props: {\n spring: {\n type: Object as PropType<SpringConfig>,\n required: true,\n },\n isSimpleMode: {\n type: Boolean,\n required: true,\n },\n },\n setup(props) {\n const width = 256;\n const height = 140;\n\n const pathData = computed(() => {\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (props.isSimpleMode) {\n const visualDuration = props.spring.visualDuration ?? 0.3;\n const bounce = props.spring.bounce ?? 0.2;\n mass = 1;\n stiffness = ((2 * Math.PI) / visualDuration) ** 2;\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = props.spring.stiffness ?? 400;\n damping = props.spring.damping ?? 17;\n mass = props.spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\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 return points\n .map(([time, value], index) => {\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 `${index === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n });\n\n return () => h('svg', { viewBox: `0 0 ${width} ${height}`, class: 'dialkit-spring-viz' }, [\n ...Array.from({ length: 3 }).flatMap((_, index) => {\n const lineIndex = index + 1;\n const x = (width / 4) * lineIndex;\n const y = (height / 4) * lineIndex;\n return [\n h('line', { x1: x, y1: 0, x2: x, y2: height, stroke: 'rgba(255, 255, 255, 0.08)', 'stroke-width': 1 }),\n h('line', { x1: 0, y1: y, x2: width, y2: y, stroke: 'rgba(255, 255, 255, 0.08)', 'stroke-width': 1 }),\n ];\n }),\n h('line', {\n x1: 0,\n y1: height / 2,\n x2: width,\n y2: height / 2,\n stroke: 'rgba(255, 255, 255, 0.15)',\n 'stroke-width': 1,\n 'stroke-dasharray': '4,4',\n }),\n h('path', {\n d: pathData.value,\n fill: 'none',\n stroke: 'rgba(255, 255, 255, 0.6)',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]);\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport interface TransitionDurationControl {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map((value) => Number(value.toFixed(2))).join(', ');\n}\n\nfunction parseEase(value: string): [number, number, number, number] | null {\n const parts = value.split(',').map((part) => Number.parseFloat(part.trim()));\n if (parts.length === 4 && parts.every((part) => Number.isFinite(part))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nconst EaseTextInput = defineComponent({\n name: 'DialKitEaseTextInput',\n props: {\n ease: {\n type: Array as unknown as PropType<[number, number, number, number]>,\n required: true,\n },\n onChange: {\n type: Function as PropType<(ease: [number, number, number, number]) => void>,\n required: true,\n },\n },\n setup(props) {\n const editing = ref(false);\n const draft = ref('');\n\n const handleFocus = () => {\n draft.value = formatEase(props.ease);\n editing.value = true;\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft.value);\n if (parsed) props.onChange(parsed);\n editing.value = false;\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n (event.target as HTMLInputElement).blur();\n }\n };\n\n return () => h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Ease'),\n h('input', {\n type: 'text',\n class: 'dialkit-text-input',\n value: editing.value ? draft.value : formatEase(props.ease),\n spellcheck: false,\n onInput: (event: Event) => {\n draft.value = (event.target as HTMLInputElement).value;\n },\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n }),\n ]);\n },\n});\n\nexport const TransitionControl = defineComponent({\n name: 'DialKitTransitionControl',\n props: {\n panelId: { type: String, required: true },\n path: { type: String, required: true },\n label: { type: String, required: true },\n value: {\n type: Object as PropType<TransitionConfig>,\n required: true,\n },\n hideDuration: { type: Boolean, default: false },\n durationControl: Object as PropType<TransitionDurationControl>,\n },\n emits: ['change'],\n setup(props, { emit }) {\n const mode = ref<CurveMode>(DialStore.getTransitionMode(props.panelId, props.path));\n let unsub: (() => void) | undefined;\n\n onMounted(() => {\n unsub = DialStore.subscribe(props.panelId, () => {\n mode.value = DialStore.getTransitionMode(props.panelId, props.path);\n });\n });\n\n onUnmounted(() => unsub?.());\n\n const cache = {\n easing: (props.value.type === 'easing' ? { ...props.value } : { type: 'easing' as const, duration: 0.3, ease: [1, -0.4, 0.5, 1] as [number, number, number, number] }) as EasingConfig,\n simple: (props.value.type === 'spring' && props.value.visualDuration !== undefined ? { ...props.value } : { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 }) as SpringConfig,\n advanced: (props.value.type === 'spring' && props.value.stiffness !== undefined ? { ...props.value } : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 }) as SpringConfig,\n };\n\n const spring = (): SpringConfig => {\n if (props.value.type === 'spring') {\n // Keep cache updated\n if (mode.value === 'simple') cache.simple = props.value;\n else if (mode.value === 'advanced') cache.advanced = props.value;\n return props.value;\n }\n return cache.simple;\n };\n\n const easing = (): EasingConfig => {\n if (props.value.type === 'easing') {\n cache.easing = props.value;\n return props.value;\n }\n return cache.easing;\n };\n\n const handleModeChange = (nextMode: CurveMode) => {\n DialStore.updateTransitionMode(props.panelId, props.path, nextMode);\n\n if (nextMode === 'easing') {\n emit('change', cache.easing);\n } else if (nextMode === 'simple') {\n emit('change', cache.simple);\n } else {\n emit('change', cache.advanced);\n }\n };\n\n const updateEase = (index: number, value: number) => {\n const current = easing();\n const next = [...current.ease] as [number, number, number, number];\n next[index] = value;\n emit('change', { ...current, ease: next });\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, value: number) => {\n const current = spring();\n if (mode.value === 'simple') {\n const { stiffness, damping, mass, ...rest } = current;\n emit('change', { ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = current;\n emit('change', { ...rest, [key]: value });\n }\n };\n\n return () => {\n const isEasing = mode.value === 'easing';\n const isSimpleSpring = mode.value === 'simple';\n const currentSpring = spring();\n const currentEasing = easing();\n const durationSlider = !props.hideDuration && (isEasing || isSimpleSpring)\n ? h(Slider, {\n label: 'Duration',\n value: props.durationControl?.value ?? (isEasing ? currentEasing.duration : currentSpring.visualDuration ?? 0.3),\n min: props.durationControl?.min ?? 0.1,\n max: props.durationControl?.max ?? (isEasing ? 2 : 1),\n step: props.durationControl?.step ?? 0.05,\n unit: 's',\n onChange: props.durationControl?.onChange ?? ((next: number) => {\n if (isEasing) emit('change', { ...currentEasing, duration: next });\n else handleSpringUpdate('visualDuration', next);\n }),\n })\n : null;\n\n return h(Folder, { title: props.label, defaultOpen: true }, {\n default: () => [\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } }, [\n isEasing\n ? h(EasingVisualization, { easing: currentEasing })\n : h(SpringVisualization, { spring: currentSpring, isSimpleMode: isSimpleSpring }),\n h('div', { class: 'dialkit-labeled-control' }, [\n h('span', { class: 'dialkit-labeled-control-label' }, 'Type'),\n h(SegmentedControl, {\n options: [\n { value: 'easing', label: 'Easing' },\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ],\n value: mode.value,\n onChange: handleModeChange,\n }),\n ]),\n ...(isEasing\n ? [\n h(Slider, { label: 'x1', value: currentEasing.ease[0], min: 0, max: 1, step: 0.01, onChange: (next: number) => updateEase(0, next) }),\n h(Slider, { label: 'y1', value: currentEasing.ease[1], min: -1, max: 2, step: 0.01, onChange: (next: number) => updateEase(1, next) }),\n h(Slider, { label: 'x2', value: currentEasing.ease[2], min: 0, max: 1, step: 0.01, onChange: (next: number) => updateEase(2, next) }),\n h(Slider, { label: 'y2', value: currentEasing.ease[3], min: -1, max: 2, step: 0.01, onChange: (next: number) => updateEase(3, next) }),\n h(EaseTextInput, {\n ease: currentEasing.ease,\n onChange: (next: [number, number, number, number]) => emit('change', { ...currentEasing, ease: next }),\n }),\n ]\n : isSimpleSpring\n ? [\n h(Slider, {\n label: 'Bounce',\n value: currentSpring.bounce ?? 0.2,\n min: 0,\n max: 1,\n step: 0.05,\n onChange: (next: number) => handleSpringUpdate('bounce', next),\n }),\n ]\n : [\n h(Slider, {\n label: 'Stiffness',\n value: currentSpring.stiffness ?? 400,\n min: 1,\n max: 1000,\n step: 10,\n onChange: (next: number) => handleSpringUpdate('stiffness', next),\n }),\n h(Slider, {\n label: 'Damping',\n value: currentSpring.damping ?? 17,\n min: 1,\n max: 100,\n step: 1,\n onChange: (next: number) => handleSpringUpdate('damping', next),\n }),\n h(Slider, {\n label: 'Mass',\n value: currentSpring.mass ?? 1,\n min: 0.1,\n max: 10,\n step: 0.1,\n onChange: (next: number) => handleSpringUpdate('mass', next),\n }),\n ]),\n durationSlider,\n ]),\n ],\n });\n };\n },\n});\n","import { defineComponent, h, computed, type PropType } from 'vue';\nimport type { EasingConfig } from '../../store/DialStore';\n\nexport const 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 const EasingVisualization = defineComponent({\n name: 'DialKitEasingVisualization',\n props: {\n easing: {\n type: Object as PropType<EasingConfig>,\n required: true,\n },\n },\n setup(props) {\n const size = 200;\n const pad = 10;\n const inner = size - pad * 2;\n const unit = inner / 2;\n\n const curve = computed(() => {\n const [x1, y1, x2, y2] = props.easing.ease;\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(x1, y1);\n const p2 = toSvg(x2, y2);\n return `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n });\n\n return () => h('svg', {\n viewBox: `0 0 ${size} ${size}`,\n preserveAspectRatio: 'xMidYMid slice',\n class: 'dialkit-spring-viz dialkit-easing-viz',\n }, [\n h('line', {\n x1: pad + (0 + 0.5) * unit,\n y1: pad + (1.5 - 0) * unit,\n x2: pad + (1 + 0.5) * unit,\n y2: pad + (1.5 - 1) * unit,\n stroke: 'rgba(255, 255, 255, 0.15)',\n 'stroke-width': 1,\n 'stroke-dasharray': '4,4',\n }),\n h('path', {\n d: curve.value,\n fill: 'none',\n stroke: 'rgba(255, 255, 255, 0.6)',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n }),\n ]);\n },\n});\n","import { defineComponent, h, ref } from 'vue';\n\nlet textControlInstance = 0;\n\nexport const TextControl = defineComponent({\n name: 'DialKitTextControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n placeholder: { type: String, required: false },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const inputId = ref(`dialkit-text-${++textControlInstance}`);\n\n return () => h('div', { class: 'dialkit-text-control' }, [\n h('label', { class: 'dialkit-text-label', for: inputId.value }, props.label),\n h('input', {\n id: inputId.value,\n type: 'text',\n class: 'dialkit-text-input',\n value: props.value,\n placeholder: props.placeholder,\n onInput: (event: Event) => emit('change', (event.target as HTMLInputElement).value),\n }),\n ]);\n },\n});\n","import { Teleport, defineComponent, h, onMounted, ref, watch, type PropType } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\n\ntype SelectOption = string | { value: string; label: string };\n\nfunction toTitleCase(value: string): string {\n return value.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((option) =>\n typeof option === 'string' ? { value: option, label: toTitleCase(option) } : option\n );\n}\n\nexport const SelectControl = defineComponent({\n name: 'DialKitSelectControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n options: {\n type: Array as PropType<SelectOption[]>,\n required: true,\n },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const isOpen = ref(false);\n const pos = ref<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const portalTarget = ref<HTMLElement | null>(null);\n\n const triggerRef = ref<HTMLElement | null>(null);\n const dropdownRef = ref<HTMLElement | null>(null);\n\n const normalizedOptions = () => normalizeOptions(props.options);\n const selectedLabel = () => normalizedOptions().find((option) => option.value === props.value)?.label ?? props.value;\n\n const updatePos = () => {\n if (!triggerRef.value || !portalTarget.value) return;\n const dropdownHeight = 8 + normalizedOptions().length * 36;\n pos.value = getDropdownPosition(triggerRef.value, portalTarget.value, { dropdownHeight });\n };\n\n const openDropdown = () => {\n updatePos();\n isOpen.value = true;\n };\n\n const closeDropdown = () => {\n isOpen.value = false;\n };\n\n const setDropdownRef = (node: unknown) => {\n if (node instanceof HTMLElement) {\n dropdownRef.value = node;\n return;\n }\n\n if (node && typeof node === 'object' && '$el' in node) {\n const el = (node as { $el?: unknown }).$el;\n dropdownRef.value = el instanceof HTMLElement ? el : null;\n return;\n }\n\n dropdownRef.value = null;\n };\n\n const toggleDropdown = () => {\n if (isOpen.value) closeDropdown();\n else openDropdown();\n };\n\n watch(isOpen, (open, _, onCleanup) => {\n if (!open) return;\n\n const handleViewportChange = () => updatePos();\n const handleDocumentClick = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.value?.contains(target) || dropdownRef.value?.contains(target)) return;\n closeDropdown();\n };\n\n updatePos();\n document.addEventListener('mousedown', handleDocumentClick);\n window.addEventListener('resize', handleViewportChange);\n window.addEventListener('scroll', handleViewportChange, true);\n\n onCleanup(() => {\n document.removeEventListener('mousedown', handleDocumentClick);\n window.removeEventListener('resize', handleViewportChange);\n window.removeEventListener('scroll', handleViewportChange, true);\n });\n });\n\n onMounted(() => {\n portalTarget.value = getDialKitPortalRoot(triggerRef.value) ?? document.body;\n });\n\n return () => h('div', { class: 'dialkit-select-row' }, [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-select-trigger',\n 'data-open': String(isOpen.value),\n onClick: toggleDropdown,\n }, [\n h('span', { class: 'dialkit-select-label' }, props.label),\n h('div', { class: 'dialkit-select-right' }, [\n h('span', { class: 'dialkit-select-value' }, selectedLabel()),\n h(motion.svg, {\n class: 'dialkit-select-chevron',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n animate: { rotate: isOpen.value ? 180 : 0 },\n transition: { type: 'spring', visualDuration: 0.2, bounce: 0.15 },\n }, [h('path', { d: 'M6 9.5L12 15.5L18 9.5' })]),\n ]),\n ]),\n portalTarget.value\n ? h(Teleport, { to: portalTarget.value }, [\n h(AnimatePresence, null, {\n default: () => (isOpen.value && pos.value)\n ? [h(motion.div, {\n key: 'dialkit-select-dropdown',\n ref: setDropdownRef,\n class: 'dialkit-select-dropdown',\n initial: { opacity: 0, y: pos.value.above ? 8 : -8, scale: 0.95 },\n animate: { opacity: 1, y: 0, scale: 1 },\n exit: { opacity: 0, y: pos.value.above ? 8 : -8, scale: 0.95 },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0 },\n style: {\n position: 'absolute',\n left: `${pos.value.left}px`,\n top: `${pos.value.top}px`,\n width: `${pos.value.width}px`,\n transformOrigin: pos.value.above ? 'bottom' : 'top',\n },\n }, normalizedOptions().map((option) => h('button', {\n key: option.value,\n class: 'dialkit-select-option',\n 'data-selected': String(option.value === props.value),\n onClick: () => {\n emit('change', option.value);\n closeDropdown();\n },\n }, option.label)))]\n : [],\n }),\n ])\n : null,\n ]);\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 { defineComponent, h, ref, watch } from 'vue';\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\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\nlet colorControlInstance = 0;\n\nexport const ColorControl = defineComponent({\n name: 'DialKitColorControl',\n props: {\n label: { type: String, required: true },\n value: { type: String, required: true },\n },\n emits: ['change'],\n setup(props, { emit }) {\n const textInputId = ref(`dialkit-color-${++colorControlInstance}`);\n const isEditing = ref(false);\n const editValue = ref(props.value);\n const colorInputRef = ref<HTMLInputElement | null>(null);\n\n watch(() => props.value, (value) => {\n if (!isEditing.value) editValue.value = value;\n });\n\n const submit = () => {\n isEditing.value = false;\n if (HEX_COLOR_REGEX.test(editValue.value)) {\n emit('change', editValue.value);\n } else {\n editValue.value = props.value;\n }\n };\n\n return () => h('div', { class: 'dialkit-color-control' }, [\n h('label', { class: 'dialkit-color-label', for: textInputId.value }, props.label),\n h('div', { class: 'dialkit-color-inputs' }, [\n isEditing.value\n ? h('input', {\n id: textInputId.value,\n type: 'text',\n class: 'dialkit-color-hex-input',\n value: editValue.value,\n autofocus: true,\n onInput: (event: Event) => {\n editValue.value = (event.target as HTMLInputElement).value;\n },\n onBlur: submit,\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter') submit();\n if (event.key === 'Escape') {\n isEditing.value = false;\n editValue.value = props.value;\n }\n },\n })\n : h('span', { class: 'dialkit-color-hex', onClick: () => { isEditing.value = true; } }, (props.value ?? '').toUpperCase()),\n h('button', {\n class: 'dialkit-color-swatch',\n style: { backgroundColor: props.value },\n title: 'Pick color',\n 'aria-label': `Pick color for ${props.label}`,\n onClick: () => colorInputRef.value?.click(),\n }),\n h('input', {\n ref: colorInputRef,\n type: 'color',\n class: 'dialkit-color-picker-native',\n 'aria-label': `${props.label} color picker`,\n value: props.value.length === 4 ? expandShorthandHex(props.value) : props.value.slice(0, 7),\n onInput: (event: Event) => emit('change', (event.target as HTMLInputElement).value),\n }),\n ]),\n ]);\n },\n});\n","import { Teleport, defineComponent, h, ref, watch, type PropType } from 'vue';\nimport { AnimatePresence, motion } from 'motion-v';\nimport { ICON_CHEVRON, ICON_TRASH } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { Preset } from '../../store/DialStore';\n\nexport const PresetManager = defineComponent({\n name: 'DialKitPresetManager',\n props: {\n panelId: { type: String, required: true },\n presets: {\n type: Array as PropType<Preset[]>,\n required: true,\n },\n activePresetId: {\n type: String as PropType<string | null>,\n required: false,\n default: null,\n },\n },\n setup(props) {\n const isOpen = ref(false);\n const pos = ref({ top: 0, left: 0, width: 0 });\n\n const triggerRef = ref<HTMLElement | null>(null);\n const dropdownRef = ref<HTMLElement | null>(null);\n\n const hasPresets = () => props.presets.length > 0;\n const activePreset = () => props.presets.find((preset) => preset.id === props.activePresetId);\n\n const open = () => {\n if (!hasPresets()) return;\n const rect = triggerRef.value?.getBoundingClientRect();\n if (rect) {\n pos.value = { top: rect.bottom + 4, left: rect.left, width: rect.width };\n }\n isOpen.value = true;\n };\n\n const close = () => {\n isOpen.value = false;\n };\n\n const setDropdownRef = (node: unknown) => {\n if (node instanceof HTMLElement) {\n dropdownRef.value = node;\n return;\n }\n\n if (node && typeof node === 'object' && '$el' in node) {\n const el = (node as { $el?: unknown }).$el;\n dropdownRef.value = el instanceof HTMLElement ? el : null;\n return;\n }\n\n dropdownRef.value = null;\n };\n\n const toggle = () => {\n if (isOpen.value) close();\n else open();\n };\n\n watch(isOpen, (open, _, onCleanup) => {\n if (!open) return;\n\n const handler = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.value?.contains(target) || dropdownRef.value?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n onCleanup(() => {\n document.removeEventListener('mousedown', handler);\n });\n });\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(props.panelId, presetId);\n } else {\n DialStore.clearActivePreset(props.panelId);\n }\n close();\n };\n\n const handleDelete = (event: MouseEvent, presetId: string) => {\n event.stopPropagation();\n DialStore.deletePreset(props.panelId, presetId);\n };\n\n return () => h('div', { class: 'dialkit-preset-manager' }, [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-preset-trigger',\n onClick: toggle,\n 'data-open': String(isOpen.value),\n 'data-has-preset': String(!!activePreset()),\n 'data-disabled': String(!hasPresets()),\n }, [\n h('span', { class: 'dialkit-preset-label' }, activePreset()?.name ?? 'Version 1'),\n h(motion.svg, {\n class: 'dialkit-select-chevron',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n animate: { rotate: isOpen.value ? 180 : 0, opacity: hasPresets() ? 0.6 : 0.25 },\n transition: { type: 'spring', visualDuration: 0.2, bounce: 0.15 },\n }, [h('path', { d: ICON_CHEVRON })]),\n ]),\n\n h(Teleport, { to: 'body' }, [\n h(AnimatePresence, null, {\n default: () => isOpen.value\n ? [h(motion.div, {\n key: 'dialkit-preset-dropdown',\n ref: setDropdownRef,\n class: 'dialkit-root dialkit-preset-dropdown',\n style: {\n position: 'fixed',\n top: `${pos.value.top}px`,\n left: `${pos.value.left}px`,\n minWidth: `${pos.value.width}px`,\n },\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' },\n transition: { type: 'spring', visualDuration: 0.15, bounce: 0 },\n }, [\n h('div', {\n class: 'dialkit-preset-item',\n 'data-active': String(!props.activePresetId),\n onClick: () => handleSelect(null),\n }, [h('span', { class: 'dialkit-preset-name' }, 'Version 1')]),\n\n ...props.presets.map((preset) => h('div', {\n key: preset.id,\n class: 'dialkit-preset-item',\n 'data-active': String(preset.id === props.activePresetId),\n onClick: () => handleSelect(preset.id),\n }, [\n h('span', { class: 'dialkit-preset-name' }, preset.name),\n h('button', {\n class: 'dialkit-preset-delete',\n onClick: (event: MouseEvent) => handleDelete(event, preset.id),\n title: 'Delete preset',\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, ICON_TRASH.map((d) => h('path', { d }))),\n ]),\n ])),\n ])]\n : [],\n }),\n ]),\n ]);\n },\n});\n","import { defineComponent, h, inject, onMounted, onUnmounted, provide, ref, type InjectionKey, type Ref } from 'vue';\nimport { DialStore, ControlMeta, ShortcutConfig } from '../../store/DialStore';\nimport { getEffectiveStep, applySliderDelta, findControl, isInputFocused, getActiveModifier, DRAG_SENSITIVITY } from '../../shortcut-utils';\n\nexport interface ShortcutState {\n activePanelId: Ref<string | null>;\n activePath: Ref<string | null>;\n}\n\nexport const ShortcutKey: InjectionKey<ShortcutState> = Symbol('DialKitShortcut');\n\nexport function useShortcutContext(): ShortcutState {\n return inject(ShortcutKey, {\n activePanelId: ref(null),\n activePath: ref(null),\n });\n}\n\nexport const ShortcutListener = defineComponent({\n name: 'DialKitShortcutListener',\n setup(_, { slots }) {\n const activePanelId = ref<string | null>(null);\n const activePath = ref<string | null>(null);\n\n const activeKeys = new Set<string>();\n let isDragging = false;\n let lastMouseX: number | null = null;\n let dragAccumulator = 0;\n\n provide(ShortcutKey, { activePanelId, activePath });\n\n const resolveActiveTarget = (interaction: string) => {\n for (const key of activeKeys) {\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 = DialStore.getPanel(panel.id)?.controls\n ? findControl(panel.controls, path)\n : null;\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n };\n\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 (activeKeys.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 = activeKeys.has(key);\n activeKeys.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n activePanelId.value = target.panelId;\n activePath.value = 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 lastMouseX = null;\n dragAccumulator = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeys.delete(key);\n\n // Reset drag state when key is released\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n\n if (activeKeys.size === 0) {\n activePanelId.value = null;\n activePath.value = null;\n } else {\n let found = false;\n for (const remainingKey of activeKeys) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n activePanelId.value = target.panelId;\n activePath.value = target.path;\n found = true;\n break;\n }\n }\n if (!found) {\n activePanelId.value = null;\n activePath.value = 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 (activeKeys.size > 0) {\n for (const key of activeKeys) {\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 (activeKeys.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDragging = true;\n lastMouseX = e.clientX;\n dragAccumulator = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n };\n\n // Move + Drag: mousemove handles both\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDragging) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseX !== null) {\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= 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 (lastMouseX === null) {\n lastMouseX = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeys.clear();\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n activePanelId.value = null;\n activePath.value = null;\n };\n\n onMounted(() => {\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\n onUnmounted(() => {\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\n return () => slots.default?.();\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref } from 'vue';\nimport { ICON_TIMELINE } from '../../../icons';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\n\nexport const TimelineToggleButton = defineComponent({\n name: 'DialKitTimelineToggleButton',\n setup() {\n const visible = ref(TimelineUiStore.getVisible());\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineUiStore.subscribe(() => {\n visible.value = TimelineUiStore.getVisible();\n });\n });\n onUnmounted(() => unsubscribe?.());\n return () => {\n const label = visible.value ? 'Hide timeline' : 'Show timeline';\n return h('button', {\n class: 'dialkit-toolbar-add dialkit-timeline-toolbar-toggle',\n 'data-active': visible.value || undefined,\n 'aria-pressed': visible.value,\n 'aria-label': label,\n title: label,\n onClick: () => TimelineUiStore.toggle(),\n }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n ICON_TIMELINE.map((path) => h('path', { d: path, fill: 'currentColor' }))),\n ]);\n };\n },\n});\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 {\n Teleport,\n computed,\n defineComponent,\n h,\n nextTick,\n onMounted,\n onUnmounted,\n ref,\n watch,\n type PropType,\n type VNodeChild,\n} from 'vue';\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 TIMELINE_MIN_CLIP_DURATION,\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n computeClipStaticFromValues,\n formatClock,\n formatSeconds,\n formatStepLabel,\n normalizeTimelineValuesForCopy,\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 {\n ICON_ADD_PRESET,\n ICON_CHEVRON,\n ICON_CHECK,\n ICON_CLIPBOARD,\n ICON_PAUSE,\n ICON_PLAY,\n ICON_REPLAY,\n} 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\nexport const DialTimeline = defineComponent({\n name: 'DialKitTimeline',\n props: {\n theme: { type: String as PropType<DialTheme>, default: 'system' },\n defaultVisible: { type: Boolean, default: true },\n visible: {\n type: Boolean as PropType<boolean | undefined>,\n default: undefined,\n },\n onVisibilityChange: Function as PropType<(visible: boolean) => void>,\n defaultOpen: { type: Boolean, default: true },\n productionEnabled: { type: Boolean, default: isDevDefault },\n },\n setup(props) {\n const timelines = ref<TimelineMeta[]>(TimelineStore.getTimelines());\n const dockVisible = ref(TimelineUiStore.getVisible());\n const mounted = ref(false);\n const dockMaxHeight = ref(DEFAULT_DOCK_MAX_HEIGHT);\n const dockRef = ref<HTMLDivElement | null>(null);\n const controllerId = Symbol('dialkit-timeline-visibility');\n let unsubscribeTimelines: (() => void) | undefined;\n let unsubscribeVisibility: (() => void) | undefined;\n let unregisterController: (() => void) | undefined;\n let resizeCleanup: (() => void) | null = null;\n\n const handleResizePointerDown = (event: PointerEvent) => {\n if (!dockRef.value) return;\n event.preventDefault();\n event.stopPropagation();\n resizeCleanup?.();\n\n const pointerY = event.clientY;\n const startHeight = dockRef.value.getBoundingClientRect().height;\n const move = (next: PointerEvent) => {\n next.preventDefault();\n const viewportMax = Math.max(MIN_DOCK_MAX_HEIGHT, window.innerHeight - 24);\n dockMaxHeight.value = clamp(startHeight + pointerY - next.clientY, MIN_DOCK_MAX_HEIGHT, viewportMax);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n resizeCleanup = null;\n };\n\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n resizeCleanup = finish;\n };\n\n onMounted(() => {\n mounted.value = true;\n unsubscribeVisibility = TimelineUiStore.subscribe(() => {\n dockVisible.value = TimelineUiStore.getVisible();\n });\n unregisterController = TimelineUiStore.registerController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible,\n onVisibilityChange: props.onVisibilityChange,\n });\n dockVisible.value = TimelineUiStore.getVisible();\n unsubscribeTimelines = TimelineStore.subscribeGlobal(() => {\n timelines.value = TimelineStore.getTimelines();\n });\n });\n watch(() => [props.visible, props.defaultVisible, props.onVisibilityChange] as const, () => {\n TimelineUiStore.updateController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible,\n onVisibilityChange: props.onVisibilityChange,\n });\n });\n onUnmounted(() => {\n unregisterController?.();\n unsubscribeTimelines?.();\n unsubscribeVisibility?.();\n resizeCleanup?.();\n });\n\n return () => {\n if (!props.productionEnabled || !mounted.value || timelines.value.length === 0) return null;\n return h(Teleport, { to: 'body' }, [\n h('div', {\n class: 'dialkit-root dialkit-timeline',\n 'data-theme': props.theme,\n hidden: !dockVisible.value,\n }, [\n h('div', {\n class: 'dialkit-timeline-resize-handle',\n role: 'separator',\n 'aria-label': 'Resize timeline height',\n 'aria-orientation': 'horizontal',\n title: 'Drag to resize timeline',\n onPointerdown: handleResizePointerDown,\n }),\n h('div', {\n ref: dockRef,\n class: 'dialkit-timeline-dock',\n style: { maxHeight: `min(${dockMaxHeight.value}px, calc(100vh - 24px))` },\n }, timelines.value.map((meta) => h(TimelineSection, {\n key: meta.id,\n meta,\n defaultOpen: props.defaultOpen,\n theme: props.theme,\n dockVisible: dockVisible.value,\n }))),\n ]),\n ]);\n };\n },\n});\n\nconst PlayPauseButton = defineComponent({\n props: { id: { type: String, required: true } },\n setup(props) {\n const playing = ref(TimelineStore.getTransport(props.id).playing);\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n playing.value = TimelineStore.getTransport(props.id).playing;\n });\n });\n onUnmounted(() => unsubscribe?.());\n return () => {\n const label = playing.value ? 'Pause' : 'Play';\n const icon = playing.value\n ? h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true', style: iconStyle },\n ICON_PAUSE.map((path) => h('path', { d: path, fill: 'currentColor' })))\n : h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true', style: iconStyle }, [\n h('path', { d: ICON_PLAY, fill: 'currentColor' }),\n ]);\n return h('button', {\n class: 'dialkit-toolbar-add',\n title: label,\n 'aria-label': label,\n onClick: () => playing.value ? TimelineStore.pause(props.id) : TimelineStore.play(props.id),\n }, [h('span', { style: { position: 'relative', width: '16px', height: '16px' } }, [icon])]);\n };\n },\n});\n\nconst ReplayButton = defineComponent({\n props: { onReplay: { type: Function as PropType<() => void>, required: true } },\n setup(props) {\n return () => h('button', {\n class: 'dialkit-toolbar-add',\n title: 'Replay',\n 'aria-label': 'Replay',\n onClick: props.onReplay,\n }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n ICON_REPLAY.map((path) => h('path', { d: path, fill: 'currentColor' }))),\n ]);\n },\n});\n\nconst iconStyle = {\n position: 'absolute', inset: 0, width: '16px', height: '16px', color: 'var(--dial-text-label)',\n};\n\nconst TimelineOverview = defineComponent({\n props: {\n id: { type: String, required: true },\n duration: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n viewEnd: { type: Number, required: true },\n onNavigate: { type: Function as PropType<(time: number) => void>, required: true },\n },\n setup(props) {\n const time = ref(TimelineStore.getTransport(props.id).time);\n let scrub: { wasPlaying: boolean; rect: DOMRect } | null = null;\n let unsubscribe: (() => void) | undefined;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n time.value = TimelineStore.getTransport(props.id).time;\n });\n });\n onUnmounted(() => unsubscribe?.());\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0 || props.duration <= 0) return;\n const next = clamp(((clientX - scrub.rect.left) / scrub.rect.width) * props.duration, 0, props.duration);\n TimelineStore.seek(props.id, next);\n props.onNavigate(next);\n };\n const finish = () => {\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n };\n return () => {\n const viewportWidth = props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100;\n const playhead = props.duration > 0 ? (time.value / props.duration) * 100 : 0;\n return h('div', {\n class: 'dialkit-timeline-overview',\n title: 'Drag to scrub the full timeline',\n onPointerdown: (event: PointerEvent) => {\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect: (event.currentTarget as HTMLElement).getBoundingClientRect(),\n };\n TimelineStore.pause(props.id);\n seek(event.clientX);\n },\n onPointermove: (event: PointerEvent) => scrub && seek(event.clientX),\n onPointerup: finish,\n onPointercancel: finish,\n onLostpointercapture: finish,\n }, [\n h('div', {\n class: 'dialkit-timeline-overview-viewport',\n 'data-zoomed': viewportWidth < 99.999 || undefined,\n style: { left: `${props.duration > 0 ? (props.viewStart / props.duration) * 100 : 0}%`, width: `${viewportWidth}%` },\n }),\n h('div', { class: 'dialkit-timeline-overview-progress', style: { width: `${playhead}%` } }),\n h('div', { class: 'dialkit-timeline-overview-playhead', style: { left: `${playhead}%` } }),\n ]);\n };\n },\n});\n\nconst TimelinePlayheadFlag = defineComponent({\n props: {\n id: { type: String, required: true },\n duration: { type: Number, required: true },\n pxPerSecond: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n viewEnd: { type: Number, required: true },\n laneWidth: { type: Number, required: true },\n ruler: Object as PropType<HTMLDivElement>,\n onResetView: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const time = ref(TimelineStore.getTransport(props.id).time);\n let unsubscribe: (() => void) | undefined;\n let scrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; viewEnd: number } | null = null;\n let cleanup: (() => void) | null = null;\n onMounted(() => {\n unsubscribe = TimelineStore.subscribe(props.id, () => {\n time.value = TimelineStore.getTransport(props.id).time;\n });\n });\n onUnmounted(() => {\n unsubscribe?.();\n cleanup?.();\n });\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0) return;\n TimelineStore.seek(props.id, clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / scrub.rect.width) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n ));\n };\n return () => {\n if (time.value < props.viewStart || time.value > props.viewEnd || props.laneWidth <= 0) return null;\n const x = clamp((time.value - props.viewStart) * props.pxPerSecond, 0, props.laneWidth);\n const flagCenter = clamp(\n x,\n PLAYHEAD_FLAG_WIDTH / 2 - PLAYHEAD_FLAG_EDGE_OVERHANG,\n props.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 return h('div', {\n class: '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 },\n role: 'slider',\n 'aria-label': 'Timeline current time',\n 'aria-valuemin': 0,\n 'aria-valuemax': props.duration,\n 'aria-valuenow': time.value,\n title: 'Drag to scrub the timeline',\n onPointerdown: (event: PointerEvent) => {\n const rect = props.ruler?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.stopPropagation();\n cleanup?.();\n const reset = event.shiftKey;\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect,\n viewStart: reset ? 0 : props.viewStart,\n viewEnd: reset ? props.duration : props.viewEnd,\n };\n if (reset) props.onResetView();\n TimelineStore.pause(props.id);\n seek(event.clientX);\n const move = (next: PointerEvent) => {\n next.preventDefault();\n seek(next.clientX);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n cleanup = null;\n };\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n cleanup = finish;\n },\n }, [\n h('div', { class: 'dialkit-timeline-playhead-stem' }),\n h('div', { class: 'dialkit-timeline-playhead-anchor' }, [\n h('div', { class: 'dialkit-timeline-playhead-flag' }, time.value.toFixed(2)),\n ]),\n ]);\n };\n },\n});\n\ntype PopoverState = {\n clip: TimelineClipMeta;\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 zoom: 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 = defineComponent({\n props: {\n meta: { type: Object as PropType<TimelineMeta>, required: true },\n defaultOpen: { type: Boolean, required: true },\n theme: { type: String as PropType<DialTheme>, required: true },\n dockVisible: { type: Boolean, required: true },\n },\n setup(props) {\n const open = ref(props.defaultOpen);\n const copied = ref(false);\n const popover = ref<PopoverState | null>(null);\n const collapsedGroups = ref(new Set<string>());\n const expandedTracks = ref(new Set<string>());\n const zoom = ref(1);\n const viewStart = ref(0);\n const values = ref<Record<string, DialValue>>(DialStore.getValues(props.meta.id));\n const presets = ref(DialStore.getPresets(props.meta.id));\n const activePresetId = ref(DialStore.getActivePresetId(props.meta.id));\n const laneAreaRef = ref<HTMLDivElement | null>(null);\n const horizontalScrollRef = ref<HTMLDivElement | null>(null);\n const laneWidth = ref(0);\n let unsubscribeValues: (() => void) | undefined;\n let resizeObserver: ResizeObserver | undefined;\n\n const measure = () => {\n if (laneAreaRef.value) laneWidth.value = laneAreaRef.value.getBoundingClientRect().width;\n };\n const connectMeasure = async () => {\n resizeObserver?.disconnect();\n if (!open.value) return;\n await nextTick();\n if (!laneAreaRef.value) return;\n measure();\n resizeObserver = new ResizeObserver(measure);\n resizeObserver.observe(laneAreaRef.value);\n };\n\n onMounted(() => {\n unsubscribeValues = DialStore.subscribe(props.meta.id, () => {\n values.value = DialStore.getValues(props.meta.id);\n presets.value = DialStore.getPresets(props.meta.id);\n activePresetId.value = DialStore.getActivePresetId(props.meta.id);\n });\n void connectMeasure();\n });\n onUnmounted(() => {\n unsubscribeValues?.();\n resizeObserver?.disconnect();\n });\n watch(open, connectMeasure);\n watch(() => props.dockVisible, (visible) => {\n if (!visible) popover.value = null;\n });\n\n const visibleDuration = computed(() => props.meta.duration > 0 ? props.meta.duration / zoom.value : props.meta.duration);\n const safeViewStart = computed(() => clampViewStart(viewStart.value, props.meta.duration, visibleDuration.value));\n const viewEnd = computed(() => safeViewStart.value + visibleDuration.value);\n const pxPerSecond = computed(() => visibleDuration.value > 0 && laneWidth.value > 0 ? laneWidth.value / visibleDuration.value : 0);\n const maxZoom = computed(() => Math.max(\n MIN_TIMELINE_MAX_ZOOM,\n laneWidth.value > 0 && props.meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * props.meta.duration) / (MILLISECOND_STEP * 10 * laneWidth.value)\n : MIN_TIMELINE_MAX_ZOOM\n ));\n watch(maxZoom, (next) => { zoom.value = clamp(zoom.value, 1, next); }, { immediate: true });\n watch([() => props.meta.duration, zoom], () => {\n viewStart.value = clampViewStart(viewStart.value, props.meta.duration, props.meta.duration / zoom.value);\n });\n watch([open, pxPerSecond, safeViewStart], async () => {\n await nextTick();\n const scroller = horizontalScrollRef.value;\n if (!scroller || pxPerSecond.value <= 0) return;\n const next = safeViewStart.value * pxPerSecond.value;\n if (Math.abs(scroller.scrollLeft - next) > 0.5) scroller.scrollLeft = next;\n });\n\n const centerViewAt = (time: number) => {\n if (zoom.value <= 1 || props.meta.duration <= 0) return;\n const duration = props.meta.duration / zoom.value;\n viewStart.value = clampViewStart(time - duration / 2, props.meta.duration, duration);\n };\n const resetView = () => {\n zoom.value = 1;\n viewStart.value = 0;\n };\n const handleReplay = () => {\n viewStart.value = 0;\n TimelineStore.replay(props.meta.id);\n };\n const handleHorizontalScroll = (event: Event) => {\n if (pxPerSecond.value <= 0) return;\n viewStart.value = clampViewStart(\n (event.currentTarget as HTMLDivElement).scrollLeft / pxPerSecond.value,\n props.meta.duration,\n visibleDuration.value\n );\n };\n const handleTimelineWheel = (event: WheelEvent) => {\n const scroller = horizontalScrollRef.value;\n if (!scroller || zoom.value <= 1) return;\n const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY)\n ? event.deltaX\n : event.shiftKey\n ? event.deltaY\n : 0;\n if (delta === 0) return;\n event.preventDefault();\n scroller.scrollLeft += delta;\n };\n\n let zoomDrag: ZoomDragState | null = null;\n let rulerScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n let trackScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n const seekRuler = (clientX: number) => {\n if (!rulerScrub || rulerScrub.rect.width <= 0) return;\n TimelineStore.seek(props.meta.id, clamp(\n rulerScrub.viewStart + ((clientX - rulerScrub.rect.left) / rulerScrub.rect.width) * rulerScrub.visibleDuration,\n rulerScrub.viewStart,\n rulerScrub.viewStart + rulerScrub.visibleDuration\n ));\n };\n const seekTrack = (clientX: number) => {\n if (!trackScrub || trackScrub.rect.width <= 0) return;\n TimelineStore.seek(props.meta.id, clamp(\n trackScrub.viewStart + ((clientX - trackScrub.rect.left) / trackScrub.rect.width) * trackScrub.visibleDuration,\n trackScrub.viewStart,\n trackScrub.viewStart + trackScrub.visibleDuration\n ));\n };\n const finishRuler = () => {\n if (rulerScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n rulerScrub = null;\n zoomDrag = null;\n };\n const finishTrack = () => {\n if (trackScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n trackScrub = null;\n };\n\n const handleCopy = () => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(props.meta.id), props.meta.clips);\n void navigator.clipboard.writeText(buildCopyInstruction('useDialTimeline', props.meta.name, normalized));\n copied.value = true;\n window.setTimeout(() => { copied.value = false; }, 1500);\n };\n const handleAddPreset = () => DialStore.savePreset(props.meta.id, `Version ${presets.value.length + 2}`);\n const closePopover = () => { popover.value = null; };\n const openClipPopover = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const target = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n if (getClipControls(props.meta.id, target, stepKey ? undefined : clipPopoverExclusions(clip)).length === 0) return;\n popover.value = popover.value?.clip.key === clip.key && popover.value.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height },\n };\n };\n const toggleSet = (state: typeof expandedTracks, key: string) => {\n const next = new Set(state.value);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n state.value = next;\n };\n const toggleTracks = (key: string) => toggleSet(expandedTracks, key);\n const toggleGroup = (key: string) => toggleSet(collapsedGroups, key);\n const handleBarClick = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) toggleTracks(clip.key);\n else openClipPopover(clip, rect, stepKey);\n };\n\n const ticks = computed(() => {\n const raw = pxPerSecond.value > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond.value : 1;\n const adaptive = SECOND_TICK_STEPS.find((step) => step >= raw) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom.value < 1.5 && props.meta.duration >= 1 ? Math.max(1, adaptive) : adaptive;\n const fineStep = majorStep / 10;\n const major: number[] = [];\n const medium: number[] = [];\n const fine: number[] = [];\n for (let time = Math.ceil((safeViewStart.value - 1e-6) / majorStep) * majorStep; time <= viewEnd.value + 1e-6; time += majorStep) {\n major.push(Number(time.toFixed(4)));\n }\n const first = Math.ceil((safeViewStart.value - 1e-6) / fineStep);\n const last = Math.floor((viewEnd.value + 1e-6) / fineStep);\n for (let index = first; index <= last; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineStep).toFixed(6));\n if (index % 5 === 0) medium.push(tick);\n else fine.push(tick);\n }\n return { major, medium, fine, majorStep };\n });\n\n const renderRows = (): VNodeChild[] => {\n const rows: VNodeChild[] = [];\n let lastGroup: string | undefined;\n for (const clip of props.meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const collapsed = collapsedGroups.value.has(group);\n rows.push(h('div', { key: `group:${group}`, class: 'dialkit-timeline-row dialkit-timeline-group-row' }, [\n h('div', { class: 'dialkit-timeline-label' }, [\n h('button', {\n class: 'dialkit-timeline-group-toggle',\n 'data-open': !collapsed,\n title: collapsed ? 'Expand layer' : 'Collapse layer',\n onClick: () => toggleGroup(group),\n }, [chevronIcon()]),\n h('span', formatLabel(group)),\n ]),\n h('div', { class: 'dialkit-timeline-lane' }),\n ]));\n }\n }\n if (clip.group && collapsedGroups.value.has(clip.group)) continue;\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks.value.has(clip.key);\n const stat = computeClipStaticFromValues(values.value, clip, props.meta.duration);\n const selected = popover.value?.clip.key === clip.key;\n rows.push(h('div', { key: clip.key, class: 'dialkit-timeline-row', 'data-grouped': clip.group ? '' : undefined }, [\n h('div', { class: 'dialkit-timeline-label' }, [\n isProps ? h('button', {\n class: 'dialkit-timeline-group-toggle',\n 'data-open': tracksOpen,\n title: tracksOpen ? 'Collapse properties' : 'Expand properties',\n onClick: (event: Event) => {\n event.stopPropagation();\n toggleTracks(clip.key);\n },\n }, [chevronIcon()]) : null,\n clip.label,\n ]),\n h('div', { class: 'dialkit-timeline-lane' }, [h(TimelineClip, {\n timelineId: props.meta.id,\n 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.value,\n viewStart: safeViewStart.value,\n timelineDuration: props.meta.duration,\n selected,\n selectedStepKey: selected ? popover.value?.stepKey : undefined,\n onClick: handleBarClick,\n onDrag: closePopover,\n })]),\n ]));\n if (!tracksOpen) continue;\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 const trackSelected = popover.value?.clip.key === trackKey;\n rows.push(h('div', { key: trackKey, class: 'dialkit-timeline-row dialkit-timeline-track-row', 'data-grouped': clip.group ? '' : undefined }, [\n h('div', { class: 'dialkit-timeline-label' }, formatLabel(trackRef.prop)),\n h('div', { class: 'dialkit-timeline-lane' }, [h(TimelineClip, {\n timelineId: props.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: true,\n pxPerSecond: pxPerSecond.value,\n viewStart: safeViewStart.value,\n timelineDuration: props.meta.duration,\n selected: trackSelected,\n selectedStepKey: trackSelected ? popover.value?.stepKey : undefined,\n onClick: openClipPopover,\n onDrag: closePopover,\n })]),\n ]));\n }\n }\n return rows;\n };\n\n return () => h('div', { class: 'dialkit-timeline-section' }, [\n h('div', { class: 'dialkit-timeline-header', 'data-open': open.value || undefined }, [\n h('div', { class: 'dialkit-timeline-identity' }, [\n h('span', { class: 'dialkit-timeline-title' }, props.meta.name),\n ]),\n !open.value ? h(TimelineOverview, {\n id: props.meta.id,\n duration: props.meta.duration,\n viewStart: safeViewStart.value,\n viewEnd: viewEnd.value,\n onNavigate: centerViewAt,\n }) : null,\n h('div', { class: 'dialkit-timeline-actions' }, [\n h(PlayPauseButton, { id: props.meta.id }),\n h(ReplayButton, { onReplay: handleReplay }),\n h('button', { class: 'dialkit-toolbar-add', title: 'Add timeline version', 'aria-label': 'Add timeline version', onClick: handleAddPreset }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', 'aria-hidden': 'true' },\n ICON_ADD_PRESET.map((path) => h('path', { d: path }))),\n ]),\n h(PresetManager, { panelId: props.meta.id, presets: presets.value, activePresetId: activePresetId.value }),\n h('button', {\n class: 'dialkit-toolbar-add',\n title: 'Copy parameters',\n 'aria-label': copied.value ? 'Copied parameters' : 'Copy parameters',\n onClick: handleCopy,\n }, [h('span', { style: { position: 'relative', width: '16px', height: '16px' } }, [\n copied.value\n ? h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', style: iconStyle }, [h('path', { d: ICON_CHECK })])\n : h('svg', { viewBox: '0 0 24 24', fill: 'none', style: iconStyle }, [\n h('path', { d: ICON_CLIPBOARD.board, stroke: 'currentColor', 'stroke-width': '2', 'stroke-linejoin': 'round' }),\n h('path', { d: ICON_CLIPBOARD.sparkle, fill: 'currentColor' }),\n h('path', { d: ICON_CLIPBOARD.body, stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }),\n ]),\n ])]),\n h('button', {\n class: 'dialkit-timeline-chevron',\n 'data-open': open.value,\n 'aria-expanded': open.value,\n title: open.value ? 'Collapse timeline' : 'Expand timeline',\n onClick: () => { open.value = !open.value; },\n }, [chevronIcon()]),\n ]),\n ]),\n open.value ? h('div', {\n class: 'dialkit-timeline-body',\n onWheel: handleTimelineWheel,\n onPointerdown: (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!event.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef.value?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n const reset = event.shiftKey;\n trackScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart.value,\n visibleDuration: reset ? props.meta.duration : visibleDuration.value,\n };\n if (reset) resetView();\n popover.value = null;\n TimelineStore.pause(props.meta.id);\n seekTrack(event.clientX);\n },\n onPointermove: (event: PointerEvent) => trackScrub && seekTrack(event.clientX),\n onPointerup: finishTrack,\n onPointercancel: finishTrack,\n onLostpointercapture: finishTrack,\n }, [h('div', { class: 'dialkit-timeline-grid' }, [\n h('div', { class: 'dialkit-timeline-row dialkit-timeline-ruler-row' }, [\n h('div', { class: 'dialkit-timeline-label' }),\n h('div', {\n ref: laneAreaRef,\n class: 'dialkit-timeline-ruler',\n title: 'Drag to seek · Option-drag to zoom · Shift-drag to reset zoom',\n onPointerdown: (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n if (rect.width <= 0) return;\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n if (!event.altKey) {\n const reset = event.shiftKey;\n rulerScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart.value,\n visibleDuration: reset ? props.meta.duration : visibleDuration.value,\n };\n if (reset) resetView();\n TimelineStore.pause(props.meta.id);\n seekRuler(event.clientX);\n return;\n }\n const ratio = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n zoomDrag = {\n pointerX: event.clientX,\n zoom: zoom.value,\n anchorRatio: ratio,\n anchorTime: safeViewStart.value + ratio * visibleDuration.value,\n moved: false,\n };\n },\n onPointermove: (event: PointerEvent) => {\n if (rulerScrub) {\n seekRuler(event.clientX);\n return;\n }\n if (!zoomDrag || props.meta.duration <= 0) return;\n const dx = event.clientX - zoomDrag.pointerX;\n if (!zoomDrag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n zoomDrag.moved = true;\n const nextZoom = clamp(zoomDrag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom.value);\n const duration = props.meta.duration / nextZoom;\n zoom.value = nextZoom;\n viewStart.value = clampViewStart(zoomDrag.anchorTime - zoomDrag.anchorRatio * duration, props.meta.duration, duration);\n },\n onPointerup: finishRuler,\n onPointercancel: finishRuler,\n onLostpointercapture: finishRuler,\n }, [\n ...ticks.value.fine.map((time) => h('div', { key: `fine:${time}`, class: 'dialkit-timeline-tick dialkit-timeline-tick-fine', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } })),\n ...ticks.value.medium.map((time) => h('div', { key: `medium:${time}`, class: 'dialkit-timeline-tick dialkit-timeline-tick-medium', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } })),\n ...ticks.value.major.map((time) => h('div', { key: time, class: 'dialkit-timeline-tick', style: { left: `${(time - safeViewStart.value) * pxPerSecond.value}px` } }, [\n h('span', { class: 'dialkit-timeline-tick-label' }, formatRulerSeconds(time, ticks.value.majorStep)),\n ])),\n ]),\n ]),\n ...renderRows(),\n pxPerSecond.value > 0 ? h(TimelinePlayheadFlag, {\n id: props.meta.id,\n duration: props.meta.duration,\n pxPerSecond: pxPerSecond.value,\n viewStart: safeViewStart.value,\n viewEnd: viewEnd.value,\n laneWidth: laneWidth.value,\n ruler: laneAreaRef.value ?? undefined,\n onResetView: resetView,\n }) : null,\n ]), zoom.value > 1 ? h('div', { class: 'dialkit-timeline-scroll-row' }, [\n h('div', { class: 'dialkit-timeline-label' }),\n h('div', {\n ref: horizontalScrollRef,\n class: 'dialkit-timeline-horizontal-scroll',\n 'aria-label': 'Timeline horizontal scroll',\n onScroll: handleHorizontalScroll,\n }, [h('div', { style: { width: `${laneWidth.value * zoom.value}px` } })]),\n ]) : null]) : null,\n popover.value ? h(ClipPopover, {\n panelId: props.meta.id,\n popover: popover.value,\n values: values.value,\n theme: props.theme,\n onClose: closePopover,\n }) : null,\n ]);\n },\n});\n\nfunction chevronIcon() {\n return h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, [\n h('path', { d: ICON_CHEVRON }),\n ]);\n}\n\nconst ClipPopover = defineComponent({\n props: {\n panelId: { type: String, required: true },\n popover: { type: Object as PropType<PopoverState>, required: true },\n values: { type: Object as PropType<Record<string, DialValue>>, required: true },\n theme: { type: String as PropType<DialTheme>, required: true },\n onClose: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const element = ref<HTMLDivElement | null>(null);\n const naturalHeight = ref(0);\n const viewport = ref(readViewport());\n let observer: ResizeObserver | undefined;\n const measure = () => {\n if (element.value) naturalHeight.value = element.value.scrollHeight + 2;\n };\n const updateViewport = () => { viewport.value = readViewport(); };\n const outside = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (element.value?.contains(target) || target.closest?.('.dialkit-timeline-clip') || target.closest?.('.dialkit-timeline-label')) return;\n props.onClose();\n };\n const keydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') props.onClose();\n };\n onMounted(() => {\n measure();\n observer = new ResizeObserver(measure);\n if (element.value) observer.observe(element.value.querySelector('.dialkit-timeline-popover-body') ?? element.value);\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', keydown);\n });\n onUnmounted(() => {\n observer?.disconnect();\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n document.removeEventListener('pointerdown', outside, true);\n document.removeEventListener('keydown', keydown);\n });\n\n return () => {\n const { clip, stepKey } = props.popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(props.panelId, `${clip.key}.${stepKey}`);\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(props.panelId, `${clip.key}.from`);\n if (from) {\n const index = controls.findIndex((control) => control.path === `${clip.key}.${stepKey}.to`);\n controls = index >= 0 ? [...controls.slice(0, index), from, ...controls.slice(index)] : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(props.panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n if (controls.length === 0) return null;\n const target = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(props.panelId, `${target}.duration`);\n const durationValue = durationMeta ? props.values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(props.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 const current = viewport.value;\n const right = current.offsetLeft + current.width;\n const bottom = current.offsetTop + current.height;\n const width = Math.min(POPOVER_WIDTH, Math.max(220, current.width - 24));\n const left = clamp(props.popover.anchor.left + props.popover.anchor.width / 2 - width / 2, current.offsetLeft + 12, Math.max(current.offsetLeft + 12, right - width - 12));\n const above = Math.max(0, props.popover.anchor.top - current.offsetTop - 22);\n const below = Math.max(0, bottom - props.popover.anchor.bottom - 22);\n const placeAbove = naturalHeight.value === 0 ? above >= below : naturalHeight.value <= above || (naturalHeight.value > below && above >= below);\n const availableHeight = placeAbove ? above : below;\n const renderedHeight = Math.min(naturalHeight.value || availableHeight, availableHeight);\n const rawTop = placeAbove ? props.popover.anchor.top - 10 - renderedHeight : props.popover.anchor.bottom + 10;\n const top = clamp(rawTop, current.offsetTop + 12, Math.max(current.offsetTop + 12, bottom - renderedHeight - 12));\n\n return h(Teleport, { to: 'body' }, [h('div', { class: 'dialkit-root', 'data-theme': props.theme }, [\n h('div', {\n ref: element,\n class: 'dialkit-timeline-popover',\n 'data-placement': placeAbove ? 'above' : 'below',\n style: { left: `${left}px`, top: `${top}px`, width: `${width}px`, maxHeight: `${availableHeight}px`, visibility: naturalHeight.value > 0 ? 'visible' : 'hidden' },\n role: 'dialog',\n 'aria-label': `Edit ${title}`,\n }, [\n h('div', { class: 'dialkit-timeline-popover-header' }, [\n h('span', { class: 'dialkit-timeline-popover-title' }, title),\n h('button', { class: 'dialkit-timeline-popover-close', title: 'Close editor', 'aria-label': 'Close editor', onClick: props.onClose }, [\n h('svg', { viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': '2', 'stroke-linecap': 'round' }, [h('path', { d: 'M6 6L18 18M18 6L6 18' })]),\n ]),\n ]),\n h('div', { class: 'dialkit-timeline-popover-body' }, [h(ControlRenderer, {\n panelId: props.panelId,\n controls,\n values: timelinePopoverDisplayValues(props.values, clip.key, clip.stepKeys, stepKey),\n transitionDuration,\n })]),\n ]),\n ])]);\n };\n },\n});\n\nfunction readViewport() {\n return {\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\nfunction clipPopoverExclusions(clip: TimelineClipMeta) {\n return new Set([...(clip.stepKeys ?? []), ...(clip.tracks?.map((track) => track.prop) ?? [])]);\n}\n\nfunction getClipControls(panelId: string, path: string, exclusions?: Set<string>): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, path) : null;\n if (!folder?.children) return [];\n return folder.children.filter((control) => {\n const key = control.path.slice(path.length + 1);\n return key !== 'at' && key !== 'duration' && !exclusions?.has(key);\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\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\nconst TimelineClip = defineComponent({\n props: {\n timelineId: { type: String, required: true },\n clip: { type: Object as PropType<TimelineClipMeta>, required: true },\n at: { type: Number, required: true },\n duration: { type: Number, required: true },\n loop: { type: String as PropType<TimelineClipLoop>, required: true },\n steps: Array as PropType<TimelineStepStatic[]>,\n fixedDuration: { type: Boolean, required: true },\n composite: Boolean,\n baseAt: { type: Number, default: 0 },\n delayMode: Boolean,\n pxPerSecond: { type: Number, required: true },\n viewStart: { type: Number, required: true },\n timelineDuration: { type: Number, required: true },\n selected: { type: Boolean, required: true },\n selectedStepKey: String,\n onClick: { type: Function as PropType<(clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void>, required: true },\n onDrag: { type: Function as PropType<() => void>, required: true },\n },\n setup(props) {\n const dragging = ref(false);\n let drag: DragState | null = null;\n const finish = (event?: PointerEvent) => {\n const previous = drag;\n drag = null;\n dragging.value = false;\n if (previous && !previous.moved && event) {\n const anchor = previous.clickEl ?? event.currentTarget as HTMLElement;\n props.onClick(props.clip, anchor.getBoundingClientRect(), previous.clickEl?.dataset.step);\n }\n };\n return () => {\n const width = Math.max(props.duration * props.pxPerSecond, 14);\n const isSteps = Boolean(props.steps?.length);\n const looping = props.loop === 'repeat' && props.duration > 0;\n const resizable = props.duration > 0 && !props.fixedDuration && !props.composite;\n const durationText = `${props.fixedDuration && !props.composite ? '~' : ''}${formatSeconds(props.duration)}`;\n const ghosts: VNodeChild[] = [];\n if (looping) {\n const first = Math.max(1, Math.floor((props.viewStart - props.at) / props.duration));\n for (let offset = 0; offset < 256; offset++) {\n const index = first + offset;\n const start = props.at + props.duration * index;\n if (start >= props.timelineDuration - 1e-6) break;\n const duration = Math.min(props.duration, props.timelineDuration - start);\n ghosts.push(h('div', {\n key: `ghost:${index}`,\n class: 'dialkit-timeline-clip-ghost',\n 'data-steps': isSteps || undefined,\n 'aria-hidden': 'true',\n style: { left: `${(start - props.viewStart) * props.pxPerSecond + 1}px`, width: `${Math.max(1, duration * props.pxPerSecond - 2)}px`, background: props.clip.color },\n }, props.steps?.map((step) => h('span', { class: 'dialkit-timeline-clip-ghost-segment', style: { width: `${step.duration * props.pxPerSecond}px` } }))));\n }\n }\n let cumulative = 0;\n const boundaries = props.steps?.map((step) => (cumulative += step.duration)) ?? [];\n const children: VNodeChild[] = [];\n if (props.composite) {\n if (width > 56) children.push(h('span', { class: 'dialkit-timeline-clip-duration' }, durationText));\n } else if (isSteps) {\n for (const step of props.steps ?? []) {\n const segmentWidth = step.duration * props.pxPerSecond;\n children.push(h('div', {\n key: step.key ?? 'step',\n class: 'dialkit-timeline-clip-segment',\n 'data-step': step.key,\n 'data-selected': props.selectedStepKey === step.key || undefined,\n style: { width: `${segmentWidth}px` },\n }, segmentWidth > 52 ? [h('span', { class: 'dialkit-timeline-clip-duration' }, formatSeconds(step.duration))] : []));\n }\n (props.steps ?? []).forEach((step, index) => {\n if (!step.isPhysics) children.push(h('div', { key: `boundary:${step.key}`, class: 'dialkit-timeline-clip-handle', 'data-boundary': index, style: { left: `${boundaries[index] * props.pxPerSecond - 4}px` } }));\n });\n if (!props.steps?.[0]?.isPhysics) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'start' }));\n } else {\n if (resizable) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'start' }));\n if (width > 56) children.push(h('span', { class: 'dialkit-timeline-clip-duration' }, durationText));\n if (resizable) children.push(h('div', { class: 'dialkit-timeline-clip-handle', 'data-edge': 'end' }));\n }\n const title = props.composite\n ? `${props.clip.label} — composite of its property tracks${looping ? ' · repeats through timeline' : ''} · click to expand`\n : `${props.clip.label} — ${formatSeconds(props.at)} for ${durationText}${props.fixedDuration ? ' (duration set by spring physics)' : ''}${looping ? ' · repeats through timeline' : ''}${props.delayMode ? ' · drag to phase-shift' : ''}`;\n return [...ghosts, h('div', {\n class: 'dialkit-timeline-clip',\n 'data-steps': isSteps || undefined,\n 'data-composite': props.composite || undefined,\n 'data-selected': props.selected || undefined,\n 'data-dragging': dragging.value || undefined,\n style: { left: `${(props.at - props.viewStart) * props.pxPerSecond}px`, width: `${width}px`, background: props.composite ? `${props.clip.color}80` : props.clip.color },\n title,\n onPointerdown: (event: PointerEvent) => {\n if (event.shiftKey) return;\n event.stopPropagation();\n const target = event.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n if (target.dataset.boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(target.dataset.boundary);\n } else if (!props.fixedDuration) {\n const edge = target.dataset.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n drag = {\n mode,\n boundaryIndex,\n pointerX: event.clientX,\n at: props.at,\n duration: props.duration,\n stepDurations: props.steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]'),\n moved: false,\n };\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n },\n onPointermove: (event: PointerEvent) => {\n if (!drag || props.pxPerSecond <= 0) return;\n const dx = event.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n dragging.value = true;\n props.onDrag();\n }\n const dt = dx / props.pxPerSecond;\n if (drag.mode === 'boundary' && props.steps && drag.stepDurations) {\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, duration, stepIndex) => stepIndex === index ? sum : sum + duration, 0);\n DialStore.updateValue(props.timelineId, `${props.clip.key}.${props.steps[index].key ?? ''}.duration`, clampStepResize(drag.stepDurations[index] + dt, drag.at, others, props.timelineDuration));\n } else if (drag.mode === 'move') {\n if (props.delayMode) DialStore.updateValue(props.timelineId, `${props.clip.key}.delay`, clampTrackDelay(drag.at + dt - props.baseAt, props.baseAt, drag.duration, props.timelineDuration));\n else DialStore.updateValue(props.timelineId, `${props.clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, props.timelineDuration));\n } else if (drag.mode === 'end') {\n DialStore.updateValue(props.timelineId, `${props.clip.key}.duration`, clampClipResizeEnd(drag.duration + dt, drag.at, props.timelineDuration));\n } else if (props.steps && drag.stepDurations) {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(props.baseAt, 0)), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - props.baseAt) : next.at,\n [`${props.clip.key}.${props.steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(props.baseAt, 0)), drag.at, drag.duration);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - props.baseAt) : next.at,\n [`${props.clip.key}.duration`]: next.duration,\n });\n }\n },\n onPointerup: finish,\n onPointercancel: () => finish(),\n onLostpointercapture: () => finish(),\n }, children), looping ? h('span', { class: 'dialkit-timeline-loop-infinity', 'aria-hidden': 'true', title: 'Repeats indefinitely' }, '∞') : null];\n };\n },\n});\n","import { Fragment, defineComponent, h, type PropType } from 'vue';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, DialValue, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { ColorControl } from './ColorControl';\nimport { Folder } from './Folder';\nimport { SelectControl } from './SelectControl';\nimport { ShortcutKey } from './ShortcutListener';\nimport { Slider } from './Slider';\nimport { SpringControl } from './SpringControl';\nimport { TextControl } from './TextControl';\nimport { Toggle } from './Toggle';\nimport { TransitionControl, type TransitionDurationControl } from './TransitionControl';\nimport { inject } from 'vue';\n\nexport const ControlRenderer = defineComponent({\n name: 'DialKitControlRenderer',\n props: {\n panelId: { type: String, required: true },\n controls: { type: Array as PropType<ControlMeta[]>, required: true },\n values: { type: Object as PropType<Record<string, DialValue>>, required: true },\n transitionDuration: Object as PropType<TransitionDurationControl>,\n },\n setup(props) {\n const shortcut = inject(ShortcutKey, undefined);\n const renderControl = (control: ControlMeta): ReturnType<typeof h> | null => {\n const value = props.values[control.path];\n switch (control.type) {\n case 'slider':\n return h(Slider, {\n key: control.path,\n label: control.label,\n value: value as number,\n min: control.min,\n max: control.max,\n step: control.step,\n shortcut: control.shortcut,\n shortcutActive: shortcut?.activePanelId.value === props.panelId && shortcut.activePath.value === control.path,\n onChange: (next: number) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'toggle':\n return h(Toggle, {\n key: control.path,\n label: control.label,\n checked: value as boolean,\n shortcut: control.shortcut,\n shortcutActive: shortcut?.activePanelId.value === props.panelId && shortcut.activePath.value === control.path,\n onChange: (next: boolean) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'spring':\n return h(SpringControl, {\n key: control.path,\n panelId: props.panelId,\n path: control.path,\n label: control.label,\n spring: value as SpringConfig,\n onChange: (next: SpringConfig) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'transition':\n return h(TransitionControl, {\n key: control.path,\n panelId: props.panelId,\n path: control.path,\n label: control.label,\n value: value as TransitionConfig,\n durationControl: props.transitionDuration,\n onChange: (next: TransitionConfig) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'folder':\n return h(Folder, {\n key: control.path,\n title: control.label,\n defaultOpen: control.defaultOpen ?? true,\n }, { default: () => (control.children ?? []).map(renderControl) });\n case 'text':\n return h(TextControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n placeholder: control.placeholder,\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'select':\n return h(SelectControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n options: control.options ?? [],\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'color':\n return h(ColorControl, {\n key: control.path,\n label: control.label,\n value: value as string,\n onChange: (next: string) => DialStore.updateValue(props.panelId, control.path, next),\n });\n case 'action':\n return h('button', {\n key: control.path,\n class: 'dialkit-button',\n onClick: () => DialStore.triggerAction(props.panelId, control.path),\n }, control.label);\n default:\n return null;\n }\n };\n return () => h(Fragment, null, props.controls.map(renderControl));\n },\n});\n","import { defineComponent, h, onMounted, onUnmounted, ref, Teleport, type PropType } from 'vue';\nimport { DialStore, ShortcutConfig } from '../../store/DialStore';\n\nfunction formatShortcutKey(sc: ShortcutConfig): string {\n if (!sc.key) return '\\u2014';\n const mod = sc.modifier === 'alt' ? '\\u2325'\n : sc.modifier === 'shift' ? '\\u21E7'\n : sc.modifier === 'meta' ? '\\u2318'\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 const ShortcutsMenu = defineComponent({\n name: 'DialKitShortcutsMenu',\n props: {\n panelId: {\n type: String as PropType<string>,\n required: true,\n },\n },\n setup(props) {\n const isOpen = ref(false);\n const triggerRef = ref<HTMLButtonElement | null>(null);\n const dropdownRef = ref<HTMLDivElement | null>(null);\n const pos = ref({ top: 0, right: 0 });\n\n const open = () => {\n const rect = triggerRef.value?.getBoundingClientRect();\n if (rect) {\n pos.value = { top: rect.bottom + 4, right: window.innerWidth - rect.right };\n }\n isOpen.value = true;\n };\n\n const close = () => {\n isOpen.value = false;\n };\n\n const toggle = () => {\n if (isOpen.value) close();\n else open();\n };\n\n let mousedownHandler: ((e: MouseEvent) => void) | null = null;\n\n const addOutsideClickListener = () => {\n mousedownHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.value?.contains(target) ||\n dropdownRef.value?.contains(target)\n ) return;\n close();\n };\n document.addEventListener('mousedown', mousedownHandler);\n };\n\n const removeOutsideClickListener = () => {\n if (mousedownHandler) {\n document.removeEventListener('mousedown', mousedownHandler);\n mousedownHandler = null;\n }\n };\n\n onUnmounted(() => {\n removeOutsideClickListener();\n });\n\n return () => {\n const panel = DialStore.getPanel(props.panelId);\n if (!panel) return null;\n\n const shortcuts = Object.entries(panel.shortcuts);\n if (shortcuts.length === 0) return null;\n\n // Find control label\n const findLabel = (controls: typeof panel.controls, path: string): 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, path);\n if (found) return found;\n }\n }\n return path;\n };\n\n const rows = shortcuts.map(([path, shortcut]) => ({\n path,\n shortcut,\n label: findLabel(panel.controls, path),\n }));\n\n // Manage outside click listener based on open state\n if (isOpen.value) {\n if (!mousedownHandler) addOutsideClickListener();\n } else {\n removeOutsideClickListener();\n }\n\n return [\n h('button', {\n ref: triggerRef,\n class: 'dialkit-shortcuts-trigger',\n onClick: toggle,\n title: 'Keyboard shortcuts',\n }, [\n h('svg', {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }, [\n h('rect', { x: '2', y: '6', width: '20', height: '12', rx: '2' }),\n h('path', { d: 'M6 10H6.01' }),\n h('path', { d: 'M10 10H10.01' }),\n h('path', { d: 'M14 10H14.01' }),\n h('path', { d: 'M18 10H18.01' }),\n h('path', { d: 'M8 14H16' }),\n ]),\n ]),\n isOpen.value\n ? h(Teleport, { to: 'body' }, [\n h('div', {\n ref: dropdownRef,\n class: 'dialkit-root dialkit-shortcuts-dropdown',\n style: {\n position: 'fixed',\n top: `${pos.value.top}px`,\n right: `${pos.value.right}px`,\n },\n }, [\n h('div', { class: 'dialkit-shortcuts-title' }, 'Keyboard Shortcuts'),\n h('div', { class: 'dialkit-shortcuts-list' },\n rows.map((row) =>\n h('div', { key: row.path, class: 'dialkit-shortcuts-row' }, [\n h('span', { class: 'dialkit-shortcuts-row-key' }, formatShortcutKey(row.shortcut)),\n h('span', { class: 'dialkit-shortcuts-row-label' }, row.label),\n h('span', { class: 'dialkit-shortcuts-row-mode' }, formatInteraction(row.shortcut)),\n ])\n )\n ),\n h('div', { class: 'dialkit-shortcuts-hint' }, 'See pill badges on controls for keys'),\n ]),\n ])\n : null,\n ];\n };\n },\n});\n","import { defineComponent, h, type PropType } from 'vue';\n\nexport type ButtonGroupButton = {\n label: string;\n onClick: () => void;\n};\n\nexport const ButtonGroup = defineComponent({\n name: 'DialKitButtonGroup',\n props: {\n buttons: {\n type: Array as PropType<ButtonGroupButton[]>,\n required: true,\n },\n },\n setup(props) {\n return () => h(\n 'div',\n { class: 'dialkit-button-group' },\n props.buttons.map((button) =>\n h('button', { class: 'dialkit-button', onClick: button.onClick }, button.label)\n )\n );\n },\n});\n"],"mappings":"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","names":["computed","onMounted","onUnmounted","shallowRef","watch","wd","t","h","computed","shallowRef","watch","onMounted","onUnmounted","defineComponent","h","shallowRef","computed","defineComponent","h","nextTick","onMounted","onUnmounted","ref","Teleport","onMounted","onUnmounted","ref","ref","onUnmounted","onMounted","defineComponent","h","onMounted","onUnmounted","ref","AnimatePresence","motion","defineComponent","h","computed","onMounted","onUnmounted","ref","watch","defineComponent","computed","ref","discreteSteps","watch","h","onMounted","onUnmounted","defineComponent","h","defineComponent","h","nextTick","onMounted","onUnmounted","ref","watch","animate","defineComponent","h","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","h","computed","defineComponent","ref","onMounted","onUnmounted","h","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","h","computed","defineComponent","computed","h","defineComponent","ref","h","onMounted","onUnmounted","defineComponent","h","ref","defineComponent","h","onMounted","ref","watch","AnimatePresence","motion","defineComponent","ref","watch","onMounted","h","motion","AnimatePresence","defineComponent","h","ref","watch","Teleport","defineComponent","h","ref","watch","AnimatePresence","motion","defineComponent","ref","watch","open","h","motion","Teleport","AnimatePresence","defineComponent","onMounted","onUnmounted","ref","ref","defineComponent","target","onMounted","onUnmounted","defineComponent","ref","onMounted","onUnmounted","h","motion","AnimatePresence","defineComponent","h","onMounted","onUnmounted","ref","defineComponent","ref","onMounted","onUnmounted","h","isDevDefault","defineComponent","ref","computed","onMounted","nextTick","onUnmounted","h","Teleport","shallowRef","defineComponent","h","Teleport","computed","defineComponent","h","nextTick","onMounted","onUnmounted","ref","watch","Fragment","defineComponent","h","inject","defineComponent","h","Fragment","defineComponent","ref","onMounted","watch","onUnmounted","h","Teleport","nextTick","computed","defineComponent","h","onUnmounted","ref","Teleport","defineComponent","ref","onUnmounted","h","Teleport","defineComponent","h"]}
|