dialkit 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/icons.d.ts +2 -1
- package/dist/icons.js +5 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +177 -72
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +177 -72
- package/dist/index.js.map +1 -1
- package/dist/solid/index.js +339 -267
- package/dist/solid/index.js.map +1 -1
- package/dist/styles.css +110 -26
- package/dist/svelte/components/Timeline/DialTimeline.svelte +50 -1
- package/dist/svelte/components/Timeline/DialTimeline.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Timeline/TimelineSection.svelte +74 -27
- package/dist/svelte/components/Timeline/TimelineSection.svelte.d.ts.map +1 -1
- package/dist/svelte/theme-css.d.ts +1 -1
- package/dist/svelte/theme-css.d.ts.map +1 -1
- package/dist/svelte/theme-css.js +110 -26
- package/dist/vue/index.js +123 -30
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/dist/solid/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/solid/createDialKit.ts","../../src/store/DialStore.ts","../../src/solid/createDialTimeline.ts","../../src/store/TimelineStore.ts","../../src/transition-math.ts","../../src/timeline-core.ts","../../src/timeline/adapter.ts","../../src/store/TimelineUiStore.ts","../../src/copy-instruction.ts","../../src/env.ts","../../src/solid/components/DialRoot.tsx","../../src/solid/primitives.ts","../../src/solid/components/ShortcutListener.tsx","../../src/shortcut-utils.ts","../../src/solid/components/RootPanel.tsx","../../src/icons.ts","../../src/solid/components/Panel.tsx","../../src/solid/components/Folder.tsx","../../src/solid/components/Slider.tsx","../../src/solid/components/Toggle.tsx","../../src/solid/components/SegmentedControl.tsx","../../src/solid/components/SpringVisualization.tsx","../../src/solid/components/SpringControl.tsx","../../src/solid/components/TransitionControl.tsx","../../src/solid/components/EasingVisualization.tsx","../../src/solid/components/TextControl.tsx","../../src/solid/components/SelectControl.tsx","../../src/dropdown-position.ts","../../src/solid/components/ColorControl.tsx","../../src/solid/components/PresetManager.tsx","../../src/solid/components/Timeline/TimelineToggleButton.tsx","../../src/panel-drag.ts","../../src/solid/components/Timeline/DialTimeline.tsx","../../src/solid/components/ControlRenderer.tsx","../../src/solid/components/ButtonGroup.tsx"],"sourcesContent":["import { onMount, onCleanup, createUniqueId, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { createStore, reconcile } from 'solid-js/store';\nimport { DialStore, flattenDialValueUpdates, resolveDialValues } from '../store/DialStore';\nimport type {\n DialConfig,\n DialKitPersistOptions,\n DialKitValueUpdates,\n DialValue,\n ResolvedValues,\n ShortcutConfig,\n} from '../store/DialStore';\n\nexport interface CreateDialOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n onAction?: (action: string) => void;\n shortcuts?: Record<string, ShortcutConfig>;\n}\n\nexport interface DialKitController<T extends DialConfig> {\n values: Accessor<ResolvedValues<T>>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nexport function createDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: CreateDialOptions\n): Accessor<ResolvedValues<T>> {\n return createDialKitController(name, config, options).values;\n}\n\nexport function createDialKitController<T extends DialConfig>(\n name: string,\n config: T,\n options?: CreateDialOptions\n): DialKitController<T> {\n const id = createUniqueId();\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${id}`;\n\n // Resolved values live in a store so consumers reading `values().someKey`\n // subscribe to that key alone; reconcile diffs each snapshot from the\n // external DialStore instead of replacing the whole object.\n const [values, setValues] = createStore(\n resolveDialValues(config, DialStore.getValues(panelId))\n );\n\n if (!isServer) {\n // Subscribe at setup so the notify fired by registerPanel (in onMount)\n // syncs persisted/preset values into the store without a manual copy.\n const unsubValues = DialStore.subscribe(panelId, () => {\n setValues(reconcile(resolveDialValues(config, DialStore.getValues(panelId))));\n });\n onCleanup(unsubValues);\n }\n\n onMount(() => {\n DialStore.registerPanel(panelId, name, config, options?.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n });\n\n const unsubActions = options?.onAction\n ? DialStore.subscribeActions(panelId, options.onAction)\n : undefined;\n\n onCleanup(() => {\n unsubActions?.();\n DialStore.unregisterPanel(panelId);\n });\n });\n\n return {\n values: () => values,\n setValue(path, value) {\n DialStore.updateValue(panelId, path, value);\n },\n setValues(nextValues) {\n DialStore.updateValues(panelId, flattenDialValueUpdates(config, nextValues));\n },\n resetValues() {\n DialStore.resetValues(panelId);\n },\n getValues() {\n return resolveDialValues(config, DialStore.getValues(panelId));\n },\n };\n}\n","// Lightweight state store with subscriptions for dialkit\n\nexport type SpringConfig = {\n type: 'spring';\n stiffness?: number;\n damping?: number;\n mass?: number;\n visualDuration?: number;\n bounce?: number;\n};\n\nexport type EasingConfig = {\n type: 'easing';\n duration: number;\n ease: [number, number, number, number];\n};\n\nexport type TransitionConfig = SpringConfig | EasingConfig;\n\nexport type ActionConfig = {\n type: 'action';\n label?: string;\n};\n\nexport type SelectConfig = {\n type: 'select';\n options: (string | { value: string; label: string })[];\n default?: string;\n};\n\nexport type ColorConfig = {\n type: 'color';\n default?: string;\n};\n\nexport type TextConfig = {\n type: 'text';\n default?: string;\n placeholder?: string;\n};\n\nexport type DialValue = number | boolean | string | SpringConfig | EasingConfig | ActionConfig | SelectConfig | ColorConfig | TextConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number, number?] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig\n ? TransitionConfig\n : T[K] extends EasingConfig\n ? TransitionConfig\n : T[K] extends SelectConfig\n ? string\n : T[K] extends ColorConfig\n ? string\n : T[K] extends TextConfig\n ? string\n : T[K] extends DialConfig\n ? ResolvedValues<T[K]>\n : T[K];\n};\n\nexport type DialKitValueUpdates<T extends DialConfig> = {\n [K in keyof T as K extends '_collapsed' ? never : K]?: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig | EasingConfig\n ? TransitionConfig\n : T[K] extends ActionConfig\n ? never\n : T[K] extends SelectConfig | ColorConfig | TextConfig\n ? string\n : T[K] extends DialConfig\n ? DialKitValueUpdates<T[K]>\n : T[K];\n};\n\nexport type ShortcutMode = 'fine' | 'normal' | 'coarse';\nexport type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';\n\nexport type ShortcutConfig = {\n key?: string;\n modifier?: 'alt' | 'shift' | 'meta';\n mode?: ShortcutMode;\n interaction?: ShortcutInteraction;\n};\n\nexport type ControlMeta = {\n type: 'slider' | 'toggle' | 'spring' | 'transition' | 'folder' | 'action' | 'select' | 'color' | 'text';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\n defaultOpen?: boolean;\n options?: (string | { value: string; label: string })[];\n placeholder?: string;\n shortcut?: ShortcutConfig;\n};\n\nexport type PanelConfig = {\n id: string;\n name: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n shortcuts: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n};\n\ntype Listener = () => void;\ntype ActionListener = (action: string) => void;\n\nexport type Preset = {\n id: string;\n name: string;\n values: Record<string, DialValue>;\n};\n\nexport type DialKitPersistOptions = boolean | {\n key?: string;\n storage?: 'localStorage' | 'sessionStorage';\n presets?: boolean;\n};\n\nexport type DialStorePanelOptions = {\n retainOnUnmount?: boolean;\n persist?: DialKitPersistOptions;\n kind?: 'timeline';\n};\n\ntype PersistConfig = {\n key: string;\n storage: 'localStorage' | 'sessionStorage';\n presets: boolean;\n};\n\ntype PersistedPanelState = {\n version: 1;\n values?: Record<string, DialValue>;\n baseValues?: Record<string, DialValue>;\n presets?: Preset[];\n activePresetId?: string | null;\n};\n\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nexport function resolveDialValues<T extends DialConfig>(\n config: T,\n flatValues: Record<string, DialValue>\n): ResolvedValues<T> {\n return resolveConfigValues(config, flatValues, '') as ResolvedValues<T>;\n}\n\nexport function flattenDialValueUpdates<T extends DialConfig>(\n config: T,\n updates: DialKitValueUpdates<T>\n): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n if (typeof updates === 'object' && updates !== null) {\n flattenConfigUpdates(config, updates as Record<string, unknown>, '', values);\n }\n return values;\n}\n\nfunction resolveConfigValues(\n config: DialConfig,\n flatValues: Record<string, DialValue>,\n prefix: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length <= 4 && typeof configValue[0] === 'number') {\n result[key] = flatValues[path] ?? configValue[0];\n } else if (typeof configValue === 'number' || typeof configValue === 'boolean' || typeof configValue === 'string') {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSpringConfigValue(configValue) || isEasingConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfigValue(configValue)) {\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n result[key] = resolveConfigValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\n}\n\nfunction flattenConfigUpdates(\n config: DialConfig,\n updates: Record<string, unknown>,\n prefix: string,\n values: Record<string, DialValue>\n): void {\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed' || !(key in updates)) continue;\n\n const nextValue = updates[key];\n if (nextValue === undefined) continue;\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (isActionConfigValue(configValue)) {\n continue;\n }\n\n if (isLeafConfigValue(configValue)) {\n values[path] = nextValue as DialValue;\n continue;\n }\n\n if (\n typeof configValue === 'object' &&\n configValue !== null &&\n typeof nextValue === 'object' &&\n nextValue !== null &&\n !Array.isArray(nextValue)\n ) {\n flattenConfigUpdates(configValue as DialConfig, nextValue as Record<string, unknown>, path, values);\n }\n }\n}\n\nfunction isLeafConfigValue(value: unknown): boolean {\n return (\n (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isSpringConfigValue(value) ||\n isEasingConfigValue(value) ||\n isActionConfigValue(value) ||\n isSelectConfigValue(value) ||\n isColorConfigValue(value) ||\n isTextConfigValue(value)\n );\n}\n\nfunction hasType(value: unknown, type: string): boolean {\n return typeof value === 'object' && value !== null && 'type' in value && (value as { type: string }).type === type;\n}\n\nexport function isSpringConfigValue(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nexport function isEasingConfigValue(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nexport function isHexColor(value: string): boolean {\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n}\n\n/** camelCase → Title Case, the label rule used everywhere a key becomes UI text. */\nexport function formatLabel(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n}\n\n/** Default slider step for a numeric range. */\nexport function inferStep(min: number, max: number): number {\n const range = max - min;\n if (range <= 1) return 0.01;\n if (range <= 10) return 0.1;\n if (range <= 100) return 1;\n return 10;\n}\n\nfunction isActionConfigValue(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfigValue(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfigValue(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfigValue(value: unknown): value is TextConfig {\n return hasType(value, 'text');\n}\n\nfunction getFirstOptionValue(options: (string | { value: string; label: string })[]): string {\n const first = options[0];\n if (first === undefined) return '';\n return typeof first === 'string' ? first : first.value;\n}\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\n private panelsSnapshot: PanelConfig[] = [];\n private standardPanelsSnapshot: PanelConfig[] = [];\n private timelinePanelsSnapshot: PanelConfig[] = [];\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private snapshots: Map<string, Record<string, DialValue>> = new Map();\n private actionListeners: Map<string, Set<ActionListener>> = new Map();\n private presets: Map<string, Preset[]> = new Map();\n private activePreset: Map<string, string | null> = new Map();\n private baseValues: Map<string, Record<string, DialValue>> = new Map();\n private defaultValues: Map<string, Record<string, DialValue>> = new Map();\n private registrationCounts: Map<string, number> = new Map();\n private retainedPanels: Set<string> = new Set();\n private persistConfigs: Map<string, PersistConfig> = new Map();\n\n registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n const existingPanel = this.panels.get(id);\n if (existingPanel && existingPanel.kind !== options.kind) {\n console.warn(\n `[dialkit] Panel id \"${id}\" cannot be shared by a timeline and a standard panel; ` +\n `the most recent registration controls where it renders.`\n );\n }\n this.configurePanelRetention(id, options);\n this.registrationCounts.set(id, (this.registrationCounts.get(id) ?? 0) + 1);\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', defaultValues);\n\n const persisted = this.loadPersistedPanel(id);\n const previousValues = this.panels.get(id)?.values ?? this.snapshots.get(id) ?? persisted?.values ?? {};\n const values = this.reconcileValues(defaultValues, previousValues, controlsByPath);\n\n const previousBaseValues = this.baseValues.get(id) ?? persisted?.baseValues ?? persisted?.values ?? {};\n const baseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n this.panels.set(id, { id, name, controls, values, shortcuts: shortcuts ?? {}, kind: options.kind });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, baseValues);\n this.defaultValues.set(id, { ...defaultValues });\n\n const existingPresets = this.presets.get(id) ?? persisted?.presets;\n if (existingPresets) {\n this.presets.set(id, this.reconcilePresets(existingPresets, defaultValues, controlsByPath));\n }\n if (!this.activePreset.has(id) && persisted?.activePresetId !== undefined) {\n this.activePreset.set(id, persisted.activePresetId);\n }\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n this.configurePanelRetention(id, options);\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config, shortcuts, options);\n return;\n }\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n this.initTransitionModes(config, '', defaultValues);\n const nextValues = this.reconcileValues(defaultValues, existing.values, controlsByPath);\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues, shortcuts: shortcuts ?? existing.shortcuts, kind: options.kind ?? existing.kind };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n for (const [path, value] of Object.entries(nextValues)) {\n if (path.endsWith('.__mode')) {\n nextBaseValues[path] = value;\n }\n }\n\n this.baseValues.set(id, nextBaseValues);\n this.defaultValues.set(id, { ...defaultValues });\n this.presets.set(id, this.reconcilePresets(this.presets.get(id) ?? [], defaultValues, controlsByPath));\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.panels.delete(id);\n // Keep listener sets: subscribed components can outlive the registration\n // (HMR unregister/re-register of the same id) and must keep receiving\n // notifications. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n if (this.actionListeners.get(id)?.size === 0) this.actionListeners.delete(id);\n\n if (!this.retainedPanels.has(id)) {\n this.snapshots.delete(id);\n this.baseValues.delete(id);\n this.defaultValues.delete(id);\n this.presets.delete(id);\n this.activePreset.delete(id);\n this.persistConfigs.delete(id);\n }\n\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n this.updateValues(panelId, { [path]: value });\n }\n\n updateValues(panelId: string, updates: Record<string, DialValue>): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const validUpdates: Record<string, DialValue> = {};\n\n for (const [path, value] of Object.entries(updates)) {\n if (!Object.prototype.hasOwnProperty.call(panel.values, path)) {\n continue;\n }\n\n const control = this.findControlByPath(panel.controls, path);\n if (control?.type === 'action') {\n continue;\n }\n\n panel.values[path] = value;\n validUpdates[path] = value;\n }\n\n if (Object.keys(validUpdates).length === 0) {\n return;\n }\n\n // Auto-save to active preset or base values\n const activeId = this.activePreset.get(panelId);\n if (activeId) {\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === activeId);\n if (preset) {\n for (const [path, value] of Object.entries(validUpdates)) {\n preset.values[path] = value;\n }\n }\n } else {\n const base = this.baseValues.get(panelId);\n if (base) {\n for (const [path, value] of Object.entries(validUpdates)) {\n base[path] = value;\n }\n }\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resetValues(panelId: string): void {\n const panel = this.panels.get(panelId);\n const defaults = this.defaultValues.get(panelId);\n if (!panel || !defaults) return;\n\n panel.values = { ...defaults };\n this.snapshots.set(panelId, { ...panel.values });\n this.baseValues.set(panelId, { ...defaults });\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n updateSpringMode(panelId: string, path: string, mode: 'simple' | 'advanced'): void {\n this.updateTransitionMode(panelId, path, mode);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const mode = this.getTransitionMode(panelId, path);\n if (mode === 'easing') return 'simple';\n return mode;\n }\n\n updateTransitionMode(panelId: string, path: string, mode: 'easing' | 'simple' | 'advanced'): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[`${path}.__mode`] = mode;\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getTransitionMode(panelId: string, path: string): 'easing' | 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as 'easing' | 'simple' | 'advanced') || 'simple';\n }\n\n getValue(panelId: string, path: string): DialValue | undefined {\n const panel = this.panels.get(panelId);\n return panel?.values[path];\n }\n\n getValues(panelId: string): Record<string, DialValue> {\n // Return the snapshot for useSyncExternalStore compatibility\n // Use stable EMPTY_VALUES to avoid infinite loop in React 19\n return this.snapshots.get(panelId) ?? EMPTY_VALUES;\n }\n\n getPanels(kind?: 'panel' | 'timeline'): PanelConfig[] {\n // Stable reference between global notifications: getSnapshot-style\n // consumers (React useSyncExternalStore, Solid `from`) compare by\n // identity, and a fresh array on every call makes them loop or re-render.\n if (kind === 'panel') return this.standardPanelsSnapshot;\n if (kind === 'timeline') return this.timelinePanelsSnapshot;\n return this.panelsSnapshot;\n }\n\n getPanel(id: string): PanelConfig | undefined {\n return this.panels.get(id);\n }\n\n subscribe(panelId: string, listener: Listener): () => void {\n if (!this.listeners.has(panelId)) {\n this.listeners.set(panelId, new Set());\n }\n this.listeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.listeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.listeners.delete(panelId);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => this.globalListeners.delete(listener);\n }\n\n subscribeActions(panelId: string, listener: ActionListener): () => void {\n if (!this.actionListeners.has(panelId)) {\n this.actionListeners.set(panelId, new Set());\n }\n this.actionListeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.actionListeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.actionListeners.delete(panelId);\n }\n };\n }\n\n triggerAction(panelId: string, path: string): void {\n this.actionListeners.get(panelId)?.forEach(fn => fn(path));\n }\n\n savePreset(panelId: string, name: string): string {\n const panel = this.panels.get(panelId);\n if (!panel) throw new Error(`Panel ${panelId} not found`);\n\n const id = `preset-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const preset: Preset = {\n id,\n name,\n values: { ...panel.values },\n };\n\n const existing = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, [...existing, preset]);\n this.activePreset.set(panelId, id);\n\n // Force re-render by creating new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n\n return id;\n }\n\n loadPreset(panelId: string, presetId: string): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === presetId);\n if (!preset) return;\n\n // Apply preset values\n panel.values = { ...preset.values };\n this.snapshots.set(panelId, { ...panel.values });\n this.activePreset.set(panelId, presetId);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n deletePreset(panelId: string, presetId: string): void {\n const presets = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, presets.filter(p => p.id !== presetId));\n\n // Clear active if deleted\n if (this.activePreset.get(panelId) === presetId) {\n this.activePreset.set(panelId, null);\n }\n\n // Force re-render by creating new snapshot reference\n const panel = this.panels.get(panelId);\n if (panel) {\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getPresets(panelId: string): Preset[] {\n return this.presets.get(panelId) ?? [];\n }\n\n getActivePresetId(panelId: string): string | null {\n return this.activePreset.get(panelId) ?? null;\n }\n\n clearActivePreset(panelId: string): void {\n const panel = this.panels.get(panelId);\n const base = this.baseValues.get(panelId);\n if (panel && base) {\n panel.values = { ...base };\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resolveShortcutTarget(key: string, modifier?: 'alt' | 'shift' | 'meta'): {\n panelId: string;\n path: string;\n control: ControlMeta;\n } | null {\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue; // skip keyless shortcuts\n if (shortcut.key.toLowerCase() !== key.toLowerCase()) continue;\n const scMod = shortcut.modifier ?? undefined;\n if (scMod !== modifier) continue;\n\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n return { panelId: panel.id, path, control };\n }\n }\n }\n return null;\n }\n\n resolveScrollOnlyTargets(): Array<{\n panelId: string;\n path: string;\n control: ControlMeta;\n shortcut: ShortcutConfig;\n }> {\n const results: Array<{ panelId: string; path: string; control: ControlMeta; shortcut: ShortcutConfig }> = [];\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if ((shortcut.interaction ?? 'scroll') !== 'scroll-only') continue;\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n results.push({ panelId: panel.id, path, control, shortcut });\n }\n }\n }\n return results;\n }\n\n private configurePanelRetention(id: string, options: DialStorePanelOptions): void {\n if (options.retainOnUnmount) {\n this.retainedPanels.add(id);\n }\n\n const persistConfig = this.normalizePersistConfig(id, options.persist);\n if (persistConfig) {\n this.persistConfigs.set(id, persistConfig);\n this.retainedPanels.add(id);\n }\n }\n\n private reconcileValues(\n defaultValues: Record<string, DialValue>,\n previousValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Record<string, DialValue> {\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n if (path.endsWith('.__mode')) {\n const transitionPath = path.slice(0, -'.__mode'.length);\n const transitionControl = controlsByPath.get(transitionPath);\n nextValues[path] = transitionControl?.type === 'transition' && previousValues[path] !== undefined\n ? previousValues[path]\n : defaultValue;\n continue;\n }\n\n nextValues[path] = this.normalizePreservedValue(\n previousValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n return nextValues;\n }\n\n private reconcilePresets(\n presets: Preset[],\n defaultValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Preset[] {\n return presets.map((preset) => ({\n ...preset,\n values: this.reconcileValues(defaultValues, preset.values, controlsByPath),\n }));\n }\n\n private normalizePersistConfig(id: string, persist: DialKitPersistOptions | undefined): PersistConfig | null {\n if (!persist) return null;\n const options = typeof persist === 'object' ? persist : {};\n return {\n key: options.key ?? `dialkit:${id}`,\n storage: options.storage ?? 'localStorage',\n presets: options.presets ?? true,\n };\n }\n\n private loadPersistedPanel(id: string): PersistedPanelState | null {\n const config = this.persistConfigs.get(id);\n if (!config) return null;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(config.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as PersistedPanelState;\n if (parsed?.version !== 1 || typeof parsed !== 'object') return null;\n return parsed;\n } catch {\n return null;\n }\n }\n\n private persistPanel(id: string): void {\n const config = this.persistConfigs.get(id);\n if (!config) return;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return;\n\n const values = this.snapshots.get(id) ?? this.panels.get(id)?.values;\n if (!values) return;\n\n const state: PersistedPanelState = {\n version: 1,\n values,\n baseValues: this.baseValues.get(id) ?? values,\n activePresetId: this.activePreset.get(id) ?? null,\n };\n\n if (config.presets) {\n state.presets = this.presets.get(id) ?? [];\n }\n\n try {\n storage.setItem(config.key, JSON.stringify(state));\n } catch {\n // Ignore storage quota/security errors; DialKit should still work in-memory.\n }\n }\n\n private getStorage(kind: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof globalThis === 'undefined' || !('window' in globalThis)) {\n return null;\n }\n\n try {\n return kind === 'sessionStorage'\n ? globalThis.window?.sessionStorage ?? null\n : globalThis.window?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private findControlByPath(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = this.findControlByPath(control.children, path);\n if (found) return found;\n }\n }\n return null;\n }\n\n private notify(panelId: string): void {\n this.listeners.get(panelId)?.forEach(fn => fn());\n }\n\n private notifyGlobal(): void {\n this.panelsSnapshot = Array.from(this.panels.values());\n this.standardPanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind !== 'timeline');\n this.timelinePanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind === 'timeline');\n this.globalListeners.forEach(fn => fn());\n }\n\n private initTransitionModes(config: DialConfig, prefix: string, values: Record<string, DialValue>): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (this.isEasingConfig(value)) {\n values[`${path}.__mode`] = 'easing';\n } else if (this.isSpringConfig(value)) {\n // Detect physics mode from config\n const hasPhysics = value.stiffness !== undefined || value.damping !== undefined || value.mass !== undefined;\n const hasTime = value.visualDuration !== undefined || value.bounce !== undefined;\n values[`${path}.__mode`] = hasPhysics && !hasTime ? 'advanced' : 'simple';\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value) && !this.isActionConfig(value) && !this.isSelectConfig(value) && !this.isColorConfig(value) && !this.isTextConfig(value)) {\n this.initTransitionModes(value as DialConfig, path, values);\n }\n }\n }\n\n private parseConfig(config: DialConfig, prefix: string, shortcuts?: Record<string, ShortcutConfig>): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n const shortcut = shortcuts?.[path];\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n // Range tuple: [default, min, max]\n controls.push({\n type: 'slider',\n path,\n label,\n min: value[1],\n max: value[2],\n step: value[3] ?? this.inferStep(value[1], value[2]),\n shortcut,\n });\n } else if (typeof value === 'number') {\n // Single number - auto-infer range\n const { min, max, step } = this.inferRange(value);\n controls.push({ type: 'slider', path, label, min, max, step, shortcut });\n } else if (typeof value === 'boolean') {\n controls.push({ type: 'toggle', path, label, shortcut });\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n controls.push({ type: 'transition', path, label });\n } else if (this.isActionConfig(value)) {\n controls.push({ type: 'action', path, label: (value as ActionConfig).label || label });\n } else if (this.isSelectConfig(value)) {\n controls.push({ type: 'select', path, label, options: value.options });\n } else if (this.isColorConfig(value)) {\n controls.push({ type: 'color', path, label });\n } else if (this.isTextConfig(value)) {\n controls.push({ type: 'text', path, label, placeholder: value.placeholder });\n } else if (typeof value === 'string') {\n // Auto-detect: hex color vs text\n if (this.isHexColor(value)) {\n controls.push({ type: 'color', path, label });\n } else {\n controls.push({ type: 'text', path, label });\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object becomes a folder\n const folderConfig = value as DialConfig;\n const defaultOpen = '_collapsed' in folderConfig ? !(folderConfig._collapsed as boolean) : true;\n controls.push({\n type: 'folder',\n path,\n label,\n defaultOpen,\n children: this.parseConfig(folderConfig, path, shortcuts),\n });\n }\n }\n\n return controls;\n }\n\n private flattenValues(config: DialConfig, prefix: string): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n values[path] = value[0]; // Default value\n } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n values[path] = value;\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n values[path] = value;\n } else if (this.isActionConfig(value)) {\n // Actions don't need stored values - they're just triggers\n values[path] = value;\n } else if (this.isSelectConfig(value)) {\n // Use default or first option's value\n const firstOption = value.options[0];\n const firstValue = typeof firstOption === 'string' ? firstOption : firstOption.value;\n values[path] = value.default ?? firstValue;\n } else if (this.isColorConfig(value)) {\n values[path] = value.default ?? '#000000';\n } else if (this.isTextConfig(value)) {\n values[path] = value.default ?? '';\n } else if (typeof value === 'object' && value !== null) {\n Object.assign(values, this.flattenValues(value as DialConfig, path));\n }\n }\n\n return values;\n }\n\n private isSpringConfig(value: unknown): value is SpringConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SpringConfig).type === 'spring'\n );\n }\n\n private isEasingConfig(value: unknown): value is EasingConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as EasingConfig).type === 'easing'\n );\n }\n\n private isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ActionConfig).type === 'action'\n );\n }\n\n private isSelectConfig(value: unknown): value is SelectConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SelectConfig).type === 'select' &&\n 'options' in value &&\n Array.isArray((value as SelectConfig).options)\n );\n }\n\n private isColorConfig(value: unknown): value is ColorConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ColorConfig).type === 'color'\n );\n }\n\n private isTextConfig(value: unknown): value is TextConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as TextConfig).type === 'text'\n );\n }\n\n private isHexColor(value: string): boolean {\n return isHexColor(value);\n }\n\n private formatLabel(key: string): string {\n return formatLabel(key);\n }\n\n private inferRange(value: number): { min: number; max: number; step: number } {\n // Infer reasonable range based on value\n if (value >= 0 && value <= 1) {\n return { min: 0, max: 1, step: 0.01 };\n } else if (value >= 0 && value <= 10) {\n return { min: 0, max: value * 3 || 10, step: 0.1 };\n } else if (value >= 0 && value <= 100) {\n return { min: 0, max: value * 3 || 100, step: 1 };\n } else if (value >= 0) {\n return { min: 0, max: value * 3 || 1000, step: 10 };\n } else {\n return { min: value * 3, max: -value * 3, step: 1 };\n }\n }\n\n private inferStep(min: number, max: number): number {\n return inferStep(min, max);\n }\n\n private normalizePreservedValue(\n existingValue: DialValue | undefined,\n defaultValue: DialValue,\n control: ControlMeta | undefined\n ): DialValue {\n if (existingValue === undefined || !control) {\n return defaultValue;\n }\n\n switch (control.type) {\n case 'slider': {\n if (typeof existingValue !== 'number' || typeof defaultValue !== 'number') {\n return defaultValue;\n }\n\n const min = control.min ?? Number.NEGATIVE_INFINITY;\n const max = control.max ?? Number.POSITIVE_INFINITY;\n const clamped = Math.min(max, Math.max(min, existingValue));\n\n if (typeof control.step !== 'number' || control.step <= 0) {\n return clamped;\n }\n\n return this.roundToStep(clamped, min, max, control.step);\n }\n case 'toggle':\n return typeof existingValue === 'boolean' ? existingValue : defaultValue;\n case 'select': {\n if (typeof existingValue !== 'string') {\n return defaultValue;\n }\n\n const options = control.options ?? [];\n const validValues = new Set(options.map((option) => (typeof option === 'string' ? option : option.value)));\n return validValues.has(existingValue) ? existingValue : defaultValue;\n }\n case 'color':\n case 'text':\n return typeof existingValue === 'string' ? existingValue : defaultValue;\n case 'transition':\n if (this.isSpringConfig(defaultValue)) {\n return this.isSpringConfig(existingValue) ? existingValue : defaultValue;\n }\n if (this.isEasingConfig(defaultValue)) {\n return this.isEasingConfig(existingValue) ? existingValue : defaultValue;\n }\n return defaultValue;\n case 'action':\n return defaultValue;\n default:\n return defaultValue;\n }\n }\n\n private roundToStep(value: number, min: number, max: number, step: number): number {\n const snapped = min + Math.round((value - min) / step) * step;\n const clamped = Math.min(max, Math.max(min, snapped));\n const precision = this.stepPrecision(step);\n return Number(clamped.toFixed(precision));\n }\n\n private stepPrecision(step: number): number {\n const text = String(step);\n const decimalIndex = text.indexOf('.');\n return decimalIndex === -1 ? 0 : text.length - decimalIndex - 1;\n }\n\n private mapControlsByPath(controls: ControlMeta[]): Map<string, ControlMeta> {\n const map = new Map<string, ControlMeta>();\n\n const visit = (nodes: ControlMeta[]) => {\n for (const node of nodes) {\n if (node.type === 'folder' && node.children) {\n visit(node.children);\n continue;\n }\n\n map.set(node.path, node);\n }\n };\n\n visit(controls);\n return map;\n }\n\n}\n\n// Singleton instance\nexport const DialStore = /* @__PURE__ */ new DialStoreClass();\n","import { createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { DialStore } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n computeStaticTimeline,\n parseTimelineConfig,\n resolveTimelineLoop,\n type DialTimelineOptions,\n type DialTimelineValues,\n type TimelineConfig,\n} from '../timeline';\n\nexport type CreateDialTimelineOptions = DialTimelineOptions;\n\nexport function createDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: CreateDialTimelineOptions\n): Accessor<DialTimelineValues<T>> {\n const instanceId = createUniqueId();\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${instanceId}`;\n const parsed = createMemo(() => parseTimelineConfig(config));\n const [flatValues, setFlatValues] = createSignal(DialStore.getValues(panelId));\n const [transport, setTransport] = createSignal(TimelineStore.getTransport(panelId));\n const staticTimeline = createMemo(() => computeStaticTimeline(parsed(), flatValues()));\n const loopStart = () => resolveTimelineLoop(options?.loop).start;\n let mounted = false;\n\n const play = () => TimelineStore.play(panelId);\n const pause = () => TimelineStore.pause(panelId);\n const replay = () => TimelineStore.replay(panelId);\n const seek = (time: number) => TimelineStore.seek(panelId, time);\n\n if (!isServer) {\n const unsubscribeValues = DialStore.subscribe(panelId, () => {\n setFlatValues(DialStore.getValues(panelId));\n });\n const unsubscribeTransport = TimelineStore.subscribe(panelId, () => {\n setTransport(TimelineStore.getTransport(panelId));\n });\n onCleanup(() => {\n unsubscribeValues();\n unsubscribeTransport();\n });\n }\n\n onMount(() => {\n DialStore.registerPanel(panelId, name, parsed().dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n setFlatValues(DialStore.getValues(panelId));\n\n const currentStatic = staticTimeline();\n TimelineStore.register(\n buildTimelineMeta(panelId, name, currentStatic.duration, parsed(), options?.loop),\n { autoplay: options?.autoplay ?? true }\n );\n setTransport(TimelineStore.getTransport(panelId));\n mounted = true;\n\n onCleanup(() => {\n mounted = false;\n TimelineStore.unregister(panelId);\n DialStore.unregisterPanel(panelId);\n });\n });\n\n createEffect(() => {\n const currentParsed = parsed();\n const currentStatic = staticTimeline();\n if (!mounted) return;\n TimelineStore.update(\n buildTimelineMeta(panelId, name, currentStatic.duration, currentParsed, options?.loop)\n );\n });\n\n return createMemo(() => {\n const currentStatic = staticTimeline();\n return buildTimelineValues<T>(\n currentStatic.clips,\n transport(),\n currentStatic.duration,\n loopStart(),\n { play, pause, replay, seek }\n );\n });\n}\n","// Playback transport + registry for DialKit timelines.\n// Clip values (at/duration/from/to) live in DialStore under the timeline's\n// panel id — this store only owns time: the clock, play state, and the\n// track/clip structure the dock UI renders.\n\nexport type TimelineClipTrackMeta = {\n prop: string;\n /** Step folder keys when the track is a sequence. */\n stepKeys?: string[];\n};\n\nexport type TimelineClipMeta = {\n key: string; // config path; also the DialStore path prefix, e.g. \"cardEnter\" or \"circle.path\"\n label: string;\n color: string;\n /** Code-defined playback behavior; intentionally not exposed as a dial. */\n loop: 'off' | 'repeat';\n /** Group key when the clip lives inside a nested layer, e.g. \"circle\". */\n group?: string;\n /** Step folder keys for sequence clips, e.g. [\"step1\", \"step2\"]. */\n stepKeys?: string[];\n /** Independent property tracks of a props clip — full rows when expanded. */\n tracks?: TimelineClipTrackMeta[];\n};\n\nexport type TimelineMeta = {\n id: string; // same id as the DialStore panel\n name: string;\n duration: number; // seconds\n loop: boolean;\n /** Loop wraps back to this time, not 0 — clips before it play once\n * (intro-then-idle). 0 loops the whole timeline. */\n loopStart: number;\n clips: TimelineClipMeta[]; // one row each\n};\n\nexport type TimelineTransport = {\n time: number;\n playing: boolean;\n duration: number;\n /** Completed loop passes — keeps looping clips phase-continuous across\n * timeline wraps. Reset by seek/replay so scrubbing stays deterministic. */\n wraps: number;\n};\n\ntype Listener = () => void;\n\n/** Length of the repeating span — the whole timeline unless a loop region\n * narrows it. Degenerate regions (start ≥ duration) fall back to the whole\n * timeline so a bad `from` never stalls the clock. */\nexport function loopSpan(duration: number, loopStart: number): number {\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n if (!Number.isFinite(loopStart)) loopStart = 0;\n const start = Math.min(Math.max(0, loopStart), duration);\n return duration - start > 0 ? duration - start : duration;\n}\n\n/** Folds an over-run playhead back into the loop region, reporting how many\n * spans were crossed so continuous time (wraps × span + time) never jumps. */\nexport function foldLoopTime(\n time: number,\n duration: number,\n loopStart = 0\n): { time: number; wraps: number } {\n if (!Number.isFinite(time) || !Number.isFinite(duration) || duration <= 0) {\n return { time: 0, wraps: 0 };\n }\n if (time < duration) return { time, wraps: 0 };\n const span = loopSpan(duration, loopStart);\n const base = duration - span;\n const over = time - base;\n return { time: base + (over % span), wraps: Math.floor(over / span) };\n}\n\nexport const TIMELINE_CLIP_COLORS = [\n '#E8E8E8', // neutral white — slightly off-white so the pure-white selection ring still reads\n];\n\nconst EMPTY_TRANSPORT: TimelineTransport = Object.freeze({ time: 0, playing: false, duration: 0, wraps: 0 });\n\nclass TimelineStoreClass {\n private timelines: Map<string, TimelineMeta> = new Map();\n private transports: Map<string, TimelineTransport> = new Map();\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private registrationCounts: Map<string, number> = new Map();\n private listCache: TimelineMeta[] | null = null;\n private rafId: number | null = null;\n private lastTick = 0;\n\n register(meta: TimelineMeta, options: { autoplay: boolean }): void {\n const existing = this.timelines.get(meta.id);\n if (existing && existing.name !== meta.name) {\n console.warn(\n `[dialkit] Timeline id \"${meta.id}\" is already registered by \"${existing.name}\"; ` +\n `\"${meta.name}\" will share and overwrite that transport.`\n );\n }\n this.registrationCounts.set(meta.id, (this.registrationCounts.get(meta.id) ?? 0) + 1);\n this.applyMeta(meta, options.autoplay);\n }\n\n update(meta: TimelineMeta): void {\n if (!this.timelines.has(meta.id)) return;\n this.applyMeta(meta, false);\n }\n\n unregister(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.timelines.delete(id);\n this.transports.delete(id);\n // Keep listener sets: subscribers (e.g. a mounted dock) may outlive the\n // registration — HMR tears down and re-registers the same id, and their\n // subscriptions must survive it. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n this.listCache = null;\n this.notifyGlobal();\n }\n\n play(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0 || transport.playing) return;\n // Play from the top when the playhead is parked at the end\n const restart = transport.time >= transport.duration;\n this.transports.set(id, {\n ...transport,\n time: restart ? 0 : transport.time,\n wraps: restart ? 0 : transport.wraps,\n playing: true,\n });\n this.notify(id);\n this.ensureLoop();\n }\n\n pause(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || !transport.playing) return;\n this.transports.set(id, { ...transport, playing: false });\n this.notify(id);\n }\n\n replay(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0) return;\n this.transports.set(id, { ...transport, time: 0, wraps: 0, playing: true });\n this.notify(id);\n this.ensureLoop();\n }\n\n seek(id: string, time: number): void {\n const transport = this.transports.get(id);\n if (!transport || !Number.isFinite(time)) return;\n const clamped = Math.min(transport.duration, Math.max(0, time));\n // Scrubbing pins the deterministic first-pass state\n this.transports.set(id, { ...transport, time: clamped, wraps: 0 });\n this.notify(id);\n }\n\n getTransport(id: string): TimelineTransport {\n return this.transports.get(id) ?? EMPTY_TRANSPORT;\n }\n\n getTimeline(id: string): TimelineMeta | undefined {\n return this.timelines.get(id);\n }\n\n getTimelines(): TimelineMeta[] {\n if (!this.listCache) {\n this.listCache = Array.from(this.timelines.values());\n }\n return this.listCache;\n }\n\n subscribe(id: string, listener: Listener): () => void {\n if (!this.listeners.has(id)) {\n this.listeners.set(id, new Set());\n }\n this.listeners.get(id)!.add(listener);\n return () => {\n const listeners = this.listeners.get(id);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.timelines.has(id)) {\n this.listeners.delete(id);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private applyMeta(meta: TimelineMeta, autoplay: boolean): void {\n const duration = Number.isFinite(meta.duration) ? Math.max(0, meta.duration) : 0;\n const loopStart = Number.isFinite(meta.loopStart)\n ? Math.min(duration, Math.max(0, meta.loopStart))\n : 0;\n const safeMeta = { ...meta, duration, loopStart };\n this.timelines.set(meta.id, safeMeta);\n\n const existing = this.transports.get(meta.id);\n if (existing) {\n // Structure changed or remounted — keep the playhead, clamp to the new length\n this.transports.set(meta.id, {\n time: Math.min(existing.time, duration),\n playing: duration > 0 && existing.playing,\n duration,\n wraps: existing.wraps,\n });\n } else {\n const playing = duration > 0 && autoplay;\n this.transports.set(meta.id, { time: 0, playing, duration, wraps: 0 });\n if (playing) this.ensureLoop();\n }\n\n this.listCache = null;\n this.notify(meta.id);\n this.notifyGlobal();\n }\n\n private ensureLoop(): void {\n if (this.rafId !== null || typeof window === 'undefined') return;\n this.lastTick = performance.now();\n this.rafId = window.requestAnimationFrame(this.tick);\n }\n\n private tick = (now: number): void => {\n // Advance by wall time. A backgrounded tab lands at the state it would\n // have reached, rather than silently slowing the animation on return.\n const dt = Math.max(0, (now - this.lastTick) / 1000);\n this.lastTick = now;\n\n let anyPlaying = false;\n for (const [id, transport] of this.transports) {\n if (!transport.playing) continue;\n\n const meta = this.timelines.get(id);\n const duration = meta?.duration ?? transport.duration;\n if (!Number.isFinite(duration) || duration <= 0) {\n this.transports.set(id, { time: 0, playing: false, duration: 0, wraps: 0 });\n this.notify(id);\n continue;\n }\n let time = transport.time + dt;\n let playing = true;\n let wraps = transport.wraps;\n\n if (time >= duration) {\n if (meta?.loop) {\n const folded = foldLoopTime(time, duration, meta.loopStart);\n time = folded.time;\n wraps += folded.wraps;\n } else {\n time = duration;\n playing = false;\n }\n }\n\n this.transports.set(id, { time, playing, duration, wraps });\n if (playing) anyPlaying = true;\n this.notify(id);\n }\n\n this.rafId = anyPlaying ? window.requestAnimationFrame(this.tick) : null;\n };\n\n private notify(id: string): void {\n this.listeners.get(id)?.forEach((fn) => fn());\n }\n\n private notifyGlobal(): void {\n this.globalListeners.forEach((fn) => fn());\n }\n}\n\n// PURE lets bundlers drop the timeline entirely for panel-only users.\nexport const TimelineStore = /* @__PURE__ */ new TimelineStoreClass();\n","// Deterministic sampling of transition curves, used for timeline scrubbing.\n// Springs use the closed-form damped-harmonic-oscillator solution with\n// Motion's own visualDuration/bounce → stiffness/damping mapping, so a\n// scrubbed position matches what Motion plays.\n\nimport { isEasingConfigValue, isSpringConfigValue } from './store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from './store/DialStore';\n\nexport type SpringParams = { stiffness: number; damping: number; mass: number };\n\nexport function round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function isTransitionConfig(value: unknown): value is TransitionConfig {\n return isSpringConfigValue(value) || isEasingConfigValue(value);\n}\n\nexport function isPhysicsSpring(transition: TransitionConfig): boolean {\n return (\n transition.type === 'spring' &&\n (transition.stiffness !== undefined || transition.damping !== undefined || transition.mass !== undefined)\n );\n}\n\nexport function springParams(spring: SpringConfig): SpringParams {\n if (isPhysicsSpring(spring)) {\n return { stiffness: spring.stiffness ?? 200, damping: spring.damping ?? 25, mass: spring.mass ?? 1 };\n }\n // Motion's mapping (motion-dom spring generator)\n const visualDuration = Math.max(0.05, spring.visualDuration ?? 0.3);\n const bounce = spring.bounce ?? 0.3;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 * Math.min(1, Math.max(0.05, 1 - bounce)) * Math.sqrt(stiffness);\n return { stiffness, damping, mass: 1 };\n}\n\n/** Normalized spring position 0 → 1 (may overshoot), starting at rest. */\nexport function springProgress(t: number, { stiffness, damping, mass }: SpringParams): number {\n if (t <= 0) return 0;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n if (zeta < 0.9999) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta < 1.0001) {\n return 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n }\n const wd = w0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * w0 + wd;\n const r2 = -zeta * w0 - wd;\n return 1 + (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r1 - r2);\n}\n\n/** Estimated time for a spring to visually settle (within 0.5% of target). */\nexport function springSettleDuration(params: SpringParams): number {\n const w0 = Math.sqrt(params.stiffness / params.mass);\n const zeta = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const decay =\n zeta >= 1\n ? zeta * w0 - w0 * Math.sqrt(Math.max(0, zeta * zeta - 1)) // slowest exponent\n : zeta * w0;\n const duration = Math.log(200) / Math.max(decay, 1e-6);\n return round2(clamp(duration, 0.05, 10));\n}\n\n/** Eased progress of a cubic-bezier easing at linear progress p (0–1). */\nexport function cubicBezierProgress(p: number, [x1, y1, x2, y2]: [number, number, number, number]): number {\n if (p <= 0) return 0;\n if (p >= 1) return 1;\n // Solve the bezier's parameter t for x = p (Newton-Raphson, bisection fallback)\n const sampleX = (t: number) => bezierAxis(t, x1, x2);\n const sampleY = (t: number) => bezierAxis(t, y1, y2);\n\n let t = p;\n for (let i = 0; i < 8; i++) {\n const x = sampleX(t) - p;\n if (Math.abs(x) < 1e-5) return sampleY(t);\n const dx = bezierAxisDerivative(t, x1, x2);\n if (Math.abs(dx) < 1e-6) break;\n t -= x / dx;\n }\n\n let lo = 0;\n let hi = 1;\n t = p;\n while (hi - lo > 1e-5) {\n if (sampleX(t) < p) lo = t;\n else hi = t;\n t = (lo + hi) / 2;\n }\n return sampleY(t);\n}\n\nfunction bezierAxis(t: number, a1: number, a2: number): number {\n return ((1 - 3 * a2 + 3 * a1) * t * t * t) + ((3 * a2 - 6 * a1) * t * t) + (3 * a1 * t);\n}\n\nfunction bezierAxisDerivative(t: number, a1: number, a2: number): number {\n return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1;\n}\n\nexport type ResolvedClipTransition = {\n /** Motion-ready transition with its duration driven by the clip length. */\n transition: TransitionConfig;\n /** Effective clip duration — the bar length. Derived for physics springs. */\n duration: number;\n /** Physics springs have emergent duration; the bar is derived, not resizable. */\n isPhysics: boolean;\n};\n\n// The bar IS the duration: time-mode springs get visualDuration from the\n// clip length, easings get duration from it, and physics springs derive\n// the clip length from their settle time.\nexport function resolveClipTransition(\n raw: TransitionConfig,\n clipDuration: number\n): ResolvedClipTransition {\n const safeDuration = Math.max(0.05, clipDuration);\n\n if (raw.type === 'easing') {\n return {\n transition: { ...raw, duration: safeDuration } as EasingConfig,\n duration: safeDuration,\n isPhysics: false,\n };\n }\n if (isPhysicsSpring(raw)) {\n return {\n transition: raw,\n duration: springSettleDuration(springParams(raw)),\n isPhysics: true,\n };\n }\n return {\n transition: { type: 'spring', bounce: raw.bounce ?? 0.2, visualDuration: safeDuration },\n duration: safeDuration,\n isPhysics: false,\n };\n}\n\n/**\n * Eased progress of a clip's transition at `elapsed` seconds after its start.\n * Springs keep evolving past the bar (bounce tail) and converge to 1;\n * easings clamp at 1. May overshoot 1 for bouncy curves.\n */\nexport function transitionProgress(\n elapsed: number,\n duration: number,\n transition: TransitionConfig | undefined\n): number {\n if (elapsed <= 0) return 0;\n if (!transition) {\n return duration > 0 ? Math.min(1, elapsed / duration) : 1;\n }\n if (transition.type === 'easing') {\n return cubicBezierProgress(Math.min(1, duration > 0 ? elapsed / duration : 1), transition.ease);\n }\n const params = springParams(transition);\n // Snap to done once settled so late samples are exactly 1\n if (elapsed >= springSettleDuration(params)) return 1;\n return springProgress(elapsed, params);\n}\n","// Framework-agnostic timeline logic: config parsing, value interpolation,\n// and per-frame clip-state derivation. The React hook (and future Solid/\n// Svelte/Vue adapters) stay thin wrappers over this module.\n//\n// The computation is split in two so the 60Hz clock stays cheap:\n// computeStaticClips — everything derivable from stored values alone\n// (runs only when a value is edited)\n// computeClipState — the time-dependent fields for one clip\n// (runs per frame, sampling cached curve params)\n//\n// Internally every animating clip is a sequence of steps: a from/to clip is\n// one implicit step, a `steps` clip is several chained ones, and a `props`\n// clip holds one step-list per property track (each with its own cycle and\n// phase offset). Untouched properties hold their prior value through a step.\n\nimport { formatLabel, inferStep, isHexColor, resolveDialValues } from './store/DialStore';\nimport type { DialConfig, DialValue, ResolvedValues, TransitionConfig } from './store/DialStore';\nimport {\n clamp,\n cubicBezierProgress,\n isPhysicsSpring,\n isTransitionConfig,\n resolveClipTransition,\n round2,\n springParams,\n springProgress,\n springSettleDuration,\n} from './transition-math';\nimport type { SpringParams } from './transition-math';\nimport { TIMELINE_CLIP_COLORS } from './store/TimelineStore';\nimport type { TimelineClipMeta, TimelineClipTrackMeta } from './store/TimelineStore';\n\n// ── Public config types ──\n\n// A clip is a named span on the timeline — one row each: when it starts, how\n// long it runs, and (optionally) the values it animates between plus the\n// curve it animates with. `from`/`to` accept any normal DialKit leaf values\n// (numbers, colors, etc.). Everything is editable by clicking the clip in\n// the dock. Clips with from/to get a default spring transition when none is\n// specified.\n//\n// A looping clip repeats its cycle from `at` until the timeline ends: the\n// bar is one cycle, so dragging it longer slows the loop. A loop that should\n// return to where it started (a bob, a pulse) is written as a sequence whose\n// last step lands back on the starting values — there is no mirror mode.\nexport type TimelineClipLoop = 'off' | 'repeat';\n\n// One leg of a sequence. Only the properties named in `to` animate; every\n// other property holds its value from the previous leg (or `from`).\n// The index allows `undefined` because TypeScript synthesizes `prop?:\n// undefined` union arms for legs that touch different property sets.\nexport type TimelineStepValues = {\n [key: string]: DialConfig[string] | undefined;\n};\n\nexport type TimelineStepConfig = {\n duration?: number;\n to?: TimelineStepValues;\n transition?: TransitionConfig;\n};\n\n// Independent per-property tracks. When one object's properties animate\n// with different timing, each property is a full track: its own values,\n// duration, curve, and a `delay` offset from the clip's `at` (a phase shift\n// for looping clips). The clip row becomes a read-only composite of its\n// tracks; editing happens on the tracks. Properties that share timing\n// belong in a plain from/to/steps clip instead.\nexport type TimelinePropStepConfig = {\n duration?: number;\n to?: number | string;\n transition?: TransitionConfig;\n};\n\nexport type TimelinePropConfig = {\n from?: number | string;\n to?: number | string;\n duration?: number;\n /** Offset from the clip's `at` in seconds. */\n delay?: number;\n transition?: TransitionConfig;\n steps?: TimelinePropStepConfig[];\n};\n\ntype TimelineClipBase = {\n at: number;\n duration?: number;\n transition?: TransitionConfig;\n loop?: boolean | TimelineClipLoop;\n};\n\n// The three clip shapes are mutually exclusive, encoded with optional-never\n// fields so TypeScript rejects ambiguous combinations (`steps` + `to`,\n// `props` + `from`, …) at the call site. Parse warns for untyped consumers.\nexport type TimelineClipConfig = TimelineClipBase &\n (\n | {\n from?: DialConfig;\n to?: DialConfig;\n steps?: never;\n props?: never;\n }\n | {\n from?: DialConfig;\n to?: never;\n /** Sequential legs on one row — a segmented bar; boundaries retime legs. */\n steps: TimelineStepConfig[];\n props?: never;\n }\n | {\n from?: never;\n to?: never;\n steps?: never;\n /** Independent per-property tracks — mutually exclusive with from/to/steps. */\n props: { [prop: string]: TimelinePropConfig };\n }\n );\n\n/** Nested keys group clips into a collapsible layer — purely presentational. */\nexport type TimelineGroupConfig = {\n [key: string]: TimelineClipConfig;\n};\n\nexport type TimelineConfig = {\n /** Total timeline length in seconds. Inferred from the last clip when omitted. */\n duration?: number;\n} & {\n [key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;\n};\n\n/** CSS-friendly output for consumers not using Motion — spread into a style. */\nexport type TimelineClipCss = {\n transitionDuration: string;\n transitionTimingFunction: string;\n};\n\nexport type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {\n at: number;\n duration: number;\n /** Effective code-defined loop mode. */\n loop: TimelineClipLoop;\n /** Playhead is at or past the clip start. */\n started: boolean;\n /** Playhead is inside the clip — for looping clips, inside any cycle. */\n active: boolean;\n /** Playhead is past the clip end (for looping clips, past the timeline end). */\n done: boolean;\n /**\n * 0–1 position of the playhead within the clip — cycle progress (a\n * sawtooth) for looping clips, sequence progress for steps clips.\n */\n progress: number;\n /** Index of the leg under the playhead, for sequence clips. */\n step: C['steps'] extends TimelineStepConfig[] ? number : undefined;\n from: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : undefined;\n to: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? ResolvedValues<C['to']>\n : undefined;\n /** `to` once the clip has started, `from` before — hand it to Motion's animate.\n * For sequences this is the final merged state; for props clips, per-track\n * endpoint records. */\n animate: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string> | undefined\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : ResolvedValues<C['to']> | undefined\n : undefined;\n /** The clip's editable curve — single-curve clips only. */\n transition: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TransitionConfig\n : undefined;\n /** Duration + timing-function for native CSS transitions — single-curve clips only. */\n css: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TimelineClipCss\n : undefined;\n /**\n * Values interpolated through the clip's curves at the current playhead —\n * bind to style for true scrubbing: the element is exactly at this point\n * in time whether playing, paused, or scrubbing. Sequence clips report the\n * merged state of all legs (declare every animated property in `from`);\n * props clips report every track's value.\n */\n current: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : undefined\n : undefined;\n};\n\nexport type TimelineGroupValues<G extends TimelineGroupConfig> = {\n [K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<G[K], TimelineClipConfig>\n >;\n};\n\nexport type DialTimelineValues<T extends TimelineConfig> = {\n time: number;\n playing: boolean;\n duration: number;\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<T[K], TimelineClipConfig>\n >;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig\n ? never\n : T[K] extends TimelineGroupConfig\n ? K\n : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;\n};\n\nexport const CLIP_VALUE_STEP = 0.01;\nexport const TIMELINE_MIN_CLIP_DURATION = 0.05;\nconst DEFAULT_STEP_DURATION = 0.3;\nconst DEFAULT_CLIP_TRANSITION: TransitionConfig = { type: 'spring', bounce: 0.2 };\nconst RESERVED_KEYS = new Set(['time', 'playing', 'duration', 'play', 'pause', 'replay', 'seek']);\n\n// ── Config parsing ──\n\nexport type ParsedTimeline = {\n duration: number;\n dialConfig: DialConfig;\n clips: TimelineClipMeta[];\n};\n\nfunction isClipConfig(value: unknown): value is TimelineClipConfig {\n return isPlainObject(value) && Number.isFinite((value as TimelineClipConfig).at);\n}\n\n// A group is a plain object (no `at`) with at least one clip entry — nested\n// one level. Non-clip children are skipped individually (with a warning)\n// rather than invalidating the whole group.\nfunction isGroupConfig(value: unknown): value is TimelineGroupConfig {\n if (!isPlainObject(value) || 'at' in value) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.some(isClipConfig);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, value)\n : fallback;\n}\n\nfunction animatedDuration(value: unknown, fallback = DEFAULT_STEP_DURATION): number {\n return Math.max(TIMELINE_MIN_CLIP_DURATION, nonNegativeFinite(value, fallback));\n}\n\nfunction transitionDefaultDuration(transition: TransitionConfig): number {\n if (transition.type === 'easing') return animatedDuration(transition.duration);\n // Motion gives physics parameters precedence over time parameters when a\n // mixed config reaches it, so duration inference must make the same choice.\n if (isPhysicsSpring(transition)) {\n return animatedDuration(springSettleDuration(springParams(transition)));\n }\n if (transition.visualDuration !== undefined) return animatedDuration(transition.visualDuration);\n return animatedDuration(springSettleDuration(springParams(transition)));\n}\n\n// Bar length defaults: physics always owns its emergent duration. Time-based\n// curves use an explicit bar duration first, then their own duration, then the\n// standard step duration. `inheritedTransition` matters for physics because a\n// step/track can inherit an advanced spring from its parent.\nfunction defaultStepDuration(\n step: { duration?: number; transition?: TransitionConfig },\n inheritedTransition?: TransitionConfig\n): number {\n const curve = step.transition ?? inheritedTransition;\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (step.duration !== undefined) return animatedDuration(step.duration);\n if (step.transition) return transitionDefaultDuration(step.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultTrackDuration(\n track: TimelinePropConfig,\n inheritedTransition?: TransitionConfig\n): number {\n const curve = track.transition ?? inheritedTransition;\n if (track.steps?.length) {\n return track.steps.reduce((sum, step) => sum + defaultStepDuration(step, curve), 0);\n }\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (track.duration !== undefined) return animatedDuration(track.duration);\n if (track.transition) return transitionDefaultDuration(track.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultClipDuration(clip: TimelineClipConfig): number {\n const defaultCurve = isTransitionConfig(clip.transition)\n ? clip.transition\n : DEFAULT_CLIP_TRANSITION;\n if (clip.props) {\n return Object.values(clip.props).reduce(\n (max, track) => Math.max(\n max,\n nonNegativeFinite(track.delay) + defaultTrackDuration(track, defaultCurve)\n ),\n 0\n );\n }\n if (clip.steps?.length) {\n return clip.steps.reduce((sum, step) => sum + defaultStepDuration(step, defaultCurve), 0);\n }\n\n const animating = Boolean(clip.transition || clip.from || clip.to);\n // Marker windows are allowed to be zero-length; actual animations are not.\n if (!animating) return nonNegativeFinite(clip.duration);\n if (isPhysicsSpring(defaultCurve)) return transitionDefaultDuration(defaultCurve);\n if (clip.duration !== undefined) return animatedDuration(clip.duration);\n if (isTransitionConfig(clip.transition)) return transitionDefaultDuration(clip.transition);\n // A from/to clip with neither duration nor transition animates with the\n // default spring, so its bar defaults to that spring's settle time instead\n // of collapsing to the minimum bar length. Markers stay zero-length.\n return clip.from || clip.to ? transitionDefaultDuration(DEFAULT_CLIP_TRANSITION) : 0;\n}\n\nexport function normalizeLoopMode(value: unknown): TimelineClipLoop {\n // `mirror` no longer exists — sequences whose last step returns home\n // replaced it. Legacy values fold into `repeat`.\n if (value === true || value === 'mirror' || value === 'repeat') return 'repeat';\n return 'off';\n}\n\n// The bar owns the duration, so stored transitions carry only their shape:\n// bounce for time springs, physics params as-is, and easings keep their\n// (structural) duration field pinned to the clip length.\nfunction normalizeStoredTransition(transition: TransitionConfig, clipDuration: number): TransitionConfig {\n if (transition.type === 'easing') {\n return { ...transition, duration: clipDuration };\n }\n if (isPhysicsSpring(transition)) {\n return transition;\n }\n return { type: 'spring', bounce: transition.bounce ?? 0.2 };\n}\n\ntype ClipParseEntry = {\n path: string;\n childKey: string;\n group?: string;\n clip: TimelineClipConfig;\n};\n\nfunction collectClipEntries(config: TimelineConfig): ClipParseEntry[] {\n const entries: ClipParseEntry[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (key === 'duration') continue;\n if (RESERVED_KEYS.has(key)) {\n console.warn(`[dialkit] Timeline key \"${key}\" collides with a reserved key and was skipped.`);\n continue;\n }\n if (isClipConfig(value)) {\n entries.push({ path: key, childKey: key, clip: value });\n } else if (isGroupConfig(value)) {\n for (const [childKey, childClip] of Object.entries(value)) {\n if (isClipConfig(childClip)) {\n entries.push({ path: `${key}.${childKey}`, childKey, group: key, clip: childClip });\n } else {\n console.warn(\n `[dialkit] Timeline clip \"${key}.${childKey}\" is missing a numeric \"at\" and was skipped.`\n );\n }\n }\n } else {\n console.warn(\n `[dialkit] Timeline entry \"${key}\" is neither a clip (needs a numeric \"at\") nor a group of clips and was skipped.`\n );\n }\n }\n return entries;\n}\n\n/** Strips explicit-undefined leaves so step targets are safe to merge/range. */\nfunction definedValues(values: TimelineStepValues | undefined): DialConfig | undefined {\n if (!values) return undefined;\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\n\nfunction setDialPath(dialConfig: DialConfig, path: string, value: DialConfig): void {\n const segments = path.split('.');\n let node = dialConfig;\n for (const segment of segments.slice(0, -1)) {\n node = (node[segment] ??= {}) as DialConfig;\n }\n node[segments[segments.length - 1]] = value;\n}\n\nexport function parseTimelineConfig(config: TimelineConfig): ParsedTimeline {\n const entries = collectClipEntries(config);\n\n let maxEnd = 0;\n for (const { clip } of entries) {\n maxEnd = Math.max(maxEnd, nonNegativeFinite(clip.at) + defaultClipDuration(clip));\n }\n\n // Exact fit: the window ends when the content does, so a looping timeline\n // plays one full pass and wraps with no dead tail. Ceil (never round) to\n // 2dp — undershooting the content end would clip loops and drift their\n // phase every wrap. Set `duration` in config for slack to drag clips later.\n const duration =\n typeof config.duration === 'number' && Number.isFinite(config.duration) && config.duration > 0\n ? config.duration\n : maxEnd > 0\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : 1;\n\n const dialConfig: DialConfig = {};\n const clips: TimelineClipMeta[] = [];\n\n entries.forEach(({ path, childKey, group, clip }, index) => {\n // These combinations are untypeable (optional-never fields) but reachable\n // from plain JS — warn and pick a deterministic winner.\n const raw = clip as TimelineClipBase & {\n from?: DialConfig;\n to?: DialConfig;\n steps?: TimelineStepConfig[];\n props?: Record<string, TimelinePropConfig>;\n };\n if (raw.props && (raw.steps?.length || raw.from || raw.to)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"props\" is mutually exclusive with from/to/steps — using \"props\".`\n );\n } else if (raw.steps?.length && raw.to) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"to\" is ignored when \"steps\" is present — each leg's \"to\" defines its targets.`\n );\n }\n\n const hasSteps = Boolean(clip.steps?.length) && !clip.props;\n const hasProps = Boolean(clip.props);\n const single = isTransitionConfig(clip.transition) ? clip.transition : undefined;\n const total = defaultClipDuration(clip);\n const defaultCurve = single ?? DEFAULT_CLIP_TRANSITION;\n const clipAt = nonNegativeFinite(clip.at);\n\n const clipDial: DialConfig = {\n at: [clipAt, 0, duration, CLIP_VALUE_STEP],\n };\n // Sequence and props clips derive their length from their parts — no\n // duration dial.\n if (!hasSteps && !hasProps) {\n clipDial.duration = [total, 0, duration, CLIP_VALUE_STEP];\n }\n\n // Every animating single-curve clip gets an editable curve; the bar\n // drives its duration.\n if (!hasSteps && !hasProps && (clip.transition || clip.from || clip.to)) {\n clipDial.transition = normalizeStoredTransition(defaultCurve, total);\n }\n\n // Independent property tracks: each is a full mini-clip folder — delay\n // (bar position), from/to or steps, and its own curve. The parent row\n // is a read-only composite.\n let tracks: TimelineClipTrackMeta[] | undefined;\n if (clip.props) {\n tracks = [];\n for (const [prop, track] of Object.entries(clip.props)) {\n if (TRACK_RESERVED.has(prop) || /^step\\d+$/.test(prop)) {\n console.warn(`[dialkit] Timeline property \"${prop}\" collides with a clip field and was skipped.`);\n continue;\n }\n const trackDuration = defaultTrackDuration(track, defaultCurve);\n const trackCurve = track.transition ?? defaultCurve;\n const hasTrackSteps = Boolean(track.steps?.length);\n const trackDial: DialConfig = {\n delay: [nonNegativeFinite(track.delay), 0, duration, CLIP_VALUE_STEP],\n };\n if (!hasTrackSteps) {\n trackDial.duration = [trackDuration, 0, duration, CLIP_VALUE_STEP];\n trackDial.transition = normalizeStoredTransition(trackCurve, trackDuration);\n }\n const fromValue = track.from ?? (hasTrackSteps ? undefined : track.to);\n if (hasTrackSteps && fromValue === undefined) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": track \"${prop}\" has steps but no \"from\" — declare its starting value.`\n );\n }\n if (fromValue !== undefined) {\n trackDial.from = scalarDial(prop, fromValue, hasTrackSteps ? track.steps![0]?.to : track.to);\n }\n if (!hasTrackSteps && track.to !== undefined) {\n trackDial.to = scalarDial(prop, track.to, fromValue);\n }\n let trackStepKeys: string[] | undefined;\n if (hasTrackSteps) {\n trackStepKeys = [];\n let previous = fromValue;\n track.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n trackStepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, trackCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? trackCurve, stepDuration),\n };\n if (step.to !== undefined) {\n stepDial.to = scalarDial(prop, step.to, previous);\n previous = step.to;\n }\n trackDial[stepKey] = stepDial;\n });\n }\n clipDial[prop] = trackDial;\n tracks.push({ prop, stepKeys: trackStepKeys });\n }\n }\n\n if (clip.from && !hasProps) {\n clipDial.from = withFromToRanges(\n clip.from,\n hasSteps ? definedValues(clip.steps![0]?.to) : clip.to\n );\n }\n if (!hasSteps && !hasProps && clip.to) {\n clipDial.to = withFromToRanges(clip.to, clip.from);\n }\n\n // One folder per leg: duration (the segment), target values, curve.\n // Untouched properties hold — the running state feeds slider ranges.\n let stepKeys: string[] | undefined;\n if (hasSteps) {\n stepKeys = [];\n let running: DialConfig | undefined = clip.from;\n clip.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n stepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, defaultCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? defaultCurve, stepDuration),\n };\n const stepTo = definedValues(step.to);\n if (stepTo) {\n // The hold rule needs a starting value: a property first animated\n // mid-sequence has nothing to interpolate from and jumps instead.\n for (const prop of Object.keys(stepTo)) {\n if (!running || !(prop in running)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": property \"${prop}\" first animates in step ${stepIndex + 1} with no starting value — declare it in \"from\".`\n );\n }\n }\n stepDial.to = withFromToRanges(stepTo, running);\n }\n clipDial[stepKey] = stepDial;\n running = { ...(running ?? {}), ...(stepTo ?? {}) };\n });\n }\n\n setDialPath(dialConfig, path, clipDial);\n\n clips.push({\n key: path,\n label: formatLabel(childKey),\n color: TIMELINE_CLIP_COLORS[index % TIMELINE_CLIP_COLORS.length],\n loop: normalizeLoopMode(clip.loop),\n group,\n stepKeys,\n tracks,\n });\n });\n\n return { duration, dialConfig, clips };\n}\n\nconst TRACK_RESERVED = new Set(['at', 'duration', 'loop', 'from', 'to', 'transition', 'delay']);\n\n// A scalar track value as a dial — wraps it in a single-key record so\n// tracks and clips share exactly one range-inference policy.\nfunction scalarDial(prop: string, value: number | string, counterpart: number | string | undefined): DialConfig[string] {\n const record = withFromToRanges(\n { [prop]: value } as DialConfig,\n counterpart === undefined ? undefined : ({ [prop]: counterpart } as DialConfig)\n );\n return record[prop];\n}\n\n// ── from/to slider ranges ──\n\n// Bare numbers in from/to get property-aware slider ranges (the generic\n// DialKit inference is value-based, which turns `y: 0` into a 0–1 slider).\n// Ranges expand to include the actual from/to endpoints when they fall outside.\nconst FROM_TO_RANGE_PRESETS: [RegExp, { min: number; max: number; step: number }][] = [\n [/^(x|y|z|tx|ty|offsetx|offsety|translatex|translatey)$/i, { min: -100, max: 100, step: 1 }],\n [/rotat|angle|skew/i, { min: -180, max: 180, step: 1 }],\n [/^scale/i, { min: 0, max: 2, step: 0.01 }],\n [/opacity|alpha/i, { min: 0, max: 1, step: 0.01 }],\n [/blur|radius|spread/i, { min: 0, max: 100, step: 1 }],\n];\n\nfunction inferFromToRange(key: string, value: number, counterpart: number | undefined): [number, number, number, number] {\n const lo = Math.min(value, counterpart ?? value);\n const hi = Math.max(value, counterpart ?? value);\n\n const preset = FROM_TO_RANGE_PRESETS.find(([pattern]) => pattern.test(key))?.[1];\n if (preset) {\n return [value, Math.min(preset.min, lo), Math.max(preset.max, hi), preset.step];\n }\n\n // Generic fallback: unit-ish values get 0–1, everything else a range\n // spanning both endpoints with room to overshoot.\n if (lo >= 0 && hi <= 1) {\n return [value, 0, 1, 0.01];\n }\n const extent = Math.max(Math.abs(lo), Math.abs(hi), 1);\n const min = lo < 0 ? -extent * 2 : 0;\n const max = Math.max(extent * 2, hi);\n return [value, min, max, inferStep(min, max)];\n}\n\n// Rewrites bare-number leaves in a from/to config as explicit range tuples,\n// using the matching key in the counterpart config to size the range.\nfunction withFromToRanges(config: DialConfig, counterpart: DialConfig | undefined): DialConfig {\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(config)) {\n const other = counterpart?.[key];\n if (typeof value === 'number') {\n result[key] = inferFromToRange(key, value, typeof other === 'number' ? other : undefined);\n } else if (isPlainObject(value) && !('type' in value)) {\n result[key] = withFromToRanges(\n value as DialConfig,\n isPlainObject(other) && !('type' in other) ? (other as DialConfig) : undefined\n );\n } else {\n result[key] = value as DialConfig[string];\n }\n }\n return result;\n}\n\n// ── Static clip data (edit-time) ──\n\n// A curve ready to sample: cached spring params or bezier points, plus the\n// duration easings normalize against.\ntype CurveStatic = {\n duration: number;\n spring?: SpringParams;\n settle?: number;\n ease?: [number, number, number, number];\n};\n\nfunction curveStatic(transition: TransitionConfig | undefined, duration: number): CurveStatic {\n if (!transition) return { duration };\n if (transition.type === 'easing') return { duration, ease: transition.ease };\n const spring = springParams(transition);\n return { duration, spring, settle: springSettleDuration(spring) };\n}\n\nfunction sampleCurve(curve: CurveStatic, elapsed: number): number {\n if (elapsed <= 0) return 0;\n if (curve.spring) {\n // Snap to done once settled so late samples are exactly 1\n if (curve.settle !== undefined && elapsed >= curve.settle) return 1;\n return springProgress(elapsed, curve.spring);\n }\n if (curve.ease) {\n return cubicBezierProgress(clamp(curve.duration > 0 ? elapsed / curve.duration : 1, 0, 1), curve.ease);\n }\n return curve.duration > 0 ? Math.min(1, elapsed / curve.duration) : 1;\n}\n\nexport type TimelineStepStatic = {\n key: string | null; // null for the implicit single step of a from/to clip\n offset: number; // seconds from clip/track start\n duration: number; // effective — physics-resolved\n isPhysics: boolean;\n /** Full property state at step start — the hold rule made concrete. */\n start: Record<string, unknown>;\n /** Targets this step animates; untouched properties hold `start`. */\n to: Record<string, unknown>;\n curve: CurveStatic;\n};\n\n/**\n * One track: a step chain with its own cycle length and phase offset from\n * the clip's `at`. This is the unified runtime model — a shared-timing clip\n * is exactly one track (prop unset, delay 0) whose steps carry the full\n * property record; a props clip is one single-property track per entry.\n */\nexport type TimelineTrackStatic = {\n /** Set for a props clip's single-property tracks; unset for the shared track. */\n prop?: string;\n delay: number;\n duration: number;\n steps: TimelineStepStatic[];\n};\n\nexport type TimelineClipStatic = {\n key: string;\n childKey: string;\n group?: string;\n at: number;\n /** Effective total duration — the bar length (one cycle for looping clips;\n * the widest track extent for props clips). */\n duration: number;\n loop: TimelineClipLoop;\n /** Where the clip stops affecting values: at + duration, or the timeline end when looping. */\n end: number;\n isPhysics: boolean;\n /** Motion-ready transition, its duration injected from the bar — single-curve clips only. */\n transition?: TransitionConfig;\n css?: TimelineClipCss;\n from?: Record<string, unknown>;\n /** Final merged state (the last leg's landing values for sequences). */\n to?: Record<string, unknown>;\n /** Every animating clip is tracks; empty for markers. */\n tracks: TimelineTrackStatic[];\n explicitSteps: boolean;\n /** Union of every property the clip touches. */\n props?: string[];\n};\n\nfunction resolvedAtPath(resolved: Record<string, unknown>, path: string): Record<string, unknown> {\n let node: unknown = resolved;\n for (const segment of path.split('.')) {\n node = isPlainObject(node) ? node[segment] : undefined;\n }\n return isPlainObject(node) ? node : {};\n}\n\nexport function computeStaticClips(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineClipStatic[] {\n const resolved = resolveDialValues(parsed.dialConfig, flatValues) as Record<string, unknown>;\n return parsed.clips.map((clip) =>\n buildClipStatic(resolvedAtPath(resolved, clip.key), clip, parsed.duration)\n );\n}\n\nexport type TimelineStaticState = {\n duration: number;\n clips: TimelineClipStatic[];\n};\n\n/**\n * Resolves the editable clip model and grows the timeline when a live value\n * creates content beyond its authored window. This is most important for\n * physics springs: changing stiffness/damping changes their emergent length.\n * The parsed duration remains the minimum, so shortening a clip never removes\n * the original editing room.\n */\nexport function computeStaticTimeline(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineStaticState {\n let clips = computeStaticClips(parsed, flatValues);\n const maxEnd = clips.reduce(\n (end, clip) => Math.max(end, clip.at + clip.duration),\n parsed.duration\n );\n const duration = maxEnd > parsed.duration\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : parsed.duration;\n\n if (duration !== parsed.duration) {\n clips = clips.map((clip) =>\n clip.loop === 'repeat' ? { ...clip, end: duration } : clip\n );\n }\n\n return { duration, clips };\n}\n\n/** The dock's resolver: the same static model the hook animates with,\n * rebuilt from flat stored values — bars, popovers, and playback can never\n * disagree about geometry. */\nexport function computeClipStaticFromValues(\n values: Record<string, DialValue>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n return buildClipStatic(unflattenClipValues(values, clip.key), clip, timelineDuration);\n}\n\nfunction buildClipStatic(\n clipResolved: Record<string, unknown>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n {\n const at = typeof clipResolved.at === 'number' ? clipResolved.at : 0;\n const from = isPlainObject(clipResolved.from) ? clipResolved.from : undefined;\n const single = isTransitionConfig(clipResolved.transition) ? clipResolved.transition : undefined;\n\n const staticClip: TimelineClipStatic = {\n key: clip.key,\n childKey: clip.group ? clip.key.slice(clip.group.length + 1) : clip.key,\n group: clip.group,\n at,\n duration: 0,\n loop: 'off',\n end: 0,\n isPhysics: false,\n from,\n tracks: [],\n explicitSteps: Boolean(clip.stepKeys?.length),\n };\n\n if (clip.tracks?.length) {\n // Independent property tracks: each chains its own scalar steps and\n // carries its own cycle length and phase offset.\n const tracks: (TimelineTrackStatic & { prop: string })[] = clip.tracks.map(({ prop, stepKeys }) => {\n const trackResolved = isPlainObject(clipResolved[prop])\n ? (clipResolved[prop] as Record<string, unknown>)\n : {};\n const delay = typeof trackResolved.delay === 'number' ? trackResolved.delay : 0;\n const fromValue = trackResolved.from;\n let steps: TimelineStepStatic[];\n let trackDuration = 0;\n\n if (stepKeys?.length) {\n let running = fromValue;\n steps = stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(trackResolved[stepKey])\n ? (trackResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = stepResolved.to;\n const step: TimelineStepStatic = {\n key: stepKey,\n offset: trackDuration,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running === undefined ? {} : { [prop]: running },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n };\n if (toValue !== undefined) running = toValue;\n trackDuration += effective.duration;\n return step;\n });\n } else {\n const storedDuration =\n typeof trackResolved.duration === 'number' ? trackResolved.duration : 0;\n const raw = isTransitionConfig(trackResolved.transition) ? trackResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = trackResolved.to;\n trackDuration = effective.duration;\n steps = [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: fromValue === undefined ? {} : { [prop]: fromValue },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n },\n ];\n }\n\n return { prop, delay, duration: trackDuration, steps };\n });\n\n staticClip.tracks = tracks;\n staticClip.props = tracks.map((track) => track.prop);\n staticClip.duration = tracks.reduce((max, track) => Math.max(max, track.delay + track.duration), 0);\n staticClip.from = Object.fromEntries(\n tracks.map((track) => [track.prop, track.steps[0].start[track.prop]])\n );\n staticClip.to = Object.fromEntries(\n tracks.map((track) => {\n const last = track.steps[track.steps.length - 1];\n return [track.prop, last.to[track.prop] ?? last.start[track.prop]];\n })\n );\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n return staticClip;\n }\n\n if (clip.stepKeys?.length) {\n // Sequence: chain the legs, threading the running state through so\n // untouched properties hold their prior value.\n let running: Record<string, unknown> = { ...(from ?? {}) };\n let offset = 0;\n const steps: TimelineStepStatic[] = clip.stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(clipResolved[stepKey])\n ? (clipResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const to = isPlainObject(stepResolved.to) ? stepResolved.to : {};\n const step: TimelineStepStatic = {\n key: stepKey,\n offset,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n };\n running = { ...running, ...to };\n offset += effective.duration;\n return step;\n });\n\n staticClip.tracks = [{ delay: 0, duration: offset, steps }];\n staticClip.duration = offset;\n staticClip.to = running;\n } else {\n const storedDuration = typeof clipResolved.duration === 'number' ? clipResolved.duration : 0;\n const to = isPlainObject(clipResolved.to) ? clipResolved.to : undefined;\n\n if (single) {\n const effective = resolveClipTransition(single, storedDuration);\n staticClip.duration = effective.duration;\n staticClip.isPhysics = effective.isPhysics;\n staticClip.transition = effective.transition;\n staticClip.css = transitionToCss(effective.transition);\n staticClip.to = to;\n if (from && to) {\n staticClip.tracks = [\n {\n delay: 0,\n duration: effective.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: from,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n },\n ],\n },\n ];\n }\n } else {\n // Curveless clip (markers, or defensive fallback): the bar is the\n // stored duration; from/to animate with the default spring.\n staticClip.duration = storedDuration;\n staticClip.to = to;\n if (from && to) {\n const base = resolveClipTransition(DEFAULT_CLIP_TRANSITION, storedDuration);\n staticClip.duration = base.duration;\n staticClip.tracks = [\n {\n delay: 0,\n duration: base.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: base.duration,\n isPhysics: false,\n start: from,\n to,\n curve: curveStatic(base.transition, base.duration),\n },\n ],\n },\n ];\n }\n }\n }\n\n if (staticClip.tracks.length) {\n const props = new Set<string>(Object.keys(from ?? {}));\n for (const track of staticClip.tracks) {\n for (const step of track.steps) {\n for (const prop of Object.keys(step.to)) props.add(prop);\n }\n }\n staticClip.props = Array.from(props);\n }\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n\n return staticClip;\n }\n}\n\n// ── Per-frame clip state ──\n\nfunction stepAtPosition(steps: TimelineStepStatic[], pos: number): TimelineStepStatic {\n for (const step of steps) {\n if (pos < step.offset + step.duration) return step;\n }\n return steps[steps.length - 1];\n}\n\n/** One property's value at a cycle position — the hold rule in one place,\n * shared by the frame pass and the waveform sampler. */\nfunction evalPropAtPos(steps: TimelineStepStatic[], prop: string, pos: number): unknown {\n const step = stepAtPosition(steps, pos);\n const within = Math.max(0, pos - step.offset);\n if (prop in step.to) {\n const eased = sampleCurve(step.curve, within);\n return interpolateResolved(step.start[prop], step.to[prop], eased);\n }\n return step.start[prop];\n}\n\n/**\n * `time` is the playhead (what the dock shows); `cycleTime` is continuous\n * time across timeline wraps (wraps × duration + time). Looping clips fold\n * against `cycleTime`, so a looping timeline never snaps their phase — the\n * window is a viewport onto animations that repeat forever. Scrubbing seeks\n * with cycleTime === time, which is the deterministic first-pass state.\n */\nexport function computeClipState(\n clip: TimelineClipStatic,\n time: number,\n cycleTime = time\n): Record<string, unknown> {\n const total = clip.duration;\n const looping = clip.loop === 'repeat' && total > 0;\n // Once the timeline has wrapped, a looping clip is already running even\n // before its `at` — it has been repeating since the previous pass.\n const started = time >= clip.at || (looping && cycleTime > time);\n const done = time >= clip.end;\n const elapsed = time - clip.at;\n const phaseElapsed = looping ? cycleTime - clip.at : elapsed;\n\n const fold = (e: number): number => (looping ? e % total : e);\n\n const basePos = started ? fold(Math.max(0, phaseElapsed)) : 0;\n const progress = total > 0 ? clamp(basePos / total, 0, 1) : started ? 1 : 0;\n\n let current: Record<string, unknown> | undefined;\n let stepIndex = 0;\n\n if (clip.tracks.length && clip.props?.length) {\n // One loop for every clip kind: each track folds against its own cycle,\n // offset by its delay. The delay applies once, then cycles fold — with\n // equal periods that is a permanent phase shift (Motion's semantics). A\n // shared-timing clip is a single track whose steps carry every property.\n current = {};\n for (const track of clip.tracks) {\n const props = track.prop !== undefined ? [track.prop] : clip.props;\n for (const prop of props) {\n const startValue = track.steps[0]?.start[prop];\n if (!started) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const phase = phaseElapsed - track.delay;\n if (phase <= 0) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const pos = looping && track.duration > 0 ? phase % track.duration : phase;\n const value = evalPropAtPos(track.steps, prop, pos);\n if (value !== undefined) current[prop] = value;\n }\n }\n const shared = clip.tracks[0];\n if (started && clip.explicitSteps && shared.prop === undefined) {\n stepIndex = shared.steps.indexOf(stepAtPosition(shared.steps, basePos));\n }\n }\n\n return {\n at: clip.at,\n duration: clip.duration,\n loop: clip.loop,\n started,\n active: started && !done,\n done,\n progress,\n step: clip.explicitSteps ? stepIndex : undefined,\n from: clip.from,\n to: clip.to,\n animate: started ? clip.to : clip.from,\n transition: clip.transition,\n css: clip.css,\n current,\n };\n}\n\n// ── Value interpolation ──\n\n// Mixes two resolved from/to value trees at eased progress p.\n// Numbers lerp (and can overshoot), hex colors mix in clamped RGB,\n// anything else switches at the midpoint.\nexport function interpolateResolved(from: unknown, to: unknown, p: number): unknown {\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * p;\n }\n if (typeof from === 'string' && typeof to === 'string') {\n const mixed = mixHexColors(from, to, p);\n if (mixed) return mixed;\n }\n if (isPlainObject(from) && isPlainObject(to)) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(from)) {\n result[key] = key in to ? interpolateResolved(from[key], to[key], p) : from[key];\n }\n for (const key of Object.keys(to)) {\n if (!(key in from)) result[key] = to[key];\n }\n return result;\n }\n return p < 0.5 ? from : to;\n}\n\nfunction parseHex(hex: string): [number, number, number, number] | null {\n if (!isHexColor(hex)) return null;\n let h = hex.slice(1);\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255,\n ];\n}\n\nfunction mixHexColors(a: string, b: string, p: number): string | null {\n const ca = parseHex(a);\n const cb = parseHex(b);\n if (!ca || !cb) return null;\n const t = clamp(p, 0, 1);\n const mixed = ca.map((v, i) => Math.round(v + (cb[i] - v) * t));\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n const rgb = `#${hex(mixed[0])}${hex(mixed[1])}${hex(mixed[2])}`;\n return mixed[3] === 255 ? rgb : `${rgb}${hex(mixed[3])}`;\n}\n\n// ── CSS output ──\n\n// Approximates the clip's transition as CSS transition properties so\n// non-Motion consumers can use native CSS. Easing configs map exactly;\n// springs are approximated with an overshoot bezier scaled by bounce.\nexport function transitionToCss(transition: TransitionConfig | undefined): TimelineClipCss | undefined {\n if (!transition) return undefined;\n\n if (transition.type === 'easing') {\n return {\n transitionDuration: `${round2(transition.duration)}s`,\n transitionTimingFunction: `cubic-bezier(${transition.ease.map((v) => round2(v)).join(', ')})`,\n };\n }\n\n const params = springParams(transition);\n const dampingRatio = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const duration = transition.visualDuration ?? springSettleDuration(params);\n const bounce = transition.bounce ?? Math.max(0, round2(1 - dampingRatio));\n\n return {\n transitionDuration: `${round2(duration)}s`,\n transitionTimingFunction:\n bounce > 0.05\n ? `cubic-bezier(0.34, ${round2(1.2 + bounce)}, 0.64, 1)`\n : 'cubic-bezier(0.25, 0.6, 0.35, 1)',\n };\n}\n\n// ── Dock helpers ──\n\n/** Popover display values: swap stored shape-only transitions for their\n * effective configs (duration injected from the bar/segment) so the curve\n * editor shows the transition as it actually runs. */\nexport function timelinePopoverDisplayValues(\n values: Record<string, DialValue>,\n clipKey: string,\n stepKeys?: string[],\n stepKey?: string\n): Record<string, DialValue> {\n const display = { ...values };\n const swap = (path: string, duration: number) => {\n const raw = display[path];\n if (isTransitionConfig(raw)) display[path] = resolveClipTransition(raw, duration).transition;\n };\n\n if (stepKey) {\n swap(`${clipKey}.${stepKey}.transition`, numberValue(values[`${clipKey}.${stepKey}.duration`]));\n return display;\n }\n\n const cycle = stepKeys?.length\n ? stepKeys.reduce((sum, sk) => sum + numberValue(values[`${clipKey}.${sk}.duration`]), 0)\n : numberValue(values[`${clipKey}.duration`]);\n\n swap(`${clipKey}.transition`, cycle);\n return display;\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : 0;\n}\n\n// ── Property lanes ──\n\n/** Rebuilds the nested resolved shape for one clip from flat stored values —\n * the dock's inverse of the panel's path flattening. */\nfunction unflattenClipValues(\n values: Record<string, DialValue>,\n clipKey: string\n): Record<string, unknown> {\n const prefix = `${clipKey}.`;\n const result: Record<string, unknown> = {};\n const entries = Object.entries(values)\n .filter(([path]) => path.startsWith(prefix))\n .map(([path, value]) => ({ segments: path.slice(prefix.length).split('.'), value }))\n .sort((a, b) => a.segments.length - b.segments.length);\n\n for (const { segments, value } of entries) {\n let node = result;\n for (let i = 0; i < segments.length - 1; i++) {\n const existing = node[segments[i]];\n node = (isPlainObject(existing) ? existing : (node[segments[i]] = {})) as Record<string, unknown>;\n }\n node[segments[segments.length - 1]] = cloneTimelineValue(value);\n }\n return result;\n}\n\nfunction cloneTimelineValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneTimelineValue);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, cloneTimelineValue(nested)])\n );\n}\n\n/** Dragging a track bar edits the property's phase offset. */\nexport function clampTrackDelay(\n delay: number,\n at: number,\n trackDuration: number,\n timelineDuration: number\n): number {\n return clamp(round2(delay), 0, Math.max(0, round2(timelineDuration - at - trackDuration)));\n}\n\n// Clip-edit clamp policy — one place, shared by every gesture/consumer.\nexport function clampClipMove(at: number, duration: number, timelineDuration: number): number {\n return clamp(round2(at), 0, Math.max(0, timelineDuration - duration));\n}\n\nexport function clampClipResizeEnd(duration: number, at: number, timelineDuration: number): number {\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, timelineDuration - at);\n}\n\nexport function clampClipResizeStart(\n newAt: number,\n at: number,\n duration: number\n): { at: number; duration: number } {\n const clampedAt = clamp(round2(newAt), 0, at + duration - TIMELINE_MIN_CLIP_DURATION);\n return { at: clampedAt, duration: round2(at + duration - clampedAt) };\n}\n\n/** Resizing one leg of a sequence: the other legs keep their length, the\n * whole bar must still fit the timeline. */\nexport function clampStepResize(\n duration: number,\n at: number,\n otherStepsTotal: number,\n timelineDuration: number\n): number {\n const max = Math.max(TIMELINE_MIN_CLIP_DURATION, timelineDuration - at - otherStepsTotal);\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, max);\n}\n\n/** Copy-for-agent export: strip editor-only state, normalize shape-only\n * transitions, resolve physics durations, and drop zero-value defaults. */\nexport function normalizeTimelineValuesForCopy(\n values: Record<string, DialValue>,\n clips: TimelineClipMeta[]\n): Record<string, DialValue> {\n const normalized: Record<string, DialValue> = { ...values };\n\n // Transition mode is editor UI state, not part of a DialKit config. It is\n // stored beside values so mode switches survive presets, but must never be\n // included in the tune → copy → remove payload.\n for (const path of Object.keys(normalized)) {\n if (path.endsWith('.__mode')) delete normalized[path];\n }\n\n const normalizeTransitionAt = (transitionPath: string, durationPath: string) => {\n const raw = normalized[transitionPath];\n if (!isTransitionConfig(raw)) return;\n if (isPhysicsSpring(raw)) {\n // A mode switch can leave the previous time-based bar duration stored.\n // Export the spring's actual derived length so the copied config exactly\n // matches the timeline the author just tuned.\n normalized[durationPath] = transitionDefaultDuration(raw);\n }\n normalized[transitionPath] = normalizeStoredTransition(\n raw,\n numberValue(normalized[durationPath])\n );\n };\n\n for (const clip of clips) {\n for (const stepKey of clip.stepKeys ?? []) {\n normalizeTransitionAt(\n `${clip.key}.${stepKey}.transition`,\n `${clip.key}.${stepKey}.duration`\n );\n }\n\n normalizeTransitionAt(`${clip.key}.transition`, `${clip.key}.duration`);\n\n // Property tracks: normalize each track's transitions against its own\n // durations, drop zero delays (the config default).\n for (const track of clip.tracks ?? []) {\n const trackKey = `${clip.key}.${track.prop}`;\n for (const stepKey of track.stepKeys ?? []) {\n normalizeTransitionAt(\n `${trackKey}.${stepKey}.transition`,\n `${trackKey}.${stepKey}.duration`\n );\n }\n normalizeTransitionAt(`${trackKey}.transition`, `${trackKey}.duration`);\n if (normalized[`${trackKey}.delay`] === 0) {\n delete normalized[`${trackKey}.delay`];\n }\n }\n\n delete normalized[`${clip.key}.loop`];\n }\n return normalized;\n}\n\n// ── Formatting ──\n\nexport function formatClock(time: number, tenths = false): string {\n const safe = Math.max(0, time);\n const minutes = Math.floor(safe / 60);\n const seconds = safe - minutes * 60;\n const secondsText = tenths\n ? seconds.toFixed(1).padStart(4, '0')\n : String(Math.floor(seconds)).padStart(2, '0');\n return `${String(minutes).padStart(2, '0')}:${secondsText}`;\n}\n\nexport function formatSeconds(value: number): string {\n return `${round2(value)}s`;\n}\n\nexport function formatStepLabel(stepKey: string): string {\n const match = /^step(\\d+)$/.exec(stepKey);\n return match ? `Step ${match[1]}` : formatLabel(stepKey);\n}\n","import type { DialKitPersistOptions } from '../store/DialStore';\nimport type { TimelineMeta, TimelineTransport } from '../store/TimelineStore';\nimport { loopSpan } from '../store/TimelineStore';\nimport {\n computeClipState,\n type DialTimelineValues,\n type ParsedTimeline,\n type TimelineClipStatic,\n type TimelineConfig,\n} from '../timeline-core';\n\nexport interface DialTimelineOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n /** Start playing on mount. Defaults to true. */\n autoplay?: boolean;\n /**\n * Loop when the playhead reaches the end. `true` restarts the whole\n * timeline; `{ from }` wraps back to that time instead, so clips before it\n * play once and looping clips keep cycling forever. Defaults to false.\n */\n loop?: boolean | { from: number };\n}\n\nexport type TimelineActions = {\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n};\n\n/** One resolution of the public loop option, shared by every adapter. */\nexport function resolveTimelineLoop(\n loop: DialTimelineOptions['loop']\n): { enabled: boolean; start: number } {\n if (typeof loop === 'object' && loop !== null) {\n return {\n enabled: true,\n start: Number.isFinite(loop.from) ? Math.max(0, loop.from) : 0,\n };\n }\n return { enabled: Boolean(loop), start: 0 };\n}\n\nexport function buildTimelineMeta(\n id: string,\n name: string,\n duration: number,\n parsed: ParsedTimeline,\n loop: DialTimelineOptions['loop']\n): TimelineMeta {\n const resolvedLoop = resolveTimelineLoop(loop);\n return {\n id,\n name,\n duration,\n loop: resolvedLoop.enabled,\n loopStart: resolvedLoop.start,\n clips: parsed.clips,\n };\n}\n\n/**\n * Framework-neutral frame pass. Adapters only own lifecycle and reactivity;\n * the value shape and loop-cycle math stay identical everywhere.\n */\nexport function buildTimelineValues<T extends TimelineConfig>(\n staticClips: TimelineClipStatic[],\n transport: TimelineTransport,\n timelineDuration: number,\n loopStart: number,\n actions: TimelineActions\n): DialTimelineValues<T> {\n const result: Record<string, unknown> = {\n time: transport.time,\n playing: transport.playing,\n duration: timelineDuration,\n ...actions,\n };\n\n const span = loopSpan(transport.duration, loopStart);\n const cycleTime = (span > 0 ? transport.wraps * span : 0) + transport.time;\n for (const clip of staticClips) {\n const state = computeClipState(clip, transport.time, cycleTime);\n if (clip.group) {\n const bucket = (result[clip.group] ??= {}) as Record<string, unknown>;\n bucket[clip.childKey] = state;\n } else {\n result[clip.key] = state;\n }\n }\n\n return result as DialTimelineValues<T>;\n}\n","type Listener = () => void;\n\ntype VisibilityController = {\n visible?: boolean;\n defaultVisible: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n};\n\n/**\n * UI-only state shared by the toolkit root and the timeline portal.\n * Playback deliberately lives elsewhere: hiding the editor must never pause\n * or otherwise change the animation it is inspecting.\n */\nclass TimelineUiStoreClass {\n private visible = true;\n private initialized = false;\n private controllers = new Map<symbol, VisibilityController>();\n private listeners = new Set<Listener>();\n\n getVisible(): boolean {\n for (const controller of this.controllers.values()) {\n if (controller.visible !== undefined) return controller.visible;\n }\n return this.visible;\n }\n\n registerController(id: symbol, controller: VisibilityController): () => void {\n const previous = this.getVisible();\n if (!this.initialized) {\n this.visible = controller.defaultVisible;\n this.initialized = true;\n }\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n\n return () => {\n const before = this.getVisible();\n this.controllers.delete(id);\n if (this.controllers.size === 0) this.initialized = false;\n if (before !== this.getVisible()) this.notify();\n };\n }\n\n updateController(id: symbol, controller: VisibilityController): void {\n if (!this.controllers.has(id)) return;\n const previous = this.getVisible();\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n }\n\n requestVisible(visible: boolean): void {\n const current = this.getVisible();\n if (current === visible) return;\n\n const controlled = Array.from(this.controllers.values()).filter(\n (controller) => controller.visible !== undefined\n );\n if (controlled.length > 0) {\n controlled.forEach((controller) => controller.onVisibilityChange?.(visible));\n return;\n }\n\n this.visible = visible;\n this.controllers.forEach((controller) => controller.onVisibilityChange?.(visible));\n this.notify();\n }\n\n toggle(): void {\n this.requestVisible(!this.getVisible());\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport const TimelineUiStore = /* @__PURE__ */ new TimelineUiStoreClass();\n","import type { DialValue } from './store/DialStore';\n\n// The copy-for-agent export shared by the panel toolbar and the timeline dock.\nexport function buildCopyInstruction(\n hookName: string,\n panelName: string,\n values: Record<string, DialValue>\n): string {\n const jsonStr = JSON.stringify(values, null, 2);\n\n if (hookName === 'useDialTimeline' || hookName === 'createDialTimeline') {\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call. Keep the existing \\`clip.current\\` bindings while this timeline is being authored; do not convert the animation or remove DialKit yet.\n\nAdd this comment immediately above the ${hookName} call as a production handoff note:\n\n\\`\\`\\`tsx\n// TODO(production): DialKit's clip.current values are the scrubbable authoring preview.\n// Replace them with equivalent real Motion animations using the tuned timeline\n// timings and transitions, then remove ${hookName} and <DialTimeline />.\n\\`\\`\\``;\n }\n\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call.`;\n}\n","// Shared environment detection for dev-only rendering.\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nexport const isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n","import { createSignal, onMount, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { DialStore } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport { fromStore } from '../primitives';\nimport { ShortcutListener } from './ShortcutListener';\nimport { RootPanel } from './RootPanel';\nimport { Panel } from './Panel';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport {\n blockPanelDragClick,\n getPanelDragHandle,\n getPanelDragOffset,\n getPanelDragStart,\n getPanelOriginX,\n hasPanelDragMoved,\n type PanelDragOffset,\n type PanelDragStart,\n} from '../../panel-drag';\n\nexport type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\nexport type DialMode = 'popover' | 'inline';\nexport type DialTheme = 'light' | 'dark' | 'system';\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nconst isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n theme?: DialTheme;\n productionEnabled?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function DialRoot(props: DialRootProps) {\n const enabled = () => (props.productionEnabled ?? isDevDefault) !== false;\n return (\n <Show when={enabled()}>\n <DialRootInner {...props} />\n </Show>\n );\n}\n\nfunction DialRootInner(props: DialRootProps) {\n const panels = fromStore(\n () => DialStore.getPanels('panel'),\n (notify) => DialStore.subscribeGlobal(notify)\n );\n const timelines = fromStore(\n () => TimelineStore.getTimelines(),\n (notify) => TimelineStore.subscribeGlobal(notify)\n );\n // Hydration gate: server renders nothing, client's first render must match.\n const [mounted, setMounted] = createSignal(false);\n const [dragOffset, setDragOffset] = createSignal<PanelDragOffset | null>(null);\n const [activePosition, setActivePosition] = createSignal<DialPosition>(props.position ?? 'top-right');\n const inline = () => (props.mode ?? 'popover') === 'inline';\n let panelRef: HTMLDivElement | undefined;\n let lastDragOffset: PanelDragOffset | null = null;\n let dragging = false;\n let dragStart: PanelDragStart | null = null;\n let didDrag = false;\n let dragTarget: HTMLElement | null = null;\n\n onMount(() => setMounted(true));\n\n // Open state is lifted from the panels/root folder via onOpenChange\n // callbacks (this replaces the old data-collapsed MutationObserver).\n // Panels that have not reported yet fall back to defaultOpen.\n const fallbackOpen = () => inline() || (props.defaultOpen ?? true);\n const panelOpenStates = new Map<string, boolean>();\n let rootFolderOpen: boolean | undefined;\n\n const anyOpen = () => {\n const list = panels();\n if (list.length > 1) return rootFolderOpen ?? fallbackOpen();\n return list.some((panel) => panelOpenStates.get(panel.id) ?? fallbackOpen());\n };\n\n // On collapse/expand: swap the drag offset between the expanded panel and\n // the collapsed bubble so a dragged bubble returns to where it was left.\n const applyDragOffsetForOpen = (open: boolean) => {\n if (inline()) return;\n const currentDragOffset = dragOffset();\n\n if (open) {\n if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n setActivePosition(bubbleCenterX < window.innerWidth / 2 ? 'top-left' : 'top-right');\n } else {\n setActivePosition(props.position ?? 'top-right');\n }\n setDragOffset(null);\n } else if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n } else if (lastDragOffset) {\n setDragOffset(lastDragOffset);\n }\n };\n\n const reactToOpenChange = (before: boolean) => {\n const after = anyOpen();\n if (after === before) return;\n applyDragOffsetForOpen(after);\n props.onOpenChange?.(after);\n };\n\n const handlePanelOpenChange = (panelId: string, open: boolean) => {\n const before = anyOpen();\n panelOpenStates.set(panelId, open);\n reactToOpenChange(before);\n };\n\n const handleRootOpenChange = (open: boolean) => {\n const before = anyOpen();\n rootFolderOpen = open;\n reactToOpenChange(before);\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (inline()) return;\n const panel = panelRef ?? null;\n const handle = getPanelDragHandle(event.target, panel);\n if (!panel || !handle) return;\n\n dragTarget = handle;\n dragStart = getPanelDragStart(event.clientX, event.clientY, panel);\n didDrag = false;\n dragging = true;\n handle.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging || !dragStart) return;\n\n if (!didDrag && !hasPanelDragMoved(dragStart, event.clientX, event.clientY)) return;\n didDrag = true;\n\n setDragOffset(getPanelDragOffset(dragStart, event.clientX, event.clientY));\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = false;\n dragStart = null;\n const handle = dragTarget;\n\n if (handle?.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n\n if (didDrag) {\n event.stopPropagation();\n if (handle) {\n blockPanelDragClick(handle);\n }\n }\n\n dragTarget = null;\n };\n\n const dragStyle = () => {\n const offset = dragOffset();\n return offset\n ? {\n top: `${offset.y}px`,\n left: `${offset.x}px`,\n right: 'auto',\n bottom: 'auto',\n }\n : undefined;\n };\n\n const timelineToggle = () => (\n <Show when={timelines().length > 0}>\n <TimelineToggleButton />\n </Show>\n );\n\n const content = () => (\n <ShortcutListener>\n <div class=\"dialkit-root\" data-mode={props.mode ?? 'popover'} data-theme={props.theme ?? 'system'}>\n <div\n ref={panelRef}\n class=\"dialkit-panel\"\n data-position={inline() ? undefined : (dragOffset() ? undefined : activePosition())}\n data-origin-x={inline() ? undefined : getPanelOriginX(activePosition(), dragOffset())}\n data-mode={props.mode ?? 'popover'}\n data-multiple={panels().length > 1 ? 'true' : undefined}\n style={dragStyle()}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <Show when={panels().length > 0} fallback={\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel\n title=\"DialKit\"\n defaultOpen={fallbackOpen()}\n inline={inline()}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle()}\n panelHeightOffset={2}\n >\n <div class=\"dialkit-timeline-toolkit-only\">Timeline</div>\n </RootPanel>\n </div>\n }>\n <Show\n when={panels().length > 1}\n fallback={\n <For each={panels()}>\n {(panel) => (\n <Panel\n panel={panel}\n defaultOpen={fallbackOpen()}\n inline={inline()}\n toolbarExtra={timelineToggle()}\n onOpenChange={(open) => handlePanelOpenChange(panel.id, open)}\n />\n )}\n </For>\n }\n >\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel\n title=\"DialKit\"\n defaultOpen={fallbackOpen()}\n inline={inline()}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle()}\n panelHeightOffset={2}\n >\n <For each={panels()}>\n {(panel) => (\n <Panel\n panel={panel}\n defaultOpen={true}\n variant=\"section\"\n />\n )}\n </For>\n </RootPanel>\n </div>\n </Show>\n </Show>\n </div>\n </div>\n </ShortcutListener>\n );\n\n return (\n <Show when={mounted() && (panels().length > 0 || timelines().length > 0)}>\n <Show when={!inline()} fallback={content()}>\n <Portal mount={document.body}>\n {content()}\n </Portal>\n </Show>\n </Show>\n );\n}\n","import { createEffect, createSignal, from, onCleanup, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport type { animate } from 'motion';\n\n/** Handle returned by motion's `animate()`; used instead of `any` for stored animations. */\nexport type AnimationHandle = ReturnType<typeof animate>;\n\n/**\n * Bridge an external subscribe/read store (DialStore et al.) into a Solid accessor.\n * Subscribes at setup on the client so updates between setup and mount are not\n * missed; on the server it reads directly without subscribing, so per-request\n * renders never leak listeners on the module-level store singleton.\n */\nexport function fromStore<T>(\n read: () => T,\n subscribe: (notify: () => void) => () => void\n): Accessor<T> {\n if (isServer) return read;\n const value = from<T>((set) => {\n // Wrap in an updater so values are never mistaken for setter callbacks.\n set(() => read());\n return subscribe(() => set(() => read()));\n });\n return value as Accessor<T>;\n}\n\nexport interface DropdownPresence {\n /** Logical open state (drives trigger styling, outside-click handling). */\n isOpen: Accessor<boolean>;\n /** DOM presence: stays true during the exit animation so it can play out. */\n mounted: Accessor<boolean>;\n open: () => void;\n close: () => void;\n /** Attach to the dropdown element via `ref`. */\n setRef: (el: HTMLElement) => void;\n contains: (target: Node) => boolean;\n}\n\n/**\n * Mount/unmount bookkeeping for an animated dropdown: `open()` mounts\n * immediately (the call site's ref callback runs the enter animation),\n * `close()` plays the provided exit animation and unmounts on completion.\n * Interrupted exits are stopped and re-opened cleanly.\n */\nexport function createDropdownPresence(\n animateExit: (el: HTMLElement, done: () => void) => AnimationHandle\n): DropdownPresence {\n const [isOpen, setIsOpen] = createSignal(false);\n const [mounted, setMounted] = createSignal(false);\n let el: HTMLElement | undefined;\n let exitAnim: AnimationHandle | null = null;\n\n onCleanup(() => exitAnim?.stop());\n\n const open = () => {\n exitAnim?.stop();\n exitAnim = null;\n setMounted(true);\n setIsOpen(true);\n };\n\n const close = () => {\n setIsOpen(false);\n if (!el || !mounted()) {\n setMounted(false);\n return;\n }\n exitAnim?.stop();\n exitAnim = animateExit(el, () => {\n setMounted(false);\n exitAnim = null;\n });\n };\n\n return {\n isOpen,\n mounted,\n open,\n close,\n setRef: (node: HTMLElement) => {\n el = node;\n },\n contains: (target: Node) => Boolean(el?.contains(target)),\n };\n}\n\n/**\n * While `isOpen`, dismiss on mousedown outside of `contains` and invoke\n * `onViewportChange` on window resize/scroll (for repositioning portaled\n * dropdowns). Listeners detach automatically when closed or unmounted.\n */\nexport function createDropdownDismiss(opts: {\n isOpen: Accessor<boolean>;\n contains: (target: Node) => boolean;\n onDismiss: () => void;\n onViewportChange?: () => void;\n}): void {\n createEffect(() => {\n if (!opts.isOpen()) return;\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.target instanceof Node && opts.contains(e.target)) return;\n opts.onDismiss();\n };\n document.addEventListener('mousedown', onMouseDown);\n onCleanup(() => document.removeEventListener('mousedown', onMouseDown));\n\n const onViewportChange = opts.onViewportChange;\n if (onViewportChange) {\n const handler = () => onViewportChange();\n window.addEventListener('resize', handler);\n window.addEventListener('scroll', handler, true);\n onCleanup(() => {\n window.removeEventListener('resize', handler);\n window.removeEventListener('scroll', handler, true);\n });\n }\n });\n}\n","import { createContext, useContext, createSignal, onMount, onCleanup, JSX } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport {\n getEffectiveStep,\n applySliderDelta,\n DRAG_SENSITIVITY,\n findControl,\n isInputFocused,\n getActiveModifier,\n} from '../../shortcut-utils';\n\ntype ShortcutState = {\n activePanelId: string | null;\n activePath: string | null;\n};\n\nconst defaultState: ShortcutState = { activePanelId: null, activePath: null };\n\nconst ShortcutContext = createContext<() => ShortcutState>(() => defaultState);\n\nexport function useShortcutContext() {\n return useContext(ShortcutContext);\n}\n\nexport function ShortcutListener(props: { children: JSX.Element }) {\n const [activeShortcut, setActiveShortcut] = createSignal<ShortcutState>(defaultState);\n\n // Keep referential stability when the target is unchanged so consumers\n // reading the context are not notified on every key repeat.\n const setShortcutTarget = (activePanelId: string | null, activePath: string | null) => {\n setActiveShortcut((prev) => (\n prev.activePanelId === activePanelId && prev.activePath === activePath\n ? prev\n : { activePanelId, activePath }\n ));\n };\n\n const activeKeys = new Set<string>();\n let isDragging = false;\n let lastMouseX: number | null = null;\n let dragAccumulator = 0;\n\n const resolveActiveTarget = (interaction: string) => {\n for (const key of activeKeys) {\n const panels = DialStore.getPanels();\n for (const panel of panels) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue;\n if (shortcut.key.toLowerCase() !== key) continue;\n if ((shortcut.interaction ?? 'scroll') !== interaction) continue;\n const control = DialStore.getPanel(panel.id)?.controls\n ? findControl(panel.controls, path)\n : null;\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n };\n\n onMount(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isInputFocused()) return;\n\n const key = e.key.toLowerCase();\n\n // Arrow keys adjust the active shortcut's slider\n if (key === 'arrowleft' || key === 'arrowright' || key === 'arrowup' || key === 'arrowdown') {\n if (activeKeys.size > 0) {\n const target = resolveActiveTarget('scroll') || resolveActiveTarget('drag') || resolveActiveTarget('move');\n if (target && target.control.type === 'slider') {\n e.preventDefault();\n const direction = (key === 'arrowright' || key === 'arrowup') ? 1 : -1;\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, direction);\n return;\n }\n }\n }\n\n const wasAlreadyHeld = activeKeys.has(key);\n activeKeys.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n setShortcutTarget(target.panelId, target.path);\n\n // Toggle: flip on first keydown only (not on key repeat)\n if (!wasAlreadyHeld && target.control.type === 'toggle') {\n const currentValue = DialStore.getValue(target.panelId, target.path) as boolean;\n DialStore.updateValue(target.panelId, target.path, !currentValue);\n }\n }\n\n // Reset mouse tracking when a new key is pressed (for move/drag)\n if (!wasAlreadyHeld) {\n lastMouseX = null;\n dragAccumulator = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeys.delete(key);\n\n // Reset drag state when key is released\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n\n if (activeKeys.size === 0) {\n setShortcutTarget(null, null);\n } else {\n let found = false;\n for (const remainingKey of activeKeys) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n setShortcutTarget(target.panelId, target.path);\n found = true;\n break;\n }\n }\n if (!found) {\n setShortcutTarget(null, null);\n }\n }\n };\n\n // Scroll: key+scroll and scroll-only\n const handleWheel = (e: WheelEvent) => {\n if (isInputFocused()) return;\n\n const modifier = getActiveModifier(e);\n\n // Key+scroll shortcuts\n if (activeKeys.size > 0) {\n for (const key of activeKeys) {\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (!target) continue;\n\n const { panelId, path, control } = target;\n const interaction = control.shortcut?.interaction ?? 'scroll';\n if (interaction !== 'scroll' || control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, control.shortcut!);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n }\n\n // Scroll-only shortcuts (no key needed)\n const scrollOnlyTargets = DialStore.resolveScrollOnlyTargets();\n for (const { panelId, path, control, shortcut } of scrollOnlyTargets) {\n if (control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, shortcut);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n };\n\n // Drag: key+mousedown starts, mousemove adjusts, mouseup stops\n const handleMouseDown = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDragging = true;\n lastMouseX = e.clientX;\n dragAccumulator = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n };\n\n // Move + Drag: mousemove handles both\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDragging) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseX !== null) {\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, steps);\n }\n }\n return;\n }\n\n // Move interaction (no click needed, just key held + mouse movement)\n const moveTarget = resolveActiveTarget('move');\n if (moveTarget) {\n if (lastMouseX === null) {\n lastMouseX = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeys.clear();\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n setShortcutTarget(null, null);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('wheel', handleWheel, { passive: false });\n window.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('blur', handleWindowBlur);\n\n onCleanup(() => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('wheel', handleWheel);\n window.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('blur', handleWindowBlur);\n });\n });\n\n return (\n <ShortcutContext.Provider value={activeShortcut}>\n {props.children}\n </ShortcutContext.Provider>\n );\n}\n","// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n","import { createSignal, createEffect, on, onCleanup, untrack, Show, JSX } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { ICON_PANEL } from '../../icons';\nimport type { AnimationHandle } from '../primitives';\n\nexport interface RootPanelProps {\n title: string;\n children: JSX.Element;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: JSX.Element;\n panelHeightOffset?: number;\n}\n\nconst morphTransition = { type: 'spring' as const, visualDuration: 0.15, bounce: 0.3 };\n\n/**\n * The top-level panel shell: header with panel icon and toolbar, and (in\n * popover mode) the bubble-to-panel morph animation with drag-friendly\n * collapsed state. Section folding lives in Folder.\n */\nexport function RootPanel(props: RootPanelProps) {\n // Inline vs popover picks a different component tree; treat it as static\n // configuration (DialRoot never changes mode at runtime).\n const inline = props.inline ?? false;\n\n const [isOpen, setIsOpen] = createSignal(props.defaultOpen ?? true);\n const [contentHeight, setContentHeight] = createSignal<number | undefined>(undefined);\n const [windowHeight, setWindowHeight] = createSignal(isServer ? 800 : window.innerHeight);\n let folderRef: HTMLDivElement | undefined;\n\n const handleToggle = () => {\n if (inline) return;\n const next = !isOpen();\n setIsOpen(next);\n props.onOpenChange?.(next);\n };\n\n const folderContent = () => (\n <div ref={folderRef} class=\"dialkit-folder dialkit-folder-root\" data-open={String(isOpen())}>\n <div class=\"dialkit-folder-header dialkit-panel-header\" onClick={handleToggle}>\n <div class=\"dialkit-folder-header-top\">\n <Show when={isOpen()}>\n <div class=\"dialkit-folder-title-row\">\n <span class=\"dialkit-folder-title dialkit-folder-title-root\">\n {props.title}\n </span>\n </div>\n </Show>\n\n <Show when={!inline}>\n <svg class=\"dialkit-panel-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n opacity=\"0.5\"\n d={ICON_PANEL.path}\n fill=\"currentColor\"\n />\n <circle cx={ICON_PANEL.circles[0].cx} cy={ICON_PANEL.circles[0].cy} r={ICON_PANEL.circles[0].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n <circle cx={ICON_PANEL.circles[1].cx} cy={ICON_PANEL.circles[1].cy} r={ICON_PANEL.circles[1].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n <circle cx={ICON_PANEL.circles[2].cx} cy={ICON_PANEL.circles[2].cy} r={ICON_PANEL.circles[2].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n </svg>\n </Show>\n </div>\n\n <Show when={props.toolbar && isOpen()}>\n <div class=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {props.toolbar}\n </div>\n </Show>\n </div>\n\n <Show when={isOpen()}>\n <div class=\"dialkit-folder-content\">\n <div class=\"dialkit-folder-inner\">{props.children}</div>\n </div>\n </Show>\n </div>\n );\n\n if (inline) {\n return (\n <div class=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent()}\n </div>\n );\n }\n\n let panelRef!: HTMLDivElement;\n let morphAnim: AnimationHandle | null = null;\n let tapAnim: AnimationHandle | null = null;\n\n const onWindowResize = () => setWindowHeight(window.innerHeight);\n window.addEventListener('resize', onWindowResize);\n onCleanup(() => {\n window.removeEventListener('resize', onWindowResize);\n morphAnim?.stop();\n tapAnim?.stop();\n });\n\n // Measure the whole folder (header + content) to size the open panel.\n createEffect(() => {\n if (!isOpen()) return;\n const el = folderRef;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n const h = el.offsetHeight;\n setContentHeight((prev) => (prev === h ? prev : h));\n });\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n });\n\n const measuredOpenHeight = () => (\n contentHeight() !== undefined\n ? Math.min(contentHeight()! + (props.panelHeightOffset ?? 10), windowHeight() - 32)\n : panelRef.getBoundingClientRect().height\n );\n\n // Bubble <-> panel morph: first run just applies resting styles; later\n // open-state changes animate. on() keeps height reads untracked so only\n // transitions trigger the morph.\n createEffect(on(isOpen, (open, prevOpen) => {\n const target = {\n width: open ? 280 : 42,\n height: open ? measuredOpenHeight() : 42,\n borderRadius: open ? 14 : 21,\n boxShadow: open ? 'var(--dial-shadow)' : 'var(--dial-shadow-collapsed)',\n };\n\n panelRef.style.cursor = open ? '' : 'pointer';\n panelRef.style.overflow = open ? 'hidden auto' : 'hidden';\n\n if (prevOpen === undefined) {\n panelRef.style.width = `${target.width}px`;\n panelRef.style.height = `${target.height}px`;\n panelRef.style.borderRadius = `${target.borderRadius}px`;\n panelRef.style.boxShadow = target.boxShadow;\n return;\n }\n\n morphAnim?.stop();\n morphAnim = animate(panelRef, target, {\n ...morphTransition,\n onComplete: () => {\n morphAnim = null;\n },\n });\n }));\n\n // Track content growth/shrink while open without re-triggering the morph.\n createEffect(on([contentHeight, windowHeight] as const, ([height, winHeight]) => {\n if (height === undefined || !untrack(isOpen)) return;\n panelRef.style.height = `${Math.min(height + (props.panelHeightOffset ?? 10), winHeight - 32)}px`;\n }, { defer: true }));\n\n // Expand-on-tap while collapsed uses a native listener: stopPropagation here\n // prevents the (delegated) header onClick from firing a second toggle.\n createEffect(() => {\n if (isOpen()) return;\n const handler = (e: Event) => {\n e.stopPropagation();\n handleToggle();\n };\n panelRef.addEventListener('click', handler);\n onCleanup(() => panelRef.removeEventListener('click', handler));\n });\n\n const pressTo = (scale: number) => {\n if (isOpen()) return;\n tapAnim?.stop();\n tapAnim = animate(panelRef, { scale }, morphTransition);\n };\n\n return (\n <div\n ref={panelRef}\n class=\"dialkit-panel-inner\"\n data-collapsed={String(!isOpen())}\n onPointerDown={() => {\n if (isOpen()) return;\n (document.activeElement as HTMLElement)?.blur?.();\n pressTo(0.9);\n }}\n onPointerUp={() => pressTo(1)}\n onPointerCancel={() => pressTo(1)}\n onPointerLeave={() => pressTo(1)}\n >\n {folderContent()}\n </div>\n );\n}\n","// Shared SVG icon geometry — single source of truth across all framework adapters.\n\nexport const ICON_CHEVRON = 'M6 9.5L12 15.5L18 9.5';\n\nexport const ICON_CHECK = 'M5 12.75L10 19L19 5';\n\nexport const ICON_PAUSE = [\n 'M6.75 3C5.23122 3 4 4.23122 4 5.75V18.25C4 19.7688 5.23122 21 6.75 21H7.25C8.76878 21 10 19.7688 10 18.25V5.75C10 4.23122 8.76878 3 7.25 3H6.75Z',\n 'M16.75 3C15.2312 3 14 4.23122 14 5.75V18.25C14 19.7688 15.2312 21 16.75 21H17.25C18.7688 21 20 19.7688 20 18.25V5.75C20 4.23122 18.7688 3 17.25 3H16.75Z',\n];\n\nexport const ICON_PLAY = 'M9.24394 2.36758C7.41419 1.18362 5 2.49701 5 4.67639V19.3238C5 21.5032 7.41419 22.8166 9.24394 21.6326L20.5624 14.3089C22.2371 13.2253 22.2372 10.775 20.5624 9.69129L9.24394 2.36758Z';\n\nexport const ICON_TIMELINE = [\n 'M18.868 10C20.8517 10.0003 22.2886 11.8914 21.7577 13.8027L20.369 18.8027C20.0083 20.1012 18.826 20.9999 17.4784 21H6.51941C5.17179 21 3.98948 20.1012 3.62878 18.8027L2.24011 13.8027C1.7092 11.8913 3.14603 10.0003 5.12976 10H18.868Z',\n 'M18.9989 6.5C19.5511 6.50007 19.9989 6.94776 19.9989 7.5C19.9989 8.05224 19.5511 8.49993 18.9989 8.5H4.9989C4.44661 8.5 3.9989 8.05228 3.9989 7.5C3.9989 6.94772 4.44661 6.5 4.9989 6.5H18.9989Z',\n 'M16.9989 3C17.5511 3.00007 17.9989 3.44776 17.9989 4C17.9989 4.55224 17.5511 4.99993 16.9989 5H6.9989C6.44661 5 5.9989 4.55228 5.9989 4C5.9989 3.44772 6.44661 3 6.9989 3H16.9989Z',\n];\n\nexport const ICON_CLIPBOARD = {\n board: 'M8 6C8 4.34315 9.34315 3 11 3H13C14.6569 3 16 4.34315 16 6V7H8V6Z',\n sparkle: 'M19.2405 16.1852L18.5436 14.3733C18.4571 14.1484 18.241 14 18 14C17.759 14 17.5429 14.1484 17.4564 14.3733L16.7595 16.1852C16.658 16.4493 16.4493 16.658 16.1852 16.7595L14.3733 17.4564C14.1484 17.5429 14 17.759 14 18C14 18.241 14.1484 18.4571 14.3733 18.5436L16.1852 19.2405C16.4493 19.342 16.658 19.5507 16.7595 19.8148L17.4564 21.6267C17.5429 21.8516 17.759 22 18 22C18.241 22 18.4571 21.8516 18.5436 21.6267L19.2405 19.8148C19.342 19.5507 19.5507 19.342 19.8148 19.2405L21.6267 18.5436C21.8516 18.4571 22 18.241 22 18C22 17.759 21.8516 17.5429 21.6267 17.4564L19.8148 16.7595C19.5507 16.658 19.342 16.4493 19.2405 16.1852Z',\n body: 'M16 5H17C18.6569 5 20 6.34315 20 8V11M8 5H7C5.34315 5 4 6.34315 4 8V18C4 19.6569 5.34315 21 7 21H12',\n};\n\nexport const ICON_ADD_PRESET = [\n 'M4 6H20',\n 'M4 12H10',\n 'M15 15L21 15',\n 'M18 12V18',\n 'M4 18H10',\n];\n\nexport const ICON_TRASH = [\n 'M5 6.5L5.80734 18.2064C5.91582 19.7794 7.22348 21 8.80023 21H15.1998C16.7765 21 18.0842 19.7794 18.1927 18.2064L19 6.5',\n 'M10 11V16',\n 'M14 11V16',\n 'M3.5 6H20.5',\n 'M8.07092 5.74621C8.42348 3.89745 10.0485 2.5 12 2.5C13.9515 2.5 15.5765 3.89745 15.9291 5.74621',\n];\n\nexport const ICON_PANEL = {\n path: 'M6.84766 11.75C6.78583 11.9899 6.75 12.2408 6.75 12.5C6.75 12.7592 6.78583 13.0101 6.84766 13.25H2C1.58579 13.25 1.25 12.9142 1.25 12.5C1.25 12.0858 1.58579 11.75 2 11.75H6.84766ZM14 11.75C14.4142 11.75 14.75 12.0858 14.75 12.5C14.75 12.9142 14.4142 13.25 14 13.25H12.6523C12.7142 13.0101 12.75 12.7592 12.75 12.5C12.75 12.2408 12.7142 11.9899 12.6523 11.75H14ZM3.09766 7.25C3.03583 7.48994 3 7.74075 3 8C3 8.25925 3.03583 8.51006 3.09766 8.75H2C1.58579 8.75 1.25 8.41421 1.25 8C1.25 7.58579 1.58579 7.25 2 7.25H3.09766ZM14 7.25C14.4142 7.25 14.75 7.58579 14.75 8C14.75 8.41421 14.4142 8.75 14 8.75H8.90234C8.96417 8.51006 9 8.25925 9 8C9 7.74075 8.96417 7.48994 8.90234 7.25H14ZM7.59766 2.75C7.53583 2.98994 7.5 3.24075 7.5 3.5C7.5 3.75925 7.53583 4.01006 7.59766 4.25H2C1.58579 4.25 1.25 3.91421 1.25 3.5C1.25 3.08579 1.58579 2.75 2 2.75H7.59766ZM14 2.75C14.4142 2.75 14.75 3.08579 14.75 3.5C14.75 3.91421 14.4142 4.25 14 4.25H13.4023C13.4642 4.01006 13.5 3.75925 13.5 3.5C13.5 3.24075 13.4642 2.98994 13.4023 2.75H14Z',\n circles: [\n { cx: '6', cy: '8', r: '0.998596' },\n { cx: '10.4999', cy: '3.5', r: '0.998657' },\n { cx: '9.75015', cy: '12.5', r: '0.997986' },\n ],\n};\n","import { batch, createSignal, createEffect, on, onMount, onCleanup, For, type JSX } from 'solid-js';\nimport { animate } from 'motion';\nimport { ICON_CLIPBOARD, ICON_CHECK, ICON_ADD_PRESET } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, PanelConfig, SpringConfig, TransitionConfig, DialValue } from '../../store/DialStore';\nimport type { AnimationHandle } from '../primitives';\nimport { useShortcutContext } from './ShortcutListener';\nimport { Folder } from './Folder';\nimport { RootPanel } from './RootPanel';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { TransitionControl } from './TransitionControl';\nimport { TextControl } from './TextControl';\nimport { SelectControl } from './SelectControl';\nimport { ColorControl } from './ColorControl';\nimport { PresetManager } from './PresetManager';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'root' | 'section';\n toolbarExtra?: JSX.Element;\n}\n\nexport function Panel(props: PanelProps) {\n const [copied, setCopied] = createSignal(false);\n const shortcutCtx = useShortcutContext();\n const [values, setValues] = createSignal<Record<string, DialValue>>(\n DialStore.getValues(props.panel.id)\n );\n const [presets, setPresets] = createSignal(DialStore.getPresets(props.panel.id));\n const [activePresetId, setActivePresetId] = createSignal(DialStore.getActivePresetId(props.panel.id));\n let addButtonRef!: HTMLButtonElement;\n let copyButtonRef!: HTMLButtonElement;\n let copyClipboardIconRef!: HTMLSpanElement;\n let copyCheckIconRef!: HTMLSpanElement;\n let addTapAnim: AnimationHandle | null = null;\n let copyTapAnim: AnimationHandle | null = null;\n let copyClipboardAnim: AnimationHandle | null = null;\n let copyCheckAnim: AnimationHandle | null = null;\n\n const tapTransition = { type: 'spring' as const, visualDuration: 0.15, bounce: 0.3 };\n\n onMount(() => {\n const unsub = DialStore.subscribe(props.panel.id, () => {\n batch(() => {\n setValues(DialStore.getValues(props.panel.id));\n setPresets(DialStore.getPresets(props.panel.id));\n setActivePresetId(DialStore.getActivePresetId(props.panel.id));\n });\n });\n onCleanup(unsub);\n });\n\n const handleAddPreset = () => {\n const nextNum = presets().length + 2;\n DialStore.savePreset(props.panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const jsonStr = JSON.stringify(values(), null, 2);\n const instruction = `Update the createDialKit configuration for \"${props.panel.name}\" with these values:\\n\\n\\`\\`\\`json\\n${jsonStr}\\n\\`\\`\\`\\n\\nApply these values as the new defaults in the createDialKit call.`;\n navigator.clipboard.writeText(instruction);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n // Icons render with their resting styles inline; only animate on changes.\n createEffect(on(copied, (isCopied) => {\n if (!copyClipboardIconRef || !copyCheckIconRef) return;\n\n copyClipboardAnim?.stop();\n copyCheckAnim?.stop();\n\n const transition = { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 };\n copyClipboardAnim = animate(copyClipboardIconRef, {\n opacity: isCopied ? 0 : 1,\n scale: isCopied ? 0.5 : 1,\n filter: isCopied ? 'blur(4px)' : 'blur(0px)',\n }, transition);\n copyCheckAnim = animate(copyCheckIconRef, {\n opacity: isCopied ? 1 : 0,\n scale: isCopied ? 1 : 0.5,\n filter: isCopied ? 'blur(0px)' : 'blur(4px)',\n }, transition);\n }, { defer: true }));\n\n onCleanup(() => {\n addTapAnim?.stop();\n copyTapAnim?.stop();\n copyClipboardAnim?.stop();\n copyCheckAnim?.stop();\n });\n\n const handleAddTapStart = () => {\n if (!addButtonRef) return;\n addTapAnim?.stop();\n addTapAnim = animate(addButtonRef, { scale: 0.9 }, tapTransition);\n };\n\n const handleAddTapEnd = () => {\n if (!addButtonRef) return;\n addTapAnim?.stop();\n addTapAnim = animate(addButtonRef, { scale: 1 }, tapTransition);\n };\n\n const handleCopyTapStart = () => {\n if (!copyButtonRef) return;\n copyTapAnim?.stop();\n copyTapAnim = animate(copyButtonRef, { scale: 0.95 }, tapTransition);\n };\n\n const handleCopyTapEnd = () => {\n if (!copyButtonRef) return;\n copyTapAnim?.stop();\n copyTapAnim = animate(copyButtonRef, { scale: 1 }, tapTransition);\n };\n\n const handleOpenChange = (open: boolean) => {\n props.onOpenChange?.(open);\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 label={control.label}\n value={value() as number}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx().activePanelId === props.panel.id && shortcutCtx().activePath === control.path}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n label={control.label}\n checked={value() as boolean}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx().activePanelId === props.panel.id && shortcutCtx().activePath === control.path}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n panelId={props.panel.id}\n path={control.path}\n label={control.label}\n spring={value() as SpringConfig}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n panelId={props.panel.id}\n path={control.path}\n label={control.label}\n value={value() as TransitionConfig}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'folder':\n return (\n <Folder title={control.label} defaultOpen={control.defaultOpen ?? true}>\n <For each={control.children ?? []}>\n {(child) => <>{renderControl(child)}</>}\n </For>\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n label={control.label}\n value={value() as string}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n label={control.label}\n value={value() as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n label={control.label}\n value={value() as string}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n default:\n return null;\n }\n };\n\n const renderControls = () => {\n return (\n <For each={props.panel.controls}>\n {(control) => (\n <>\n {control.type === 'action' ? (\n <button\n class=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(props.panel.id, control.path)}\n >\n {control.label}\n </button>\n ) : (\n renderControl(control)\n )}\n </>\n )}\n </For>\n );\n };\n\n const toolbar = (\n <>\n <button\n ref={addButtonRef}\n class=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n onPointerDown={handleAddTapStart}\n onPointerUp={handleAddTapEnd}\n onPointerCancel={handleAddTapEnd}\n onPointerLeave={handleAddTapEnd}\n title=\"Add preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_ADD_PRESET[0]} />\n <path d={ICON_ADD_PRESET[1]} />\n <path d={ICON_ADD_PRESET[2]} />\n <path d={ICON_ADD_PRESET[3]} />\n <path d={ICON_ADD_PRESET[4]} />\n </svg>\n </button>\n\n <PresetManager\n panelId={props.panel.id}\n presets={presets()}\n activePresetId={activePresetId()}\n onAdd={handleAddPreset}\n />\n\n <button\n ref={copyButtonRef}\n class=\"dialkit-toolbar-copy\"\n onClick={handleCopy}\n onPointerDown={handleCopyTapStart}\n onPointerUp={handleCopyTapEnd}\n onPointerCancel={handleCopyTapEnd}\n onPointerLeave={handleCopyTapEnd}\n title=\"Copy parameters\"\n >\n <span class=\"dialkit-toolbar-copy-icon-wrap\">\n <span\n ref={copyClipboardIconRef}\n class=\"dialkit-toolbar-copy-icon\"\n style={{ opacity: 1, transform: 'scale(1)', filter: 'blur(0px)', 'transform-origin': '50% 50%' }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"16\" height=\"16\">\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span\n ref={copyCheckIconRef}\n class=\"dialkit-toolbar-copy-icon\"\n style={{ opacity: 0, transform: 'scale(0.5)', filter: 'blur(4px)', 'transform-origin': '50% 50%' }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"16\" height=\"16\">\n <path d={ICON_CHECK} />\n </svg>\n </span>\n </span>\n Copy\n </button>\n\n {props.toolbarExtra}\n\n </>\n );\n\n if (props.variant === 'section') {\n return (\n <Folder title={props.panel.name} defaultOpen={props.defaultOpen ?? true} onOpenChange={handleOpenChange}>\n <div class=\"dialkit-panel-section-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n {renderControls()}\n </Folder>\n );\n }\n\n return (\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel title={props.panel.name} defaultOpen={props.defaultOpen ?? true} inline={props.inline ?? false} onOpenChange={handleOpenChange} toolbar={toolbar}>\n {renderControls()}\n </RootPanel>\n </div>\n );\n}\n","import { createSignal, createEffect, on, onCleanup, Show, JSX } from 'solid-js';\nimport { animate } from 'motion';\nimport { ICON_CHEVRON } from '../../icons';\nimport type { AnimationHandle } from '../primitives';\nimport { RootPanel } from './RootPanel';\n\ninterface FolderProps {\n title: string;\n children: JSX.Element;\n defaultOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /** @deprecated Use RootPanel instead; kept for backwards compatibility. */\n isRoot?: boolean;\n /** @deprecated Only meaningful with isRoot. */\n inline?: boolean;\n /** @deprecated Only meaningful with isRoot. */\n toolbar?: JSX.Element;\n /** @deprecated Only meaningful with isRoot. */\n panelHeightOffset?: number;\n}\n\nconst sectionTransition = { type: 'spring' as const, visualDuration: 0.35, bounce: 0.1 };\n\n/** Collapsible section with animated height/opacity and rotating chevron. */\nexport function Folder(props: FolderProps) {\n // Root panels are a different component; delegate for old call sites.\n if (props.isRoot) {\n return <RootPanel {...props} />;\n }\n\n const [isOpen, setIsOpen] = createSignal(props.defaultOpen ?? true);\n const [contentMounted, setContentMounted] = createSignal(props.defaultOpen ?? true);\n let skipFirstAnim = props.defaultOpen ?? true;\n let sectionContentRef: HTMLDivElement | undefined;\n let sectionAnim: AnimationHandle | null = null;\n let chevronRef: SVGSVGElement | undefined;\n let chevronAnim: AnimationHandle | null = null;\n\n onCleanup(() => {\n sectionAnim?.stop();\n chevronAnim?.stop();\n });\n\n // Chevron renders at its resting angle; only animate on changes.\n createEffect(on(isOpen, (open) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 0 : 180 },\n { type: 'spring', visualDuration: 0.35, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const handleToggle = () => {\n const next = !isOpen();\n setIsOpen(next);\n if (next) {\n sectionAnim?.stop();\n sectionAnim = null;\n if (sectionContentRef) {\n // If close was interrupted, animate the section back open.\n sectionAnim = animate(\n sectionContentRef,\n { height: 'auto', opacity: 1 },\n {\n ...sectionTransition,\n onComplete: () => {\n sectionAnim = null;\n },\n }\n );\n } else {\n // If fully unmounted, mount and let the ref callback run the enter animation.\n setContentMounted(true);\n }\n } else if (sectionContentRef) {\n const currentHeight = sectionContentRef.getBoundingClientRect().height;\n sectionContentRef.style.height = `${currentHeight}px`;\n sectionAnim?.stop();\n sectionAnim = animate(\n sectionContentRef,\n { height: 0, opacity: 0 },\n {\n ...sectionTransition,\n onComplete: () => {\n setContentMounted(false);\n sectionAnim = null;\n sectionContentRef = undefined;\n },\n }\n );\n } else {\n setContentMounted(false);\n }\n props.onOpenChange?.(next);\n };\n\n return (\n <div class=\"dialkit-folder\" data-open={String(isOpen())}>\n <div class=\"dialkit-folder-header\" onClick={handleToggle}>\n <div class=\"dialkit-folder-header-top\">\n <div class=\"dialkit-folder-title-row\">\n <span class=\"dialkit-folder-title\">{props.title}</span>\n </div>\n\n <svg\n ref={chevronRef}\n class=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style={{ transform: `rotate(${(props.defaultOpen ?? true) ? 0 : 180}deg)` }}\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </div>\n </div>\n\n <Show when={contentMounted()}>\n <div\n ref={(el) => {\n sectionContentRef = el;\n if (skipFirstAnim) {\n skipFirstAnim = false;\n return;\n }\n\n sectionAnim?.stop();\n el.style.height = '0px';\n el.style.opacity = '0';\n sectionAnim = animate(\n el,\n { height: 'auto', opacity: 1 },\n {\n ...sectionTransition,\n onComplete: () => {\n sectionAnim = null;\n },\n }\n );\n }}\n class=\"dialkit-folder-content\"\n style={{ 'clip-path': 'inset(0 -20px)' }}\n >\n <div class=\"dialkit-folder-inner\">{props.children}</div>\n </div>\n </Show>\n </div>\n );\n}\n","import { createSignal, createEffect, onMount, onCleanup, Show } from 'solid-js';\nimport { animate, motionValue } from 'motion';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport type { AnimationHandle } from '../primitives';\nimport {\n decimalsForStep,\n roundValue,\n snapToDecile,\n formatSliderShortcut,\n} from '../../shortcut-utils';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport function Slider(props: SliderProps) {\n const min = () => props.min ?? 0;\n const max = () => props.max ?? 1;\n const step = () => props.step ?? 0.01;\n\n let wrapperRef!: HTMLDivElement;\n let trackRef!: HTMLDivElement;\n let fillRef!: HTMLDivElement;\n let handleRef!: HTMLDivElement;\n let labelRef!: HTMLSpanElement;\n let valueSpanRef!: HTMLSpanElement;\n let inputRef!: HTMLInputElement;\n\n const [isInteracting, setIsInteracting] = createSignal(false);\n const [isDragging, setIsDragging] = createSignal(false);\n const [isHovered, setIsHovered] = createSignal(false);\n const [isValueHovered, setIsValueHovered] = createSignal(false);\n const [isValueEditable, setIsValueEditable] = createSignal(false);\n const [showInput, setShowInput] = createSignal(false);\n const [inputValue, setInputValue] = createSignal('');\n\n const fillPercent = motionValue(((props.value - min()) / (max() - min())) * 100);\n const rubberStretchPx = motionValue(0);\n const handleOpacityMv = motionValue(0);\n const handleScaleXMv = motionValue(0.25);\n const handleScaleYMv = motionValue(1);\n\n const applyFillStyles = (pct: number) => {\n if (fillRef) fillRef.style.width = `${pct}%`;\n if (handleRef) handleRef.style.left = `max(5px, calc(${pct}% - 9px))`;\n };\n\n const applyRubberStyles = (stretch: number) => {\n if (!trackRef) return;\n trackRef.style.width = `calc(100% + ${Math.abs(stretch)}px)`;\n trackRef.style.transform = `translateX(${stretch < 0 ? stretch : 0}px)`;\n };\n\n const applyHandleVisualStyles = () => {\n if (!handleRef) return;\n handleRef.style.opacity = String(handleOpacityMv.get());\n handleRef.style.transform = `translateY(-50%) scaleX(${handleScaleXMv.get()}) scaleY(${handleScaleYMv.get()})`;\n };\n\n // Sync fill from props when not interacting\n createEffect(() => {\n if (!isInteracting() && !snapAnim) {\n fillPercent.jump(((props.value - min()) / (max() - min())) * 100);\n }\n });\n\n const percentage = () => ((props.value - min()) / (max() - min())) * 100;\n const isActive = () => isInteracting() || isHovered();\n\n let pointerDownPos: { x: number; y: number } | null = null;\n let isClickFlag = true;\n let wrapperRect: DOMRect | null = null;\n let scaleVal = 1;\n let hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n let snapAnim: AnimationHandle | null = null;\n let rubberAnim: AnimationHandle | null = null;\n let handleOpacityAnim: AnimationHandle | null = null;\n let handleScaleXAnim: AnimationHandle | null = null;\n let handleScaleYAnim: AnimationHandle | null = null;\n\n const positionToValue = (clientX: number) => {\n if (!wrapperRect) return props.value;\n const screenX = clientX - wrapperRect.left;\n const sceneX = screenX / scaleVal;\n const nativeWidth = wrapperRef ? wrapperRef.offsetWidth : wrapperRect.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\n const percentFromValue = (v: number) => ((v - min()) / (max() - min())) * 100;\n\n const computeRubberStretch = (clientX: number, sign: number) => {\n if (!wrapperRect) return 0;\n const distancePast = sign < 0 ? wrapperRect.left - clientX : clientX - wrapperRect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return sign * MAX_STRETCH * Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0));\n };\n\n const cancelInteraction = () => {\n if (!isInteracting()) return;\n setIsInteracting(false);\n setIsDragging(false);\n rubberStretchPx.jump(0);\n pointerDownPos = null;\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (showInput()) return;\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos = { x: e.clientX, y: e.clientY };\n isClickFlag = true;\n setIsInteracting(true);\n\n if (wrapperRef) {\n wrapperRect = wrapperRef.getBoundingClientRect();\n scaleVal = wrapperRect.width / wrapperRef.offsetWidth;\n }\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!isInteracting() || !pointerDownPos) return;\n\n const dx = e.clientX - pointerDownPos.x;\n const dy = e.clientY - pointerDownPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickFlag && distance > CLICK_THRESHOLD) {\n isClickFlag = false;\n setIsDragging(true);\n }\n\n if (!isClickFlag) {\n if (wrapperRect) {\n if (e.clientX < wrapperRect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > wrapperRect.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 (snapAnim) { snapAnim.stop(); snapAnim = null; }\n fillPercent.jump(newPct);\n props.onChange(roundValue(newValue, step()));\n }\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n if (!isInteracting()) return;\n\n if (isClickFlag) {\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max() - min()) / step();\n const snappedValue = discreteSteps <= 10\n ? Math.max(min(), Math.min(max(), min() + Math.round((rawValue - min()) / step()) * step()))\n : snapToDecile(rawValue, min(), max());\n\n const newPct = percentFromValue(snappedValue);\n\n if (snapAnim) snapAnim.stop();\n snapAnim = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => {\n snapAnim = null;\n },\n });\n\n props.onChange(roundValue(snappedValue, step()));\n }\n\n if (rubberStretchPx.get() !== 0) {\n if (rubberAnim) rubberAnim.stop();\n rubberAnim = 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 = null;\n };\n\n const handlePointerCancel = () => {\n cancelInteraction();\n };\n\n // Handle value hover delay — clear pending timer on each re-run\n createEffect(() => {\n const hovered = isValueHovered();\n const editing = showInput();\n const editable = isValueEditable();\n\n onCleanup(() => {\n if (hoverTimeout) { clearTimeout(hoverTimeout); hoverTimeout = null; }\n });\n\n if (hovered && !editing && !editable) {\n hoverTimeout = setTimeout(() => setIsValueEditable(true), 800);\n } else if (!hovered && !editing) {\n setIsValueEditable(false);\n }\n });\n\n onCleanup(() => {\n if (hoverTimeout) clearTimeout(hoverTimeout);\n snapAnim?.stop();\n rubberAnim?.stop();\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n });\n\n onMount(() => {\n const unsubFill = fillPercent.on('change', applyFillStyles);\n const unsubRubber = rubberStretchPx.on('change', applyRubberStyles);\n const unsubHandleOpacity = handleOpacityMv.on('change', applyHandleVisualStyles);\n const unsubHandleScaleX = handleScaleXMv.on('change', applyHandleVisualStyles);\n const unsubHandleScaleY = handleScaleYMv.on('change', applyHandleVisualStyles);\n applyFillStyles(fillPercent.get());\n applyRubberStyles(rubberStretchPx.get());\n applyHandleVisualStyles();\n\n onCleanup(() => {\n unsubFill();\n unsubRubber();\n unsubHandleOpacity();\n unsubHandleScaleX();\n unsubHandleScaleY();\n });\n });\n\n // Focus input when it appears\n createEffect(() => {\n if (showInput() && inputRef) {\n inputRef.focus();\n inputRef.select();\n }\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 props.onChange(roundValue(clamped, step()));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: MouseEvent) => {\n if (isValueEditable()) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(props.value.toFixed(decimalsForStep(step())));\n }\n };\n\n const handleInputKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') handleInputSubmit();\n else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const displayValue = () => props.value.toFixed(decimalsForStep(step()));\n\n // Value dodge: fade handle when it overlaps label or value text\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n\n const leftThreshold = () => {\n const trackWidth = wrapperRef?.offsetWidth;\n if (trackWidth && labelRef) {\n return ((LABEL_CSS_LEFT + labelRef.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 30;\n };\n\n const rightThreshold = () => {\n const trackWidth = wrapperRef?.offsetWidth;\n if (trackWidth && valueSpanRef) {\n return ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 78;\n };\n\n const valueDodge = () => percentage() < leftThreshold() || percentage() > rightThreshold();\n\n const handleOpacity = () => {\n if (!isActive()) return 0;\n if (valueDodge()) return 0.1;\n if (isDragging()) return 0.9;\n return 0.5;\n };\n\n createEffect(() => {\n const targetOpacity = handleOpacity();\n const targetScaleX = isActive() ? 1 : 0.25;\n const targetScaleY = isActive() && valueDodge() ? 0.75 : 1;\n\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n handleOpacityAnim = animate(handleOpacityMv, targetOpacity, { duration: 0.15 });\n handleScaleXAnim = animate(handleScaleXMv, targetScaleX, {\n type: 'spring',\n visualDuration: 0.25,\n bounce: 0.15,\n });\n handleScaleYAnim = animate(handleScaleYMv, targetScaleY, {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.1,\n });\n });\n\n const discreteSteps = () => (max() - min()) / step();\n\n const hashMarks = () => {\n const ds = discreteSteps();\n if (ds <= 10) {\n return Array.from({ length: ds - 1 }, (_, i) => {\n const pct = ((i + 1) * step()) / (max() - min()) * 100;\n return <div class=\"dialkit-slider-hashmark\" style={{ left: `${pct}%` }} />;\n });\n }\n return Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return <div class=\"dialkit-slider-hashmark\" style={{ left: `${pct}%` }} />;\n });\n };\n\n return (\n <div ref={wrapperRef} class=\"dialkit-slider-wrapper\">\n <div\n ref={trackRef}\n class={`dialkit-slider ${isActive() ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div class=\"dialkit-slider-hashmarks\">{hashMarks()}</div>\n\n <div\n ref={fillRef}\n class=\"dialkit-slider-fill\"\n style={{\n width: `${fillPercent.get()}%`,\n }}\n />\n\n <div\n ref={handleRef}\n class=\"dialkit-slider-handle\"\n style={{\n left: `max(5px, calc(${fillPercent.get()}% - 9px))`,\n transform: 'translateY(-50%) scaleX(0.25) scaleY(1)',\n opacity: 0,\n }}\n />\n\n <span ref={labelRef} class=\"dialkit-slider-label\">\n {props.label}\n <Show when={props.shortcut}>\n <span class={`dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatSliderShortcut(props.shortcut!)}\n </span>\n </Show>\n </span>\n\n {showInput() ? (\n <input\n ref={inputRef}\n type=\"text\"\n class=\"dialkit-slider-input\"\n value={inputValue()}\n onInput={(e) => setInputValue(e.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputSubmit}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n class={`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 </div>\n </div>\n );\n}\n","import { Show } from 'solid-js';\nimport { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { formatToggleShortcut } from '../../shortcut-utils';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nexport function Toggle(props: ToggleProps) {\n return (\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">\n {props.label}\n <Show when={props.shortcut}>\n <span class={`dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatToggleShortcut(props.shortcut!)}\n </span>\n </Show>\n </span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={props.checked ? 'on' : 'off'}\n onChange={(val) => props.onChange(val === 'on')}\n />\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, For, Show } from 'solid-js';\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>(props: SegmentedControlProps<T>) {\n let containerRef: HTMLDivElement | undefined;\n const [pillStyle, setPillStyle] = createSignal<{ left: number; width: number } | null>(null);\n // The pill jumps into place on first paint, then animates on value changes.\n const [hasChanged, setHasChanged] = createSignal(false);\n\n const measure = () => {\n if (!containerRef) return;\n const activeButton = containerRef.querySelector('[data-active=\"true\"]') as HTMLElement | null;\n if (!activeButton) return;\n setPillStyle({\n left: activeButton.offsetLeft,\n width: activeButton.offsetWidth,\n });\n };\n\n createEffect(on(() => [props.value, props.options.length] as const, measure));\n\n createEffect(on(() => props.value, () => setHasChanged(true), { defer: true }));\n\n // Keep the pill aligned when the container itself resizes (e.g. panel width).\n onMount(() => {\n if (!containerRef) return;\n const ro = new ResizeObserver(measure);\n ro.observe(containerRef);\n onCleanup(() => ro.disconnect());\n });\n\n const transition = () => (\n hasChanged()\n ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'\n : 'none'\n );\n\n return (\n <div class=\"dialkit-segmented\" ref={containerRef}>\n <Show when={pillStyle()}>\n {(style) => (\n <div\n class=\"dialkit-segmented-pill\"\n style={{\n left: `${style().left}px`,\n width: `${style().width}px`,\n transition: transition(),\n }}\n />\n )}\n </Show>\n <For each={props.options}>\n {(option) => (\n <button\n onClick={() => props.onChange(option.value)}\n class=\"dialkit-segmented-button\"\n data-active={String(props.value === option.value)}\n >\n {option.label}\n </button>\n )}\n </For>\n </div>\n );\n}\n","import type { 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(props: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n const params = () => {\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (props.isSimpleMode) {\n const visualDuration = props.spring.visualDuration ?? 0.3;\n const bounce = props.spring.bounce ?? 0.2;\n mass = 1;\n stiffness = Math.pow((2 * Math.PI) / visualDuration, 2);\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = props.spring.stiffness ?? 400;\n damping = props.spring.damping ?? 17;\n mass = props.spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n 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 return pathData;\n };\n\n const gridLines = () => {\n const lines: ReturnType<typeof createLine>[] = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n lines.push(\n createLine(x, 0, x, height),\n createLine(0, y, width, y),\n );\n }\n return lines;\n };\n\n function createLine(x1: number, y1: number, x2: number, y2: number) {\n return (\n <line x1={x1} y1={y1} x2={x2} y2={y2} stroke=\"rgba(255, 255, 255, 0.08)\" stroke-width=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} class=\"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 stroke-width=\"1\"\n stroke-dasharray=\"4,4\"\n />\n <path\n d={params()}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n );\n}\n","import { DialStore } from '../../store/DialStore';\nimport type { SpringConfig } from '../../store/DialStore';\nimport { fromStore } from '../primitives';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\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(props: SpringControlProps) {\n const mode = fromStore(\n () => DialStore.getSpringMode(props.panelId, props.path),\n (notify) => DialStore.subscribe(props.panelId, notify)\n );\n\n const isSimpleMode = () => mode() === 'simple';\n\n const cache: {\n simple: SpringConfig;\n advanced: SpringConfig;\n } = {\n simple: props.spring.visualDuration !== undefined ? props.spring : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: props.spring.stiffness !== undefined ? props.spring : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n };\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n // Save current mode's values before switching\n if (isSimpleMode()) {\n cache.simple = props.spring;\n } else {\n cache.advanced = props.spring;\n }\n\n DialStore.updateSpringMode(props.panelId, props.path, newMode);\n\n if (newMode === 'simple') {\n props.onChange(cache.simple);\n } else {\n props.onChange(cache.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n if (isSimpleMode()) {\n const { stiffness, damping, mass, ...rest } = props.spring;\n props.onChange({ ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = props.spring;\n props.onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={props.label} defaultOpen={true}>\n <div style={{ display: 'flex', 'flex-direction': 'column', gap: '6px' }}>\n <SpringVisualization spring={props.spring} isSimpleMode={isSimpleMode()} />\n\n <div class=\"dialkit-labeled-control\">\n <span class=\"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={props.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={props.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={props.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={props.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={props.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 { createSignal, Show } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { fromStore } from '../primitives';\nimport { EasingVisualization } from './EasingVisualization';\nimport { Folder } from './Folder';\nimport { SegmentedControl } from './SegmentedControl';\nimport { Slider } from './Slider';\nimport { SpringVisualization } from './SpringVisualization';\n\nexport interface TransitionDurationControl {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n hideDuration?: boolean;\n durationControl?: TransitionDurationControl;\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl(props: TransitionControlProps) {\n const mode = fromStore(\n () => DialStore.getTransitionMode(props.panelId, props.path),\n (notify) => DialStore.subscribe(props.panelId, notify)\n );\n const [editingEase, setEditingEase] = createSignal(false);\n const [easeDraft, setEaseDraft] = createSignal('');\n const cache: { easing: EasingConfig; simple: SpringConfig; advanced: SpringConfig } = {\n easing: props.value.type === 'easing'\n ? props.value\n : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] },\n simple: props.value.type === 'spring' && props.value.visualDuration !== undefined\n ? props.value\n : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: props.value.type === 'spring' && props.value.stiffness !== undefined\n ? props.value\n : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n };\n\n const isEasing = () => mode() === 'easing';\n const isSimple = () => mode() === 'simple';\n const spring = () => {\n if (props.value.type === 'spring') {\n if (isSimple()) cache.simple = props.value;\n else if (mode() === 'advanced') cache.advanced = props.value;\n return props.value;\n }\n return cache.simple;\n };\n const easing = () => {\n if (props.value.type === 'easing') {\n cache.easing = props.value;\n return props.value;\n }\n return cache.easing;\n };\n\n const handleModeChange = (next: CurveMode) => {\n DialStore.updateTransitionMode(props.panelId, props.path, next);\n props.onChange(next === 'easing' ? cache.easing : next === 'simple' ? cache.simple : cache.advanced);\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, value: number) => {\n const current = spring();\n if (isSimple()) {\n const { stiffness, damping, mass, ...rest } = current;\n props.onChange({ ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = current;\n props.onChange({ ...rest, [key]: value });\n }\n };\n\n const updateEase = (index: number, value: number) => {\n const current = easing();\n const next = [...current.ease] as [number, number, number, number];\n next[index] = value;\n props.onChange({ ...current, ease: next });\n };\n\n const formatEase = (value: [number, number, number, number]) =>\n value.map((part) => Number(part.toFixed(2))).join(', ');\n const commitEase = () => {\n const parts = easeDraft().split(',').map((part) => Number.parseFloat(part.trim()));\n if (parts.length === 4 && parts.every(Number.isFinite)) {\n props.onChange({ ...easing(), ease: parts as [number, number, number, number] });\n }\n setEditingEase(false);\n };\n\n const durationSlider = () => {\n if (props.hideDuration || (!isEasing() && !isSimple())) return null;\n const external = props.durationControl;\n return (\n <Slider\n label=\"Duration\"\n value={external?.value ?? (isEasing() ? easing().duration : spring().visualDuration ?? 0.3)}\n onChange={external?.onChange ?? ((value) => {\n if (isEasing()) props.onChange({ ...easing(), duration: value });\n else handleSpringUpdate('visualDuration', value);\n })}\n min={external?.min ?? 0.1}\n max={external?.max ?? (isEasing() ? 2 : 1)}\n step={external?.step ?? 0.05}\n unit=\"s\"\n />\n );\n };\n\n return (\n <Folder title={props.label} defaultOpen={true}>\n <div style={{ display: 'flex', 'flex-direction': 'column', gap: '6px' }}>\n <Show when={isEasing()} fallback={<SpringVisualization spring={spring()} isSimpleMode={isSimple()} />}>\n <EasingVisualization easing={easing()} />\n </Show>\n\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing', label: 'Easing' },\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ]}\n value={mode()}\n onChange={handleModeChange}\n />\n </div>\n\n <Show when={isEasing()}>\n <Slider label=\"x1\" value={easing().ease[0]} onChange={(value) => updateEase(0, value)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing().ease[1]} onChange={(value) => updateEase(1, value)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing().ease[2]} onChange={(value) => updateEase(2, value)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing().ease[3]} onChange={(value) => updateEase(3, value)} min={-1} max={2} step={0.01} />\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n class=\"dialkit-text-input\"\n value={editingEase() ? easeDraft() : formatEase(easing().ease)}\n onInput={(event) => setEaseDraft(event.currentTarget.value)}\n onFocus={() => {\n setEaseDraft(formatEase(easing().ease));\n setEditingEase(true);\n }}\n onBlur={commitEase}\n onKeyDown={(event) => {\n if (event.key === 'Enter') event.currentTarget.blur();\n }}\n spellcheck={false}\n />\n </div>\n </Show>\n\n <Show when={isSimple()}>\n <Slider label=\"Bounce\" value={spring().bounce ?? 0.2} onChange={(value) => handleSpringUpdate('bounce', value)} min={0} max={1} step={0.05} />\n </Show>\n <Show when={!isEasing() && !isSimple()}>\n <Slider label=\"Stiffness\" value={spring().stiffness ?? 400} onChange={(value) => handleSpringUpdate('stiffness', value)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring().damping ?? 17} onChange={(value) => handleSpringUpdate('damping', value)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring().mass ?? 1} onChange={(value) => handleSpringUpdate('mass', value)} min={0.1} max={10} step={0.1} />\n </Show>\n {durationSlider()}\n </div>\n </Folder>\n );\n}\n","import type { EasingConfig } from '../../store/DialStore';\n\nexport const easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization(props: { easing: EasingConfig }) {\n const size = 200;\n const pad = 10;\n const unit = (size - pad * 2) / 2;\n const toSvg = (x: number, y: number) => ({\n x: pad + (x + 0.5) * unit,\n y: pad + (1.5 - y) * unit,\n });\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const curvePath = () => {\n const [x1, y1, x2, y2] = props.easing.ease;\n const first = toSvg(x1, y1);\n const second = toSvg(x2, y2);\n return `M ${start.x} ${start.y} C ${first.x} ${first.y}, ${second.x} ${second.y}, ${end.x} ${end.y}`;\n };\n\n return (\n <svg\n viewBox={`0 0 ${size} ${size}`}\n preserveAspectRatio=\"xMidYMid slice\"\n class=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x}\n y1={start.y}\n x2={end.x}\n y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n stroke-width=\"1\"\n stroke-dasharray=\"4,4\"\n />\n <path\n d={curvePath()}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n );\n}\n","import { createUniqueId } from 'solid-js';\n\ninterface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl(props: TextControlProps) {\n const inputId = createUniqueId();\n\n return (\n <div class=\"dialkit-text-control\">\n <label class=\"dialkit-text-label\" for={inputId}>{props.label}</label>\n <input\n id={inputId}\n type=\"text\"\n class=\"dialkit-text-input\"\n value={props.value}\n onInput={(e) => props.onChange(e.currentTarget.value)}\n placeholder={props.placeholder}\n />\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\nimport { ICON_CHEVRON } from '../../icons';\nimport { createDropdownDismiss, createDropdownPresence, type AnimationHandle } from '../primitives';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl(props: SelectControlProps) {\n const [pos, setPos] = createSignal<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const [portalTarget, setPortalTarget] = createSignal<HTMLElement | null>(null);\n let triggerRef!: HTMLButtonElement;\n let chevronRef!: SVGSVGElement;\n let chevronAnim: AnimationHandle | null = null;\n\n const normalized = () => normalizeOptions(props.options);\n const selectedOption = () => normalized().find((o) => o.value === props.value);\n\n const dropdown = createDropdownPresence((el, done) =>\n animate(\n el,\n { opacity: 0, y: (pos()?.above ?? false) ? 8 : -8, scale: 0.95 },\n { type: 'spring', visualDuration: 0.15, bounce: 0, onComplete: done }\n )\n );\n\n onMount(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef) ?? document.body);\n onCleanup(() => chevronAnim?.stop());\n });\n\n // Chevron renders at its resting angle; only animate on changes.\n createEffect(on(dropdown.isOpen, (open) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 180 : 0 },\n { type: 'spring', visualDuration: 0.2, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const updatePos = () => {\n const root = portalTarget();\n if (!triggerRef || !root) return;\n const dropdownHeight = 8 + normalized().length * 36;\n setPos(getDropdownPosition(triggerRef, root, { dropdownHeight }));\n };\n\n const openDropdown = () => {\n updatePos();\n dropdown.open();\n };\n\n createDropdownDismiss({\n isOpen: dropdown.isOpen,\n contains: (target) => triggerRef?.contains(target) || dropdown.contains(target),\n onDismiss: dropdown.close,\n onViewportChange: updatePos,\n });\n\n const dropdownStyle = () => {\n const p = pos();\n if (!p) return {};\n return {\n position: 'absolute' as const,\n left: `${p.left}px`,\n top: `${p.top}px`,\n width: `${p.width}px`,\n 'transform-origin': p.above ? 'bottom' : 'top',\n };\n };\n\n return (\n <div class=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n class=\"dialkit-select-trigger\"\n onClick={() => dropdown.isOpen() ? dropdown.close() : openDropdown()}\n data-open={String(dropdown.isOpen())}\n >\n <span class=\"dialkit-select-label\">{props.label}</span>\n <div class=\"dialkit-select-right\">\n <span class=\"dialkit-select-value\">{selectedOption()?.label ?? props.value}</span>\n <svg\n ref={chevronRef}\n class=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </div>\n </button>\n\n <Show when={!!portalTarget()}>\n <Portal mount={portalTarget()!}>\n <Show when={dropdown.mounted() && pos()}>\n <div\n ref={(el) => {\n dropdown.setRef(el);\n const above = pos()?.above ?? false;\n animate(\n el,\n { opacity: [0, 1], y: [above ? 8 : -8, 0], scale: [0.95, 1] },\n { type: 'spring', visualDuration: 0.15, bounce: 0 }\n );\n }}\n class=\"dialkit-select-dropdown\"\n style={dropdownStyle()}\n >\n <For each={normalized()}>\n {(option) => (\n <button\n class=\"dialkit-select-option\"\n data-selected={String(option.value === props.value)}\n onClick={() => {\n props.onChange(option.value);\n dropdown.close();\n }}\n >\n {option.label}\n </button>\n )}\n </For>\n </div>\n </Show>\n </Portal>\n </Show>\n </div>\n );\n}\n","export type DropdownPosition = {\n top: number;\n left: number;\n width: number;\n above: boolean;\n};\n\nexport type DropdownPositionOptions = {\n dropdownHeight?: number;\n gap?: number;\n allowAbove?: boolean;\n};\n\nexport function getDropdownPosition(\n trigger: HTMLElement,\n portalRoot: HTMLElement,\n options: DropdownPositionOptions = {}\n): DropdownPosition {\n const { dropdownHeight = 0, gap = 4, allowAbove = true } = options;\n const triggerRect = trigger.getBoundingClientRect();\n const rootRect = portalRoot.getBoundingClientRect();\n const spaceBelow = window.innerHeight - triggerRect.bottom - gap;\n const above = allowAbove && spaceBelow < dropdownHeight && triggerRect.top > spaceBelow;\n\n return {\n top: above\n ? triggerRect.top - rootRect.top - dropdownHeight - gap\n : triggerRect.bottom - rootRect.top + gap,\n left: triggerRect.left - rootRect.left,\n width: triggerRect.width,\n above,\n };\n}\n\nexport function getDialKitPortalRoot(trigger: HTMLElement | null | undefined): HTMLElement | null {\n return (trigger?.closest('.dialkit-root') as HTMLElement | null) ?? null;\n}\n","import { createSignal, createEffect, createUniqueId, Show } from 'solid-js';\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\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\nexport function ColorControl(props: ColorControlProps) {\n const [isEditing, setIsEditing] = createSignal(false);\n const [editValue, setEditValue] = createSignal(props.value);\n const textInputId = createUniqueId();\n let colorInputRef!: HTMLInputElement;\n\n // Sync editValue when value changes externally\n createEffect(() => {\n if (!isEditing()) {\n setEditValue(props.value);\n }\n });\n\n const handleTextSubmit = () => {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue())) {\n props.onChange(editValue());\n } else {\n setEditValue(props.value);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') handleTextSubmit();\n else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(props.value);\n }\n };\n\n return (\n <div class=\"dialkit-color-control\">\n <label class=\"dialkit-color-label\" for={textInputId}>{props.label}</label>\n <div class=\"dialkit-color-inputs\">\n <Show\n when={isEditing()}\n fallback={\n <span class=\"dialkit-color-hex\" onClick={() => setIsEditing(true)}>\n {(props.value ?? '').toUpperCase()}\n </span>\n }\n >\n <input\n id={textInputId}\n type=\"text\"\n class=\"dialkit-color-hex-input\"\n value={editValue()}\n onInput={(e) => setEditValue(e.currentTarget.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autofocus\n />\n </Show>\n <button\n class=\"dialkit-color-swatch\"\n style={{ 'background-color': props.value }}\n onClick={() => colorInputRef?.click()}\n title=\"Pick color\"\n aria-label={`Pick color for ${props.label}`}\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n class=\"dialkit-color-picker-native\"\n aria-label={`${props.label} color picker`}\n value={props.value.length === 4 ? expandShorthandHex(props.value) : props.value.slice(0, 7)}\n onInput={(e) => props.onChange(e.currentTarget.value)}\n />\n </div>\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { ICON_CHEVRON, ICON_TRASH } from '../../icons';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\nimport { DialStore } from '../../store/DialStore';\nimport type { Preset } from '../../store/DialStore';\nimport { createDropdownDismiss, createDropdownPresence, type AnimationHandle } from '../primitives';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager(props: PresetManagerProps) {\n const [pos, setPos] = createSignal({ top: 0, left: 0, width: 0 });\n const [portalTarget, setPortalTarget] = createSignal<HTMLElement | null>(null);\n let triggerRef!: HTMLButtonElement;\n let chevronRef!: SVGSVGElement;\n let chevronAnim: AnimationHandle | null = null;\n\n const hasPresets = () => props.presets.length > 0;\n const activePreset = () => props.presets.find((p) => p.id === props.activePresetId);\n\n const dropdown = createDropdownPresence((el, done) =>\n animate(\n el,\n { opacity: 0, y: 4, scale: 0.97 },\n { type: 'spring', visualDuration: 0.15, bounce: 0, onComplete: done }\n )\n );\n\n onMount(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef) ?? document.body);\n onCleanup(() => chevronAnim?.stop());\n });\n\n // Renders at its resting state via inline style; animate on changes only.\n createEffect(on([dropdown.isOpen, hasPresets] as const, ([open, has]) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 180 : 0, opacity: has ? 0.6 : 0.25 },\n { type: 'spring', visualDuration: 0.2, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const updatePos = () => {\n const root = portalTarget();\n if (!triggerRef || !root) return;\n setPos(getDropdownPosition(triggerRef, root, { allowAbove: false }));\n };\n\n const openDropdown = () => {\n if (!hasPresets()) return;\n updatePos();\n dropdown.open();\n };\n\n const toggle = () => {\n if (dropdown.isOpen()) dropdown.close();\n else openDropdown();\n };\n\n createDropdownDismiss({\n isOpen: dropdown.isOpen,\n contains: (target) => triggerRef?.contains(target) || dropdown.contains(target),\n onDismiss: dropdown.close,\n onViewportChange: updatePos,\n });\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) DialStore.loadPreset(props.panelId, presetId);\n else DialStore.clearActivePreset(props.panelId);\n dropdown.close();\n };\n\n const handleDelete = (e: MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(props.panelId, presetId);\n };\n\n return (\n <div class=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n class=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(dropdown.isOpen())}\n data-has-preset={String(!!activePreset())}\n data-disabled={String(!hasPresets())}\n >\n <span class=\"dialkit-preset-label\">\n {activePreset() ? activePreset()!.name : 'Version 1'}\n </span>\n <svg\n ref={chevronRef}\n class=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style={{ opacity: hasPresets() ? 0.6 : 0.25 }}\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n\n <Show when={!!portalTarget()}>\n <Portal mount={portalTarget()!}>\n <Show when={dropdown.mounted()}>\n <div\n ref={(el) => {\n dropdown.setRef(el);\n animate(\n el,\n { opacity: [0, 1], y: [4, 0], scale: [0.97, 1] },\n { type: 'spring', visualDuration: 0.15, bounce: 0 }\n );\n }}\n class=\"dialkit-root dialkit-preset-dropdown\"\n style={{\n position: 'absolute',\n top: `${pos().top}px`,\n left: `${pos().left}px`,\n 'min-width': `${pos().width}px`,\n }}\n >\n <div\n class=\"dialkit-preset-item\"\n data-active={String(!props.activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span class=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n <For each={props.presets}>\n {(preset) => (\n <div\n class=\"dialkit-preset-item\"\n data-active={String(preset.id === props.activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span class=\"dialkit-preset-name\">{preset.name}</span>\n <button\n class=\"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\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_TRASH[0]} />\n <path d={ICON_TRASH[1]} />\n <path d={ICON_TRASH[2]} />\n <path d={ICON_TRASH[3]} />\n <path d={ICON_TRASH[4]} />\n </svg>\n </button>\n </div>\n )}\n </For>\n </div>\n </Show>\n </Portal>\n </Show>\n </div>\n );\n}\n","import { For } from 'solid-js';\nimport { ICON_TIMELINE } from '../../../icons';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\nimport { fromStore } from '../../primitives';\n\nexport function TimelineToggleButton() {\n const visible = fromStore(\n () => TimelineUiStore.getVisible(),\n (notify) => TimelineUiStore.subscribe(notify)\n );\n const label = () => visible() ? 'Hide timeline' : 'Show timeline';\n return (\n <button\n class=\"dialkit-toolbar-add dialkit-timeline-toolbar-toggle\"\n data-active={visible() || undefined}\n aria-pressed={visible()}\n aria-label={label()}\n title={label()}\n onClick={() => TimelineUiStore.toggle()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <For each={ICON_TIMELINE}>{(path) => <path d={path} fill=\"currentColor\" />}</For>\n </svg>\n </button>\n );\n}\n","export type PanelDragOffset = {\n x: number;\n y: number;\n};\n\nexport type PanelDragStart = {\n pointerX: number;\n pointerY: number;\n elX: number;\n elY: number;\n};\n\nexport type PanelDragOriginX = 'left' | 'right';\n\nconst PANEL_DRAG_THRESHOLD = 8;\nconst COLLAPSED_PANEL_SIZE = 42;\n\nconst DRAG_EXCLUSION_SELECTOR = [\n '.dialkit-panel-icon',\n '.dialkit-panel-toolbar',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n '[role=\"button\"]',\n '[contenteditable=\"true\"]',\n].join(',');\n\nexport function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null {\n if (!(target instanceof Element) || !panel) return null;\n\n const inner = target.closest<HTMLElement>('.dialkit-panel-inner');\n if (!inner || !panel.contains(inner)) return null;\n\n if (inner.getAttribute('data-collapsed') === 'true') {\n return inner;\n }\n\n const header = target.closest<HTMLElement>('.dialkit-panel-header');\n if (!header || !inner.contains(header)) return null;\n\n if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;\n\n return header;\n}\n\nexport function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart {\n const rect = panel.getBoundingClientRect();\n return {\n pointerX,\n pointerY,\n elX: rect.left,\n elY: rect.top,\n };\n}\n\nexport function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset {\n return {\n x: start.elX + pointerX - start.pointerX,\n y: start.elY + pointerY - start.pointerY,\n };\n}\n\nexport function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean {\n const dx = pointerX - start.pointerX;\n const dy = pointerY - start.pointerY;\n return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;\n}\n\nexport function getPanelOriginX(\n position: string,\n offset: PanelDragOffset | null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : undefined\n): PanelDragOriginX {\n if (offset && viewportWidth) {\n return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? 'left' : 'right';\n }\n\n return position.endsWith('left') ? 'left' : 'right';\n}\n\nexport function blockPanelDragClick(handle: HTMLElement) {\n const blocker = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n handle.addEventListener('click', blocker, { capture: true, once: true });\n window.setTimeout(() => {\n handle.removeEventListener('click', blocker, true);\n }, 0);\n}\n","import {\n For,\n Show,\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n type JSX,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { DialStore, formatLabel } from '../../../store/DialStore';\nimport type { ControlMeta, DialValue } from '../../../store/DialStore';\nimport { TimelineStore } from '../../../store/TimelineStore';\nimport type { TimelineClipMeta, TimelineMeta } from '../../../store/TimelineStore';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\nimport {\n TIMELINE_MIN_CLIP_DURATION,\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n computeClipStaticFromValues,\n formatClock,\n formatSeconds,\n formatStepLabel,\n normalizeTimelineValuesForCopy,\n timelinePopoverDisplayValues,\n} from '../../../timeline-core';\nimport type { TimelineClipLoop, TimelineStepStatic } from '../../../timeline-core';\nimport { clamp } from '../../../transition-math';\nimport { buildCopyInstruction } from '../../../copy-instruction';\nimport { isDevDefault } from '../../../env';\nimport {\n ICON_ADD_PRESET,\n ICON_CHEVRON,\n ICON_CHECK,\n ICON_CLIPBOARD,\n ICON_PAUSE,\n ICON_PLAY,\n} from '../../../icons';\nimport { findControl } from '../../../shortcut-utils';\nimport { fromStore } from '../../primitives';\nimport { ControlRenderer } from '../ControlRenderer';\nimport { PresetManager } from '../PresetManager';\nimport type { DialTheme } from '../DialRoot';\n\nconst DRAG_THRESHOLD_PX = 3;\nconst MAJOR_TICK_TARGET_PX = 140;\nconst MILLISECOND_STEP = 0.001;\nconst SECOND_TICK_STEPS = [\n 0.001, 0.002, 0.005,\n 0.01, 0.02, 0.05,\n 0.1, 0.2, 0.5,\n 1, 2, 5, 10, 15, 30, 60, 120, 300, 600,\n];\nconst MIN_TIMELINE_MAX_ZOOM = 8;\nconst PLAYHEAD_FLAG_WIDTH = 52;\nconst POPOVER_WIDTH = 280;\nconst ZOOM_DRAG_DISTANCE = 180;\n\nexport interface DialTimelineProps {\n theme?: DialTheme;\n defaultVisible?: boolean;\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen?: boolean;\n productionEnabled?: boolean;\n}\n\nexport function DialTimeline(props: DialTimelineProps) {\n const enabled = () => (props.productionEnabled ?? isDevDefault) !== false;\n return (\n <Show when={enabled()}>\n <DialTimelineDock {...props} />\n </Show>\n );\n}\n\nfunction DialTimelineDock(props: DialTimelineProps) {\n const timelines = fromStore(\n () => TimelineStore.getTimelines(),\n (notify) => TimelineStore.subscribeGlobal(notify)\n );\n const visible = fromStore(\n () => TimelineUiStore.getVisible(),\n (notify) => TimelineUiStore.subscribe(notify)\n );\n const [mounted, setMounted] = createSignal(false);\n const controllerId = Symbol('dialkit-timeline-visibility');\n\n onMount(() => {\n setMounted(true);\n const unregister = TimelineUiStore.registerController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible ?? true,\n onVisibilityChange: props.onVisibilityChange,\n });\n onCleanup(unregister);\n });\n\n createEffect(() => {\n TimelineUiStore.updateController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible ?? true,\n onVisibilityChange: props.onVisibilityChange,\n });\n });\n\n return (\n <Show when={mounted() && timelines().length > 0}>\n <Portal mount={document.body}>\n <div\n class=\"dialkit-root dialkit-timeline\"\n data-theme={props.theme ?? 'system'}\n hidden={!visible()}\n >\n <div class=\"dialkit-timeline-dock\">\n <For each={timelines()}>\n {(timeline) => (\n <TimelineSection\n meta={timeline}\n defaultOpen={props.defaultOpen ?? true}\n theme={props.theme ?? 'system'}\n dockVisible={visible()}\n />\n )}\n </For>\n </div>\n </div>\n </Portal>\n </Show>\n );\n}\n\nfunction PlayPauseButton(props: { id: string }) {\n const playing = fromStore(\n () => TimelineStore.getTransport(props.id).playing,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n const label = () => playing() ? 'Pause' : 'Play';\n return (\n <button\n class=\"dialkit-toolbar-add\"\n onClick={() => playing() ? TimelineStore.pause(props.id) : TimelineStore.play(props.id)}\n title={label()}\n aria-label={label()}\n >\n <span style={{ position: 'relative', width: '16px', height: '16px' }}>\n <Show\n when={playing()}\n fallback={\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_PLAY} fill=\"currentColor\" />\n </svg>\n }\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <For each={ICON_PAUSE}>{(path) => <path d={path} fill=\"currentColor\" />}</For>\n </svg>\n </Show>\n </span>\n </button>\n );\n}\n\nconst iconStyle = {\n position: 'absolute',\n inset: '0',\n width: '16px',\n height: '16px',\n color: 'var(--dial-text-label)',\n} as const;\n\nfunction TimelineOverview(props: {\n id: string;\n duration: number;\n viewStart: number;\n viewEnd: number;\n onNavigate: (time: number) => void;\n}) {\n const time = fromStore(\n () => TimelineStore.getTransport(props.id).time,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n let scrub: { wasPlaying: boolean; rect: DOMRect } | null = null;\n\n const seekFromClientX = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0 || props.duration <= 0) return;\n const next = clamp(((clientX - scrub.rect.left) / scrub.rect.width) * props.duration, 0, props.duration);\n TimelineStore.seek(props.id, next);\n props.onNavigate(next);\n };\n const finish = () => {\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n };\n\n return (\n <div\n class=\"dialkit-timeline-overview\"\n onPointerDown={(event) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect: event.currentTarget.getBoundingClientRect(),\n };\n TimelineStore.pause(props.id);\n seekFromClientX(event.clientX);\n }}\n onPointerMove={(event) => scrub && seekFromClientX(event.clientX)}\n onPointerUp={finish}\n onPointerCancel={finish}\n onLostPointerCapture={finish}\n title=\"Drag to scrub the full timeline\"\n >\n <div\n class=\"dialkit-timeline-overview-viewport\"\n data-zoomed={(props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100) < 99.999 || undefined}\n style={{\n left: `${props.duration > 0 ? (props.viewStart / props.duration) * 100 : 0}%`,\n width: `${props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100}%`,\n }}\n />\n <div\n class=\"dialkit-timeline-overview-progress\"\n style={{ width: `${props.duration > 0 ? (time() / props.duration) * 100 : 0}%` }}\n />\n <div\n class=\"dialkit-timeline-overview-playhead\"\n style={{ left: `${props.duration > 0 ? (time() / props.duration) * 100 : 0}%` }}\n />\n </div>\n );\n}\n\nfunction TimelinePlayheadFlag(props: {\n id: string;\n duration: number;\n pxPerSecond: number;\n viewStart: number;\n viewEnd: number;\n laneWidth: number;\n ruler: HTMLDivElement | undefined;\n headerClearStart: number;\n headerClearEnd: number;\n onResetView: () => void;\n}) {\n const time = fromStore(\n () => TimelineStore.getTransport(props.id).time,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n let scrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; viewEnd: number } | null = null;\n let cleanup: (() => void) | null = null;\n\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.id,\n clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / scrub.rect.width) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n )\n );\n };\n\n onCleanup(() => cleanup?.());\n\n const x = () => clamp((time() - props.viewStart) * props.pxPerSecond, 0, props.laneWidth);\n const placement = () => {\n const left = x() - PLAYHEAD_FLAG_WIDTH / 2;\n return left >= props.headerClearStart && left + PLAYHEAD_FLAG_WIDTH <= props.headerClearEnd\n ? 'raised'\n : 'lowered';\n };\n\n return (\n <Show when={time() >= props.viewStart && time() <= props.viewEnd && props.laneWidth > 0}>\n <div\n class=\"dialkit-timeline-playhead-control\"\n data-edge=\"center\"\n data-placement={placement()}\n style={{ left: `calc(var(--dial-timeline-label-w) + ${x()}px)` }}\n onPointerDown={(event) => {\n const rect = props.ruler?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.stopPropagation();\n cleanup?.();\n const reset = event.shiftKey;\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect,\n viewStart: reset ? 0 : props.viewStart,\n viewEnd: reset ? props.duration : props.viewEnd,\n };\n if (reset) props.onResetView();\n TimelineStore.pause(props.id);\n seek(event.clientX);\n const move = (next: PointerEvent) => {\n next.preventDefault();\n seek(next.clientX);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n cleanup = null;\n };\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n cleanup = finish;\n }}\n role=\"slider\"\n aria-label=\"Timeline current time\"\n aria-valuemin={0}\n aria-valuemax={props.duration}\n aria-valuenow={time()}\n title=\"Drag to scrub the timeline\"\n >\n <div class=\"dialkit-timeline-playhead-flag\">{time().toFixed(2)}</div>\n <div class=\"dialkit-timeline-playhead-stem\" />\n </div>\n </Show>\n );\n}\n\ntype PopoverState = {\n clip: TimelineClipMeta;\n stepKey?: string;\n anchor: { left: number; top: number; right: number; bottom: number; width: number; height: number };\n};\n\ntype ZoomDragState = {\n pointerX: number;\n rect: DOMRect;\n zoom: number;\n viewStart: number;\n anchorRatio: number;\n anchorTime: number;\n moved: boolean;\n};\n\nfunction clampViewStart(start: number, duration: number, visibleDuration: number): number {\n return clamp(start, 0, Math.max(0, duration - visibleDuration));\n}\n\nfunction formatRulerSeconds(time: number, step: number): string {\n if (step >= 1 && Number.isInteger(time)) return formatClock(time);\n const decimals = Math.min(3, Math.max(1, Math.ceil(-Math.log10(step))));\n return `${time.toFixed(decimals)}s`;\n}\n\nfunction TimelineSection(props: {\n meta: TimelineMeta;\n defaultOpen: boolean;\n theme: DialTheme;\n dockVisible: boolean;\n}) {\n const [open, setOpen] = createSignal(props.defaultOpen);\n const [copied, setCopied] = createSignal(false);\n const [popover, setPopover] = createSignal<PopoverState | null>(null);\n const [collapsedGroups, setCollapsedGroups] = createSignal(new Set<string>());\n const [expandedTracks, setExpandedTracks] = createSignal(new Set<string>());\n const [zoom, setZoom] = createSignal(1);\n const [viewStart, setViewStart] = createSignal(0);\n const values = fromStore(\n () => DialStore.getValues(props.meta.id),\n (notify) => DialStore.subscribe(props.meta.id, notify)\n );\n const presets = () => {\n values();\n return DialStore.getPresets(props.meta.id);\n };\n const activePresetId = () => {\n values();\n return DialStore.getActivePresetId(props.meta.id);\n };\n let laneAreaRef: HTMLDivElement | undefined;\n let titleRef: HTMLSpanElement | undefined;\n let actionsRef: HTMLDivElement | undefined;\n const [laneWidth, setLaneWidth] = createSignal(0);\n const [flagClearRange, setFlagClearRange] = createSignal({ start: 0, end: 0 });\n\n createEffect(() => {\n if (!open() || !laneAreaRef || !titleRef || !actionsRef) return;\n const measure = () => {\n if (!laneAreaRef || !titleRef || !actionsRef) return;\n const rulerRect = laneAreaRef.getBoundingClientRect();\n const titleRect = titleRef.getBoundingClientRect();\n const actionsRect = actionsRef.getBoundingClientRect();\n setLaneWidth(rulerRect.width);\n setFlagClearRange({\n start: Math.round(titleRect.right + 10 - rulerRect.left),\n end: Math.round(actionsRect.left - 10 - rulerRect.left),\n });\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(laneAreaRef);\n observer.observe(titleRef);\n observer.observe(actionsRef);\n onCleanup(() => observer.disconnect());\n });\n\n const visibleDuration = () => props.meta.duration > 0 ? props.meta.duration / zoom() : props.meta.duration;\n const safeViewStart = () => clampViewStart(viewStart(), props.meta.duration, visibleDuration());\n const viewEnd = () => safeViewStart() + visibleDuration();\n const pxPerSecond = () => visibleDuration() > 0 && laneWidth() > 0 ? laneWidth() / visibleDuration() : 0;\n const maxZoom = () => Math.max(\n MIN_TIMELINE_MAX_ZOOM,\n laneWidth() > 0 && props.meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * props.meta.duration) / (MILLISECOND_STEP * 10 * laneWidth())\n : MIN_TIMELINE_MAX_ZOOM\n );\n\n createEffect(() => setZoom((current) => clamp(current, 1, maxZoom())));\n createEffect(() => setViewStart((current) => clampViewStart(current, props.meta.duration, props.meta.duration / zoom())));\n createEffect(() => {\n if (!props.dockVisible) setPopover(null);\n });\n\n const centerViewAt = (time: number) => {\n if (zoom() <= 1 || props.meta.duration <= 0) return;\n const duration = props.meta.duration / zoom();\n setViewStart(clampViewStart(time - duration / 2, props.meta.duration, duration));\n };\n const resetView = () => {\n setZoom(1);\n setViewStart(0);\n };\n\n let zoomDrag: ZoomDragState | null = null;\n let rulerScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n let trackScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n\n const seekRuler = (clientX: number) => {\n if (!rulerScrub || rulerScrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.meta.id,\n clamp(\n rulerScrub.viewStart + ((clientX - rulerScrub.rect.left) / rulerScrub.rect.width) * rulerScrub.visibleDuration,\n rulerScrub.viewStart,\n rulerScrub.viewStart + rulerScrub.visibleDuration\n )\n );\n };\n const seekTrack = (clientX: number) => {\n if (!trackScrub || trackScrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.meta.id,\n clamp(\n trackScrub.viewStart + ((clientX - trackScrub.rect.left) / trackScrub.rect.width) * trackScrub.visibleDuration,\n trackScrub.viewStart,\n trackScrub.viewStart + trackScrub.visibleDuration\n )\n );\n };\n\n const handleRulerPointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n if (rect.width <= 0) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n if (!event.altKey) {\n const reset = event.shiftKey;\n rulerScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart(),\n visibleDuration: reset ? props.meta.duration : visibleDuration(),\n };\n if (reset) resetView();\n TimelineStore.pause(props.meta.id);\n seekRuler(event.clientX);\n return;\n }\n const ratio = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n zoomDrag = {\n pointerX: event.clientX,\n rect,\n zoom: zoom(),\n viewStart: safeViewStart(),\n anchorRatio: ratio,\n anchorTime: safeViewStart() + ratio * visibleDuration(),\n moved: false,\n };\n };\n\n const handleRulerPointerMove: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (rulerScrub) {\n seekRuler(event.clientX);\n return;\n }\n if (!zoomDrag || props.meta.duration <= 0) return;\n const dx = event.clientX - zoomDrag.pointerX;\n if (!zoomDrag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n zoomDrag.moved = true;\n const nextZoom = clamp(zoomDrag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom());\n const nextDuration = props.meta.duration / nextZoom;\n setZoom(nextZoom);\n setViewStart(clampViewStart(\n zoomDrag.anchorTime - zoomDrag.anchorRatio * nextDuration,\n props.meta.duration,\n nextDuration\n ));\n };\n\n const finishRuler = () => {\n if (rulerScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n rulerScrub = null;\n zoomDrag = null;\n };\n\n const handleTrackPointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n const target = event.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!event.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n const reset = event.shiftKey;\n trackScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart(),\n visibleDuration: reset ? props.meta.duration : visibleDuration(),\n };\n if (reset) resetView();\n setPopover(null);\n TimelineStore.pause(props.meta.id);\n seekTrack(event.clientX);\n };\n const finishTrack = () => {\n if (trackScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n trackScrub = null;\n };\n\n const handleCopy = () => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(props.meta.id), props.meta.clips);\n void navigator.clipboard.writeText(buildCopyInstruction('createDialTimeline', props.meta.name, normalized));\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1500);\n };\n const handleAddPreset = () => {\n DialStore.savePreset(props.meta.id, `Version ${presets().length + 2}`);\n };\n const closePopover = () => setPopover(null);\n\n const openClipPopover = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n if (getClipControls(props.meta.id, targetPath, stepKey ? undefined : clipPopoverExclusions(clip)).length === 0) return;\n setPopover((previous) => previous?.clip.key === clip.key && previous.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n });\n };\n const toggleSet = (setter: typeof setExpandedTracks, key: string) => {\n setter((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n const toggleTracks = (key: string) => toggleSet(setExpandedTracks, key);\n const toggleGroup = (key: string) => toggleSet(setCollapsedGroups, key);\n const handleBarClick = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) toggleTracks(clip.key);\n else openClipPopover(clip, rect, stepKey);\n };\n\n const ticks = createMemo(() => {\n const rawStep = pxPerSecond() > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond() : 1;\n const adaptive = SECOND_TICK_STEPS.find((step) => step >= rawStep) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom() < 1.5 && props.meta.duration >= 1 ? Math.max(1, adaptive) : adaptive;\n const fineStep = majorStep / 10;\n const major: number[] = [];\n const medium: number[] = [];\n const fine: number[] = [];\n const firstMajor = Math.ceil((safeViewStart() - 1e-6) / majorStep) * majorStep;\n for (let time = firstMajor; time <= viewEnd() + 1e-6; time += majorStep) {\n major.push(Number(time.toFixed(4)));\n }\n const firstFine = Math.ceil((safeViewStart() - 1e-6) / fineStep);\n const lastFine = Math.floor((viewEnd() + 1e-6) / fineStep);\n for (let index = firstFine; index <= lastFine; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineStep).toFixed(6));\n if (index % 5 === 0) medium.push(tick);\n else fine.push(tick);\n }\n return { major, medium, fine, majorStep };\n });\n\n const rows = createMemo<JSX.Element[]>(() => {\n const result: JSX.Element[] = [];\n let lastGroup: string | undefined;\n const currentValues = values();\n for (const clip of props.meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const collapsed = collapsedGroups().has(group);\n result.push(\n <div class=\"dialkit-timeline-row dialkit-timeline-group-row\">\n <div class=\"dialkit-timeline-label\">\n <button\n class=\"dialkit-timeline-group-toggle\"\n data-open={!collapsed}\n onClick={() => toggleGroup(group)}\n title={collapsed ? 'Expand layer' : 'Collapse layer'}\n >\n <ChevronIcon />\n </button>\n <span>{formatLabel(group)}</span>\n </div>\n <div class=\"dialkit-timeline-lane\" />\n </div>\n );\n }\n }\n if (clip.group && collapsedGroups().has(clip.group)) continue;\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks().has(clip.key);\n const stat = computeClipStaticFromValues(currentValues, clip, props.meta.duration);\n const selected = popover()?.clip.key === clip.key;\n result.push(\n <div class=\"dialkit-timeline-row\" data-grouped={clip.group ? '' : undefined}>\n <div class=\"dialkit-timeline-label\">\n <Show when={isProps}>\n <button\n class=\"dialkit-timeline-group-toggle\"\n data-open={tracksOpen}\n onClick={(event) => {\n event.stopPropagation();\n toggleTracks(clip.key);\n }}\n title={tracksOpen ? 'Collapse properties' : 'Expand properties'}\n >\n <ChevronIcon />\n </button>\n </Show>\n {clip.label}\n </div>\n <div class=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={props.meta.id}\n clip={clip}\n at={stat.at}\n duration={stat.duration}\n loop={stat.loop}\n steps={clip.stepKeys?.length ? stat.tracks[0]?.steps : undefined}\n fixedDuration={isProps ? true : stat.isPhysics}\n composite={isProps}\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n timelineDuration={props.meta.duration}\n selected={selected}\n selectedStepKey={selected ? popover()?.stepKey : undefined}\n onClick={handleBarClick}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n if (!tracksOpen) continue;\n for (const trackRef of clip.tracks ?? []) {\n const track = stat.tracks.find((candidate) => candidate.prop === trackRef.prop);\n if (!track) continue;\n const trackKey = `${clip.key}.${trackRef.prop}`;\n const trackMeta: TimelineClipMeta = {\n key: trackKey,\n label: `${clip.label} · ${formatLabel(trackRef.prop)}`,\n color: clip.color,\n loop: clip.loop,\n group: clip.group,\n stepKeys: trackRef.stepKeys,\n };\n const trackSelected = popover()?.clip.key === trackKey;\n result.push(\n <div class=\"dialkit-timeline-row dialkit-timeline-track-row\" data-grouped={clip.group ? '' : undefined}>\n <div class=\"dialkit-timeline-label\">{formatLabel(trackRef.prop)}</div>\n <div class=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={props.meta.id}\n clip={trackMeta}\n at={stat.at + track.delay}\n duration={track.duration}\n loop={stat.loop}\n steps={trackRef.stepKeys?.length ? track.steps : undefined}\n fixedDuration={!trackRef.stepKeys?.length && track.steps[0]?.isPhysics === true}\n baseAt={stat.at}\n delayMode\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n timelineDuration={props.meta.duration}\n selected={trackSelected}\n selectedStepKey={trackSelected ? popover()?.stepKey : undefined}\n onClick={openClipPopover}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n }\n }\n return result;\n });\n\n return (\n <div class=\"dialkit-timeline-section\">\n <div class=\"dialkit-timeline-header\" data-open={open() || undefined}>\n <div class=\"dialkit-timeline-identity\">\n <span ref={titleRef} class=\"dialkit-timeline-title\">{props.meta.name}</span>\n </div>\n <Show when={!open()}>\n <TimelineOverview\n id={props.meta.id}\n duration={props.meta.duration}\n viewStart={safeViewStart()}\n viewEnd={viewEnd()}\n onNavigate={centerViewAt}\n />\n </Show>\n <div ref={actionsRef} class=\"dialkit-timeline-actions\">\n <PlayPauseButton id={props.meta.id} />\n <button class=\"dialkit-toolbar-add\" onClick={handleAddPreset} title=\"Add timeline version\" aria-label=\"Add timeline version\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <For each={ICON_ADD_PRESET}>{(path) => <path d={path} />}</For>\n </svg>\n </button>\n <PresetManager\n panelId={props.meta.id}\n presets={presets()}\n activePresetId={activePresetId()}\n onAdd={handleAddPreset}\n />\n <button\n class=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n aria-label={copied() ? 'Copied parameters' : 'Copy parameters'}\n >\n <span style={{ position: 'relative', width: '16px', height: '16px' }}>\n <Show\n when={copied()}\n fallback={\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_CHECK} />\n </svg>\n </Show>\n </span>\n </button>\n <button\n class=\"dialkit-timeline-chevron\"\n data-open={open()}\n aria-expanded={open()}\n onClick={() => setOpen((current) => !current)}\n title={open() ? 'Collapse timeline' : 'Expand timeline'}\n >\n <ChevronIcon />\n </button>\n </div>\n </div>\n\n <Show when={open()}>\n <div\n class=\"dialkit-timeline-body\"\n onPointerDown={handleTrackPointerDown}\n onPointerMove={(event) => trackScrub && seekTrack(event.clientX)}\n onPointerUp={finishTrack}\n onPointerCancel={finishTrack}\n onLostPointerCapture={finishTrack}\n >\n <div class=\"dialkit-timeline-grid\">\n <div class=\"dialkit-timeline-row dialkit-timeline-ruler-row\">\n <div class=\"dialkit-timeline-label\" />\n <div\n ref={laneAreaRef}\n class=\"dialkit-timeline-ruler\"\n onPointerDown={handleRulerPointerDown}\n onPointerMove={handleRulerPointerMove}\n onPointerUp={finishRuler}\n onPointerCancel={finishRuler}\n onLostPointerCapture={finishRuler}\n title=\"Drag to seek · Option-drag to zoom · Shift-drag to reset zoom\"\n >\n <For each={ticks().fine}>{(time) => <div class=\"dialkit-timeline-tick dialkit-timeline-tick-fine\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }} />}</For>\n <For each={ticks().medium}>{(time) => <div class=\"dialkit-timeline-tick dialkit-timeline-tick-medium\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }} />}</For>\n <For each={ticks().major}>{(time) => (\n <div class=\"dialkit-timeline-tick\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }}>\n <span class=\"dialkit-timeline-tick-label\">{formatRulerSeconds(time, ticks().majorStep)}</span>\n </div>\n )}</For>\n </div>\n </div>\n {rows()}\n <Show when={pxPerSecond() > 0}>\n <TimelinePlayheadFlag\n id={props.meta.id}\n duration={props.meta.duration}\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n viewEnd={viewEnd()}\n laneWidth={laneWidth()}\n ruler={laneAreaRef}\n headerClearStart={flagClearRange().start}\n headerClearEnd={flagClearRange().end}\n onResetView={resetView}\n />\n </Show>\n </div>\n </div>\n </Show>\n\n <Show when={popover()}>\n {(current) => (\n <ClipPopover\n panelId={props.meta.id}\n popover={current()}\n values={values()}\n theme={props.theme}\n onClose={closePopover}\n />\n )}\n </Show>\n </div>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n );\n}\n\nfunction ClipPopover(props: {\n panelId: string;\n popover: PopoverState;\n values: Record<string, DialValue>;\n theme: DialTheme;\n onClose: () => void;\n}) {\n let ref: HTMLDivElement | undefined;\n const [naturalHeight, setNaturalHeight] = createSignal(0);\n const [viewport, setViewport] = createSignal(readViewport());\n\n onMount(() => {\n const measure = () => ref && setNaturalHeight(ref.scrollHeight + 2);\n measure();\n const observer = new ResizeObserver(measure);\n if (ref) observer.observe(ref.querySelector('.dialkit-timeline-popover-body') ?? ref);\n const updateViewport = () => setViewport(readViewport());\n const outside = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (ref?.contains(target) || target.closest?.('.dialkit-timeline-clip') || target.closest?.('.dialkit-timeline-label')) return;\n props.onClose();\n };\n const keydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') props.onClose();\n };\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', keydown);\n onCleanup(() => {\n observer.disconnect();\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n document.removeEventListener('pointerdown', outside, true);\n document.removeEventListener('keydown', keydown);\n });\n });\n\n const presentation = createMemo(() => {\n const { clip, stepKey } = props.popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(props.panelId, `${clip.key}.${stepKey}`);\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(props.panelId, `${clip.key}.from`);\n if (from) {\n const target = `${clip.key}.${stepKey}.to`;\n const index = controls.findIndex((control) => control.path === target);\n controls = index >= 0\n ? [...controls.slice(0, index), from, ...controls.slice(index)]\n : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(props.panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(props.panelId, `${targetPath}.duration`);\n const durationValue = durationMeta ? props.values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(props.panelId, durationMeta.path, next),\n min: Math.max(TIMELINE_MIN_CLIP_DURATION, durationMeta.min ?? 0),\n max: durationMeta.max,\n step: durationMeta.step,\n }\n : undefined;\n return {\n controls,\n title,\n transitionDuration,\n displayValues: timelinePopoverDisplayValues(props.values, clip.key, clip.stepKeys, stepKey),\n };\n });\n\n const position = createMemo(() => {\n const current = viewport();\n const right = current.offsetLeft + current.width;\n const bottom = current.offsetTop + current.height;\n const width = Math.min(POPOVER_WIDTH, Math.max(220, current.width - 24));\n const left = clamp(\n props.popover.anchor.left + props.popover.anchor.width / 2 - width / 2,\n current.offsetLeft + 12,\n Math.max(current.offsetLeft + 12, right - width - 12)\n );\n const above = Math.max(0, props.popover.anchor.top - current.offsetTop - 22);\n const below = Math.max(0, bottom - props.popover.anchor.bottom - 22);\n const placeAbove = naturalHeight() === 0\n ? above >= below\n : naturalHeight() <= above || (naturalHeight() > below && above >= below);\n const availableHeight = placeAbove ? above : below;\n const renderedHeight = Math.min(naturalHeight() || availableHeight, availableHeight);\n const rawTop = placeAbove\n ? props.popover.anchor.top - 10 - renderedHeight\n : props.popover.anchor.bottom + 10;\n return {\n width,\n left,\n top: clamp(rawTop, current.offsetTop + 12, Math.max(current.offsetTop + 12, bottom - renderedHeight - 12)),\n availableHeight,\n placeAbove,\n };\n });\n\n return (\n <Show when={presentation().controls.length > 0}>\n <Portal mount={document.body}>\n <div class=\"dialkit-root\" data-theme={props.theme}>\n <div\n ref={ref}\n class=\"dialkit-timeline-popover\"\n data-placement={position().placeAbove ? 'above' : 'below'}\n style={{\n left: `${position().left}px`,\n top: `${position().top}px`,\n width: `${position().width}px`,\n 'max-height': `${position().availableHeight}px`,\n visibility: naturalHeight() > 0 ? 'visible' : 'hidden',\n }}\n role=\"dialog\"\n aria-label={`Edit ${presentation().title}`}\n >\n <div class=\"dialkit-timeline-popover-header\">\n <span class=\"dialkit-timeline-popover-title\">{presentation().title}</span>\n <button class=\"dialkit-timeline-popover-close\" onClick={props.onClose} title=\"Close editor\" aria-label=\"Close editor\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M6 6L18 18M18 6L6 18\" />\n </svg>\n </button>\n </div>\n <div class=\"dialkit-timeline-popover-body\">\n <ControlRenderer\n panelId={props.panelId}\n controls={presentation().controls}\n values={presentation().displayValues}\n transitionDuration={presentation().transitionDuration}\n />\n </div>\n </div>\n </div>\n </Portal>\n </Show>\n );\n}\n\nfunction readViewport() {\n return {\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n };\n}\n\nfunction clipPopoverExclusions(clip: TimelineClipMeta): Set<string> {\n return new Set([...(clip.stepKeys ?? []), ...(clip.tracks?.map((track) => track.prop) ?? [])]);\n}\n\nfunction getClipControls(panelId: string, path: string, exclusions?: Set<string>): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, path) : null;\n if (!folder?.children) return [];\n return folder.children.filter((control) => {\n const key = control.path.slice(path.length + 1);\n return key !== 'at' && key !== 'duration' && !exclusions?.has(key);\n });\n}\n\nfunction getControlAt(panelId: string, path: string): ControlMeta | null {\n const panel = DialStore.getPanel(panelId);\n return panel ? findControl(panel.controls, path) : null;\n}\n\ntype DragState = {\n mode: 'move' | 'start' | 'end' | 'boundary';\n boundaryIndex?: number;\n pointerX: number;\n at: number;\n duration: number;\n stepDurations?: number[];\n clickEl: HTMLElement | null;\n moved: boolean;\n};\n\nfunction TimelineClip(props: {\n timelineId: string;\n clip: TimelineClipMeta;\n at: number;\n duration: number;\n loop: TimelineClipLoop;\n steps?: TimelineStepStatic[];\n fixedDuration: boolean;\n composite?: boolean;\n baseAt?: number;\n delayMode?: boolean;\n pxPerSecond: number;\n viewStart: number;\n timelineDuration: number;\n selected: boolean;\n selectedStepKey?: string;\n onClick: (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void;\n onDrag: () => void;\n}) {\n let drag: DragState | null = null;\n const [dragging, setDragging] = createSignal(false);\n const isSteps = () => Boolean(props.steps?.length);\n\n const handlePointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (event.shiftKey) return;\n event.stopPropagation();\n const target = event.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n if (target.dataset.boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(target.dataset.boundary);\n } else if (!props.fixedDuration) {\n const edge = target.dataset.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n drag = {\n mode,\n boundaryIndex,\n pointerX: event.clientX,\n at: props.at,\n duration: props.duration,\n stepDurations: props.steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]'),\n moved: false,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (!drag || props.pxPerSecond <= 0) return;\n const dx = event.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n setDragging(true);\n props.onDrag();\n }\n const dt = dx / props.pxPerSecond;\n const baseAt = props.baseAt ?? 0;\n if (drag.mode === 'boundary' && props.steps && drag.stepDurations) {\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, duration, stepIndex) => stepIndex === index ? sum : sum + duration, 0);\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.${props.steps[index].key ?? ''}.duration`,\n clampStepResize(drag.stepDurations[index] + dt, drag.at, others, props.timelineDuration)\n );\n } else if (drag.mode === 'move') {\n if (props.delayMode) {\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.delay`,\n clampTrackDelay(drag.at + dt - baseAt, baseAt, drag.duration, props.timelineDuration)\n );\n } else {\n DialStore.updateValue(props.timelineId, `${props.clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, props.timelineDuration));\n }\n } else if (drag.mode === 'end') {\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.duration`,\n clampClipResizeEnd(drag.duration + dt, drag.at, props.timelineDuration)\n );\n } else if (props.steps && drag.stepDurations) {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(baseAt, 0)), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${props.clip.key}.${props.steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(baseAt, 0)), drag.at, drag.duration);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${props.clip.key}.duration`]: next.duration,\n });\n }\n };\n\n const finish = (event?: PointerEvent & { currentTarget: HTMLDivElement }) => {\n const previous = drag;\n drag = null;\n setDragging(false);\n if (previous && !previous.moved && event) {\n const anchor = previous.clickEl ?? event.currentTarget;\n props.onClick(props.clip, anchor.getBoundingClientRect(), previous.clickEl?.dataset.step);\n }\n };\n\n const ghostCycles = createMemo(() => {\n const cycles: Array<{ start: number; duration: number; index: number }> = [];\n if (props.loop !== 'repeat' || props.duration <= 0) return cycles;\n const first = Math.max(1, Math.floor((props.viewStart - props.at) / props.duration));\n for (let offset = 0; offset < 256; offset++) {\n const index = first + offset;\n const start = props.at + props.duration * index;\n if (start >= props.timelineDuration - 1e-6) break;\n cycles.push({ start, duration: Math.min(props.duration, props.timelineDuration - start), index });\n }\n return cycles;\n });\n const boundaries = createMemo(() => {\n let total = 0;\n return props.steps?.map((step) => (total += step.duration)) ?? [];\n });\n const width = () => Math.max(props.duration * props.pxPerSecond, 14);\n const resizable = () => props.duration > 0 && !props.fixedDuration && !props.composite;\n const durationText = () => `${props.fixedDuration && !props.composite ? '~' : ''}${formatSeconds(props.duration)}`;\n const looping = () => props.loop === 'repeat' && props.duration > 0;\n const title = () => props.composite\n ? `${props.clip.label} — composite of its property tracks${looping() ? ' · repeats through timeline' : ''} · click to expand`\n : `${props.clip.label} — ${formatSeconds(props.at)} for ${durationText()}${props.fixedDuration ? ' (duration set by spring physics)' : ''}${looping() ? ' · repeats through timeline' : ''}${props.delayMode ? ' · drag to phase-shift' : ''}`;\n\n return (\n <>\n <For each={ghostCycles()}>{(cycle) => (\n <div\n class=\"dialkit-timeline-clip-ghost\"\n data-steps={isSteps() || undefined}\n aria-hidden=\"true\"\n style={{\n left: `${(cycle.start - props.viewStart) * props.pxPerSecond + 1}px`,\n width: `${Math.max(1, cycle.duration * props.pxPerSecond - 2)}px`,\n background: props.clip.color,\n }}\n >\n <For each={props.steps}>{(step) => <span class=\"dialkit-timeline-clip-ghost-segment\" style={{ width: `${step.duration * props.pxPerSecond}px` }} />}</For>\n </div>\n )}</For>\n <div\n class=\"dialkit-timeline-clip\"\n data-steps={isSteps() || undefined}\n data-composite={props.composite || undefined}\n data-selected={props.selected || undefined}\n data-dragging={dragging() || undefined}\n style={{\n left: `${(props.at - props.viewStart) * props.pxPerSecond}px`,\n width: `${width()}px`,\n background: props.composite ? `${props.clip.color}80` : props.clip.color,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={(event) => finish(event)}\n onPointerCancel={() => finish()}\n onLostPointerCapture={() => finish()}\n title={title()}\n >\n <Show\n when={!props.composite}\n fallback={<Show when={width() > 56}><span class=\"dialkit-timeline-clip-duration\">{durationText()}</span></Show>}\n >\n <Show\n when={isSteps()}\n fallback={\n <>\n <Show when={resizable()}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"start\" /></Show>\n <Show when={width() > 56}><span class=\"dialkit-timeline-clip-duration\">{durationText()}</span></Show>\n <Show when={resizable()}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"end\" /></Show>\n </>\n }\n >\n <For each={props.steps}>{(step) => {\n const segmentWidth = () => step.duration * props.pxPerSecond;\n return (\n <div\n class=\"dialkit-timeline-clip-segment\"\n data-step={step.key ?? undefined}\n data-selected={props.selectedStepKey === step.key || undefined}\n style={{ width: `${segmentWidth()}px` }}\n >\n <Show when={segmentWidth() > 52}><span class=\"dialkit-timeline-clip-duration\">{formatSeconds(step.duration)}</span></Show>\n </div>\n );\n }}</For>\n <For each={props.steps}>{(step, index) => (\n <Show when={!step.isPhysics}>\n <div\n class=\"dialkit-timeline-clip-handle\"\n data-boundary={index()}\n style={{ left: `${boundaries()[index()] * props.pxPerSecond - 4}px` }}\n />\n </Show>\n )}</For>\n <Show when={!props.steps?.[0]?.isPhysics}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"start\" /></Show>\n </Show>\n </Show>\n </div>\n <Show when={looping()}><span class=\"dialkit-timeline-loop-infinity\" aria-hidden=\"true\" title=\"Repeats indefinitely\">∞</span></Show>\n </>\n );\n}\n","import { For, Show } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport type {\n ControlMeta,\n DialValue,\n SpringConfig,\n TransitionConfig,\n} from '../../store/DialStore';\nimport { useShortcutContext } from './ShortcutListener';\nimport { ButtonGroup } from './ButtonGroup';\nimport { ColorControl } from './ColorControl';\nimport { Folder } from './Folder';\nimport { SelectControl } from './SelectControl';\nimport { Slider } from './Slider';\nimport { SpringControl } from './SpringControl';\nimport { TextControl } from './TextControl';\nimport { Toggle } from './Toggle';\nimport { TransitionControl, type TransitionDurationControl } from './TransitionControl';\n\ninterface ControlRendererProps {\n panelId: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n transitionDuration?: TransitionDurationControl;\n}\n\nexport function ControlRenderer(props: ControlRendererProps) {\n const shortcut = useShortcutContext();\n\n const renderControl = (control: ControlMeta) => {\n const value = () => props.values[control.path];\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n label={control.label}\n value={value() as number}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcut().activePanelId === props.panelId && shortcut().activePath === control.path}\n />\n );\n case 'toggle':\n return (\n <Toggle\n label={control.label}\n checked={value() as boolean}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n shortcut={control.shortcut}\n shortcutActive={shortcut().activePanelId === props.panelId && shortcut().activePath === control.path}\n />\n );\n case 'spring':\n return (\n <SpringControl\n panelId={props.panelId}\n path={control.path}\n label={control.label}\n spring={value() as SpringConfig}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'transition':\n return (\n <TransitionControl\n panelId={props.panelId}\n path={control.path}\n label={control.label}\n value={value() as TransitionConfig}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n durationControl={props.transitionDuration}\n />\n );\n case 'folder':\n return (\n <Folder title={control.label} defaultOpen={control.defaultOpen ?? true}>\n <For each={control.children ?? []}>{renderControl}</For>\n </Folder>\n );\n case 'text':\n return (\n <TextControl\n label={control.label}\n value={value() as string}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n placeholder={control.placeholder}\n />\n );\n case 'select':\n return (\n <SelectControl\n label={control.label}\n value={value() as string}\n options={control.options ?? []}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'color':\n return (\n <ColorControl\n label={control.label}\n value={value() as string}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'action':\n return (\n <button class=\"dialkit-button\" onClick={() => DialStore.triggerAction(props.panelId, control.path)}>\n {control.label}\n </button>\n );\n default:\n return null;\n }\n };\n\n return <For each={props.controls}>{renderControl}</For>;\n}\n","import { For } from 'solid-js';\n\ninterface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup(props: ButtonGroupProps) {\n return (\n <div class=\"dialkit-button-group\">\n <For each={props.buttons}>\n {(button) => (\n <button class=\"dialkit-button\" onClick={button.onClick}>\n {button.label}\n </button>\n )}\n </For>\n </div>\n );\n}\n"],"mappings":"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","names":["createUniqueId","onCleanup","onMount","isServer","wd","t","from","createUniqueId","isServer","onCleanup","onMount","createSignal","onMount","Show","For","Portal","createEffect","createSignal","onCleanup","isServer","createContext","useContext","createSignal","onMount","onCleanup","defaultState","activePanelId","activePath","ShortcutContext","createContext","useShortcutContext","useContext","ShortcutListener","props","activeShortcut","setActiveShortcut","createSignal","setShortcutTarget","prev","activeKeys","Set","isDragging","lastMouseX","dragAccumulator","resolveActiveTarget","interaction","key","panels","DialStore","getPanels","panel","path","shortcut","Object","entries","shortcuts","toLowerCase","control","getPanel","id","controls","findControl","type","panelId","onMount","handleKeyDown","e","isInputFocused","size","target","preventDefault","direction","effectiveStep","getEffectiveStep","applySliderDelta","wasAlreadyHeld","has","add","modifier","getActiveModifier","resolveShortcutTarget","currentValue","getValue","updateValue","handleKeyUp","delete","found","remainingKey","handleWheel","deltaY","scrollOnlyTargets","resolveScrollOnlyTargets","handleMouseDown","clientX","handleMouseUp","handleMouseMove","deltaX","steps","Math","trunc","DRAG_SENSITIVITY","moveTarget","handleWindowBlur","clear","window","addEventListener","passive","onCleanup","removeEventListener","_$createComponent","Provider","value","children","createSignal","createEffect","on","onCleanup","untrack","Show","isServer","animate","morphTransition","type","visualDuration","bounce","RootPanel","props","inline","isOpen","setIsOpen","createSignal","defaultOpen","contentHeight","setContentHeight","undefined","windowHeight","setWindowHeight","isServer","window","innerHeight","folderRef","handleToggle","next","onOpenChange","folderContent","_el$","_tmpl$5","_el$2","firstChild","_el$3","_ref$","_$use","$$click","_$insert","_$createComponent","Show","when","children","_el$4","_tmpl$","_el$5","title","_el$6","_tmpl$2","_el$7","_el$8","nextSibling","_el$9","_el$0","_$effect","_p$","_v$","ICON_PANEL","path","_v$2","circles","cx","_v$3","cy","_v$4","r","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","e","_$setAttribute","t","a","o","i","n","s","h","d","_$memo","toolbar","_el$1","_tmpl$3","stopPropagation","_el$10","_tmpl$4","_el$11","String","_el$12","_tmpl$6","panelRef","morphAnim","tapAnim","onWindowResize","addEventListener","onCleanup","removeEventListener","stop","createEffect","el","ro","ResizeObserver","offsetHeight","prev","observe","disconnect","measuredOpenHeight","Math","min","panelHeightOffset","getBoundingClientRect","height","on","open","prevOpen","target","width","borderRadius","boxShadow","style","cursor","overflow","animate","onComplete","winHeight","untrack","defer","handler","pressTo","scale","_el$13","_tmpl$7","$$pointerup","$$pointerdown","document","activeElement","blur","_ref$2","_$delegateEvents","batch","createSignal","createEffect","on","onMount","onCleanup","For","animate","createSignal","createEffect","on","onCleanup","Show","animate","sectionTransition","type","visualDuration","bounce","Folder","props","isRoot","_$createComponent","RootPanel","isOpen","setIsOpen","createSignal","defaultOpen","contentMounted","setContentMounted","skipFirstAnim","sectionContentRef","sectionAnim","chevronRef","chevronAnim","onCleanup","stop","createEffect","on","open","animate","rotate","defer","handleToggle","next","height","opacity","onComplete","currentHeight","getBoundingClientRect","style","undefined","onOpenChange","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","_el$5","_el$6","nextSibling","_el$7","$$click","_$insert","title","_ref$","_$use","_$setAttribute","ICON_CHEVRON","Show","when","children","_el$8","_tmpl$","_el$9","el","_$effect","_p$","_v$","String","_v$2","e","t","_$setStyleProperty","_$delegateEvents","createSignal","createEffect","onMount","onCleanup","Show","animate","motionValue","CLICK_THRESHOLD","DEAD_ZONE","MAX_CURSOR_RANGE","MAX_STRETCH","Slider","props","min","max","step","wrapperRef","trackRef","fillRef","handleRef","labelRef","valueSpanRef","inputRef","isInteracting","setIsInteracting","createSignal","isDragging","setIsDragging","isHovered","setIsHovered","isValueHovered","setIsValueHovered","isValueEditable","setIsValueEditable","showInput","setShowInput","inputValue","setInputValue","fillPercent","motionValue","value","rubberStretchPx","handleOpacityMv","handleScaleXMv","handleScaleYMv","applyFillStyles","pct","style","width","left","applyRubberStyles","stretch","Math","abs","transform","applyHandleVisualStyles","opacity","String","get","createEffect","snapAnim","jump","percentage","isActive","pointerDownPos","isClickFlag","wrapperRect","scaleVal","hoverTimeout","rubberAnim","handleOpacityAnim","handleScaleXAnim","handleScaleYAnim","positionToValue","clientX","screenX","sceneX","nativeWidth","offsetWidth","percent","rawValue","percentFromValue","v","computeRubberStretch","sign","distancePast","right","overflow","sqrt","cancelInteraction","handlePointerDown","e","preventDefault","currentTarget","setPointerCapture","pointerId","x","y","clientY","getBoundingClientRect","handlePointerMove","dx","dy","distance","newValue","newPct","stop","onChange","roundValue","handlePointerUp","discreteSteps","snappedValue","round","snapToDecile","animate","type","stiffness","damping","mass","onComplete","visualDuration","bounce","handlePointerCancel","hovered","editing","editable","onCleanup","clearTimeout","setTimeout","onMount","unsubFill","on","unsubRubber","unsubHandleOpacity","unsubHandleScaleX","unsubHandleScaleY","focus","select","handleInputSubmit","parsed","parseFloat","isNaN","clamped","handleValueClick","stopPropagation","toFixed","decimalsForStep","handleInputKeyDown","key","displayValue","HANDLE_BUFFER","LABEL_CSS_LEFT","VALUE_CSS_RIGHT","leftThreshold","trackWidth","rightThreshold","valueDodge","handleOpacity","targetOpacity","targetScaleX","targetScaleY","duration","hashMarks","ds","Array","from","length","_","i","_el$","_tmpl$","_$setStyleProperty","_el$2","_el$3","_tmpl$3","_el$4","firstChild","_el$5","_el$6","nextSibling","_el$7","_el$8","_ref$","_$use","addEventListener","$$pointerup","$$pointermove","$$pointerdown","_ref$2","_$insert","_ref$3","_ref$4","_ref$5","label","_$createComponent","Show","when","shortcut","children","_el$9","_tmpl$2","formatSliderShortcut","_$effect","_$className","shortcutActive","_c$","_$memo","_el$0","_tmpl$4","$$mousedown","$$click","$$keydown","$$input","_ref$6","_el$1","_ref$7","_p$","_v$4","_v$5","t","undefined","_v$","_v$2","_v$3","a","_$delegateEvents","Show","createSignal","createEffect","on","onMount","onCleanup","For","Show","SegmentedControl","props","containerRef","pillStyle","setPillStyle","hasChanged","setHasChanged","measure","activeButton","querySelector","left","offsetLeft","width","offsetWidth","value","options","length","defer","ro","ResizeObserver","observe","disconnect","transition","_el$","_tmpl$","_ref$","_$use","_$insert","_$createComponent","when","children","style","_el$2","_tmpl$2","_$effect","_p$","_v$","_v$2","_v$3","e","_$setStyleProperty","t","a","undefined","each","option","_el$3","_tmpl$3","$$click","onChange","label","_$setAttribute","String","_$delegateEvents","Toggle","props","_el$","_tmpl$2","_el$2","firstChild","_$insert","label","_$createComponent","Show","when","shortcut","children","_el$3","_tmpl$","formatToggleShortcut","_$effect","_$className","shortcutActive","SegmentedControl","options","value","checked","onChange","val","generateSpringCurve","stiffness","damping","mass","duration","points","steps","dt","position","velocity","target","i","time","push","springForce","dampingForce","acceleration","SpringVisualization","props","width","height","params","isSimpleMode","visualDuration","spring","bounce","Math","pow","PI","dampingRatio","sqrt","values","map","value","minValue","min","maxValue","max","valueRange","pathData","x","normalizedValue","y","join","gridLines","lines","createLine","x1","y1","x2","y2","_el$","_tmpl$","_$setAttribute","_el$2","_tmpl$2","_el$3","firstChild","_el$4","nextSibling","_$insert","_$effect","SpringControl","props","mode","fromStore","DialStore","getSpringMode","panelId","path","notify","subscribe","isSimpleMode","cache","simple","spring","visualDuration","undefined","type","bounce","advanced","stiffness","damping","mass","handleModeChange","newMode","updateSpringMode","onChange","handleUpdate","key","value","rest","_$createComponent","Folder","title","label","defaultOpen","children","_el$","_tmpl$","_el$2","firstChild","_el$3","_$insert","SpringVisualization","SegmentedControl","options","_c$","_$memo","Slider","v","min","max","step","unit","createSignal","Show","EasingVisualization","props","size","pad","unit","toSvg","x","y","start","end","curvePath","x1","y1","x2","y2","easing","ease","first","second","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","e","_$setAttribute","t","a","o","i","undefined","TransitionControl","props","mode","fromStore","DialStore","getTransitionMode","panelId","path","notify","subscribe","editingEase","setEditingEase","createSignal","easeDraft","setEaseDraft","cache","easing","value","type","duration","ease","simple","visualDuration","undefined","bounce","advanced","stiffness","damping","mass","isEasing","isSimple","spring","handleModeChange","next","updateTransitionMode","onChange","handleSpringUpdate","key","current","rest","updateEase","index","formatEase","map","part","Number","toFixed","join","commitEase","parts","split","parseFloat","trim","length","every","isFinite","durationSlider","hideDuration","external","durationControl","_$createComponent","Slider","label","min","max","step","unit","Folder","title","defaultOpen","children","_el$","_tmpl$2","_el$2","firstChild","_el$3","_$insert","Show","when","fallback","SpringVisualization","isSimpleMode","EasingVisualization","SegmentedControl","options","_el$4","_tmpl$","_el$5","_el$6","nextSibling","$$keydown","event","currentTarget","blur","addEventListener","$$input","_$setAttribute","_$effect","_$memo","_$delegateEvents","createUniqueId","TextControl","props","inputId","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$setAttribute","_$insert","label","$$input","e","onChange","currentTarget","value","_$effect","placeholder","_$delegateEvents","createSignal","createEffect","on","onMount","onCleanup","Show","For","Portal","animate","toTitleCase","s","replace","c","toUpperCase","normalizeOptions","options","map","opt","value","label","SelectControl","props","pos","setPos","createSignal","portalTarget","setPortalTarget","triggerRef","chevronRef","chevronAnim","normalized","selectedOption","find","o","dropdown","createDropdownPresence","el","done","animate","opacity","y","above","scale","type","visualDuration","bounce","onComplete","onMount","getDialKitPortalRoot","document","body","onCleanup","stop","createEffect","on","isOpen","open","rotate","defer","updatePos","root","dropdownHeight","length","getDropdownPosition","openDropdown","createDropdownDismiss","contains","target","onDismiss","close","onViewportChange","dropdownStyle","p","position","left","top","width","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","$$click","_ref$","_$use","_$insert","_ref$2","_$setAttribute","ICON_CHEVRON","_$createComponent","Show","when","children","Portal","mount","_$memo","mounted","_el$8","_tmpl$","setRef","For","each","option","_el$9","_tmpl$3","onChange","_$effect","String","_$p","_$style","_$delegateEvents","createSignal","createEffect","createUniqueId","Show","HEX_COLOR_REGEX","expandShorthandHex","hex","length","ColorControl","props","isEditing","setIsEditing","editValue","setEditValue","value","textInputId","colorInputRef","handleTextSubmit","test","onChange","handleKeyDown","e","key","_el$","_tmpl$2","_el$2","firstChild","_el$3","nextSibling","_el$5","_el$6","_$setAttribute","_$insert","label","_$createComponent","when","fallback","_el$7","_tmpl$3","$$click","toUpperCase","children","_el$4","_tmpl$","$$keydown","addEventListener","$$input","currentTarget","_$effect","click","_ref$","_$use","_p$","_v$","_v$2","_v$3","_$setStyleProperty","t","a","undefined","slice","_$delegateEvents","createSignal","createEffect","on","onMount","onCleanup","Show","For","Portal","animate","PresetManager","props","pos","setPos","createSignal","top","left","width","portalTarget","setPortalTarget","triggerRef","chevronRef","chevronAnim","hasPresets","presets","length","activePreset","find","p","id","activePresetId","dropdown","createDropdownPresence","el","done","animate","opacity","y","scale","type","visualDuration","bounce","onComplete","onMount","getDialKitPortalRoot","document","body","onCleanup","stop","createEffect","on","isOpen","open","has","rotate","defer","updatePos","root","getDropdownPosition","allowAbove","openDropdown","toggle","close","createDropdownDismiss","contains","target","onDismiss","onViewportChange","handleSelect","presetId","DialStore","loadPreset","panelId","clearActivePreset","handleDelete","e","stopPropagation","deletePreset","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","$$click","_ref$","_$use","_$insert","_c$","_$memo","name","_ref$2","_$setAttribute","ICON_CHEVRON","_$createComponent","Show","when","children","Portal","mount","mounted","_el$6","_tmpl$","_el$7","setRef","For","each","preset","_el$8","_tmpl$3","_el$9","_el$0","_el$1","_el$10","_el$11","_el$12","_el$13","_el$14","_$effect","_p$","_v$9","String","_v$0","ICON_TRASH","_v$1","_v$10","_v$11","_v$12","t","a","o","i","n","undefined","_v$","_v$2","_v$3","_v$4","_$setStyleProperty","_v$5","_v$6","_v$7","_v$8","_$delegateEvents","Panel","props","copied","setCopied","createSignal","shortcutCtx","useShortcutContext","values","setValues","DialStore","getValues","panel","id","presets","setPresets","getPresets","activePresetId","setActivePresetId","getActivePresetId","addButtonRef","copyButtonRef","copyClipboardIconRef","copyCheckIconRef","addTapAnim","copyTapAnim","copyClipboardAnim","copyCheckAnim","tapTransition","type","visualDuration","bounce","onMount","unsub","subscribe","batch","onCleanup","handleAddPreset","nextNum","length","savePreset","handleCopy","jsonStr","JSON","stringify","instruction","name","navigator","clipboard","writeText","setTimeout","createEffect","on","isCopied","stop","transition","animate","opacity","scale","filter","defer","handleAddTapStart","handleAddTapEnd","handleCopyTapStart","handleCopyTapEnd","handleOpenChange","open","onOpenChange","renderControl","control","value","path","_$createComponent","Slider","label","onChange","v","updateValue","min","max","step","shortcut","shortcutActive","_$memo","activePanelId","activePath","Toggle","checked","SpringControl","panelId","spring","TransitionControl","Folder","title","defaultOpen","children","For","each","child","TextControl","placeholder","SelectControl","options","ColorControl","renderControls","controls","_el$","_tmpl$","$$click","triggerAction","_$insert","toolbar","_el$2","_tmpl$2","_el$3","firstChild","_el$4","_el$5","nextSibling","_el$6","_el$7","_el$8","addEventListener","$$pointerup","$$pointerdown","_ref$","_$use","_$effect","_p$","_v$","ICON_ADD_PRESET","_v$2","_v$3","_v$4","_v$5","e","_$setAttribute","t","a","o","i","undefined","PresetManager","onAdd","_el$9","_tmpl$3","_el$0","_el$1","_el$10","_el$11","_el$12","_el$13","_el$14","_el$15","_el$16","_ref$2","_ref$3","_ref$4","ICON_CHECK","_v$6","ICON_CLIPBOARD","board","_v$7","sparkle","_v$8","body","toolbarExtra","variant","_el$17","_tmpl$4","stopPropagation","_el$18","_tmpl$5","RootPanel","inline","_$delegateEvents","For","TimelineToggleButton","visible","fromStore","TimelineUiStore","getVisible","notify","subscribe","label","_el$","_tmpl$","_el$2","firstChild","$$click","toggle","_$insert","_$createComponent","For","each","ICON_TIMELINE","children","path","_el$3","_tmpl$2","_$setAttribute","_$effect","_p$","_v$","undefined","_v$2","_v$3","_v$4","e","t","a","o","_$delegateEvents","isDevDefault","process","env","NODE_ENV","import","MODE","DialRoot","props","enabled","productionEnabled","_$createComponent","Show","when","children","DialRootInner","panels","fromStore","DialStore","getPanels","notify","subscribeGlobal","timelines","TimelineStore","getTimelines","mounted","setMounted","createSignal","dragOffset","setDragOffset","activePosition","setActivePosition","position","inline","mode","panelRef","lastDragOffset","dragging","dragStart","didDrag","dragTarget","onMount","fallbackOpen","defaultOpen","panelOpenStates","Map","rootFolderOpen","anyOpen","list","length","some","panel","get","id","applyDragOffsetForOpen","open","currentDragOffset","bubbleCenterX","x","window","innerWidth","reactToOpenChange","before","after","onOpenChange","handlePanelOpenChange","panelId","set","handleRootOpenChange","handlePointerDown","event","handle","getPanelDragHandle","target","getPanelDragStart","clientX","clientY","setPointerCapture","pointerId","handlePointerMove","hasPanelDragMoved","getPanelDragOffset","handlePointerUp","hasPointerCapture","releasePointerCapture","stopPropagation","blockPanelDragClick","dragStyle","offset","top","y","left","right","bottom","undefined","timelineToggle","TimelineToggleButton","content","ShortcutListener","_el$","_tmpl$2","_el$2","firstChild","addEventListener","$$pointerup","$$pointermove","$$pointerdown","_ref$","_$use","_$insert","fallback","_el$4","_tmpl$","RootPanel","title","toolbar","panelHeightOffset","_tmpl$3","For","each","Panel","toolbarExtra","_el$3","variant","_$effect","_p$","_v$","_v$2","theme","_v$3","_v$4","getPanelOriginX","_v$5","_v$6","_v$7","e","_$setAttribute","t","a","o","i","n","s","_$style","_$memo","Portal","mount","document","body","_$delegateEvents","For","Show","createEffect","createMemo","createSignal","onCleanup","onMount","Portal","For","ControlRenderer","props","shortcut","useShortcutContext","renderControl","control","value","values","path","type","_$createComponent","Slider","label","onChange","next","DialStore","updateValue","panelId","min","max","step","shortcutActive","_$memo","activePanelId","activePath","Toggle","checked","SpringControl","spring","TransitionControl","durationControl","transitionDuration","Folder","title","defaultOpen","children","For","each","TextControl","placeholder","SelectControl","options","ColorControl","_el$","_tmpl$","$$click","triggerAction","_$insert","controls","_$delegateEvents","DRAG_THRESHOLD_PX","MAJOR_TICK_TARGET_PX","MILLISECOND_STEP","SECOND_TICK_STEPS","MIN_TIMELINE_MAX_ZOOM","PLAYHEAD_FLAG_WIDTH","POPOVER_WIDTH","ZOOM_DRAG_DISTANCE","DialTimeline","props","enabled","productionEnabled","isDevDefault","_$createComponent","Show","when","children","DialTimelineDock","timelines","fromStore","TimelineStore","getTimelines","notify","subscribeGlobal","visible","TimelineUiStore","getVisible","subscribe","mounted","setMounted","createSignal","controllerId","Symbol","onMount","unregister","registerController","defaultVisible","onVisibilityChange","onCleanup","createEffect","updateController","_$memo","length","Portal","mount","document","body","_el$","_tmpl$","_el$2","firstChild","_$insert","For","each","timeline","TimelineSection","meta","defaultOpen","theme","dockVisible","_$effect","_p$","_v$","_v$2","e","_$setAttribute","t","hidden","undefined","PlayPauseButton","playing","getTransport","id","label","_el$3","_tmpl$3","_el$4","$$click","pause","play","fallback","_el$6","_tmpl$4","_el$7","ICON_PLAY","_$p","_$style","iconStyle","_el$5","_tmpl$2","ICON_PAUSE","path","_el$8","_tmpl$5","_v$3","_v$4","position","inset","width","height","color","TimelineOverview","time","scrub","seekFromClientX","clientX","rect","duration","next","clamp","left","seek","onNavigate","finish","wasPlaying","_el$9","_tmpl$6","_el$0","_el$1","nextSibling","_el$10","addEventListener","$$pointerup","$$pointermove","event","$$pointerdown","preventDefault","currentTarget","setPointerCapture","pointerId","getBoundingClientRect","_v$5","viewEnd","viewStart","_v$6","_v$7","_v$8","_v$9","_$setStyleProperty","a","o","i","TimelinePlayheadFlag","cleanup","x","pxPerSecond","laneWidth","placement","headerClearStart","headerClearEnd","_el$11","_tmpl$7","_el$12","ruler","stopPropagation","reset","shiftKey","onResetView","move","window","removeEventListener","passive","toFixed","_v$0","_v$1","_v$10","_v$11","clampViewStart","start","visibleDuration","Math","max","formatRulerSeconds","step","Number","isInteger","formatClock","decimals","min","ceil","log10","open","setOpen","copied","setCopied","popover","setPopover","collapsedGroups","setCollapsedGroups","Set","expandedTracks","setExpandedTracks","zoom","setZoom","setViewStart","values","DialStore","getValues","presets","getPresets","activePresetId","getActivePresetId","laneAreaRef","titleRef","actionsRef","setLaneWidth","flagClearRange","setFlagClearRange","end","measure","rulerRect","titleRect","actionsRect","round","right","observer","ResizeObserver","observe","disconnect","safeViewStart","maxZoom","current","centerViewAt","resetView","zoomDrag","rulerScrub","trackScrub","seekRuler","seekTrack","handleRulerPointerDown","altKey","ratio","pointerX","anchorRatio","anchorTime","moved","handleRulerPointerMove","dx","abs","nextZoom","exp","nextDuration","finishRuler","handleTrackPointerDown","target","closest","finishTrack","handleCopy","normalized","normalizeTimelineValuesForCopy","clips","navigator","clipboard","writeText","buildCopyInstruction","name","setTimeout","handleAddPreset","savePreset","closePopover","openClipPopover","clip","stepKey","targetPath","key","getClipControls","clipPopoverExclusions","previous","anchor","top","bottom","toggleSet","setter","has","delete","add","toggleTracks","toggleGroup","handleBarClick","tracks","ticks","createMemo","rawStep","adaptive","find","majorStep","fineStep","major","medium","fine","firstMajor","push","firstFine","lastFine","floor","index","tick","rows","result","lastGroup","currentValues","group","collapsed","_el$13","_tmpl$8","_el$14","_el$15","_el$16","ChevronIcon","formatLabel","isProps","Boolean","tracksOpen","stat","computeClipStaticFromValues","selected","_el$17","_tmpl$0","_el$18","_el$20","_el$19","_tmpl$9","TimelineClip","timelineId","at","loop","steps","stepKeys","fixedDuration","isPhysics","composite","timelineDuration","selectedStepKey","onClick","onDrag","trackRef","track","candidate","prop","trackKey","trackMeta","trackSelected","_el$21","_tmpl$1","_el$22","_el$23","delay","baseAt","delayMode","_el$24","_tmpl$12","_el$25","_el$26","_el$27","_el$28","_el$29","_el$30","_el$31","_el$32","_el$35","_ref$","_$use","_ref$2","ICON_ADD_PRESET","_el$41","_tmpl$13","PresetManager","panelId","onAdd","_el$42","_tmpl$14","_el$43","_el$44","_el$45","_v$17","_v$18","ICON_CLIPBOARD","board","_v$19","sparkle","_v$20","_el$33","_tmpl$10","_el$34","ICON_CHECK","_el$36","_tmpl$11","_el$37","_el$38","_el$39","_el$40","_ref$3","_el$46","_tmpl$15","_el$47","_tmpl$16","_el$48","_tmpl$17","_el$49","ClipPopover","onClose","_v$12","_v$13","_v$14","_v$15","_v$16","_el$50","_tmpl$18","_el$51","ICON_CHEVRON","ref","naturalHeight","setNaturalHeight","viewport","setViewport","readViewport","scrollHeight","querySelector","updateViewport","outside","contains","keydown","visualViewport","presentation","controls","title","from","getControlAt","findIndex","control","slice","formatStepLabel","durationMeta","durationValue","transitionDuration","type","value","onChange","updateValue","TIMELINE_MIN_CLIP_DURATION","displayValues","timelinePopoverDisplayValues","offsetLeft","offsetTop","above","below","placeAbove","availableHeight","renderedHeight","rawTop","_el$52","_tmpl$19","_el$53","_el$54","_el$55","_el$56","_el$57","_ref$4","_$addEventListener","ControlRenderer","_v$21","_v$22","_v$23","_v$24","_v$25","_v$26","_v$27","_v$28","n","s","h","innerWidth","innerHeight","map","exclusions","panel","getPanel","folder","findControl","filter","drag","dragging","setDragging","isSteps","handlePointerDown","mode","boundaryIndex","dataset","boundary","edge","stepDurations","clickEl","handlePointerMove","dt","others","reduce","sum","stepIndex","clampStepResize","clampTrackDelay","clampClipMove","clampClipResizeEnd","clampClipResizeStart","updateValues","ghostCycles","cycles","first","offset","boundaries","total","resizable","durationText","formatSeconds","looping","cycle","_el$61","_tmpl$23","_el$62","_tmpl$24","_v$37","_v$38","_v$39","_v$40","_el$58","_tmpl$21","_el$63","_tmpl$25","_tmpl$20","_el$65","_tmpl$26","segmentWidth","_el$67","_tmpl$27","_el$68","_v$41","_v$42","_v$43","_el$69","_tmpl$28","_v$44","_v$45","_v$29","_v$30","_v$31","_v$32","_v$33","_v$34","_v$35","_v$36","_tmpl$22","_$delegateEvents","For","ButtonGroup","props","_el$","_tmpl$","_$insert","_$createComponent","each","buttons","children","button","_el$2","_tmpl$2","_$addEventListener","onClick","label","_$delegateEvents"]}
|
|
1
|
+
{"version":3,"sources":["../../src/solid/createDialKit.ts","../../src/store/DialStore.ts","../../src/solid/createDialTimeline.ts","../../src/store/TimelineStore.ts","../../src/transition-math.ts","../../src/timeline-core.ts","../../src/timeline/adapter.ts","../../src/store/TimelineUiStore.ts","../../src/copy-instruction.ts","../../src/env.ts","../../src/solid/components/DialRoot.tsx","../../src/solid/primitives.ts","../../src/solid/components/ShortcutListener.tsx","../../src/shortcut-utils.ts","../../src/solid/components/RootPanel.tsx","../../src/icons.ts","../../src/solid/components/Panel.tsx","../../src/solid/components/Folder.tsx","../../src/solid/components/Slider.tsx","../../src/solid/components/Toggle.tsx","../../src/solid/components/SegmentedControl.tsx","../../src/solid/components/SpringVisualization.tsx","../../src/solid/components/SpringControl.tsx","../../src/solid/components/TransitionControl.tsx","../../src/solid/components/EasingVisualization.tsx","../../src/solid/components/TextControl.tsx","../../src/solid/components/SelectControl.tsx","../../src/dropdown-position.ts","../../src/solid/components/ColorControl.tsx","../../src/solid/components/PresetManager.tsx","../../src/solid/components/Timeline/TimelineToggleButton.tsx","../../src/panel-drag.ts","../../src/solid/components/Timeline/DialTimeline.tsx","../../src/solid/components/ControlRenderer.tsx","../../src/solid/components/ButtonGroup.tsx"],"sourcesContent":["import { onMount, onCleanup, createUniqueId, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { createStore, reconcile } from 'solid-js/store';\nimport { DialStore, flattenDialValueUpdates, resolveDialValues } from '../store/DialStore';\nimport type {\n DialConfig,\n DialKitPersistOptions,\n DialKitValueUpdates,\n DialValue,\n ResolvedValues,\n ShortcutConfig,\n} from '../store/DialStore';\n\nexport interface CreateDialOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n onAction?: (action: string) => void;\n shortcuts?: Record<string, ShortcutConfig>;\n}\n\nexport interface DialKitController<T extends DialConfig> {\n values: Accessor<ResolvedValues<T>>;\n setValue: (path: string, value: DialValue) => void;\n setValues: (values: DialKitValueUpdates<T>) => void;\n resetValues: () => void;\n getValues: () => ResolvedValues<T>;\n}\n\nexport function createDialKit<T extends DialConfig>(\n name: string,\n config: T,\n options?: CreateDialOptions\n): Accessor<ResolvedValues<T>> {\n return createDialKitController(name, config, options).values;\n}\n\nexport function createDialKitController<T extends DialConfig>(\n name: string,\n config: T,\n options?: CreateDialOptions\n): DialKitController<T> {\n const id = createUniqueId();\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${id}`;\n\n // Resolved values live in a store so consumers reading `values().someKey`\n // subscribe to that key alone; reconcile diffs each snapshot from the\n // external DialStore instead of replacing the whole object.\n const [values, setValues] = createStore(\n resolveDialValues(config, DialStore.getValues(panelId))\n );\n\n if (!isServer) {\n // Subscribe at setup so the notify fired by registerPanel (in onMount)\n // syncs persisted/preset values into the store without a manual copy.\n const unsubValues = DialStore.subscribe(panelId, () => {\n setValues(reconcile(resolveDialValues(config, DialStore.getValues(panelId))));\n });\n onCleanup(unsubValues);\n }\n\n onMount(() => {\n DialStore.registerPanel(panelId, name, config, options?.shortcuts, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n });\n\n const unsubActions = options?.onAction\n ? DialStore.subscribeActions(panelId, options.onAction)\n : undefined;\n\n onCleanup(() => {\n unsubActions?.();\n DialStore.unregisterPanel(panelId);\n });\n });\n\n return {\n values: () => values,\n setValue(path, value) {\n DialStore.updateValue(panelId, path, value);\n },\n setValues(nextValues) {\n DialStore.updateValues(panelId, flattenDialValueUpdates(config, nextValues));\n },\n resetValues() {\n DialStore.resetValues(panelId);\n },\n getValues() {\n return resolveDialValues(config, DialStore.getValues(panelId));\n },\n };\n}\n","// Lightweight state store with subscriptions for dialkit\n\nexport type SpringConfig = {\n type: 'spring';\n stiffness?: number;\n damping?: number;\n mass?: number;\n visualDuration?: number;\n bounce?: number;\n};\n\nexport type EasingConfig = {\n type: 'easing';\n duration: number;\n ease: [number, number, number, number];\n};\n\nexport type TransitionConfig = SpringConfig | EasingConfig;\n\nexport type ActionConfig = {\n type: 'action';\n label?: string;\n};\n\nexport type SelectConfig = {\n type: 'select';\n options: (string | { value: string; label: string })[];\n default?: string;\n};\n\nexport type ColorConfig = {\n type: 'color';\n default?: string;\n};\n\nexport type TextConfig = {\n type: 'text';\n default?: string;\n placeholder?: string;\n};\n\nexport type DialValue = number | boolean | string | SpringConfig | EasingConfig | ActionConfig | SelectConfig | ColorConfig | TextConfig;\n\nexport type DialConfig = {\n [key: string]: DialValue | [number, number, number, number?] | DialConfig;\n};\n\nexport type ResolvedValues<T extends DialConfig> = {\n [K in keyof T]: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig\n ? TransitionConfig\n : T[K] extends EasingConfig\n ? TransitionConfig\n : T[K] extends SelectConfig\n ? string\n : T[K] extends ColorConfig\n ? string\n : T[K] extends TextConfig\n ? string\n : T[K] extends DialConfig\n ? ResolvedValues<T[K]>\n : T[K];\n};\n\nexport type DialKitValueUpdates<T extends DialConfig> = {\n [K in keyof T as K extends '_collapsed' ? never : K]?: T[K] extends [number, number, number, number?]\n ? number\n : T[K] extends SpringConfig | EasingConfig\n ? TransitionConfig\n : T[K] extends ActionConfig\n ? never\n : T[K] extends SelectConfig | ColorConfig | TextConfig\n ? string\n : T[K] extends DialConfig\n ? DialKitValueUpdates<T[K]>\n : T[K];\n};\n\nexport type ShortcutMode = 'fine' | 'normal' | 'coarse';\nexport type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';\n\nexport type ShortcutConfig = {\n key?: string;\n modifier?: 'alt' | 'shift' | 'meta';\n mode?: ShortcutMode;\n interaction?: ShortcutInteraction;\n};\n\nexport type ControlMeta = {\n type: 'slider' | 'toggle' | 'spring' | 'transition' | 'folder' | 'action' | 'select' | 'color' | 'text';\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n children?: ControlMeta[];\n defaultOpen?: boolean;\n options?: (string | { value: string; label: string })[];\n placeholder?: string;\n shortcut?: ShortcutConfig;\n};\n\nexport type PanelConfig = {\n id: string;\n name: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n shortcuts: Record<string, ShortcutConfig>;\n kind?: 'timeline';\n};\n\ntype Listener = () => void;\ntype ActionListener = (action: string) => void;\n\nexport type Preset = {\n id: string;\n name: string;\n values: Record<string, DialValue>;\n};\n\nexport type DialKitPersistOptions = boolean | {\n key?: string;\n storage?: 'localStorage' | 'sessionStorage';\n presets?: boolean;\n};\n\nexport type DialStorePanelOptions = {\n retainOnUnmount?: boolean;\n persist?: DialKitPersistOptions;\n kind?: 'timeline';\n};\n\ntype PersistConfig = {\n key: string;\n storage: 'localStorage' | 'sessionStorage';\n presets: boolean;\n};\n\ntype PersistedPanelState = {\n version: 1;\n values?: Record<string, DialValue>;\n baseValues?: Record<string, DialValue>;\n presets?: Preset[];\n activePresetId?: string | null;\n};\n\n// Stable empty object for unregistered panels (React 19 useSyncExternalStore requirement)\nconst EMPTY_VALUES: Record<string, DialValue> = Object.freeze({});\n\nexport function resolveDialValues<T extends DialConfig>(\n config: T,\n flatValues: Record<string, DialValue>\n): ResolvedValues<T> {\n return resolveConfigValues(config, flatValues, '') as ResolvedValues<T>;\n}\n\nexport function flattenDialValueUpdates<T extends DialConfig>(\n config: T,\n updates: DialKitValueUpdates<T>\n): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n if (typeof updates === 'object' && updates !== null) {\n flattenConfigUpdates(config, updates as Record<string, unknown>, '', values);\n }\n return values;\n}\n\nfunction resolveConfigValues(\n config: DialConfig,\n flatValues: Record<string, DialValue>,\n prefix: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(configValue) && configValue.length <= 4 && typeof configValue[0] === 'number') {\n result[key] = flatValues[path] ?? configValue[0];\n } else if (typeof configValue === 'number' || typeof configValue === 'boolean' || typeof configValue === 'string') {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSpringConfigValue(configValue) || isEasingConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isActionConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue;\n } else if (isSelectConfigValue(configValue)) {\n const defaultValue = configValue.default ?? getFirstOptionValue(configValue.options);\n result[key] = flatValues[path] ?? defaultValue;\n } else if (isColorConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '#000000';\n } else if (isTextConfigValue(configValue)) {\n result[key] = flatValues[path] ?? configValue.default ?? '';\n } else if (typeof configValue === 'object' && configValue !== null) {\n result[key] = resolveConfigValues(configValue as DialConfig, flatValues, path);\n }\n }\n\n return result;\n}\n\nfunction flattenConfigUpdates(\n config: DialConfig,\n updates: Record<string, unknown>,\n prefix: string,\n values: Record<string, DialValue>\n): void {\n for (const [key, configValue] of Object.entries(config)) {\n if (key === '_collapsed' || !(key in updates)) continue;\n\n const nextValue = updates[key];\n if (nextValue === undefined) continue;\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (isActionConfigValue(configValue)) {\n continue;\n }\n\n if (isLeafConfigValue(configValue)) {\n values[path] = nextValue as DialValue;\n continue;\n }\n\n if (\n typeof configValue === 'object' &&\n configValue !== null &&\n typeof nextValue === 'object' &&\n nextValue !== null &&\n !Array.isArray(nextValue)\n ) {\n flattenConfigUpdates(configValue as DialConfig, nextValue as Record<string, unknown>, path, values);\n }\n }\n}\n\nfunction isLeafConfigValue(value: unknown): boolean {\n return (\n (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isSpringConfigValue(value) ||\n isEasingConfigValue(value) ||\n isActionConfigValue(value) ||\n isSelectConfigValue(value) ||\n isColorConfigValue(value) ||\n isTextConfigValue(value)\n );\n}\n\nfunction hasType(value: unknown, type: string): boolean {\n return typeof value === 'object' && value !== null && 'type' in value && (value as { type: string }).type === type;\n}\n\nexport function isSpringConfigValue(value: unknown): value is SpringConfig {\n return hasType(value, 'spring');\n}\n\nexport function isEasingConfigValue(value: unknown): value is EasingConfig {\n return hasType(value, 'easing');\n}\n\nexport function isHexColor(value: string): boolean {\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value);\n}\n\n/** camelCase → Title Case, the label rule used everywhere a key becomes UI text. */\nexport function formatLabel(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n}\n\n/** Default slider step for a numeric range. */\nexport function inferStep(min: number, max: number): number {\n const range = max - min;\n if (range <= 1) return 0.01;\n if (range <= 10) return 0.1;\n if (range <= 100) return 1;\n return 10;\n}\n\nfunction isActionConfigValue(value: unknown): value is ActionConfig {\n return hasType(value, 'action');\n}\n\nfunction isSelectConfigValue(value: unknown): value is SelectConfig {\n return hasType(value, 'select') && 'options' in (value as object) && Array.isArray((value as SelectConfig).options);\n}\n\nfunction isColorConfigValue(value: unknown): value is ColorConfig {\n return hasType(value, 'color');\n}\n\nfunction isTextConfigValue(value: unknown): value is TextConfig {\n return hasType(value, 'text');\n}\n\nfunction getFirstOptionValue(options: (string | { value: string; label: string })[]): string {\n const first = options[0];\n if (first === undefined) return '';\n return typeof first === 'string' ? first : first.value;\n}\n\nclass DialStoreClass {\n private panels: Map<string, PanelConfig> = new Map();\n private panelsSnapshot: PanelConfig[] = [];\n private standardPanelsSnapshot: PanelConfig[] = [];\n private timelinePanelsSnapshot: PanelConfig[] = [];\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private snapshots: Map<string, Record<string, DialValue>> = new Map();\n private actionListeners: Map<string, Set<ActionListener>> = new Map();\n private presets: Map<string, Preset[]> = new Map();\n private activePreset: Map<string, string | null> = new Map();\n private baseValues: Map<string, Record<string, DialValue>> = new Map();\n private defaultValues: Map<string, Record<string, DialValue>> = new Map();\n private registrationCounts: Map<string, number> = new Map();\n private retainedPanels: Set<string> = new Set();\n private persistConfigs: Map<string, PersistConfig> = new Map();\n\n registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n const existingPanel = this.panels.get(id);\n if (existingPanel && existingPanel.kind !== options.kind) {\n console.warn(\n `[dialkit] Panel id \"${id}\" cannot be shared by a timeline and a standard panel; ` +\n `the most recent registration controls where it renders.`\n );\n }\n this.configurePanelRetention(id, options);\n this.registrationCounts.set(id, (this.registrationCounts.get(id) ?? 0) + 1);\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n\n // Set initial transition modes based on config types\n this.initTransitionModes(config, '', defaultValues);\n\n const persisted = this.loadPersistedPanel(id);\n const previousValues = this.panels.get(id)?.values ?? this.snapshots.get(id) ?? persisted?.values ?? {};\n const values = this.reconcileValues(defaultValues, previousValues, controlsByPath);\n\n const previousBaseValues = this.baseValues.get(id) ?? persisted?.baseValues ?? persisted?.values ?? {};\n const baseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n this.panels.set(id, { id, name, controls, values, shortcuts: shortcuts ?? {}, kind: options.kind });\n this.snapshots.set(id, { ...values });\n this.baseValues.set(id, baseValues);\n this.defaultValues.set(id, { ...defaultValues });\n\n const existingPresets = this.presets.get(id) ?? persisted?.presets;\n if (existingPresets) {\n this.presets.set(id, this.reconcilePresets(existingPresets, defaultValues, controlsByPath));\n }\n if (!this.activePreset.has(id) && persisted?.activePresetId !== undefined) {\n this.activePreset.set(id, persisted.activePresetId);\n }\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options: DialStorePanelOptions = {}): void {\n this.configurePanelRetention(id, options);\n const existing = this.panels.get(id);\n if (!existing) {\n this.registerPanel(id, name, config, shortcuts, options);\n return;\n }\n\n const controls = this.parseConfig(config, '', shortcuts);\n const controlsByPath = this.mapControlsByPath(controls);\n const defaultValues = this.flattenValues(config, '');\n this.initTransitionModes(config, '', defaultValues);\n const nextValues = this.reconcileValues(defaultValues, existing.values, controlsByPath);\n\n const nextPanel: PanelConfig = { id, name, controls, values: nextValues, shortcuts: shortcuts ?? existing.shortcuts, kind: options.kind ?? existing.kind };\n this.panels.set(id, nextPanel);\n this.snapshots.set(id, { ...nextValues });\n\n const previousBaseValues = this.baseValues.get(id) ?? {};\n const nextBaseValues = this.reconcileValues(defaultValues, previousBaseValues, controlsByPath);\n\n for (const [path, value] of Object.entries(nextValues)) {\n if (path.endsWith('.__mode')) {\n nextBaseValues[path] = value;\n }\n }\n\n this.baseValues.set(id, nextBaseValues);\n this.defaultValues.set(id, { ...defaultValues });\n this.presets.set(id, this.reconcilePresets(this.presets.get(id) ?? [], defaultValues, controlsByPath));\n\n this.persistPanel(id);\n this.notify(id);\n this.notifyGlobal();\n }\n\n unregisterPanel(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.panels.delete(id);\n // Keep listener sets: subscribed components can outlive the registration\n // (HMR unregister/re-register of the same id) and must keep receiving\n // notifications. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n if (this.actionListeners.get(id)?.size === 0) this.actionListeners.delete(id);\n\n if (!this.retainedPanels.has(id)) {\n this.snapshots.delete(id);\n this.baseValues.delete(id);\n this.defaultValues.delete(id);\n this.presets.delete(id);\n this.activePreset.delete(id);\n this.persistConfigs.delete(id);\n }\n\n this.notifyGlobal();\n }\n\n updateValue(panelId: string, path: string, value: DialValue): void {\n this.updateValues(panelId, { [path]: value });\n }\n\n updateValues(panelId: string, updates: Record<string, DialValue>): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const validUpdates: Record<string, DialValue> = {};\n\n for (const [path, value] of Object.entries(updates)) {\n if (!Object.prototype.hasOwnProperty.call(panel.values, path)) {\n continue;\n }\n\n const control = this.findControlByPath(panel.controls, path);\n if (control?.type === 'action') {\n continue;\n }\n\n panel.values[path] = value;\n validUpdates[path] = value;\n }\n\n if (Object.keys(validUpdates).length === 0) {\n return;\n }\n\n // Auto-save to active preset or base values\n const activeId = this.activePreset.get(panelId);\n if (activeId) {\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === activeId);\n if (preset) {\n for (const [path, value] of Object.entries(validUpdates)) {\n preset.values[path] = value;\n }\n }\n } else {\n const base = this.baseValues.get(panelId);\n if (base) {\n for (const [path, value] of Object.entries(validUpdates)) {\n base[path] = value;\n }\n }\n }\n\n // Create a new snapshot reference so useSyncExternalStore detects the change\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resetValues(panelId: string): void {\n const panel = this.panels.get(panelId);\n const defaults = this.defaultValues.get(panelId);\n if (!panel || !defaults) return;\n\n panel.values = { ...defaults };\n this.snapshots.set(panelId, { ...panel.values });\n this.baseValues.set(panelId, { ...defaults });\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n updateSpringMode(panelId: string, path: string, mode: 'simple' | 'advanced'): void {\n this.updateTransitionMode(panelId, path, mode);\n }\n\n getSpringMode(panelId: string, path: string): 'simple' | 'advanced' {\n const mode = this.getTransitionMode(panelId, path);\n if (mode === 'easing') return 'simple';\n return mode;\n }\n\n updateTransitionMode(panelId: string, path: string, mode: 'easing' | 'simple' | 'advanced'): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n panel.values[`${path}.__mode`] = mode;\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getTransitionMode(panelId: string, path: string): 'easing' | 'simple' | 'advanced' {\n const panel = this.panels.get(panelId);\n if (!panel) return 'simple';\n return (panel.values[`${path}.__mode`] as 'easing' | 'simple' | 'advanced') || 'simple';\n }\n\n getValue(panelId: string, path: string): DialValue | undefined {\n const panel = this.panels.get(panelId);\n return panel?.values[path];\n }\n\n getValues(panelId: string): Record<string, DialValue> {\n // Return the snapshot for useSyncExternalStore compatibility\n // Use stable EMPTY_VALUES to avoid infinite loop in React 19\n return this.snapshots.get(panelId) ?? EMPTY_VALUES;\n }\n\n getPanels(kind?: 'panel' | 'timeline'): PanelConfig[] {\n // Stable reference between global notifications: getSnapshot-style\n // consumers (React useSyncExternalStore, Solid `from`) compare by\n // identity, and a fresh array on every call makes them loop or re-render.\n if (kind === 'panel') return this.standardPanelsSnapshot;\n if (kind === 'timeline') return this.timelinePanelsSnapshot;\n return this.panelsSnapshot;\n }\n\n getPanel(id: string): PanelConfig | undefined {\n return this.panels.get(id);\n }\n\n subscribe(panelId: string, listener: Listener): () => void {\n if (!this.listeners.has(panelId)) {\n this.listeners.set(panelId, new Set());\n }\n this.listeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.listeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.listeners.delete(panelId);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => this.globalListeners.delete(listener);\n }\n\n subscribeActions(panelId: string, listener: ActionListener): () => void {\n if (!this.actionListeners.has(panelId)) {\n this.actionListeners.set(panelId, new Set());\n }\n this.actionListeners.get(panelId)!.add(listener);\n\n return () => {\n const listeners = this.actionListeners.get(panelId);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.panels.has(panelId)) {\n this.actionListeners.delete(panelId);\n }\n };\n }\n\n triggerAction(panelId: string, path: string): void {\n this.actionListeners.get(panelId)?.forEach(fn => fn(path));\n }\n\n savePreset(panelId: string, name: string): string {\n const panel = this.panels.get(panelId);\n if (!panel) throw new Error(`Panel ${panelId} not found`);\n\n const id = `preset-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const preset: Preset = {\n id,\n name,\n values: { ...panel.values },\n };\n\n const existing = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, [...existing, preset]);\n this.activePreset.set(panelId, id);\n\n // Force re-render by creating new snapshot reference\n this.snapshots.set(panelId, { ...panel.values });\n this.persistPanel(panelId);\n this.notify(panelId);\n\n return id;\n }\n\n loadPreset(panelId: string, presetId: string): void {\n const panel = this.panels.get(panelId);\n if (!panel) return;\n\n const presets = this.presets.get(panelId) ?? [];\n const preset = presets.find(p => p.id === presetId);\n if (!preset) return;\n\n // Apply preset values\n panel.values = { ...preset.values };\n this.snapshots.set(panelId, { ...panel.values });\n this.activePreset.set(panelId, presetId);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n deletePreset(panelId: string, presetId: string): void {\n const presets = this.presets.get(panelId) ?? [];\n this.presets.set(panelId, presets.filter(p => p.id !== presetId));\n\n // Clear active if deleted\n if (this.activePreset.get(panelId) === presetId) {\n this.activePreset.set(panelId, null);\n }\n\n // Force re-render by creating new snapshot reference\n const panel = this.panels.get(panelId);\n if (panel) {\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n getPresets(panelId: string): Preset[] {\n return this.presets.get(panelId) ?? [];\n }\n\n getActivePresetId(panelId: string): string | null {\n return this.activePreset.get(panelId) ?? null;\n }\n\n clearActivePreset(panelId: string): void {\n const panel = this.panels.get(panelId);\n const base = this.baseValues.get(panelId);\n if (panel && base) {\n panel.values = { ...base };\n this.snapshots.set(panelId, { ...panel.values });\n }\n this.activePreset.set(panelId, null);\n this.persistPanel(panelId);\n this.notify(panelId);\n }\n\n resolveShortcutTarget(key: string, modifier?: 'alt' | 'shift' | 'meta'): {\n panelId: string;\n path: string;\n control: ControlMeta;\n } | null {\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue; // skip keyless shortcuts\n if (shortcut.key.toLowerCase() !== key.toLowerCase()) continue;\n const scMod = shortcut.modifier ?? undefined;\n if (scMod !== modifier) continue;\n\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n return { panelId: panel.id, path, control };\n }\n }\n }\n return null;\n }\n\n resolveScrollOnlyTargets(): Array<{\n panelId: string;\n path: string;\n control: ControlMeta;\n shortcut: ShortcutConfig;\n }> {\n const results: Array<{ panelId: string; path: string; control: ControlMeta; shortcut: ShortcutConfig }> = [];\n for (const panel of this.panels.values()) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if ((shortcut.interaction ?? 'scroll') !== 'scroll-only') continue;\n const control = this.findControlByPath(panel.controls, path);\n if (control) {\n results.push({ panelId: panel.id, path, control, shortcut });\n }\n }\n }\n return results;\n }\n\n private configurePanelRetention(id: string, options: DialStorePanelOptions): void {\n if (options.retainOnUnmount) {\n this.retainedPanels.add(id);\n }\n\n const persistConfig = this.normalizePersistConfig(id, options.persist);\n if (persistConfig) {\n this.persistConfigs.set(id, persistConfig);\n this.retainedPanels.add(id);\n }\n }\n\n private reconcileValues(\n defaultValues: Record<string, DialValue>,\n previousValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Record<string, DialValue> {\n const nextValues: Record<string, DialValue> = {};\n\n for (const [path, defaultValue] of Object.entries(defaultValues)) {\n if (path.endsWith('.__mode')) {\n const transitionPath = path.slice(0, -'.__mode'.length);\n const transitionControl = controlsByPath.get(transitionPath);\n nextValues[path] = transitionControl?.type === 'transition' && previousValues[path] !== undefined\n ? previousValues[path]\n : defaultValue;\n continue;\n }\n\n nextValues[path] = this.normalizePreservedValue(\n previousValues[path],\n defaultValue,\n controlsByPath.get(path)\n );\n }\n\n return nextValues;\n }\n\n private reconcilePresets(\n presets: Preset[],\n defaultValues: Record<string, DialValue>,\n controlsByPath: Map<string, ControlMeta>\n ): Preset[] {\n return presets.map((preset) => ({\n ...preset,\n values: this.reconcileValues(defaultValues, preset.values, controlsByPath),\n }));\n }\n\n private normalizePersistConfig(id: string, persist: DialKitPersistOptions | undefined): PersistConfig | null {\n if (!persist) return null;\n const options = typeof persist === 'object' ? persist : {};\n return {\n key: options.key ?? `dialkit:${id}`,\n storage: options.storage ?? 'localStorage',\n presets: options.presets ?? true,\n };\n }\n\n private loadPersistedPanel(id: string): PersistedPanelState | null {\n const config = this.persistConfigs.get(id);\n if (!config) return null;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(config.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as PersistedPanelState;\n if (parsed?.version !== 1 || typeof parsed !== 'object') return null;\n return parsed;\n } catch {\n return null;\n }\n }\n\n private persistPanel(id: string): void {\n const config = this.persistConfigs.get(id);\n if (!config) return;\n\n const storage = this.getStorage(config.storage);\n if (!storage) return;\n\n const values = this.snapshots.get(id) ?? this.panels.get(id)?.values;\n if (!values) return;\n\n const state: PersistedPanelState = {\n version: 1,\n values,\n baseValues: this.baseValues.get(id) ?? values,\n activePresetId: this.activePreset.get(id) ?? null,\n };\n\n if (config.presets) {\n state.presets = this.presets.get(id) ?? [];\n }\n\n try {\n storage.setItem(config.key, JSON.stringify(state));\n } catch {\n // Ignore storage quota/security errors; DialKit should still work in-memory.\n }\n }\n\n private getStorage(kind: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof globalThis === 'undefined' || !('window' in globalThis)) {\n return null;\n }\n\n try {\n return kind === 'sessionStorage'\n ? globalThis.window?.sessionStorage ?? null\n : globalThis.window?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private findControlByPath(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = this.findControlByPath(control.children, path);\n if (found) return found;\n }\n }\n return null;\n }\n\n private notify(panelId: string): void {\n this.listeners.get(panelId)?.forEach(fn => fn());\n }\n\n private notifyGlobal(): void {\n this.panelsSnapshot = Array.from(this.panels.values());\n this.standardPanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind !== 'timeline');\n this.timelinePanelsSnapshot = this.panelsSnapshot.filter((panel) => panel.kind === 'timeline');\n this.globalListeners.forEach(fn => fn());\n }\n\n private initTransitionModes(config: DialConfig, prefix: string, values: Record<string, DialValue>): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (this.isEasingConfig(value)) {\n values[`${path}.__mode`] = 'easing';\n } else if (this.isSpringConfig(value)) {\n // Detect physics mode from config\n const hasPhysics = value.stiffness !== undefined || value.damping !== undefined || value.mass !== undefined;\n const hasTime = value.visualDuration !== undefined || value.bounce !== undefined;\n values[`${path}.__mode`] = hasPhysics && !hasTime ? 'advanced' : 'simple';\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value) && !this.isActionConfig(value) && !this.isSelectConfig(value) && !this.isColorConfig(value) && !this.isTextConfig(value)) {\n this.initTransitionModes(value as DialConfig, path, values);\n }\n }\n }\n\n private parseConfig(config: DialConfig, prefix: string, shortcuts?: Record<string, ShortcutConfig>): ControlMeta[] {\n const controls: ControlMeta[] = [];\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n const label = this.formatLabel(key);\n const shortcut = shortcuts?.[path];\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n // Range tuple: [default, min, max]\n controls.push({\n type: 'slider',\n path,\n label,\n min: value[1],\n max: value[2],\n step: value[3] ?? this.inferStep(value[1], value[2]),\n shortcut,\n });\n } else if (typeof value === 'number') {\n // Single number - auto-infer range\n const { min, max, step } = this.inferRange(value);\n controls.push({ type: 'slider', path, label, min, max, step, shortcut });\n } else if (typeof value === 'boolean') {\n controls.push({ type: 'toggle', path, label, shortcut });\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n controls.push({ type: 'transition', path, label });\n } else if (this.isActionConfig(value)) {\n controls.push({ type: 'action', path, label: (value as ActionConfig).label || label });\n } else if (this.isSelectConfig(value)) {\n controls.push({ type: 'select', path, label, options: value.options });\n } else if (this.isColorConfig(value)) {\n controls.push({ type: 'color', path, label });\n } else if (this.isTextConfig(value)) {\n controls.push({ type: 'text', path, label, placeholder: value.placeholder });\n } else if (typeof value === 'string') {\n // Auto-detect: hex color vs text\n if (this.isHexColor(value)) {\n controls.push({ type: 'color', path, label });\n } else {\n controls.push({ type: 'text', path, label });\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object becomes a folder\n const folderConfig = value as DialConfig;\n const defaultOpen = '_collapsed' in folderConfig ? !(folderConfig._collapsed as boolean) : true;\n controls.push({\n type: 'folder',\n path,\n label,\n defaultOpen,\n children: this.parseConfig(folderConfig, path, shortcuts),\n });\n }\n }\n\n return controls;\n }\n\n private flattenValues(config: DialConfig, prefix: string): Record<string, DialValue> {\n const values: Record<string, DialValue> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (key === '_collapsed') continue;\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (Array.isArray(value) && value.length <= 4 && typeof value[0] === 'number') {\n values[path] = value[0]; // Default value\n } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n values[path] = value;\n } else if (this.isSpringConfig(value) || this.isEasingConfig(value)) {\n values[path] = value;\n } else if (this.isActionConfig(value)) {\n // Actions don't need stored values - they're just triggers\n values[path] = value;\n } else if (this.isSelectConfig(value)) {\n // Use default or first option's value\n const firstOption = value.options[0];\n const firstValue = typeof firstOption === 'string' ? firstOption : firstOption.value;\n values[path] = value.default ?? firstValue;\n } else if (this.isColorConfig(value)) {\n values[path] = value.default ?? '#000000';\n } else if (this.isTextConfig(value)) {\n values[path] = value.default ?? '';\n } else if (typeof value === 'object' && value !== null) {\n Object.assign(values, this.flattenValues(value as DialConfig, path));\n }\n }\n\n return values;\n }\n\n private isSpringConfig(value: unknown): value is SpringConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SpringConfig).type === 'spring'\n );\n }\n\n private isEasingConfig(value: unknown): value is EasingConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as EasingConfig).type === 'easing'\n );\n }\n\n private isActionConfig(value: unknown): value is ActionConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ActionConfig).type === 'action'\n );\n }\n\n private isSelectConfig(value: unknown): value is SelectConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as SelectConfig).type === 'select' &&\n 'options' in value &&\n Array.isArray((value as SelectConfig).options)\n );\n }\n\n private isColorConfig(value: unknown): value is ColorConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as ColorConfig).type === 'color'\n );\n }\n\n private isTextConfig(value: unknown): value is TextConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as TextConfig).type === 'text'\n );\n }\n\n private isHexColor(value: string): boolean {\n return isHexColor(value);\n }\n\n private formatLabel(key: string): string {\n return formatLabel(key);\n }\n\n private inferRange(value: number): { min: number; max: number; step: number } {\n // Infer reasonable range based on value\n if (value >= 0 && value <= 1) {\n return { min: 0, max: 1, step: 0.01 };\n } else if (value >= 0 && value <= 10) {\n return { min: 0, max: value * 3 || 10, step: 0.1 };\n } else if (value >= 0 && value <= 100) {\n return { min: 0, max: value * 3 || 100, step: 1 };\n } else if (value >= 0) {\n return { min: 0, max: value * 3 || 1000, step: 10 };\n } else {\n return { min: value * 3, max: -value * 3, step: 1 };\n }\n }\n\n private inferStep(min: number, max: number): number {\n return inferStep(min, max);\n }\n\n private normalizePreservedValue(\n existingValue: DialValue | undefined,\n defaultValue: DialValue,\n control: ControlMeta | undefined\n ): DialValue {\n if (existingValue === undefined || !control) {\n return defaultValue;\n }\n\n switch (control.type) {\n case 'slider': {\n if (typeof existingValue !== 'number' || typeof defaultValue !== 'number') {\n return defaultValue;\n }\n\n const min = control.min ?? Number.NEGATIVE_INFINITY;\n const max = control.max ?? Number.POSITIVE_INFINITY;\n const clamped = Math.min(max, Math.max(min, existingValue));\n\n if (typeof control.step !== 'number' || control.step <= 0) {\n return clamped;\n }\n\n return this.roundToStep(clamped, min, max, control.step);\n }\n case 'toggle':\n return typeof existingValue === 'boolean' ? existingValue : defaultValue;\n case 'select': {\n if (typeof existingValue !== 'string') {\n return defaultValue;\n }\n\n const options = control.options ?? [];\n const validValues = new Set(options.map((option) => (typeof option === 'string' ? option : option.value)));\n return validValues.has(existingValue) ? existingValue : defaultValue;\n }\n case 'color':\n case 'text':\n return typeof existingValue === 'string' ? existingValue : defaultValue;\n case 'transition':\n if (this.isSpringConfig(defaultValue)) {\n return this.isSpringConfig(existingValue) ? existingValue : defaultValue;\n }\n if (this.isEasingConfig(defaultValue)) {\n return this.isEasingConfig(existingValue) ? existingValue : defaultValue;\n }\n return defaultValue;\n case 'action':\n return defaultValue;\n default:\n return defaultValue;\n }\n }\n\n private roundToStep(value: number, min: number, max: number, step: number): number {\n const snapped = min + Math.round((value - min) / step) * step;\n const clamped = Math.min(max, Math.max(min, snapped));\n const precision = this.stepPrecision(step);\n return Number(clamped.toFixed(precision));\n }\n\n private stepPrecision(step: number): number {\n const text = String(step);\n const decimalIndex = text.indexOf('.');\n return decimalIndex === -1 ? 0 : text.length - decimalIndex - 1;\n }\n\n private mapControlsByPath(controls: ControlMeta[]): Map<string, ControlMeta> {\n const map = new Map<string, ControlMeta>();\n\n const visit = (nodes: ControlMeta[]) => {\n for (const node of nodes) {\n if (node.type === 'folder' && node.children) {\n visit(node.children);\n continue;\n }\n\n map.set(node.path, node);\n }\n };\n\n visit(controls);\n return map;\n }\n\n}\n\n// Singleton instance\nexport const DialStore = /* @__PURE__ */ new DialStoreClass();\n","import { createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { DialStore } from '../store/DialStore';\nimport { TimelineStore } from '../store/TimelineStore';\nimport {\n buildTimelineMeta,\n buildTimelineValues,\n computeStaticTimeline,\n parseTimelineConfig,\n resolveTimelineLoop,\n type DialTimelineOptions,\n type DialTimelineValues,\n type TimelineConfig,\n} from '../timeline';\n\nexport type CreateDialTimelineOptions = DialTimelineOptions;\n\nexport function createDialTimeline<T extends TimelineConfig>(\n name: string,\n config: T,\n options?: CreateDialTimelineOptions\n): Accessor<DialTimelineValues<T>> {\n const instanceId = createUniqueId();\n const hasStableId = options?.id !== undefined;\n const panelId = options?.id ?? `${name}-${instanceId}`;\n const parsed = createMemo(() => parseTimelineConfig(config));\n const [flatValues, setFlatValues] = createSignal(DialStore.getValues(panelId));\n const [transport, setTransport] = createSignal(TimelineStore.getTransport(panelId));\n const staticTimeline = createMemo(() => computeStaticTimeline(parsed(), flatValues()));\n const loopStart = () => resolveTimelineLoop(options?.loop).start;\n let mounted = false;\n\n const play = () => TimelineStore.play(panelId);\n const pause = () => TimelineStore.pause(panelId);\n const replay = () => TimelineStore.replay(panelId);\n const seek = (time: number) => TimelineStore.seek(panelId, time);\n\n if (!isServer) {\n const unsubscribeValues = DialStore.subscribe(panelId, () => {\n setFlatValues(DialStore.getValues(panelId));\n });\n const unsubscribeTransport = TimelineStore.subscribe(panelId, () => {\n setTransport(TimelineStore.getTransport(panelId));\n });\n onCleanup(() => {\n unsubscribeValues();\n unsubscribeTransport();\n });\n }\n\n onMount(() => {\n DialStore.registerPanel(panelId, name, parsed().dialConfig, undefined, {\n retainOnUnmount: hasStableId,\n persist: options?.persist,\n kind: 'timeline',\n });\n setFlatValues(DialStore.getValues(panelId));\n\n const currentStatic = staticTimeline();\n TimelineStore.register(\n buildTimelineMeta(panelId, name, currentStatic.duration, parsed(), options?.loop),\n { autoplay: options?.autoplay ?? true }\n );\n setTransport(TimelineStore.getTransport(panelId));\n mounted = true;\n\n onCleanup(() => {\n mounted = false;\n TimelineStore.unregister(panelId);\n DialStore.unregisterPanel(panelId);\n });\n });\n\n createEffect(() => {\n const currentParsed = parsed();\n const currentStatic = staticTimeline();\n if (!mounted) return;\n TimelineStore.update(\n buildTimelineMeta(panelId, name, currentStatic.duration, currentParsed, options?.loop)\n );\n });\n\n return createMemo(() => {\n const currentStatic = staticTimeline();\n return buildTimelineValues<T>(\n currentStatic.clips,\n transport(),\n currentStatic.duration,\n loopStart(),\n { play, pause, replay, seek }\n );\n });\n}\n","// Playback transport + registry for DialKit timelines.\n// Clip values (at/duration/from/to) live in DialStore under the timeline's\n// panel id — this store only owns time: the clock, play state, and the\n// track/clip structure the dock UI renders.\n\nexport type TimelineClipTrackMeta = {\n prop: string;\n /** Step folder keys when the track is a sequence. */\n stepKeys?: string[];\n};\n\nexport type TimelineClipMeta = {\n key: string; // config path; also the DialStore path prefix, e.g. \"cardEnter\" or \"circle.path\"\n label: string;\n color: string;\n /** Code-defined playback behavior; intentionally not exposed as a dial. */\n loop: 'off' | 'repeat';\n /** Group key when the clip lives inside a nested layer, e.g. \"circle\". */\n group?: string;\n /** Step folder keys for sequence clips, e.g. [\"step1\", \"step2\"]. */\n stepKeys?: string[];\n /** Independent property tracks of a props clip — full rows when expanded. */\n tracks?: TimelineClipTrackMeta[];\n};\n\nexport type TimelineMeta = {\n id: string; // same id as the DialStore panel\n name: string;\n duration: number; // seconds\n loop: boolean;\n /** Loop wraps back to this time, not 0 — clips before it play once\n * (intro-then-idle). 0 loops the whole timeline. */\n loopStart: number;\n clips: TimelineClipMeta[]; // one row each\n};\n\nexport type TimelineTransport = {\n time: number;\n playing: boolean;\n duration: number;\n /** Completed loop passes — keeps looping clips phase-continuous across\n * timeline wraps. Reset by seek/replay so scrubbing stays deterministic. */\n wraps: number;\n};\n\ntype Listener = () => void;\n\n/** Length of the repeating span — the whole timeline unless a loop region\n * narrows it. Degenerate regions (start ≥ duration) fall back to the whole\n * timeline so a bad `from` never stalls the clock. */\nexport function loopSpan(duration: number, loopStart: number): number {\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n if (!Number.isFinite(loopStart)) loopStart = 0;\n const start = Math.min(Math.max(0, loopStart), duration);\n return duration - start > 0 ? duration - start : duration;\n}\n\n/** Folds an over-run playhead back into the loop region, reporting how many\n * spans were crossed so continuous time (wraps × span + time) never jumps. */\nexport function foldLoopTime(\n time: number,\n duration: number,\n loopStart = 0\n): { time: number; wraps: number } {\n if (!Number.isFinite(time) || !Number.isFinite(duration) || duration <= 0) {\n return { time: 0, wraps: 0 };\n }\n if (time < duration) return { time, wraps: 0 };\n const span = loopSpan(duration, loopStart);\n const base = duration - span;\n const over = time - base;\n return { time: base + (over % span), wraps: Math.floor(over / span) };\n}\n\nexport const TIMELINE_CLIP_COLORS = [\n '#E8E8E8', // neutral white — slightly off-white so the pure-white selection ring still reads\n];\n\nconst EMPTY_TRANSPORT: TimelineTransport = Object.freeze({ time: 0, playing: false, duration: 0, wraps: 0 });\n\nclass TimelineStoreClass {\n private timelines: Map<string, TimelineMeta> = new Map();\n private transports: Map<string, TimelineTransport> = new Map();\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private registrationCounts: Map<string, number> = new Map();\n private listCache: TimelineMeta[] | null = null;\n private rafId: number | null = null;\n private lastTick = 0;\n\n register(meta: TimelineMeta, options: { autoplay: boolean }): void {\n const existing = this.timelines.get(meta.id);\n if (existing && existing.name !== meta.name) {\n console.warn(\n `[dialkit] Timeline id \"${meta.id}\" is already registered by \"${existing.name}\"; ` +\n `\"${meta.name}\" will share and overwrite that transport.`\n );\n }\n this.registrationCounts.set(meta.id, (this.registrationCounts.get(meta.id) ?? 0) + 1);\n this.applyMeta(meta, options.autoplay);\n }\n\n update(meta: TimelineMeta): void {\n if (!this.timelines.has(meta.id)) return;\n this.applyMeta(meta, false);\n }\n\n unregister(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.timelines.delete(id);\n this.transports.delete(id);\n // Keep listener sets: subscribers (e.g. a mounted dock) may outlive the\n // registration — HMR tears down and re-registers the same id, and their\n // subscriptions must survive it. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n this.listCache = null;\n this.notifyGlobal();\n }\n\n play(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0 || transport.playing) return;\n // Play from the top when the playhead is parked at the end\n const restart = transport.time >= transport.duration;\n this.transports.set(id, {\n ...transport,\n time: restart ? 0 : transport.time,\n wraps: restart ? 0 : transport.wraps,\n playing: true,\n });\n this.notify(id);\n this.ensureLoop();\n }\n\n pause(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || !transport.playing) return;\n this.transports.set(id, { ...transport, playing: false });\n this.notify(id);\n }\n\n replay(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0) return;\n this.transports.set(id, { ...transport, time: 0, wraps: 0, playing: true });\n this.notify(id);\n this.ensureLoop();\n }\n\n seek(id: string, time: number): void {\n const transport = this.transports.get(id);\n if (!transport || !Number.isFinite(time)) return;\n const clamped = Math.min(transport.duration, Math.max(0, time));\n // Scrubbing pins the deterministic first-pass state\n this.transports.set(id, { ...transport, time: clamped, wraps: 0 });\n this.notify(id);\n }\n\n getTransport(id: string): TimelineTransport {\n return this.transports.get(id) ?? EMPTY_TRANSPORT;\n }\n\n getTimeline(id: string): TimelineMeta | undefined {\n return this.timelines.get(id);\n }\n\n getTimelines(): TimelineMeta[] {\n if (!this.listCache) {\n this.listCache = Array.from(this.timelines.values());\n }\n return this.listCache;\n }\n\n subscribe(id: string, listener: Listener): () => void {\n if (!this.listeners.has(id)) {\n this.listeners.set(id, new Set());\n }\n this.listeners.get(id)!.add(listener);\n return () => {\n const listeners = this.listeners.get(id);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.timelines.has(id)) {\n this.listeners.delete(id);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private applyMeta(meta: TimelineMeta, autoplay: boolean): void {\n const duration = Number.isFinite(meta.duration) ? Math.max(0, meta.duration) : 0;\n const loopStart = Number.isFinite(meta.loopStart)\n ? Math.min(duration, Math.max(0, meta.loopStart))\n : 0;\n const safeMeta = { ...meta, duration, loopStart };\n this.timelines.set(meta.id, safeMeta);\n\n const existing = this.transports.get(meta.id);\n if (existing) {\n // Structure changed or remounted — keep the playhead, clamp to the new length\n this.transports.set(meta.id, {\n time: Math.min(existing.time, duration),\n playing: duration > 0 && existing.playing,\n duration,\n wraps: existing.wraps,\n });\n } else {\n const playing = duration > 0 && autoplay;\n this.transports.set(meta.id, { time: 0, playing, duration, wraps: 0 });\n if (playing) this.ensureLoop();\n }\n\n this.listCache = null;\n this.notify(meta.id);\n this.notifyGlobal();\n }\n\n private ensureLoop(): void {\n if (this.rafId !== null || typeof window === 'undefined') return;\n this.lastTick = performance.now();\n this.rafId = window.requestAnimationFrame(this.tick);\n }\n\n private tick = (now: number): void => {\n // Advance by wall time. A backgrounded tab lands at the state it would\n // have reached, rather than silently slowing the animation on return.\n const dt = Math.max(0, (now - this.lastTick) / 1000);\n this.lastTick = now;\n\n let anyPlaying = false;\n for (const [id, transport] of this.transports) {\n if (!transport.playing) continue;\n\n const meta = this.timelines.get(id);\n const duration = meta?.duration ?? transport.duration;\n if (!Number.isFinite(duration) || duration <= 0) {\n this.transports.set(id, { time: 0, playing: false, duration: 0, wraps: 0 });\n this.notify(id);\n continue;\n }\n let time = transport.time + dt;\n let playing = true;\n let wraps = transport.wraps;\n\n if (time >= duration) {\n if (meta?.loop) {\n const folded = foldLoopTime(time, duration, meta.loopStart);\n time = folded.time;\n wraps += folded.wraps;\n } else {\n time = duration;\n playing = false;\n }\n }\n\n this.transports.set(id, { time, playing, duration, wraps });\n if (playing) anyPlaying = true;\n this.notify(id);\n }\n\n this.rafId = anyPlaying ? window.requestAnimationFrame(this.tick) : null;\n };\n\n private notify(id: string): void {\n this.listeners.get(id)?.forEach((fn) => fn());\n }\n\n private notifyGlobal(): void {\n this.globalListeners.forEach((fn) => fn());\n }\n}\n\n// PURE lets bundlers drop the timeline entirely for panel-only users.\nexport const TimelineStore = /* @__PURE__ */ new TimelineStoreClass();\n","// Deterministic sampling of transition curves, used for timeline scrubbing.\n// Springs use the closed-form damped-harmonic-oscillator solution with\n// Motion's own visualDuration/bounce → stiffness/damping mapping, so a\n// scrubbed position matches what Motion plays.\n\nimport { isEasingConfigValue, isSpringConfigValue } from './store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from './store/DialStore';\n\nexport type SpringParams = { stiffness: number; damping: number; mass: number };\n\nexport function round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function isTransitionConfig(value: unknown): value is TransitionConfig {\n return isSpringConfigValue(value) || isEasingConfigValue(value);\n}\n\nexport function isPhysicsSpring(transition: TransitionConfig): boolean {\n return (\n transition.type === 'spring' &&\n (transition.stiffness !== undefined || transition.damping !== undefined || transition.mass !== undefined)\n );\n}\n\nexport function springParams(spring: SpringConfig): SpringParams {\n if (isPhysicsSpring(spring)) {\n return { stiffness: spring.stiffness ?? 200, damping: spring.damping ?? 25, mass: spring.mass ?? 1 };\n }\n // Motion's mapping (motion-dom spring generator)\n const visualDuration = Math.max(0.05, spring.visualDuration ?? 0.3);\n const bounce = spring.bounce ?? 0.3;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 * Math.min(1, Math.max(0.05, 1 - bounce)) * Math.sqrt(stiffness);\n return { stiffness, damping, mass: 1 };\n}\n\n/** Normalized spring position 0 → 1 (may overshoot), starting at rest. */\nexport function springProgress(t: number, { stiffness, damping, mass }: SpringParams): number {\n if (t <= 0) return 0;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n if (zeta < 0.9999) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta < 1.0001) {\n return 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n }\n const wd = w0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * w0 + wd;\n const r2 = -zeta * w0 - wd;\n return 1 + (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r1 - r2);\n}\n\n/** Estimated time for a spring to visually settle (within 0.5% of target). */\nexport function springSettleDuration(params: SpringParams): number {\n const w0 = Math.sqrt(params.stiffness / params.mass);\n const zeta = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const decay =\n zeta >= 1\n ? zeta * w0 - w0 * Math.sqrt(Math.max(0, zeta * zeta - 1)) // slowest exponent\n : zeta * w0;\n const duration = Math.log(200) / Math.max(decay, 1e-6);\n return round2(clamp(duration, 0.05, 10));\n}\n\n/** Eased progress of a cubic-bezier easing at linear progress p (0–1). */\nexport function cubicBezierProgress(p: number, [x1, y1, x2, y2]: [number, number, number, number]): number {\n if (p <= 0) return 0;\n if (p >= 1) return 1;\n // Solve the bezier's parameter t for x = p (Newton-Raphson, bisection fallback)\n const sampleX = (t: number) => bezierAxis(t, x1, x2);\n const sampleY = (t: number) => bezierAxis(t, y1, y2);\n\n let t = p;\n for (let i = 0; i < 8; i++) {\n const x = sampleX(t) - p;\n if (Math.abs(x) < 1e-5) return sampleY(t);\n const dx = bezierAxisDerivative(t, x1, x2);\n if (Math.abs(dx) < 1e-6) break;\n t -= x / dx;\n }\n\n let lo = 0;\n let hi = 1;\n t = p;\n while (hi - lo > 1e-5) {\n if (sampleX(t) < p) lo = t;\n else hi = t;\n t = (lo + hi) / 2;\n }\n return sampleY(t);\n}\n\nfunction bezierAxis(t: number, a1: number, a2: number): number {\n return ((1 - 3 * a2 + 3 * a1) * t * t * t) + ((3 * a2 - 6 * a1) * t * t) + (3 * a1 * t);\n}\n\nfunction bezierAxisDerivative(t: number, a1: number, a2: number): number {\n return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1;\n}\n\nexport type ResolvedClipTransition = {\n /** Motion-ready transition with its duration driven by the clip length. */\n transition: TransitionConfig;\n /** Effective clip duration — the bar length. Derived for physics springs. */\n duration: number;\n /** Physics springs have emergent duration; the bar is derived, not resizable. */\n isPhysics: boolean;\n};\n\n// The bar IS the duration: time-mode springs get visualDuration from the\n// clip length, easings get duration from it, and physics springs derive\n// the clip length from their settle time.\nexport function resolveClipTransition(\n raw: TransitionConfig,\n clipDuration: number\n): ResolvedClipTransition {\n const safeDuration = Math.max(0.05, clipDuration);\n\n if (raw.type === 'easing') {\n return {\n transition: { ...raw, duration: safeDuration } as EasingConfig,\n duration: safeDuration,\n isPhysics: false,\n };\n }\n if (isPhysicsSpring(raw)) {\n return {\n transition: raw,\n duration: springSettleDuration(springParams(raw)),\n isPhysics: true,\n };\n }\n return {\n transition: { type: 'spring', bounce: raw.bounce ?? 0.2, visualDuration: safeDuration },\n duration: safeDuration,\n isPhysics: false,\n };\n}\n\n/**\n * Eased progress of a clip's transition at `elapsed` seconds after its start.\n * Springs keep evolving past the bar (bounce tail) and converge to 1;\n * easings clamp at 1. May overshoot 1 for bouncy curves.\n */\nexport function transitionProgress(\n elapsed: number,\n duration: number,\n transition: TransitionConfig | undefined\n): number {\n if (elapsed <= 0) return 0;\n if (!transition) {\n return duration > 0 ? Math.min(1, elapsed / duration) : 1;\n }\n if (transition.type === 'easing') {\n return cubicBezierProgress(Math.min(1, duration > 0 ? elapsed / duration : 1), transition.ease);\n }\n const params = springParams(transition);\n // Snap to done once settled so late samples are exactly 1\n if (elapsed >= springSettleDuration(params)) return 1;\n return springProgress(elapsed, params);\n}\n","// Framework-agnostic timeline logic: config parsing, value interpolation,\n// and per-frame clip-state derivation. The React hook (and future Solid/\n// Svelte/Vue adapters) stay thin wrappers over this module.\n//\n// The computation is split in two so the 60Hz clock stays cheap:\n// computeStaticClips — everything derivable from stored values alone\n// (runs only when a value is edited)\n// computeClipState — the time-dependent fields for one clip\n// (runs per frame, sampling cached curve params)\n//\n// Internally every animating clip is a sequence of steps: a from/to clip is\n// one implicit step, a `steps` clip is several chained ones, and a `props`\n// clip holds one step-list per property track (each with its own cycle and\n// phase offset). Untouched properties hold their prior value through a step.\n\nimport { formatLabel, inferStep, isHexColor, resolveDialValues } from './store/DialStore';\nimport type { DialConfig, DialValue, ResolvedValues, TransitionConfig } from './store/DialStore';\nimport {\n clamp,\n cubicBezierProgress,\n isPhysicsSpring,\n isTransitionConfig,\n resolveClipTransition,\n round2,\n springParams,\n springProgress,\n springSettleDuration,\n} from './transition-math';\nimport type { SpringParams } from './transition-math';\nimport { TIMELINE_CLIP_COLORS } from './store/TimelineStore';\nimport type { TimelineClipMeta, TimelineClipTrackMeta } from './store/TimelineStore';\n\n// ── Public config types ──\n\n// A clip is a named span on the timeline — one row each: when it starts, how\n// long it runs, and (optionally) the values it animates between plus the\n// curve it animates with. `from`/`to` accept any normal DialKit leaf values\n// (numbers, colors, etc.). Everything is editable by clicking the clip in\n// the dock. Clips with from/to get a default spring transition when none is\n// specified.\n//\n// A looping clip repeats its cycle from `at` until the timeline ends: the\n// bar is one cycle, so dragging it longer slows the loop. A loop that should\n// return to where it started (a bob, a pulse) is written as a sequence whose\n// last step lands back on the starting values — there is no mirror mode.\nexport type TimelineClipLoop = 'off' | 'repeat';\n\n// One leg of a sequence. Only the properties named in `to` animate; every\n// other property holds its value from the previous leg (or `from`).\n// The index allows `undefined` because TypeScript synthesizes `prop?:\n// undefined` union arms for legs that touch different property sets.\nexport type TimelineStepValues = {\n [key: string]: DialConfig[string] | undefined;\n};\n\nexport type TimelineStepConfig = {\n duration?: number;\n to?: TimelineStepValues;\n transition?: TransitionConfig;\n};\n\n// Independent per-property tracks. When one object's properties animate\n// with different timing, each property is a full track: its own values,\n// duration, curve, and a `delay` offset from the clip's `at` (a phase shift\n// for looping clips). The clip row becomes a read-only composite of its\n// tracks; editing happens on the tracks. Properties that share timing\n// belong in a plain from/to/steps clip instead.\nexport type TimelinePropStepConfig = {\n duration?: number;\n to?: number | string;\n transition?: TransitionConfig;\n};\n\nexport type TimelinePropConfig = {\n from?: number | string;\n to?: number | string;\n duration?: number;\n /** Offset from the clip's `at` in seconds. */\n delay?: number;\n transition?: TransitionConfig;\n steps?: TimelinePropStepConfig[];\n};\n\ntype TimelineClipBase = {\n at: number;\n duration?: number;\n transition?: TransitionConfig;\n loop?: boolean | TimelineClipLoop;\n};\n\n// The three clip shapes are mutually exclusive, encoded with optional-never\n// fields so TypeScript rejects ambiguous combinations (`steps` + `to`,\n// `props` + `from`, …) at the call site. Parse warns for untyped consumers.\nexport type TimelineClipConfig = TimelineClipBase &\n (\n | {\n from?: DialConfig;\n to?: DialConfig;\n steps?: never;\n props?: never;\n }\n | {\n from?: DialConfig;\n to?: never;\n /** Sequential legs on one row — a segmented bar; boundaries retime legs. */\n steps: TimelineStepConfig[];\n props?: never;\n }\n | {\n from?: never;\n to?: never;\n steps?: never;\n /** Independent per-property tracks — mutually exclusive with from/to/steps. */\n props: { [prop: string]: TimelinePropConfig };\n }\n );\n\n/** Nested keys group clips into a collapsible layer — purely presentational. */\nexport type TimelineGroupConfig = {\n [key: string]: TimelineClipConfig;\n};\n\nexport type TimelineConfig = {\n /** Total timeline length in seconds. Inferred from the last clip when omitted. */\n duration?: number;\n} & {\n [key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;\n};\n\n/** CSS-friendly output for consumers not using Motion — spread into a style. */\nexport type TimelineClipCss = {\n transitionDuration: string;\n transitionTimingFunction: string;\n};\n\nexport type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {\n at: number;\n duration: number;\n /** Effective code-defined loop mode. */\n loop: TimelineClipLoop;\n /** Playhead is at or past the clip start. */\n started: boolean;\n /** Playhead is inside the clip — for looping clips, inside any cycle. */\n active: boolean;\n /** Playhead is past the clip end (for looping clips, past the timeline end). */\n done: boolean;\n /**\n * 0–1 position of the playhead within the clip — cycle progress (a\n * sawtooth) for looping clips, sequence progress for steps clips.\n */\n progress: number;\n /** Index of the leg under the playhead, for sequence clips. */\n step: C['steps'] extends TimelineStepConfig[] ? number : undefined;\n from: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : undefined;\n to: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? ResolvedValues<C['to']>\n : undefined;\n /** `to` once the clip has started, `from` before — hand it to Motion's animate.\n * For sequences this is the final merged state; for props clips, per-track\n * endpoint records. */\n animate: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string> | undefined\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : ResolvedValues<C['to']> | undefined\n : undefined;\n /** The clip's editable curve — single-curve clips only. */\n transition: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TransitionConfig\n : undefined;\n /** Duration + timing-function for native CSS transitions — single-curve clips only. */\n css: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TimelineClipCss\n : undefined;\n /**\n * Values interpolated through the clip's curves at the current playhead —\n * bind to style for true scrubbing: the element is exactly at this point\n * in time whether playing, paused, or scrubbing. Sequence clips report the\n * merged state of all legs (declare every animated property in `from`);\n * props clips report every track's value.\n */\n current: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : undefined\n : undefined;\n};\n\nexport type TimelineGroupValues<G extends TimelineGroupConfig> = {\n [K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<G[K], TimelineClipConfig>\n >;\n};\n\nexport type DialTimelineValues<T extends TimelineConfig> = {\n time: number;\n playing: boolean;\n duration: number;\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<T[K], TimelineClipConfig>\n >;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig\n ? never\n : T[K] extends TimelineGroupConfig\n ? K\n : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;\n};\n\nexport const CLIP_VALUE_STEP = 0.01;\nexport const TIMELINE_MIN_CLIP_DURATION = 0.05;\nconst DEFAULT_STEP_DURATION = 0.3;\nconst DEFAULT_CLIP_TRANSITION: TransitionConfig = { type: 'spring', bounce: 0.2 };\nconst RESERVED_KEYS = new Set(['time', 'playing', 'duration', 'play', 'pause', 'replay', 'seek']);\n\n// ── Config parsing ──\n\nexport type ParsedTimeline = {\n duration: number;\n dialConfig: DialConfig;\n clips: TimelineClipMeta[];\n};\n\nfunction isClipConfig(value: unknown): value is TimelineClipConfig {\n return isPlainObject(value) && Number.isFinite((value as TimelineClipConfig).at);\n}\n\n// A group is a plain object (no `at`) with at least one clip entry — nested\n// one level. Non-clip children are skipped individually (with a warning)\n// rather than invalidating the whole group.\nfunction isGroupConfig(value: unknown): value is TimelineGroupConfig {\n if (!isPlainObject(value) || 'at' in value) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.some(isClipConfig);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, value)\n : fallback;\n}\n\nfunction animatedDuration(value: unknown, fallback = DEFAULT_STEP_DURATION): number {\n return Math.max(TIMELINE_MIN_CLIP_DURATION, nonNegativeFinite(value, fallback));\n}\n\nfunction transitionDefaultDuration(transition: TransitionConfig): number {\n if (transition.type === 'easing') return animatedDuration(transition.duration);\n // Motion gives physics parameters precedence over time parameters when a\n // mixed config reaches it, so duration inference must make the same choice.\n if (isPhysicsSpring(transition)) {\n return animatedDuration(springSettleDuration(springParams(transition)));\n }\n if (transition.visualDuration !== undefined) return animatedDuration(transition.visualDuration);\n return animatedDuration(springSettleDuration(springParams(transition)));\n}\n\n// Bar length defaults: physics always owns its emergent duration. Time-based\n// curves use an explicit bar duration first, then their own duration, then the\n// standard step duration. `inheritedTransition` matters for physics because a\n// step/track can inherit an advanced spring from its parent.\nfunction defaultStepDuration(\n step: { duration?: number; transition?: TransitionConfig },\n inheritedTransition?: TransitionConfig\n): number {\n const curve = step.transition ?? inheritedTransition;\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (step.duration !== undefined) return animatedDuration(step.duration);\n if (step.transition) return transitionDefaultDuration(step.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultTrackDuration(\n track: TimelinePropConfig,\n inheritedTransition?: TransitionConfig\n): number {\n const curve = track.transition ?? inheritedTransition;\n if (track.steps?.length) {\n return track.steps.reduce((sum, step) => sum + defaultStepDuration(step, curve), 0);\n }\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (track.duration !== undefined) return animatedDuration(track.duration);\n if (track.transition) return transitionDefaultDuration(track.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultClipDuration(clip: TimelineClipConfig): number {\n const defaultCurve = isTransitionConfig(clip.transition)\n ? clip.transition\n : DEFAULT_CLIP_TRANSITION;\n if (clip.props) {\n return Object.values(clip.props).reduce(\n (max, track) => Math.max(\n max,\n nonNegativeFinite(track.delay) + defaultTrackDuration(track, defaultCurve)\n ),\n 0\n );\n }\n if (clip.steps?.length) {\n return clip.steps.reduce((sum, step) => sum + defaultStepDuration(step, defaultCurve), 0);\n }\n\n const animating = Boolean(clip.transition || clip.from || clip.to);\n // Marker windows are allowed to be zero-length; actual animations are not.\n if (!animating) return nonNegativeFinite(clip.duration);\n if (isPhysicsSpring(defaultCurve)) return transitionDefaultDuration(defaultCurve);\n if (clip.duration !== undefined) return animatedDuration(clip.duration);\n if (isTransitionConfig(clip.transition)) return transitionDefaultDuration(clip.transition);\n // A from/to clip with neither duration nor transition animates with the\n // default spring, so its bar defaults to that spring's settle time instead\n // of collapsing to the minimum bar length. Markers stay zero-length.\n return clip.from || clip.to ? transitionDefaultDuration(DEFAULT_CLIP_TRANSITION) : 0;\n}\n\nexport function normalizeLoopMode(value: unknown): TimelineClipLoop {\n // `mirror` no longer exists — sequences whose last step returns home\n // replaced it. Legacy values fold into `repeat`.\n if (value === true || value === 'mirror' || value === 'repeat') return 'repeat';\n return 'off';\n}\n\n// The bar owns the duration, so stored transitions carry only their shape:\n// bounce for time springs, physics params as-is, and easings keep their\n// (structural) duration field pinned to the clip length.\nfunction normalizeStoredTransition(transition: TransitionConfig, clipDuration: number): TransitionConfig {\n if (transition.type === 'easing') {\n return { ...transition, duration: clipDuration };\n }\n if (isPhysicsSpring(transition)) {\n return transition;\n }\n return { type: 'spring', bounce: transition.bounce ?? 0.2 };\n}\n\ntype ClipParseEntry = {\n path: string;\n childKey: string;\n group?: string;\n clip: TimelineClipConfig;\n};\n\nfunction collectClipEntries(config: TimelineConfig): ClipParseEntry[] {\n const entries: ClipParseEntry[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (key === 'duration') continue;\n if (RESERVED_KEYS.has(key)) {\n console.warn(`[dialkit] Timeline key \"${key}\" collides with a reserved key and was skipped.`);\n continue;\n }\n if (isClipConfig(value)) {\n entries.push({ path: key, childKey: key, clip: value });\n } else if (isGroupConfig(value)) {\n for (const [childKey, childClip] of Object.entries(value)) {\n if (isClipConfig(childClip)) {\n entries.push({ path: `${key}.${childKey}`, childKey, group: key, clip: childClip });\n } else {\n console.warn(\n `[dialkit] Timeline clip \"${key}.${childKey}\" is missing a numeric \"at\" and was skipped.`\n );\n }\n }\n } else {\n console.warn(\n `[dialkit] Timeline entry \"${key}\" is neither a clip (needs a numeric \"at\") nor a group of clips and was skipped.`\n );\n }\n }\n return entries;\n}\n\n/** Strips explicit-undefined leaves so step targets are safe to merge/range. */\nfunction definedValues(values: TimelineStepValues | undefined): DialConfig | undefined {\n if (!values) return undefined;\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\n\nfunction setDialPath(dialConfig: DialConfig, path: string, value: DialConfig): void {\n const segments = path.split('.');\n let node = dialConfig;\n for (const segment of segments.slice(0, -1)) {\n node = (node[segment] ??= {}) as DialConfig;\n }\n node[segments[segments.length - 1]] = value;\n}\n\nexport function parseTimelineConfig(config: TimelineConfig): ParsedTimeline {\n const entries = collectClipEntries(config);\n\n let maxEnd = 0;\n for (const { clip } of entries) {\n maxEnd = Math.max(maxEnd, nonNegativeFinite(clip.at) + defaultClipDuration(clip));\n }\n\n // Exact fit: the window ends when the content does, so a looping timeline\n // plays one full pass and wraps with no dead tail. Ceil (never round) to\n // 2dp — undershooting the content end would clip loops and drift their\n // phase every wrap. Set `duration` in config for slack to drag clips later.\n const duration =\n typeof config.duration === 'number' && Number.isFinite(config.duration) && config.duration > 0\n ? config.duration\n : maxEnd > 0\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : 1;\n\n const dialConfig: DialConfig = {};\n const clips: TimelineClipMeta[] = [];\n\n entries.forEach(({ path, childKey, group, clip }, index) => {\n // These combinations are untypeable (optional-never fields) but reachable\n // from plain JS — warn and pick a deterministic winner.\n const raw = clip as TimelineClipBase & {\n from?: DialConfig;\n to?: DialConfig;\n steps?: TimelineStepConfig[];\n props?: Record<string, TimelinePropConfig>;\n };\n if (raw.props && (raw.steps?.length || raw.from || raw.to)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"props\" is mutually exclusive with from/to/steps — using \"props\".`\n );\n } else if (raw.steps?.length && raw.to) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"to\" is ignored when \"steps\" is present — each leg's \"to\" defines its targets.`\n );\n }\n\n const hasSteps = Boolean(clip.steps?.length) && !clip.props;\n const hasProps = Boolean(clip.props);\n const single = isTransitionConfig(clip.transition) ? clip.transition : undefined;\n const total = defaultClipDuration(clip);\n const defaultCurve = single ?? DEFAULT_CLIP_TRANSITION;\n const clipAt = nonNegativeFinite(clip.at);\n\n const clipDial: DialConfig = {\n at: [clipAt, 0, duration, CLIP_VALUE_STEP],\n };\n // Sequence and props clips derive their length from their parts — no\n // duration dial.\n if (!hasSteps && !hasProps) {\n clipDial.duration = [total, 0, duration, CLIP_VALUE_STEP];\n }\n\n // Every animating single-curve clip gets an editable curve; the bar\n // drives its duration.\n if (!hasSteps && !hasProps && (clip.transition || clip.from || clip.to)) {\n clipDial.transition = normalizeStoredTransition(defaultCurve, total);\n }\n\n // Independent property tracks: each is a full mini-clip folder — delay\n // (bar position), from/to or steps, and its own curve. The parent row\n // is a read-only composite.\n let tracks: TimelineClipTrackMeta[] | undefined;\n if (clip.props) {\n tracks = [];\n for (const [prop, track] of Object.entries(clip.props)) {\n if (TRACK_RESERVED.has(prop) || /^step\\d+$/.test(prop)) {\n console.warn(`[dialkit] Timeline property \"${prop}\" collides with a clip field and was skipped.`);\n continue;\n }\n const trackDuration = defaultTrackDuration(track, defaultCurve);\n const trackCurve = track.transition ?? defaultCurve;\n const hasTrackSteps = Boolean(track.steps?.length);\n const trackDial: DialConfig = {\n delay: [nonNegativeFinite(track.delay), 0, duration, CLIP_VALUE_STEP],\n };\n if (!hasTrackSteps) {\n trackDial.duration = [trackDuration, 0, duration, CLIP_VALUE_STEP];\n trackDial.transition = normalizeStoredTransition(trackCurve, trackDuration);\n }\n const fromValue = track.from ?? (hasTrackSteps ? undefined : track.to);\n if (hasTrackSteps && fromValue === undefined) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": track \"${prop}\" has steps but no \"from\" — declare its starting value.`\n );\n }\n if (fromValue !== undefined) {\n trackDial.from = scalarDial(prop, fromValue, hasTrackSteps ? track.steps![0]?.to : track.to);\n }\n if (!hasTrackSteps && track.to !== undefined) {\n trackDial.to = scalarDial(prop, track.to, fromValue);\n }\n let trackStepKeys: string[] | undefined;\n if (hasTrackSteps) {\n trackStepKeys = [];\n let previous = fromValue;\n track.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n trackStepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, trackCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? trackCurve, stepDuration),\n };\n if (step.to !== undefined) {\n stepDial.to = scalarDial(prop, step.to, previous);\n previous = step.to;\n }\n trackDial[stepKey] = stepDial;\n });\n }\n clipDial[prop] = trackDial;\n tracks.push({ prop, stepKeys: trackStepKeys });\n }\n }\n\n if (clip.from && !hasProps) {\n clipDial.from = withFromToRanges(\n clip.from,\n hasSteps ? definedValues(clip.steps![0]?.to) : clip.to\n );\n }\n if (!hasSteps && !hasProps && clip.to) {\n clipDial.to = withFromToRanges(clip.to, clip.from);\n }\n\n // One folder per leg: duration (the segment), target values, curve.\n // Untouched properties hold — the running state feeds slider ranges.\n let stepKeys: string[] | undefined;\n if (hasSteps) {\n stepKeys = [];\n let running: DialConfig | undefined = clip.from;\n clip.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n stepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, defaultCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? defaultCurve, stepDuration),\n };\n const stepTo = definedValues(step.to);\n if (stepTo) {\n // The hold rule needs a starting value: a property first animated\n // mid-sequence has nothing to interpolate from and jumps instead.\n for (const prop of Object.keys(stepTo)) {\n if (!running || !(prop in running)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": property \"${prop}\" first animates in step ${stepIndex + 1} with no starting value — declare it in \"from\".`\n );\n }\n }\n stepDial.to = withFromToRanges(stepTo, running);\n }\n clipDial[stepKey] = stepDial;\n running = { ...(running ?? {}), ...(stepTo ?? {}) };\n });\n }\n\n setDialPath(dialConfig, path, clipDial);\n\n clips.push({\n key: path,\n label: formatLabel(childKey),\n color: TIMELINE_CLIP_COLORS[index % TIMELINE_CLIP_COLORS.length],\n loop: normalizeLoopMode(clip.loop),\n group,\n stepKeys,\n tracks,\n });\n });\n\n return { duration, dialConfig, clips };\n}\n\nconst TRACK_RESERVED = new Set(['at', 'duration', 'loop', 'from', 'to', 'transition', 'delay']);\n\n// A scalar track value as a dial — wraps it in a single-key record so\n// tracks and clips share exactly one range-inference policy.\nfunction scalarDial(prop: string, value: number | string, counterpart: number | string | undefined): DialConfig[string] {\n const record = withFromToRanges(\n { [prop]: value } as DialConfig,\n counterpart === undefined ? undefined : ({ [prop]: counterpart } as DialConfig)\n );\n return record[prop];\n}\n\n// ── from/to slider ranges ──\n\n// Bare numbers in from/to get property-aware slider ranges (the generic\n// DialKit inference is value-based, which turns `y: 0` into a 0–1 slider).\n// Ranges expand to include the actual from/to endpoints when they fall outside.\nconst FROM_TO_RANGE_PRESETS: [RegExp, { min: number; max: number; step: number }][] = [\n [/^(x|y|z|tx|ty|offsetx|offsety|translatex|translatey)$/i, { min: -100, max: 100, step: 1 }],\n [/rotat|angle|skew/i, { min: -180, max: 180, step: 1 }],\n [/^scale/i, { min: 0, max: 2, step: 0.01 }],\n [/opacity|alpha/i, { min: 0, max: 1, step: 0.01 }],\n [/blur|radius|spread/i, { min: 0, max: 100, step: 1 }],\n];\n\nfunction inferFromToRange(key: string, value: number, counterpart: number | undefined): [number, number, number, number] {\n const lo = Math.min(value, counterpart ?? value);\n const hi = Math.max(value, counterpart ?? value);\n\n const preset = FROM_TO_RANGE_PRESETS.find(([pattern]) => pattern.test(key))?.[1];\n if (preset) {\n return [value, Math.min(preset.min, lo), Math.max(preset.max, hi), preset.step];\n }\n\n // Generic fallback: unit-ish values get 0–1, everything else a range\n // spanning both endpoints with room to overshoot.\n if (lo >= 0 && hi <= 1) {\n return [value, 0, 1, 0.01];\n }\n const extent = Math.max(Math.abs(lo), Math.abs(hi), 1);\n const min = lo < 0 ? -extent * 2 : 0;\n const max = Math.max(extent * 2, hi);\n return [value, min, max, inferStep(min, max)];\n}\n\n// Rewrites bare-number leaves in a from/to config as explicit range tuples,\n// using the matching key in the counterpart config to size the range.\nfunction withFromToRanges(config: DialConfig, counterpart: DialConfig | undefined): DialConfig {\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(config)) {\n const other = counterpart?.[key];\n if (typeof value === 'number') {\n result[key] = inferFromToRange(key, value, typeof other === 'number' ? other : undefined);\n } else if (isPlainObject(value) && !('type' in value)) {\n result[key] = withFromToRanges(\n value as DialConfig,\n isPlainObject(other) && !('type' in other) ? (other as DialConfig) : undefined\n );\n } else {\n result[key] = value as DialConfig[string];\n }\n }\n return result;\n}\n\n// ── Static clip data (edit-time) ──\n\n// A curve ready to sample: cached spring params or bezier points, plus the\n// duration easings normalize against.\ntype CurveStatic = {\n duration: number;\n spring?: SpringParams;\n settle?: number;\n ease?: [number, number, number, number];\n};\n\nfunction curveStatic(transition: TransitionConfig | undefined, duration: number): CurveStatic {\n if (!transition) return { duration };\n if (transition.type === 'easing') return { duration, ease: transition.ease };\n const spring = springParams(transition);\n return { duration, spring, settle: springSettleDuration(spring) };\n}\n\nfunction sampleCurve(curve: CurveStatic, elapsed: number): number {\n if (elapsed <= 0) return 0;\n if (curve.spring) {\n // Snap to done once settled so late samples are exactly 1\n if (curve.settle !== undefined && elapsed >= curve.settle) return 1;\n return springProgress(elapsed, curve.spring);\n }\n if (curve.ease) {\n return cubicBezierProgress(clamp(curve.duration > 0 ? elapsed / curve.duration : 1, 0, 1), curve.ease);\n }\n return curve.duration > 0 ? Math.min(1, elapsed / curve.duration) : 1;\n}\n\nexport type TimelineStepStatic = {\n key: string | null; // null for the implicit single step of a from/to clip\n offset: number; // seconds from clip/track start\n duration: number; // effective — physics-resolved\n isPhysics: boolean;\n /** Full property state at step start — the hold rule made concrete. */\n start: Record<string, unknown>;\n /** Targets this step animates; untouched properties hold `start`. */\n to: Record<string, unknown>;\n curve: CurveStatic;\n};\n\n/**\n * One track: a step chain with its own cycle length and phase offset from\n * the clip's `at`. This is the unified runtime model — a shared-timing clip\n * is exactly one track (prop unset, delay 0) whose steps carry the full\n * property record; a props clip is one single-property track per entry.\n */\nexport type TimelineTrackStatic = {\n /** Set for a props clip's single-property tracks; unset for the shared track. */\n prop?: string;\n delay: number;\n duration: number;\n steps: TimelineStepStatic[];\n};\n\nexport type TimelineClipStatic = {\n key: string;\n childKey: string;\n group?: string;\n at: number;\n /** Effective total duration — the bar length (one cycle for looping clips;\n * the widest track extent for props clips). */\n duration: number;\n loop: TimelineClipLoop;\n /** Where the clip stops affecting values: at + duration, or the timeline end when looping. */\n end: number;\n isPhysics: boolean;\n /** Motion-ready transition, its duration injected from the bar — single-curve clips only. */\n transition?: TransitionConfig;\n css?: TimelineClipCss;\n from?: Record<string, unknown>;\n /** Final merged state (the last leg's landing values for sequences). */\n to?: Record<string, unknown>;\n /** Every animating clip is tracks; empty for markers. */\n tracks: TimelineTrackStatic[];\n explicitSteps: boolean;\n /** Union of every property the clip touches. */\n props?: string[];\n};\n\nfunction resolvedAtPath(resolved: Record<string, unknown>, path: string): Record<string, unknown> {\n let node: unknown = resolved;\n for (const segment of path.split('.')) {\n node = isPlainObject(node) ? node[segment] : undefined;\n }\n return isPlainObject(node) ? node : {};\n}\n\nexport function computeStaticClips(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineClipStatic[] {\n const resolved = resolveDialValues(parsed.dialConfig, flatValues) as Record<string, unknown>;\n return parsed.clips.map((clip) =>\n buildClipStatic(resolvedAtPath(resolved, clip.key), clip, parsed.duration)\n );\n}\n\nexport type TimelineStaticState = {\n duration: number;\n clips: TimelineClipStatic[];\n};\n\n/**\n * Resolves the editable clip model and grows the timeline when a live value\n * creates content beyond its authored window. This is most important for\n * physics springs: changing stiffness/damping changes their emergent length.\n * The parsed duration remains the minimum, so shortening a clip never removes\n * the original editing room.\n */\nexport function computeStaticTimeline(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineStaticState {\n let clips = computeStaticClips(parsed, flatValues);\n const maxEnd = clips.reduce(\n (end, clip) => Math.max(end, clip.at + clip.duration),\n parsed.duration\n );\n const duration = maxEnd > parsed.duration\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : parsed.duration;\n\n if (duration !== parsed.duration) {\n clips = clips.map((clip) =>\n clip.loop === 'repeat' ? { ...clip, end: duration } : clip\n );\n }\n\n return { duration, clips };\n}\n\n/** The dock's resolver: the same static model the hook animates with,\n * rebuilt from flat stored values — bars, popovers, and playback can never\n * disagree about geometry. */\nexport function computeClipStaticFromValues(\n values: Record<string, DialValue>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n return buildClipStatic(unflattenClipValues(values, clip.key), clip, timelineDuration);\n}\n\nfunction buildClipStatic(\n clipResolved: Record<string, unknown>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n {\n const at = typeof clipResolved.at === 'number' ? clipResolved.at : 0;\n const from = isPlainObject(clipResolved.from) ? clipResolved.from : undefined;\n const single = isTransitionConfig(clipResolved.transition) ? clipResolved.transition : undefined;\n\n const staticClip: TimelineClipStatic = {\n key: clip.key,\n childKey: clip.group ? clip.key.slice(clip.group.length + 1) : clip.key,\n group: clip.group,\n at,\n duration: 0,\n loop: 'off',\n end: 0,\n isPhysics: false,\n from,\n tracks: [],\n explicitSteps: Boolean(clip.stepKeys?.length),\n };\n\n if (clip.tracks?.length) {\n // Independent property tracks: each chains its own scalar steps and\n // carries its own cycle length and phase offset.\n const tracks: (TimelineTrackStatic & { prop: string })[] = clip.tracks.map(({ prop, stepKeys }) => {\n const trackResolved = isPlainObject(clipResolved[prop])\n ? (clipResolved[prop] as Record<string, unknown>)\n : {};\n const delay = typeof trackResolved.delay === 'number' ? trackResolved.delay : 0;\n const fromValue = trackResolved.from;\n let steps: TimelineStepStatic[];\n let trackDuration = 0;\n\n if (stepKeys?.length) {\n let running = fromValue;\n steps = stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(trackResolved[stepKey])\n ? (trackResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = stepResolved.to;\n const step: TimelineStepStatic = {\n key: stepKey,\n offset: trackDuration,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running === undefined ? {} : { [prop]: running },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n };\n if (toValue !== undefined) running = toValue;\n trackDuration += effective.duration;\n return step;\n });\n } else {\n const storedDuration =\n typeof trackResolved.duration === 'number' ? trackResolved.duration : 0;\n const raw = isTransitionConfig(trackResolved.transition) ? trackResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = trackResolved.to;\n trackDuration = effective.duration;\n steps = [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: fromValue === undefined ? {} : { [prop]: fromValue },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n },\n ];\n }\n\n return { prop, delay, duration: trackDuration, steps };\n });\n\n staticClip.tracks = tracks;\n staticClip.props = tracks.map((track) => track.prop);\n staticClip.duration = tracks.reduce((max, track) => Math.max(max, track.delay + track.duration), 0);\n staticClip.from = Object.fromEntries(\n tracks.map((track) => [track.prop, track.steps[0].start[track.prop]])\n );\n staticClip.to = Object.fromEntries(\n tracks.map((track) => {\n const last = track.steps[track.steps.length - 1];\n return [track.prop, last.to[track.prop] ?? last.start[track.prop]];\n })\n );\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n return staticClip;\n }\n\n if (clip.stepKeys?.length) {\n // Sequence: chain the legs, threading the running state through so\n // untouched properties hold their prior value.\n let running: Record<string, unknown> = { ...(from ?? {}) };\n let offset = 0;\n const steps: TimelineStepStatic[] = clip.stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(clipResolved[stepKey])\n ? (clipResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const to = isPlainObject(stepResolved.to) ? stepResolved.to : {};\n const step: TimelineStepStatic = {\n key: stepKey,\n offset,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n };\n running = { ...running, ...to };\n offset += effective.duration;\n return step;\n });\n\n staticClip.tracks = [{ delay: 0, duration: offset, steps }];\n staticClip.duration = offset;\n staticClip.to = running;\n } else {\n const storedDuration = typeof clipResolved.duration === 'number' ? clipResolved.duration : 0;\n const to = isPlainObject(clipResolved.to) ? clipResolved.to : undefined;\n\n if (single) {\n const effective = resolveClipTransition(single, storedDuration);\n staticClip.duration = effective.duration;\n staticClip.isPhysics = effective.isPhysics;\n staticClip.transition = effective.transition;\n staticClip.css = transitionToCss(effective.transition);\n staticClip.to = to;\n if (from && to) {\n staticClip.tracks = [\n {\n delay: 0,\n duration: effective.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: from,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n },\n ],\n },\n ];\n }\n } else {\n // Curveless clip (markers, or defensive fallback): the bar is the\n // stored duration; from/to animate with the default spring.\n staticClip.duration = storedDuration;\n staticClip.to = to;\n if (from && to) {\n const base = resolveClipTransition(DEFAULT_CLIP_TRANSITION, storedDuration);\n staticClip.duration = base.duration;\n staticClip.tracks = [\n {\n delay: 0,\n duration: base.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: base.duration,\n isPhysics: false,\n start: from,\n to,\n curve: curveStatic(base.transition, base.duration),\n },\n ],\n },\n ];\n }\n }\n }\n\n if (staticClip.tracks.length) {\n const props = new Set<string>(Object.keys(from ?? {}));\n for (const track of staticClip.tracks) {\n for (const step of track.steps) {\n for (const prop of Object.keys(step.to)) props.add(prop);\n }\n }\n staticClip.props = Array.from(props);\n }\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n\n return staticClip;\n }\n}\n\n// ── Per-frame clip state ──\n\nfunction stepAtPosition(steps: TimelineStepStatic[], pos: number): TimelineStepStatic {\n for (const step of steps) {\n if (pos < step.offset + step.duration) return step;\n }\n return steps[steps.length - 1];\n}\n\n/** One property's value at a cycle position — the hold rule in one place,\n * shared by the frame pass and the waveform sampler. */\nfunction evalPropAtPos(steps: TimelineStepStatic[], prop: string, pos: number): unknown {\n const step = stepAtPosition(steps, pos);\n const within = Math.max(0, pos - step.offset);\n if (prop in step.to) {\n const eased = sampleCurve(step.curve, within);\n return interpolateResolved(step.start[prop], step.to[prop], eased);\n }\n return step.start[prop];\n}\n\n/**\n * `time` is the playhead (what the dock shows); `cycleTime` is continuous\n * time across timeline wraps (wraps × duration + time). Looping clips fold\n * against `cycleTime`, so a looping timeline never snaps their phase — the\n * window is a viewport onto animations that repeat forever. Scrubbing seeks\n * with cycleTime === time, which is the deterministic first-pass state.\n */\nexport function computeClipState(\n clip: TimelineClipStatic,\n time: number,\n cycleTime = time\n): Record<string, unknown> {\n const total = clip.duration;\n const looping = clip.loop === 'repeat' && total > 0;\n // Once the timeline has wrapped, a looping clip is already running even\n // before its `at` — it has been repeating since the previous pass.\n const started = time >= clip.at || (looping && cycleTime > time);\n const done = time >= clip.end;\n const elapsed = time - clip.at;\n const phaseElapsed = looping ? cycleTime - clip.at : elapsed;\n\n const fold = (e: number): number => (looping ? e % total : e);\n\n const basePos = started ? fold(Math.max(0, phaseElapsed)) : 0;\n const progress = total > 0 ? clamp(basePos / total, 0, 1) : started ? 1 : 0;\n\n let current: Record<string, unknown> | undefined;\n let stepIndex = 0;\n\n if (clip.tracks.length && clip.props?.length) {\n // One loop for every clip kind: each track folds against its own cycle,\n // offset by its delay. The delay applies once, then cycles fold — with\n // equal periods that is a permanent phase shift (Motion's semantics). A\n // shared-timing clip is a single track whose steps carry every property.\n current = {};\n for (const track of clip.tracks) {\n const props = track.prop !== undefined ? [track.prop] : clip.props;\n for (const prop of props) {\n const startValue = track.steps[0]?.start[prop];\n if (!started) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const phase = phaseElapsed - track.delay;\n if (phase <= 0) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const pos = looping && track.duration > 0 ? phase % track.duration : phase;\n const value = evalPropAtPos(track.steps, prop, pos);\n if (value !== undefined) current[prop] = value;\n }\n }\n const shared = clip.tracks[0];\n if (started && clip.explicitSteps && shared.prop === undefined) {\n stepIndex = shared.steps.indexOf(stepAtPosition(shared.steps, basePos));\n }\n }\n\n return {\n at: clip.at,\n duration: clip.duration,\n loop: clip.loop,\n started,\n active: started && !done,\n done,\n progress,\n step: clip.explicitSteps ? stepIndex : undefined,\n from: clip.from,\n to: clip.to,\n animate: started ? clip.to : clip.from,\n transition: clip.transition,\n css: clip.css,\n current,\n };\n}\n\n// ── Value interpolation ──\n\n// Mixes two resolved from/to value trees at eased progress p.\n// Numbers lerp (and can overshoot), hex colors mix in clamped RGB,\n// anything else switches at the midpoint.\nexport function interpolateResolved(from: unknown, to: unknown, p: number): unknown {\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * p;\n }\n if (typeof from === 'string' && typeof to === 'string') {\n const mixed = mixHexColors(from, to, p);\n if (mixed) return mixed;\n }\n if (isPlainObject(from) && isPlainObject(to)) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(from)) {\n result[key] = key in to ? interpolateResolved(from[key], to[key], p) : from[key];\n }\n for (const key of Object.keys(to)) {\n if (!(key in from)) result[key] = to[key];\n }\n return result;\n }\n return p < 0.5 ? from : to;\n}\n\nfunction parseHex(hex: string): [number, number, number, number] | null {\n if (!isHexColor(hex)) return null;\n let h = hex.slice(1);\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255,\n ];\n}\n\nfunction mixHexColors(a: string, b: string, p: number): string | null {\n const ca = parseHex(a);\n const cb = parseHex(b);\n if (!ca || !cb) return null;\n const t = clamp(p, 0, 1);\n const mixed = ca.map((v, i) => Math.round(v + (cb[i] - v) * t));\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n const rgb = `#${hex(mixed[0])}${hex(mixed[1])}${hex(mixed[2])}`;\n return mixed[3] === 255 ? rgb : `${rgb}${hex(mixed[3])}`;\n}\n\n// ── CSS output ──\n\n// Approximates the clip's transition as CSS transition properties so\n// non-Motion consumers can use native CSS. Easing configs map exactly;\n// springs are approximated with an overshoot bezier scaled by bounce.\nexport function transitionToCss(transition: TransitionConfig | undefined): TimelineClipCss | undefined {\n if (!transition) return undefined;\n\n if (transition.type === 'easing') {\n return {\n transitionDuration: `${round2(transition.duration)}s`,\n transitionTimingFunction: `cubic-bezier(${transition.ease.map((v) => round2(v)).join(', ')})`,\n };\n }\n\n const params = springParams(transition);\n const dampingRatio = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const duration = transition.visualDuration ?? springSettleDuration(params);\n const bounce = transition.bounce ?? Math.max(0, round2(1 - dampingRatio));\n\n return {\n transitionDuration: `${round2(duration)}s`,\n transitionTimingFunction:\n bounce > 0.05\n ? `cubic-bezier(0.34, ${round2(1.2 + bounce)}, 0.64, 1)`\n : 'cubic-bezier(0.25, 0.6, 0.35, 1)',\n };\n}\n\n// ── Dock helpers ──\n\n/** Popover display values: swap stored shape-only transitions for their\n * effective configs (duration injected from the bar/segment) so the curve\n * editor shows the transition as it actually runs. */\nexport function timelinePopoverDisplayValues(\n values: Record<string, DialValue>,\n clipKey: string,\n stepKeys?: string[],\n stepKey?: string\n): Record<string, DialValue> {\n const display = { ...values };\n const swap = (path: string, duration: number) => {\n const raw = display[path];\n if (isTransitionConfig(raw)) display[path] = resolveClipTransition(raw, duration).transition;\n };\n\n if (stepKey) {\n swap(`${clipKey}.${stepKey}.transition`, numberValue(values[`${clipKey}.${stepKey}.duration`]));\n return display;\n }\n\n const cycle = stepKeys?.length\n ? stepKeys.reduce((sum, sk) => sum + numberValue(values[`${clipKey}.${sk}.duration`]), 0)\n : numberValue(values[`${clipKey}.duration`]);\n\n swap(`${clipKey}.transition`, cycle);\n return display;\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : 0;\n}\n\n// ── Property lanes ──\n\n/** Rebuilds the nested resolved shape for one clip from flat stored values —\n * the dock's inverse of the panel's path flattening. */\nfunction unflattenClipValues(\n values: Record<string, DialValue>,\n clipKey: string\n): Record<string, unknown> {\n const prefix = `${clipKey}.`;\n const result: Record<string, unknown> = {};\n const entries = Object.entries(values)\n .filter(([path]) => path.startsWith(prefix))\n .map(([path, value]) => ({ segments: path.slice(prefix.length).split('.'), value }))\n .sort((a, b) => a.segments.length - b.segments.length);\n\n for (const { segments, value } of entries) {\n let node = result;\n for (let i = 0; i < segments.length - 1; i++) {\n const existing = node[segments[i]];\n node = (isPlainObject(existing) ? existing : (node[segments[i]] = {})) as Record<string, unknown>;\n }\n node[segments[segments.length - 1]] = cloneTimelineValue(value);\n }\n return result;\n}\n\nfunction cloneTimelineValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneTimelineValue);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, cloneTimelineValue(nested)])\n );\n}\n\n/** Dragging a track bar edits the property's phase offset. */\nexport function clampTrackDelay(\n delay: number,\n at: number,\n trackDuration: number,\n timelineDuration: number\n): number {\n return clamp(round2(delay), 0, Math.max(0, round2(timelineDuration - at - trackDuration)));\n}\n\n// Clip-edit clamp policy — one place, shared by every gesture/consumer.\nexport function clampClipMove(at: number, duration: number, timelineDuration: number): number {\n return clamp(round2(at), 0, Math.max(0, timelineDuration - duration));\n}\n\nexport function clampClipResizeEnd(duration: number, at: number, timelineDuration: number): number {\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, timelineDuration - at);\n}\n\nexport function clampClipResizeStart(\n newAt: number,\n at: number,\n duration: number\n): { at: number; duration: number } {\n const clampedAt = clamp(round2(newAt), 0, at + duration - TIMELINE_MIN_CLIP_DURATION);\n return { at: clampedAt, duration: round2(at + duration - clampedAt) };\n}\n\n/** Resizing one leg of a sequence: the other legs keep their length, the\n * whole bar must still fit the timeline. */\nexport function clampStepResize(\n duration: number,\n at: number,\n otherStepsTotal: number,\n timelineDuration: number\n): number {\n const max = Math.max(TIMELINE_MIN_CLIP_DURATION, timelineDuration - at - otherStepsTotal);\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, max);\n}\n\n/** Copy-for-agent export: strip editor-only state, normalize shape-only\n * transitions, resolve physics durations, and drop zero-value defaults. */\nexport function normalizeTimelineValuesForCopy(\n values: Record<string, DialValue>,\n clips: TimelineClipMeta[]\n): Record<string, DialValue> {\n const normalized: Record<string, DialValue> = { ...values };\n\n // Transition mode is editor UI state, not part of a DialKit config. It is\n // stored beside values so mode switches survive presets, but must never be\n // included in the tune → copy → remove payload.\n for (const path of Object.keys(normalized)) {\n if (path.endsWith('.__mode')) delete normalized[path];\n }\n\n const normalizeTransitionAt = (transitionPath: string, durationPath: string) => {\n const raw = normalized[transitionPath];\n if (!isTransitionConfig(raw)) return;\n if (isPhysicsSpring(raw)) {\n // A mode switch can leave the previous time-based bar duration stored.\n // Export the spring's actual derived length so the copied config exactly\n // matches the timeline the author just tuned.\n normalized[durationPath] = transitionDefaultDuration(raw);\n }\n normalized[transitionPath] = normalizeStoredTransition(\n raw,\n numberValue(normalized[durationPath])\n );\n };\n\n for (const clip of clips) {\n for (const stepKey of clip.stepKeys ?? []) {\n normalizeTransitionAt(\n `${clip.key}.${stepKey}.transition`,\n `${clip.key}.${stepKey}.duration`\n );\n }\n\n normalizeTransitionAt(`${clip.key}.transition`, `${clip.key}.duration`);\n\n // Property tracks: normalize each track's transitions against its own\n // durations, drop zero delays (the config default).\n for (const track of clip.tracks ?? []) {\n const trackKey = `${clip.key}.${track.prop}`;\n for (const stepKey of track.stepKeys ?? []) {\n normalizeTransitionAt(\n `${trackKey}.${stepKey}.transition`,\n `${trackKey}.${stepKey}.duration`\n );\n }\n normalizeTransitionAt(`${trackKey}.transition`, `${trackKey}.duration`);\n if (normalized[`${trackKey}.delay`] === 0) {\n delete normalized[`${trackKey}.delay`];\n }\n }\n\n delete normalized[`${clip.key}.loop`];\n }\n return normalized;\n}\n\n// ── Formatting ──\n\nexport function formatClock(time: number, tenths = false): string {\n const safe = Math.max(0, time);\n const minutes = Math.floor(safe / 60);\n const seconds = safe - minutes * 60;\n const secondsText = tenths\n ? seconds.toFixed(1).padStart(4, '0')\n : String(Math.floor(seconds)).padStart(2, '0');\n return `${String(minutes).padStart(2, '0')}:${secondsText}`;\n}\n\nexport function formatSeconds(value: number): string {\n return `${round2(value)}s`;\n}\n\nexport function formatStepLabel(stepKey: string): string {\n const match = /^step(\\d+)$/.exec(stepKey);\n return match ? `Step ${match[1]}` : formatLabel(stepKey);\n}\n","import type { DialKitPersistOptions } from '../store/DialStore';\nimport type { TimelineMeta, TimelineTransport } from '../store/TimelineStore';\nimport { loopSpan } from '../store/TimelineStore';\nimport {\n computeClipState,\n type DialTimelineValues,\n type ParsedTimeline,\n type TimelineClipStatic,\n type TimelineConfig,\n} from '../timeline-core';\n\nexport interface DialTimelineOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n /** Start playing on mount. Defaults to true. */\n autoplay?: boolean;\n /**\n * Loop when the playhead reaches the end. `true` restarts the whole\n * timeline; `{ from }` wraps back to that time instead, so clips before it\n * play once and looping clips keep cycling forever. Defaults to false.\n */\n loop?: boolean | { from: number };\n}\n\nexport type TimelineActions = {\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n};\n\n/** One resolution of the public loop option, shared by every adapter. */\nexport function resolveTimelineLoop(\n loop: DialTimelineOptions['loop']\n): { enabled: boolean; start: number } {\n if (typeof loop === 'object' && loop !== null) {\n return {\n enabled: true,\n start: Number.isFinite(loop.from) ? Math.max(0, loop.from) : 0,\n };\n }\n return { enabled: Boolean(loop), start: 0 };\n}\n\nexport function buildTimelineMeta(\n id: string,\n name: string,\n duration: number,\n parsed: ParsedTimeline,\n loop: DialTimelineOptions['loop']\n): TimelineMeta {\n const resolvedLoop = resolveTimelineLoop(loop);\n return {\n id,\n name,\n duration,\n loop: resolvedLoop.enabled,\n loopStart: resolvedLoop.start,\n clips: parsed.clips,\n };\n}\n\n/**\n * Framework-neutral frame pass. Adapters only own lifecycle and reactivity;\n * the value shape and loop-cycle math stay identical everywhere.\n */\nexport function buildTimelineValues<T extends TimelineConfig>(\n staticClips: TimelineClipStatic[],\n transport: TimelineTransport,\n timelineDuration: number,\n loopStart: number,\n actions: TimelineActions\n): DialTimelineValues<T> {\n const result: Record<string, unknown> = {\n time: transport.time,\n playing: transport.playing,\n duration: timelineDuration,\n ...actions,\n };\n\n const span = loopSpan(transport.duration, loopStart);\n const cycleTime = (span > 0 ? transport.wraps * span : 0) + transport.time;\n for (const clip of staticClips) {\n const state = computeClipState(clip, transport.time, cycleTime);\n if (clip.group) {\n const bucket = (result[clip.group] ??= {}) as Record<string, unknown>;\n bucket[clip.childKey] = state;\n } else {\n result[clip.key] = state;\n }\n }\n\n return result as DialTimelineValues<T>;\n}\n","type Listener = () => void;\n\ntype VisibilityController = {\n visible?: boolean;\n defaultVisible: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n};\n\n/**\n * UI-only state shared by the toolkit root and the timeline portal.\n * Playback deliberately lives elsewhere: hiding the editor must never pause\n * or otherwise change the animation it is inspecting.\n */\nclass TimelineUiStoreClass {\n private visible = true;\n private initialized = false;\n private controllers = new Map<symbol, VisibilityController>();\n private listeners = new Set<Listener>();\n\n getVisible(): boolean {\n for (const controller of this.controllers.values()) {\n if (controller.visible !== undefined) return controller.visible;\n }\n return this.visible;\n }\n\n registerController(id: symbol, controller: VisibilityController): () => void {\n const previous = this.getVisible();\n if (!this.initialized) {\n this.visible = controller.defaultVisible;\n this.initialized = true;\n }\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n\n return () => {\n const before = this.getVisible();\n this.controllers.delete(id);\n if (this.controllers.size === 0) this.initialized = false;\n if (before !== this.getVisible()) this.notify();\n };\n }\n\n updateController(id: symbol, controller: VisibilityController): void {\n if (!this.controllers.has(id)) return;\n const previous = this.getVisible();\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n }\n\n requestVisible(visible: boolean): void {\n const current = this.getVisible();\n if (current === visible) return;\n\n const controlled = Array.from(this.controllers.values()).filter(\n (controller) => controller.visible !== undefined\n );\n if (controlled.length > 0) {\n controlled.forEach((controller) => controller.onVisibilityChange?.(visible));\n return;\n }\n\n this.visible = visible;\n this.controllers.forEach((controller) => controller.onVisibilityChange?.(visible));\n this.notify();\n }\n\n toggle(): void {\n this.requestVisible(!this.getVisible());\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport const TimelineUiStore = /* @__PURE__ */ new TimelineUiStoreClass();\n","import type { DialValue } from './store/DialStore';\n\n// The copy-for-agent export shared by the panel toolbar and the timeline dock.\nexport function buildCopyInstruction(\n hookName: string,\n panelName: string,\n values: Record<string, DialValue>\n): string {\n const jsonStr = JSON.stringify(values, null, 2);\n\n if (hookName === 'useDialTimeline' || hookName === 'createDialTimeline') {\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call. Keep the existing \\`clip.current\\` bindings while this timeline is being authored; do not convert the animation or remove DialKit yet.\n\nAdd this comment immediately above the ${hookName} call as a production handoff note:\n\n\\`\\`\\`tsx\n// TODO(production): DialKit's clip.current values are the scrubbable authoring preview.\n// Replace them with equivalent real Motion animations using the tuned timeline\n// timings and transitions, then remove ${hookName} and <DialTimeline />.\n\\`\\`\\``;\n }\n\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call.`;\n}\n","// Shared environment detection for dev-only rendering.\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nexport const isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n","import { createSignal, onMount, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { DialStore } from '../../store/DialStore';\nimport { TimelineStore } from '../../store/TimelineStore';\nimport { fromStore } from '../primitives';\nimport { ShortcutListener } from './ShortcutListener';\nimport { RootPanel } from './RootPanel';\nimport { Panel } from './Panel';\nimport { TimelineToggleButton } from './Timeline/TimelineToggleButton';\nimport {\n blockPanelDragClick,\n getPanelDragHandle,\n getPanelDragOffset,\n getPanelDragStart,\n getPanelOriginX,\n hasPanelDragMoved,\n type PanelDragOffset,\n type PanelDragStart,\n} from '../../panel-drag';\n\nexport type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\nexport type DialMode = 'popover' | 'inline';\nexport type DialTheme = 'light' | 'dark' | 'system';\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nconst isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n\ninterface DialRootProps {\n position?: DialPosition;\n defaultOpen?: boolean;\n mode?: DialMode;\n theme?: DialTheme;\n productionEnabled?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function DialRoot(props: DialRootProps) {\n const enabled = () => (props.productionEnabled ?? isDevDefault) !== false;\n return (\n <Show when={enabled()}>\n <DialRootInner {...props} />\n </Show>\n );\n}\n\nfunction DialRootInner(props: DialRootProps) {\n const panels = fromStore(\n () => DialStore.getPanels('panel'),\n (notify) => DialStore.subscribeGlobal(notify)\n );\n const timelines = fromStore(\n () => TimelineStore.getTimelines(),\n (notify) => TimelineStore.subscribeGlobal(notify)\n );\n // Hydration gate: server renders nothing, client's first render must match.\n const [mounted, setMounted] = createSignal(false);\n const [dragOffset, setDragOffset] = createSignal<PanelDragOffset | null>(null);\n const [activePosition, setActivePosition] = createSignal<DialPosition>(props.position ?? 'top-right');\n const inline = () => (props.mode ?? 'popover') === 'inline';\n let panelRef: HTMLDivElement | undefined;\n let lastDragOffset: PanelDragOffset | null = null;\n let dragging = false;\n let dragStart: PanelDragStart | null = null;\n let didDrag = false;\n let dragTarget: HTMLElement | null = null;\n\n onMount(() => setMounted(true));\n\n // Open state is lifted from the panels/root folder via onOpenChange\n // callbacks (this replaces the old data-collapsed MutationObserver).\n // Panels that have not reported yet fall back to defaultOpen.\n const fallbackOpen = () => inline() || (props.defaultOpen ?? true);\n const panelOpenStates = new Map<string, boolean>();\n let rootFolderOpen: boolean | undefined;\n\n const anyOpen = () => {\n const list = panels();\n if (list.length > 1) return rootFolderOpen ?? fallbackOpen();\n return list.some((panel) => panelOpenStates.get(panel.id) ?? fallbackOpen());\n };\n\n // On collapse/expand: swap the drag offset between the expanded panel and\n // the collapsed bubble so a dragged bubble returns to where it was left.\n const applyDragOffsetForOpen = (open: boolean) => {\n if (inline()) return;\n const currentDragOffset = dragOffset();\n\n if (open) {\n if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n const bubbleCenterX = currentDragOffset.x + 21;\n setActivePosition(bubbleCenterX < window.innerWidth / 2 ? 'top-left' : 'top-right');\n } else {\n setActivePosition(props.position ?? 'top-right');\n }\n setDragOffset(null);\n } else if (currentDragOffset) {\n lastDragOffset = currentDragOffset;\n } else if (lastDragOffset) {\n setDragOffset(lastDragOffset);\n }\n };\n\n const reactToOpenChange = (before: boolean) => {\n const after = anyOpen();\n if (after === before) return;\n applyDragOffsetForOpen(after);\n props.onOpenChange?.(after);\n };\n\n const handlePanelOpenChange = (panelId: string, open: boolean) => {\n const before = anyOpen();\n panelOpenStates.set(panelId, open);\n reactToOpenChange(before);\n };\n\n const handleRootOpenChange = (open: boolean) => {\n const before = anyOpen();\n rootFolderOpen = open;\n reactToOpenChange(before);\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (inline()) return;\n const panel = panelRef ?? null;\n const handle = getPanelDragHandle(event.target, panel);\n if (!panel || !handle) return;\n\n dragTarget = handle;\n dragStart = getPanelDragStart(event.clientX, event.clientY, panel);\n didDrag = false;\n dragging = true;\n handle.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging || !dragStart) return;\n\n if (!didDrag && !hasPanelDragMoved(dragStart, event.clientX, event.clientY)) return;\n didDrag = true;\n\n setDragOffset(getPanelDragOffset(dragStart, event.clientX, event.clientY));\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = false;\n dragStart = null;\n const handle = dragTarget;\n\n if (handle?.hasPointerCapture(event.pointerId)) {\n handle.releasePointerCapture(event.pointerId);\n }\n\n if (didDrag) {\n event.stopPropagation();\n if (handle) {\n blockPanelDragClick(handle);\n }\n }\n\n dragTarget = null;\n };\n\n const dragStyle = () => {\n const offset = dragOffset();\n return offset\n ? {\n top: `${offset.y}px`,\n left: `${offset.x}px`,\n right: 'auto',\n bottom: 'auto',\n }\n : undefined;\n };\n\n const timelineToggle = () => (\n <Show when={timelines().length > 0}>\n <TimelineToggleButton />\n </Show>\n );\n\n const content = () => (\n <ShortcutListener>\n <div class=\"dialkit-root\" data-mode={props.mode ?? 'popover'} data-theme={props.theme ?? 'system'}>\n <div\n ref={panelRef}\n class=\"dialkit-panel\"\n data-position={inline() ? undefined : (dragOffset() ? undefined : activePosition())}\n data-origin-x={inline() ? undefined : getPanelOriginX(activePosition(), dragOffset())}\n data-mode={props.mode ?? 'popover'}\n data-multiple={panels().length > 1 ? 'true' : undefined}\n style={dragStyle()}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <Show when={panels().length > 0} fallback={\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel\n title=\"DialKit\"\n defaultOpen={fallbackOpen()}\n inline={inline()}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle()}\n panelHeightOffset={2}\n >\n <div class=\"dialkit-timeline-toolkit-only\">Timeline</div>\n </RootPanel>\n </div>\n }>\n <Show\n when={panels().length > 1}\n fallback={\n <For each={panels()}>\n {(panel) => (\n <Panel\n panel={panel}\n defaultOpen={fallbackOpen()}\n inline={inline()}\n toolbarExtra={timelineToggle()}\n onOpenChange={(open) => handlePanelOpenChange(panel.id, open)}\n />\n )}\n </For>\n }\n >\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel\n title=\"DialKit\"\n defaultOpen={fallbackOpen()}\n inline={inline()}\n onOpenChange={handleRootOpenChange}\n toolbar={timelineToggle()}\n panelHeightOffset={2}\n >\n <For each={panels()}>\n {(panel) => (\n <Panel\n panel={panel}\n defaultOpen={true}\n variant=\"section\"\n />\n )}\n </For>\n </RootPanel>\n </div>\n </Show>\n </Show>\n </div>\n </div>\n </ShortcutListener>\n );\n\n return (\n <Show when={mounted() && (panels().length > 0 || timelines().length > 0)}>\n <Show when={!inline()} fallback={content()}>\n <Portal mount={document.body}>\n {content()}\n </Portal>\n </Show>\n </Show>\n );\n}\n","import { createEffect, createSignal, from, onCleanup, type Accessor } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport type { animate } from 'motion';\n\n/** Handle returned by motion's `animate()`; used instead of `any` for stored animations. */\nexport type AnimationHandle = ReturnType<typeof animate>;\n\n/**\n * Bridge an external subscribe/read store (DialStore et al.) into a Solid accessor.\n * Subscribes at setup on the client so updates between setup and mount are not\n * missed; on the server it reads directly without subscribing, so per-request\n * renders never leak listeners on the module-level store singleton.\n */\nexport function fromStore<T>(\n read: () => T,\n subscribe: (notify: () => void) => () => void\n): Accessor<T> {\n if (isServer) return read;\n const value = from<T>((set) => {\n // Wrap in an updater so values are never mistaken for setter callbacks.\n set(() => read());\n return subscribe(() => set(() => read()));\n });\n return value as Accessor<T>;\n}\n\nexport interface DropdownPresence {\n /** Logical open state (drives trigger styling, outside-click handling). */\n isOpen: Accessor<boolean>;\n /** DOM presence: stays true during the exit animation so it can play out. */\n mounted: Accessor<boolean>;\n open: () => void;\n close: () => void;\n /** Attach to the dropdown element via `ref`. */\n setRef: (el: HTMLElement) => void;\n contains: (target: Node) => boolean;\n}\n\n/**\n * Mount/unmount bookkeeping for an animated dropdown: `open()` mounts\n * immediately (the call site's ref callback runs the enter animation),\n * `close()` plays the provided exit animation and unmounts on completion.\n * Interrupted exits are stopped and re-opened cleanly.\n */\nexport function createDropdownPresence(\n animateExit: (el: HTMLElement, done: () => void) => AnimationHandle\n): DropdownPresence {\n const [isOpen, setIsOpen] = createSignal(false);\n const [mounted, setMounted] = createSignal(false);\n let el: HTMLElement | undefined;\n let exitAnim: AnimationHandle | null = null;\n\n onCleanup(() => exitAnim?.stop());\n\n const open = () => {\n exitAnim?.stop();\n exitAnim = null;\n setMounted(true);\n setIsOpen(true);\n };\n\n const close = () => {\n setIsOpen(false);\n if (!el || !mounted()) {\n setMounted(false);\n return;\n }\n exitAnim?.stop();\n exitAnim = animateExit(el, () => {\n setMounted(false);\n exitAnim = null;\n });\n };\n\n return {\n isOpen,\n mounted,\n open,\n close,\n setRef: (node: HTMLElement) => {\n el = node;\n },\n contains: (target: Node) => Boolean(el?.contains(target)),\n };\n}\n\n/**\n * While `isOpen`, dismiss on mousedown outside of `contains` and invoke\n * `onViewportChange` on window resize/scroll (for repositioning portaled\n * dropdowns). Listeners detach automatically when closed or unmounted.\n */\nexport function createDropdownDismiss(opts: {\n isOpen: Accessor<boolean>;\n contains: (target: Node) => boolean;\n onDismiss: () => void;\n onViewportChange?: () => void;\n}): void {\n createEffect(() => {\n if (!opts.isOpen()) return;\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.target instanceof Node && opts.contains(e.target)) return;\n opts.onDismiss();\n };\n document.addEventListener('mousedown', onMouseDown);\n onCleanup(() => document.removeEventListener('mousedown', onMouseDown));\n\n const onViewportChange = opts.onViewportChange;\n if (onViewportChange) {\n const handler = () => onViewportChange();\n window.addEventListener('resize', handler);\n window.addEventListener('scroll', handler, true);\n onCleanup(() => {\n window.removeEventListener('resize', handler);\n window.removeEventListener('scroll', handler, true);\n });\n }\n });\n}\n","import { createContext, useContext, createSignal, onMount, onCleanup, JSX } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport {\n getEffectiveStep,\n applySliderDelta,\n DRAG_SENSITIVITY,\n findControl,\n isInputFocused,\n getActiveModifier,\n} from '../../shortcut-utils';\n\ntype ShortcutState = {\n activePanelId: string | null;\n activePath: string | null;\n};\n\nconst defaultState: ShortcutState = { activePanelId: null, activePath: null };\n\nconst ShortcutContext = createContext<() => ShortcutState>(() => defaultState);\n\nexport function useShortcutContext() {\n return useContext(ShortcutContext);\n}\n\nexport function ShortcutListener(props: { children: JSX.Element }) {\n const [activeShortcut, setActiveShortcut] = createSignal<ShortcutState>(defaultState);\n\n // Keep referential stability when the target is unchanged so consumers\n // reading the context are not notified on every key repeat.\n const setShortcutTarget = (activePanelId: string | null, activePath: string | null) => {\n setActiveShortcut((prev) => (\n prev.activePanelId === activePanelId && prev.activePath === activePath\n ? prev\n : { activePanelId, activePath }\n ));\n };\n\n const activeKeys = new Set<string>();\n let isDragging = false;\n let lastMouseX: number | null = null;\n let dragAccumulator = 0;\n\n const resolveActiveTarget = (interaction: string) => {\n for (const key of activeKeys) {\n const panels = DialStore.getPanels();\n for (const panel of panels) {\n for (const [path, shortcut] of Object.entries(panel.shortcuts)) {\n if (!shortcut.key) continue;\n if (shortcut.key.toLowerCase() !== key) continue;\n if ((shortcut.interaction ?? 'scroll') !== interaction) continue;\n const control = DialStore.getPanel(panel.id)?.controls\n ? findControl(panel.controls, path)\n : null;\n if (control && control.type === 'slider') {\n return { panelId: panel.id, path, control, shortcut };\n }\n }\n }\n }\n return null;\n };\n\n onMount(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isInputFocused()) return;\n\n const key = e.key.toLowerCase();\n\n // Arrow keys adjust the active shortcut's slider\n if (key === 'arrowleft' || key === 'arrowright' || key === 'arrowup' || key === 'arrowdown') {\n if (activeKeys.size > 0) {\n const target = resolveActiveTarget('scroll') || resolveActiveTarget('drag') || resolveActiveTarget('move');\n if (target && target.control.type === 'slider') {\n e.preventDefault();\n const direction = (key === 'arrowright' || key === 'arrowup') ? 1 : -1;\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, direction);\n return;\n }\n }\n }\n\n const wasAlreadyHeld = activeKeys.has(key);\n activeKeys.add(key);\n\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (target) {\n setShortcutTarget(target.panelId, target.path);\n\n // Toggle: flip on first keydown only (not on key repeat)\n if (!wasAlreadyHeld && target.control.type === 'toggle') {\n const currentValue = DialStore.getValue(target.panelId, target.path) as boolean;\n DialStore.updateValue(target.panelId, target.path, !currentValue);\n }\n }\n\n // Reset mouse tracking when a new key is pressed (for move/drag)\n if (!wasAlreadyHeld) {\n lastMouseX = null;\n dragAccumulator = 0;\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n activeKeys.delete(key);\n\n // Reset drag state when key is released\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n\n if (activeKeys.size === 0) {\n setShortcutTarget(null, null);\n } else {\n let found = false;\n for (const remainingKey of activeKeys) {\n const modifier = getActiveModifier(e);\n const target = DialStore.resolveShortcutTarget(remainingKey, modifier);\n if (target) {\n setShortcutTarget(target.panelId, target.path);\n found = true;\n break;\n }\n }\n if (!found) {\n setShortcutTarget(null, null);\n }\n }\n };\n\n // Scroll: key+scroll and scroll-only\n const handleWheel = (e: WheelEvent) => {\n if (isInputFocused()) return;\n\n const modifier = getActiveModifier(e);\n\n // Key+scroll shortcuts\n if (activeKeys.size > 0) {\n for (const key of activeKeys) {\n const target = DialStore.resolveShortcutTarget(key, modifier);\n if (!target) continue;\n\n const { panelId, path, control } = target;\n const interaction = control.shortcut?.interaction ?? 'scroll';\n if (interaction !== 'scroll' || control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, control.shortcut!);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n }\n\n // Scroll-only shortcuts (no key needed)\n const scrollOnlyTargets = DialStore.resolveScrollOnlyTargets();\n for (const { panelId, path, control, shortcut } of scrollOnlyTargets) {\n if (control.type !== 'slider') continue;\n\n e.preventDefault();\n const effectiveStep = getEffectiveStep(control, shortcut);\n const direction = e.deltaY > 0 ? -1 : 1;\n applySliderDelta(panelId, path, control, effectiveStep, direction);\n return;\n }\n };\n\n // Drag: key+mousedown starts, mousemove adjusts, mouseup stops\n const handleMouseDown = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n const target = resolveActiveTarget('drag');\n if (target) {\n isDragging = true;\n lastMouseX = e.clientX;\n dragAccumulator = 0;\n e.preventDefault();\n }\n };\n\n const handleMouseUp = () => {\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n };\n\n // Move + Drag: mousemove handles both\n const handleMouseMove = (e: MouseEvent) => {\n if (isInputFocused()) return;\n if (activeKeys.size === 0) return;\n\n // Drag interaction (requires mousedown)\n if (isDragging) {\n const target = resolveActiveTarget('drag');\n if (target && lastMouseX !== null) {\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(target.control, target.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(target.panelId, target.path, target.control, effectiveStep, steps);\n }\n }\n return;\n }\n\n // Move interaction (no click needed, just key held + mouse movement)\n const moveTarget = resolveActiveTarget('move');\n if (moveTarget) {\n if (lastMouseX === null) {\n lastMouseX = e.clientX;\n return;\n }\n\n const deltaX = e.clientX - lastMouseX;\n lastMouseX = e.clientX;\n dragAccumulator += deltaX;\n\n const effectiveStep = getEffectiveStep(moveTarget.control, moveTarget.shortcut);\n const steps = Math.trunc(dragAccumulator / DRAG_SENSITIVITY);\n if (steps !== 0) {\n dragAccumulator -= steps * DRAG_SENSITIVITY;\n applySliderDelta(moveTarget.panelId, moveTarget.path, moveTarget.control, effectiveStep, steps);\n }\n }\n };\n\n const handleWindowBlur = () => {\n activeKeys.clear();\n isDragging = false;\n lastMouseX = null;\n dragAccumulator = 0;\n setShortcutTarget(null, null);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('wheel', handleWheel, { passive: false });\n window.addEventListener('mousedown', handleMouseDown);\n window.addEventListener('mouseup', handleMouseUp);\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('blur', handleWindowBlur);\n\n onCleanup(() => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n window.removeEventListener('wheel', handleWheel);\n window.removeEventListener('mousedown', handleMouseDown);\n window.removeEventListener('mouseup', handleMouseUp);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('blur', handleWindowBlur);\n });\n });\n\n return (\n <ShortcutContext.Provider value={activeShortcut}>\n {props.children}\n </ShortcutContext.Provider>\n );\n}\n","// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n","import { createSignal, createEffect, on, onCleanup, untrack, Show, JSX } from 'solid-js';\nimport { isServer } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { ICON_PANEL } from '../../icons';\nimport type { AnimationHandle } from '../primitives';\n\nexport interface RootPanelProps {\n title: string;\n children: JSX.Element;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n toolbar?: JSX.Element;\n panelHeightOffset?: number;\n}\n\nconst morphTransition = { type: 'spring' as const, visualDuration: 0.15, bounce: 0.3 };\n\n/**\n * The top-level panel shell: header with panel icon and toolbar, and (in\n * popover mode) the bubble-to-panel morph animation with drag-friendly\n * collapsed state. Section folding lives in Folder.\n */\nexport function RootPanel(props: RootPanelProps) {\n // Inline vs popover picks a different component tree; treat it as static\n // configuration (DialRoot never changes mode at runtime).\n const inline = props.inline ?? false;\n\n const [isOpen, setIsOpen] = createSignal(props.defaultOpen ?? true);\n const [contentHeight, setContentHeight] = createSignal<number | undefined>(undefined);\n const [windowHeight, setWindowHeight] = createSignal(isServer ? 800 : window.innerHeight);\n let folderRef: HTMLDivElement | undefined;\n\n const handleToggle = () => {\n if (inline) return;\n const next = !isOpen();\n setIsOpen(next);\n props.onOpenChange?.(next);\n };\n\n const folderContent = () => (\n <div ref={folderRef} class=\"dialkit-folder dialkit-folder-root\" data-open={String(isOpen())}>\n <div class=\"dialkit-folder-header dialkit-panel-header\" onClick={handleToggle}>\n <div class=\"dialkit-folder-header-top\">\n <Show when={isOpen()}>\n <div class=\"dialkit-folder-title-row\">\n <span class=\"dialkit-folder-title dialkit-folder-title-root\">\n {props.title}\n </span>\n </div>\n </Show>\n\n <Show when={!inline}>\n <svg class=\"dialkit-panel-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n opacity=\"0.5\"\n d={ICON_PANEL.path}\n fill=\"currentColor\"\n />\n <circle cx={ICON_PANEL.circles[0].cx} cy={ICON_PANEL.circles[0].cy} r={ICON_PANEL.circles[0].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n <circle cx={ICON_PANEL.circles[1].cx} cy={ICON_PANEL.circles[1].cy} r={ICON_PANEL.circles[1].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n <circle cx={ICON_PANEL.circles[2].cx} cy={ICON_PANEL.circles[2].cy} r={ICON_PANEL.circles[2].r} fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.25\" />\n </svg>\n </Show>\n </div>\n\n <Show when={props.toolbar && isOpen()}>\n <div class=\"dialkit-panel-toolbar\" onClick={(e) => e.stopPropagation()}>\n {props.toolbar}\n </div>\n </Show>\n </div>\n\n <Show when={isOpen()}>\n <div class=\"dialkit-folder-content\">\n <div class=\"dialkit-folder-inner\">{props.children}</div>\n </div>\n </Show>\n </div>\n );\n\n if (inline) {\n return (\n <div class=\"dialkit-panel-inner dialkit-panel-inline\">\n {folderContent()}\n </div>\n );\n }\n\n let panelRef!: HTMLDivElement;\n let morphAnim: AnimationHandle | null = null;\n let tapAnim: AnimationHandle | null = null;\n\n const onWindowResize = () => setWindowHeight(window.innerHeight);\n window.addEventListener('resize', onWindowResize);\n onCleanup(() => {\n window.removeEventListener('resize', onWindowResize);\n morphAnim?.stop();\n tapAnim?.stop();\n });\n\n // Measure the whole folder (header + content) to size the open panel.\n createEffect(() => {\n if (!isOpen()) return;\n const el = folderRef;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n const h = el.offsetHeight;\n setContentHeight((prev) => (prev === h ? prev : h));\n });\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n });\n\n const measuredOpenHeight = () => (\n contentHeight() !== undefined\n ? Math.min(contentHeight()! + (props.panelHeightOffset ?? 10), windowHeight() - 32)\n : panelRef.getBoundingClientRect().height\n );\n\n // Bubble <-> panel morph: first run just applies resting styles; later\n // open-state changes animate. on() keeps height reads untracked so only\n // transitions trigger the morph.\n createEffect(on(isOpen, (open, prevOpen) => {\n const target = {\n width: open ? 280 : 42,\n height: open ? measuredOpenHeight() : 42,\n borderRadius: open ? 14 : 21,\n boxShadow: open ? 'var(--dial-shadow)' : 'var(--dial-shadow-collapsed)',\n };\n\n panelRef.style.cursor = open ? '' : 'pointer';\n panelRef.style.overflow = open ? 'hidden auto' : 'hidden';\n\n if (prevOpen === undefined) {\n panelRef.style.width = `${target.width}px`;\n panelRef.style.height = `${target.height}px`;\n panelRef.style.borderRadius = `${target.borderRadius}px`;\n panelRef.style.boxShadow = target.boxShadow;\n return;\n }\n\n morphAnim?.stop();\n morphAnim = animate(panelRef, target, {\n ...morphTransition,\n onComplete: () => {\n morphAnim = null;\n },\n });\n }));\n\n // Track content growth/shrink while open without re-triggering the morph.\n createEffect(on([contentHeight, windowHeight] as const, ([height, winHeight]) => {\n if (height === undefined || !untrack(isOpen)) return;\n panelRef.style.height = `${Math.min(height + (props.panelHeightOffset ?? 10), winHeight - 32)}px`;\n }, { defer: true }));\n\n // Expand-on-tap while collapsed uses a native listener: stopPropagation here\n // prevents the (delegated) header onClick from firing a second toggle.\n createEffect(() => {\n if (isOpen()) return;\n const handler = (e: Event) => {\n e.stopPropagation();\n handleToggle();\n };\n panelRef.addEventListener('click', handler);\n onCleanup(() => panelRef.removeEventListener('click', handler));\n });\n\n const pressTo = (scale: number) => {\n if (isOpen()) return;\n tapAnim?.stop();\n tapAnim = animate(panelRef, { scale }, morphTransition);\n };\n\n return (\n <div\n ref={panelRef}\n class=\"dialkit-panel-inner\"\n data-collapsed={String(!isOpen())}\n onPointerDown={() => {\n if (isOpen()) return;\n (document.activeElement as HTMLElement)?.blur?.();\n pressTo(0.9);\n }}\n onPointerUp={() => pressTo(1)}\n onPointerCancel={() => pressTo(1)}\n onPointerLeave={() => pressTo(1)}\n >\n {folderContent()}\n </div>\n );\n}\n","// Shared SVG icon geometry — single source of truth across all framework adapters.\n\nexport const ICON_CHEVRON = 'M6 9.5L12 15.5L18 9.5';\n\nexport const ICON_CHECK = 'M5 12.75L10 19L19 5';\n\nexport const ICON_PAUSE = [\n 'M6.75 3C5.23122 3 4 4.23122 4 5.75V18.25C4 19.7688 5.23122 21 6.75 21H7.25C8.76878 21 10 19.7688 10 18.25V5.75C10 4.23122 8.76878 3 7.25 3H6.75Z',\n 'M16.75 3C15.2312 3 14 4.23122 14 5.75V18.25C14 19.7688 15.2312 21 16.75 21H17.25C18.7688 21 20 19.7688 20 18.25V5.75C20 4.23122 18.7688 3 17.25 3H16.75Z',\n];\n\nexport const ICON_PLAY = 'M9.24394 2.36758C7.41419 1.18362 5 2.49701 5 4.67639V19.3238C5 21.5032 7.41419 22.8166 9.24394 21.6326L20.5624 14.3089C22.2371 13.2253 22.2372 10.775 20.5624 9.69129L9.24394 2.36758Z';\n\nexport const ICON_REPLAY = [\n 'M12 2.5C17.2466 2.50016 21.5 6.7534 21.5 12C21.5 17.2466 17.2466 21.4998 12 21.5C7.52191 21.5 3.76987 18.4025 2.76465 14.2344C2.63517 13.6975 2.96508 13.1578 3.50195 13.0283C4.03883 12.8988 4.57851 13.2288 4.70801 13.7656C5.5016 17.0563 8.46701 19.5 12 19.5C16.142 19.4998 19.5 16.142 19.5 12C19.5 7.85796 16.142 4.50016 12 4.5C9.32981 4.5 6.98389 5.89541 5.6543 8H7.5C8.05228 8 8.5 8.44772 8.5 9C8.5 9.55228 8.05228 10 7.5 10H3.5C2.94772 10 2.5 9.55228 2.5 9V5C2.5 4.44772 2.94772 4 3.5 4C4.05228 4 4.5 4.44772 4.5 5V6.16797C6.2376 3.93677 8.95063 2.5 12 2.5Z',\n 'M10 9.94043C10 9.33379 10.6826 8.97849 11.1797 9.32617L14.1221 11.3857C14.5486 11.6843 14.5486 12.3157 14.1221 12.6143L11.1797 14.6738C10.6826 15.0215 10 14.6662 10 14.0596V9.94043Z',\n];\n\nexport const ICON_TIMELINE = [\n 'M18.868 10C20.8517 10.0003 22.2886 11.8914 21.7577 13.8027L20.369 18.8027C20.0083 20.1012 18.826 20.9999 17.4784 21H6.51941C5.17179 21 3.98948 20.1012 3.62878 18.8027L2.24011 13.8027C1.7092 11.8913 3.14603 10.0003 5.12976 10H18.868Z',\n 'M18.9989 6.5C19.5511 6.50007 19.9989 6.94776 19.9989 7.5C19.9989 8.05224 19.5511 8.49993 18.9989 8.5H4.9989C4.44661 8.5 3.9989 8.05228 3.9989 7.5C3.9989 6.94772 4.44661 6.5 4.9989 6.5H18.9989Z',\n 'M16.9989 3C17.5511 3.00007 17.9989 3.44776 17.9989 4C17.9989 4.55224 17.5511 4.99993 16.9989 5H6.9989C6.44661 5 5.9989 4.55228 5.9989 4C5.9989 3.44772 6.44661 3 6.9989 3H16.9989Z',\n];\n\nexport const ICON_CLIPBOARD = {\n board: 'M8 6C8 4.34315 9.34315 3 11 3H13C14.6569 3 16 4.34315 16 6V7H8V6Z',\n sparkle: 'M19.2405 16.1852L18.5436 14.3733C18.4571 14.1484 18.241 14 18 14C17.759 14 17.5429 14.1484 17.4564 14.3733L16.7595 16.1852C16.658 16.4493 16.4493 16.658 16.1852 16.7595L14.3733 17.4564C14.1484 17.5429 14 17.759 14 18C14 18.241 14.1484 18.4571 14.3733 18.5436L16.1852 19.2405C16.4493 19.342 16.658 19.5507 16.7595 19.8148L17.4564 21.6267C17.5429 21.8516 17.759 22 18 22C18.241 22 18.4571 21.8516 18.5436 21.6267L19.2405 19.8148C19.342 19.5507 19.5507 19.342 19.8148 19.2405L21.6267 18.5436C21.8516 18.4571 22 18.241 22 18C22 17.759 21.8516 17.5429 21.6267 17.4564L19.8148 16.7595C19.5507 16.658 19.342 16.4493 19.2405 16.1852Z',\n body: 'M16 5H17C18.6569 5 20 6.34315 20 8V11M8 5H7C5.34315 5 4 6.34315 4 8V18C4 19.6569 5.34315 21 7 21H12',\n};\n\nexport const ICON_ADD_PRESET = [\n 'M4 6H20',\n 'M4 12H10',\n 'M15 15L21 15',\n 'M18 12V18',\n 'M4 18H10',\n];\n\nexport const ICON_TRASH = [\n 'M5 6.5L5.80734 18.2064C5.91582 19.7794 7.22348 21 8.80023 21H15.1998C16.7765 21 18.0842 19.7794 18.1927 18.2064L19 6.5',\n 'M10 11V16',\n 'M14 11V16',\n 'M3.5 6H20.5',\n 'M8.07092 5.74621C8.42348 3.89745 10.0485 2.5 12 2.5C13.9515 2.5 15.5765 3.89745 15.9291 5.74621',\n];\n\nexport const ICON_PANEL = {\n path: 'M6.84766 11.75C6.78583 11.9899 6.75 12.2408 6.75 12.5C6.75 12.7592 6.78583 13.0101 6.84766 13.25H2C1.58579 13.25 1.25 12.9142 1.25 12.5C1.25 12.0858 1.58579 11.75 2 11.75H6.84766ZM14 11.75C14.4142 11.75 14.75 12.0858 14.75 12.5C14.75 12.9142 14.4142 13.25 14 13.25H12.6523C12.7142 13.0101 12.75 12.7592 12.75 12.5C12.75 12.2408 12.7142 11.9899 12.6523 11.75H14ZM3.09766 7.25C3.03583 7.48994 3 7.74075 3 8C3 8.25925 3.03583 8.51006 3.09766 8.75H2C1.58579 8.75 1.25 8.41421 1.25 8C1.25 7.58579 1.58579 7.25 2 7.25H3.09766ZM14 7.25C14.4142 7.25 14.75 7.58579 14.75 8C14.75 8.41421 14.4142 8.75 14 8.75H8.90234C8.96417 8.51006 9 8.25925 9 8C9 7.74075 8.96417 7.48994 8.90234 7.25H14ZM7.59766 2.75C7.53583 2.98994 7.5 3.24075 7.5 3.5C7.5 3.75925 7.53583 4.01006 7.59766 4.25H2C1.58579 4.25 1.25 3.91421 1.25 3.5C1.25 3.08579 1.58579 2.75 2 2.75H7.59766ZM14 2.75C14.4142 2.75 14.75 3.08579 14.75 3.5C14.75 3.91421 14.4142 4.25 14 4.25H13.4023C13.4642 4.01006 13.5 3.75925 13.5 3.5C13.5 3.24075 13.4642 2.98994 13.4023 2.75H14Z',\n circles: [\n { cx: '6', cy: '8', r: '0.998596' },\n { cx: '10.4999', cy: '3.5', r: '0.998657' },\n { cx: '9.75015', cy: '12.5', r: '0.997986' },\n ],\n};\n","import { batch, createSignal, createEffect, on, onMount, onCleanup, For, type JSX } from 'solid-js';\nimport { animate } from 'motion';\nimport { ICON_CLIPBOARD, ICON_CHECK, ICON_ADD_PRESET } from '../../icons';\nimport { DialStore } from '../../store/DialStore';\nimport type { ControlMeta, PanelConfig, SpringConfig, TransitionConfig, DialValue } from '../../store/DialStore';\nimport type { AnimationHandle } from '../primitives';\nimport { useShortcutContext } from './ShortcutListener';\nimport { Folder } from './Folder';\nimport { RootPanel } from './RootPanel';\nimport { Slider } from './Slider';\nimport { Toggle } from './Toggle';\nimport { SpringControl } from './SpringControl';\nimport { TransitionControl } from './TransitionControl';\nimport { TextControl } from './TextControl';\nimport { SelectControl } from './SelectControl';\nimport { ColorControl } from './ColorControl';\nimport { PresetManager } from './PresetManager';\n\ninterface PanelProps {\n panel: PanelConfig;\n defaultOpen?: boolean;\n inline?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'root' | 'section';\n toolbarExtra?: JSX.Element;\n}\n\nexport function Panel(props: PanelProps) {\n const [copied, setCopied] = createSignal(false);\n const shortcutCtx = useShortcutContext();\n const [values, setValues] = createSignal<Record<string, DialValue>>(\n DialStore.getValues(props.panel.id)\n );\n const [presets, setPresets] = createSignal(DialStore.getPresets(props.panel.id));\n const [activePresetId, setActivePresetId] = createSignal(DialStore.getActivePresetId(props.panel.id));\n let addButtonRef!: HTMLButtonElement;\n let copyButtonRef!: HTMLButtonElement;\n let copyClipboardIconRef!: HTMLSpanElement;\n let copyCheckIconRef!: HTMLSpanElement;\n let addTapAnim: AnimationHandle | null = null;\n let copyTapAnim: AnimationHandle | null = null;\n let copyClipboardAnim: AnimationHandle | null = null;\n let copyCheckAnim: AnimationHandle | null = null;\n\n const tapTransition = { type: 'spring' as const, visualDuration: 0.15, bounce: 0.3 };\n\n onMount(() => {\n const unsub = DialStore.subscribe(props.panel.id, () => {\n batch(() => {\n setValues(DialStore.getValues(props.panel.id));\n setPresets(DialStore.getPresets(props.panel.id));\n setActivePresetId(DialStore.getActivePresetId(props.panel.id));\n });\n });\n onCleanup(unsub);\n });\n\n const handleAddPreset = () => {\n const nextNum = presets().length + 2;\n DialStore.savePreset(props.panel.id, `Version ${nextNum}`);\n };\n\n const handleCopy = () => {\n const jsonStr = JSON.stringify(values(), null, 2);\n const instruction = `Update the createDialKit configuration for \"${props.panel.name}\" with these values:\\n\\n\\`\\`\\`json\\n${jsonStr}\\n\\`\\`\\`\\n\\nApply these values as the new defaults in the createDialKit call.`;\n navigator.clipboard.writeText(instruction);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n // Icons render with their resting styles inline; only animate on changes.\n createEffect(on(copied, (isCopied) => {\n if (!copyClipboardIconRef || !copyCheckIconRef) return;\n\n copyClipboardAnim?.stop();\n copyCheckAnim?.stop();\n\n const transition = { type: 'spring' as const, visualDuration: 0.3, bounce: 0.2 };\n copyClipboardAnim = animate(copyClipboardIconRef, {\n opacity: isCopied ? 0 : 1,\n scale: isCopied ? 0.5 : 1,\n filter: isCopied ? 'blur(4px)' : 'blur(0px)',\n }, transition);\n copyCheckAnim = animate(copyCheckIconRef, {\n opacity: isCopied ? 1 : 0,\n scale: isCopied ? 1 : 0.5,\n filter: isCopied ? 'blur(0px)' : 'blur(4px)',\n }, transition);\n }, { defer: true }));\n\n onCleanup(() => {\n addTapAnim?.stop();\n copyTapAnim?.stop();\n copyClipboardAnim?.stop();\n copyCheckAnim?.stop();\n });\n\n const handleAddTapStart = () => {\n if (!addButtonRef) return;\n addTapAnim?.stop();\n addTapAnim = animate(addButtonRef, { scale: 0.9 }, tapTransition);\n };\n\n const handleAddTapEnd = () => {\n if (!addButtonRef) return;\n addTapAnim?.stop();\n addTapAnim = animate(addButtonRef, { scale: 1 }, tapTransition);\n };\n\n const handleCopyTapStart = () => {\n if (!copyButtonRef) return;\n copyTapAnim?.stop();\n copyTapAnim = animate(copyButtonRef, { scale: 0.95 }, tapTransition);\n };\n\n const handleCopyTapEnd = () => {\n if (!copyButtonRef) return;\n copyTapAnim?.stop();\n copyTapAnim = animate(copyButtonRef, { scale: 1 }, tapTransition);\n };\n\n const handleOpenChange = (open: boolean) => {\n props.onOpenChange?.(open);\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 label={control.label}\n value={value() as number}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx().activePanelId === props.panel.id && shortcutCtx().activePath === control.path}\n />\n );\n\n case 'toggle':\n return (\n <Toggle\n label={control.label}\n checked={value() as boolean}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n shortcut={control.shortcut}\n shortcutActive={shortcutCtx().activePanelId === props.panel.id && shortcutCtx().activePath === control.path}\n />\n );\n\n case 'spring':\n return (\n <SpringControl\n panelId={props.panel.id}\n path={control.path}\n label={control.label}\n spring={value() as SpringConfig}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'transition':\n return (\n <TransitionControl\n panelId={props.panel.id}\n path={control.path}\n label={control.label}\n value={value() as TransitionConfig}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'folder':\n return (\n <Folder title={control.label} defaultOpen={control.defaultOpen ?? true}>\n <For each={control.children ?? []}>\n {(child) => <>{renderControl(child)}</>}\n </For>\n </Folder>\n );\n\n case 'text':\n return (\n <TextControl\n label={control.label}\n value={value() as string}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n placeholder={control.placeholder}\n />\n );\n\n case 'select':\n return (\n <SelectControl\n label={control.label}\n value={value() as string}\n options={control.options ?? []}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n case 'color':\n return (\n <ColorControl\n label={control.label}\n value={value() as string}\n onChange={(v) => DialStore.updateValue(props.panel.id, control.path, v)}\n />\n );\n\n default:\n return null;\n }\n };\n\n const renderControls = () => {\n return (\n <For each={props.panel.controls}>\n {(control) => (\n <>\n {control.type === 'action' ? (\n <button\n class=\"dialkit-button\"\n onClick={() => DialStore.triggerAction(props.panel.id, control.path)}\n >\n {control.label}\n </button>\n ) : (\n renderControl(control)\n )}\n </>\n )}\n </For>\n );\n };\n\n const toolbar = (\n <>\n <button\n ref={addButtonRef}\n class=\"dialkit-toolbar-add\"\n onClick={handleAddPreset}\n onPointerDown={handleAddTapStart}\n onPointerUp={handleAddTapEnd}\n onPointerCancel={handleAddTapEnd}\n onPointerLeave={handleAddTapEnd}\n title=\"Add preset\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_ADD_PRESET[0]} />\n <path d={ICON_ADD_PRESET[1]} />\n <path d={ICON_ADD_PRESET[2]} />\n <path d={ICON_ADD_PRESET[3]} />\n <path d={ICON_ADD_PRESET[4]} />\n </svg>\n </button>\n\n <PresetManager\n panelId={props.panel.id}\n presets={presets()}\n activePresetId={activePresetId()}\n onAdd={handleAddPreset}\n />\n\n <button\n ref={copyButtonRef}\n class=\"dialkit-toolbar-copy\"\n onClick={handleCopy}\n onPointerDown={handleCopyTapStart}\n onPointerUp={handleCopyTapEnd}\n onPointerCancel={handleCopyTapEnd}\n onPointerLeave={handleCopyTapEnd}\n title=\"Copy parameters\"\n >\n <span class=\"dialkit-toolbar-copy-icon-wrap\">\n <span\n ref={copyClipboardIconRef}\n class=\"dialkit-toolbar-copy-icon\"\n style={{ opacity: 1, transform: 'scale(1)', filter: 'blur(0px)', 'transform-origin': '50% 50%' }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"16\" height=\"16\">\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span\n ref={copyCheckIconRef}\n class=\"dialkit-toolbar-copy-icon\"\n style={{ opacity: 0, transform: 'scale(0.5)', filter: 'blur(4px)', 'transform-origin': '50% 50%' }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"16\" height=\"16\">\n <path d={ICON_CHECK} />\n </svg>\n </span>\n </span>\n Copy\n </button>\n\n {props.toolbarExtra}\n\n </>\n );\n\n if (props.variant === 'section') {\n return (\n <Folder title={props.panel.name} defaultOpen={props.defaultOpen ?? true} onOpenChange={handleOpenChange}>\n <div class=\"dialkit-panel-section-toolbar\" onClick={(e) => e.stopPropagation()}>\n {toolbar}\n </div>\n {renderControls()}\n </Folder>\n );\n }\n\n return (\n <div class=\"dialkit-panel-wrapper\">\n <RootPanel title={props.panel.name} defaultOpen={props.defaultOpen ?? true} inline={props.inline ?? false} onOpenChange={handleOpenChange} toolbar={toolbar}>\n {renderControls()}\n </RootPanel>\n </div>\n );\n}\n","import { createSignal, createEffect, on, onCleanup, Show, JSX } from 'solid-js';\nimport { animate } from 'motion';\nimport { ICON_CHEVRON } from '../../icons';\nimport type { AnimationHandle } from '../primitives';\nimport { RootPanel } from './RootPanel';\n\ninterface FolderProps {\n title: string;\n children: JSX.Element;\n defaultOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /** @deprecated Use RootPanel instead; kept for backwards compatibility. */\n isRoot?: boolean;\n /** @deprecated Only meaningful with isRoot. */\n inline?: boolean;\n /** @deprecated Only meaningful with isRoot. */\n toolbar?: JSX.Element;\n /** @deprecated Only meaningful with isRoot. */\n panelHeightOffset?: number;\n}\n\nconst sectionTransition = { type: 'spring' as const, visualDuration: 0.35, bounce: 0.1 };\n\n/** Collapsible section with animated height/opacity and rotating chevron. */\nexport function Folder(props: FolderProps) {\n // Root panels are a different component; delegate for old call sites.\n if (props.isRoot) {\n return <RootPanel {...props} />;\n }\n\n const [isOpen, setIsOpen] = createSignal(props.defaultOpen ?? true);\n const [contentMounted, setContentMounted] = createSignal(props.defaultOpen ?? true);\n let skipFirstAnim = props.defaultOpen ?? true;\n let sectionContentRef: HTMLDivElement | undefined;\n let sectionAnim: AnimationHandle | null = null;\n let chevronRef: SVGSVGElement | undefined;\n let chevronAnim: AnimationHandle | null = null;\n\n onCleanup(() => {\n sectionAnim?.stop();\n chevronAnim?.stop();\n });\n\n // Chevron renders at its resting angle; only animate on changes.\n createEffect(on(isOpen, (open) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 0 : 180 },\n { type: 'spring', visualDuration: 0.35, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const handleToggle = () => {\n const next = !isOpen();\n setIsOpen(next);\n if (next) {\n sectionAnim?.stop();\n sectionAnim = null;\n if (sectionContentRef) {\n // If close was interrupted, animate the section back open.\n sectionAnim = animate(\n sectionContentRef,\n { height: 'auto', opacity: 1 },\n {\n ...sectionTransition,\n onComplete: () => {\n sectionAnim = null;\n },\n }\n );\n } else {\n // If fully unmounted, mount and let the ref callback run the enter animation.\n setContentMounted(true);\n }\n } else if (sectionContentRef) {\n const currentHeight = sectionContentRef.getBoundingClientRect().height;\n sectionContentRef.style.height = `${currentHeight}px`;\n sectionAnim?.stop();\n sectionAnim = animate(\n sectionContentRef,\n { height: 0, opacity: 0 },\n {\n ...sectionTransition,\n onComplete: () => {\n setContentMounted(false);\n sectionAnim = null;\n sectionContentRef = undefined;\n },\n }\n );\n } else {\n setContentMounted(false);\n }\n props.onOpenChange?.(next);\n };\n\n return (\n <div class=\"dialkit-folder\" data-open={String(isOpen())}>\n <div class=\"dialkit-folder-header\" onClick={handleToggle}>\n <div class=\"dialkit-folder-header-top\">\n <div class=\"dialkit-folder-title-row\">\n <span class=\"dialkit-folder-title\">{props.title}</span>\n </div>\n\n <svg\n ref={chevronRef}\n class=\"dialkit-folder-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style={{ transform: `rotate(${(props.defaultOpen ?? true) ? 0 : 180}deg)` }}\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </div>\n </div>\n\n <Show when={contentMounted()}>\n <div\n ref={(el) => {\n sectionContentRef = el;\n if (skipFirstAnim) {\n skipFirstAnim = false;\n return;\n }\n\n sectionAnim?.stop();\n el.style.height = '0px';\n el.style.opacity = '0';\n sectionAnim = animate(\n el,\n { height: 'auto', opacity: 1 },\n {\n ...sectionTransition,\n onComplete: () => {\n sectionAnim = null;\n },\n }\n );\n }}\n class=\"dialkit-folder-content\"\n style={{ 'clip-path': 'inset(0 -20px)' }}\n >\n <div class=\"dialkit-folder-inner\">{props.children}</div>\n </div>\n </Show>\n </div>\n );\n}\n","import { createSignal, createEffect, onMount, onCleanup, Show } from 'solid-js';\nimport { animate, motionValue } from 'motion';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport type { AnimationHandle } from '../primitives';\nimport {\n decimalsForStep,\n roundValue,\n snapToDecile,\n formatSliderShortcut,\n} from '../../shortcut-utils';\n\ninterface SliderProps {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nconst CLICK_THRESHOLD = 3;\nconst DEAD_ZONE = 32;\nconst MAX_CURSOR_RANGE = 200;\nconst MAX_STRETCH = 8;\n\nexport function Slider(props: SliderProps) {\n const min = () => props.min ?? 0;\n const max = () => props.max ?? 1;\n const step = () => props.step ?? 0.01;\n\n let wrapperRef!: HTMLDivElement;\n let trackRef!: HTMLDivElement;\n let fillRef!: HTMLDivElement;\n let handleRef!: HTMLDivElement;\n let labelRef!: HTMLSpanElement;\n let valueSpanRef!: HTMLSpanElement;\n let inputRef!: HTMLInputElement;\n\n const [isInteracting, setIsInteracting] = createSignal(false);\n const [isDragging, setIsDragging] = createSignal(false);\n const [isHovered, setIsHovered] = createSignal(false);\n const [isValueHovered, setIsValueHovered] = createSignal(false);\n const [isValueEditable, setIsValueEditable] = createSignal(false);\n const [showInput, setShowInput] = createSignal(false);\n const [inputValue, setInputValue] = createSignal('');\n\n const fillPercent = motionValue(((props.value - min()) / (max() - min())) * 100);\n const rubberStretchPx = motionValue(0);\n const handleOpacityMv = motionValue(0);\n const handleScaleXMv = motionValue(0.25);\n const handleScaleYMv = motionValue(1);\n\n const applyFillStyles = (pct: number) => {\n if (fillRef) fillRef.style.width = `${pct}%`;\n if (handleRef) handleRef.style.left = `max(5px, calc(${pct}% - 9px))`;\n };\n\n const applyRubberStyles = (stretch: number) => {\n if (!trackRef) return;\n trackRef.style.width = `calc(100% + ${Math.abs(stretch)}px)`;\n trackRef.style.transform = `translateX(${stretch < 0 ? stretch : 0}px)`;\n };\n\n const applyHandleVisualStyles = () => {\n if (!handleRef) return;\n handleRef.style.opacity = String(handleOpacityMv.get());\n handleRef.style.transform = `translateY(-50%) scaleX(${handleScaleXMv.get()}) scaleY(${handleScaleYMv.get()})`;\n };\n\n // Sync fill from props when not interacting\n createEffect(() => {\n if (!isInteracting() && !snapAnim) {\n fillPercent.jump(((props.value - min()) / (max() - min())) * 100);\n }\n });\n\n const percentage = () => ((props.value - min()) / (max() - min())) * 100;\n const isActive = () => isInteracting() || isHovered();\n\n let pointerDownPos: { x: number; y: number } | null = null;\n let isClickFlag = true;\n let wrapperRect: DOMRect | null = null;\n let scaleVal = 1;\n let hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n let snapAnim: AnimationHandle | null = null;\n let rubberAnim: AnimationHandle | null = null;\n let handleOpacityAnim: AnimationHandle | null = null;\n let handleScaleXAnim: AnimationHandle | null = null;\n let handleScaleYAnim: AnimationHandle | null = null;\n\n const positionToValue = (clientX: number) => {\n if (!wrapperRect) return props.value;\n const screenX = clientX - wrapperRect.left;\n const sceneX = screenX / scaleVal;\n const nativeWidth = wrapperRef ? wrapperRef.offsetWidth : wrapperRect.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\n const percentFromValue = (v: number) => ((v - min()) / (max() - min())) * 100;\n\n const computeRubberStretch = (clientX: number, sign: number) => {\n if (!wrapperRect) return 0;\n const distancePast = sign < 0 ? wrapperRect.left - clientX : clientX - wrapperRect.right;\n const overflow = Math.max(0, distancePast - DEAD_ZONE);\n return sign * MAX_STRETCH * Math.sqrt(Math.min(overflow / MAX_CURSOR_RANGE, 1.0));\n };\n\n const cancelInteraction = () => {\n if (!isInteracting()) return;\n setIsInteracting(false);\n setIsDragging(false);\n rubberStretchPx.jump(0);\n pointerDownPos = null;\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (showInput()) return;\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n pointerDownPos = { x: e.clientX, y: e.clientY };\n isClickFlag = true;\n setIsInteracting(true);\n\n if (wrapperRef) {\n wrapperRect = wrapperRef.getBoundingClientRect();\n scaleVal = wrapperRect.width / wrapperRef.offsetWidth;\n }\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!isInteracting() || !pointerDownPos) return;\n\n const dx = e.clientX - pointerDownPos.x;\n const dy = e.clientY - pointerDownPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (isClickFlag && distance > CLICK_THRESHOLD) {\n isClickFlag = false;\n setIsDragging(true);\n }\n\n if (!isClickFlag) {\n if (wrapperRect) {\n if (e.clientX < wrapperRect.left) {\n rubberStretchPx.jump(computeRubberStretch(e.clientX, -1));\n } else if (e.clientX > wrapperRect.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 (snapAnim) { snapAnim.stop(); snapAnim = null; }\n fillPercent.jump(newPct);\n props.onChange(roundValue(newValue, step()));\n }\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n if (!isInteracting()) return;\n\n if (isClickFlag) {\n const rawValue = positionToValue(e.clientX);\n const discreteSteps = (max() - min()) / step();\n const snappedValue = discreteSteps <= 10\n ? Math.max(min(), Math.min(max(), min() + Math.round((rawValue - min()) / step()) * step()))\n : snapToDecile(rawValue, min(), max());\n\n const newPct = percentFromValue(snappedValue);\n\n if (snapAnim) snapAnim.stop();\n snapAnim = animate(fillPercent, newPct, {\n type: 'spring',\n stiffness: 300,\n damping: 25,\n mass: 0.8,\n onComplete: () => {\n snapAnim = null;\n },\n });\n\n props.onChange(roundValue(snappedValue, step()));\n }\n\n if (rubberStretchPx.get() !== 0) {\n if (rubberAnim) rubberAnim.stop();\n rubberAnim = 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 = null;\n };\n\n const handlePointerCancel = () => {\n cancelInteraction();\n };\n\n // Handle value hover delay — clear pending timer on each re-run\n createEffect(() => {\n const hovered = isValueHovered();\n const editing = showInput();\n const editable = isValueEditable();\n\n onCleanup(() => {\n if (hoverTimeout) { clearTimeout(hoverTimeout); hoverTimeout = null; }\n });\n\n if (hovered && !editing && !editable) {\n hoverTimeout = setTimeout(() => setIsValueEditable(true), 800);\n } else if (!hovered && !editing) {\n setIsValueEditable(false);\n }\n });\n\n onCleanup(() => {\n if (hoverTimeout) clearTimeout(hoverTimeout);\n snapAnim?.stop();\n rubberAnim?.stop();\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n });\n\n onMount(() => {\n const unsubFill = fillPercent.on('change', applyFillStyles);\n const unsubRubber = rubberStretchPx.on('change', applyRubberStyles);\n const unsubHandleOpacity = handleOpacityMv.on('change', applyHandleVisualStyles);\n const unsubHandleScaleX = handleScaleXMv.on('change', applyHandleVisualStyles);\n const unsubHandleScaleY = handleScaleYMv.on('change', applyHandleVisualStyles);\n applyFillStyles(fillPercent.get());\n applyRubberStyles(rubberStretchPx.get());\n applyHandleVisualStyles();\n\n onCleanup(() => {\n unsubFill();\n unsubRubber();\n unsubHandleOpacity();\n unsubHandleScaleX();\n unsubHandleScaleY();\n });\n });\n\n // Focus input when it appears\n createEffect(() => {\n if (showInput() && inputRef) {\n inputRef.focus();\n inputRef.select();\n }\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 props.onChange(roundValue(clamped, step()));\n }\n setShowInput(false);\n setIsValueHovered(false);\n setIsValueEditable(false);\n };\n\n const handleValueClick = (e: MouseEvent) => {\n if (isValueEditable()) {\n e.stopPropagation();\n e.preventDefault();\n setShowInput(true);\n setInputValue(props.value.toFixed(decimalsForStep(step())));\n }\n };\n\n const handleInputKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') handleInputSubmit();\n else if (e.key === 'Escape') {\n setShowInput(false);\n setIsValueHovered(false);\n }\n };\n\n const displayValue = () => props.value.toFixed(decimalsForStep(step()));\n\n // Value dodge: fade handle when it overlaps label or value text\n const HANDLE_BUFFER = 8;\n const LABEL_CSS_LEFT = 10;\n const VALUE_CSS_RIGHT = 10;\n\n const leftThreshold = () => {\n const trackWidth = wrapperRef?.offsetWidth;\n if (trackWidth && labelRef) {\n return ((LABEL_CSS_LEFT + labelRef.offsetWidth + HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 30;\n };\n\n const rightThreshold = () => {\n const trackWidth = wrapperRef?.offsetWidth;\n if (trackWidth && valueSpanRef) {\n return ((trackWidth - VALUE_CSS_RIGHT - valueSpanRef.offsetWidth - HANDLE_BUFFER) / trackWidth) * 100;\n }\n return 78;\n };\n\n const valueDodge = () => percentage() < leftThreshold() || percentage() > rightThreshold();\n\n const handleOpacity = () => {\n if (!isActive()) return 0;\n if (valueDodge()) return 0.1;\n if (isDragging()) return 0.9;\n return 0.5;\n };\n\n createEffect(() => {\n const targetOpacity = handleOpacity();\n const targetScaleX = isActive() ? 1 : 0.25;\n const targetScaleY = isActive() && valueDodge() ? 0.75 : 1;\n\n handleOpacityAnim?.stop();\n handleScaleXAnim?.stop();\n handleScaleYAnim?.stop();\n\n handleOpacityAnim = animate(handleOpacityMv, targetOpacity, { duration: 0.15 });\n handleScaleXAnim = animate(handleScaleXMv, targetScaleX, {\n type: 'spring',\n visualDuration: 0.25,\n bounce: 0.15,\n });\n handleScaleYAnim = animate(handleScaleYMv, targetScaleY, {\n type: 'spring',\n visualDuration: 0.2,\n bounce: 0.1,\n });\n });\n\n const discreteSteps = () => (max() - min()) / step();\n\n const hashMarks = () => {\n const ds = discreteSteps();\n if (ds <= 10) {\n return Array.from({ length: ds - 1 }, (_, i) => {\n const pct = ((i + 1) * step()) / (max() - min()) * 100;\n return <div class=\"dialkit-slider-hashmark\" style={{ left: `${pct}%` }} />;\n });\n }\n return Array.from({ length: 9 }, (_, i) => {\n const pct = (i + 1) * 10;\n return <div class=\"dialkit-slider-hashmark\" style={{ left: `${pct}%` }} />;\n });\n };\n\n return (\n <div ref={wrapperRef} class=\"dialkit-slider-wrapper\">\n <div\n ref={trackRef}\n class={`dialkit-slider ${isActive() ? 'dialkit-slider-active' : ''}`}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div class=\"dialkit-slider-hashmarks\">{hashMarks()}</div>\n\n <div\n ref={fillRef}\n class=\"dialkit-slider-fill\"\n style={{\n width: `${fillPercent.get()}%`,\n }}\n />\n\n <div\n ref={handleRef}\n class=\"dialkit-slider-handle\"\n style={{\n left: `max(5px, calc(${fillPercent.get()}% - 9px))`,\n transform: 'translateY(-50%) scaleX(0.25) scaleY(1)',\n opacity: 0,\n }}\n />\n\n <span ref={labelRef} class=\"dialkit-slider-label\">\n {props.label}\n <Show when={props.shortcut}>\n <span class={`dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatSliderShortcut(props.shortcut!)}\n </span>\n </Show>\n </span>\n\n {showInput() ? (\n <input\n ref={inputRef}\n type=\"text\"\n class=\"dialkit-slider-input\"\n value={inputValue()}\n onInput={(e) => setInputValue(e.currentTarget.value)}\n onKeyDown={handleInputKeyDown}\n onBlur={handleInputSubmit}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n />\n ) : (\n <span\n ref={valueSpanRef}\n class={`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 </div>\n </div>\n );\n}\n","import { Show } from 'solid-js';\nimport { SegmentedControl } from './SegmentedControl';\nimport type { ShortcutConfig } from '../../store/DialStore';\nimport { formatToggleShortcut } from '../../shortcut-utils';\n\ninterface ToggleProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n shortcut?: ShortcutConfig;\n shortcutActive?: boolean;\n}\n\nexport function Toggle(props: ToggleProps) {\n return (\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">\n {props.label}\n <Show when={props.shortcut}>\n <span class={`dialkit-shortcut-pill${props.shortcutActive ? ' dialkit-shortcut-pill-active' : ''}`}>\n {formatToggleShortcut(props.shortcut!)}\n </span>\n </Show>\n </span>\n <SegmentedControl\n options={[\n { value: 'off' as const, label: 'Off' },\n { value: 'on' as const, label: 'On' },\n ]}\n value={props.checked ? 'on' : 'off'}\n onChange={(val) => props.onChange(val === 'on')}\n />\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, For, Show } from 'solid-js';\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>(props: SegmentedControlProps<T>) {\n let containerRef: HTMLDivElement | undefined;\n const [pillStyle, setPillStyle] = createSignal<{ left: number; width: number } | null>(null);\n // The pill jumps into place on first paint, then animates on value changes.\n const [hasChanged, setHasChanged] = createSignal(false);\n\n const measure = () => {\n if (!containerRef) return;\n const activeButton = containerRef.querySelector('[data-active=\"true\"]') as HTMLElement | null;\n if (!activeButton) return;\n setPillStyle({\n left: activeButton.offsetLeft,\n width: activeButton.offsetWidth,\n });\n };\n\n createEffect(on(() => [props.value, props.options.length] as const, measure));\n\n createEffect(on(() => props.value, () => setHasChanged(true), { defer: true }));\n\n // Keep the pill aligned when the container itself resizes (e.g. panel width).\n onMount(() => {\n if (!containerRef) return;\n const ro = new ResizeObserver(measure);\n ro.observe(containerRef);\n onCleanup(() => ro.disconnect());\n });\n\n const transition = () => (\n hasChanged()\n ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'\n : 'none'\n );\n\n return (\n <div class=\"dialkit-segmented\" ref={containerRef}>\n <Show when={pillStyle()}>\n {(style) => (\n <div\n class=\"dialkit-segmented-pill\"\n style={{\n left: `${style().left}px`,\n width: `${style().width}px`,\n transition: transition(),\n }}\n />\n )}\n </Show>\n <For each={props.options}>\n {(option) => (\n <button\n onClick={() => props.onChange(option.value)}\n class=\"dialkit-segmented-button\"\n data-active={String(props.value === option.value)}\n >\n {option.label}\n </button>\n )}\n </For>\n </div>\n );\n}\n","import type { 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(props: SpringVisualizationProps) {\n const width = 256;\n const height = 140;\n\n const params = () => {\n let stiffness: number;\n let damping: number;\n let mass: number;\n\n if (props.isSimpleMode) {\n const visualDuration = props.spring.visualDuration ?? 0.3;\n const bounce = props.spring.bounce ?? 0.2;\n mass = 1;\n stiffness = Math.pow((2 * Math.PI) / visualDuration, 2);\n const dampingRatio = 1 - bounce;\n damping = 2 * dampingRatio * Math.sqrt(stiffness * mass);\n } else {\n stiffness = props.spring.stiffness ?? 400;\n damping = props.spring.damping ?? 17;\n mass = props.spring.mass ?? 1;\n }\n\n const duration = 2;\n const points = generateSpringCurve(stiffness, damping, mass, duration);\n const values = points.map(([, value]) => value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const valueRange = maxValue - minValue;\n\n 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 return pathData;\n };\n\n const gridLines = () => {\n const lines: ReturnType<typeof createLine>[] = [];\n for (let i = 1; i < 4; i++) {\n const x = (width / 4) * i;\n const y = (height / 4) * i;\n lines.push(\n createLine(x, 0, x, height),\n createLine(0, y, width, y),\n );\n }\n return lines;\n };\n\n function createLine(x1: number, y1: number, x2: number, y2: number) {\n return (\n <line x1={x1} y1={y1} x2={x2} y2={y2} stroke=\"rgba(255, 255, 255, 0.08)\" stroke-width=\"1\" />\n );\n }\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} class=\"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 stroke-width=\"1\"\n stroke-dasharray=\"4,4\"\n />\n <path\n d={params()}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n );\n}\n","import { DialStore } from '../../store/DialStore';\nimport type { SpringConfig } from '../../store/DialStore';\nimport { fromStore } from '../primitives';\nimport { Folder } from './Folder';\nimport { Slider } from './Slider';\nimport { SegmentedControl } from './SegmentedControl';\nimport { SpringVisualization } from './SpringVisualization';\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(props: SpringControlProps) {\n const mode = fromStore(\n () => DialStore.getSpringMode(props.panelId, props.path),\n (notify) => DialStore.subscribe(props.panelId, notify)\n );\n\n const isSimpleMode = () => mode() === 'simple';\n\n const cache: {\n simple: SpringConfig;\n advanced: SpringConfig;\n } = {\n simple: props.spring.visualDuration !== undefined ? props.spring : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: props.spring.stiffness !== undefined ? props.spring : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n };\n\n const handleModeChange = (newMode: 'simple' | 'advanced') => {\n // Save current mode's values before switching\n if (isSimpleMode()) {\n cache.simple = props.spring;\n } else {\n cache.advanced = props.spring;\n }\n\n DialStore.updateSpringMode(props.panelId, props.path, newMode);\n\n if (newMode === 'simple') {\n props.onChange(cache.simple);\n } else {\n props.onChange(cache.advanced);\n }\n };\n\n const handleUpdate = (key: keyof SpringConfig, value: number) => {\n if (isSimpleMode()) {\n const { stiffness, damping, mass, ...rest } = props.spring;\n props.onChange({ ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = props.spring;\n props.onChange({ ...rest, [key]: value });\n }\n };\n\n return (\n <Folder title={props.label} defaultOpen={true}>\n <div style={{ display: 'flex', 'flex-direction': 'column', gap: '6px' }}>\n <SpringVisualization spring={props.spring} isSimpleMode={isSimpleMode()} />\n\n <div class=\"dialkit-labeled-control\">\n <span class=\"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={props.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={props.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={props.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={props.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={props.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 { createSignal, Show } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from '../../store/DialStore';\nimport { fromStore } from '../primitives';\nimport { EasingVisualization } from './EasingVisualization';\nimport { Folder } from './Folder';\nimport { SegmentedControl } from './SegmentedControl';\nimport { Slider } from './Slider';\nimport { SpringVisualization } from './SpringVisualization';\n\nexport interface TransitionDurationControl {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\ninterface TransitionControlProps {\n panelId: string;\n path: string;\n label: string;\n value: TransitionConfig;\n onChange: (value: TransitionConfig) => void;\n hideDuration?: boolean;\n durationControl?: TransitionDurationControl;\n}\n\ntype CurveMode = 'easing' | 'simple' | 'advanced';\n\nexport function TransitionControl(props: TransitionControlProps) {\n const mode = fromStore(\n () => DialStore.getTransitionMode(props.panelId, props.path),\n (notify) => DialStore.subscribe(props.panelId, notify)\n );\n const [editingEase, setEditingEase] = createSignal(false);\n const [easeDraft, setEaseDraft] = createSignal('');\n const cache: { easing: EasingConfig; simple: SpringConfig; advanced: SpringConfig } = {\n easing: props.value.type === 'easing'\n ? props.value\n : { type: 'easing', duration: 0.3, ease: [1, -0.4, 0.5, 1] },\n simple: props.value.type === 'spring' && props.value.visualDuration !== undefined\n ? props.value\n : { type: 'spring', visualDuration: 0.3, bounce: 0.2 },\n advanced: props.value.type === 'spring' && props.value.stiffness !== undefined\n ? props.value\n : { type: 'spring', stiffness: 200, damping: 25, mass: 1 },\n };\n\n const isEasing = () => mode() === 'easing';\n const isSimple = () => mode() === 'simple';\n const spring = () => {\n if (props.value.type === 'spring') {\n if (isSimple()) cache.simple = props.value;\n else if (mode() === 'advanced') cache.advanced = props.value;\n return props.value;\n }\n return cache.simple;\n };\n const easing = () => {\n if (props.value.type === 'easing') {\n cache.easing = props.value;\n return props.value;\n }\n return cache.easing;\n };\n\n const handleModeChange = (next: CurveMode) => {\n DialStore.updateTransitionMode(props.panelId, props.path, next);\n props.onChange(next === 'easing' ? cache.easing : next === 'simple' ? cache.simple : cache.advanced);\n };\n\n const handleSpringUpdate = (key: keyof SpringConfig, value: number) => {\n const current = spring();\n if (isSimple()) {\n const { stiffness, damping, mass, ...rest } = current;\n props.onChange({ ...rest, [key]: value });\n } else {\n const { visualDuration, bounce, ...rest } = current;\n props.onChange({ ...rest, [key]: value });\n }\n };\n\n const updateEase = (index: number, value: number) => {\n const current = easing();\n const next = [...current.ease] as [number, number, number, number];\n next[index] = value;\n props.onChange({ ...current, ease: next });\n };\n\n const formatEase = (value: [number, number, number, number]) =>\n value.map((part) => Number(part.toFixed(2))).join(', ');\n const commitEase = () => {\n const parts = easeDraft().split(',').map((part) => Number.parseFloat(part.trim()));\n if (parts.length === 4 && parts.every(Number.isFinite)) {\n props.onChange({ ...easing(), ease: parts as [number, number, number, number] });\n }\n setEditingEase(false);\n };\n\n const durationSlider = () => {\n if (props.hideDuration || (!isEasing() && !isSimple())) return null;\n const external = props.durationControl;\n return (\n <Slider\n label=\"Duration\"\n value={external?.value ?? (isEasing() ? easing().duration : spring().visualDuration ?? 0.3)}\n onChange={external?.onChange ?? ((value) => {\n if (isEasing()) props.onChange({ ...easing(), duration: value });\n else handleSpringUpdate('visualDuration', value);\n })}\n min={external?.min ?? 0.1}\n max={external?.max ?? (isEasing() ? 2 : 1)}\n step={external?.step ?? 0.05}\n unit=\"s\"\n />\n );\n };\n\n return (\n <Folder title={props.label} defaultOpen={true}>\n <div style={{ display: 'flex', 'flex-direction': 'column', gap: '6px' }}>\n <Show when={isEasing()} fallback={<SpringVisualization spring={spring()} isSimpleMode={isSimple()} />}>\n <EasingVisualization easing={easing()} />\n </Show>\n\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">Type</span>\n <SegmentedControl\n options={[\n { value: 'easing', label: 'Easing' },\n { value: 'simple', label: 'Time' },\n { value: 'advanced', label: 'Physics' },\n ]}\n value={mode()}\n onChange={handleModeChange}\n />\n </div>\n\n <Show when={isEasing()}>\n <Slider label=\"x1\" value={easing().ease[0]} onChange={(value) => updateEase(0, value)} min={0} max={1} step={0.01} />\n <Slider label=\"y1\" value={easing().ease[1]} onChange={(value) => updateEase(1, value)} min={-1} max={2} step={0.01} />\n <Slider label=\"x2\" value={easing().ease[2]} onChange={(value) => updateEase(2, value)} min={0} max={1} step={0.01} />\n <Slider label=\"y2\" value={easing().ease[3]} onChange={(value) => updateEase(3, value)} min={-1} max={2} step={0.01} />\n <div class=\"dialkit-labeled-control\">\n <span class=\"dialkit-labeled-control-label\">Ease</span>\n <input\n type=\"text\"\n class=\"dialkit-text-input\"\n value={editingEase() ? easeDraft() : formatEase(easing().ease)}\n onInput={(event) => setEaseDraft(event.currentTarget.value)}\n onFocus={() => {\n setEaseDraft(formatEase(easing().ease));\n setEditingEase(true);\n }}\n onBlur={commitEase}\n onKeyDown={(event) => {\n if (event.key === 'Enter') event.currentTarget.blur();\n }}\n spellcheck={false}\n />\n </div>\n </Show>\n\n <Show when={isSimple()}>\n <Slider label=\"Bounce\" value={spring().bounce ?? 0.2} onChange={(value) => handleSpringUpdate('bounce', value)} min={0} max={1} step={0.05} />\n </Show>\n <Show when={!isEasing() && !isSimple()}>\n <Slider label=\"Stiffness\" value={spring().stiffness ?? 400} onChange={(value) => handleSpringUpdate('stiffness', value)} min={1} max={1000} step={10} />\n <Slider label=\"Damping\" value={spring().damping ?? 17} onChange={(value) => handleSpringUpdate('damping', value)} min={1} max={100} step={1} />\n <Slider label=\"Mass\" value={spring().mass ?? 1} onChange={(value) => handleSpringUpdate('mass', value)} min={0.1} max={10} step={0.1} />\n </Show>\n {durationSlider()}\n </div>\n </Folder>\n );\n}\n","import type { EasingConfig } from '../../store/DialStore';\n\nexport const easingPresets: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n};\n\nexport function EasingVisualization(props: { easing: EasingConfig }) {\n const size = 200;\n const pad = 10;\n const unit = (size - pad * 2) / 2;\n const toSvg = (x: number, y: number) => ({\n x: pad + (x + 0.5) * unit,\n y: pad + (1.5 - y) * unit,\n });\n const start = toSvg(0, 0);\n const end = toSvg(1, 1);\n const curvePath = () => {\n const [x1, y1, x2, y2] = props.easing.ease;\n const first = toSvg(x1, y1);\n const second = toSvg(x2, y2);\n return `M ${start.x} ${start.y} C ${first.x} ${first.y}, ${second.x} ${second.y}, ${end.x} ${end.y}`;\n };\n\n return (\n <svg\n viewBox={`0 0 ${size} ${size}`}\n preserveAspectRatio=\"xMidYMid slice\"\n class=\"dialkit-spring-viz dialkit-easing-viz\"\n >\n <line\n x1={start.x}\n y1={start.y}\n x2={end.x}\n y2={end.y}\n stroke=\"rgba(255, 255, 255, 0.15)\"\n stroke-width=\"1\"\n stroke-dasharray=\"4,4\"\n />\n <path\n d={curvePath()}\n fill=\"none\"\n stroke=\"rgba(255, 255, 255, 0.6)\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n );\n}\n","import { createUniqueId } from 'solid-js';\n\ninterface TextControlProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function TextControl(props: TextControlProps) {\n const inputId = createUniqueId();\n\n return (\n <div class=\"dialkit-text-control\">\n <label class=\"dialkit-text-label\" for={inputId}>{props.label}</label>\n <input\n id={inputId}\n type=\"text\"\n class=\"dialkit-text-input\"\n value={props.value}\n onInput={(e) => props.onChange(e.currentTarget.value)}\n placeholder={props.placeholder}\n />\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\nimport { ICON_CHEVRON } from '../../icons';\nimport { createDropdownDismiss, createDropdownPresence, type AnimationHandle } from '../primitives';\n\ntype SelectOption = string | { value: string; label: string };\n\ninterface SelectControlProps {\n label: string;\n value: string;\n options: SelectOption[];\n onChange: (value: string) => void;\n}\n\nfunction toTitleCase(s: string): string {\n return s.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction normalizeOptions(options: SelectOption[]): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt\n );\n}\n\nexport function SelectControl(props: SelectControlProps) {\n const [pos, setPos] = createSignal<{ top: number; left: number; width: number; above: boolean } | null>(null);\n const [portalTarget, setPortalTarget] = createSignal<HTMLElement | null>(null);\n let triggerRef!: HTMLButtonElement;\n let chevronRef!: SVGSVGElement;\n let chevronAnim: AnimationHandle | null = null;\n\n const normalized = () => normalizeOptions(props.options);\n const selectedOption = () => normalized().find((o) => o.value === props.value);\n\n const dropdown = createDropdownPresence((el, done) =>\n animate(\n el,\n { opacity: 0, y: (pos()?.above ?? false) ? 8 : -8, scale: 0.95 },\n { type: 'spring', visualDuration: 0.15, bounce: 0, onComplete: done }\n )\n );\n\n onMount(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef) ?? document.body);\n onCleanup(() => chevronAnim?.stop());\n });\n\n // Chevron renders at its resting angle; only animate on changes.\n createEffect(on(dropdown.isOpen, (open) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 180 : 0 },\n { type: 'spring', visualDuration: 0.2, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const updatePos = () => {\n const root = portalTarget();\n if (!triggerRef || !root) return;\n const dropdownHeight = 8 + normalized().length * 36;\n setPos(getDropdownPosition(triggerRef, root, { dropdownHeight }));\n };\n\n const openDropdown = () => {\n updatePos();\n dropdown.open();\n };\n\n createDropdownDismiss({\n isOpen: dropdown.isOpen,\n contains: (target) => triggerRef?.contains(target) || dropdown.contains(target),\n onDismiss: dropdown.close,\n onViewportChange: updatePos,\n });\n\n const dropdownStyle = () => {\n const p = pos();\n if (!p) return {};\n return {\n position: 'absolute' as const,\n left: `${p.left}px`,\n top: `${p.top}px`,\n width: `${p.width}px`,\n 'transform-origin': p.above ? 'bottom' : 'top',\n };\n };\n\n return (\n <div class=\"dialkit-select-row\">\n <button\n ref={triggerRef}\n class=\"dialkit-select-trigger\"\n onClick={() => dropdown.isOpen() ? dropdown.close() : openDropdown()}\n data-open={String(dropdown.isOpen())}\n >\n <span class=\"dialkit-select-label\">{props.label}</span>\n <div class=\"dialkit-select-right\">\n <span class=\"dialkit-select-value\">{selectedOption()?.label ?? props.value}</span>\n <svg\n ref={chevronRef}\n class=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </div>\n </button>\n\n <Show when={!!portalTarget()}>\n <Portal mount={portalTarget()!}>\n <Show when={dropdown.mounted() && pos()}>\n <div\n ref={(el) => {\n dropdown.setRef(el);\n const above = pos()?.above ?? false;\n animate(\n el,\n { opacity: [0, 1], y: [above ? 8 : -8, 0], scale: [0.95, 1] },\n { type: 'spring', visualDuration: 0.15, bounce: 0 }\n );\n }}\n class=\"dialkit-select-dropdown\"\n style={dropdownStyle()}\n >\n <For each={normalized()}>\n {(option) => (\n <button\n class=\"dialkit-select-option\"\n data-selected={String(option.value === props.value)}\n onClick={() => {\n props.onChange(option.value);\n dropdown.close();\n }}\n >\n {option.label}\n </button>\n )}\n </For>\n </div>\n </Show>\n </Portal>\n </Show>\n </div>\n );\n}\n","export type DropdownPosition = {\n top: number;\n left: number;\n width: number;\n above: boolean;\n};\n\nexport type DropdownPositionOptions = {\n dropdownHeight?: number;\n gap?: number;\n allowAbove?: boolean;\n};\n\nexport function getDropdownPosition(\n trigger: HTMLElement,\n portalRoot: HTMLElement,\n options: DropdownPositionOptions = {}\n): DropdownPosition {\n const { dropdownHeight = 0, gap = 4, allowAbove = true } = options;\n const triggerRect = trigger.getBoundingClientRect();\n const rootRect = portalRoot.getBoundingClientRect();\n const spaceBelow = window.innerHeight - triggerRect.bottom - gap;\n const above = allowAbove && spaceBelow < dropdownHeight && triggerRect.top > spaceBelow;\n\n return {\n top: above\n ? triggerRect.top - rootRect.top - dropdownHeight - gap\n : triggerRect.bottom - rootRect.top + gap,\n left: triggerRect.left - rootRect.left,\n width: triggerRect.width,\n above,\n };\n}\n\nexport function getDialKitPortalRoot(trigger: HTMLElement | null | undefined): HTMLElement | null {\n return (trigger?.closest('.dialkit-root') as HTMLElement | null) ?? null;\n}\n","import { createSignal, createEffect, createUniqueId, Show } from 'solid-js';\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\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\nexport function ColorControl(props: ColorControlProps) {\n const [isEditing, setIsEditing] = createSignal(false);\n const [editValue, setEditValue] = createSignal(props.value);\n const textInputId = createUniqueId();\n let colorInputRef!: HTMLInputElement;\n\n // Sync editValue when value changes externally\n createEffect(() => {\n if (!isEditing()) {\n setEditValue(props.value);\n }\n });\n\n const handleTextSubmit = () => {\n setIsEditing(false);\n if (HEX_COLOR_REGEX.test(editValue())) {\n props.onChange(editValue());\n } else {\n setEditValue(props.value);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter') handleTextSubmit();\n else if (e.key === 'Escape') {\n setIsEditing(false);\n setEditValue(props.value);\n }\n };\n\n return (\n <div class=\"dialkit-color-control\">\n <label class=\"dialkit-color-label\" for={textInputId}>{props.label}</label>\n <div class=\"dialkit-color-inputs\">\n <Show\n when={isEditing()}\n fallback={\n <span class=\"dialkit-color-hex\" onClick={() => setIsEditing(true)}>\n {(props.value ?? '').toUpperCase()}\n </span>\n }\n >\n <input\n id={textInputId}\n type=\"text\"\n class=\"dialkit-color-hex-input\"\n value={editValue()}\n onInput={(e) => setEditValue(e.currentTarget.value)}\n onBlur={handleTextSubmit}\n onKeyDown={handleKeyDown}\n autofocus\n />\n </Show>\n <button\n class=\"dialkit-color-swatch\"\n style={{ 'background-color': props.value }}\n onClick={() => colorInputRef?.click()}\n title=\"Pick color\"\n aria-label={`Pick color for ${props.label}`}\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n class=\"dialkit-color-picker-native\"\n aria-label={`${props.label} color picker`}\n value={props.value.length === 4 ? expandShorthandHex(props.value) : props.value.slice(0, 7)}\n onInput={(e) => props.onChange(e.currentTarget.value)}\n />\n </div>\n </div>\n );\n}\n","import { createSignal, createEffect, on, onMount, onCleanup, Show, For } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { animate } from 'motion';\nimport { ICON_CHEVRON, ICON_TRASH } from '../../icons';\nimport { getDialKitPortalRoot, getDropdownPosition } from '../../dropdown-position';\nimport { DialStore } from '../../store/DialStore';\nimport type { Preset } from '../../store/DialStore';\nimport { createDropdownDismiss, createDropdownPresence, type AnimationHandle } from '../primitives';\n\ninterface PresetManagerProps {\n panelId: string;\n presets: Preset[];\n activePresetId: string | null;\n onAdd: () => void;\n}\n\nexport function PresetManager(props: PresetManagerProps) {\n const [pos, setPos] = createSignal({ top: 0, left: 0, width: 0 });\n const [portalTarget, setPortalTarget] = createSignal<HTMLElement | null>(null);\n let triggerRef!: HTMLButtonElement;\n let chevronRef!: SVGSVGElement;\n let chevronAnim: AnimationHandle | null = null;\n\n const hasPresets = () => props.presets.length > 0;\n const activePreset = () => props.presets.find((p) => p.id === props.activePresetId);\n\n const dropdown = createDropdownPresence((el, done) =>\n animate(\n el,\n { opacity: 0, y: 4, scale: 0.97 },\n { type: 'spring', visualDuration: 0.15, bounce: 0, onComplete: done }\n )\n );\n\n onMount(() => {\n setPortalTarget(getDialKitPortalRoot(triggerRef) ?? document.body);\n onCleanup(() => chevronAnim?.stop());\n });\n\n // Renders at its resting state via inline style; animate on changes only.\n createEffect(on([dropdown.isOpen, hasPresets] as const, ([open, has]) => {\n if (!chevronRef) return;\n chevronAnim?.stop();\n chevronAnim = animate(\n chevronRef,\n { rotate: open ? 180 : 0, opacity: has ? 0.6 : 0.25 },\n { type: 'spring', visualDuration: 0.2, bounce: 0.15 }\n );\n }, { defer: true }));\n\n const updatePos = () => {\n const root = portalTarget();\n if (!triggerRef || !root) return;\n setPos(getDropdownPosition(triggerRef, root, { allowAbove: false }));\n };\n\n const openDropdown = () => {\n if (!hasPresets()) return;\n updatePos();\n dropdown.open();\n };\n\n const toggle = () => {\n if (dropdown.isOpen()) dropdown.close();\n else openDropdown();\n };\n\n createDropdownDismiss({\n isOpen: dropdown.isOpen,\n contains: (target) => triggerRef?.contains(target) || dropdown.contains(target),\n onDismiss: dropdown.close,\n onViewportChange: updatePos,\n });\n\n const handleSelect = (presetId: string | null) => {\n if (presetId) DialStore.loadPreset(props.panelId, presetId);\n else DialStore.clearActivePreset(props.panelId);\n dropdown.close();\n };\n\n const handleDelete = (e: MouseEvent, presetId: string) => {\n e.stopPropagation();\n DialStore.deletePreset(props.panelId, presetId);\n };\n\n return (\n <div class=\"dialkit-preset-manager\">\n <button\n ref={triggerRef}\n class=\"dialkit-preset-trigger\"\n onClick={toggle}\n data-open={String(dropdown.isOpen())}\n data-has-preset={String(!!activePreset())}\n data-disabled={String(!hasPresets())}\n >\n <span class=\"dialkit-preset-label\">\n {activePreset() ? activePreset()!.name : 'Version 1'}\n </span>\n <svg\n ref={chevronRef}\n class=\"dialkit-select-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style={{ opacity: hasPresets() ? 0.6 : 0.25 }}\n >\n <path d={ICON_CHEVRON} />\n </svg>\n </button>\n\n <Show when={!!portalTarget()}>\n <Portal mount={portalTarget()!}>\n <Show when={dropdown.mounted()}>\n <div\n ref={(el) => {\n dropdown.setRef(el);\n animate(\n el,\n { opacity: [0, 1], y: [4, 0], scale: [0.97, 1] },\n { type: 'spring', visualDuration: 0.15, bounce: 0 }\n );\n }}\n class=\"dialkit-root dialkit-preset-dropdown\"\n style={{\n position: 'absolute',\n top: `${pos().top}px`,\n left: `${pos().left}px`,\n 'min-width': `${pos().width}px`,\n }}\n >\n <div\n class=\"dialkit-preset-item\"\n data-active={String(!props.activePresetId)}\n onClick={() => handleSelect(null)}\n >\n <span class=\"dialkit-preset-name\">Version 1</span>\n </div>\n\n <For each={props.presets}>\n {(preset) => (\n <div\n class=\"dialkit-preset-item\"\n data-active={String(preset.id === props.activePresetId)}\n onClick={() => handleSelect(preset.id)}\n >\n <span class=\"dialkit-preset-name\">{preset.name}</span>\n <button\n class=\"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\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_TRASH[0]} />\n <path d={ICON_TRASH[1]} />\n <path d={ICON_TRASH[2]} />\n <path d={ICON_TRASH[3]} />\n <path d={ICON_TRASH[4]} />\n </svg>\n </button>\n </div>\n )}\n </For>\n </div>\n </Show>\n </Portal>\n </Show>\n </div>\n );\n}\n","import { For } from 'solid-js';\nimport { ICON_TIMELINE } from '../../../icons';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\nimport { fromStore } from '../../primitives';\n\nexport function TimelineToggleButton() {\n const visible = fromStore(\n () => TimelineUiStore.getVisible(),\n (notify) => TimelineUiStore.subscribe(notify)\n );\n const label = () => visible() ? 'Hide timeline' : 'Show timeline';\n return (\n <button\n class=\"dialkit-toolbar-add dialkit-timeline-toolbar-toggle\"\n data-active={visible() || undefined}\n aria-pressed={visible()}\n aria-label={label()}\n title={label()}\n onClick={() => TimelineUiStore.toggle()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <For each={ICON_TIMELINE}>{(path) => <path d={path} fill=\"currentColor\" />}</For>\n </svg>\n </button>\n );\n}\n","export type PanelDragOffset = {\n x: number;\n y: number;\n};\n\nexport type PanelDragStart = {\n pointerX: number;\n pointerY: number;\n elX: number;\n elY: number;\n};\n\nexport type PanelDragOriginX = 'left' | 'right';\n\nconst PANEL_DRAG_THRESHOLD = 8;\nconst COLLAPSED_PANEL_SIZE = 42;\n\nconst DRAG_EXCLUSION_SELECTOR = [\n '.dialkit-panel-icon',\n '.dialkit-panel-toolbar',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n '[role=\"button\"]',\n '[contenteditable=\"true\"]',\n].join(',');\n\nexport function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null {\n if (!(target instanceof Element) || !panel) return null;\n\n const inner = target.closest<HTMLElement>('.dialkit-panel-inner');\n if (!inner || !panel.contains(inner)) return null;\n\n if (inner.getAttribute('data-collapsed') === 'true') {\n return inner;\n }\n\n const header = target.closest<HTMLElement>('.dialkit-panel-header');\n if (!header || !inner.contains(header)) return null;\n\n if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;\n\n return header;\n}\n\nexport function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart {\n const rect = panel.getBoundingClientRect();\n return {\n pointerX,\n pointerY,\n elX: rect.left,\n elY: rect.top,\n };\n}\n\nexport function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset {\n return {\n x: start.elX + pointerX - start.pointerX,\n y: start.elY + pointerY - start.pointerY,\n };\n}\n\nexport function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean {\n const dx = pointerX - start.pointerX;\n const dy = pointerY - start.pointerY;\n return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;\n}\n\nexport function getPanelOriginX(\n position: string,\n offset: PanelDragOffset | null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : undefined\n): PanelDragOriginX {\n if (offset && viewportWidth) {\n return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? 'left' : 'right';\n }\n\n return position.endsWith('left') ? 'left' : 'right';\n}\n\nexport function blockPanelDragClick(handle: HTMLElement) {\n const blocker = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n handle.addEventListener('click', blocker, { capture: true, once: true });\n window.setTimeout(() => {\n handle.removeEventListener('click', blocker, true);\n }, 0);\n}\n","import {\n For,\n Show,\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n type JSX,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { DialStore, formatLabel } from '../../../store/DialStore';\nimport type { ControlMeta, DialValue } from '../../../store/DialStore';\nimport { TimelineStore } from '../../../store/TimelineStore';\nimport type { TimelineClipMeta, TimelineMeta } from '../../../store/TimelineStore';\nimport { TimelineUiStore } from '../../../store/TimelineUiStore';\nimport {\n TIMELINE_MIN_CLIP_DURATION,\n clampClipMove,\n clampClipResizeEnd,\n clampClipResizeStart,\n clampStepResize,\n clampTrackDelay,\n computeClipStaticFromValues,\n formatClock,\n formatSeconds,\n formatStepLabel,\n normalizeTimelineValuesForCopy,\n timelinePopoverDisplayValues,\n} from '../../../timeline-core';\nimport type { TimelineClipLoop, TimelineStepStatic } from '../../../timeline-core';\nimport { clamp } from '../../../transition-math';\nimport { buildCopyInstruction } from '../../../copy-instruction';\nimport { isDevDefault } from '../../../env';\nimport {\n ICON_ADD_PRESET,\n ICON_CHEVRON,\n ICON_CHECK,\n ICON_CLIPBOARD,\n ICON_PAUSE,\n ICON_PLAY,\n ICON_REPLAY,\n} from '../../../icons';\nimport { findControl } from '../../../shortcut-utils';\nimport { fromStore } from '../../primitives';\nimport { ControlRenderer } from '../ControlRenderer';\nimport { PresetManager } from '../PresetManager';\nimport type { DialTheme } from '../DialRoot';\n\nconst DRAG_THRESHOLD_PX = 3;\nconst MAJOR_TICK_TARGET_PX = 140;\nconst MILLISECOND_STEP = 0.001;\nconst SECOND_TICK_STEPS = [\n 0.001, 0.002, 0.005,\n 0.01, 0.02, 0.05,\n 0.1, 0.2, 0.5,\n 1, 2, 5, 10, 15, 30, 60, 120, 300, 600,\n];\nconst MIN_TIMELINE_MAX_ZOOM = 8;\nconst PLAYHEAD_FLAG_WIDTH = 52;\nconst PLAYHEAD_FLAG_EDGE_OVERHANG = 1;\nconst POPOVER_WIDTH = 280;\nconst ZOOM_DRAG_DISTANCE = 180;\nconst DEFAULT_DOCK_MAX_HEIGHT = 400;\nconst MIN_DOCK_MAX_HEIGHT = 120;\n\nexport interface DialTimelineProps {\n theme?: DialTheme;\n defaultVisible?: boolean;\n visible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n defaultOpen?: boolean;\n productionEnabled?: boolean;\n}\n\nexport function DialTimeline(props: DialTimelineProps) {\n const enabled = () => (props.productionEnabled ?? isDevDefault) !== false;\n return (\n <Show when={enabled()}>\n <DialTimelineDock {...props} />\n </Show>\n );\n}\n\nfunction DialTimelineDock(props: DialTimelineProps) {\n const timelines = fromStore(\n () => TimelineStore.getTimelines(),\n (notify) => TimelineStore.subscribeGlobal(notify)\n );\n const visible = fromStore(\n () => TimelineUiStore.getVisible(),\n (notify) => TimelineUiStore.subscribe(notify)\n );\n const [mounted, setMounted] = createSignal(false);\n const [dockMaxHeight, setDockMaxHeight] = createSignal(DEFAULT_DOCK_MAX_HEIGHT);\n const controllerId = Symbol('dialkit-timeline-visibility');\n let dockRef: HTMLDivElement | undefined;\n let resizeCleanup: (() => void) | null = null;\n\n onMount(() => {\n setMounted(true);\n const unregister = TimelineUiStore.registerController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible ?? true,\n onVisibilityChange: props.onVisibilityChange,\n });\n onCleanup(unregister);\n });\n\n createEffect(() => {\n TimelineUiStore.updateController(controllerId, {\n visible: props.visible,\n defaultVisible: props.defaultVisible ?? true,\n onVisibilityChange: props.onVisibilityChange,\n });\n });\n\n onCleanup(() => resizeCleanup?.());\n\n const handleResizePointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (!dockRef) return;\n event.preventDefault();\n event.stopPropagation();\n resizeCleanup?.();\n\n const pointerY = event.clientY;\n const startHeight = dockRef.getBoundingClientRect().height;\n const move = (next: PointerEvent) => {\n next.preventDefault();\n const viewportMax = Math.max(MIN_DOCK_MAX_HEIGHT, window.innerHeight - 24);\n setDockMaxHeight(clamp(startHeight + pointerY - next.clientY, MIN_DOCK_MAX_HEIGHT, viewportMax));\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n resizeCleanup = null;\n };\n\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n resizeCleanup = finish;\n };\n\n return (\n <Show when={mounted() && timelines().length > 0}>\n <Portal mount={document.body}>\n <div\n class=\"dialkit-root dialkit-timeline\"\n data-theme={props.theme ?? 'system'}\n hidden={!visible()}\n >\n <div\n class=\"dialkit-timeline-resize-handle\"\n onPointerDown={handleResizePointerDown}\n role=\"separator\"\n aria-label=\"Resize timeline height\"\n aria-orientation=\"horizontal\"\n title=\"Drag to resize timeline\"\n />\n <div\n ref={dockRef}\n class=\"dialkit-timeline-dock\"\n style={{ 'max-height': `min(${dockMaxHeight()}px, calc(100vh - 24px))` }}\n >\n <For each={timelines()}>\n {(timeline) => (\n <TimelineSection\n meta={timeline}\n defaultOpen={props.defaultOpen ?? true}\n theme={props.theme ?? 'system'}\n dockVisible={visible()}\n />\n )}\n </For>\n </div>\n </div>\n </Portal>\n </Show>\n );\n}\n\nfunction PlayPauseButton(props: { id: string }) {\n const playing = fromStore(\n () => TimelineStore.getTransport(props.id).playing,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n const label = () => playing() ? 'Pause' : 'Play';\n return (\n <button\n class=\"dialkit-toolbar-add\"\n onClick={() => playing() ? TimelineStore.pause(props.id) : TimelineStore.play(props.id)}\n title={label()}\n aria-label={label()}\n >\n <span style={{ position: 'relative', width: '16px', height: '16px' }}>\n <Show\n when={playing()}\n fallback={\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_PLAY} fill=\"currentColor\" />\n </svg>\n }\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <For each={ICON_PAUSE}>{(path) => <path d={path} fill=\"currentColor\" />}</For>\n </svg>\n </Show>\n </span>\n </button>\n );\n}\n\nfunction ReplayButton(props: { onReplay: () => void }) {\n return (\n <button\n class=\"dialkit-toolbar-add\"\n onClick={props.onReplay}\n title=\"Replay\"\n aria-label=\"Replay\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <For each={ICON_REPLAY}>{(path) => <path d={path} fill=\"currentColor\" />}</For>\n </svg>\n </button>\n );\n}\n\nconst iconStyle = {\n position: 'absolute',\n inset: '0',\n width: '16px',\n height: '16px',\n color: 'var(--dial-text-label)',\n} as const;\n\nfunction TimelineOverview(props: {\n id: string;\n duration: number;\n viewStart: number;\n viewEnd: number;\n onNavigate: (time: number) => void;\n}) {\n const time = fromStore(\n () => TimelineStore.getTransport(props.id).time,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n let scrub: { wasPlaying: boolean; rect: DOMRect } | null = null;\n\n const seekFromClientX = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0 || props.duration <= 0) return;\n const next = clamp(((clientX - scrub.rect.left) / scrub.rect.width) * props.duration, 0, props.duration);\n TimelineStore.seek(props.id, next);\n props.onNavigate(next);\n };\n const finish = () => {\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n };\n\n return (\n <div\n class=\"dialkit-timeline-overview\"\n onPointerDown={(event) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect: event.currentTarget.getBoundingClientRect(),\n };\n TimelineStore.pause(props.id);\n seekFromClientX(event.clientX);\n }}\n onPointerMove={(event) => scrub && seekFromClientX(event.clientX)}\n onPointerUp={finish}\n onPointerCancel={finish}\n onLostPointerCapture={finish}\n title=\"Drag to scrub the full timeline\"\n >\n <div\n class=\"dialkit-timeline-overview-viewport\"\n data-zoomed={(props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100) < 99.999 || undefined}\n style={{\n left: `${props.duration > 0 ? (props.viewStart / props.duration) * 100 : 0}%`,\n width: `${props.duration > 0 ? ((props.viewEnd - props.viewStart) / props.duration) * 100 : 100}%`,\n }}\n />\n <div\n class=\"dialkit-timeline-overview-progress\"\n style={{ width: `${props.duration > 0 ? (time() / props.duration) * 100 : 0}%` }}\n />\n <div\n class=\"dialkit-timeline-overview-playhead\"\n style={{ left: `${props.duration > 0 ? (time() / props.duration) * 100 : 0}%` }}\n />\n </div>\n );\n}\n\nfunction TimelinePlayheadFlag(props: {\n id: string;\n duration: number;\n pxPerSecond: number;\n viewStart: number;\n viewEnd: number;\n laneWidth: number;\n ruler: HTMLDivElement | undefined;\n onResetView: () => void;\n}) {\n const time = fromStore(\n () => TimelineStore.getTransport(props.id).time,\n (notify) => TimelineStore.subscribe(props.id, notify)\n );\n let scrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; viewEnd: number } | null = null;\n let cleanup: (() => void) | null = null;\n\n const seek = (clientX: number) => {\n if (!scrub || scrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.id,\n clamp(\n scrub.viewStart + ((clientX - scrub.rect.left) / scrub.rect.width) * (scrub.viewEnd - scrub.viewStart),\n scrub.viewStart,\n scrub.viewEnd\n )\n );\n };\n\n onCleanup(() => cleanup?.());\n\n const x = () => clamp((time() - props.viewStart) * props.pxPerSecond, 0, props.laneWidth);\n const flagCenter = () => clamp(\n x(),\n PLAYHEAD_FLAG_WIDTH / 2 - PLAYHEAD_FLAG_EDGE_OVERHANG,\n props.laneWidth - PLAYHEAD_FLAG_WIDTH / 2 + PLAYHEAD_FLAG_EDGE_OVERHANG\n );\n const flagOffset = () => flagCenter() - x();\n const edge = () => flagOffset() > 0.5 ? 'start' : flagOffset() < -0.5 ? 'end' : 'center';\n\n return (\n <Show when={time() >= props.viewStart && time() <= props.viewEnd && props.laneWidth > 0}>\n <div\n class=\"dialkit-timeline-playhead-control\"\n data-edge={edge()}\n style={{\n left: `calc(var(--dial-timeline-label-w) + ${x()}px)`,\n '--dial-timeline-playhead-flag-offset': `${flagOffset()}px`,\n }}\n onPointerDown={(event) => {\n const rect = props.ruler?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.stopPropagation();\n cleanup?.();\n const reset = event.shiftKey;\n scrub = {\n wasPlaying: TimelineStore.getTransport(props.id).playing,\n rect,\n viewStart: reset ? 0 : props.viewStart,\n viewEnd: reset ? props.duration : props.viewEnd,\n };\n if (reset) props.onResetView();\n TimelineStore.pause(props.id);\n seek(event.clientX);\n const move = (next: PointerEvent) => {\n next.preventDefault();\n seek(next.clientX);\n };\n const finish = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', finish);\n window.removeEventListener('pointercancel', finish);\n if (scrub?.wasPlaying) TimelineStore.play(props.id);\n scrub = null;\n cleanup = null;\n };\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', finish);\n window.addEventListener('pointercancel', finish);\n cleanup = finish;\n }}\n role=\"slider\"\n aria-label=\"Timeline current time\"\n aria-valuemin={0}\n aria-valuemax={props.duration}\n aria-valuenow={time()}\n title=\"Drag to scrub the timeline\"\n >\n <div class=\"dialkit-timeline-playhead-stem\" />\n <div class=\"dialkit-timeline-playhead-anchor\">\n <div class=\"dialkit-timeline-playhead-flag\">{time().toFixed(2)}</div>\n </div>\n </div>\n </Show>\n );\n}\n\ntype PopoverState = {\n clip: TimelineClipMeta;\n stepKey?: string;\n anchor: { left: number; top: number; right: number; bottom: number; width: number; height: number };\n};\n\ntype ZoomDragState = {\n pointerX: number;\n rect: DOMRect;\n zoom: number;\n viewStart: number;\n anchorRatio: number;\n anchorTime: number;\n moved: boolean;\n};\n\nfunction clampViewStart(start: number, duration: number, visibleDuration: number): number {\n return clamp(start, 0, Math.max(0, duration - visibleDuration));\n}\n\nfunction formatRulerSeconds(time: number, step: number): string {\n if (step >= 1 && Number.isInteger(time)) return formatClock(time);\n const decimals = Math.min(3, Math.max(1, Math.ceil(-Math.log10(step))));\n return `${time.toFixed(decimals)}s`;\n}\n\nfunction TimelineSection(props: {\n meta: TimelineMeta;\n defaultOpen: boolean;\n theme: DialTheme;\n dockVisible: boolean;\n}) {\n const [open, setOpen] = createSignal(props.defaultOpen);\n const [copied, setCopied] = createSignal(false);\n const [popover, setPopover] = createSignal<PopoverState | null>(null);\n const [collapsedGroups, setCollapsedGroups] = createSignal(new Set<string>());\n const [expandedTracks, setExpandedTracks] = createSignal(new Set<string>());\n const [zoom, setZoom] = createSignal(1);\n const [viewStart, setViewStart] = createSignal(0);\n const values = fromStore(\n () => DialStore.getValues(props.meta.id),\n (notify) => DialStore.subscribe(props.meta.id, notify)\n );\n const presets = () => {\n values();\n return DialStore.getPresets(props.meta.id);\n };\n const activePresetId = () => {\n values();\n return DialStore.getActivePresetId(props.meta.id);\n };\n let laneAreaRef: HTMLDivElement | undefined;\n let horizontalScrollRef: HTMLDivElement | undefined;\n const [laneWidth, setLaneWidth] = createSignal(0);\n\n createEffect(() => {\n if (!open() || !laneAreaRef) return;\n const measure = () => {\n if (laneAreaRef) setLaneWidth(laneAreaRef.getBoundingClientRect().width);\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(laneAreaRef);\n onCleanup(() => observer.disconnect());\n });\n\n const visibleDuration = () => props.meta.duration > 0 ? props.meta.duration / zoom() : props.meta.duration;\n const safeViewStart = () => clampViewStart(viewStart(), props.meta.duration, visibleDuration());\n const viewEnd = () => safeViewStart() + visibleDuration();\n const pxPerSecond = () => visibleDuration() > 0 && laneWidth() > 0 ? laneWidth() / visibleDuration() : 0;\n const maxZoom = () => Math.max(\n MIN_TIMELINE_MAX_ZOOM,\n laneWidth() > 0 && props.meta.duration > 0\n ? (MAJOR_TICK_TARGET_PX * props.meta.duration) / (MILLISECOND_STEP * 10 * laneWidth())\n : MIN_TIMELINE_MAX_ZOOM\n );\n\n createEffect(() => setZoom((current) => clamp(current, 1, maxZoom())));\n createEffect(() => setViewStart((current) => clampViewStart(current, props.meta.duration, props.meta.duration / zoom())));\n createEffect(() => {\n const scroller = horizontalScrollRef;\n const next = safeViewStart() * pxPerSecond();\n if (!scroller || pxPerSecond() <= 0) return;\n if (Math.abs(scroller.scrollLeft - next) > 0.5) scroller.scrollLeft = next;\n });\n createEffect(() => {\n if (!props.dockVisible) setPopover(null);\n });\n\n const centerViewAt = (time: number) => {\n if (zoom() <= 1 || props.meta.duration <= 0) return;\n const duration = props.meta.duration / zoom();\n setViewStart(clampViewStart(time - duration / 2, props.meta.duration, duration));\n };\n const resetView = () => {\n setZoom(1);\n setViewStart(0);\n };\n const handleReplay = () => {\n setViewStart(0);\n TimelineStore.replay(props.meta.id);\n };\n const handleHorizontalScroll: JSX.EventHandler<HTMLDivElement, Event> = (event) => {\n if (pxPerSecond() <= 0) return;\n setViewStart(clampViewStart(\n event.currentTarget.scrollLeft / pxPerSecond(),\n props.meta.duration,\n visibleDuration()\n ));\n };\n const handleTimelineWheel: JSX.EventHandler<HTMLDivElement, WheelEvent> = (event) => {\n if (!horizontalScrollRef || zoom() <= 1) return;\n const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY)\n ? event.deltaX\n : event.shiftKey\n ? event.deltaY\n : 0;\n if (delta === 0) return;\n event.preventDefault();\n horizontalScrollRef.scrollLeft += delta;\n };\n\n let zoomDrag: ZoomDragState | null = null;\n let rulerScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n let trackScrub: { wasPlaying: boolean; rect: DOMRect; viewStart: number; visibleDuration: number } | null = null;\n\n const seekRuler = (clientX: number) => {\n if (!rulerScrub || rulerScrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.meta.id,\n clamp(\n rulerScrub.viewStart + ((clientX - rulerScrub.rect.left) / rulerScrub.rect.width) * rulerScrub.visibleDuration,\n rulerScrub.viewStart,\n rulerScrub.viewStart + rulerScrub.visibleDuration\n )\n );\n };\n const seekTrack = (clientX: number) => {\n if (!trackScrub || trackScrub.rect.width <= 0) return;\n TimelineStore.seek(\n props.meta.id,\n clamp(\n trackScrub.viewStart + ((clientX - trackScrub.rect.left) / trackScrub.rect.width) * trackScrub.visibleDuration,\n trackScrub.viewStart,\n trackScrub.viewStart + trackScrub.visibleDuration\n )\n );\n };\n\n const handleRulerPointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n if (rect.width <= 0) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n if (!event.altKey) {\n const reset = event.shiftKey;\n rulerScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart(),\n visibleDuration: reset ? props.meta.duration : visibleDuration(),\n };\n if (reset) resetView();\n TimelineStore.pause(props.meta.id);\n seekRuler(event.clientX);\n return;\n }\n const ratio = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n zoomDrag = {\n pointerX: event.clientX,\n rect,\n zoom: zoom(),\n viewStart: safeViewStart(),\n anchorRatio: ratio,\n anchorTime: safeViewStart() + ratio * visibleDuration(),\n moved: false,\n };\n };\n\n const handleRulerPointerMove: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (rulerScrub) {\n seekRuler(event.clientX);\n return;\n }\n if (!zoomDrag || props.meta.duration <= 0) return;\n const dx = event.clientX - zoomDrag.pointerX;\n if (!zoomDrag.moved && Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n zoomDrag.moved = true;\n const nextZoom = clamp(zoomDrag.zoom * Math.exp(dx / ZOOM_DRAG_DISTANCE), 1, maxZoom());\n const nextDuration = props.meta.duration / nextZoom;\n setZoom(nextZoom);\n setViewStart(clampViewStart(\n zoomDrag.anchorTime - zoomDrag.anchorRatio * nextDuration,\n props.meta.duration,\n nextDuration\n ));\n };\n\n const finishRuler = () => {\n if (rulerScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n rulerScrub = null;\n zoomDrag = null;\n };\n\n const handleTrackPointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n const target = event.target as HTMLElement;\n if (target.closest('.dialkit-timeline-label, button')) return;\n if (!event.shiftKey && target.closest('.dialkit-timeline-clip')) return;\n const rect = laneAreaRef?.getBoundingClientRect();\n if (!rect) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n const reset = event.shiftKey;\n trackScrub = {\n wasPlaying: TimelineStore.getTransport(props.meta.id).playing,\n rect,\n viewStart: reset ? 0 : safeViewStart(),\n visibleDuration: reset ? props.meta.duration : visibleDuration(),\n };\n if (reset) resetView();\n setPopover(null);\n TimelineStore.pause(props.meta.id);\n seekTrack(event.clientX);\n };\n const finishTrack = () => {\n if (trackScrub?.wasPlaying) TimelineStore.play(props.meta.id);\n trackScrub = null;\n };\n\n const handleCopy = () => {\n const normalized = normalizeTimelineValuesForCopy(DialStore.getValues(props.meta.id), props.meta.clips);\n void navigator.clipboard.writeText(buildCopyInstruction('createDialTimeline', props.meta.name, normalized));\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1500);\n };\n const handleAddPreset = () => {\n DialStore.savePreset(props.meta.id, `Version ${presets().length + 2}`);\n };\n const closePopover = () => setPopover(null);\n\n const openClipPopover = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n if (getClipControls(props.meta.id, targetPath, stepKey ? undefined : clipPopoverExclusions(clip)).length === 0) return;\n setPopover((previous) => previous?.clip.key === clip.key && previous.stepKey === stepKey\n ? null\n : {\n clip,\n stepKey,\n anchor: {\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n },\n });\n };\n const toggleSet = (setter: typeof setExpandedTracks, key: string) => {\n setter((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n const toggleTracks = (key: string) => toggleSet(setExpandedTracks, key);\n const toggleGroup = (key: string) => toggleSet(setCollapsedGroups, key);\n const handleBarClick = (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => {\n if (!stepKey && clip.tracks?.length) toggleTracks(clip.key);\n else openClipPopover(clip, rect, stepKey);\n };\n\n const ticks = createMemo(() => {\n const rawStep = pxPerSecond() > 0 ? MAJOR_TICK_TARGET_PX / pxPerSecond() : 1;\n const adaptive = SECOND_TICK_STEPS.find((step) => step >= rawStep) ?? SECOND_TICK_STEPS[SECOND_TICK_STEPS.length - 1];\n const majorStep = zoom() < 1.5 && props.meta.duration >= 1 ? Math.max(1, adaptive) : adaptive;\n const fineStep = majorStep / 10;\n const major: number[] = [];\n const medium: number[] = [];\n const fine: number[] = [];\n const firstMajor = Math.ceil((safeViewStart() - 1e-6) / majorStep) * majorStep;\n for (let time = firstMajor; time <= viewEnd() + 1e-6; time += majorStep) {\n major.push(Number(time.toFixed(4)));\n }\n const firstFine = Math.ceil((safeViewStart() - 1e-6) / fineStep);\n const lastFine = Math.floor((viewEnd() + 1e-6) / fineStep);\n for (let index = firstFine; index <= lastFine; index++) {\n if (index % 10 === 0) continue;\n const tick = Number((index * fineStep).toFixed(6));\n if (index % 5 === 0) medium.push(tick);\n else fine.push(tick);\n }\n return { major, medium, fine, majorStep };\n });\n\n const rows = createMemo<JSX.Element[]>(() => {\n const result: JSX.Element[] = [];\n let lastGroup: string | undefined;\n const currentValues = values();\n for (const clip of props.meta.clips) {\n if (clip.group !== lastGroup) {\n lastGroup = clip.group;\n if (clip.group) {\n const group = clip.group;\n const collapsed = collapsedGroups().has(group);\n result.push(\n <div class=\"dialkit-timeline-row dialkit-timeline-group-row\">\n <div class=\"dialkit-timeline-label\">\n <button\n class=\"dialkit-timeline-group-toggle\"\n data-open={!collapsed}\n onClick={() => toggleGroup(group)}\n title={collapsed ? 'Expand layer' : 'Collapse layer'}\n >\n <ChevronIcon />\n </button>\n <span>{formatLabel(group)}</span>\n </div>\n <div class=\"dialkit-timeline-lane\" />\n </div>\n );\n }\n }\n if (clip.group && collapsedGroups().has(clip.group)) continue;\n const isProps = Boolean(clip.tracks?.length);\n const tracksOpen = isProps && expandedTracks().has(clip.key);\n const stat = computeClipStaticFromValues(currentValues, clip, props.meta.duration);\n const selected = popover()?.clip.key === clip.key;\n result.push(\n <div class=\"dialkit-timeline-row\" data-grouped={clip.group ? '' : undefined}>\n <div class=\"dialkit-timeline-label\">\n <Show when={isProps}>\n <button\n class=\"dialkit-timeline-group-toggle\"\n data-open={tracksOpen}\n onClick={(event) => {\n event.stopPropagation();\n toggleTracks(clip.key);\n }}\n title={tracksOpen ? 'Collapse properties' : 'Expand properties'}\n >\n <ChevronIcon />\n </button>\n </Show>\n {clip.label}\n </div>\n <div class=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={props.meta.id}\n clip={clip}\n at={stat.at}\n duration={stat.duration}\n loop={stat.loop}\n steps={clip.stepKeys?.length ? stat.tracks[0]?.steps : undefined}\n fixedDuration={isProps ? true : stat.isPhysics}\n composite={isProps}\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n timelineDuration={props.meta.duration}\n selected={selected}\n selectedStepKey={selected ? popover()?.stepKey : undefined}\n onClick={handleBarClick}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n if (!tracksOpen) continue;\n for (const trackRef of clip.tracks ?? []) {\n const track = stat.tracks.find((candidate) => candidate.prop === trackRef.prop);\n if (!track) continue;\n const trackKey = `${clip.key}.${trackRef.prop}`;\n const trackMeta: TimelineClipMeta = {\n key: trackKey,\n label: `${clip.label} · ${formatLabel(trackRef.prop)}`,\n color: clip.color,\n loop: clip.loop,\n group: clip.group,\n stepKeys: trackRef.stepKeys,\n };\n const trackSelected = popover()?.clip.key === trackKey;\n result.push(\n <div class=\"dialkit-timeline-row dialkit-timeline-track-row\" data-grouped={clip.group ? '' : undefined}>\n <div class=\"dialkit-timeline-label\">{formatLabel(trackRef.prop)}</div>\n <div class=\"dialkit-timeline-lane\">\n <TimelineClip\n timelineId={props.meta.id}\n clip={trackMeta}\n at={stat.at + track.delay}\n duration={track.duration}\n loop={stat.loop}\n steps={trackRef.stepKeys?.length ? track.steps : undefined}\n fixedDuration={!trackRef.stepKeys?.length && track.steps[0]?.isPhysics === true}\n baseAt={stat.at}\n delayMode\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n timelineDuration={props.meta.duration}\n selected={trackSelected}\n selectedStepKey={trackSelected ? popover()?.stepKey : undefined}\n onClick={openClipPopover}\n onDrag={closePopover}\n />\n </div>\n </div>\n );\n }\n }\n return result;\n });\n\n return (\n <div class=\"dialkit-timeline-section\">\n <div class=\"dialkit-timeline-header\" data-open={open() || undefined}>\n <div class=\"dialkit-timeline-identity\">\n <span class=\"dialkit-timeline-title\">{props.meta.name}</span>\n </div>\n <Show when={!open()}>\n <TimelineOverview\n id={props.meta.id}\n duration={props.meta.duration}\n viewStart={safeViewStart()}\n viewEnd={viewEnd()}\n onNavigate={centerViewAt}\n />\n </Show>\n <div class=\"dialkit-timeline-actions\">\n <PlayPauseButton id={props.meta.id} />\n <ReplayButton onReplay={handleReplay} />\n <button class=\"dialkit-toolbar-add\" onClick={handleAddPreset} title=\"Add timeline version\" aria-label=\"Add timeline version\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <For each={ICON_ADD_PRESET}>{(path) => <path d={path} />}</For>\n </svg>\n </button>\n <PresetManager\n panelId={props.meta.id}\n presets={presets()}\n activePresetId={activePresetId()}\n onAdd={handleAddPreset}\n />\n <button\n class=\"dialkit-toolbar-add\"\n onClick={handleCopy}\n title=\"Copy parameters\"\n aria-label={copied() ? 'Copied parameters' : 'Copy parameters'}\n >\n <span style={{ position: 'relative', width: '16px', height: '16px' }}>\n <Show\n when={copied()}\n fallback={\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_CLIPBOARD.board} stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n <path d={ICON_CLIPBOARD.sparkle} fill=\"currentColor\" />\n <path d={ICON_CLIPBOARD.body} stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" style={iconStyle}>\n <path d={ICON_CHECK} />\n </svg>\n </Show>\n </span>\n </button>\n <button\n class=\"dialkit-timeline-chevron\"\n data-open={open()}\n aria-expanded={open()}\n onClick={() => setOpen((current) => !current)}\n title={open() ? 'Collapse timeline' : 'Expand timeline'}\n >\n <ChevronIcon />\n </button>\n </div>\n </div>\n\n <Show when={open()}>\n <div\n class=\"dialkit-timeline-body\"\n onWheel={handleTimelineWheel}\n onPointerDown={handleTrackPointerDown}\n onPointerMove={(event) => trackScrub && seekTrack(event.clientX)}\n onPointerUp={finishTrack}\n onPointerCancel={finishTrack}\n onLostPointerCapture={finishTrack}\n >\n <div class=\"dialkit-timeline-grid\">\n <div class=\"dialkit-timeline-row dialkit-timeline-ruler-row\">\n <div class=\"dialkit-timeline-label\" />\n <div\n ref={laneAreaRef}\n class=\"dialkit-timeline-ruler\"\n onPointerDown={handleRulerPointerDown}\n onPointerMove={handleRulerPointerMove}\n onPointerUp={finishRuler}\n onPointerCancel={finishRuler}\n onLostPointerCapture={finishRuler}\n title=\"Drag to seek · Option-drag to zoom · Shift-drag to reset zoom\"\n >\n <For each={ticks().fine}>{(time) => <div class=\"dialkit-timeline-tick dialkit-timeline-tick-fine\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }} />}</For>\n <For each={ticks().medium}>{(time) => <div class=\"dialkit-timeline-tick dialkit-timeline-tick-medium\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }} />}</For>\n <For each={ticks().major}>{(time) => (\n <div class=\"dialkit-timeline-tick\" style={{ left: `${(time - safeViewStart()) * pxPerSecond()}px` }}>\n <span class=\"dialkit-timeline-tick-label\">{formatRulerSeconds(time, ticks().majorStep)}</span>\n </div>\n )}</For>\n </div>\n </div>\n {rows()}\n <Show when={pxPerSecond() > 0}>\n <TimelinePlayheadFlag\n id={props.meta.id}\n duration={props.meta.duration}\n pxPerSecond={pxPerSecond()}\n viewStart={safeViewStart()}\n viewEnd={viewEnd()}\n laneWidth={laneWidth()}\n ruler={laneAreaRef}\n onResetView={resetView}\n />\n </Show>\n </div>\n <Show when={zoom() > 1}>\n <div class=\"dialkit-timeline-scroll-row\">\n <div class=\"dialkit-timeline-label\" />\n <div\n ref={horizontalScrollRef}\n class=\"dialkit-timeline-horizontal-scroll\"\n onScroll={handleHorizontalScroll}\n aria-label=\"Timeline horizontal scroll\"\n >\n <div style={{ width: `${laneWidth() * zoom()}px` }} />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n <Show when={popover()}>\n {(current) => (\n <ClipPopover\n panelId={props.meta.id}\n popover={current()}\n values={values()}\n theme={props.theme}\n onClose={closePopover}\n />\n )}\n </Show>\n </div>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d={ICON_CHEVRON} />\n </svg>\n );\n}\n\nfunction ClipPopover(props: {\n panelId: string;\n popover: PopoverState;\n values: Record<string, DialValue>;\n theme: DialTheme;\n onClose: () => void;\n}) {\n let ref: HTMLDivElement | undefined;\n const [naturalHeight, setNaturalHeight] = createSignal(0);\n const [viewport, setViewport] = createSignal(readViewport());\n\n onMount(() => {\n const measure = () => ref && setNaturalHeight(ref.scrollHeight + 2);\n measure();\n const observer = new ResizeObserver(measure);\n if (ref) observer.observe(ref.querySelector('.dialkit-timeline-popover-body') ?? ref);\n const updateViewport = () => setViewport(readViewport());\n const outside = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n if (ref?.contains(target) || target.closest?.('.dialkit-timeline-clip') || target.closest?.('.dialkit-timeline-label')) return;\n props.onClose();\n };\n const keydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') props.onClose();\n };\n window.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n window.visualViewport?.addEventListener('scroll', updateViewport);\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', keydown);\n onCleanup(() => {\n observer.disconnect();\n window.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n window.visualViewport?.removeEventListener('scroll', updateViewport);\n document.removeEventListener('pointerdown', outside, true);\n document.removeEventListener('keydown', keydown);\n });\n });\n\n const presentation = createMemo(() => {\n const { clip, stepKey } = props.popover;\n let controls: ControlMeta[];\n let title: string;\n if (stepKey) {\n controls = getClipControls(props.panelId, `${clip.key}.${stepKey}`);\n if (stepKey === clip.stepKeys?.[0]) {\n const from = getControlAt(props.panelId, `${clip.key}.from`);\n if (from) {\n const target = `${clip.key}.${stepKey}.to`;\n const index = controls.findIndex((control) => control.path === target);\n controls = index >= 0\n ? [...controls.slice(0, index), from, ...controls.slice(index)]\n : [...controls, from];\n }\n }\n title = `${clip.label} · ${formatStepLabel(stepKey)}`;\n } else {\n controls = getClipControls(props.panelId, clip.key, clipPopoverExclusions(clip));\n title = clip.label;\n }\n const targetPath = stepKey ? `${clip.key}.${stepKey}` : clip.key;\n const durationMeta = getControlAt(props.panelId, `${targetPath}.duration`);\n const durationValue = durationMeta ? props.values[durationMeta.path] : undefined;\n const transitionDuration = durationMeta?.type === 'slider' && typeof durationValue === 'number'\n ? {\n value: durationValue,\n onChange: (next: number) => DialStore.updateValue(props.panelId, durationMeta.path, next),\n min: Math.max(TIMELINE_MIN_CLIP_DURATION, durationMeta.min ?? 0),\n max: durationMeta.max,\n step: durationMeta.step,\n }\n : undefined;\n return {\n controls,\n title,\n transitionDuration,\n displayValues: timelinePopoverDisplayValues(props.values, clip.key, clip.stepKeys, stepKey),\n };\n });\n\n const position = createMemo(() => {\n const current = viewport();\n const right = current.offsetLeft + current.width;\n const bottom = current.offsetTop + current.height;\n const width = Math.min(POPOVER_WIDTH, Math.max(220, current.width - 24));\n const left = clamp(\n props.popover.anchor.left + props.popover.anchor.width / 2 - width / 2,\n current.offsetLeft + 12,\n Math.max(current.offsetLeft + 12, right - width - 12)\n );\n const above = Math.max(0, props.popover.anchor.top - current.offsetTop - 22);\n const below = Math.max(0, bottom - props.popover.anchor.bottom - 22);\n const placeAbove = naturalHeight() === 0\n ? above >= below\n : naturalHeight() <= above || (naturalHeight() > below && above >= below);\n const availableHeight = placeAbove ? above : below;\n const renderedHeight = Math.min(naturalHeight() || availableHeight, availableHeight);\n const rawTop = placeAbove\n ? props.popover.anchor.top - 10 - renderedHeight\n : props.popover.anchor.bottom + 10;\n return {\n width,\n left,\n top: clamp(rawTop, current.offsetTop + 12, Math.max(current.offsetTop + 12, bottom - renderedHeight - 12)),\n availableHeight,\n placeAbove,\n };\n });\n\n return (\n <Show when={presentation().controls.length > 0}>\n <Portal mount={document.body}>\n <div class=\"dialkit-root\" data-theme={props.theme}>\n <div\n ref={ref}\n class=\"dialkit-timeline-popover\"\n data-placement={position().placeAbove ? 'above' : 'below'}\n style={{\n left: `${position().left}px`,\n top: `${position().top}px`,\n width: `${position().width}px`,\n 'max-height': `${position().availableHeight}px`,\n visibility: naturalHeight() > 0 ? 'visible' : 'hidden',\n }}\n role=\"dialog\"\n aria-label={`Edit ${presentation().title}`}\n >\n <div class=\"dialkit-timeline-popover-header\">\n <span class=\"dialkit-timeline-popover-title\">{presentation().title}</span>\n <button class=\"dialkit-timeline-popover-close\" onClick={props.onClose} title=\"Close editor\" aria-label=\"Close editor\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M6 6L18 18M18 6L6 18\" />\n </svg>\n </button>\n </div>\n <div class=\"dialkit-timeline-popover-body\">\n <ControlRenderer\n panelId={props.panelId}\n controls={presentation().controls}\n values={presentation().displayValues}\n transitionDuration={presentation().transitionDuration}\n />\n </div>\n </div>\n </div>\n </Portal>\n </Show>\n );\n}\n\nfunction readViewport() {\n return {\n width: window.visualViewport?.width ?? window.innerWidth,\n height: window.visualViewport?.height ?? window.innerHeight,\n offsetLeft: window.visualViewport?.offsetLeft ?? 0,\n offsetTop: window.visualViewport?.offsetTop ?? 0,\n };\n}\n\nfunction clipPopoverExclusions(clip: TimelineClipMeta): Set<string> {\n return new Set([...(clip.stepKeys ?? []), ...(clip.tracks?.map((track) => track.prop) ?? [])]);\n}\n\nfunction getClipControls(panelId: string, path: string, exclusions?: Set<string>): ControlMeta[] {\n const panel = DialStore.getPanel(panelId);\n const folder = panel ? findControl(panel.controls, path) : null;\n if (!folder?.children) return [];\n return folder.children.filter((control) => {\n const key = control.path.slice(path.length + 1);\n return key !== 'at' && key !== 'duration' && !exclusions?.has(key);\n });\n}\n\nfunction getControlAt(panelId: string, path: string): ControlMeta | null {\n const panel = DialStore.getPanel(panelId);\n return panel ? findControl(panel.controls, path) : null;\n}\n\ntype DragState = {\n mode: 'move' | 'start' | 'end' | 'boundary';\n boundaryIndex?: number;\n pointerX: number;\n at: number;\n duration: number;\n stepDurations?: number[];\n clickEl: HTMLElement | null;\n moved: boolean;\n};\n\nfunction TimelineClip(props: {\n timelineId: string;\n clip: TimelineClipMeta;\n at: number;\n duration: number;\n loop: TimelineClipLoop;\n steps?: TimelineStepStatic[];\n fixedDuration: boolean;\n composite?: boolean;\n baseAt?: number;\n delayMode?: boolean;\n pxPerSecond: number;\n viewStart: number;\n timelineDuration: number;\n selected: boolean;\n selectedStepKey?: string;\n onClick: (clip: TimelineClipMeta, rect: DOMRect, stepKey?: string) => void;\n onDrag: () => void;\n}) {\n let drag: DragState | null = null;\n const [dragging, setDragging] = createSignal(false);\n const isSteps = () => Boolean(props.steps?.length);\n\n const handlePointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (event.shiftKey) return;\n event.stopPropagation();\n const target = event.target as HTMLElement;\n let mode: DragState['mode'] = 'move';\n let boundaryIndex: number | undefined;\n if (target.dataset.boundary !== undefined) {\n mode = 'boundary';\n boundaryIndex = Number(target.dataset.boundary);\n } else if (!props.fixedDuration) {\n const edge = target.dataset.edge as 'start' | 'end' | undefined;\n if (edge) mode = edge;\n }\n drag = {\n mode,\n boundaryIndex,\n pointerX: event.clientX,\n at: props.at,\n duration: props.duration,\n stepDurations: props.steps?.map((step) => step.duration),\n clickEl: target.closest?.('[data-step]'),\n moved: false,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (!drag || props.pxPerSecond <= 0) return;\n const dx = event.clientX - drag.pointerX;\n if (!drag.moved) {\n if (Math.abs(dx) <= DRAG_THRESHOLD_PX) return;\n drag.moved = true;\n setDragging(true);\n props.onDrag();\n }\n const dt = dx / props.pxPerSecond;\n const baseAt = props.baseAt ?? 0;\n if (drag.mode === 'boundary' && props.steps && drag.stepDurations) {\n const index = drag.boundaryIndex ?? 0;\n const others = drag.stepDurations.reduce((sum, duration, stepIndex) => stepIndex === index ? sum : sum + duration, 0);\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.${props.steps[index].key ?? ''}.duration`,\n clampStepResize(drag.stepDurations[index] + dt, drag.at, others, props.timelineDuration)\n );\n } else if (drag.mode === 'move') {\n if (props.delayMode) {\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.delay`,\n clampTrackDelay(drag.at + dt - baseAt, baseAt, drag.duration, props.timelineDuration)\n );\n } else {\n DialStore.updateValue(props.timelineId, `${props.clip.key}.at`, clampClipMove(drag.at + dt, drag.duration, props.timelineDuration));\n }\n } else if (drag.mode === 'end') {\n DialStore.updateValue(\n props.timelineId,\n `${props.clip.key}.duration`,\n clampClipResizeEnd(drag.duration + dt, drag.at, props.timelineDuration)\n );\n } else if (props.steps && drag.stepDurations) {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(baseAt, 0)), drag.at, drag.stepDurations[0]);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${props.clip.key}.${props.steps[0].key ?? ''}.duration`]: next.duration,\n });\n } else {\n const next = clampClipResizeStart(Math.max(drag.at + dt, Math.max(baseAt, 0)), drag.at, drag.duration);\n DialStore.updateValues(props.timelineId, {\n [props.delayMode ? `${props.clip.key}.delay` : `${props.clip.key}.at`]: props.delayMode ? Math.max(0, next.at - baseAt) : next.at,\n [`${props.clip.key}.duration`]: next.duration,\n });\n }\n };\n\n const finish = (event?: PointerEvent & { currentTarget: HTMLDivElement }) => {\n const previous = drag;\n drag = null;\n setDragging(false);\n if (previous && !previous.moved && event) {\n const anchor = previous.clickEl ?? event.currentTarget;\n props.onClick(props.clip, anchor.getBoundingClientRect(), previous.clickEl?.dataset.step);\n }\n };\n\n const ghostCycles = createMemo(() => {\n const cycles: Array<{ start: number; duration: number; index: number }> = [];\n if (props.loop !== 'repeat' || props.duration <= 0) return cycles;\n const first = Math.max(1, Math.floor((props.viewStart - props.at) / props.duration));\n for (let offset = 0; offset < 256; offset++) {\n const index = first + offset;\n const start = props.at + props.duration * index;\n if (start >= props.timelineDuration - 1e-6) break;\n cycles.push({ start, duration: Math.min(props.duration, props.timelineDuration - start), index });\n }\n return cycles;\n });\n const boundaries = createMemo(() => {\n let total = 0;\n return props.steps?.map((step) => (total += step.duration)) ?? [];\n });\n const width = () => Math.max(props.duration * props.pxPerSecond, 14);\n const resizable = () => props.duration > 0 && !props.fixedDuration && !props.composite;\n const durationText = () => `${props.fixedDuration && !props.composite ? '~' : ''}${formatSeconds(props.duration)}`;\n const looping = () => props.loop === 'repeat' && props.duration > 0;\n const title = () => props.composite\n ? `${props.clip.label} — composite of its property tracks${looping() ? ' · repeats through timeline' : ''} · click to expand`\n : `${props.clip.label} — ${formatSeconds(props.at)} for ${durationText()}${props.fixedDuration ? ' (duration set by spring physics)' : ''}${looping() ? ' · repeats through timeline' : ''}${props.delayMode ? ' · drag to phase-shift' : ''}`;\n\n return (\n <>\n <For each={ghostCycles()}>{(cycle) => (\n <div\n class=\"dialkit-timeline-clip-ghost\"\n data-steps={isSteps() || undefined}\n aria-hidden=\"true\"\n style={{\n left: `${(cycle.start - props.viewStart) * props.pxPerSecond + 1}px`,\n width: `${Math.max(1, cycle.duration * props.pxPerSecond - 2)}px`,\n background: props.clip.color,\n }}\n >\n <For each={props.steps}>{(step) => <span class=\"dialkit-timeline-clip-ghost-segment\" style={{ width: `${step.duration * props.pxPerSecond}px` }} />}</For>\n </div>\n )}</For>\n <div\n class=\"dialkit-timeline-clip\"\n data-steps={isSteps() || undefined}\n data-composite={props.composite || undefined}\n data-selected={props.selected || undefined}\n data-dragging={dragging() || undefined}\n style={{\n left: `${(props.at - props.viewStart) * props.pxPerSecond}px`,\n width: `${width()}px`,\n background: props.composite ? `${props.clip.color}80` : props.clip.color,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={(event) => finish(event)}\n onPointerCancel={() => finish()}\n onLostPointerCapture={() => finish()}\n title={title()}\n >\n <Show\n when={!props.composite}\n fallback={<Show when={width() > 56}><span class=\"dialkit-timeline-clip-duration\">{durationText()}</span></Show>}\n >\n <Show\n when={isSteps()}\n fallback={\n <>\n <Show when={resizable()}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"start\" /></Show>\n <Show when={width() > 56}><span class=\"dialkit-timeline-clip-duration\">{durationText()}</span></Show>\n <Show when={resizable()}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"end\" /></Show>\n </>\n }\n >\n <For each={props.steps}>{(step) => {\n const segmentWidth = () => step.duration * props.pxPerSecond;\n return (\n <div\n class=\"dialkit-timeline-clip-segment\"\n data-step={step.key ?? undefined}\n data-selected={props.selectedStepKey === step.key || undefined}\n style={{ width: `${segmentWidth()}px` }}\n >\n <Show when={segmentWidth() > 52}><span class=\"dialkit-timeline-clip-duration\">{formatSeconds(step.duration)}</span></Show>\n </div>\n );\n }}</For>\n <For each={props.steps}>{(step, index) => (\n <Show when={!step.isPhysics}>\n <div\n class=\"dialkit-timeline-clip-handle\"\n data-boundary={index()}\n style={{ left: `${boundaries()[index()] * props.pxPerSecond - 4}px` }}\n />\n </Show>\n )}</For>\n <Show when={!props.steps?.[0]?.isPhysics}><div class=\"dialkit-timeline-clip-handle\" data-edge=\"start\" /></Show>\n </Show>\n </Show>\n </div>\n <Show when={looping()}><span class=\"dialkit-timeline-loop-infinity\" aria-hidden=\"true\" title=\"Repeats indefinitely\">∞</span></Show>\n </>\n );\n}\n","import { For, Show } from 'solid-js';\nimport { DialStore } from '../../store/DialStore';\nimport type {\n ControlMeta,\n DialValue,\n SpringConfig,\n TransitionConfig,\n} from '../../store/DialStore';\nimport { useShortcutContext } from './ShortcutListener';\nimport { ButtonGroup } from './ButtonGroup';\nimport { ColorControl } from './ColorControl';\nimport { Folder } from './Folder';\nimport { SelectControl } from './SelectControl';\nimport { Slider } from './Slider';\nimport { SpringControl } from './SpringControl';\nimport { TextControl } from './TextControl';\nimport { Toggle } from './Toggle';\nimport { TransitionControl, type TransitionDurationControl } from './TransitionControl';\n\ninterface ControlRendererProps {\n panelId: string;\n controls: ControlMeta[];\n values: Record<string, DialValue>;\n transitionDuration?: TransitionDurationControl;\n}\n\nexport function ControlRenderer(props: ControlRendererProps) {\n const shortcut = useShortcutContext();\n\n const renderControl = (control: ControlMeta) => {\n const value = () => props.values[control.path];\n switch (control.type) {\n case 'slider':\n return (\n <Slider\n label={control.label}\n value={value() as number}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n min={control.min}\n max={control.max}\n step={control.step}\n shortcut={control.shortcut}\n shortcutActive={shortcut().activePanelId === props.panelId && shortcut().activePath === control.path}\n />\n );\n case 'toggle':\n return (\n <Toggle\n label={control.label}\n checked={value() as boolean}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n shortcut={control.shortcut}\n shortcutActive={shortcut().activePanelId === props.panelId && shortcut().activePath === control.path}\n />\n );\n case 'spring':\n return (\n <SpringControl\n panelId={props.panelId}\n path={control.path}\n label={control.label}\n spring={value() as SpringConfig}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'transition':\n return (\n <TransitionControl\n panelId={props.panelId}\n path={control.path}\n label={control.label}\n value={value() as TransitionConfig}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n durationControl={props.transitionDuration}\n />\n );\n case 'folder':\n return (\n <Folder title={control.label} defaultOpen={control.defaultOpen ?? true}>\n <For each={control.children ?? []}>{renderControl}</For>\n </Folder>\n );\n case 'text':\n return (\n <TextControl\n label={control.label}\n value={value() as string}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n placeholder={control.placeholder}\n />\n );\n case 'select':\n return (\n <SelectControl\n label={control.label}\n value={value() as string}\n options={control.options ?? []}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'color':\n return (\n <ColorControl\n label={control.label}\n value={value() as string}\n onChange={(next) => DialStore.updateValue(props.panelId, control.path, next)}\n />\n );\n case 'action':\n return (\n <button class=\"dialkit-button\" onClick={() => DialStore.triggerAction(props.panelId, control.path)}>\n {control.label}\n </button>\n );\n default:\n return null;\n }\n };\n\n return <For each={props.controls}>{renderControl}</For>;\n}\n","import { For } from 'solid-js';\n\ninterface ButtonGroupProps {\n buttons: Array<{\n label: string;\n onClick: () => void;\n }>;\n}\n\nexport function ButtonGroup(props: ButtonGroupProps) {\n return (\n <div class=\"dialkit-button-group\">\n <For each={props.buttons}>\n {(button) => (\n <button class=\"dialkit-button\" onClick={button.onClick}>\n {button.label}\n </button>\n )}\n </For>\n </div>\n );\n}\n"],"mappings":";AAAA,SAAS,SAAS,WAAW,sBAAqC;AAClE,SAAS,gBAAgB;AACzB,SAAS,aAAa,iBAAiB;;;ACkJvC,IAAM,eAA0C,OAAO,OAAO,CAAC,CAAC;AAEzD,SAAS,kBACd,QACA,YACmB;AACnB,SAAO,oBAAoB,QAAQ,YAAY,EAAE;AACnD;AAEO,SAAS,wBACd,QACA,SAC2B;AAC3B,QAAM,SAAoC,CAAC;AAC3C,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,yBAAqB,QAAQ,SAAoC,IAAI,MAAM;AAAA,EAC7E;AACA,SAAO;AACT;AAEA,SAAS,oBACP,QACA,YACA,QACyB;AACzB,QAAM,SAAkC,CAAC;AAEzC,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,QAAI,QAAQ,aAAc;AAC1B,UAAM,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE3C,QAAI,MAAM,QAAQ,WAAW,KAAK,YAAY,UAAU,KAAK,OAAO,YAAY,CAAC,MAAM,UAAU;AAC/F,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK,YAAY,CAAC;AAAA,IACjD,WAAW,OAAO,gBAAgB,YAAY,OAAO,gBAAgB,aAAa,OAAO,gBAAgB,UAAU;AACjH,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK;AAAA,IACpC,WAAW,oBAAoB,WAAW,KAAK,oBAAoB,WAAW,GAAG;AAC/E,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK;AAAA,IACpC,WAAW,oBAAoB,WAAW,GAAG;AAC3C,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK;AAAA,IACpC,WAAW,oBAAoB,WAAW,GAAG;AAC3C,YAAM,eAAe,YAAY,WAAW,oBAAoB,YAAY,OAAO;AACnF,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK;AAAA,IACpC,WAAW,mBAAmB,WAAW,GAAG;AAC1C,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK,YAAY,WAAW;AAAA,IAC3D,WAAW,kBAAkB,WAAW,GAAG;AACzC,aAAO,GAAG,IAAI,WAAW,IAAI,KAAK,YAAY,WAAW;AAAA,IAC3D,WAAW,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;AAClE,aAAO,GAAG,IAAI,oBAAoB,aAA2B,YAAY,IAAI;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,SACA,QACA,QACM;AACN,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,QAAI,QAAQ,gBAAgB,EAAE,OAAO,SAAU;AAE/C,UAAM,YAAY,QAAQ,GAAG;AAC7B,QAAI,cAAc,OAAW;AAE7B,UAAM,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE3C,QAAI,oBAAoB,WAAW,GAAG;AACpC;AAAA,IACF;AAEA,QAAI,kBAAkB,WAAW,GAAG;AAClC,aAAO,IAAI,IAAI;AACf;AAAA,IACF;AAEA,QACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,OAAO,cAAc,YACrB,cAAc,QACd,CAAC,MAAM,QAAQ,SAAS,GACxB;AACA,2BAAqB,aAA2B,WAAsC,MAAM,MAAM;AAAA,IACpG;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAAyB;AAClD,SACG,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,YAClE,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,oBAAoB,KAAK,KACzB,oBAAoB,KAAK,KACzB,oBAAoB,KAAK,KACzB,oBAAoB,KAAK,KACzB,mBAAmB,KAAK,KACxB,kBAAkB,KAAK;AAE3B;AAEA,SAAS,QAAQ,OAAgB,MAAuB;AACtD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAU,MAA2B,SAAS;AAChH;AAEO,SAAS,oBAAoB,OAAuC;AACzE,SAAO,QAAQ,OAAO,QAAQ;AAChC;AAEO,SAAS,oBAAoB,OAAuC;AACzE,SAAO,QAAQ,OAAO,QAAQ;AAChC;AAEO,SAAS,WAAW,OAAwB;AACjD,SAAO,oDAAoD,KAAK,KAAK;AACvE;AAGO,SAAS,YAAY,KAAqB;AAC/C,SAAO,IACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,SAAO,IAAI,YAAY,CAAC,EACtC,KAAK;AACV;AAGO,SAAS,UAAU,KAAa,KAAqB;AAC1D,QAAM,QAAQ,MAAM;AACpB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,IAAK,QAAO;AACzB,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAuC;AAClE,SAAO,QAAQ,OAAO,QAAQ;AAChC;AAEA,SAAS,oBAAoB,OAAuC;AAClE,SAAO,QAAQ,OAAO,QAAQ,KAAK,aAAc,SAAoB,MAAM,QAAS,MAAuB,OAAO;AACpH;AAEA,SAAS,mBAAmB,OAAsC;AAChE,SAAO,QAAQ,OAAO,OAAO;AAC/B;AAEA,SAAS,kBAAkB,OAAqC;AAC9D,SAAO,QAAQ,OAAO,MAAM;AAC9B;AAEA,SAAS,oBAAoB,SAAgE;AAC3F,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;AACnD;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACE,SAAQ,SAAmC,oBAAI,IAAI;AACnD,SAAQ,iBAAgC,CAAC;AACzC,SAAQ,yBAAwC,CAAC;AACjD,SAAQ,yBAAwC,CAAC;AACjD,SAAQ,YAAwC,oBAAI,IAAI;AACxD,SAAQ,kBAAiC,oBAAI,IAAI;AACjD,SAAQ,YAAoD,oBAAI,IAAI;AACpE,SAAQ,kBAAoD,oBAAI,IAAI;AACpE,SAAQ,UAAiC,oBAAI,IAAI;AACjD,SAAQ,eAA2C,oBAAI,IAAI;AAC3D,SAAQ,aAAqD,oBAAI,IAAI;AACrE,SAAQ,gBAAwD,oBAAI,IAAI;AACxE,SAAQ,qBAA0C,oBAAI,IAAI;AAC1D,SAAQ,iBAA8B,oBAAI,IAAI;AAC9C,SAAQ,iBAA6C,oBAAI,IAAI;AAAA;AAAA,EAE7D,cAAc,IAAY,MAAc,QAAoB,WAA4C,UAAiC,CAAC,GAAS;AACjJ,UAAM,gBAAgB,KAAK,OAAO,IAAI,EAAE;AACxC,QAAI,iBAAiB,cAAc,SAAS,QAAQ,MAAM;AACxD,cAAQ;AAAA,QACN,uBAAuB,EAAE;AAAA,MAE3B;AAAA,IACF;AACA,SAAK,wBAAwB,IAAI,OAAO;AACxC,SAAK,mBAAmB,IAAI,KAAK,KAAK,mBAAmB,IAAI,EAAE,KAAK,KAAK,CAAC;AAE1E,UAAM,WAAW,KAAK,YAAY,QAAQ,IAAI,SAAS;AACvD,UAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,UAAM,gBAAgB,KAAK,cAAc,QAAQ,EAAE;AAGnD,SAAK,oBAAoB,QAAQ,IAAI,aAAa;AAElD,UAAM,YAAY,KAAK,mBAAmB,EAAE;AAC5C,UAAM,iBAAiB,KAAK,OAAO,IAAI,EAAE,GAAG,UAAU,KAAK,UAAU,IAAI,EAAE,KAAK,WAAW,UAAU,CAAC;AACtG,UAAM,SAAS,KAAK,gBAAgB,eAAe,gBAAgB,cAAc;AAEjF,UAAM,qBAAqB,KAAK,WAAW,IAAI,EAAE,KAAK,WAAW,cAAc,WAAW,UAAU,CAAC;AACrG,UAAM,aAAa,KAAK,gBAAgB,eAAe,oBAAoB,cAAc;AAEzF,SAAK,OAAO,IAAI,IAAI,EAAE,IAAI,MAAM,UAAU,QAAQ,WAAW,aAAa,CAAC,GAAG,MAAM,QAAQ,KAAK,CAAC;AAClG,SAAK,UAAU,IAAI,IAAI,EAAE,GAAG,OAAO,CAAC;AACpC,SAAK,WAAW,IAAI,IAAI,UAAU;AAClC,SAAK,cAAc,IAAI,IAAI,EAAE,GAAG,cAAc,CAAC;AAE/C,UAAM,kBAAkB,KAAK,QAAQ,IAAI,EAAE,KAAK,WAAW;AAC3D,QAAI,iBAAiB;AACnB,WAAK,QAAQ,IAAI,IAAI,KAAK,iBAAiB,iBAAiB,eAAe,cAAc,CAAC;AAAA,IAC5F;AACA,QAAI,CAAC,KAAK,aAAa,IAAI,EAAE,KAAK,WAAW,mBAAmB,QAAW;AACzE,WAAK,aAAa,IAAI,IAAI,UAAU,cAAc;AAAA,IACpD;AAEA,SAAK,aAAa,EAAE;AACpB,SAAK,OAAO,EAAE;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,YAAY,IAAY,MAAc,QAAoB,WAA4C,UAAiC,CAAC,GAAS;AAC/I,SAAK,wBAAwB,IAAI,OAAO;AACxC,UAAM,WAAW,KAAK,OAAO,IAAI,EAAE;AACnC,QAAI,CAAC,UAAU;AACb,WAAK,cAAc,IAAI,MAAM,QAAQ,WAAW,OAAO;AACvD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,YAAY,QAAQ,IAAI,SAAS;AACvD,UAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,UAAM,gBAAgB,KAAK,cAAc,QAAQ,EAAE;AACnD,SAAK,oBAAoB,QAAQ,IAAI,aAAa;AAClD,UAAM,aAAa,KAAK,gBAAgB,eAAe,SAAS,QAAQ,cAAc;AAEtF,UAAM,YAAyB,EAAE,IAAI,MAAM,UAAU,QAAQ,YAAY,WAAW,aAAa,SAAS,WAAW,MAAM,QAAQ,QAAQ,SAAS,KAAK;AACzJ,SAAK,OAAO,IAAI,IAAI,SAAS;AAC7B,SAAK,UAAU,IAAI,IAAI,EAAE,GAAG,WAAW,CAAC;AAExC,UAAM,qBAAqB,KAAK,WAAW,IAAI,EAAE,KAAK,CAAC;AACvD,UAAM,iBAAiB,KAAK,gBAAgB,eAAe,oBAAoB,cAAc;AAE7F,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,uBAAe,IAAI,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,SAAK,WAAW,IAAI,IAAI,cAAc;AACtC,SAAK,cAAc,IAAI,IAAI,EAAE,GAAG,cAAc,CAAC;AAC/C,SAAK,QAAQ,IAAI,IAAI,KAAK,iBAAiB,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC,GAAG,eAAe,cAAc,CAAC;AAErG,SAAK,aAAa,EAAE;AACpB,SAAK,OAAO,EAAE;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,gBAAgB,IAAkB;AAChC,UAAM,aAAa,KAAK,mBAAmB,IAAI,EAAE,KAAK,KAAK;AAC3D,QAAI,YAAY,GAAG;AACjB,WAAK,mBAAmB,IAAI,IAAI,SAAS;AACzC;AAAA,IACF;AAEA,SAAK,mBAAmB,OAAO,EAAE;AACjC,SAAK,OAAO,OAAO,EAAE;AAIrB,QAAI,KAAK,UAAU,IAAI,EAAE,GAAG,SAAS,EAAG,MAAK,UAAU,OAAO,EAAE;AAChE,QAAI,KAAK,gBAAgB,IAAI,EAAE,GAAG,SAAS,EAAG,MAAK,gBAAgB,OAAO,EAAE;AAE5E,QAAI,CAAC,KAAK,eAAe,IAAI,EAAE,GAAG;AAChC,WAAK,UAAU,OAAO,EAAE;AACxB,WAAK,WAAW,OAAO,EAAE;AACzB,WAAK,cAAc,OAAO,EAAE;AAC5B,WAAK,QAAQ,OAAO,EAAE;AACtB,WAAK,aAAa,OAAO,EAAE;AAC3B,WAAK,eAAe,OAAO,EAAE;AAAA,IAC/B;AAEA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,YAAY,SAAiB,MAAc,OAAwB;AACjE,SAAK,aAAa,SAAS,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEA,aAAa,SAAiB,SAA0C;AACtE,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,CAAC,MAAO;AAEZ,UAAM,eAA0C,CAAC;AAEjD,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,IAAI,GAAG;AAC7D;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,kBAAkB,MAAM,UAAU,IAAI;AAC3D,UAAI,SAAS,SAAS,UAAU;AAC9B;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,IAAI;AACrB,mBAAa,IAAI,IAAI;AAAA,IACvB;AAEA,QAAI,OAAO,KAAK,YAAY,EAAE,WAAW,GAAG;AAC1C;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,aAAa,IAAI,OAAO;AAC9C,QAAI,UAAU;AACZ,YAAM,UAAU,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC;AAC9C,YAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,OAAO,QAAQ;AAClD,UAAI,QAAQ;AACV,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACxD,iBAAO,OAAO,IAAI,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,OAAO,KAAK,WAAW,IAAI,OAAO;AACxC,UAAI,MAAM;AACR,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACxD,eAAK,IAAI,IAAI;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAGA,SAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAC/C,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,YAAY,SAAuB;AACjC,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,UAAM,WAAW,KAAK,cAAc,IAAI,OAAO;AAC/C,QAAI,CAAC,SAAS,CAAC,SAAU;AAEzB,UAAM,SAAS,EAAE,GAAG,SAAS;AAC7B,SAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAC/C,SAAK,WAAW,IAAI,SAAS,EAAE,GAAG,SAAS,CAAC;AAC5C,SAAK,aAAa,IAAI,SAAS,IAAI;AACnC,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,iBAAiB,SAAiB,MAAc,MAAmC;AACjF,SAAK,qBAAqB,SAAS,MAAM,IAAI;AAAA,EAC/C;AAAA,EAEA,cAAc,SAAiB,MAAqC;AAClE,UAAM,OAAO,KAAK,kBAAkB,SAAS,IAAI;AACjD,QAAI,SAAS,SAAU,QAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,SAAiB,MAAc,MAA8C;AAChG,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,CAAC,MAAO;AAEZ,UAAM,OAAO,GAAG,IAAI,SAAS,IAAI;AACjC,SAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAC/C,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,kBAAkB,SAAiB,MAAgD;AACjF,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAQ,MAAM,OAAO,GAAG,IAAI,SAAS,KAA0C;AAAA,EACjF;AAAA,EAEA,SAAS,SAAiB,MAAqC;AAC7D,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,UAAU,SAA4C;AAGpD,WAAO,KAAK,UAAU,IAAI,OAAO,KAAK;AAAA,EACxC;AAAA,EAEA,UAAU,MAA4C;AAIpD,QAAI,SAAS,QAAS,QAAO,KAAK;AAClC,QAAI,SAAS,WAAY,QAAO,KAAK;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,IAAqC;AAC5C,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,UAAU,SAAiB,UAAgC;AACzD,QAAI,CAAC,KAAK,UAAU,IAAI,OAAO,GAAG;AAChC,WAAK,UAAU,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,UAAU,IAAI,OAAO,EAAG,IAAI,QAAQ;AAEzC,WAAO,MAAM;AACX,YAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,iBAAW,OAAO,QAAQ;AAC1B,UAAI,WAAW,SAAS,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO,GAAG;AACtD,aAAK,UAAU,OAAO,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,UAAgC;AAC9C,SAAK,gBAAgB,IAAI,QAAQ;AACjC,WAAO,MAAM,KAAK,gBAAgB,OAAO,QAAQ;AAAA,EACnD;AAAA,EAEA,iBAAiB,SAAiB,UAAsC;AACtE,QAAI,CAAC,KAAK,gBAAgB,IAAI,OAAO,GAAG;AACtC,WAAK,gBAAgB,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IAC7C;AACA,SAAK,gBAAgB,IAAI,OAAO,EAAG,IAAI,QAAQ;AAE/C,WAAO,MAAM;AACX,YAAM,YAAY,KAAK,gBAAgB,IAAI,OAAO;AAClD,iBAAW,OAAO,QAAQ;AAC1B,UAAI,WAAW,SAAS,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO,GAAG;AACtD,aAAK,gBAAgB,OAAO,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,SAAiB,MAAoB;AACjD,SAAK,gBAAgB,IAAI,OAAO,GAAG,QAAQ,QAAM,GAAG,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEA,WAAW,SAAiB,MAAsB;AAChD,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAExD,UAAM,KAAK,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACzE,UAAM,SAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,IAC5B;AAEA,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC;AAC/C,SAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,UAAU,MAAM,CAAC;AAC/C,SAAK,aAAa,IAAI,SAAS,EAAE;AAGjC,SAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAC/C,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAEnB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,SAAiB,UAAwB;AAClD,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC;AAC9C,UAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,OAAO,QAAQ;AAClD,QAAI,CAAC,OAAQ;AAGb,UAAM,SAAS,EAAE,GAAG,OAAO,OAAO;AAClC,SAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAC/C,SAAK,aAAa,IAAI,SAAS,QAAQ;AACvC,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,aAAa,SAAiB,UAAwB;AACpD,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC;AAC9C,SAAK,QAAQ,IAAI,SAAS,QAAQ,OAAO,OAAK,EAAE,OAAO,QAAQ,CAAC;AAGhE,QAAI,KAAK,aAAa,IAAI,OAAO,MAAM,UAAU;AAC/C,WAAK,aAAa,IAAI,SAAS,IAAI;AAAA,IACrC;AAGA,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,QAAI,OAAO;AACT,WAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,IACjD;AACA,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,WAAW,SAA2B;AACpC,WAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC;AAAA,EACvC;AAAA,EAEA,kBAAkB,SAAgC;AAChD,WAAO,KAAK,aAAa,IAAI,OAAO,KAAK;AAAA,EAC3C;AAAA,EAEA,kBAAkB,SAAuB;AACvC,UAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,UAAM,OAAO,KAAK,WAAW,IAAI,OAAO;AACxC,QAAI,SAAS,MAAM;AACjB,YAAM,SAAS,EAAE,GAAG,KAAK;AACzB,WAAK,UAAU,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,IACjD;AACA,SAAK,aAAa,IAAI,SAAS,IAAI;AACnC,SAAK,aAAa,OAAO;AACzB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,sBAAsB,KAAa,UAI1B;AACP,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,SAAS,GAAG;AAC9D,YAAI,CAAC,SAAS,IAAK;AACnB,YAAI,SAAS,IAAI,YAAY,MAAM,IAAI,YAAY,EAAG;AACtD,cAAM,QAAQ,SAAS,YAAY;AACnC,YAAI,UAAU,SAAU;AAExB,cAAM,UAAU,KAAK,kBAAkB,MAAM,UAAU,IAAI;AAC3D,YAAI,SAAS;AACX,iBAAO,EAAE,SAAS,MAAM,IAAI,MAAM,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,2BAKG;AACD,UAAM,UAAoG,CAAC;AAC3G,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,SAAS,GAAG;AAC9D,aAAK,SAAS,eAAe,cAAc,cAAe;AAC1D,cAAM,UAAU,KAAK,kBAAkB,MAAM,UAAU,IAAI;AAC3D,YAAI,SAAS;AACX,kBAAQ,KAAK,EAAE,SAAS,MAAM,IAAI,MAAM,SAAS,SAAS,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,IAAY,SAAsC;AAChF,QAAI,QAAQ,iBAAiB;AAC3B,WAAK,eAAe,IAAI,EAAE;AAAA,IAC5B;AAEA,UAAM,gBAAgB,KAAK,uBAAuB,IAAI,QAAQ,OAAO;AACrE,QAAI,eAAe;AACjB,WAAK,eAAe,IAAI,IAAI,aAAa;AACzC,WAAK,eAAe,IAAI,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,gBACN,eACA,gBACA,gBAC2B;AAC3B,UAAM,aAAwC,CAAC;AAE/C,eAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AAChE,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,cAAM,iBAAiB,KAAK,MAAM,GAAG,CAAC,UAAU,MAAM;AACtD,cAAM,oBAAoB,eAAe,IAAI,cAAc;AAC3D,mBAAW,IAAI,IAAI,mBAAmB,SAAS,gBAAgB,eAAe,IAAI,MAAM,SACpF,eAAe,IAAI,IACnB;AACJ;AAAA,MACF;AAEA,iBAAW,IAAI,IAAI,KAAK;AAAA,QACtB,eAAe,IAAI;AAAA,QACnB;AAAA,QACA,eAAe,IAAI,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBACN,SACA,eACA,gBACU;AACV,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,KAAK,gBAAgB,eAAe,OAAO,QAAQ,cAAc;AAAA,IAC3E,EAAE;AAAA,EACJ;AAAA,EAEQ,uBAAuB,IAAY,SAAkE;AAC3G,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,UAAU,OAAO,YAAY,WAAW,UAAU,CAAC;AACzD,WAAO;AAAA,MACL,KAAK,QAAQ,OAAO,WAAW,EAAE;AAAA,MACjC,SAAS,QAAQ,WAAW;AAAA,MAC5B,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,mBAAmB,IAAwC;AACjE,UAAM,SAAS,KAAK,eAAe,IAAI,EAAE;AACzC,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,UAAU,KAAK,WAAW,OAAO,OAAO;AAC9C,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI;AACF,YAAM,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACtC,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,QAAQ,YAAY,KAAK,OAAO,WAAW,SAAU,QAAO;AAChE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,aAAa,IAAkB;AACrC,UAAM,SAAS,KAAK,eAAe,IAAI,EAAE;AACzC,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU,KAAK,WAAW,OAAO,OAAO;AAC9C,QAAI,CAAC,QAAS;AAEd,UAAM,SAAS,KAAK,UAAU,IAAI,EAAE,KAAK,KAAK,OAAO,IAAI,EAAE,GAAG;AAC9D,QAAI,CAAC,OAAQ;AAEb,UAAM,QAA6B;AAAA,MACjC,SAAS;AAAA,MACT;AAAA,MACA,YAAY,KAAK,WAAW,IAAI,EAAE,KAAK;AAAA,MACvC,gBAAgB,KAAK,aAAa,IAAI,EAAE,KAAK;AAAA,IAC/C;AAEA,QAAI,OAAO,SAAS;AAClB,YAAM,UAAU,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC;AAAA,IAC3C;AAEA,QAAI;AACF,cAAQ,QAAQ,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACnD,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,WAAW,MAAyD;AAC1E,QAAI,OAAO,eAAe,eAAe,EAAE,YAAY,aAAa;AAClE,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,SAAS,mBACZ,WAAW,QAAQ,kBAAkB,OACrC,WAAW,QAAQ,gBAAgB;AAAA,IACzC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,kBAAkB,UAAyB,MAAkC;AACnF,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,SAAS,KAAM,QAAO;AAClC,UAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU;AACjD,cAAM,QAAQ,KAAK,kBAAkB,QAAQ,UAAU,IAAI;AAC3D,YAAI,MAAO,QAAO;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,SAAuB;AACpC,SAAK,UAAU,IAAI,OAAO,GAAG,QAAQ,QAAM,GAAG,CAAC;AAAA,EACjD;AAAA,EAEQ,eAAqB;AAC3B,SAAK,iBAAiB,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AACrD,SAAK,yBAAyB,KAAK,eAAe,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU;AAC7F,SAAK,yBAAyB,KAAK,eAAe,OAAO,CAAC,UAAU,MAAM,SAAS,UAAU;AAC7F,SAAK,gBAAgB,QAAQ,QAAM,GAAG,CAAC;AAAA,EACzC;AAAA,EAEQ,oBAAoB,QAAoB,QAAgB,QAAyC;AACvG,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,QAAQ,aAAc;AAC1B,YAAM,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE3C,UAAI,KAAK,eAAe,KAAK,GAAG;AAC9B,eAAO,GAAG,IAAI,SAAS,IAAI;AAAA,MAC7B,WAAW,KAAK,eAAe,KAAK,GAAG;AAErC,cAAM,aAAa,MAAM,cAAc,UAAa,MAAM,YAAY,UAAa,MAAM,SAAS;AAClG,cAAM,UAAU,MAAM,mBAAmB,UAAa,MAAM,WAAW;AACvE,eAAO,GAAG,IAAI,SAAS,IAAI,cAAc,CAAC,UAAU,aAAa;AAAA,MACnE,WAAW,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,KAAK,eAAe,KAAK,KAAK,CAAC,KAAK,eAAe,KAAK,KAAK,CAAC,KAAK,cAAc,KAAK,KAAK,CAAC,KAAK,aAAa,KAAK,GAAG;AACxM,aAAK,oBAAoB,OAAqB,MAAM,MAAM;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,QAAoB,QAAgB,WAA2D;AACjH,UAAM,WAA0B,CAAC;AAEjC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,QAAQ,aAAc;AAC1B,YAAM,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAC3C,YAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,YAAM,WAAW,YAAY,IAAI;AAEjC,UAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,UAAU;AAE7E,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,KAAK,MAAM,CAAC;AAAA,UACZ,KAAK,MAAM,CAAC;AAAA,UACZ,MAAM,MAAM,CAAC,KAAK,KAAK,UAAU,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AAAA,MACH,WAAW,OAAO,UAAU,UAAU;AAEpC,cAAM,EAAE,KAAK,KAAK,KAAK,IAAI,KAAK,WAAW,KAAK;AAChD,iBAAS,KAAK,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,MACzE,WAAW,OAAO,UAAU,WAAW;AACrC,iBAAS,KAAK,EAAE,MAAM,UAAU,MAAM,OAAO,SAAS,CAAC;AAAA,MACzD,WAAW,KAAK,eAAe,KAAK,KAAK,KAAK,eAAe,KAAK,GAAG;AACnE,iBAAS,KAAK,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC;AAAA,MACnD,WAAW,KAAK,eAAe,KAAK,GAAG;AACrC,iBAAS,KAAK,EAAE,MAAM,UAAU,MAAM,OAAQ,MAAuB,SAAS,MAAM,CAAC;AAAA,MACvF,WAAW,KAAK,eAAe,KAAK,GAAG;AACrC,iBAAS,KAAK,EAAE,MAAM,UAAU,MAAM,OAAO,SAAS,MAAM,QAAQ,CAAC;AAAA,MACvE,WAAW,KAAK,cAAc,KAAK,GAAG;AACpC,iBAAS,KAAK,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,MAC9C,WAAW,KAAK,aAAa,KAAK,GAAG;AACnC,iBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,aAAa,MAAM,YAAY,CAAC;AAAA,MAC7E,WAAW,OAAO,UAAU,UAAU;AAEpC,YAAI,KAAK,WAAW,KAAK,GAAG;AAC1B,mBAAS,KAAK,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,QAC9C,OAAO;AACL,mBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,QAC7C;AAAA,MACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,cAAM,eAAe;AACrB,cAAM,cAAc,gBAAgB,eAAe,CAAE,aAAa,aAAyB;AAC3F,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,KAAK,YAAY,cAAc,MAAM,SAAS;AAAA,QAC1D,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,QAAoB,QAA2C;AACnF,UAAM,SAAoC,CAAC;AAE3C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,QAAQ,aAAc;AAC1B,YAAM,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE3C,UAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,UAAU;AAC7E,eAAO,IAAI,IAAI,MAAM,CAAC;AAAA,MACxB,WAAW,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAC/F,eAAO,IAAI,IAAI;AAAA,MACjB,WAAW,KAAK,eAAe,KAAK,KAAK,KAAK,eAAe,KAAK,GAAG;AACnE,eAAO,IAAI,IAAI;AAAA,MACjB,WAAW,KAAK,eAAe,KAAK,GAAG;AAErC,eAAO,IAAI,IAAI;AAAA,MACjB,WAAW,KAAK,eAAe,KAAK,GAAG;AAErC,cAAM,cAAc,MAAM,QAAQ,CAAC;AACnC,cAAM,aAAa,OAAO,gBAAgB,WAAW,cAAc,YAAY;AAC/E,eAAO,IAAI,IAAI,MAAM,WAAW;AAAA,MAClC,WAAW,KAAK,cAAc,KAAK,GAAG;AACpC,eAAO,IAAI,IAAI,MAAM,WAAW;AAAA,MAClC,WAAW,KAAK,aAAa,KAAK,GAAG;AACnC,eAAO,IAAI,IAAI,MAAM,WAAW;AAAA,MAClC,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,eAAO,OAAO,QAAQ,KAAK,cAAc,OAAqB,IAAI,CAAC;AAAA,MACrE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAAuC;AAC5D,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAuB,SAAS;AAAA,EAErC;AAAA,EAEQ,eAAe,OAAuC;AAC5D,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAuB,SAAS;AAAA,EAErC;AAAA,EAEQ,eAAe,OAAuC;AAC5D,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAuB,SAAS;AAAA,EAErC;AAAA,EAEQ,eAAe,OAAuC;AAC5D,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAuB,SAAS,YACjC,aAAa,SACb,MAAM,QAAS,MAAuB,OAAO;AAAA,EAEjD;AAAA,EAEQ,cAAc,OAAsC;AAC1D,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAsB,SAAS;AAAA,EAEpC;AAAA,EAEQ,aAAa,OAAqC;AACxD,WACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAqB,SAAS;AAAA,EAEnC;AAAA,EAEQ,WAAW,OAAwB;AACzC,WAAO,WAAW,KAAK;AAAA,EACzB;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,YAAY,GAAG;AAAA,EACxB;AAAA,EAEQ,WAAW,OAA2D;AAE5E,QAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,aAAO,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACtC,WAAW,SAAS,KAAK,SAAS,IAAI;AACpC,aAAO,EAAE,KAAK,GAAG,KAAK,QAAQ,KAAK,IAAI,MAAM,IAAI;AAAA,IACnD,WAAW,SAAS,KAAK,SAAS,KAAK;AACrC,aAAO,EAAE,KAAK,GAAG,KAAK,QAAQ,KAAK,KAAK,MAAM,EAAE;AAAA,IAClD,WAAW,SAAS,GAAG;AACrB,aAAO,EAAE,KAAK,GAAG,KAAK,QAAQ,KAAK,KAAM,MAAM,GAAG;AAAA,IACpD,OAAO;AACL,aAAO,EAAE,KAAK,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,UAAU,KAAa,KAAqB;AAClD,WAAO,UAAU,KAAK,GAAG;AAAA,EAC3B;AAAA,EAEQ,wBACN,eACA,cACA,SACW;AACX,QAAI,kBAAkB,UAAa,CAAC,SAAS;AAC3C,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,UAAU;AACb,YAAI,OAAO,kBAAkB,YAAY,OAAO,iBAAiB,UAAU;AACzE,iBAAO;AAAA,QACT;AAEA,cAAM,MAAM,QAAQ,OAAO,OAAO;AAClC,cAAM,MAAM,QAAQ,OAAO,OAAO;AAClC,cAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,aAAa,CAAC;AAE1D,YAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,QAAQ,GAAG;AACzD,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK,YAAY,SAAS,KAAK,KAAK,QAAQ,IAAI;AAAA,MACzD;AAAA,MACA,KAAK;AACH,eAAO,OAAO,kBAAkB,YAAY,gBAAgB;AAAA,MAC9D,KAAK,UAAU;AACb,YAAI,OAAO,kBAAkB,UAAU;AACrC,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,QAAQ,WAAW,CAAC;AACpC,cAAM,cAAc,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAY,OAAO,WAAW,WAAW,SAAS,OAAO,KAAM,CAAC;AACzG,eAAO,YAAY,IAAI,aAAa,IAAI,gBAAgB;AAAA,MAC1D;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,eAAO,OAAO,kBAAkB,WAAW,gBAAgB;AAAA,MAC7D,KAAK;AACH,YAAI,KAAK,eAAe,YAAY,GAAG;AACrC,iBAAO,KAAK,eAAe,aAAa,IAAI,gBAAgB;AAAA,QAC9D;AACA,YAAI,KAAK,eAAe,YAAY,GAAG;AACrC,iBAAO,KAAK,eAAe,aAAa,IAAI,gBAAgB;AAAA,QAC9D;AACA,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,YAAY,OAAe,KAAa,KAAa,MAAsB;AACjF,UAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,OAAO,IAAI,IAAI;AACzD,UAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC;AACpD,UAAM,YAAY,KAAK,cAAc,IAAI;AACzC,WAAO,OAAO,QAAQ,QAAQ,SAAS,CAAC;AAAA,EAC1C;AAAA,EAEQ,cAAc,MAAsB;AAC1C,UAAM,OAAO,OAAO,IAAI;AACxB,UAAM,eAAe,KAAK,QAAQ,GAAG;AACrC,WAAO,iBAAiB,KAAK,IAAI,KAAK,SAAS,eAAe;AAAA,EAChE;AAAA,EAEQ,kBAAkB,UAAmD;AAC3E,UAAM,MAAM,oBAAI,IAAyB;AAEzC,UAAM,QAAQ,CAAC,UAAyB;AACtC,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,YAAY,KAAK,UAAU;AAC3C,gBAAM,KAAK,QAAQ;AACnB;AAAA,QACF;AAEA,YAAI,IAAI,KAAK,MAAM,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,WAAO;AAAA,EACT;AAEF;AAGO,IAAM,YAA4B,oBAAI,eAAe;;;AD1kCrD,SAAS,cACd,MACA,QACA,SAC6B;AAC7B,SAAO,wBAAwB,MAAM,QAAQ,OAAO,EAAE;AACxD;AAEO,SAAS,wBACd,MACA,QACA,SACsB;AACtB,QAAM,KAAK,eAAe;AAC1B,QAAM,cAAc,SAAS,OAAO;AACpC,QAAM,UAAU,SAAS,MAAM,GAAG,IAAI,IAAI,EAAE;AAK5C,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,IAC1B,kBAAkB,QAAQ,UAAU,UAAU,OAAO,CAAC;AAAA,EACxD;AAEA,MAAI,CAAC,UAAU;AAGb,UAAM,cAAc,UAAU,UAAU,SAAS,MAAM;AACrD,gBAAU,UAAU,kBAAkB,QAAQ,UAAU,UAAU,OAAO,CAAC,CAAC,CAAC;AAAA,IAC9E,CAAC;AACD,cAAU,WAAW;AAAA,EACvB;AAEA,UAAQ,MAAM;AACZ,cAAU,cAAc,SAAS,MAAM,QAAQ,SAAS,WAAW;AAAA,MACjE,iBAAiB;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB,CAAC;AAED,UAAM,eAAe,SAAS,WAC1B,UAAU,iBAAiB,SAAS,QAAQ,QAAQ,IACpD;AAEJ,cAAU,MAAM;AACd,qBAAe;AACf,gBAAU,gBAAgB,OAAO;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM,OAAO;AACpB,gBAAU,YAAY,SAAS,MAAM,KAAK;AAAA,IAC5C;AAAA,IACA,UAAU,YAAY;AACpB,gBAAU,aAAa,SAAS,wBAAwB,QAAQ,UAAU,CAAC;AAAA,IAC7E;AAAA,IACA,cAAc;AACZ,gBAAU,YAAY,OAAO;AAAA,IAC/B;AAAA,IACA,YAAY;AACV,aAAO,kBAAkB,QAAQ,UAAU,UAAU,OAAO,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;;;AE5FA,SAAS,cAAc,YAAY,cAAc,kBAAAA,iBAAgB,aAAAC,YAAW,WAAAC,gBAA8B;AAC1G,SAAS,YAAAC,iBAAgB;;;ACiDlB,SAAS,SAAS,UAAkB,WAA2B;AACpE,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,EAAG,QAAO;AACxD,MAAI,CAAC,OAAO,SAAS,SAAS,EAAG,aAAY;AAC7C,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,QAAQ;AACvD,SAAO,WAAW,QAAQ,IAAI,WAAW,QAAQ;AACnD;AAIO,SAAS,aACd,MACA,UACA,YAAY,GACqB;AACjC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,GAAG;AACzE,WAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,EAC7B;AACA,MAAI,OAAO,SAAU,QAAO,EAAE,MAAM,OAAO,EAAE;AAC7C,QAAM,OAAO,SAAS,UAAU,SAAS;AACzC,QAAM,OAAO,WAAW;AACxB,QAAM,OAAO,OAAO;AACpB,SAAO,EAAE,MAAM,OAAQ,OAAO,MAAO,OAAO,KAAK,MAAM,OAAO,IAAI,EAAE;AACtE;AAEO,IAAM,uBAAuB;AAAA,EAClC;AAAA;AACF;AAEA,IAAM,kBAAqC,OAAO,OAAO,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;AAE3G,IAAM,qBAAN,MAAyB;AAAA,EAAzB;AACE,SAAQ,YAAuC,oBAAI,IAAI;AACvD,SAAQ,aAA6C,oBAAI,IAAI;AAC7D,SAAQ,YAAwC,oBAAI,IAAI;AACxD,SAAQ,kBAAiC,oBAAI,IAAI;AACjD,SAAQ,qBAA0C,oBAAI,IAAI;AAC1D,SAAQ,YAAmC;AAC3C,SAAQ,QAAuB;AAC/B,SAAQ,WAAW;AAkJnB,SAAQ,OAAO,CAAC,QAAsB;AAGpC,YAAM,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,YAAY,GAAI;AACnD,WAAK,WAAW;AAEhB,UAAI,aAAa;AACjB,iBAAW,CAAC,IAAI,SAAS,KAAK,KAAK,YAAY;AAC7C,YAAI,CAAC,UAAU,QAAS;AAExB,cAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,cAAM,WAAW,MAAM,YAAY,UAAU;AAC7C,YAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,GAAG;AAC/C,eAAK,WAAW,IAAI,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;AAC1E,eAAK,OAAO,EAAE;AACd;AAAA,QACF;AACA,YAAI,OAAO,UAAU,OAAO;AAC5B,YAAI,UAAU;AACd,YAAI,QAAQ,UAAU;AAEtB,YAAI,QAAQ,UAAU;AACpB,cAAI,MAAM,MAAM;AACd,kBAAM,SAAS,aAAa,MAAM,UAAU,KAAK,SAAS;AAC1D,mBAAO,OAAO;AACd,qBAAS,OAAO;AAAA,UAClB,OAAO;AACL,mBAAO;AACP,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,aAAK,WAAW,IAAI,IAAI,EAAE,MAAM,SAAS,UAAU,MAAM,CAAC;AAC1D,YAAI,QAAS,cAAa;AAC1B,aAAK,OAAO,EAAE;AAAA,MAChB;AAEA,WAAK,QAAQ,aAAa,OAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,IACtE;AAAA;AAAA,EAtLA,SAAS,MAAoB,SAAsC;AACjE,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK,EAAE;AAC3C,QAAI,YAAY,SAAS,SAAS,KAAK,MAAM;AAC3C,cAAQ;AAAA,QACN,0BAA0B,KAAK,EAAE,+BAA+B,SAAS,IAAI,OACzE,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AACA,SAAK,mBAAmB,IAAI,KAAK,KAAK,KAAK,mBAAmB,IAAI,KAAK,EAAE,KAAK,KAAK,CAAC;AACpF,SAAK,UAAU,MAAM,QAAQ,QAAQ;AAAA,EACvC;AAAA,EAEA,OAAO,MAA0B;AAC/B,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,EAAE,EAAG;AAClC,SAAK,UAAU,MAAM,KAAK;AAAA,EAC5B;AAAA,EAEA,WAAW,IAAkB;AAC3B,UAAM,aAAa,KAAK,mBAAmB,IAAI,EAAE,KAAK,KAAK;AAC3D,QAAI,YAAY,GAAG;AACjB,WAAK,mBAAmB,IAAI,IAAI,SAAS;AACzC;AAAA,IACF;AAEA,SAAK,mBAAmB,OAAO,EAAE;AACjC,SAAK,UAAU,OAAO,EAAE;AACxB,SAAK,WAAW,OAAO,EAAE;AAIzB,QAAI,KAAK,UAAU,IAAI,EAAE,GAAG,SAAS,EAAG,MAAK,UAAU,OAAO,EAAE;AAChE,SAAK,YAAY;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,KAAK,IAAkB;AACrB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,UAAU,YAAY,KAAK,UAAU,QAAS;AAEhE,UAAM,UAAU,UAAU,QAAQ,UAAU;AAC5C,SAAK,WAAW,IAAI,IAAI;AAAA,MACtB,GAAG;AAAA,MACH,MAAM,UAAU,IAAI,UAAU;AAAA,MAC9B,OAAO,UAAU,IAAI,UAAU;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AACD,SAAK,OAAO,EAAE;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,IAAkB;AACtB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU,QAAS;AACtC,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,SAAS,MAAM,CAAC;AACxD,SAAK,OAAO,EAAE;AAAA,EAChB;AAAA,EAEA,OAAO,IAAkB;AACvB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,UAAU,YAAY,EAAG;AAC3C,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,MAAM,GAAG,OAAO,GAAG,SAAS,KAAK,CAAC;AAC1E,SAAK,OAAO,EAAE;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,KAAK,IAAY,MAAoB;AACnC,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,CAAC,OAAO,SAAS,IAAI,EAAG;AAC1C,UAAM,UAAU,KAAK,IAAI,UAAU,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;AAE9D,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,MAAM,SAAS,OAAO,EAAE,CAAC;AACjE,SAAK,OAAO,EAAE;AAAA,EAChB;AAAA,EAEA,aAAa,IAA+B;AAC1C,WAAO,KAAK,WAAW,IAAI,EAAE,KAAK;AAAA,EACpC;AAAA,EAEA,YAAY,IAAsC;AAChD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA,EAEA,eAA+B;AAC7B,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACrD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,IAAY,UAAgC;AACpD,QAAI,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AAC3B,WAAK,UAAU,IAAI,IAAI,oBAAI,IAAI,CAAC;AAAA,IAClC;AACA,SAAK,UAAU,IAAI,EAAE,EAAG,IAAI,QAAQ;AACpC,WAAO,MAAM;AACX,YAAM,YAAY,KAAK,UAAU,IAAI,EAAE;AACvC,iBAAW,OAAO,QAAQ;AAC1B,UAAI,WAAW,SAAS,KAAK,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AACpD,aAAK,UAAU,OAAO,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,UAAgC;AAC9C,SAAK,gBAAgB,IAAI,QAAQ;AACjC,WAAO,MAAM;AACX,WAAK,gBAAgB,OAAO,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAoB,UAAyB;AAC7D,UAAM,WAAW,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,IAAI;AAC/E,UAAM,YAAY,OAAO,SAAS,KAAK,SAAS,IAC5C,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAC9C;AACJ,UAAM,WAAW,EAAE,GAAG,MAAM,UAAU,UAAU;AAChD,SAAK,UAAU,IAAI,KAAK,IAAI,QAAQ;AAEpC,UAAM,WAAW,KAAK,WAAW,IAAI,KAAK,EAAE;AAC5C,QAAI,UAAU;AAEZ,WAAK,WAAW,IAAI,KAAK,IAAI;AAAA,QAC3B,MAAM,KAAK,IAAI,SAAS,MAAM,QAAQ;AAAA,QACtC,SAAS,WAAW,KAAK,SAAS;AAAA,QAClC;AAAA,QACA,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,UAAU,WAAW,KAAK;AAChC,WAAK,WAAW,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,SAAS,UAAU,OAAO,EAAE,CAAC;AACrE,UAAI,QAAS,MAAK,WAAW;AAAA,IAC/B;AAEA,SAAK,YAAY;AACjB,SAAK,OAAO,KAAK,EAAE;AACnB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAmB;AACzB,QAAI,KAAK,UAAU,QAAQ,OAAO,WAAW,YAAa;AAC1D,SAAK,WAAW,YAAY,IAAI;AAChC,SAAK,QAAQ,OAAO,sBAAsB,KAAK,IAAI;AAAA,EACrD;AAAA,EA0CQ,OAAO,IAAkB;AAC/B,SAAK,UAAU,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAC9C;AAAA,EAEQ,eAAqB;AAC3B,SAAK,gBAAgB,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAC3C;AACF;AAGO,IAAM,gBAAgC,oBAAI,mBAAmB;;;AClR7D,SAAS,OAAO,OAAuB;AAC5C,SAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AACnC;AAEO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,oBAAoB,KAAK,KAAK,oBAAoB,KAAK;AAChE;AAEO,SAAS,gBAAgB,YAAuC;AACrE,SACE,WAAW,SAAS,aACnB,WAAW,cAAc,UAAa,WAAW,YAAY,UAAa,WAAW,SAAS;AAEnG;AAEO,SAAS,aAAa,QAAoC;AAC/D,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,EAAE,WAAW,OAAO,aAAa,KAAK,SAAS,OAAO,WAAW,IAAI,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrG;AAEA,QAAM,iBAAiB,KAAK,IAAI,MAAM,OAAO,kBAAkB,GAAG;AAClE,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,OAAQ,IAAI,KAAK,MAAO,iBAAiB;AAC/C,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,SAAS;AACjF,SAAO,EAAE,WAAW,SAAS,MAAM,EAAE;AACvC;AAGO,SAAS,eAAe,GAAW,EAAE,WAAW,SAAS,KAAK,GAAyB;AAC5F,MAAI,KAAK,EAAG,QAAO;AACnB,QAAM,KAAK,KAAK,KAAK,YAAY,IAAI;AACrC,QAAM,OAAO,WAAW,IAAI,KAAK,KAAK,YAAY,IAAI;AAEtD,MAAI,OAAO,QAAQ;AACjB,UAAMC,MAAK,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI;AACzC,WAAO,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,IAAIA,MAAK,CAAC,IAAM,OAAO,KAAMA,MAAM,KAAK,IAAIA,MAAK,CAAC;AAAA,EAChG;AACA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK;AAAA,EAC3C;AACA,QAAM,KAAK,KAAK,KAAK,KAAK,OAAO,OAAO,CAAC;AACzC,QAAM,KAAK,CAAC,OAAO,KAAK;AACxB,QAAM,KAAK,CAAC,OAAO,KAAK;AACxB,SAAO,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK;AACrE;AAGO,SAAS,qBAAqB,QAA8B;AACjE,QAAM,KAAK,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AACnD,QAAM,OAAO,OAAO,WAAW,IAAI,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AAC3E,QAAM,QACJ,QAAQ,IACJ,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,OAAO,OAAO,CAAC,CAAC,IACvD,OAAO;AACb,QAAM,WAAW,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI;AACrD,SAAO,OAAO,MAAM,UAAU,MAAM,EAAE,CAAC;AACzC;AAGO,SAAS,oBAAoB,GAAW,CAAC,IAAI,IAAI,IAAI,EAAE,GAA6C;AACzG,MAAI,KAAK,EAAG,QAAO;AACnB,MAAI,KAAK,EAAG,QAAO;AAEnB,QAAM,UAAU,CAACC,OAAc,WAAWA,IAAG,IAAI,EAAE;AACnD,QAAM,UAAU,CAACA,OAAc,WAAWA,IAAG,IAAI,EAAE;AAEnD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,QAAQ,CAAC,IAAI;AACvB,QAAI,KAAK,IAAI,CAAC,IAAI,KAAM,QAAO,QAAQ,CAAC;AACxC,UAAM,KAAK,qBAAqB,GAAG,IAAI,EAAE;AACzC,QAAI,KAAK,IAAI,EAAE,IAAI,KAAM;AACzB,SAAK,IAAI;AAAA,EACX;AAEA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI;AACJ,SAAO,KAAK,KAAK,MAAM;AACrB,QAAI,QAAQ,CAAC,IAAI,EAAG,MAAK;AAAA,QACpB,MAAK;AACV,SAAK,KAAK,MAAM;AAAA,EAClB;AACA,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,WAAW,GAAW,IAAY,IAAoB;AAC7D,UAAS,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAO,IAAI,KAAK,IAAI,MAAM,IAAI,IAAM,IAAI,KAAK;AACvF;AAEA,SAAS,qBAAqB,GAAW,IAAY,IAAoB;AACvE,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAC7E;AAcO,SAAS,sBACd,KACA,cACwB;AACxB,QAAM,eAAe,KAAK,IAAI,MAAM,YAAY;AAEhD,MAAI,IAAI,SAAS,UAAU;AACzB,WAAO;AAAA,MACL,YAAY,EAAE,GAAG,KAAK,UAAU,aAAa;AAAA,MAC7C,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,gBAAgB,GAAG,GAAG;AACxB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU,qBAAqB,aAAa,GAAG,CAAC;AAAA,MAChD,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY,EAAE,MAAM,UAAU,QAAQ,IAAI,UAAU,KAAK,gBAAgB,aAAa;AAAA,IACtF,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;;;ACiGO,IAAM,kBAAkB;AACxB,IAAM,6BAA6B;AAC1C,IAAM,wBAAwB;AAC9B,IAAM,0BAA4C,EAAE,MAAM,UAAU,QAAQ,IAAI;AAChF,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,WAAW,YAAY,QAAQ,SAAS,UAAU,MAAM,CAAC;AAUhG,SAAS,aAAa,OAA6C;AACjE,SAAO,cAAc,KAAK,KAAK,OAAO,SAAU,MAA6B,EAAE;AACjF;AAKA,SAAS,cAAc,OAA8C;AACnE,MAAI,CAAC,cAAc,KAAK,KAAK,QAAQ,MAAO,QAAO;AACnD,QAAM,UAAU,OAAO,OAAO,KAAK;AACnC,SAAO,QAAQ,SAAS,KAAK,QAAQ,KAAK,YAAY;AACxD;AAEA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,OAAgB,WAAW,GAAW;AAC/D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IACrD,KAAK,IAAI,GAAG,KAAK,IACjB;AACN;AAEA,SAAS,iBAAiB,OAAgB,WAAW,uBAA+B;AAClF,SAAO,KAAK,IAAI,4BAA4B,kBAAkB,OAAO,QAAQ,CAAC;AAChF;AAEA,SAAS,0BAA0B,YAAsC;AACvE,MAAI,WAAW,SAAS,SAAU,QAAO,iBAAiB,WAAW,QAAQ;AAG7E,MAAI,gBAAgB,UAAU,GAAG;AAC/B,WAAO,iBAAiB,qBAAqB,aAAa,UAAU,CAAC,CAAC;AAAA,EACxE;AACA,MAAI,WAAW,mBAAmB,OAAW,QAAO,iBAAiB,WAAW,cAAc;AAC9F,SAAO,iBAAiB,qBAAqB,aAAa,UAAU,CAAC,CAAC;AACxE;AAMA,SAAS,oBACP,MACA,qBACQ;AACR,QAAM,QAAQ,KAAK,cAAc;AACjC,MAAI,SAAS,gBAAgB,KAAK,EAAG,QAAO,0BAA0B,KAAK;AAC3E,MAAI,KAAK,aAAa,OAAW,QAAO,iBAAiB,KAAK,QAAQ;AACtE,MAAI,KAAK,WAAY,QAAO,0BAA0B,KAAK,UAAU;AACrE,SAAO;AACT;AAEA,SAAS,qBACP,OACA,qBACQ;AACR,QAAM,QAAQ,MAAM,cAAc;AAClC,MAAI,MAAM,OAAO,QAAQ;AACvB,WAAO,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,oBAAoB,MAAM,KAAK,GAAG,CAAC;AAAA,EACpF;AACA,MAAI,SAAS,gBAAgB,KAAK,EAAG,QAAO,0BAA0B,KAAK;AAC3E,MAAI,MAAM,aAAa,OAAW,QAAO,iBAAiB,MAAM,QAAQ;AACxE,MAAI,MAAM,WAAY,QAAO,0BAA0B,MAAM,UAAU;AACvE,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAkC;AAC7D,QAAM,eAAe,mBAAmB,KAAK,UAAU,IACnD,KAAK,aACL;AACJ,MAAI,KAAK,OAAO;AACd,WAAO,OAAO,OAAO,KAAK,KAAK,EAAE;AAAA,MAC/B,CAAC,KAAK,UAAU,KAAK;AAAA,QACnB;AAAA,QACA,kBAAkB,MAAM,KAAK,IAAI,qBAAqB,OAAO,YAAY;AAAA,MAC3E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,OAAO,QAAQ;AACtB,WAAO,KAAK,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,oBAAoB,MAAM,YAAY,GAAG,CAAC;AAAA,EAC1F;AAEA,QAAM,YAAY,QAAQ,KAAK,cAAc,KAAK,QAAQ,KAAK,EAAE;AAEjE,MAAI,CAAC,UAAW,QAAO,kBAAkB,KAAK,QAAQ;AACtD,MAAI,gBAAgB,YAAY,EAAG,QAAO,0BAA0B,YAAY;AAChF,MAAI,KAAK,aAAa,OAAW,QAAO,iBAAiB,KAAK,QAAQ;AACtE,MAAI,mBAAmB,KAAK,UAAU,EAAG,QAAO,0BAA0B,KAAK,UAAU;AAIzF,SAAO,KAAK,QAAQ,KAAK,KAAK,0BAA0B,uBAAuB,IAAI;AACrF;AAEO,SAAS,kBAAkB,OAAkC;AAGlE,MAAI,UAAU,QAAQ,UAAU,YAAY,UAAU,SAAU,QAAO;AACvE,SAAO;AACT;AAKA,SAAS,0BAA0B,YAA8B,cAAwC;AACvG,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO,EAAE,GAAG,YAAY,UAAU,aAAa;AAAA,EACjD;AACA,MAAI,gBAAgB,UAAU,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,UAAU,QAAQ,WAAW,UAAU,IAAI;AAC5D;AASA,SAAS,mBAAmB,QAA0C;AACpE,QAAM,UAA4B,CAAC;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,QAAQ,WAAY;AACxB,QAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,cAAQ,KAAK,2BAA2B,GAAG,iDAAiD;AAC5F;AAAA,IACF;AACA,QAAI,aAAa,KAAK,GAAG;AACvB,cAAQ,KAAK,EAAE,MAAM,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;AAAA,IACxD,WAAW,cAAc,KAAK,GAAG;AAC/B,iBAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACzD,YAAI,aAAa,SAAS,GAAG;AAC3B,kBAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,IAAI,QAAQ,IAAI,UAAU,OAAO,KAAK,MAAM,UAAU,CAAC;AAAA,QACpF,OAAO;AACL,kBAAQ;AAAA,YACN,4BAA4B,GAAG,IAAI,QAAQ;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ;AAAA,QACN,6BAA6B,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,cAAc,QAAgE;AACrF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW,QAAO,GAAG,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,YAAwB,MAAc,OAAyB;AAClF,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,MAAI,OAAO;AACX,aAAW,WAAW,SAAS,MAAM,GAAG,EAAE,GAAG;AAC3C,WAAQ,kCAAkB,CAAC;AAAA,EAC7B;AACA,OAAK,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI;AACxC;AAEO,SAAS,oBAAoB,QAAwC;AAC1E,QAAM,UAAU,mBAAmB,MAAM;AAEzC,MAAI,SAAS;AACb,aAAW,EAAE,KAAK,KAAK,SAAS;AAC9B,aAAS,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE,IAAI,oBAAoB,IAAI,CAAC;AAAA,EAClF;AAMA,QAAM,WACJ,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,OAAO,QAAQ,KAAK,OAAO,WAAW,IACzF,OAAO,WACP,SAAS,IACP,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI,MACjC;AAER,QAAM,aAAyB,CAAC;AAChC,QAAM,QAA4B,CAAC;AAEnC,UAAQ,QAAQ,CAAC,EAAE,MAAM,UAAU,OAAO,KAAK,GAAG,UAAU;AAG1D,UAAM,MAAM;AAMZ,QAAI,IAAI,UAAU,IAAI,OAAO,UAAU,IAAI,QAAQ,IAAI,KAAK;AAC1D,cAAQ;AAAA,QACN,4BAA4B,IAAI;AAAA,MAClC;AAAA,IACF,WAAW,IAAI,OAAO,UAAU,IAAI,IAAI;AACtC,cAAQ;AAAA,QACN,4BAA4B,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,KAAK,OAAO,MAAM,KAAK,CAAC,KAAK;AACtD,UAAM,WAAW,QAAQ,KAAK,KAAK;AACnC,UAAM,SAAS,mBAAmB,KAAK,UAAU,IAAI,KAAK,aAAa;AACvE,UAAM,QAAQ,oBAAoB,IAAI;AACtC,UAAM,eAAe,UAAU;AAC/B,UAAM,SAAS,kBAAkB,KAAK,EAAE;AAExC,UAAM,WAAuB;AAAA,MAC3B,IAAI,CAAC,QAAQ,GAAG,UAAU,eAAe;AAAA,IAC3C;AAGA,QAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,eAAS,WAAW,CAAC,OAAO,GAAG,UAAU,eAAe;AAAA,IAC1D;AAIA,QAAI,CAAC,YAAY,CAAC,aAAa,KAAK,cAAc,KAAK,QAAQ,KAAK,KAAK;AACvE,eAAS,aAAa,0BAA0B,cAAc,KAAK;AAAA,IACrE;AAKA,QAAI;AACJ,QAAI,KAAK,OAAO;AACd,eAAS,CAAC;AACV,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACtD,YAAI,eAAe,IAAI,IAAI,KAAK,YAAY,KAAK,IAAI,GAAG;AACtD,kBAAQ,KAAK,gCAAgC,IAAI,+CAA+C;AAChG;AAAA,QACF;AACA,cAAM,gBAAgB,qBAAqB,OAAO,YAAY;AAC9D,cAAM,aAAa,MAAM,cAAc;AACvC,cAAM,gBAAgB,QAAQ,MAAM,OAAO,MAAM;AACjD,cAAM,YAAwB;AAAA,UAC5B,OAAO,CAAC,kBAAkB,MAAM,KAAK,GAAG,GAAG,UAAU,eAAe;AAAA,QACtE;AACA,YAAI,CAAC,eAAe;AAClB,oBAAU,WAAW,CAAC,eAAe,GAAG,UAAU,eAAe;AACjE,oBAAU,aAAa,0BAA0B,YAAY,aAAa;AAAA,QAC5E;AACA,cAAM,YAAY,MAAM,SAAS,gBAAgB,SAAY,MAAM;AACnE,YAAI,iBAAiB,cAAc,QAAW;AAC5C,kBAAQ;AAAA,YACN,4BAA4B,IAAI,aAAa,IAAI;AAAA,UACnD;AAAA,QACF;AACA,YAAI,cAAc,QAAW;AAC3B,oBAAU,OAAO,WAAW,MAAM,WAAW,gBAAgB,MAAM,MAAO,CAAC,GAAG,KAAK,MAAM,EAAE;AAAA,QAC7F;AACA,YAAI,CAAC,iBAAiB,MAAM,OAAO,QAAW;AAC5C,oBAAU,KAAK,WAAW,MAAM,MAAM,IAAI,SAAS;AAAA,QACrD;AACA,YAAI;AACJ,YAAI,eAAe;AACjB,0BAAgB,CAAC;AACjB,cAAI,WAAW;AACf,gBAAM,MAAO,QAAQ,CAAC,MAAM,cAAc;AACxC,kBAAM,UAAU,OAAO,YAAY,CAAC;AACpC,0BAAe,KAAK,OAAO;AAC3B,kBAAM,eAAe,oBAAoB,MAAM,UAAU;AACzD,kBAAM,WAAuB;AAAA,cAC3B,UAAU,CAAC,cAAc,GAAG,UAAU,eAAe;AAAA,cACrD,YAAY,0BAA0B,KAAK,cAAc,YAAY,YAAY;AAAA,YACnF;AACA,gBAAI,KAAK,OAAO,QAAW;AACzB,uBAAS,KAAK,WAAW,MAAM,KAAK,IAAI,QAAQ;AAChD,yBAAW,KAAK;AAAA,YAClB;AACA,sBAAU,OAAO,IAAI;AAAA,UACvB,CAAC;AAAA,QACH;AACA,iBAAS,IAAI,IAAI;AACjB,eAAO,KAAK,EAAE,MAAM,UAAU,cAAc,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,CAAC,UAAU;AAC1B,eAAS,OAAO;AAAA,QACd,KAAK;AAAA,QACL,WAAW,cAAc,KAAK,MAAO,CAAC,GAAG,EAAE,IAAI,KAAK;AAAA,MACtD;AAAA,IACF;AACA,QAAI,CAAC,YAAY,CAAC,YAAY,KAAK,IAAI;AACrC,eAAS,KAAK,iBAAiB,KAAK,IAAI,KAAK,IAAI;AAAA,IACnD;AAIA,QAAI;AACJ,QAAI,UAAU;AACZ,iBAAW,CAAC;AACZ,UAAI,UAAkC,KAAK;AAC3C,WAAK,MAAO,QAAQ,CAAC,MAAM,cAAc;AACvC,cAAM,UAAU,OAAO,YAAY,CAAC;AACpC,iBAAU,KAAK,OAAO;AACtB,cAAM,eAAe,oBAAoB,MAAM,YAAY;AAC3D,cAAM,WAAuB;AAAA,UAC3B,UAAU,CAAC,cAAc,GAAG,UAAU,eAAe;AAAA,UACrD,YAAY,0BAA0B,KAAK,cAAc,cAAc,YAAY;AAAA,QACrF;AACA,cAAM,SAAS,cAAc,KAAK,EAAE;AACpC,YAAI,QAAQ;AAGV,qBAAW,QAAQ,OAAO,KAAK,MAAM,GAAG;AACtC,gBAAI,CAAC,WAAW,EAAE,QAAQ,UAAU;AAClC,sBAAQ;AAAA,gBACN,4BAA4B,IAAI,gBAAgB,IAAI,4BAA4B,YAAY,CAAC;AAAA,cAC/F;AAAA,YACF;AAAA,UACF;AACA,mBAAS,KAAK,iBAAiB,QAAQ,OAAO;AAAA,QAChD;AACA,iBAAS,OAAO,IAAI;AACpB,kBAAU,EAAE,GAAI,WAAW,CAAC,GAAI,GAAI,UAAU,CAAC,EAAG;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,gBAAY,YAAY,MAAM,QAAQ;AAEtC,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL,OAAO,YAAY,QAAQ;AAAA,MAC3B,OAAO,qBAAqB,QAAQ,qBAAqB,MAAM;AAAA,MAC/D,MAAM,kBAAkB,KAAK,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,UAAU,YAAY,MAAM;AACvC;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,MAAM,YAAY,QAAQ,QAAQ,MAAM,cAAc,OAAO,CAAC;AAI9F,SAAS,WAAW,MAAc,OAAwB,aAA8D;AACtH,QAAM,SAAS;AAAA,IACb,EAAE,CAAC,IAAI,GAAG,MAAM;AAAA,IAChB,gBAAgB,SAAY,SAAa,EAAE,CAAC,IAAI,GAAG,YAAY;AAAA,EACjE;AACA,SAAO,OAAO,IAAI;AACpB;AAOA,IAAM,wBAAgF;AAAA,EACpF,CAAC,0DAA0D,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC;AAAA,EAC3F,CAAC,qBAAqB,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC;AAAA,EACtD,CAAC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,EAC1C,CAAC,kBAAkB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,EACjD,CAAC,uBAAuB,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC;AACvD;AAEA,SAAS,iBAAiB,KAAa,OAAe,aAAmE;AACvH,QAAM,KAAK,KAAK,IAAI,OAAO,eAAe,KAAK;AAC/C,QAAM,KAAK,KAAK,IAAI,OAAO,eAAe,KAAK;AAE/C,QAAM,SAAS,sBAAsB,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC;AAC/E,MAAI,QAAQ;AACV,WAAO,CAAC,OAAO,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG,OAAO,IAAI;AAAA,EAChF;AAIA,MAAI,MAAM,KAAK,MAAM,GAAG;AACtB,WAAO,CAAC,OAAO,GAAG,GAAG,IAAI;AAAA,EAC3B;AACA,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,CAAC;AACrD,QAAM,MAAM,KAAK,IAAI,CAAC,SAAS,IAAI;AACnC,QAAM,MAAM,KAAK,IAAI,SAAS,GAAG,EAAE;AACnC,SAAO,CAAC,OAAO,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC;AAC9C;AAIA,SAAS,iBAAiB,QAAoB,aAAiD;AAC7F,QAAM,SAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,QAAQ,cAAc,GAAG;AAC/B,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,GAAG,IAAI,iBAAiB,KAAK,OAAO,OAAO,UAAU,WAAW,QAAQ,MAAS;AAAA,IAC1F,WAAW,cAAc,KAAK,KAAK,EAAE,UAAU,QAAQ;AACrD,aAAO,GAAG,IAAI;AAAA,QACZ;AAAA,QACA,cAAc,KAAK,KAAK,EAAE,UAAU,SAAU,QAAuB;AAAA,MACvE;AAAA,IACF,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAaA,SAAS,YAAY,YAA0C,UAA+B;AAC5F,MAAI,CAAC,WAAY,QAAO,EAAE,SAAS;AACnC,MAAI,WAAW,SAAS,SAAU,QAAO,EAAE,UAAU,MAAM,WAAW,KAAK;AAC3E,QAAM,SAAS,aAAa,UAAU;AACtC,SAAO,EAAE,UAAU,QAAQ,QAAQ,qBAAqB,MAAM,EAAE;AAClE;AAEA,SAAS,YAAY,OAAoB,SAAyB;AAChE,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,MAAM,QAAQ;AAEhB,QAAI,MAAM,WAAW,UAAa,WAAW,MAAM,OAAQ,QAAO;AAClE,WAAO,eAAe,SAAS,MAAM,MAAM;AAAA,EAC7C;AACA,MAAI,MAAM,MAAM;AACd,WAAO,oBAAoB,MAAM,MAAM,WAAW,IAAI,UAAU,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI;AAAA,EACvG;AACA,SAAO,MAAM,WAAW,IAAI,KAAK,IAAI,GAAG,UAAU,MAAM,QAAQ,IAAI;AACtE;AAqDA,SAAS,eAAe,UAAmC,MAAuC;AAChG,MAAI,OAAgB;AACpB,aAAW,WAAW,KAAK,MAAM,GAAG,GAAG;AACrC,WAAO,cAAc,IAAI,IAAI,KAAK,OAAO,IAAI;AAAA,EAC/C;AACA,SAAO,cAAc,IAAI,IAAI,OAAO,CAAC;AACvC;AAEO,SAAS,mBACd,QACA,YACsB;AACtB,QAAM,WAAW,kBAAkB,OAAO,YAAY,UAAU;AAChE,SAAO,OAAO,MAAM;AAAA,IAAI,CAAC,SACvB,gBAAgB,eAAe,UAAU,KAAK,GAAG,GAAG,MAAM,OAAO,QAAQ;AAAA,EAC3E;AACF;AAcO,SAAS,sBACd,QACA,YACqB;AACrB,MAAI,QAAQ,mBAAmB,QAAQ,UAAU;AACjD,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,QAAQ;AAAA,IACpD,OAAO;AAAA,EACT;AACA,QAAM,WAAW,SAAS,OAAO,WAC7B,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI,MACjC,OAAO;AAEX,MAAI,aAAa,OAAO,UAAU;AAChC,YAAQ,MAAM;AAAA,MAAI,CAAC,SACjB,KAAK,SAAS,WAAW,EAAE,GAAG,MAAM,KAAK,SAAS,IAAI;AAAA,IACxD;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,MAAM;AAC3B;AAKO,SAAS,4BACd,QACA,MACA,kBACoB;AACpB,SAAO,gBAAgB,oBAAoB,QAAQ,KAAK,GAAG,GAAG,MAAM,gBAAgB;AACtF;AAEA,SAAS,gBACP,cACA,MACA,kBACoB;AACpB;AACE,UAAM,KAAK,OAAO,aAAa,OAAO,WAAW,aAAa,KAAK;AACnE,UAAMC,QAAO,cAAc,aAAa,IAAI,IAAI,aAAa,OAAO;AACpE,UAAM,SAAS,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AAEvF,UAAM,aAAiC;AAAA,MACrC,KAAK,KAAK;AAAA,MACV,UAAU,KAAK,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM,SAAS,CAAC,IAAI,KAAK;AAAA,MACpE,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,MACX,MAAAA;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,eAAe,QAAQ,KAAK,UAAU,MAAM;AAAA,IAC9C;AAEA,QAAI,KAAK,QAAQ,QAAQ;AAGvB,YAAM,SAAqD,KAAK,OAAO,IAAI,CAAC,EAAE,MAAM,SAAS,MAAM;AACjG,cAAM,gBAAgB,cAAc,aAAa,IAAI,CAAC,IACjD,aAAa,IAAI,IAClB,CAAC;AACL,cAAM,QAAQ,OAAO,cAAc,UAAU,WAAW,cAAc,QAAQ;AAC9E,cAAM,YAAY,cAAc;AAChC,YAAI;AACJ,YAAI,gBAAgB;AAEpB,YAAI,UAAU,QAAQ;AACpB,cAAI,UAAU;AACd,kBAAQ,SAAS,IAAI,CAAC,YAAY;AAChC,kBAAM,eAAe,cAAc,cAAc,OAAO,CAAC,IACpD,cAAc,OAAO,IACtB,CAAC;AACL,kBAAM,iBACJ,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AACtE,kBAAM,MAAM,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AACpF,kBAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,kBAAM,UAAU,aAAa;AAC7B,kBAAM,OAA2B;AAAA,cAC/B,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,UAAU;AAAA,cACpB,WAAW,UAAU;AAAA,cACrB,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACtD,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACnD,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,YAC7D;AACA,gBAAI,YAAY,OAAW,WAAU;AACrC,6BAAiB,UAAU;AAC3B,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,iBACJ,OAAO,cAAc,aAAa,WAAW,cAAc,WAAW;AACxE,gBAAM,MAAM,mBAAmB,cAAc,UAAU,IAAI,cAAc,aAAa;AACtF,gBAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,gBAAM,UAAU,cAAc;AAC9B,0BAAgB,UAAU;AAC1B,kBAAQ;AAAA,YACN;AAAA,cACE,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,UAAU;AAAA,cACpB,WAAW,UAAU;AAAA,cACrB,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,UAAU;AAAA,cAC1D,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACnD,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,OAAO,UAAU,eAAe,MAAM;AAAA,MACvD,CAAC;AAED,iBAAW,SAAS;AACpB,iBAAW,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AACnD,iBAAW,WAAW,OAAO,OAAO,CAAC,KAAK,UAAU,KAAK,IAAI,KAAK,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAClG,iBAAW,OAAO,OAAO;AAAA,QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC,CAAC;AAAA,MACtE;AACA,iBAAW,KAAK,OAAO;AAAA,QACrB,OAAO,IAAI,CAAC,UAAU;AACpB,gBAAM,OAAO,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAC/C,iBAAO,CAAC,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,QACnE,CAAC;AAAA,MACH;AAEA,iBAAW,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO;AACxD,iBAAW,MAAM,WAAW,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AACnF,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,UAAU,QAAQ;AAGzB,UAAI,UAAmC,EAAE,GAAIA,SAAQ,CAAC,EAAG;AACzD,UAAI,SAAS;AACb,YAAM,QAA8B,KAAK,SAAS,IAAI,CAAC,YAAY;AACjE,cAAM,eAAe,cAAc,aAAa,OAAO,CAAC,IACnD,aAAa,OAAO,IACrB,CAAC;AACL,cAAM,iBACJ,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AACtE,cAAM,MAAM,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AACpF,cAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,cAAM,KAAK,cAAc,aAAa,EAAE,IAAI,aAAa,KAAK,CAAC;AAC/D,cAAM,OAA2B;AAAA,UAC/B,KAAK;AAAA,UACL;AAAA,UACA,UAAU,UAAU;AAAA,UACpB,WAAW,UAAU;AAAA,UACrB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,QAC7D;AACA,kBAAU,EAAE,GAAG,SAAS,GAAG,GAAG;AAC9B,kBAAU,UAAU;AACpB,eAAO;AAAA,MACT,CAAC;AAED,iBAAW,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,QAAQ,MAAM,CAAC;AAC1D,iBAAW,WAAW;AACtB,iBAAW,KAAK;AAAA,IAClB,OAAO;AACL,YAAM,iBAAiB,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AAC3F,YAAM,KAAK,cAAc,aAAa,EAAE,IAAI,aAAa,KAAK;AAE9D,UAAI,QAAQ;AACV,cAAM,YAAY,sBAAsB,QAAQ,cAAc;AAC9D,mBAAW,WAAW,UAAU;AAChC,mBAAW,YAAY,UAAU;AACjC,mBAAW,aAAa,UAAU;AAClC,mBAAW,MAAM,gBAAgB,UAAU,UAAU;AACrD,mBAAW,KAAK;AAChB,YAAIA,SAAQ,IAAI;AACd,qBAAW,SAAS;AAAA,YAClB;AAAA,cACE,OAAO;AAAA,cACP,UAAU,UAAU;AAAA,cACpB,OAAO;AAAA,gBACL;AAAA,kBACE,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU,UAAU;AAAA,kBACpB,WAAW,UAAU;AAAA,kBACrB,OAAOA;AAAA,kBACP;AAAA,kBACA,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,gBAC7D;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAGL,mBAAW,WAAW;AACtB,mBAAW,KAAK;AAChB,YAAIA,SAAQ,IAAI;AACd,gBAAM,OAAO,sBAAsB,yBAAyB,cAAc;AAC1E,qBAAW,WAAW,KAAK;AAC3B,qBAAW,SAAS;AAAA,YAClB;AAAA,cACE,OAAO;AAAA,cACP,UAAU,KAAK;AAAA,cACf,OAAO;AAAA,gBACL;AAAA,kBACE,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU,KAAK;AAAA,kBACf,WAAW;AAAA,kBACX,OAAOA;AAAA,kBACP;AAAA,kBACA,OAAO,YAAY,KAAK,YAAY,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,QAAQ;AAC5B,YAAM,QAAQ,IAAI,IAAY,OAAO,KAAKA,SAAQ,CAAC,CAAC,CAAC;AACrD,iBAAW,SAAS,WAAW,QAAQ;AACrC,mBAAW,QAAQ,MAAM,OAAO;AAC9B,qBAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,EAAG,OAAM,IAAI,IAAI;AAAA,QACzD;AAAA,MACF;AACA,iBAAW,QAAQ,MAAM,KAAK,KAAK;AAAA,IACrC;AAEA,eAAW,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO;AACxD,eAAW,MAAM,WAAW,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AAEnF,WAAO;AAAA,EACT;AACF;AAIA,SAAS,eAAe,OAA6B,KAAiC;AACpF,aAAW,QAAQ,OAAO;AACxB,QAAI,MAAM,KAAK,SAAS,KAAK,SAAU,QAAO;AAAA,EAChD;AACA,SAAO,MAAM,MAAM,SAAS,CAAC;AAC/B;AAIA,SAAS,cAAc,OAA6B,MAAc,KAAsB;AACtF,QAAM,OAAO,eAAe,OAAO,GAAG;AACtC,QAAM,SAAS,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM;AAC5C,MAAI,QAAQ,KAAK,IAAI;AACnB,UAAM,QAAQ,YAAY,KAAK,OAAO,MAAM;AAC5C,WAAO,oBAAoB,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAAA,EACnE;AACA,SAAO,KAAK,MAAM,IAAI;AACxB;AASO,SAAS,iBACd,MACA,MACA,YAAY,MACa;AACzB,QAAM,QAAQ,KAAK;AACnB,QAAM,UAAU,KAAK,SAAS,YAAY,QAAQ;AAGlD,QAAM,UAAU,QAAQ,KAAK,MAAO,WAAW,YAAY;AAC3D,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,eAAe,UAAU,YAAY,KAAK,KAAK;AAErD,QAAM,OAAO,CAAC,MAAuB,UAAU,IAAI,QAAQ;AAE3D,QAAM,UAAU,UAAU,KAAK,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI;AAC5D,QAAM,WAAW,QAAQ,IAAI,MAAM,UAAU,OAAO,GAAG,CAAC,IAAI,UAAU,IAAI;AAE1E,MAAI;AACJ,MAAI,YAAY;AAEhB,MAAI,KAAK,OAAO,UAAU,KAAK,OAAO,QAAQ;AAK5C,cAAU,CAAC;AACX,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,QAAQ,MAAM,SAAS,SAAY,CAAC,MAAM,IAAI,IAAI,KAAK;AAC7D,iBAAW,QAAQ,OAAO;AACxB,cAAM,aAAa,MAAM,MAAM,CAAC,GAAG,MAAM,IAAI;AAC7C,YAAI,CAAC,SAAS;AACZ,cAAI,eAAe,OAAW,SAAQ,IAAI,IAAI;AAC9C;AAAA,QACF;AACA,cAAM,QAAQ,eAAe,MAAM;AACnC,YAAI,SAAS,GAAG;AACd,cAAI,eAAe,OAAW,SAAQ,IAAI,IAAI;AAC9C;AAAA,QACF;AACA,cAAM,MAAM,WAAW,MAAM,WAAW,IAAI,QAAQ,MAAM,WAAW;AACrE,cAAM,QAAQ,cAAc,MAAM,OAAO,MAAM,GAAG;AAClD,YAAI,UAAU,OAAW,SAAQ,IAAI,IAAI;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,SAAS,KAAK,OAAO,CAAC;AAC5B,QAAI,WAAW,KAAK,iBAAiB,OAAO,SAAS,QAAW;AAC9D,kBAAY,OAAO,MAAM,QAAQ,eAAe,OAAO,OAAO,OAAO,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX;AAAA,IACA,QAAQ,WAAW,CAAC;AAAA,IACpB;AAAA,IACA;AAAA,IACA,MAAM,KAAK,gBAAgB,YAAY;AAAA,IACvC,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,SAAS,UAAU,KAAK,KAAK,KAAK;AAAA,IAClC,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA,IACV;AAAA,EACF;AACF;AAOO,SAAS,oBAAoBA,OAAe,IAAa,GAAoB;AAClF,MAAI,OAAOA,UAAS,YAAY,OAAO,OAAO,UAAU;AACtD,WAAOA,SAAQ,KAAKA,SAAQ;AAAA,EAC9B;AACA,MAAI,OAAOA,UAAS,YAAY,OAAO,OAAO,UAAU;AACtD,UAAM,QAAQ,aAAaA,OAAM,IAAI,CAAC;AACtC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,MAAI,cAAcA,KAAI,KAAK,cAAc,EAAE,GAAG;AAC5C,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,OAAO,KAAKA,KAAI,GAAG;AACnC,aAAO,GAAG,IAAI,OAAO,KAAK,oBAAoBA,MAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAAIA,MAAK,GAAG;AAAA,IACjF;AACA,eAAW,OAAO,OAAO,KAAK,EAAE,GAAG;AACjC,UAAI,EAAE,OAAOA,OAAO,QAAO,GAAG,IAAI,GAAG,GAAG;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAMA,QAAO;AAC1B;AAEA,SAAS,SAAS,KAAsD;AACtE,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO;AAC7B,MAAI,IAAI,IAAI,MAAM,CAAC;AACnB,MAAI,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAC7D,SAAO;AAAA,IACL,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,aAAa,GAAW,GAAW,GAA0B;AACpE,QAAM,KAAK,SAAS,CAAC;AACrB,QAAM,KAAK,SAAS,CAAC;AACrB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,QAAM,IAAI,MAAM,GAAG,GAAG,CAAC;AACvB,QAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAC9D,QAAM,MAAM,CAAC,MAAc,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC7D,SAAO,MAAM,CAAC,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AACxD;AAOO,SAAS,gBAAgB,YAAuE;AACrG,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO;AAAA,MACL,oBAAoB,GAAG,OAAO,WAAW,QAAQ,CAAC;AAAA,MAClD,0BAA0B,gBAAgB,WAAW,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,eAAe,OAAO,WAAW,IAAI,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AACnF,QAAM,WAAW,WAAW,kBAAkB,qBAAqB,MAAM;AACzE,QAAM,SAAS,WAAW,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,YAAY,CAAC;AAExE,SAAO;AAAA,IACL,oBAAoB,GAAG,OAAO,QAAQ,CAAC;AAAA,IACvC,0BACE,SAAS,OACP,sBAAsB,OAAO,MAAM,MAAM,CAAC,eAC1C;AAAA,EACN;AACF;AAOO,SAAS,6BACd,QACA,SACA,UACA,SAC2B;AAC3B,QAAM,UAAU,EAAE,GAAG,OAAO;AAC5B,QAAM,OAAO,CAAC,MAAc,aAAqB;AAC/C,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,mBAAmB,GAAG,EAAG,SAAQ,IAAI,IAAI,sBAAsB,KAAK,QAAQ,EAAE;AAAA,EACpF;AAEA,MAAI,SAAS;AACX,SAAK,GAAG,OAAO,IAAI,OAAO,eAAe,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,WAAW,CAAC,CAAC;AAC9F,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,UAAU,SACpB,SAAS,OAAO,CAAC,KAAK,OAAO,MAAM,YAAY,OAAO,GAAG,OAAO,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IACtF,YAAY,OAAO,GAAG,OAAO,WAAW,CAAC;AAE7C,OAAK,GAAG,OAAO,eAAe,KAAK;AACnC,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAMA,SAAS,oBACP,QACA,SACyB;AACzB,QAAM,SAAS,GAAG,OAAO;AACzB,QAAM,SAAkC,CAAC;AACzC,QAAM,UAAU,OAAO,QAAQ,MAAM,EAClC,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,MAAM,CAAC,EAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,UAAU,KAAK,MAAM,OAAO,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,EAAE,EAClF,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,SAAS,EAAE,SAAS,MAAM;AAEvD,aAAW,EAAE,UAAU,MAAM,KAAK,SAAS;AACzC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,YAAM,WAAW,KAAK,SAAS,CAAC,CAAC;AACjC,aAAQ,cAAc,QAAQ,IAAI,WAAY,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC;AAAA,IACrE;AACA,SAAK,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI,mBAAmB,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,kBAAkB;AAC7D,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,CAAC;AAAA,EAChF;AACF;AAGO,SAAS,gBACd,OACA,IACA,eACA,kBACQ;AACR,SAAO,MAAM,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,mBAAmB,KAAK,aAAa,CAAC,CAAC;AAC3F;AAGO,SAAS,cAAc,IAAY,UAAkB,kBAAkC;AAC5F,SAAO,MAAM,OAAO,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,mBAAmB,QAAQ,CAAC;AACtE;AAEO,SAAS,mBAAmB,UAAkB,IAAY,kBAAkC;AACjG,SAAO,MAAM,OAAO,QAAQ,GAAG,4BAA4B,mBAAmB,EAAE;AAClF;AAEO,SAAS,qBACd,OACA,IACA,UACkC;AAClC,QAAM,YAAY,MAAM,OAAO,KAAK,GAAG,GAAG,KAAK,WAAW,0BAA0B;AACpF,SAAO,EAAE,IAAI,WAAW,UAAU,OAAO,KAAK,WAAW,SAAS,EAAE;AACtE;AAIO,SAAS,gBACd,UACA,IACA,iBACA,kBACQ;AACR,QAAM,MAAM,KAAK,IAAI,4BAA4B,mBAAmB,KAAK,eAAe;AACxF,SAAO,MAAM,OAAO,QAAQ,GAAG,4BAA4B,GAAG;AAChE;AAIO,SAAS,+BACd,QACA,OAC2B;AAC3B,QAAM,aAAwC,EAAE,GAAG,OAAO;AAK1D,aAAW,QAAQ,OAAO,KAAK,UAAU,GAAG;AAC1C,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO,WAAW,IAAI;AAAA,EACtD;AAEA,QAAM,wBAAwB,CAAC,gBAAwB,iBAAyB;AAC9E,UAAM,MAAM,WAAW,cAAc;AACrC,QAAI,CAAC,mBAAmB,GAAG,EAAG;AAC9B,QAAI,gBAAgB,GAAG,GAAG;AAIxB,iBAAW,YAAY,IAAI,0BAA0B,GAAG;AAAA,IAC1D;AACA,eAAW,cAAc,IAAI;AAAA,MAC3B;AAAA,MACA,YAAY,WAAW,YAAY,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,eAAW,WAAW,KAAK,YAAY,CAAC,GAAG;AACzC;AAAA,QACE,GAAG,KAAK,GAAG,IAAI,OAAO;AAAA,QACtB,GAAG,KAAK,GAAG,IAAI,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,0BAAsB,GAAG,KAAK,GAAG,eAAe,GAAG,KAAK,GAAG,WAAW;AAItE,eAAW,SAAS,KAAK,UAAU,CAAC,GAAG;AACrC,YAAM,WAAW,GAAG,KAAK,GAAG,IAAI,MAAM,IAAI;AAC1C,iBAAW,WAAW,MAAM,YAAY,CAAC,GAAG;AAC1C;AAAA,UACE,GAAG,QAAQ,IAAI,OAAO;AAAA,UACtB,GAAG,QAAQ,IAAI,OAAO;AAAA,QACxB;AAAA,MACF;AACA,4BAAsB,GAAG,QAAQ,eAAe,GAAG,QAAQ,WAAW;AACtE,UAAI,WAAW,GAAG,QAAQ,QAAQ,MAAM,GAAG;AACzC,eAAO,WAAW,GAAG,QAAQ,QAAQ;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,WAAW,GAAG,KAAK,GAAG,OAAO;AAAA,EACtC;AACA,SAAO;AACT;AAIO,SAAS,YAAY,MAAc,SAAS,OAAe;AAChE,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,QAAM,UAAU,OAAO,UAAU;AACjC,QAAM,cAAc,SAChB,QAAQ,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,IAClC,OAAO,KAAK,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,WAAW;AAC3D;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,GAAG,OAAO,KAAK,CAAC;AACzB;AAEO,SAAS,gBAAgB,SAAyB;AACvD,QAAM,QAAQ,cAAc,KAAK,OAAO;AACxC,SAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,KAAK,YAAY,OAAO;AACzD;;;ACl1CO,SAAS,oBACd,MACqC;AACrC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,OAAO,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,EAAE,SAAS,QAAQ,IAAI,GAAG,OAAO,EAAE;AAC5C;AAEO,SAAS,kBACd,IACA,MACA,UACA,QACA,MACc;AACd,QAAM,eAAe,oBAAoB,IAAI;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,aAAa;AAAA,IACnB,WAAW,aAAa;AAAA,IACxB,OAAO,OAAO;AAAA,EAChB;AACF;AAMO,SAAS,oBACd,aACA,WACA,kBACA,WACA,SACuB;AAxEzB;AAyEE,QAAM,SAAkC;AAAA,IACtC,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,GAAG;AAAA,EACL;AAEA,QAAM,OAAO,SAAS,UAAU,UAAU,SAAS;AACnD,QAAM,aAAa,OAAO,IAAI,UAAU,QAAQ,OAAO,KAAK,UAAU;AACtE,aAAW,QAAQ,aAAa;AAC9B,UAAM,QAAQ,iBAAiB,MAAM,UAAU,MAAM,SAAS;AAC9D,QAAI,KAAK,OAAO;AACd,YAAM,SAAU,YAAO,KAAK,WAAZ,aAAuB,CAAC;AACxC,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,aAAO,KAAK,GAAG,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;AChFA,IAAM,uBAAN,MAA2B;AAAA,EAA3B;AACE,SAAQ,UAAU;AAClB,SAAQ,cAAc;AACtB,SAAQ,cAAc,oBAAI,IAAkC;AAC5D,SAAQ,YAAY,oBAAI,IAAc;AAAA;AAAA,EAEtC,aAAsB;AACpB,eAAW,cAAc,KAAK,YAAY,OAAO,GAAG;AAClD,UAAI,WAAW,YAAY,OAAW,QAAO,WAAW;AAAA,IAC1D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,IAAY,YAA8C;AAC3E,UAAM,WAAW,KAAK,WAAW;AACjC,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,UAAU,WAAW;AAC1B,WAAK,cAAc;AAAA,IACrB;AACA,SAAK,YAAY,IAAI,IAAI,UAAU;AACnC,QAAI,aAAa,KAAK,WAAW,EAAG,MAAK,OAAO;AAEhD,WAAO,MAAM;AACX,YAAM,SAAS,KAAK,WAAW;AAC/B,WAAK,YAAY,OAAO,EAAE;AAC1B,UAAI,KAAK,YAAY,SAAS,EAAG,MAAK,cAAc;AACpD,UAAI,WAAW,KAAK,WAAW,EAAG,MAAK,OAAO;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,iBAAiB,IAAY,YAAwC;AACnE,QAAI,CAAC,KAAK,YAAY,IAAI,EAAE,EAAG;AAC/B,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,YAAY,IAAI,IAAI,UAAU;AACnC,QAAI,aAAa,KAAK,WAAW,EAAG,MAAK,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,SAAwB;AACrC,UAAM,UAAU,KAAK,WAAW;AAChC,QAAI,YAAY,QAAS;AAEzB,UAAM,aAAa,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EAAE;AAAA,MACvD,CAAC,eAAe,WAAW,YAAY;AAAA,IACzC;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,QAAQ,CAAC,eAAe,WAAW,qBAAqB,OAAO,CAAC;AAC3E;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,YAAY,QAAQ,CAAC,eAAe,WAAW,qBAAqB,OAAO,CAAC;AACjF,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAe;AACb,SAAK,eAAe,CAAC,KAAK,WAAW,CAAC;AAAA,EACxC;AAAA,EAEA,UAAU,UAAgC;AACxC,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,SAAe;AACrB,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EACjD;AACF;AAEO,IAAM,kBAAkC,oBAAI,qBAAqB;;;AC9EjE,SAAS,qBACd,UACA,WACA,QACQ;AACR,QAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AAE9C,MAAI,aAAa,qBAAqB,aAAa,sBAAsB;AACvE,WAAO,cAAc,QAAQ,uBAAuB,SAAS;AAAA;AAAA;AAAA,EAG/D,OAAO;AAAA;AAAA;AAAA,gDAGuC,QAAQ;AAAA;AAAA,yCAEf,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,0CAKP,QAAQ;AAAA;AAAA,EAEhD;AAEA,SAAO,cAAc,QAAQ,uBAAuB,SAAS;AAAA;AAAA;AAAA,EAG7D,OAAO;AAAA;AAAA;AAAA,gDAGuC,QAAQ;AACxD;;;AC/BO,IAAM,eAAe,OAAO,YAAY,eAAe,SAAS,KAAK,WACxE,QAAQ,IAAI,aAAa,eACzB,OAAO,gBAAgB,eAAgB,YAAoB,KAAK,OAC7D,YAAoB,IAAI,SAAS,eAClC;;;APSC,SAAS,mBACd,MACA,QACA,SACiC;AACjC,QAAM,aAAaC,gBAAe;AAClC,QAAM,cAAc,SAAS,OAAO;AACpC,QAAM,UAAU,SAAS,MAAM,GAAG,IAAI,IAAI,UAAU;AACpD,QAAM,SAAS,WAAW,MAAM,oBAAoB,MAAM,CAAC;AAC3D,QAAM,CAAC,YAAY,aAAa,IAAI,aAAa,UAAU,UAAU,OAAO,CAAC;AAC7E,QAAM,CAAC,WAAW,YAAY,IAAI,aAAa,cAAc,aAAa,OAAO,CAAC;AAClF,QAAM,iBAAiB,WAAW,MAAM,sBAAsB,OAAO,GAAG,WAAW,CAAC,CAAC;AACrF,QAAM,YAAY,MAAM,oBAAoB,SAAS,IAAI,EAAE;AAC3D,MAAI,UAAU;AAEd,QAAM,OAAO,MAAM,cAAc,KAAK,OAAO;AAC7C,QAAM,QAAQ,MAAM,cAAc,MAAM,OAAO;AAC/C,QAAM,SAAS,MAAM,cAAc,OAAO,OAAO;AACjD,QAAM,OAAO,CAAC,SAAiB,cAAc,KAAK,SAAS,IAAI;AAE/D,MAAI,CAACC,WAAU;AACb,UAAM,oBAAoB,UAAU,UAAU,SAAS,MAAM;AAC3D,oBAAc,UAAU,UAAU,OAAO,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,uBAAuB,cAAc,UAAU,SAAS,MAAM;AAClE,mBAAa,cAAc,aAAa,OAAO,CAAC;AAAA,IAClD,CAAC;AACD,IAAAC,WAAU,MAAM;AACd,wBAAkB;AAClB,2BAAqB;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,EAAAC,SAAQ,MAAM;AACZ,cAAU,cAAc,SAAS,MAAM,OAAO,EAAE,YAAY,QAAW;AAAA,MACrE,iBAAiB;AAAA,MACjB,SAAS,SAAS;AAAA,MAClB,MAAM;AAAA,IACR,CAAC;AACD,kBAAc,UAAU,UAAU,OAAO,CAAC;AAE1C,UAAM,gBAAgB,eAAe;AACrC,kBAAc;AAAA,MACZ,kBAAkB,SAAS,MAAM,cAAc,UAAU,OAAO,GAAG,SAAS,IAAI;AAAA,MAChF,EAAE,UAAU,SAAS,YAAY,KAAK;AAAA,IACxC;AACA,iBAAa,cAAc,aAAa,OAAO,CAAC;AAChD,cAAU;AAEV,IAAAD,WAAU,MAAM;AACd,gBAAU;AACV,oBAAc,WAAW,OAAO;AAChC,gBAAU,gBAAgB,OAAO;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,eAAa,MAAM;AACjB,UAAM,gBAAgB,OAAO;AAC7B,UAAM,gBAAgB,eAAe;AACrC,QAAI,CAAC,QAAS;AACd,kBAAc;AAAA,MACZ,kBAAkB,SAAS,MAAM,cAAc,UAAU,eAAe,SAAS,IAAI;AAAA,IACvF;AAAA,EACF,CAAC;AAED,SAAO,WAAW,MAAM;AACtB,UAAM,gBAAgB,eAAe;AACrC,WAAO;AAAA,MACL,cAAc;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,UAAU;AAAA,MACV,EAAE,MAAM,OAAO,QAAQ,KAAK;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;;;;;;;;;;;;AQ5FA,SAASE,gBAAAA,gBAAcC,WAAAA,UAASC,QAAAA,QAAMC,OAAAA,YAAW;AACjD,SAASC,UAAAA,eAAc;;;ACDvB,SAAS,gBAAAC,eAAc,gBAAAC,eAAc,MAAM,aAAAC,kBAAgC;AAC3E,SAAS,YAAAC,iBAAgB;AAYlB,SAAS,UACd,MACA,WACa;AACb,MAAIA,UAAU,QAAO;AACrB,QAAM,QAAQ,KAAQ,CAAC,QAAQ;AAE7B,QAAI,MAAM,KAAK,CAAC;AAChB,WAAO,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC;AAAA,EAC1C,CAAC;AACD,SAAO;AACT;AAoBO,SAAS,uBACd,aACkB;AAClB,QAAM,CAAC,QAAQ,SAAS,IAAIF,cAAa,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,cAAa,KAAK;AAChD,MAAI;AACJ,MAAI,WAAmC;AAEvC,EAAAC,WAAU,MAAM,UAAU,KAAK,CAAC;AAEhC,QAAM,OAAO,MAAM;AACjB,cAAU,KAAK;AACf,eAAW;AACX,eAAW,IAAI;AACf,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,QAAQ,MAAM;AAClB,cAAU,KAAK;AACf,QAAI,CAAC,MAAM,CAAC,QAAQ,GAAG;AACrB,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,cAAU,KAAK;AACf,eAAW,YAAY,IAAI,MAAM;AAC/B,iBAAW,KAAK;AAChB,iBAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC,SAAsB;AAC7B,WAAK;AAAA,IACP;AAAA,IACA,UAAU,CAAC,WAAiB,QAAQ,IAAI,SAAS,MAAM,CAAC;AAAA,EAC1D;AACF;AAOO,SAAS,sBAAsB,MAK7B;AACP,EAAAF,cAAa,MAAM;AACjB,QAAI,CAAC,KAAK,OAAO,EAAG;AAEpB,UAAM,cAAc,CAAC,MAAkB;AACrC,UAAI,EAAE,kBAAkB,QAAQ,KAAK,SAAS,EAAE,MAAM,EAAG;AACzD,WAAK,UAAU;AAAA,IACjB;AACA,aAAS,iBAAiB,aAAa,WAAW;AAClD,IAAAE,WAAU,MAAM,SAAS,oBAAoB,aAAa,WAAW,CAAC;AAEtE,UAAM,mBAAmB,KAAK;AAC9B,QAAI,kBAAkB;AACpB,YAAM,UAAU,MAAM,iBAAiB;AACvC,aAAO,iBAAiB,UAAU,OAAO;AACzC,aAAO,iBAAiB,UAAU,SAAS,IAAI;AAC/C,MAAAA,WAAU,MAAM;AACd,eAAO,oBAAoB,UAAU,OAAO;AAC5C,eAAO,oBAAoB,UAAU,SAAS,IAAI;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;;ACtHA,SAASE,eAAeC,YAAYC,gBAAAA,eAAcC,WAAAA,UAASC,aAAAA,kBAAsB;;;ACO1E,SAAS,gBAAgB,MAAsB;AACpD,QAAM,IAAI,KAAK,SAAS;AACxB,QAAM,MAAM,EAAE,QAAQ,GAAG;AACzB,SAAO,QAAQ,KAAK,IAAI,EAAE,SAAS,MAAM;AAC3C;AAEO,SAAS,WAAW,KAAa,MAAsB;AAC5D,QAAM,MAAM,KAAK,MAAM,MAAM,IAAI,IAAI;AACrC,SAAO,WAAW,IAAI,QAAQ,gBAAgB,IAAI,CAAC,CAAC;AACtD;AAEO,SAAS,iBAAiB,SAAsB,UAAkC;AACvF,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,SAAS,QAAQ;AAC9B,SAAO,SAAS,SAAS,QAAQ,OAC7B,SAAS,WAAW,QAAQ,MAC5B,QAAQ,QAAQ;AACtB;AAEO,SAAS,iBACd,SACA,MACA,SACA,eACA,WACM;AACN,QAAM,eAAe,UAAU,SAAS,SAAS,IAAI;AACrD,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,eAAe,YAAY,aAAa,CAAC;AACtF,YAAU,YAAY,SAAS,MAAM,WAAW,UAAU,aAAa,CAAC;AAC1E;AAEO,SAAS,aAAa,UAAkB,KAAa,KAAqB;AAC/E,QAAM,cAAc,WAAW,QAAQ,MAAM;AAC7C,QAAM,UAAU,KAAK,MAAM,aAAa,EAAE,IAAI;AAC9C,MAAI,KAAK,IAAI,aAAa,OAAO,KAAK,SAAS;AAC7C,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC;AACA,SAAO;AACT;AAIO,SAAS,iBAA0B;AACxC,QAAM,KAAK,SAAS;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,MAAM,GAAG;AACf,MAAI,QAAQ,WAAW,QAAQ,WAAY,QAAO;AAClD,MAAK,GAAmB,oBAAoB,OAAQ,QAAO;AAC3D,SAAO;AACT;AAEO,SAAS,kBAAkB,GAAkF;AAClH,MAAI,EAAE,OAAQ,QAAO;AACrB,MAAI,EAAE,SAAU,QAAO;AACvB,MAAI,EAAE,QAAS,QAAO;AACtB,SAAO;AACT;AAEO,SAAS,YAAY,UAAyB,MAAkC;AACrF,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,KAAM,QAAO;AAClC,QAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU;AACjD,YAAM,QAAQ,YAAY,QAAQ,UAAU,IAAI;AAChD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB;AAIzB,SAAS,uBAAuB,aAA6B;AAClE,UAAQ,aAAa;AAAA,IACnB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAe,aAAO;AAAA,IAC3B;AAAS,aAAO;AAAA,EAClB;AACF;AAEO,SAAS,qBAAqB,IAA4B;AAC/D,QAAM,cAAc,GAAG,eAAe;AACtC,QAAM,cAAc,uBAAuB,WAAW;AACtD,MAAI,CAAC,GAAG,IAAK,QAAO;AACpB,QAAM,MAAM,eAAe,GAAG,QAAQ;AACtC,SAAO,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,WAAW;AACrD;AAEO,SAAS,qBAAqB,IAA4B;AAC/D,MAAI,CAAC,GAAG,IAAK,QAAO;AACpB,QAAM,MAAM,eAAe,GAAG,QAAQ;AACtC,SAAO,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,CAAC;AACtC;AAEA,SAAS,eAAe,UAA2B;AACjD,SAAO,aAAa,QAAQ,WACxB,aAAa,UAAU,WACvB,aAAa,SAAS,WACtB;AACN;;;ADhGA,IAAMC,eAA8B;EAAEC,eAAe;EAAMC,YAAY;AAAK;AAE5E,IAAMC,kBAAkBC,cAAmC,MAAMJ,YAAY;AAEtE,SAASK,qBAAqB;AACnC,SAAOC,WAAWH,eAAe;AACnC;AAEO,SAASI,iBAAiBC,OAAkC;AACjE,QAAM,CAACC,gBAAgBC,iBAAiB,IAAIC,cAA4BX,YAAY;AAIpF,QAAMY,oBAAoBA,CAACX,eAA8BC,eAA8B;AACrFQ,sBAAmBG,UACjBA,KAAKZ,kBAAkBA,iBAAiBY,KAAKX,eAAeA,aACxDW,OACA;MAAEZ;MAAeC;IAAW,CACjC;EACH;AAEA,QAAMY,aAAa,oBAAIC,IAAY;AACnC,MAAIC,aAAa;AACjB,MAAIC,aAA4B;AAChC,MAAIC,kBAAkB;AAEtB,QAAMC,sBAAuBC,iBAAwB;AACnD,eAAWC,OAAOP,YAAY;AAC5B,YAAMQ,SAASC,UAAUC,UAAU;AACnC,iBAAWC,SAASH,QAAQ;AAC1B,mBAAW,CAACI,MAAMC,QAAQ,KAAKC,OAAOC,QAAQJ,MAAMK,SAAS,GAAG;AAC9D,cAAI,CAACH,SAASN,IAAK;AACnB,cAAIM,SAASN,IAAIU,YAAY,MAAMV,IAAK;AACxC,eAAKM,SAASP,eAAe,cAAcA,YAAa;AACxD,gBAAMY,UAAUT,UAAUU,SAASR,MAAMS,EAAE,GAAGC,WAC1CC,YAAYX,MAAMU,UAAUT,IAAI,IAChC;AACJ,cAAIM,WAAWA,QAAQK,SAAS,UAAU;AACxC,mBAAO;cAAEC,SAASb,MAAMS;cAAIR;cAAMM;cAASL;YAAS;UACtD;QACF;MACF;IACF;AACA,WAAO;EACT;AAEAY,EAAAA,SAAQ,MAAM;AACZ,UAAMC,gBAAiBC,OAAqB;AAC1C,UAAIC,eAAe,EAAG;AAEtB,YAAMrB,MAAMoB,EAAEpB,IAAIU,YAAY;AAG9B,UAAIV,QAAQ,eAAeA,QAAQ,gBAAgBA,QAAQ,aAAaA,QAAQ,aAAa;AAC3F,YAAIP,WAAW6B,OAAO,GAAG;AACvB,gBAAMC,UAASzB,oBAAoB,QAAQ,KAAKA,oBAAoB,MAAM,KAAKA,oBAAoB,MAAM;AACzG,cAAIyB,WAAUA,QAAOZ,QAAQK,SAAS,UAAU;AAC9CI,cAAEI,eAAe;AACjB,kBAAMC,YAAazB,QAAQ,gBAAgBA,QAAQ,YAAa,IAAI;AACpE,kBAAM0B,gBAAgBC,iBAAiBJ,QAAOZ,SAASY,QAAOjB,QAAQ;AACtEsB,6BAAiBL,QAAON,SAASM,QAAOlB,MAAMkB,QAAOZ,SAASe,eAAeD,SAAS;AACtF;UACF;QACF;MACF;AAEA,YAAMI,iBAAiBpC,WAAWqC,IAAI9B,GAAG;AACzCP,iBAAWsC,IAAI/B,GAAG;AAElB,YAAMgC,WAAWC,kBAAkBb,CAAC;AACpC,YAAMG,SAASrB,UAAUgC,sBAAsBlC,KAAKgC,QAAQ;AAC5D,UAAIT,QAAQ;AACVhC,0BAAkBgC,OAAON,SAASM,OAAOlB,IAAI;AAG7C,YAAI,CAACwB,kBAAkBN,OAAOZ,QAAQK,SAAS,UAAU;AACvD,gBAAMmB,eAAejC,UAAUkC,SAASb,OAAON,SAASM,OAAOlB,IAAI;AACnEH,oBAAUmC,YAAYd,OAAON,SAASM,OAAOlB,MAAM,CAAC8B,YAAY;QAClE;MACF;AAGA,UAAI,CAACN,gBAAgB;AACnBjC,qBAAa;AACbC,0BAAkB;MACpB;IACF;AAEA,UAAMyC,cAAelB,OAAqB;AACxC,YAAMpB,MAAMoB,EAAEpB,IAAIU,YAAY;AAC9BjB,iBAAW8C,OAAOvC,GAAG;AAGrBL,mBAAa;AACbC,mBAAa;AACbC,wBAAkB;AAElB,UAAIJ,WAAW6B,SAAS,GAAG;AACzB/B,0BAAkB,MAAM,IAAI;MAC9B,OAAO;AACL,YAAIiD,QAAQ;AACZ,mBAAWC,gBAAgBhD,YAAY;AACrC,gBAAMuC,WAAWC,kBAAkBb,CAAC;AACpC,gBAAMG,SAASrB,UAAUgC,sBAAsBO,cAAcT,QAAQ;AACrE,cAAIT,QAAQ;AACVhC,8BAAkBgC,OAAON,SAASM,OAAOlB,IAAI;AAC7CmC,oBAAQ;AACR;UACF;QACF;AACA,YAAI,CAACA,OAAO;AACVjD,4BAAkB,MAAM,IAAI;QAC9B;MACF;IACF;AAGA,UAAMmD,cAAetB,OAAkB;AACrC,UAAIC,eAAe,EAAG;AAEtB,YAAMW,WAAWC,kBAAkBb,CAAC;AAGpC,UAAI3B,WAAW6B,OAAO,GAAG;AACvB,mBAAWtB,OAAOP,YAAY;AAC5B,gBAAM8B,SAASrB,UAAUgC,sBAAsBlC,KAAKgC,QAAQ;AAC5D,cAAI,CAACT,OAAQ;AAEb,gBAAM;YAAEN;YAASZ;YAAMM;UAAQ,IAAIY;AACnC,gBAAMxB,cAAcY,QAAQL,UAAUP,eAAe;AACrD,cAAIA,gBAAgB,YAAYY,QAAQK,SAAS,SAAU;AAE3DI,YAAEI,eAAe;AACjB,gBAAME,gBAAgBC,iBAAiBhB,SAASA,QAAQL,QAAS;AACjE,gBAAMmB,YAAYL,EAAEuB,SAAS,IAAI,KAAK;AACtCf,2BAAiBX,SAASZ,MAAMM,SAASe,eAAeD,SAAS;AACjE;QACF;MACF;AAGA,YAAMmB,oBAAoB1C,UAAU2C,yBAAyB;AAC7D,iBAAW;QAAE5B;QAASZ;QAAMM;QAASL;MAAS,KAAKsC,mBAAmB;AACpE,YAAIjC,QAAQK,SAAS,SAAU;AAE/BI,UAAEI,eAAe;AACjB,cAAME,gBAAgBC,iBAAiBhB,SAASL,QAAQ;AACxD,cAAMmB,YAAYL,EAAEuB,SAAS,IAAI,KAAK;AACtCf,yBAAiBX,SAASZ,MAAMM,SAASe,eAAeD,SAAS;AACjE;MACF;IACF;AAGA,UAAMqB,kBAAmB1B,OAAkB;AACzC,UAAIC,eAAe,EAAG;AACtB,UAAI5B,WAAW6B,SAAS,EAAG;AAE3B,YAAMC,SAASzB,oBAAoB,MAAM;AACzC,UAAIyB,QAAQ;AACV5B,qBAAa;AACbC,qBAAawB,EAAE2B;AACflD,0BAAkB;AAClBuB,UAAEI,eAAe;MACnB;IACF;AAEA,UAAMwB,gBAAgBA,MAAM;AAC1BrD,mBAAa;AACbC,mBAAa;AACbC,wBAAkB;IACpB;AAGA,UAAMoD,kBAAmB7B,OAAkB;AACzC,UAAIC,eAAe,EAAG;AACtB,UAAI5B,WAAW6B,SAAS,EAAG;AAG3B,UAAI3B,YAAY;AACd,cAAM4B,SAASzB,oBAAoB,MAAM;AACzC,YAAIyB,UAAU3B,eAAe,MAAM;AACjC,gBAAMsD,SAAS9B,EAAE2B,UAAUnD;AAC3BA,uBAAawB,EAAE2B;AACflD,6BAAmBqD;AAEnB,gBAAMxB,gBAAgBC,iBAAiBJ,OAAOZ,SAASY,OAAOjB,QAAQ;AACtE,gBAAM6C,QAAQC,KAAKC,MAAMxD,kBAAkByD,gBAAgB;AAC3D,cAAIH,UAAU,GAAG;AACftD,+BAAmBsD,QAAQG;AAC3B1B,6BAAiBL,OAAON,SAASM,OAAOlB,MAAMkB,OAAOZ,SAASe,eAAeyB,KAAK;UACpF;QACF;AACA;MACF;AAGA,YAAMI,aAAazD,oBAAoB,MAAM;AAC7C,UAAIyD,YAAY;AACd,YAAI3D,eAAe,MAAM;AACvBA,uBAAawB,EAAE2B;AACf;QACF;AAEA,cAAMG,SAAS9B,EAAE2B,UAAUnD;AAC3BA,qBAAawB,EAAE2B;AACflD,2BAAmBqD;AAEnB,cAAMxB,gBAAgBC,iBAAiB4B,WAAW5C,SAAS4C,WAAWjD,QAAQ;AAC9E,cAAM6C,QAAQC,KAAKC,MAAMxD,kBAAkByD,gBAAgB;AAC3D,YAAIH,UAAU,GAAG;AACftD,6BAAmBsD,QAAQG;AAC3B1B,2BAAiB2B,WAAWtC,SAASsC,WAAWlD,MAAMkD,WAAW5C,SAASe,eAAeyB,KAAK;QAChG;MACF;IACF;AAEA,UAAMK,mBAAmBA,MAAM;AAC7B/D,iBAAWgE,MAAM;AACjB9D,mBAAa;AACbC,mBAAa;AACbC,wBAAkB;AAClBN,wBAAkB,MAAM,IAAI;IAC9B;AAEAmE,WAAOC,iBAAiB,WAAWxC,aAAa;AAChDuC,WAAOC,iBAAiB,SAASrB,WAAW;AAC5CoB,WAAOC,iBAAiB,SAASjB,aAAa;MAAEkB,SAAS;IAAM,CAAC;AAChEF,WAAOC,iBAAiB,aAAab,eAAe;AACpDY,WAAOC,iBAAiB,WAAWX,aAAa;AAChDU,WAAOC,iBAAiB,aAAaV,eAAe;AACpDS,WAAOC,iBAAiB,QAAQH,gBAAgB;AAEhDK,IAAAA,WAAU,MAAM;AACdH,aAAOI,oBAAoB,WAAW3C,aAAa;AACnDuC,aAAOI,oBAAoB,SAASxB,WAAW;AAC/CoB,aAAOI,oBAAoB,SAASpB,WAAW;AAC/CgB,aAAOI,oBAAoB,aAAahB,eAAe;AACvDY,aAAOI,oBAAoB,WAAWd,aAAa;AACnDU,aAAOI,oBAAoB,aAAab,eAAe;AACvDS,aAAOI,oBAAoB,QAAQN,gBAAgB;IACrD,CAAC;EACH,CAAC;AAED,SAAAO,kBACGjF,gBAAgBkF,UAAQ;IAACC,OAAO7E;IAAc,IAAA8E,WAAA;AAAA,aAC5C/E,MAAM+E;IAAQ;EAAA,CAAA;AAGrB;;;;;;;;;;;AEzQA,SAASC,gBAAAA,eAAcC,gBAAAA,eAAcC,IAAIC,aAAAA,YAAWC,SAASC,YAAiB;AAC9E,SAASC,YAAAA,iBAAgB;AACzB,SAASC,eAAe;;;ACAjB,IAAM,eAAe;AAErB,IAAM,aAAa;AAEnB,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AACF;AAEO,IAAM,YAAY;AAElB,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AACF;AAEO,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iBAAiB;AAAA,EAC5B,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,SAAS;AAAA,IACP,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,WAAW;AAAA,IAClC,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,WAAW;AAAA,IAC1C,EAAE,IAAI,WAAW,IAAI,QAAQ,GAAG,WAAW;AAAA,EAC7C;AACF;;;;;;;;;;ADrCA,IAAMC,kBAAkB;EAAEC,MAAM;EAAmBC,gBAAgB;EAAMC,QAAQ;AAAI;AAO9E,SAASC,UAAUC,OAAuB;AAG/C,QAAMC,SAASD,MAAMC,UAAU;AAE/B,QAAM,CAACC,QAAQC,SAAS,IAAIC,cAAaJ,MAAMK,eAAe,IAAI;AAClE,QAAM,CAACC,eAAeC,gBAAgB,IAAIH,cAAiCI,MAAS;AACpF,QAAM,CAACC,cAAcC,eAAe,IAAIN,cAAaO,YAAW,MAAMC,OAAOC,WAAW;AACxF,MAAIC;AAEJ,QAAMC,eAAeA,MAAM;AACzB,QAAId,OAAQ;AACZ,UAAMe,OAAO,CAACd,OAAO;AACrBC,cAAUa,IAAI;AACdhB,UAAMiB,eAAeD,IAAI;EAC3B;AAEA,QAAME,gBAAgBA,OAAA,MAAA;AAAA,QAAAC,OAAAC,QAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC;AAAA,QAAAE,QACVV;AAAS,WAAAU,UAAA,aAAAC,MAAAD,OAAAL,IAAA,IAATL,YAASK;AAAAE,UAAAK,UACgDX;AAAYY,aAAAJ,OAAAK,mBAExEC,MAAI;MAAA,IAACC,OAAI;AAAA,eAAE5B,OAAO;MAAC;MAAA,IAAA6B,WAAA;AAAA,YAAAC,QAAAC,OAAA,GAAAC,QAAAF,MAAAV;AAAAK,iBAAAO,OAAA,MAGblC,MAAMmC,KAAK;AAAA,eAAAH;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAL,aAAAJ,OAAAK,mBAKjBC,MAAI;MAACC,MAAM,CAAC7B;MAAM,IAAA8B,WAAA;AAAA,YAAAK,QAAAC,QAAA,GAAAC,QAAAF,MAAAd,YAAAiB,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD;AAAAG,iBAAAC,SAAA;AAAA,cAAAC,MAIVC,WAAWC,MAAIC,OAGRF,WAAWG,QAAQ,CAAC,EAAEC,IAAEC,OAAML,WAAWG,QAAQ,CAAC,EAAEG,IAAEC,OAAKP,WAAWG,QAAQ,CAAC,EAAEK,GAACC,OAClFT,WAAWG,QAAQ,CAAC,EAAEC,IAAEM,OAAMV,WAAWG,QAAQ,CAAC,EAAEG,IAAEK,OAAKX,WAAWG,QAAQ,CAAC,EAAEK,GAACI,OAClFZ,WAAWG,QAAQ,CAAC,EAAEC,IAAES,OAAMb,WAAWG,QAAQ,CAAC,EAAEG,IAAEQ,OAAKd,WAAWG,QAAQ,CAAC,EAAEK;AAACT,kBAAAD,IAAAiB,KAAAC,eAAAxB,OAAA,KAAAM,IAAAiB,IAAAhB,GAAA;AAAAG,mBAAAJ,IAAAmB,KAAAD,eAAAvB,OAAA,MAAAK,IAAAmB,IAAAf,IAAA;AAAAG,mBAAAP,IAAAoB,KAAAF,eAAAvB,OAAA,MAAAK,IAAAoB,IAAAb,IAAA;AAAAE,mBAAAT,IAAAqB,KAAAH,eAAAvB,OAAA,KAAAK,IAAAqB,IAAAZ,IAAA;AAAAE,mBAAAX,IAAAsB,KAAAJ,eAAArB,OAAA,MAAAG,IAAAsB,IAAAX,IAAA;AAAAC,mBAAAZ,IAAAuB,KAAAL,eAAArB,OAAA,MAAAG,IAAAuB,IAAAX,IAAA;AAAAC,mBAAAb,IAAAwB,KAAAN,eAAArB,OAAA,KAAAG,IAAAwB,IAAAX,IAAA;AAAAC,mBAAAd,IAAAyB,KAAAP,eAAApB,OAAA,MAAAE,IAAAyB,IAAAX,IAAA;AAAAC,mBAAAf,IAAAU,KAAAQ,eAAApB,OAAA,MAAAE,IAAAU,IAAAK,IAAA;AAAAC,mBAAAhB,IAAA0B,KAAAR,eAAApB,OAAA,KAAAE,IAAA0B,IAAAV,IAAA;AAAA,iBAAAhB;QAAA,GAAA;UAAAiB,GAAArD;UAAAuD,GAAAvD;UAAAwD,GAAAxD;UAAAyD,GAAAzD;UAAA0D,GAAA1D;UAAA2D,GAAA3D;UAAA4D,GAAA5D;UAAA6D,GAAA7D;UAAA8C,GAAA9C;UAAA8D,GAAA9D;QAAA,CAAA;AAAA,eAAA4B;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAT,aAAAN,OAAAO,mBAKnGC,MAAI;MAAA,IAACC,OAAI;AAAA,eAAEyC,OAAA,MAAA,CAAA,CAAAvE,MAAMwE,OAAO,EAAA,KAAItE,OAAO;MAAC;MAAA,IAAA6B,WAAA;AAAA,YAAA0C,QAAAC,QAAA;AAAAD,cAAA/C,UACUmC,OAAMA,EAAEc,gBAAgB;AAAChD,iBAAA8C,OAAA,MACnEzE,MAAMwE,OAAO;AAAA,eAAAC;MAAA;IAAA,CAAA,GAAA,IAAA;AAAA9C,aAAAR,MAAAS,mBAKnBC,MAAI;MAAA,IAACC,OAAI;AAAA,eAAE5B,OAAO;MAAC;MAAA,IAAA6B,WAAA;AAAA,YAAA6C,SAAAC,QAAA,GAAAC,SAAAF,OAAAtD;AAAAK,iBAAAmD,QAAA,MAEmB9E,MAAM+B,QAAQ;AAAA,eAAA6C;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAjC,aAAA,MAAAmB,eAAA3C,MAAA,aAlCoB4D,OAAO7E,OAAO,CAAC,CAAC,CAAA;AAAA,WAAAiB;EAAA,GAAA;AAwC7F,MAAIlB,QAAQ;AACV,YAAA,MAAA;AAAA,UAAA+E,SAAAC,QAAA;AAAAtD,eAAAqD,QAEK9D,aAAa;AAAA,aAAA8D;IAAA,GAAA;EAGpB;AAEA,MAAIE;AACJ,MAAIC,YAAoC;AACxC,MAAIC,UAAkC;AAEtC,QAAMC,iBAAiBA,MAAM3E,gBAAgBE,OAAOC,WAAW;AAC/DD,SAAO0E,iBAAiB,UAAUD,cAAc;AAChDE,EAAAA,WAAU,MAAM;AACd3E,WAAO4E,oBAAoB,UAAUH,cAAc;AACnDF,eAAWM,KAAK;AAChBL,aAASK,KAAK;EAChB,CAAC;AAGDC,EAAAA,cAAa,MAAM;AACjB,QAAI,CAACxF,OAAO,EAAG;AACf,UAAMyF,KAAK7E;AACX,QAAI,CAAC6E,GAAI;AACT,UAAMC,KAAK,IAAIC,eAAe,MAAM;AAClC,YAAMxB,IAAIsB,GAAGG;AACbvF,uBAAkBwF,UAAUA,SAAS1B,IAAI0B,OAAO1B,CAAE;IACpD,CAAC;AACDuB,OAAGI,QAAQL,EAAE;AACbJ,IAAAA,WAAU,MAAMK,GAAGK,WAAW,CAAC;EACjC,CAAC;AAED,QAAMC,qBAAqBA,MACzB5F,cAAc,MAAME,SAChB2F,KAAKC,IAAI9F,cAAc,KAAMN,MAAMqG,qBAAqB,KAAK5F,aAAa,IAAI,EAAE,IAChFyE,SAASoB,sBAAsB,EAAEC;AAMvCb,EAAAA,cAAac,GAAGtG,QAAQ,CAACuG,MAAMC,aAAa;AAC1C,UAAMC,SAAS;MACbC,OAAOH,OAAO,MAAM;MACpBF,QAAQE,OAAOP,mBAAmB,IAAI;MACtCW,cAAcJ,OAAO,KAAK;MAC1BK,WAAWL,OAAO,uBAAuB;IAC3C;AAEAvB,aAAS6B,MAAMC,SAASP,OAAO,KAAK;AACpCvB,aAAS6B,MAAME,WAAWR,OAAO,gBAAgB;AAEjD,QAAIC,aAAalG,QAAW;AAC1B0E,eAAS6B,MAAMH,QAAQ,GAAGD,OAAOC,KAAK;AACtC1B,eAAS6B,MAAMR,SAAS,GAAGI,OAAOJ,MAAM;AACxCrB,eAAS6B,MAAMF,eAAe,GAAGF,OAAOE,YAAY;AACpD3B,eAAS6B,MAAMD,YAAYH,OAAOG;AAClC;IACF;AAEA3B,eAAWM,KAAK;AAChBN,gBAAY+B,QAAQhC,UAAUyB,QAAQ;MACpC,GAAGhH;MACHwH,YAAYA,MAAM;AAChBhC,oBAAY;MACd;IACF,CAAC;EACH,CAAC,CAAC;AAGFO,EAAAA,cAAac,GAAG,CAAClG,eAAeG,YAAY,GAAY,CAAC,CAAC8F,QAAQa,SAAS,MAAM;AAC/E,QAAIb,WAAW/F,UAAa,CAAC6G,QAAQnH,MAAM,EAAG;AAC9CgF,aAAS6B,MAAMR,SAAS,GAAGJ,KAAKC,IAAIG,UAAUvG,MAAMqG,qBAAqB,KAAKe,YAAY,EAAE,CAAC;EAC/F,GAAG;IAAEE,OAAO;EAAK,CAAC,CAAC;AAInB5B,EAAAA,cAAa,MAAM;AACjB,QAAIxF,OAAO,EAAG;AACd,UAAMqH,UAAW1D,OAAa;AAC5BA,QAAEc,gBAAgB;AAClB5D,mBAAa;IACf;AACAmE,aAASI,iBAAiB,SAASiC,OAAO;AAC1ChC,IAAAA,WAAU,MAAML,SAASM,oBAAoB,SAAS+B,OAAO,CAAC;EAChE,CAAC;AAED,QAAMC,UAAWC,WAAkB;AACjC,QAAIvH,OAAO,EAAG;AACdkF,aAASK,KAAK;AACdL,cAAU8B,QAAQhC,UAAU;MAAEuC;IAAM,GAAG9H,eAAe;EACxD;AAEA,UAAA,MAAA;AAAA,QAAA+H,SAAAC,QAAA;AAAAD,WAAApC,iBAAA,gBAYoB,MAAMkC,QAAQ,CAAC,CAAC;AAAAE,WAAApC,iBAAA,iBADf,MAAMkC,QAAQ,CAAC,CAAC;AAAAE,WAAAE,cADpB,MAAMJ,QAAQ,CAAC;AAACE,WAAAG,gBALd,MAAM;AACnB,UAAI3H,OAAO,EAAG;AACb4H,eAASC,eAA+BC,OAAO;AAChDR,cAAQ,GAAG;IACb;AAAC,QAAAS,SAPI/C;AAAQ,WAAA+C,WAAA,aAAAxG,MAAAwG,QAAAP,MAAA,IAARxC,WAAQwC;AAAA/F,aAAA+F,QAYZxG,aAAa;AAAAyB,aAAA,MAAAmB,eAAA4D,QAAA,kBAVE3C,OAAO,CAAC7E,OAAO,CAAC,CAAC,CAAA;AAAA,WAAAwH;EAAA,GAAA;AAavC;AAACQ,iBAAA,CAAA,SAAA,eAAA,WAAA,CAAA;;;;;;;;;;;AEhMD,SAASC,OAAOC,gBAAAA,gBAAcC,gBAAAA,gBAAcC,MAAAA,KAAIC,WAAAA,UAASC,aAAAA,aAAWC,OAAAA,YAAqB;AACzF,SAASC,WAAAA,gBAAe;;;;;;;;;;;ACDxB,SAASC,gBAAAA,eAAcC,gBAAAA,eAAcC,MAAAA,KAAIC,aAAAA,YAAWC,QAAAA,aAAiB;AACrE,SAASC,WAAAA,gBAAe;;;AAoBxB,IAAMC,oBAAoB;EAAEC,MAAM;EAAmBC,gBAAgB;EAAMC,QAAQ;AAAI;AAGhF,SAASC,OAAOC,OAAoB;AAEzC,MAAIA,MAAMC,QAAQ;AAChB,WAAAC,mBAAQC,WAAcH,KAAK;EAC7B;AAEA,QAAM,CAACI,QAAQC,SAAS,IAAIC,cAAaN,MAAMO,eAAe,IAAI;AAClE,QAAM,CAACC,gBAAgBC,iBAAiB,IAAIH,cAAaN,MAAMO,eAAe,IAAI;AAClF,MAAIG,gBAAgBV,MAAMO,eAAe;AACzC,MAAII;AACJ,MAAIC,cAAsC;AAC1C,MAAIC;AACJ,MAAIC,cAAsC;AAE1CC,EAAAA,WAAU,MAAM;AACdH,iBAAaI,KAAK;AAClBF,iBAAaE,KAAK;EACpB,CAAC;AAGDC,EAAAA,cAAaC,IAAGd,QAASe,UAAS;AAChC,QAAI,CAACN,WAAY;AACjBC,iBAAaE,KAAK;AAClBF,kBAAcM,SACZP,YACA;MAAEQ,QAAQF,OAAO,IAAI;IAAI,GACzB;MAAEvB,MAAM;MAAUC,gBAAgB;MAAMC,QAAQ;IAAK,CACvD;EACF,GAAG;IAAEwB,OAAO;EAAK,CAAC,CAAC;AAEnB,QAAMC,eAAeA,MAAM;AACzB,UAAMC,OAAO,CAACpB,OAAO;AACrBC,cAAUmB,IAAI;AACd,QAAIA,MAAM;AACRZ,mBAAaI,KAAK;AAClBJ,oBAAc;AACd,UAAID,mBAAmB;AAErBC,sBAAcQ,SACZT,mBACA;UAAEc,QAAQ;UAAQC,SAAS;QAAE,GAC7B;UACE,GAAG/B;UACHgC,YAAYA,MAAM;AAChBf,0BAAc;UAChB;QACF,CACF;MACF,OAAO;AAELH,0BAAkB,IAAI;MACxB;IACF,WAAWE,mBAAmB;AAC5B,YAAMiB,gBAAgBjB,kBAAkBkB,sBAAsB,EAAEJ;AAChEd,wBAAkBmB,MAAML,SAAS,GAAGG,aAAa;AACjDhB,mBAAaI,KAAK;AAClBJ,oBAAcQ,SACZT,mBACA;QAAEc,QAAQ;QAAGC,SAAS;MAAE,GACxB;QACE,GAAG/B;QACHgC,YAAYA,MAAM;AAChBlB,4BAAkB,KAAK;AACvBG,wBAAc;AACdD,8BAAoBoB;QACtB;MACF,CACF;IACF,OAAO;AACLtB,wBAAkB,KAAK;IACzB;AACAT,UAAMgC,eAAeR,IAAI;EAC3B;AAEA,UAAA,MAAA;AAAA,QAAAS,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAD,YAAAG,QAAAD,MAAAF,YAAAI,QAAAF,MAAAG,aAAAC,QAAAF,MAAAJ;AAAAD,UAAAQ,UAEgDpB;AAAYqB,IAAAA,UAAAL,OAAA,MAGdvC,MAAM6C,KAAK;AAAA,QAAAC,QAI1CjC;AAAU,WAAAiC,UAAA,aAAAC,OAAAD,OAAAN,KAAA,IAAV3B,aAAU2B;AAAAQ,IAAAA,gBAAAN,OAAA,KAUNO,YAAY;AAAAL,IAAAA,UAAAX,MAAA/B,mBAK1BgD,OAAI;MAAA,IAACC,OAAI;AAAA,eAAE3C,eAAe;MAAC;MAAA,IAAA4C,WAAA;AAAA,YAAAC,QAAAC,QAAA,GAAAC,QAAAF,MAAAjB;AAAAW,QAAAA,OAElBS,QAAO;AACX7C,8BAAoB6C;AACpB,cAAI9C,eAAe;AACjBA,4BAAgB;AAChB;UACF;AAEAE,uBAAaI,KAAK;AAClBwC,aAAG1B,MAAML,SAAS;AAClB+B,aAAG1B,MAAMJ,UAAU;AACnBd,wBAAcQ,SACZoC,IACA;YAAE/B,QAAQ;YAAQC,SAAS;UAAE,GAC7B;YACE,GAAG/B;YACHgC,YAAYA,MAAM;AAChBf,4BAAc;YAChB;UACF,CACF;QACF,GAACyC,KAAA;AAAAT,QAAAA,UAAAW,OAAA,MAIkCvD,MAAMoD,QAAQ;AAAA,eAAAC;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAI,IAAAA,UAAAC,SAAA;AAAA,UAAAC,MAjDhBC,OAAOxD,OAAO,CAAC,GAACyD,OAgB3B,UAAW7D,MAAMO,eAAe,OAAQ,IAAI,GAAG;AAAMoD,cAAAD,IAAAI,KAAAd,gBAAAf,MAAA,aAAAyB,IAAAI,IAAAH,GAAA;AAAAE,eAAAH,IAAAK,KAAAC,mBAAAxB,OAAA,aAAAkB,IAAAK,IAAAF,IAAA;AAAA,aAAAH;IAAA,GAAA;MAAAI,GAAA/B;MAAAgC,GAAAhC;IAAA,CAAA;AAAA,WAAAE;EAAA,GAAA;AAsCrF;AAACgC,kBAAA,CAAA,OAAA,CAAA;;;;;;;;;;;;ACzJD,SAASC,gBAAAA,eAAcC,gBAAAA,eAAcC,WAAAA,UAASC,aAAAA,YAAWC,QAAAA,aAAY;AACrE,SAASC,WAAAA,UAASC,mBAAmB;;;;;AAsBrC,IAAMC,kBAAkB;AACxB,IAAMC,YAAY;AAClB,IAAMC,mBAAmB;AACzB,IAAMC,cAAc;AAEb,SAASC,OAAOC,OAAoB;AACzC,QAAMC,MAAMA,MAAMD,MAAMC,OAAO;AAC/B,QAAMC,MAAMA,MAAMF,MAAME,OAAO;AAC/B,QAAMC,OAAOA,MAAMH,MAAMG,QAAQ;AAEjC,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AAEJ,QAAM,CAACC,eAAeC,gBAAgB,IAAIC,cAAa,KAAK;AAC5D,QAAM,CAACC,YAAYC,aAAa,IAAIF,cAAa,KAAK;AACtD,QAAM,CAACG,WAAWC,YAAY,IAAIJ,cAAa,KAAK;AACpD,QAAM,CAACK,gBAAgBC,iBAAiB,IAAIN,cAAa,KAAK;AAC9D,QAAM,CAACO,iBAAiBC,kBAAkB,IAAIR,cAAa,KAAK;AAChE,QAAM,CAACS,WAAWC,YAAY,IAAIV,cAAa,KAAK;AACpD,QAAM,CAACW,YAAYC,aAAa,IAAIZ,cAAa,EAAE;AAEnD,QAAMa,cAAcC,aAAc3B,MAAM4B,QAAQ3B,IAAI,MAAMC,IAAI,IAAID,IAAI,KAAM,GAAG;AAC/E,QAAM4B,kBAAkBF,YAAY,CAAC;AACrC,QAAMG,kBAAkBH,YAAY,CAAC;AACrC,QAAMI,iBAAiBJ,YAAY,IAAI;AACvC,QAAMK,iBAAiBL,YAAY,CAAC;AAEpC,QAAMM,kBAAmBC,SAAgB;AACvC,QAAI5B,QAASA,SAAQ6B,MAAMC,QAAQ,GAAGF,GAAG;AACzC,QAAI3B,UAAWA,WAAU4B,MAAME,OAAO,iBAAiBH,GAAG;EAC5D;AAEA,QAAMI,oBAAqBC,aAAoB;AAC7C,QAAI,CAAClC,SAAU;AACfA,aAAS8B,MAAMC,QAAQ,eAAeI,KAAKC,IAAIF,OAAO,CAAC;AACvDlC,aAAS8B,MAAMO,YAAY,cAAcH,UAAU,IAAIA,UAAU,CAAC;EACpE;AAEA,QAAMI,0BAA0BA,MAAM;AACpC,QAAI,CAACpC,UAAW;AAChBA,cAAU4B,MAAMS,UAAUC,OAAOf,gBAAgBgB,IAAI,CAAC;AACtDvC,cAAU4B,MAAMO,YAAY,2BAA2BX,eAAee,IAAI,CAAC,YAAYd,eAAec,IAAI,CAAC;EAC7G;AAGAC,EAAAA,cAAa,MAAM;AACjB,QAAI,CAACpC,cAAc,KAAK,CAACqC,UAAU;AACjCtB,kBAAYuB,MAAOjD,MAAM4B,QAAQ3B,IAAI,MAAMC,IAAI,IAAID,IAAI,KAAM,GAAG;IAClE;EACF,CAAC;AAED,QAAMiD,aAAaA,OAAQlD,MAAM4B,QAAQ3B,IAAI,MAAMC,IAAI,IAAID,IAAI,KAAM;AACrE,QAAMkD,WAAWA,MAAMxC,cAAc,KAAKK,UAAU;AAEpD,MAAIoC,iBAAkD;AACtD,MAAIC,cAAc;AAClB,MAAIC,cAA8B;AAClC,MAAIC,WAAW;AACf,MAAIC,eAAqD;AACzD,MAAIR,WAAmC;AACvC,MAAIS,aAAqC;AACzC,MAAIC,oBAA4C;AAChD,MAAIC,mBAA2C;AAC/C,MAAIC,mBAA2C;AAE/C,QAAMC,kBAAmBC,aAAoB;AAC3C,QAAI,CAACR,YAAa,QAAOtD,MAAM4B;AAC/B,UAAMmC,UAAUD,UAAUR,YAAYjB;AACtC,UAAM2B,SAASD,UAAUR;AACzB,UAAMU,cAAc7D,aAAaA,WAAW8D,cAAcZ,YAAYlB;AACtE,UAAM+B,UAAU3B,KAAKtC,IAAI,GAAGsC,KAAKvC,IAAI,GAAG+D,SAASC,WAAW,CAAC;AAC7D,UAAMG,WAAWnE,IAAI,IAAIkE,WAAWjE,IAAI,IAAID,IAAI;AAChD,WAAOuC,KAAKtC,IAAID,IAAI,GAAGuC,KAAKvC,IAAIC,IAAI,GAAGkE,QAAQ,CAAC;EAClD;AAEA,QAAMC,mBAAoBC,QAAgBA,IAAIrE,IAAI,MAAMC,IAAI,IAAID,IAAI,KAAM;AAE1E,QAAMsE,uBAAuBA,CAACT,SAAiBU,SAAiB;AAC9D,QAAI,CAAClB,YAAa,QAAO;AACzB,UAAMmB,eAAeD,OAAO,IAAIlB,YAAYjB,OAAOyB,UAAUA,UAAUR,YAAYoB;AACnF,UAAMC,WAAWnC,KAAKtC,IAAI,GAAGuE,eAAe7E,SAAS;AACrD,WAAO4E,OAAO1E,cAAc0C,KAAKoC,KAAKpC,KAAKvC,IAAI0E,WAAW9E,kBAAkB,CAAG,CAAC;EAClF;AAEA,QAAMgF,oBAAoBA,MAAM;AAC9B,QAAI,CAAClE,cAAc,EAAG;AACtBC,qBAAiB,KAAK;AACtBG,kBAAc,KAAK;AACnBc,oBAAgBoB,KAAK,CAAC;AACtBG,qBAAiB;EACnB;AAEA,QAAM0B,oBAAqBC,OAAoB;AAC7C,QAAIzD,UAAU,EAAG;AACjByD,MAAEC,eAAe;AAChBD,MAAEE,cAA8BC,kBAAkBH,EAAEI,SAAS;AAC9D/B,qBAAiB;MAAEgC,GAAGL,EAAEjB;MAASuB,GAAGN,EAAEO;IAAQ;AAC9CjC,kBAAc;AACdzC,qBAAiB,IAAI;AAErB,QAAIR,YAAY;AACdkD,oBAAclD,WAAWmF,sBAAsB;AAC/ChC,iBAAWD,YAAYlB,QAAQhC,WAAW8D;IAC5C;EACF;AAEA,QAAMsB,oBAAqBT,OAAoB;AAC7C,QAAI,CAACpE,cAAc,KAAK,CAACyC,eAAgB;AAEzC,UAAMqC,KAAKV,EAAEjB,UAAUV,eAAegC;AACtC,UAAMM,KAAKX,EAAEO,UAAUlC,eAAeiC;AACtC,UAAMM,WAAWnD,KAAKoC,KAAKa,KAAKA,KAAKC,KAAKA,EAAE;AAE5C,QAAIrC,eAAesC,WAAWhG,iBAAiB;AAC7C0D,oBAAc;AACdtC,oBAAc,IAAI;IACpB;AAEA,QAAI,CAACsC,aAAa;AAChB,UAAIC,aAAa;AACf,YAAIyB,EAAEjB,UAAUR,YAAYjB,MAAM;AAChCR,0BAAgBoB,KAAKsB,qBAAqBQ,EAAEjB,SAAS,EAAE,CAAC;QAC1D,WAAWiB,EAAEjB,UAAUR,YAAYoB,OAAO;AACxC7C,0BAAgBoB,KAAKsB,qBAAqBQ,EAAEjB,SAAS,CAAC,CAAC;QACzD,OAAO;AACLjC,0BAAgBoB,KAAK,CAAC;QACxB;MACF;AAEA,YAAM2C,WAAW/B,gBAAgBkB,EAAEjB,OAAO;AAC1C,YAAM+B,SAASxB,iBAAiBuB,QAAQ;AACxC,UAAI5C,UAAU;AAAEA,iBAAS8C,KAAK;AAAG9C,mBAAW;MAAM;AAClDtB,kBAAYuB,KAAK4C,MAAM;AACvB7F,YAAM+F,SAASC,WAAWJ,UAAUzF,KAAK,CAAC,CAAC;IAC7C;EACF;AAEA,QAAM8F,kBAAmBlB,OAAoB;AAC3C,QAAI,CAACpE,cAAc,EAAG;AAEtB,QAAI0C,aAAa;AACf,YAAMe,WAAWP,gBAAgBkB,EAAEjB,OAAO;AAC1C,YAAMoC,kBAAiBhG,IAAI,IAAID,IAAI,KAAKE,KAAK;AAC7C,YAAMgG,eAAeD,kBAAiB,KAClC1D,KAAKtC,IAAID,IAAI,GAAGuC,KAAKvC,IAAIC,IAAI,GAAGD,IAAI,IAAIuC,KAAK4D,OAAOhC,WAAWnE,IAAI,KAAKE,KAAK,CAAC,IAAIA,KAAK,CAAC,CAAC,IACzFkG,aAAajC,UAAUnE,IAAI,GAAGC,IAAI,CAAC;AAEvC,YAAM2F,SAASxB,iBAAiB8B,YAAY;AAE5C,UAAInD,SAAUA,UAAS8C,KAAK;AAC5B9C,iBAAWsD,SAAQ5E,aAAamE,QAAQ;QACtCU,MAAM;QACNC,WAAW;QACXC,SAAS;QACTC,MAAM;QACNC,YAAYA,MAAM;AAChB3D,qBAAW;QACb;MACF,CAAC;AAEDhD,YAAM+F,SAASC,WAAWG,cAAchG,KAAK,CAAC,CAAC;IACjD;AAEA,QAAI0B,gBAAgBiB,IAAI,MAAM,GAAG;AAC/B,UAAIW,WAAYA,YAAWqC,KAAK;AAChCrC,mBAAa6C,SAAQzE,iBAAiB,GAAG;QACvC0E,MAAM;QACNK,gBAAgB;QAChBC,QAAQ;MACV,CAAC;IACH;AAEAjG,qBAAiB,KAAK;AACtBG,kBAAc,KAAK;AACnBqC,qBAAiB;EACnB;AAEA,QAAM0D,sBAAsBA,MAAM;AAChCjC,sBAAkB;EACpB;AAGA9B,EAAAA,cAAa,MAAM;AACjB,UAAMgE,UAAU7F,eAAe;AAC/B,UAAM8F,UAAU1F,UAAU;AAC1B,UAAM2F,WAAW7F,gBAAgB;AAEjC8F,IAAAA,WAAU,MAAM;AACd,UAAI1D,cAAc;AAAE2D,qBAAa3D,YAAY;AAAGA,uBAAe;MAAM;IACvE,CAAC;AAED,QAAIuD,WAAW,CAACC,WAAW,CAACC,UAAU;AACpCzD,qBAAe4D,WAAW,MAAM/F,mBAAmB,IAAI,GAAG,GAAG;IAC/D,WAAW,CAAC0F,WAAW,CAACC,SAAS;AAC/B3F,yBAAmB,KAAK;IAC1B;EACF,CAAC;AAED6F,EAAAA,WAAU,MAAM;AACd,QAAI1D,aAAc2D,cAAa3D,YAAY;AAC3CR,cAAU8C,KAAK;AACfrC,gBAAYqC,KAAK;AACjBpC,uBAAmBoC,KAAK;AACxBnC,sBAAkBmC,KAAK;AACvBlC,sBAAkBkC,KAAK;EACzB,CAAC;AAEDuB,EAAAA,SAAQ,MAAM;AACZ,UAAMC,YAAY5F,YAAY6F,GAAG,UAAUtF,eAAe;AAC1D,UAAMuF,cAAc3F,gBAAgB0F,GAAG,UAAUjF,iBAAiB;AAClE,UAAMmF,qBAAqB3F,gBAAgByF,GAAG,UAAU5E,uBAAuB;AAC/E,UAAM+E,oBAAoB3F,eAAewF,GAAG,UAAU5E,uBAAuB;AAC7E,UAAMgF,oBAAoB3F,eAAeuF,GAAG,UAAU5E,uBAAuB;AAC7EV,oBAAgBP,YAAYoB,IAAI,CAAC;AACjCR,sBAAkBT,gBAAgBiB,IAAI,CAAC;AACvCH,4BAAwB;AAExBuE,IAAAA,WAAU,MAAM;AACdI,gBAAU;AACVE,kBAAY;AACZC,yBAAmB;AACnBC,wBAAkB;AAClBC,wBAAkB;IACpB,CAAC;EACH,CAAC;AAGD5E,EAAAA,cAAa,MAAM;AACjB,QAAIzB,UAAU,KAAKZ,UAAU;AAC3BA,eAASkH,MAAM;AACflH,eAASmH,OAAO;IAClB;EACF,CAAC;AAED,QAAMC,oBAAoBA,MAAM;AAC9B,UAAMC,SAASC,WAAWxG,WAAW,CAAC;AACtC,QAAI,CAACyG,MAAMF,MAAM,GAAG;AAClB,YAAMG,UAAU1F,KAAKtC,IAAID,IAAI,GAAGuC,KAAKvC,IAAIC,IAAI,GAAG6H,MAAM,CAAC;AACvD/H,YAAM+F,SAASC,WAAWkC,SAAS/H,KAAK,CAAC,CAAC;IAC5C;AACAoB,iBAAa,KAAK;AAClBJ,sBAAkB,KAAK;AACvBE,uBAAmB,KAAK;EAC1B;AAEA,QAAM8G,mBAAoBpD,OAAkB;AAC1C,QAAI3D,gBAAgB,GAAG;AACrB2D,QAAEqD,gBAAgB;AAClBrD,QAAEC,eAAe;AACjBzD,mBAAa,IAAI;AACjBE,oBAAczB,MAAM4B,MAAMyG,QAAQC,gBAAgBnI,KAAK,CAAC,CAAC,CAAC;IAC5D;EACF;AAEA,QAAMoI,qBAAsBxD,OAAqB;AAC/C,QAAIA,EAAEyD,QAAQ,QAASV,mBAAkB;aAChC/C,EAAEyD,QAAQ,UAAU;AAC3BjH,mBAAa,KAAK;AAClBJ,wBAAkB,KAAK;IACzB;EACF;AAEA,QAAMsH,eAAeA,MAAMzI,MAAM4B,MAAMyG,QAAQC,gBAAgBnI,KAAK,CAAC,CAAC;AAGtE,QAAMuI,gBAAgB;AACtB,QAAMC,iBAAiB;AACvB,QAAMC,kBAAkB;AAExB,QAAMC,gBAAgBA,MAAM;AAC1B,UAAMC,aAAa1I,YAAY8D;AAC/B,QAAI4E,cAActI,UAAU;AAC1B,cAASmI,iBAAiBnI,SAAS0D,cAAcwE,iBAAiBI,aAAc;IAClF;AACA,WAAO;EACT;AAEA,QAAMC,iBAAiBA,MAAM;AAC3B,UAAMD,aAAa1I,YAAY8D;AAC/B,QAAI4E,cAAcrI,cAAc;AAC9B,cAASqI,aAAaF,kBAAkBnI,aAAayD,cAAcwE,iBAAiBI,aAAc;IACpG;AACA,WAAO;EACT;AAEA,QAAME,aAAaA,MAAM9F,WAAW,IAAI2F,cAAc,KAAK3F,WAAW,IAAI6F,eAAe;AAEzF,QAAME,gBAAgBA,MAAM;AAC1B,QAAI,CAAC9F,SAAS,EAAG,QAAO;AACxB,QAAI6F,WAAW,EAAG,QAAO;AACzB,QAAIlI,WAAW,EAAG,QAAO;AACzB,WAAO;EACT;AAEAiC,EAAAA,cAAa,MAAM;AACjB,UAAMmG,gBAAgBD,cAAc;AACpC,UAAME,eAAehG,SAAS,IAAI,IAAI;AACtC,UAAMiG,eAAejG,SAAS,KAAK6F,WAAW,IAAI,OAAO;AAEzDtF,uBAAmBoC,KAAK;AACxBnC,sBAAkBmC,KAAK;AACvBlC,sBAAkBkC,KAAK;AAEvBpC,wBAAoB4C,SAAQxE,iBAAiBoH,eAAe;MAAEG,UAAU;IAAK,CAAC;AAC9E1F,uBAAmB2C,SAAQvE,gBAAgBoH,cAAc;MACvD5C,MAAM;MACNK,gBAAgB;MAChBC,QAAQ;IACV,CAAC;AACDjD,uBAAmB0C,SAAQtE,gBAAgBoH,cAAc;MACvD7C,MAAM;MACNK,gBAAgB;MAChBC,QAAQ;IACV,CAAC;EACH,CAAC;AAED,QAAMX,gBAAgBA,OAAOhG,IAAI,IAAID,IAAI,KAAKE,KAAK;AAEnD,QAAMmJ,YAAYA,MAAM;AACtB,UAAMC,KAAKrD,cAAc;AACzB,QAAIqD,MAAM,IAAI;AACZ,aAAOC,MAAMC,KAAK;QAAEC,QAAQH,KAAK;MAAE,GAAG,CAACI,GAAGC,MAAM;AAC9C,cAAM1H,OAAQ0H,IAAI,KAAKzJ,KAAK,KAAMD,IAAI,IAAID,IAAI,KAAK;AACnD,gBAAA,MAAA;AAAA,cAAA4J,OAAAC,QAAA;AAAAC,UAAAA,oBAAAF,MAAA,QAA2D,GAAG3H,GAAG,GAAG;AAAA,iBAAA2H;QAAA,GAAA;MACtE,CAAC;IACH;AACA,WAAOL,MAAMC,KAAK;MAAEC,QAAQ;IAAE,GAAG,CAACC,GAAGC,MAAM;AACzC,YAAM1H,OAAO0H,IAAI,KAAK;AACtB,cAAA,MAAA;AAAA,YAAAI,QAAAF,QAAA;AAAAC,QAAAA,oBAAAC,OAAA,QAA2D,GAAG9H,GAAG,GAAG;AAAA,eAAA8H;MAAA,GAAA;IACtE,CAAC;EACH;AAEA,UAAA,MAAA;AAAA,QAAAC,QAAAC,SAAA,GAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD;AAAA,QAAAG,QACYtK;AAAU,WAAAsK,UAAA,aAAAC,OAAAD,OAAAT,KAAA,IAAV7J,aAAU6J;AAAAE,UAAAS,iBAAA,cASF,MAAM3J,aAAa,KAAK,CAAC;AAAAkJ,UAAAS,iBAAA,cADzB,MAAM3J,aAAa,IAAI,CAAC;AAAAkJ,UAAAS,iBAAA,iBADrB9D,mBAAmB;AAAAqD,UAAAU,cADvB5E;AAAekE,UAAAW,gBADbtF;AAAiB2E,UAAAY,gBADjBjG;AAAiB,QAAAkG,SAF3B3K;AAAQ,WAAA2K,WAAA,aAAAL,OAAAK,QAAAb,KAAA,IAAR9J,WAAQ8J;AAAAc,IAAAA,UAAAZ,OAS0Bf,SAAS;AAAA,QAAA4B,SAGzC5K;AAAO,WAAA4K,WAAA,aAAAP,OAAAO,QAAAZ,KAAA,IAAPhK,UAAOgK;AAAA,QAAAa,SAQP5K;AAAS,WAAA4K,WAAA,aAAAR,OAAAQ,QAAAX,KAAA,IAATjK,YAASiK;AAAA,QAAAY,SASL5K;AAAQ,WAAA4K,WAAA,aAAAT,OAAAS,QAAAX,KAAA,IAARjK,WAAQiK;AAAAQ,IAAAA,UAAAR,OAAA,MAChBzK,MAAMqL,OAAK,IAAA;AAAAJ,IAAAA,UAAAR,OAAAa,mBACXC,OAAI;MAAA,IAACC,OAAI;AAAA,eAAExL,MAAMyL;MAAQ;MAAA,IAAAC,WAAA;AAAA,YAAAC,QAAAC,SAAA;AAAAX,QAAAA,UAAAU,OAAA,MAErBE,qBAAqB7L,MAAMyL,QAAS,CAAC;AAAAK,QAAAA,UAAA,MAAAC,YAAAJ,OAD3B,wBAAwB3L,MAAMgM,iBAAiB,kCAAkC,EAAE,EAAE,CAAA;AAAA,eAAAL;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAV,IAAAA,UAAAd,QAAA,MAAA;AAAA,UAAA8B,MAAAC,QAAA,MAAA,CAAA,CAMrG5K,UAAU,CAAC;AAAA,aAAA,MAAX2K,IAAA,KAAA,MAAA;AAAA,YAAAE,QAAAC,SAAA;AAAAD,cAAAE,cAUiBtH,OAAMA,EAAEqD,gBAAgB;AAAC+D,cAAAG,UAD7BvH,OAAMA,EAAEqD,gBAAgB;AAAC+D,cAAAvB,iBAAA,QAD3B9C,iBAAiB;AAAAqE,cAAAI,YADdhE;AAAkB4D,cAAAK,UADnBzH,OAAMtD,cAAcsD,EAAEE,cAAcrD,KAAK;AAAC,YAAA6K,SAJ/C/L;AAAQ,eAAA+L,WAAA,aAAA9B,OAAA8B,QAAAN,KAAA,IAARzL,WAAQyL;AAAAL,QAAAA,UAAA,MAAAK,MAAAvK,QAGNJ,WAAW,CAAC;AAAA,eAAA2K;MAAA,GAAA,KAAA,MAAA;AAAA,YAAAO,QAAAd,SAAA;AAAAc,cAAAL,cAcLtH,OAAM3D,gBAAgB,KAAK2D,EAAEqD,gBAAgB;AAACsE,cAAAJ,UADnDnE;AAAgBuE,cAAA9B,iBAAA,cADX,MAAMzJ,kBAAkB,KAAK,CAAC;AAAAuL,cAAA9B,iBAAA,cAD9B,MAAMzJ,kBAAkB,IAAI,CAAC;AAAA,YAAAwL,SAFtClM;AAAY,eAAAkM,WAAA,aAAAhC,OAAAgC,QAAAD,KAAA,IAAZjM,eAAYiM;AAAAzB,QAAAA,UAAAyB,OAQhBjE,YAAY;AAAAqD,QAAAA,UAAAc,SAAA;AAAA,cAAAC,OAPN,wBAAwBzL,gBAAgB,IAAI,kCAAkC,EAAE,IAAE0L,OAKxE1L,gBAAgB,IAAI,SAAS;AAASyL,mBAAAD,IAAA7H,KAAAgH,YAAAW,OAAAE,IAAA7H,IAAA8H,IAAA;AAAAC,mBAAAF,IAAAG,KAAAhD,oBAAA2C,OAAA,UAAAE,IAAAG,IAAAD,IAAA;AAAA,iBAAAF;QAAA,GAAA;UAAA7H,GAAAiI;UAAAD,GAAAC;QAAA,CAAA;AAAA,eAAAN;MAAA,GAAA;IAI1D,GAAA,GAAA,IAAA;AAAAZ,IAAAA,UAAAc,SAAA;AAAA,UAAAK,MA7DM,kBAAkB9J,SAAS,IAAI,0BAA0B,EAAE,IAAE+J,OAczD,GAAGxL,YAAYoB,IAAI,CAAC,KAAGqK,OAQxB,iBAAiBzL,YAAYoB,IAAI,CAAC;AAAWmK,cAAAL,IAAA7H,KAAAgH,YAAA5B,OAAAyC,IAAA7H,IAAAkI,GAAA;AAAAC,eAAAN,IAAAG,KAAAhD,oBAAAO,OAAA,SAAAsC,IAAAG,IAAAG,IAAA;AAAAC,eAAAP,IAAAQ,KAAArD,oBAAAS,OAAA,QAAAoC,IAAAQ,IAAAD,IAAA;AAAA,aAAAP;IAAA,GAAA;MAAA7H,GAAAiI;MAAAD,GAAAC;MAAAI,GAAAJ;IAAA,CAAA;AAAA,WAAA/C;EAAA,GAAA;AA2C/D;AAACoD,kBAAA,CAAA,eAAA,eAAA,aAAA,SAAA,WAAA,SAAA,WAAA,CAAA;;;;;;;;;AC7aD,SAASC,QAAAA,aAAY;;;;;;;;;;;ACArB,SAASC,gBAAAA,eAAcC,gBAAAA,eAAcC,MAAAA,KAAIC,WAAAA,UAASC,aAAAA,YAAWC,KAAKC,QAAAA,aAAY;;;;AAavE,SAASC,iBAAmCC,OAAiC;AAClF,MAAIC;AACJ,QAAM,CAACC,WAAWC,YAAY,IAAIX,cAAqD,IAAI;AAE3F,QAAM,CAACY,YAAYC,aAAa,IAAIb,cAAa,KAAK;AAEtD,QAAMc,UAAUA,MAAM;AACpB,QAAI,CAACL,aAAc;AACnB,UAAMM,eAAeN,aAAaO,cAAc,sBAAsB;AACtE,QAAI,CAACD,aAAc;AACnBJ,iBAAa;MACXM,MAAMF,aAAaG;MACnBC,OAAOJ,aAAaK;IACtB,CAAC;EACH;AAEAnB,EAAAA,cAAaC,IAAG,MAAM,CAACM,MAAMa,OAAOb,MAAMc,QAAQC,MAAM,GAAYT,OAAO,CAAC;AAE5Eb,EAAAA,cAAaC,IAAG,MAAMM,MAAMa,OAAO,MAAMR,cAAc,IAAI,GAAG;IAAEW,OAAO;EAAK,CAAC,CAAC;AAG9ErB,EAAAA,SAAQ,MAAM;AACZ,QAAI,CAACM,aAAc;AACnB,UAAMgB,KAAK,IAAIC,eAAeZ,OAAO;AACrCW,OAAGE,QAAQlB,YAAY;AACvBL,IAAAA,WAAU,MAAMqB,GAAGG,WAAW,CAAC;EACjC,CAAC;AAED,QAAMC,aAAaA,MACjBjB,WAAW,IACP,sFACA;AAGN,UAAA,MAAA;AAAA,QAAAkB,OAAAC,SAAA;AAAA,QAAAC,QACsCvB;AAAY,WAAAuB,UAAA,aAAAC,OAAAD,OAAAF,IAAA,IAAZrB,eAAYqB;AAAAI,IAAAA,UAAAJ,MAAAK,mBAC7C7B,OAAI;MAAA,IAAC8B,OAAI;AAAA,eAAE1B,UAAU;MAAC;MAAA2B,UACnBC,YAAK,MAAA;AAAA,YAAAC,QAAAC,SAAA;AAAAC,QAAAA,UAAAC,SAAA;AAAA,cAAAC,MAIK,GAAGL,MAAM,EAAErB,IAAI,MAAI2B,OAClB,GAAGN,MAAM,EAAEnB,KAAK,MAAI0B,OACfhB,WAAW;AAACc,kBAAAD,IAAAI,KAAAC,oBAAAR,OAAA,QAAAG,IAAAI,IAAAH,GAAA;AAAAC,mBAAAF,IAAAM,KAAAD,oBAAAR,OAAA,SAAAG,IAAAM,IAAAJ,IAAA;AAAAC,mBAAAH,IAAAO,KAAAF,oBAAAR,OAAA,cAAAG,IAAAO,IAAAJ,IAAA;AAAA,iBAAAH;QAAA,GAAA;UAAAI,GAAAI;UAAAF,GAAAE;UAAAD,GAAAC;QAAA,CAAA;AAAA,eAAAX;MAAA,GAAA;IAG7B,CAAA,GAAA,IAAA;AAAAL,IAAAA,UAAAJ,MAAAK,mBAEF9B,KAAG;MAAA,IAAC8C,OAAI;AAAA,eAAE3C,MAAMc;MAAO;MAAAe,UACpBe,aAAM,MAAA;AAAA,YAAAC,QAAAC,SAAA;AAAAD,cAAAE,UAEK,MAAM/C,MAAMgD,SAASJ,OAAO/B,KAAK;AAACa,QAAAA,UAAAmB,OAAA,MAI1CD,OAAOK,KAAK;AAAAhB,QAAAA,UAAA,MAAAiB,gBAAAL,OAAA,eAFAM,OAAOnD,MAAMa,UAAU+B,OAAO/B,KAAK,CAAC,CAAA;AAAA,eAAAgC;MAAA,GAAA;IAIpD,CAAA,GAAA,IAAA;AAAA,WAAAvB;EAAA,GAAA;AAIT;AAAC8B,kBAAA,CAAA,OAAA,CAAA;;;;;AD7DM,SAASC,OAAOC,OAAoB;AACzC,UAAA,MAAA;AAAA,QAAAC,OAAAC,SAAA,GAAAC,QAAAF,KAAAG;AAAAC,IAAAA,UAAAF,OAAA,MAGOH,MAAMM,OAAK,IAAA;AAAAD,IAAAA,UAAAF,OAAAI,mBACXC,OAAI;MAAA,IAACC,OAAI;AAAA,eAAET,MAAMU;MAAQ;MAAA,IAAAC,WAAA;AAAA,YAAAC,QAAAC,SAAA;AAAAR,QAAAA,UAAAO,OAAA,MAErBE,qBAAqBd,MAAMU,QAAS,CAAC;AAAAK,QAAAA,UAAA,MAAAC,aAAAJ,OAD3B,wBAAwBZ,MAAMiB,iBAAiB,kCAAkC,EAAE,EAAE,CAAA;AAAA,eAAAL;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAP,IAAAA,UAAAJ,MAAAM,mBAKrGW,kBAAgB;MACfC,SAAS,CACP;QAAEC,OAAO;QAAgBd,OAAO;MAAM,GACtC;QAAEc,OAAO;QAAed,OAAO;MAAK,CAAC;MACtC,IACDc,QAAK;AAAA,eAAEpB,MAAMqB,UAAU,OAAO;MAAK;MACnCC,UAAWC,SAAQvB,MAAMsB,SAASC,QAAQ,IAAI;IAAC,CAAA,GAAA,IAAA;AAAA,WAAAtB;EAAA,GAAA;AAIvD;A;;;;;;;;;;;;;;AE3BA,SAASuB,oBACPC,WACAC,SACAC,MACAC,UACoB;AACpB,QAAMC,SAA6B,CAAA;AACnC,QAAMC,QAAQ;AACd,QAAMC,KAAKH,WAAWE;AAEtB,MAAIE,WAAW;AACf,MAAIC,WAAW;AACf,QAAMC,SAAS;AAEf,WAASC,IAAI,GAAGA,KAAKL,OAAOK,KAAK;AAC/B,UAAMC,OAAOD,IAAIJ;AACjBF,WAAOQ,KAAK,CAACD,MAAMJ,QAAQ,CAAC;AAE5B,UAAMM,cAAc,CAACb,aAAaO,WAAWE;AAC7C,UAAMK,eAAe,CAACb,UAAUO;AAChC,UAAMO,gBAAgBF,cAAcC,gBAAgBZ;AAEpDM,gBAAYO,eAAeT;AAC3BC,gBAAYC,WAAWF;EACzB;AAEA,SAAOF;AACT;AAEO,SAASY,oBAAoBC,OAAiC;AACnE,QAAMC,QAAQ;AACd,QAAMC,SAAS;AAEf,QAAMC,SAASA,MAAM;AACnB,QAAIpB;AACJ,QAAIC;AACJ,QAAIC;AAEJ,QAAIe,MAAMI,cAAc;AACtB,YAAMC,iBAAiBL,MAAMM,OAAOD,kBAAkB;AACtD,YAAME,SAASP,MAAMM,OAAOC,UAAU;AACtCtB,aAAO;AACPF,kBAAYyB,KAAKC,IAAK,IAAID,KAAKE,KAAML,gBAAgB,CAAC;AACtD,YAAMM,eAAe,IAAIJ;AACzBvB,gBAAU,IAAI2B,eAAeH,KAAKI,KAAK7B,YAAYE,IAAI;IACzD,OAAO;AACLF,kBAAYiB,MAAMM,OAAOvB,aAAa;AACtCC,gBAAUgB,MAAMM,OAAOtB,WAAW;AAClCC,aAAOe,MAAMM,OAAOrB,QAAQ;IAC9B;AAEA,UAAMC,WAAW;AACjB,UAAMC,SAASL,oBAAoBC,WAAWC,SAASC,MAAMC,QAAQ;AACrE,UAAM2B,SAAS1B,OAAO2B,IAAI,CAAC,CAAA,EAAGC,KAAK,MAAMA,KAAK;AAC9C,UAAMC,WAAWR,KAAKS,IAAI,GAAGJ,MAAM;AACnC,UAAMK,WAAWV,KAAKW,IAAI,GAAGN,MAAM;AACnC,UAAMO,aAAaF,WAAWF;AAE9B,UAAMK,WAAWlC,OACd2B,IAAI,CAAC,CAACpB,MAAMqB,KAAK,GAAGtB,MAAM;AACzB,YAAM6B,IAAK5B,OAAOR,WAAYe;AAC9B,YAAMsB,mBAAmBR,QAAQC,aAAaI,cAAc;AAC5D,YAAMI,IAAItB,UAAUqB,kBAAkBrB,SAAS,MAAMA,SAAS;AAC9D,aAAO,GAAGT,MAAM,IAAI,MAAM,GAAG,IAAI6B,CAAC,IAAIE,CAAC;IACzC,CAAC,EACAC,KAAK,GAAG;AAEX,WAAOJ;EACT;AAEA,QAAMK,YAAYA,MAAM;AACtB,UAAMC,QAAyC,CAAA;AAC/C,aAASlC,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,YAAM6B,IAAKrB,QAAQ,IAAKR;AACxB,YAAM+B,IAAKtB,SAAS,IAAKT;AACzBkC,YAAMhC,KACJiC,WAAWN,GAAG,GAAGA,GAAGpB,MAAM,GAC1B0B,WAAW,GAAGJ,GAAGvB,OAAOuB,CAAC,CAC3B;IACF;AACA,WAAOG;EACT;AAEA,WAASC,WAAWC,IAAYC,IAAYC,IAAYC,IAAY;AAClE,YAAA,MAAA;AAAA,UAAAC,OAAAC,SAAA;AAAAC,MAAAA,gBAAAF,MAAA,MACYJ,EAAE;AAAAM,MAAAA,gBAAAF,MAAA,MAAMH,EAAE;AAAAK,MAAAA,gBAAAF,MAAA,MAAMF,EAAE;AAAAI,MAAAA,gBAAAF,MAAA,MAAMD,EAAE;AAAA,aAAAC;IAAA,GAAA;EAExC;AAEA,UAAA,MAAA;AAAA,QAAAG,QAAAC,SAAA,GAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAG;AAAAC,IAAAA,UAAAN,OAEKV,WAASY,KAAA;AAAAK,IAAAA,UAAA,MAAAR,gBAAAK,OAAA,KAWLrC,OAAO,CAAC,CAAA;AAAA,WAAAiC;EAAA,GAAA;AASnB;;;;ACtGO,SAASQ,cAAcC,OAA2B;AACvD,QAAMC,OAAOC,UACX,MAAMC,UAAUC,cAAcJ,MAAMK,SAASL,MAAMM,IAAI,GACtDC,YAAWJ,UAAUK,UAAUR,MAAMK,SAASE,MAAM,CACvD;AAEA,QAAME,eAAeA,MAAMR,KAAK,MAAM;AAEtC,QAAMS,QAGF;IACFC,QAAQX,MAAMY,OAAOC,mBAAmBC,SAAYd,MAAMY,SAAS;MAAEG,MAAM;MAAUF,gBAAgB;MAAKG,QAAQ;IAAI;IACtHC,UAAUjB,MAAMY,OAAOM,cAAcJ,SAAYd,MAAMY,SAAS;MAAEG,MAAM;MAAUG,WAAW;MAAKC,SAAS;MAAIC,MAAM;IAAE;EACzH;AAEA,QAAMC,mBAAoBC,aAAmC;AAE3D,QAAIb,aAAa,GAAG;AAClBC,YAAMC,SAASX,MAAMY;IACvB,OAAO;AACLF,YAAMO,WAAWjB,MAAMY;IACzB;AAEAT,cAAUoB,iBAAiBvB,MAAMK,SAASL,MAAMM,MAAMgB,OAAO;AAE7D,QAAIA,YAAY,UAAU;AACxBtB,YAAMwB,SAASd,MAAMC,MAAM;IAC7B,OAAO;AACLX,YAAMwB,SAASd,MAAMO,QAAQ;IAC/B;EACF;AAEA,QAAMQ,eAAeA,CAACC,KAAyBC,UAAkB;AAC/D,QAAIlB,aAAa,GAAG;AAClB,YAAM;QAAES;QAAWC;QAASC;QAAM,GAAGQ;MAAK,IAAI5B,MAAMY;AACpDZ,YAAMwB,SAAS;QAAE,GAAGI;QAAM,CAACF,GAAG,GAAGC;MAAM,CAAC;IAC1C,OAAO;AACL,YAAM;QAAEd;QAAgBG;QAAQ,GAAGY;MAAK,IAAI5B,MAAMY;AAClDZ,YAAMwB,SAAS;QAAE,GAAGI;QAAM,CAACF,GAAG,GAAGC;MAAM,CAAC;IAC1C;EACF;AAEA,SAAAE,mBACGC,QAAM;IAAA,IAACC,QAAK;AAAA,aAAE/B,MAAMgC;IAAK;IAAEC,aAAa;IAAI,IAAAC,WAAA;AAAA,UAAAC,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC;AAAAE,MAAAA,UAAAL,MAAAN,mBAExCY,qBAAmB;QAAA,IAAC7B,SAAM;AAAA,iBAAEZ,MAAMY;QAAM;QAAA,IAAEH,eAAY;AAAA,iBAAEA,aAAa;QAAC;MAAA,CAAA,GAAA4B,KAAA;AAAAG,MAAAA,UAAAH,OAAAR,mBAIpEa,kBAAgB;QACfC,SAAS,CACP;UAAEhB,OAAO;UAAmBK,OAAO;QAAO,GAC1C;UAAEL,OAAO;UAAqBK,OAAO;QAAU,CAAC;QACjD,IACDL,QAAK;AAAA,iBAAE1B,KAAK;QAAC;QACbuB,UAAUH;MAAgB,CAAA,GAAA,IAAA;AAAAmB,MAAAA,UAAAL,OAAA,MAAA;AAAA,YAAAS,MAAAC,QAAA,MAAA,CAAA,CAI7BpC,aAAa,CAAC;AAAA,eAAA,MAAdmC,IAAA,IAAA,CAAAf,mBAEIiB,QAAM;UACLd,OAAK;UAAA,IACLL,QAAK;AAAA,mBAAE3B,MAAMY,OAAOC,kBAAkB;UAAG;UACzCW,UAAWuB,OAAMtB,aAAa,kBAAkBsB,CAAC;UACjDC,KAAK;UACLC,KAAK;UACLC,MAAM;UACNC,MAAI;QAAA,CAAA,GAAAtB,mBAELiB,QAAM;UACLd,OAAK;UAAA,IACLL,QAAK;AAAA,mBAAE3B,MAAMY,OAAOI,UAAU;UAAG;UACjCQ,UAAWuB,OAAMtB,aAAa,UAAUsB,CAAC;UACzCC,KAAK;UACLC,KAAK;UACLC,MAAM;QAAI,CAAA,CAAA,IAAA,CAAArB,mBAKXiB,QAAM;UACLd,OAAK;UAAA,IACLL,QAAK;AAAA,mBAAE3B,MAAMY,OAAOM,aAAa;UAAG;UACpCM,UAAWuB,OAAMtB,aAAa,aAAasB,CAAC;UAC5CC,KAAK;UACLC,KAAK;UACLC,MAAM;QAAE,CAAA,GAAArB,mBAETiB,QAAM;UACLd,OAAK;UAAA,IACLL,QAAK;AAAA,mBAAE3B,MAAMY,OAAOO,WAAW;UAAE;UACjCK,UAAWuB,OAAMtB,aAAa,WAAWsB,CAAC;UAC1CC,KAAK;UACLC,KAAK;UACLC,MAAM;QAAC,CAAA,GAAArB,mBAERiB,QAAM;UACLd,OAAK;UAAA,IACLL,QAAK;AAAA,mBAAE3B,MAAMY,OAAOQ,QAAQ;UAAC;UAC7BI,UAAWuB,OAAMtB,aAAa,QAAQsB,CAAC;UACvCC,KAAK;UACLC,KAAK;UACLC,MAAM;QAAG,CAAA,CAAA;MAGd,GAAA,GAAA,IAAA;AAAA,aAAAf;IAAA;EAAA,CAAA;AAIT;;;;;;;;;;AC/HA,SAASiB,gBAAAA,eAAcC,QAAAA,aAAY;A;;;;;;ACS5B,SAASC,oBAAoBC,OAAiC;AACnE,QAAMC,OAAO;AACb,QAAMC,MAAM;AACZ,QAAMC,QAAQF,OAAOC,MAAM,KAAK;AAChC,QAAME,QAAQA,CAACC,GAAWC,OAAe;IACvCD,GAAGH,OAAOG,IAAI,OAAOF;IACrBG,GAAGJ,OAAO,MAAMI,KAAKH;EACvB;AACA,QAAMI,QAAQH,MAAM,GAAG,CAAC;AACxB,QAAMI,MAAMJ,MAAM,GAAG,CAAC;AACtB,QAAMK,YAAYA,MAAM;AACtB,UAAM,CAACC,IAAIC,IAAIC,IAAIC,EAAE,IAAIb,MAAMc,OAAOC;AACtC,UAAMC,QAAQZ,MAAMM,IAAIC,EAAE;AAC1B,UAAMM,SAASb,MAAMQ,IAAIC,EAAE;AAC3B,WAAO,KAAKN,MAAMF,CAAC,IAAIE,MAAMD,CAAC,MAAMU,MAAMX,CAAC,IAAIW,MAAMV,CAAC,KAAKW,OAAOZ,CAAC,IAAIY,OAAOX,CAAC,KAAKE,IAAIH,CAAC,IAAIG,IAAIF,CAAC;EACpG;AAEA,UAAA,MAAA;AAAA,QAAAY,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG;AAAAC,IAAAA,UAAAC,SAAA;AAAA,UAAAC,MAOUnB,MAAMF,GAACsB,OACPpB,MAAMD,GAACsB,OACPpB,IAAIH,GAACwB,OACLrB,IAAIF,GAACwB,OAMNrB,UAAU;AAACiB,cAAAD,IAAAM,KAAAC,gBAAAZ,OAAA,MAAAK,IAAAM,IAAAL,GAAA;AAAAC,eAAAF,IAAAQ,KAAAD,gBAAAZ,OAAA,MAAAK,IAAAQ,IAAAN,IAAA;AAAAC,eAAAH,IAAAS,KAAAF,gBAAAZ,OAAA,MAAAK,IAAAS,IAAAN,IAAA;AAAAC,eAAAJ,IAAAU,KAAAH,gBAAAZ,OAAA,MAAAK,IAAAU,IAAAN,IAAA;AAAAC,eAAAL,IAAAW,KAAAJ,gBAAAV,OAAA,KAAAG,IAAAW,IAAAN,IAAA;AAAA,aAAAL;IAAA,GAAA;MAAAM,GAAAM;MAAAJ,GAAAI;MAAAH,GAAAG;MAAAF,GAAAE;MAAAD,GAAAC;IAAA,CAAA;AAAA,WAAAnB;EAAA,GAAA;AAQtB;;;;;ADpBO,SAASoB,kBAAkBC,OAA+B;AAC/D,QAAMC,OAAOC,UACX,MAAMC,UAAUC,kBAAkBJ,MAAMK,SAASL,MAAMM,IAAI,GAC1DC,YAAWJ,UAAUK,UAAUR,MAAMK,SAASE,MAAM,CACvD;AACA,QAAM,CAACE,aAAaC,cAAc,IAAIC,cAAa,KAAK;AACxD,QAAM,CAACC,WAAWC,YAAY,IAAIF,cAAa,EAAE;AACjD,QAAMG,QAAgF;IACpFC,QAAQf,MAAMgB,MAAMC,SAAS,WACzBjB,MAAMgB,QACN;MAAEC,MAAM;MAAUC,UAAU;MAAKC,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC;IAAE;IAC7DC,QAAQpB,MAAMgB,MAAMC,SAAS,YAAYjB,MAAMgB,MAAMK,mBAAmBC,SACpEtB,MAAMgB,QACN;MAAEC,MAAM;MAAUI,gBAAgB;MAAKE,QAAQ;IAAI;IACvDC,UAAUxB,MAAMgB,MAAMC,SAAS,YAAYjB,MAAMgB,MAAMS,cAAcH,SACjEtB,MAAMgB,QACN;MAAEC,MAAM;MAAUQ,WAAW;MAAKC,SAAS;MAAIC,MAAM;IAAE;EAC7D;AAEA,QAAMC,WAAWA,MAAM3B,KAAK,MAAM;AAClC,QAAM4B,WAAWA,MAAM5B,KAAK,MAAM;AAClC,QAAM6B,SAASA,MAAM;AACnB,QAAI9B,MAAMgB,MAAMC,SAAS,UAAU;AACjC,UAAIY,SAAS,EAAGf,OAAMM,SAASpB,MAAMgB;eAC5Bf,KAAK,MAAM,WAAYa,OAAMU,WAAWxB,MAAMgB;AACvD,aAAOhB,MAAMgB;IACf;AACA,WAAOF,MAAMM;EACf;AACA,QAAML,SAASA,MAAM;AACnB,QAAIf,MAAMgB,MAAMC,SAAS,UAAU;AACjCH,YAAMC,SAASf,MAAMgB;AACrB,aAAOhB,MAAMgB;IACf;AACA,WAAOF,MAAMC;EACf;AAEA,QAAMgB,mBAAoBC,UAAoB;AAC5C7B,cAAU8B,qBAAqBjC,MAAMK,SAASL,MAAMM,MAAM0B,IAAI;AAC9DhC,UAAMkC,SAASF,SAAS,WAAWlB,MAAMC,SAASiB,SAAS,WAAWlB,MAAMM,SAASN,MAAMU,QAAQ;EACrG;AAEA,QAAMW,qBAAqBA,CAACC,KAAyBpB,UAAkB;AACrE,UAAMqB,UAAUP,OAAO;AACvB,QAAID,SAAS,GAAG;AACd,YAAM;QAAEJ;QAAWC;QAASC;QAAM,GAAGW;MAAK,IAAID;AAC9CrC,YAAMkC,SAAS;QAAE,GAAGI;QAAM,CAACF,GAAG,GAAGpB;MAAM,CAAC;IAC1C,OAAO;AACL,YAAM;QAAEK;QAAgBE;QAAQ,GAAGe;MAAK,IAAID;AAC5CrC,YAAMkC,SAAS;QAAE,GAAGI;QAAM,CAACF,GAAG,GAAGpB;MAAM,CAAC;IAC1C;EACF;AAEA,QAAMuB,aAAaA,CAACC,OAAexB,UAAkB;AACnD,UAAMqB,UAAUtB,OAAO;AACvB,UAAMiB,OAAO,CAAC,GAAGK,QAAQlB,IAAI;AAC7Ba,SAAKQ,KAAK,IAAIxB;AACdhB,UAAMkC,SAAS;MAAE,GAAGG;MAASlB,MAAMa;IAAK,CAAC;EAC3C;AAEA,QAAMS,aAAczB,WAClBA,MAAM0B,IAAKC,UAASC,OAAOD,KAAKE,QAAQ,CAAC,CAAC,CAAC,EAAEC,KAAK,IAAI;AACxD,QAAMC,aAAaA,MAAM;AACvB,UAAMC,QAAQpC,UAAU,EAAEqC,MAAM,GAAG,EAAEP,IAAKC,UAASC,OAAOM,WAAWP,KAAKQ,KAAK,CAAC,CAAC;AACjF,QAAIH,MAAMI,WAAW,KAAKJ,MAAMK,MAAMT,OAAOU,QAAQ,GAAG;AACtDtD,YAAMkC,SAAS;QAAE,GAAGnB,OAAO;QAAGI,MAAM6B;MAA0C,CAAC;IACjF;AACAtC,mBAAe,KAAK;EACtB;AAEA,QAAM6C,iBAAiBA,MAAM;AAC3B,QAAIvD,MAAMwD,gBAAiB,CAAC5B,SAAS,KAAK,CAACC,SAAS,EAAI,QAAO;AAC/D,UAAM4B,WAAWzD,MAAM0D;AACvB,WAAAC,mBACGC,QAAM;MACLC,OAAK;MAAA,IACL7C,QAAK;AAAA,eAAEyC,UAAUzC,UAAUY,SAAS,IAAIb,OAAO,EAAEG,WAAWY,OAAO,EAAET,kBAAkB;MAAI;MAAA,IAC3Fa,WAAQ;AAAA,eAAEuB,UAAUvB,aAAclB,WAAU;AAC1C,cAAIY,SAAS,EAAG5B,OAAMkC,SAAS;YAAE,GAAGnB,OAAO;YAAGG,UAAUF;UAAM,CAAC;cAC1DmB,oBAAmB,kBAAkBnB,KAAK;QACjD;MAAE;MAAA,IACF8C,MAAG;AAAA,eAAEL,UAAUK,OAAO;MAAG;MAAA,IACzBC,MAAG;AAAA,eAAEN,UAAUM,QAAQnC,SAAS,IAAI,IAAI;MAAE;MAAA,IAC1CoC,OAAI;AAAA,eAAEP,UAAUO,QAAQ;MAAI;MAC5BC,MAAI;IAAA,CAAA;EAGV;AAEA,SAAAN,mBACGO,QAAM;IAAA,IAACC,QAAK;AAAA,aAAEnE,MAAM6D;IAAK;IAAEO,aAAa;IAAI,IAAAC,WAAA;AAAA,UAAAC,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC;AAAAE,MAAAA,UAAAL,MAAAX,mBAExCiB,OAAI;QAAA,IAACC,OAAI;AAAA,iBAAEjD,SAAS;QAAC;QAAA,IAAEkD,WAAQ;AAAA,iBAAAnB,mBAAGoB,qBAAmB;YAAA,IAACjD,SAAM;AAAA,qBAAEA,OAAO;YAAC;YAAA,IAAEkD,eAAY;AAAA,qBAAEnD,SAAS;YAAC;UAAA,CAAA;QAAA;QAAA,IAAAwC,WAAA;AAAA,iBAAAV,mBAC9FsB,qBAAmB;YAAA,IAAClE,SAAM;AAAA,qBAAEA,OAAO;YAAC;UAAA,CAAA;QAAA;MAAA,CAAA,GAAAyD,KAAA;AAAAG,MAAAA,UAAAH,OAAAb,mBAKpCuB,kBAAgB;QACfC,SAAS,CACP;UAAEnE,OAAO;UAAU6C,OAAO;QAAS,GACnC;UAAE7C,OAAO;UAAU6C,OAAO;QAAO,GACjC;UAAE7C,OAAO;UAAY6C,OAAO;QAAU,CAAC;QACxC,IACD7C,QAAK;AAAA,iBAAEf,KAAK;QAAC;QACbiC,UAAUH;MAAgB,CAAA,GAAA,IAAA;AAAA4C,MAAAA,UAAAL,MAAAX,mBAI7BiB,OAAI;QAAA,IAACC,OAAI;AAAA,iBAAEjD,SAAS;QAAC;QAAA,IAAAyC,WAAA;AAAA,iBAAA,CAAAV,mBACnBC,QAAM;YAACC,OAAK;YAAA,IAAM7C,QAAK;AAAA,qBAAED,OAAO,EAAEI,KAAK,CAAC;YAAC;YAAEe,UAAWlB,WAAUuB,WAAW,GAAGvB,KAAK;YAAG8C,KAAK;YAAGC,KAAK;YAAGC,MAAM;UAAI,CAAA,GAAAL,mBAChHC,QAAM;YAACC,OAAK;YAAA,IAAM7C,QAAK;AAAA,qBAAED,OAAO,EAAEI,KAAK,CAAC;YAAC;YAAEe,UAAWlB,WAAUuB,WAAW,GAAGvB,KAAK;YAAG8C,KAAK;YAAIC,KAAK;YAAGC,MAAM;UAAI,CAAA,GAAAL,mBACjHC,QAAM;YAACC,OAAK;YAAA,IAAM7C,QAAK;AAAA,qBAAED,OAAO,EAAEI,KAAK,CAAC;YAAC;YAAEe,UAAWlB,WAAUuB,WAAW,GAAGvB,KAAK;YAAG8C,KAAK;YAAGC,KAAK;YAAGC,MAAM;UAAI,CAAA,GAAAL,mBAChHC,QAAM;YAACC,OAAK;YAAA,IAAM7C,QAAK;AAAA,qBAAED,OAAO,EAAEI,KAAK,CAAC;YAAC;YAAEe,UAAWlB,WAAUuB,WAAW,GAAGvB,KAAK;YAAG8C,KAAK;YAAIC,KAAK;YAAGC,MAAM;UAAI,CAAA,IAAA,MAAA;AAAA,gBAAAoB,QAAAC,SAAA,GAAAC,QAAAF,MAAAX,YAAAc,QAAAD,MAAAE;AAAAD,kBAAAE,YAalGC,WAAU;AACpB,kBAAIA,MAAMtD,QAAQ,QAASsD,OAAMC,cAAcC,KAAK;YACtD;AAACL,kBAAAM,iBAAA,QAHO9C,UAAU;AAAAwC,kBAAAM,iBAAA,SAJT,MAAM;AACbhF,2BAAa4B,WAAW1B,OAAO,EAAEI,IAAI,CAAC;AACtCT,6BAAe,IAAI;YACrB,CAAC;AAAA6E,kBAAAO,UAJSJ,WAAU7E,aAAa6E,MAAMC,cAAc3E,KAAK;AAAC+E,YAAAA,gBAAAR,OAAA,cAS/C,KAAK;AAAAS,YAAAA,UAAA,MAAAT,MAAAvE,QAVVP,YAAY,IAAIG,UAAU,IAAI6B,WAAW1B,OAAO,EAAEI,IAAI,CAAC;AAAA,mBAAAiE;UAAA,GAAA,CAAA;QAAA;MAAA,CAAA,GAAA,IAAA;AAAAT,MAAAA,UAAAL,MAAAX,mBAenEiB,OAAI;QAAA,IAACC,OAAI;AAAA,iBAAEhD,SAAS;QAAC;QAAA,IAAAwC,WAAA;AAAA,iBAAAV,mBACnBC,QAAM;YAACC,OAAK;YAAA,IAAU7C,QAAK;AAAA,qBAAEc,OAAO,EAAEP,UAAU;YAAG;YAAEW,UAAWlB,WAAUmB,mBAAmB,UAAUnB,KAAK;YAAG8C,KAAK;YAAGC,KAAK;YAAGC,MAAM;UAAI,CAAA;QAAA;MAAA,CAAA,GAAA,IAAA;AAAAW,MAAAA,UAAAL,MAAAX,mBAE3IiB,OAAI;QAAA,IAACC,OAAI;AAAA,iBAAEoB,QAAA,MAAA,CAAA,CAAA,CAACrE,SAAS,CAAC,EAAA,KAAI,CAACC,SAAS;QAAC;QAAA,IAAAwC,WAAA;AAAA,iBAAA,CAAAV,mBACnCC,QAAM;YAACC,OAAK;YAAA,IAAa7C,QAAK;AAAA,qBAAEc,OAAO,EAAEL,aAAa;YAAG;YAAES,UAAWlB,WAAUmB,mBAAmB,aAAanB,KAAK;YAAG8C,KAAK;YAAGC,KAAK;YAAMC,MAAM;UAAE,CAAA,GAAAL,mBACnJC,QAAM;YAACC,OAAK;YAAA,IAAW7C,QAAK;AAAA,qBAAEc,OAAO,EAAEJ,WAAW;YAAE;YAAEQ,UAAWlB,WAAUmB,mBAAmB,WAAWnB,KAAK;YAAG8C,KAAK;YAAGC,KAAK;YAAKC,MAAM;UAAC,CAAA,GAAAL,mBAC1IC,QAAM;YAACC,OAAK;YAAA,IAAQ7C,QAAK;AAAA,qBAAEc,OAAO,EAAEH,QAAQ;YAAC;YAAEO,UAAWlB,WAAUmB,mBAAmB,QAAQnB,KAAK;YAAG8C,KAAK;YAAKC,KAAK;YAAIC,MAAM;UAAG,CAAA,CAAA;QAAA;MAAA,CAAA,GAAA,IAAA;AAAAW,MAAAA,UAAAL,MAErIf,gBAAc,IAAA;AAAA,aAAAe;IAAA;EAAA,CAAA;AAIvB;AAAC4B,kBAAA,CAAA,SAAA,SAAA,CAAA;;;;;;;;AEhLD,SAASC,kBAAAA,uBAAsB;;AASxB,SAASC,YAAYC,OAAyB;AACnD,QAAMC,UAAUH,gBAAe;AAE/B,UAAA,MAAA;AAAA,QAAAI,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG;AAAAC,IAAAA,gBAAAJ,OAAA,OAE2CH,OAAO;AAAAQ,IAAAA,UAAAL,OAAA,MAAGJ,MAAMU,KAAK;AAAAJ,UAAAK,UAMhDC,OAAMZ,MAAMa,SAASD,EAAEE,cAAcC,KAAK;AAACP,IAAAA,gBAAAF,OAAA,MAJjDL,OAAO;AAAAe,IAAAA,UAAA,MAAAR,gBAAAF,OAAA,eAKEN,MAAMiB,WAAW,CAAA;AAAAD,IAAAA,UAAA,MAAAV,MAAAS,QAFvBf,MAAMe,KAAK;AAAA,WAAAb;EAAA,GAAA;AAM1B;AAACgB,kBAAA,CAAA,OAAA,CAAA;;;;;;;;;;;;ACzBD,SAASC,gBAAAA,eAAcC,gBAAAA,eAAcC,MAAAA,KAAIC,WAAAA,UAASC,aAAAA,YAAWC,QAAAA,OAAMC,OAAAA,YAAW;AAC9E,SAASC,cAAc;AACvB,SAASC,WAAAA,gBAAe;;;ACWjB,SAAS,oBACd,SACA,YACA,UAAmC,CAAC,GAClB;AAClB,QAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,aAAa,KAAK,IAAI;AAC3D,QAAM,cAAc,QAAQ,sBAAsB;AAClD,QAAM,WAAW,WAAW,sBAAsB;AAClD,QAAM,aAAa,OAAO,cAAc,YAAY,SAAS;AAC7D,QAAM,QAAQ,cAAc,aAAa,kBAAkB,YAAY,MAAM;AAE7E,SAAO;AAAA,IACL,KAAK,QACD,YAAY,MAAM,SAAS,MAAM,iBAAiB,MAClD,YAAY,SAAS,SAAS,MAAM;AAAA,IACxC,MAAM,YAAY,OAAO,SAAS;AAAA,IAClC,OAAO,YAAY;AAAA,IACnB;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,SAA6D;AAChG,SAAQ,SAAS,QAAQ,eAAe,KAA4B;AACtE;;;;;;ADpBA,SAASC,YAAYC,GAAmB;AACtC,SAAOA,EAAEC,QAAQ,SAAUC,OAAMA,EAAEC,YAAY,CAAC;AAClD;AAEA,SAASC,iBAAiBC,SAA6D;AACrF,SAAOA,QAAQC,IAAKC,SAClB,OAAOA,QAAQ,WAAW;IAAEC,OAAOD;IAAKE,OAAOV,YAAYQ,GAAG;EAAE,IAAIA,GACtE;AACF;AAEO,SAASG,cAAcC,OAA2B;AACvD,QAAM,CAACC,KAAKC,MAAM,IAAIC,cAAkF,IAAI;AAC5G,QAAM,CAACC,cAAcC,eAAe,IAAIF,cAAiC,IAAI;AAC7E,MAAIG;AACJ,MAAIC;AACJ,MAAIC,cAAsC;AAE1C,QAAMC,aAAaA,MAAMhB,iBAAiBO,MAAMN,OAAO;AACvD,QAAMgB,iBAAiBA,MAAMD,WAAW,EAAEE,KAAMC,OAAMA,EAAEf,UAAUG,MAAMH,KAAK;AAE7E,QAAMgB,WAAWC,uBAAuB,CAACC,IAAIC,SAC3CC,SACEF,IACA;IAAEG,SAAS;IAAGC,GAAIlB,IAAI,GAAGmB,SAAS,QAAS,IAAI;IAAIC,OAAO;EAAK,GAC/D;IAAEC,MAAM;IAAUC,gBAAgB;IAAMC,QAAQ;IAAGC,YAAYT;EAAK,CACtE,CACF;AAEAU,EAAAA,SAAQ,MAAM;AACZrB,oBAAgBsB,qBAAqBrB,UAAU,KAAKsB,SAASC,IAAI;AACjEC,IAAAA,WAAU,MAAMtB,aAAauB,KAAK,CAAC;EACrC,CAAC;AAGDC,EAAAA,cAAaC,IAAGpB,SAASqB,QAASC,UAAS;AACzC,QAAI,CAAC5B,WAAY;AACjBC,iBAAauB,KAAK;AAClBvB,kBAAcS,SACZV,YACA;MAAE6B,QAAQD,OAAO,MAAM;IAAE,GACzB;MAAEb,MAAM;MAAUC,gBAAgB;MAAKC,QAAQ;IAAK,CACtD;EACF,GAAG;IAAEa,OAAO;EAAK,CAAC,CAAC;AAEnB,QAAMC,YAAYA,MAAM;AACtB,UAAMC,OAAOnC,aAAa;AAC1B,QAAI,CAACE,cAAc,CAACiC,KAAM;AAC1B,UAAMC,iBAAiB,IAAI/B,WAAW,EAAEgC,SAAS;AACjDvC,WAAOwC,oBAAoBpC,YAAYiC,MAAM;MAAEC;IAAe,CAAC,CAAC;EAClE;AAEA,QAAMG,eAAeA,MAAM;AACzBL,cAAU;AACVzB,aAASsB,KAAK;EAChB;AAEAS,wBAAsB;IACpBV,QAAQrB,SAASqB;IACjBW,UAAWC,YAAWxC,YAAYuC,SAASC,MAAM,KAAKjC,SAASgC,SAASC,MAAM;IAC9EC,WAAWlC,SAASmC;IACpBC,kBAAkBX;EACpB,CAAC;AAED,QAAMY,gBAAgBA,MAAM;AAC1B,UAAMC,IAAIlD,IAAI;AACd,QAAI,CAACkD,EAAG,QAAO,CAAC;AAChB,WAAO;MACLC,UAAU;MACVC,MAAM,GAAGF,EAAEE,IAAI;MACfC,KAAK,GAAGH,EAAEG,GAAG;MACbC,OAAO,GAAGJ,EAAEI,KAAK;MACjB,oBAAoBJ,EAAE/B,QAAQ,WAAW;IAC3C;EACF;AAEA,UAAA,MAAA;AAAA,QAAAoC,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAD,aAAAG,QAAAD,MAAAL;AAAAD,UAAAQ,UAKe,MAAMrD,SAASqB,OAAO,IAAIrB,SAASmC,MAAM,IAAIL,aAAa;AAAC,QAAAwB,QAF/D7D;AAAU,WAAA6D,UAAA,aAAAC,OAAAD,OAAAT,KAAA,IAAVpD,aAAUoD;AAAAW,IAAAA,WAAAT,OAAA,MAKqB5D,MAAMF,KAAK;AAAAuE,IAAAA,WAAAN,OAAA,MAETrD,eAAe,GAAGZ,SAASE,MAAMH,KAAK;AAAA,QAAAyE,SAEnE/D;AAAU,WAAA+D,WAAA,aAAAF,OAAAE,QAAAN,KAAA,IAAVzD,aAAUyD;AAAAO,IAAAA,gBAAAN,OAAA,KASNO,YAAY;AAAAH,IAAAA,WAAAb,MAAAiB,mBAK1BC,OAAI;MAAA,IAACC,OAAI;AAAA,eAAE,CAAC,CAACvE,aAAa;MAAC;MAAA,IAAAwE,WAAA;AAAA,eAAAH,mBACzBI,QAAM;UAAA,IAACC,QAAK;AAAA,mBAAE1E,aAAa;UAAC;UAAA,IAAAwE,WAAA;AAAA,mBAAAH,mBAC1BC,OAAI;cAAA,IAACC,OAAI;AAAA,uBAAEI,QAAA,MAAA,CAAA,CAAAlE,SAASmE,QAAQ,CAAC,EAAA,KAAI/E,IAAI;cAAC;cAAA,IAAA2E,WAAA;AAAA,oBAAAK,QAAAC,SAAA;AAAAd,gBAAAA,OAE7BrD,QAAO;AACXF,2BAASsE,OAAOpE,EAAE;AAClB,wBAAMK,QAAQnB,IAAI,GAAGmB,SAAS;AAC9BH,kBAAAA,SACEF,IACA;oBAAEG,SAAS,CAAC,GAAG,CAAC;oBAAGC,GAAG,CAACC,QAAQ,IAAI,IAAI,CAAC;oBAAGC,OAAO,CAAC,MAAM,CAAC;kBAAE,GAC5D;oBAAEC,MAAM;oBAAUC,gBAAgB;oBAAMC,QAAQ;kBAAE,CACpD;gBACF,GAACyD,KAAA;AAAAZ,gBAAAA,WAAAY,OAAAR,mBAIAW,MAAG;kBAAA,IAACC,OAAI;AAAA,2BAAE5E,WAAW;kBAAC;kBAAAmE,UACnBU,aAAM,MAAA;AAAA,wBAAAC,QAAAC,SAAA;AAAAD,0BAAArB,UAIK,MAAM;AACblE,4BAAMyF,SAASH,OAAOzF,KAAK;AAC3BgB,+BAASmC,MAAM;oBACjB;AAACqB,oBAAAA,WAAAkB,OAAA,MAEAD,OAAOxF,KAAK;AAAA4F,oBAAAA,WAAA,MAAAnB,gBAAAgB,OAAA,iBANEI,OAAOL,OAAOzF,UAAUG,MAAMH,KAAK,CAAC,CAAA;AAAA,2BAAA0F;kBAAA,GAAA;gBAQtD,CAAA,CAAA;AAAAG,gBAAAA,WAAAE,SAAAC,QAAAZ,OAdI/B,cAAc,GAAC0C,GAAA,CAAA;AAAA,uBAAAX;cAAA;YAAA,CAAA;UAAA;QAAA,CAAA;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAS,IAAAA,WAAA,MAAAnB,gBAAAb,OAAA,aAlCjBiC,OAAO9E,SAASqB,OAAO,CAAC,CAAC,CAAA;AAAA,WAAAsB;EAAA,GAAA;AAwD5C;AAACsC,kBAAA,CAAA,OAAA,CAAA;;;;;;;;;;;AEzJD,SAASC,gBAAAA,gBAAcC,gBAAAA,eAAcC,kBAAAA,iBAAgBC,QAAAA,aAAY;;;;AAQjE,IAAMC,kBAAkB;AAExB,SAASC,mBAAmBC,KAAqB;AAC/C,MAAIA,IAAIC,WAAW,EAAG,QAAOD;AAC7B,SAAO,IAAIA,IAAI,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC;AAChE;AAEO,SAASE,aAAaC,OAA0B;AACrD,QAAM,CAACC,WAAWC,YAAY,IAAIX,eAAa,KAAK;AACpD,QAAM,CAACY,WAAWC,YAAY,IAAIb,eAAaS,MAAMK,KAAK;AAC1D,QAAMC,cAAcb,gBAAe;AACnC,MAAIc;AAGJf,EAAAA,cAAa,MAAM;AACjB,QAAI,CAACS,UAAU,GAAG;AAChBG,mBAAaJ,MAAMK,KAAK;IAC1B;EACF,CAAC;AAED,QAAMG,mBAAmBA,MAAM;AAC7BN,iBAAa,KAAK;AAClB,QAAIP,gBAAgBc,KAAKN,UAAU,CAAC,GAAG;AACrCH,YAAMU,SAASP,UAAU,CAAC;IAC5B,OAAO;AACLC,mBAAaJ,MAAMK,KAAK;IAC1B;EACF;AAEA,QAAMM,gBAAiBC,OAAqB;AAC1C,QAAIA,EAAEC,QAAQ,QAASL,kBAAiB;aAC/BI,EAAEC,QAAQ,UAAU;AAC3BX,mBAAa,KAAK;AAClBE,mBAAaJ,MAAMK,KAAK;IAC1B;EACF;AAEA,UAAA,MAAA;AAAA,QAAAS,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAD,YAAAI,QAAAD,MAAAD;AAAAG,IAAAA,gBAAAN,OAAA,OAE4CV,WAAW;AAAAiB,IAAAA,WAAAP,OAAA,MAAGhB,MAAMwB,KAAK;AAAAD,IAAAA,WAAAL,OAAAO,oBAE9D/B,OAAI;MAAA,IACHgC,OAAI;AAAA,eAAEzB,UAAU;MAAC;MAAA,IACjB0B,WAAQ;AAAA,gBAAA,MAAA;AAAA,cAAAC,QAAAC,SAAA;AAAAD,gBAAAE,UACmC,MAAM5B,aAAa,IAAI;AAACqB,UAAAA,WAAAK,OAAA,OAC7D5B,MAAMK,SAAS,IAAI0B,YAAY,CAAC;AAAA,iBAAAH;QAAA,GAAA;MAAA;MAAA,IAAAI,WAAA;AAAA,YAAAC,QAAAC,SAAA;AAAAD,cAAAE,YAWzBxB;AAAasB,cAAAG,iBAAA,QADhB5B,gBAAgB;AAAAyB,cAAAI,UADdzB,OAAMR,aAAaQ,EAAE0B,cAAcjC,KAAK;AAACiB,QAAAA,gBAAAW,OAAA,MAJ/C3B,WAAW;AAAAiC,QAAAA,WAAA,MAAAN,MAAA5B,QAGRF,UAAU,CAAC;AAAA,eAAA8B;MAAA;IAAA,CAAA,GAAAb,KAAA;AAAAA,UAAAU,UAUX,MAAMvB,eAAeiC,MAAM;AAACnB,UAAAgB,UAU3BzB,OAAMZ,MAAMU,SAASE,EAAE0B,cAAcjC,KAAK;AAAC,QAAAoC,QALhDlC;AAAa,WAAAkC,UAAA,aAAAC,OAAAD,OAAApB,KAAA,IAAbd,gBAAac;AAAAkB,IAAAA,WAAAI,SAAA;AAAA,UAAAC,MANW5C,MAAMK,OAAKwC,OAG5B,kBAAkB7C,MAAMwB,KAAK,IAAEsB,OAM/B,GAAG9C,MAAMwB,KAAK;AAAeoB,cAAAD,IAAA/B,KAAAmC,oBAAA3B,OAAA,oBAAAuB,IAAA/B,IAAAgC,GAAA;AAAAC,eAAAF,IAAAK,KAAA1B,gBAAAF,OAAA,cAAAuB,IAAAK,IAAAH,IAAA;AAAAC,eAAAH,IAAAM,KAAA3B,gBAAAD,OAAA,cAAAsB,IAAAM,IAAAH,IAAA;AAAA,aAAAH;IAAA,GAAA;MAAA/B,GAAAsC;MAAAF,GAAAE;MAAAD,GAAAC;IAAA,CAAA;AAAAX,IAAAA,WAAA,MAAAlB,MAAAhB,QAClCL,MAAMK,MAAMP,WAAW,IAAIF,mBAAmBI,MAAMK,KAAK,IAAIL,MAAMK,MAAM8C,MAAM,GAAG,CAAC,CAAC;AAAA,WAAArC;EAAA,GAAA;AAMrG;AAACsC,kBAAA,CAAA,SAAA,WAAA,OAAA,CAAA;;;;;;;;;;;;ACtFD,SAASC,gBAAAA,gBAAcC,gBAAAA,eAAcC,MAAAA,KAAIC,WAAAA,UAASC,aAAAA,aAAWC,QAAAA,OAAMC,OAAAA,YAAW;AAC9E,SAASC,UAAAA,eAAc;AACvB,SAASC,WAAAA,gBAAe;;;;AAcjB,SAASC,cAAcC,OAA2B;AACvD,QAAM,CAACC,KAAKC,MAAM,IAAIC,eAAa;IAAEC,KAAK;IAAGC,MAAM;IAAGC,OAAO;EAAE,CAAC;AAChE,QAAM,CAACC,cAAcC,eAAe,IAAIL,eAAiC,IAAI;AAC7E,MAAIM;AACJ,MAAIC;AACJ,MAAIC,cAAsC;AAE1C,QAAMC,aAAaA,MAAMZ,MAAMa,QAAQC,SAAS;AAChD,QAAMC,eAAeA,MAAMf,MAAMa,QAAQG,KAAMC,OAAMA,EAAEC,OAAOlB,MAAMmB,cAAc;AAElF,QAAMC,WAAWC,uBAAuB,CAACC,IAAIC,SAC3CC,SACEF,IACA;IAAEG,SAAS;IAAGC,GAAG;IAAGC,OAAO;EAAK,GAChC;IAAEC,MAAM;IAAUC,gBAAgB;IAAMC,QAAQ;IAAGC,YAAYR;EAAK,CACtE,CACF;AAEAS,EAAAA,SAAQ,MAAM;AACZxB,oBAAgByB,qBAAqBxB,UAAU,KAAKyB,SAASC,IAAI;AACjEC,IAAAA,YAAU,MAAMzB,aAAa0B,KAAK,CAAC;EACrC,CAAC;AAGDC,EAAAA,cAAaC,IAAG,CAACnB,SAASoB,QAAQ5B,UAAU,GAAY,CAAC,CAAC6B,MAAMC,GAAG,MAAM;AACvE,QAAI,CAAChC,WAAY;AACjBC,iBAAa0B,KAAK;AAClB1B,kBAAca,SACZd,YACA;MAAEiC,QAAQF,OAAO,MAAM;MAAGhB,SAASiB,MAAM,MAAM;IAAK,GACpD;MAAEd,MAAM;MAAUC,gBAAgB;MAAKC,QAAQ;IAAK,CACtD;EACF,GAAG;IAAEc,OAAO;EAAK,CAAC,CAAC;AAEnB,QAAMC,YAAYA,MAAM;AACtB,UAAMC,OAAOvC,aAAa;AAC1B,QAAI,CAACE,cAAc,CAACqC,KAAM;AAC1B5C,WAAO6C,oBAAoBtC,YAAYqC,MAAM;MAAEE,YAAY;IAAM,CAAC,CAAC;EACrE;AAEA,QAAMC,eAAeA,MAAM;AACzB,QAAI,CAACrC,WAAW,EAAG;AACnBiC,cAAU;AACVzB,aAASqB,KAAK;EAChB;AAEA,QAAMS,SAASA,MAAM;AACnB,QAAI9B,SAASoB,OAAO,EAAGpB,UAAS+B,MAAM;QACjCF,cAAa;EACpB;AAEAG,wBAAsB;IACpBZ,QAAQpB,SAASoB;IACjBa,UAAWC,YAAW7C,YAAY4C,SAASC,MAAM,KAAKlC,SAASiC,SAASC,MAAM;IAC9EC,WAAWnC,SAAS+B;IACpBK,kBAAkBX;EACpB,CAAC;AAED,QAAMY,eAAgBC,cAA4B;AAChD,QAAIA,SAAUC,WAAUC,WAAW5D,MAAM6D,SAASH,QAAQ;QACrDC,WAAUG,kBAAkB9D,MAAM6D,OAAO;AAC9CzC,aAAS+B,MAAM;EACjB;AAEA,QAAMY,eAAeA,CAACC,GAAeN,aAAqB;AACxDM,MAAEC,gBAAgB;AAClBN,cAAUO,aAAalE,MAAM6D,SAASH,QAAQ;EAChD;AAEA,UAAA,MAAA;AAAA,QAAAS,OAAAC,UAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF;AAAAD,UAAAM,UAKezB;AAAM,QAAA0B,QAFVnE;AAAU,WAAAmE,UAAA,aAAAC,OAAAD,OAAAP,KAAA,IAAV5D,aAAU4D;AAAAS,IAAAA,WAAAP,QAAA,MAAA;AAAA,UAAAQ,MAAAC,QAAA,MAAA,CAAA,CAQZjE,aAAa,CAAC;AAAA,aAAA,MAAdgE,IAAA,IAAiBhE,aAAa,EAAGkE,OAAO;IAAW,GAAA,CAAA;AAAA,QAAAC,SAG/CxE;AAAU,WAAAwE,WAAA,aAAAL,OAAAK,QAAAV,KAAA,IAAV9D,aAAU8D;AAAAW,IAAAA,iBAAAT,OAAA,KAUNU,YAAY;AAAAN,IAAAA,WAAAX,MAAAkB,oBAIxBC,OAAI;MAAA,IAACC,OAAI;AAAA,eAAE,CAAC,CAAChF,aAAa;MAAC;MAAA,IAAAiF,WAAA;AAAA,eAAAH,oBACzBI,SAAM;UAAA,IAACC,QAAK;AAAA,mBAAEnF,aAAa;UAAC;UAAA,IAAAiF,WAAA;AAAA,mBAAAH,oBAC1BC,OAAI;cAAA,IAACC,OAAI;AAAA,uBAAEnE,SAASuE,QAAQ;cAAC;cAAA,IAAAH,WAAA;AAAA,oBAAAI,QAAAC,SAAA,GAAAC,QAAAF,MAAAtB;AAAAO,gBAAAA,OAEpBvD,QAAO;AACXF,2BAAS2E,OAAOzE,EAAE;AAClBE,kBAAAA,SACEF,IACA;oBAAEG,SAAS,CAAC,GAAG,CAAC;oBAAGC,GAAG,CAAC,GAAG,CAAC;oBAAGC,OAAO,CAAC,MAAM,CAAC;kBAAE,GAC/C;oBAAEC,MAAM;oBAAUC,gBAAgB;oBAAMC,QAAQ;kBAAE,CACpD;gBACF,GAAC8D,KAAA;AAAAE,sBAAAnB,UAYU,MAAMlB,aAAa,IAAI;AAACqB,gBAAAA,WAAAc,OAAAP,oBAKlCW,MAAG;kBAAA,IAACC,OAAI;AAAA,2BAAEjG,MAAMa;kBAAO;kBAAA2E,UACpBU,aAAM,MAAA;AAAA,wBAAAC,QAAAC,SAAA,GAAAC,QAAAF,MAAA7B,YAAAgC,QAAAD,MAAA5B,aAAA8B,QAAAD,MAAAhC,YAAAkC,SAAAD,MAAAjC,YAAAmC,SAAAD,OAAA/B,aAAAiC,SAAAD,OAAAhC,aAAAkC,SAAAD,OAAAjC,aAAAmC,SAAAD,OAAAlC;AAAA0B,0BAAAxB,UAIK,MAAMlB,aAAayC,OAAOhF,EAAE;AAAC4D,oBAAAA,WAAAuB,OAAA,MAEHH,OAAOjB,IAAI;AAAAqB,0BAAA3B,UAGlCX,OAAMD,aAAaC,GAAGkC,OAAOhF,EAAE;AAAC2F,oBAAAA,WAAAC,SAAA;AAAA,0BAAAC,OAN/BC,OAAOd,OAAOhF,OAAOlB,MAAMmB,cAAc,GAAC8F,OAU1CC,WAAW,CAAC,GAACC,OACbD,WAAW,CAAC,GAACE,QACbF,WAAW,CAAC,GAACG,QACbH,WAAW,CAAC,GAACI,QACbJ,WAAW,CAAC;AAACH,+BAAAD,IAAA9C,KAAAmB,iBAAAgB,OAAA,eAAAW,IAAA9C,IAAA+C,IAAA;AAAAE,+BAAAH,IAAAS,KAAApC,iBAAAqB,QAAA,KAAAM,IAAAS,IAAAN,IAAA;AAAAE,+BAAAL,IAAAU,KAAArC,iBAAAsB,QAAA,KAAAK,IAAAU,IAAAL,IAAA;AAAAC,gCAAAN,IAAAW,KAAAtC,iBAAAuB,QAAA,KAAAI,IAAAW,IAAAL,KAAA;AAAAC,gCAAAP,IAAAY,KAAAvC,iBAAAwB,QAAA,KAAAG,IAAAY,IAAAL,KAAA;AAAAC,gCAAAR,IAAAa,KAAAxC,iBAAAyB,QAAA,KAAAE,IAAAa,IAAAL,KAAA;AAAA,6BAAAR;oBAAA,GAAA;sBAAA9C,GAAA4D;sBAAAL,GAAAK;sBAAAJ,GAAAI;sBAAAH,GAAAG;sBAAAF,GAAAE;sBAAAD,GAAAC;oBAAA,CAAA;AAAA,2BAAAzB;kBAAA,GAAA;gBAI7B,CAAA,GAAA,IAAA;AAAAU,gBAAAA,WAAAC,SAAA;AAAA,sBAAAe,MAnCI,GAAG5H,IAAI,EAAEG,GAAG,MAAI0H,OACf,GAAG7H,IAAI,EAAEI,IAAI,MAAI0H,OACV,GAAG9H,IAAI,EAAEK,KAAK,MAAI0H,OAKlBhB,OAAO,CAAChH,MAAMmB,cAAc;AAAC0G,0BAAAf,IAAA9C,KAAAiE,oBAAArC,OAAA,OAAAkB,IAAA9C,IAAA6D,GAAA;AAAAC,2BAAAhB,IAAAS,KAAAU,oBAAArC,OAAA,QAAAkB,IAAAS,IAAAO,IAAA;AAAAC,2BAAAjB,IAAAU,KAAAS,oBAAArC,OAAA,aAAAkB,IAAAU,IAAAO,IAAA;AAAAC,2BAAAlB,IAAAW,KAAAtC,iBAAAW,OAAA,eAAAgB,IAAAW,IAAAO,IAAA;AAAA,yBAAAlB;gBAAA,GAAA;kBAAA9C,GAAA4D;kBAAAL,GAAAK;kBAAAJ,GAAAI;kBAAAH,GAAAG;gBAAA,CAAA;AAAA,uBAAAhC;cAAA;YAAA,CAAA;UAAA;QAAA,CAAA;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAiB,IAAAA,WAAAC,SAAA;AAAA,UAAAoB,OA5CvClB,OAAO5F,SAASoB,OAAO,CAAC,GAAC2F,OACnBnB,OAAO,CAAC,CAACjG,aAAa,CAAC,GAACqH,OAC1BpB,OAAO,CAACpG,WAAW,CAAC,GAACyH,OAchBzH,WAAW,IAAI,MAAM;AAAIsH,eAAApB,IAAA9C,KAAAmB,iBAAAd,OAAA,aAAAyC,IAAA9C,IAAAkE,IAAA;AAAAC,eAAArB,IAAAS,KAAApC,iBAAAd,OAAA,mBAAAyC,IAAAS,IAAAY,IAAA;AAAAC,eAAAtB,IAAAU,KAAArC,iBAAAd,OAAA,iBAAAyC,IAAAU,IAAAY,IAAA;AAAAC,eAAAvB,IAAAW,KAAAQ,oBAAAzD,OAAA,WAAAsC,IAAAW,IAAAY,IAAA;AAAA,aAAAvB;IAAA,GAAA;MAAA9C,GAAA4D;MAAAL,GAAAK;MAAAJ,GAAAI;MAAAH,GAAAG;IAAA,CAAA;AAAA,WAAAzD;EAAA,GAAA;AAgErD;AAACmE,kBAAA,CAAA,OAAA,CAAA;;;;;;;;AbhJM,SAASC,MAAMC,OAAmB;AACvC,QAAM,CAACC,QAAQC,SAAS,IAAIC,eAAa,KAAK;AAC9C,QAAMC,cAAcC,mBAAmB;AACvC,QAAM,CAACC,QAAQC,SAAS,IAAIJ,eAC1BK,UAAUC,UAAUT,MAAMU,MAAMC,EAAE,CACpC;AACA,QAAM,CAACC,SAASC,UAAU,IAAIV,eAAaK,UAAUM,WAAWd,MAAMU,MAAMC,EAAE,CAAC;AAC/E,QAAM,CAACI,gBAAgBC,iBAAiB,IAAIb,eAAaK,UAAUS,kBAAkBjB,MAAMU,MAAMC,EAAE,CAAC;AACpG,MAAIO;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC,aAAqC;AACzC,MAAIC,cAAsC;AAC1C,MAAIC,oBAA4C;AAChD,MAAIC,gBAAwC;AAE5C,QAAMC,gBAAgB;IAAEC,MAAM;IAAmBC,gBAAgB;IAAMC,QAAQ;EAAI;AAEnFC,EAAAA,SAAQ,MAAM;AACZ,UAAMC,QAAQvB,UAAUwB,UAAUhC,MAAMU,MAAMC,IAAI,MAAM;AACtDsB,YAAM,MAAM;AACV1B,kBAAUC,UAAUC,UAAUT,MAAMU,MAAMC,EAAE,CAAC;AAC7CE,mBAAWL,UAAUM,WAAWd,MAAMU,MAAMC,EAAE,CAAC;AAC/CK,0BAAkBR,UAAUS,kBAAkBjB,MAAMU,MAAMC,EAAE,CAAC;MAC/D,CAAC;IACH,CAAC;AACDuB,IAAAA,YAAUH,KAAK;EACjB,CAAC;AAED,QAAMI,kBAAkBA,MAAM;AAC5B,UAAMC,UAAUxB,QAAQ,EAAEyB,SAAS;AACnC7B,cAAU8B,WAAWtC,MAAMU,MAAMC,IAAI,WAAWyB,OAAO,EAAE;EAC3D;AAEA,QAAMG,aAAaA,MAAM;AACvB,UAAMC,UAAUC,KAAKC,UAAUpC,OAAO,GAAG,MAAM,CAAC;AAChD,UAAMqC,cAAc,+CAA+C3C,MAAMU,MAAMkC,IAAI;;;EAAuCJ,OAAO;;;;AACjIK,cAAUC,UAAUC,UAAUJ,WAAW;AACzCzC,cAAU,IAAI;AACd8C,eAAW,MAAM9C,UAAU,KAAK,GAAG,IAAI;EACzC;AAGA+C,EAAAA,eAAaC,IAAGjD,QAASkD,cAAa;AACpC,QAAI,CAAC/B,wBAAwB,CAACC,iBAAkB;AAEhDG,uBAAmB4B,KAAK;AACxB3B,mBAAe2B,KAAK;AAEpB,UAAMC,aAAa;MAAE1B,MAAM;MAAmBC,gBAAgB;MAAKC,QAAQ;IAAI;AAC/EL,wBAAoB8B,SAAQlC,sBAAsB;MAChDmC,SAASJ,WAAW,IAAI;MACxBK,OAAOL,WAAW,MAAM;MACxBM,QAAQN,WAAW,cAAc;IACnC,GAAGE,UAAU;AACb5B,oBAAgB6B,SAAQjC,kBAAkB;MACxCkC,SAASJ,WAAW,IAAI;MACxBK,OAAOL,WAAW,IAAI;MACtBM,QAAQN,WAAW,cAAc;IACnC,GAAGE,UAAU;EACf,GAAG;IAAEK,OAAO;EAAK,CAAC,CAAC;AAEnBxB,EAAAA,YAAU,MAAM;AACdZ,gBAAY8B,KAAK;AACjB7B,iBAAa6B,KAAK;AAClB5B,uBAAmB4B,KAAK;AACxB3B,mBAAe2B,KAAK;EACtB,CAAC;AAED,QAAMO,oBAAoBA,MAAM;AAC9B,QAAI,CAACzC,aAAc;AACnBI,gBAAY8B,KAAK;AACjB9B,iBAAagC,SAAQpC,cAAc;MAAEsC,OAAO;IAAI,GAAG9B,aAAa;EAClE;AAEA,QAAMkC,kBAAkBA,MAAM;AAC5B,QAAI,CAAC1C,aAAc;AACnBI,gBAAY8B,KAAK;AACjB9B,iBAAagC,SAAQpC,cAAc;MAAEsC,OAAO;IAAE,GAAG9B,aAAa;EAChE;AAEA,QAAMmC,qBAAqBA,MAAM;AAC/B,QAAI,CAAC1C,cAAe;AACpBI,iBAAa6B,KAAK;AAClB7B,kBAAc+B,SAAQnC,eAAe;MAAEqC,OAAO;IAAK,GAAG9B,aAAa;EACrE;AAEA,QAAMoC,mBAAmBA,MAAM;AAC7B,QAAI,CAAC3C,cAAe;AACpBI,iBAAa6B,KAAK;AAClB7B,kBAAc+B,SAAQnC,eAAe;MAAEqC,OAAO;IAAE,GAAG9B,aAAa;EAClE;AAEA,QAAMqC,mBAAoBC,UAAkB;AAC1ChE,UAAMiE,eAAeD,IAAI;EAC3B;AAEA,QAAME,gBAAiBC,aAAyB;AAC9C,UAAMC,QAAQA,MAAM9D,OAAO,EAAE6D,QAAQE,IAAI;AAEzC,YAAQF,QAAQxC,MAAI;MAClB,KAAK;AACH,eAAA2C,oBACGC,QAAM;UAAA,IACLC,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBJ,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;UAAC,IACvEE,MAAG;AAAA,mBAAET,QAAQS;UAAG;UAAA,IAChBC,MAAG;AAAA,mBAAEV,QAAQU;UAAG;UAAA,IAChBC,OAAI;AAAA,mBAAEX,QAAQW;UAAI;UAAA,IAClBC,WAAQ;AAAA,mBAAEZ,QAAQY;UAAQ;UAAA,IAC1BC,iBAAc;AAAA,mBAAEC,QAAA,MAAA7E,YAAY,EAAE8E,kBAAkBlF,MAAMU,MAAMC,EAAE,EAAA,KAAIP,YAAY,EAAE+E,eAAehB,QAAQE;UAAI;QAAA,CAAA;MAIjH,KAAK;AACH,eAAAC,oBACGc,QAAM;UAAA,IACLZ,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBa,UAAO;AAAA,mBAAEjB,MAAM;UAAC;UAChBK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;UAAC,IACvEK,WAAQ;AAAA,mBAAEZ,QAAQY;UAAQ;UAAA,IAC1BC,iBAAc;AAAA,mBAAEC,QAAA,MAAA7E,YAAY,EAAE8E,kBAAkBlF,MAAMU,MAAMC,EAAE,EAAA,KAAIP,YAAY,EAAE+E,eAAehB,QAAQE;UAAI;QAAA,CAAA;MAIjH,KAAK;AACH,eAAAC,oBACGgB,eAAa;UAAA,IACZC,UAAO;AAAA,mBAAEvF,MAAMU,MAAMC;UAAE;UAAA,IACvB0D,OAAI;AAAA,mBAAEF,QAAQE;UAAI;UAAA,IAClBG,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBgB,SAAM;AAAA,mBAAEpB,MAAM;UAAC;UACfK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;QAAC,CAAA;MAI7E,KAAK;AACH,eAAAJ,oBACGmB,mBAAiB;UAAA,IAChBF,UAAO;AAAA,mBAAEvF,MAAMU,MAAMC;UAAE;UAAA,IACvB0D,OAAI;AAAA,mBAAEF,QAAQE;UAAI;UAAA,IAClBG,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBJ,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;QAAC,CAAA;MAI7E,KAAK;AACH,eAAAJ,oBACGoB,QAAM;UAAA,IAACC,QAAK;AAAA,mBAAExB,QAAQK;UAAK;UAAA,IAAEoB,cAAW;AAAA,mBAAEzB,QAAQyB,eAAe;UAAI;UAAA,IAAAC,WAAA;AAAA,mBAAAvB,oBACnEwB,MAAG;cAAA,IAACC,OAAI;AAAA,uBAAE5B,QAAQ0B,YAAY,CAAA;cAAE;cAAAA,UAC7BG,WAAKf,QAAA,MAAQf,cAAc8B,KAAK,CAAC;YAAI,CAAA;UAAA;QAAA,CAAA;MAK/C,KAAK;AACH,eAAA1B,oBACG2B,aAAW;UAAA,IACVzB,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBJ,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;UAAC,IACvEwB,cAAW;AAAA,mBAAE/B,QAAQ+B;UAAW;QAAA,CAAA;MAItC,KAAK;AACH,eAAA5B,oBACG6B,eAAa;UAAA,IACZ3B,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBJ,QAAK;AAAA,mBAAEA,MAAM;UAAC;UAAA,IACdgC,UAAO;AAAA,mBAAEjC,QAAQiC,WAAW,CAAA;UAAE;UAC9B3B,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;QAAC,CAAA;MAI7E,KAAK;AACH,eAAAJ,oBACG+B,cAAY;UAAA,IACX7B,QAAK;AAAA,mBAAEL,QAAQK;UAAK;UAAA,IACpBJ,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdK,UAAWC,OAAMlE,UAAUmE,YAAY3E,MAAMU,MAAMC,IAAIwD,QAAQE,MAAMK,CAAC;QAAC,CAAA;MAI7E;AACE,eAAO;IACX;EACF;AAEA,QAAM4B,iBAAiBA,MAAM;AAC3B,WAAAhC,oBACGwB,MAAG;MAAA,IAACC,OAAI;AAAA,eAAE/F,MAAMU,MAAM6F;MAAQ;MAAAV,UAC3B1B,aAAOc,QAAA,MAEJA,QAAA,MAAAd,QAAQxC,SAAS,QAAQ,EAAA,KAAA,MAAA;AAAA,YAAA6E,OAAAC,SAAA;AAAAD,aAAAE,UAGb,MAAMlG,UAAUmG,cAAc3G,MAAMU,MAAMC,IAAIwD,QAAQE,IAAI;AAACuC,QAAAA,WAAAJ,MAAA,MAEnErC,QAAQK,KAAK;AAAA,eAAAgC;MAAA,GAAA,IAGhBtC,cAAcC,OAAO,CACtB;IAEJ,CAAA;EAGP;AAEA,QAAM0C,UAAO,EAAA,MAAA;AAAA,QAAAC,QAAAC,UAAA,GAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD,aAAAG,QAAAD,MAAAF;AAAAN,UAAAU,iBAAA,gBASS5D,eAAe;AAAAkD,UAAAU,iBAAA,iBADd5D,eAAe;AAAAkD,UAAAW,cADnB7D;AAAekD,UAAAY,gBADb/D;AAAiBmD,UAAAJ,UADvBvE;AAAe,QAAAwF,QAFnBzG;AAAY,WAAAyG,UAAA,aAAAC,OAAAD,OAAAb,KAAA,IAAZ5F,eAAY4F;AAAAe,IAAAA,WAAAC,SAAA;AAAA,UAAAC,MAUNC,gBAAgB,CAAC,GAACC,OAClBD,gBAAgB,CAAC,GAACE,OAClBF,gBAAgB,CAAC,GAACG,OAClBH,gBAAgB,CAAC,GAACI,OAClBJ,gBAAgB,CAAC;AAACD,cAAAD,IAAAO,KAAAC,iBAAApB,OAAA,KAAAY,IAAAO,IAAAN,GAAA;AAAAE,eAAAH,IAAAS,KAAAD,iBAAAnB,OAAA,KAAAW,IAAAS,IAAAN,IAAA;AAAAC,eAAAJ,IAAAU,KAAAF,iBAAAjB,OAAA,KAAAS,IAAAU,IAAAN,IAAA;AAAAC,eAAAL,IAAAW,KAAAH,iBAAAhB,OAAA,KAAAQ,IAAAW,IAAAN,IAAA;AAAAC,eAAAN,IAAAY,KAAAJ,iBAAAf,OAAA,KAAAO,IAAAY,IAAAN,IAAA;AAAA,aAAAN;IAAA,GAAA;MAAAO,GAAAM;MAAAJ,GAAAI;MAAAH,GAAAG;MAAAF,GAAAE;MAAAD,GAAAC;IAAA,CAAA;AAAA,WAAA7B;EAAA,GAAA,GAAAxC,oBAI9BsE,eAAa;IAAA,IACZrD,UAAO;AAAA,aAAEvF,MAAMU,MAAMC;IAAE;IAAA,IACvBC,UAAO;AAAA,aAAEA,QAAQ;IAAC;IAAA,IAClBG,iBAAc;AAAA,aAAEA,eAAe;IAAC;IAChC8H,OAAO1G;EAAe,CAAA,IAAA,MAAA;AAAA,QAAA2G,QAAAC,SAAA,GAAAC,QAAAF,MAAA7B,YAAAgC,QAAAD,MAAA/B,YAAAiC,SAAAD,MAAAhC,YAAAkC,SAAAD,OAAAjC,YAAAmC,SAAAD,OAAA/B,aAAAiC,SAAAD,OAAAhC,aAAAkC,SAAAL,MAAA7B,aAAAmC,SAAAD,OAAArC,YAAAuC,SAAAD,OAAAtC;AAAA6B,UAAAtB,iBAAA,gBAUN1D,gBAAgB;AAAAgF,UAAAtB,iBAAA,iBADf1D,gBAAgB;AAAAgF,UAAArB,cADpB3D;AAAgBgF,UAAApB,gBADd7D;AAAkBiF,UAAApC,UADxBnE;AAAU,QAAAkH,SAFdtI;AAAa,WAAAsI,WAAA,aAAA7B,OAAA6B,QAAAX,KAAA,IAAb3H,gBAAa2H;AAAA,QAAAY,SAWTtI;AAAoB,WAAAsI,WAAA,aAAA9B,OAAA8B,QAAAT,KAAA,IAApB7H,uBAAoB6H;AAAA,QAAAU,SAWpBtI;AAAgB,WAAAsI,WAAA,aAAA/B,OAAA+B,QAAAL,MAAA,IAAhBjI,mBAAgBiI;AAAAhB,IAAAA,iBAAAkB,QAAA,KAKVI,UAAU;AAAA/B,IAAAA,WAAAC,SAAA;AAAA,UAAA+B,OAXVC,eAAeC,OAAKC,OACpBF,eAAeG,SAAOC,OACtBJ,eAAeK;AAAIN,eAAA/B,IAAAO,KAAAC,iBAAAa,QAAA,KAAArB,IAAAO,IAAAwB,IAAA;AAAAG,eAAAlC,IAAAS,KAAAD,iBAAAc,QAAA,KAAAtB,IAAAS,IAAAyB,IAAA;AAAAE,eAAApC,IAAAU,KAAAF,iBAAAe,QAAA,KAAAvB,IAAAU,IAAA0B,IAAA;AAAA,aAAApC;IAAA,GAAA;MAAAO,GAAAM;MAAAJ,GAAAI;MAAAH,GAAAG;IAAA,CAAA;AAAA,WAAAG;EAAA,GAAA,GAAA7D,QAAA,MAgBnCjF,MAAMoK,YAAY,CAAA;AAKvB,MAAIpK,MAAMqK,YAAY,WAAW;AAC/B,WAAA/F,oBACGoB,QAAM;MAAA,IAACC,QAAK;AAAA,eAAE3F,MAAMU,MAAMkC;MAAI;MAAA,IAAEgD,cAAW;AAAA,eAAE5F,MAAM4F,eAAe;MAAI;MAAE3B,cAAcF;MAAgB,IAAA8B,WAAA;AAAA,eAAA,EAAA,MAAA;AAAA,cAAAyE,SAAAC,SAAA;AAAAD,iBAAA5D,UAChD2B,OAAMA,EAAEmC,gBAAgB;AAAC5D,UAAAA,WAAA0D,QAC3EzD,OAAO;AAAA,iBAAAyD;QAAA,GAAA,GAAArF,QAAA,MAETqB,eAAe,CAAC,CAAA;MAAA;IAAA,CAAA;EAGvB;AAEA,UAAA,MAAA;AAAA,QAAAmE,SAAAC,SAAA;AAAA9D,IAAAA,WAAA6D,QAAAnG,oBAEKqG,WAAS;MAAA,IAAChF,QAAK;AAAA,eAAE3F,MAAMU,MAAMkC;MAAI;MAAA,IAAEgD,cAAW;AAAA,eAAE5F,MAAM4F,eAAe;MAAI;MAAA,IAAEgF,SAAM;AAAA,eAAE5K,MAAM4K,UAAU;MAAK;MAAE3G,cAAcF;MAAkB8C;MAAgB,IAAAhB,WAAA;AAAA,eACxJS,eAAe;MAAC;IAAA,CAAA,CAAA;AAAA,WAAAmE;EAAA,GAAA;AAIzB;AAACI,mBAAA,CAAA,SAAA,eAAA,WAAA,CAAA;;;;;;;;;ActUD,SAASC,OAAAA,YAAW;;;AAKb,SAASC,uBAAuB;AACrC,QAAMC,UAAUC,UACd,MAAMC,gBAAgBC,WAAW,GAChCC,YAAWF,gBAAgBG,UAAUD,MAAM,CAC9C;AACA,QAAME,QAAQA,MAAMN,QAAQ,IAAI,kBAAkB;AAClD,UAAA,MAAA;AAAA,QAAAO,OAAAC,SAAA,GAAAC,QAAAF,KAAAG;AAAAH,SAAAI,UAOa,MAAMT,gBAAgBU,OAAO;AAACC,IAAAA,WAAAJ,OAAAK,oBAGpCC,MAAG;MAACC,MAAMC;MAAaC,UAAIC,WAAI,MAAA;AAAA,YAAAC,QAAAC,UAAA;AAAAC,QAAAA,iBAAAF,OAAA,KAAcD,IAAI;AAAA,eAAAC;MAAA,GAAA;IAAwB,CAAA,CAAA;AAAAG,IAAAA,WAAAC,SAAA;AAAA,UAAAC,MAP/DzB,QAAQ,KAAK0B,QAASC,OACrB3B,QAAQ,GAAC4B,OACXtB,MAAM,GAACuB,OACZvB,MAAM;AAACmB,cAAAD,IAAAM,KAAAR,iBAAAf,MAAA,eAAAiB,IAAAM,IAAAL,GAAA;AAAAE,eAAAH,IAAAO,KAAAT,iBAAAf,MAAA,gBAAAiB,IAAAO,IAAAJ,IAAA;AAAAC,eAAAJ,IAAAQ,KAAAV,iBAAAf,MAAA,cAAAiB,IAAAQ,IAAAJ,IAAA;AAAAC,eAAAL,IAAAS,KAAAX,iBAAAf,MAAA,SAAAiB,IAAAS,IAAAJ,IAAA;AAAA,aAAAL;IAAA,GAAA;MAAAM,GAAAJ;MAAAK,GAAAL;MAAAM,GAAAN;MAAAO,GAAAP;IAAA,CAAA;AAAA,WAAAnB;EAAA,GAAA;AAQpB;AAAC2B,mBAAA,CAAA,OAAA,CAAA;;;ACXD,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEH,SAAS,mBAAmB,QAA4B,OAA+C;AAC5G,MAAI,EAAE,kBAAkB,YAAY,CAAC,MAAO,QAAO;AAEnD,QAAM,QAAQ,OAAO,QAAqB,sBAAsB;AAChE,MAAI,CAAC,SAAS,CAAC,MAAM,SAAS,KAAK,EAAG,QAAO;AAE7C,MAAI,MAAM,aAAa,gBAAgB,MAAM,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,QAAqB,uBAAuB;AAClE,MAAI,CAAC,UAAU,CAAC,MAAM,SAAS,MAAM,EAAG,QAAO;AAE/C,MAAI,OAAO,QAAQ,uBAAuB,EAAG,QAAO;AAEpD,SAAO;AACT;AAEO,SAAS,kBAAkB,UAAkB,UAAkB,OAAoC;AACxG,QAAM,OAAO,MAAM,sBAAsB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,EACZ;AACF;AAEO,SAAS,mBAAmB,OAAuB,UAAkB,UAAmC;AAC7G,SAAO;AAAA,IACL,GAAG,MAAM,MAAM,WAAW,MAAM;AAAA,IAChC,GAAG,MAAM,MAAM,WAAW,MAAM;AAAA,EAClC;AACF;AAEO,SAAS,kBAAkB,OAAuB,UAAkB,UAA2B;AACpG,QAAM,KAAK,WAAW,MAAM;AAC5B,QAAM,KAAK,WAAW,MAAM;AAC5B,SAAO,KAAK,MAAM,IAAI,EAAE,KAAK;AAC/B;AAEO,SAAS,gBACd,UACA,QACA,gBAAgB,OAAO,WAAW,cAAc,OAAO,aAAa,QAClD;AAClB,MAAI,UAAU,eAAe;AAC3B,WAAO,OAAO,IAAI,uBAAuB,IAAI,gBAAgB,IAAI,SAAS;AAAA,EAC5E;AAEA,SAAO,SAAS,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEO,SAAS,oBAAoB,QAAqB;AACvD,QAAM,UAAU,CAAC,UAAiB;AAChC,UAAM,eAAe;AACrB,UAAM,yBAAyB;AAC/B,UAAM,gBAAgB;AAAA,EACxB;AAEA,SAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AACvE,SAAO,WAAW,MAAM;AACtB,WAAO,oBAAoB,SAAS,SAAS,IAAI;AAAA,EACnD,GAAG,CAAC;AACN;;;;;;ArBnEA,IAAMC,gBAAe,OAAOC,YAAY,eAAeA,SAASC,KAAKC,WACjEF,QAAQC,IAAIC,aAAa,eACzB,OAAOC,gBAAgB,eAAgBA,YAAoBF,KAAKG,OAC7DD,YAAoBF,IAAIG,SAAS,eAClC;AAWC,SAASC,SAASC,OAAsB;AAC7C,QAAMC,UAAUA,OAAOD,MAAME,qBAAqBT,mBAAkB;AACpE,SAAAU,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEJ,QAAQ;IAAC;IAAA,IAAAK,WAAA;AAAA,aAAAH,oBAClBI,eAAkBP,KAAK;IAAA;EAAA,CAAA;AAG9B;AAEA,SAASO,cAAcP,OAAsB;AAC3C,QAAMQ,SAASC,UACb,MAAMC,UAAUC,UAAU,OAAO,GAChCC,YAAWF,UAAUG,gBAAgBD,MAAM,CAC9C;AACA,QAAME,YAAYL,UAChB,MAAMM,cAAcC,aAAa,GAChCJ,YAAWG,cAAcF,gBAAgBD,MAAM,CAClD;AAEA,QAAM,CAACK,SAASC,UAAU,IAAIC,eAAa,KAAK;AAChD,QAAM,CAACC,YAAYC,aAAa,IAAIF,eAAqC,IAAI;AAC7E,QAAM,CAACG,gBAAgBC,iBAAiB,IAAIJ,eAA2BnB,MAAMwB,YAAY,WAAW;AACpG,QAAMC,SAASA,OAAOzB,MAAM0B,QAAQ,eAAe;AACnD,MAAIC;AACJ,MAAIC,iBAAyC;AAC7C,MAAIC,WAAW;AACf,MAAIC,YAAmC;AACvC,MAAIC,UAAU;AACd,MAAIC,aAAiC;AAErCC,EAAAA,SAAQ,MAAMf,WAAW,IAAI,CAAC;AAK9B,QAAMgB,eAAeA,MAAMT,OAAO,MAAMzB,MAAMmC,eAAe;AAC7D,QAAMC,kBAAkB,oBAAIC,IAAqB;AACjD,MAAIC;AAEJ,QAAMC,UAAUA,MAAM;AACpB,UAAMC,OAAOhC,OAAO;AACpB,QAAIgC,KAAKC,SAAS,EAAG,QAAOH,kBAAkBJ,aAAa;AAC3D,WAAOM,KAAKE,KAAMC,WAAUP,gBAAgBQ,IAAID,MAAME,EAAE,KAAKX,aAAa,CAAC;EAC7E;AAIA,QAAMY,yBAA0BC,UAAkB;AAChD,QAAItB,OAAO,EAAG;AACd,UAAMuB,oBAAoB5B,WAAW;AAErC,QAAI2B,MAAM;AACR,UAAIC,mBAAmB;AACrBpB,yBAAiBoB;AACjB,cAAMC,gBAAgBD,kBAAkBE,IAAI;AAC5C3B,0BAAkB0B,gBAAgBE,OAAOC,aAAa,IAAI,aAAa,WAAW;MACpF,OAAO;AACL7B,0BAAkBvB,MAAMwB,YAAY,WAAW;MACjD;AACAH,oBAAc,IAAI;IACpB,WAAW2B,mBAAmB;AAC5BpB,uBAAiBoB;IACnB,WAAWpB,gBAAgB;AACzBP,oBAAcO,cAAc;IAC9B;EACF;AAEA,QAAMyB,oBAAqBC,YAAoB;AAC7C,UAAMC,QAAQhB,QAAQ;AACtB,QAAIgB,UAAUD,OAAQ;AACtBR,2BAAuBS,KAAK;AAC5BvD,UAAMwD,eAAeD,KAAK;EAC5B;AAEA,QAAME,wBAAwBA,CAACC,SAAiBX,SAAkB;AAChE,UAAMO,SAASf,QAAQ;AACvBH,oBAAgBuB,IAAID,SAASX,IAAI;AACjCM,sBAAkBC,MAAM;EAC1B;AAEA,QAAMM,uBAAwBb,UAAkB;AAC9C,UAAMO,SAASf,QAAQ;AACvBD,qBAAiBS;AACjBM,sBAAkBC,MAAM;EAC1B;AAEA,QAAMO,oBAAqBC,WAAwB;AACjD,QAAIrC,OAAO,EAAG;AACd,UAAMkB,QAAQhB,YAAY;AAC1B,UAAMoC,SAASC,mBAAmBF,MAAMG,QAAQtB,KAAK;AACrD,QAAI,CAACA,SAAS,CAACoB,OAAQ;AAEvB/B,iBAAa+B;AACbjC,gBAAYoC,kBAAkBJ,MAAMK,SAASL,MAAMM,SAASzB,KAAK;AACjEZ,cAAU;AACVF,eAAW;AACXkC,WAAOM,kBAAkBP,MAAMQ,SAAS;EAC1C;AAEA,QAAMC,oBAAqBT,WAAwB;AACjD,QAAI,CAACjC,YAAY,CAACC,UAAW;AAE7B,QAAI,CAACC,WAAW,CAACyC,kBAAkB1C,WAAWgC,MAAMK,SAASL,MAAMM,OAAO,EAAG;AAC7ErC,cAAU;AAEVV,kBAAcoD,mBAAmB3C,WAAWgC,MAAMK,SAASL,MAAMM,OAAO,CAAC;EAC3E;AAEA,QAAMM,kBAAmBZ,WAAwB;AAC/C,QAAI,CAACjC,SAAU;AACfA,eAAW;AACXC,gBAAY;AACZ,UAAMiC,SAAS/B;AAEf,QAAI+B,QAAQY,kBAAkBb,MAAMQ,SAAS,GAAG;AAC9CP,aAAOa,sBAAsBd,MAAMQ,SAAS;IAC9C;AAEA,QAAIvC,SAAS;AACX+B,YAAMe,gBAAgB;AACtB,UAAId,QAAQ;AACVe,4BAAoBf,MAAM;MAC5B;IACF;AAEA/B,iBAAa;EACf;AAEA,QAAM+C,YAAYA,MAAM;AACtB,UAAMC,SAAS5D,WAAW;AAC1B,WAAO4D,SACH;MACAC,KAAK,GAAGD,OAAOE,CAAC;MAChBC,MAAM,GAAGH,OAAO9B,CAAC;MACjBkC,OAAO;MACPC,QAAQ;IACV,IACEC;EACN;AAEA,QAAMC,iBAAiBA,MAAApF,oBACpBC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAES,UAAU,EAAE2B,SAAS;IAAC;IAAA,IAAAnC,WAAA;AAAA,aAAAH,oBAC/BqF,sBAAoB,CAAA,CAAA;IAAA;EAAA,CAAA;AAIzB,QAAMC,UAAUA,MAAAtF,oBACbuF,kBAAgB;IAAA,IAAApF,WAAA;AAAA,UAAAqF,OAAAC,UAAA,GAAAC,QAAAF,KAAAG;AAAAD,YAAAE,iBAAA,iBAaMrB,eAAe;AAAAmB,YAAAG,cADnBtB;AAAemB,YAAAI,gBADb1B;AAAiBsB,YAAAK,gBADjBrC;AAAiB,UAAAsC,QAP3BxE;AAAQ,aAAAwE,UAAA,aAAAC,OAAAD,OAAAN,KAAA,IAARlE,WAAQkE;AAAAQ,MAAAA,WAAAR,OAAA1F,oBAYZC,QAAI;QAAA,IAACC,OAAI;AAAA,iBAAEG,OAAO,EAAEiC,SAAS;QAAC;QAAA,IAAE6D,WAAQ;AAAA,kBAAA,MAAA;AAAA,gBAAAC,QAAAC,SAAA;AAAAH,YAAAA,WAAAE,OAAApG,oBAEpCsG,WAAS;cACRC,OAAK;cAAA,IACLvE,cAAW;AAAA,uBAAED,aAAa;cAAC;cAAA,IAC3BT,SAAM;AAAA,uBAAEA,OAAO;cAAC;cAChB+B,cAAcI;cAAoB,IAClC+C,UAAO;AAAA,uBAAEpB,eAAe;cAAC;cACzBqB,mBAAmB;cAAC,IAAAtG,WAAA;AAAA,uBAAAuG,SAAA;cAAA;YAAA,CAAA,CAAA;AAAA,mBAAAN;UAAA,GAAA;QAAA;QAAA,IAAAjG,WAAA;AAAA,iBAAAH,oBAMvBC,QAAI;YAAA,IACHC,OAAI;AAAA,qBAAEG,OAAO,EAAEiC,SAAS;YAAC;YAAA,IACzB6D,WAAQ;AAAA,qBAAAnG,oBACP2G,MAAG;gBAAA,IAACC,OAAI;AAAA,yBAAEvG,OAAO;gBAAC;gBAAAF,UACfqC,WAAKxC,oBACJ6G,OAAK;kBACJrE;kBAAY,IACZR,cAAW;AAAA,2BAAED,aAAa;kBAAC;kBAAA,IAC3BT,SAAM;AAAA,2BAAEA,OAAO;kBAAC;kBAAA,IAChBwF,eAAY;AAAA,2BAAE1B,eAAe;kBAAC;kBAC9B/B,cAAeT,UAASU,sBAAsBd,MAAME,IAAIE,IAAI;gBAAC,CAAA;cAEhE,CAAA;YAAA;YAAA,IAAAzC,WAAA;AAAA,kBAAA4G,QAAAV,SAAA;AAAAH,cAAAA,WAAAa,OAAA/G,oBAKAsG,WAAS;gBACRC,OAAK;gBAAA,IACLvE,cAAW;AAAA,yBAAED,aAAa;gBAAC;gBAAA,IAC3BT,SAAM;AAAA,yBAAEA,OAAO;gBAAC;gBAChB+B,cAAcI;gBAAoB,IAClC+C,UAAO;AAAA,yBAAEpB,eAAe;gBAAC;gBACzBqB,mBAAmB;gBAAC,IAAAtG,WAAA;AAAA,yBAAAH,oBAEnB2G,MAAG;oBAAA,IAACC,OAAI;AAAA,6BAAEvG,OAAO;oBAAC;oBAAAF,UACfqC,WAAKxC,oBACJ6G,OAAK;sBACJrE;sBACAR,aAAa;sBACbgF,SAAO;oBAAA,CAAA;kBAEV,CAAA;gBAAA;cAAA,CAAA,CAAA;AAAA,qBAAAD;YAAA;UAAA,CAAA;QAAA;MAAA,CAAA,CAAA;AAAAE,MAAAA,WAAAC,SAAA;AAAA,YAAAC,MA5DsBtH,MAAM0B,QAAQ,WAAS6F,OAAcvH,MAAMwH,SAAS,UAAQC,OAI9EhG,OAAO,IAAI6D,SAAalE,WAAW,IAAIkE,SAAYhE,eAAe,GAAEoG,OACpEjG,OAAO,IAAI6D,SAAYqC,gBAAgBrG,eAAe,GAAGF,WAAW,CAAC,GAACwG,OAC1E5H,MAAM0B,QAAQ,WAASmG,OACnBrH,OAAO,EAAEiC,SAAS,IAAI,SAAS6C,QAASwC,OAChD/C,UAAU;AAACuC,gBAAAD,IAAAU,KAAAC,iBAAArC,MAAA,aAAA0B,IAAAU,IAAAT,GAAA;AAAAC,iBAAAF,IAAAY,KAAAD,iBAAArC,MAAA,cAAA0B,IAAAY,IAAAV,IAAA;AAAAE,iBAAAJ,IAAAa,KAAAF,iBAAAnC,OAAA,iBAAAwB,IAAAa,IAAAT,IAAA;AAAAC,iBAAAL,IAAAc,KAAAH,iBAAAnC,OAAA,iBAAAwB,IAAAc,IAAAT,IAAA;AAAAE,iBAAAP,IAAAe,KAAAJ,iBAAAnC,OAAA,aAAAwB,IAAAe,IAAAR,IAAA;AAAAC,iBAAAR,IAAAgB,KAAAL,iBAAAnC,OAAA,iBAAAwB,IAAAgB,IAAAR,IAAA;AAAAR,YAAAiB,IAAAC,SAAA1C,OAAAiC,MAAAT,IAAAiB,CAAA;AAAA,eAAAjB;MAAA,GAAA;QAAAU,GAAAzC;QAAA2C,GAAA3C;QAAA4C,GAAA5C;QAAA6C,GAAA7C;QAAA8C,GAAA9C;QAAA+C,GAAA/C;QAAAgD,GAAAhD;MAAA,CAAA;AAAA,aAAAK;IAAA;EAAA,CAAA;AA+D1B,SAAAxF,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEmI,QAAA,MAAA,CAAA,CAAAvH,QAAQ,CAAC,EAAA,MAAKT,OAAO,EAAEiC,SAAS,KAAK3B,UAAU,EAAE2B,SAAS;IAAE;IAAA,IAAAnC,WAAA;AAAA,aAAAH,oBACrEC,QAAI;QAAA,IAACC,OAAI;AAAA,iBAAE,CAACoB,OAAO;QAAC;QAAA,IAAE6E,WAAQ;AAAA,iBAAEb,QAAQ;QAAC;QAAA,IAAAnF,WAAA;AAAA,iBAAAH,oBACvCsI,SAAM;YAAA,IAACC,QAAK;AAAA,qBAAEC,SAASC;YAAI;YAAA,IAAAtI,WAAA;AAAA,qBACzBmF,QAAQ;YAAC;UAAA,CAAA;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAKpB;AAACoD,mBAAA,CAAA,eAAA,eAAA,WAAA,CAAA;;;;;;;;;;;;;;AsB7QD,SACEC,OAAAA,MACAC,QAAAA,QACAC,gBAAAA,gBACAC,cAAAA,aACAC,gBAAAA,gBACAC,aAAAA,aACAC,WAAAA,iBAEK;AACP,SAASC,UAAAA,eAAc;;;;;;;;ACVvB,SAASC,OAAAA,YAAiB;;AA0BnB,SAASC,gBAAgBC,OAA6B;AAC3D,QAAMC,WAAWC,mBAAmB;AAEpC,QAAMC,gBAAiBC,aAAyB;AAC9C,UAAMC,QAAQA,MAAML,MAAMM,OAAOF,QAAQG,IAAI;AAC7C,YAAQH,QAAQI,MAAI;MAClB,KAAK;AACH,eAAAC,oBACGC,QAAM;UAAA,IACLC,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBN,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;UAAC,IAC5EI,MAAG;AAAA,mBAAEb,QAAQa;UAAG;UAAA,IAChBC,MAAG;AAAA,mBAAEd,QAAQc;UAAG;UAAA,IAChBC,OAAI;AAAA,mBAAEf,QAAQe;UAAI;UAAA,IAClBlB,WAAQ;AAAA,mBAAEG,QAAQH;UAAQ;UAAA,IAC1BmB,iBAAc;AAAA,mBAAEC,SAAA,MAAApB,SAAS,EAAEqB,kBAAkBtB,MAAMgB,OAAO,EAAA,KAAIf,SAAS,EAAEsB,eAAenB,QAAQG;UAAI;QAAA,CAAA;MAG1G,KAAK;AACH,eAAAE,oBACGe,QAAM;UAAA,IACLb,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBc,UAAO;AAAA,mBAAEpB,MAAM;UAAC;UAChBO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;UAAC,IAC5EZ,WAAQ;AAAA,mBAAEG,QAAQH;UAAQ;UAAA,IAC1BmB,iBAAc;AAAA,mBAAEC,SAAA,MAAApB,SAAS,EAAEqB,kBAAkBtB,MAAMgB,OAAO,EAAA,KAAIf,SAAS,EAAEsB,eAAenB,QAAQG;UAAI;QAAA,CAAA;MAG1G,KAAK;AACH,eAAAE,oBACGiB,eAAa;UAAA,IACZV,UAAO;AAAA,mBAAEhB,MAAMgB;UAAO;UAAA,IACtBT,OAAI;AAAA,mBAAEH,QAAQG;UAAI;UAAA,IAClBI,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBgB,SAAM;AAAA,mBAAEtB,MAAM;UAAC;UACfO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;QAAC,CAAA;MAGlF,KAAK;AACH,eAAAJ,oBACGmB,mBAAiB;UAAA,IAChBZ,UAAO;AAAA,mBAAEhB,MAAMgB;UAAO;UAAA,IACtBT,OAAI;AAAA,mBAAEH,QAAQG;UAAI;UAAA,IAClBI,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBN,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;UAAC,IAC5EgB,kBAAe;AAAA,mBAAE7B,MAAM8B;UAAkB;QAAA,CAAA;MAG/C,KAAK;AACH,eAAArB,oBACGsB,QAAM;UAAA,IAACC,QAAK;AAAA,mBAAE5B,QAAQO;UAAK;UAAA,IAAEsB,cAAW;AAAA,mBAAE7B,QAAQ6B,eAAe;UAAI;UAAA,IAAAC,WAAA;AAAA,mBAAAzB,oBACnE0B,MAAG;cAAA,IAACC,OAAI;AAAA,uBAAEhC,QAAQ8B,YAAY,CAAA;cAAE;cAAAA,UAAG/B;YAAa,CAAA;UAAA;QAAA,CAAA;MAGvD,KAAK;AACH,eAAAM,oBACG4B,aAAW;UAAA,IACV1B,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBN,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;UAAC,IAC5EyB,cAAW;AAAA,mBAAElC,QAAQkC;UAAW;QAAA,CAAA;MAGtC,KAAK;AACH,eAAA7B,oBACG8B,eAAa;UAAA,IACZ5B,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBN,QAAK;AAAA,mBAAEA,MAAM;UAAC;UAAA,IACdmC,UAAO;AAAA,mBAAEpC,QAAQoC,WAAW,CAAA;UAAE;UAC9B5B,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;QAAC,CAAA;MAGlF,KAAK;AACH,eAAAJ,oBACGgC,cAAY;UAAA,IACX9B,QAAK;AAAA,mBAAEP,QAAQO;UAAK;UAAA,IACpBN,QAAK;AAAA,mBAAEA,MAAM;UAAC;UACdO,UAAWC,UAASC,UAAUC,YAAYf,MAAMgB,SAASZ,QAAQG,MAAMM,IAAI;QAAC,CAAA;MAGlF,KAAK;AACH,gBAAA,MAAA;AAAA,cAAA6B,OAAAC,SAAA;AAAAD,eAAAE,UAC0C,MAAM9B,UAAU+B,cAAc7C,MAAMgB,SAASZ,QAAQG,IAAI;AAACuC,UAAAA,WAAAJ,MAAA,MAC/FtC,QAAQO,KAAK;AAAA,iBAAA+B;QAAA,GAAA;MAGpB;AACE,eAAO;IACX;EACF;AAEA,SAAAjC,oBAAQ0B,MAAG;IAAA,IAACC,OAAI;AAAA,aAAEpC,MAAM+C;IAAQ;IAAAb,UAAG/B;EAAa,CAAA;AAClD;AAAC6C,mBAAA,CAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADvED,IAAMC,oBAAoB;AAC1B,IAAMC,uBAAuB;AAC7B,IAAMC,mBAAmB;AACzB,IAAMC,oBAAoB,CACxB,MAAO,MAAO,MACd,MAAM,MAAM,MACZ,KAAK,KAAK,KACV,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAExC,IAAMC,wBAAwB;AAC9B,IAAMC,sBAAsB;AAC5B,IAAMC,8BAA8B;AACpC,IAAMC,gBAAgB;AACtB,IAAMC,qBAAqB;AAC3B,IAAMC,0BAA0B;AAChC,IAAMC,sBAAsB;AAWrB,SAASC,aAAaC,OAA0B;AACrD,QAAMC,UAAUA,OAAOD,MAAME,qBAAqBC,kBAAkB;AACpE,SAAAC,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEL,QAAQ;IAAC;IAAA,IAAAM,WAAA;AAAA,aAAAH,oBAClBI,kBAAqBR,KAAK;IAAA;EAAA,CAAA;AAGjC;AAEA,SAASQ,iBAAiBR,OAA0B;AAClD,QAAMS,YAAYC,UAChB,MAAMC,cAAcC,aAAa,GAChCC,YAAWF,cAAcG,gBAAgBD,MAAM,CAClD;AACA,QAAME,UAAUL,UACd,MAAMM,gBAAgBC,WAAW,GAChCJ,YAAWG,gBAAgBE,UAAUL,MAAM,CAC9C;AACA,QAAM,CAACM,SAASC,UAAU,IAAIC,eAAa,KAAK;AAChD,QAAM,CAACC,eAAeC,gBAAgB,IAAIF,eAAaxB,uBAAuB;AAC9E,QAAM2B,eAAeC,uBAAO,6BAA6B;AACzD,MAAIC;AACJ,MAAIC,gBAAqC;AAEzCC,EAAAA,UAAQ,MAAM;AACZR,eAAW,IAAI;AACf,UAAMS,aAAab,gBAAgBc,mBAAmBN,cAAc;MAClET,SAASf,MAAMe;MACfgB,gBAAgB/B,MAAM+B,kBAAkB;MACxCC,oBAAoBhC,MAAMgC;IAC5B,CAAC;AACDC,IAAAA,YAAUJ,UAAU;EACtB,CAAC;AAEDK,EAAAA,eAAa,MAAM;AACjBlB,oBAAgBmB,iBAAiBX,cAAc;MAC7CT,SAASf,MAAMe;MACfgB,gBAAgB/B,MAAM+B,kBAAkB;MACxCC,oBAAoBhC,MAAMgC;IAC5B,CAAC;EACH,CAAC;AAEDC,EAAAA,YAAU,MAAMN,gBAAgB,CAAC;AAEjC,QAAMS,0BAA2EC,WAAU;AACzF,QAAI,CAACX,QAAS;AACdW,UAAMC,eAAe;AACrBD,UAAME,gBAAgB;AACtBZ,oBAAgB;AAEhB,UAAMa,WAAWH,MAAMI;AACvB,UAAMC,cAAchB,QAAQiB,sBAAsB,EAAEC;AACpD,UAAMC,OAAQC,UAAuB;AACnCA,WAAKR,eAAe;AACpB,YAAMS,cAAcC,KAAKC,IAAInD,qBAAqBoD,OAAOC,cAAc,EAAE;AACzE5B,uBAAiB6B,MAAMV,cAAcF,WAAWM,KAAKL,SAAS3C,qBAAqBiD,WAAW,CAAC;IACjG;AACA,UAAMM,SAASA,MAAM;AACnBH,aAAOI,oBAAoB,eAAeT,IAAI;AAC9CK,aAAOI,oBAAoB,aAAaD,MAAM;AAC9CH,aAAOI,oBAAoB,iBAAiBD,MAAM;AAClD1B,sBAAgB;IAClB;AAEAuB,WAAOK,iBAAiB,eAAeV,MAAM;MAAEW,SAAS;IAAM,CAAC;AAC/DN,WAAOK,iBAAiB,aAAaF,MAAM;AAC3CH,WAAOK,iBAAiB,iBAAiBF,MAAM;AAC/C1B,oBAAgB0B;EAClB;AAEA,SAAAjD,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEmD,SAAA,MAAA,CAAA,CAAAtC,QAAQ,CAAC,EAAA,KAAIV,UAAU,EAAEiD,SAAS;IAAC;IAAA,IAAAnD,WAAA;AAAA,aAAAH,oBAC5CuD,SAAM;QAAA,IAACC,QAAK;AAAA,iBAAEC,SAASC;QAAI;QAAA,IAAAvD,WAAA;AAAA,cAAAwD,OAAAC,SAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG;AAAAH,gBAAAI,gBAQPjC;AAAuB,cAAAkC,QAOjC5C;AAAO,iBAAA4C,UAAA,aAAAC,QAAAD,OAAAH,KAAA,IAAPzC,UAAOyC;AAAAK,UAAAA,WAAAL,OAAA/D,oBAIXqE,MAAG;YAAA,IAACC,OAAI;AAAA,qBAAEjE,UAAU;YAAC;YAAAF,UAClBoE,cAAQvE,oBACPwE,iBAAe;cACdC,MAAMF;cAAQ,IACdG,cAAW;AAAA,uBAAE9E,MAAM8E,eAAe;cAAI;cAAA,IACtCC,QAAK;AAAA,uBAAE/E,MAAM+E,SAAS;cAAQ;cAAA,IAC9BC,cAAW;AAAA,uBAAEjE,QAAQ;cAAC;YAAA,CAAA;UAEzB,CAAA,CAAA;AAAAkE,UAAAA,WAAAC,SAAA;AAAA,gBAAAC,MAxBOnF,MAAM+E,SAAS,UAAQK,OAC3B,CAACrE,QAAQ,GAACsE,OAaO,OAAO/D,cAAc,CAAC;AAAyB6D,oBAAAD,IAAAI,KAAAC,iBAAAxB,MAAA,cAAAmB,IAAAI,IAAAH,GAAA;AAAAC,qBAAAF,IAAAM,MAAAzB,KAAA0B,SAAAP,IAAAM,IAAAJ;AAAAC,qBAAAH,IAAAQ,KAAAC,oBAAAxB,OAAA,cAAAe,IAAAQ,IAAAL,IAAA;AAAA,mBAAAH;UAAA,GAAA;YAAAI,GAAAM;YAAAJ,GAAAI;YAAAF,GAAAE;UAAA,CAAA;AAAA,iBAAA7B;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAiBlF;AAEA,SAAS8B,gBAAgB7F,OAAuB;AAC9C,QAAM8F,UAAUpF,UACd,MAAMC,cAAcoF,aAAa/F,MAAMgG,EAAE,EAAEF,SAC1CjF,YAAWF,cAAcO,UAAUlB,MAAMgG,IAAInF,MAAM,CACtD;AACA,QAAMoF,QAAQA,MAAMH,QAAQ,IAAI,UAAU;AAC1C,UAAA,MAAA;AAAA,QAAAI,QAAAC,UAAA,GAAAC,QAAAF,MAAAhC;AAAAgC,UAAAG,UAGa,MAAMP,QAAQ,IAAInF,cAAc2F,MAAMtG,MAAMgG,EAAE,IAAIrF,cAAc4F,KAAKvG,MAAMgG,EAAE;AAACxB,IAAAA,WAAA4B,OAAAhG,oBAKpFC,QAAI;MAAA,IACHC,OAAI;AAAA,eAAEwF,QAAQ;MAAC;MAAA,IACfU,WAAQ;AAAA,gBAAA,MAAA;AAAA,cAAAC,QAAAC,SAAA,GAAAC,QAAAF,MAAAvC;AAAAqB,UAAAA,iBAAAoB,OAAA,KAEKC,SAAS;AAAA3B,UAAAA,WAAA4B,SAAAC,SAAAL,OAD2CM,WAASF,GAAA,CAAA;AAAA,iBAAAJ;QAAA,GAAA;MAAA;MAAA,IAAAlG,WAAA;AAAA,YAAAyG,QAAAC,UAAA;AAAAzC,QAAAA,WAAAwC,OAAA5G,oBAMvEqE,MAAG;UAACC,MAAMwC;UAAU3G,UAAI4G,WAAI,MAAA;AAAA,gBAAAC,QAAAC,SAAA;AAAA9B,YAAAA,iBAAA6B,OAAA,KAAcD,IAAI;AAAA,mBAAAC;UAAA,GAAA;QAAwB,CAAA,CAAA;AAAAnC,QAAAA,WAAA4B,SAAAC,SAAAE,OADVD,WAASF,GAAA,CAAA;AAAA,eAAAG;MAAA;IAAA,CAAA,CAAA;AAAA/B,IAAAA,WAAAC,SAAA;AAAA,UAAAoC,OAZrErB,MAAM,GAACsB,OACFtB,MAAM;AAACqB,eAAApC,IAAAI,KAAAC,iBAAAW,OAAA,SAAAhB,IAAAI,IAAAgC,IAAA;AAAAC,eAAArC,IAAAM,KAAAD,iBAAAW,OAAA,cAAAhB,IAAAM,IAAA+B,IAAA;AAAA,aAAArC;IAAA,GAAA;MAAAI,GAAAM;MAAAJ,GAAAI;IAAA,CAAA;AAAA,WAAAM;EAAA,GAAA;AAkBzB;AAEA,SAASsB,aAAaxH,OAAiC;AACrD,UAAA,MAAA;AAAA,QAAAyH,QAAAC,SAAA,GAAAC,QAAAF,MAAAvD;AAAA0D,uBAAAH,OAAA,SAGazH,MAAM6H,UAAQ,IAAA;AAAArD,IAAAA,WAAAmD,OAAAvH,oBAKpBqE,MAAG;MAACC,MAAMoD;MAAWvH,UAAI4G,WAAI,MAAA;AAAA,YAAAY,SAAAV,SAAA;AAAA9B,QAAAA,iBAAAwC,QAAA,KAAcZ,IAAI;AAAA,eAAAY;MAAA,GAAA;IAAwB,CAAA,CAAA;AAAA,WAAAN;EAAA,GAAA;AAIhF;AAEA,IAAMV,YAAY;EAChBiB,UAAU;EACVC,OAAO;EACPC,OAAO;EACPtF,QAAQ;EACRuF,OAAO;AACT;AAEA,SAASC,iBAAiBpI,OAMvB;AACD,QAAMqI,OAAO3H,UACX,MAAMC,cAAcoF,aAAa/F,MAAMgG,EAAE,EAAEqC,MAC1CxH,YAAWF,cAAcO,UAAUlB,MAAMgG,IAAInF,MAAM,CACtD;AACA,MAAIyH,QAAuD;AAE3D,QAAMC,kBAAmBC,aAAoB;AAC3C,QAAI,CAACF,SAASA,MAAMG,KAAKP,SAAS,KAAKlI,MAAM0I,YAAY,EAAG;AAC5D,UAAM5F,OAAOM,OAAQoF,UAAUF,MAAMG,KAAKE,QAAQL,MAAMG,KAAKP,QAASlI,MAAM0I,UAAU,GAAG1I,MAAM0I,QAAQ;AACvG/H,kBAAciI,KAAK5I,MAAMgG,IAAIlD,IAAI;AACjC9C,UAAM6I,WAAW/F,IAAI;EACvB;AACA,QAAMO,SAASA,MAAM;AACnB,QAAIiF,OAAOQ,WAAYnI,eAAc4F,KAAKvG,MAAMgG,EAAE;AAClDsC,YAAQ;EACV;AAEA,UAAA,MAAA;AAAA,QAAAS,SAAAC,SAAA,GAAAC,SAAAF,OAAA7E,YAAAgF,SAAAD,OAAA7E,aAAA+E,SAAAD,OAAA9E;AAAA2E,WAAAxF,iBAAA,sBAgB0BF,MAAM;AAAA0F,WAAAxF,iBAAA,iBADXF,MAAM;AAAA0F,WAAAK,cADV/F;AAAM0F,WAAAM,gBADHhH,WAAUiG,SAASC,gBAAgBlG,MAAMmG,OAAO;AAACO,WAAA1E,gBAVjDhC,WAAU;AACxBA,YAAMC,eAAe;AACrBD,YAAMiH,cAAcC,kBAAkBlH,MAAMmH,SAAS;AACrDlB,cAAQ;QACNQ,YAAYnI,cAAcoF,aAAa/F,MAAMgG,EAAE,EAAEF;QACjD2C,MAAMpG,MAAMiH,cAAc3G,sBAAsB;MAClD;AACAhC,oBAAc2F,MAAMtG,MAAMgG,EAAE;AAC5BuC,sBAAgBlG,MAAMmG,OAAO;IAC/B;AAACvD,IAAAA,WAAAC,SAAA;AAAA,UAAAuE,QASezJ,MAAM0I,WAAW,KAAM1I,MAAM0J,UAAU1J,MAAM2J,aAAa3J,MAAM0I,WAAY,MAAM,OAAO,UAAU9C,QAASgE,OAElH,GAAG5J,MAAM0I,WAAW,IAAK1I,MAAM2J,YAAY3J,MAAM0I,WAAY,MAAM,CAAC,KAAGmB,OACtE,GAAG7J,MAAM0I,WAAW,KAAM1I,MAAM0J,UAAU1J,MAAM2J,aAAa3J,MAAM0I,WAAY,MAAM,GAAG,KAAGoB,OAKpF,GAAG9J,MAAM0I,WAAW,IAAKL,KAAK,IAAIrI,MAAM0I,WAAY,MAAM,CAAC,KAAGqB,OAI/D,GAAG/J,MAAM0I,WAAW,IAAKL,KAAK,IAAIrI,MAAM0I,WAAY,MAAM,CAAC;AAAGe,eAAAvE,IAAAI,KAAAC,iBAAA0D,QAAA,eAAA/D,IAAAI,IAAAmE,IAAA;AAAAG,eAAA1E,IAAAM,KAAAG,oBAAAsD,QAAA,QAAA/D,IAAAM,IAAAoE,IAAA;AAAAC,eAAA3E,IAAAQ,KAAAC,oBAAAsD,QAAA,SAAA/D,IAAAQ,IAAAmE,IAAA;AAAAC,eAAA5E,IAAA8E,KAAArE,oBAAAuD,QAAA,SAAAhE,IAAA8E,IAAAF,IAAA;AAAAC,eAAA7E,IAAA+E,KAAAtE,oBAAAwD,QAAA,QAAAjE,IAAA+E,IAAAF,IAAA;AAAA,aAAA7E;IAAA,GAAA;MAAAI,GAAAM;MAAAJ,GAAAI;MAAAF,GAAAE;MAAAoE,GAAApE;MAAAqE,GAAArE;IAAA,CAAA;AAAA,WAAAmD;EAAA,GAAA;AAIrF;AAEA,SAASmB,qBAAqBlK,OAS3B;AACD,QAAMqI,OAAO3H,UACX,MAAMC,cAAcoF,aAAa/F,MAAMgG,EAAE,EAAEqC,MAC1CxH,YAAWF,cAAcO,UAAUlB,MAAMgG,IAAInF,MAAM,CACtD;AACA,MAAIyH,QAA2F;AAC/F,MAAI6B,UAA+B;AAEnC,QAAMvB,OAAQJ,aAAoB;AAChC,QAAI,CAACF,SAASA,MAAMG,KAAKP,SAAS,EAAG;AACrCvH,kBAAciI,KACZ5I,MAAMgG,IACN5C,MACEkF,MAAMqB,aAAcnB,UAAUF,MAAMG,KAAKE,QAAQL,MAAMG,KAAKP,SAAUI,MAAMoB,UAAUpB,MAAMqB,YAC5FrB,MAAMqB,WACNrB,MAAMoB,OACR,CACF;EACF;AAEAzH,EAAAA,YAAU,MAAMkI,UAAU,CAAC;AAE3B,QAAMC,IAAIA,MAAMhH,OAAOiF,KAAK,IAAIrI,MAAM2J,aAAa3J,MAAMqK,aAAa,GAAGrK,MAAMsK,SAAS;AACxF,QAAMC,aAAaA,MAAMnH,MACvBgH,EAAE,GACF3K,sBAAsB,IAAIC,6BAC1BM,MAAMsK,YAAY7K,sBAAsB,IAAIC,2BAC9C;AACA,QAAM8K,aAAaA,MAAMD,WAAW,IAAIH,EAAE;AAC1C,QAAMK,OAAOA,MAAMD,WAAW,IAAI,MAAM,UAAUA,WAAW,IAAI,OAAO,QAAQ;AAEhF,SAAApK,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEmD,SAAA,MAAA,CAAA,EAAA4E,KAAK,KAAKrI,MAAM2J,aAAatB,KAAK,KAAKrI,MAAM0J,QAAO,EAAA,KAAI1J,MAAMsK,YAAY;IAAC;IAAA,IAAA/J,WAAA;AAAA,UAAAmK,SAAAC,SAAA,GAAAC,SAAAF,OAAAxG,YAAA2G,SAAAD,OAAAxG,aAAA0G,SAAAD,OAAA3G;AAAAwG,aAAArG,gBAQnEhC,WAAU;AACxB,cAAMoG,OAAOzI,MAAM+K,OAAOpI,sBAAsB;AAChD,YAAI,CAAC8F,KAAM;AACXpG,cAAMC,eAAe;AACrBD,cAAME,gBAAgB;AACtB4H,kBAAU;AACV,cAAMa,QAAQ3I,MAAM4I;AACpB3C,gBAAQ;UACNQ,YAAYnI,cAAcoF,aAAa/F,MAAMgG,EAAE,EAAEF;UACjD2C;UACAkB,WAAWqB,QAAQ,IAAIhL,MAAM2J;UAC7BD,SAASsB,QAAQhL,MAAM0I,WAAW1I,MAAM0J;QAC1C;AACA,YAAIsB,MAAOhL,OAAMkL,YAAY;AAC7BvK,sBAAc2F,MAAMtG,MAAMgG,EAAE;AAC5B4C,aAAKvG,MAAMmG,OAAO;AAClB,cAAM3F,OAAQC,UAAuB;AACnCA,eAAKR,eAAe;AACpBsG,eAAK9F,KAAK0F,OAAO;QACnB;AACA,cAAMnF,SAASA,MAAM;AACnBH,iBAAOI,oBAAoB,eAAeT,IAAI;AAC9CK,iBAAOI,oBAAoB,aAAaD,MAAM;AAC9CH,iBAAOI,oBAAoB,iBAAiBD,MAAM;AAClD,cAAIiF,OAAOQ,WAAYnI,eAAc4F,KAAKvG,MAAMgG,EAAE;AAClDsC,kBAAQ;AACR6B,oBAAU;QACZ;AACAjH,eAAOK,iBAAiB,eAAeV,MAAM;UAAEW,SAAS;QAAM,CAAC;AAC/DN,eAAOK,iBAAiB,aAAaF,MAAM;AAC3CH,eAAOK,iBAAiB,iBAAiBF,MAAM;AAC/C8G,kBAAU9G;MACZ;AAACmB,MAAAA,WAAAsG,QAAA,MAU8CzC,KAAK,EAAE8C,QAAQ,CAAC,CAAC;AAAAlG,MAAAA,WAAAC,SAAA;AAAA,YAAAkG,OA/CrDX,KAAK,GAACY,QAET,uCAAuCjB,EAAE,CAAC,OAAKkB,QACb,GAAGd,WAAW,CAAC,MAAIe,QAsC9CvL,MAAM0I,UAAQ8C,QACdnD,KAAK;AAAC+C,iBAAAlG,IAAAI,KAAAC,iBAAAmF,QAAA,aAAAxF,IAAAI,IAAA8F,IAAA;AAAAC,kBAAAnG,IAAAM,KAAAG,oBAAA+E,QAAA,QAAAxF,IAAAM,IAAA6F,KAAA;AAAAC,kBAAApG,IAAAQ,KAAAC,oBAAA+E,QAAA,wCAAAxF,IAAAQ,IAAA4F,KAAA;AAAAC,kBAAArG,IAAA8E,KAAAzE,iBAAAmF,QAAA,iBAAAxF,IAAA8E,IAAAuB,KAAA;AAAAC,kBAAAtG,IAAA+E,KAAA1E,iBAAAmF,QAAA,iBAAAxF,IAAA+E,IAAAuB,KAAA;AAAA,eAAAtG;MAAA,GAAA;QAAAI,GAAAM;QAAAJ,GAAAI;QAAAF,GAAAE;QAAAoE,GAAApE;QAAAqE,GAAArE;MAAA,CAAA;AAAA,aAAA8E;IAAA;EAAA,CAAA;AAU7B;AAkBA,SAASe,eAAeC,OAAehD,UAAkBiD,iBAAiC;AACxF,SAAOvI,MAAMsI,OAAO,GAAG1I,KAAKC,IAAI,GAAGyF,WAAWiD,eAAe,CAAC;AAChE;AAEA,SAASC,mBAAmBvD,MAAcwD,MAAsB;AAC9D,MAAIA,QAAQ,KAAKC,OAAOC,UAAU1D,IAAI,EAAG,QAAO2D,YAAY3D,IAAI;AAChE,QAAM4D,WAAWjJ,KAAKkJ,IAAI,GAAGlJ,KAAKC,IAAI,GAAGD,KAAKmJ,KAAK,CAACnJ,KAAKoJ,MAAMP,IAAI,CAAC,CAAC,CAAC;AACtE,SAAO,GAAGxD,KAAK8C,QAAQc,QAAQ,CAAC;AAClC;AAEA,SAASrH,gBAAgB5E,OAKtB;AACD,QAAM,CAACqM,MAAMC,OAAO,IAAIjL,eAAarB,MAAM8E,WAAW;AACtD,QAAM,CAACyH,QAAQC,SAAS,IAAInL,eAAa,KAAK;AAC9C,QAAM,CAACoL,SAASC,UAAU,IAAIrL,eAAkC,IAAI;AACpE,QAAM,CAACsL,iBAAiBC,kBAAkB,IAAIvL,eAAa,oBAAIwL,IAAY,CAAC;AAC5E,QAAM,CAACC,gBAAgBC,iBAAiB,IAAI1L,eAAa,oBAAIwL,IAAY,CAAC;AAC1E,QAAM,CAACG,MAAMC,OAAO,IAAI5L,eAAa,CAAC;AACtC,QAAM,CAACsI,WAAWuD,YAAY,IAAI7L,eAAa,CAAC;AAChD,QAAM8L,SAASzM,UACb,MAAM0M,UAAUC,UAAUrN,MAAM6E,KAAKmB,EAAE,GACtCnF,YAAWuM,UAAUlM,UAAUlB,MAAM6E,KAAKmB,IAAInF,MAAM,CACvD;AACA,QAAMyM,UAAUA,MAAM;AACpBH,WAAO;AACP,WAAOC,UAAUG,WAAWvN,MAAM6E,KAAKmB,EAAE;EAC3C;AACA,QAAMwH,iBAAiBA,MAAM;AAC3BL,WAAO;AACP,WAAOC,UAAUK,kBAAkBzN,MAAM6E,KAAKmB,EAAE;EAClD;AACA,MAAI0H;AACJ,MAAIC;AACJ,QAAM,CAACrD,WAAWsD,YAAY,IAAIvM,eAAa,CAAC;AAEhDa,EAAAA,eAAa,MAAM;AACjB,QAAI,CAACmK,KAAK,KAAK,CAACqB,YAAa;AAC7B,UAAMG,UAAUA,MAAM;AACpB,UAAIH,YAAaE,cAAaF,YAAY/K,sBAAsB,EAAEuF,KAAK;IACzE;AACA2F,YAAQ;AACR,UAAMC,WAAW,IAAIC,eAAeF,OAAO;AAC3CC,aAASE,QAAQN,WAAW;AAC5BzL,IAAAA,YAAU,MAAM6L,SAASG,WAAW,CAAC;EACvC,CAAC;AAED,QAAMtC,kBAAkBA,MAAM3L,MAAM6E,KAAK6D,WAAW,IAAI1I,MAAM6E,KAAK6D,WAAWsE,KAAK,IAAIhN,MAAM6E,KAAK6D;AAClG,QAAMwF,gBAAgBA,MAAMzC,eAAe9B,UAAU,GAAG3J,MAAM6E,KAAK6D,UAAUiD,gBAAgB,CAAC;AAC9F,QAAMjC,UAAUA,MAAMwE,cAAc,IAAIvC,gBAAgB;AACxD,QAAMtB,cAAcA,MAAMsB,gBAAgB,IAAI,KAAKrB,UAAU,IAAI,IAAIA,UAAU,IAAIqB,gBAAgB,IAAI;AACvG,QAAMwC,UAAUA,MAAMnL,KAAKC,IACzBzD,uBACA8K,UAAU,IAAI,KAAKtK,MAAM6E,KAAK6D,WAAW,IACpCrJ,uBAAuBW,MAAM6E,KAAK6D,YAAapJ,mBAAmB,KAAKgL,UAAU,KAClF9K,qBACN;AAEA0C,EAAAA,eAAa,MAAM+K,QAASmB,aAAYhL,MAAMgL,SAAS,GAAGD,QAAQ,CAAC,CAAC,CAAC;AACrEjM,EAAAA,eAAa,MAAMgL,aAAckB,aAAY3C,eAAe2C,SAASpO,MAAM6E,KAAK6D,UAAU1I,MAAM6E,KAAK6D,WAAWsE,KAAK,CAAC,CAAC,CAAC;AACxH9K,EAAAA,eAAa,MAAM;AACjB,UAAMmM,WAAWV;AACjB,UAAM7K,OAAOoL,cAAc,IAAI7D,YAAY;AAC3C,QAAI,CAACgE,YAAYhE,YAAY,KAAK,EAAG;AACrC,QAAIrH,KAAKsL,IAAID,SAASE,aAAazL,IAAI,IAAI,IAAKuL,UAASE,aAAazL;EACxE,CAAC;AACDZ,EAAAA,eAAa,MAAM;AACjB,QAAI,CAAClC,MAAMgF,YAAa0H,YAAW,IAAI;EACzC,CAAC;AAED,QAAM8B,eAAgBnG,UAAiB;AACrC,QAAI2E,KAAK,KAAK,KAAKhN,MAAM6E,KAAK6D,YAAY,EAAG;AAC7C,UAAMA,WAAW1I,MAAM6E,KAAK6D,WAAWsE,KAAK;AAC5CE,iBAAazB,eAAepD,OAAOK,WAAW,GAAG1I,MAAM6E,KAAK6D,UAAUA,QAAQ,CAAC;EACjF;AACA,QAAM+F,YAAYA,MAAM;AACtBxB,YAAQ,CAAC;AACTC,iBAAa,CAAC;EAChB;AACA,QAAMwB,eAAeA,MAAM;AACzBxB,iBAAa,CAAC;AACdvM,kBAAcgO,OAAO3O,MAAM6E,KAAKmB,EAAE;EACpC;AACA,QAAM4I,yBAAmEvM,WAAU;AACjF,QAAIgI,YAAY,KAAK,EAAG;AACxB6C,iBAAazB,eACXpJ,MAAMiH,cAAciF,aAAalE,YAAY,GAC7CrK,MAAM6E,KAAK6D,UACXiD,gBAAgB,CAClB,CAAC;EACH;AACA,QAAMkD,sBAAqExM,WAAU;AACnF,QAAI,CAACsL,uBAAuBX,KAAK,KAAK,EAAG;AACzC,UAAM8B,QAAQ9L,KAAKsL,IAAIjM,MAAM0M,MAAM,IAAI/L,KAAKsL,IAAIjM,MAAM2M,MAAM,IACxD3M,MAAM0M,SACN1M,MAAM4I,WACJ5I,MAAM2M,SACN;AACN,QAAIF,UAAU,EAAG;AACjBzM,UAAMC,eAAe;AACrBqL,wBAAoBY,cAAcO;EACpC;AAEA,MAAIG,WAAiC;AACrC,MAAIC,aAAwG;AAC5G,MAAIC,aAAwG;AAE5G,QAAMC,YAAa5G,aAAoB;AACrC,QAAI,CAAC0G,cAAcA,WAAWzG,KAAKP,SAAS,EAAG;AAC/CvH,kBAAciI,KACZ5I,MAAM6E,KAAKmB,IACX5C,MACE8L,WAAWvF,aAAcnB,UAAU0G,WAAWzG,KAAKE,QAAQuG,WAAWzG,KAAKP,QAASgH,WAAWvD,iBAC/FuD,WAAWvF,WACXuF,WAAWvF,YAAYuF,WAAWvD,eACpC,CACF;EACF;AACA,QAAM0D,YAAa7G,aAAoB;AACrC,QAAI,CAAC2G,cAAcA,WAAW1G,KAAKP,SAAS,EAAG;AAC/CvH,kBAAciI,KACZ5I,MAAM6E,KAAKmB,IACX5C,MACE+L,WAAWxF,aAAcnB,UAAU2G,WAAW1G,KAAKE,QAAQwG,WAAW1G,KAAKP,QAASiH,WAAWxD,iBAC/FwD,WAAWxF,WACXwF,WAAWxF,YAAYwF,WAAWxD,eACpC,CACF;EACF;AAEA,QAAM2D,yBAA0EjN,WAAU;AACxFA,UAAMC,eAAe;AACrBD,UAAME,gBAAgB;AACtB,UAAMkG,OAAOpG,MAAMiH,cAAc3G,sBAAsB;AACvD,QAAI8F,KAAKP,SAAS,EAAG;AACrB7F,UAAMiH,cAAcC,kBAAkBlH,MAAMmH,SAAS;AACrD,QAAI,CAACnH,MAAMkN,QAAQ;AACjB,YAAMvE,QAAQ3I,MAAM4I;AACpBiE,mBAAa;QACXpG,YAAYnI,cAAcoF,aAAa/F,MAAM6E,KAAKmB,EAAE,EAAEF;QACtD2C;QACAkB,WAAWqB,QAAQ,IAAIkD,cAAc;QACrCvC,iBAAiBX,QAAQhL,MAAM6E,KAAK6D,WAAWiD,gBAAgB;MACjE;AACA,UAAIX,MAAOyD,WAAU;AACrB9N,oBAAc2F,MAAMtG,MAAM6E,KAAKmB,EAAE;AACjCoJ,gBAAU/M,MAAMmG,OAAO;AACvB;IACF;AACA,UAAMgH,QAAQpM,OAAOf,MAAMmG,UAAUC,KAAKE,QAAQF,KAAKP,OAAO,GAAG,CAAC;AAClE+G,eAAW;MACTQ,UAAUpN,MAAMmG;MAChBC;MACAuE,MAAMA,KAAK;MACXrD,WAAWuE,cAAc;MACzBwB,aAAaF;MACbG,YAAYzB,cAAc,IAAIsB,QAAQ7D,gBAAgB;MACtDiE,OAAO;IACT;EACF;AAEA,QAAMC,yBAA0ExN,WAAU;AACxF,QAAI6M,YAAY;AACdE,gBAAU/M,MAAMmG,OAAO;AACvB;IACF;AACA,QAAI,CAACyG,YAAYjP,MAAM6E,KAAK6D,YAAY,EAAG;AAC3C,UAAMoH,KAAKzN,MAAMmG,UAAUyG,SAASQ;AACpC,QAAI,CAACR,SAASW,SAAS5M,KAAKsL,IAAIwB,EAAE,KAAK1Q,kBAAmB;AAC1D6P,aAASW,QAAQ;AACjB,UAAMG,WAAW3M,MAAM6L,SAASjC,OAAOhK,KAAKgN,IAAIF,KAAKlQ,kBAAkB,GAAG,GAAGuO,QAAQ,CAAC;AACtF,UAAM8B,eAAejQ,MAAM6E,KAAK6D,WAAWqH;AAC3C9C,YAAQ8C,QAAQ;AAChB7C,iBAAazB,eACXwD,SAASU,aAAaV,SAASS,cAAcO,cAC7CjQ,MAAM6E,KAAK6D,UACXuH,YACF,CAAC;EACH;AAEA,QAAMC,cAAcA,MAAM;AACxB,QAAIhB,YAAYpG,WAAYnI,eAAc4F,KAAKvG,MAAM6E,KAAKmB,EAAE;AAC5DkJ,iBAAa;AACbD,eAAW;EACb;AAEA,QAAMkB,yBAA0E9N,WAAU;AACxF,UAAM+N,SAAS/N,MAAM+N;AACrB,QAAIA,OAAOC,QAAQ,iCAAiC,EAAG;AACvD,QAAI,CAAChO,MAAM4I,YAAYmF,OAAOC,QAAQ,wBAAwB,EAAG;AACjE,UAAM5H,OAAOiF,aAAa/K,sBAAsB;AAChD,QAAI,CAAC8F,KAAM;AACXpG,UAAMC,eAAe;AACrBD,UAAMiH,cAAcC,kBAAkBlH,MAAMmH,SAAS;AACrD,UAAMwB,QAAQ3I,MAAM4I;AACpBkE,iBAAa;MACXrG,YAAYnI,cAAcoF,aAAa/F,MAAM6E,KAAKmB,EAAE,EAAEF;MACtD2C;MACAkB,WAAWqB,QAAQ,IAAIkD,cAAc;MACrCvC,iBAAiBX,QAAQhL,MAAM6E,KAAK6D,WAAWiD,gBAAgB;IACjE;AACA,QAAIX,MAAOyD,WAAU;AACrB/B,eAAW,IAAI;AACf/L,kBAAc2F,MAAMtG,MAAM6E,KAAKmB,EAAE;AACjCqJ,cAAUhN,MAAMmG,OAAO;EACzB;AACA,QAAM8H,cAAcA,MAAM;AACxB,QAAInB,YAAYrG,WAAYnI,eAAc4F,KAAKvG,MAAM6E,KAAKmB,EAAE;AAC5DmJ,iBAAa;EACf;AAEA,QAAMoB,aAAaA,MAAM;AACvB,UAAMC,aAAaC,+BAA+BrD,UAAUC,UAAUrN,MAAM6E,KAAKmB,EAAE,GAAGhG,MAAM6E,KAAK6L,KAAK;AACtG,SAAKC,UAAUC,UAAUC,UAAUC,qBAAqB,sBAAsB9Q,MAAM6E,KAAKkM,MAAMP,UAAU,CAAC;AAC1GhE,cAAU,IAAI;AACdtJ,WAAO8N,WAAW,MAAMxE,UAAU,KAAK,GAAG,IAAI;EAChD;AACA,QAAMyE,kBAAkBA,MAAM;AAC5B7D,cAAU8D,WAAWlR,MAAM6E,KAAKmB,IAAI,WAAWsH,QAAQ,EAAE5J,SAAS,CAAC,EAAE;EACvE;AACA,QAAMyN,eAAeA,MAAMzE,WAAW,IAAI;AAE1C,QAAM0E,kBAAkBA,CAACC,MAAwB5I,MAAe6I,YAAqB;AACnF,UAAMC,aAAaD,UAAU,GAAGD,KAAKG,GAAG,IAAIF,OAAO,KAAKD,KAAKG;AAC7D,QAAIC,gBAAgBzR,MAAM6E,KAAKmB,IAAIuL,YAAYD,UAAU1L,SAAY8L,sBAAsBL,IAAI,CAAC,EAAE3N,WAAW,EAAG;AAChHgJ,eAAYiF,cAAaA,UAAUN,KAAKG,QAAQH,KAAKG,OAAOG,SAASL,YAAYA,UAC7E,OACA;MACED;MACAC;MACAM,QAAQ;QACNjJ,MAAMF,KAAKE;QACXkJ,KAAKpJ,KAAKoJ;QACVC,OAAOrJ,KAAKqJ;QACZC,QAAQtJ,KAAKsJ;QACb7J,OAAOO,KAAKP;QACZtF,QAAQ6F,KAAK7F;MACf;IACF,CAAC;EACP;AACA,QAAMoP,YAAYA,CAACC,QAAkCT,QAAgB;AACnES,WAAQ7D,aAAY;AAClB,YAAMtL,OAAO,IAAI+J,IAAIuB,OAAO;AAC5B,UAAItL,KAAKoP,IAAIV,GAAG,EAAG1O,MAAKqP,OAAOX,GAAG;UAC7B1O,MAAKsP,IAAIZ,GAAG;AACjB,aAAO1O;IACT,CAAC;EACH;AACA,QAAMuP,eAAgBb,SAAgBQ,UAAUjF,mBAAmByE,GAAG;AACtE,QAAMc,cAAed,SAAgBQ,UAAUpF,oBAAoB4E,GAAG;AACtE,QAAMe,iBAAiBA,CAAClB,MAAwB5I,MAAe6I,YAAqB;AAClF,QAAI,CAACA,WAAWD,KAAKmB,QAAQ9O,OAAQ2O,cAAahB,KAAKG,GAAG;QACrDJ,iBAAgBC,MAAM5I,MAAM6I,OAAO;EAC1C;AAEA,QAAMmB,QAAQC,YAAW,MAAM;AAC7B,UAAMC,UAAUtI,YAAY,IAAI,IAAIhL,uBAAuBgL,YAAY,IAAI;AAC3E,UAAMuI,WAAWrT,kBAAkBsT,KAAMhH,UAASA,QAAQ8G,OAAO,KAAKpT,kBAAkBA,kBAAkBmE,SAAS,CAAC;AACpH,UAAMoP,YAAY9F,KAAK,IAAI,OAAOhN,MAAM6E,KAAK6D,YAAY,IAAI1F,KAAKC,IAAI,GAAG2P,QAAQ,IAAIA;AACrF,UAAMG,WAAWD,YAAY;AAC7B,UAAME,QAAkB,CAAA;AACxB,UAAMC,SAAmB,CAAA;AACzB,UAAMC,OAAiB,CAAA;AACvB,UAAMC,aAAanQ,KAAKmJ,MAAM+B,cAAc,IAAI,QAAQ4E,SAAS,IAAIA;AACrE,aAASzK,OAAO8K,YAAY9K,QAAQqB,QAAQ,IAAI,MAAMrB,QAAQyK,WAAW;AACvEE,YAAMI,KAAKtH,OAAOzD,KAAK8C,QAAQ,CAAC,CAAC,CAAC;IACpC;AACA,UAAMkI,YAAYrQ,KAAKmJ,MAAM+B,cAAc,IAAI,QAAQ6E,QAAQ;AAC/D,UAAMO,WAAWtQ,KAAKuQ,OAAO7J,QAAQ,IAAI,QAAQqJ,QAAQ;AACzD,aAASS,QAAQH,WAAWG,SAASF,UAAUE,SAAS;AACtD,UAAIA,QAAQ,OAAO,EAAG;AACtB,YAAMC,OAAO3H,QAAQ0H,QAAQT,UAAU5H,QAAQ,CAAC,CAAC;AACjD,UAAIqI,QAAQ,MAAM,EAAGP,QAAOG,KAAKK,IAAI;UAChCP,MAAKE,KAAKK,IAAI;IACrB;AACA,WAAO;MAAET;MAAOC;MAAQC;MAAMJ;IAAU;EAC1C,CAAC;AAED,QAAMY,OAAOhB,YAA0B,MAAM;AAC3C,UAAMiB,SAAwB,CAAA;AAC9B,QAAIC;AACJ,UAAMC,gBAAgB1G,OAAO;AAC7B,eAAWkE,QAAQrR,MAAM6E,KAAK6L,OAAO;AACnC,UAAIW,KAAKyC,UAAUF,WAAW;AAC5BA,oBAAYvC,KAAKyC;AACjB,YAAIzC,KAAKyC,OAAO;AACd,gBAAMA,QAAQzC,KAAKyC;AACnB,gBAAMC,YAAYpH,gBAAgB,EAAEuF,IAAI4B,KAAK;AAC7CH,iBAAOP,MAAI,MAAA;AAAA,gBAAAY,SAAAC,SAAA,GAAAC,SAAAF,OAAA9P,YAAAiQ,SAAAD,OAAAhQ,YAAAkQ,SAAAD,OAAA/P;AAAA+P,mBAAA9N,UAMM,MAAMiM,YAAYwB,KAAK;AAACvO,YAAAA,iBAAA4O,QAAA,aADtB,CAACJ,SAAS;AAAAxO,YAAAA,iBAAA4O,QAAA,SAEdJ,YAAY,iBAAiB,gBAAgB;AAAAvP,YAAAA,WAAA2P,QAAA/T,oBAEnDiU,aAAW,CAAA,CAAA,CAAA;AAAA7P,YAAAA,WAAA4P,QAAA,MAEPE,YAAYR,KAAK,CAAC;AAAA,mBAAAE;UAAA,GAAA,CAI/B;QACF;MACF;AACA,UAAI3C,KAAKyC,SAASnH,gBAAgB,EAAEuF,IAAIb,KAAKyC,KAAK,EAAG;AACrD,YAAMS,UAAUC,QAAQnD,KAAKmB,QAAQ9O,MAAM;AAC3C,YAAM+Q,aAAaF,WAAWzH,eAAe,EAAEoF,IAAIb,KAAKG,GAAG;AAC3D,YAAMkD,OAAOC,4BAA4Bd,eAAexC,MAAMrR,MAAM6E,KAAK6D,QAAQ;AACjF,YAAMkM,WAAWnI,QAAQ,GAAG4E,KAAKG,QAAQH,KAAKG;AAC9CmC,aAAOP,MAAI,MAAA;AAAA,YAAAyB,SAAAC,QAAA,GAAAC,SAAAF,OAAA3Q,YAAA8Q,SAAAD,OAAA3Q;AAAAI,QAAAA,WAAAuQ,QAAA3U,oBAGJC,QAAI;UAACC,MAAMiU;UAAO,IAAAhU,WAAA;AAAA,gBAAA0U,SAAAC,QAAA;AAAAD,mBAAA5O,UAILhE,WAAU;AAClBA,oBAAME,gBAAgB;AACtB8P,2BAAahB,KAAKG,GAAG;YACvB;AAACjM,YAAAA,iBAAA0P,QAAA,aAJUR,UAAU;AAAAlP,YAAAA,iBAAA0P,QAAA,SAKdR,aAAa,wBAAwB,mBAAmB;AAAAjQ,YAAAA,WAAAyQ,QAAA7U,oBAE9DiU,aAAW,CAAA,CAAA,CAAA;AAAA,mBAAAY;UAAA;QAAA,CAAA,GAAA,IAAA;AAAAzQ,QAAAA,WAAAuQ,QAAA,MAGf1D,KAAKpL,OAAK,IAAA;AAAAzB,QAAAA,WAAAwQ,QAAA5U,oBAGV+U,cAAY;UAAA,IACXC,aAAU;AAAA,mBAAEpV,MAAM6E,KAAKmB;UAAE;UACzBqL;UAAU,IACVgE,KAAE;AAAA,mBAAEX,KAAKW;UAAE;UAAA,IACX3M,WAAQ;AAAA,mBAAEgM,KAAKhM;UAAQ;UAAA,IACvB4M,OAAI;AAAA,mBAAEZ,KAAKY;UAAI;UAAA,IACfC,QAAK;AAAA,mBAAE9R,SAAA,MAAA,CAAA,CAAA4N,KAAKmE,UAAU9R,MAAM,EAAA,IAAGgR,KAAKlC,OAAO,CAAC,GAAG+C,QAAQ3P;UAAS;UAAA,IAChE6P,gBAAa;AAAA,mBAAElB,UAAU,OAAOG,KAAKgB;UAAS;UAC9CC,WAAWpB;UAAO,IAClBlK,cAAW;AAAA,mBAAEA,YAAY;UAAC;UAAA,IAC1BV,YAAS;AAAA,mBAAEuE,cAAc;UAAC;UAAA,IAC1B0H,mBAAgB;AAAA,mBAAE5V,MAAM6E,KAAK6D;UAAQ;UACrCkM;UAAkB,IAClBiB,kBAAe;AAAA,mBAAEjB,WAAWnI,QAAQ,GAAG6E,UAAU1L;UAAS;UAC1DkQ,SAASvD;UACTwD,QAAQ5E;QAAY,CAAA,CAAA;AAAAlM,QAAAA,WAAA,MAAAM,iBAAAsP,QAAA,gBAjCsBxD,KAAKyC,QAAQ,KAAKlO,MAAS,CAAA;AAAA,eAAAiP;MAAA,GAAA,CAqC7E;AACA,UAAI,CAACJ,WAAY;AACjB,iBAAWuB,YAAY3E,KAAKmB,UAAU,CAAA,GAAI;AACxC,cAAMyD,QAAQvB,KAAKlC,OAAOK,KAAMqD,eAAcA,UAAUC,SAASH,SAASG,IAAI;AAC9E,YAAI,CAACF,MAAO;AACZ,cAAMG,WAAW,GAAG/E,KAAKG,GAAG,IAAIwE,SAASG,IAAI;AAC7C,cAAME,YAA8B;UAClC7E,KAAK4E;UACLnQ,OAAO,GAAGoL,KAAKpL,KAAK,SAAMqO,YAAY0B,SAASG,IAAI,CAAC;UACpDhO,OAAOkJ,KAAKlJ;UACZmN,MAAMjE,KAAKiE;UACXxB,OAAOzC,KAAKyC;UACZ0B,UAAUQ,SAASR;QACrB;AACA,cAAMc,gBAAgB7J,QAAQ,GAAG4E,KAAKG,QAAQ4E;AAC9CzC,eAAOP,MAAI,MAAA;AAAA,cAAAmD,SAAAC,UAAA,GAAAC,SAAAF,OAAArS,YAAAwS,SAAAD,OAAArS;AAAAI,UAAAA,WAAAiS,QAAA,MAE8BnC,YAAY0B,SAASG,IAAI,CAAC;AAAA3R,UAAAA,WAAAkS,QAAAtW,oBAE5D+U,cAAY;YAAA,IACXC,aAAU;AAAA,qBAAEpV,MAAM6E,KAAKmB;YAAE;YACzBqL,MAAMgF;YAAS,IACfhB,KAAE;AAAA,qBAAEX,KAAKW,KAAKY,MAAMU;YAAK;YAAA,IACzBjO,WAAQ;AAAA,qBAAEuN,MAAMvN;YAAQ;YAAA,IACxB4M,OAAI;AAAA,qBAAEZ,KAAKY;YAAI;YAAA,IACfC,QAAK;AAAA,qBAAE9R,SAAA,MAAA,CAAA,CAAAuS,SAASR,UAAU9R,MAAM,EAAA,IAAGuS,MAAMV,QAAQ3P;YAAS;YAAA,IAC1D6P,gBAAa;AAAA,qBAAEhS,SAAA,MAAA,CAAA,CAAA,CAACuS,SAASR,UAAU9R,MAAM,EAAA,KAAIuS,MAAMV,MAAM,CAAC,GAAGG,cAAc;YAAI;YAAA,IAC/EkB,SAAM;AAAA,qBAAElC,KAAKW;YAAE;YACfwB,WAAS;YAAA,IACTxM,cAAW;AAAA,qBAAEA,YAAY;YAAC;YAAA,IAC1BV,YAAS;AAAA,qBAAEuE,cAAc;YAAC;YAAA,IAC1B0H,mBAAgB;AAAA,qBAAE5V,MAAM6E,KAAK6D;YAAQ;YACrCkM,UAAU0B;YAAa,IACvBT,kBAAe;AAAA,qBAAES,gBAAgB7J,QAAQ,GAAG6E,UAAU1L;YAAS;YAC/DkQ,SAAS1E;YACT2E,QAAQ5E;UAAY,CAAA,CAAA;AAAAlM,UAAAA,WAAA,MAAAM,iBAAAgR,QAAA,gBAnBiDlF,KAAKyC,QAAQ,KAAKlO,MAAS,CAAA;AAAA,iBAAA2Q;QAAA,GAAA,CAuBxG;MACF;IACF;AACA,WAAO5C;EACT,CAAC;AAED,UAAA,MAAA;AAAA,QAAAmD,SAAAC,UAAA,GAAAC,SAAAF,OAAA5S,YAAA+S,SAAAD,OAAA9S,YAAAgT,SAAAD,OAAA/S,YAAAiT,SAAAF,OAAA7S,aAAAgT,SAAAD,OAAAjT,YAAAmT,SAAAD,OAAAlT,YAAAoT,SAAAF,OAAAhT,aAAAmT,SAAAD,OAAApT,YAAAsT,SAAAF,OAAAlT;AAAAI,IAAAA,WAAA0S,QAAA,MAI8ClX,MAAM6E,KAAKkM,IAAI;AAAAvM,IAAAA,WAAAwS,QAAA5W,oBAEtDC,QAAI;MAAA,IAACC,OAAI;AAAA,eAAE,CAAC+L,KAAK;MAAC;MAAA,IAAA9L,WAAA;AAAA,eAAAH,oBAChBgI,kBAAgB;UAAA,IACfpC,KAAE;AAAA,mBAAEhG,MAAM6E,KAAKmB;UAAE;UAAA,IACjB0C,WAAQ;AAAA,mBAAE1I,MAAM6E,KAAK6D;UAAQ;UAAA,IAC7BiB,YAAS;AAAA,mBAAEuE,cAAc;UAAC;UAAA,IAC1BxE,UAAO;AAAA,mBAAEA,QAAQ;UAAC;UAClBb,YAAY2F;QAAY,CAAA;MAAA;IAAA,CAAA,GAAA2I,MAAA;AAAA3S,IAAAA,WAAA2S,QAAA/W,oBAIzByF,iBAAe;MAAA,IAACG,KAAE;AAAA,eAAEhG,MAAM6E,KAAKmB;MAAE;IAAA,CAAA,GAAAoR,MAAA;AAAA5S,IAAAA,WAAA2S,QAAA/W,oBACjCoH,cAAY;MAACK,UAAU6G;IAAY,CAAA,GAAA0I,MAAA;AAAAA,WAAA/Q,UACS4K;AAAezM,IAAAA,WAAA6S,QAAAjX,oBAEvDqE,MAAG;MAACC,MAAM+S;MAAelX,UAAI4G,WAAI,MAAA;AAAA,YAAAuQ,SAAAC,UAAA;AAAApS,QAAAA,iBAAAmS,QAAA,KAAcvQ,IAAI;AAAA,eAAAuQ;MAAA,GAAA;IAAI,CAAA,CAAA;AAAAlT,IAAAA,WAAA2S,QAAA/W,oBAG3DwX,eAAa;MAAA,IACZC,UAAO;AAAA,eAAE7X,MAAM6E,KAAKmB;MAAE;MAAA,IACtBsH,UAAO;AAAA,eAAEA,QAAQ;MAAC;MAAA,IAClBE,iBAAc;AAAA,eAAEA,eAAe;MAAC;MAChCsK,OAAO7G;IAAe,CAAA,GAAAqG,MAAA;AAAAA,WAAAjR,UAIbkK;AAAU/L,IAAAA,WAAA+S,QAAAnX,oBAKhBC,QAAI;MAAA,IACHC,OAAI;AAAA,eAAEiM,OAAO;MAAC;MAAA,IACd/F,WAAQ;AAAA,gBAAA,MAAA;AAAA,cAAAuR,SAAAC,UAAA,GAAAC,SAAAF,OAAA7T,YAAAgU,SAAAD,OAAA7T,aAAA+T,SAAAD,OAAA9T;AAAAa,UAAAA,WAAAC,SAAA;AAAA,gBAAAkT,QACyDrR,WAASsR,QAC7DC,eAAeC,OAAKC,QACpBF,eAAeG,SAAOC,QACtBJ,eAAexU;AAAIoB,gBAAAI,IAAAwB,SAAAiR,QAAAK,OAAAlT,IAAAI,CAAA;AAAA+S,sBAAAnT,IAAAM,KAAAD,iBAAA0S,QAAA,KAAA/S,IAAAM,IAAA6S,KAAA;AAAAG,sBAAAtT,IAAAQ,KAAAH,iBAAA2S,QAAA,KAAAhT,IAAAQ,IAAA8S,KAAA;AAAAE,sBAAAxT,IAAA8E,KAAAzE,iBAAA4S,QAAA,KAAAjT,IAAA8E,IAAA0O,KAAA;AAAA,mBAAAxT;UAAA,GAAA;YAAAI,GAAAM;YAAAJ,GAAAI;YAAAF,GAAAE;YAAAoE,GAAApE;UAAA,CAAA;AAAA,iBAAAmS;QAAA,GAAA;MAAA;MAAA,IAAAxX,WAAA;AAAA,YAAAoY,SAAAC,UAAA,GAAAC,SAAAF,OAAAzU;AAAAqB,QAAAA,iBAAAsT,QAAA,KAKrBC,UAAU;AAAA7T,QAAAA,WAAA4B,SAAAC,SAAA6R,QADgI5R,WAASF,GAAA,CAAA;AAAA,eAAA8R;MAAA;IAAA,CAAA,CAAA;AAAAnB,WAAAnR,UAUzJ,MAAMiG,QAAS8B,aAAY,CAACA,OAAO;AAAC5J,IAAAA,WAAAgT,QAAApX,oBAG5CiU,aAAW,CAAA,CAAA,CAAA;AAAA7P,IAAAA,WAAAsS,QAAA1W,oBAKjBC,QAAI;MAAA,IAACC,OAAI;AAAA,eAAE+L,KAAK;MAAC;MAAA,IAAA9L,WAAA;AAAA,YAAAwY,SAAAC,UAAA,GAAAC,SAAAF,OAAA7U,YAAAgV,SAAAD,OAAA/U,YAAAiV,SAAAD,OAAAhV,YAAAkV,SAAAD,OAAA/U;AAAA2U,eAAAxV,iBAAA,sBAQQ+M,WAAW;AAAAyI,eAAAxV,iBAAA,iBADhB+M,WAAW;AAAAyI,eAAA3P,cADfkH;AAAWyI,eAAA1P,gBADRhH,WAAU8M,cAAcE,UAAUhN,MAAMmG,OAAO;AAACuQ,eAAA1U,gBADjD8L;AAAsB4I,eAAAxV,iBAAA,SAD5BsL,mBAAmB;AAAAuK,eAAA7V,iBAAA,sBAiBA2M,WAAW;AAAAkJ,eAAA7V,iBAAA,iBADhB2M,WAAW;AAAAkJ,eAAAhQ,cADf8G;AAAWkJ,eAAA/P,gBADTwG;AAAsBuJ,eAAA/U,gBADtBiL;AAAsB,YAAA+J,SAFhC3L;AAAW,eAAA2L,WAAA,aAAA9U,QAAA8U,QAAAD,MAAA,IAAX1L,cAAW0L;AAAA5U,QAAAA,WAAA4U,QAAAhZ,oBASfqE,MAAG;UAAA,IAACC,OAAI;AAAA,mBAAE+N,MAAM,EAAES;UAAI;UAAA3S,UAAI8H,WAAI,MAAA;AAAA,gBAAAiR,SAAAC,UAAA;AAAAtU,YAAAA,WAAA4B,SAAAlB,oBAAA2T,QAAA,QAAkF,IAAIjR,OAAO6F,cAAc,KAAK7D,YAAY,CAAC,IAAI,CAAA;AAAA,mBAAAiP;UAAA,GAAA;QAAM,CAAA,GAAA,IAAA;AAAA9U,QAAAA,WAAA4U,QAAAhZ,oBACrKqE,MAAG;UAAA,IAACC,OAAI;AAAA,mBAAE+N,MAAM,EAAEQ;UAAM;UAAA1S,UAAI8H,WAAI,MAAA;AAAA,gBAAAmR,SAAAC,UAAA;AAAAxU,YAAAA,WAAA4B,SAAAlB,oBAAA6T,QAAA,QAAoF,IAAInR,OAAO6F,cAAc,KAAK7D,YAAY,CAAC,IAAI,CAAA;AAAA,mBAAAmP;UAAA,GAAA;QAAM,CAAA,GAAA,IAAA;AAAAhV,QAAAA,WAAA4U,QAAAhZ,oBACzKqE,MAAG;UAAA,IAACC,OAAI;AAAA,mBAAE+N,MAAM,EAAEO;UAAK;UAAAzS,UAAI8H,WAAI,MAAA;AAAA,gBAAAqR,SAAAC,UAAA,GAAAC,SAAAF,OAAAxV;AAAAM,YAAAA,WAAAoV,QAAA,MAEehO,mBAAmBvD,MAAMoK,MAAM,EAAEK,SAAS,CAAC;AAAA7N,YAAAA,WAAA4B,SAAAlB,oBAAA+T,QAAA,QADtC,IAAIrR,OAAO6F,cAAc,KAAK7D,YAAY,CAAC,IAAI,CAAA;AAAA,mBAAAqP;UAAA,GAAA;QAGlG,CAAA,GAAA,IAAA;AAAAlV,QAAAA,WAAAyU,QAGJvF,MAAI,IAAA;AAAAlP,QAAAA,WAAAyU,QAAA7Y,oBACJC,QAAI;UAAA,IAACC,OAAI;AAAA,mBAAE+J,YAAY,IAAI;UAAC;UAAA,IAAA9J,WAAA;AAAA,mBAAAH,oBAC1B8J,sBAAoB;cAAA,IACnBlE,KAAE;AAAA,uBAAEhG,MAAM6E,KAAKmB;cAAE;cAAA,IACjB0C,WAAQ;AAAA,uBAAE1I,MAAM6E,KAAK6D;cAAQ;cAAA,IAC7B2B,cAAW;AAAA,uBAAEA,YAAY;cAAC;cAAA,IAC1BV,YAAS;AAAA,uBAAEuE,cAAc;cAAC;cAAA,IAC1BxE,UAAO;AAAA,uBAAEA,QAAQ;cAAC;cAAA,IAClBY,YAAS;AAAA,uBAAEA,UAAU;cAAC;cACtBS,OAAO2C;cACPxC,aAAauD;YAAS,CAAA;UAAA;QAAA,CAAA,GAAA,IAAA;AAAAjK,QAAAA,WAAAuU,QAAA3Y,oBAI3BC,QAAI;UAAA,IAACC,OAAI;AAAA,mBAAE0M,KAAK,IAAI;UAAC;UAAA,IAAAzM,WAAA;AAAA,gBAAAsZ,SAAAC,UAAA,GAAAC,SAAAF,OAAA3V,YAAA8V,SAAAD,OAAA3V,aAAA6V,SAAAD,OAAA9V;AAAA8V,mBAAAzW,iBAAA,UAMNqL,sBAAsB;AAAA,gBAAAsL,SAF3BvM;AAAmB,mBAAAuM,WAAA,aAAA3V,QAAA2V,QAAAF,MAAA,IAAnBrM,sBAAmBqM;AAAA/U,YAAAA,WAAA4B,SAAAlB,oBAAAsU,QAAA,SAKH,GAAG3P,UAAU,IAAI0C,KAAK,CAAC,IAAI,CAAA;AAAA,mBAAA6M;UAAA;QAAA,CAAA,GAAA,IAAA;AAAA,eAAAd;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAvU,IAAAA,WAAAsS,QAAA1W,oBAOzDC,QAAI;MAAA,IAACC,OAAI;AAAA,eAAEmM,QAAQ;MAAC;MAAAlM,UACjB6N,aAAOhO,oBACN+Z,aAAW;QAAA,IACVtC,UAAO;AAAA,iBAAE7X,MAAM6E,KAAKmB;QAAE;QAAA,IACtByG,UAAO;AAAA,iBAAE2B,QAAQ;QAAC;QAAA,IAClBjB,SAAM;AAAA,iBAAEA,OAAO;QAAC;QAAA,IAChBpI,QAAK;AAAA,iBAAE/E,MAAM+E;QAAK;QAClBqV,SAASjJ;MAAY,CAAA;IAExB,CAAA,GAAA,IAAA;AAAAlM,IAAAA,WAAAC,SAAA;AAAA,UAAAmV,QArI6ChO,KAAK,KAAKzG,QAAS0U,QA+BjD/N,OAAO,IAAI,sBAAsB,mBAAiBgO,QAqBnDlO,KAAK,GAACmO,QACFnO,KAAK,GAACoO,QAEdpO,KAAK,IAAI,sBAAsB;AAAiBgO,gBAAAnV,IAAAI,KAAAC,iBAAAyR,QAAA,aAAA9R,IAAAI,IAAA+U,KAAA;AAAAC,gBAAApV,IAAAM,KAAAD,iBAAA+R,QAAA,cAAApS,IAAAM,IAAA8U,KAAA;AAAAC,gBAAArV,IAAAQ,KAAAH,iBAAAiS,QAAA,aAAAtS,IAAAQ,IAAA6U,KAAA;AAAAC,gBAAAtV,IAAA8E,KAAAzE,iBAAAiS,QAAA,iBAAAtS,IAAA8E,IAAAwQ,KAAA;AAAAC,gBAAAvV,IAAA+E,KAAA1E,iBAAAiS,QAAA,SAAAtS,IAAA+E,IAAAwQ,KAAA;AAAA,aAAAvV;IAAA,GAAA;MAAAI,GAAAM;MAAAJ,GAAAI;MAAAF,GAAAE;MAAAoE,GAAApE;MAAAqE,GAAArE;IAAA,CAAA;AAAA,WAAAkR;EAAA,GAAA;AAkFnE;AAEA,SAASzC,cAAc;AACrB,UAAA,MAAA;AAAA,QAAAqG,SAAAC,UAAA,GAAAC,SAAAF,OAAAxW;AAAAqB,IAAAA,iBAAAqV,QAAA,KAEaC,YAAY;AAAA,WAAAH;EAAA,GAAA;AAG3B;AAEA,SAASP,YAAYna,OAMlB;AACD,MAAI8a;AACJ,QAAM,CAACC,eAAeC,gBAAgB,IAAI3Z,eAAa,CAAC;AACxD,QAAM,CAAC4Z,UAAUC,WAAW,IAAI7Z,eAAa8Z,aAAa,CAAC;AAE3DvZ,EAAAA,UAAQ,MAAM;AACZ,UAAMiM,UAAUA,MAAMiN,OAAOE,iBAAiBF,IAAIM,eAAe,CAAC;AAClEvN,YAAQ;AACR,UAAMC,WAAW,IAAIC,eAAeF,OAAO;AAC3C,QAAIiN,IAAKhN,UAASE,QAAQ8M,IAAIO,cAAc,gCAAgC,KAAKP,GAAG;AACpF,UAAMQ,iBAAiBA,MAAMJ,YAAYC,aAAa,CAAC;AACvD,UAAMI,UAAWlZ,WAAwB;AACvC,YAAM+N,SAAS/N,MAAM+N;AACrB,UAAI0K,KAAKU,SAASpL,MAAM,KAAKA,OAAOC,UAAU,wBAAwB,KAAKD,OAAOC,UAAU,yBAAyB,EAAG;AACxHrQ,YAAMoa,QAAQ;IAChB;AACA,UAAMqB,UAAWpZ,WAAyB;AACxC,UAAIA,MAAMmP,QAAQ,SAAUxR,OAAMoa,QAAQ;IAC5C;AACAlX,WAAOK,iBAAiB,UAAU+X,cAAc;AAChDpY,WAAOwY,gBAAgBnY,iBAAiB,UAAU+X,cAAc;AAChEpY,WAAOwY,gBAAgBnY,iBAAiB,UAAU+X,cAAc;AAChEzX,aAASN,iBAAiB,eAAegY,SAAS,IAAI;AACtD1X,aAASN,iBAAiB,WAAWkY,OAAO;AAC5CxZ,IAAAA,YAAU,MAAM;AACd6L,eAASG,WAAW;AACpB/K,aAAOI,oBAAoB,UAAUgY,cAAc;AACnDpY,aAAOwY,gBAAgBpY,oBAAoB,UAAUgY,cAAc;AACnEpY,aAAOwY,gBAAgBpY,oBAAoB,UAAUgY,cAAc;AACnEzX,eAASP,oBAAoB,eAAeiY,SAAS,IAAI;AACzD1X,eAASP,oBAAoB,WAAWmY,OAAO;IACjD,CAAC;EACH,CAAC;AAED,QAAME,eAAejJ,YAAW,MAAM;AACpC,UAAM;MAAErB;MAAMC;IAAQ,IAAItR,MAAMyM;AAChC,QAAImP;AACJ,QAAIC;AACJ,QAAIvK,SAAS;AACXsK,iBAAWnK,gBAAgBzR,MAAM6X,SAAS,GAAGxG,KAAKG,GAAG,IAAIF,OAAO,EAAE;AAClE,UAAIA,YAAYD,KAAKmE,WAAW,CAAC,GAAG;AAClC,cAAMsG,QAAOC,aAAa/b,MAAM6X,SAAS,GAAGxG,KAAKG,GAAG,OAAO;AAC3D,YAAIsK,OAAM;AACR,gBAAM1L,SAAS,GAAGiB,KAAKG,GAAG,IAAIF,OAAO;AACrC,gBAAMkC,QAAQoI,SAASI,UAAWC,aAAYA,QAAQ9U,SAASiJ,MAAM;AACrEwL,qBAAWpI,SAAS,IAChB,CAAC,GAAGoI,SAASM,MAAM,GAAG1I,KAAK,GAAGsI,OAAM,GAAGF,SAASM,MAAM1I,KAAK,CAAC,IAC5D,CAAC,GAAGoI,UAAUE,KAAI;QACxB;MACF;AACAD,cAAQ,GAAGxK,KAAKpL,KAAK,SAAMkW,gBAAgB7K,OAAO,CAAC;IACrD,OAAO;AACLsK,iBAAWnK,gBAAgBzR,MAAM6X,SAASxG,KAAKG,KAAKE,sBAAsBL,IAAI,CAAC;AAC/EwK,cAAQxK,KAAKpL;IACf;AACA,UAAMsL,aAAaD,UAAU,GAAGD,KAAKG,GAAG,IAAIF,OAAO,KAAKD,KAAKG;AAC7D,UAAM4K,eAAeL,aAAa/b,MAAM6X,SAAS,GAAGtG,UAAU,WAAW;AACzE,UAAM8K,gBAAgBD,eAAepc,MAAMmN,OAAOiP,aAAajV,IAAI,IAAIvB;AACvE,UAAM0W,qBAAqBF,cAAcG,SAAS,YAAY,OAAOF,kBAAkB,WACnF;MACEG,OAAOH;MACPI,UAAW3Z,UAAiBsK,UAAUsP,YAAY1c,MAAM6X,SAASuE,aAAajV,MAAMrE,IAAI;MACxFoJ,KAAKlJ,KAAKC,IAAI0Z,4BAA4BP,aAAalQ,OAAO,CAAC;MAC/DjJ,KAAKmZ,aAAanZ;MAClB4I,MAAMuQ,aAAavQ;IACrB,IACAjG;AACJ,WAAO;MACLgW;MACAC;MACAS;MACAM,eAAeC,6BAA6B7c,MAAMmN,QAAQkE,KAAKG,KAAKH,KAAKmE,UAAUlE,OAAO;IAC5F;EACF,CAAC;AAED,QAAMtJ,WAAW0K,YAAW,MAAM;AAChC,UAAMtE,UAAU6M,SAAS;AACzB,UAAMnJ,QAAQ1D,QAAQ0O,aAAa1O,QAAQlG;AAC3C,UAAM6J,SAAS3D,QAAQ2O,YAAY3O,QAAQxL;AAC3C,UAAMsF,QAAQlF,KAAKkJ,IAAIvM,eAAeqD,KAAKC,IAAI,KAAKmL,QAAQlG,QAAQ,EAAE,CAAC;AACvE,UAAMS,OAAOvF,MACXpD,MAAMyM,QAAQmF,OAAOjJ,OAAO3I,MAAMyM,QAAQmF,OAAO1J,QAAQ,IAAIA,QAAQ,GACrEkG,QAAQ0O,aAAa,IACrB9Z,KAAKC,IAAImL,QAAQ0O,aAAa,IAAIhL,QAAQ5J,QAAQ,EAAE,CACtD;AACA,UAAM8U,QAAQha,KAAKC,IAAI,GAAGjD,MAAMyM,QAAQmF,OAAOC,MAAMzD,QAAQ2O,YAAY,EAAE;AAC3E,UAAME,QAAQja,KAAKC,IAAI,GAAG8O,SAAS/R,MAAMyM,QAAQmF,OAAOG,SAAS,EAAE;AACnE,UAAMmL,aAAanC,cAAc,MAAM,IACnCiC,SAASC,QACTlC,cAAc,KAAKiC,SAAUjC,cAAc,IAAIkC,SAASD,SAASC;AACrE,UAAME,kBAAkBD,aAAaF,QAAQC;AAC7C,UAAMG,iBAAiBpa,KAAKkJ,IAAI6O,cAAc,KAAKoC,iBAAiBA,eAAe;AACnF,UAAME,SAASH,aACXld,MAAMyM,QAAQmF,OAAOC,MAAM,KAAKuL,iBAChCpd,MAAMyM,QAAQmF,OAAOG,SAAS;AAClC,WAAO;MACL7J;MACAS;MACAkJ,KAAKzO,MAAMia,QAAQjP,QAAQ2O,YAAY,IAAI/Z,KAAKC,IAAImL,QAAQ2O,YAAY,IAAIhL,SAASqL,iBAAiB,EAAE,CAAC;MACzGD;MACAD;IACF;EACF,CAAC;AAED,SAAA9c,oBACGC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAEqb,aAAa,EAAEC,SAASlY,SAAS;IAAC;IAAA,IAAAnD,WAAA;AAAA,aAAAH,oBAC3CuD,SAAM;QAAA,IAACC,QAAK;AAAA,iBAAEC,SAASC;QAAI;QAAA,IAAAvD,WAAA;AAAA,cAAA+c,SAAAC,UAAA,GAAAC,SAAAF,OAAApZ,YAAAuZ,SAAAD,OAAAtZ,YAAAwZ,SAAAD,OAAAvZ,YAAAyZ,SAAAD,OAAAtZ,aAAAwZ,SAAAH,OAAArZ;AAAA,cAAAyZ,SAGjB/C;AAAG,iBAAA+C,WAAA,aAAAtZ,QAAAsZ,QAAAL,MAAA,IAAH1C,MAAG0C;AAAAhZ,UAAAA,WAAAkZ,QAAA,MAcwC/B,aAAa,EAAEE,KAAK;AAAAjU,6BAAA+V,QAAA,SACV3d,MAAMoa,SAAO,IAAA;AAAA5V,UAAAA,WAAAoZ,QAAAxd,oBAOpE0d,iBAAe;YAAA,IACdjG,UAAO;AAAA,qBAAE7X,MAAM6X;YAAO;YAAA,IACtB+D,WAAQ;AAAA,qBAAED,aAAa,EAAEC;YAAQ;YAAA,IACjCzO,SAAM;AAAA,qBAAEwO,aAAa,EAAEiB;YAAa;YAAA,IACpCN,qBAAkB;AAAA,qBAAEX,aAAa,EAAEW;YAAkB;UAAA,CAAA,CAAA;AAAArX,UAAAA,WAAAC,SAAA;AAAA,gBAAA6Y,QA5BvB/d,MAAM+E,OAAKiZ,QAI7BhW,SAAS,EAAEkV,aAAa,UAAU,SAAOe,QAEjD,GAAGjW,SAAS,EAAEW,IAAI,MAAIuV,QACvB,GAAGlW,SAAS,EAAE6J,GAAG,MAAIsM,QACnB,GAAGnW,SAAS,EAAEE,KAAK,MAAIkW,QAChB,GAAGpW,SAAS,EAAEmV,eAAe,MAAIkB,QACnCtD,cAAc,IAAI,IAAI,YAAY,UAAQuD,QAG5C,QAAQ3C,aAAa,EAAEE,KAAK;AAAEkC,sBAAA7Y,IAAAI,KAAAC,iBAAA+X,QAAA,cAAApY,IAAAI,IAAAyY,KAAA;AAAAC,sBAAA9Y,IAAAM,KAAAD,iBAAAiY,QAAA,kBAAAtY,IAAAM,IAAAwY,KAAA;AAAAC,sBAAA/Y,IAAAQ,KAAAC,oBAAA6X,QAAA,QAAAtY,IAAAQ,IAAAuY,KAAA;AAAAC,sBAAAhZ,IAAA8E,KAAArE,oBAAA6X,QAAA,OAAAtY,IAAA8E,IAAAkU,KAAA;AAAAC,sBAAAjZ,IAAA+E,KAAAtE,oBAAA6X,QAAA,SAAAtY,IAAA+E,IAAAkU,KAAA;AAAAC,sBAAAlZ,IAAAqZ,KAAA5Y,oBAAA6X,QAAA,cAAAtY,IAAAqZ,IAAAH,KAAA;AAAAC,sBAAAnZ,IAAAsZ,KAAA7Y,oBAAA6X,QAAA,cAAAtY,IAAAsZ,IAAAH,KAAA;AAAAC,sBAAApZ,IAAAuZ,KAAAlZ,iBAAAiY,QAAA,cAAAtY,IAAAuZ,IAAAH,KAAA;AAAA,mBAAApZ;UAAA,GAAA;YAAAI,GAAAM;YAAAJ,GAAAI;YAAAF,GAAAE;YAAAoE,GAAApE;YAAAqE,GAAArE;YAAA2Y,GAAA3Y;YAAA4Y,GAAA5Y;YAAA6Y,GAAA7Y;UAAA,CAAA;AAAA,iBAAA0X;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAuBtD;AAEA,SAASnC,eAAe;AACtB,SAAO;IACLjT,OAAOhF,OAAOwY,gBAAgBxT,SAAShF,OAAOwb;IAC9C9b,QAAQM,OAAOwY,gBAAgB9Y,UAAUM,OAAOC;IAChD2Z,YAAY5Z,OAAOwY,gBAAgBoB,cAAc;IACjDC,WAAW7Z,OAAOwY,gBAAgBqB,aAAa;EACjD;AACF;AAEA,SAASrL,sBAAsBL,MAAqC;AAClE,SAAO,oBAAIxE,IAAI,CAAC,GAAIwE,KAAKmE,YAAY,CAAA,GAAK,GAAInE,KAAKmB,QAAQmM,IAAK1I,WAAUA,MAAME,IAAI,KAAK,CAAA,CAAG,CAAC;AAC/F;AAEA,SAAS1E,gBAAgBoG,SAAiB1Q,MAAcyX,YAAyC;AAC/F,QAAMC,QAAQzR,UAAU0R,SAASjH,OAAO;AACxC,QAAMkH,SAASF,QAAQG,YAAYH,MAAMjD,UAAUzU,IAAI,IAAI;AAC3D,MAAI,CAAC4X,QAAQxe,SAAU,QAAO,CAAA;AAC9B,SAAOwe,OAAOxe,SAAS0e,OAAQhD,aAAY;AACzC,UAAMzK,MAAMyK,QAAQ9U,KAAK+U,MAAM/U,KAAKzD,SAAS,CAAC;AAC9C,WAAO8N,QAAQ,QAAQA,QAAQ,cAAc,CAACoN,YAAY1M,IAAIV,GAAG;EACnE,CAAC;AACH;AAEA,SAASuK,aAAalE,SAAiB1Q,MAAkC;AACvE,QAAM0X,QAAQzR,UAAU0R,SAASjH,OAAO;AACxC,SAAOgH,QAAQG,YAAYH,MAAMjD,UAAUzU,IAAI,IAAI;AACrD;AAaA,SAASgO,aAAanV,OAkBnB;AACD,MAAIkf,OAAyB;AAC7B,QAAM,CAACC,UAAUC,WAAW,IAAI/d,eAAa,KAAK;AAClD,QAAMge,UAAUA,MAAM7K,QAAQxU,MAAMuV,OAAO7R,MAAM;AAEjD,QAAM4b,oBAAqEjd,WAAU;AACnF,QAAIA,MAAM4I,SAAU;AACpB5I,UAAME,gBAAgB;AACtB,UAAM6N,SAAS/N,MAAM+N;AACrB,QAAImP,OAA0B;AAC9B,QAAIC;AACJ,QAAIpP,OAAOqP,QAAQC,aAAa9Z,QAAW;AACzC2Z,aAAO;AACPC,sBAAgB1T,OAAOsE,OAAOqP,QAAQC,QAAQ;IAChD,WAAW,CAAC1f,MAAMyV,eAAe;AAC/B,YAAMhL,OAAO2F,OAAOqP,QAAQhV;AAC5B,UAAIA,KAAM8U,QAAO9U;IACnB;AACAyU,WAAO;MACLK;MACAC;MACA/P,UAAUpN,MAAMmG;MAChB6M,IAAIrV,MAAMqV;MACV3M,UAAU1I,MAAM0I;MAChBiX,eAAe3f,MAAMuV,OAAOoJ,IAAK9S,UAASA,KAAKnD,QAAQ;MACvDkX,SAASxP,OAAOC,UAAU,aAAa;MACvCT,OAAO;IACT;AACAvN,UAAMiH,cAAcC,kBAAkBlH,MAAMmH,SAAS;EACvD;AAEA,QAAMqW,oBAAqExd,WAAU;AACnF,QAAI,CAAC6c,QAAQlf,MAAMqK,eAAe,EAAG;AACrC,UAAMyF,KAAKzN,MAAMmG,UAAU0W,KAAKzP;AAChC,QAAI,CAACyP,KAAKtP,OAAO;AACf,UAAI5M,KAAKsL,IAAIwB,EAAE,KAAK1Q,kBAAmB;AACvC8f,WAAKtP,QAAQ;AACbwP,kBAAY,IAAI;AAChBpf,YAAM+V,OAAO;IACf;AACA,UAAM+J,KAAKhQ,KAAK9P,MAAMqK;AACtB,UAAMuM,SAAS5W,MAAM4W,UAAU;AAC/B,QAAIsI,KAAKK,SAAS,cAAcvf,MAAMuV,SAAS2J,KAAKS,eAAe;AACjE,YAAMnM,QAAQ0L,KAAKM,iBAAiB;AACpC,YAAMO,SAASb,KAAKS,cAAcK,OAAO,CAACC,KAAKvX,UAAUwX,cAAcA,cAAc1M,QAAQyM,MAAMA,MAAMvX,UAAU,CAAC;AACpH0E,gBAAUsP,YACR1c,MAAMoV,YACN,GAAGpV,MAAMqR,KAAKG,GAAG,IAAIxR,MAAMuV,MAAM/B,KAAK,EAAEhC,OAAO,EAAE,aACjD2O,gBAAgBjB,KAAKS,cAAcnM,KAAK,IAAIsM,IAAIZ,KAAK7J,IAAI0K,QAAQ/f,MAAM4V,gBAAgB,CACzF;IACF,WAAWsJ,KAAKK,SAAS,QAAQ;AAC/B,UAAIvf,MAAM6W,WAAW;AACnBzJ,kBAAUsP,YACR1c,MAAMoV,YACN,GAAGpV,MAAMqR,KAAKG,GAAG,UACjB4O,gBAAgBlB,KAAK7J,KAAKyK,KAAKlJ,QAAQA,QAAQsI,KAAKxW,UAAU1I,MAAM4V,gBAAgB,CACtF;MACF,OAAO;AACLxI,kBAAUsP,YAAY1c,MAAMoV,YAAY,GAAGpV,MAAMqR,KAAKG,GAAG,OAAO6O,cAAcnB,KAAK7J,KAAKyK,IAAIZ,KAAKxW,UAAU1I,MAAM4V,gBAAgB,CAAC;MACpI;IACF,WAAWsJ,KAAKK,SAAS,OAAO;AAC9BnS,gBAAUsP,YACR1c,MAAMoV,YACN,GAAGpV,MAAMqR,KAAKG,GAAG,aACjB8O,mBAAmBpB,KAAKxW,WAAWoX,IAAIZ,KAAK7J,IAAIrV,MAAM4V,gBAAgB,CACxE;IACF,WAAW5V,MAAMuV,SAAS2J,KAAKS,eAAe;AAC5C,YAAM7c,OAAOyd,qBAAqBvd,KAAKC,IAAIic,KAAK7J,KAAKyK,IAAI9c,KAAKC,IAAI2T,QAAQ,CAAC,CAAC,GAAGsI,KAAK7J,IAAI6J,KAAKS,cAAc,CAAC,CAAC;AAC7GvS,gBAAUoT,aAAaxgB,MAAMoV,YAAY;QACvC,CAACpV,MAAM6W,YAAY,GAAG7W,MAAMqR,KAAKG,GAAG,WAAW,GAAGxR,MAAMqR,KAAKG,GAAG,KAAK,GAAGxR,MAAM6W,YAAY7T,KAAKC,IAAI,GAAGH,KAAKuS,KAAKuB,MAAM,IAAI9T,KAAKuS;QAC/H,CAAC,GAAGrV,MAAMqR,KAAKG,GAAG,IAAIxR,MAAMuV,MAAM,CAAC,EAAE/D,OAAO,EAAE,WAAW,GAAG1O,KAAK4F;MACnE,CAAC;IACH,OAAO;AACL,YAAM5F,OAAOyd,qBAAqBvd,KAAKC,IAAIic,KAAK7J,KAAKyK,IAAI9c,KAAKC,IAAI2T,QAAQ,CAAC,CAAC,GAAGsI,KAAK7J,IAAI6J,KAAKxW,QAAQ;AACrG0E,gBAAUoT,aAAaxgB,MAAMoV,YAAY;QACvC,CAACpV,MAAM6W,YAAY,GAAG7W,MAAMqR,KAAKG,GAAG,WAAW,GAAGxR,MAAMqR,KAAKG,GAAG,KAAK,GAAGxR,MAAM6W,YAAY7T,KAAKC,IAAI,GAAGH,KAAKuS,KAAKuB,MAAM,IAAI9T,KAAKuS;QAC/H,CAAC,GAAGrV,MAAMqR,KAAKG,GAAG,WAAW,GAAG1O,KAAK4F;MACvC,CAAC;IACH;EACF;AAEA,QAAMrF,SAAUhB,WAA6D;AAC3E,UAAMsP,WAAWuN;AACjBA,WAAO;AACPE,gBAAY,KAAK;AACjB,QAAIzN,YAAY,CAACA,SAAS/B,SAASvN,OAAO;AACxC,YAAMuP,SAASD,SAASiO,WAAWvd,MAAMiH;AACzCtJ,YAAM8V,QAAQ9V,MAAMqR,MAAMO,OAAOjP,sBAAsB,GAAGgP,SAASiO,SAASH,QAAQ5T,IAAI;IAC1F;EACF;AAEA,QAAM4U,cAAc/N,YAAW,MAAM;AACnC,UAAMgO,SAAoE,CAAA;AAC1E,QAAI1gB,MAAMsV,SAAS,YAAYtV,MAAM0I,YAAY,EAAG,QAAOgY;AAC3D,UAAMC,QAAQ3d,KAAKC,IAAI,GAAGD,KAAKuQ,OAAOvT,MAAM2J,YAAY3J,MAAMqV,MAAMrV,MAAM0I,QAAQ,CAAC;AACnF,aAASkY,SAAS,GAAGA,SAAS,KAAKA,UAAU;AAC3C,YAAMpN,QAAQmN,QAAQC;AACtB,YAAMlV,QAAQ1L,MAAMqV,KAAKrV,MAAM0I,WAAW8K;AAC1C,UAAI9H,SAAS1L,MAAM4V,mBAAmB,KAAM;AAC5C8K,aAAOtN,KAAK;QAAE1H;QAAOhD,UAAU1F,KAAKkJ,IAAIlM,MAAM0I,UAAU1I,MAAM4V,mBAAmBlK,KAAK;QAAG8H;MAAM,CAAC;IAClG;AACA,WAAOkN;EACT,CAAC;AACD,QAAMG,aAAanO,YAAW,MAAM;AAClC,QAAIoO,QAAQ;AACZ,WAAO9gB,MAAMuV,OAAOoJ,IAAK9S,UAAUiV,SAASjV,KAAKnD,QAAS,KAAK,CAAA;EACjE,CAAC;AACD,QAAMR,QAAQA,MAAMlF,KAAKC,IAAIjD,MAAM0I,WAAW1I,MAAMqK,aAAa,EAAE;AACnE,QAAM0W,YAAYA,MAAM/gB,MAAM0I,WAAW,KAAK,CAAC1I,MAAMyV,iBAAiB,CAACzV,MAAM2V;AAC7E,QAAMqL,eAAeA,MAAM,GAAGhhB,MAAMyV,iBAAiB,CAACzV,MAAM2V,YAAY,MAAM,EAAE,GAAGsL,cAAcjhB,MAAM0I,QAAQ,CAAC;AAChH,QAAMwY,UAAUA,MAAMlhB,MAAMsV,SAAS,YAAYtV,MAAM0I,WAAW;AAClE,QAAMmT,QAAQA,MAAM7b,MAAM2V,YACtB,GAAG3V,MAAMqR,KAAKpL,KAAK,2CAAsCib,QAAQ,IAAI,mCAAgC,EAAE,0BACvG,GAAGlhB,MAAMqR,KAAKpL,KAAK,WAAMgb,cAAcjhB,MAAMqV,EAAE,CAAC,QAAQ2L,aAAa,CAAC,GAAGhhB,MAAMyV,gBAAgB,sCAAsC,EAAE,GAAGyL,QAAQ,IAAI,mCAAgC,EAAE,GAAGlhB,MAAM6W,YAAY,8BAA2B,EAAE;AAE9O,SAAA,CAAAzW,oBAEKqE,MAAG;IAAA,IAACC,OAAI;AAAA,aAAE+b,YAAY;IAAC;IAAAlgB,UAAI4gB,YAAK,MAAA;AAAA,UAAAC,SAAAC,UAAA;AAAA7c,MAAAA,WAAA4c,QAAAhhB,oBAW5BqE,MAAG;QAAA,IAACC,OAAI;AAAA,iBAAE1E,MAAMuV;QAAK;QAAAhV,UAAIsL,WAAI,MAAA;AAAA,cAAAyV,SAAAC,UAAA;AAAAtc,UAAAA,WAAA4B,SAAAlB,oBAAA2b,QAAA,SAAuE,GAAGzV,KAAKnD,WAAW1I,MAAMqK,WAAW,IAAI,CAAA;AAAA,iBAAAiX;QAAA,GAAA;MAAM,CAAA,CAAA;AAAArc,MAAAA,WAAAC,SAAA;AAAA,YAAAsc,QARvInC,QAAQ,KAAKzZ,QAAS6b,QAG1B,IAAIN,MAAMzV,QAAQ1L,MAAM2J,aAAa3J,MAAMqK,cAAc,CAAC,MAAIqX,QAC7D,GAAG1e,KAAKC,IAAI,GAAGke,MAAMzY,WAAW1I,MAAMqK,cAAc,CAAC,CAAC,MAAIsX,QACrD3hB,MAAMqR,KAAKlJ;AAAKqZ,kBAAAtc,IAAAI,KAAAC,iBAAA6b,QAAA,cAAAlc,IAAAI,IAAAkc,KAAA;AAAAC,kBAAAvc,IAAAM,KAAAG,oBAAAyb,QAAA,QAAAlc,IAAAM,IAAAic,KAAA;AAAAC,kBAAAxc,IAAAQ,KAAAC,oBAAAyb,QAAA,SAAAlc,IAAAQ,IAAAgc,KAAA;AAAAC,kBAAAzc,IAAA8E,KAAArE,oBAAAyb,QAAA,cAAAlc,IAAA8E,IAAA2X,KAAA;AAAA,eAAAzc;MAAA,GAAA;QAAAI,GAAAM;QAAAJ,GAAAI;QAAAF,GAAAE;QAAAoE,GAAApE;MAAA,CAAA;AAAA,aAAAwb;IAAA,GAAA;EAKjC,CAAA,IAAA,MAAA;AAAA,QAAAQ,SAAAC,UAAA;AAAAD,WAAAre,iBAAA,sBAgBuB,MAAMF,OAAO,CAAC;AAAAue,WAAAre,iBAAA,iBADnB,MAAMF,OAAO,CAAC;AAAAue,WAAAxY,cADjB/G,WAAUgB,OAAOhB,KAAK;AAACuf,WAAAvY,gBADtBwW;AAAiB+B,WAAAvd,gBADjBib;AAAiB9a,IAAAA,WAAAod,QAAAxhB,oBAO/BC,QAAI;MAAA,IACHC,OAAI;AAAA,eAAE,CAACN,MAAM2V;MAAS;MAAA,IACtBnP,WAAQ;AAAA,eAAApG,oBAAGC,QAAI;UAAA,IAACC,OAAI;AAAA,mBAAE4H,MAAM,IAAI;UAAE;UAAA,IAAA3H,WAAA;AAAA,gBAAAuhB,SAAAC,UAAA;AAAAvd,YAAAA,WAAAsd,QAAgDd,YAAY;AAAA,mBAAAc;UAAA;QAAA,CAAA;MAAA;MAAA,IAAAvhB,WAAA;AAAA,eAAAH,oBAE7FC,QAAI;UAAA,IACHC,OAAI;AAAA,mBAAE+e,QAAQ;UAAC;UAAA,IACf7Y,WAAQ;AAAA,mBAAA,CAAApG,oBAEHC,QAAI;cAAA,IAACC,OAAI;AAAA,uBAAEygB,UAAU;cAAC;cAAA,IAAAxgB,WAAA;AAAA,uBAAAyhB,UAAA;cAAA;YAAA,CAAA,GAAA5hB,oBACtBC,QAAI;cAAA,IAACC,OAAI;AAAA,uBAAE4H,MAAM,IAAI;cAAE;cAAA,IAAA3H,WAAA;AAAA,oBAAA0hB,SAAAF,UAAA;AAAAvd,gBAAAA,WAAAyd,QAAgDjB,YAAY;AAAA,uBAAAiB;cAAA;YAAA,CAAA,GAAA7hB,oBACnFC,QAAI;cAAA,IAACC,OAAI;AAAA,uBAAEygB,UAAU;cAAC;cAAA,IAAAxgB,WAAA;AAAA,uBAAA2hB,UAAA;cAAA;YAAA,CAAA,CAAA;UAAA;UAAA,IAAA3hB,WAAA;AAAA,mBAAA,CAAAH,oBAI1BqE,MAAG;cAAA,IAACC,OAAI;AAAA,uBAAE1E,MAAMuV;cAAK;cAAAhV,UAAIsL,UAAS;AACjC,sBAAMsW,eAAeA,MAAMtW,KAAKnD,WAAW1I,MAAMqK;AACjD,wBAAA,MAAA;AAAA,sBAAA+X,SAAAC,UAAA;AAAA7d,kBAAAA,WAAA4d,QAAAhiB,oBAOKC,QAAI;oBAAA,IAACC,OAAI;AAAA,6BAAE6hB,aAAa,IAAI;oBAAE;oBAAA,IAAA5hB,WAAA;AAAA,0BAAA+hB,SAAAP,UAAA;AAAAvd,sBAAAA,WAAA8d,QAAA,MAAgDrB,cAAcpV,KAAKnD,QAAQ,CAAC;AAAA,6BAAA4Z;oBAAA;kBAAA,CAAA,CAAA;AAAArd,kBAAAA,WAAAC,SAAA;AAAA,wBAAAqd,QAJhG1W,KAAK2F,OAAO5L,QAAS4c,QACjBxiB,MAAM6V,oBAAoBhK,KAAK2F,OAAO5L,QAAS6c,QAC9C,GAAGN,aAAa,CAAC;AAAII,8BAAArd,IAAAI,KAAAC,iBAAA6c,QAAA,aAAAld,IAAAI,IAAAid,KAAA;AAAAC,8BAAAtd,IAAAM,KAAAD,iBAAA6c,QAAA,iBAAAld,IAAAM,IAAAgd,KAAA;AAAAC,8BAAAvd,IAAAQ,KAAAC,oBAAAyc,QAAA,SAAAld,IAAAQ,IAAA+c,KAAA;AAAA,2BAAAvd;kBAAA,GAAA;oBAAAI,GAAAM;oBAAAJ,GAAAI;oBAAAF,GAAAE;kBAAA,CAAA;AAAA,yBAAAwc;gBAAA,GAAA;cAK3C;YAAC,CAAA,GAAAhiB,oBACAqE,MAAG;cAAA,IAACC,OAAI;AAAA,uBAAE1E,MAAMuV;cAAK;cAAAhV,UAAGA,CAACsL,MAAM2H,UAAKpT,oBAClCC,QAAI;gBAAA,IAACC,OAAI;AAAA,yBAAE,CAACuL,KAAK6J;gBAAS;gBAAA,IAAAnV,WAAA;AAAA,sBAAAmiB,SAAAC,UAAA;AAAA1d,kBAAAA,WAAAC,SAAA;AAAA,wBAAA0d,QAGRpP,MAAM,GAACqP,QACP,GAAGhC,WAAW,EAAErN,MAAM,CAAC,IAAIxT,MAAMqK,cAAc,CAAC;AAAIuY,8BAAA1d,IAAAI,KAAAC,iBAAAmd,QAAA,iBAAAxd,IAAAI,IAAAsd,KAAA;AAAAC,8BAAA3d,IAAAM,KAAAG,oBAAA+c,QAAA,QAAAxd,IAAAM,IAAAqd,KAAA;AAAA,2BAAA3d;kBAAA,GAAA;oBAAAI,GAAAM;oBAAAJ,GAAAI;kBAAA,CAAA;AAAA,yBAAA8c;gBAAA;cAAA,CAAA;YAGxE,CAAA,GAAAtiB,oBACAC,QAAI;cAAA,IAACC,OAAI;AAAA,uBAAE,CAACN,MAAMuV,QAAQ,CAAC,GAAGG;cAAS;cAAA,IAAAnV,WAAA;AAAA,uBAAAyhB,UAAA;cAAA;YAAA,CAAA,CAAA;UAAA;QAAA,CAAA;MAAA;IAAA,CAAA,CAAA;AAAA/c,IAAAA,WAAAC,SAAA;AAAA,UAAA4d,QApDhCzD,QAAQ,KAAKzZ,QAASmd,QAClB/iB,MAAM2V,aAAa/P,QAASod,QAC7BhjB,MAAM4U,YAAYhP,QAASqd,QAC3B9D,SAAS,KAAKvZ,QAASsd,QAE9B,IAAIljB,MAAMqV,KAAKrV,MAAM2J,aAAa3J,MAAMqK,WAAW,MAAI8Y,QACtD,GAAGjb,MAAM,CAAC,MAAIkb,QACTpjB,MAAM2V,YAAY,GAAG3V,MAAMqR,KAAKlJ,KAAK,OAAOnI,MAAMqR,KAAKlJ,OAAKkb,QAOnExH,MAAM;AAACiH,gBAAA5d,IAAAI,KAAAC,iBAAAqc,QAAA,cAAA1c,IAAAI,IAAAwd,KAAA;AAAAC,gBAAA7d,IAAAM,KAAAD,iBAAAqc,QAAA,kBAAA1c,IAAAM,IAAAud,KAAA;AAAAC,gBAAA9d,IAAAQ,KAAAH,iBAAAqc,QAAA,iBAAA1c,IAAAQ,IAAAsd,KAAA;AAAAC,gBAAA/d,IAAA8E,KAAAzE,iBAAAqc,QAAA,iBAAA1c,IAAA8E,IAAAiZ,KAAA;AAAAC,gBAAAhe,IAAA+E,KAAAtE,oBAAAic,QAAA,QAAA1c,IAAA+E,IAAAiZ,KAAA;AAAAC,gBAAAje,IAAAqZ,KAAA5Y,oBAAAic,QAAA,SAAA1c,IAAAqZ,IAAA4E,KAAA;AAAAC,gBAAAle,IAAAsZ,KAAA7Y,oBAAAic,QAAA,cAAA1c,IAAAsZ,IAAA4E,KAAA;AAAAC,gBAAAne,IAAAuZ,KAAAlZ,iBAAAqc,QAAA,SAAA1c,IAAAuZ,IAAA4E,KAAA;AAAA,aAAAne;IAAA,GAAA;MAAAI,GAAAM;MAAAJ,GAAAI;MAAAF,GAAAE;MAAAoE,GAAApE;MAAAqE,GAAArE;MAAA2Y,GAAA3Y;MAAA4Y,GAAA5Y;MAAA6Y,GAAA7Y;IAAA,CAAA;AAAA,WAAAgc;EAAA,GAAA,GAAAxhB,oBA0CfC,QAAI;IAAA,IAACC,OAAI;AAAA,aAAE4gB,QAAQ;IAAC;IAAA,IAAA3gB,WAAA;AAAA,aAAA+iB,UAAA;IAAA;EAAA,CAAA,CAAA;AAG3B;AAACC,mBAAA,CAAA,eAAA,SAAA,eAAA,WAAA,CAAA;;;;;;;;AEh1CD,SAASC,OAAAA,YAAW;;;AASb,SAASC,YAAYC,OAAyB;AACnD,UAAA,MAAA;AAAA,QAAAC,OAAAC,SAAA;AAAAC,IAAAA,WAAAF,MAAAG,oBAEKN,MAAG;MAAA,IAACO,OAAI;AAAA,eAAEL,MAAMM;MAAO;MAAAC,UACpBC,aAAM,MAAA;AAAA,YAAAC,QAAAC,UAAA;AAAAC,QAAAA,oBAAAF,OAAA,SACkCD,OAAOI,SAAO,IAAA;AAAAT,QAAAA,WAAAM,OAAA,MACnDD,OAAOK,KAAK;AAAA,eAAAJ;MAAA,GAAA;IAEhB,CAAA,CAAA;AAAA,WAAAR;EAAA,GAAA;AAIT;AAACa,mBAAA,CAAA,OAAA,CAAA;","names":["createUniqueId","onCleanup","onMount","isServer","wd","t","from","createUniqueId","isServer","onCleanup","onMount","createSignal","onMount","Show","For","Portal","createEffect","createSignal","onCleanup","isServer","createContext","useContext","createSignal","onMount","onCleanup","defaultState","activePanelId","activePath","ShortcutContext","createContext","useShortcutContext","useContext","ShortcutListener","props","activeShortcut","setActiveShortcut","createSignal","setShortcutTarget","prev","activeKeys","Set","isDragging","lastMouseX","dragAccumulator","resolveActiveTarget","interaction","key","panels","DialStore","getPanels","panel","path","shortcut","Object","entries","shortcuts","toLowerCase","control","getPanel","id","controls","findControl","type","panelId","onMount","handleKeyDown","e","isInputFocused","size","target","preventDefault","direction","effectiveStep","getEffectiveStep","applySliderDelta","wasAlreadyHeld","has","add","modifier","getActiveModifier","resolveShortcutTarget","currentValue","getValue","updateValue","handleKeyUp","delete","found","remainingKey","handleWheel","deltaY","scrollOnlyTargets","resolveScrollOnlyTargets","handleMouseDown","clientX","handleMouseUp","handleMouseMove","deltaX","steps","Math","trunc","DRAG_SENSITIVITY","moveTarget","handleWindowBlur","clear","window","addEventListener","passive","onCleanup","removeEventListener","_$createComponent","Provider","value","children","createSignal","createEffect","on","onCleanup","untrack","Show","isServer","animate","morphTransition","type","visualDuration","bounce","RootPanel","props","inline","isOpen","setIsOpen","createSignal","defaultOpen","contentHeight","setContentHeight","undefined","windowHeight","setWindowHeight","isServer","window","innerHeight","folderRef","handleToggle","next","onOpenChange","folderContent","_el$","_tmpl$5","_el$2","firstChild","_el$3","_ref$","_$use","$$click","_$insert","_$createComponent","Show","when","children","_el$4","_tmpl$","_el$5","title","_el$6","_tmpl$2","_el$7","_el$8","nextSibling","_el$9","_el$0","_$effect","_p$","_v$","ICON_PANEL","path","_v$2","circles","cx","_v$3","cy","_v$4","r","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","e","_$setAttribute","t","a","o","i","n","s","h","d","_$memo","toolbar","_el$1","_tmpl$3","stopPropagation","_el$10","_tmpl$4","_el$11","String","_el$12","_tmpl$6","panelRef","morphAnim","tapAnim","onWindowResize","addEventListener","onCleanup","removeEventListener","stop","createEffect","el","ro","ResizeObserver","offsetHeight","prev","observe","disconnect","measuredOpenHeight","Math","min","panelHeightOffset","getBoundingClientRect","height","on","open","prevOpen","target","width","borderRadius","boxShadow","style","cursor","overflow","animate","onComplete","winHeight","untrack","defer","handler","pressTo","scale","_el$13","_tmpl$7","$$pointerup","$$pointerdown","document","activeElement","blur","_ref$2","_$delegateEvents","batch","createSignal","createEffect","on","onMount","onCleanup","For","animate","createSignal","createEffect","on","onCleanup","Show","animate","sectionTransition","type","visualDuration","bounce","Folder","props","isRoot","_$createComponent","RootPanel","isOpen","setIsOpen","createSignal","defaultOpen","contentMounted","setContentMounted","skipFirstAnim","sectionContentRef","sectionAnim","chevronRef","chevronAnim","onCleanup","stop","createEffect","on","open","animate","rotate","defer","handleToggle","next","height","opacity","onComplete","currentHeight","getBoundingClientRect","style","undefined","onOpenChange","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","_el$5","_el$6","nextSibling","_el$7","$$click","_$insert","title","_ref$","_$use","_$setAttribute","ICON_CHEVRON","Show","when","children","_el$8","_tmpl$","_el$9","el","_$effect","_p$","_v$","String","_v$2","e","t","_$setStyleProperty","_$delegateEvents","createSignal","createEffect","onMount","onCleanup","Show","animate","motionValue","CLICK_THRESHOLD","DEAD_ZONE","MAX_CURSOR_RANGE","MAX_STRETCH","Slider","props","min","max","step","wrapperRef","trackRef","fillRef","handleRef","labelRef","valueSpanRef","inputRef","isInteracting","setIsInteracting","createSignal","isDragging","setIsDragging","isHovered","setIsHovered","isValueHovered","setIsValueHovered","isValueEditable","setIsValueEditable","showInput","setShowInput","inputValue","setInputValue","fillPercent","motionValue","value","rubberStretchPx","handleOpacityMv","handleScaleXMv","handleScaleYMv","applyFillStyles","pct","style","width","left","applyRubberStyles","stretch","Math","abs","transform","applyHandleVisualStyles","opacity","String","get","createEffect","snapAnim","jump","percentage","isActive","pointerDownPos","isClickFlag","wrapperRect","scaleVal","hoverTimeout","rubberAnim","handleOpacityAnim","handleScaleXAnim","handleScaleYAnim","positionToValue","clientX","screenX","sceneX","nativeWidth","offsetWidth","percent","rawValue","percentFromValue","v","computeRubberStretch","sign","distancePast","right","overflow","sqrt","cancelInteraction","handlePointerDown","e","preventDefault","currentTarget","setPointerCapture","pointerId","x","y","clientY","getBoundingClientRect","handlePointerMove","dx","dy","distance","newValue","newPct","stop","onChange","roundValue","handlePointerUp","discreteSteps","snappedValue","round","snapToDecile","animate","type","stiffness","damping","mass","onComplete","visualDuration","bounce","handlePointerCancel","hovered","editing","editable","onCleanup","clearTimeout","setTimeout","onMount","unsubFill","on","unsubRubber","unsubHandleOpacity","unsubHandleScaleX","unsubHandleScaleY","focus","select","handleInputSubmit","parsed","parseFloat","isNaN","clamped","handleValueClick","stopPropagation","toFixed","decimalsForStep","handleInputKeyDown","key","displayValue","HANDLE_BUFFER","LABEL_CSS_LEFT","VALUE_CSS_RIGHT","leftThreshold","trackWidth","rightThreshold","valueDodge","handleOpacity","targetOpacity","targetScaleX","targetScaleY","duration","hashMarks","ds","Array","from","length","_","i","_el$","_tmpl$","_$setStyleProperty","_el$2","_el$3","_tmpl$3","_el$4","firstChild","_el$5","_el$6","nextSibling","_el$7","_el$8","_ref$","_$use","addEventListener","$$pointerup","$$pointermove","$$pointerdown","_ref$2","_$insert","_ref$3","_ref$4","_ref$5","label","_$createComponent","Show","when","shortcut","children","_el$9","_tmpl$2","formatSliderShortcut","_$effect","_$className","shortcutActive","_c$","_$memo","_el$0","_tmpl$4","$$mousedown","$$click","$$keydown","$$input","_ref$6","_el$1","_ref$7","_p$","_v$4","_v$5","t","undefined","_v$","_v$2","_v$3","a","_$delegateEvents","Show","createSignal","createEffect","on","onMount","onCleanup","For","Show","SegmentedControl","props","containerRef","pillStyle","setPillStyle","hasChanged","setHasChanged","measure","activeButton","querySelector","left","offsetLeft","width","offsetWidth","value","options","length","defer","ro","ResizeObserver","observe","disconnect","transition","_el$","_tmpl$","_ref$","_$use","_$insert","_$createComponent","when","children","style","_el$2","_tmpl$2","_$effect","_p$","_v$","_v$2","_v$3","e","_$setStyleProperty","t","a","undefined","each","option","_el$3","_tmpl$3","$$click","onChange","label","_$setAttribute","String","_$delegateEvents","Toggle","props","_el$","_tmpl$2","_el$2","firstChild","_$insert","label","_$createComponent","Show","when","shortcut","children","_el$3","_tmpl$","formatToggleShortcut","_$effect","_$className","shortcutActive","SegmentedControl","options","value","checked","onChange","val","generateSpringCurve","stiffness","damping","mass","duration","points","steps","dt","position","velocity","target","i","time","push","springForce","dampingForce","acceleration","SpringVisualization","props","width","height","params","isSimpleMode","visualDuration","spring","bounce","Math","pow","PI","dampingRatio","sqrt","values","map","value","minValue","min","maxValue","max","valueRange","pathData","x","normalizedValue","y","join","gridLines","lines","createLine","x1","y1","x2","y2","_el$","_tmpl$","_$setAttribute","_el$2","_tmpl$2","_el$3","firstChild","_el$4","nextSibling","_$insert","_$effect","SpringControl","props","mode","fromStore","DialStore","getSpringMode","panelId","path","notify","subscribe","isSimpleMode","cache","simple","spring","visualDuration","undefined","type","bounce","advanced","stiffness","damping","mass","handleModeChange","newMode","updateSpringMode","onChange","handleUpdate","key","value","rest","_$createComponent","Folder","title","label","defaultOpen","children","_el$","_tmpl$","_el$2","firstChild","_el$3","_$insert","SpringVisualization","SegmentedControl","options","_c$","_$memo","Slider","v","min","max","step","unit","createSignal","Show","EasingVisualization","props","size","pad","unit","toSvg","x","y","start","end","curvePath","x1","y1","x2","y2","easing","ease","first","second","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","e","_$setAttribute","t","a","o","i","undefined","TransitionControl","props","mode","fromStore","DialStore","getTransitionMode","panelId","path","notify","subscribe","editingEase","setEditingEase","createSignal","easeDraft","setEaseDraft","cache","easing","value","type","duration","ease","simple","visualDuration","undefined","bounce","advanced","stiffness","damping","mass","isEasing","isSimple","spring","handleModeChange","next","updateTransitionMode","onChange","handleSpringUpdate","key","current","rest","updateEase","index","formatEase","map","part","Number","toFixed","join","commitEase","parts","split","parseFloat","trim","length","every","isFinite","durationSlider","hideDuration","external","durationControl","_$createComponent","Slider","label","min","max","step","unit","Folder","title","defaultOpen","children","_el$","_tmpl$2","_el$2","firstChild","_el$3","_$insert","Show","when","fallback","SpringVisualization","isSimpleMode","EasingVisualization","SegmentedControl","options","_el$4","_tmpl$","_el$5","_el$6","nextSibling","$$keydown","event","currentTarget","blur","addEventListener","$$input","_$setAttribute","_$effect","_$memo","_$delegateEvents","createUniqueId","TextControl","props","inputId","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$setAttribute","_$insert","label","$$input","e","onChange","currentTarget","value","_$effect","placeholder","_$delegateEvents","createSignal","createEffect","on","onMount","onCleanup","Show","For","Portal","animate","toTitleCase","s","replace","c","toUpperCase","normalizeOptions","options","map","opt","value","label","SelectControl","props","pos","setPos","createSignal","portalTarget","setPortalTarget","triggerRef","chevronRef","chevronAnim","normalized","selectedOption","find","o","dropdown","createDropdownPresence","el","done","animate","opacity","y","above","scale","type","visualDuration","bounce","onComplete","onMount","getDialKitPortalRoot","document","body","onCleanup","stop","createEffect","on","isOpen","open","rotate","defer","updatePos","root","dropdownHeight","length","getDropdownPosition","openDropdown","createDropdownDismiss","contains","target","onDismiss","close","onViewportChange","dropdownStyle","p","position","left","top","width","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","$$click","_ref$","_$use","_$insert","_ref$2","_$setAttribute","ICON_CHEVRON","_$createComponent","Show","when","children","Portal","mount","_$memo","mounted","_el$8","_tmpl$","setRef","For","each","option","_el$9","_tmpl$3","onChange","_$effect","String","_$p","_$style","_$delegateEvents","createSignal","createEffect","createUniqueId","Show","HEX_COLOR_REGEX","expandShorthandHex","hex","length","ColorControl","props","isEditing","setIsEditing","editValue","setEditValue","value","textInputId","colorInputRef","handleTextSubmit","test","onChange","handleKeyDown","e","key","_el$","_tmpl$2","_el$2","firstChild","_el$3","nextSibling","_el$5","_el$6","_$setAttribute","_$insert","label","_$createComponent","when","fallback","_el$7","_tmpl$3","$$click","toUpperCase","children","_el$4","_tmpl$","$$keydown","addEventListener","$$input","currentTarget","_$effect","click","_ref$","_$use","_p$","_v$","_v$2","_v$3","_$setStyleProperty","t","a","undefined","slice","_$delegateEvents","createSignal","createEffect","on","onMount","onCleanup","Show","For","Portal","animate","PresetManager","props","pos","setPos","createSignal","top","left","width","portalTarget","setPortalTarget","triggerRef","chevronRef","chevronAnim","hasPresets","presets","length","activePreset","find","p","id","activePresetId","dropdown","createDropdownPresence","el","done","animate","opacity","y","scale","type","visualDuration","bounce","onComplete","onMount","getDialKitPortalRoot","document","body","onCleanup","stop","createEffect","on","isOpen","open","has","rotate","defer","updatePos","root","getDropdownPosition","allowAbove","openDropdown","toggle","close","createDropdownDismiss","contains","target","onDismiss","onViewportChange","handleSelect","presetId","DialStore","loadPreset","panelId","clearActivePreset","handleDelete","e","stopPropagation","deletePreset","_el$","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","$$click","_ref$","_$use","_$insert","_c$","_$memo","name","_ref$2","_$setAttribute","ICON_CHEVRON","_$createComponent","Show","when","children","Portal","mount","mounted","_el$6","_tmpl$","_el$7","setRef","For","each","preset","_el$8","_tmpl$3","_el$9","_el$0","_el$1","_el$10","_el$11","_el$12","_el$13","_el$14","_$effect","_p$","_v$9","String","_v$0","ICON_TRASH","_v$1","_v$10","_v$11","_v$12","t","a","o","i","n","undefined","_v$","_v$2","_v$3","_v$4","_$setStyleProperty","_v$5","_v$6","_v$7","_v$8","_$delegateEvents","Panel","props","copied","setCopied","createSignal","shortcutCtx","useShortcutContext","values","setValues","DialStore","getValues","panel","id","presets","setPresets","getPresets","activePresetId","setActivePresetId","getActivePresetId","addButtonRef","copyButtonRef","copyClipboardIconRef","copyCheckIconRef","addTapAnim","copyTapAnim","copyClipboardAnim","copyCheckAnim","tapTransition","type","visualDuration","bounce","onMount","unsub","subscribe","batch","onCleanup","handleAddPreset","nextNum","length","savePreset","handleCopy","jsonStr","JSON","stringify","instruction","name","navigator","clipboard","writeText","setTimeout","createEffect","on","isCopied","stop","transition","animate","opacity","scale","filter","defer","handleAddTapStart","handleAddTapEnd","handleCopyTapStart","handleCopyTapEnd","handleOpenChange","open","onOpenChange","renderControl","control","value","path","_$createComponent","Slider","label","onChange","v","updateValue","min","max","step","shortcut","shortcutActive","_$memo","activePanelId","activePath","Toggle","checked","SpringControl","panelId","spring","TransitionControl","Folder","title","defaultOpen","children","For","each","child","TextControl","placeholder","SelectControl","options","ColorControl","renderControls","controls","_el$","_tmpl$","$$click","triggerAction","_$insert","toolbar","_el$2","_tmpl$2","_el$3","firstChild","_el$4","_el$5","nextSibling","_el$6","_el$7","_el$8","addEventListener","$$pointerup","$$pointerdown","_ref$","_$use","_$effect","_p$","_v$","ICON_ADD_PRESET","_v$2","_v$3","_v$4","_v$5","e","_$setAttribute","t","a","o","i","undefined","PresetManager","onAdd","_el$9","_tmpl$3","_el$0","_el$1","_el$10","_el$11","_el$12","_el$13","_el$14","_el$15","_el$16","_ref$2","_ref$3","_ref$4","ICON_CHECK","_v$6","ICON_CLIPBOARD","board","_v$7","sparkle","_v$8","body","toolbarExtra","variant","_el$17","_tmpl$4","stopPropagation","_el$18","_tmpl$5","RootPanel","inline","_$delegateEvents","For","TimelineToggleButton","visible","fromStore","TimelineUiStore","getVisible","notify","subscribe","label","_el$","_tmpl$","_el$2","firstChild","$$click","toggle","_$insert","_$createComponent","For","each","ICON_TIMELINE","children","path","_el$3","_tmpl$2","_$setAttribute","_$effect","_p$","_v$","undefined","_v$2","_v$3","_v$4","e","t","a","o","_$delegateEvents","isDevDefault","process","env","NODE_ENV","import","MODE","DialRoot","props","enabled","productionEnabled","_$createComponent","Show","when","children","DialRootInner","panels","fromStore","DialStore","getPanels","notify","subscribeGlobal","timelines","TimelineStore","getTimelines","mounted","setMounted","createSignal","dragOffset","setDragOffset","activePosition","setActivePosition","position","inline","mode","panelRef","lastDragOffset","dragging","dragStart","didDrag","dragTarget","onMount","fallbackOpen","defaultOpen","panelOpenStates","Map","rootFolderOpen","anyOpen","list","length","some","panel","get","id","applyDragOffsetForOpen","open","currentDragOffset","bubbleCenterX","x","window","innerWidth","reactToOpenChange","before","after","onOpenChange","handlePanelOpenChange","panelId","set","handleRootOpenChange","handlePointerDown","event","handle","getPanelDragHandle","target","getPanelDragStart","clientX","clientY","setPointerCapture","pointerId","handlePointerMove","hasPanelDragMoved","getPanelDragOffset","handlePointerUp","hasPointerCapture","releasePointerCapture","stopPropagation","blockPanelDragClick","dragStyle","offset","top","y","left","right","bottom","undefined","timelineToggle","TimelineToggleButton","content","ShortcutListener","_el$","_tmpl$2","_el$2","firstChild","addEventListener","$$pointerup","$$pointermove","$$pointerdown","_ref$","_$use","_$insert","fallback","_el$4","_tmpl$","RootPanel","title","toolbar","panelHeightOffset","_tmpl$3","For","each","Panel","toolbarExtra","_el$3","variant","_$effect","_p$","_v$","_v$2","theme","_v$3","_v$4","getPanelOriginX","_v$5","_v$6","_v$7","e","_$setAttribute","t","a","o","i","n","s","_$style","_$memo","Portal","mount","document","body","_$delegateEvents","For","Show","createEffect","createMemo","createSignal","onCleanup","onMount","Portal","For","ControlRenderer","props","shortcut","useShortcutContext","renderControl","control","value","values","path","type","_$createComponent","Slider","label","onChange","next","DialStore","updateValue","panelId","min","max","step","shortcutActive","_$memo","activePanelId","activePath","Toggle","checked","SpringControl","spring","TransitionControl","durationControl","transitionDuration","Folder","title","defaultOpen","children","For","each","TextControl","placeholder","SelectControl","options","ColorControl","_el$","_tmpl$","$$click","triggerAction","_$insert","controls","_$delegateEvents","DRAG_THRESHOLD_PX","MAJOR_TICK_TARGET_PX","MILLISECOND_STEP","SECOND_TICK_STEPS","MIN_TIMELINE_MAX_ZOOM","PLAYHEAD_FLAG_WIDTH","PLAYHEAD_FLAG_EDGE_OVERHANG","POPOVER_WIDTH","ZOOM_DRAG_DISTANCE","DEFAULT_DOCK_MAX_HEIGHT","MIN_DOCK_MAX_HEIGHT","DialTimeline","props","enabled","productionEnabled","isDevDefault","_$createComponent","Show","when","children","DialTimelineDock","timelines","fromStore","TimelineStore","getTimelines","notify","subscribeGlobal","visible","TimelineUiStore","getVisible","subscribe","mounted","setMounted","createSignal","dockMaxHeight","setDockMaxHeight","controllerId","Symbol","dockRef","resizeCleanup","onMount","unregister","registerController","defaultVisible","onVisibilityChange","onCleanup","createEffect","updateController","handleResizePointerDown","event","preventDefault","stopPropagation","pointerY","clientY","startHeight","getBoundingClientRect","height","move","next","viewportMax","Math","max","window","innerHeight","clamp","finish","removeEventListener","addEventListener","passive","_$memo","length","Portal","mount","document","body","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","$$pointerdown","_ref$","_$use","_$insert","For","each","timeline","TimelineSection","meta","defaultOpen","theme","dockVisible","_$effect","_p$","_v$","_v$2","_v$3","e","_$setAttribute","t","hidden","a","_$setStyleProperty","undefined","PlayPauseButton","playing","getTransport","id","label","_el$4","_tmpl$3","_el$5","$$click","pause","play","fallback","_el$7","_tmpl$4","_el$8","ICON_PLAY","_$p","_$style","iconStyle","_el$6","_tmpl$2","ICON_PAUSE","path","_el$9","_tmpl$5","_v$4","_v$5","ReplayButton","_el$0","_tmpl$6","_el$1","_$addEventListener","onReplay","ICON_REPLAY","_el$10","position","inset","width","color","TimelineOverview","time","scrub","seekFromClientX","clientX","rect","duration","left","seek","onNavigate","wasPlaying","_el$11","_tmpl$7","_el$12","_el$13","_el$14","$$pointerup","$$pointermove","currentTarget","setPointerCapture","pointerId","_v$6","viewEnd","viewStart","_v$7","_v$8","_v$9","_v$0","o","i","TimelinePlayheadFlag","cleanup","x","pxPerSecond","laneWidth","flagCenter","flagOffset","edge","_el$15","_tmpl$8","_el$16","_el$17","_el$18","ruler","reset","shiftKey","onResetView","toFixed","_v$1","_v$10","_v$11","_v$12","_v$13","clampViewStart","start","visibleDuration","formatRulerSeconds","step","Number","isInteger","formatClock","decimals","min","ceil","log10","open","setOpen","copied","setCopied","popover","setPopover","collapsedGroups","setCollapsedGroups","Set","expandedTracks","setExpandedTracks","zoom","setZoom","setViewStart","values","DialStore","getValues","presets","getPresets","activePresetId","getActivePresetId","laneAreaRef","horizontalScrollRef","setLaneWidth","measure","observer","ResizeObserver","observe","disconnect","safeViewStart","maxZoom","current","scroller","abs","scrollLeft","centerViewAt","resetView","handleReplay","replay","handleHorizontalScroll","handleTimelineWheel","delta","deltaX","deltaY","zoomDrag","rulerScrub","trackScrub","seekRuler","seekTrack","handleRulerPointerDown","altKey","ratio","pointerX","anchorRatio","anchorTime","moved","handleRulerPointerMove","dx","nextZoom","exp","nextDuration","finishRuler","handleTrackPointerDown","target","closest","finishTrack","handleCopy","normalized","normalizeTimelineValuesForCopy","clips","navigator","clipboard","writeText","buildCopyInstruction","name","setTimeout","handleAddPreset","savePreset","closePopover","openClipPopover","clip","stepKey","targetPath","key","getClipControls","clipPopoverExclusions","previous","anchor","top","right","bottom","toggleSet","setter","has","delete","add","toggleTracks","toggleGroup","handleBarClick","tracks","ticks","createMemo","rawStep","adaptive","find","majorStep","fineStep","major","medium","fine","firstMajor","push","firstFine","lastFine","floor","index","tick","rows","result","lastGroup","currentValues","group","collapsed","_el$19","_tmpl$9","_el$20","_el$21","_el$22","ChevronIcon","formatLabel","isProps","Boolean","tracksOpen","stat","computeClipStaticFromValues","selected","_el$23","_tmpl$1","_el$24","_el$26","_el$25","_tmpl$0","TimelineClip","timelineId","at","loop","steps","stepKeys","fixedDuration","isPhysics","composite","timelineDuration","selectedStepKey","onClick","onDrag","trackRef","track","candidate","prop","trackKey","trackMeta","trackSelected","_el$27","_tmpl$10","_el$28","_el$29","delay","baseAt","delayMode","_el$30","_tmpl$14","_el$31","_el$32","_el$33","_el$34","_el$35","_el$36","_el$37","_el$38","_el$41","ICON_ADD_PRESET","_el$51","_tmpl$15","PresetManager","panelId","onAdd","_el$52","_tmpl$16","_el$53","_el$54","_el$55","_v$19","_v$20","ICON_CLIPBOARD","board","_v$21","sparkle","_v$22","_el$39","_tmpl$11","_el$40","ICON_CHECK","_el$42","_tmpl$13","_el$43","_el$44","_el$45","_el$46","_ref$2","_el$56","_tmpl$17","_el$57","_tmpl$18","_el$58","_tmpl$19","_el$59","_el$47","_tmpl$12","_el$48","_el$49","_el$50","_ref$3","ClipPopover","onClose","_v$14","_v$15","_v$16","_v$17","_v$18","_el$60","_tmpl$20","_el$61","ICON_CHEVRON","ref","naturalHeight","setNaturalHeight","viewport","setViewport","readViewport","scrollHeight","querySelector","updateViewport","outside","contains","keydown","visualViewport","presentation","controls","title","from","getControlAt","findIndex","control","slice","formatStepLabel","durationMeta","durationValue","transitionDuration","type","value","onChange","updateValue","TIMELINE_MIN_CLIP_DURATION","displayValues","timelinePopoverDisplayValues","offsetLeft","offsetTop","above","below","placeAbove","availableHeight","renderedHeight","rawTop","_el$62","_tmpl$21","_el$63","_el$64","_el$65","_el$66","_el$67","_ref$4","ControlRenderer","_v$23","_v$24","_v$25","_v$26","_v$27","_v$28","_v$29","_v$30","n","s","h","innerWidth","map","exclusions","panel","getPanel","folder","findControl","filter","drag","dragging","setDragging","isSteps","handlePointerDown","mode","boundaryIndex","dataset","boundary","stepDurations","clickEl","handlePointerMove","dt","others","reduce","sum","stepIndex","clampStepResize","clampTrackDelay","clampClipMove","clampClipResizeEnd","clampClipResizeStart","updateValues","ghostCycles","cycles","first","offset","boundaries","total","resizable","durationText","formatSeconds","looping","cycle","_el$71","_tmpl$25","_el$72","_tmpl$26","_v$39","_v$40","_v$41","_v$42","_el$68","_tmpl$23","_el$73","_tmpl$27","_tmpl$22","_el$75","_tmpl$28","segmentWidth","_el$77","_tmpl$29","_el$78","_v$43","_v$44","_v$45","_el$79","_tmpl$30","_v$46","_v$47","_v$31","_v$32","_v$33","_v$34","_v$35","_v$36","_v$37","_v$38","_tmpl$24","_$delegateEvents","For","ButtonGroup","props","_el$","_tmpl$","_$insert","_$createComponent","each","buttons","children","button","_el$2","_tmpl$2","_$addEventListener","onClick","label","_$delegateEvents"]}
|