relly-ui 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -0
- package/dist/relly-ui.es.js +539 -484
- package/dist/relly-ui.es.js.map +1 -1
- package/dist/relly-ui.iife.js +12 -12
- package/dist/relly-ui.iife.js.map +1 -1
- package/dist/relly-ui.umd.js +12 -12
- package/dist/relly-ui.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/relly-ui.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relly-ui.es.js","sources":["../src/core/BaseComponent.ts","../src/components/Checkbox/Checkbox.ts","../src/components/Slider/Slider.ts","../src/components/Button/Button.ts","../src/components/Select/Select.ts","../src/components/DynamicLabel/DynamicLabel.ts","../src/components/Graph/Graph.ts","../src/components/ColorPicker/ColorPicker.ts","../src/components/Point2D/Point2D.ts","../src/components/Point3D/Point3D.ts","../src/components/Range/RangeSlider.ts","../src/components/Segmented/Segmented.ts","../src/components/Status/StatusIndicator.ts","../src/core/ComponentContainer.ts","../src/core/BindingEngine.ts","../src/core/PresetManager.ts","../src/core/ThemeManager.ts","../src/core/Draggable.ts","../src/core/Resizable.ts","../src/core/HotkeyManager.ts","../src/core/SearchBar.ts","../src/core/SoundEngine.ts","../src/core/ImportModal.ts","../src/core/SchemaLoader.ts","../src/core/ToastManager.ts","../src/core/ContextMenuManager.ts","../src/components/Tabs/Tab.ts","../src/components/Tabs/TabsManager.ts","../src/styles/injector.ts","../src/RellyUI.ts","../src/index.ts"],"sourcesContent":["import { BindingEngine, Listenable } from './BindingEngine';\nimport { PresetManager, SerializableComponent } from './PresetManager';\nimport { ConditionPredicate, IBaseComponent, OnChangeCallback, ContextMenuItem } from '../types';\n\nexport abstract class BaseComponent<T = any>\n implements IBaseComponent<T>, Listenable, SerializableComponent\n{\n public element: HTMLElement;\n protected labelEl: HTMLElement;\n protected controlEl: HTMLElement;\n\n protected label: string;\n protected tooltipText?: string;\n protected tooltipEl?: HTMLElement;\n protected conditionPredicate?: ConditionPredicate;\n protected targetObject?: any;\n protected property?: string;\n protected initialValue?: T;\n protected prevValue?: T;\n protected onChangeCallback?: OnChangeCallback<T>;\n protected isListening: boolean = false;\n protected contextMenuItems?: ContextMenuItem[];\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n protected bindingEngine?: BindingEngine,\n protected presetManager?: PresetManager\n ) {\n this.label = label;\n this.targetObject = targetObject;\n this.property = property;\n\n if (this.targetObject && this.property) {\n this.prevValue = this.targetObject[this.property];\n try {\n this.initialValue = JSON.parse(JSON.stringify(this.prevValue));\n } catch {\n this.initialValue = this.prevValue;\n }\n }\n\n // Create Base DOM\n this.element = document.createElement('div');\n this.element.className = 'relly-row';\n (this.element as any).__rellyComponent = this;\n\n this.labelEl = document.createElement('div');\n this.labelEl.className = 'relly-row-label';\n this.labelEl.textContent = label;\n this.element.appendChild(this.labelEl);\n\n this.controlEl = document.createElement('div');\n this.controlEl.className = 'relly-row-control';\n this.element.appendChild(this.controlEl);\n\n // Register with PresetManager if bound\n if (this.presetManager && this.getSerializableKey()) {\n this.presetManager.register(this);\n }\n }\n\n public setLabel(label: string): this {\n this.label = label;\n this.labelEl.textContent = label;\n return this;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public setTooltip(tooltip: string): this {\n this.tooltipText = tooltip;\n if (!this.tooltipEl) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'relly-tooltip';\n this.element.appendChild(this.tooltipEl);\n }\n this.tooltipEl.textContent = tooltip;\n return this;\n }\n\n public getTooltip(): string | undefined {\n return this.tooltipText;\n }\n\n public showIf(predicate: ConditionPredicate): this {\n this.conditionPredicate = predicate;\n this.checkVisibility();\n // Register to bindingEngine so it gets evaluated every frame\n if (this.bindingEngine && !this.isListening) {\n this.bindingEngine.register(this);\n }\n return this;\n }\n\n public checkVisibility(): boolean {\n if (!this.conditionPredicate) return true;\n const isVisible = this.conditionPredicate();\n this.element.style.display = isVisible ? '' : 'none';\n return isVisible;\n }\n\n public setContextMenu(items: ContextMenuItem[]): this {\n this.contextMenuItems = items;\n return this;\n }\n\n public getContextMenu(): ContextMenuItem[] | undefined {\n return this.contextMenuItems;\n }\n\n public reset(): this {\n if (this.initialValue !== undefined) {\n try {\n this.setValue(JSON.parse(JSON.stringify(this.initialValue)));\n } catch {\n this.setValue(this.initialValue);\n }\n }\n return this;\n }\n\n public onChange(callback: OnChangeCallback<T>): this {\n this.onChangeCallback = callback;\n return this;\n }\n\n public listen(): this {\n if (!this.isListening && this.bindingEngine && this.targetObject && this.property) {\n this.isListening = true;\n this.bindingEngine.register(this);\n }\n return this;\n }\n\n public getValue(): T {\n if (this.targetObject && this.property) {\n return this.targetObject[this.property];\n }\n return this.prevValue as T;\n }\n\n public setValue(value: T): this {\n const prev = this.getValue();\n if (this.targetObject && this.property) {\n this.targetObject[this.property] = value;\n }\n this.prevValue = value;\n this.update();\n if (prev !== value) {\n this.triggerChange(value, prev);\n this.presetManager?.notifyChange();\n }\n return this;\n }\n\n protected disabled: boolean = false;\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n const inputs = this.element.querySelectorAll<HTMLInputElement | HTMLButtonElement | HTMLSelectElement>('input, button, select');\n inputs.forEach(el => el.disabled = true);\n } else {\n this.element.classList.remove('relly-disabled');\n const inputs = this.element.querySelectorAll<HTMLInputElement | HTMLButtonElement | HTMLSelectElement>('input, button, select');\n inputs.forEach(el => el.disabled = false);\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public checkDirty(): void {\n this.checkVisibility();\n if (!this.targetObject || !this.property) return;\n const current = this.targetObject[this.property];\n if (current !== this.prevValue) {\n const prev = this.prevValue;\n this.prevValue = current;\n this.update();\n this.triggerChange(current, prev as T);\n }\n }\n\n protected triggerChange(value: T, prev: T): void {\n if (this.onChangeCallback) {\n this.onChangeCallback(value, prev);\n }\n }\n\n public getSerializableKey(): string | null {\n if (this.property) {\n return this.property;\n }\n return this.label || null;\n }\n\n /**\n * Updates the UI elements based on current value.\n * To be implemented by subclasses.\n */\n public abstract update(): this;\n\n public destroy(): void {\n if (this.isListening && this.bindingEngine) {\n this.bindingEngine.unregister(this);\n this.isListening = false;\n }\n if (this.presetManager) {\n this.presetManager.unregister(this);\n }\n this.element.remove();\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Checkbox extends BaseComponent<boolean> {\n private wrapperEl: HTMLElement;\n private boxEl: HTMLElement;\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-checkbox-wrapper';\n this.wrapperEl.setAttribute('role', 'checkbox');\n this.wrapperEl.setAttribute('tabindex', '0');\n\n this.boxEl = document.createElement('div');\n this.boxEl.className = 'relly-checkbox-box';\n\n // SVG checkmark\n this.boxEl.innerHTML = `\n <svg class=\"relly-checkbox-icon\" viewBox=\"0 0 12 10\">\n <polyline points=\"1.5 5 4.5 8.5 10.5 1.5\"></polyline>\n </svg>\n `;\n\n this.wrapperEl.appendChild(this.boxEl);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.wrapperEl.addEventListener('click', () => {\n const nextVal = !this.getValue();\n this.soundEngine?.playToggle(nextVal);\n this.setValue(nextVal);\n });\n\n this.wrapperEl.addEventListener('keydown', (e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n const nextVal = !this.getValue();\n this.soundEngine?.playToggle(nextVal);\n this.setValue(nextVal);\n }\n });\n\n this.update();\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.wrapperEl) return this;\n const isChecked = Boolean(this.getValue());\n this.wrapperEl.setAttribute('aria-checked', isChecked ? 'true' : 'false');\n if (isChecked) {\n this.wrapperEl.classList.add('relly-checked');\n } else {\n this.wrapperEl.classList.remove('relly-checked');\n }\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Slider extends BaseComponent<number> {\n private containerEl: HTMLElement;\n private rangeInput: HTMLInputElement;\n private numberInput: HTMLInputElement;\n private soundEngine?: SoundEngine;\n private lastSoundTime: number = 0;\n\n private min: number = 0;\n private max: number = 100;\n private step: number = 1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-slider-container';\n\n this.rangeInput = document.createElement('input');\n this.rangeInput.type = 'range';\n this.rangeInput.className = 'relly-slider-range';\n\n this.numberInput = document.createElement('input');\n this.numberInput.type = 'number';\n this.numberInput.className = 'relly-slider-number';\n this.numberInput.title = 'Drag horizontally to scrub value, or type directly';\n\n this.containerEl.appendChild(this.rangeInput);\n this.containerEl.appendChild(this.numberInput);\n this.controlEl.appendChild(this.containerEl);\n\n this.applyConstraints();\n\n // Range input change\n this.rangeInput.addEventListener('input', () => {\n const val = parseFloat(this.rangeInput.value);\n this.triggerSound();\n this.setValue(val);\n });\n\n // Number input change\n this.numberInput.addEventListener('change', () => {\n let val = parseFloat(this.numberInput.value);\n if (isNaN(val)) val = this.min;\n val = Math.max(this.min, Math.min(this.max, val));\n this.triggerSound();\n this.setValue(val);\n });\n\n // Virtual Jog-Dial / Drag Scrubbing on number input\n this.setupJogScrubbing();\n\n this.update();\n }\n\n private setupJogScrubbing(): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n const deltaVal = dx * stepDelta;\n let newVal = startVal + deltaVal;\n newVal = Math.max(this.min, Math.min(this.max, newVal));\n const decimals = (this.step.toString().split('.')[1] || '').length;\n newVal = parseFloat(newVal.toFixed(Math.max(decimals, 2)));\n this.triggerSound();\n this.setValue(newVal);\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n if (isScrubbing && typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n this.numberInput.addEventListener('mousedown', (e) => {\n startX = e.clientX;\n startVal = parseFloat(this.numberInput.value) || 0;\n isScrubbing = false;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n });\n }\n\n private triggerSound(): void {\n const now = Date.now();\n if (now - this.lastSoundTime > 35) {\n this.lastSoundTime = now;\n this.soundEngine?.playTick();\n }\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.applyConstraints();\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.applyConstraints();\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.applyConstraints();\n return this;\n }\n\n private applyConstraints(): void {\n this.rangeInput.min = this.min.toString();\n this.rangeInput.max = this.max.toString();\n this.rangeInput.step = this.step.toString();\n\n this.numberInput.min = this.min.toString();\n this.numberInput.max = this.max.toString();\n this.numberInput.step = this.step.toString();\n }\n\n public update(): this {\n if (!this.rangeInput || !this.numberInput) return this;\n const val = Number(this.getValue()) || 0;\n this.rangeInput.value = val.toString();\n this.numberInput.value = val.toString();\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { OnClickCallback } from '../../types';\n\nexport class Button extends BaseComponent<void> {\n private buttonEl: HTMLButtonElement;\n private clickHandler?: OnClickCallback;\n private soundEngine?: SoundEngine;\n\n constructor(label: string, onClick?: OnClickCallback, soundEngine?: SoundEngine) {\n super(label);\n this.soundEngine = soundEngine;\n\n // Buttons look best taking the full row or acting as a direct trigger\n this.labelEl.style.display = 'none';\n this.controlEl.style.flex = '1';\n\n this.buttonEl = document.createElement('button');\n this.buttonEl.className = 'relly-btn';\n this.buttonEl.textContent = label;\n this.controlEl.appendChild(this.buttonEl);\n\n if (onClick) {\n this.onClick(onClick);\n }\n\n this.buttonEl.addEventListener('click', (e) => {\n this.soundEngine?.playClick();\n if (this.clickHandler) {\n this.clickHandler(e);\n }\n });\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public override setLabel(label: string): this {\n super.setLabel(label);\n this.buttonEl.textContent = label;\n return this;\n }\n\n public onClick(callback: OnClickCallback): this {\n this.clickHandler = callback;\n return this;\n }\n\n public update(): this {\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\n\nexport class Select extends BaseComponent<any> {\n private selectEl: HTMLSelectElement;\n private optionsMap: Map<string, any> = new Map();\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n options?: any[] | Record<string, any>,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.selectEl = document.createElement('select');\n this.selectEl.className = 'relly-select-input';\n this.controlEl.appendChild(this.selectEl);\n\n if (options) {\n this.setOptions(options);\n }\n\n this.selectEl.addEventListener('change', () => {\n const selectedKey = this.selectEl.value;\n const actualValue = this.optionsMap.has(selectedKey)\n ? this.optionsMap.get(selectedKey)\n : selectedKey;\n this.setValue(actualValue);\n });\n\n this.update();\n }\n\n public setOptions(options: any[] | Record<string, any>): this {\n this.selectEl.innerHTML = '';\n this.optionsMap.clear();\n\n if (Array.isArray(options)) {\n for (const item of options) {\n const key = String(item);\n this.optionsMap.set(key, item);\n const optEl = document.createElement('option');\n optEl.value = key;\n optEl.textContent = key;\n this.selectEl.appendChild(optEl);\n }\n } else if (typeof options === 'object' && options !== null) {\n for (const [key, value] of Object.entries(options)) {\n this.optionsMap.set(key, value);\n const optEl = document.createElement('option');\n optEl.value = key;\n optEl.textContent = key;\n this.selectEl.appendChild(optEl);\n }\n }\n\n this.update();\n return this;\n }\n\n public update(): this {\n if (!this.selectEl) return this;\n const currentVal = this.getValue();\n for (const [key, val] of this.optionsMap.entries()) {\n if (val === currentVal || String(val) === String(currentVal)) {\n this.selectEl.value = key;\n return this;\n }\n }\n this.selectEl.value = String(currentVal);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\n\nexport type LabelFormatter = (value: any) => string;\n\nexport class DynamicLabel extends BaseComponent<any> {\n private valueBadge: HTMLElement;\n private formatter: LabelFormatter = (v) => String(v !== undefined && v !== null ? v : '');\n\n constructor(label: string, targetObject?: any, property?: string, bindingEngine?: BindingEngine) {\n super(label, targetObject, property, bindingEngine);\n\n this.valueBadge = document.createElement('span');\n this.valueBadge.className = 'relly-dynamic-value';\n this.controlEl.appendChild(this.valueBadge);\n\n this.update();\n }\n\n public setFormat(formatter: LabelFormatter): this {\n this.formatter = formatter;\n this.update();\n return this;\n }\n\n public update(): this {\n const val = this.getValue();\n this.valueBadge.textContent = this.formatter(val);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { GraphSeriesOptions } from '../../types';\n\nexport interface GraphSeries {\n id: string;\n label: string;\n color: string;\n fillColor?: string;\n buffer: number[];\n}\n\nexport class Graph extends BaseComponent<number | Record<string, number>> {\n private canvasContainer: HTMLElement;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D | null = null;\n private statsEl: HTMLElement;\n private graphTooltipEl: HTMLElement;\n private legendEl: HTMLElement;\n\n private primarySeries: GraphSeries;\n private seriesList: GraphSeries[] = [];\n private seriesMap: Map<string, GraphSeries> = new Map();\n\n private bufferSize: number = 60;\n private min: number = 0;\n private max: number = 100;\n private autoRange: boolean = true;\n private smoothCurves: boolean = true;\n private isPaused: boolean = false;\n private formatter: (val: number) => string = (v) =>\n typeof v === 'number' && !isNaN(v) ? v.toFixed(1) : '0';\n\n private cssWidth: number = 280;\n private cssHeight: number = 90;\n\n private sampleInterval: number = 50;\n private lastSampleTime: number = 0;\n\n private hoverIndex: number | null = null;\n\n private resizeObserver: ResizeObserver | null = null;\n private mediaQueryList: MediaQueryList | null = null;\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n bindingEngine?: BindingEngine,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine);\n this.soundEngine = soundEngine;\n\n // Graph row layout\n this.element.className = 'relly-graph-row';\n this.element.innerHTML = '';\n\n const header = document.createElement('div');\n header.className = 'relly-graph-header';\n\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'relly-graph-label';\n this.labelEl.textContent = label;\n\n this.statsEl = document.createElement('div');\n this.statsEl.className = 'relly-graph-stats';\n this.statsEl.innerHTML = `<span class=\"relly-graph-val\">0</span>`;\n\n header.appendChild(this.labelEl);\n header.appendChild(this.statsEl);\n this.element.appendChild(header);\n\n // Multi-series legend (initially empty)\n this.legendEl = document.createElement('div');\n this.legendEl.className = 'relly-graph-legend';\n this.element.appendChild(this.legendEl);\n\n // Canvas container\n this.canvasContainer = document.createElement('div');\n this.canvasContainer.className = 'relly-graph-canvas-container';\n this.canvasContainer.title = 'Click to pause/freeze data stream for inspection';\n\n this.canvas = document.createElement('canvas');\n this.canvas.className = 'relly-graph-canvas';\n this.canvasContainer.appendChild(this.canvas);\n\n // Interactive tooltip overlay\n this.graphTooltipEl = document.createElement('div');\n this.graphTooltipEl.className = 'relly-graph-tooltip';\n this.canvasContainer.appendChild(this.graphTooltipEl);\n\n this.element.appendChild(this.canvasContainer);\n\n this.ctx = this.canvas.getContext('2d');\n\n // Initialize primary series\n this.primarySeries = {\n id: 'default',\n label: label,\n color: '#38bdf8',\n fillColor: 'rgba(56, 189, 248, 0.25)',\n buffer: []\n };\n this.seriesList.push(this.primarySeries);\n this.seriesMap.set('default', this.primarySeries);\n\n this.initCanvasSize();\n this.setupListeners();\n this.update();\n\n if (this.bindingEngine && this.targetObject && this.property) {\n this.listen();\n }\n }\n\n private setupListeners(): void {\n if (typeof window === 'undefined') return;\n\n // ResizeObserver on canvasContainer for crisp 1:1 pixel rendering\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => {\n this.resizeCanvas();\n this.draw();\n });\n this.resizeObserver.observe(this.canvasContainer);\n }\n\n // MatchMedia listener to handle zoom changes\n this.updateDPRListener();\n\n // Hover inspector events (silent, no tick sound on move)\n this.canvas.addEventListener('mousemove', this.onMouseMove);\n this.canvas.addEventListener('mouseleave', this.onMouseLeave);\n\n // Click event on canvas: plays click sound and toggles pause/freeze\n this.canvas.addEventListener('click', this.onCanvasClick);\n }\n\n private updateDPRListener(): void {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const dpr = window.devicePixelRatio || 1;\n this.mediaQueryList?.removeEventListener('change', this.onResolutionChange);\n this.mediaQueryList = window.matchMedia(`(resolution: ${dpr}dppx)`);\n this.mediaQueryList.addEventListener('change', this.onResolutionChange);\n }\n\n private onResolutionChange = (): void => {\n this.updateDPRListener();\n this.resizeCanvas();\n this.draw();\n };\n\n private initCanvasSize(): void {\n this.resizeCanvas();\n }\n\n private resizeCanvas(): void {\n if (!this.canvas || !this.canvasContainer) return;\n const rect = this.canvasContainer.getBoundingClientRect();\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const w = Math.max(10, Math.floor(rect.width || 280));\n const h = Math.max(10, Math.floor(rect.height || 80));\n\n this.cssWidth = w;\n this.cssHeight = h;\n\n this.canvas.width = Math.round(w * dpr);\n this.canvas.height = Math.round(h * dpr);\n\n if (this.ctx) {\n if (typeof this.ctx.resetTransform === 'function') {\n this.ctx.resetTransform();\n } else {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n this.ctx.scale(dpr, dpr);\n }\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const width = this.cssWidth;\n\n if (width <= 0) return;\n\n const step = width / Math.max(1, this.bufferSize - 1);\n const index = Math.round(x / step);\n const clampedIndex = Math.max(0, Math.min(this.bufferSize - 1, index));\n\n if (clampedIndex !== this.hoverIndex) {\n this.hoverIndex = clampedIndex;\n this.updateTooltip(x);\n this.draw();\n }\n };\n\n private onMouseLeave = (): void => {\n this.hoverIndex = null;\n this.graphTooltipEl.classList.remove('relly-tooltip-show');\n this.draw();\n };\n\n private onCanvasClick = (): void => {\n this.soundEngine?.playClick();\n this.isPaused = !this.isPaused;\n if (this.isPaused) {\n this.canvasContainer.classList.add('relly-graph-paused');\n } else {\n this.canvasContainer.classList.remove('relly-graph-paused');\n }\n this.updateStats();\n this.draw();\n };\n\n private updateTooltip(crosshairX: number): void {\n if (this.hoverIndex === null) return;\n\n let html = '';\n for (const series of this.seriesList) {\n const startIndex = this.bufferSize - series.buffer.length;\n const bufIdx = this.hoverIndex - startIndex;\n if (bufIdx >= 0 && bufIdx < series.buffer.length) {\n const val = series.buffer[bufIdx];\n html += `<div><span style=\"display:inline-block;width:6px;height:6px;border-radius:50%;background:${series.color};margin-right:4px;\"></span>${series.label}: <b>${this.formatter(val)}</b></div>`;\n }\n }\n\n if (!html) {\n this.graphTooltipEl.classList.remove('relly-tooltip-show');\n return;\n }\n\n this.graphTooltipEl.innerHTML = html;\n this.graphTooltipEl.classList.add('relly-tooltip-show');\n\n // Position tooltip clamping inside container\n const tooltipWidth = this.graphTooltipEl.offsetWidth || 80;\n let leftPos = crosshairX;\n if (leftPos - tooltipWidth / 2 < 4) {\n leftPos = 4 + tooltipWidth / 2;\n } else if (leftPos + tooltipWidth / 2 > this.cssWidth - 4) {\n leftPos = this.cssWidth - 4 - tooltipWidth / 2;\n }\n\n this.graphTooltipEl.style.left = `${leftPos}px`;\n this.graphTooltipEl.style.top = '14px';\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public togglePause(): this {\n this.onCanvasClick();\n return this;\n }\n\n public setPaused(paused: boolean): this {\n if (this.isPaused !== paused) {\n this.onCanvasClick();\n }\n return this;\n }\n\n public isGraphPaused(): boolean {\n return this.isPaused;\n }\n\n public setSampleInterval(ms: number): this {\n this.sampleInterval = Math.max(10, ms);\n return this;\n }\n\n public getSampleInterval(): number {\n return this.sampleInterval;\n }\n\n public override checkDirty(): void {\n this.checkVisibility();\n if (!this.targetObject || !this.property || this.isPaused) return;\n\n const current = this.targetObject[this.property];\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n if (now - this.lastSampleTime >= this.sampleInterval || current !== this.prevValue) {\n this.lastSampleTime = now;\n this.prevValue = current;\n this.update();\n this.triggerChange(current, this.prevValue as any);\n }\n }\n\n public setSmooth(smooth: boolean): this {\n this.smoothCurves = smooth;\n this.draw();\n return this;\n }\n\n public setFormat(fn: (val: number) => string): this {\n this.formatter = fn;\n this.updateStats();\n return this;\n }\n\n public setRange(min: number, max: number): this {\n this.min = min;\n this.max = max;\n this.autoRange = false;\n this.draw();\n return this;\n }\n\n public setAutoRange(enabled: boolean): this {\n this.autoRange = enabled;\n this.draw();\n return this;\n }\n\n public setColor(lineColor: string, fillColor?: string): this {\n this.primarySeries.color = lineColor;\n this.primarySeries.fillColor = fillColor || `${lineColor}33`;\n this.draw();\n return this;\n }\n\n public setBufferSize(size: number): this {\n this.bufferSize = Math.max(10, size);\n for (const s of this.seriesList) {\n while (s.buffer.length > this.bufferSize) {\n s.buffer.shift();\n }\n }\n this.draw();\n return this;\n }\n\n public setHeight(height: number): this {\n this.cssHeight = height;\n this.canvasContainer.style.height = `${height}px`;\n this.resizeCanvas();\n this.draw();\n return this;\n }\n\n public addSeries(id: string, options: GraphSeriesOptions): this {\n const series: GraphSeries = {\n id,\n label: options.label || id,\n color: options.color,\n fillColor: options.fillColor || `${options.color}33`,\n buffer: []\n };\n this.seriesList.push(series);\n this.seriesMap.set(id, series);\n\n this.updateLegend();\n this.draw();\n return this;\n }\n\n private updateLegend(): void {\n if (this.seriesList.length <= 1) {\n this.legendEl.style.display = 'none';\n return;\n }\n\n this.legendEl.style.display = 'flex';\n this.legendEl.innerHTML = '';\n\n for (const series of this.seriesList) {\n const item = document.createElement('div');\n item.className = 'relly-graph-legend-item';\n item.innerHTML = `\n <span class=\"relly-graph-legend-dot\" style=\"background-color: ${series.color}\"></span>\n <span class=\"relly-graph-legend-label\">${series.label}</span>\n `;\n this.legendEl.appendChild(item);\n }\n }\n\n public push(val: number | Record<string, number>): this {\n if (this.isPaused) return this;\n\n if (typeof val === 'number') {\n if (isNaN(val) || !isFinite(val)) return this;\n this.primarySeries.buffer.push(val);\n if (this.primarySeries.buffer.length > this.bufferSize) {\n this.primarySeries.buffer.shift();\n }\n } else if (typeof val === 'object' && val !== null) {\n for (const [key, numVal] of Object.entries(val)) {\n if (typeof numVal === 'number' && !isNaN(numVal) && isFinite(numVal)) {\n this.pushSeries(key, numVal);\n }\n }\n }\n\n this.updateStats();\n this.draw();\n return this;\n }\n\n public pushSeries(id: string, val: number): this {\n if (this.isPaused) return this;\n if (typeof val !== 'number' || isNaN(val) || !isFinite(val)) return this;\n const series = this.seriesMap.get(id);\n if (!series) {\n this.addSeries(id, { color: '#ec4899', label: id });\n return this.pushSeries(id, val);\n }\n\n series.buffer.push(val);\n if (series.buffer.length > this.bufferSize) {\n series.buffer.shift();\n }\n return this;\n }\n\n private updateStats(): void {\n const latestVal =\n this.primarySeries.buffer.length > 0\n ? this.primarySeries.buffer[this.primarySeries.buffer.length - 1]\n : 0;\n\n let min = this.min;\n let max = this.max;\n\n let allVals: number[] = [];\n for (const s of this.seriesList) {\n allVals = allVals.concat(s.buffer);\n }\n\n if (allVals.length > 0) {\n min = Math.min(...allVals);\n max = Math.max(...allVals);\n }\n\n const pausedBadge = this.isPaused\n ? `<span class=\"relly-graph-badge relly-graph-badge--paused\">PAUSED</span>`\n : '';\n\n this.statsEl.innerHTML = `\n ${pausedBadge}\n <span class=\"relly-graph-badge relly-graph-badge--min\">min: ${this.formatter(min)}</span>\n <span class=\"relly-graph-badge relly-graph-badge--max\">max: ${this.formatter(max)}</span>\n <span class=\"relly-graph-val\">${this.formatter(latestVal)}</span>\n `;\n }\n\n public update(): this {\n const val = this.getValue();\n if (typeof val === 'number') {\n this.push(val);\n } else if (typeof val === 'object' && val !== null) {\n this.push(val as Record<string, number>);\n }\n\n // Auto-sample registered series from targetObject if available\n if (this.targetObject) {\n for (const series of this.seriesList) {\n if (series.id !== 'default' && typeof this.targetObject[series.id] === 'number') {\n this.pushSeries(series.id, this.targetObject[series.id]);\n }\n }\n }\n return this;\n }\n\n private draw(): void {\n if (!this.ctx) return;\n const ctx = this.ctx;\n const width = this.cssWidth;\n const height = this.cssHeight;\n\n ctx.clearRect(0, 0, width, height);\n\n // Draw background grid lines (25%, 50%, 75%)\n ctx.save();\n ctx.setLineDash([2, 4]);\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.08)';\n ctx.lineWidth = 1;\n\n for (let p of [0.25, 0.5, 0.75]) {\n const y = Math.round(height * p);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n ctx.stroke();\n }\n ctx.restore();\n\n // Collect all values to calculate global bounds with generous headroom\n let allVals: number[] = [];\n for (const s of this.seriesList) {\n allVals = allVals.concat(s.buffer);\n }\n\n if (allVals.length === 0) return;\n\n const minVal = Math.min(...allVals);\n const maxVal = Math.max(...allVals);\n\n let min = this.autoRange ? minVal : this.min;\n let max = this.autoRange ? maxVal : this.max;\n\n // Headroom protection: if actual values exceed max or min, expand range so it NEVER clips or flies off\n if (maxVal > max) max = maxVal;\n if (minVal < min) min = minVal;\n\n if (min === max) {\n min -= 1;\n max += 1;\n }\n\n // 16% top/bottom headroom padding so peak values don't touch the canvas ceiling\n const pad = (max - min) * 0.16 || 1;\n min -= pad;\n max += pad;\n\n const range = max - min || 1;\n const step = width / Math.max(1, this.bufferSize - 1);\n\n // Draw each series\n for (const series of this.seriesList) {\n if (series.buffer.length === 0) continue;\n\n const bufferToRender =\n series.buffer.length === 1 ? [series.buffer[0], series.buffer[0]] : series.buffer;\n const startIndex = this.bufferSize - bufferToRender.length;\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < bufferToRender.length; i++) {\n const x = (startIndex + i) * step;\n const normalized = Math.max(0, Math.min(1, (bufferToRender[i] - min) / range));\n // Clamped y coordinate strictly between 4px and height - 4px\n const y = Math.max(4, Math.min(height - 4, height - 6 - normalized * (height - 12)));\n points.push({ x, y });\n }\n\n // Draw Gradient Area Fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, height);\n ctx.lineTo(points[0].x, points[0].y);\n\n if (this.smoothCurves && points.length > 2) {\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midX = (p0.x + p1.x) / 2;\n ctx.bezierCurveTo(midX, p0.y, midX, p1.y, p1.x, p1.y);\n }\n } else {\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n }\n\n ctx.lineTo(points[points.length - 1].x, height);\n ctx.closePath();\n\n const gradient = ctx.createLinearGradient(0, 0, 0, height);\n gradient.addColorStop(0, series.fillColor || `${series.color}40`);\n gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n ctx.fillStyle = gradient;\n ctx.fill();\n\n // Draw Glowing Stroke Line\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n\n if (this.smoothCurves && points.length > 2) {\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midX = (p0.x + p1.x) / 2;\n ctx.bezierCurveTo(midX, p0.y, midX, p1.y, p1.x, p1.y);\n }\n } else {\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n }\n\n ctx.save();\n ctx.strokeStyle = series.color;\n ctx.lineWidth = 2.0;\n ctx.shadowColor = series.color;\n ctx.shadowBlur = 5;\n ctx.stroke();\n ctx.restore();\n\n // Live Pulse Dot on the newest (rightmost) value\n const lastPoint = points[points.length - 1];\n if (lastPoint) {\n ctx.beginPath();\n ctx.arc(lastPoint.x, lastPoint.y, 4, 0, Math.PI * 2);\n ctx.fillStyle = series.color;\n ctx.globalAlpha = 0.35;\n ctx.fill();\n ctx.globalAlpha = 1;\n\n ctx.beginPath();\n ctx.arc(lastPoint.x, lastPoint.y, 2, 0, Math.PI * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n }\n }\n\n // Interactive Hover Crosshair\n if (this.hoverIndex !== null) {\n const crosshairX = Math.round(this.hoverIndex * step);\n ctx.save();\n ctx.setLineDash([3, 3]);\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.45)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(crosshairX, 0);\n ctx.lineTo(crosshairX, height);\n ctx.stroke();\n ctx.restore();\n\n // Highlight point for each series at hover position\n for (const series of this.seriesList) {\n const startIndex = this.bufferSize - series.buffer.length;\n const bufIdx = this.hoverIndex - startIndex;\n if (bufIdx >= 0 && bufIdx < series.buffer.length) {\n const val = series.buffer[bufIdx];\n const normalized = Math.max(0, Math.min(1, (val - min) / range));\n const y = Math.max(4, Math.min(height - 4, height - 6 - normalized * (height - 12)));\n\n ctx.beginPath();\n ctx.arc(crosshairX, y, 4.5, 0, Math.PI * 2);\n ctx.fillStyle = series.color;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(crosshairX, y, 2, 0, Math.PI * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n }\n }\n }\n }\n\n public destroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n if (this.mediaQueryList) {\n this.mediaQueryList.removeEventListener('change', this.onResolutionChange);\n this.mediaQueryList = null;\n }\n this.canvas.removeEventListener('mousemove', this.onMouseMove);\n this.canvas.removeEventListener('mouseleave', this.onMouseLeave);\n this.canvas.removeEventListener('click', this.onCanvasClick);\n super.destroy();\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class ColorPicker extends BaseComponent<string> {\n private wrapperEl: HTMLElement;\n private previewEl: HTMLElement;\n private hexTextEl: HTMLElement;\n private nativeColorInput: HTMLInputElement;\n private eyeDropperBtn?: HTMLButtonElement;\n private swatchesContainer?: HTMLElement;\n private swatches: string[] = [];\n private swatchButtons: Map<string, HTMLElement> = new Map();\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-color-wrapper';\n\n this.previewEl = document.createElement('div');\n this.previewEl.className = 'relly-color-preview';\n this.previewEl.title = 'Click to open color palette';\n\n this.hexTextEl = document.createElement('span');\n this.hexTextEl.className = 'relly-color-text';\n\n this.nativeColorInput = document.createElement('input');\n this.nativeColorInput.type = 'color';\n this.nativeColorInput.className = 'relly-color-native';\n\n this.wrapperEl.appendChild(this.previewEl);\n this.wrapperEl.appendChild(this.hexTextEl);\n this.wrapperEl.appendChild(this.nativeColorInput);\n\n // EyeDropper API (Pick color from screen)\n if (typeof window !== 'undefined' && 'EyeDropper' in window) {\n this.eyeDropperBtn = document.createElement('button');\n this.eyeDropperBtn.type = 'button';\n this.eyeDropperBtn.className = 'relly-eyedropper-btn';\n this.eyeDropperBtn.title = 'Pick color from screen';\n this.eyeDropperBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"m14 7 3 3m-1-5a2.83 2.83 0 0 1 4 4L7 22H3v-4L16 5Z\"></path>\n </svg>\n `;\n this.eyeDropperBtn.addEventListener('click', async () => {\n try {\n const eyeDropper = new (window as any).EyeDropper();\n const result = await eyeDropper.open();\n if (result && result.sRGBHex) {\n this.setValue(result.sRGBHex);\n }\n } catch {\n // User cancelled picker\n }\n });\n this.wrapperEl.appendChild(this.eyeDropperBtn);\n }\n\n this.controlEl.appendChild(this.wrapperEl);\n\n this.previewEl.addEventListener('click', () => {\n this.nativeColorInput.click();\n });\n\n this.nativeColorInput.addEventListener('input', () => {\n const color = this.nativeColorInput.value;\n this.setValue(color);\n });\n\n this.update();\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public setSwatches(swatches: string[]): this {\n this.swatches = swatches;\n if (!this.swatchesContainer) {\n this.swatchesContainer = document.createElement('div');\n this.swatchesContainer.className = 'relly-color-swatches';\n this.wrapperEl.insertBefore(this.swatchesContainer, this.previewEl);\n }\n\n this.swatchesContainer.innerHTML = '';\n this.swatchButtons.clear();\n\n for (const color of this.swatches) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-color-swatch';\n btn.style.backgroundColor = color;\n btn.title = color.toUpperCase();\n btn.addEventListener('click', () => {\n this.setValue(color);\n this.soundEngine?.playClick();\n });\n this.swatchesContainer.appendChild(btn);\n this.swatchButtons.set(color.toLowerCase(), btn);\n }\n\n this.update();\n return this;\n }\n\n public getSwatches(): string[] {\n return [...this.swatches];\n }\n\n public update(): this {\n if (!this.previewEl || !this.hexTextEl) return this;\n const color = String(this.getValue() || '#000000');\n this.previewEl.style.backgroundColor = color;\n this.hexTextEl.textContent = color.toUpperCase();\n if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n this.nativeColorInput.value =\n color.length === 4\n ? `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}`\n : color;\n }\n\n // Update active swatch highlighting\n const lower = color.toLowerCase();\n for (const [swatchColor, btn] of this.swatchButtons.entries()) {\n if (swatchColor === lower) {\n btn.classList.add('relly-swatch-active');\n } else {\n btn.classList.remove('relly-swatch-active');\n }\n }\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\n\nexport type Point2DVal = { x: number; y: number } | [number, number];\n\nexport class Point2D extends BaseComponent<Point2DVal> {\n private containerEl: HTMLElement;\n private xInput: HTMLInputElement;\n private yInput: HTMLInputElement;\n\n private min?: number;\n private max?: number;\n private step: number = 0.1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-point2d-container';\n\n // X item\n const xItem = document.createElement('div');\n xItem.className = 'relly-point2d-item';\n const xTag = document.createElement('span');\n xTag.className = 'relly-point2d-tag';\n xTag.textContent = 'X';\n this.xInput = document.createElement('input');\n this.xInput.type = 'number';\n this.xInput.className = 'relly-point2d-input';\n this.xInput.step = String(this.step);\n xItem.appendChild(xTag);\n xItem.appendChild(this.xInput);\n\n // Y item\n const yItem = document.createElement('div');\n yItem.className = 'relly-point2d-item';\n const yTag = document.createElement('span');\n yTag.className = 'relly-point2d-tag';\n yTag.textContent = 'Y';\n this.yInput = document.createElement('input');\n this.yInput.type = 'number';\n this.yInput.className = 'relly-point2d-input';\n this.yInput.step = String(this.step);\n yItem.appendChild(yTag);\n yItem.appendChild(this.yInput);\n\n this.containerEl.appendChild(xItem);\n this.containerEl.appendChild(yItem);\n this.controlEl.appendChild(this.containerEl);\n\n this.xInput.addEventListener('change', () => this.handleInputChange());\n this.yInput.addEventListener('change', () => this.handleInputChange());\n\n this.setupInputScrubbing(this.xInput, 'x');\n this.setupInputScrubbing(this.yInput, 'y');\n\n this.update();\n }\n\n private setupInputScrubbing(input: HTMLInputElement, axis: 'x' | 'y'): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n let newVal = startVal + dx * stepDelta;\n if (this.min !== undefined) newVal = Math.max(this.min, newVal);\n if (this.max !== undefined) newVal = Math.min(this.max, newVal);\n const decimals = (this.step.toString().split('.')[1] || '').length;\n newVal = parseFloat(newVal.toFixed(Math.max(decimals, 2)));\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n const nextArr: [number, number] = [currentVal[0], currentVal[1]];\n nextArr[axis === 'x' ? 0 : 1] = newVal;\n this.setValue(nextArr);\n } else {\n this.setValue({ ...currentVal, [axis]: newVal });\n }\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n if (isScrubbing && typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n input.addEventListener('mousedown', (e) => {\n startX = e.clientX;\n startVal = parseFloat(input.value) || 0;\n isScrubbing = false;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n });\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.xInput.min = String(min);\n this.yInput.min = String(min);\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.xInput.max = String(max);\n this.yInput.max = String(max);\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.xInput.step = String(step);\n this.yInput.step = String(step);\n return this;\n }\n\n public override getValue(): Point2DVal {\n if (this.targetObject && this.property && this.targetObject[this.property] !== undefined) {\n return this.targetObject[this.property];\n }\n if (this.targetObject && 'x' in this.targetObject && 'y' in this.targetObject) {\n return this.targetObject;\n }\n return (this.prevValue as Point2DVal) || { x: 0, y: 0 };\n }\n\n public override setValue(value: Point2DVal): this {\n const rawPrev = this.getValue();\n const prev = Array.isArray(rawPrev)\n ? [...rawPrev]\n : typeof rawPrev === 'object' && rawPrev !== null\n ? { ...rawPrev }\n : rawPrev;\n\n if (this.targetObject && this.property && this.targetObject[this.property] !== undefined) {\n this.targetObject[this.property] = value;\n } else if (\n this.targetObject &&\n 'x' in this.targetObject &&\n 'y' in this.targetObject &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n this.targetObject.x = value.x;\n this.targetObject.y = value.y;\n }\n this.prevValue = value;\n this.update();\n this.triggerChange(value, prev as Point2DVal);\n return this;\n }\n\n private handleInputChange(): void {\n let x = parseFloat(this.xInput.value) || 0;\n let y = parseFloat(this.yInput.value) || 0;\n\n if (this.min !== undefined) {\n x = Math.max(this.min, x);\n y = Math.max(this.min, y);\n }\n if (this.max !== undefined) {\n x = Math.min(this.max, x);\n y = Math.min(this.max, y);\n }\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n this.setValue([x, y]);\n } else {\n this.setValue({ ...currentVal, x, y });\n }\n }\n\n public update(): this {\n if (!this.xInput || !this.yInput) return this;\n const val = this.getValue();\n let x = 0;\n let y = 0;\n\n if (Array.isArray(val)) {\n x = val[0] || 0;\n y = val[1] || 0;\n } else if (typeof val === 'object' && val !== null) {\n x = (val as any).x || 0;\n y = (val as any).y || 0;\n }\n\n this.xInput.value = String(x);\n this.yInput.value = String(y);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { Point3DVal } from '../../types';\n\nexport class Point3D extends BaseComponent<Point3DVal> {\n private containerEl: HTMLElement;\n private xInput: HTMLInputElement;\n private yInput: HTMLInputElement;\n private zInput: HTMLInputElement;\n\n private min?: number;\n private max?: number;\n private step: number = 0.1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-point3d-container';\n\n // X item\n const xItem = document.createElement('div');\n xItem.className = 'relly-point3d-item';\n const xTag = document.createElement('span');\n xTag.className = 'relly-point3d-tag relly-point3d-tag--x';\n xTag.textContent = 'X';\n this.xInput = document.createElement('input');\n this.xInput.type = 'number';\n this.xInput.className = 'relly-point3d-input';\n this.xInput.step = String(this.step);\n xItem.appendChild(xTag);\n xItem.appendChild(this.xInput);\n\n // Y item\n const yItem = document.createElement('div');\n yItem.className = 'relly-point3d-item';\n const yTag = document.createElement('span');\n yTag.className = 'relly-point3d-tag relly-point3d-tag--y';\n yTag.textContent = 'Y';\n this.yInput = document.createElement('input');\n this.yInput.type = 'number';\n this.yInput.className = 'relly-point3d-input';\n this.yInput.step = String(this.step);\n yItem.appendChild(yTag);\n yItem.appendChild(this.yInput);\n\n // Z item\n const zItem = document.createElement('div');\n zItem.className = 'relly-point3d-item';\n const zTag = document.createElement('span');\n zTag.className = 'relly-point3d-tag relly-point3d-tag--z';\n zTag.textContent = 'Z';\n this.zInput = document.createElement('input');\n this.zInput.type = 'number';\n this.zInput.className = 'relly-point3d-input';\n this.zInput.step = String(this.step);\n zItem.appendChild(zTag);\n zItem.appendChild(this.zInput);\n\n this.containerEl.appendChild(xItem);\n this.containerEl.appendChild(yItem);\n this.containerEl.appendChild(zItem);\n this.controlEl.appendChild(this.containerEl);\n\n this.xInput.addEventListener('change', () => this.handleInputChange());\n this.yInput.addEventListener('change', () => this.handleInputChange());\n this.zInput.addEventListener('change', () => this.handleInputChange());\n\n this.setupInputScrubbing(this.xInput, 'x');\n this.setupInputScrubbing(this.yInput, 'y');\n this.setupInputScrubbing(this.zInput, 'z');\n\n this.update();\n }\n\n private setupInputScrubbing(input: HTMLInputElement, axis: 'x' | 'y' | 'z'): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n let newVal = startVal + dx * stepDelta;\n if (this.min !== undefined) newVal = Math.max(this.min, newVal);\n if (this.max !== undefined) newVal = Math.min(this.max, newVal);\n const decimals = (this.step.toString().split('.')[1] || '').length;\n newVal = parseFloat(newVal.toFixed(Math.max(decimals, 2)));\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n const nextArr: [number, number, number] = [\n currentVal[0] ?? 0,\n currentVal[1] ?? 0,\n currentVal[2] ?? 0\n ];\n const idx = axis === 'x' ? 0 : axis === 'y' ? 1 : 2;\n nextArr[idx] = newVal;\n this.setValue(nextArr);\n } else {\n this.setValue({ ...currentVal, [axis]: newVal });\n }\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n if (isScrubbing) {\n isScrubbing = false;\n if (typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n }\n };\n\n input.addEventListener('mousedown', (ev: MouseEvent) => {\n if (ev.button !== 0) return;\n startX = ev.clientX;\n startVal = parseFloat(input.value) || 0;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private handleInputChange(): void {\n const x = parseFloat(this.xInput.value) || 0;\n const y = parseFloat(this.yInput.value) || 0;\n const z = parseFloat(this.zInput.value) || 0;\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n this.setValue([x, y, z]);\n } else {\n this.setValue({\n ...(typeof currentVal === 'object' && currentVal !== null ? currentVal : {}),\n x,\n y,\n z\n });\n }\n }\n\n public setMin(min?: number): this {\n this.min = min;\n if (min !== undefined) {\n this.xInput.min = min.toString();\n this.yInput.min = min.toString();\n this.zInput.min = min.toString();\n } else {\n this.xInput.removeAttribute('min');\n this.yInput.removeAttribute('min');\n this.zInput.removeAttribute('min');\n }\n return this;\n }\n\n public setMax(max?: number): this {\n this.max = max;\n if (max !== undefined) {\n this.xInput.max = max.toString();\n this.yInput.max = max.toString();\n this.zInput.max = max.toString();\n } else {\n this.xInput.removeAttribute('max');\n this.yInput.removeAttribute('max');\n this.zInput.removeAttribute('max');\n }\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.xInput.step = step.toString();\n this.yInput.step = step.toString();\n this.zInput.step = step.toString();\n return this;\n }\n\n public update(): this {\n if (!this.xInput || !this.yInput || !this.zInput) return this;\n const val = this.getValue();\n let x = 0;\n let y = 0;\n let z = 0;\n\n if (Array.isArray(val)) {\n x = val[0] || 0;\n y = val[1] || 0;\n z = val[2] || 0;\n } else if (typeof val === 'object' && val !== null) {\n x = (val as any).x || 0;\n y = (val as any).y || 0;\n z = (val as any).z || 0;\n }\n\n this.xInput.value = String(x);\n this.yInput.value = String(y);\n this.zInput.value = String(z);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { RangeVal } from '../../types';\n\nexport class RangeSlider extends BaseComponent<RangeVal> {\n private wrapperEl: HTMLElement;\n private trackEl: HTMLElement;\n private barEl: HTMLElement;\n private thumbMin: HTMLElement;\n private thumbMax: HTMLElement;\n private inputMin: HTMLInputElement;\n private inputMax: HTMLInputElement;\n\n private min: number = 0;\n private max: number = 100;\n private step: number = 1;\n private soundEngine?: SoundEngine;\n private formatter: (min: number, max: number) => string = (a, b) =>\n `[${a.toFixed(1)}, ${b.toFixed(1)}]`;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-range-wrapper';\n\n // Min input\n this.inputMin = document.createElement('input');\n this.inputMin.type = 'number';\n this.inputMin.className = 'relly-range-input relly-range-input--min';\n\n // Track\n this.trackEl = document.createElement('div');\n this.trackEl.className = 'relly-range-track';\n\n this.barEl = document.createElement('div');\n this.barEl.className = 'relly-range-bar';\n\n this.thumbMin = document.createElement('div');\n this.thumbMin.className = 'relly-range-thumb relly-range-thumb--min';\n this.thumbMin.title = 'Drag min';\n\n this.thumbMax = document.createElement('div');\n this.thumbMax.className = 'relly-range-thumb relly-range-thumb--max';\n this.thumbMax.title = 'Drag max';\n\n this.trackEl.appendChild(this.barEl);\n this.trackEl.appendChild(this.thumbMin);\n this.trackEl.appendChild(this.thumbMax);\n\n // Max input\n this.inputMax = document.createElement('input');\n this.inputMax.type = 'number';\n this.inputMax.className = 'relly-range-input relly-range-input--max';\n\n this.wrapperEl.appendChild(this.inputMin);\n this.wrapperEl.appendChild(this.trackEl);\n this.wrapperEl.appendChild(this.inputMax);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.setupListeners();\n this.update();\n }\n\n private setupListeners(): void {\n // Manual input typing\n this.inputMin.addEventListener('change', () => {\n const vMin = parseFloat(this.inputMin.value) || this.min;\n const [_, curMax] = this.getCurrentRange();\n this.setRangeValue(Math.min(vMin, curMax), curMax);\n });\n\n this.inputMax.addEventListener('change', () => {\n const vMax = parseFloat(this.inputMax.value) || this.max;\n const [curMin, _] = this.getCurrentRange();\n this.setRangeValue(curMin, Math.max(vMax, curMin));\n });\n\n // Dragging thumb min\n this.setupThumbDrag(this.thumbMin, 'min');\n\n // Dragging thumb max\n this.setupThumbDrag(this.thumbMax, 'max');\n\n // Dragging range bar (shifts whole interval)\n this.setupBarDrag();\n }\n\n private setupThumbDrag(thumb: HTMLElement, type: 'min' | 'max'): void {\n let isDragging = false;\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!isDragging) return;\n const rect = this.trackEl.getBoundingClientRect();\n const pct = Math.max(0, Math.min(1, (ev.clientX - rect.left) / rect.width));\n const rawVal = this.min + pct * (this.max - this.min);\n const steppedVal = this.applyStep(rawVal);\n const [curMin, curMax] = this.getCurrentRange();\n\n if (type === 'min') {\n const nextMin = Math.min(steppedVal, curMax);\n if (nextMin !== curMin) {\n this.soundEngine?.playTick();\n this.setRangeValue(nextMin, curMax);\n }\n } else {\n const nextMax = Math.max(steppedVal, curMin);\n if (nextMax !== curMax) {\n this.soundEngine?.playTick();\n this.setRangeValue(curMin, nextMax);\n }\n }\n };\n\n const onMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n thumb.addEventListener('mousedown', (ev) => {\n if (ev.button !== 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n isDragging = true;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private setupBarDrag(): void {\n let isDragging = false;\n let startX = 0;\n let startMin = 0;\n let startMax = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!isDragging) return;\n const rect = this.trackEl.getBoundingClientRect();\n const dxPct = (ev.clientX - startX) / rect.width;\n const deltaVal = dxPct * (this.max - this.min);\n const span = startMax - startMin;\n\n let newMin = Math.max(this.min, Math.min(this.max - span, startMin + deltaVal));\n newMin = this.applyStep(newMin);\n const newMax = this.applyStep(newMin + span);\n\n const [curMin, curMax] = this.getCurrentRange();\n if (newMin !== curMin || newMax !== curMax) {\n this.soundEngine?.playTick();\n this.setRangeValue(newMin, newMax);\n }\n };\n\n const onMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n this.barEl.addEventListener('mousedown', (ev) => {\n if (ev.button !== 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n isDragging = true;\n startX = ev.clientX;\n const [curMin, curMax] = this.getCurrentRange();\n startMin = curMin;\n startMax = curMax;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private applyStep(val: number): number {\n const stepped = Math.round(val / this.step) * this.step;\n const decimals = (this.step.toString().split('.')[1] || '').length;\n return parseFloat(stepped.toFixed(decimals));\n }\n\n private getCurrentRange(): [number, number] {\n const val = this.getValue();\n if (Array.isArray(val)) {\n return [val[0] ?? this.min, val[1] ?? this.max];\n } else if (typeof val === 'object' && val !== null) {\n return [(val as any).min ?? this.min, (val as any).max ?? this.max];\n }\n return [this.min, this.max];\n }\n\n private setRangeValue(vMin: number, vMax: number): void {\n const clampedMin = Math.max(this.min, Math.min(vMin, this.max));\n const clampedMax = Math.max(this.min, Math.min(vMax, this.max));\n\n const cur = this.getValue();\n if (Array.isArray(cur)) {\n this.setValue([clampedMin, clampedMax]);\n } else {\n this.setValue({\n ...(typeof cur === 'object' && cur !== null ? cur : {}),\n min: clampedMin,\n max: clampedMax\n });\n }\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.update();\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.update();\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.inputMin.step = step.toString();\n this.inputMax.step = step.toString();\n return this;\n }\n\n public setFormat(fn: (min: number, max: number) => string): this {\n this.formatter = fn;\n this.update();\n return this;\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.trackEl || !this.thumbMin || !this.thumbMax) return this;\n const [vMin, vMax] = this.getCurrentRange();\n const range = this.max - this.min || 1;\n\n const minPct = Math.max(0, Math.min(100, ((vMin - this.min) / range) * 100));\n const maxPct = Math.max(0, Math.min(100, ((vMax - this.min) / range) * 100));\n\n this.thumbMin.style.left = `${minPct}%`;\n this.thumbMax.style.left = `${maxPct}%`;\n\n this.barEl.style.left = `${minPct}%`;\n this.barEl.style.width = `${Math.max(0, maxPct - minPct)}%`;\n this.barEl.title = this.formatter(vMin, vMax);\n\n this.inputMin.value = String(vMin);\n this.inputMax.value = String(vMax);\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Segmented extends BaseComponent<any> {\n private containerEl: HTMLElement;\n private gliderEl: HTMLElement;\n private buttons: Map<string, HTMLButtonElement> = new Map();\n private optionsMap: Map<string, any> = new Map();\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n options: string[] | number[] | Record<string, any> = [],\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-segmented-container';\n\n this.gliderEl = document.createElement('div');\n this.gliderEl.className = 'relly-segmented-glider';\n this.containerEl.appendChild(this.gliderEl);\n\n this.controlEl.appendChild(this.containerEl);\n\n this.setOptions(options);\n }\n\n public setOptions(options: string[] | number[] | Record<string, any>): this {\n this.optionsMap.clear();\n this.buttons.clear();\n\n // Preserve glider\n this.containerEl.innerHTML = '';\n this.containerEl.appendChild(this.gliderEl);\n\n if (Array.isArray(options)) {\n for (const item of options) {\n const key = String(item);\n this.optionsMap.set(key, item);\n this.createButton(key, key, item);\n }\n } else if (typeof options === 'object' && options !== null) {\n for (const [key, val] of Object.entries(options)) {\n this.optionsMap.set(key, val);\n this.createButton(key, key, val);\n }\n }\n\n this.update();\n return this;\n }\n\n private createButton(key: string, label: string, value: any): void {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-segmented-btn';\n btn.textContent = label;\n\n btn.addEventListener('click', () => {\n this.soundEngine?.playClick();\n this.setValue(value);\n });\n\n this.containerEl.appendChild(btn);\n this.buttons.set(key, btn);\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.containerEl || this.buttons.size === 0) return this;\n const currentVal = this.getValue();\n\n let matchedBtn: HTMLButtonElement | null = null;\n\n for (const [key, val] of this.optionsMap.entries()) {\n const btn = this.buttons.get(key);\n if (!btn) continue;\n\n if (val === currentVal || String(val) === String(currentVal)) {\n btn.classList.add('relly-segmented-btn--active');\n matchedBtn = btn;\n } else {\n btn.classList.remove('relly-segmented-btn--active');\n }\n }\n\n if (matchedBtn) {\n const left = matchedBtn.offsetLeft;\n const width = matchedBtn.offsetWidth;\n this.gliderEl.style.transform = `translateX(${left}px)`;\n this.gliderEl.style.width = `${width}px`;\n this.gliderEl.style.opacity = '1';\n } else {\n this.gliderEl.style.opacity = '0';\n }\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { StatusType } from '../../types';\n\nexport class StatusIndicator extends BaseComponent<string> {\n private wrapperEl: HTMLElement;\n private ledEl: HTMLElement;\n private badgeEl: HTMLElement;\n private detailEl: HTMLElement;\n\n private currentStatus: StatusType = 'online';\n private customBadge?: string;\n private customDetail?: string;\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n bindingEngine?: BindingEngine\n ) {\n super(label, targetObject, property, bindingEngine);\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-status-wrapper';\n\n // Pulsing LED\n this.ledEl = document.createElement('div');\n this.ledEl.className = 'relly-status-led relly-status-led--online';\n this.ledEl.innerHTML = `\n <span class=\"relly-status-pulse-ring\"></span>\n <span class=\"relly-status-led-core\"></span>\n `;\n\n // Status Badge\n this.badgeEl = document.createElement('span');\n this.badgeEl.className = 'relly-status-badge relly-status-badge--online';\n this.badgeEl.textContent = 'ONLINE';\n\n // Detail text\n this.detailEl = document.createElement('span');\n this.detailEl.className = 'relly-status-detail';\n\n this.wrapperEl.appendChild(this.ledEl);\n this.wrapperEl.appendChild(this.badgeEl);\n this.wrapperEl.appendChild(this.detailEl);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.update();\n }\n\n public setStatus(status: StatusType, badge?: string, detail?: string): this {\n this.currentStatus = status;\n if (badge !== undefined) this.customBadge = badge;\n if (detail !== undefined) this.customDetail = detail;\n\n if (this.targetObject && this.property) {\n this.targetObject[this.property] = status;\n }\n this.update();\n return this;\n }\n\n public setBadge(badge: string): this {\n this.customBadge = badge;\n this.update();\n return this;\n }\n\n public setDetail(detail: string): this {\n this.customDetail = detail;\n this.update();\n return this;\n }\n\n public update(): this {\n if (!this.wrapperEl || !this.ledEl) return this;\n\n const rawVal = this.getValue();\n let status: StatusType = this.currentStatus;\n\n if (typeof rawVal === 'string' && rawVal) {\n const lower = rawVal.toLowerCase();\n if (['online', 'busy', 'offline', 'info', 'ready'].includes(lower)) {\n status = lower as StatusType;\n }\n }\n\n this.ledEl.className = `relly-status-led relly-status-led--${status}`;\n this.badgeEl.className = `relly-status-badge relly-status-badge--${status}`;\n\n this.badgeEl.textContent = this.customBadge || status.toUpperCase();\n\n if (this.customDetail) {\n this.detailEl.textContent = this.customDetail;\n this.detailEl.style.display = 'inline-block';\n } else {\n this.detailEl.style.display = 'none';\n }\n\n return this;\n }\n}\n","import { Checkbox } from '../components/Checkbox/Checkbox';\nimport { Slider } from '../components/Slider/Slider';\nimport { Button } from '../components/Button/Button';\nimport { Select } from '../components/Select/Select';\nimport { DynamicLabel } from '../components/DynamicLabel/DynamicLabel';\nimport { Graph } from '../components/Graph/Graph';\nimport { ColorPicker } from '../components/ColorPicker/ColorPicker';\nimport { Point2D } from '../components/Point2D/Point2D';\nimport { Point3D } from '../components/Point3D/Point3D';\nimport { RangeSlider } from '../components/Range/RangeSlider';\nimport { Segmented } from '../components/Segmented/Segmented';\nimport { StatusIndicator } from '../components/Status/StatusIndicator';\nimport { BindingEngine, Listenable } from './BindingEngine';\nimport { PresetManager } from './PresetManager';\nimport { SoundEngine } from './SoundEngine';\nimport {\n ComponentFactoryOptions,\n ConditionPredicate,\n OnClickCallback,\n Point2DOptions,\n Point3DOptions,\n RangeOptions,\n StatusType\n} from '../types';\nimport { BaseComponent } from './BaseComponent';\n\nexport interface IComponentContainer {\n getContentElement(): HTMLElement;\n getBindingEngine(): BindingEngine;\n getPresetManager(): PresetManager;\n}\n\nexport abstract class ContainerHelper {\n protected children: Array<BaseComponent | { destroy(): void }> = [];\n protected accordion: boolean = false;\n\n constructor(\n protected contentEl: HTMLElement,\n protected bindingEngine: BindingEngine,\n protected presetManager: PresetManager,\n protected soundEngine?: SoundEngine\n ) {}\n\n public setAccordion(enabled: boolean): this {\n this.accordion = enabled;\n return this;\n }\n\n public isAccordion(): boolean {\n return this.accordion;\n }\n\n public onSectionExpanded(expandedSection: Section): void {\n if (!this.accordion) return;\n for (const child of this.children) {\n if (child instanceof Section && child !== expandedSection) {\n child.setCollapsed(true);\n }\n }\n }\n\n public addCheckbox(targetOrOptions: any, property?: string): Checkbox {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Checkbox(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange || opts.onToggle) comp.onChange(opts.onChange || opts.onToggle);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Checkbox(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createCheckbox(targetOrOptions: any, property?: string): Checkbox {\n return this.addCheckbox(targetOrOptions, property);\n }\n\n public addSlider(targetOrOptions: any, property?: string): Slider {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Slider(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Slider(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSlider(targetOrOptions: any, property?: string): Slider {\n return this.addSlider(targetOrOptions, property);\n }\n\n public addButton(\n labelOrOptions: string | { label?: string; onClick?: OnClickCallback; tooltip?: string; showIf?: ConditionPredicate },\n onClick?: OnClickCallback\n ): Button {\n if (typeof labelOrOptions === 'object' && labelOrOptions !== null) {\n const opts = labelOrOptions;\n const label = opts.label || 'Button';\n const comp = new Button(label, opts.onClick || onClick, this.soundEngine);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const comp = new Button(labelOrOptions, onClick, this.soundEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createButton(\n labelOrOptions: string | { label?: string; onClick?: OnClickCallback; tooltip?: string; showIf?: ConditionPredicate },\n onClick?: OnClickCallback\n ): Button {\n return this.addButton(labelOrOptions, onClick);\n }\n\n public addSelect(targetOrOptions: any, property?: string, options?: any): Select {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Select(label, opts.object, opts.property, opts.options, this.bindingEngine, this.presetManager);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Select(\n label,\n targetOrOptions,\n property!,\n options,\n this.bindingEngine,\n this.presetManager\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSelect(targetOrOptions: any, property?: string, options?: any): Select {\n return this.addSelect(targetOrOptions, property, options);\n }\n\n public addDynamicLabel(targetOrOptions: any, property?: string): DynamicLabel {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new DynamicLabel(label, opts.object, opts.property, this.bindingEngine);\n if (opts.format) comp.setFormat(opts.format);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new DynamicLabel(label, targetOrOptions, property!, this.bindingEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createDynamicLabel(targetOrOptions: any, property?: string): DynamicLabel {\n return this.addDynamicLabel(targetOrOptions, property);\n }\n\n public addGraph(targetOrOptions: any, property?: string): Graph {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Graph(label, opts.object, opts.property, this.bindingEngine, this.soundEngine);\n if (opts.range) comp.setRange(opts.range[0], opts.range[1]);\n if (opts.color) comp.setColor(opts.color, opts.fillColor);\n if (opts.bufferSize) comp.setBufferSize(opts.bufferSize);\n if (opts.smooth !== undefined) comp.setSmooth(opts.smooth);\n if (opts.height) comp.setHeight(opts.height);\n if (opts.format) comp.setFormat(opts.format);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Graph(label, targetOrOptions, property!, this.bindingEngine, this.soundEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createGraph(targetOrOptions: any, property?: string): Graph {\n return this.addGraph(targetOrOptions, property);\n }\n\n public addFPSGraph(label: string = 'FPS'): Graph {\n const tracker = { fps: 60 };\n let frames = 0;\n let prevTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n let animId: number;\n\n const loop = (now: number) => {\n frames++;\n if (now >= prevTime + 1000) {\n tracker.fps = Math.round((frames * 1000) / (now - prevTime));\n frames = 0;\n prevTime = now;\n }\n animId = requestAnimationFrame(loop);\n };\n\n if (typeof requestAnimationFrame !== 'undefined') {\n animId = requestAnimationFrame(loop);\n }\n\n const graph = this.addGraph(tracker, 'fps')\n .setLabel(label)\n .setRange(0, 120)\n .setColor('#22c55e', 'rgba(34, 197, 94, 0.25)')\n .setFormat((v) => `${Math.round(v)} FPS`);\n\n const origDestroy = graph.destroy.bind(graph);\n graph.destroy = () => {\n if (typeof cancelAnimationFrame !== 'undefined' && animId) {\n cancelAnimationFrame(animId);\n }\n origDestroy();\n };\n\n return graph;\n }\n\n public createFPSGraph(label: string = 'FPS'): Graph {\n return this.addFPSGraph(label);\n }\n\n public addMemoryGraph(label: string = 'Memory'): Graph {\n const tracker = { mem: 0 };\n let intervalId: any;\n\n const updateMem = () => {\n if (typeof performance !== 'undefined' && (performance as any).memory) {\n const used = (performance as any).memory.usedJSHeapSize / (1024 * 1024);\n tracker.mem = Number(used.toFixed(1));\n } else {\n // Fallback smooth representation\n tracker.mem = Number((Math.sin(Date.now() / 2500) * 8 + 48).toFixed(1));\n }\n };\n\n updateMem();\n if (typeof setInterval !== 'undefined') {\n intervalId = setInterval(updateMem, 1000);\n }\n\n const graph = this.addGraph(tracker, 'mem')\n .setLabel(label)\n .setAutoRange(true)\n .setColor('#a855f7', 'rgba(168, 85, 247, 0.25)')\n .setFormat((v) => `${v.toFixed(1)} MB`);\n\n const origDestroy = graph.destroy.bind(graph);\n graph.destroy = () => {\n if (intervalId) clearInterval(intervalId);\n origDestroy();\n };\n\n return graph;\n }\n\n public createMemoryGraph(label: string = 'Memory'): Graph {\n return this.addMemoryGraph(label);\n }\n\n public addColor(targetOrOptions: any, property?: string): ColorPicker {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new ColorPicker(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.swatches) comp.setSwatches(opts.swatches);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new ColorPicker(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createColor(targetOrOptions: any, property?: string): ColorPicker {\n return this.addColor(targetOrOptions, property);\n }\n\n public addPoint2D(targetOrOptions: any, property?: string, options?: Point2DOptions): Point2D {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Point2D(label, opts.object, opts.property, this.bindingEngine, this.presetManager);\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Point2D(label, targetOrOptions, property!, this.bindingEngine, this.presetManager);\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createPoint2D(targetOrOptions: any, property?: string, options?: Point2DOptions): Point2D {\n return this.addPoint2D(targetOrOptions, property, options);\n }\n\n public addPoint3D(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Point3D(label, opts.object, opts.property, this.bindingEngine, this.presetManager);\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Point3D(label, targetOrOptions, property!, this.bindingEngine, this.presetManager);\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createPoint3D(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public addVector3(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public createVector3(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public addRange(targetOrOptions: any, property?: string, options?: RangeOptions): RangeSlider {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new RangeSlider(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new RangeSlider(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createRange(targetOrOptions: any, property?: string, options?: RangeOptions): RangeSlider {\n return this.addRange(targetOrOptions, property, options);\n }\n\n public addSegmented(\n targetOrOptions: any,\n property?: string,\n options?: string[] | number[] | Record<string, any>\n ): Segmented {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Segmented(\n label,\n opts.object,\n opts.property,\n opts.options || [],\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Segmented(\n label,\n targetOrOptions,\n property!,\n options || [],\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSegmented(\n targetOrOptions: any,\n property?: string,\n options?: string[] | number[] | Record<string, any>\n ): Segmented {\n return this.addSegmented(targetOrOptions, property, options);\n }\n\n public addStatus(\n targetOrOptions: any,\n property?: string,\n initialStatus: StatusType = 'online',\n badge?: string,\n detail?: string\n ): StatusIndicator {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new StatusIndicator(\n label,\n opts.object,\n opts.property,\n this.bindingEngine\n );\n if (opts.status) comp.setStatus(opts.status, opts.badge, opts.detail);\n if (opts.badge) comp.setBadge(opts.badge);\n if (opts.detail) comp.setDetail(opts.detail);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property\n ? (property.charAt(0).toUpperCase() + property.slice(1))\n : (typeof targetOrOptions === 'string' ? targetOrOptions : 'Status');\n\n const targetObj = typeof targetOrOptions === 'string' ? undefined : targetOrOptions;\n const propName = typeof targetOrOptions === 'string' ? undefined : property;\n\n const comp = new StatusIndicator(\n label,\n targetObj,\n propName,\n this.bindingEngine\n );\n comp.setStatus(initialStatus, badge, detail);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createStatus(\n targetOrOptions: any,\n property?: string,\n initialStatus: StatusType = 'online',\n badge?: string,\n detail?: string\n ): StatusIndicator {\n return this.addStatus(targetOrOptions, property, initialStatus, badge, detail);\n }\n\n public addRow(): Row {\n const row = new Row(this.bindingEngine, this.presetManager, this.soundEngine);\n this.contentEl.appendChild(row.element);\n this.children.push(row);\n return row;\n }\n\n public createRow(): Row {\n return this.addRow();\n }\n\n public addSection(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Section',\n collapsed: boolean = false\n ): Section {\n let label = '';\n let isCollapsed = collapsed;\n if (typeof labelOrOptions === 'object' && labelOrOptions !== null) {\n label = labelOrOptions.label || labelOrOptions.title || 'Section';\n if (labelOrOptions.collapsed !== undefined) {\n isCollapsed = labelOrOptions.collapsed;\n }\n } else {\n label = labelOrOptions || 'Section';\n }\n const section = new Section(label, this.bindingEngine, this.presetManager, isCollapsed, this.soundEngine);\n section.setParentContainer(this);\n this.contentEl.appendChild(section.element);\n this.children.push(section);\n return section;\n }\n\n public addFolder(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Folder',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createSection(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Section',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createFolder(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Folder',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createComponent(options: ComponentFactoryOptions): any {\n let comp: any;\n const label = options.label || (options.property ? options.property : options.type);\n\n switch (options.type) {\n case 'checkbox':\n comp = this.addCheckbox(options.object, options.property!);\n break;\n case 'slider': {\n const slider = this.addSlider(options.object, options.property!);\n if (options.min !== undefined) slider.setMin(options.min);\n if (options.max !== undefined) slider.setMax(options.max);\n if (options.step !== undefined) slider.setStep(options.step);\n comp = slider;\n break;\n }\n case 'button':\n comp = this.addButton(label, options.onClick);\n break;\n case 'select':\n comp = this.addSelect(options.object, options.property!, options.options);\n break;\n case 'dynamicLabel': {\n const dyn = this.addDynamicLabel(options.object, options.property!);\n if (options.format) dyn.setFormat(options.format);\n comp = dyn;\n break;\n }\n case 'graph': {\n const graph = this.addGraph(options.object, options.property!);\n if (options.range) graph.setRange(options.range[0], options.range[1]);\n if (options.color) graph.setColor(options.color, options.fillColor);\n if (options.bufferSize) graph.setBufferSize(options.bufferSize);\n comp = graph;\n break;\n }\n case 'color': {\n const colorComp = this.addColor(options.object, options.property!);\n if (options.swatches) colorComp.setSwatches(options.swatches);\n comp = colorComp;\n break;\n }\n case 'point2d': {\n const p2d = this.addPoint2D(options.object, options.property!);\n if (options.min !== undefined) p2d.setMin(options.min);\n if (options.max !== undefined) p2d.setMax(options.max);\n if (options.step !== undefined) p2d.setStep(options.step);\n comp = p2d;\n break;\n }\n case 'point3d':\n case 'vector3': {\n const p3d = this.addPoint3D(options.object, options.property!);\n if (options.min !== undefined) p3d.setMin(options.min);\n if (options.max !== undefined) p3d.setMax(options.max);\n if (options.step !== undefined) p3d.setStep(options.step);\n comp = p3d;\n break;\n }\n case 'range': {\n const range = this.addRange(options.object, options.property!);\n if (options.min !== undefined) range.setMin(options.min);\n if (options.max !== undefined) range.setMax(options.max);\n if (options.step !== undefined) range.setStep(options.step);\n comp = range;\n break;\n }\n case 'segmented': {\n const seg = this.addSegmented(options.object, options.property!, options.options);\n comp = seg;\n break;\n }\n case 'status': {\n const stat = this.addStatus(options.object, options.property!, options.status, options.badge, options.detail);\n comp = stat;\n break;\n }\n case 'section':\n case 'folder': {\n comp = this.addSection(label, options.collapsed || false);\n break;\n }\n default:\n throw new Error(`[RellyUI] Unknown component type: ${(options as any).type}`);\n }\n\n if (label && comp.setLabel) {\n comp.setLabel(label);\n }\n if (options.tooltip && comp.setTooltip) {\n comp.setTooltip(options.tooltip);\n }\n if (options.contextMenu && comp.setContextMenu) {\n comp.setContextMenu(options.contextMenu);\n }\n if ((options.onChange || options.onToggle) && comp.onChange) {\n comp.onChange(options.onChange || options.onToggle);\n }\n if (options.listen && comp.listen) {\n comp.listen();\n }\n if (options.showIf && comp.showIf) {\n comp.showIf(options.showIf);\n }\n if (options.disabled && comp.setDisabled) {\n comp.setDisabled(true);\n }\n\n return comp;\n }\n\n public destroyChildren(): void {\n for (const child of this.children) {\n child.destroy();\n }\n this.children = [];\n }\n}\n\nexport class Row extends ContainerHelper {\n public element: HTMLElement;\n protected disabled: boolean = false;\n\n constructor(bindingEngine: BindingEngine, presetManager: PresetManager, soundEngine?: SoundEngine) {\n const rowEl = document.createElement('div');\n rowEl.className = 'relly-multi-row';\n super(rowEl, bindingEngine, presetManager, soundEngine);\n this.element = rowEl;\n }\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n } else {\n this.element.classList.remove('relly-disabled');\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public destroy(): void {\n this.destroyChildren();\n this.element.remove();\n }\n}\n\nexport class Section extends ContainerHelper implements Listenable {\n public element: HTMLElement;\n private headerEl: HTMLElement;\n private titleEl: HTMLElement;\n private arrowEl: HTMLElement;\n private isCollapsed: boolean = false;\n private conditionPredicate?: ConditionPredicate;\n protected parentContainer?: ContainerHelper;\n protected disabled: boolean = false;\n\n constructor(\n private label: string,\n bindingEngine: BindingEngine,\n presetManager: PresetManager,\n initialCollapsed: boolean = false,\n soundEngine?: SoundEngine\n ) {\n const content = document.createElement('div');\n content.className = 'relly-section-content';\n super(content, bindingEngine, presetManager, soundEngine);\n\n this.element = document.createElement('div');\n this.element.className = 'relly-section';\n\n this.headerEl = document.createElement('div');\n this.headerEl.className = 'relly-section-header';\n\n const titleWrap = document.createElement('div');\n titleWrap.className = 'relly-section-title-wrap';\n\n this.arrowEl = document.createElement('span');\n this.arrowEl.innerHTML = `\n <svg class=\"relly-section-arrow\" viewBox=\"0 0 10 10\">\n <polygon points=\"2,1 8,5 2,9\"></polygon>\n </svg>\n `;\n\n this.titleEl = document.createElement('span');\n this.titleEl.textContent = label;\n\n titleWrap.appendChild(this.arrowEl);\n titleWrap.appendChild(this.titleEl);\n this.headerEl.appendChild(titleWrap);\n\n this.element.appendChild(this.headerEl);\n this.element.appendChild(this.contentEl);\n\n this.headerEl.addEventListener('click', () => {\n if (this.disabled) return;\n this.soundEngine?.playClick();\n this.toggle();\n });\n\n if (initialCollapsed) {\n this.setCollapsed(true);\n }\n }\n\n public setParentContainer(parent: ContainerHelper): this {\n this.parentContainer = parent;\n return this;\n }\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n } else {\n this.element.classList.remove('relly-disabled');\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public setLabel(label: string): this {\n this.label = label;\n this.titleEl.textContent = label;\n return this;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public toggle(): this {\n return this.setCollapsed(!this.isCollapsed);\n }\n\n public setCollapsed(collapsed: boolean): this {\n this.isCollapsed = collapsed;\n if (this.isCollapsed) {\n this.element.classList.add('relly-section--collapsed');\n } else {\n this.element.classList.remove('relly-section--collapsed');\n if (this.parentContainer) {\n this.parentContainer.onSectionExpanded(this);\n }\n }\n return this;\n }\n\n public showIf(predicate: ConditionPredicate): this {\n this.conditionPredicate = predicate;\n this.checkVisibility();\n this.bindingEngine.register(this);\n return this;\n }\n\n public checkVisibility(): boolean {\n if (!this.conditionPredicate) return true;\n const isVisible = this.conditionPredicate();\n this.element.style.display = isVisible ? '' : 'none';\n return isVisible;\n }\n\n public checkDirty(): void {\n this.checkVisibility();\n }\n\n public destroy(): void {\n if (this.conditionPredicate) {\n this.bindingEngine.unregister(this);\n }\n this.destroyChildren();\n this.element.remove();\n }\n}\n","export interface Listenable {\n checkDirty(): void;\n}\n\nexport class BindingEngine {\n private listeners: Set<Listenable> = new Set();\n private rafId: number | null = null;\n private isRunning: boolean = false;\n private isPaused: boolean = false;\n\n public register(component: Listenable): void {\n this.listeners.add(component);\n if (!this.isRunning && !this.isPaused) {\n this.start();\n }\n }\n\n public unregister(component: Listenable): void {\n this.listeners.delete(component);\n if (this.listeners.size === 0) {\n this.stop();\n }\n }\n\n public pause(): void {\n this.isPaused = true;\n this.stop();\n }\n\n public resume(): void {\n this.isPaused = false;\n if (this.listeners.size > 0 && !this.isRunning) {\n this.start();\n }\n }\n\n private start(): void {\n if (typeof window === 'undefined') return;\n this.isRunning = true;\n const loop = () => {\n if (!this.isRunning) return;\n for (const listener of this.listeners) {\n listener.checkDirty();\n }\n this.rafId = requestAnimationFrame(loop);\n };\n this.rafId = requestAnimationFrame(loop);\n }\n\n private stop(): void {\n this.isRunning = false;\n if (this.rafId !== null && typeof window !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n public destroy(): void {\n this.stop();\n this.listeners.clear();\n }\n}\n","export interface SerializableComponent {\n getSerializableKey(): string | null;\n getValue(): any;\n setValue(val: any): void;\n}\n\nexport class PresetManager {\n private components: Set<SerializableComponent> = new Set();\n private pendingValues: Record<string, any> = {};\n private changeCallback?: () => void;\n\n public setOnChange(cb: () => void): void {\n this.changeCallback = cb;\n }\n\n public notifyChange(): void {\n this.changeCallback?.();\n }\n\n public register(component: SerializableComponent): void {\n this.components.add(component);\n const key = component.getSerializableKey();\n if (key && key in this.pendingValues) {\n component.setValue(this.pendingValues[key]);\n }\n }\n\n public setPendingValues(values: Record<string, any>): void {\n this.pendingValues = { ...this.pendingValues, ...values };\n for (const comp of this.components) {\n const key = comp.getSerializableKey();\n if (key && key in this.pendingValues) {\n comp.setValue(this.pendingValues[key]);\n }\n }\n }\n\n public getPendingValues(): Record<string, any> {\n return { ...this.pendingValues };\n }\n\n public unregister(component: SerializableComponent): void {\n this.components.delete(component);\n }\n\n public export(): Record<string, any> {\n const data: Record<string, any> = { ...this.pendingValues };\n for (const comp of this.components) {\n const key = comp.getSerializableKey();\n if (key) {\n data[key] = comp.getValue();\n }\n }\n return data;\n }\n\n public import(data: Record<string, any>): void {\n if (!data || typeof data !== 'object') return;\n this.setPendingValues(data);\n }\n\n public save(storageKey: string = 'relly-ui-preset'): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n const exported = this.export();\n window.localStorage.setItem(storageKey, JSON.stringify(exported));\n } catch (err) {\n console.warn('[RellyUI] Failed to save preset to localStorage', err);\n }\n }\n\n public load(storageKey: string = 'relly-ui-preset'): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw) {\n const parsed = JSON.parse(raw);\n this.import(parsed);\n }\n } catch (err) {\n console.warn('[RellyUI] Failed to load preset from localStorage', err);\n }\n }\n\n public clear(): void {\n this.components.clear();\n this.pendingValues = {};\n }\n}\n","import { RellyTheme, ThemeInput } from '../types';\n\nexport const DARK_THEME: RellyTheme = {\n bg: '#1c1d22',\n fg: '#d1d5db',\n headerBg: '#141518',\n headerFg: '#f3f4f6',\n accent: '#6366f1',\n accentHover: '#4f46e5',\n border: 'rgba(255, 255, 255, 0.08)',\n inputBg: '#26272e',\n inputHover: '#2f3039',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const LIGHT_THEME: RellyTheme = {\n bg: '#ffffff',\n fg: '#374151',\n headerBg: '#f3f4f6',\n headerFg: '#111827',\n accent: '#4f46e5',\n accentHover: '#4338ca',\n border: '#e5e7eb',\n inputBg: '#f9fafb',\n inputHover: '#f3f4f6',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const CYBERPUNK_THEME: RellyTheme = {\n bg: '#0f051d',\n fg: '#e0f2fe',\n headerBg: '#180a33',\n headerFg: '#00f0ff',\n accent: '#00f0ff',\n accentHover: '#ff007f',\n border: 'rgba(0, 240, 255, 0.25)',\n inputBg: '#1e0d3d',\n inputHover: '#2d145c',\n radius: '4px',\n font: '\"JetBrains Mono\", Consolas, monospace',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const NORD_THEME: RellyTheme = {\n bg: '#2e3440',\n fg: '#d8dee9',\n headerBg: '#242933',\n headerFg: '#eceff4',\n accent: '#88c0d0',\n accentHover: '#81a1c1',\n border: '#3b4252',\n inputBg: '#3b4252',\n inputHover: '#434c5e',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const DRACULA_THEME: RellyTheme = {\n bg: '#282a36',\n fg: '#f8f8f2',\n headerBg: '#1e1f29',\n headerFg: '#bd93f9',\n accent: '#bd93f9',\n accentHover: '#ff79c6',\n border: '#44475a',\n inputBg: '#44475a',\n inputHover: '#6272a4',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const TOKYO_NIGHT_THEME: RellyTheme = {\n bg: '#1a1b26',\n fg: '#a9b1d6',\n headerBg: '#16161e',\n headerFg: '#7aa2f7',\n accent: '#7aa2f7',\n accentHover: '#bb9af7',\n border: 'rgba(122, 162, 247, 0.18)',\n inputBg: '#24283b',\n inputHover: '#2f3549',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const MATRIX_THEME: RellyTheme = {\n bg: '#0a0f0d',\n fg: '#00ff66',\n headerBg: '#050a08',\n headerFg: '#00ff66',\n accent: '#00ff66',\n accentHover: '#33ff88',\n border: 'rgba(0, 255, 102, 0.25)',\n inputBg: '#0d1812',\n inputHover: '#13241b',\n radius: '3px',\n font: '\"JetBrains Mono\", Consolas, monospace',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const SYNTHWAVE_THEME: RellyTheme = {\n bg: '#241b2f',\n fg: '#f8f8f2',\n headerBg: '#191322',\n headerFg: '#ff71ce',\n accent: '#ff71ce',\n accentHover: '#01cdfe',\n border: 'rgba(255, 113, 206, 0.25)',\n inputBg: '#2f233f',\n inputHover: '#3c2c51',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport class ThemeManager {\n private currentTheme: RellyTheme;\n private currentThemeName?: string;\n\n constructor(\n private panelElement: HTMLElement,\n themeInput?: ThemeInput\n ) {\n this.currentTheme = { ...DARK_THEME };\n this.currentThemeName = 'dark';\n if (themeInput) {\n this.applyTheme(themeInput);\n } else {\n this.applyToDOM(this.currentTheme);\n }\n }\n\n public applyTheme(themeInput: ThemeInput): void {\n if (typeof themeInput === 'string') {\n this.currentThemeName = themeInput;\n }\n\n if (themeInput === 'light') {\n this.currentTheme = { ...LIGHT_THEME };\n } else if (themeInput === 'dark') {\n this.currentTheme = { ...DARK_THEME };\n } else if (themeInput === 'cyberpunk') {\n this.currentTheme = { ...CYBERPUNK_THEME };\n } else if (themeInput === 'nord') {\n this.currentTheme = { ...NORD_THEME };\n } else if (themeInput === 'dracula') {\n this.currentTheme = { ...DRACULA_THEME };\n } else if (themeInput === 'tokyo-night') {\n this.currentTheme = { ...TOKYO_NIGHT_THEME };\n } else if (themeInput === 'matrix') {\n this.currentTheme = { ...MATRIX_THEME };\n } else if (themeInput === 'synthwave') {\n this.currentTheme = { ...SYNTHWAVE_THEME };\n } else if (typeof themeInput === 'object') {\n this.currentTheme = { ...this.currentTheme, ...themeInput };\n this.currentThemeName = 'custom';\n }\n this.applyToDOM(this.currentTheme);\n }\n\n public getCurrentThemeName(): string | undefined {\n return this.currentThemeName;\n }\n\n private applyToDOM(theme: RellyTheme): void {\n const el = this.panelElement;\n el.style.setProperty('--relly-bg', theme.bg);\n el.style.setProperty('--relly-fg', theme.fg);\n el.style.setProperty('--relly-header-bg', theme.headerBg);\n el.style.setProperty('--relly-header-fg', theme.headerFg);\n el.style.setProperty('--relly-accent', theme.accent);\n el.style.setProperty('--relly-accent-hover', theme.accentHover);\n el.style.setProperty('--relly-border', theme.border);\n el.style.setProperty('--relly-input-bg', theme.inputBg);\n el.style.setProperty('--relly-input-hover', theme.inputHover);\n el.style.setProperty('--relly-radius', theme.radius);\n el.style.setProperty('--relly-font', theme.font);\n el.style.setProperty('--relly-font-size', theme.fontSize);\n el.style.setProperty('--relly-row-height', theme.rowHeight);\n }\n\n public getTheme(): RellyTheme {\n return { ...this.currentTheme };\n }\n}\n","import { SoundEngine } from './SoundEngine';\n\nexport class Draggable {\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialLeft = 0;\n private initialTop = 0;\n private wasSnapped = false;\n\n public snapThreshold = 18;\n public magneticSnap = true;\n\n private onMouseDownBound: (e: MouseEvent) => void;\n private onMouseMoveBound: (e: MouseEvent) => void;\n private onMouseUpBound: (e: MouseEvent) => void;\n private onResizeBound: () => void;\n\n constructor(\n private handle: HTMLElement,\n private panel: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.onMouseDownBound = this.onMouseDown.bind(this);\n this.onMouseMoveBound = this.onMouseMove.bind(this);\n this.onMouseUpBound = this.onMouseUp.bind(this);\n this.onResizeBound = this.onResize.bind(this);\n\n this.handle.addEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n }\n }\n\n public clampToViewport(): void {\n if (typeof window === 'undefined') return;\n\n const rect = this.panel.getBoundingClientRect();\n const panelWidth = rect.width;\n const panelHeight = rect.height;\n const maxLeft = Math.max(0, window.innerWidth - panelWidth);\n const maxTop = Math.max(0, window.innerHeight - panelHeight);\n\n let newLeft = rect.left;\n let newTop = rect.top;\n\n if (newLeft > maxLeft) newLeft = maxLeft;\n if (newLeft < 0) newLeft = 0;\n if (newTop > maxTop) newTop = maxTop;\n if (newTop < 0) newTop = 0;\n\n this.panel.style.left = `${Math.round(newLeft)}px`;\n this.panel.style.top = `${Math.round(newTop)}px`;\n this.panel.style.right = 'auto';\n this.panel.style.bottom = 'auto';\n }\n\n private onResize(): void {\n this.clampToViewport();\n }\n\n private onMouseDown(e: MouseEvent): void {\n // Only drag with left mouse button, and ignore if clicking an action button inside the header\n if (e.button !== 0) return;\n if ((e.target as HTMLElement).closest('.relly-header-btn')) return;\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n\n const rect = this.panel.getBoundingClientRect();\n this.initialLeft = rect.left;\n this.initialTop = rect.top;\n\n // Remove right/bottom constraints to avoid layout conflicts when setting left/top\n this.panel.style.right = 'auto';\n this.panel.style.bottom = 'auto';\n this.panel.style.left = `${this.initialLeft}px`;\n this.panel.style.top = `${this.initialTop}px`;\n\n window.addEventListener('mousemove', this.onMouseMoveBound);\n window.addEventListener('mouseup', this.onMouseUpBound);\n e.preventDefault();\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) return;\n\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n\n let newLeft = this.initialLeft + dx;\n let newTop = this.initialTop + dy;\n\n // Viewport clamping & magnetic edge snapping\n const rect = this.panel.getBoundingClientRect();\n const panelWidth = rect.width;\n const panelHeight = rect.height;\n const maxLeft = Math.max(0, window.innerWidth - panelWidth);\n const maxTop = Math.max(0, window.innerHeight - panelHeight);\n\n let snapped = false;\n\n if (this.magneticSnap) {\n if (Math.abs(newLeft) < this.snapThreshold) {\n newLeft = 0;\n snapped = true;\n } else if (Math.abs(newLeft - maxLeft) < this.snapThreshold) {\n newLeft = maxLeft;\n snapped = true;\n }\n\n if (Math.abs(newTop) < this.snapThreshold) {\n newTop = 0;\n snapped = true;\n } else if (Math.abs(newTop - maxTop) < this.snapThreshold) {\n newTop = maxTop;\n snapped = true;\n }\n\n if (snapped && !this.wasSnapped) {\n this.soundEngine?.playSnap();\n }\n this.wasSnapped = snapped;\n }\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.panel.style.left = `${newLeft}px`;\n this.panel.style.top = `${newTop}px`;\n }\n\n private onMouseUp(): void {\n this.isDragging = false;\n this.wasSnapped = false;\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n }\n\n public destroy(): void {\n this.handle.removeEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n window.removeEventListener('resize', this.onResizeBound);\n }\n }\n}\n","export class Resizable {\n public handleEl: HTMLElement;\n private isResizing = false;\n private startX = 0;\n private startY = 0;\n private initialWidth = 0;\n private initialHeight = 0;\n\n private onMouseDownBound: (e: MouseEvent) => void;\n private onMouseMoveBound: (e: MouseEvent) => void;\n private onMouseUpBound: (e: MouseEvent) => void;\n private onResizeBound: () => void;\n\n constructor(\n private panel: HTMLElement,\n private minWidth: number = 240,\n private minHeight: number = 120\n ) {\n this.handleEl = document.createElement('div');\n this.handleEl.className = 'relly-resize-handle';\n this.handleEl.title = 'Drag to resize panel';\n this.handleEl.innerHTML = `\n <svg viewBox=\"0 0 10 10\">\n <line x1=\"8\" y1=\"2\" x2=\"2\" y2=\"8\"></line>\n <line x1=\"8\" y1=\"5\" x2=\"5\" y2=\"8\"></line>\n <line x1=\"8\" y1=\"8\" x2=\"8\" y2=\"8\"></line>\n </svg>\n `;\n\n this.panel.appendChild(this.handleEl);\n\n this.onMouseDownBound = this.onMouseDown.bind(this);\n this.onMouseMoveBound = this.onMouseMove.bind(this);\n this.onMouseUpBound = this.onMouseUp.bind(this);\n this.onResizeBound = this.onWindowResize.bind(this);\n\n this.handleEl.addEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n }\n }\n\n public clampToViewport(): void {\n if (typeof window === 'undefined') return;\n\n const rect = this.panel.getBoundingClientRect();\n const maxWidth = Math.max(this.minWidth, window.innerWidth - 16);\n const maxHeight = Math.max(this.minHeight, window.innerHeight - 16);\n\n let newWidth = rect.width;\n let newHeight = rect.height;\n\n if (newWidth > maxWidth) {\n newWidth = maxWidth;\n this.panel.style.width = `${Math.round(newWidth)}px`;\n }\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n this.panel.style.height = `${Math.round(newHeight)}px`;\n }\n }\n\n private onWindowResize(): void {\n this.clampToViewport();\n }\n\n private onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n this.isResizing = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n\n const rect = this.panel.getBoundingClientRect();\n this.initialWidth = rect.width;\n this.initialHeight = rect.height;\n\n window.addEventListener('mousemove', this.onMouseMoveBound);\n window.addEventListener('mouseup', this.onMouseUpBound);\n e.preventDefault();\n e.stopPropagation();\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isResizing) return;\n\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n\n const rect = this.panel.getBoundingClientRect();\n const maxAllowedWidth = Math.max(this.minWidth, window.innerWidth - rect.left - 8);\n const maxAllowedHeight = Math.max(this.minHeight, window.innerHeight - rect.top - 8);\n\n const newWidth = Math.max(this.minWidth, Math.min(maxAllowedWidth, this.initialWidth + dx));\n const newHeight = Math.max(\n this.minHeight,\n Math.min(maxAllowedHeight, this.initialHeight + dy)\n );\n\n this.panel.style.width = `${Math.round(newWidth)}px`;\n this.panel.style.height = `${Math.round(newHeight)}px`;\n\n // Make body take remaining height\n const bodyEl = this.panel.querySelector<HTMLElement>('.relly-body');\n if (bodyEl) {\n bodyEl.style.maxHeight = 'none';\n bodyEl.style.flex = '1';\n }\n }\n\n private onMouseUp(): void {\n this.isResizing = false;\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n }\n\n public destroy(): void {\n this.handleEl.removeEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n window.removeEventListener('resize', this.onResizeBound);\n }\n this.handleEl.remove();\n }\n}\n","export class HotkeyManager {\n private onKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private hotkey: string | null,\n private onToggle: () => void\n ) {\n this.onKeyDownBound = this.onKeyDown.bind(this);\n if (this.hotkey && typeof window !== 'undefined') {\n window.addEventListener('keydown', this.onKeyDownBound);\n }\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (!this.hotkey) return;\n\n // Check composedPath for any input/textarea/select/contenteditable\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n for (const target of path) {\n if (target instanceof HTMLElement) {\n const tag = target.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n target.isContentEditable ||\n target.classList.contains('relly-search-input')\n ) {\n return;\n }\n }\n }\n\n // Also check document.activeElement and any shadowRoot activeElement\n let activeEl: Element | null = document.activeElement;\n while (activeEl && activeEl.shadowRoot && activeEl.shadowRoot.activeElement) {\n activeEl = activeEl.shadowRoot.activeElement;\n }\n\n if (\n activeEl &&\n (activeEl.tagName === 'INPUT' ||\n activeEl.tagName === 'TEXTAREA' ||\n activeEl.tagName === 'SELECT' ||\n (activeEl as HTMLElement).isContentEditable ||\n (activeEl as HTMLElement)?.classList?.contains('relly-search-input'))\n ) {\n return;\n }\n\n if (e.code === this.hotkey || e.key.toLowerCase() === this.hotkey.toLowerCase()) {\n e.preventDefault();\n this.onToggle();\n }\n }\n\n public setHotkey(hotkey: string | null): void {\n this.hotkey = hotkey;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.onKeyDownBound);\n }\n }\n}\n","import { SearchOptions } from '../types';\n\nexport class SearchBar {\n public element: HTMLElement;\n private inputEl: HTMLInputElement;\n private clearBtn: HTMLButtonElement;\n private ignoreCase: boolean;\n private onGlobalKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private bodyEl: HTMLElement,\n options: SearchOptions = {}\n ) {\n this.ignoreCase = options.ignoreCase !== false;\n\n this.element = document.createElement('div');\n this.element.className = 'relly-search-bar';\n\n this.inputEl = document.createElement('input');\n this.inputEl.type = 'text';\n this.inputEl.className = 'relly-search-input';\n this.inputEl.placeholder = options.placeholder || 'Filter settings... (Press \"/\" to focus)';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.className = 'relly-search-clear';\n this.clearBtn.textContent = '✕';\n this.clearBtn.title = 'Clear search';\n this.clearBtn.style.display = 'none';\n\n this.element.appendChild(this.inputEl);\n this.element.appendChild(this.clearBtn);\n\n this.inputEl.addEventListener('input', () => {\n this.filter(this.inputEl.value);\n });\n\n this.inputEl.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n this.clear();\n this.inputEl.blur();\n }\n });\n\n this.inputEl.addEventListener('keyup', (e) => {\n e.stopPropagation();\n });\n\n this.inputEl.addEventListener('keypress', (e) => {\n e.stopPropagation();\n });\n\n this.clearBtn.addEventListener('click', () => {\n this.clear();\n this.inputEl.focus();\n });\n\n this.onGlobalKeyDownBound = this.onGlobalKeyDown.bind(this);\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', this.onGlobalKeyDownBound);\n }\n }\n\n private onGlobalKeyDown(e: KeyboardEvent): void {\n if (e.key === '/') {\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n for (const target of path) {\n if (target instanceof HTMLElement) {\n const tag = target.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n target.isContentEditable ||\n target.classList.contains('relly-search-input')\n ) {\n return;\n }\n }\n }\n\n let activeEl: Element | null = document.activeElement;\n while (activeEl && activeEl.shadowRoot && activeEl.shadowRoot.activeElement) {\n activeEl = activeEl.shadowRoot.activeElement;\n }\n\n const isInput =\n activeEl instanceof HTMLInputElement ||\n activeEl instanceof HTMLTextAreaElement ||\n activeEl instanceof HTMLSelectElement ||\n (activeEl as HTMLElement)?.isContentEditable ||\n (activeEl as HTMLElement)?.classList?.contains('relly-search-input');\n\n if (!isInput) {\n e.preventDefault();\n this.focus();\n }\n }\n }\n\n public focus(): this {\n this.inputEl.focus();\n this.inputEl.select();\n return this;\n }\n\n public getInput(): HTMLInputElement {\n return this.inputEl;\n }\n\n public filter(query: string): void {\n const rawQuery = query.trim();\n if (!rawQuery) {\n this.clearBtn.style.display = 'none';\n this.resetFilter();\n return;\n }\n\n this.clearBtn.style.display = 'block';\n const normalizedQuery = this.ignoreCase ? rawQuery.toLowerCase() : rawQuery;\n\n // Search in rows\n const rows = this.bodyEl.querySelectorAll<HTMLElement>('.relly-row, .relly-graph-row');\n rows.forEach((row) => {\n const labelEl = row.querySelector('.relly-row-label, .relly-graph-header span');\n const text = labelEl?.textContent || '';\n const targetText = this.ignoreCase ? text.toLowerCase() : text;\n const matches = targetText.includes(normalizedQuery);\n\n if (matches) {\n row.classList.remove('relly-search-hidden');\n // If parent is a section, make sure section is visible and expanded\n const parentSection = row.closest<HTMLElement>('.relly-section');\n if (parentSection) {\n parentSection.classList.remove('relly-section--collapsed');\n parentSection.classList.remove('relly-search-hidden');\n }\n } else {\n row.classList.add('relly-search-hidden');\n }\n });\n\n // Check sections: if section title itself matches query, show all its rows\n const sections = this.bodyEl.querySelectorAll<HTMLElement>('.relly-section');\n sections.forEach((sec) => {\n const titleEl = sec.querySelector('.relly-section-title-wrap span:last-child');\n const secTitle = titleEl?.textContent || '';\n const targetSecTitle = this.ignoreCase ? secTitle.toLowerCase() : secTitle;\n\n if (targetSecTitle.includes(normalizedQuery)) {\n sec.classList.remove('relly-search-hidden');\n sec.classList.remove('relly-section--collapsed');\n sec.querySelectorAll<HTMLElement>('.relly-row, .relly-graph-row').forEach((r) => {\n r.classList.remove('relly-search-hidden');\n });\n } else {\n // If none of the section's rows match, hide the section\n const visibleRows = sec.querySelectorAll<HTMLElement>(\n '.relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)'\n );\n if (visibleRows.length === 0) {\n sec.classList.add('relly-search-hidden');\n }\n }\n });\n }\n\n public clear(): void {\n this.inputEl.value = '';\n this.clearBtn.style.display = 'none';\n this.resetFilter();\n }\n\n private resetFilter(): void {\n const hiddenEls = this.bodyEl.querySelectorAll<HTMLElement>('.relly-search-hidden');\n hiddenEls.forEach((el) => {\n el.classList.remove('relly-search-hidden');\n });\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.onGlobalKeyDownBound);\n }\n this.element.remove();\n }\n}\n","import { SoundPack } from '../types';\n\nexport class SoundEngine {\n private ctx: AudioContext | null = null;\n private enabled: boolean = true;\n private volume: number = 1.0;\n private soundPack: SoundPack = 'synth';\n\n constructor(enabled: boolean = true, soundPack: SoundPack = 'synth') {\n this.enabled = enabled;\n this.soundPack = soundPack;\n }\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n public setVolume(vol: number): void {\n this.volume = Math.max(0, Math.min(1, vol));\n }\n\n public getVolume(): number {\n return this.volume;\n }\n\n public setSoundPack(pack: SoundPack): this {\n this.soundPack = pack;\n return this;\n }\n\n public getSoundPack(): SoundPack {\n return this.soundPack;\n }\n\n private initCtx(): AudioContext | null {\n if (!this.enabled || this.volume <= 0 || typeof window === 'undefined') return null;\n if (!this.ctx) {\n const AudioCtx = window.AudioContext || (window as any).webkitAudioContext;\n if (AudioCtx) {\n this.ctx = new AudioCtx();\n }\n }\n if (this.ctx && this.ctx.state === 'suspended') {\n this.ctx.resume().catch(() => {});\n }\n return this.ctx;\n }\n\n public playClick(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(2400, now);\n osc.frequency.exponentialRampToValueAtTime(450, now + 0.012);\n gain.gain.setValueAtTime(0.06 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.012);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.013);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(320, now);\n osc.frequency.exponentialRampToValueAtTime(1250, now + 0.022);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.022);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.024);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(987.77, now);\n osc.frequency.setValueAtTime(1318.51, now + 0.01);\n gain.gain.setValueAtTime(0.028 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.022);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(800, now);\n osc.frequency.exponentialRampToValueAtTime(350, now + 0.015);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.015);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.016);\n }\n } catch {\n // Audio context error or blocked\n }\n }\n\n public playToggle(state: boolean): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n const startFreq = state ? 2800 : 1800;\n const endFreq = state ? 900 : 400;\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.018);\n gain.gain.setValueAtTime(0.055 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n const startFreq = state ? 380 : 900;\n const endFreq = state ? 1100 : 280;\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.028);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.028);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.03);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n const f1 = state ? 523.25 : 659.25;\n const f2 = state ? 783.99 : 392.0;\n osc.frequency.setValueAtTime(f1, now);\n osc.frequency.setValueAtTime(f2, now + 0.015);\n gain.gain.setValueAtTime(0.025 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.03);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.032);\n } else {\n osc.type = 'triangle';\n const freq = state ? 650 : 450;\n osc.frequency.setValueAtTime(freq, now);\n osc.frequency.exponentialRampToValueAtTime(freq * 1.1, now + 0.025);\n gain.gain.setValueAtTime(0.035 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.026);\n }\n } catch {\n // Ignore\n }\n }\n\n public playNotify(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n if (this.soundPack === 'arcade') {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'square';\n osc.frequency.setValueAtTime(523.25, now);\n osc.frequency.setValueAtTime(659.25, now + 0.04);\n osc.frequency.setValueAtTime(783.99, now + 0.08);\n osc.frequency.setValueAtTime(1046.50, now + 0.12);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.18);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.19);\n } else if (this.soundPack === 'bubble') {\n const osc1 = ctx.createOscillator();\n const gain1 = ctx.createGain();\n osc1.type = 'sine';\n osc1.frequency.setValueAtTime(400, now);\n osc1.frequency.exponentialRampToValueAtTime(950, now + 0.05);\n gain1.gain.setValueAtTime(0.04 * this.volume, now);\n gain1.gain.exponentialRampToValueAtTime(0.0001, now + 0.05);\n osc1.connect(gain1);\n gain1.connect(ctx.destination);\n osc1.start(now);\n osc1.stop(now + 0.06);\n\n const osc2 = ctx.createOscillator();\n const gain2 = ctx.createGain();\n osc2.type = 'sine';\n osc2.frequency.setValueAtTime(550, now + 0.05);\n osc2.frequency.exponentialRampToValueAtTime(1400, now + 0.11);\n gain2.gain.setValueAtTime(0.04 * this.volume, now + 0.05);\n gain2.gain.exponentialRampToValueAtTime(0.0001, now + 0.11);\n osc2.connect(gain2);\n gain2.connect(ctx.destination);\n osc2.start(now + 0.05);\n osc2.stop(now + 0.12);\n } else {\n const osc1 = ctx.createOscillator();\n const gain1 = ctx.createGain();\n osc1.type = this.soundPack === 'mechanical' ? 'triangle' : 'sine';\n osc1.frequency.setValueAtTime(523.25, now);\n gain1.gain.setValueAtTime(0.04 * this.volume, now);\n gain1.gain.exponentialRampToValueAtTime(0.0001, now + 0.06);\n osc1.connect(gain1);\n gain1.connect(ctx.destination);\n osc1.start(now);\n osc1.stop(now + 0.07);\n\n const osc2 = ctx.createOscillator();\n const gain2 = ctx.createGain();\n osc2.type = this.soundPack === 'mechanical' ? 'triangle' : 'sine';\n osc2.frequency.setValueAtTime(783.99, now + 0.05);\n gain2.gain.setValueAtTime(0.04 * this.volume, now + 0.05);\n gain2.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n osc2.connect(gain2);\n gain2.connect(ctx.destination);\n osc2.start(now + 0.05);\n osc2.stop(now + 0.13);\n }\n } catch {\n // Ignore\n }\n }\n\n public playSnap(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(450, now);\n osc.frequency.exponentialRampToValueAtTime(120, now + 0.025);\n gain.gain.setValueAtTime(0.06 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(260, now);\n osc.frequency.exponentialRampToValueAtTime(650, now + 0.035);\n gain.gain.setValueAtTime(0.05 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.035);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(220, now);\n osc.frequency.setValueAtTime(110, now + 0.015);\n gain.gain.setValueAtTime(0.035 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.035);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(260, now);\n osc.frequency.exponentialRampToValueAtTime(80, now + 0.03);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.03);\n }\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.038);\n } catch {\n // Ignore\n }\n }\n\n public playMiniHud(isEntering: boolean = true): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n osc.type = this.soundPack === 'arcade' ? 'square' : 'sine';\n const startFreq = isEntering ? 380 : 640;\n const endFreq = isEntering ? 680 : 340;\n\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.05);\n\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.05);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now);\n osc.stop(now + 0.055);\n } catch {\n // Ignore\n }\n }\n\n public playTick(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(3200, now);\n osc.frequency.exponentialRampToValueAtTime(800, now + 0.006);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(850, now);\n osc.frequency.exponentialRampToValueAtTime(1350, now + 0.01);\n gain.gain.setValueAtTime(0.02 * this.volume, now);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(1174.66, now);\n gain.gain.setValueAtTime(0.018 * this.volume, now);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(1800, now);\n osc.frequency.exponentialRampToValueAtTime(800, now + 0.008);\n gain.gain.setValueAtTime(0.015 * this.volume, now);\n }\n\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.009);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.01);\n } catch {\n // Ignore\n }\n }\n\n public playTab(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(1900, now);\n osc.frequency.exponentialRampToValueAtTime(600, now + 0.014);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.014);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.016);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(450, now);\n osc.frequency.exponentialRampToValueAtTime(1100, now + 0.02);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.022);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(659.25, now);\n gain.gain.setValueAtTime(0.025 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n } else {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(700, now);\n osc.frequency.exponentialRampToValueAtTime(500, now + 0.018);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n }\n } catch {\n // Ignore\n }\n }\n}\n","export class ImportModal {\n public element: HTMLElement;\n private textareaEl: HTMLTextAreaElement;\n private errorEl: HTMLElement;\n private dropzoneEl: HTMLElement;\n private fileInput: HTMLInputElement;\n\n constructor(\n private parentEl: HTMLElement,\n private onApply: (data: Record<string, any>) => void\n ) {\n this.element = document.createElement('div');\n this.element.className = 'relly-modal-backdrop';\n\n const modal = document.createElement('div');\n modal.className = 'relly-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'relly-modal-header';\n\n const title = document.createElement('span');\n title.className = 'relly-modal-title';\n title.textContent = 'Import JSON Config';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'relly-header-btn';\n closeBtn.textContent = '✕';\n closeBtn.addEventListener('click', () => this.hide());\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n modal.appendChild(header);\n\n // Dropzone\n this.dropzoneEl = document.createElement('div');\n this.dropzoneEl.className = 'relly-dropzone';\n this.dropzoneEl.innerHTML = `\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"17 8 12 3 7 8\"></polyline>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n </svg>\n <span>Drag & drop a <strong>.json</strong> file here, or click to browse</span>\n `;\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.accept = '.json,application/json';\n this.fileInput.style.display = 'none';\n\n this.dropzoneEl.addEventListener('click', () => this.fileInput.click());\n this.fileInput.addEventListener('change', (e) => this.handleFileSelect(e));\n\n // Drag & Drop events\n this.dropzoneEl.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzoneEl.classList.add('relly-dropzone-drag');\n });\n this.dropzoneEl.addEventListener('dragleave', () => {\n this.dropzoneEl.classList.remove('relly-dropzone-drag');\n });\n this.dropzoneEl.addEventListener('drop', (e) => {\n e.preventDefault();\n this.dropzoneEl.classList.remove('relly-dropzone-drag');\n if (e.dataTransfer && e.dataTransfer.files.length > 0) {\n this.readFile(e.dataTransfer.files[0]);\n }\n });\n\n modal.appendChild(this.dropzoneEl);\n modal.appendChild(this.fileInput);\n\n // Textarea\n this.textareaEl = document.createElement('textarea');\n this.textareaEl.className = 'relly-import-textarea';\n this.textareaEl.placeholder = 'Paste JSON configuration here...';\n modal.appendChild(this.textareaEl);\n\n // Error message\n this.errorEl = document.createElement('div');\n this.errorEl.className = 'relly-import-error';\n modal.appendChild(this.errorEl);\n\n // Actions\n const actions = document.createElement('div');\n actions.className = 'relly-modal-actions';\n\n const cancelBtn = document.createElement('button');\n cancelBtn.className = 'relly-btn';\n cancelBtn.textContent = 'Cancel';\n cancelBtn.style.flex = '1';\n cancelBtn.addEventListener('click', () => this.hide());\n\n const applyBtn = document.createElement('button');\n applyBtn.className = 'relly-btn relly-btn-primary';\n applyBtn.textContent = 'Apply & Load';\n applyBtn.style.flex = '2';\n applyBtn.addEventListener('click', () => this.apply());\n\n actions.appendChild(cancelBtn);\n actions.appendChild(applyBtn);\n modal.appendChild(actions);\n\n this.element.appendChild(modal);\n\n // Close on clicking backdrop\n this.element.addEventListener('click', (e) => {\n if (e.target === this.element) {\n this.hide();\n }\n });\n\n this.parentEl.appendChild(this.element);\n }\n\n private handleFileSelect(e: Event): void {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n this.readFile(target.files[0]);\n }\n }\n\n private readFile(file: File): void {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n this.textareaEl.value = reader.result;\n this.errorEl.textContent = '';\n }\n };\n reader.readAsText(file);\n }\n\n public show(): void {\n this.errorEl.textContent = '';\n this.element.classList.add('relly-modal-show');\n this.textareaEl.focus();\n }\n\n public hide(): void {\n this.element.classList.remove('relly-modal-show');\n }\n\n private apply(): void {\n const raw = this.textareaEl.value.trim();\n if (!raw) {\n this.errorEl.textContent = 'Please paste JSON or drop a file.';\n return;\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('JSON root must be an object.');\n }\n this.onApply(parsed);\n this.hide();\n this.textareaEl.value = '';\n this.errorEl.textContent = '';\n } catch (err: any) {\n this.errorEl.textContent = `Invalid JSON: ${err.message || 'Syntax error'}`;\n }\n }\n\n public destroy(): void {\n this.element.remove();\n }\n}\n","import { ContainerHelper } from './ComponentContainer';\nimport { SchemaDefinition, SchemaControl } from '../types';\n\nexport class SchemaLoader {\n public static load(container: ContainerHelper, schema: SchemaDefinition): void {\n const defaultTarget = schema.target;\n\n const loadControls = (targetContainer: ContainerHelper, controls: SchemaControl[]) => {\n for (const ctrl of controls) {\n const subControls = ctrl.children || (ctrl as any).controls;\n\n if (ctrl.type === 'section') {\n const section = (targetContainer as any).addSection(\n ctrl.label || 'Section',\n ctrl.collapsed\n );\n if (ctrl.showIf && section.showIf) {\n section.showIf(ctrl.showIf);\n }\n if (subControls && Array.isArray(subControls)) {\n loadControls(section, subControls);\n }\n } else if (ctrl.type === 'row') {\n const row = (targetContainer as any).addRow();\n if (subControls && Array.isArray(subControls)) {\n loadControls(row, subControls);\n }\n } else {\n const opts = {\n ...ctrl,\n object: ctrl.object !== undefined ? ctrl.object : defaultTarget\n };\n targetContainer.createComponent(opts);\n }\n }\n };\n\n if (schema.controls && Array.isArray(schema.controls)) {\n loadControls(container, schema.controls);\n }\n }\n}\n","import { ToastType } from '../types';\nimport { SoundEngine } from './SoundEngine';\n\nexport class ToastManager {\n private containerEl: HTMLElement;\n\n constructor(\n private parentEl: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-toast-container';\n this.parentEl.appendChild(this.containerEl);\n }\n\n public notify(\n message: string,\n type: ToastType = 'info',\n duration: number = 2600\n ): HTMLElement {\n this.soundEngine?.playNotify();\n\n const toast = document.createElement('div');\n toast.className = `relly-toast relly-toast--${type}`;\n\n const iconEl = document.createElement('span');\n iconEl.className = 'relly-toast-icon';\n iconEl.innerHTML = this.getIconSvg(type);\n\n const msgEl = document.createElement('span');\n msgEl.className = 'relly-toast-msg';\n msgEl.textContent = message;\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'relly-toast-close';\n closeBtn.innerHTML = '✕';\n closeBtn.title = 'Dismiss';\n\n toast.appendChild(iconEl);\n toast.appendChild(msgEl);\n toast.appendChild(closeBtn);\n\n const dismiss = () => {\n if (toast.classList.contains('relly-toast-leave')) return;\n toast.classList.add('relly-toast-leave');\n setTimeout(() => {\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n }, 200);\n };\n\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n dismiss();\n });\n\n toast.addEventListener('click', dismiss);\n\n this.containerEl.appendChild(toast);\n\n // Trigger enter animation\n requestAnimationFrame(() => {\n toast.classList.add('relly-toast-enter');\n });\n\n if (duration > 0) {\n setTimeout(dismiss, duration);\n }\n\n return toast;\n }\n\n private getIconSvg(type: ToastType): string {\n switch (type) {\n case 'success':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n case 'warning':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line></svg>`;\n case 'error':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line></svg>`;\n case 'info':\n default:\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>`;\n }\n }\n\n public destroy(): void {\n if (this.containerEl.parentElement) {\n this.containerEl.parentElement.removeChild(this.containerEl);\n }\n }\n}\n","import { ContextMenuItem } from '../types';\nimport { BaseComponent } from './BaseComponent';\nimport { SoundEngine } from './SoundEngine';\n\nexport class ContextMenuManager {\n private menuEl: HTMLElement;\n private currentComponent?: BaseComponent;\n private onDocClickBound: (e: MouseEvent) => void;\n private onKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private panelEl: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.menuEl = document.createElement('div');\n this.menuEl.className = 'relly-context-menu';\n this.menuEl.style.display = 'none';\n this.panelEl.appendChild(this.menuEl);\n\n this.onDocClickBound = (e: MouseEvent) => {\n if (!this.menuEl.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n this.onKeyDownBound = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hide();\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('click', this.onDocClickBound);\n window.addEventListener('keydown', this.onKeyDownBound);\n }\n\n this.panelEl.addEventListener('contextmenu', this.onContextMenu);\n }\n\n private onContextMenu = (e: MouseEvent): void => {\n // Find closest component element\n let target = e.target as HTMLElement | null;\n let componentEl = target?.closest('.relly-row, .relly-graph-row') as HTMLElement | null;\n if (!componentEl) return;\n\n const component = (componentEl as any).__rellyComponent as BaseComponent | undefined;\n const items = component?.getContextMenu();\n\n if (!items || items.length === 0) {\n return; // UI creator has not configured context menu for this control\n }\n\n e.preventDefault();\n e.stopPropagation();\n this.currentComponent = component;\n this.show(items, e.clientX, e.clientY);\n };\n\n public show(items: ContextMenuItem[], clientX: number, clientY: number): void {\n this.menuEl.innerHTML = '';\n\n for (const item of items) {\n if (item.separator) {\n const sep = document.createElement('div');\n sep.className = 'relly-context-separator';\n this.menuEl.appendChild(sep);\n continue;\n }\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-context-item';\n if (item.danger) btn.classList.add('relly-context-item--danger');\n if (item.disabled) btn.disabled = true;\n\n let iconHtml = '';\n if (item.icon) {\n iconHtml = `<span class=\"relly-context-icon\">${item.icon}</span>`;\n }\n\n btn.innerHTML = `${iconHtml}<span class=\"relly-context-label\">${item.label}</span>`;\n\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine?.playClick();\n const comp = this.currentComponent;\n this.hide();\n item.action(comp);\n });\n\n this.menuEl.appendChild(btn);\n }\n\n this.menuEl.style.display = 'flex';\n\n // Position relative to panel\n const panelRect = this.panelEl.getBoundingClientRect();\n let left = clientX - panelRect.left;\n let top = clientY - panelRect.top;\n\n const menuWidth = 160;\n const menuHeight = this.menuEl.offsetHeight || 120;\n\n if (left + menuWidth > panelRect.width) {\n left = Math.max(4, panelRect.width - menuWidth - 4);\n }\n if (top + menuHeight > panelRect.height) {\n top = Math.max(4, panelRect.height - menuHeight - 4);\n }\n\n this.menuEl.style.left = `${left}px`;\n this.menuEl.style.top = `${top}px`;\n }\n\n public hide(): void {\n this.menuEl.style.display = 'none';\n this.currentComponent = undefined;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('click', this.onDocClickBound);\n window.removeEventListener('keydown', this.onKeyDownBound);\n }\n this.panelEl.removeEventListener('contextmenu', this.onContextMenu);\n if (this.menuEl.parentElement) {\n this.menuEl.parentElement.removeChild(this.menuEl);\n }\n }\n}\n","import { ContainerHelper } from '../../core/ComponentContainer';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Tab extends ContainerHelper {\n public contentEl: HTMLElement;\n public buttonEl: HTMLButtonElement;\n\n constructor(\n private label: string,\n bindingEngine: BindingEngine,\n presetManager: PresetManager,\n soundEngine?: SoundEngine\n ) {\n const content = document.createElement('div');\n content.className = 'relly-tab-content';\n super(content, bindingEngine, presetManager, soundEngine);\n\n this.contentEl = content;\n\n this.buttonEl = document.createElement('button');\n this.buttonEl.className = 'relly-tab-btn';\n this.buttonEl.textContent = label;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public setActive(active: boolean): void {\n if (active) {\n this.buttonEl.classList.add('relly-tab-active');\n this.contentEl.classList.add('relly-tab-content--active');\n } else {\n this.buttonEl.classList.remove('relly-tab-active');\n this.contentEl.classList.remove('relly-tab-content--active');\n }\n }\n\n public destroy(): void {\n this.destroyChildren();\n this.buttonEl.remove();\n this.contentEl.remove();\n }\n}\n","import { Tab } from './Tab';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class TabsManager {\n public barEl: HTMLElement;\n public bodyEl: HTMLElement;\n private tabs: Tab[] = [];\n private activeTab: Tab | null = null;\n\n constructor(\n parentHeader: HTMLElement,\n parentBody: HTMLElement,\n private bindingEngine: BindingEngine,\n private presetManager: PresetManager,\n private soundEngine?: SoundEngine\n ) {\n this.barEl = document.createElement('div');\n this.barEl.className = 'relly-tabs-bar';\n this.barEl.style.display = 'none'; // Hidden until first tab is added\n\n this.bodyEl = parentBody;\n parentHeader.insertAdjacentElement('afterend', this.barEl);\n }\n\n public addTab(label: string): Tab {\n this.barEl.style.display = 'flex';\n\n const tab = new Tab(label, this.bindingEngine, this.presetManager, this.soundEngine);\n this.tabs.push(tab);\n\n this.barEl.appendChild(tab.buttonEl);\n this.bodyEl.appendChild(tab.contentEl);\n\n tab.buttonEl.addEventListener('click', () => {\n this.switchTab(tab);\n });\n\n // If first tab, make it active\n if (this.tabs.length === 1) {\n this.switchTab(tab, false);\n }\n\n return tab;\n }\n\n public switchTab(tab: Tab, playSound: boolean = true): void {\n if (this.activeTab !== tab && playSound) {\n this.soundEngine?.playTab();\n }\n this.activeTab = tab;\n for (const t of this.tabs) {\n t.setActive(t === tab);\n }\n }\n\n public getActiveTab(): Tab | null {\n return this.activeTab;\n }\n\n public destroy(): void {\n for (const tab of this.tabs) {\n tab.destroy();\n }\n this.tabs = [];\n this.barEl.remove();\n }\n}\n","import cssContent from './index.css?inline';\n\nconst STYLE_ID = 'relly-ui-stylesheet';\n\nexport function injectStyles(targetRoot?: Document | ShadowRoot): void {\n const root = targetRoot || (typeof document !== 'undefined' ? document : null);\n if (!root) return;\n\n // Check if style already exists in this root\n if ('getElementById' in root && root.getElementById(STYLE_ID)) return;\n if ('querySelector' in root && root.querySelector(`#${STYLE_ID}`)) return;\n\n const styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n styleEl.textContent = cssContent;\n\n if ('head' in root && root.head) {\n root.head.appendChild(styleEl);\n } else {\n root.appendChild(styleEl);\n }\n}\n","import { ContainerHelper } from './core/ComponentContainer';\nimport { BindingEngine } from './core/BindingEngine';\nimport { PresetManager } from './core/PresetManager';\nimport { ThemeManager } from './core/ThemeManager';\nimport { Draggable } from './core/Draggable';\nimport { Resizable } from './core/Resizable';\nimport { HotkeyManager } from './core/HotkeyManager';\nimport { SearchBar } from './core/SearchBar';\nimport { SoundEngine } from './core/SoundEngine';\nimport { ImportModal } from './core/ImportModal';\nimport { SchemaLoader } from './core/SchemaLoader';\nimport { ToastManager } from './core/ToastManager';\nimport { ContextMenuManager } from './core/ContextMenuManager';\nimport { Tab } from './components/Tabs/Tab';\nimport { TabsManager } from './components/Tabs/TabsManager';\nimport { RellyUIOptions, ThemeInput, SchemaDefinition, SoundPack, ToastType } from './types';\nimport { injectStyles } from './styles/injector';\n\nexport class RellyUI extends ContainerHelper {\n public static version: string = '1.0.0';\n\n private hostEl?: HTMLElement;\n private shadowRoot: ShadowRoot | null = null;\n private panelEl: HTMLElement;\n private headerEl: HTMLElement;\n private titleEl: HTMLElement;\n private collapseBtn: HTMLButtonElement;\n private copyToastEl: HTMLElement;\n\n private themeManager: ThemeManager;\n protected override soundEngine: SoundEngine;\n private draggableInstance?: Draggable;\n private resizableInstance?: Resizable;\n private hotkeyInstance?: HotkeyManager;\n private searchBarInstance?: SearchBar;\n private tabsManagerInstance?: TabsManager;\n private importModalInstance?: ImportModal;\n private toastManager: ToastManager;\n private contextMenuManager: ContextMenuManager;\n\n private isPanelCollapsed: boolean = false;\n private isPanelHidden: boolean = false;\n private isMiniHud: boolean = false;\n private ghostOnIdle: boolean = false;\n private idleOpacity: number = 0.38;\n private onResizeBound: () => void;\n\n private autoSave: boolean = false;\n private autoSaveKey: string = 'relly-ui-session';\n private autoSaveTimeout: any = null;\n\n private sparklineCtx?: CanvasRenderingContext2D | null;\n private sparklineData: number[] = [12, 14, 15, 18, 16, 20, 22, 21, 24, 25, 28, 30];\n private sparklineAnimId?: number;\n\n constructor(options: RellyUIOptions = {}) {\n const useShadow = options.shadowDOM !== false;\n const bindingEngine = new BindingEngine();\n const presetManager = new PresetManager();\n\n // Sound engine\n const soundEngine = new SoundEngine(options.sound !== false, options.soundPack || 'synth');\n\n // Create Panel Element\n const panel = document.createElement('div');\n panel.className = 'relly-panel';\n\n const width = options.width ?? 280;\n panel.style.width = typeof width === 'number' ? `${width}px` : width;\n\n if (options.height) {\n const height = options.height;\n panel.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n\n // Header Element\n const header = document.createElement('div');\n header.className = 'relly-header';\n\n const titleWrap = document.createElement('div');\n titleWrap.className = 'relly-header-title';\n titleWrap.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line>\n <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line>\n </svg>\n `;\n\n const title = document.createElement('span');\n title.textContent = options.title || 'RellyUI';\n titleWrap.appendChild(title);\n\n const actions = document.createElement('div');\n actions.className = 'relly-header-actions';\n\n // Copy JSON button\n const copyBtn = document.createElement('button');\n copyBtn.className = 'relly-header-btn';\n copyBtn.title = 'Copy settings as JSON';\n copyBtn.innerHTML = `\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n `;\n actions.appendChild(copyBtn);\n\n // Import JSON button\n const importBtn = document.createElement('button');\n importBtn.className = 'relly-header-btn';\n importBtn.title = 'Import settings from JSON';\n importBtn.innerHTML = `\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n `;\n actions.appendChild(importBtn);\n\n // Mini-HUD button\n const miniHudBtn = document.createElement('button');\n miniHudBtn.className = 'relly-header-btn relly-minihud-btn';\n miniHudBtn.title = 'Toggle Mini-HUD pill (or double-click header)';\n miniHudBtn.textContent = '⤢';\n actions.appendChild(miniHudBtn);\n\n // Collapse button\n const collapseBtn = document.createElement('button');\n collapseBtn.className = 'relly-header-btn';\n collapseBtn.title = 'Collapse/Expand';\n collapseBtn.textContent = '_';\n actions.appendChild(collapseBtn);\n\n header.appendChild(titleWrap);\n header.appendChild(actions);\n panel.appendChild(header);\n\n // Copy Toast Notification\n const copyToast = document.createElement('div');\n copyToast.className = 'relly-copy-toast';\n copyToast.textContent = 'JSON Copied!';\n panel.appendChild(copyToast);\n\n // Body container for rows and sections\n const body = document.createElement('div');\n body.className = 'relly-body';\n if (options.height) {\n body.style.maxHeight = 'none';\n body.style.flex = '1';\n }\n panel.appendChild(body);\n\n super(body, bindingEngine, presetManager, soundEngine);\n\n this.panelEl = panel;\n this.headerEl = header;\n this.titleEl = title;\n this.collapseBtn = collapseBtn;\n this.copyToastEl = copyToast;\n this.soundEngine = soundEngine;\n this.onResizeBound = () => this.clampToViewport();\n\n // Search Bar\n if (options.searchBar) {\n this.searchBarInstance = new SearchBar(body, options.searchOptions);\n header.insertAdjacentElement('afterend', this.searchBarInstance.element);\n }\n\n // Initialize Theme\n this.themeManager = new ThemeManager(this.panelEl, options.theme);\n\n // Mount to DOM (Shadow DOM or direct)\n this.mount(options, useShadow);\n\n // Auto-inject styles\n if (options.autoInjectStyles !== false) {\n if (this.shadowRoot) {\n injectStyles(this.shadowRoot);\n } else {\n injectStyles();\n }\n }\n\n // Draggable\n if (options.draggable !== false) {\n this.draggableInstance = new Draggable(this.headerEl, this.panelEl, this.soundEngine);\n }\n\n // Resizable\n if (options.resizable !== false) {\n this.resizableInstance = new Resizable(this.panelEl);\n }\n\n // Toast & Context Menu Managers\n this.toastManager = new ToastManager(this.panelEl, this.soundEngine);\n this.contextMenuManager = new ContextMenuManager(this.panelEl, this.soundEngine);\n\n // Import Modal\n this.importModalInstance = new ImportModal(this.panelEl, (data) => {\n this.importJSON(data);\n });\n\n // Hotkey toggle\n const hotkey = options.hotkey === undefined ? 'KeyH' : options.hotkey;\n if (hotkey) {\n this.hotkeyInstance = new HotkeyManager(hotkey, () => {\n this.toggle();\n });\n }\n\n // Mini-HUD toggle button\n miniHudBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleMiniHud();\n });\n\n // Double-click header to toggle Mini-HUD\n this.headerEl.addEventListener('dblclick', (e) => {\n if ((e.target as HTMLElement).closest('.relly-header-btn')) return;\n this.toggleMiniHud();\n });\n\n // Collapse toggle button\n this.collapseBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.toggleCollapse();\n });\n\n // Copy button\n copyBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.copyJSON();\n });\n\n // Import button\n importBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.importModalInstance?.show();\n });\n\n if (options.soundVolume !== undefined) {\n this.soundEngine.setVolume(options.soundVolume);\n }\n\n if (options.accordion) {\n this.setAccordion(true);\n }\n\n if (options.ghostOnIdle) {\n this.setGhostMode(true, options.idleOpacity);\n }\n\n this.initSparkline(titleWrap);\n\n // Ghost mode hover listeners\n this.panelEl.addEventListener('mouseenter', () => {\n if (this.ghostOnIdle) {\n this.panelEl.style.opacity = '1';\n }\n });\n\n this.panelEl.addEventListener('mouseleave', () => {\n if (this.ghostOnIdle) {\n this.panelEl.style.opacity = `${this.idleOpacity}`;\n }\n });\n\n if (options.collapsed) {\n this.setCollapsed(true);\n }\n\n // Auto-Save setup\n this.autoSave = options.autoSave ?? false;\n this.autoSaveKey = options.autoSaveKey ?? 'relly-ui-session';\n\n this.presetManager.setOnChange(() => {\n if (this.autoSave) {\n this.queueAutoSave();\n }\n });\n\n this.panelEl.addEventListener('mouseup', () => {\n if (this.autoSave) {\n this.queueAutoSave();\n }\n });\n\n if (this.autoSave) {\n this.loadSession();\n }\n }\n\n private mount(options: RellyUIOptions, useShadow: boolean): void {\n if (typeof document === 'undefined') return;\n\n const pos = options.position || {};\n this.panelEl.style.top = pos.top !== undefined ? `${pos.top}px` : '20px';\n if (pos.left !== undefined) {\n this.panelEl.style.left = `${pos.left}px`;\n } else {\n this.panelEl.style.right = pos.right !== undefined ? `${pos.right}px` : '20px';\n }\n if (pos.bottom !== undefined) {\n this.panelEl.style.bottom = `${pos.bottom}px`;\n }\n\n const container = options.container\n ? typeof options.container === 'string'\n ? document.querySelector<HTMLElement>(options.container)\n : options.container\n : document.body;\n\n if (!container) return;\n\n if (useShadow && typeof container.attachShadow === 'function') {\n const host = document.createElement('div');\n host.className = 'relly-host';\n this.hostEl = host;\n this.shadowRoot = host.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(this.panelEl);\n container.appendChild(host);\n } else {\n container.appendChild(this.panelEl);\n if (options.container) {\n this.panelEl.style.position = 'relative';\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n setTimeout(() => {\n this.clampToViewport();\n }, 0);\n }\n }\n\n public addTab(label: string): Tab {\n if (!this.tabsManagerInstance) {\n this.tabsManagerInstance = new TabsManager(\n this.headerEl,\n this.contentEl,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n }\n return this.tabsManagerInstance.addTab(label);\n }\n\n public createTab(label: string): Tab {\n return this.addTab(label);\n }\n\n public copyJSON(): string {\n const data = this.export();\n const jsonStr = JSON.stringify(data, null, 2);\n\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(jsonStr).catch(() => {});\n }\n\n // Flash toast notification\n this.copyToastEl.textContent = 'JSON Copied!';\n this.copyToastEl.classList.add('relly-toast-show');\n this.soundEngine.playNotify();\n setTimeout(() => {\n this.copyToastEl.classList.remove('relly-toast-show');\n }, 1500);\n\n return jsonStr;\n }\n\n public notify(message: string, type: ToastType = 'info', duration: number = 2600): HTMLElement {\n return this.toastManager.notify(message, type, duration);\n }\n\n public getToastManager(): ToastManager {\n return this.toastManager;\n }\n\n public getContextMenuManager(): ContextMenuManager {\n return this.contextMenuManager;\n }\n\n public importJSON(json: string | Record<string, any>): this {\n try {\n const data = typeof json === 'string' ? JSON.parse(json) : json;\n this.import(data);\n this.copyToastEl.textContent = 'JSON Loaded!';\n this.copyToastEl.classList.add('relly-toast-show');\n this.soundEngine.playNotify();\n setTimeout(() => {\n this.copyToastEl.classList.remove('relly-toast-show');\n }, 1500);\n } catch (err) {\n console.warn('[RellyUI] Failed to import JSON', err);\n }\n return this;\n }\n\n public loadSchema(schema: SchemaDefinition): this {\n if (schema.title) {\n this.setTitle(schema.title);\n }\n SchemaLoader.load(this, schema);\n return this;\n }\n\n public setTitle(title: string): this {\n this.titleEl.textContent = title;\n return this;\n }\n\n public setTheme(theme: ThemeInput): this {\n this.themeManager.applyTheme(theme);\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public setSoundPack(pack: SoundPack): this {\n this.soundEngine.setSoundPack(pack);\n return this;\n }\n\n public getSoundPack(): SoundPack {\n return this.soundEngine.getSoundPack();\n }\n\n public getSoundEngine(): SoundEngine {\n return this.soundEngine;\n }\n\n public toggleMiniHud(): this {\n return this.setMiniHud(!this.isMiniHud);\n }\n\n public setMiniHud(mini: boolean): this {\n this.isMiniHud = mini;\n if (this.isMiniHud) {\n this.panelEl.classList.add('relly-mini-hud');\n this.soundEngine.playMiniHud(true);\n } else {\n this.panelEl.classList.remove('relly-mini-hud');\n this.soundEngine.playMiniHud(false);\n this.clampToViewport();\n }\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public isMiniHudMode(): boolean {\n return this.isMiniHud;\n }\n\n public setGhostMode(enabled: boolean, idleOpacity: number = 0.38): this {\n this.ghostOnIdle = enabled;\n this.idleOpacity = Math.max(0.05, Math.min(1.0, idleOpacity));\n this.panelEl.style.opacity = enabled ? `${this.idleOpacity}` : '1';\n return this;\n }\n\n public isGhostMode(): boolean {\n return this.ghostOnIdle;\n }\n\n public setSoundVolume(volume: number): this {\n this.soundEngine.setVolume(volume);\n return this;\n }\n\n public getSoundVolume(): number {\n return this.soundEngine.getVolume();\n }\n\n private initSparkline(titleWrap: HTMLElement): void {\n const canvas = document.createElement('canvas');\n canvas.className = 'relly-mini-sparkline';\n canvas.width = 48;\n canvas.height = 16;\n titleWrap.appendChild(canvas);\n\n this.sparklineCtx = canvas.getContext('2d');\n\n const animateSparkline = () => {\n if (this.isMiniHud && this.sparklineCtx) {\n this.drawSparkline();\n }\n if (typeof requestAnimationFrame !== 'undefined') {\n this.sparklineAnimId = requestAnimationFrame(animateSparkline);\n }\n };\n\n if (typeof requestAnimationFrame !== 'undefined') {\n this.sparklineAnimId = requestAnimationFrame(animateSparkline);\n }\n }\n\n private drawSparkline(): void {\n const ctx = this.sparklineCtx;\n if (!ctx) return;\n const w = 48;\n const h = 16;\n ctx.clearRect(0, 0, w, h);\n\n const last = this.sparklineData[this.sparklineData.length - 1];\n const next = Math.max(8, Math.min(26, last + (Math.random() - 0.48) * 3));\n this.sparklineData.push(next);\n if (this.sparklineData.length > 14) this.sparklineData.shift();\n\n const min = Math.min(...this.sparklineData) - 1;\n const max = Math.max(...this.sparklineData) + 1;\n const range = max - min || 1;\n const step = w / (this.sparklineData.length - 1);\n\n ctx.beginPath();\n ctx.moveTo(0, h);\n for (let i = 0; i < this.sparklineData.length; i++) {\n const x = i * step;\n const y = h - ((this.sparklineData[i] - min) / range) * (h - 2) - 1;\n if (i === 0) ctx.lineTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.lineTo(w, h);\n ctx.closePath();\n ctx.fillStyle = 'rgba(56, 189, 248, 0.25)';\n ctx.fill();\n\n ctx.beginPath();\n for (let i = 0; i < this.sparklineData.length; i++) {\n const x = i * step;\n const y = h - ((this.sparklineData[i] - min) / range) * (h - 2) - 1;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.strokeStyle = '#38bdf8';\n ctx.lineWidth = 1.4;\n ctx.stroke();\n }\n\n public clampToViewport(): this {\n this.draggableInstance?.clampToViewport();\n this.resizableInstance?.clampToViewport();\n return this;\n }\n\n public toggleCollapse(): this {\n return this.setCollapsed(!this.isPanelCollapsed);\n }\n\n public setCollapsed(collapsed: boolean): this {\n this.isPanelCollapsed = collapsed;\n if (this.isPanelCollapsed) {\n this.panelEl.classList.add('relly-collapsed');\n this.collapseBtn.textContent = '+';\n this.bindingEngine.pause();\n } else {\n this.panelEl.classList.remove('relly-collapsed');\n this.collapseBtn.textContent = '_';\n this.bindingEngine.resume();\n }\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public queueAutoSave(): void {\n if (!this.autoSave) return;\n if (this.autoSaveTimeout) {\n clearTimeout(this.autoSaveTimeout);\n }\n this.autoSaveTimeout = setTimeout(() => {\n this.saveSession();\n }, 250);\n }\n\n public saveSession(key?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n const storageKey = key || this.autoSaveKey;\n try {\n const pos = {\n left: this.panelEl.style.left ? parseFloat(this.panelEl.style.left) : undefined,\n top: this.panelEl.style.top ? parseFloat(this.panelEl.style.top) : undefined,\n right: this.panelEl.style.right ? parseFloat(this.panelEl.style.right) : undefined,\n bottom: this.panelEl.style.bottom ? parseFloat(this.panelEl.style.bottom) : undefined\n };\n\n const sessionData = {\n version: RellyUI.version,\n timestamp: Date.now(),\n isCollapsed: this.isPanelCollapsed,\n isMiniHud: this.isMiniHud,\n theme: this.themeManager.getCurrentThemeName(),\n position: pos,\n width: this.panelEl.style.width,\n height: this.panelEl.style.height,\n components: this.presetManager.export()\n };\n\n window.localStorage.setItem(storageKey, JSON.stringify(sessionData));\n } catch (err) {\n console.warn('[RellyUI] Failed to save session', err);\n }\n }\n\n public loadSession(key?: string): boolean {\n if (typeof window === 'undefined' || !window.localStorage) return false;\n const storageKey = key || this.autoSaveKey;\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return false;\n const data = JSON.parse(raw);\n if (!data || typeof data !== 'object') return false;\n\n // Restore position\n if (data.position) {\n if (data.position.left !== undefined) {\n this.panelEl.style.left = `${data.position.left}px`;\n this.panelEl.style.right = '';\n } else if (data.position.right !== undefined) {\n this.panelEl.style.right = `${data.position.right}px`;\n this.panelEl.style.left = '';\n }\n if (data.position.top !== undefined) {\n this.panelEl.style.top = `${data.position.top}px`;\n this.panelEl.style.bottom = '';\n } else if (data.position.bottom !== undefined) {\n this.panelEl.style.bottom = `${data.position.bottom}px`;\n this.panelEl.style.top = '';\n }\n }\n\n // Restore size\n if (data.width) this.panelEl.style.width = data.width;\n if (data.height) this.panelEl.style.height = data.height;\n\n // Restore theme\n if (data.theme && data.theme !== 'custom') {\n this.setTheme(data.theme);\n }\n\n // Restore collapsed state\n if (data.isCollapsed !== undefined && data.isCollapsed !== this.isPanelCollapsed) {\n this.setCollapsed(data.isCollapsed);\n }\n\n // Restore Mini-HUD state\n if (data.isMiniHud !== undefined && data.isMiniHud !== this.isMiniHud) {\n this.setMiniHud(data.isMiniHud);\n }\n\n // Restore component states via PresetManager\n if (data.components) {\n this.presetManager.import(data.components);\n }\n\n return true;\n } catch (err) {\n console.warn('[RellyUI] Failed to load session', err);\n return false;\n }\n }\n\n public clearSession(key?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n const storageKey = key || this.autoSaveKey;\n try {\n window.localStorage.removeItem(storageKey);\n } catch {}\n }\n\n public setAutoSave(enabled: boolean, key?: string): this {\n this.autoSave = enabled;\n if (key) this.autoSaveKey = key;\n if (this.autoSave) {\n this.loadSession();\n }\n return this;\n }\n\n public toggle(): this {\n return this.isPanelHidden ? this.show() : this.hide();\n }\n\n public show(): this {\n this.isPanelHidden = false;\n this.panelEl.classList.remove('relly-hidden');\n if (!this.isPanelCollapsed) {\n this.bindingEngine.resume();\n }\n return this;\n }\n\n public hide(): this {\n this.isPanelHidden = true;\n this.panelEl.classList.add('relly-hidden');\n this.bindingEngine.pause();\n return this;\n }\n\n public save(storageKey?: string): this {\n this.presetManager.save(storageKey);\n return this;\n }\n\n public load(storageKey?: string): this {\n this.presetManager.load(storageKey);\n return this;\n }\n\n public export(): Record<string, any> {\n return this.presetManager.export();\n }\n\n public import(data: Record<string, any>): this {\n this.presetManager.import(data);\n return this;\n }\n\n public getElement(): HTMLElement {\n return this.panelEl;\n }\n\n public getShadowRoot(): ShadowRoot | null {\n return this.shadowRoot;\n }\n\n public getHost(): HTMLElement | null {\n return this.hostEl || null;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onResizeBound);\n if (this.sparklineAnimId) {\n cancelAnimationFrame(this.sparklineAnimId);\n }\n }\n if (this.draggableInstance) {\n this.draggableInstance.destroy();\n }\n if (this.resizableInstance) {\n this.resizableInstance.destroy();\n }\n if (this.hotkeyInstance) {\n this.hotkeyInstance.destroy();\n }\n if (this.searchBarInstance) {\n this.searchBarInstance.destroy();\n }\n if (this.tabsManagerInstance) {\n this.tabsManagerInstance.destroy();\n }\n if (this.importModalInstance) {\n this.importModalInstance.destroy();\n }\n this.toastManager.destroy();\n this.contextMenuManager.destroy();\n this.bindingEngine.destroy();\n this.destroyChildren();\n\n if (this.hostEl) {\n this.hostEl.remove();\n } else {\n this.panelEl.remove();\n }\n }\n}\n","import './styles/index.css';\nimport { RellyUI } from './RellyUI';\nimport { Checkbox } from './components/Checkbox/Checkbox';\nimport { Slider } from './components/Slider/Slider';\nimport { Button } from './components/Button/Button';\nimport { Select } from './components/Select/Select';\nimport { DynamicLabel } from './components/DynamicLabel/DynamicLabel';\nimport { Graph } from './components/Graph/Graph';\nimport { ColorPicker } from './components/ColorPicker/ColorPicker';\nimport { Point2D } from './components/Point2D/Point2D';\nimport { Point3D } from './components/Point3D/Point3D';\nimport { RangeSlider } from './components/Range/RangeSlider';\nimport { Segmented } from './components/Segmented/Segmented';\nimport { StatusIndicator } from './components/Status/StatusIndicator';\nimport { Section } from './components/Section/Section';\nimport { Row } from './components/Row/Row';\nimport { Tab } from './components/Tabs/Tab';\nimport { TabsManager } from './components/Tabs/TabsManager';\nimport { BaseComponent } from './core/BaseComponent';\nimport { BindingEngine } from './core/BindingEngine';\nimport { PresetManager } from './core/PresetManager';\nimport {\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME\n} from './core/ThemeManager';\nimport { Draggable } from './core/Draggable';\nimport { Resizable } from './core/Resizable';\nimport { HotkeyManager } from './core/HotkeyManager';\nimport { SearchBar } from './core/SearchBar';\nimport { SoundEngine } from './core/SoundEngine';\nimport { ImportModal } from './core/ImportModal';\nimport { ToastManager } from './core/ToastManager';\nimport { ContextMenuManager } from './core/ContextMenuManager';\nimport { SchemaLoader } from './core/SchemaLoader';\nimport { ContainerHelper } from './core/ComponentContainer';\n\n// Attach static members to RellyUI class for convenient access via RellyUI.*\nObject.assign(RellyUI, {\n Checkbox,\n Slider,\n Button,\n Select,\n DynamicLabel,\n Graph,\n ColorPicker,\n Point2D,\n Point3D,\n RangeSlider,\n Segmented,\n StatusIndicator,\n Section,\n Row,\n Tab,\n TabsManager,\n BaseComponent,\n BindingEngine,\n PresetManager,\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME,\n Draggable,\n Resizable,\n HotkeyManager,\n SearchBar,\n SoundEngine,\n ImportModal,\n ToastManager,\n ContextMenuManager,\n SchemaLoader,\n ContainerHelper,\n RellyUI\n});\n\n// Named exports for modern ESM imports\nexport {\n RellyUI,\n Checkbox,\n Slider,\n Button,\n Select,\n DynamicLabel,\n Graph,\n ColorPicker,\n Point2D,\n Point3D,\n RangeSlider,\n Segmented,\n StatusIndicator,\n Section,\n Row,\n Tab,\n TabsManager,\n BaseComponent,\n BindingEngine,\n PresetManager,\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME,\n Draggable,\n Resizable,\n HotkeyManager,\n SearchBar,\n SoundEngine,\n ImportModal,\n ToastManager,\n ContextMenuManager,\n SchemaLoader,\n ContainerHelper\n};\n\nexport * from './types';\n\n// Browser global attachment for direct <script src=\"...\">\nif (typeof window !== 'undefined') {\n (window as any).RellyUI = RellyUI;\n}\n\n// Default export is the RellyUI constructor\nexport default RellyUI;\n"],"names":["BaseComponent","label","targetObject","property","bindingEngine","presetManager","__publicField","tooltip","predicate","isVisible","items","callback","value","_a","prev","disabled","el","current","Checkbox","soundEngine","nextVal","e","isChecked","Slider","val","isScrubbing","startX","startVal","onMouseMove","ev","dx","stepMultiplier","stepDelta","deltaVal","newVal","decimals","onMouseUp","now","min","max","step","Button","onClick","Select","options","selectedKey","actualValue","item","key","optEl","currentVal","DynamicLabel","v","formatter","Graph","rect","x","width","index","clampedIndex","header","dpr","w","h","crosshairX","html","series","startIndex","bufIdx","tooltipWidth","leftPos","paused","ms","smooth","fn","enabled","lineColor","fillColor","size","s","height","id","numVal","latestVal","allVals","pausedBadge","ctx","p","y","minVal","maxVal","pad","range","bufferToRender","points","i","normalized","p0","p1","midX","gradient","lastPoint","ColorPicker","result","color","swatches","btn","lower","swatchColor","Point2D","xItem","xTag","yItem","yTag","input","axis","nextArr","rawPrev","Point3D","zItem","zTag","idx","z","RangeSlider","a","b","vMin","_","curMax","vMax","curMin","thumb","type","isDragging","_b","pct","rawVal","steppedVal","nextMin","nextMax","startMin","startMax","span","newMin","newMax","stepped","clampedMin","clampedMax","cur","minPct","maxPct","Segmented","matchedBtn","left","StatusIndicator","status","badge","detail","ContainerHelper","contentEl","expandedSection","child","Section","targetOrOptions","opts","comp","labelOrOptions","tracker","frames","prevTime","animId","loop","graph","origDestroy","intervalId","updateMem","used","initialStatus","targetObj","propName","row","Row","collapsed","isCollapsed","section","slider","dyn","colorComp","p2d","p3d","rowEl","initialCollapsed","content","titleWrap","parent","BindingEngine","component","listener","PresetManager","cb","values","data","storageKey","exported","err","raw","parsed","DARK_THEME","LIGHT_THEME","CYBERPUNK_THEME","NORD_THEME","DRACULA_THEME","TOKYO_NIGHT_THEME","MATRIX_THEME","SYNTHWAVE_THEME","ThemeManager","panelElement","themeInput","theme","Draggable","handle","panel","panelWidth","panelHeight","maxLeft","maxTop","newLeft","newTop","dy","snapped","Resizable","minWidth","minHeight","maxWidth","maxHeight","newWidth","newHeight","maxAllowedWidth","maxAllowedHeight","bodyEl","HotkeyManager","hotkey","onToggle","path","target","tag","activeEl","SearchBar","query","rawQuery","normalizedQuery","labelEl","text","parentSection","sec","titleEl","secTitle","r","SoundEngine","soundPack","vol","pack","AudioCtx","osc","gain","state","startFreq","endFreq","f1","f2","freq","osc1","gain1","osc2","gain2","isEntering","ImportModal","parentEl","onApply","modal","title","closeBtn","actions","cancelBtn","applyBtn","file","reader","SchemaLoader","container","schema","defaultTarget","loadControls","targetContainer","controls","ctrl","subControls","ToastManager","message","duration","toast","iconEl","msgEl","dismiss","ContextMenuManager","panelEl","componentEl","clientX","clientY","sep","iconHtml","panelRect","top","menuWidth","menuHeight","Tab","active","TabsManager","parentHeader","parentBody","tab","playSound","t","STYLE_ID","injectStyles","targetRoot","root","styleEl","cssContent","_RellyUI","useShadow","copyBtn","importBtn","miniHudBtn","collapseBtn","copyToast","body","pos","host","jsonStr","json","mini","idleOpacity","volume","canvas","animateSparkline","last","next","sessionData","RellyUI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relly-ui.es.js","sources":["../src/core/BaseComponent.ts","../src/components/Checkbox/Checkbox.ts","../src/components/Slider/Slider.ts","../src/components/Button/Button.ts","../src/components/Select/Select.ts","../src/components/DynamicLabel/DynamicLabel.ts","../src/components/Graph/Graph.ts","../src/components/ColorPicker/ColorPicker.ts","../src/components/Point2D/Point2D.ts","../src/components/Point3D/Point3D.ts","../src/components/Range/RangeSlider.ts","../src/components/Segmented/Segmented.ts","../src/components/Status/StatusIndicator.ts","../src/core/ComponentContainer.ts","../src/core/BindingEngine.ts","../src/core/PresetManager.ts","../src/core/ThemeManager.ts","../src/core/Draggable.ts","../src/core/Resizable.ts","../src/core/HotkeyManager.ts","../src/core/SearchBar.ts","../src/core/SoundEngine.ts","../src/core/ImportModal.ts","../src/core/SchemaLoader.ts","../src/core/ToastManager.ts","../src/core/ContextMenuManager.ts","../src/components/Tabs/Tab.ts","../src/components/Tabs/TabsManager.ts","../src/styles/injector.ts","../src/RellyUI.ts","../src/index.ts"],"sourcesContent":["import { BindingEngine, Listenable } from './BindingEngine';\nimport { PresetManager, SerializableComponent } from './PresetManager';\nimport { ConditionPredicate, IBaseComponent, OnChangeCallback, ContextMenuItem } from '../types';\n\nexport abstract class BaseComponent<T = any>\n implements IBaseComponent<T>, Listenable, SerializableComponent\n{\n public element: HTMLElement;\n protected labelEl: HTMLElement;\n protected controlEl: HTMLElement;\n\n protected label: string;\n protected tooltipText?: string;\n protected tooltipEl?: HTMLElement;\n protected conditionPredicate?: ConditionPredicate;\n protected targetObject?: any;\n protected property?: string;\n protected initialValue?: T;\n protected prevValue?: T;\n protected onChangeCallback?: OnChangeCallback<T>;\n protected isListening: boolean = false;\n protected contextMenuItems?: ContextMenuItem[];\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n protected bindingEngine?: BindingEngine,\n protected presetManager?: PresetManager\n ) {\n this.label = label;\n this.targetObject = targetObject;\n this.property = property;\n\n if (this.targetObject && this.property) {\n this.prevValue = this.targetObject[this.property];\n try {\n this.initialValue = JSON.parse(JSON.stringify(this.prevValue));\n } catch {\n this.initialValue = this.prevValue;\n }\n }\n\n // Create Base DOM\n this.element = document.createElement('div');\n this.element.className = 'relly-row';\n (this.element as any).__rellyComponent = this;\n\n this.labelEl = document.createElement('div');\n this.labelEl.className = 'relly-row-label';\n this.labelEl.textContent = label;\n this.element.appendChild(this.labelEl);\n\n this.controlEl = document.createElement('div');\n this.controlEl.className = 'relly-row-control';\n this.element.appendChild(this.controlEl);\n\n // Register with PresetManager if bound\n if (this.presetManager && this.getSerializableKey()) {\n this.presetManager.register(this);\n }\n }\n\n public setLabel(label: string): this {\n this.label = label;\n this.labelEl.textContent = label;\n return this;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public setTooltip(tooltip: string): this {\n this.tooltipText = tooltip;\n if (!this.tooltipEl) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'relly-tooltip';\n this.element.appendChild(this.tooltipEl);\n }\n this.tooltipEl.textContent = tooltip;\n return this;\n }\n\n public getTooltip(): string | undefined {\n return this.tooltipText;\n }\n\n public showIf(predicate: ConditionPredicate): this {\n this.conditionPredicate = predicate;\n this.checkVisibility();\n // Register to bindingEngine so it gets evaluated every frame\n if (this.bindingEngine && !this.isListening) {\n this.bindingEngine.register(this);\n }\n return this;\n }\n\n public checkVisibility(): boolean {\n if (!this.conditionPredicate) return true;\n const isVisible = this.conditionPredicate();\n this.element.style.display = isVisible ? '' : 'none';\n return isVisible;\n }\n\n public setContextMenu(items: ContextMenuItem[]): this {\n this.contextMenuItems = items;\n return this;\n }\n\n public getContextMenu(): ContextMenuItem[] | undefined {\n return this.contextMenuItems;\n }\n\n public reset(): this {\n if (this.initialValue !== undefined) {\n try {\n this.setValue(JSON.parse(JSON.stringify(this.initialValue)));\n } catch {\n this.setValue(this.initialValue);\n }\n }\n return this;\n }\n\n public onChange(callback: OnChangeCallback<T>): this {\n this.onChangeCallback = callback;\n return this;\n }\n\n public listen(): this {\n if (!this.isListening && this.bindingEngine && this.targetObject && this.property) {\n this.isListening = true;\n this.bindingEngine.register(this);\n }\n return this;\n }\n\n public getValue(): T {\n if (this.targetObject && this.property) {\n return this.targetObject[this.property];\n }\n return this.prevValue as T;\n }\n\n public setValue(value: T): this {\n const prev = this.getValue();\n if (this.targetObject && this.property) {\n this.targetObject[this.property] = value;\n }\n this.prevValue = value;\n this.update();\n if (prev !== value) {\n this.triggerChange(value, prev);\n this.presetManager?.notifyChange();\n }\n return this;\n }\n\n protected disabled: boolean = false;\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n const inputs = this.element.querySelectorAll<HTMLInputElement | HTMLButtonElement | HTMLSelectElement>('input, button, select');\n inputs.forEach(el => el.disabled = true);\n } else {\n this.element.classList.remove('relly-disabled');\n const inputs = this.element.querySelectorAll<HTMLInputElement | HTMLButtonElement | HTMLSelectElement>('input, button, select');\n inputs.forEach(el => el.disabled = false);\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public checkDirty(): void {\n this.checkVisibility();\n if (!this.targetObject || !this.property) return;\n const current = this.targetObject[this.property];\n if (current !== this.prevValue) {\n const prev = this.prevValue;\n this.prevValue = current;\n this.update();\n this.triggerChange(current, prev as T);\n }\n }\n\n protected triggerChange(value: T, prev: T): void {\n if (this.onChangeCallback) {\n this.onChangeCallback(value, prev);\n }\n }\n\n public getSerializableKey(): string | null {\n if (this.property) {\n return this.property;\n }\n return this.label || null;\n }\n\n /**\n * Updates the UI elements based on current value.\n * To be implemented by subclasses.\n */\n public abstract update(): this;\n\n public destroy(): void {\n if (this.isListening && this.bindingEngine) {\n this.bindingEngine.unregister(this);\n this.isListening = false;\n }\n if (this.presetManager) {\n this.presetManager.unregister(this);\n }\n this.element.remove();\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Checkbox extends BaseComponent<boolean> {\n private wrapperEl: HTMLElement;\n private boxEl: HTMLElement;\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-checkbox-wrapper';\n this.wrapperEl.setAttribute('role', 'checkbox');\n this.wrapperEl.setAttribute('tabindex', '0');\n\n this.boxEl = document.createElement('div');\n this.boxEl.className = 'relly-checkbox-box';\n\n // SVG checkmark\n this.boxEl.innerHTML = `\n <svg class=\"relly-checkbox-icon\" viewBox=\"0 0 12 10\">\n <polyline points=\"1.5 5 4.5 8.5 10.5 1.5\"></polyline>\n </svg>\n `;\n\n this.wrapperEl.appendChild(this.boxEl);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.wrapperEl.addEventListener('click', () => {\n const nextVal = !this.getValue();\n this.soundEngine?.playToggle(nextVal);\n this.setValue(nextVal);\n });\n\n this.wrapperEl.addEventListener('keydown', (e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n const nextVal = !this.getValue();\n this.soundEngine?.playToggle(nextVal);\n this.setValue(nextVal);\n }\n });\n\n this.update();\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.wrapperEl) return this;\n const isChecked = Boolean(this.getValue());\n this.wrapperEl.setAttribute('aria-checked', isChecked ? 'true' : 'false');\n if (isChecked) {\n this.wrapperEl.classList.add('relly-checked');\n } else {\n this.wrapperEl.classList.remove('relly-checked');\n }\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Slider extends BaseComponent<number> {\n private containerEl: HTMLElement;\n private rangeInput: HTMLInputElement;\n private numberInput: HTMLInputElement;\n private soundEngine?: SoundEngine;\n private lastSoundTime: number = 0;\n\n private min: number = 0;\n private max: number = 100;\n private step: number = 1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-slider-container';\n\n this.rangeInput = document.createElement('input');\n this.rangeInput.type = 'range';\n this.rangeInput.className = 'relly-slider-range';\n\n this.numberInput = document.createElement('input');\n this.numberInput.type = 'number';\n this.numberInput.className = 'relly-slider-number';\n this.numberInput.title = 'Drag horizontally to scrub value, or type directly';\n\n this.containerEl.appendChild(this.rangeInput);\n this.containerEl.appendChild(this.numberInput);\n this.controlEl.appendChild(this.containerEl);\n\n this.applyConstraints();\n\n // Range input change\n this.rangeInput.addEventListener('input', () => {\n const val = parseFloat(this.rangeInput.value);\n this.triggerSound();\n this.setValue(val);\n });\n\n // Number input change\n this.numberInput.addEventListener('change', () => {\n let val = parseFloat(this.numberInput.value);\n if (isNaN(val)) val = this.min;\n val = Math.max(this.min, Math.min(this.max, val));\n this.triggerSound();\n this.setValue(val);\n });\n\n // Virtual Jog-Dial / Drag Scrubbing on number input\n this.setupJogScrubbing();\n\n this.update();\n }\n\n private setupJogScrubbing(): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n const deltaVal = dx * stepDelta;\n let newVal = startVal + deltaVal;\n newVal = Math.max(this.min, Math.min(this.max, newVal));\n const decimals = (stepDelta.toString().split('.')[1] || '').length;\n const invStep = 1 / stepDelta;\n newVal = Math.round(newVal * invStep) / invStep;\n newVal = parseFloat(newVal.toFixed(Math.min(decimals, 4)));\n this.triggerSound();\n this.setValue(newVal);\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n if (isScrubbing && typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n this.numberInput.addEventListener('mousedown', (e) => {\n startX = e.clientX;\n startVal = parseFloat(this.numberInput.value) || 0;\n isScrubbing = false;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n });\n }\n\n private triggerSound(): void {\n const now = Date.now();\n if (now - this.lastSoundTime > 35) {\n this.lastSoundTime = now;\n this.soundEngine?.playTick();\n }\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.applyConstraints();\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.applyConstraints();\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.applyConstraints();\n return this;\n }\n\n private applyConstraints(): void {\n this.rangeInput.min = this.min.toString();\n this.rangeInput.max = this.max.toString();\n this.rangeInput.step = this.step.toString();\n\n this.numberInput.min = this.min.toString();\n this.numberInput.max = this.max.toString();\n this.numberInput.step = this.step.toString();\n }\n\n public update(): this {\n if (!this.rangeInput || !this.numberInput) return this;\n const val = Number(this.getValue()) || 0;\n this.rangeInput.value = val.toString();\n this.numberInput.value = val.toString();\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { OnClickCallback } from '../../types';\n\nexport class Button extends BaseComponent<void> {\n private buttonEl: HTMLButtonElement;\n private clickHandler?: OnClickCallback;\n private soundEngine?: SoundEngine;\n\n constructor(label: string, onClick?: OnClickCallback, soundEngine?: SoundEngine) {\n super(label);\n this.soundEngine = soundEngine;\n\n // Buttons look best taking the full row or acting as a direct trigger\n this.labelEl.style.display = 'none';\n this.controlEl.style.flex = '1';\n\n this.buttonEl = document.createElement('button');\n this.buttonEl.className = 'relly-btn';\n this.buttonEl.textContent = label;\n this.controlEl.appendChild(this.buttonEl);\n\n if (onClick) {\n this.onClick(onClick);\n }\n\n this.buttonEl.addEventListener('click', (e) => {\n this.soundEngine?.playClick();\n if (this.clickHandler) {\n this.clickHandler(e);\n }\n });\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public override setLabel(label: string): this {\n super.setLabel(label);\n this.buttonEl.textContent = label;\n return this;\n }\n\n public onClick(callback: OnClickCallback): this {\n this.clickHandler = callback;\n return this;\n }\n\n public update(): this {\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\n\nexport class Select extends BaseComponent<any> {\n private selectEl: HTMLSelectElement;\n private optionsMap: Map<string, any> = new Map();\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n options?: any[] | Record<string, any>,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.selectEl = document.createElement('select');\n this.selectEl.className = 'relly-select-input';\n this.controlEl.appendChild(this.selectEl);\n\n if (options) {\n this.setOptions(options);\n }\n\n this.selectEl.addEventListener('change', () => {\n const selectedKey = this.selectEl.value;\n const actualValue = this.optionsMap.has(selectedKey)\n ? this.optionsMap.get(selectedKey)\n : selectedKey;\n this.setValue(actualValue);\n });\n\n this.update();\n }\n\n public setOptions(options: any[] | Record<string, any>): this {\n this.selectEl.innerHTML = '';\n this.optionsMap.clear();\n\n if (Array.isArray(options)) {\n for (const item of options) {\n const key = String(item);\n this.optionsMap.set(key, item);\n const optEl = document.createElement('option');\n optEl.value = key;\n optEl.textContent = key;\n this.selectEl.appendChild(optEl);\n }\n } else if (typeof options === 'object' && options !== null) {\n for (const [key, value] of Object.entries(options)) {\n this.optionsMap.set(key, value);\n const optEl = document.createElement('option');\n optEl.value = key;\n optEl.textContent = key;\n this.selectEl.appendChild(optEl);\n }\n }\n\n this.update();\n return this;\n }\n\n public update(): this {\n if (!this.selectEl) return this;\n const currentVal = this.getValue();\n for (const [key, val] of this.optionsMap.entries()) {\n if (val === currentVal || String(val) === String(currentVal)) {\n this.selectEl.value = key;\n return this;\n }\n }\n this.selectEl.value = String(currentVal);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\n\nexport type LabelFormatter = (value: any) => string;\n\nexport class DynamicLabel extends BaseComponent<any> {\n private valueBadge: HTMLElement;\n private formatter: LabelFormatter = (v) => String(v !== undefined && v !== null ? v : '');\n\n constructor(label: string, targetObject?: any, property?: string, bindingEngine?: BindingEngine) {\n super(label, targetObject, property, bindingEngine);\n\n this.valueBadge = document.createElement('span');\n this.valueBadge.className = 'relly-dynamic-value';\n this.controlEl.appendChild(this.valueBadge);\n\n this.update();\n }\n\n public setFormat(formatter: LabelFormatter): this {\n this.formatter = formatter;\n this.update();\n return this;\n }\n\n public update(): this {\n const val = this.getValue();\n this.valueBadge.textContent = this.formatter(val);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { GraphSeriesOptions } from '../../types';\n\nexport interface GraphSeries {\n id: string;\n label: string;\n color: string;\n fillColor?: string;\n buffer: number[];\n}\n\nexport class Graph extends BaseComponent<number | Record<string, number>> {\n private canvasContainer: HTMLElement;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D | null = null;\n private statsEl: HTMLElement;\n private graphTooltipEl: HTMLElement;\n private legendEl: HTMLElement;\n\n private primarySeries: GraphSeries;\n private seriesList: GraphSeries[] = [];\n private seriesMap: Map<string, GraphSeries> = new Map();\n\n private bufferSize: number = 60;\n private min: number = 0;\n private max: number = 100;\n private autoRange: boolean = true;\n private smoothCurves: boolean = true;\n private isPaused: boolean = false;\n private formatter: (val: number) => string = (v) =>\n typeof v === 'number' && !isNaN(v) ? v.toFixed(1) : '0';\n\n private cssWidth: number = 280;\n private cssHeight: number = 90;\n\n private sampleInterval: number = 50;\n private lastSampleTime: number = 0;\n\n private hoverIndex: number | null = null;\n\n private resizeObserver: ResizeObserver | null = null;\n private mediaQueryList: MediaQueryList | null = null;\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n bindingEngine?: BindingEngine,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine);\n this.soundEngine = soundEngine;\n\n // Graph row layout\n this.element.className = 'relly-graph-row';\n this.element.innerHTML = '';\n\n const header = document.createElement('div');\n header.className = 'relly-graph-header';\n\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'relly-graph-label';\n this.labelEl.textContent = label;\n\n this.statsEl = document.createElement('div');\n this.statsEl.className = 'relly-graph-stats';\n this.statsEl.innerHTML = `<span class=\"relly-graph-val\">0</span>`;\n\n header.appendChild(this.labelEl);\n header.appendChild(this.statsEl);\n this.element.appendChild(header);\n\n // Multi-series legend (initially empty)\n this.legendEl = document.createElement('div');\n this.legendEl.className = 'relly-graph-legend';\n this.element.appendChild(this.legendEl);\n\n // Canvas container\n this.canvasContainer = document.createElement('div');\n this.canvasContainer.className = 'relly-graph-canvas-container';\n this.canvasContainer.title = 'Click to pause/freeze data stream for inspection';\n\n this.canvas = document.createElement('canvas');\n this.canvas.className = 'relly-graph-canvas';\n this.canvasContainer.appendChild(this.canvas);\n\n // Interactive tooltip overlay\n this.graphTooltipEl = document.createElement('div');\n this.graphTooltipEl.className = 'relly-graph-tooltip';\n this.canvasContainer.appendChild(this.graphTooltipEl);\n\n this.element.appendChild(this.canvasContainer);\n\n this.ctx = this.canvas.getContext('2d');\n\n // Initialize primary series\n this.primarySeries = {\n id: 'default',\n label: label,\n color: '#38bdf8',\n fillColor: 'rgba(56, 189, 248, 0.25)',\n buffer: []\n };\n this.seriesList.push(this.primarySeries);\n this.seriesMap.set('default', this.primarySeries);\n\n this.initCanvasSize();\n this.setupListeners();\n this.update();\n\n if (this.bindingEngine && this.targetObject && this.property) {\n this.listen();\n }\n }\n\n private setupListeners(): void {\n if (typeof window === 'undefined') return;\n\n // ResizeObserver on canvasContainer for crisp 1:1 pixel rendering\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => {\n this.resizeCanvas();\n this.draw();\n });\n this.resizeObserver.observe(this.canvasContainer);\n }\n\n // MatchMedia listener to handle zoom changes\n this.updateDPRListener();\n\n // Hover inspector events (silent, no tick sound on move)\n this.canvas.addEventListener('mousemove', this.onMouseMove);\n this.canvas.addEventListener('mouseleave', this.onMouseLeave);\n\n // Click event on canvas: plays click sound and toggles pause/freeze\n this.canvas.addEventListener('click', this.onCanvasClick);\n }\n\n private updateDPRListener(): void {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const dpr = window.devicePixelRatio || 1;\n this.mediaQueryList?.removeEventListener('change', this.onResolutionChange);\n this.mediaQueryList = window.matchMedia(`(resolution: ${dpr}dppx)`);\n this.mediaQueryList.addEventListener('change', this.onResolutionChange);\n }\n\n private onResolutionChange = (): void => {\n this.updateDPRListener();\n this.resizeCanvas();\n this.draw();\n };\n\n private initCanvasSize(): void {\n this.resizeCanvas();\n }\n\n private resizeCanvas(): void {\n if (!this.canvas || !this.canvasContainer) return;\n const rect = this.canvasContainer.getBoundingClientRect();\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const w = Math.max(10, Math.floor(rect.width || 280));\n const h = Math.max(10, Math.floor(rect.height || 80));\n\n this.cssWidth = w;\n this.cssHeight = h;\n\n this.canvas.width = Math.round(w * dpr);\n this.canvas.height = Math.round(h * dpr);\n\n if (this.ctx) {\n if (typeof this.ctx.resetTransform === 'function') {\n this.ctx.resetTransform();\n } else {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n this.ctx.scale(dpr, dpr);\n }\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const width = this.cssWidth;\n\n if (width <= 0) return;\n\n const step = width / Math.max(1, this.bufferSize - 1);\n const index = Math.round(x / step);\n const clampedIndex = Math.max(0, Math.min(this.bufferSize - 1, index));\n\n if (clampedIndex !== this.hoverIndex) {\n this.hoverIndex = clampedIndex;\n this.updateTooltip(x);\n this.draw();\n }\n };\n\n private onMouseLeave = (): void => {\n this.hoverIndex = null;\n this.graphTooltipEl.classList.remove('relly-tooltip-show');\n this.draw();\n };\n\n private onCanvasClick = (): void => {\n this.soundEngine?.playClick();\n this.isPaused = !this.isPaused;\n if (this.isPaused) {\n this.canvasContainer.classList.add('relly-graph-paused');\n } else {\n this.canvasContainer.classList.remove('relly-graph-paused');\n }\n this.updateStats();\n this.draw();\n };\n\n private updateTooltip(crosshairX: number): void {\n if (this.hoverIndex === null) return;\n\n let html = '';\n for (const series of this.seriesList) {\n const startIndex = this.bufferSize - series.buffer.length;\n const bufIdx = this.hoverIndex - startIndex;\n if (bufIdx >= 0 && bufIdx < series.buffer.length) {\n const val = series.buffer[bufIdx];\n html += `<div><span style=\"display:inline-block;width:6px;height:6px;border-radius:50%;background:${series.color};margin-right:4px;\"></span>${series.label}: <b>${this.formatter(val)}</b></div>`;\n }\n }\n\n if (!html) {\n this.graphTooltipEl.classList.remove('relly-tooltip-show');\n return;\n }\n\n this.graphTooltipEl.innerHTML = html;\n this.graphTooltipEl.classList.add('relly-tooltip-show');\n\n // Position tooltip clamping inside container\n const tooltipWidth = this.graphTooltipEl.offsetWidth || 80;\n let leftPos = crosshairX;\n if (leftPos - tooltipWidth / 2 < 4) {\n leftPos = 4 + tooltipWidth / 2;\n } else if (leftPos + tooltipWidth / 2 > this.cssWidth - 4) {\n leftPos = this.cssWidth - 4 - tooltipWidth / 2;\n }\n\n this.graphTooltipEl.style.left = `${leftPos}px`;\n this.graphTooltipEl.style.top = '14px';\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public togglePause(): this {\n this.onCanvasClick();\n return this;\n }\n\n public setPaused(paused: boolean): this {\n if (this.isPaused !== paused) {\n this.onCanvasClick();\n }\n return this;\n }\n\n public isGraphPaused(): boolean {\n return this.isPaused;\n }\n\n public setSampleInterval(ms: number): this {\n this.sampleInterval = Math.max(10, ms);\n return this;\n }\n\n public getSampleInterval(): number {\n return this.sampleInterval;\n }\n\n public override checkDirty(): void {\n this.checkVisibility();\n if (!this.targetObject || !this.property || this.isPaused) return;\n\n const current = this.targetObject[this.property];\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n if (now - this.lastSampleTime >= this.sampleInterval) {\n this.lastSampleTime = now;\n this.prevValue = current;\n this.update();\n this.triggerChange(current, this.prevValue as any);\n }\n }\n\n public setSmooth(smooth: boolean): this {\n this.smoothCurves = smooth;\n this.draw();\n return this;\n }\n\n public setFormat(fn: (val: number) => string): this {\n this.formatter = fn;\n this.updateStats();\n return this;\n }\n\n public setRange(min: number, max: number): this {\n this.min = min;\n this.max = max;\n this.autoRange = false;\n this.draw();\n return this;\n }\n\n public setAutoRange(enabled: boolean): this {\n this.autoRange = enabled;\n this.draw();\n return this;\n }\n\n public setColor(lineColor: string, fillColor?: string): this {\n this.primarySeries.color = lineColor;\n this.primarySeries.fillColor = fillColor || `${lineColor}33`;\n this.draw();\n return this;\n }\n\n public setBufferSize(size: number): this {\n this.bufferSize = Math.max(10, size);\n for (const s of this.seriesList) {\n while (s.buffer.length > this.bufferSize) {\n s.buffer.shift();\n }\n }\n this.draw();\n return this;\n }\n\n public setHeight(height: number): this {\n this.cssHeight = height;\n this.canvasContainer.style.height = `${height}px`;\n this.resizeCanvas();\n this.draw();\n return this;\n }\n\n public addSeries(id: string, options: GraphSeriesOptions): this {\n const series: GraphSeries = {\n id,\n label: options.label || id,\n color: options.color,\n fillColor: options.fillColor || `${options.color}33`,\n buffer: []\n };\n this.seriesList.push(series);\n this.seriesMap.set(id, series);\n\n this.updateLegend();\n this.draw();\n return this;\n }\n\n private updateLegend(): void {\n if (this.seriesList.length <= 1) {\n this.legendEl.style.display = 'none';\n return;\n }\n\n this.legendEl.style.display = 'flex';\n this.legendEl.innerHTML = '';\n\n for (const series of this.seriesList) {\n const item = document.createElement('div');\n item.className = 'relly-graph-legend-item';\n item.innerHTML = `\n <span class=\"relly-graph-legend-dot\" style=\"background-color: ${series.color}\"></span>\n <span class=\"relly-graph-legend-label\">${series.label}</span>\n `;\n this.legendEl.appendChild(item);\n }\n }\n\n public push(val: number | Record<string, number>): this {\n if (this.isPaused) return this;\n\n if (typeof val === 'number') {\n if (isNaN(val) || !isFinite(val)) return this;\n this.primarySeries.buffer.push(val);\n if (this.primarySeries.buffer.length > this.bufferSize) {\n this.primarySeries.buffer.shift();\n }\n } else if (typeof val === 'object' && val !== null) {\n for (const [key, numVal] of Object.entries(val)) {\n if (typeof numVal === 'number' && !isNaN(numVal) && isFinite(numVal)) {\n this.pushSeries(key, numVal);\n }\n }\n }\n\n this.updateStats();\n this.draw();\n return this;\n }\n\n public pushSeries(id: string, val: number): this {\n if (this.isPaused) return this;\n if (typeof val !== 'number' || isNaN(val) || !isFinite(val)) return this;\n const series = this.seriesMap.get(id);\n if (!series) {\n this.addSeries(id, { color: '#ec4899', label: id });\n return this.pushSeries(id, val);\n }\n\n series.buffer.push(val);\n if (series.buffer.length > this.bufferSize) {\n series.buffer.shift();\n }\n this.updateStats();\n this.draw();\n return this;\n }\n\n public getLatestValue(): number {\n if (this.primarySeries.buffer.length > 0) {\n return this.primarySeries.buffer[this.primarySeries.buffer.length - 1];\n }\n const val = this.getValue();\n return typeof val === 'number' && !isNaN(val) ? val : 0;\n }\n\n private updateStats(): void {\n const latestVal =\n this.primarySeries.buffer.length > 0\n ? this.primarySeries.buffer[this.primarySeries.buffer.length - 1]\n : 0;\n\n let min = this.min;\n let max = this.max;\n\n let allVals: number[] = [];\n for (const s of this.seriesList) {\n allVals = allVals.concat(s.buffer);\n }\n\n if (allVals.length > 0) {\n min = Math.min(...allVals);\n max = Math.max(...allVals);\n }\n\n const pausedBadge = this.isPaused\n ? `<span class=\"relly-graph-badge relly-graph-badge--paused\">PAUSED</span>`\n : '';\n\n this.statsEl.innerHTML = `\n ${pausedBadge}\n <span class=\"relly-graph-badge relly-graph-badge--min\">min: ${this.formatter(min)}</span>\n <span class=\"relly-graph-badge relly-graph-badge--max\">max: ${this.formatter(max)}</span>\n <span class=\"relly-graph-val\">${this.formatter(latestVal)}</span>\n `;\n }\n\n public update(): this {\n const val = this.getValue();\n if (typeof val === 'number') {\n this.push(val);\n } else if (typeof val === 'object' && val !== null) {\n this.push(val as Record<string, number>);\n }\n\n // Auto-sample registered series from targetObject if available\n if (this.targetObject) {\n for (const series of this.seriesList) {\n if (series.id !== 'default' && typeof this.targetObject[series.id] === 'number') {\n this.pushSeries(series.id, this.targetObject[series.id]);\n }\n }\n }\n return this;\n }\n\n private draw(): void {\n if (!this.ctx) return;\n const ctx = this.ctx;\n const width = this.cssWidth;\n const height = this.cssHeight;\n\n ctx.clearRect(0, 0, width, height);\n\n // Draw background grid lines (25%, 50%, 75%)\n ctx.save();\n ctx.setLineDash([2, 4]);\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.08)';\n ctx.lineWidth = 1;\n\n for (let p of [0.25, 0.5, 0.75]) {\n const y = Math.round(height * p);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n ctx.stroke();\n }\n ctx.restore();\n\n // Collect all values to calculate global bounds with generous headroom\n let allVals: number[] = [];\n for (const s of this.seriesList) {\n allVals = allVals.concat(s.buffer);\n }\n\n if (allVals.length === 0) return;\n\n const minVal = Math.min(...allVals);\n const maxVal = Math.max(...allVals);\n\n let min = this.autoRange ? minVal : this.min;\n let max = this.autoRange ? maxVal : this.max;\n\n // Headroom protection: if actual values exceed max or min, expand range so it NEVER clips or flies off\n if (maxVal > max) max = maxVal;\n if (minVal < min) min = minVal;\n\n if (min === max) {\n min -= 1;\n max += 1;\n }\n\n // 16% top/bottom headroom padding so peak values don't touch the canvas ceiling\n const pad = (max - min) * 0.16 || 1;\n min -= pad;\n max += pad;\n\n const range = max - min || 1;\n const step = width / Math.max(1, this.bufferSize - 1);\n\n // Draw each series\n for (const series of this.seriesList) {\n if (series.buffer.length === 0) continue;\n\n const bufferToRender =\n series.buffer.length === 1 ? [series.buffer[0], series.buffer[0]] : series.buffer;\n const startIndex = this.bufferSize - bufferToRender.length;\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < bufferToRender.length; i++) {\n const x = (startIndex + i) * step;\n const normalized = Math.max(0, Math.min(1, (bufferToRender[i] - min) / range));\n // Clamped y coordinate strictly between 4px and height - 4px\n const y = Math.max(4, Math.min(height - 4, height - 6 - normalized * (height - 12)));\n points.push({ x, y });\n }\n\n // Draw Gradient Area Fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, height);\n ctx.lineTo(points[0].x, points[0].y);\n\n if (this.smoothCurves && points.length > 2) {\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midX = (p0.x + p1.x) / 2;\n ctx.bezierCurveTo(midX, p0.y, midX, p1.y, p1.x, p1.y);\n }\n } else {\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n }\n\n ctx.lineTo(points[points.length - 1].x, height);\n ctx.closePath();\n\n const gradient = ctx.createLinearGradient(0, 0, 0, height);\n gradient.addColorStop(0, series.fillColor || `${series.color}40`);\n gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n ctx.fillStyle = gradient;\n ctx.fill();\n\n // Draw Glowing Stroke Line\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n\n if (this.smoothCurves && points.length > 2) {\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const midX = (p0.x + p1.x) / 2;\n ctx.bezierCurveTo(midX, p0.y, midX, p1.y, p1.x, p1.y);\n }\n } else {\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n }\n\n ctx.save();\n ctx.strokeStyle = series.color;\n ctx.lineWidth = 2.0;\n ctx.shadowColor = series.color;\n ctx.shadowBlur = 5;\n ctx.stroke();\n ctx.restore();\n\n // Live Pulse Dot on the newest (rightmost) value\n const lastPoint = points[points.length - 1];\n if (lastPoint) {\n ctx.beginPath();\n ctx.arc(lastPoint.x, lastPoint.y, 4, 0, Math.PI * 2);\n ctx.fillStyle = series.color;\n ctx.globalAlpha = 0.35;\n ctx.fill();\n ctx.globalAlpha = 1;\n\n ctx.beginPath();\n ctx.arc(lastPoint.x, lastPoint.y, 2, 0, Math.PI * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n }\n }\n\n // Interactive Hover Crosshair\n if (this.hoverIndex !== null) {\n const crosshairX = Math.round(this.hoverIndex * step);\n ctx.save();\n ctx.setLineDash([3, 3]);\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.45)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(crosshairX, 0);\n ctx.lineTo(crosshairX, height);\n ctx.stroke();\n ctx.restore();\n\n // Highlight point for each series at hover position\n for (const series of this.seriesList) {\n const startIndex = this.bufferSize - series.buffer.length;\n const bufIdx = this.hoverIndex - startIndex;\n if (bufIdx >= 0 && bufIdx < series.buffer.length) {\n const val = series.buffer[bufIdx];\n const normalized = Math.max(0, Math.min(1, (val - min) / range));\n const y = Math.max(4, Math.min(height - 4, height - 6 - normalized * (height - 12)));\n\n ctx.beginPath();\n ctx.arc(crosshairX, y, 4.5, 0, Math.PI * 2);\n ctx.fillStyle = series.color;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(crosshairX, y, 2, 0, Math.PI * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n }\n }\n }\n }\n\n public destroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n if (this.mediaQueryList) {\n this.mediaQueryList.removeEventListener('change', this.onResolutionChange);\n this.mediaQueryList = null;\n }\n this.canvas.removeEventListener('mousemove', this.onMouseMove);\n this.canvas.removeEventListener('mouseleave', this.onMouseLeave);\n this.canvas.removeEventListener('click', this.onCanvasClick);\n super.destroy();\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class ColorPicker extends BaseComponent<string> {\n private wrapperEl: HTMLElement;\n private previewEl: HTMLElement;\n private hexTextEl: HTMLElement;\n private nativeColorInput: HTMLInputElement;\n private eyeDropperBtn?: HTMLButtonElement;\n private swatchesContainer?: HTMLElement;\n private swatches: string[] = [];\n private swatchButtons: Map<string, HTMLElement> = new Map();\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-color-wrapper';\n\n this.previewEl = document.createElement('div');\n this.previewEl.className = 'relly-color-preview';\n this.previewEl.title = 'Click to open color palette';\n\n this.hexTextEl = document.createElement('span');\n this.hexTextEl.className = 'relly-color-text';\n\n this.nativeColorInput = document.createElement('input');\n this.nativeColorInput.type = 'color';\n this.nativeColorInput.className = 'relly-color-native';\n\n this.wrapperEl.appendChild(this.previewEl);\n this.wrapperEl.appendChild(this.hexTextEl);\n this.wrapperEl.appendChild(this.nativeColorInput);\n\n // EyeDropper API (Pick color from screen)\n if (typeof window !== 'undefined' && 'EyeDropper' in window) {\n this.eyeDropperBtn = document.createElement('button');\n this.eyeDropperBtn.type = 'button';\n this.eyeDropperBtn.className = 'relly-eyedropper-btn';\n this.eyeDropperBtn.title = 'Pick color from screen';\n this.eyeDropperBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"m14 7 3 3m-1-5a2.83 2.83 0 0 1 4 4L7 22H3v-4L16 5Z\"></path>\n </svg>\n `;\n this.eyeDropperBtn.addEventListener('click', async () => {\n try {\n const eyeDropper = new (window as any).EyeDropper();\n const result = await eyeDropper.open();\n if (result && result.sRGBHex) {\n this.setValue(result.sRGBHex);\n }\n } catch {\n // User cancelled picker\n }\n });\n this.wrapperEl.appendChild(this.eyeDropperBtn);\n }\n\n this.controlEl.appendChild(this.wrapperEl);\n\n this.previewEl.addEventListener('click', () => {\n this.nativeColorInput.click();\n });\n\n this.hexTextEl.addEventListener('click', () => {\n this.nativeColorInput.click();\n });\n\n this.nativeColorInput.addEventListener('input', () => {\n const color = this.nativeColorInput.value;\n this.setValue(color);\n });\n\n this.update();\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public setSwatches(swatches: string[]): this {\n this.swatches = swatches;\n if (!this.swatchesContainer) {\n this.swatchesContainer = document.createElement('div');\n this.swatchesContainer.className = 'relly-color-swatches';\n this.wrapperEl.insertBefore(this.swatchesContainer, this.previewEl);\n }\n\n this.swatchesContainer.innerHTML = '';\n this.swatchButtons.clear();\n\n for (const color of this.swatches) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-color-swatch';\n btn.style.backgroundColor = color;\n btn.title = color.toUpperCase();\n btn.addEventListener('click', () => {\n this.setValue(color);\n this.soundEngine?.playClick();\n });\n this.swatchesContainer.appendChild(btn);\n this.swatchButtons.set(color.toLowerCase(), btn);\n }\n\n this.update();\n return this;\n }\n\n public getSwatches(): string[] {\n return [...this.swatches];\n }\n\n public update(): this {\n if (!this.previewEl || !this.hexTextEl) return this;\n const color = String(this.getValue() || '#000000');\n this.previewEl.style.backgroundColor = color;\n this.hexTextEl.textContent = color.toUpperCase();\n if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n this.nativeColorInput.value =\n color.length === 4\n ? `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}`\n : color;\n }\n\n // Update active swatch highlighting\n const lower = color.toLowerCase();\n for (const [swatchColor, btn] of this.swatchButtons.entries()) {\n if (swatchColor === lower) {\n btn.classList.add('relly-swatch-active');\n } else {\n btn.classList.remove('relly-swatch-active');\n }\n }\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\n\nexport type Point2DVal = { x: number; y: number } | [number, number];\n\nexport class Point2D extends BaseComponent<Point2DVal> {\n private containerEl: HTMLElement;\n private xInput: HTMLInputElement;\n private yInput: HTMLInputElement;\n\n private min?: number;\n private max?: number;\n private step: number = 0.1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-point2d-container';\n\n // X item\n const xItem = document.createElement('div');\n xItem.className = 'relly-point2d-item';\n const xTag = document.createElement('span');\n xTag.className = 'relly-point2d-tag';\n xTag.textContent = 'X';\n this.xInput = document.createElement('input');\n this.xInput.type = 'number';\n this.xInput.className = 'relly-point2d-input';\n this.xInput.step = String(this.step);\n xItem.appendChild(xTag);\n xItem.appendChild(this.xInput);\n\n // Y item\n const yItem = document.createElement('div');\n yItem.className = 'relly-point2d-item';\n const yTag = document.createElement('span');\n yTag.className = 'relly-point2d-tag';\n yTag.textContent = 'Y';\n this.yInput = document.createElement('input');\n this.yInput.type = 'number';\n this.yInput.className = 'relly-point2d-input';\n this.yInput.step = String(this.step);\n yItem.appendChild(yTag);\n yItem.appendChild(this.yInput);\n\n this.containerEl.appendChild(xItem);\n this.containerEl.appendChild(yItem);\n this.controlEl.appendChild(this.containerEl);\n\n this.xInput.addEventListener('change', () => this.handleInputChange());\n this.yInput.addEventListener('change', () => this.handleInputChange());\n\n this.setupInputScrubbing(this.xInput, 'x');\n this.setupInputScrubbing(this.yInput, 'y');\n\n this.update();\n }\n\n private setupInputScrubbing(input: HTMLInputElement, axis: 'x' | 'y'): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n let newVal = startVal + dx * stepDelta;\n if (this.min !== undefined) newVal = Math.max(this.min, newVal);\n if (this.max !== undefined) newVal = Math.min(this.max, newVal);\n const decimals = (stepDelta.toString().split('.')[1] || '').length;\n const invStep = 1 / stepDelta;\n newVal = Math.round(newVal * invStep) / invStep;\n newVal = parseFloat(newVal.toFixed(Math.min(decimals, 4)));\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n const nextArr: [number, number] = [currentVal[0], currentVal[1]];\n nextArr[axis === 'x' ? 0 : 1] = newVal;\n this.setValue(nextArr);\n } else {\n this.setValue({ ...currentVal, [axis]: newVal });\n }\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n if (isScrubbing && typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n input.addEventListener('mousedown', (e) => {\n startX = e.clientX;\n startVal = parseFloat(input.value) || 0;\n isScrubbing = false;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n });\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.xInput.min = String(min);\n this.yInput.min = String(min);\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.xInput.max = String(max);\n this.yInput.max = String(max);\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.xInput.step = String(step);\n this.yInput.step = String(step);\n return this;\n }\n\n public override getValue(): Point2DVal {\n if (this.targetObject && this.property && this.targetObject[this.property] !== undefined) {\n return this.targetObject[this.property];\n }\n if (this.targetObject && 'x' in this.targetObject && 'y' in this.targetObject) {\n return this.targetObject;\n }\n return (this.prevValue as Point2DVal) || { x: 0, y: 0 };\n }\n\n public override setValue(value: Point2DVal): this {\n const rawPrev = this.getValue();\n const prev = Array.isArray(rawPrev)\n ? [...rawPrev]\n : typeof rawPrev === 'object' && rawPrev !== null\n ? { ...rawPrev }\n : rawPrev;\n\n if (this.targetObject && this.property && this.targetObject[this.property] !== undefined) {\n this.targetObject[this.property] = value;\n } else if (\n this.targetObject &&\n 'x' in this.targetObject &&\n 'y' in this.targetObject &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n this.targetObject.x = value.x;\n this.targetObject.y = value.y;\n }\n this.prevValue = value;\n this.update();\n this.triggerChange(value, prev as Point2DVal);\n return this;\n }\n\n private handleInputChange(): void {\n let x = parseFloat(this.xInput.value) || 0;\n let y = parseFloat(this.yInput.value) || 0;\n\n if (this.min !== undefined) {\n x = Math.max(this.min, x);\n y = Math.max(this.min, y);\n }\n if (this.max !== undefined) {\n x = Math.min(this.max, x);\n y = Math.min(this.max, y);\n }\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n this.setValue([x, y]);\n } else {\n this.setValue({ ...currentVal, x, y });\n }\n }\n\n public update(): this {\n if (!this.xInput || !this.yInput) return this;\n const val = this.getValue();\n let x = 0;\n let y = 0;\n\n if (Array.isArray(val)) {\n x = val[0] || 0;\n y = val[1] || 0;\n } else if (typeof val === 'object' && val !== null) {\n x = (val as any).x || 0;\n y = (val as any).y || 0;\n }\n\n this.xInput.value = String(x);\n this.yInput.value = String(y);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { Point3DVal } from '../../types';\n\nexport class Point3D extends BaseComponent<Point3DVal> {\n private containerEl: HTMLElement;\n private xInput: HTMLInputElement;\n private yInput: HTMLInputElement;\n private zInput: HTMLInputElement;\n\n private min?: number;\n private max?: number;\n private step: number = 0.1;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-point3d-container';\n\n // X item\n const xItem = document.createElement('div');\n xItem.className = 'relly-point3d-item';\n const xTag = document.createElement('span');\n xTag.className = 'relly-point3d-tag relly-point3d-tag--x';\n xTag.textContent = 'X';\n this.xInput = document.createElement('input');\n this.xInput.type = 'number';\n this.xInput.className = 'relly-point3d-input';\n this.xInput.step = String(this.step);\n xItem.appendChild(xTag);\n xItem.appendChild(this.xInput);\n\n // Y item\n const yItem = document.createElement('div');\n yItem.className = 'relly-point3d-item';\n const yTag = document.createElement('span');\n yTag.className = 'relly-point3d-tag relly-point3d-tag--y';\n yTag.textContent = 'Y';\n this.yInput = document.createElement('input');\n this.yInput.type = 'number';\n this.yInput.className = 'relly-point3d-input';\n this.yInput.step = String(this.step);\n yItem.appendChild(yTag);\n yItem.appendChild(this.yInput);\n\n // Z item\n const zItem = document.createElement('div');\n zItem.className = 'relly-point3d-item';\n const zTag = document.createElement('span');\n zTag.className = 'relly-point3d-tag relly-point3d-tag--z';\n zTag.textContent = 'Z';\n this.zInput = document.createElement('input');\n this.zInput.type = 'number';\n this.zInput.className = 'relly-point3d-input';\n this.zInput.step = String(this.step);\n zItem.appendChild(zTag);\n zItem.appendChild(this.zInput);\n\n this.containerEl.appendChild(xItem);\n this.containerEl.appendChild(yItem);\n this.containerEl.appendChild(zItem);\n this.controlEl.appendChild(this.containerEl);\n\n this.xInput.addEventListener('change', () => this.handleInputChange());\n this.yInput.addEventListener('change', () => this.handleInputChange());\n this.zInput.addEventListener('change', () => this.handleInputChange());\n\n this.setupInputScrubbing(this.xInput, 'x');\n this.setupInputScrubbing(this.yInput, 'y');\n this.setupInputScrubbing(this.zInput, 'z');\n\n this.update();\n }\n\n private setupInputScrubbing(input: HTMLInputElement, axis: 'x' | 'y' | 'z'): void {\n let isScrubbing = false;\n let startX = 0;\n let startVal = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!isScrubbing && Math.abs(dx) > 3) {\n isScrubbing = true;\n if (typeof document !== 'undefined') {\n document.body.classList.add('relly-jog-scrubbing');\n }\n }\n if (isScrubbing) {\n const stepMultiplier = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1;\n const stepDelta = this.step * stepMultiplier;\n let newVal = startVal + dx * stepDelta;\n if (this.min !== undefined) newVal = Math.max(this.min, newVal);\n if (this.max !== undefined) newVal = Math.min(this.max, newVal);\n const decimals = (stepDelta.toString().split('.')[1] || '').length;\n const invStep = 1 / stepDelta;\n newVal = Math.round(newVal * invStep) / invStep;\n newVal = parseFloat(newVal.toFixed(Math.min(decimals, 4)));\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n const nextArr: [number, number, number] = [\n currentVal[0] ?? 0,\n currentVal[1] ?? 0,\n currentVal[2] ?? 0\n ];\n const idx = axis === 'x' ? 0 : axis === 'y' ? 1 : 2;\n nextArr[idx] = newVal;\n this.setValue(nextArr);\n } else {\n this.setValue({ ...currentVal, [axis]: newVal });\n }\n ev.preventDefault();\n }\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n if (isScrubbing) {\n isScrubbing = false;\n if (typeof document !== 'undefined') {\n document.body.classList.remove('relly-jog-scrubbing');\n }\n }\n };\n\n input.addEventListener('mousedown', (ev: MouseEvent) => {\n if (ev.button !== 0) return;\n startX = ev.clientX;\n startVal = parseFloat(input.value) || 0;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private handleInputChange(): void {\n const x = parseFloat(this.xInput.value) || 0;\n const y = parseFloat(this.yInput.value) || 0;\n const z = parseFloat(this.zInput.value) || 0;\n\n const currentVal = this.getValue();\n if (Array.isArray(currentVal)) {\n this.setValue([x, y, z]);\n } else {\n this.setValue({\n ...(typeof currentVal === 'object' && currentVal !== null ? currentVal : {}),\n x,\n y,\n z\n });\n }\n }\n\n public setMin(min?: number): this {\n this.min = min;\n if (min !== undefined) {\n this.xInput.min = min.toString();\n this.yInput.min = min.toString();\n this.zInput.min = min.toString();\n } else {\n this.xInput.removeAttribute('min');\n this.yInput.removeAttribute('min');\n this.zInput.removeAttribute('min');\n }\n return this;\n }\n\n public setMax(max?: number): this {\n this.max = max;\n if (max !== undefined) {\n this.xInput.max = max.toString();\n this.yInput.max = max.toString();\n this.zInput.max = max.toString();\n } else {\n this.xInput.removeAttribute('max');\n this.yInput.removeAttribute('max');\n this.zInput.removeAttribute('max');\n }\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.xInput.step = step.toString();\n this.yInput.step = step.toString();\n this.zInput.step = step.toString();\n return this;\n }\n\n public update(): this {\n if (!this.xInput || !this.yInput || !this.zInput) return this;\n const val = this.getValue();\n let x = 0;\n let y = 0;\n let z = 0;\n\n if (Array.isArray(val)) {\n x = val[0] || 0;\n y = val[1] || 0;\n z = val[2] || 0;\n } else if (typeof val === 'object' && val !== null) {\n x = (val as any).x || 0;\n y = (val as any).y || 0;\n z = (val as any).z || 0;\n }\n\n this.xInput.value = String(x);\n this.yInput.value = String(y);\n this.zInput.value = String(z);\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\nimport { RangeVal } from '../../types';\n\nexport class RangeSlider extends BaseComponent<RangeVal> {\n private wrapperEl: HTMLElement;\n private trackEl: HTMLElement;\n private barEl: HTMLElement;\n private thumbMin: HTMLElement;\n private thumbMax: HTMLElement;\n private inputMin: HTMLInputElement;\n private inputMax: HTMLInputElement;\n\n private min: number = 0;\n private max: number = 100;\n private step: number = 1;\n private soundEngine?: SoundEngine;\n private formatter: (min: number, max: number) => string = (a, b) =>\n `[${a.toFixed(1)}, ${b.toFixed(1)}]`;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-range-wrapper';\n\n // Min input\n this.inputMin = document.createElement('input');\n this.inputMin.type = 'number';\n this.inputMin.className = 'relly-range-input relly-range-input--min';\n\n // Track\n this.trackEl = document.createElement('div');\n this.trackEl.className = 'relly-range-track';\n\n this.barEl = document.createElement('div');\n this.barEl.className = 'relly-range-bar';\n\n this.thumbMin = document.createElement('div');\n this.thumbMin.className = 'relly-range-thumb relly-range-thumb--min';\n this.thumbMin.title = 'Drag min';\n\n this.thumbMax = document.createElement('div');\n this.thumbMax.className = 'relly-range-thumb relly-range-thumb--max';\n this.thumbMax.title = 'Drag max';\n\n this.trackEl.appendChild(this.barEl);\n this.trackEl.appendChild(this.thumbMin);\n this.trackEl.appendChild(this.thumbMax);\n\n // Max input\n this.inputMax = document.createElement('input');\n this.inputMax.type = 'number';\n this.inputMax.className = 'relly-range-input relly-range-input--max';\n\n this.wrapperEl.appendChild(this.inputMin);\n this.wrapperEl.appendChild(this.trackEl);\n this.wrapperEl.appendChild(this.inputMax);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.setupListeners();\n this.update();\n }\n\n private setupListeners(): void {\n // Manual input typing\n this.inputMin.addEventListener('change', () => {\n const vMin = parseFloat(this.inputMin.value) || this.min;\n const [_, curMax] = this.getCurrentRange();\n this.setRangeValue(Math.min(vMin, curMax), curMax);\n });\n\n this.inputMax.addEventListener('change', () => {\n const vMax = parseFloat(this.inputMax.value) || this.max;\n const [curMin, _] = this.getCurrentRange();\n this.setRangeValue(curMin, Math.max(vMax, curMin));\n });\n\n // Dragging thumb min\n this.setupThumbDrag(this.thumbMin, 'min');\n\n // Dragging thumb max\n this.setupThumbDrag(this.thumbMax, 'max');\n\n // Dragging range bar (shifts whole interval)\n this.setupBarDrag();\n }\n\n private setupThumbDrag(thumb: HTMLElement, type: 'min' | 'max'): void {\n let isDragging = false;\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!isDragging) return;\n const rect = this.trackEl.getBoundingClientRect();\n const pct = Math.max(0, Math.min(1, (ev.clientX - rect.left) / rect.width));\n const rawVal = this.min + pct * (this.max - this.min);\n const steppedVal = this.applyStep(rawVal);\n const [curMin, curMax] = this.getCurrentRange();\n\n if (type === 'min') {\n const nextMin = Math.min(steppedVal, curMax);\n if (nextMin !== curMin) {\n this.soundEngine?.playTick();\n this.setRangeValue(nextMin, curMax);\n }\n } else {\n const nextMax = Math.max(steppedVal, curMin);\n if (nextMax !== curMax) {\n this.soundEngine?.playTick();\n this.setRangeValue(curMin, nextMax);\n }\n }\n };\n\n const onMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n thumb.addEventListener('mousedown', (ev) => {\n if (ev.button !== 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n isDragging = true;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private setupBarDrag(): void {\n let isDragging = false;\n let startX = 0;\n let startMin = 0;\n let startMax = 0;\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!isDragging) return;\n const rect = this.trackEl.getBoundingClientRect();\n const dxPct = (ev.clientX - startX) / rect.width;\n const deltaVal = dxPct * (this.max - this.min);\n const span = startMax - startMin;\n\n let newMin = Math.max(this.min, Math.min(this.max - span, startMin + deltaVal));\n newMin = this.applyStep(newMin);\n const newMax = this.applyStep(newMin + span);\n\n const [curMin, curMax] = this.getCurrentRange();\n if (newMin !== curMin || newMax !== curMax) {\n this.soundEngine?.playTick();\n this.setRangeValue(newMin, newMax);\n }\n };\n\n const onMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n };\n\n this.barEl.addEventListener('mousedown', (ev) => {\n if (ev.button !== 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n isDragging = true;\n startX = ev.clientX;\n const [curMin, curMax] = this.getCurrentRange();\n startMin = curMin;\n startMax = curMax;\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n });\n }\n\n private applyStep(val: number): number {\n const stepped = Math.round(val / this.step) * this.step;\n const decimals = (this.step.toString().split('.')[1] || '').length;\n return parseFloat(stepped.toFixed(decimals));\n }\n\n private getCurrentRange(): [number, number] {\n const val = this.getValue();\n if (Array.isArray(val)) {\n return [val[0] ?? this.min, val[1] ?? this.max];\n } else if (typeof val === 'object' && val !== null) {\n return [(val as any).min ?? this.min, (val as any).max ?? this.max];\n }\n return [this.min, this.max];\n }\n\n private setRangeValue(vMin: number, vMax: number): void {\n const clampedMin = Math.max(this.min, Math.min(vMin, this.max));\n const clampedMax = Math.max(this.min, Math.min(vMax, this.max));\n\n const cur = this.getValue();\n if (Array.isArray(cur)) {\n this.setValue([clampedMin, clampedMax]);\n } else {\n this.setValue({\n ...(typeof cur === 'object' && cur !== null ? cur : {}),\n min: clampedMin,\n max: clampedMax\n });\n }\n }\n\n public setMin(min: number): this {\n this.min = min;\n this.update();\n return this;\n }\n\n public setMax(max: number): this {\n this.max = max;\n this.update();\n return this;\n }\n\n public setStep(step: number): this {\n this.step = step;\n this.inputMin.step = step.toString();\n this.inputMax.step = step.toString();\n return this;\n }\n\n public setFormat(fn: (min: number, max: number) => string): this {\n this.formatter = fn;\n this.update();\n return this;\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.trackEl || !this.thumbMin || !this.thumbMax) return this;\n const [vMin, vMax] = this.getCurrentRange();\n const range = this.max - this.min || 1;\n\n const minPct = Math.max(0, Math.min(100, ((vMin - this.min) / range) * 100));\n const maxPct = Math.max(0, Math.min(100, ((vMax - this.min) / range) * 100));\n\n this.thumbMin.style.left = `${minPct}%`;\n this.thumbMax.style.left = `${maxPct}%`;\n\n this.barEl.style.left = `${minPct}%`;\n this.barEl.style.width = `${Math.max(0, maxPct - minPct)}%`;\n this.barEl.title = this.formatter(vMin, vMax);\n\n this.inputMin.value = String(vMin);\n this.inputMax.value = String(vMax);\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Segmented extends BaseComponent<any> {\n private containerEl: HTMLElement;\n private gliderEl: HTMLElement;\n private buttons: Map<string, HTMLButtonElement> = new Map();\n private optionsMap: Map<string, any> = new Map();\n private soundEngine?: SoundEngine;\n\n constructor(\n label: string,\n targetObject: any,\n property: string,\n options: string[] | number[] | Record<string, any> = [],\n bindingEngine?: BindingEngine,\n presetManager?: PresetManager,\n soundEngine?: SoundEngine\n ) {\n super(label, targetObject, property, bindingEngine, presetManager);\n this.soundEngine = soundEngine;\n\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-segmented-container';\n\n this.gliderEl = document.createElement('div');\n this.gliderEl.className = 'relly-segmented-glider';\n this.containerEl.appendChild(this.gliderEl);\n\n this.controlEl.appendChild(this.containerEl);\n\n this.setOptions(options);\n }\n\n public setOptions(options: string[] | number[] | Record<string, any>): this {\n this.optionsMap.clear();\n this.buttons.clear();\n\n // Preserve glider\n this.containerEl.innerHTML = '';\n this.containerEl.appendChild(this.gliderEl);\n\n if (Array.isArray(options)) {\n for (const item of options) {\n const key = String(item);\n this.optionsMap.set(key, item);\n this.createButton(key, key, item);\n }\n } else if (typeof options === 'object' && options !== null) {\n for (const [key, val] of Object.entries(options)) {\n this.optionsMap.set(key, val);\n this.createButton(key, key, val);\n }\n }\n\n this.update();\n return this;\n }\n\n private createButton(key: string, label: string, value: any): void {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-segmented-btn';\n btn.textContent = label;\n\n btn.addEventListener('click', () => {\n this.soundEngine?.playClick();\n this.setValue(value);\n });\n\n this.containerEl.appendChild(btn);\n this.buttons.set(key, btn);\n }\n\n public setSoundEngine(soundEngine: SoundEngine): this {\n this.soundEngine = soundEngine;\n return this;\n }\n\n public update(): this {\n if (!this.containerEl || this.buttons.size === 0) return this;\n const currentVal = this.getValue();\n\n let matchedBtn: HTMLButtonElement | null = null;\n\n for (const [key, val] of this.optionsMap.entries()) {\n const btn = this.buttons.get(key);\n if (!btn) continue;\n\n if (val === currentVal || String(val) === String(currentVal)) {\n btn.classList.add('relly-segmented-btn--active');\n matchedBtn = btn;\n } else {\n btn.classList.remove('relly-segmented-btn--active');\n }\n }\n\n if (matchedBtn) {\n const left = matchedBtn.offsetLeft;\n const width = matchedBtn.offsetWidth;\n this.gliderEl.style.transform = `translateX(${left}px)`;\n this.gliderEl.style.width = `${width}px`;\n this.gliderEl.style.opacity = '1';\n } else {\n this.gliderEl.style.opacity = '0';\n }\n\n return this;\n }\n}\n","import { BaseComponent } from '../../core/BaseComponent';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { StatusType } from '../../types';\n\nexport class StatusIndicator extends BaseComponent<string> {\n private wrapperEl: HTMLElement;\n private ledEl: HTMLElement;\n private badgeEl: HTMLElement;\n private detailEl: HTMLElement;\n\n private currentStatus: StatusType = 'online';\n private customBadge?: string;\n private customDetail?: string;\n\n constructor(\n label: string,\n targetObject?: any,\n property?: string,\n bindingEngine?: BindingEngine\n ) {\n super(label, targetObject, property, bindingEngine);\n\n this.wrapperEl = document.createElement('div');\n this.wrapperEl.className = 'relly-status-wrapper';\n\n // Pulsing LED\n this.ledEl = document.createElement('div');\n this.ledEl.className = 'relly-status-led relly-status-led--online';\n this.ledEl.innerHTML = `\n <span class=\"relly-status-pulse-ring\"></span>\n <span class=\"relly-status-led-core\"></span>\n `;\n\n // Status Badge\n this.badgeEl = document.createElement('span');\n this.badgeEl.className = 'relly-status-badge relly-status-badge--online';\n this.badgeEl.textContent = 'ONLINE';\n\n // Detail text\n this.detailEl = document.createElement('span');\n this.detailEl.className = 'relly-status-detail';\n\n this.wrapperEl.appendChild(this.ledEl);\n this.wrapperEl.appendChild(this.badgeEl);\n this.wrapperEl.appendChild(this.detailEl);\n this.controlEl.appendChild(this.wrapperEl);\n\n this.update();\n }\n\n public setStatus(status: StatusType, badge?: string, detail?: string): this {\n this.currentStatus = status;\n if (badge !== undefined) this.customBadge = badge;\n if (detail !== undefined) this.customDetail = detail;\n\n if (this.targetObject && this.property) {\n this.targetObject[this.property] = status;\n }\n this.update();\n return this;\n }\n\n public setBadge(badge: string): this {\n this.customBadge = badge;\n this.update();\n return this;\n }\n\n public setDetail(detail: string): this {\n this.customDetail = detail;\n this.update();\n return this;\n }\n\n public update(): this {\n if (!this.wrapperEl || !this.ledEl) return this;\n\n const rawVal = this.getValue();\n let status: StatusType = this.currentStatus;\n\n if (typeof rawVal === 'string' && rawVal) {\n const lower = rawVal.toLowerCase();\n if (['online', 'busy', 'offline', 'info', 'ready'].includes(lower)) {\n status = lower as StatusType;\n }\n }\n\n this.ledEl.className = `relly-status-led relly-status-led--${status}`;\n this.badgeEl.className = `relly-status-badge relly-status-badge--${status}`;\n\n this.badgeEl.textContent = this.customBadge || status.toUpperCase();\n\n if (this.customDetail) {\n this.detailEl.textContent = this.customDetail;\n this.detailEl.style.display = 'inline-block';\n } else {\n this.detailEl.style.display = 'none';\n }\n\n return this;\n }\n}\n","import { Checkbox } from '../components/Checkbox/Checkbox';\nimport { Slider } from '../components/Slider/Slider';\nimport { Button } from '../components/Button/Button';\nimport { Select } from '../components/Select/Select';\nimport { DynamicLabel } from '../components/DynamicLabel/DynamicLabel';\nimport { Graph } from '../components/Graph/Graph';\nimport { ColorPicker } from '../components/ColorPicker/ColorPicker';\nimport { Point2D } from '../components/Point2D/Point2D';\nimport { Point3D } from '../components/Point3D/Point3D';\nimport { RangeSlider } from '../components/Range/RangeSlider';\nimport { Segmented } from '../components/Segmented/Segmented';\nimport { StatusIndicator } from '../components/Status/StatusIndicator';\nimport { BindingEngine, Listenable } from './BindingEngine';\nimport { PresetManager } from './PresetManager';\nimport { SoundEngine } from './SoundEngine';\nimport {\n ComponentFactoryOptions,\n ConditionPredicate,\n OnClickCallback,\n Point2DOptions,\n Point3DOptions,\n RangeOptions,\n StatusType\n} from '../types';\nimport { BaseComponent } from './BaseComponent';\n\nexport interface IComponentContainer {\n getContentElement(): HTMLElement;\n getBindingEngine(): BindingEngine;\n getPresetManager(): PresetManager;\n}\n\nexport abstract class ContainerHelper {\n protected children: Array<BaseComponent | { destroy(): void }> = [];\n protected accordion: boolean = false;\n\n constructor(\n protected contentEl: HTMLElement,\n protected bindingEngine: BindingEngine,\n protected presetManager: PresetManager,\n protected soundEngine?: SoundEngine\n ) {}\n\n public setAccordion(enabled: boolean): this {\n this.accordion = enabled;\n return this;\n }\n\n public isAccordion(): boolean {\n return this.accordion;\n }\n\n public onSectionExpanded(expandedSection: Section): void {\n if (!this.accordion) return;\n for (const child of this.children) {\n if (child instanceof Section && child !== expandedSection) {\n child.setCollapsed(true);\n }\n }\n }\n\n public addCheckbox(targetOrOptions: any, property?: string): Checkbox {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Checkbox(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange || opts.onToggle) comp.onChange(opts.onChange || opts.onToggle);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Checkbox(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createCheckbox(targetOrOptions: any, property?: string): Checkbox {\n return this.addCheckbox(targetOrOptions, property);\n }\n\n public addSlider(targetOrOptions: any, property?: string): Slider {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Slider(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Slider(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSlider(targetOrOptions: any, property?: string): Slider {\n return this.addSlider(targetOrOptions, property);\n }\n\n public addButton(\n labelOrOptions: string | { label?: string; onClick?: OnClickCallback; tooltip?: string; showIf?: ConditionPredicate },\n onClick?: OnClickCallback\n ): Button {\n if (typeof labelOrOptions === 'object' && labelOrOptions !== null) {\n const opts = labelOrOptions;\n const label = opts.label || 'Button';\n const comp = new Button(label, opts.onClick || onClick, this.soundEngine);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const comp = new Button(labelOrOptions, onClick, this.soundEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createButton(\n labelOrOptions: string | { label?: string; onClick?: OnClickCallback; tooltip?: string; showIf?: ConditionPredicate },\n onClick?: OnClickCallback\n ): Button {\n return this.addButton(labelOrOptions, onClick);\n }\n\n public addSelect(targetOrOptions: any, property?: string, options?: any): Select {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Select(label, opts.object, opts.property, opts.options, this.bindingEngine, this.presetManager);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Select(\n label,\n targetOrOptions,\n property!,\n options,\n this.bindingEngine,\n this.presetManager\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSelect(targetOrOptions: any, property?: string, options?: any): Select {\n return this.addSelect(targetOrOptions, property, options);\n }\n\n public addDynamicLabel(targetOrOptions: any, property?: string): DynamicLabel {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new DynamicLabel(label, opts.object, opts.property, this.bindingEngine);\n if (opts.format) comp.setFormat(opts.format);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new DynamicLabel(label, targetOrOptions, property!, this.bindingEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createDynamicLabel(targetOrOptions: any, property?: string): DynamicLabel {\n return this.addDynamicLabel(targetOrOptions, property);\n }\n\n public addGraph(targetOrOptions: any, property?: string): Graph {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Graph(label, opts.object, opts.property, this.bindingEngine, this.soundEngine);\n if (opts.range) comp.setRange(opts.range[0], opts.range[1]);\n if (opts.color) comp.setColor(opts.color, opts.fillColor);\n if (opts.bufferSize) comp.setBufferSize(opts.bufferSize);\n if (opts.smooth !== undefined) comp.setSmooth(opts.smooth);\n if (opts.height) comp.setHeight(opts.height);\n if (opts.format) comp.setFormat(opts.format);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Graph(label, targetOrOptions, property!, this.bindingEngine, this.soundEngine);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createGraph(targetOrOptions: any, property?: string): Graph {\n return this.addGraph(targetOrOptions, property);\n }\n\n public addFPSGraph(label: string = 'FPS'): Graph {\n const tracker = { fps: 60 };\n let frames = 0;\n let prevTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n let animId: number;\n\n const loop = (now: number) => {\n frames++;\n if (now >= prevTime + 1000) {\n tracker.fps = Math.round((frames * 1000) / (now - prevTime));\n frames = 0;\n prevTime = now;\n }\n animId = requestAnimationFrame(loop);\n };\n\n if (typeof requestAnimationFrame !== 'undefined') {\n animId = requestAnimationFrame(loop);\n }\n\n const graph = this.addGraph(tracker, 'fps')\n .setLabel(label)\n .setRange(0, 120)\n .setColor('#22c55e', 'rgba(34, 197, 94, 0.25)')\n .setFormat((v) => `${Math.round(v)} FPS`);\n\n const origDestroy = graph.destroy.bind(graph);\n graph.destroy = () => {\n if (typeof cancelAnimationFrame !== 'undefined' && animId) {\n cancelAnimationFrame(animId);\n }\n origDestroy();\n };\n\n return graph;\n }\n\n public createFPSGraph(label: string = 'FPS'): Graph {\n return this.addFPSGraph(label);\n }\n\n public addMemoryGraph(label: string = 'Memory'): Graph {\n const tracker = { mem: 0 };\n let intervalId: any;\n\n const updateMem = () => {\n if (typeof performance !== 'undefined' && (performance as any).memory) {\n const used = (performance as any).memory.usedJSHeapSize / (1024 * 1024);\n tracker.mem = Number(used.toFixed(1));\n } else {\n // Fallback smooth representation\n tracker.mem = Number((Math.sin(Date.now() / 2500) * 8 + 48).toFixed(1));\n }\n };\n\n updateMem();\n if (typeof setInterval !== 'undefined') {\n intervalId = setInterval(updateMem, 1000);\n }\n\n const graph = this.addGraph(tracker, 'mem')\n .setLabel(label)\n .setAutoRange(true)\n .setColor('#a855f7', 'rgba(168, 85, 247, 0.25)')\n .setFormat((v) => `${v.toFixed(1)} MB`);\n\n const origDestroy = graph.destroy.bind(graph);\n graph.destroy = () => {\n if (intervalId) clearInterval(intervalId);\n origDestroy();\n };\n\n return graph;\n }\n\n public createMemoryGraph(label: string = 'Memory'): Graph {\n return this.addMemoryGraph(label);\n }\n\n public addColor(targetOrOptions: any, property?: string): ColorPicker {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new ColorPicker(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.swatches) comp.setSwatches(opts.swatches);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new ColorPicker(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createColor(targetOrOptions: any, property?: string): ColorPicker {\n return this.addColor(targetOrOptions, property);\n }\n\n public addPoint2D(targetOrOptions: any, property?: string, options?: Point2DOptions): Point2D {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Point2D(label, opts.object, opts.property, this.bindingEngine, this.presetManager);\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Point2D(label, targetOrOptions, property!, this.bindingEngine, this.presetManager);\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createPoint2D(targetOrOptions: any, property?: string, options?: Point2DOptions): Point2D {\n return this.addPoint2D(targetOrOptions, property, options);\n }\n\n public addPoint3D(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Point3D(label, opts.object, opts.property, this.bindingEngine, this.presetManager);\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Point3D(label, targetOrOptions, property!, this.bindingEngine, this.presetManager);\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createPoint3D(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public addVector3(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public createVector3(targetOrOptions: any, property?: string, options?: Point3DOptions): Point3D {\n return this.addPoint3D(targetOrOptions, property, options);\n }\n\n public addRange(targetOrOptions: any, property?: string, options?: RangeOptions): RangeSlider {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new RangeSlider(\n label,\n opts.object,\n opts.property,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.min !== undefined) comp.setMin(opts.min);\n if (opts.max !== undefined) comp.setMax(opts.max);\n if (opts.step !== undefined) comp.setStep(opts.step);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new RangeSlider(\n label,\n targetOrOptions,\n property!,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (options?.min !== undefined) comp.setMin(options.min);\n if (options?.max !== undefined) comp.setMax(options.max);\n if (options?.step !== undefined) comp.setStep(options.step);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createRange(targetOrOptions: any, property?: string, options?: RangeOptions): RangeSlider {\n return this.addRange(targetOrOptions, property, options);\n }\n\n public addSegmented(\n targetOrOptions: any,\n property?: string,\n options?: string[] | number[] | Record<string, any>\n ): Segmented {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new Segmented(\n label,\n opts.object,\n opts.property,\n opts.options || [],\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.onChange) comp.onChange(opts.onChange);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property ? (property.charAt(0).toUpperCase() + property.slice(1)) : '';\n const comp = new Segmented(\n label,\n targetOrOptions,\n property!,\n options || [],\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createSegmented(\n targetOrOptions: any,\n property?: string,\n options?: string[] | number[] | Record<string, any>\n ): Segmented {\n return this.addSegmented(targetOrOptions, property, options);\n }\n\n public addStatus(\n targetOrOptions: any,\n property?: string,\n initialStatus: StatusType = 'online',\n badge?: string,\n detail?: string\n ): StatusIndicator {\n if (\n typeof targetOrOptions === 'object' &&\n targetOrOptions !== null &&\n property === undefined &&\n 'object' in targetOrOptions &&\n 'property' in targetOrOptions\n ) {\n const opts = targetOrOptions;\n const label = opts.label || (opts.property.charAt(0).toUpperCase() + opts.property.slice(1));\n const comp = new StatusIndicator(\n label,\n opts.object,\n opts.property,\n this.bindingEngine\n );\n if (opts.status) comp.setStatus(opts.status, opts.badge, opts.detail);\n if (opts.badge) comp.setBadge(opts.badge);\n if (opts.detail) comp.setDetail(opts.detail);\n if (opts.tooltip) comp.setTooltip(opts.tooltip);\n if (opts.contextMenu) comp.setContextMenu(opts.contextMenu);\n if (opts.listen) comp.listen();\n if (opts.showIf) comp.showIf(opts.showIf);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n const label = property\n ? (property.charAt(0).toUpperCase() + property.slice(1))\n : (typeof targetOrOptions === 'string' ? targetOrOptions : 'Status');\n\n const targetObj = typeof targetOrOptions === 'string' ? undefined : targetOrOptions;\n const propName = typeof targetOrOptions === 'string' ? undefined : property;\n\n const comp = new StatusIndicator(\n label,\n targetObj,\n propName,\n this.bindingEngine\n );\n comp.setStatus(initialStatus, badge, detail);\n this.contentEl.appendChild(comp.element);\n this.children.push(comp);\n return comp;\n }\n\n public createStatus(\n targetOrOptions: any,\n property?: string,\n initialStatus: StatusType = 'online',\n badge?: string,\n detail?: string\n ): StatusIndicator {\n return this.addStatus(targetOrOptions, property, initialStatus, badge, detail);\n }\n\n public addRow(): Row {\n const row = new Row(this.bindingEngine, this.presetManager, this.soundEngine);\n this.contentEl.appendChild(row.element);\n this.children.push(row);\n return row;\n }\n\n public createRow(): Row {\n return this.addRow();\n }\n\n public addSection(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Section',\n collapsed: boolean = false\n ): Section {\n let label = '';\n let isCollapsed = collapsed;\n if (typeof labelOrOptions === 'object' && labelOrOptions !== null) {\n label = labelOrOptions.label || labelOrOptions.title || 'Section';\n if (labelOrOptions.collapsed !== undefined) {\n isCollapsed = labelOrOptions.collapsed;\n }\n } else {\n label = labelOrOptions || 'Section';\n }\n const section = new Section(label, this.bindingEngine, this.presetManager, isCollapsed, this.soundEngine);\n section.setParentContainer(this);\n this.contentEl.appendChild(section.element);\n this.children.push(section);\n return section;\n }\n\n public addFolder(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Folder',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createSection(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Section',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createFolder(\n labelOrOptions: string | { label?: string; title?: string; collapsed?: boolean } = 'Folder',\n collapsed: boolean = false\n ): Section {\n return this.addSection(labelOrOptions, collapsed);\n }\n\n public createComponent(options: ComponentFactoryOptions): any {\n let comp: any;\n const label = options.label || (options.property ? options.property : options.type);\n\n switch (options.type) {\n case 'checkbox':\n comp = this.addCheckbox(options.object, options.property!);\n break;\n case 'slider': {\n const slider = this.addSlider(options.object, options.property!);\n if (options.min !== undefined) slider.setMin(options.min);\n if (options.max !== undefined) slider.setMax(options.max);\n if (options.step !== undefined) slider.setStep(options.step);\n comp = slider;\n break;\n }\n case 'button':\n comp = this.addButton(label, options.onClick);\n break;\n case 'select':\n comp = this.addSelect(options.object, options.property!, options.options);\n break;\n case 'dynamicLabel': {\n const dyn = this.addDynamicLabel(options.object, options.property!);\n if (options.format) dyn.setFormat(options.format);\n comp = dyn;\n break;\n }\n case 'graph': {\n const graph = this.addGraph(options.object, options.property!);\n if (options.range) graph.setRange(options.range[0], options.range[1]);\n if (options.color) graph.setColor(options.color, options.fillColor);\n if (options.bufferSize) graph.setBufferSize(options.bufferSize);\n comp = graph;\n break;\n }\n case 'color': {\n const colorComp = this.addColor(options.object, options.property!);\n if (options.swatches) colorComp.setSwatches(options.swatches);\n comp = colorComp;\n break;\n }\n case 'point2d': {\n const p2d = this.addPoint2D(options.object, options.property!);\n if (options.min !== undefined) p2d.setMin(options.min);\n if (options.max !== undefined) p2d.setMax(options.max);\n if (options.step !== undefined) p2d.setStep(options.step);\n comp = p2d;\n break;\n }\n case 'point3d':\n case 'vector3': {\n const p3d = this.addPoint3D(options.object, options.property!);\n if (options.min !== undefined) p3d.setMin(options.min);\n if (options.max !== undefined) p3d.setMax(options.max);\n if (options.step !== undefined) p3d.setStep(options.step);\n comp = p3d;\n break;\n }\n case 'range': {\n const range = this.addRange(options.object, options.property!);\n if (options.min !== undefined) range.setMin(options.min);\n if (options.max !== undefined) range.setMax(options.max);\n if (options.step !== undefined) range.setStep(options.step);\n comp = range;\n break;\n }\n case 'segmented': {\n const seg = this.addSegmented(options.object, options.property!, options.options);\n comp = seg;\n break;\n }\n case 'status': {\n const stat = this.addStatus(options.object, options.property!, options.status, options.badge, options.detail);\n comp = stat;\n break;\n }\n case 'section':\n case 'folder': {\n comp = this.addSection(label, options.collapsed || false);\n break;\n }\n default:\n throw new Error(`[RellyUI] Unknown component type: ${(options as any).type}`);\n }\n\n if (label && comp.setLabel) {\n comp.setLabel(label);\n }\n if (options.tooltip && comp.setTooltip) {\n comp.setTooltip(options.tooltip);\n }\n if (options.contextMenu && comp.setContextMenu) {\n comp.setContextMenu(options.contextMenu);\n }\n if ((options.onChange || options.onToggle) && comp.onChange) {\n comp.onChange(options.onChange || options.onToggle);\n }\n if (options.listen && comp.listen) {\n comp.listen();\n }\n if (options.showIf && comp.showIf) {\n comp.showIf(options.showIf);\n }\n if (options.disabled && comp.setDisabled) {\n comp.setDisabled(true);\n }\n\n return comp;\n }\n\n public destroyChildren(): void {\n for (const child of this.children) {\n child.destroy();\n }\n this.children = [];\n }\n}\n\nexport class Row extends ContainerHelper {\n public element: HTMLElement;\n protected disabled: boolean = false;\n\n constructor(bindingEngine: BindingEngine, presetManager: PresetManager, soundEngine?: SoundEngine) {\n const rowEl = document.createElement('div');\n rowEl.className = 'relly-multi-row';\n super(rowEl, bindingEngine, presetManager, soundEngine);\n this.element = rowEl;\n }\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n } else {\n this.element.classList.remove('relly-disabled');\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public destroy(): void {\n this.destroyChildren();\n this.element.remove();\n }\n}\n\nexport class Section extends ContainerHelper implements Listenable {\n public element: HTMLElement;\n private headerEl: HTMLElement;\n private titleEl: HTMLElement;\n private arrowEl: HTMLElement;\n private isCollapsed: boolean = false;\n private conditionPredicate?: ConditionPredicate;\n protected parentContainer?: ContainerHelper;\n protected disabled: boolean = false;\n\n constructor(\n private label: string,\n bindingEngine: BindingEngine,\n presetManager: PresetManager,\n initialCollapsed: boolean = false,\n soundEngine?: SoundEngine\n ) {\n const content = document.createElement('div');\n content.className = 'relly-section-content';\n super(content, bindingEngine, presetManager, soundEngine);\n\n this.element = document.createElement('div');\n this.element.className = 'relly-section';\n\n this.headerEl = document.createElement('div');\n this.headerEl.className = 'relly-section-header';\n\n const titleWrap = document.createElement('div');\n titleWrap.className = 'relly-section-title-wrap';\n\n this.arrowEl = document.createElement('span');\n this.arrowEl.innerHTML = `\n <svg class=\"relly-section-arrow\" viewBox=\"0 0 10 10\">\n <polygon points=\"2,1 8,5 2,9\"></polygon>\n </svg>\n `;\n\n this.titleEl = document.createElement('span');\n this.titleEl.textContent = label;\n\n titleWrap.appendChild(this.arrowEl);\n titleWrap.appendChild(this.titleEl);\n this.headerEl.appendChild(titleWrap);\n\n this.element.appendChild(this.headerEl);\n this.element.appendChild(this.contentEl);\n\n this.headerEl.addEventListener('click', () => {\n if (this.disabled) return;\n this.soundEngine?.playClick();\n this.toggle();\n });\n\n if (initialCollapsed) {\n this.setCollapsed(true);\n }\n }\n\n public setParentContainer(parent: ContainerHelper): this {\n this.parentContainer = parent;\n return this;\n }\n\n public setDisabled(disabled: boolean): this {\n this.disabled = disabled;\n if (this.disabled) {\n this.element.classList.add('relly-disabled');\n } else {\n this.element.classList.remove('relly-disabled');\n }\n return this;\n }\n\n public isDisabled(): boolean {\n return this.disabled;\n }\n\n public setLabel(label: string): this {\n this.label = label;\n this.titleEl.textContent = label;\n return this;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public toggle(): this {\n return this.setCollapsed(!this.isCollapsed);\n }\n\n public setCollapsed(collapsed: boolean): this {\n this.isCollapsed = collapsed;\n if (this.isCollapsed) {\n this.element.classList.add('relly-section--collapsed');\n } else {\n this.element.classList.remove('relly-section--collapsed');\n if (this.parentContainer) {\n this.parentContainer.onSectionExpanded(this);\n }\n }\n return this;\n }\n\n public showIf(predicate: ConditionPredicate): this {\n this.conditionPredicate = predicate;\n this.checkVisibility();\n this.bindingEngine.register(this);\n return this;\n }\n\n public checkVisibility(): boolean {\n if (!this.conditionPredicate) return true;\n const isVisible = this.conditionPredicate();\n this.element.style.display = isVisible ? '' : 'none';\n return isVisible;\n }\n\n public checkDirty(): void {\n this.checkVisibility();\n }\n\n public destroy(): void {\n if (this.conditionPredicate) {\n this.bindingEngine.unregister(this);\n }\n this.destroyChildren();\n this.element.remove();\n }\n}\n","export interface Listenable {\n checkDirty(): void;\n}\n\nexport class BindingEngine {\n private listeners: Set<Listenable> = new Set();\n private rafId: number | null = null;\n private isRunning: boolean = false;\n private isPaused: boolean = false;\n\n public register(component: Listenable): void {\n this.listeners.add(component);\n if (!this.isRunning && !this.isPaused) {\n this.start();\n }\n }\n\n public unregister(component: Listenable): void {\n this.listeners.delete(component);\n if (this.listeners.size === 0) {\n this.stop();\n }\n }\n\n public pause(): void {\n this.isPaused = true;\n this.stop();\n }\n\n public resume(): void {\n this.isPaused = false;\n if (this.listeners.size > 0 && !this.isRunning) {\n this.start();\n }\n }\n\n private start(): void {\n if (typeof window === 'undefined') return;\n this.isRunning = true;\n const loop = () => {\n if (!this.isRunning) return;\n for (const listener of this.listeners) {\n listener.checkDirty();\n }\n this.rafId = requestAnimationFrame(loop);\n };\n this.rafId = requestAnimationFrame(loop);\n }\n\n private stop(): void {\n this.isRunning = false;\n if (this.rafId !== null && typeof window !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n public destroy(): void {\n this.stop();\n this.listeners.clear();\n }\n}\n","export interface SerializableComponent {\n getSerializableKey(): string | null;\n getValue(): any;\n setValue(val: any): void;\n}\n\nexport class PresetManager {\n private components: Set<SerializableComponent> = new Set();\n private pendingValues: Record<string, any> = {};\n private changeCallback?: () => void;\n\n public setOnChange(cb: () => void): void {\n this.changeCallback = cb;\n }\n\n public notifyChange(): void {\n this.changeCallback?.();\n }\n\n public register(component: SerializableComponent): void {\n this.components.add(component);\n const key = component.getSerializableKey();\n if (key && key in this.pendingValues) {\n component.setValue(this.pendingValues[key]);\n }\n }\n\n public setPendingValues(values: Record<string, any>): void {\n this.pendingValues = { ...this.pendingValues, ...values };\n for (const comp of this.components) {\n const key = comp.getSerializableKey();\n if (key && key in this.pendingValues) {\n comp.setValue(this.pendingValues[key]);\n }\n }\n }\n\n public getPendingValues(): Record<string, any> {\n return { ...this.pendingValues };\n }\n\n public unregister(component: SerializableComponent): void {\n this.components.delete(component);\n }\n\n public export(): Record<string, any> {\n const data: Record<string, any> = { ...this.pendingValues };\n for (const comp of this.components) {\n const key = comp.getSerializableKey();\n if (key) {\n data[key] = comp.getValue();\n }\n }\n return data;\n }\n\n public import(data: Record<string, any>): void {\n if (!data || typeof data !== 'object') return;\n this.setPendingValues(data);\n }\n\n public save(storageKey: string = 'relly-ui-preset'): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n const exported = this.export();\n window.localStorage.setItem(storageKey, JSON.stringify(exported));\n } catch (err) {\n console.warn('[RellyUI] Failed to save preset to localStorage', err);\n }\n }\n\n public load(storageKey: string = 'relly-ui-preset'): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw) {\n const parsed = JSON.parse(raw);\n this.import(parsed);\n }\n } catch (err) {\n console.warn('[RellyUI] Failed to load preset from localStorage', err);\n }\n }\n\n public clear(): void {\n this.components.clear();\n this.pendingValues = {};\n }\n}\n","import { RellyTheme, ThemeInput } from '../types';\n\nexport const DARK_THEME: RellyTheme = {\n bg: '#1c1d22',\n fg: '#d1d5db',\n headerBg: '#141518',\n headerFg: '#f3f4f6',\n accent: '#6366f1',\n accentHover: '#4f46e5',\n border: 'rgba(255, 255, 255, 0.08)',\n inputBg: '#26272e',\n inputHover: '#2f3039',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const LIGHT_THEME: RellyTheme = {\n bg: '#ffffff',\n fg: '#374151',\n headerBg: '#f3f4f6',\n headerFg: '#111827',\n accent: '#4f46e5',\n accentHover: '#4338ca',\n border: '#e5e7eb',\n inputBg: '#f9fafb',\n inputHover: '#f3f4f6',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const CYBERPUNK_THEME: RellyTheme = {\n bg: '#0f051d',\n fg: '#e0f2fe',\n headerBg: '#180a33',\n headerFg: '#00f0ff',\n accent: '#00f0ff',\n accentHover: '#ff007f',\n border: 'rgba(0, 240, 255, 0.25)',\n inputBg: '#1e0d3d',\n inputHover: '#2d145c',\n radius: '4px',\n font: '\"JetBrains Mono\", Consolas, monospace',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const NORD_THEME: RellyTheme = {\n bg: '#2e3440',\n fg: '#d8dee9',\n headerBg: '#242933',\n headerFg: '#eceff4',\n accent: '#88c0d0',\n accentHover: '#81a1c1',\n border: '#3b4252',\n inputBg: '#3b4252',\n inputHover: '#434c5e',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const DRACULA_THEME: RellyTheme = {\n bg: '#282a36',\n fg: '#f8f8f2',\n headerBg: '#1e1f29',\n headerFg: '#bd93f9',\n accent: '#bd93f9',\n accentHover: '#ff79c6',\n border: '#44475a',\n inputBg: '#44475a',\n inputHover: '#6272a4',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const TOKYO_NIGHT_THEME: RellyTheme = {\n bg: '#1a1b26',\n fg: '#a9b1d6',\n headerBg: '#16161e',\n headerFg: '#7aa2f7',\n accent: '#7aa2f7',\n accentHover: '#bb9af7',\n border: 'rgba(122, 162, 247, 0.18)',\n inputBg: '#24283b',\n inputHover: '#2f3549',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const MATRIX_THEME: RellyTheme = {\n bg: '#0a0f0d',\n fg: '#00ff66',\n headerBg: '#050a08',\n headerFg: '#00ff66',\n accent: '#00ff66',\n accentHover: '#33ff88',\n border: 'rgba(0, 255, 102, 0.25)',\n inputBg: '#0d1812',\n inputHover: '#13241b',\n radius: '3px',\n font: '\"JetBrains Mono\", Consolas, monospace',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport const SYNTHWAVE_THEME: RellyTheme = {\n bg: '#241b2f',\n fg: '#f8f8f2',\n headerBg: '#191322',\n headerFg: '#ff71ce',\n accent: '#ff71ce',\n accentHover: '#01cdfe',\n border: 'rgba(255, 113, 206, 0.25)',\n inputBg: '#2f233f',\n inputHover: '#3c2c51',\n radius: '6px',\n font: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '11px',\n rowHeight: '26px'\n};\n\nexport class ThemeManager {\n private currentTheme: RellyTheme;\n private currentThemeName?: string;\n\n constructor(\n private panelElement: HTMLElement,\n themeInput?: ThemeInput\n ) {\n this.currentTheme = { ...DARK_THEME };\n this.currentThemeName = 'dark';\n if (themeInput) {\n this.applyTheme(themeInput);\n } else {\n this.applyToDOM(this.currentTheme);\n }\n }\n\n public applyTheme(themeInput: ThemeInput): void {\n if (typeof themeInput === 'string') {\n this.currentThemeName = themeInput;\n }\n\n if (themeInput === 'light') {\n this.currentTheme = { ...LIGHT_THEME };\n } else if (themeInput === 'dark') {\n this.currentTheme = { ...DARK_THEME };\n } else if (themeInput === 'cyberpunk') {\n this.currentTheme = { ...CYBERPUNK_THEME };\n } else if (themeInput === 'nord') {\n this.currentTheme = { ...NORD_THEME };\n } else if (themeInput === 'dracula') {\n this.currentTheme = { ...DRACULA_THEME };\n } else if (themeInput === 'tokyo-night') {\n this.currentTheme = { ...TOKYO_NIGHT_THEME };\n } else if (themeInput === 'matrix') {\n this.currentTheme = { ...MATRIX_THEME };\n } else if (themeInput === 'synthwave') {\n this.currentTheme = { ...SYNTHWAVE_THEME };\n } else if (typeof themeInput === 'object') {\n this.currentTheme = { ...this.currentTheme, ...themeInput };\n this.currentThemeName = 'custom';\n }\n this.applyToDOM(this.currentTheme);\n }\n\n public getCurrentThemeName(): string | undefined {\n return this.currentThemeName;\n }\n\n private applyToDOM(theme: RellyTheme): void {\n const el = this.panelElement;\n el.style.setProperty('--relly-bg', theme.bg);\n el.style.setProperty('--relly-fg', theme.fg);\n el.style.setProperty('--relly-header-bg', theme.headerBg);\n el.style.setProperty('--relly-header-fg', theme.headerFg);\n el.style.setProperty('--relly-accent', theme.accent);\n el.style.setProperty('--relly-accent-hover', theme.accentHover);\n el.style.setProperty('--relly-border', theme.border);\n el.style.setProperty('--relly-input-bg', theme.inputBg);\n el.style.setProperty('--relly-input-hover', theme.inputHover);\n el.style.setProperty('--relly-radius', theme.radius);\n el.style.setProperty('--relly-font', theme.font);\n el.style.setProperty('--relly-font-size', theme.fontSize);\n el.style.setProperty('--relly-row-height', theme.rowHeight);\n }\n\n public getTheme(): RellyTheme {\n return { ...this.currentTheme };\n }\n}\n","import { SoundEngine } from './SoundEngine';\n\nexport class Draggable {\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialLeft = 0;\n private initialTop = 0;\n private wasSnapped = false;\n\n public snapThreshold = 18;\n public magneticSnap = true;\n\n private onMouseDownBound: (e: MouseEvent) => void;\n private onMouseMoveBound: (e: MouseEvent) => void;\n private onMouseUpBound: (e: MouseEvent) => void;\n private onResizeBound: () => void;\n\n constructor(\n private handle: HTMLElement,\n private panel: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.onMouseDownBound = this.onMouseDown.bind(this);\n this.onMouseMoveBound = this.onMouseMove.bind(this);\n this.onMouseUpBound = this.onMouseUp.bind(this);\n this.onResizeBound = this.onResize.bind(this);\n\n this.handle.addEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n }\n }\n\n public clampToViewport(): void {\n if (typeof window === 'undefined') return;\n\n const rect = this.panel.getBoundingClientRect();\n const panelWidth = rect.width;\n const panelHeight = rect.height;\n const maxLeft = Math.max(0, window.innerWidth - panelWidth);\n const maxTop = Math.max(0, window.innerHeight - panelHeight);\n\n let newLeft = rect.left;\n let newTop = rect.top;\n\n if (newLeft > maxLeft) newLeft = maxLeft;\n if (newLeft < 0) newLeft = 0;\n if (newTop > maxTop) newTop = maxTop;\n if (newTop < 0) newTop = 0;\n\n this.panel.style.left = `${Math.round(newLeft)}px`;\n this.panel.style.top = `${Math.round(newTop)}px`;\n this.panel.style.right = 'auto';\n this.panel.style.bottom = 'auto';\n }\n\n private onResize(): void {\n this.clampToViewport();\n }\n\n private onMouseDown(e: MouseEvent): void {\n // Only drag with left mouse button, and ignore if clicking an action button inside the header\n if (e.button !== 0) return;\n if ((e.target as HTMLElement).closest('.relly-header-btn')) return;\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n\n const rect = this.panel.getBoundingClientRect();\n this.initialLeft = rect.left;\n this.initialTop = rect.top;\n\n // Remove right/bottom constraints to avoid layout conflicts when setting left/top\n this.panel.style.right = 'auto';\n this.panel.style.bottom = 'auto';\n this.panel.style.left = `${this.initialLeft}px`;\n this.panel.style.top = `${this.initialTop}px`;\n\n window.addEventListener('mousemove', this.onMouseMoveBound);\n window.addEventListener('mouseup', this.onMouseUpBound);\n e.preventDefault();\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) return;\n\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n\n let newLeft = this.initialLeft + dx;\n let newTop = this.initialTop + dy;\n\n // Viewport clamping & magnetic edge snapping\n const rect = this.panel.getBoundingClientRect();\n const panelWidth = rect.width;\n const panelHeight = rect.height;\n const maxLeft = Math.max(0, window.innerWidth - panelWidth);\n const maxTop = Math.max(0, window.innerHeight - panelHeight);\n\n let snapped = false;\n\n if (this.magneticSnap) {\n if (Math.abs(newLeft) < this.snapThreshold) {\n newLeft = 0;\n snapped = true;\n } else if (Math.abs(newLeft - maxLeft) < this.snapThreshold) {\n newLeft = maxLeft;\n snapped = true;\n }\n\n if (Math.abs(newTop) < this.snapThreshold) {\n newTop = 0;\n snapped = true;\n } else if (Math.abs(newTop - maxTop) < this.snapThreshold) {\n newTop = maxTop;\n snapped = true;\n }\n\n if (snapped && !this.wasSnapped) {\n this.soundEngine?.playSnap();\n }\n this.wasSnapped = snapped;\n }\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.panel.style.left = `${newLeft}px`;\n this.panel.style.top = `${newTop}px`;\n }\n\n private onMouseUp(): void {\n this.isDragging = false;\n this.wasSnapped = false;\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n }\n\n public destroy(): void {\n this.handle.removeEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n window.removeEventListener('resize', this.onResizeBound);\n }\n }\n}\n","export class Resizable {\n public handleEl: HTMLElement;\n private isResizing = false;\n private startX = 0;\n private startY = 0;\n private initialWidth = 0;\n private initialHeight = 0;\n\n private onMouseDownBound: (e: MouseEvent) => void;\n private onMouseMoveBound: (e: MouseEvent) => void;\n private onMouseUpBound: (e: MouseEvent) => void;\n private onResizeBound: () => void;\n\n constructor(\n private panel: HTMLElement,\n private minWidth: number = 240,\n private minHeight: number = 120\n ) {\n this.handleEl = document.createElement('div');\n this.handleEl.className = 'relly-resize-handle';\n this.handleEl.title = 'Drag to resize panel';\n this.handleEl.innerHTML = `\n <svg viewBox=\"0 0 10 10\">\n <line x1=\"8\" y1=\"2\" x2=\"2\" y2=\"8\"></line>\n <line x1=\"8\" y1=\"5\" x2=\"5\" y2=\"8\"></line>\n <line x1=\"8\" y1=\"8\" x2=\"8\" y2=\"8\"></line>\n </svg>\n `;\n\n this.panel.appendChild(this.handleEl);\n\n this.onMouseDownBound = this.onMouseDown.bind(this);\n this.onMouseMoveBound = this.onMouseMove.bind(this);\n this.onMouseUpBound = this.onMouseUp.bind(this);\n this.onResizeBound = this.onWindowResize.bind(this);\n\n this.handleEl.addEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n }\n }\n\n public clampToViewport(): void {\n if (typeof window === 'undefined') return;\n\n const rect = this.panel.getBoundingClientRect();\n const maxWidth = Math.max(this.minWidth, window.innerWidth - 16);\n const maxHeight = Math.max(this.minHeight, window.innerHeight - 16);\n\n let newWidth = rect.width;\n let newHeight = rect.height;\n\n if (newWidth > maxWidth) {\n newWidth = maxWidth;\n this.panel.style.width = `${Math.round(newWidth)}px`;\n }\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n this.panel.style.height = `${Math.round(newHeight)}px`;\n }\n }\n\n private onWindowResize(): void {\n this.clampToViewport();\n }\n\n private onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n this.isResizing = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n\n const rect = this.panel.getBoundingClientRect();\n this.initialWidth = rect.width;\n this.initialHeight = rect.height;\n\n window.addEventListener('mousemove', this.onMouseMoveBound);\n window.addEventListener('mouseup', this.onMouseUpBound);\n e.preventDefault();\n e.stopPropagation();\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isResizing) return;\n\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n\n const rect = this.panel.getBoundingClientRect();\n const maxAllowedWidth = Math.max(this.minWidth, window.innerWidth - rect.left - 8);\n const maxAllowedHeight = Math.max(this.minHeight, window.innerHeight - rect.top - 8);\n\n const newWidth = Math.max(this.minWidth, Math.min(maxAllowedWidth, this.initialWidth + dx));\n const newHeight = Math.max(\n this.minHeight,\n Math.min(maxAllowedHeight, this.initialHeight + dy)\n );\n\n this.panel.style.width = `${Math.round(newWidth)}px`;\n this.panel.style.height = `${Math.round(newHeight)}px`;\n\n // Make body take remaining height\n const bodyEl = this.panel.querySelector<HTMLElement>('.relly-body');\n if (bodyEl) {\n bodyEl.style.maxHeight = 'none';\n bodyEl.style.flex = '1';\n }\n }\n\n private onMouseUp(): void {\n this.isResizing = false;\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n }\n\n public destroy(): void {\n this.handleEl.removeEventListener('mousedown', this.onMouseDownBound);\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', this.onMouseMoveBound);\n window.removeEventListener('mouseup', this.onMouseUpBound);\n window.removeEventListener('resize', this.onResizeBound);\n }\n this.handleEl.remove();\n }\n}\n","export class HotkeyManager {\n private onKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private hotkey: string | null,\n private onToggle: () => void\n ) {\n this.onKeyDownBound = this.onKeyDown.bind(this);\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', this.onKeyDownBound);\n }\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (!this.hotkey) return;\n\n // Check composedPath for any input/textarea/select/contenteditable\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n for (const target of path) {\n if (target instanceof HTMLElement) {\n const tag = target.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n target.isContentEditable ||\n target.classList.contains('relly-search-input')\n ) {\n return;\n }\n }\n }\n\n // Also check document.activeElement and any shadowRoot activeElement\n let activeEl: Element | null = document.activeElement;\n while (activeEl && activeEl.shadowRoot && activeEl.shadowRoot.activeElement) {\n activeEl = activeEl.shadowRoot.activeElement;\n }\n\n if (\n activeEl &&\n (activeEl.tagName === 'INPUT' ||\n activeEl.tagName === 'TEXTAREA' ||\n activeEl.tagName === 'SELECT' ||\n (activeEl as HTMLElement).isContentEditable ||\n (activeEl as HTMLElement)?.classList?.contains('relly-search-input'))\n ) {\n return;\n }\n\n if (e.code === this.hotkey || e.key.toLowerCase() === this.hotkey.toLowerCase()) {\n e.preventDefault();\n this.onToggle();\n }\n }\n\n public setHotkey(hotkey: string | null): void {\n this.hotkey = hotkey;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.onKeyDownBound);\n }\n }\n}\n","import { SearchOptions } from '../types';\n\nexport class SearchBar {\n public element: HTMLElement;\n private inputEl: HTMLInputElement;\n private clearBtn: HTMLButtonElement;\n private ignoreCase: boolean;\n private onGlobalKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private bodyEl: HTMLElement,\n options: SearchOptions = {}\n ) {\n this.ignoreCase = options.ignoreCase !== false;\n\n this.element = document.createElement('div');\n this.element.className = 'relly-search-bar';\n\n this.inputEl = document.createElement('input');\n this.inputEl.type = 'text';\n this.inputEl.className = 'relly-search-input';\n this.inputEl.placeholder = options.placeholder || 'Filter settings... (Press \"/\" to focus)';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.className = 'relly-search-clear';\n this.clearBtn.textContent = '✕';\n this.clearBtn.title = 'Clear search';\n this.clearBtn.style.display = 'none';\n\n this.element.appendChild(this.inputEl);\n this.element.appendChild(this.clearBtn);\n\n this.inputEl.addEventListener('input', () => {\n this.filter(this.inputEl.value);\n });\n\n this.inputEl.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n this.clear();\n this.inputEl.blur();\n }\n });\n\n this.inputEl.addEventListener('keyup', (e) => {\n e.stopPropagation();\n });\n\n this.inputEl.addEventListener('keypress', (e) => {\n e.stopPropagation();\n });\n\n this.clearBtn.addEventListener('click', () => {\n this.clear();\n this.inputEl.focus();\n });\n\n this.onGlobalKeyDownBound = this.onGlobalKeyDown.bind(this);\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', this.onGlobalKeyDownBound);\n }\n }\n\n private onGlobalKeyDown(e: KeyboardEvent): void {\n if (e.key === '/') {\n const path = typeof e.composedPath === 'function' ? e.composedPath() : [];\n for (const target of path) {\n if (target instanceof HTMLElement) {\n const tag = target.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n target.isContentEditable ||\n target.classList.contains('relly-search-input')\n ) {\n return;\n }\n }\n }\n\n let activeEl: Element | null = document.activeElement;\n while (activeEl && activeEl.shadowRoot && activeEl.shadowRoot.activeElement) {\n activeEl = activeEl.shadowRoot.activeElement;\n }\n\n const isInput =\n activeEl instanceof HTMLInputElement ||\n activeEl instanceof HTMLTextAreaElement ||\n activeEl instanceof HTMLSelectElement ||\n (activeEl as HTMLElement)?.isContentEditable ||\n (activeEl as HTMLElement)?.classList?.contains('relly-search-input');\n\n if (!isInput) {\n e.preventDefault();\n this.focus();\n }\n }\n }\n\n public focus(): this {\n this.inputEl.focus();\n this.inputEl.select();\n return this;\n }\n\n public getInput(): HTMLInputElement {\n return this.inputEl;\n }\n\n public filter(query: string): void {\n const rawQuery = query.trim();\n if (!rawQuery) {\n this.clearBtn.style.display = 'none';\n this.resetFilter();\n return;\n }\n\n this.clearBtn.style.display = 'block';\n const normalizedQuery = this.ignoreCase ? rawQuery.toLowerCase() : rawQuery;\n\n // Search in rows\n const rows = this.bodyEl.querySelectorAll<HTMLElement>('.relly-row, .relly-graph-row');\n rows.forEach((row) => {\n const labelEl = row.querySelector('.relly-row-label, .relly-graph-header span');\n const text = labelEl?.textContent || '';\n const targetText = this.ignoreCase ? text.toLowerCase() : text;\n const matches = targetText.includes(normalizedQuery);\n\n if (matches) {\n row.classList.remove('relly-search-hidden');\n // If parent is a section, make sure section is visible and expanded\n const parentSection = row.closest<HTMLElement>('.relly-section');\n if (parentSection) {\n parentSection.classList.remove('relly-section--collapsed');\n parentSection.classList.remove('relly-search-hidden');\n }\n } else {\n row.classList.add('relly-search-hidden');\n }\n });\n\n // Check sections: if section title itself matches query, show all its rows\n const sections = this.bodyEl.querySelectorAll<HTMLElement>('.relly-section');\n sections.forEach((sec) => {\n const titleEl = sec.querySelector('.relly-section-title-wrap span:last-child');\n const secTitle = titleEl?.textContent || '';\n const targetSecTitle = this.ignoreCase ? secTitle.toLowerCase() : secTitle;\n\n if (targetSecTitle.includes(normalizedQuery)) {\n sec.classList.remove('relly-search-hidden');\n sec.classList.remove('relly-section--collapsed');\n sec.querySelectorAll<HTMLElement>('.relly-row, .relly-graph-row').forEach((r) => {\n r.classList.remove('relly-search-hidden');\n });\n } else {\n // If none of the section's rows match, hide the section\n const visibleRows = sec.querySelectorAll<HTMLElement>(\n '.relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)'\n );\n if (visibleRows.length === 0) {\n sec.classList.add('relly-search-hidden');\n }\n }\n });\n\n // Auto-switch tab if current active tab has no matches but another tab does\n const activeTabContent = this.bodyEl.querySelector<HTMLElement>('.relly-tab-content:not([style*=\"display: none\"])');\n const activeMatches = activeTabContent?.querySelectorAll<HTMLElement>(\n '.relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)'\n );\n\n if (!activeMatches || activeMatches.length === 0) {\n const allTabContents = Array.from(this.bodyEl.querySelectorAll<HTMLElement>('.relly-tab-content'));\n for (let i = 0; i < allTabContents.length; i++) {\n const matchesInTab = allTabContents[i].querySelectorAll<HTMLElement>(\n '.relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)'\n );\n if (matchesInTab.length > 0) {\n const tabBtns = this.bodyEl.parentElement?.querySelectorAll<HTMLButtonElement>('.relly-tab-btn');\n if (tabBtns && tabBtns[i]) {\n tabBtns[i].click();\n break;\n }\n }\n }\n }\n }\n\n public clear(): void {\n this.inputEl.value = '';\n this.clearBtn.style.display = 'none';\n this.resetFilter();\n }\n\n private resetFilter(): void {\n const hiddenEls = this.bodyEl.querySelectorAll<HTMLElement>('.relly-search-hidden');\n hiddenEls.forEach((el) => {\n el.classList.remove('relly-search-hidden');\n });\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.onGlobalKeyDownBound);\n }\n this.element.remove();\n }\n}\n","import { SoundPack } from '../types';\n\nexport class SoundEngine {\n private ctx: AudioContext | null = null;\n private enabled: boolean = true;\n private volume: number = 1.0;\n private soundPack: SoundPack = 'synth';\n\n constructor(enabled: boolean = true, soundPack: SoundPack = 'synth') {\n this.enabled = enabled;\n this.soundPack = soundPack;\n }\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n public setVolume(vol: number): void {\n this.volume = Math.max(0, Math.min(1, vol));\n }\n\n public getVolume(): number {\n return this.volume;\n }\n\n public setSoundPack(pack: SoundPack): this {\n this.soundPack = pack;\n return this;\n }\n\n public getSoundPack(): SoundPack {\n return this.soundPack;\n }\n\n private initCtx(): AudioContext | null {\n if (!this.enabled || this.volume <= 0 || typeof window === 'undefined') return null;\n if (!this.ctx) {\n const AudioCtx = window.AudioContext || (window as any).webkitAudioContext;\n if (AudioCtx) {\n this.ctx = new AudioCtx();\n }\n }\n if (this.ctx && this.ctx.state === 'suspended') {\n this.ctx.resume().catch(() => {});\n }\n return this.ctx;\n }\n\n public playClick(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(2400, now);\n osc.frequency.exponentialRampToValueAtTime(450, now + 0.012);\n gain.gain.setValueAtTime(0.06 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.012);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.013);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(320, now);\n osc.frequency.exponentialRampToValueAtTime(1250, now + 0.022);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.022);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.024);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(987.77, now);\n osc.frequency.setValueAtTime(1318.51, now + 0.01);\n gain.gain.setValueAtTime(0.028 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.022);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(800, now);\n osc.frequency.exponentialRampToValueAtTime(350, now + 0.015);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.015);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.016);\n }\n } catch {\n // Audio context error or blocked\n }\n }\n\n public playToggle(state: boolean): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n const startFreq = state ? 2800 : 1800;\n const endFreq = state ? 900 : 400;\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.018);\n gain.gain.setValueAtTime(0.055 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n const startFreq = state ? 380 : 900;\n const endFreq = state ? 1100 : 280;\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.028);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.028);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.03);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n const f1 = state ? 523.25 : 659.25;\n const f2 = state ? 783.99 : 392.0;\n osc.frequency.setValueAtTime(f1, now);\n osc.frequency.setValueAtTime(f2, now + 0.015);\n gain.gain.setValueAtTime(0.025 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.03);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.032);\n } else {\n osc.type = 'triangle';\n const freq = state ? 650 : 450;\n osc.frequency.setValueAtTime(freq, now);\n osc.frequency.exponentialRampToValueAtTime(freq * 1.1, now + 0.025);\n gain.gain.setValueAtTime(0.035 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.026);\n }\n } catch {\n // Ignore\n }\n }\n\n public playNotify(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n if (this.soundPack === 'arcade') {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = 'square';\n osc.frequency.setValueAtTime(523.25, now);\n osc.frequency.setValueAtTime(659.25, now + 0.04);\n osc.frequency.setValueAtTime(783.99, now + 0.08);\n osc.frequency.setValueAtTime(1046.50, now + 0.12);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.18);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.19);\n } else if (this.soundPack === 'bubble') {\n const osc1 = ctx.createOscillator();\n const gain1 = ctx.createGain();\n osc1.type = 'sine';\n osc1.frequency.setValueAtTime(400, now);\n osc1.frequency.exponentialRampToValueAtTime(950, now + 0.05);\n gain1.gain.setValueAtTime(0.04 * this.volume, now);\n gain1.gain.exponentialRampToValueAtTime(0.0001, now + 0.05);\n osc1.connect(gain1);\n gain1.connect(ctx.destination);\n osc1.start(now);\n osc1.stop(now + 0.06);\n\n const osc2 = ctx.createOscillator();\n const gain2 = ctx.createGain();\n osc2.type = 'sine';\n osc2.frequency.setValueAtTime(550, now + 0.05);\n osc2.frequency.exponentialRampToValueAtTime(1400, now + 0.11);\n gain2.gain.setValueAtTime(0.04 * this.volume, now + 0.05);\n gain2.gain.exponentialRampToValueAtTime(0.0001, now + 0.11);\n osc2.connect(gain2);\n gain2.connect(ctx.destination);\n osc2.start(now + 0.05);\n osc2.stop(now + 0.12);\n } else {\n const osc1 = ctx.createOscillator();\n const gain1 = ctx.createGain();\n osc1.type = this.soundPack === 'mechanical' ? 'triangle' : 'sine';\n osc1.frequency.setValueAtTime(523.25, now);\n gain1.gain.setValueAtTime(0.04 * this.volume, now);\n gain1.gain.exponentialRampToValueAtTime(0.0001, now + 0.06);\n osc1.connect(gain1);\n gain1.connect(ctx.destination);\n osc1.start(now);\n osc1.stop(now + 0.07);\n\n const osc2 = ctx.createOscillator();\n const gain2 = ctx.createGain();\n osc2.type = this.soundPack === 'mechanical' ? 'triangle' : 'sine';\n osc2.frequency.setValueAtTime(783.99, now + 0.05);\n gain2.gain.setValueAtTime(0.04 * this.volume, now + 0.05);\n gain2.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n osc2.connect(gain2);\n gain2.connect(ctx.destination);\n osc2.start(now + 0.05);\n osc2.stop(now + 0.13);\n }\n } catch {\n // Ignore\n }\n }\n\n public playSnap(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(450, now);\n osc.frequency.exponentialRampToValueAtTime(120, now + 0.025);\n gain.gain.setValueAtTime(0.06 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(260, now);\n osc.frequency.exponentialRampToValueAtTime(650, now + 0.035);\n gain.gain.setValueAtTime(0.05 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.035);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(220, now);\n osc.frequency.setValueAtTime(110, now + 0.015);\n gain.gain.setValueAtTime(0.035 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.035);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(260, now);\n osc.frequency.exponentialRampToValueAtTime(80, now + 0.03);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.03);\n }\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.038);\n } catch {\n // Ignore\n }\n }\n\n public playMiniHud(isEntering: boolean = true): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n osc.type = this.soundPack === 'arcade' ? 'square' : 'sine';\n const startFreq = isEntering ? 380 : 640;\n const endFreq = isEntering ? 680 : 340;\n\n osc.frequency.setValueAtTime(startFreq, now);\n osc.frequency.exponentialRampToValueAtTime(endFreq, now + 0.05);\n\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.05);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now);\n osc.stop(now + 0.055);\n } catch {\n // Ignore\n }\n }\n\n public playTick(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(3200, now);\n osc.frequency.exponentialRampToValueAtTime(800, now + 0.006);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(850, now);\n osc.frequency.exponentialRampToValueAtTime(1350, now + 0.01);\n gain.gain.setValueAtTime(0.02 * this.volume, now);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(1174.66, now);\n gain.gain.setValueAtTime(0.018 * this.volume, now);\n } else {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(1800, now);\n osc.frequency.exponentialRampToValueAtTime(800, now + 0.008);\n gain.gain.setValueAtTime(0.015 * this.volume, now);\n }\n\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.009);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.01);\n } catch {\n // Ignore\n }\n }\n\n public playTab(): void {\n const ctx = this.initCtx();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n if (this.soundPack === 'mechanical') {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(1900, now);\n osc.frequency.exponentialRampToValueAtTime(600, now + 0.014);\n gain.gain.setValueAtTime(0.045 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.014);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.016);\n } else if (this.soundPack === 'bubble') {\n osc.type = 'sine';\n osc.frequency.setValueAtTime(450, now);\n osc.frequency.exponentialRampToValueAtTime(1100, now + 0.02);\n gain.gain.setValueAtTime(0.04 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.022);\n } else if (this.soundPack === 'arcade') {\n osc.type = 'square';\n osc.frequency.setValueAtTime(659.25, now);\n gain.gain.setValueAtTime(0.025 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n } else {\n osc.type = 'triangle';\n osc.frequency.setValueAtTime(700, now);\n osc.frequency.exponentialRampToValueAtTime(500, now + 0.018);\n gain.gain.setValueAtTime(0.03 * this.volume, now);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.018);\n osc.connect(gain);\n gain.connect(ctx.destination);\n osc.start(now);\n osc.stop(now + 0.02);\n }\n } catch {\n // Ignore\n }\n }\n}\n","export class ImportModal {\n public element: HTMLElement;\n private textareaEl: HTMLTextAreaElement;\n private errorEl: HTMLElement;\n private dropzoneEl: HTMLElement;\n private fileInput: HTMLInputElement;\n\n constructor(\n private parentEl: HTMLElement,\n private onApply: (data: Record<string, any>) => void\n ) {\n this.element = document.createElement('div');\n this.element.className = 'relly-modal-backdrop';\n\n const modal = document.createElement('div');\n modal.className = 'relly-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'relly-modal-header';\n\n const title = document.createElement('span');\n title.className = 'relly-modal-title';\n title.textContent = 'Import JSON Config';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'relly-header-btn';\n closeBtn.textContent = '✕';\n closeBtn.addEventListener('click', () => this.hide());\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n modal.appendChild(header);\n\n // Dropzone\n this.dropzoneEl = document.createElement('div');\n this.dropzoneEl.className = 'relly-dropzone';\n this.dropzoneEl.innerHTML = `\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"17 8 12 3 7 8\"></polyline>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n </svg>\n <span>Drag & drop a <strong>.json</strong> file here, or click to browse</span>\n `;\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.accept = '.json,application/json';\n this.fileInput.style.display = 'none';\n\n this.dropzoneEl.addEventListener('click', () => this.fileInput.click());\n this.fileInput.addEventListener('change', (e) => this.handleFileSelect(e));\n\n // Drag & Drop events\n this.dropzoneEl.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzoneEl.classList.add('relly-dropzone-drag');\n });\n this.dropzoneEl.addEventListener('dragleave', () => {\n this.dropzoneEl.classList.remove('relly-dropzone-drag');\n });\n this.dropzoneEl.addEventListener('drop', (e) => {\n e.preventDefault();\n this.dropzoneEl.classList.remove('relly-dropzone-drag');\n if (e.dataTransfer && e.dataTransfer.files.length > 0) {\n this.readFile(e.dataTransfer.files[0]);\n }\n });\n\n modal.appendChild(this.dropzoneEl);\n modal.appendChild(this.fileInput);\n\n // Textarea\n this.textareaEl = document.createElement('textarea');\n this.textareaEl.className = 'relly-import-textarea';\n this.textareaEl.placeholder = 'Paste JSON configuration here...';\n modal.appendChild(this.textareaEl);\n\n // Error message\n this.errorEl = document.createElement('div');\n this.errorEl.className = 'relly-import-error';\n modal.appendChild(this.errorEl);\n\n // Actions\n const actions = document.createElement('div');\n actions.className = 'relly-modal-actions';\n\n const cancelBtn = document.createElement('button');\n cancelBtn.className = 'relly-btn';\n cancelBtn.textContent = 'Cancel';\n cancelBtn.style.flex = '1';\n cancelBtn.addEventListener('click', () => this.hide());\n\n const applyBtn = document.createElement('button');\n applyBtn.className = 'relly-btn relly-btn-primary';\n applyBtn.textContent = 'Apply & Load';\n applyBtn.style.flex = '2';\n applyBtn.addEventListener('click', () => this.apply());\n\n actions.appendChild(cancelBtn);\n actions.appendChild(applyBtn);\n modal.appendChild(actions);\n\n this.element.appendChild(modal);\n\n // Close on clicking backdrop\n this.element.addEventListener('click', (e) => {\n if (e.target === this.element) {\n this.hide();\n }\n });\n\n this.parentEl.appendChild(this.element);\n }\n\n private handleFileSelect(e: Event): void {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n this.readFile(target.files[0]);\n }\n }\n\n private readFile(file: File): void {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n this.textareaEl.value = reader.result;\n this.errorEl.textContent = '';\n }\n };\n reader.readAsText(file);\n }\n\n public show(): void {\n this.errorEl.textContent = '';\n this.element.classList.add('relly-modal-show');\n this.textareaEl.focus();\n }\n\n public hide(): void {\n this.element.classList.remove('relly-modal-show');\n }\n\n private apply(): void {\n const raw = this.textareaEl.value.trim();\n if (!raw) {\n this.errorEl.textContent = 'Please paste JSON or drop a file.';\n return;\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('JSON root must be an object.');\n }\n this.onApply(parsed);\n this.hide();\n this.textareaEl.value = '';\n this.errorEl.textContent = '';\n } catch (err: any) {\n this.errorEl.textContent = `Invalid JSON: ${err.message || 'Syntax error'}`;\n }\n }\n\n public destroy(): void {\n this.element.remove();\n }\n}\n","import { ContainerHelper } from './ComponentContainer';\nimport { SchemaDefinition, SchemaControl } from '../types';\n\nexport class SchemaLoader {\n public static load(container: ContainerHelper, schema: SchemaDefinition): void {\n const defaultTarget = schema.target;\n\n const loadControls = (targetContainer: ContainerHelper, controls: SchemaControl[]) => {\n for (const ctrl of controls) {\n const subControls = ctrl.children || (ctrl as any).controls;\n\n if (ctrl.type === 'section') {\n const section = (targetContainer as any).addSection(\n ctrl.label || 'Section',\n ctrl.collapsed\n );\n if (ctrl.showIf && section.showIf) {\n section.showIf(ctrl.showIf);\n }\n if (subControls && Array.isArray(subControls)) {\n loadControls(section, subControls);\n }\n } else if (ctrl.type === 'row') {\n const row = (targetContainer as any).addRow();\n if (subControls && Array.isArray(subControls)) {\n loadControls(row, subControls);\n }\n } else {\n const opts = {\n ...ctrl,\n object: ctrl.object !== undefined ? ctrl.object : defaultTarget\n };\n targetContainer.createComponent(opts);\n }\n }\n };\n\n if (schema.controls && Array.isArray(schema.controls)) {\n loadControls(container, schema.controls);\n }\n }\n}\n","import { ToastType } from '../types';\nimport { SoundEngine } from './SoundEngine';\n\nexport class ToastManager {\n private containerEl: HTMLElement;\n\n constructor(\n private parentEl: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.containerEl = document.createElement('div');\n this.containerEl.className = 'relly-toast-container';\n this.parentEl.appendChild(this.containerEl);\n }\n\n public notify(\n message: string,\n type: ToastType = 'info',\n duration: number = 2600\n ): HTMLElement {\n this.soundEngine?.playNotify();\n\n const toast = document.createElement('div');\n toast.className = `relly-toast relly-toast--${type}`;\n\n const iconEl = document.createElement('span');\n iconEl.className = 'relly-toast-icon';\n iconEl.innerHTML = this.getIconSvg(type);\n\n const msgEl = document.createElement('span');\n msgEl.className = 'relly-toast-msg';\n msgEl.textContent = message;\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'relly-toast-close';\n closeBtn.innerHTML = '✕';\n closeBtn.title = 'Dismiss';\n\n toast.appendChild(iconEl);\n toast.appendChild(msgEl);\n toast.appendChild(closeBtn);\n\n const dismiss = () => {\n if (toast.classList.contains('relly-toast-leave')) return;\n toast.classList.add('relly-toast-leave');\n setTimeout(() => {\n if (toast.parentElement) {\n toast.parentElement.removeChild(toast);\n }\n }, 200);\n };\n\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n dismiss();\n });\n\n toast.addEventListener('click', dismiss);\n\n this.containerEl.appendChild(toast);\n\n // Trigger enter animation\n requestAnimationFrame(() => {\n toast.classList.add('relly-toast-enter');\n });\n\n if (duration > 0) {\n setTimeout(dismiss, duration);\n }\n\n return toast;\n }\n\n private getIconSvg(type: ToastType): string {\n switch (type) {\n case 'success':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n case 'warning':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line></svg>`;\n case 'error':\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line></svg>`;\n case 'info':\n default:\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>`;\n }\n }\n\n public destroy(): void {\n if (this.containerEl.parentElement) {\n this.containerEl.parentElement.removeChild(this.containerEl);\n }\n }\n}\n","import { ContextMenuItem } from '../types';\nimport { BaseComponent } from './BaseComponent';\nimport { SoundEngine } from './SoundEngine';\n\nexport class ContextMenuManager {\n private menuEl: HTMLElement;\n private currentComponent?: BaseComponent;\n private onDocClickBound: (e: MouseEvent) => void;\n private onKeyDownBound: (e: KeyboardEvent) => void;\n\n constructor(\n private panelEl: HTMLElement,\n private soundEngine?: SoundEngine\n ) {\n this.menuEl = document.createElement('div');\n this.menuEl.className = 'relly-context-menu';\n this.menuEl.style.display = 'none';\n this.panelEl.appendChild(this.menuEl);\n\n this.onDocClickBound = (e: MouseEvent) => {\n if (!this.menuEl.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n this.onKeyDownBound = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hide();\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('click', this.onDocClickBound);\n window.addEventListener('keydown', this.onKeyDownBound);\n }\n\n this.panelEl.addEventListener('contextmenu', this.onContextMenu);\n }\n\n private onContextMenu = (e: MouseEvent): void => {\n // Find closest component element\n let target = e.target as HTMLElement | null;\n let componentEl = target?.closest('.relly-row, .relly-graph-row') as HTMLElement | null;\n if (!componentEl) return;\n\n const component = (componentEl as any).__rellyComponent as BaseComponent | undefined;\n const items = component?.getContextMenu();\n\n if (!items || items.length === 0) {\n return; // UI creator has not configured context menu for this control\n }\n\n e.preventDefault();\n e.stopPropagation();\n this.currentComponent = component;\n this.show(items, e.clientX, e.clientY);\n };\n\n public show(items: ContextMenuItem[], clientX: number, clientY: number): void {\n this.menuEl.innerHTML = '';\n\n for (const item of items) {\n if (item.separator) {\n const sep = document.createElement('div');\n sep.className = 'relly-context-separator';\n this.menuEl.appendChild(sep);\n continue;\n }\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'relly-context-item';\n if (item.danger) btn.classList.add('relly-context-item--danger');\n if (item.disabled) btn.disabled = true;\n\n let iconHtml = '';\n if (item.icon) {\n iconHtml = `<span class=\"relly-context-icon\">${item.icon}</span>`;\n }\n\n btn.innerHTML = `${iconHtml}<span class=\"relly-context-label\">${item.label}</span>`;\n\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine?.playClick();\n const comp = this.currentComponent;\n this.hide();\n item.action(comp);\n });\n\n this.menuEl.appendChild(btn);\n }\n\n this.menuEl.style.display = 'flex';\n\n // Position relative to panel\n const panelRect = this.panelEl.getBoundingClientRect();\n let left = clientX - panelRect.left;\n let top = clientY - panelRect.top;\n\n const menuWidth = 160;\n const menuHeight = this.menuEl.offsetHeight || 120;\n\n if (left + menuWidth > panelRect.width) {\n left = Math.max(4, panelRect.width - menuWidth - 4);\n }\n if (top + menuHeight > panelRect.height) {\n top = Math.max(4, panelRect.height - menuHeight - 4);\n }\n\n this.menuEl.style.left = `${left}px`;\n this.menuEl.style.top = `${top}px`;\n }\n\n public hide(): void {\n this.menuEl.style.display = 'none';\n this.currentComponent = undefined;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('click', this.onDocClickBound);\n window.removeEventListener('keydown', this.onKeyDownBound);\n }\n this.panelEl.removeEventListener('contextmenu', this.onContextMenu);\n if (this.menuEl.parentElement) {\n this.menuEl.parentElement.removeChild(this.menuEl);\n }\n }\n}\n","import { ContainerHelper } from '../../core/ComponentContainer';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class Tab extends ContainerHelper {\n public contentEl: HTMLElement;\n public buttonEl: HTMLButtonElement;\n\n constructor(\n private label: string,\n bindingEngine: BindingEngine,\n presetManager: PresetManager,\n soundEngine?: SoundEngine\n ) {\n const content = document.createElement('div');\n content.className = 'relly-tab-content';\n super(content, bindingEngine, presetManager, soundEngine);\n\n this.contentEl = content;\n\n this.buttonEl = document.createElement('button');\n this.buttonEl.className = 'relly-tab-btn';\n this.buttonEl.textContent = label;\n }\n\n public getLabel(): string {\n return this.label;\n }\n\n public setActive(active: boolean): void {\n if (active) {\n this.buttonEl.classList.add('relly-tab-active');\n this.contentEl.classList.add('relly-tab-content--active');\n } else {\n this.buttonEl.classList.remove('relly-tab-active');\n this.contentEl.classList.remove('relly-tab-content--active');\n }\n }\n\n public destroy(): void {\n this.destroyChildren();\n this.buttonEl.remove();\n this.contentEl.remove();\n }\n}\n","import { Tab } from './Tab';\nimport { BindingEngine } from '../../core/BindingEngine';\nimport { PresetManager } from '../../core/PresetManager';\nimport { SoundEngine } from '../../core/SoundEngine';\n\nexport class TabsManager {\n public barEl: HTMLElement;\n public bodyEl: HTMLElement;\n private tabs: Tab[] = [];\n private activeTab: Tab | null = null;\n\n constructor(\n parentHeader: HTMLElement,\n parentBody: HTMLElement,\n private bindingEngine: BindingEngine,\n private presetManager: PresetManager,\n private soundEngine?: SoundEngine\n ) {\n this.barEl = document.createElement('div');\n this.barEl.className = 'relly-tabs-bar';\n this.barEl.style.display = 'none'; // Hidden until first tab is added\n\n this.bodyEl = parentBody;\n parentHeader.insertAdjacentElement('afterend', this.barEl);\n }\n\n public addTab(label: string): Tab {\n this.barEl.style.display = 'flex';\n\n const tab = new Tab(label, this.bindingEngine, this.presetManager, this.soundEngine);\n this.tabs.push(tab);\n\n this.barEl.appendChild(tab.buttonEl);\n this.bodyEl.appendChild(tab.contentEl);\n\n tab.buttonEl.addEventListener('click', () => {\n this.switchTab(tab);\n });\n\n // If first tab, make it active\n if (this.tabs.length === 1) {\n this.switchTab(tab, false);\n }\n\n return tab;\n }\n\n public switchTab(tab: Tab, playSound: boolean = true): void {\n if (this.activeTab !== tab && playSound) {\n this.soundEngine?.playTab();\n }\n this.activeTab = tab;\n for (const t of this.tabs) {\n t.setActive(t === tab);\n }\n }\n\n public getActiveTab(): Tab | null {\n return this.activeTab;\n }\n\n public getTabs(): Tab[] {\n return this.tabs;\n }\n\n public destroy(): void {\n for (const tab of this.tabs) {\n tab.destroy();\n }\n this.tabs = [];\n this.barEl.remove();\n }\n}\n","import cssContent from './index.css?inline';\n\nconst STYLE_ID = 'relly-ui-stylesheet';\n\nexport function injectStyles(targetRoot?: Document | ShadowRoot): void {\n const root = targetRoot || (typeof document !== 'undefined' ? document : null);\n if (!root) return;\n\n // Check if style already exists in this root\n if ('getElementById' in root && root.getElementById(STYLE_ID)) return;\n if ('querySelector' in root && root.querySelector(`#${STYLE_ID}`)) return;\n\n const styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n styleEl.textContent = cssContent;\n\n if ('head' in root && root.head) {\n root.head.appendChild(styleEl);\n } else {\n root.appendChild(styleEl);\n }\n}\n","import { ContainerHelper } from './core/ComponentContainer';\nimport { BindingEngine } from './core/BindingEngine';\nimport { PresetManager } from './core/PresetManager';\nimport { ThemeManager } from './core/ThemeManager';\nimport { Draggable } from './core/Draggable';\nimport { Resizable } from './core/Resizable';\nimport { HotkeyManager } from './core/HotkeyManager';\nimport { SearchBar } from './core/SearchBar';\nimport { SoundEngine } from './core/SoundEngine';\nimport { ImportModal } from './core/ImportModal';\nimport { SchemaLoader } from './core/SchemaLoader';\nimport { ToastManager } from './core/ToastManager';\nimport { ContextMenuManager } from './core/ContextMenuManager';\nimport { Tab } from './components/Tabs/Tab';\nimport { TabsManager } from './components/Tabs/TabsManager';\nimport { RellyUIOptions, ThemeInput, SchemaDefinition, SoundPack, ToastType } from './types';\nimport { injectStyles } from './styles/injector';\n\nexport class RellyUI extends ContainerHelper {\n public static version: string = '1.0.2';\n\n private hostEl?: HTMLElement;\n private shadowRoot: ShadowRoot | null = null;\n private panelEl: HTMLElement;\n private headerEl: HTMLElement;\n private titleEl: HTMLElement;\n private collapseBtn: HTMLButtonElement;\n private copyToastEl: HTMLElement;\n\n private themeManager: ThemeManager;\n protected override soundEngine: SoundEngine;\n private draggableInstance?: Draggable;\n private resizableInstance?: Resizable;\n private hotkeyInstance?: HotkeyManager;\n private searchBarInstance?: SearchBar;\n private tabsManagerInstance?: TabsManager;\n private importModalInstance?: ImportModal;\n private toastManager: ToastManager;\n private contextMenuManager: ContextMenuManager;\n\n private isPanelCollapsed: boolean = false;\n private isPanelHidden: boolean = false;\n private isMiniHud: boolean = false;\n private ghostOnIdle: boolean = false;\n private idleOpacity: number = 0.38;\n private onResizeBound: () => void;\n\n private autoSave: boolean = false;\n private autoSaveKey: string = 'relly-ui-session';\n private autoSaveTimeout: any = null;\n\n private sparklineCtx?: CanvasRenderingContext2D | null;\n private sparklineData: number[] = [16, 17, 18, 17, 19, 20, 21, 20, 22, 23, 22, 24, 25, 24, 25, 26];\n private sparklineAnimId?: number;\n private lastSparklineTime: number = 0;\n private sparklineInterval: number = 180; // Calm, readable telemetry rate (~5.5 samples per sec)\n\n constructor(options: RellyUIOptions = {}) {\n const useShadow = options.shadowDOM !== false;\n const bindingEngine = new BindingEngine();\n const presetManager = new PresetManager();\n\n // Sound engine\n const soundEngine = new SoundEngine(options.sound !== false, options.soundPack || 'synth');\n\n // Create Panel Element\n const panel = document.createElement('div');\n panel.className = 'relly-panel';\n\n const width = options.width ?? 280;\n panel.style.width = typeof width === 'number' ? `${width}px` : width;\n\n if (options.height) {\n const height = options.height;\n panel.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n\n // Header Element\n const header = document.createElement('div');\n header.className = 'relly-header';\n\n const titleWrap = document.createElement('div');\n titleWrap.className = 'relly-header-title';\n titleWrap.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line>\n <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line>\n </svg>\n `;\n\n const title = document.createElement('span');\n title.textContent = options.title || 'RellyUI';\n titleWrap.appendChild(title);\n\n const actions = document.createElement('div');\n actions.className = 'relly-header-actions';\n\n // Copy JSON button\n const copyBtn = document.createElement('button');\n copyBtn.className = 'relly-header-btn';\n copyBtn.title = 'Copy settings as JSON';\n copyBtn.innerHTML = `\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n `;\n actions.appendChild(copyBtn);\n\n // Import JSON button\n const importBtn = document.createElement('button');\n importBtn.className = 'relly-header-btn';\n importBtn.title = 'Import settings from JSON';\n importBtn.innerHTML = `\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n `;\n actions.appendChild(importBtn);\n\n // Mini-HUD button\n const miniHudBtn = document.createElement('button');\n miniHudBtn.className = 'relly-header-btn relly-minihud-btn';\n miniHudBtn.title = 'Toggle Mini-HUD pill (or double-click header)';\n miniHudBtn.textContent = '⤢';\n actions.appendChild(miniHudBtn);\n\n // Collapse button\n const collapseBtn = document.createElement('button');\n collapseBtn.className = 'relly-header-btn';\n collapseBtn.title = 'Collapse/Expand';\n collapseBtn.textContent = '_';\n actions.appendChild(collapseBtn);\n\n header.appendChild(titleWrap);\n header.appendChild(actions);\n panel.appendChild(header);\n\n // Copy Toast Notification\n const copyToast = document.createElement('div');\n copyToast.className = 'relly-copy-toast';\n copyToast.textContent = 'JSON Copied!';\n panel.appendChild(copyToast);\n\n // Body container for rows and sections\n const body = document.createElement('div');\n body.className = 'relly-body';\n if (options.height) {\n body.style.maxHeight = 'none';\n body.style.flex = '1';\n }\n panel.appendChild(body);\n\n super(body, bindingEngine, presetManager, soundEngine);\n\n this.panelEl = panel;\n this.headerEl = header;\n this.titleEl = title;\n this.collapseBtn = collapseBtn;\n this.copyToastEl = copyToast;\n this.soundEngine = soundEngine;\n this.onResizeBound = () => this.clampToViewport();\n\n // Search Bar\n if (options.searchBar) {\n this.searchBarInstance = new SearchBar(body, options.searchOptions);\n header.insertAdjacentElement('afterend', this.searchBarInstance.element);\n }\n\n // Initialize Theme\n this.themeManager = new ThemeManager(this.panelEl, options.theme);\n\n // Mount to DOM (Shadow DOM or direct)\n this.mount(options, useShadow);\n\n // Auto-inject styles\n if (options.autoInjectStyles !== false) {\n if (this.shadowRoot) {\n injectStyles(this.shadowRoot);\n } else {\n injectStyles();\n }\n }\n\n // Draggable\n if (options.draggable !== false) {\n this.draggableInstance = new Draggable(this.headerEl, this.panelEl, this.soundEngine);\n }\n\n // Resizable\n if (options.resizable !== false) {\n this.resizableInstance = new Resizable(this.panelEl);\n }\n\n // Toast & Context Menu Managers\n this.toastManager = new ToastManager(this.panelEl, this.soundEngine);\n this.contextMenuManager = new ContextMenuManager(this.panelEl, this.soundEngine);\n\n // Import Modal\n this.importModalInstance = new ImportModal(this.panelEl, (data) => {\n this.importJSON(data);\n });\n\n // Hotkey toggle\n const hotkey = options.hotkey === undefined ? 'KeyH' : options.hotkey;\n if (hotkey) {\n this.hotkeyInstance = new HotkeyManager(hotkey, () => {\n this.toggle();\n });\n }\n\n // Mini-HUD toggle button\n miniHudBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleMiniHud();\n });\n\n // Double-click header to toggle Mini-HUD\n this.headerEl.addEventListener('dblclick', (e) => {\n if ((e.target as HTMLElement).closest('.relly-header-btn')) return;\n this.toggleMiniHud();\n });\n\n // Collapse toggle button\n this.collapseBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.toggleCollapse();\n });\n\n // Copy button\n copyBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.copyJSON();\n });\n\n // Import button\n importBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.soundEngine.playClick();\n this.importModalInstance?.show();\n });\n\n if (options.soundVolume !== undefined) {\n this.soundEngine.setVolume(options.soundVolume);\n }\n\n if (options.accordion) {\n this.setAccordion(true);\n }\n\n if (options.ghostOnIdle) {\n this.setGhostMode(true, options.idleOpacity);\n }\n\n this.initSparkline(titleWrap);\n\n // Ghost mode hover listeners\n this.panelEl.addEventListener('mouseenter', () => {\n if (this.ghostOnIdle) {\n this.panelEl.style.opacity = '1';\n }\n });\n\n this.panelEl.addEventListener('mouseleave', () => {\n if (this.ghostOnIdle) {\n this.panelEl.style.opacity = `${this.idleOpacity}`;\n }\n });\n\n if (options.collapsed) {\n this.setCollapsed(true);\n }\n\n // Auto-Save setup\n this.autoSave = options.autoSave ?? false;\n this.autoSaveKey = options.autoSaveKey ?? 'relly-ui-session';\n\n this.presetManager.setOnChange(() => {\n if (this.autoSave) {\n this.queueAutoSave();\n }\n });\n\n this.panelEl.addEventListener('mouseup', () => {\n if (this.autoSave) {\n this.queueAutoSave();\n }\n });\n\n if (this.autoSave) {\n this.loadSession();\n }\n }\n\n private mount(options: RellyUIOptions, useShadow: boolean): void {\n if (typeof document === 'undefined') return;\n\n const pos = options.position || {};\n this.panelEl.style.top = pos.top !== undefined ? `${pos.top}px` : '20px';\n if (pos.left !== undefined) {\n this.panelEl.style.left = `${pos.left}px`;\n } else {\n this.panelEl.style.right = pos.right !== undefined ? `${pos.right}px` : '20px';\n }\n if (pos.bottom !== undefined) {\n this.panelEl.style.bottom = `${pos.bottom}px`;\n }\n\n const container = options.container\n ? typeof options.container === 'string'\n ? document.querySelector<HTMLElement>(options.container)\n : options.container\n : document.body;\n\n if (!container) return;\n\n if (useShadow && typeof container.attachShadow === 'function') {\n const host = document.createElement('div');\n host.className = 'relly-host';\n this.hostEl = host;\n this.shadowRoot = host.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(this.panelEl);\n container.appendChild(host);\n } else {\n container.appendChild(this.panelEl);\n if (options.container) {\n this.panelEl.style.position = 'relative';\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onResizeBound);\n setTimeout(() => {\n this.clampToViewport();\n }, 0);\n }\n }\n\n public addTab(label: string): Tab {\n if (!this.tabsManagerInstance) {\n this.tabsManagerInstance = new TabsManager(\n this.headerEl,\n this.contentEl,\n this.bindingEngine,\n this.presetManager,\n this.soundEngine\n );\n }\n return this.tabsManagerInstance.addTab(label);\n }\n\n public createTab(label: string): Tab {\n return this.addTab(label);\n }\n\n public copyJSON(): string {\n const data = this.export();\n const jsonStr = JSON.stringify(data, null, 2);\n\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(jsonStr).catch(() => {});\n }\n\n // Flash toast notification\n this.copyToastEl.textContent = 'JSON Copied!';\n this.copyToastEl.classList.add('relly-toast-show');\n this.soundEngine.playNotify();\n setTimeout(() => {\n this.copyToastEl.classList.remove('relly-toast-show');\n }, 1500);\n\n return jsonStr;\n }\n\n public notify(message: string, type: ToastType = 'info', duration: number = 2600): HTMLElement {\n return this.toastManager.notify(message, type, duration);\n }\n\n public getToastManager(): ToastManager {\n return this.toastManager;\n }\n\n public getContextMenuManager(): ContextMenuManager {\n return this.contextMenuManager;\n }\n\n public importJSON(json: string | Record<string, any>): this {\n try {\n const data = typeof json === 'string' ? JSON.parse(json) : json;\n this.import(data);\n this.copyToastEl.textContent = 'JSON Loaded!';\n this.copyToastEl.classList.add('relly-toast-show');\n this.soundEngine.playNotify();\n setTimeout(() => {\n this.copyToastEl.classList.remove('relly-toast-show');\n }, 1500);\n } catch (err) {\n console.warn('[RellyUI] Failed to import JSON', err);\n }\n return this;\n }\n\n public loadSchema(schema: SchemaDefinition): this {\n if (schema.title) {\n this.setTitle(schema.title);\n }\n SchemaLoader.load(this, schema);\n return this;\n }\n\n public setTitle(title: string): this {\n this.titleEl.textContent = title;\n return this;\n }\n\n public setTheme(theme: ThemeInput): this {\n this.themeManager.applyTheme(theme);\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public setSoundPack(pack: SoundPack): this {\n this.soundEngine.setSoundPack(pack);\n return this;\n }\n\n public getSoundPack(): SoundPack {\n return this.soundEngine.getSoundPack();\n }\n\n public getSoundEngine(): SoundEngine {\n return this.soundEngine;\n }\n\n public toggleMiniHud(): this {\n return this.setMiniHud(!this.isMiniHud);\n }\n\n public setMiniHud(mini: boolean): this {\n this.isMiniHud = mini;\n if (this.isMiniHud) {\n this.panelEl.classList.add('relly-mini-hud');\n this.soundEngine.playMiniHud(true);\n } else {\n this.panelEl.classList.remove('relly-mini-hud');\n this.soundEngine.playMiniHud(false);\n this.clampToViewport();\n }\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public isMiniHudMode(): boolean {\n return this.isMiniHud;\n }\n\n public setGhostMode(enabled: boolean, idleOpacity: number = 0.38): this {\n this.ghostOnIdle = enabled;\n this.idleOpacity = Math.max(0.05, Math.min(1.0, idleOpacity));\n this.panelEl.style.opacity = enabled ? `${this.idleOpacity}` : '1';\n return this;\n }\n\n public isGhostMode(): boolean {\n return this.ghostOnIdle;\n }\n\n public setSoundVolume(volume: number): this {\n this.soundEngine.setVolume(volume);\n return this;\n }\n\n public getSoundVolume(): number {\n return this.soundEngine.getVolume();\n }\n\n private initSparkline(titleWrap: HTMLElement): void {\n const canvas = document.createElement('canvas');\n canvas.className = 'relly-mini-sparkline';\n canvas.width = 48;\n canvas.height = 16;\n titleWrap.appendChild(canvas);\n\n this.sparklineCtx = canvas.getContext('2d');\n\n const animateSparkline = (time: number) => {\n if (this.isMiniHud && this.sparklineCtx) {\n if (!this.lastSparklineTime || time - this.lastSparklineTime >= this.sparklineInterval) {\n this.lastSparklineTime = time;\n this.updateSparklinePoint();\n this.drawSparkline();\n }\n }\n if (typeof requestAnimationFrame !== 'undefined') {\n this.sparklineAnimId = requestAnimationFrame(animateSparkline);\n }\n };\n\n if (typeof requestAnimationFrame !== 'undefined') {\n this.sparklineAnimId = requestAnimationFrame(animateSparkline);\n }\n }\n\n private findActiveGraphValue(): number | null {\n for (const child of this.children) {\n if (typeof (child as any).getLatestValue === 'function') {\n return (child as any).getLatestValue();\n }\n }\n if (this.tabsManagerInstance) {\n for (const tab of this.tabsManagerInstance.getTabs()) {\n for (const comp of (tab as any).children || []) {\n if (typeof (comp as any).getLatestValue === 'function') {\n return (comp as any).getLatestValue();\n }\n }\n }\n }\n return null;\n }\n\n private updateSparklinePoint(): void {\n let next: number;\n const activeVal = this.findActiveGraphValue();\n if (activeVal !== null && !isNaN(activeVal) && isFinite(activeVal)) {\n next = activeVal;\n } else {\n const last = this.sparklineData[this.sparklineData.length - 1] ?? 20;\n next = Math.max(8, Math.min(28, last + (Math.random() - 0.49) * 2.2));\n }\n this.sparklineData.push(next);\n if (this.sparklineData.length > 20) {\n this.sparklineData.shift();\n }\n }\n\n private drawSparkline(): void {\n const ctx = this.sparklineCtx;\n if (!ctx) return;\n const w = 48;\n const h = 16;\n ctx.clearRect(0, 0, w, h);\n\n if (this.sparklineData.length < 2) return;\n\n const min = Math.min(...this.sparklineData) - 1;\n const max = Math.max(...this.sparklineData) + 1;\n const range = max - min || 1;\n const step = w / (this.sparklineData.length - 1);\n\n // Smooth gradient fill\n ctx.beginPath();\n ctx.moveTo(0, h);\n for (let i = 0; i < this.sparklineData.length; i++) {\n const x = i * step;\n const y = h - ((this.sparklineData[i] - min) / range) * (h - 3) - 1.5;\n ctx.lineTo(x, y);\n }\n ctx.lineTo(w, h);\n ctx.closePath();\n ctx.fillStyle = 'rgba(56, 189, 248, 0.2)';\n ctx.fill();\n\n // Smooth stroke\n ctx.beginPath();\n for (let i = 0; i < this.sparklineData.length; i++) {\n const x = i * step;\n const y = h - ((this.sparklineData[i] - min) / range) * (h - 3) - 1.5;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.strokeStyle = '#38bdf8';\n ctx.lineWidth = 1.3;\n ctx.stroke();\n }\n\n public clampToViewport(): this {\n this.draggableInstance?.clampToViewport();\n this.resizableInstance?.clampToViewport();\n return this;\n }\n\n public toggleCollapse(): this {\n return this.setCollapsed(!this.isPanelCollapsed);\n }\n\n public setHotkey(hotkey: string | null): this {\n if (!this.hotkeyInstance) {\n this.hotkeyInstance = new HotkeyManager(hotkey, () => this.toggle());\n } else {\n this.hotkeyInstance.setHotkey(hotkey);\n }\n return this;\n }\n\n public setCollapsed(collapsed: boolean): this {\n this.isPanelCollapsed = collapsed;\n if (this.isPanelCollapsed) {\n this.panelEl.classList.add('relly-collapsed');\n this.collapseBtn.textContent = '+';\n this.bindingEngine.pause();\n } else {\n this.panelEl.classList.remove('relly-collapsed');\n this.collapseBtn.textContent = '_';\n this.bindingEngine.resume();\n }\n if (this.autoSave) this.queueAutoSave();\n return this;\n }\n\n public queueAutoSave(): void {\n if (!this.autoSave) return;\n if (this.autoSaveTimeout) {\n clearTimeout(this.autoSaveTimeout);\n }\n this.autoSaveTimeout = setTimeout(() => {\n this.saveSession();\n }, 250);\n }\n\n public saveSession(key?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n const storageKey = key || this.autoSaveKey;\n try {\n const pos = {\n left: this.panelEl.style.left ? parseFloat(this.panelEl.style.left) : undefined,\n top: this.panelEl.style.top ? parseFloat(this.panelEl.style.top) : undefined,\n right: this.panelEl.style.right ? parseFloat(this.panelEl.style.right) : undefined,\n bottom: this.panelEl.style.bottom ? parseFloat(this.panelEl.style.bottom) : undefined\n };\n\n const sessionData = {\n version: RellyUI.version,\n timestamp: Date.now(),\n isCollapsed: this.isPanelCollapsed,\n isMiniHud: this.isMiniHud,\n theme: this.themeManager.getCurrentThemeName(),\n position: pos,\n width: this.panelEl.style.width,\n height: this.panelEl.style.height,\n components: this.presetManager.export()\n };\n\n window.localStorage.setItem(storageKey, JSON.stringify(sessionData));\n } catch (err) {\n console.warn('[RellyUI] Failed to save session', err);\n }\n }\n\n public loadSession(key?: string): boolean {\n if (typeof window === 'undefined' || !window.localStorage) return false;\n const storageKey = key || this.autoSaveKey;\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return false;\n const data = JSON.parse(raw);\n if (!data || typeof data !== 'object') return false;\n\n // Restore position\n if (data.position) {\n if (data.position.left !== undefined) {\n this.panelEl.style.left = `${data.position.left}px`;\n this.panelEl.style.right = '';\n } else if (data.position.right !== undefined) {\n this.panelEl.style.right = `${data.position.right}px`;\n this.panelEl.style.left = '';\n }\n if (data.position.top !== undefined) {\n this.panelEl.style.top = `${data.position.top}px`;\n this.panelEl.style.bottom = '';\n } else if (data.position.bottom !== undefined) {\n this.panelEl.style.bottom = `${data.position.bottom}px`;\n this.panelEl.style.top = '';\n }\n }\n\n // Restore size\n if (data.width) this.panelEl.style.width = data.width;\n if (data.height) this.panelEl.style.height = data.height;\n\n // Restore theme\n if (data.theme && data.theme !== 'custom') {\n this.setTheme(data.theme);\n }\n\n // Restore collapsed state\n if (data.isCollapsed !== undefined && data.isCollapsed !== this.isPanelCollapsed) {\n this.setCollapsed(data.isCollapsed);\n }\n\n // Restore Mini-HUD state\n if (data.isMiniHud !== undefined && data.isMiniHud !== this.isMiniHud) {\n this.setMiniHud(data.isMiniHud);\n }\n\n // Restore component states via PresetManager\n if (data.components) {\n this.presetManager.import(data.components);\n }\n\n return true;\n } catch (err) {\n console.warn('[RellyUI] Failed to load session', err);\n return false;\n }\n }\n\n public clearSession(key?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n const storageKey = key || this.autoSaveKey;\n try {\n window.localStorage.removeItem(storageKey);\n } catch {}\n }\n\n public setAutoSave(enabled: boolean, key?: string): this {\n this.autoSave = enabled;\n if (key) this.autoSaveKey = key;\n if (this.autoSave) {\n this.loadSession();\n }\n return this;\n }\n\n public toggle(): this {\n return this.isPanelHidden ? this.show() : this.hide();\n }\n\n public show(): this {\n this.isPanelHidden = false;\n this.panelEl.classList.remove('relly-hidden');\n if (!this.isPanelCollapsed) {\n this.bindingEngine.resume();\n }\n return this;\n }\n\n public hide(): this {\n this.isPanelHidden = true;\n this.panelEl.classList.add('relly-hidden');\n this.bindingEngine.pause();\n return this;\n }\n\n public save(storageKey?: string): this {\n this.presetManager.save(storageKey);\n return this;\n }\n\n public load(storageKey?: string): this {\n this.presetManager.load(storageKey);\n return this;\n }\n\n public export(): Record<string, any> {\n return this.presetManager.export();\n }\n\n public import(data: Record<string, any>): this {\n this.presetManager.import(data);\n return this;\n }\n\n public getElement(): HTMLElement {\n return this.panelEl;\n }\n\n public getShadowRoot(): ShadowRoot | null {\n return this.shadowRoot;\n }\n\n public getHost(): HTMLElement | null {\n return this.hostEl || null;\n }\n\n public destroy(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onResizeBound);\n if (this.sparklineAnimId) {\n cancelAnimationFrame(this.sparklineAnimId);\n }\n }\n if (this.draggableInstance) {\n this.draggableInstance.destroy();\n }\n if (this.resizableInstance) {\n this.resizableInstance.destroy();\n }\n if (this.hotkeyInstance) {\n this.hotkeyInstance.destroy();\n }\n if (this.searchBarInstance) {\n this.searchBarInstance.destroy();\n }\n if (this.tabsManagerInstance) {\n this.tabsManagerInstance.destroy();\n }\n if (this.importModalInstance) {\n this.importModalInstance.destroy();\n }\n this.toastManager.destroy();\n this.contextMenuManager.destroy();\n this.bindingEngine.destroy();\n this.destroyChildren();\n\n if (this.hostEl) {\n this.hostEl.remove();\n } else {\n this.panelEl.remove();\n }\n }\n}\n","import './styles/index.css';\nimport { RellyUI } from './RellyUI';\nimport { Checkbox } from './components/Checkbox/Checkbox';\nimport { Slider } from './components/Slider/Slider';\nimport { Button } from './components/Button/Button';\nimport { Select } from './components/Select/Select';\nimport { DynamicLabel } from './components/DynamicLabel/DynamicLabel';\nimport { Graph } from './components/Graph/Graph';\nimport { ColorPicker } from './components/ColorPicker/ColorPicker';\nimport { Point2D } from './components/Point2D/Point2D';\nimport { Point3D } from './components/Point3D/Point3D';\nimport { RangeSlider } from './components/Range/RangeSlider';\nimport { Segmented } from './components/Segmented/Segmented';\nimport { StatusIndicator } from './components/Status/StatusIndicator';\nimport { Section } from './components/Section/Section';\nimport { Row } from './components/Row/Row';\nimport { Tab } from './components/Tabs/Tab';\nimport { TabsManager } from './components/Tabs/TabsManager';\nimport { BaseComponent } from './core/BaseComponent';\nimport { BindingEngine } from './core/BindingEngine';\nimport { PresetManager } from './core/PresetManager';\nimport {\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME\n} from './core/ThemeManager';\nimport { Draggable } from './core/Draggable';\nimport { Resizable } from './core/Resizable';\nimport { HotkeyManager } from './core/HotkeyManager';\nimport { SearchBar } from './core/SearchBar';\nimport { SoundEngine } from './core/SoundEngine';\nimport { ImportModal } from './core/ImportModal';\nimport { ToastManager } from './core/ToastManager';\nimport { ContextMenuManager } from './core/ContextMenuManager';\nimport { SchemaLoader } from './core/SchemaLoader';\nimport { ContainerHelper } from './core/ComponentContainer';\n\n// Attach static members to RellyUI class for convenient access via RellyUI.*\nObject.assign(RellyUI, {\n Checkbox,\n Slider,\n Button,\n Select,\n DynamicLabel,\n Graph,\n ColorPicker,\n Point2D,\n Point3D,\n RangeSlider,\n Segmented,\n StatusIndicator,\n Section,\n Row,\n Tab,\n TabsManager,\n BaseComponent,\n BindingEngine,\n PresetManager,\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME,\n Draggable,\n Resizable,\n HotkeyManager,\n SearchBar,\n SoundEngine,\n ImportModal,\n ToastManager,\n ContextMenuManager,\n SchemaLoader,\n ContainerHelper,\n RellyUI\n});\n\n// Named exports for modern ESM imports\nexport {\n RellyUI,\n Checkbox,\n Slider,\n Button,\n Select,\n DynamicLabel,\n Graph,\n ColorPicker,\n Point2D,\n Point3D,\n RangeSlider,\n Segmented,\n StatusIndicator,\n Section,\n Row,\n Tab,\n TabsManager,\n BaseComponent,\n BindingEngine,\n PresetManager,\n ThemeManager,\n DARK_THEME,\n LIGHT_THEME,\n CYBERPUNK_THEME,\n NORD_THEME,\n DRACULA_THEME,\n TOKYO_NIGHT_THEME,\n MATRIX_THEME,\n SYNTHWAVE_THEME,\n Draggable,\n Resizable,\n HotkeyManager,\n SearchBar,\n SoundEngine,\n ImportModal,\n ToastManager,\n ContextMenuManager,\n SchemaLoader,\n ContainerHelper\n};\n\nexport * from './types';\n\n// Browser global attachment for direct <script src=\"...\">\nif (typeof window !== 'undefined') {\n (window as any).RellyUI = RellyUI;\n}\n\n// Default export is the RellyUI constructor\nexport default RellyUI;\n"],"names":["BaseComponent","label","targetObject","property","bindingEngine","presetManager","__publicField","tooltip","predicate","isVisible","items","callback","value","_a","prev","disabled","el","current","Checkbox","soundEngine","nextVal","e","isChecked","Slider","val","isScrubbing","startX","startVal","onMouseMove","ev","dx","stepMultiplier","stepDelta","deltaVal","newVal","decimals","invStep","onMouseUp","now","min","max","step","Button","onClick","Select","options","selectedKey","actualValue","item","key","optEl","currentVal","DynamicLabel","v","formatter","Graph","rect","x","width","index","clampedIndex","header","dpr","w","h","crosshairX","html","series","startIndex","bufIdx","tooltipWidth","leftPos","paused","ms","smooth","fn","enabled","lineColor","fillColor","size","s","height","id","numVal","latestVal","allVals","pausedBadge","ctx","p","y","minVal","maxVal","pad","range","bufferToRender","points","i","normalized","p0","p1","midX","gradient","lastPoint","ColorPicker","result","color","swatches","btn","lower","swatchColor","Point2D","xItem","xTag","yItem","yTag","input","axis","nextArr","rawPrev","Point3D","zItem","zTag","idx","z","RangeSlider","a","b","vMin","_","curMax","vMax","curMin","thumb","type","isDragging","_b","pct","rawVal","steppedVal","nextMin","nextMax","startMin","startMax","span","newMin","newMax","stepped","clampedMin","clampedMax","cur","minPct","maxPct","Segmented","matchedBtn","left","StatusIndicator","status","badge","detail","ContainerHelper","contentEl","expandedSection","child","Section","targetOrOptions","opts","comp","labelOrOptions","tracker","frames","prevTime","animId","loop","graph","origDestroy","intervalId","updateMem","used","initialStatus","targetObj","propName","row","Row","collapsed","isCollapsed","section","slider","dyn","colorComp","p2d","p3d","rowEl","initialCollapsed","content","titleWrap","parent","BindingEngine","component","listener","PresetManager","cb","values","data","storageKey","exported","err","raw","parsed","DARK_THEME","LIGHT_THEME","CYBERPUNK_THEME","NORD_THEME","DRACULA_THEME","TOKYO_NIGHT_THEME","MATRIX_THEME","SYNTHWAVE_THEME","ThemeManager","panelElement","themeInput","theme","Draggable","handle","panel","panelWidth","panelHeight","maxLeft","maxTop","newLeft","newTop","dy","snapped","Resizable","minWidth","minHeight","maxWidth","maxHeight","newWidth","newHeight","maxAllowedWidth","maxAllowedHeight","bodyEl","HotkeyManager","hotkey","onToggle","path","target","tag","activeEl","SearchBar","query","rawQuery","normalizedQuery","labelEl","text","parentSection","sec","titleEl","secTitle","r","activeTabContent","activeMatches","allTabContents","tabBtns","SoundEngine","soundPack","vol","pack","AudioCtx","osc","gain","state","startFreq","endFreq","f1","f2","freq","osc1","gain1","osc2","gain2","isEntering","ImportModal","parentEl","onApply","modal","title","closeBtn","actions","cancelBtn","applyBtn","file","reader","SchemaLoader","container","schema","defaultTarget","loadControls","targetContainer","controls","ctrl","subControls","ToastManager","message","duration","toast","iconEl","msgEl","dismiss","ContextMenuManager","panelEl","componentEl","clientX","clientY","sep","iconHtml","panelRect","top","menuWidth","menuHeight","Tab","active","TabsManager","parentHeader","parentBody","tab","playSound","t","STYLE_ID","injectStyles","targetRoot","root","styleEl","cssContent","_RellyUI","useShadow","copyBtn","importBtn","miniHudBtn","collapseBtn","copyToast","body","pos","host","jsonStr","json","mini","idleOpacity","volume","canvas","animateSparkline","time","next","activeVal","last","sessionData","RellyUI"],"mappings":"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"}
|