dialkit 1.1.0 → 1.2.1

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.
Files changed (73) hide show
  1. package/README.md +174 -2
  2. package/dist/icons.d.ts +19 -0
  3. package/dist/icons.js +39 -0
  4. package/dist/icons.js.map +1 -0
  5. package/dist/index.cjs +876 -337
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +41 -6
  8. package/dist/index.d.ts +41 -6
  9. package/dist/index.js +878 -341
  10. package/dist/index.js.map +1 -1
  11. package/dist/shortcut-utils.d.ts +39 -0
  12. package/dist/shortcut-utils.js +100 -0
  13. package/dist/shortcut-utils.js.map +1 -0
  14. package/dist/solid/index.cjs +1011 -544
  15. package/dist/solid/index.cjs.map +1 -1
  16. package/dist/solid/index.d.cts +33 -3
  17. package/dist/solid/index.d.ts +33 -3
  18. package/dist/solid/index.js +864 -398
  19. package/dist/solid/index.js.map +1 -1
  20. package/dist/store/index.cjs +52 -12
  21. package/dist/store/index.cjs.map +1 -1
  22. package/dist/store/index.d.cts +25 -3
  23. package/dist/store/index.d.ts +25 -3
  24. package/dist/store/index.js +52 -12
  25. package/dist/store/index.js.map +1 -1
  26. package/dist/styles.css +256 -25
  27. package/dist/svelte/components/ControlRenderer.svelte +12 -0
  28. package/dist/svelte/components/ControlRenderer.svelte.d.ts.map +1 -1
  29. package/dist/svelte/components/DialRoot.svelte +22 -8
  30. package/dist/svelte/components/DialRoot.svelte.d.ts +3 -0
  31. package/dist/svelte/components/DialRoot.svelte.d.ts.map +1 -1
  32. package/dist/svelte/components/Folder.svelte +17 -8
  33. package/dist/svelte/components/Folder.svelte.d.ts.map +1 -1
  34. package/dist/svelte/components/Panel.svelte +14 -9
  35. package/dist/svelte/components/Panel.svelte.d.ts.map +1 -1
  36. package/dist/svelte/components/PresetManager.svelte +7 -6
  37. package/dist/svelte/components/PresetManager.svelte.d.ts.map +1 -1
  38. package/dist/svelte/components/SegmentedControl.svelte +30 -74
  39. package/dist/svelte/components/SegmentedControl.svelte.d.ts.map +1 -1
  40. package/dist/svelte/components/SelectControl.svelte +2 -1
  41. package/dist/svelte/components/SelectControl.svelte.d.ts.map +1 -1
  42. package/dist/svelte/components/ShortcutListener.svelte +265 -0
  43. package/dist/svelte/components/ShortcutListener.svelte.d.ts +13 -0
  44. package/dist/svelte/components/ShortcutListener.svelte.d.ts.map +1 -0
  45. package/dist/svelte/components/ShortcutsMenu.svelte +128 -0
  46. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts +7 -0
  47. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts.map +1 -0
  48. package/dist/svelte/components/Slider.svelte +16 -29
  49. package/dist/svelte/components/Slider.svelte.d.ts +3 -0
  50. package/dist/svelte/components/Slider.svelte.d.ts.map +1 -1
  51. package/dist/svelte/components/SpringControl.svelte +17 -15
  52. package/dist/svelte/components/SpringControl.svelte.d.ts.map +1 -1
  53. package/dist/svelte/components/Toggle.svelte +13 -2
  54. package/dist/svelte/components/Toggle.svelte.d.ts +3 -0
  55. package/dist/svelte/components/Toggle.svelte.d.ts.map +1 -1
  56. package/dist/svelte/components/TransitionControl.svelte +28 -25
  57. package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -1
  58. package/dist/svelte/createDialKit.svelte.d.ts +2 -1
  59. package/dist/svelte/createDialKit.svelte.d.ts.map +1 -1
  60. package/dist/svelte/createDialKit.svelte.js +1 -1
  61. package/dist/svelte/index.d.ts +6 -2
  62. package/dist/svelte/index.d.ts.map +1 -1
  63. package/dist/svelte/index.js +4 -0
  64. package/dist/svelte/theme-css.d.ts +1 -1
  65. package/dist/svelte/theme-css.d.ts.map +1 -1
  66. package/dist/svelte/theme-css.js +257 -26
  67. package/dist/vue/index.cjs +3056 -0
  68. package/dist/vue/index.cjs.map +1 -0
  69. package/dist/vue/index.d.cts +675 -0
  70. package/dist/vue/index.d.ts +675 -0
  71. package/dist/vue/index.js +3014 -0
  72. package/dist/vue/index.js.map +1 -0
  73. package/package.json +24 -4
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useDialKit.ts","../src/store/DialStore.ts","../src/components/DialRoot.tsx","../src/components/Panel.tsx","../src/components/Folder.tsx","../src/components/Slider.tsx","../src/components/SegmentedControl.tsx","../src/components/Toggle.tsx","../src/components/SpringVisualization.tsx","../src/components/SpringControl.tsx","../src/components/EasingVisualization.tsx","../src/components/TransitionControl.tsx","../src/components/TextControl.tsx","../src/components/SelectControl.tsx","../src/components/ColorControl.tsx","../src/components/PresetManager.tsx","../src/components/ButtonGroup.tsx"],"sourcesContent":["import { useEffect, useId, useSyncExternalStore, useRef } from 'react';\nimport { DialStore, DialConfig, DialValue, ResolvedValues, SpringConfig, EasingConfig, SelectConfig, ColorConfig, TextConfig, ActionConfig } from '../store/DialStore';\n\nexport interface UseDialOptions {\n onAction?: (action: string) => void;\n}\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ResolvedValues<T> {\n const instanceId = useId();\n const panelId = `${name}-${instanceId}`;\n const configRef = useRef(config);\n const serializedConfig = JSON.stringify(config);\n configRef.current = config;\n const onActionRef = useRef(options?.onAction);\n onActionRef.current = options?.onAction;\n\n // Register panel on mount\n useEffect(() => {\n DialStore.registerPanel(panelId, name, configRef.current);\n return () => DialStore.unregisterPanel(panelId);\n }, [panelId, name]);\n\n // Update panel when config structure changes\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n DialStore.updatePanel(panelId, name, configRef.current);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelId, name, serializedConfig]);\n\n // Subscribe to action events\n useEffect(() => {\n return DialStore.subscribeActions(panelId, (action) => {\n onActionRef.current?.(action);\n });\n }, [panelId]);\n\n // Subscribe to changes\n // DialStore.getValues returns a stable empty object when panel not registered\n const values = useSyncExternalStore(\n (callback) => DialStore.subscribe(panelId, callback),\n () => DialStore.getValues(panelId),\n () => DialStore.getValues(panelId)\n );\n\n // Build resolved values object\n return buildResolvedValues(config, values, '') as ResolvedValues<T>;\n}\n\nfunction buildResolvedValues(\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 // Range tuple\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 (isSpringConfig(configValue) || isEasingConfig(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfig(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfig(configValue)) {\n // Select config resolves to string value\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfig(configValue)) {\n // Color config resolves to string value\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfig(configValue)) {\n // Text config resolves to string value\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n // Nested object\n result[key] = buildResolvedValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\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\nfunction isSpringConfig(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nfunction isEasingConfig(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nfunction isActionConfig(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfig(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfig(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfig(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 return typeof first === 'string' ? first : first.value;\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 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};\n\nexport type PanelConfig = {\n id: string;\n name: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\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\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\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\n registerPanel(id: string, name: string, config: DialConfig): void {\n const controls = this.parseConfig(config, '');\n const values = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', values);\n\n this.panels.set(id, { id, name, controls, values });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, { ...values });\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig): void {\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config);\n return;\n }\n\n const controls = this.parseConfig(config, '');\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n nextValues[path] = this.normalizePreservedValue(\n existing.values[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n // Set mode defaults for new transition controls first.\n this.initTransitionModes(config, '', nextValues);\n\n for (const [path, mode] of Object.entries(existing.values)) {\n if (!path.endsWith('.__mode')) {\n continue;\n }\n\n const transitionPath = path.slice(0, -'__mode'.length - 1);\n const transitionControl = controlsByPath.get(transitionPath);\n if (transitionControl?.type === 'transition') {\n nextValues[path] = mode;\n }\n }\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues: Record<string, DialValue> = {};\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n nextBaseValues[path] = this.normalizePreservedValue(\n previousBaseValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\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\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n this.panels.delete(id);\n this.listeners.delete(id);\n this.snapshots.delete(id);\n this.actionListeners.delete(id);\n this.baseValues.delete(id);\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[path] = value;\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) preset.values[path] = value;\n } else {\n const base = this.baseValues.get(panelId);\n if (base) base[path] = value;\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\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.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(): PanelConfig[] {\n return Array.from(this.panels.values());\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 this.listeners.get(panelId)?.delete(listener);\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 this.actionListeners.get(panelId)?.delete(listener);\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.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.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.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.notify(panelId);\n }\n\n private notify(panelId: string): void {\n this.listeners.get(panelId)?.forEach(fn => fn());\n }\n\n private notifyGlobal(): void {\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): 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\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 });\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 });\n } else if (typeof value === 'boolean') {\n controls.push({ type: 'toggle', path, label });\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),\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 /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n }\n\n private formatLabel(key: string): string {\n // Convert camelCase to Title Case\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\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 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\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 = new DialStoreClass();\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { Panel } from './Panel';\n\nexport type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\nexport type DialMode = 'popover' | 'inline';\n\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n}\n\nexport function DialRoot({ position = 'top-right', defaultOpen = true, mode = 'popover' }: DialRootProps) {\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [mounted, setMounted] = useState(false);\n const inline = mode === 'inline';\n\n // Subscribe to global panel changes\n useEffect(() => {\n setMounted(true);\n setPanels(DialStore.getPanels());\n\n const unsubscribe = DialStore.subscribeGlobal(() => {\n setPanels(DialStore.getPanels());\n });\n\n return unsubscribe;\n }, []);\n\n // Don't render on server\n if (!mounted || typeof window === 'undefined') {\n return null;\n }\n\n // Don't render if no panels registered\n if (panels.length === 0) {\n return null;\n }\n\n const content = (\n <div className=\"dialkit-root\" data-mode={mode}>\n <div className=\"dialkit-panel\" data-position={inline ? undefined : position} data-mode={mode}>\n {panels.map((panel) => (\n <Panel key={panel.id} panel={panel} defaultOpen={inline || defaultOpen} inline={inline} />\n ))}\n </div>\n </div>\n );\n\n if (inline) {\n return content;\n }\n\n return createPortal(content, document.body);\n}\n","import { useState, useSyncExternalStore } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, ControlMeta, 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';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n}\n\nexport function Panel({ panel, defaultOpen = true, inline = false }: PanelProps) {\n const [copied, setCopied] = useState(false);\n const [isPanelOpen, setIsPanelOpen] = useState(defaultOpen);\n\n // Subscribe to panel value changes\n const values = useSyncExternalStore(\n (cb) => DialStore.subscribe(panel.id, cb),\n () => DialStore.getValues(panel.id),\n () => DialStore.getValues(panel.id)\n );\n\n const presets = DialStore.getPresets(panel.id);\n const activePresetId = DialStore.getActivePresetId(panel.id);\n\n const handleAddPreset = () => {\n const nextNum = presets.length + 2;\n DialStore.savePreset(panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const jsonStr = JSON.stringify(values, null, 2);\n\n const instruction = `Update the useDialKit configuration for \"${panel.name}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the useDialKit call.`;\n\n navigator.clipboard.writeText(instruction);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const renderControl = (control: ControlMeta) => {\n const value = values[control.path];\n\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n key={control.path}\n label={control.label}\n value={value as number}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n key={control.path}\n label={control.label}\n checked={value as boolean}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n key={control.path}\n panelId={panel.id}\n path={control.path}\n label={control.label}\n spring={value as SpringConfig}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n key={control.path}\n panelId={panel.id}\n path={control.path}\n label={control.label}\n value={value as TransitionConfig}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'folder':\n return (\n <Folder key={control.path} title={control.label} defaultOpen={control.defaultOpen ?? true}>\n {control.children?.map(renderControl)}\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n key={control.path}\n label={control.label}\n value={value as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'action':\n return (\n <button\n key={control.path}\n className=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(panel.id, control.path)}\n >\n {control.label}\n </button>\n );\n\n default:\n return null;\n }\n };\n\n const renderControls = () => {\n return panel.controls.map(renderControl);\n };\n\n const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const toolbar = (\n <>\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add preset\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 6H20\" />\n <path d=\"M4 12H10\" />\n <path d=\"M15 15L21 15\" />\n <path d=\"M18 12V18\" />\n <path d=\"M4 18H10\" />\n </svg>\n </motion.button>\n\n <PresetManager\n panelId={panel.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n\n <motion.button\n className=\"dialkit-toolbar-copy\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n whileTap={{ scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span className=\"dialkit-toolbar-copy-icon-wrap\">\n <AnimatePresence initial={false} mode=\"popLayout\">\n {copied ? (\n <motion.svg\n key=\"check\"\n className=\"dialkit-toolbar-copy-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n initial={{ scale: 0.5, opacity: 0, filter: 'blur(4px)' }}\n animate={{ scale: 1, opacity: 1, filter: 'blur(0px)' }}\n exit={{ scale: 0.5, opacity: 0, filter: 'blur(4px)' }}\n transition={{ type: 'spring', visualDuration: 0.3, bounce: 0.2 }}\n >\n <path d=\"M5 12.75L10 19L19 5\" />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n className=\"dialkit-toolbar-copy-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n initial={{ scale: 0.5, opacity: 0, filter: 'blur(4px)' }}\n animate={{ scale: 1, opacity: 1, filter: 'blur(0px)' }}\n exit={{ scale: 0.5, opacity: 0, filter: 'blur(4px)' }}\n transition={{ type: 'spring', visualDuration: 0.3, bounce: 0.2 }}\n >\n <path d=\"M8 6C8 4.34315 9.34315 3 11 3H13C14.6569 3 16 4.34315 16 6V7H8V6Z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"/>\n <path d=\"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\" fill=\"currentColor\"/>\n <path d=\"M16 5H17C18.6569 5 20 6.34315 20 8V11M8 5H7C5.34315 5 4 6.34315 4 8V18C4 19.6569 5.34315 21 7 21H12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n Copy\n </motion.button>\n </>\n );\n\n return (\n <div className=\"dialkit-panel-wrapper\">\n <Folder title={panel.name} defaultOpen={defaultOpen} isRoot={true} inline={inline} onOpenChange={setIsPanelOpen} toolbar={toolbar}>\n {renderControls()}\n </Folder>\n </div>\n );\n}\n","import { useState, useRef, useEffect, ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\n\ninterface FolderProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n isRoot?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: ReactNode;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = false, inline = false, onOpenChange, toolbar }: FolderProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isCollapsed, setIsCollapsed] = useState(!defaultOpen);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n\n // Track content height for explicit panel sizing (no height: 'auto')\n useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n if (isOpen) {\n const h = el.offsetHeight;\n setContentHeight(prev => prev === h ? prev : h);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen]);\n\n const handleToggle = () => {\n if (inline && isRoot) return;\n const next = !isOpen;\n setIsOpen(next);\n if (next) {\n setIsCollapsed(false);\n } else {\n setIsCollapsed(true);\n }\n onOpenChange?.(next);\n };\n\n const folderContent = (\n <div ref={isRoot ? contentRef : undefined} className={`dialkit-folder ${isRoot ? 'dialkit-folder-root' : ''}`}>\n <div className={`dialkit-folder-header ${isRoot ? 'dialkit-panel-header' : ''}`} onClick={handleToggle}>\n <div className=\"dialkit-folder-header-top\">\n {isRoot ? (\n isOpen && (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title dialkit-folder-title-root\">\n {title}\n </span>\n </div>\n )\n ) : (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title\">\n {title}\n </span>\n </div>\n )}\n {isRoot && !inline && (\n <svg\n className=\"dialkit-panel-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path opacity=\"0.5\" d=\"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\" fill=\"currentColor\"/>\n <circle cx=\"6\" cy=\"8\" r=\"0.998596\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n <circle cx=\"10.4999\" cy=\"3.5\" r=\"0.998657\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n <circle cx=\"9.75015\" cy=\"12.5\" r=\"0.997986\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n </svg>\n )}\n {!isRoot && (\n <motion.svg\n className=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n initial={false}\n animate={{ rotate: isOpen ? 0 : 180 }}\n transition={{ type: 'spring', visualDuration: 0.35, bounce: 0.15 }}\n >\n <path d=\"M6 9.5L12 15.5L18 9.5\" />\n </motion.svg>\n )}\n </div>\n\n {isRoot && toolbar && isOpen && (\n <div className=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={isRoot ? undefined : { height: 0, opacity: 0 }}\n animate={isRoot ? undefined : { height: 'auto', opacity: 1 }}\n exit={isRoot ? undefined : { height: 0, opacity: 0 }}\n transition={isRoot ? undefined : { type: 'spring', visualDuration: 0.35, bounce: 0.1 }}\n style={isRoot ? undefined : { clipPath: 'inset(0 -20px)' }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n if (isRoot) {\n if (inline) {\n return (\n <div className=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent}\n </div>\n );\n }\n\n const panelStyle = isOpen\n ? { width: 280, height: contentHeight !== undefined ? contentHeight + 24 : 'auto' as const, borderRadius: 14, boxShadow: '0 8px 32px rgba(0, 0, 0, 0.5)', cursor: undefined as string | undefined }\n : { width: 42, height: 42, borderRadius: 21, boxShadow: '0 4px 16px rgba(0, 0, 0, 0.25)', overflow: 'hidden' as const, cursor: 'pointer' as const };\n\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n style={panelStyle}\n onClick={!isOpen ? handleToggle : undefined}\n data-collapsed={isCollapsed}\n whileTap={!isOpen ? { scale: 0.9 } : undefined}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n {folderContent}\n </motion.div>\n );\n }\n\n return folderContent;\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { motion, useMotionValue, useTransform, animate } from 'motion/react';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nfunction 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\nfunction roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nfunction 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\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 1,\n step = 0.01,\n unit,\n}: SliderProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const valueSpanRef = useRef<HTMLSpanElement>(null);\n const [isInteracting, setIsInteracting] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isValueHovered, setIsValueHovered] = useState(false);\n const [isValueEditable, setIsValueEditable] = useState(false);\n const [showInput, setShowInput] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Click-vs-drag detection refs\n const pointerDownPos = useRef<{ x: number; y: number } | null>(null);\n const isClickRef = useRef(true);\n const animRef = useRef<ReturnType<typeof animate> | null>(null);\n const wrapperRectRef = useRef<DOMRect | null>(null);\n const scaleRef = useRef(1);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const isActive = isInteracting || isHovered;\n\n // Motion values for imperative animation\n const fillPercent = useMotionValue(percentage);\n const fillWidth = useTransform(fillPercent, (pct) => `${pct}%`);\n const handleLeft = useTransform(fillPercent, (pct) =>\n `max(5px, calc(${pct}% - 9px))`\n );\n\n // Rubber band motion values\n const rubberStretchPx = useMotionValue(0);\n const rubberBandWidth = useTransform(\n rubberStretchPx,\n (stretch) => `calc(100% + ${Math.abs(stretch)}px)`\n );\n const rubberBandX = useTransform(\n rubberStretchPx,\n (stretch) => (stretch < 0 ? stretch : 0)\n );\n\n // Sync from props when not interacting (skip if spring animation is active)\n useEffect(() => {\n if (!isInteracting && !animRef.current) {\n fillPercent.jump(percentage);\n }\n }, [percentage, isInteracting, fillPercent]);\n\n const positionToValue = useCallback(\n (clientX: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return value;\n const screenX = clientX - rect.left;\n const sceneX = screenX / scaleRef.current;\n const nativeWidth = wrapperRef.current ? wrapperRef.current.offsetWidth : rect.width;\n const percent = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min + percent * (max - min);\n return Math.max(min, Math.min(max, rawValue));\n },\n [min, max, value]\n );\n\n const percentFromValue = useCallback(\n (v: number) => ((v - min) / (max - min)) * 100,\n [min, max]\n );\n\n const computeRubberStretch = useCallback(\n (clientX: number, sign: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return 0;\n const distancePast =\n sign < 0 ? rect.left - clientX : clientX - rect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return (\n sign *\n MAX_STRETCH *\n Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0))\n );\n },\n []\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (showInput) return;\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos.current = { x: e.clientX, y: e.clientY };\n isClickRef.current = true;\n setIsInteracting(true);\n\n // Capture wrapper rect at pointer down for stable reference\n if (wrapperRef.current) {\n wrapperRectRef.current = wrapperRef.current.getBoundingClientRect();\n const nativeWidth = wrapperRef.current.offsetWidth;\n scaleRef.current = wrapperRectRef.current.width / nativeWidth;\n }\n },\n [showInput]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting || !pointerDownPos.current) return;\n\n const dx = e.clientX - pointerDownPos.current.x;\n const dy = e.clientY - pointerDownPos.current.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickRef.current && distance > CLICK_THRESHOLD) {\n isClickRef.current = false;\n setIsDragging(true);\n }\n\n if (!isClickRef.current) {\n // Drag mode — instant update\n const rect = wrapperRectRef.current;\n if (rect) {\n if (e.clientX < rect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > rect.right) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const newValue = positionToValue(e.clientX);\n const newPct = percentFromValue(newValue);\n if (animRef.current) {\n animRef.current.stop();\n animRef.current = null;\n }\n fillPercent.jump(newPct);\n onChange(roundValue(newValue, step));\n }\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n fillPercent,\n rubberStretchPx,\n computeRubberStretch,\n ]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting) return;\n\n if (isClickRef.current) {\n // When steps are coarse (≤10 positions), click snaps to the nearest step.\n // Otherwise, the original decile-magnetic behavior is preserved\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max - min) / step;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min, Math.min(max, min + Math.round((rawValue - min) / step) * step))\n : snapToDecile(rawValue, min, max);\n\n const newPct = percentFromValue(snappedValue);\n\n if (animRef.current) {\n animRef.current.stop();\n }\n animRef.current = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => { animRef.current = null; },\n });\n onChange(roundValue(snappedValue, step));\n }\n\n // Spring rubber band back\n if (rubberStretchPx.get() !== 0) {\n animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n setIsInteracting(false);\n setIsDragging(false);\n pointerDownPos.current = null;\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n min,\n max,\n fillPercent,\n rubberStretchPx,\n ]\n );\n\n // Handle value hover delay for editable state\n useEffect(() => {\n if (isValueHovered && !showInput && !isValueEditable) {\n hoverTimeoutRef.current = setTimeout(() => {\n setIsValueEditable(true);\n }, 800);\n } else if (!isValueHovered && !showInput) {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setIsValueEditable(false);\n }\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n }, [isValueHovered, showInput, isValueEditable]);\n\n // Focus input when it appears\n useEffect(() => {\n if (showInput && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [showInput]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue);\n if (!isNaN(parsed)) {\n const clamped = Math.max(min, Math.min(max, parsed));\n onChange(roundValue(clamped, step));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: React.MouseEvent) => {\n if (isValueEditable) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(value.toFixed(decimalsForStep(step)));\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleInputSubmit();\n } else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const handleInputBlur = () => {\n handleInputSubmit();\n };\n\n const displayValue = value.toFixed(decimalsForStep(step));\n\n // Handle opacity: not active → 0, active → 0.5, dragging → 0.9\n // Value dodge: fade when handle overlaps label (left) or value (right)\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n let leftThreshold = 30;\n let rightThreshold = 78;\n const trackWidth = wrapperRef.current?.offsetWidth;\n if (trackWidth && trackWidth > 0) {\n if (labelRef.current) {\n leftThreshold = ((LABEL_CSS_LEFT + labelRef.current.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n if (valueSpanRef.current) {\n rightThreshold = ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.current.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n }\n const valueDodge = percentage < leftThreshold || percentage > rightThreshold;\n const handleOpacity = !isActive\n ? 0\n : valueDodge\n ? 0.1\n : isDragging\n ? 0.9\n : 0.5;\n\n const fillBackground = isActive\n ? 'rgba(255, 255, 255, 0.15)'\n : 'rgba(255, 255, 255, 0.11)';\n\n // The ≤ 10 threshold separates discrete sliders\n // (like step=2 on a 0–10 range → 5 steps) from continuous ones.\n const discreteSteps = (max - min) / step;\n const hashMarks = discreteSteps <= 10\n ? Array.from({ length: discreteSteps - 1 }, (_, i) => {\n const pct = ((i + 1) * step) / (max - min) * 100;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n })\n : Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"dialkit-slider-wrapper\">\n <motion.div\n ref={trackRef}\n className={`dialkit-slider ${isActive ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ width: rubberBandWidth, x: rubberBandX }}\n >\n <div className=\"dialkit-slider-hashmarks\">{hashMarks}</div>\n\n <motion.div\n className=\"dialkit-slider-fill\"\n style={{\n background: fillBackground,\n width: fillWidth,\n transition: 'background 0.15s',\n }}\n />\n\n <motion.div\n className=\"dialkit-slider-handle\"\n style={{\n left: handleLeft,\n y: '-50%',\n background: 'rgba(255, 255, 255, 0.9)',\n }}\n animate={{\n opacity: handleOpacity,\n scaleX: isActive ? 1 : 0.25,\n scaleY: isActive && valueDodge ? 0.75 : 1,\n }}\n transition={{\n scaleX: { type: 'spring', visualDuration: 0.25, bounce: 0.15 },\n scaleY: { type: 'spring', visualDuration: 0.2, bounce: 0.1 },\n opacity: { duration: 0.15 },\n }}\n />\n\n <span ref={labelRef} className=\"dialkit-slider-label\">{label}</span>\n\n {showInput ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dialkit-slider-input\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputBlur}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n className={`dialkit-slider-value ${isValueEditable ? 'dialkit-slider-value-editable' : ''}`}\n onMouseEnter={() => setIsValueHovered(true)}\n onMouseLeave={() => setIsValueHovered(false)}\n onClick={handleValueClick}\n onMouseDown={(e) => isValueEditable && e.stopPropagation()}\n style={{ cursor: isValueEditable ? 'text' : 'default' }}\n >\n {displayValue}\n </span>\n )}\n </motion.div>\n </div>\n );\n}\n","import { useRef, useState, useLayoutEffect } from 'react';\nimport { motion } from 'motion/react';\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: SegmentedControlProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const buttonRefs = useRef<Map<T, HTMLButtonElement>>(new Map());\n const [pillStyle, setPillStyle] = useState<{ left: number; width: number } | null>(null);\n const hasAnimated = useRef(false);\n\n useLayoutEffect(() => {\n const button = buttonRefs.current.get(value);\n const container = containerRef.current;\n if (button && container) {\n const containerRect = container.getBoundingClientRect();\n const buttonRect = button.getBoundingClientRect();\n setPillStyle({\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n });\n }\n }, [value]);\n\n return (\n <div ref={containerRef} className=\"dialkit-segmented\">\n {pillStyle && (\n <motion.div\n className=\"dialkit-segmented-pill\"\n style={{ left: pillStyle.left, width: pillStyle.width }}\n animate={{ left: pillStyle.left, width: pillStyle.width }}\n transition={\n hasAnimated.current\n ? { type: 'spring', visualDuration: 0.2, bounce: 0.15 }\n : { duration: 0 }\n }\n onAnimationComplete={() => { hasAnimated.current = true; }}\n />\n )}\n\n {options.map((option) => {\n const isActive = value === option.value;\n return (\n <button\n key={option.value}\n ref={(el) => { if (el) buttonRefs.current.set(option.value, el); }}\n onClick={() => onChange(option.value)}\n className=\"dialkit-segmented-button\"\n data-active={String(isActive)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { SegmentedControl } from './SegmentedControl';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}\n\nexport function Toggle({ label, checked, onChange }: ToggleProps) {\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">{label}</span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={checked ? 'on' : 'off'}\n onChange={(val) => onChange(val === 'on')}\n />\n </div>\n );\n}\n","import { SpringConfig } from '../store/DialStore';\n\ninterface SpringVisualizationProps {\n spring: SpringConfig;\n isSimpleMode: boolean;\n}\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++) {\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 function SpringVisualization({ spring, isSimpleMode }: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (isSimpleMode) {\n const visualDuration = spring.visualDuration ?? 0.3;\n const bounce = spring.bounce ?? 0.2;\n mass = 1;\n\n stiffness = (2 * Math.PI) / visualDuration;\n stiffness = Math.pow(stiffness, 2);\n\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = spring.stiffness ?? 400;\n damping = spring.damping ?? 17;\n mass = spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\n\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n const pathData = points\n .map(([time, value], i) => {\n const x = (time / duration) * width;\n const normalizedValue = (value - minValue) / (valueRange || 1);\n const y = height - (normalizedValue * height * 0.6 + height * 0.2);\n return `${i === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n\n const gridLines = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n gridLines.push(\n <line key={`v-${i}`} x1={x} y1={0} x2={x} y2={height} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />,\n <line key={`h-${i}`} x1={0} y1={y} x2={width} y2={y} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} className=\"dialkit-spring-viz\">\n {gridLines}\n <line\n x1={0}\n y1={height / 2}\n x2={width}\n y2={height / 2}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n <path\n d={pathData}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SpringConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { useSyncExternalStore } from 'react';\n\ninterface SpringControlProps {\n panelId: string;\n path: string;\n label: string;\n spring: SpringConfig;\n onChange: (spring: SpringConfig) => void;\n}\n\nexport function SpringControl({ panelId, path, label, spring, onChange }: SpringControlProps) {\n const mode = useSyncExternalStore(\n (cb) => DialStore.subscribe(panelId, cb),\n () => DialStore.getSpringMode(panelId, path),\n () => DialStore.getSpringMode(panelId, path)\n );\n\n const isSimpleMode = mode === 'simple';\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n DialStore.updateSpringMode(panelId, path, newMode);\n\n // When switching modes, update the spring config to remove conflicting properties\n if (newMode === 'simple') {\n // Remove physics properties, keep/add time-based properties\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({\n ...rest,\n type: 'spring',\n visualDuration: spring.visualDuration ?? 0.3,\n bounce: spring.bounce ?? 0.2,\n });\n } else {\n // Remove time-based properties, keep/add physics properties\n const { visualDuration, bounce, ...rest } = spring;\n onChange({\n ...rest,\n type: 'spring',\n stiffness: spring.stiffness ?? 200,\n damping: spring.damping ?? 25,\n mass: spring.mass ?? 1,\n });\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n // When updating in simple mode, ensure physics props are removed\n if (isSimpleMode) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n } else {\n // When updating in physics mode, ensure time-based props are removed\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <SpringVisualization spring={spring} isSimpleMode={isSimpleMode} />\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isSimpleMode ? (\n <>\n <Slider\n label=\"Duration\"\n value={spring.visualDuration ?? 0.3}\n onChange={(v) => handleUpdate('visualDuration', v)}\n min={0.1}\n max={1}\n step={0.05}\n unit=\"s\"\n />\n <Slider\n label=\"Bounce\"\n value={spring.bounce ?? 0.2}\n onChange={(v) => handleUpdate('bounce', v)}\n min={0}\n max={1}\n step={0.05}\n />\n </>\n ) : (\n <>\n <Slider\n label=\"Stiffness\"\n value={spring.stiffness ?? 400}\n onChange={(v) => handleUpdate('stiffness', v)}\n min={1}\n max={1000}\n step={10}\n />\n <Slider\n label=\"Damping\"\n value={spring.damping ?? 17}\n onChange={(v) => handleUpdate('damping', v)}\n min={1}\n max={100}\n step={1}\n />\n <Slider\n label=\"Mass\"\n value={spring.mass ?? 1}\n onChange={(v) => handleUpdate('mass', v)}\n min={0.1}\n max={10}\n step={0.1}\n />\n </>\n )}\n </div>\n </Folder>\n );\n}\n","import { EasingConfig } from '../store/DialStore';\n\ninterface EasingVisualizationProps {\n easing: EasingConfig;\n}\n\nconst easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization({ easing }: EasingVisualizationProps) {\n const ease = easing.ease;\n\n const s = 200;\n const pad = 10;\n const inner = s - pad * 2;\n const unit = inner / 2; // [-0.5, 1.5] = 2 units on each axis\n\n // Equal scaling on both axes → 45° diagonal. [0,1] centered in [-0.5, 1.5].\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(ease[0], ease[1]);\n const p2 = toSvg(ease[2], ease[3]);\n\n const curvePath = `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n\n return (\n <svg\n viewBox={`0 0 ${s} ${s}`}\n preserveAspectRatio=\"xMidYMid slice\"\n className=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x} y1={start.y} x2={end.x} y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n\n <path d={curvePath} fill=\"none\" stroke=\"rgba(255, 255, 255, 0.6)\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport { easingPresets };\n","import { SpringConfig, EasingConfig, TransitionConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\nimport { useSyncExternalStore, useState } from 'react';\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl({ panelId, path, label, value, onChange }: TransitionControlProps) {\n const mode = useSyncExternalStore(\n (cb) => DialStore.subscribe(panelId, cb),\n () => DialStore.getTransitionMode(panelId, path),\n () => DialStore.getTransitionMode(panelId, path)\n );\n\n const isEasing = mode === 'easing';\n const isSimpleSpring = mode === 'simple';\n\n const spring: SpringConfig = value.type === 'spring' ? value : { type: 'spring', visualDuration: 0.3, bounce: 0.2 };\n const easing: EasingConfig = value.type === 'easing' ? value : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] };\n\n const handleModeChange = (newMode: CurveMode) => {\n DialStore.updateTransitionMode(panelId, path, newMode);\n\n if (newMode === 'easing') {\n const duration = value.type === 'spring' ? (value.visualDuration ?? 0.3) : (value as EasingConfig).duration;\n onChange({ type: 'easing', duration, ease: easing.ease });\n } else if (newMode === 'simple') {\n onChange({\n type: 'spring',\n visualDuration: spring.visualDuration ?? (value.type === 'easing' ? value.duration : 0.3),\n bounce: spring.bounce ?? 0.2,\n });\n } else {\n onChange({\n type: 'spring',\n stiffness: spring.stiffness ?? 200,\n damping: spring.damping ?? 25,\n mass: spring.mass ?? 1,\n });\n }\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, val: number) => {\n if (isSimpleSpring) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n } else {\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n }\n };\n\n const updateEase = (index: number, val: number) => {\n const newEase = [...easing.ease] as [number, number, number, number];\n newEase[index] = val;\n onChange({ ...easing, ease: newEase });\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {isEasing ? (\n <EasingVisualization easing={easing} />\n ) : (\n <SpringVisualization spring={spring} isSimpleMode={isSimpleSpring} />\n )}\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing' as const, label: 'Easing' },\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isEasing ? (\n <>\n <Slider label=\"x1\" value={easing.ease[0]} onChange={(v) => updateEase(0, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing.ease[1]} onChange={(v) => updateEase(1, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing.ease[2]} onChange={(v) => updateEase(2, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing.ease[3]} onChange={(v) => updateEase(3, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"Duration\" value={easing.duration} onChange={(v) => onChange({ ...easing, duration: v })} min={0.1} max={2} step={0.05} unit=\"s\" />\n <EaseTextInput ease={easing.ease} onChange={(newEase) => onChange({ ...easing, ease: newEase })} />\n </>\n ) : isSimpleSpring ? (\n <>\n <Slider label=\"Duration\" value={spring.visualDuration ?? 0.3} onChange={(v) => handleSpringUpdate('visualDuration', v)} min={0.1} max={1} step={0.05} unit=\"s\" />\n <Slider label=\"Bounce\" value={spring.bounce ?? 0.2} onChange={(v) => handleSpringUpdate('bounce', v)} min={0} max={1} step={0.05} />\n </>\n ) : (\n <>\n <Slider label=\"Stiffness\" value={spring.stiffness ?? 400} onChange={(v) => handleSpringUpdate('stiffness', v)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring.damping ?? 17} onChange={(v) => handleSpringUpdate('damping', v)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring.mass ?? 1} onChange={(v) => handleSpringUpdate('mass', v)} min={0.1} max={10} step={0.1} />\n </>\n )}\n </div>\n </Folder>\n );\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map(v => parseFloat(v.toFixed(2))).join(', ');\n}\n\nfunction parseEase(str: string): [number, number, number, number] | null {\n const parts = str.split(',').map(s => parseFloat(s.trim()));\n if (parts.length === 4 && parts.every(n => !isNaN(n))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nfunction EaseTextInput({ ease, onChange }: { ease: [number, number, number, number]; onChange: (ease: [number, number, number, number]) => void }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const handleFocus = () => {\n setDraft(formatEase(ease));\n setEditing(true);\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft);\n if (parsed) onChange(parsed);\n setEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={editing ? draft : formatEase(ease)}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n />\n </div>\n );\n}\n","interface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl({ label, value, onChange, placeholder }: TextControlProps) {\n return (\n <div className=\"dialkit-text-control\">\n <label className=\"dialkit-text-label\">{label}</label>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl({ label, value, options, onChange }: SelectControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n const [pos, setPos] = useState<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const normalized = normalizeOptions(options);\n const selectedOption = normalized.find((o) => o.value === value);\n\n const updatePos = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n // Estimate dropdown height: 8px padding + 36px per option\n const dropdownHeight = 8 + normalized.length * 36;\n const spaceBelow = window.innerHeight - rect.bottom - 4;\n const above = spaceBelow < dropdownHeight && rect.top > spaceBelow;\n setPos({\n top: above ? rect.top - 4 : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n above,\n });\n }, [normalized.length]);\n\n // Resolve portal target (closest .dialkit-root)\n useEffect(() => {\n const root = triggerRef.current?.closest('.dialkit-root') as HTMLElement | null;\n setPortalTarget(root ?? document.body);\n }, []);\n\n // Position dropdown when opening\n useEffect(() => {\n if (!isOpen) return;\n updatePos();\n }, [isOpen, updatePos]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n dropdownRef.current && !dropdownRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n return (\n <div className=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n className=\"dialkit-select-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n data-open={String(isOpen)}\n >\n <span className=\"dialkit-select-label\">{label}</span>\n <div className=\"dialkit-select-right\">\n <span className=\"dialkit-select-value\">{selectedOption?.label ?? value}</span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d=\"M6 9.5L12 15.5L18 9.5\" />\n </motion.svg>\n </div>\n </button>\n\n {portalTarget && createPortal(\n <AnimatePresence>\n {isOpen && pos && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-select-dropdown\"\n initial={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n style={{\n position: 'fixed',\n left: pos.left,\n width: pos.width,\n ...(pos.above\n ? { bottom: window.innerHeight - pos.top, transformOrigin: 'bottom' }\n : { top: pos.top, transformOrigin: 'top' }),\n }}\n >\n {normalized.map((option) => (\n <button\n key={option.value}\n className=\"dialkit-select-option\"\n data-selected={String(option.value === value)}\n onClick={() => {\n onChange(option.value);\n setIsOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n portalTarget\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\n\ninterface ColorControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\n\nexport function ColorControl({ label, value, onChange }: ColorControlProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const colorInputRef = useRef<HTMLInputElement>(null);\n\n // Sync editValue when value changes externally\n useEffect(() => {\n if (!isEditing) {\n setEditValue(value);\n }\n }, [value, isEditing]);\n\n function handleTextSubmit() {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue)) {\n onChange(editValue);\n } else {\n setEditValue(value);\n }\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleTextSubmit();\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(value);\n }\n }\n\n return (\n <div className=\"dialkit-color-control\">\n <span className=\"dialkit-color-label\">{label}</span>\n <div className=\"dialkit-color-inputs\">\n {isEditing ? (\n <input\n type=\"text\"\n className=\"dialkit-color-hex-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autoFocus\n />\n ) : (\n <span\n className=\"dialkit-color-hex\"\n onClick={() => setIsEditing(true)}\n >\n {(value ?? '').toUpperCase()}\n </span>\n )}\n <button\n className=\"dialkit-color-swatch\"\n style={{ backgroundColor: value }}\n onClick={() => colorInputRef.current?.click()}\n title=\"Pick color\"\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n className=\"dialkit-color-picker-native\"\n value={value.length === 4 ? expandShorthandHex(value) : value.slice(0, 7)}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n );\n}\n\nfunction expandShorthandHex(hex: string): string {\n if (hex.length !== 4) return hex;\n return `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, Preset } from '../store/DialStore';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager({ panelId, presets, activePresetId, onAdd }: PresetManagerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, left: 0, width: 0 });\n\n const hasPresets = presets.length > 0;\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n const open = useCallback(() => {\n if (!hasPresets) return;\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }\n setIsOpen(true);\n }, [hasPresets]);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on any mousedown outside trigger + dropdown\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(panelId, presetId);\n } else {\n DialStore.clearActivePreset(panelId);\n }\n close();\n };\n\n const handleDelete = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(panelId, presetId);\n };\n\n return (\n <div className=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n className=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(isOpen)}\n data-has-preset={String(!!activePreset)}\n data-disabled={String(!hasPresets)}\n >\n <span className=\"dialkit-preset-label\">\n {activePreset ? activePreset.name : 'Version 1'}\n </span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0, opacity: hasPresets ? 0.6 : 0.25 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d=\"M6 9.5L12 15.5L18 9.5\" />\n </motion.svg>\n </button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-preset-dropdown\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, minWidth: pos.width }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div\n className=\"dialkit-preset-item\"\n data-active={String(!activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span className=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n {presets.map((preset) => (\n <div\n key={preset.id}\n className=\"dialkit-preset-item\"\n data-active={String(preset.id === activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span className=\"dialkit-preset-name\">{preset.name}</span>\n <button\n className=\"dialkit-preset-delete\"\n onClick={(e) => handleDelete(e, preset.id)}\n title=\"Delete preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"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 <path d=\"M10 11V16\" />\n <path d=\"M14 11V16\" />\n <path d=\"M3.5 6H20.5\" />\n <path d=\"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 </svg>\n </button>\n </div>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </div>\n );\n}\n","interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup({ buttons }: ButtonGroupProps) {\n return (\n <div className=\"dialkit-button-group\">\n {buttons.map((button, index) => (\n <button\n key={index}\n className=\"dialkit-button\"\n onClick={button.onClick}\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useState","createPortal","useState","useSyncExternalStore","motion","AnimatePresence","useRef","useEffect","useRef","useState","useEffect","motion","jsx","jsxs","discreteSteps","useRef","useState","motion","jsx","jsxs","jsx","jsxs","jsx","jsxs","useSyncExternalStore","jsx","jsxs","jsx","jsxs","jsxs","jsx","useSyncExternalStore","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","motion","AnimatePresence","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","createPortal","motion","AnimatePresence","jsx","jsxs","useState","useRef","useCallback","useEffect","motion","createPortal","AnimatePresence","Fragment","jsx","jsxs","useState","useSyncExternalStore","motion","AnimatePresence","jsx","useState","useEffect","createPortal","jsx"]}
1
+ {"version":3,"sources":["../src/hooks/useDialKit.ts","../src/store/DialStore.ts","../src/components/DialRoot.tsx","../src/components/Panel.tsx","../src/components/ShortcutListener.tsx","../src/shortcut-utils.ts","../src/icons.ts","../src/components/Folder.tsx","../src/components/Slider.tsx","../src/components/SegmentedControl.tsx","../src/components/Toggle.tsx","../src/components/SpringVisualization.tsx","../src/components/SpringControl.tsx","../src/components/EasingVisualization.tsx","../src/components/TransitionControl.tsx","../src/components/TextControl.tsx","../src/components/SelectControl.tsx","../src/components/ColorControl.tsx","../src/components/PresetManager.tsx","../src/components/ButtonGroup.tsx","../src/components/ShortcutsMenu.tsx"],"sourcesContent":["import { useEffect, useId, useSyncExternalStore, useRef } from 'react';\nimport { DialStore, DialConfig, DialValue, ResolvedValues, SpringConfig, EasingConfig, SelectConfig, ColorConfig, TextConfig, ActionConfig, ShortcutConfig } from '../store/DialStore';\n\nexport interface UseDialOptions {\n onAction?: (action: string) => void;\n shortcuts?: Record<string, ShortcutConfig>;\n}\n\nexport function useDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: UseDialOptions\n): ResolvedValues<T> {\n const instanceId = useId();\n const panelId = `${name}-${instanceId}`;\n const configRef = useRef(config);\n const serializedConfig = JSON.stringify(config);\n configRef.current = config;\n const onActionRef = useRef(options?.onAction);\n onActionRef.current = options?.onAction;\n const shortcutsRef = useRef(options?.shortcuts);\n shortcutsRef.current = options?.shortcuts;\n const serializedShortcuts = JSON.stringify(options?.shortcuts);\n\n // Register panel on mount\n useEffect(() => {\n DialStore.registerPanel(panelId, name, configRef.current, shortcutsRef.current);\n return () => DialStore.unregisterPanel(panelId);\n }, [panelId, name]);\n\n // Update panel when config structure or shortcuts change\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n DialStore.updatePanel(panelId, name, configRef.current, shortcutsRef.current);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelId, name, serializedConfig, serializedShortcuts]);\n\n // Subscribe to action events\n useEffect(() => {\n return DialStore.subscribeActions(panelId, (action) => {\n onActionRef.current?.(action);\n });\n }, [panelId]);\n\n // Subscribe to changes\n // DialStore.getValues returns a stable empty object when panel not registered\n const values = useSyncExternalStore(\n (callback) => DialStore.subscribe(panelId, callback),\n () => DialStore.getValues(panelId),\n () => DialStore.getValues(panelId)\n );\n\n // Build resolved values object\n return buildResolvedValues(config, values, '') as ResolvedValues<T>;\n}\n\nfunction buildResolvedValues(\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 // Range tuple\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 (isSpringConfig(configValue) || isEasingConfig(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfig(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfig(configValue)) {\n // Select config resolves to string value\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfig(configValue)) {\n // Color config resolves to string value\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfig(configValue)) {\n // Text config resolves to string value\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n // Nested object\n result[key] = buildResolvedValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\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\nfunction isSpringConfig(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nfunction isEasingConfig(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nfunction isActionConfig(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfig(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfig(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfig(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 return typeof first === 'string' ? first : first.value;\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 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};\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\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\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\n registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>): void {\n const controls = this.parseConfig(config, '', shortcuts);\n const values = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', values);\n\n this.panels.set(id, { id, name, controls, values, shortcuts: shortcuts ?? {} });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, { ...values });\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>): void {\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config, shortcuts);\n return;\n }\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n nextValues[path] = this.normalizePreservedValue(\n existing.values[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n // Set mode defaults for new transition controls first.\n this.initTransitionModes(config, '', nextValues);\n\n for (const [path, mode] of Object.entries(existing.values)) {\n if (!path.endsWith('.__mode')) {\n continue;\n }\n\n const transitionPath = path.slice(0, -'__mode'.length - 1);\n const transitionControl = controlsByPath.get(transitionPath);\n if (transitionControl?.type === 'transition') {\n nextValues[path] = mode;\n }\n }\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues, shortcuts: shortcuts ?? existing.shortcuts };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues: Record<string, DialValue> = {};\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n nextBaseValues[path] = this.normalizePreservedValue(\n previousBaseValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\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\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n this.panels.delete(id);\n this.listeners.delete(id);\n this.snapshots.delete(id);\n this.actionListeners.delete(id);\n this.baseValues.delete(id);\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[path] = value;\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) preset.values[path] = value;\n } else {\n const base = this.baseValues.get(panelId);\n if (base) base[path] = value;\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\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.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(): PanelConfig[] {\n return Array.from(this.panels.values());\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 this.listeners.get(panelId)?.delete(listener);\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 this.actionListeners.get(panelId)?.delete(listener);\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.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.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.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.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 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.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 /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n }\n\n private formatLabel(key: string): string {\n // Convert camelCase to Title Case\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\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 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\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 = new DialStoreClass();\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialStore, PanelConfig } from '../store/DialStore';\nimport { Panel } from './Panel';\nimport { ShortcutListener } from './ShortcutListener';\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\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n theme?: DialTheme;\n productionEnabled?: boolean;\n}\n\nexport function DialRoot({ position = 'top-right', defaultOpen = true, mode = 'popover', theme = 'system', productionEnabled = isDevDefault }: DialRootProps) {\n if (!productionEnabled) return null;\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [mounted, setMounted] = useState(false);\n const inline = mode === 'inline';\n\n // Drag state\n const panelRef = useRef<HTMLDivElement>(null);\n const [dragOffset, setDragOffset] = useState<{ x: number; y: number } | null>(null);\n const [activePosition, setActivePosition] = useState(position);\n const lastDragOffset = useRef<{ x: number; y: number } | null>(null);\n const draggingRef = useRef(false);\n const dragStartRef = useRef<{ pointerX: number; pointerY: number; elX: number; elY: number } | null>(null);\n const didDragRef = useRef(false);\n\n // Subscribe to global panel changes\n useEffect(() => {\n setMounted(true);\n setPanels(DialStore.getPanels());\n\n const unsubscribe = DialStore.subscribeGlobal(() => {\n setPanels(DialStore.getPanels());\n });\n\n return unsubscribe;\n }, []);\n\n // Watch for panel open/close — snap to corner on open, restore drag position on close\n useEffect(() => {\n if (!panelRef.current || inline) return;\n const observer = new MutationObserver(() => {\n const inner = panelRef.current?.querySelector('.dialkit-panel-inner');\n if (!inner) return;\n const collapsed = inner.getAttribute('data-collapsed') === 'true';\n\n if (!collapsed) {\n // Opening — save drag position, determine corner, snap\n if (dragOffset) {\n lastDragOffset.current = dragOffset;\n const bubbleCenterX = dragOffset.x + 21;\n const midX = window.innerWidth / 2;\n setActivePosition(bubbleCenterX < midX ? 'top-left' : 'top-right');\n } else {\n setActivePosition(position);\n }\n setDragOffset(null);\n } else if (lastDragOffset.current) {\n // Closing — restore the dragged position\n setDragOffset(lastDragOffset.current);\n }\n });\n observer.observe(panelRef.current, { subtree: true, attributes: true, attributeFilter: ['data-collapsed'] });\n return () => observer.disconnect();\n }, [inline, dragOffset, position]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n // Only drag the collapsed bubble\n const inner = panelRef.current?.querySelector('.dialkit-panel-inner');\n if (!inner || inner.getAttribute('data-collapsed') !== 'true') return;\n\n const rect = panelRef.current!.getBoundingClientRect();\n dragStartRef.current = {\n pointerX: e.clientX,\n pointerY: e.clientY,\n elX: rect.left,\n elY: rect.top,\n };\n didDragRef.current = false;\n draggingRef.current = true;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n }, []);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current || !dragStartRef.current) return;\n\n const dx = e.clientX - dragStartRef.current.pointerX;\n const dy = e.clientY - dragStartRef.current.pointerY;\n\n if (!didDragRef.current && Math.abs(dx) + Math.abs(dy) < 4) return;\n didDragRef.current = true;\n\n setDragOffset({\n x: dragStartRef.current.elX + dx,\n y: dragStartRef.current.elY + dy,\n });\n }, []);\n\n const handlePointerUp = useCallback((e: React.PointerEvent) => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n dragStartRef.current = null;\n\n // If we actually dragged, prevent the click from opening the panel\n if (didDragRef.current) {\n e.stopPropagation();\n const inner = panelRef.current?.querySelector('.dialkit-panel-inner');\n if (inner) {\n const blocker = (ev: Event) => { ev.stopPropagation(); };\n inner.addEventListener('click', blocker, { capture: true, once: true });\n }\n }\n }, []);\n\n // Don't render on server\n if (!mounted || typeof window === 'undefined') {\n return null;\n }\n\n // Don't render if no panels registered\n if (panels.length === 0) {\n return null;\n }\n\n const dragStyle = dragOffset ? {\n top: dragOffset.y,\n left: dragOffset.x,\n right: 'auto' as const,\n bottom: 'auto' as const,\n } : undefined;\n\n const content = (\n <ShortcutListener>\n <div className=\"dialkit-root\" data-mode={mode} data-theme={theme}>\n <div\n ref={panelRef}\n className=\"dialkit-panel\"\n data-position={inline ? undefined : (dragOffset ? undefined : activePosition)}\n data-mode={mode}\n style={dragStyle}\n onPointerDown={!inline ? handlePointerDown : undefined}\n onPointerMove={!inline ? handlePointerMove : undefined}\n onPointerUp={!inline ? handlePointerUp : undefined}\n >\n {panels.map((panel) => (\n <Panel key={panel.id} panel={panel} defaultOpen={inline || defaultOpen} inline={inline} />\n ))}\n </div>\n </div>\n </ShortcutListener>\n );\n\n if (inline) {\n return content;\n }\n\n return createPortal(content, document.body);\n}\n","import { useState, useContext, useSyncExternalStore } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, ControlMeta, PanelConfig, SpringConfig, TransitionConfig } from '../store/DialStore';\nimport { ShortcutContext } from './ShortcutListener';\nimport { ShortcutsMenu } from './ShortcutsMenu';\nimport { ICON_CLIPBOARD, ICON_CHECK, ICON_ADD_PRESET } from '../icons';\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';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n}\n\nexport function Panel({ panel, defaultOpen = true, inline = false }: PanelProps) {\n const [copied, setCopied] = useState(false);\n const [isPanelOpen, setIsPanelOpen] = useState(defaultOpen);\n const shortcutCtx = useContext(ShortcutContext);\n const hasShortcuts = Object.keys(panel.shortcuts).length > 0;\n\n // Subscribe to panel value changes\n const values = useSyncExternalStore(\n (cb) => DialStore.subscribe(panel.id, cb),\n () => DialStore.getValues(panel.id),\n () => DialStore.getValues(panel.id)\n );\n\n const presets = DialStore.getPresets(panel.id);\n const activePresetId = DialStore.getActivePresetId(panel.id);\n\n const handleAddPreset = () => {\n const nextNum = presets.length + 2;\n DialStore.savePreset(panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const jsonStr = JSON.stringify(values, null, 2);\n\n const instruction = `Update the useDialKit configuration for \"${panel.name}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the useDialKit call.`;\n\n navigator.clipboard.writeText(instruction);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const renderControl = (control: ControlMeta) => {\n const value = values[control.path];\n\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n key={control.path}\n label={control.label}\n value={value as number}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panel.id && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n key={control.path}\n label={control.label}\n checked={value as boolean}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx.activePanelId === panel.id && shortcutCtx.activePath === control.path}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n key={control.path}\n panelId={panel.id}\n path={control.path}\n label={control.label}\n spring={value as SpringConfig}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n key={control.path}\n panelId={panel.id}\n path={control.path}\n label={control.label}\n value={value as TransitionConfig}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'folder':\n return (\n <Folder key={control.path} title={control.label} defaultOpen={control.defaultOpen ?? true}>\n {control.children?.map(renderControl)}\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n key={control.path}\n label={control.label}\n value={value as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n key={control.path}\n label={control.label}\n value={value as string}\n onChange={(v) => DialStore.updateValue(panel.id, control.path, v)}\n />\n );\n\n case 'action':\n return (\n <button\n key={control.path}\n className=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(panel.id, control.path)}\n >\n {control.label}\n </button>\n );\n\n default:\n return null;\n }\n };\n\n const renderControls = () => {\n return panel.controls.map(renderControl);\n };\n\n const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const toolbar = (\n <>\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add preset\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_ADD_PRESET.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </motion.button>\n\n <PresetManager\n panelId={panel.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n\n <motion.button\n className=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <span style={{ position: 'relative', width: 16, height: 16 }}>\n <AnimatePresence initial={false} mode=\"wait\">\n {copied ? (\n <motion.svg\n key=\"check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CHECK} />\n </motion.svg>\n ) : (\n <motion.svg\n key=\"clipboard\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ position: 'absolute', inset: 0, width: 16, height: 16, color: 'var(--dial-text-label)' }}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.08 }}\n >\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"/>\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\"/>\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </motion.svg>\n )}\n </AnimatePresence>\n </span>\n </motion.button>\n\n </>\n );\n\n return (\n <div className=\"dialkit-panel-wrapper\">\n <Folder title={panel.name} defaultOpen={defaultOpen} isRoot={true} inline={inline} onOpenChange={setIsPanelOpen} toolbar={toolbar}>\n {renderControls()}\n </Folder>\n </div>\n );\n}\n","import { createContext, useEffect, useRef, useState, useCallback } from 'react';\nimport { DialStore } from '../store/DialStore';\nimport {\n getEffectiveStep,\n applySliderDelta,\n isInputFocused,\n getActiveModifier,\n findControl,\n DRAG_SENSITIVITY,\n} from '../shortcut-utils';\n\nexport const ShortcutContext = createContext<{\n activePanelId: string | null;\n activePath: string | null;\n}>({ activePanelId: null, activePath: null });\n\nexport function ShortcutListener({ children }: { children: React.ReactNode }) {\n const [activeShortcut, setActiveShortcut] = useState<{\n activePanelId: string | null;\n activePath: string | null;\n }>({ activePanelId: null, activePath: null });\n\n const activeKeysRef = useRef<Set<string>>(new Set());\n const isDraggingRef = useRef(false);\n const lastMouseXRef = useRef<number | null>(null);\n const dragAccumulatorRef = useRef(0);\n\n // Find the active target for key-based interactions (scroll, drag, move)\n const resolveActiveTarget = useCallback((interaction: string) => {\n for (const key of activeKeysRef.current) {\n // We can't get the modifier from a stored key, so we check all panels\n const panels = DialStore.getPanels();\n for (const panel of panels) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue;\n if (shortcut.key.toLowerCase() !== key) continue;\n if ((shortcut.interaction ?? 'scroll') !== interaction) continue;\n const control = findControl(panel.controls, path);\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n }, []);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isInputFocused()) return;\n\n const key = e.key.toLowerCase();\n\n // Arrow keys adjust the active shortcut's slider\n if (key === 'arrowleft' || key === 'arrowright' || key === 'arrowup' || key === 'arrowdown') {\n if (activeKeysRef.current.size > 0) {\n const target = resolveActiveTarget('scroll') || resolveActiveTarget('drag') || resolveActiveTarget('move');\n if (target && target.control.type === 'slider') {\n e.preventDefault();\n const direction = (key === 'arrowright' || key === 'arrowup') ? 1 : -1;\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, direction);\n return;\n }\n }\n }\n\n const wasAlreadyHeld = activeKeysRef.current.has(key);\n activeKeysRef.current.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n\n // Toggle: flip on first keydown only (not on key repeat)\n if (!wasAlreadyHeld && target.control.type === 'toggle') {\n const currentValue = DialStore.getValue(target.panelId, target.path) as boolean;\n DialStore.updateValue(target.panelId, target.path, !currentValue);\n }\n }\n\n // Reset mouse tracking when a new key is pressed (for move/drag)\n if (!wasAlreadyHeld) {\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeysRef.current.delete(key);\n\n // Reset drag state when key is released\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n\n if (activeKeysRef.current.size === 0) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n } else {\n let found = false;\n for (const remainingKey of activeKeysRef.current) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n setActiveShortcut({ activePanelId: target.panelId, activePath: target.path });\n found = true;\n break;\n }\n }\n if (!found) {\n setActiveShortcut({ activePanelId: null, activePath: null });\n }\n }\n };\n\n // ── Scroll: key+scroll and scroll-only ──\n const handleWheel = (e: WheelEvent) => {\n if (isInputFocused()) return;\n\n const modifier = getActiveModifier(e);\n\n // Key+scroll shortcuts\n if (activeKeysRef.current.size > 0) {\n for (const key of activeKeysRef.current) {\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (!target) continue;\n\n const { panelId, path, control } = target;\n const interaction = control.shortcut?.interaction ?? 'scroll';\n if (interaction !== 'scroll' || control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, control.shortcut!);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n }\n\n // Scroll-only shortcuts (no key needed)\n const scrollOnlyTargets = DialStore.resolveScrollOnlyTargets();\n for (const { panelId, path, control, shortcut } of scrollOnlyTargets) {\n if (control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, shortcut);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n };\n\n // ── Drag: key+mousedown starts, mousemove adjusts, mouseup stops ──\n const handleMouseDown = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDraggingRef.current = true;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n };\n\n // ── Move + Drag: mousemove handles both ──\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeysRef.current.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDraggingRef.current) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseXRef.current !== null) {\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, steps);\n }\n }\n return;\n }\n\n // Move interaction (no click needed, just key held + mouse movement)\n const moveTarget = resolveActiveTarget('move');\n if (moveTarget) {\n if (lastMouseXRef.current === null) {\n lastMouseXRef.current = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseXRef.current;\n lastMouseXRef.current = e.clientX;\n dragAccumulatorRef.current += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulatorRef.current / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulatorRef.current -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeysRef.current.clear();\n isDraggingRef.current = false;\n lastMouseXRef.current = null;\n dragAccumulatorRef.current = 0;\n setActiveShortcut({ activePanelId: null, activePath: null });\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('wheel', handleWheel, { passive: false });\n window.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('wheel', handleWheel);\n window.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [resolveActiveTarget]);\n\n return (\n <ShortcutContext.Provider value={activeShortcut}>\n {children}\n </ShortcutContext.Provider>\n );\n}","// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n","// 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_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 { useState, useRef, useEffect, ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ICON_PANEL, ICON_CHEVRON } from '../icons';\n\ninterface FolderProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n isRoot?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: ReactNode;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = false, inline = false, onOpenChange, toolbar }: FolderProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isCollapsed, setIsCollapsed] = useState(!defaultOpen);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n const [windowHeight, setWindowHeight] = useState(typeof window !== 'undefined' ? window.innerHeight : 800);\n\n useEffect(() => {\n if (!isRoot) return;\n const onResize = () => setWindowHeight(window.innerHeight);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, [isRoot]);\n\n // Track content height for explicit panel sizing (no height: 'auto')\n useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n if (isOpen) {\n const h = el.offsetHeight;\n setContentHeight(prev => prev === h ? prev : h);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen]);\n\n const handleToggle = () => {\n if (inline && isRoot) return;\n const next = !isOpen;\n setIsOpen(next);\n if (next) {\n setIsCollapsed(false);\n } else {\n setIsCollapsed(true);\n }\n onOpenChange?.(next);\n };\n\n const folderContent = (\n <div ref={isRoot ? contentRef : undefined} className={`dialkit-folder ${isRoot ? 'dialkit-folder-root' : ''}`}>\n <div className={`dialkit-folder-header ${isRoot ? 'dialkit-panel-header' : ''}`} onClick={handleToggle}>\n <div className=\"dialkit-folder-header-top\">\n {isRoot ? (\n isOpen && (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title dialkit-folder-title-root\">\n {title}\n </span>\n </div>\n )\n ) : (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title\">\n {title}\n </span>\n </div>\n )}\n {isRoot && !inline && (\n <svg\n className=\"dialkit-panel-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path opacity=\"0.5\" d={ICON_PANEL.path} fill=\"currentColor\"/>\n {ICON_PANEL.circles.map((c, i) => (\n <circle key={i} cx={c.cx} cy={c.cy} r={c.r} fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n ))}\n </svg>\n )}\n {!isRoot && (\n <motion.svg\n className=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n initial={false}\n animate={{ rotate: isOpen ? 0 : 180 }}\n transition={{ type: 'spring', visualDuration: 0.35, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n )}\n </div>\n\n {isRoot && toolbar && isOpen && (\n <div className=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={isRoot ? undefined : { height: 0, opacity: 0 }}\n animate={isRoot ? undefined : { height: 'auto', opacity: 1 }}\n exit={isRoot ? undefined : { height: 0, opacity: 0 }}\n transition={isRoot ? undefined : { type: 'spring', visualDuration: 0.35, bounce: 0.1 }}\n style={isRoot ? undefined : { clipPath: 'inset(0 -20px)' }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n if (isRoot) {\n if (inline) {\n return (\n <div className=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent}\n </div>\n );\n }\n\n const panelStyle = isOpen\n ? { width: 280, height: contentHeight !== undefined ? Math.min(contentHeight + 10, windowHeight - 32) : 'auto' as const, borderRadius: 14, boxShadow: 'var(--dial-shadow)', cursor: undefined as string | undefined, overflowY: 'auto' as const }\n : { width: 42, height: 42, borderRadius: '50%', boxSizing: 'border-box' as const, boxShadow: 'var(--dial-shadow-collapsed)', overflow: 'hidden' as const, cursor: 'pointer' as const };\n\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n style={panelStyle}\n onClick={!isOpen ? handleToggle : undefined}\n data-collapsed={isCollapsed}\n whileTap={!isOpen ? { scale: 0.9 } : undefined}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n {folderContent}\n </motion.div>\n );\n }\n\n return folderContent;\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { motion, useMotionValue, useTransform, animate } from 'motion/react';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { decimalsForStep, roundValue, snapToDecile, formatSliderShortcut } from '../shortcut-utils';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport function Slider({\n label,\n value,\n onChange,\n min = 0,\n max = 1,\n step = 0.01,\n unit,\n shortcut,\n shortcutActive,\n}: SliderProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const valueSpanRef = useRef<HTMLSpanElement>(null);\n const [isInteracting, setIsInteracting] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isValueHovered, setIsValueHovered] = useState(false);\n const [isValueEditable, setIsValueEditable] = useState(false);\n const [showInput, setShowInput] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Click-vs-drag detection refs\n const pointerDownPos = useRef<{ x: number; y: number } | null>(null);\n const isClickRef = useRef(true);\n const animRef = useRef<ReturnType<typeof animate> | null>(null);\n const wrapperRectRef = useRef<DOMRect | null>(null);\n const scaleRef = useRef(1);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const isActive = isInteracting || isHovered;\n\n // Motion values for imperative animation\n const fillPercent = useMotionValue(percentage);\n const fillWidth = useTransform(fillPercent, (pct) => `${pct}%`);\n const handleLeft = useTransform(fillPercent, (pct) =>\n `max(5px, calc(${pct}% - 9px))`\n );\n\n // Rubber band motion values\n const rubberStretchPx = useMotionValue(0);\n const rubberBandWidth = useTransform(\n rubberStretchPx,\n (stretch) => `calc(100% + ${Math.abs(stretch)}px)`\n );\n const rubberBandX = useTransform(\n rubberStretchPx,\n (stretch) => (stretch < 0 ? stretch : 0)\n );\n\n // Sync from props when not interacting (skip if spring animation is active)\n useEffect(() => {\n if (!isInteracting && !animRef.current) {\n fillPercent.jump(percentage);\n }\n }, [percentage, isInteracting, fillPercent]);\n\n const positionToValue = useCallback(\n (clientX: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return value;\n const screenX = clientX - rect.left;\n const sceneX = screenX / scaleRef.current;\n const nativeWidth = wrapperRef.current ? wrapperRef.current.offsetWidth : rect.width;\n const percent = Math.max(0, Math.min(1, sceneX / nativeWidth));\n const rawValue = min + percent * (max - min);\n return Math.max(min, Math.min(max, rawValue));\n },\n [min, max, value]\n );\n\n const percentFromValue = useCallback(\n (v: number) => ((v - min) / (max - min)) * 100,\n [min, max]\n );\n\n const computeRubberStretch = useCallback(\n (clientX: number, sign: number) => {\n const rect = wrapperRectRef.current;\n if (!rect) return 0;\n const distancePast =\n sign < 0 ? rect.left - clientX : clientX - rect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return (\n sign *\n MAX_STRETCH *\n Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0))\n );\n },\n []\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (showInput) return;\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos.current = { x: e.clientX, y: e.clientY };\n isClickRef.current = true;\n setIsInteracting(true);\n\n // Capture wrapper rect at pointer down for stable reference\n if (wrapperRef.current) {\n wrapperRectRef.current = wrapperRef.current.getBoundingClientRect();\n const nativeWidth = wrapperRef.current.offsetWidth;\n scaleRef.current = wrapperRectRef.current.width / nativeWidth;\n }\n },\n [showInput]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting || !pointerDownPos.current) return;\n\n const dx = e.clientX - pointerDownPos.current.x;\n const dy = e.clientY - pointerDownPos.current.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickRef.current && distance > CLICK_THRESHOLD) {\n isClickRef.current = false;\n setIsDragging(true);\n }\n\n if (!isClickRef.current) {\n // Drag mode — instant update\n const rect = wrapperRectRef.current;\n if (rect) {\n if (e.clientX < rect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > rect.right) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, 1));\n } else {\n rubberStretchPx.jump(0);\n }\n }\n\n const newValue = positionToValue(e.clientX);\n const newPct = percentFromValue(newValue);\n if (animRef.current) {\n animRef.current.stop();\n animRef.current = null;\n }\n fillPercent.jump(newPct);\n onChange(roundValue(newValue, step));\n }\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n fillPercent,\n rubberStretchPx,\n computeRubberStretch,\n ]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent) => {\n if (!isInteracting) return;\n\n if (isClickRef.current) {\n // When steps are coarse (≤10 positions), click snaps to the nearest step.\n // Otherwise, the original decile-magnetic behavior is preserved\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max - min) / step;\n const snappedValue = discreteSteps <= 10\n ? Math.max(min, Math.min(max, min + Math.round((rawValue - min) / step) * step))\n : snapToDecile(rawValue, min, max);\n\n const newPct = percentFromValue(snappedValue);\n\n if (animRef.current) {\n animRef.current.stop();\n }\n animRef.current = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => { animRef.current = null; },\n });\n onChange(roundValue(snappedValue, step));\n }\n\n // Spring rubber band back\n if (rubberStretchPx.get() !== 0) {\n animate(rubberStretchPx, 0, {\n type: 'spring',\n visualDuration: 0.35,\n bounce: 0.15,\n });\n }\n\n setIsInteracting(false);\n setIsDragging(false);\n pointerDownPos.current = null;\n },\n [\n isInteracting,\n positionToValue,\n percentFromValue,\n onChange,\n min,\n max,\n fillPercent,\n rubberStretchPx,\n ]\n );\n\n // Handle value hover delay for editable state\n useEffect(() => {\n if (isValueHovered && !showInput && !isValueEditable) {\n hoverTimeoutRef.current = setTimeout(() => {\n setIsValueEditable(true);\n }, 800);\n } else if (!isValueHovered && !showInput) {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setIsValueEditable(false);\n }\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n }, [isValueHovered, showInput, isValueEditable]);\n\n // Focus input when it appears\n useEffect(() => {\n if (showInput && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [showInput]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleInputSubmit = () => {\n const parsed = parseFloat(inputValue);\n if (!isNaN(parsed)) {\n const clamped = Math.max(min, Math.min(max, parsed));\n onChange(roundValue(clamped, step));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: React.MouseEvent) => {\n if (isValueEditable) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(value.toFixed(decimalsForStep(step)));\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleInputSubmit();\n } else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const handleInputBlur = () => {\n handleInputSubmit();\n };\n\n const displayValue = value.toFixed(decimalsForStep(step));\n\n // Handle opacity: not active → 0, active → 0.5, dragging → 0.9\n // Value dodge: fade when handle overlaps label (left) or value (right)\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n let leftThreshold = 30;\n let rightThreshold = 78;\n const trackWidth = wrapperRef.current?.offsetWidth;\n if (trackWidth && trackWidth > 0) {\n if (labelRef.current) {\n leftThreshold = ((LABEL_CSS_LEFT + labelRef.current.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n if (valueSpanRef.current) {\n rightThreshold = ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.current.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n }\n const valueDodge = percentage < leftThreshold || percentage > rightThreshold;\n const handleOpacity = !isActive\n ? 0\n : valueDodge\n ? 0.1\n : isDragging\n ? 0.9\n : 0.5;\n\n // The ≤ 10 threshold separates discrete sliders\n // (like step=2 on a 0–10 range → 5 steps) from continuous ones.\n const discreteSteps = (max - min) / step;\n const hashMarks = discreteSteps <= 10\n ? Array.from({ length: discreteSteps - 1 }, (_, i) => {\n const pct = ((i + 1) * step) / (max - min) * 100;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n })\n : Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return (\n <div\n key={i}\n className=\"dialkit-slider-hashmark\"\n style={{ left: `${pct}%` }}\n />\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"dialkit-slider-wrapper\">\n <motion.div\n ref={trackRef}\n className={`dialkit-slider ${isActive ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ width: rubberBandWidth, x: rubberBandX }}\n >\n <div className=\"dialkit-slider-hashmarks\">{hashMarks}</div>\n\n <motion.div\n className=\"dialkit-slider-fill\"\n style={{\n width: fillWidth,\n }}\n />\n\n <motion.div\n className=\"dialkit-slider-handle\"\n style={{\n left: handleLeft,\n y: '-50%',\n }}\n animate={{\n opacity: handleOpacity,\n scaleX: isActive ? 1 : 0.25,\n scaleY: isActive && valueDodge ? 0.75 : 1,\n }}\n transition={{\n scaleX: { type: 'spring', visualDuration: 0.25, bounce: 0.15 },\n scaleY: { type: 'spring', visualDuration: 0.2, bounce: 0.1 },\n opacity: { duration: 0.15 },\n }}\n />\n\n <span ref={labelRef} className=\"dialkit-slider-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatSliderShortcut(shortcut)}\n </span>\n )}\n </span>\n\n {showInput ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dialkit-slider-input\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputBlur}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n className={`dialkit-slider-value ${isValueEditable ? 'dialkit-slider-value-editable' : ''}`}\n onMouseEnter={() => setIsValueHovered(true)}\n onMouseLeave={() => setIsValueHovered(false)}\n onClick={handleValueClick}\n onMouseDown={(e) => isValueEditable && e.stopPropagation()}\n style={{ cursor: isValueEditable ? 'text' : 'default' }}\n >\n {displayValue}\n </span>\n )}\n </motion.div>\n </div>\n );\n}\n","import { useRef, useState, useLayoutEffect, useCallback } from 'react';\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: SegmentedControlProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const hasAnimated = useRef(false);\n const [pillStyle, setPillStyle] = useState<{ left: number; width: number } | null>(null);\n\n const measure = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n const activeButton = container.querySelector('[data-active=\"true\"]') as HTMLElement | null;\n if (!activeButton) return;\n setPillStyle({\n left: activeButton.offsetLeft,\n width: activeButton.offsetWidth,\n });\n }, []);\n\n useLayoutEffect(() => {\n measure();\n }, [value, options.length, measure]);\n\n // Enable transition after first render\n const shouldAnimate = hasAnimated.current;\n hasAnimated.current = true;\n\n return (\n <div className=\"dialkit-segmented\" ref={containerRef}>\n {pillStyle && (\n <div\n className=\"dialkit-segmented-pill\"\n style={{\n left: pillStyle.left,\n width: pillStyle.width,\n transition: shouldAnimate\n ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'\n : 'none',\n }}\n />\n )}\n\n {options.map((option) => {\n const isActive = value === option.value;\n return (\n <button\n key={option.value}\n onClick={() => onChange(option.value)}\n className=\"dialkit-segmented-button\"\n data-active={String(isActive)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../store/DialStore';\nimport { formatToggleShortcut } from '../shortcut-utils';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nexport function Toggle({ label, checked, onChange, shortcut, shortcutActive }: ToggleProps) {\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">\n {label}\n {shortcut && (\n <span className={`dialkit-shortcut-pill${shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatToggleShortcut(shortcut)}\n </span>\n )}\n </span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={checked ? 'on' : 'off'}\n onChange={(val) => onChange(val === 'on')}\n />\n </div>\n );\n}\n","import { SpringConfig } from '../store/DialStore';\n\ninterface SpringVisualizationProps {\n spring: SpringConfig;\n isSimpleMode: boolean;\n}\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++) {\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 function SpringVisualization({ spring, isSimpleMode }: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (isSimpleMode) {\n const visualDuration = spring.visualDuration ?? 0.3;\n const bounce = spring.bounce ?? 0.2;\n mass = 1;\n\n stiffness = (2 * Math.PI) / visualDuration;\n stiffness = Math.pow(stiffness, 2);\n\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = spring.stiffness ?? 400;\n damping = spring.damping ?? 17;\n mass = spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\n\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n const pathData = points\n .map(([time, value], i) => {\n const x = (time / duration) * width;\n const normalizedValue = (value - minValue) / (valueRange || 1);\n const y = height - (normalizedValue * height * 0.6 + height * 0.2);\n return `${i === 0 ? 'M' : 'L'} ${x} ${y}`;\n })\n .join(' ');\n\n const gridLines = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n gridLines.push(\n <line key={`v-${i}`} x1={x} y1={0} x2={x} y2={height} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />,\n <line key={`h-${i}`} x1={0} y1={y} x2={width} y2={y} stroke=\"rgba(255, 255, 255, 0.08)\" strokeWidth=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} className=\"dialkit-spring-viz\">\n {gridLines}\n <line\n x1={0}\n y1={height / 2}\n x2={width}\n y2={height / 2}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n <path\n d={pathData}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SpringConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { useSyncExternalStore, useRef } from 'react';\n\ninterface SpringControlProps {\n panelId: string;\n path: string;\n label: string;\n spring: SpringConfig;\n onChange: (spring: SpringConfig) => void;\n}\n\nexport function SpringControl({ panelId, path, label, spring, onChange }: SpringControlProps) {\n const mode = useSyncExternalStore(\n (cb) => DialStore.subscribe(panelId, cb),\n () => DialStore.getSpringMode(panelId, path),\n () => DialStore.getSpringMode(panelId, path)\n );\n\n const isSimpleMode = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n simple: spring.visualDuration !== undefined ? spring : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: spring.stiffness !== undefined ? spring : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n if (isSimpleMode) {\n cache.current.simple = spring;\n } else {\n cache.current.advanced = spring;\n }\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n DialStore.updateSpringMode(panelId, path, newMode);\n\n if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n // When updating in simple mode, ensure physics props are removed\n if (isSimpleMode) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n } else {\n // When updating in physics mode, ensure time-based props are removed\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <SpringVisualization spring={spring} isSimpleMode={isSimpleMode} />\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isSimpleMode ? (\n <>\n <Slider\n label=\"Duration\"\n value={spring.visualDuration ?? 0.3}\n onChange={(v) => handleUpdate('visualDuration', v)}\n min={0.1}\n max={1}\n step={0.05}\n unit=\"s\"\n />\n <Slider\n label=\"Bounce\"\n value={spring.bounce ?? 0.2}\n onChange={(v) => handleUpdate('bounce', v)}\n min={0}\n max={1}\n step={0.05}\n />\n </>\n ) : (\n <>\n <Slider\n label=\"Stiffness\"\n value={spring.stiffness ?? 400}\n onChange={(v) => handleUpdate('stiffness', v)}\n min={1}\n max={1000}\n step={10}\n />\n <Slider\n label=\"Damping\"\n value={spring.damping ?? 17}\n onChange={(v) => handleUpdate('damping', v)}\n min={1}\n max={100}\n step={1}\n />\n <Slider\n label=\"Mass\"\n value={spring.mass ?? 1}\n onChange={(v) => handleUpdate('mass', v)}\n min={0.1}\n max={10}\n step={0.1}\n />\n </>\n )}\n </div>\n </Folder>\n );\n}\n","import { EasingConfig } from '../store/DialStore';\n\ninterface EasingVisualizationProps {\n easing: EasingConfig;\n}\n\nconst easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization({ easing }: EasingVisualizationProps) {\n const ease = easing.ease;\n\n const s = 200;\n const pad = 10;\n const inner = s - pad * 2;\n const unit = inner / 2; // [-0.5, 1.5] = 2 units on each axis\n\n // Equal scaling on both axes → 45° diagonal. [0,1] centered in [-0.5, 1.5].\n const toSvg = (nx: number, ny: number) => ({\n x: pad + (nx + 0.5) * unit,\n y: pad + (1.5 - ny) * unit,\n });\n\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const p1 = toSvg(ease[0], ease[1]);\n const p2 = toSvg(ease[2], ease[3]);\n\n const curvePath = `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`;\n\n return (\n <svg\n viewBox={`0 0 ${s} ${s}`}\n preserveAspectRatio=\"xMidYMid slice\"\n className=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x} y1={start.y} x2={end.x} y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4,4\"\n />\n\n <path d={curvePath} fill=\"none\" stroke=\"rgba(255, 255, 255, 0.6)\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport { easingPresets };\n","import { SpringConfig, EasingConfig, TransitionConfig, DialStore } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\nimport { EasingVisualization } from './EasingVisualization';\nimport { useSyncExternalStore, useRef, useState } from 'react';\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl({ panelId, path, label, value, onChange }: TransitionControlProps) {\n const mode = useSyncExternalStore(\n (cb) => DialStore.subscribe(panelId, cb),\n () => DialStore.getTransitionMode(panelId, path),\n () => DialStore.getTransitionMode(panelId, path)\n );\n\n const isEasing = mode === 'easing';\n const isSimpleSpring = mode === 'simple';\n\n // Cache per-mode values so switching back restores previous edits\n const cache = useRef<{\n easing: EasingConfig;\n simple: SpringConfig;\n advanced: SpringConfig;\n }>({\n easing: value.type === 'easing' ? value : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] },\n simple: value.type === 'spring' && value.visualDuration !== undefined ? value : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: value.type === 'spring' && value.stiffness !== undefined ? value : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n });\n\n // Keep cache up to date with current edits\n if (isEasing && value.type === 'easing') {\n cache.current.easing = value;\n } else if (isSimpleSpring && value.type === 'spring') {\n cache.current.simple = value;\n } else if (mode === 'advanced' && value.type === 'spring') {\n cache.current.advanced = value;\n }\n\n const spring: SpringConfig = value.type === 'spring' ? value : cache.current.simple;\n const easing: EasingConfig = value.type === 'easing' ? value : cache.current.easing;\n\n const handleModeChange = (newMode: CurveMode) => {\n DialStore.updateTransitionMode(panelId, path, newMode);\n\n if (newMode === 'easing') {\n onChange(cache.current.easing);\n } else if (newMode === 'simple') {\n onChange(cache.current.simple);\n } else {\n onChange(cache.current.advanced);\n }\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, val: number) => {\n if (isSimpleSpring) {\n const { stiffness, damping, mass, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n } else {\n const { visualDuration, bounce, ...rest } = spring;\n onChange({ ...rest, [key]: val });\n }\n };\n\n const updateEase = (index: number, val: number) => {\n const newEase = [...easing.ease] as [number, number, number, number];\n newEase[index] = val;\n onChange({ ...easing, ease: newEase });\n };\n\n return (\n <Folder title={label} defaultOpen={true}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {isEasing ? (\n <EasingVisualization easing={easing} />\n ) : (\n <SpringVisualization spring={spring} isSimpleMode={isSimpleSpring} />\n )}\n\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing' as const, label: 'Easing' },\n { value: 'simple' as const, label: 'Time' },\n { value: 'advanced' as const, label: 'Physics' },\n ]}\n value={mode}\n onChange={handleModeChange}\n />\n </div>\n\n {isEasing ? (\n <>\n <Slider label=\"x1\" value={easing.ease[0]} onChange={(v) => updateEase(0, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing.ease[1]} onChange={(v) => updateEase(1, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing.ease[2]} onChange={(v) => updateEase(2, v)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing.ease[3]} onChange={(v) => updateEase(3, v)} min={-1} max={2} step={0.01} />\n <Slider label=\"Duration\" value={easing.duration} onChange={(v) => onChange({ ...easing, duration: v })} min={0.1} max={2} step={0.05} unit=\"s\" />\n <EaseTextInput ease={easing.ease} onChange={(newEase) => onChange({ ...easing, ease: newEase })} />\n </>\n ) : isSimpleSpring ? (\n <>\n <Slider label=\"Duration\" value={spring.visualDuration ?? 0.3} onChange={(v) => handleSpringUpdate('visualDuration', v)} min={0.1} max={1} step={0.05} unit=\"s\" />\n <Slider label=\"Bounce\" value={spring.bounce ?? 0.2} onChange={(v) => handleSpringUpdate('bounce', v)} min={0} max={1} step={0.05} />\n </>\n ) : (\n <>\n <Slider label=\"Stiffness\" value={spring.stiffness ?? 400} onChange={(v) => handleSpringUpdate('stiffness', v)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring.damping ?? 17} onChange={(v) => handleSpringUpdate('damping', v)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring.mass ?? 1} onChange={(v) => handleSpringUpdate('mass', v)} min={0.1} max={10} step={0.1} />\n </>\n )}\n </div>\n </Folder>\n );\n}\n\nfunction formatEase(ease: [number, number, number, number]): string {\n return ease.map(v => parseFloat(v.toFixed(2))).join(', ');\n}\n\nfunction parseEase(str: string): [number, number, number, number] | null {\n const parts = str.split(',').map(s => parseFloat(s.trim()));\n if (parts.length === 4 && parts.every(n => !isNaN(n))) {\n return parts as [number, number, number, number];\n }\n return null;\n}\n\nfunction EaseTextInput({ ease, onChange }: { ease: [number, number, number, number]; onChange: (ease: [number, number, number, number]) => void }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const handleFocus = () => {\n setDraft(formatEase(ease));\n setEditing(true);\n };\n\n const handleBlur = () => {\n const parsed = parseEase(draft);\n if (parsed) onChange(parsed);\n setEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n return (\n <div className=\"dialkit-labeled-control\">\n <span className=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={editing ? draft : formatEase(ease)}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n />\n </div>\n );\n}\n","interface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl({ label, value, onChange, placeholder }: TextControlProps) {\n return (\n <div className=\"dialkit-text-control\">\n <label className=\"dialkit-text-label\">{label}</label>\n <input\n type=\"text\"\n className=\"dialkit-text-input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ICON_CHEVRON } from '../icons';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl({ label, value, options, onChange }: SelectControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n const [pos, setPos] = useState<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const normalized = normalizeOptions(options);\n const selectedOption = normalized.find((o) => o.value === value);\n\n const updatePos = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n // Estimate dropdown height: 8px padding + 36px per option\n const dropdownHeight = 8 + normalized.length * 36;\n const spaceBelow = window.innerHeight - rect.bottom - 4;\n const above = spaceBelow < dropdownHeight && rect.top > spaceBelow;\n setPos({\n top: above ? rect.top - 4 : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n above,\n });\n }, [normalized.length]);\n\n // Resolve portal target (closest .dialkit-root)\n useEffect(() => {\n const root = triggerRef.current?.closest('.dialkit-root') as HTMLElement | null;\n setPortalTarget(root ?? document.body);\n }, []);\n\n // Position dropdown when opening\n useEffect(() => {\n if (!isOpen) return;\n updatePos();\n }, [isOpen, updatePos]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n dropdownRef.current && !dropdownRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n return (\n <div className=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n className=\"dialkit-select-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n data-open={String(isOpen)}\n >\n <span className=\"dialkit-select-label\">{label}</span>\n <div className=\"dialkit-select-right\">\n <span className=\"dialkit-select-value\">{selectedOption?.label ?? value}</span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </div>\n </button>\n\n {portalTarget && createPortal(\n <AnimatePresence>\n {isOpen && pos && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-select-dropdown\"\n initial={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: pos.above ? 8 : -8, scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n style={{\n position: 'fixed',\n left: pos.left,\n width: pos.width,\n ...(pos.above\n ? { bottom: window.innerHeight - pos.top, transformOrigin: 'bottom' }\n : { top: pos.top, transformOrigin: 'top' }),\n }}\n >\n {normalized.map((option) => (\n <button\n key={option.value}\n className=\"dialkit-select-option\"\n data-selected={String(option.value === value)}\n onClick={() => {\n onChange(option.value);\n setIsOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n portalTarget\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\n\ninterface ColorControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nconst HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;\n\nexport function ColorControl({ label, value, onChange }: ColorControlProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const colorInputRef = useRef<HTMLInputElement>(null);\n\n // Sync editValue when value changes externally\n useEffect(() => {\n if (!isEditing) {\n setEditValue(value);\n }\n }, [value, isEditing]);\n\n function handleTextSubmit() {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue)) {\n onChange(editValue);\n } else {\n setEditValue(value);\n }\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleTextSubmit();\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(value);\n }\n }\n\n return (\n <div className=\"dialkit-color-control\">\n <span className=\"dialkit-color-label\">{label}</span>\n <div className=\"dialkit-color-inputs\">\n {isEditing ? (\n <input\n type=\"text\"\n className=\"dialkit-color-hex-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autoFocus\n />\n ) : (\n <span\n className=\"dialkit-color-hex\"\n onClick={() => setIsEditing(true)}\n >\n {(value ?? '').toUpperCase()}\n </span>\n )}\n <button\n className=\"dialkit-color-swatch\"\n style={{ backgroundColor: value }}\n onClick={() => colorInputRef.current?.click()}\n title=\"Pick color\"\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n className=\"dialkit-color-picker-native\"\n value={value.length === 4 ? expandShorthandHex(value) : value.slice(0, 7)}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n );\n}\n\nfunction expandShorthandHex(hex: string): string {\n if (hex.length !== 4) return hex;\n return `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, Preset } from '../store/DialStore';\nimport { ICON_CHEVRON, ICON_TRASH } from '../icons';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager({ panelId, presets, activePresetId, onAdd }: PresetManagerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, left: 0, width: 0 });\n\n const hasPresets = presets.length > 0;\n const activePreset = presets.find((p) => p.id === activePresetId);\n\n const open = useCallback(() => {\n if (!hasPresets) return;\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\n }\n setIsOpen(true);\n }, [hasPresets]);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on any mousedown outside trigger + dropdown\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) {\n DialStore.loadPreset(panelId, presetId);\n } else {\n DialStore.clearActivePreset(panelId);\n }\n close();\n };\n\n const handleDelete = (e: React.MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(panelId, presetId);\n };\n\n return (\n <div className=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n className=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(isOpen)}\n data-has-preset={String(!!activePreset)}\n data-disabled={String(!hasPresets)}\n >\n <span className=\"dialkit-preset-label\">\n {activePreset ? activePreset.name : 'Version 1'}\n </span>\n <motion.svg\n className=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n animate={{ rotate: isOpen ? 180 : 0, opacity: hasPresets ? 0.6 : 0.25 }}\n transition={{ type: 'spring', visualDuration: 0.2, bounce: 0.15 }}\n >\n <path d={ICON_CHEVRON} />\n </motion.svg>\n </button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-preset-dropdown\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, minWidth: pos.width }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div\n className=\"dialkit-preset-item\"\n data-active={String(!activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span className=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n {presets.map((preset) => (\n <div\n key={preset.id}\n className=\"dialkit-preset-item\"\n data-active={String(preset.id === activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span className=\"dialkit-preset-name\">{preset.name}</span>\n <button\n className=\"dialkit-preset-delete\"\n onClick={(e) => handleDelete(e, preset.id)}\n title=\"Delete preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {ICON_TRASH.map((d, i) => (\n <path key={i} d={d} />\n ))}\n </svg>\n </button>\n </div>\n ))}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </div>\n );\n}\n","interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup({ buttons }: ButtonGroupProps) {\n return (\n <div className=\"dialkit-button-group\">\n {buttons.map((button, index) => (\n <button\n key={index}\n className=\"dialkit-button\"\n onClick={button.onClick}\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore, ShortcutConfig } from '../store/DialStore';\n\ninterface ShortcutsMenuProps {\n panelId: string;\n}\n\nfunction formatShortcutKey(sc: ShortcutConfig): string {\n if (!sc.key) return '—';\n const mod = sc.modifier === 'alt' ? '⌥'\n : sc.modifier === 'shift' ? '⇧'\n : sc.modifier === 'meta' ? '⌘'\n : '';\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatInteraction(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n switch (interaction) {\n case 'scroll': return sc.key ? 'key+scroll' : 'scroll';\n case 'drag': return 'key+drag';\n case 'move': return 'key+move';\n case 'scroll-only': return 'scroll';\n }\n}\n\nexport function ShortcutsMenu({ panelId }: ShortcutsMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n\n const open = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.bottom + 4, right: window.innerWidth - rect.right });\n }\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => setIsOpen(false), []);\n\n const toggle = useCallback(() => {\n if (isOpen) close();\n else open();\n }, [isOpen, open, close]);\n\n // Close on mousedown outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current?.contains(target) ||\n dropdownRef.current?.contains(target)\n ) return;\n close();\n };\n\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n const panel = DialStore.getPanel(panelId);\n if (!panel) return null;\n\n const shortcuts = Object.entries(panel.shortcuts);\n if (shortcuts.length === 0) return null;\n\n // Build shortcut rows with labels from controls\n const rows = shortcuts.map(([path, shortcut]) => {\n // Find control label\n const findLabel = (controls: typeof panel.controls): string => {\n for (const c of controls) {\n if (c.path === path) return c.label;\n if (c.type === 'folder' && c.children) {\n const found = findLabel(c.children);\n if (found) return found;\n }\n }\n return path;\n };\n return {\n path,\n shortcut,\n label: findLabel(panel.controls),\n };\n });\n\n return (\n <>\n <motion.button\n ref={triggerRef}\n className=\"dialkit-shortcuts-trigger\"\n onClick={toggle}\n title=\"Keyboard shortcuts\"\n whileTap={{ scale: 0.9 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0.3 }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" />\n <path d=\"M6 10H6.01\" />\n <path d=\"M10 10H10.01\" />\n <path d=\"M14 10H14.01\" />\n <path d=\"M18 10H18.01\" />\n <path d=\"M8 14H16\" />\n </svg>\n </motion.button>\n\n {createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n ref={dropdownRef}\n className=\"dialkit-root dialkit-shortcuts-dropdown\"\n style={{ position: 'fixed', top: pos.top, right: pos.right }}\n initial={{ opacity: 0, y: 4, scale: 0.97 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.97, pointerEvents: 'none' as any }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\n >\n <div className=\"dialkit-shortcuts-title\">Keyboard Shortcuts</div>\n <div className=\"dialkit-shortcuts-list\">\n {rows.map((row) => (\n <div key={row.path} className=\"dialkit-shortcuts-row\">\n <span className=\"dialkit-shortcuts-row-key\">\n {formatShortcutKey(row.shortcut)}\n </span>\n <span className=\"dialkit-shortcuts-row-label\">{row.label}</span>\n <span className=\"dialkit-shortcuts-row-mode\">{formatInteraction(row.shortcut)}</span>\n </div>\n ))}\n </div>\n <div className=\"dialkit-shortcuts-hint\">See pill badges on controls for keys</div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )}\n </>\n );\n}\n"],"mappings":"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","names":["useEffect","useState","useRef","useCallback","createPortal","useState","useSyncExternalStore","motion","AnimatePresence","useEffect","useRef","useRef","useEffect","target","useState","useRef","useEffect","jsx","useState","useRef","useEffect","useRef","useState","useCallback","useEffect","motion","jsx","jsxs","useRef","useState","useEffect","useCallback","discreteSteps","motion","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","useSyncExternalStore","useRef","jsx","jsxs","jsx","jsxs","jsxs","jsx","useSyncExternalStore","useRef","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","motion","AnimatePresence","jsx","jsxs","useState","useRef","useCallback","useEffect","motion","AnimatePresence","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","createPortal","motion","AnimatePresence","jsx","jsxs","useState","useRef","useCallback","useEffect","motion","createPortal","AnimatePresence","Fragment","jsx","jsxs","useState","useSyncExternalStore","motion","AnimatePresence","jsx","useState","useRef","useEffect","useCallback","createPortal","jsx","useState","useRef","useEffect","useCallback","createPortal","motion","AnimatePresence","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","motion","createPortal","AnimatePresence"]}