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.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relly-ui.umd.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/cdn.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 all components and sub-modules directly onto the constructor\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\nexport default RellyUI;\n"],"names":["BaseComponent","label","targetObject","property","bindingEngine","presetManager","__publicField","tooltip","predicate","isVisible","items","callback","value","prev","_a","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","pct","rawVal","steppedVal","nextMin","nextMax","_b","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.umd.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/cdn.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 all components and sub-modules directly onto the constructor\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\nexport default RellyUI;\n"],"names":["BaseComponent","label","targetObject","property","bindingEngine","presetManager","__publicField","tooltip","predicate","isVisible","items","callback","value","prev","_a","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","minVal","maxVal","pad","range","bufferToRender","points","i","normalized","y","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","pct","rawVal","steppedVal","nextMin","nextMax","_b","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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"}
|