dialkit 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/useDialKit.ts","../src/store/DialStore.ts","../src/components/DialRoot.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/Panel.tsx","../src/components/ButtonGroup.tsx"],"sourcesContent":["// Main hook\nexport { useDialKit } from './hooks/useDialKit';\nexport type { UseDialOptions } from './hooks/useDialKit';\n\n// Root component (user mounts once)\nexport { DialRoot } from './components/DialRoot';\nexport type { DialPosition } from './components/DialRoot';\n\n// Individual components (for advanced usage)\nexport { Slider } from './components/Slider';\nexport { Toggle } from './components/Toggle';\nexport { SegmentedControl } from './components/SegmentedControl';\nexport { Folder } from './components/Folder';\nexport { ButtonGroup } from './components/ButtonGroup';\nexport { SpringControl } from './components/SpringControl';\nexport { SpringVisualization } from './components/SpringVisualization';\n\n// Store (for advanced usage)\nexport { DialStore } from './store/DialStore';\nexport type {\n SpringConfig,\n ActionConfig,\n DialValue,\n DialConfig,\n ResolvedValues,\n ControlMeta,\n PanelConfig,\n} from './store/DialStore';\n","import { useEffect, useId, useSyncExternalStore, useRef, useMemo } from 'react';\nimport { DialStore, DialConfig, DialValue, ResolvedValues, SpringConfig } from '../store/DialStore';\n\nexport interface UseDialOptions {\n onAction?: (action: string) => void;\n}\n\n// Stable empty object for server snapshot to avoid infinite loop in React 19\nconst EMPTY_SERVER_SNAPSHOT: Record<string, DialValue> = {};\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 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 // Subscribe to action events\n useEffect(() => {\n return DialStore.subscribeActions(panelId, (action) => {\n onActionRef.current?.(action);\n });\n }, [panelId]);\n\n // Subscribe to changes - use stable empty object for server snapshot\n const values = useSyncExternalStore(\n (callback) => DialStore.subscribe(panelId, callback),\n () => DialStore.getValues(panelId),\n () => EMPTY_SERVER_SNAPSHOT\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 const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length === 3 && 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)) {\n result[key] = flatValues[path] ?? configValue;\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 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","// 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 ActionConfig = {\n type: 'action';\n label?: string;\n};\n\nexport type DialValue = number | boolean | string | SpringConfig | ActionConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number]\n ? number\n : T[K] extends SpringConfig\n ? SpringConfig\n : T[K] extends DialConfig\n ? ResolvedValues<T[K]>\n : T[K];\n};\n\nexport type ControlMeta = {\n type: 'slider' | 'toggle' | 'spring' | 'folder' | 'action';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\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\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\n registerPanel(id: string, name: string, config: DialConfig): void {\n const controls = this.parseConfig(config, '');\n const values = this.flattenValues(config, '');\n\n this.panels.set(id, { id, name, controls, values });\n this.snapshots.set(id, { ...values });\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.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 // 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 const panel = this.panels.get(panelId);\n if (!panel) return;\n\n // Store the mode preference\n panel.values[`${path}.__mode`] = mode;\n // Create a new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.notify(panelId);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as '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 return this.snapshots.get(panelId) ?? {};\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 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 parseConfig(config: DialConfig, prefix: string): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n\n if (Array.isArray(value) && value.length === 3 && 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: 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)) {\n controls.push({ type: 'spring', path, label });\n } else if (this.isActionConfig(value)) {\n controls.push({ type: 'action', path, label: (value as ActionConfig).label || label });\n } else if (typeof value === 'object' && value !== null) {\n // Nested object becomes a folder\n controls.push({\n type: 'folder',\n path,\n label,\n children: this.parseConfig(value as DialConfig, 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 const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length === 3 && 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)) {\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 (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 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 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 * 2 || 10, step: 0.1 };\n } else if (value >= 0 && value <= 100) {\n return { min: 0, max: value * 2 || 100, step: 1 };\n } else if (value >= 0) {\n return { min: 0, max: value * 2 || 1000, step: 10 };\n } else {\n return { min: value * 2, max: -value * 2, 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\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';\n\ninterface DialRootProps {\n position?: DialPosition;\n}\n\nexport function DialRoot({ position = 'top-right' }: DialRootProps) {\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [mounted, setMounted] = useState(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 // 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\">\n <div className=\"dialkit-panel\" data-position={position}>\n {panels.map((panel) => (\n <Panel key={panel.id} panel={panel} />\n ))}\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n}\n","import { useState, ReactNode } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { DialStore } from '../store/DialStore';\n\ninterface FolderProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n isRoot?: boolean;\n panelId?: string;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = false, panelId }: FolderProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!panelId) return;\n\n const values = DialStore.getValues(panelId);\n const jsonStr = JSON.stringify(values, null, 2);\n\n // Build instruction for Claude Code\n const instruction = `Update the useDialKit configuration for \"${title}\" 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 iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const folderContent = (\n <div className={`dialkit-folder ${isRoot ? 'dialkit-folder-root' : ''}`}>\n <div className=\"dialkit-folder-header\" onClick={() => setIsOpen(!isOpen)}>\n <div className=\"dialkit-folder-title-row\">\n <span className={`dialkit-folder-title ${isRoot ? 'dialkit-folder-title-root' : ''}`}>\n {title}\n </span>\n {isRoot && panelId && (\n <motion.button\n className=\"dialkit-folder-copy\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n initial={false}\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.7,\n filter: isOpen ? 'blur(0px)' : 'blur(6px)',\n }}\n transition={iconTransition}\n style={{ pointerEvents: isOpen ? 'auto' : 'none' }}\n >\n <div style={{ position: 'relative', width: 14, height: 14 }}>\n {/* Copy icon */}\n <motion.svg\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 }}\n initial={false}\n animate={{\n opacity: copied ? 0 : 1,\n scale: copied ? 0.7 : 1,\n filter: copied ? 'blur(6px)' : 'blur(0px)',\n }}\n transition={iconTransition}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </motion.svg>\n {/* Check icon */}\n <motion.svg\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 }}\n initial={false}\n animate={{\n opacity: copied ? 1 : 0,\n scale: copied ? 1 : 0.7,\n filter: copied ? 'blur(0px)' : 'blur(6px)',\n }}\n transition={iconTransition}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </motion.svg>\n </div>\n </motion.button>\n )}\n </div>\n {isRoot ? (\n // Root panel uses minus/plus icons with crossfade\n <div className=\"dialkit-folder-icon\" style={{ position: 'relative' }}>\n {/* Minus icon (when open) */}\n <motion.svg\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: '100%', height: '100%' }}\n initial={false}\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.7,\n filter: isOpen ? 'blur(0px)' : 'blur(6px)',\n }}\n transition={iconTransition}\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </motion.svg>\n {/* Plus icon (when closed) */}\n <motion.svg\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: '100%', height: '100%' }}\n initial={false}\n animate={{\n opacity: isOpen ? 0 : 1,\n scale: isOpen ? 0.7 : 1,\n filter: isOpen ? 'blur(6px)' : 'blur(0px)',\n }}\n transition={iconTransition}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </motion.svg>\n </div>\n ) : (\n // Section folders use rotating chevron with gentle spring\n <motion.svg\n className=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.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 <line x1=\"5\" y1=\"9\" x2=\"12\" y2=\"16\" />\n <line x1=\"19\" y1=\"9\" x2=\"12\" y2=\"16\" />\n </motion.svg>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ type: 'spring', visualDuration: 0.25, bounce: 0 }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n // For root folders, wrap in animated panel container\n if (isRoot) {\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n initial={false}\n animate={{\n width: isOpen ? 280 : 160,\n boxShadow: isOpen\n ? '0 8px 32px rgba(0, 0, 0, 0.5)'\n : '0 4px 16px rgba(0, 0, 0, 0.25)',\n }}\n transition={{ type: 'spring', visualDuration: 0.4, bounce: 0.05 }}\n data-collapsed={!isOpen}\n >\n {folderContent}\n </motion.div>\n );\n }\n\n return folderContent;\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { motion } 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\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 trackRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(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 const percentage = ((value - min) / (max - min)) * 100;\n const isAtMinimum = value <= min;\n const isActive = isInteracting || isHovered;\n\n const positionToValue = useCallback(\n (clientX: number) => {\n if (!trackRef.current) return value;\n const rect = trackRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percent = Math.max(0, Math.min(1, x / rect.width));\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 handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (showInput) return;\n e.preventDefault();\n setIsInteracting(true);\n onChange(positionToValue(e.clientX));\n },\n [positionToValue, onChange, showInput]\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isInteracting) return;\n if (!isDragging) setIsDragging(true);\n onChange(positionToValue(e.clientX));\n },\n [isInteracting, isDragging, positionToValue, onChange]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsInteracting(false);\n setIsDragging(false);\n }, []);\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (showInput) return;\n e.preventDefault();\n setIsInteracting(true);\n const touch = e.touches[0];\n onChange(positionToValue(touch.clientX));\n },\n [positionToValue, onChange, showInput]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (!isInteracting) return;\n if (!isDragging) setIsDragging(true);\n const touch = e.touches[0];\n onChange(positionToValue(touch.clientX));\n },\n [isInteracting, isDragging, positionToValue, onChange]\n );\n\n const handleTouchEnd = useCallback(() => {\n setIsInteracting(false);\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n if (isInteracting) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleTouchEnd);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n };\n }\n }, [isInteracting, handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd]);\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(clamped);\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(step >= 1 ? value.toFixed(0) : value.toFixed(2));\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 = step >= 1 ? value.toFixed(0) : value.toFixed(2);\n const shouldAnimate = !isDragging;\n const transition = shouldAnimate\n ? { type: 'spring' as const, visualDuration: 0.3, bounce: 0.15 }\n : { duration: 0 };\n\n const handleLeft = isAtMinimum ? 7 : `calc(${percentage}% - 9px)`;\n const fillBackground = isActive\n ? 'rgba(255, 255, 255, 0.15)'\n : 'rgba(255, 255, 255, 0.11)';\n\n const hashMarks = Array.from({ length: 7 }, (_, i) => (\n <span key={i} className=\"dialkit-slider-hashmark\">•</span>\n ));\n\n return (\n <div\n ref={trackRef}\n className={`dialkit-slider ${isActive ? 'dialkit-slider-active' : ''}`}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div className=\"dialkit-slider-hashmarks\">{hashMarks}</div>\n\n <motion.div\n className=\"dialkit-slider-fill\"\n style={{ background: fillBackground, width: `${percentage}%`, transition: 'background 0.15s' }}\n animate={{ width: `${percentage}%` }}\n transition={transition}\n />\n\n <motion.div\n className=\"dialkit-slider-handle\"\n style={{\n background: isInteracting ? 'rgba(255, 255, 255, 1)' : 'rgba(255, 255, 255, 0.5)',\n left: handleLeft,\n opacity: isActive ? 1 : 0,\n }}\n animate={{ left: handleLeft, opacity: isActive ? 1 : 0 }}\n transition={transition}\n />\n\n <span className=\"dialkit-slider-label\">\n {label}\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 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}{unit}\n </span>\n )}\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 { DialStore, ControlMeta, PanelConfig, SpringConfig } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { useSyncExternalStore } from 'react';\n\ninterface PanelProps {\n panel: PanelConfig;\n}\n\nexport function Panel({ panel }: PanelProps) {\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 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 'folder':\n return (\n <Folder key={control.path} title={control.label}>\n {control.children?.map(renderControl)}\n </Folder>\n );\n\n default:\n return null;\n }\n };\n\n // Group consecutive actions together\n const renderControls = () => {\n const result: React.ReactNode[] = [];\n let i = 0;\n\n while (i < panel.controls.length) {\n const control = panel.controls[i];\n\n if (control.type === 'action') {\n // Collect consecutive actions\n const actions: ControlMeta[] = [control];\n while (i + 1 < panel.controls.length && panel.controls[i + 1].type === 'action') {\n i++;\n actions.push(panel.controls[i]);\n }\n\n // Render action group\n result.push(\n <div key={`actions-${actions[0].path}`} className=\"dialkit-labeled-control dialkit-actions-group\">\n <span className=\"dialkit-labeled-control-label\">Actions</span>\n <div className=\"dialkit-actions-stack\">\n {actions.map((action) => (\n <button\n key={action.path}\n className=\"dialkit-action-button\"\n onClick={() => DialStore.triggerAction(panel.id, action.path)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </div>\n );\n } else {\n result.push(renderControl(control));\n }\n\n i++;\n }\n\n return result;\n };\n\n return (\n <Folder title={panel.name} defaultOpen={true} isRoot={true} panelId={panel.id}>\n {renderControls()}\n </Folder>\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":["import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/TextControl.tsx","../src/components/SelectControl.tsx","../src/components/ColorControl.tsx","../src/components/PresetManager.tsx","../src/components/ButtonGroup.tsx"],"sourcesContent":["// Main hook\nexport { useDialKit } from './hooks/useDialKit';\nexport type { UseDialOptions } from './hooks/useDialKit';\n\n// Root component (user mounts once)\nexport { DialRoot } from './components/DialRoot';\nexport type { DialPosition } from './components/DialRoot';\n\n// Individual components (for advanced usage)\nexport { Slider } from './components/Slider';\nexport { Toggle } from './components/Toggle';\nexport { Folder } from './components/Folder';\nexport { ButtonGroup } from './components/ButtonGroup';\nexport { SpringControl } from './components/SpringControl';\nexport { SpringVisualization } from './components/SpringVisualization';\nexport { TextControl } from './components/TextControl';\nexport { SelectControl } from './components/SelectControl';\nexport { ColorControl } from './components/ColorControl';\nexport { PresetManager } from './components/PresetManager';\n\n// Store (for advanced usage)\nexport { DialStore } from './store/DialStore';\nexport type {\n SpringConfig,\n ActionConfig,\n SelectConfig,\n ColorConfig,\n TextConfig,\n Preset,\n DialValue,\n DialConfig,\n ResolvedValues,\n ControlMeta,\n PanelConfig,\n} from './store/DialStore';\n","import { useEffect, useId, useSyncExternalStore, useRef } from 'react';\nimport { DialStore, DialConfig, DialValue, ResolvedValues, SpringConfig, 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 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 // 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 const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length === 3 && 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)) {\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 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 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 | ActionConfig | SelectConfig | ColorConfig | TextConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number]\n ? number\n : T[K] extends SpringConfig\n ? SpringConfig\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' | 'folder' | 'action' | 'select' | 'color' | 'text';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\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 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 unregisterPanel(id: string): void {\n this.panels.delete(id);\n this.listeners.delete(id);\n this.snapshots.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 const panel = this.panels.get(panelId);\n if (!panel) return;\n\n // Store the mode preference\n panel.values[`${path}.__mode`] = mode;\n // Create a new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.notify(panelId);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as '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 parseConfig(config: DialConfig, prefix: string): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n\n if (Array.isArray(value) && value.length === 3 && 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: 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)) {\n controls.push({ type: 'spring', 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 controls.push({\n type: 'folder',\n path,\n label,\n children: this.parseConfig(value as DialConfig, 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 const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length === 3 && 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)) {\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 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\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';\n\ninterface DialRootProps {\n position?: DialPosition;\n}\n\nexport function DialRoot({ position = 'top-right' }: DialRootProps) {\n const [panels, setPanels] = useState<PanelConfig[]>([]);\n const [mounted, setMounted] = useState(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 // 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\">\n <div className=\"dialkit-panel\" data-position={position}>\n {panels.map((panel) => (\n <Panel key={panel.id} panel={panel} />\n ))}\n </div>\n </div>\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 } from '../store/DialStore';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { TextControl } from './TextControl';\nimport { SelectControl } from './SelectControl';\nimport { ColorControl } from './ColorControl';\nimport { PresetManager } from './PresetManager';\n\ninterface PanelProps {\n panel: PanelConfig;\n}\n\nexport function Panel({ panel }: PanelProps) {\n const [copied, setCopied] = useState(false);\n const [isPanelOpen, setIsPanelOpen] = useState(true);\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 'folder':\n return (\n <Folder key={control.path} title={control.label}>\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 default:\n return null;\n }\n };\n\n // Group consecutive actions together\n const renderControls = () => {\n const result: React.ReactNode[] = [];\n let i = 0;\n\n while (i < panel.controls.length) {\n const control = panel.controls[i];\n\n if (control.type === 'action') {\n result.push(\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 } else {\n result.push(renderControl(control));\n }\n\n i++;\n }\n\n return result;\n };\n\n const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n\n const toolbar = (\n <>\n <button\n className=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n title=\"Add preset\"\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 </button>\n\n <PresetManager\n panelId={panel.id}\n presets={presets}\n activePresetId={activePresetId}\n onAdd={handleAddPreset}\n />\n\n <button\n className=\"dialkit-toolbar-copy\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n >\n <span className=\"dialkit-toolbar-copy-icon-wrap\">\n <AnimatePresence 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 </button>\n </>\n );\n\n return (\n <div className=\"dialkit-panel-wrapper\">\n <Folder title={panel.name} defaultOpen={true} isRoot={true} 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 onOpenChange?: (isOpen: boolean) => void;\n toolbar?: ReactNode;\n}\n\nexport function Folder({ title, children, defaultOpen = true, isRoot = 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 const iconTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.1 };\n const panelTransition = { type: 'spring' as const, visualDuration: 0.4, bounce: 0.2 };\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 // Only update while open — freeze height when closing so it doesn't shrink mid-animation\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 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={() => { const next = !isOpen; setIsOpen(next); if (next) setIsCollapsed(false); onOpenChange?.(next); }}>\n <div className=\"dialkit-folder-header-top\">\n {isRoot ? (\n <AnimatePresence initial={false} mode=\"popLayout\">\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-title-row\"\n initial={{ opacity: 1 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <span className=\"dialkit-folder-title dialkit-folder-title-root\">\n {title}\n </span>\n </motion.div>\n )}\n </AnimatePresence>\n ) : (\n <div className=\"dialkit-folder-title-row\">\n <span className=\"dialkit-folder-title\">\n {title}\n </span>\n </div>\n )}\n {isRoot ? (\n // Root panel icon — fixed position, container morphs around it\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 // Section folders use rotating chevron with gentle spring\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 && (\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n initial={{ opacity: 1 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <div className=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )}\n </div>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n className=\"dialkit-folder-content\"\n initial={isRoot ? { opacity: 1 } : { height: 0, opacity: 0 }}\n animate={isRoot ? { opacity: 1 } : { height: 'auto', opacity: 1 }}\n exit={isRoot ? { opacity: 0 } : { height: 0, opacity: 0 }}\n transition={isRoot ? { duration: 0.15 } : { type: 'spring', visualDuration: 0.35, bounce: 0.1 }}\n style={isRoot ? undefined : { overflow: 'hidden' }}\n >\n <div className=\"dialkit-folder-inner\">{children}</div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n // For root folders, wrap in animated panel container\n if (isRoot) {\n return (\n <motion.div\n className=\"dialkit-panel-inner\"\n initial={false}\n animate={{\n width: isOpen ? 280 : 42,\n height: isOpen ? (contentHeight !== undefined ? contentHeight + 24 : 'auto') : 42,\n borderRadius: isOpen ? 14 : 21,\n boxShadow: isOpen\n ? '0 8px 32px rgba(0, 0, 0, 0.5)'\n : '0 4px 16px rgba(0, 0, 0, 0.25)',\n }}\n transition={panelTransition}\n style={{ overflow: isOpen ? undefined : 'hidden', cursor: isOpen ? undefined : 'pointer' }}\n onClick={!isOpen ? () => { setIsOpen(true); setIsCollapsed(false); onOpenChange?.(true); } : undefined}\n onAnimationComplete={() => { if (!isOpen) setIsCollapsed(true); }}\n data-collapsed={isCollapsed}\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 roundValue(val: number, step: number): number {\n const decimals = step >= 1 ? 0 : 2;\n const factor = 10 ** decimals;\n return Math.round(val * factor) / factor;\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 // Click — snap to decile and spring animate\n const rawValue = positionToValue(e.clientX);\n const snappedValue = snapToDecile(rawValue, min, max);\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(step >= 1 ? value.toFixed(0) : value.toFixed(2));\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 = step >= 1 ? value.toFixed(0) : value.toFixed(2);\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 const hashMarks = 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>, 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","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 } from 'react';\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 normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n );\n}\n\nexport function SelectControl({ label, value, options, onChange }: SelectControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const normalized = normalizeOptions(options);\n const selectedOption = normalized.find((o) => o.value === value);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n return (\n <div ref={containerRef} className=\"dialkit-select-row\">\n <button\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 <AnimatePresence>\n {isOpen && (\n <motion.div\n className=\"dialkit-select-dropdown\"\n initial={{ opacity: 0, y: -8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -8, scale: 0.95 }}\n transition={{ type: 'spring', visualDuration: 0.15, bounce: 0 }}\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 </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 }}\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-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":["import_react","import_react_dom","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -14,21 +14,43 @@ type ActionConfig = {
14
14
  type: 'action';
15
15
  label?: string;
16
16
  };
17
- type DialValue = number | boolean | string | SpringConfig | ActionConfig;
17
+ type SelectConfig = {
18
+ type: 'select';
19
+ options: (string | {
20
+ value: string;
21
+ label: string;
22
+ })[];
23
+ default?: string;
24
+ };
25
+ type ColorConfig = {
26
+ type: 'color';
27
+ default?: string;
28
+ };
29
+ type TextConfig = {
30
+ type: 'text';
31
+ default?: string;
32
+ placeholder?: string;
33
+ };
34
+ type DialValue = number | boolean | string | SpringConfig | ActionConfig | SelectConfig | ColorConfig | TextConfig;
18
35
  type DialConfig = {
19
36
  [key: string]: DialValue | [number, number, number] | DialConfig;
20
37
  };
21
38
  type ResolvedValues<T extends DialConfig> = {
22
- [K in keyof T]: T[K] extends [number, number, number] ? number : T[K] extends SpringConfig ? SpringConfig : T[K] extends DialConfig ? ResolvedValues<T[K]> : T[K];
39
+ [K in keyof T]: T[K] extends [number, number, number] ? number : T[K] extends SpringConfig ? SpringConfig : T[K] extends SelectConfig ? string : T[K] extends ColorConfig ? string : T[K] extends TextConfig ? string : T[K] extends DialConfig ? ResolvedValues<T[K]> : T[K];
23
40
  };
24
41
  type ControlMeta = {
25
- type: 'slider' | 'toggle' | 'spring' | 'folder' | 'action';
42
+ type: 'slider' | 'toggle' | 'spring' | 'folder' | 'action' | 'select' | 'color' | 'text';
26
43
  path: string;
27
44
  label: string;
28
45
  min?: number;
29
46
  max?: number;
30
47
  step?: number;
31
48
  children?: ControlMeta[];
49
+ options?: (string | {
50
+ value: string;
51
+ label: string;
52
+ })[];
53
+ placeholder?: string;
32
54
  };
33
55
  type PanelConfig = {
34
56
  id: string;
@@ -38,12 +60,20 @@ type PanelConfig = {
38
60
  };
39
61
  type Listener = () => void;
40
62
  type ActionListener = (action: string) => void;
63
+ type Preset = {
64
+ id: string;
65
+ name: string;
66
+ values: Record<string, DialValue>;
67
+ };
41
68
  declare class DialStoreClass {
42
69
  private panels;
43
70
  private listeners;
44
71
  private globalListeners;
45
72
  private snapshots;
46
73
  private actionListeners;
74
+ private presets;
75
+ private activePreset;
76
+ private baseValues;
47
77
  registerPanel(id: string, name: string, config: DialConfig): void;
48
78
  unregisterPanel(id: string): void;
49
79
  updateValue(panelId: string, path: string, value: DialValue): void;
@@ -57,12 +87,22 @@ declare class DialStoreClass {
57
87
  subscribeGlobal(listener: Listener): () => void;
58
88
  subscribeActions(panelId: string, listener: ActionListener): () => void;
59
89
  triggerAction(panelId: string, path: string): void;
90
+ savePreset(panelId: string, name: string): string;
91
+ loadPreset(panelId: string, presetId: string): void;
92
+ deletePreset(panelId: string, presetId: string): void;
93
+ getPresets(panelId: string): Preset[];
94
+ getActivePresetId(panelId: string): string | null;
95
+ clearActivePreset(panelId: string): void;
60
96
  private notify;
61
97
  private notifyGlobal;
62
98
  private parseConfig;
63
99
  private flattenValues;
64
100
  private isSpringConfig;
65
101
  private isActionConfig;
102
+ private isSelectConfig;
103
+ private isColorConfig;
104
+ private isTextConfig;
105
+ private isHexColor;
66
106
  private formatLabel;
67
107
  private inferRange;
68
108
  private inferStep;
@@ -98,25 +138,15 @@ interface ToggleProps {
98
138
  }
99
139
  declare function Toggle({ label, checked, onChange }: ToggleProps): react_jsx_runtime.JSX.Element;
100
140
 
101
- interface SegmentedControlOption<T extends string> {
102
- value: T;
103
- label: string;
104
- }
105
- interface SegmentedControlProps<T extends string> {
106
- options: SegmentedControlOption<T>[];
107
- value: T;
108
- onChange: (value: T) => void;
109
- }
110
- declare function SegmentedControl<T extends string>({ options, value, onChange, }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
111
-
112
141
  interface FolderProps {
113
142
  title: string;
114
143
  children: ReactNode;
115
144
  defaultOpen?: boolean;
116
145
  isRoot?: boolean;
117
- panelId?: string;
146
+ onOpenChange?: (isOpen: boolean) => void;
147
+ toolbar?: ReactNode;
118
148
  }
119
- declare function Folder({ title, children, defaultOpen, isRoot, panelId }: FolderProps): react_jsx_runtime.JSX.Element;
149
+ declare function Folder({ title, children, defaultOpen, isRoot, onOpenChange, toolbar }: FolderProps): react_jsx_runtime.JSX.Element;
120
150
 
121
151
  interface ButtonGroupProps {
122
152
  buttons: Array<{
@@ -141,4 +171,39 @@ interface SpringVisualizationProps {
141
171
  }
142
172
  declare function SpringVisualization({ spring, isSimpleMode }: SpringVisualizationProps): react_jsx_runtime.JSX.Element;
143
173
 
144
- export { type ActionConfig, ButtonGroup, type ControlMeta, type DialConfig, type DialPosition, DialRoot, DialStore, type DialValue, Folder, type PanelConfig, type ResolvedValues, SegmentedControl, Slider, type SpringConfig, SpringControl, SpringVisualization, Toggle, type UseDialOptions, useDialKit };
174
+ interface TextControlProps {
175
+ label: string;
176
+ value: string;
177
+ onChange: (value: string) => void;
178
+ placeholder?: string;
179
+ }
180
+ declare function TextControl({ label, value, onChange, placeholder }: TextControlProps): react_jsx_runtime.JSX.Element;
181
+
182
+ type SelectOption = string | {
183
+ value: string;
184
+ label: string;
185
+ };
186
+ interface SelectControlProps {
187
+ label: string;
188
+ value: string;
189
+ options: SelectOption[];
190
+ onChange: (value: string) => void;
191
+ }
192
+ declare function SelectControl({ label, value, options, onChange }: SelectControlProps): react_jsx_runtime.JSX.Element;
193
+
194
+ interface ColorControlProps {
195
+ label: string;
196
+ value: string;
197
+ onChange: (value: string) => void;
198
+ }
199
+ declare function ColorControl({ label, value, onChange }: ColorControlProps): react_jsx_runtime.JSX.Element;
200
+
201
+ interface PresetManagerProps {
202
+ panelId: string;
203
+ presets: Preset[];
204
+ activePresetId: string | null;
205
+ onAdd: () => void;
206
+ }
207
+ declare function PresetManager({ panelId, presets, activePresetId, onAdd }: PresetManagerProps): react_jsx_runtime.JSX.Element;
208
+
209
+ export { type ActionConfig, ButtonGroup, type ColorConfig, ColorControl, type ControlMeta, type DialConfig, type DialPosition, DialRoot, DialStore, type DialValue, Folder, type PanelConfig, type Preset, PresetManager, type ResolvedValues, type SelectConfig, SelectControl, Slider, type SpringConfig, SpringControl, SpringVisualization, type TextConfig, TextControl, Toggle, type UseDialOptions, useDialKit };