@ryanhelsing/ry-ui 1.0.7 → 1.0.9

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/ry-ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ry-ui.js","sources":["../src/ts/core/ry-element.ts","../src/ts/core/ry-transform.ts","../src/ts/components/ry-accordion.ts","../src/ts/components/ry-modal.ts","../src/ts/components/ry-tabs.ts","../src/ts/components/ry-dropdown.ts","../src/ts/components/ry-button.ts","../src/ts/components/ry-button-group.ts","../src/ts/components/ry-split.ts","../src/ts/components/ry-theme-toggle.ts","../src/ts/components/ry-card.ts","../src/ts/components/ry-alert.ts","../src/ts/components/ry-field.ts","../src/ts/components/ry-switch.ts","../src/ts/components/ry-tooltip.ts","../src/ts/components/ry-drawer.ts","../src/ts/components/ry-toast.ts","../src/ts/core/ry-icons.ts","../src/ts/components/ry-select.ts","../src/ts/components/ry-combobox.ts","../src/ts/components/ry-code.ts","../src/ts/components/ry-example.ts","../src/ts/components/ry-icon.ts","../src/ts/components/ry-toggle-button.ts","../src/ts/components/ry-slider.ts","../src/ts/components/ry-knob.ts","../src/ts/components/ry-number-select.ts","../src/ts/components/ry-color-picker.ts","../src/ts/components/ry-color-input.ts","../src/ts/components/ry-gradient-picker.ts","../src/ts/components/ry-tree.ts","../src/ts/components/ry-tag.ts","../src/ts/components/ry-tag-input.ts","../src/ts/components/ry-hero.ts","../src/ts/components/ry-stat.ts","../src/ts/components/ry-feature.ts","../src/ts/components/ry-pricing.ts","../src/ts/components/ry-carousel.ts","../src/ts/ry-ui.ts"],"sourcesContent":["/**\n * RyElement - Base class for all ry-ui components\n *\n * Provides:\n * - Lifecycle hooks with auto-cleanup\n * - Event helper methods\n * - State management via data attributes\n * - DOM query helpers\n */\n\nimport type { CleanupFn, StateChangeDetail } from '../types.js';\n\nexport class RyElement extends HTMLElement {\n // Store for cleanup functions\n #cleanupFns: CleanupFn[] = [];\n\n // Store for MutationObserver\n #observer: MutationObserver | null = null;\n\n constructor() {\n super();\n }\n\n /**\n * Called when element is added to DOM.\n * Override setup() in subclass instead of this.\n */\n connectedCallback(): void {\n // Mark as initialized\n this.setAttribute('data-ry-initialized', '');\n\n // Call subclass setup\n this.setup?.();\n }\n\n /**\n * Called when element is removed from DOM.\n * Automatically cleans up event listeners and observers.\n */\n disconnectedCallback(): void {\n // Run all cleanup functions\n this.#cleanupFns.forEach(fn => fn());\n this.#cleanupFns = [];\n\n // Disconnect observer\n if (this.#observer) {\n this.#observer.disconnect();\n this.#observer = null;\n }\n\n // Call subclass teardown\n this.teardown?.();\n }\n\n /**\n * Override in subclass for component initialization\n */\n setup?(): void;\n\n /**\n * Override in subclass for cleanup\n */\n teardown?(): void;\n\n /**\n * Add event listener with automatic cleanup on disconnect.\n */\n on<K extends keyof HTMLElementEventMap>(\n target: EventTarget,\n event: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions\n ): (e: HTMLElementEventMap[K]) => void;\n\n on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): EventListener;\n\n on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options: AddEventListenerOptions = {}\n ): EventListener {\n const boundHandler = handler.bind(this) as EventListener;\n target.addEventListener(event, boundHandler, options);\n\n this.#cleanupFns.push(() => {\n target.removeEventListener(event, boundHandler, options);\n });\n\n return boundHandler;\n }\n\n /**\n * Emit a custom event with ry: prefix.\n */\n emit<T = void>(name: string, detail?: T, options: CustomEventInit = {}): boolean {\n const event = new CustomEvent(`ry:${name}`, {\n bubbles: true,\n cancelable: true,\n detail,\n ...options\n });\n return this.dispatchEvent(event);\n }\n\n /**\n * Get/set component state via data attribute.\n */\n get state(): string {\n return this.dataset.ryState ?? 'closed';\n }\n\n set state(value: string) {\n const oldState = this.state;\n if (oldState !== value) {\n this.dataset.ryState = value;\n this.emit<StateChangeDetail>('state-change', { oldState, newState: value });\n }\n }\n\n /**\n * Query within this element.\n */\n $<E extends Element = Element>(selector: string): E | null {\n return this.querySelector<E>(selector);\n }\n\n /**\n * Query all within this element.\n */\n $$<E extends Element = Element>(selector: string): E[] {\n return [...this.querySelectorAll<E>(selector)];\n }\n\n /**\n * Setup a MutationObserver on this element.\n */\n observe(\n callback: MutationCallback,\n options: MutationObserverInit = { childList: true, subtree: true }\n ): void {\n if (this.#observer) {\n this.#observer.disconnect();\n }\n\n this.#observer = new MutationObserver(callback.bind(this));\n this.#observer.observe(this, options);\n }\n\n /**\n * Wait for next animation frame.\n */\n nextFrame(): Promise<number> {\n return new Promise(resolve => requestAnimationFrame(resolve));\n }\n\n /**\n * Trap focus within a container (for modals, dropdowns).\n */\n trapFocus(container: HTMLElement): void {\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(',');\n\n const focusableEls = container.querySelectorAll<HTMLElement>(focusableSelectors);\n const firstEl = focusableEls[0];\n const lastEl = focusableEls[focusableEls.length - 1];\n\n const handleKeydown = (e: KeyboardEvent): void => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstEl) {\n e.preventDefault();\n lastEl?.focus();\n }\n } else {\n if (document.activeElement === lastEl) {\n e.preventDefault();\n firstEl?.focus();\n }\n }\n };\n\n this.on(container, 'keydown', handleKeydown);\n\n // Focus first element\n firstEl?.focus();\n }\n}\n","/**\n * <ry> Transform Wrapper\n *\n * Allows clean, unprefixed markup inside <ry> tags.\n * Converts <accordion> to <ry-accordion>, etc.\n *\n * Usage:\n * <ry>\n * <accordion>\n * <accordion-item title=\"Foo\">Content</accordion-item>\n * </accordion>\n * </ry>\n *\n * Or with <template ry>:\n * <template ry>\n * <accordion>...</accordion>\n * </template>\n *\n * Both prefixed and unprefixed work together:\n * <ry>\n * <accordion>\n * <ry-accordion-item>Already prefixed, unchanged</ry-accordion-item>\n * <accordion-item>Gets transformed</accordion-item>\n * </accordion>\n * </ry>\n */\n\n// All component names that can be transformed\nconst RY_COMPONENTS: readonly string[] = [\n // Layout\n 'page', 'header', 'main', 'footer', 'section', 'aside',\n 'grid', 'stack', 'cluster', 'split', 'center',\n 'nav', 'logo', 'actions',\n // Components\n 'accordion', 'accordion-item',\n 'tabs', 'tab',\n 'modal',\n 'dropdown', 'menu', 'menu-item',\n 'drawer',\n 'toast',\n 'alert',\n 'card',\n 'button',\n 'button-group',\n 'badge',\n 'field',\n 'switch',\n 'tooltip',\n 'select', 'option',\n 'theme-toggle',\n 'divider',\n 'icon',\n 'example',\n 'toggle-button',\n 'slider',\n 'knob',\n 'number-select',\n 'color-picker',\n 'color-input',\n 'gradient-picker',\n 'tree',\n 'tree-item',\n 'tag',\n 'tag-input',\n 'hero',\n 'stat',\n 'feature',\n 'feature-grid',\n 'pricing',\n 'pricing-card',\n 'carousel',\n 'combobox'\n] as const;\n\n// Build regex once - matches tags not already prefixed\nconst TRANSFORM_REGEX = new RegExp(\n `<(/?)(${RY_COMPONENTS.join('|')})(\\\\s|>|/)`,\n 'g'\n);\n\n/**\n * Transform unprefixed markup to ry- prefixed\n */\nexport function transform(html: string): string {\n return html.replace(TRANSFORM_REGEX, '<$1ry-$2$3');\n}\n\n/**\n * Process all <ry> wrappers and <template ry> blocks\n */\nexport function processTransforms(): void {\n // Process <ry> elements\n document.querySelectorAll('ry').forEach(el => {\n const transformed = transform(el.innerHTML);\n const template = document.createElement('template');\n template.innerHTML = transformed;\n el.replaceWith(template.content);\n });\n\n // Process <template ry> elements\n document.querySelectorAll('template[ry]').forEach(el => {\n const transformed = transform((el as HTMLTemplateElement).innerHTML);\n const template = document.createElement('template');\n template.innerHTML = transformed;\n el.replaceWith(template.content);\n });\n}\n\n// Run transforms when DOM is ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', processTransforms);\n} else {\n // DOM already loaded, run immediately\n processTransforms();\n}\n","/**\n * <ry-accordion>\n *\n * Collapsible accordion component.\n *\n * Minimal markup (recommended):\n * <ry-accordion>\n * <ry-accordion-item title=\"Title\" open>Content</ry-accordion-item>\n * </ry-accordion>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n * This decouples behavior from visual design.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface AccordionItemEventDetail {\n item: HTMLElement;\n}\n\nexport class RyAccordion extends RyElement {\n setup(): void {\n // Transform minimal markup to full structure\n this.#transformMinimalMarkup();\n\n // Bind click handlers to all triggers\n this.$$('[data-ry-target=\"trigger\"]').forEach(trigger => {\n this.on(trigger, 'click', this.#handleTriggerClick);\n });\n\n // Keyboard navigation\n this.on(this, 'keydown', this.#handleKeydown);\n\n // Initialize ARIA\n this.#initAria();\n }\n\n #transformMinimalMarkup(): void {\n // Convert <ry-accordion-item> to full structure\n // data-ry-target for JS queries, class for CSS styling\n this.$$('ry-accordion-item').forEach((item) => {\n const title = item.getAttribute('title') ?? 'Untitled';\n const isOpen = item.hasAttribute('open');\n const content = item.innerHTML;\n\n item.outerHTML = `\n <div data-ry-target=\"item\" class=\"ry-accordion__item\" data-ry-state=\"${isOpen ? 'open' : 'closed'}\">\n <button data-ry-target=\"trigger\" class=\"ry-accordion__trigger\" aria-expanded=\"${isOpen}\">\n ${title}\n <span data-ry-target=\"icon\" class=\"ry-accordion__icon\">&#9660;</span>\n </button>\n <div data-ry-target=\"panel\" class=\"ry-accordion__panel\">\n <div class=\"ry-accordion__content\">${content}</div>\n </div>\n </div>\n `;\n });\n }\n\n #initAria(): void {\n this.$$('[data-ry-target=\"item\"]').forEach((item, index) => {\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n const panel = item.querySelector('[data-ry-target=\"panel\"]');\n\n if (!trigger || !panel) return;\n\n // Generate IDs if not present\n const triggerId = trigger.id || `ry-accordion-trigger-${this.id || ''}-${index}`;\n const panelId = panel.id || `ry-accordion-panel-${this.id || ''}-${index}`;\n\n trigger.id = triggerId;\n panel.id = panelId;\n\n trigger.setAttribute('aria-controls', panelId);\n panel.setAttribute('aria-labelledby', triggerId);\n panel.setAttribute('role', 'region');\n\n // Set initial state\n const isOpen = (item as HTMLElement).dataset.ryState === 'open';\n trigger.setAttribute('aria-expanded', String(isOpen));\n });\n }\n\n #handleTriggerClick = (event: Event): void => {\n const trigger = event.currentTarget as HTMLElement;\n const item = trigger.closest('[data-ry-target=\"item\"]') as HTMLElement | null;\n\n if (!item) return;\n\n this.toggle(item);\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (currentIndex === -1) return;\n\n let newIndex: number;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n newIndex = (currentIndex + 1) % triggers.length;\n triggers[newIndex]?.focus();\n break;\n case 'ArrowUp':\n event.preventDefault();\n newIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n triggers[newIndex]?.focus();\n break;\n case 'Home':\n event.preventDefault();\n triggers[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n triggers[triggers.length - 1]?.focus();\n break;\n }\n };\n\n toggle(item: HTMLElement): void {\n const isOpen = item.dataset.ryState === 'open';\n\n if (isOpen) {\n this.close(item);\n } else {\n this.open(item);\n }\n }\n\n open(item: HTMLElement): void {\n // Close others if not multiple mode\n if (!this.hasAttribute('multiple')) {\n this.$$<HTMLElement>('[data-ry-target=\"item\"][data-ry-state=\"open\"]').forEach(openItem => {\n if (openItem !== item) {\n this.close(openItem);\n }\n });\n }\n\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n\n item.dataset.ryState = 'open';\n trigger?.setAttribute('aria-expanded', 'true');\n\n this.emit<AccordionItemEventDetail>('open', { item });\n }\n\n close(item: HTMLElement): void {\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n\n item.dataset.ryState = 'closed';\n trigger?.setAttribute('aria-expanded', 'false');\n\n this.emit<AccordionItemEventDetail>('close', { item });\n }\n\n openAll(): void {\n this.$$<HTMLElement>('[data-ry-target=\"item\"]').forEach(item => this.open(item));\n }\n\n closeAll(): void {\n this.$$<HTMLElement>('[data-ry-target=\"item\"]').forEach(item => this.close(item));\n }\n}\n\ncustomElements.define('ry-accordion', RyAccordion);\n\n// Register placeholder for minimal markup\nif (!customElements.get('ry-accordion-item')) {\n customElements.define('ry-accordion-item', class extends HTMLElement {});\n}\n","/**\n * <ry-modal>\n *\n * Modal dialog with focus trapping and backdrop.\n *\n * Minimal markup (recommended):\n * <ry-button modal=\"my-modal\">Open</ry-button>\n * <ry-modal id=\"my-modal\" title=\"Title\">\n * Content\n * <ry-actions slot=\"footer\">...</ry-actions>\n * </ry-modal>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyModal extends RyElement {\n #previouslyFocused: Element | null = null;\n #scrollbarWidth = 0;\n\n setup(): void {\n // Handle Option B: transform minimal markup\n this.#transformMinimalMarkup();\n\n // Find trigger buttons anywhere in document\n const modalId = this.id;\n if (modalId) {\n // data-ry-modal-trigger attribute\n document.querySelectorAll<HTMLElement>(`[data-ry-modal-trigger=\"${modalId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n\n // modal=\"id\" attribute on ry-button\n document.querySelectorAll<HTMLElement>(`ry-button[modal=\"${modalId}\"], [modal=\"${modalId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n }\n\n // Close buttons inside modal (use [close] attribute)\n this.$$('[close]').forEach(closeBtn => {\n this.on(closeBtn, 'click', () => this.close());\n });\n\n // Backdrop click\n const backdrop = this.$('[data-ry-target=\"backdrop\"]');\n if (backdrop) {\n this.on(backdrop, 'click', () => this.close());\n }\n\n // Escape key\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Calculate scrollbar width\n this.#scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n // Initialize state\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n }\n\n #transformMinimalMarkup(): void {\n // Check if already has full markup\n if (this.$('[data-ry-target=\"dialog\"]')) return;\n\n const title = this.getAttribute('title') ?? '';\n const footerSlot = this.$<HTMLElement>('[slot=\"footer\"]');\n const footerContent = footerSlot?.innerHTML ?? '';\n\n const bodyContent = Array.from(this.childNodes)\n .filter(n => !(n instanceof Element && n.getAttribute('slot') === 'footer'))\n .map(n => n instanceof Element ? n.outerHTML : n.textContent)\n .join('');\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"backdrop\" class=\"ry-modal__backdrop\"></div>\n <div data-ry-target=\"dialog\" class=\"ry-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ry-modal-title-${this.id}\">\n <div data-ry-target=\"header\" class=\"ry-modal__header\">\n <h3 class=\"ry-modal__title\" id=\"ry-modal-title-${this.id}\">${title}</h3>\n <button data-ry-target=\"close\" class=\"ry-modal__close\" close aria-label=\"Close\">&times;</button>\n </div>\n <div data-ry-target=\"body\" class=\"ry-modal__body\">${bodyContent}</div>\n ${footerContent ? `<div data-ry-target=\"footer\" class=\"ry-modal__footer\">${footerContent}</div>` : ''}\n </div>\n `;\n }\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n // Store currently focused element\n this.#previouslyFocused = document.activeElement;\n\n // Lock body scroll via data attribute (CSS handles the style)\n document.body.setAttribute('data-ry-scroll-lock', '');\n document.body.style.setProperty('--ry-scrollbar-width', `${this.#scrollbarWidth}px`);\n\n // Open modal\n this.state = 'open';\n\n // Trap focus\n const dialog = this.$<HTMLElement>('[data-ry-target=\"dialog\"]');\n if (dialog) {\n this.nextFrame().then(() => {\n this.trapFocus(dialog);\n });\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n // Unlock body scroll\n document.body.removeAttribute('data-ry-scroll-lock');\n document.body.style.removeProperty('--ry-scrollbar-width');\n\n // Close modal\n this.state = 'closed';\n\n // Restore focus\n if (this.#previouslyFocused instanceof HTMLElement) {\n this.#previouslyFocused.focus();\n this.#previouslyFocused = null;\n }\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-modal', RyModal);\n","/**\n * <ry-tabs>\n *\n * Tab interface with keyboard navigation.\n *\n * Minimal markup (recommended):\n * <ry-tabs>\n * <ry-tab title=\"Tab 1\" active>Content 1</ry-tab>\n * <ry-tab title=\"Tab 2\">Content 2</ry-tab>\n * </ry-tabs>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface TabChangeDetail {\n index: number;\n trigger: HTMLElement;\n panel: HTMLElement;\n}\n\nexport class RyTabs extends RyElement {\n setup(): void {\n // Transform minimal markup to full structure\n this.#transformMinimalMarkup();\n\n // Bind click handlers\n this.$$('[data-ry-target=\"trigger\"]').forEach(trigger => {\n this.on(trigger, 'click', this.#handleTriggerClick);\n });\n\n // Keyboard navigation\n this.on(this, 'keydown', this.#handleKeydown);\n\n // Initialize ARIA\n this.#initAria();\n }\n\n #transformMinimalMarkup(): void {\n const tabs = this.$$('ry-tab');\n if (tabs.length === 0) return;\n\n const activeIndex = tabs.findIndex(t => t.hasAttribute('active'));\n const defaultActive = activeIndex === -1 ? 0 : activeIndex;\n\n // Build tab list\n // data-ry-target for JS queries, class for CSS styling\n const tabList = document.createElement('div');\n tabList.setAttribute('data-ry-target', 'list');\n tabList.className = 'ry-tabs__list';\n tabList.setAttribute('role', 'tablist');\n\n tabs.forEach((tab, index) => {\n const title = tab.getAttribute('title') ?? `Tab ${index + 1}`;\n const isActive = index === defaultActive;\n\n const trigger = document.createElement('button');\n trigger.setAttribute('data-ry-target', 'trigger');\n trigger.className = 'ry-tabs__trigger';\n trigger.setAttribute('role', 'tab');\n trigger.setAttribute('aria-selected', String(isActive));\n trigger.textContent = title;\n\n tabList.appendChild(trigger);\n\n // Convert ry-tab to panel\n tab.setAttribute('data-ry-target', 'panel');\n tab.className = 'ry-tabs__panel';\n tab.setAttribute('role', 'tabpanel');\n (tab as HTMLElement).dataset.ryState = isActive ? 'active' : '';\n tab.removeAttribute('title');\n tab.removeAttribute('active');\n });\n\n // Insert tab list at beginning\n this.insertBefore(tabList, this.firstChild);\n }\n\n #initAria(): void {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const panels = this.$$<HTMLElement>('[data-ry-target=\"panel\"], ry-tab');\n\n triggers.forEach((trigger, index) => {\n const panel = panels[index];\n if (!panel) return;\n\n // Generate IDs\n const triggerId = trigger.id || `ry-tab-${this.id || ''}-${index}`;\n const panelId = panel.id || `ry-tabpanel-${this.id || ''}-${index}`;\n\n trigger.id = triggerId;\n panel.id = panelId;\n\n trigger.setAttribute('aria-controls', panelId);\n panel.setAttribute('aria-labelledby', triggerId);\n\n // Set tabindex for keyboard nav\n trigger.setAttribute('tabindex', trigger.getAttribute('aria-selected') === 'true' ? '0' : '-1');\n });\n\n // Ensure one tab is active\n const activeIndex = triggers.findIndex(t => t.getAttribute('aria-selected') === 'true');\n if (activeIndex === -1 && triggers.length > 0) {\n this.select(0);\n }\n }\n\n #handleTriggerClick = (event: Event): void => {\n const trigger = event.currentTarget as HTMLElement;\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const index = triggers.indexOf(trigger);\n\n if (index !== -1) {\n this.select(index);\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (currentIndex === -1) return;\n\n let newIndex: number;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n newIndex = (currentIndex + 1) % triggers.length;\n this.select(newIndex);\n triggers[newIndex]?.focus();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n this.select(newIndex);\n triggers[newIndex]?.focus();\n break;\n case 'Home':\n event.preventDefault();\n this.select(0);\n triggers[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n this.select(triggers.length - 1);\n triggers[triggers.length - 1]?.focus();\n break;\n }\n };\n\n select(index: number): void {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const panels = this.$$<HTMLElement>('[data-ry-target=\"panel\"], ry-tab');\n\n if (index < 0 || index >= triggers.length) return;\n\n // Deactivate all\n triggers.forEach(trigger => {\n trigger.setAttribute('aria-selected', 'false');\n trigger.setAttribute('tabindex', '-1');\n });\n\n panels.forEach(panel => {\n panel.dataset.ryState = '';\n panel.removeAttribute('active');\n });\n\n // Activate selected\n const trigger = triggers[index];\n const panel = panels[index];\n\n if (trigger && panel) {\n trigger.setAttribute('aria-selected', 'true');\n trigger.setAttribute('tabindex', '0');\n panel.dataset.ryState = 'active';\n\n this.emit<TabChangeDetail>('change', { index, trigger, panel });\n }\n }\n\n get selectedIndex(): number {\n const triggers = this.$$('[data-ry-target=\"trigger\"]');\n return triggers.findIndex(t => t.getAttribute('aria-selected') === 'true');\n }\n}\n\ncustomElements.define('ry-tabs', RyTabs);\n\n// Register placeholder for minimal markup\nif (!customElements.get('ry-tab')) {\n customElements.define('ry-tab', class extends HTMLElement {});\n}\n","/**\n * <ry-dropdown>\n *\n * Dropdown menu with click-outside handling.\n *\n * Minimal markup (recommended):\n * <ry-dropdown>\n * <ry-button slot=\"trigger\">Options</ry-button>\n * <ry-menu>\n * <ry-menu-item>Edit</ry-menu-item>\n * </ry-menu>\n * </ry-dropdown>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyDropdown extends RyElement {\n setup(): void {\n // Handle Option B: transform minimal markup\n this.#transformMinimalMarkup();\n\n const trigger = this.$<HTMLElement>('[data-ry-target=\"trigger\"]');\n\n if (trigger) {\n this.on(trigger, 'click', () => this.toggle());\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleClickOutside);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Menu item clicks\n this.$$('[data-ry-target=\"item\"], ry-menu-item').forEach(item => {\n this.on(item, 'click', () => this.close());\n });\n\n // Initialize state\n this.state = 'closed';\n }\n\n #transformMinimalMarkup(): void {\n // Handle ry-button with slot=\"trigger\"\n // data-ry-target for JS queries, class for CSS styling\n const triggerButton = this.$('[slot=\"trigger\"], ry-button:first-of-type');\n if (triggerButton && !this.$('[data-ry-target=\"trigger\"]')) {\n triggerButton.setAttribute('data-ry-target', 'trigger');\n }\n\n // Handle ry-menu\n const menu = this.$('ry-menu');\n if (menu && !menu.hasAttribute('data-ry-target')) {\n menu.setAttribute('data-ry-target', 'menu');\n menu.classList.add('ry-dropdown__menu');\n menu.setAttribute('role', 'menu');\n }\n\n // Handle ry-menu-item\n this.$$('ry-menu-item').forEach(item => {\n if (!item.hasAttribute('data-ry-target')) {\n item.setAttribute('data-ry-target', 'item');\n item.classList.add('ry-dropdown__item');\n item.setAttribute('role', 'menuitem');\n }\n });\n }\n\n #handleClickOutside = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (this.state === 'open' && !this.contains(target)) {\n this.close();\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n this.$<HTMLElement>('[data-ry-target=\"trigger\"]')?.focus();\n }\n\n // Arrow key navigation within menu\n if (this.state === 'open' && ['ArrowDown', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n const items = this.$$<HTMLElement>('[data-ry-target=\"item\"], ry-menu-item');\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n let newIndex: number;\n if (event.key === 'ArrowDown') {\n newIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n } else {\n newIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n }\n\n items[newIndex]?.focus();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n this.#positionMenu();\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n trigger?.setAttribute('aria-expanded', 'true');\n\n this.state = 'open';\n\n // Focus first item\n this.nextFrame().then(() => {\n this.$<HTMLElement>('[data-ry-target=\"item\"], ry-menu-item')?.focus();\n });\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n trigger?.setAttribute('aria-expanded', 'false');\n\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n this.emit('close');\n }\n\n #positionMenu(): void {\n const menu = this.$<HTMLElement>('[data-ry-target=\"menu\"], ry-menu');\n if (!menu) return;\n\n const rect = this.getBoundingClientRect();\n const menuHeight = menu.scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < menuHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-dropdown', RyDropdown);\n\n// Register placeholders for minimal markup\nif (!customElements.get('ry-menu')) {\n customElements.define('ry-menu', class extends HTMLElement {});\n}\nif (!customElements.get('ry-menu-item')) {\n customElements.define('ry-menu-item', class extends HTMLElement {});\n}\n","/**\n * <ry-button>\n *\n * Button component that renders as a native button.\n * Supports variant and size attributes.\n *\n * Usage:\n * <ry-button>Click me</ry-button>\n * <ry-button variant=\"ghost\" size=\"sm\">Small ghost</ry-button>\n * <ry-button modal=\"my-modal\">Open modal</ry-button>\n *\n * No data-ry-target needed - button has no internal structure.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyButton extends RyElement {\n setup(): void {\n // Make it focusable and clickable like a button\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n this.setAttribute('role', 'button');\n\n // Handle click\n this.on(this, 'click', this.#handleClick);\n\n // Handle keyboard\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) {\n event.preventDefault();\n return;\n }\n\n // If it has a modal attribute, the modal will handle it\n // Just emit the click event\n this.emit('click', { originalEvent: event });\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.click();\n }\n };\n}\n\ncustomElements.define('ry-button', RyButton);\n","/**\n * <ry-button-group>\n *\n * Segmented control / button group. Groups child buttons with\n * connected borders and optional radio-group behavior.\n *\n * Usage (visual grouping only):\n * <ry-button-group>\n * <ry-button>Left</ry-button>\n * <ry-button>Center</ry-button>\n * <ry-button>Right</ry-button>\n * </ry-button-group>\n *\n * Usage (radio behavior — single selection):\n * <ry-button-group name=\"mode\" value=\"terminal\">\n * <ry-button value=\"direct\">Direct</ry-button>\n * <ry-button value=\"terminal\">Terminal</ry-button>\n * <ry-button value=\"release\">Release</ry-button>\n * </ry-button-group>\n *\n * Emits ry:change with { value } when selection changes.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyButtonGroup extends RyElement {\n static get observedAttributes(): string[] {\n return ['value'];\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(v: string) {\n this.setAttribute('value', v);\n }\n\n setup(): void {\n this.setAttribute('role', 'group');\n this.#syncPressed();\n this.on(this, 'click', this.#handleClick);\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (name === 'value' && oldValue !== newValue) {\n this.#syncPressed();\n }\n }\n\n #handleClick = (e: MouseEvent): void => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('ry-button, ry-toggle-button');\n if (!target || !this.contains(target)) return;\n\n const val = target.getAttribute('value');\n if (val == null) return;\n\n if (this.value !== val) {\n this.value = val;\n this.emit('change', { value: val });\n }\n };\n\n #syncPressed(): void {\n const current = this.value;\n if (!current) return;\n\n for (const btn of this.querySelectorAll<HTMLElement>('ry-button, ry-toggle-button')) {\n if (btn.getAttribute('value') === current) {\n btn.setAttribute('pressed', '');\n btn.setAttribute('aria-pressed', 'true');\n } else {\n btn.removeAttribute('pressed');\n btn.removeAttribute('aria-pressed');\n }\n }\n }\n}\n\ncustomElements.define('ry-button-group', RyButtonGroup);\n","/**\n * <ry-split>\n *\n * Two-column split layout with optional resizable divider and persistence.\n *\n * Usage:\n * <ry-split>\n * <div>Main content</div>\n * <div>Sidebar</div>\n * </ry-split>\n *\n * Resizable with persistence:\n * <ry-split resizable persist=\"my-panel\">\n * <div>Main</div>\n * <div>Panel</div>\n * </ry-split>\n *\n * CSS custom properties:\n * --ry-split-width: Sidebar width (default 300px)\n * --ry-split-min-width: Sidebar minimum during resize (default 100px)\n * --ry-split-max-width: Sidebar maximum during resize (default 80% of container)\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RySplit extends RyElement {\n #handle: HTMLElement | null = null;\n #dragging = false;\n #startX = 0;\n #startWidth = 0;\n\n setup(): void {\n if (!this.hasAttribute('resizable')) return;\n\n // Restore persisted width\n this.#restore();\n\n // Create resize handle\n this.#handle = document.createElement('div');\n this.#handle.setAttribute('data-ry-target', 'handle');\n this.#handle.className = 'ry-split__handle';\n this.#handle.setAttribute('role', 'separator');\n this.#handle.setAttribute('aria-orientation', 'vertical');\n this.#handle.setAttribute('tabindex', '0');\n\n // Insert handle before the last child (the sidebar)\n const sidebar = this.lastElementChild;\n if (sidebar) {\n this.insertBefore(this.#handle, sidebar);\n }\n\n this.on(this.#handle, 'mousedown', this.#onMouseDown);\n this.on(this.#handle, 'touchstart', this.#onTouchStart as EventListener);\n this.on(this.#handle, 'keydown', this.#onKeyDown);\n this.on(this.#handle, 'dblclick', this.#onDoubleClick);\n }\n\n #getSidebar(): HTMLElement | null {\n return this.lastElementChild as HTMLElement | null;\n }\n\n #getCurrentWidth(): number {\n const sidebar = this.#getSidebar();\n if (!sidebar) return 300;\n return sidebar.getBoundingClientRect().width;\n }\n\n #getMinWidth(): number {\n const val = getComputedStyle(this).getPropertyValue('--ry-split-min-width').trim();\n return val ? parseFloat(val) : 100;\n }\n\n #getMaxWidth(): number {\n const val = getComputedStyle(this).getPropertyValue('--ry-split-max-width').trim();\n if (val) return parseFloat(val);\n return this.getBoundingClientRect().width * 0.8;\n }\n\n #setWidth(px: number): void {\n const min = this.#getMinWidth();\n const max = this.#getMaxWidth();\n const clamped = Math.round(Math.max(min, Math.min(max, px)));\n this.style.setProperty('--ry-split-width', `${clamped}px`);\n }\n\n #onMouseDown = (e: MouseEvent): void => {\n e.preventDefault();\n this.#startDrag(e.clientX);\n const onMove = (ev: MouseEvent) => this.#onDrag(ev.clientX);\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n this.#endDrag();\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n #onTouchStart = (e: TouchEvent): void => {\n const touch = e.touches[0];\n if (!touch) return;\n e.preventDefault();\n this.#startDrag(touch.clientX);\n const onMove = (ev: TouchEvent) => {\n const t = ev.touches[0];\n if (t) this.#onDrag(t.clientX);\n };\n const onEnd = () => {\n document.removeEventListener('touchmove', onMove);\n document.removeEventListener('touchend', onEnd);\n this.#endDrag();\n };\n document.addEventListener('touchmove', onMove, { passive: false });\n document.addEventListener('touchend', onEnd);\n };\n\n #startDrag(clientX: number): void {\n this.#dragging = true;\n this.#startX = clientX;\n this.#startWidth = this.#getCurrentWidth();\n this.setAttribute('data-ry-resizing', '');\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n #onDrag(clientX: number): void {\n if (!this.#dragging) return;\n // Dragging left increases sidebar width (sidebar is on the right)\n const delta = this.#startX - clientX;\n this.#setWidth(this.#startWidth + delta);\n }\n\n #endDrag(): void {\n this.#dragging = false;\n this.removeAttribute('data-ry-resizing');\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.#persist();\n this.emit('resize', { width: this.#getCurrentWidth() });\n }\n\n #onKeyDown = (e: KeyboardEvent): void => {\n const step = e.shiftKey ? 50 : 10;\n let width = this.#getCurrentWidth();\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.#setWidth(width + step); // Left grows sidebar\n this.#persist();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n this.#setWidth(width - step); // Right shrinks sidebar\n this.#persist();\n } else if (e.key === 'Home') {\n e.preventDefault();\n this.#setWidth(this.#getMinWidth());\n this.#persist();\n } else if (e.key === 'End') {\n e.preventDefault();\n this.#setWidth(this.#getMaxWidth());\n this.#persist();\n }\n };\n\n #onDoubleClick = (): void => {\n // Reset to default\n this.style.removeProperty('--ry-split-width');\n this.#clearPersist();\n this.emit('resize', { width: this.#getCurrentWidth() });\n };\n\n // Persistence\n #persistKey(): string | null {\n const key = this.getAttribute('persist');\n return key ? `ry-split:${key}` : null;\n }\n\n #persist(): void {\n const key = this.#persistKey();\n if (!key) return;\n try {\n localStorage.setItem(key, String(this.#getCurrentWidth()));\n } catch { /* storage full or unavailable */ }\n }\n\n #restore(): void {\n const key = this.#persistKey();\n if (!key) return;\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n const px = parseFloat(saved);\n if (!isNaN(px)) {\n this.style.setProperty('--ry-split-width', `${px}px`);\n }\n }\n } catch { /* storage unavailable */ }\n }\n\n #clearPersist(): void {\n const key = this.#persistKey();\n if (!key) return;\n try { localStorage.removeItem(key); } catch { /* */ }\n }\n}\n\ncustomElements.define('ry-split', RySplit);\n","/**\n * <ry-theme-toggle>\n *\n * Simple theme switcher button.\n * Cycles through available themes or toggles light/dark.\n *\n * Usage:\n * <ry-theme-toggle></ry-theme-toggle>\n * <ry-theme-toggle themes=\"light,dark,ocean\"></ry-theme-toggle>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface ThemeChangeDetail {\n theme: string;\n}\n\nexport class RyThemeToggle extends RyElement {\n #themes: string[] = ['light', 'dark'];\n #currentIndex = 0;\n\n setup(): void {\n // Parse themes attribute\n const themesAttr = this.getAttribute('themes');\n if (themesAttr) {\n this.#themes = themesAttr.split(',').map(t => t.trim());\n }\n\n // Get current theme\n const currentTheme = document.documentElement.dataset.ryTheme ?? 'light';\n this.#currentIndex = this.#themes.indexOf(currentTheme);\n if (this.#currentIndex === -1) this.#currentIndex = 0;\n\n // Add button if empty\n if (!this.innerHTML.trim()) {\n this.innerHTML = `<button data-ry-target=\"button\" class=\"ry-btn ry-btn--ghost\">${this.#getIcon()}</button>`;\n }\n\n // Bind click\n this.on(this, 'click', () => this.toggle());\n }\n\n #getIcon(): string {\n const theme = this.#themes[this.#currentIndex];\n switch (theme) {\n case 'dark':\n return '&#9790;'; // Moon\n case 'ocean':\n return '&#127754;'; // Wave\n default:\n return '&#9728;'; // Sun\n }\n }\n\n toggle(): void {\n this.#currentIndex = (this.#currentIndex + 1) % this.#themes.length;\n const newTheme = this.#themes[this.#currentIndex]!;\n\n document.documentElement.dataset.ryTheme = newTheme;\n\n // Update icon\n const btn = this.$('[data-ry-target=\"button\"]');\n if (btn) {\n btn.innerHTML = this.#getIcon();\n }\n\n this.emit<ThemeChangeDetail>('theme-change', { theme: newTheme });\n }\n\n get theme(): string {\n return this.#themes[this.#currentIndex] ?? 'light';\n }\n\n set theme(value: string) {\n const index = this.#themes.indexOf(value);\n if (index !== -1) {\n this.#currentIndex = index;\n document.documentElement.dataset.ryTheme = value;\n\n const btn = this.$('[data-ry-target=\"button\"]');\n if (btn) {\n btn.innerHTML = this.#getIcon();\n }\n }\n }\n}\n\ncustomElements.define('ry-theme-toggle', RyThemeToggle);\n","/**\n * <ry-card>\n *\n * Card container. CSS-only by default.\n * Add `interactive` attribute for clickable cards with href navigation.\n *\n * Usage:\n * <ry-card>Static content</ry-card>\n * <ry-card interactive href=\"/demos/goap\">Clickable card</ry-card>\n * <ry-card interactive>Emits ry:click on click</ry-card>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyCard extends RyElement {\n setup(): void {\n if (!this.hasAttribute('interactive')) return;\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n this.setAttribute('role', 'link');\n\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleClick = (e: MouseEvent): void => {\n // Ignore clicks on links/buttons inside the card\n const target = e.target as HTMLElement;\n if (target.closest('a, button, ry-button')) return;\n\n const href = this.getAttribute('href');\n if (href) {\n window.location.href = href;\n }\n this.emit('click', { originalEvent: e });\n };\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.click();\n }\n };\n}\n\ncustomElements.define('ry-card', RyCard);\n","/**\n * <ry-alert>\n *\n * Alert message component.\n *\n * Usage:\n * <ry-alert>Default info alert</ry-alert>\n * <ry-alert variant=\"success\">Success!</ry-alert>\n * <ry-alert variant=\"warning\" dismissible>Warning with close button</ry-alert>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyAlert extends RyElement {\n setup(): void {\n // Transform minimal markup\n this.#transformMarkup();\n\n // Dismissible (use [close] attribute)\n const closeBtn = this.$('[close]');\n if (closeBtn) {\n this.on(closeBtn, 'click', () => this.dismiss());\n }\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"content\"]')) return;\n\n const variant = this.getAttribute('variant') ?? 'info';\n const dismissible = this.hasAttribute('dismissible');\n const content = this.innerHTML;\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"content\" class=\"ry-alert__content\">${content}</div>\n ${dismissible ? '<button data-ry-target=\"close\" class=\"ry-alert__close\" close aria-label=\"Dismiss\">&times;</button>' : ''}\n `;\n\n this.setAttribute('role', 'alert');\n this.setAttribute('data-variant', variant);\n }\n\n dismiss(): void {\n this.state = 'closed';\n\n // Remove after animation\n setTimeout(() => {\n this.remove();\n }, 200);\n\n this.emit('close');\n }\n}\n\ncustomElements.define('ry-alert', RyAlert);\n","/**\n * <ry-field>\n *\n * Form field wrapper with label, error, and hint.\n *\n * Usage:\n * <ry-field label=\"Email\">\n * <input type=\"email\" placeholder=\"you@example.com\">\n * </ry-field>\n *\n * <ry-field label=\"Password\" hint=\"Min 8 characters\" error=\"Too short\">\n * <input type=\"password\">\n * </ry-field>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyField extends RyElement {\n static get observedAttributes(): string[] {\n return ['label', 'error', 'hint'];\n }\n\n setup(): void {\n this.#transformMarkup();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'error') {\n this.#updateError(newValue);\n } else if (name === 'hint') {\n this.#updateHint(newValue);\n } else if (name === 'label') {\n this.#updateLabel(newValue);\n }\n }\n\n #transformMarkup(): void {\n const input = this.$<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select');\n if (!input) return;\n\n // Generate ID if needed\n const inputId = input.id || `ry-field-${Math.random().toString(36).slice(2, 9)}`;\n input.id = inputId;\n\n // Label\n if (!this.$('[data-ry-target=\"label\"]')) {\n const labelText = this.getAttribute('label');\n if (labelText) {\n const label = document.createElement('label');\n label.setAttribute('data-ry-target', 'label');\n label.className = 'ry-label';\n label.setAttribute('for', inputId);\n label.textContent = labelText;\n this.insertBefore(label, input);\n }\n }\n\n // Error message (hidden by default via CSS when empty)\n if (!this.$('[data-ry-target=\"error\"]')) {\n const errorEl = document.createElement('div');\n errorEl.setAttribute('data-ry-target', 'error');\n errorEl.className = 'ry-field__error';\n errorEl.setAttribute('role', 'alert');\n const errorText = this.getAttribute('error');\n if (errorText) {\n errorEl.textContent = errorText;\n }\n input.insertAdjacentElement('afterend', errorEl);\n }\n\n // Hint text (hidden when error is visible)\n if (!this.$('[data-ry-target=\"hint\"]')) {\n const hintEl = document.createElement('div');\n hintEl.setAttribute('data-ry-target', 'hint');\n hintEl.className = 'ry-field__hint';\n const hintText = this.getAttribute('hint');\n if (hintText) {\n hintEl.textContent = hintText;\n }\n const errorEl = this.$('[data-ry-target=\"error\"]');\n if (errorEl) {\n errorEl.insertAdjacentElement('afterend', hintEl);\n } else {\n input.insertAdjacentElement('afterend', hintEl);\n }\n }\n\n // Link input to error via aria-describedby\n const errorEl = this.$('[data-ry-target=\"error\"]');\n const hintEl = this.$('[data-ry-target=\"hint\"]');\n const describedBy: string[] = [];\n if (errorEl) {\n errorEl.id = `${inputId}-error`;\n describedBy.push(errorEl.id);\n }\n if (hintEl) {\n hintEl.id = `${inputId}-hint`;\n describedBy.push(hintEl.id);\n }\n if (describedBy.length) {\n input.setAttribute('aria-describedby', describedBy.join(' '));\n }\n }\n\n #updateError(text: string | null): void {\n const el = this.$('[data-ry-target=\"error\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n // Toggle invalid state on the input\n const input = this.$<HTMLInputElement>('input, textarea, select');\n if (input) {\n if (text) {\n input.setAttribute('aria-invalid', 'true');\n } else {\n input.removeAttribute('aria-invalid');\n }\n }\n }\n\n #updateHint(text: string | null): void {\n const el = this.$('[data-ry-target=\"hint\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n }\n\n #updateLabel(text: string | null): void {\n const el = this.$('[data-ry-target=\"label\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n }\n}\n\ncustomElements.define('ry-field', RyField);\n","/**\n * <ry-switch>\n *\n * Toggle switch component.\n *\n * Usage:\n * <ry-switch name=\"darkMode\">Dark mode</ry-switch>\n * <ry-switch name=\"notifications\" checked>Enable notifications</ry-switch>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ChangeDetail } from '../types.js';\n\nlet switchIdCounter = 0;\n\nexport class RySwitch extends RyElement {\n #input: HTMLInputElement | null = null;\n\n static observedAttributes = ['checked', 'disabled'] as const;\n\n setup(): void {\n this.#transformMarkup();\n\n this.#input = this.$<HTMLInputElement>('input[type=\"checkbox\"]');\n if (this.#input) {\n this.on(this.#input, 'change', this.#handleChange);\n }\n\n // Keyboard support on the wrapper\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"track\"]')) return;\n\n const id = `ry-switch-${++switchIdCounter}`;\n const name = this.getAttribute('name') ?? '';\n const checked = this.hasAttribute('checked');\n const disabled = this.hasAttribute('disabled');\n const label = this.textContent?.trim() ?? '';\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <label data-ry-target=\"wrapper\" class=\"ry-switch__wrapper\" for=\"${id}\">\n <input\n type=\"checkbox\"\n id=\"${id}\"\n data-ry-target=\"input\"\n class=\"ry-switch__input\"\n ${name ? `name=\"${name}\"` : ''}\n ${checked ? 'checked' : ''}\n ${disabled ? 'disabled' : ''}\n role=\"switch\"\n aria-checked=\"${checked}\"\n >\n <span data-ry-target=\"track\" class=\"ry-switch__track\">\n <span data-ry-target=\"thumb\" class=\"ry-switch__thumb\"></span>\n </span>\n ${label ? `<span data-ry-target=\"label\" class=\"ry-switch__label\">${label}</span>` : ''}\n </label>\n `;\n }\n\n #handleChange = (): void => {\n if (!this.#input) return;\n\n const checked = this.#input.checked;\n this.#input.setAttribute('aria-checked', String(checked));\n\n if (checked) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n\n this.emit<ChangeDetail>('change', {\n value: String(checked),\n label: checked ? 'on' : 'off'\n });\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.#input?.click();\n }\n };\n\n get checked(): boolean {\n return this.#input?.checked ?? false;\n }\n\n set checked(value: boolean) {\n if (this.#input) {\n this.#input.checked = value;\n this.#input.setAttribute('aria-checked', String(value));\n\n if (value) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n }\n\n get value(): string {\n return this.#input?.value ?? '';\n }\n\n set value(val: string) {\n if (this.#input) {\n this.#input.value = val;\n }\n }\n}\n\ncustomElements.define('ry-switch', RySwitch);\n","/**\n * <ry-tooltip>\n *\n * Tooltip component that shows on hover/focus.\n *\n * Usage:\n * <ry-tooltip content=\"Save your changes\">\n * <ry-button>Save</ry-button>\n * </ry-tooltip>\n *\n * <ry-tooltip content=\"Delete item\" position=\"bottom\">\n * <ry-button variant=\"danger\">Delete</ry-button>\n * </ry-tooltip>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nlet tooltipIdCounter = 0;\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nexport class RyTooltip extends RyElement {\n #showTimeout: ReturnType<typeof setTimeout> | null = null;\n #tooltipEl: HTMLElement | null = null;\n #tooltipId: string | null = null;\n\n setup(): void {\n this.#tooltipId = `ry-tooltip-${++tooltipIdCounter}`;\n\n // Create tooltip element\n this.#createTooltip();\n\n // Find trigger (first child element)\n const trigger = this.firstElementChild;\n if (trigger) {\n // Set ARIA\n trigger.setAttribute('aria-describedby', this.#tooltipId);\n\n // Mouse events\n this.on(trigger, 'mouseenter', this.#scheduleShow);\n this.on(trigger, 'mouseleave', this.#hide);\n\n // Focus events\n this.on(trigger, 'focusin', this.#scheduleShow);\n this.on(trigger, 'focusout', this.#hide);\n }\n\n // Escape to hide\n this.on(document, 'keydown', this.#handleKeydown);\n }\n\n #createTooltip(): void {\n // data-ry-target for JS queries, class for CSS styling\n this.#tooltipEl = document.createElement('div');\n this.#tooltipEl.id = this.#tooltipId!;\n this.#tooltipEl.setAttribute('data-ry-target', 'content');\n this.#tooltipEl.className = 'ry-tooltip__content';\n this.#tooltipEl.setAttribute('role', 'tooltip');\n this.#tooltipEl.textContent = this.getAttribute('content') ?? '';\n this.appendChild(this.#tooltipEl);\n }\n\n #scheduleShow = (): void => {\n // Clear any pending hide\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n }\n\n // Delay show by 200ms\n this.#showTimeout = setTimeout(() => {\n this.#show();\n }, 200);\n };\n\n #show = (): void => {\n const position = (this.getAttribute('position') ?? 'top') as TooltipPosition;\n this.setAttribute('data-ry-position', position);\n this.state = 'open';\n // Positioning handled by CSS via data-ry-position attribute\n };\n\n #hide = (): void => {\n // Clear pending show\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n this.#showTimeout = null;\n }\n\n this.state = 'closed';\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.#hide();\n }\n };\n\n teardown(): void {\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n }\n }\n}\n\ncustomElements.define('ry-tooltip', RyTooltip);\n","/**\n * <ry-drawer>\n *\n * Slide-out drawer/panel component.\n *\n * Usage:\n * <ry-button drawer=\"menu\">Open Menu</ry-button>\n * <ry-drawer id=\"menu\" side=\"left\">\n * <h2>Menu</h2>\n * <nav>...</nav>\n * </ry-drawer>\n *\n * Attributes:\n * - id: Required for trigger binding\n * - side: left (default), right, bottom\n * - open: Initially open\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyDrawer extends RyElement {\n #previouslyFocused: Element | null = null;\n #scrollbarWidth = 0;\n\n setup(): void {\n this.#transformMarkup();\n\n // Find trigger buttons anywhere in document\n const drawerId = this.id;\n if (drawerId) {\n // drawer=\"id\" attribute on ry-button\n document.querySelectorAll<HTMLElement>(`ry-button[drawer=\"${drawerId}\"], [drawer=\"${drawerId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n }\n\n // Close buttons inside drawer (use [close] attribute)\n this.$$('[close]').forEach(closeBtn => {\n this.on(closeBtn, 'click', () => this.close());\n });\n\n // Backdrop click\n const backdrop = this.$('[data-ry-target=\"backdrop\"]');\n if (backdrop) {\n this.on(backdrop, 'click', () => this.close());\n }\n\n // Escape key\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Calculate scrollbar width\n this.#scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n // Initialize state\n if (this.hasAttribute('open')) {\n this.state = 'open';\n } else if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n }\n\n #transformMarkup(): void {\n // Check if already has full markup\n if (this.$('[data-ry-target=\"panel\"]')) return;\n\n const side = this.getAttribute('side') ?? 'left';\n const content = this.innerHTML;\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"backdrop\" class=\"ry-drawer__backdrop\"></div>\n <div data-ry-target=\"panel\" class=\"ry-drawer__panel\" role=\"dialog\" aria-modal=\"true\" data-ry-side=\"${side}\">\n <button data-ry-target=\"close\" class=\"ry-drawer__close\" close aria-label=\"Close\">&times;</button>\n <div data-ry-target=\"content\" class=\"ry-drawer__content\">\n ${content}\n </div>\n </div>\n `;\n\n // Set side attribute for CSS\n this.setAttribute('data-ry-side', side);\n }\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n // Store currently focused element\n this.#previouslyFocused = document.activeElement;\n\n // Lock body scroll via data attribute (CSS handles the style)\n document.body.setAttribute('data-ry-scroll-lock', '');\n document.body.style.setProperty('--ry-scrollbar-width', `${this.#scrollbarWidth}px`);\n\n // Open drawer\n this.state = 'open';\n\n // Trap focus\n const panel = this.$<HTMLElement>('[data-ry-target=\"panel\"]');\n if (panel) {\n this.nextFrame().then(() => {\n this.trapFocus(panel);\n });\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n // Unlock body scroll\n document.body.removeAttribute('data-ry-scroll-lock');\n document.body.style.removeProperty('--ry-scrollbar-width');\n\n // Close drawer\n this.state = 'closed';\n\n // Restore focus\n if (this.#previouslyFocused instanceof HTMLElement) {\n this.#previouslyFocused.focus();\n this.#previouslyFocused = null;\n }\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-drawer', RyDrawer);\n","/**\n * <ry-toast>\n *\n * Toast notification component with static API.\n *\n * Usage (declarative):\n * <ry-toast variant=\"success\">Saved successfully!</ry-toast>\n *\n * Usage (programmatic):\n * RyToast.success('Saved!');\n * RyToast.error('Failed to save');\n * RyToast.info('Processing...');\n * RyToast.warning('Are you sure?');\n *\n * JS and structure CSS use data-ry-target, theme CSS uses classes.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ToastVariant, ToastOptions } from '../types.js';\n\nconst DEFAULT_DURATION = 4000;\n\nexport class RyToast extends RyElement {\n #timeout: ReturnType<typeof setTimeout> | null = null;\n\n static observedAttributes = ['variant', 'duration'] as const;\n\n // Static container for programmatic toasts\n static #container: HTMLElement | null = null;\n\n static #getContainer(): HTMLElement {\n if (!RyToast.#container) {\n RyToast.#container = document.createElement('div');\n RyToast.#container.setAttribute('data-ry-target', 'toast-container');\n RyToast.#container.className = 'ry-toast-container'; // Keep for theme CSS\n document.body.appendChild(RyToast.#container);\n }\n return RyToast.#container;\n }\n\n // Static API\n static show(options: ToastOptions): RyToast {\n const toast = document.createElement('ry-toast') as RyToast;\n toast.textContent = options.message;\n\n if (options.variant) {\n toast.setAttribute('variant', options.variant);\n }\n if (options.duration !== undefined) {\n toast.setAttribute('duration', String(options.duration));\n }\n\n RyToast.#getContainer().appendChild(toast);\n return toast;\n }\n\n static success(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'success', duration });\n }\n\n static error(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'error', duration });\n }\n\n static info(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'info', duration });\n }\n\n static warning(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'warning', duration });\n }\n\n setup(): void {\n this.#transformMarkup();\n\n // Close button (use [close] attribute)\n const closeBtn = this.$('[close]');\n if (closeBtn) {\n this.on(closeBtn, 'click', () => this.dismiss());\n }\n\n // Auto-dismiss\n const duration = parseInt(this.getAttribute('duration') ?? String(DEFAULT_DURATION), 10);\n if (duration > 0) {\n this.#timeout = setTimeout(() => this.dismiss(), duration);\n }\n\n // Animate in (CSS expects 'visible' state)\n requestAnimationFrame(() => {\n this.state = 'visible';\n });\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"content\"]')) return;\n\n const variant = this.getAttribute('variant') ?? 'info';\n const message = this.textContent?.trim() ?? '';\n\n const icon = this.#getIcon(variant as ToastVariant);\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"icon\" class=\"ry-toast__icon\">${icon}</div>\n <div data-ry-target=\"content\" class=\"ry-toast__content\">${message}</div>\n <button data-ry-target=\"close\" class=\"ry-toast__close\" close aria-label=\"Dismiss\">&times;</button>\n `;\n }\n\n #getIcon(variant: ToastVariant): string {\n const icons: Record<ToastVariant, string> = {\n info: 'ℹ',\n success: '✓',\n warning: '⚠',\n error: '✕'\n };\n return icons[variant] ?? icons.info;\n }\n\n dismiss(): void {\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n this.#timeout = null;\n }\n\n this.state = 'hiding';\n\n // Remove after animation\n setTimeout(() => {\n this.remove();\n }, 300);\n\n this.emit('close');\n }\n\n teardown(): void {\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n}\n\ncustomElements.define('ry-toast', RyToast);\n","/**\n * ry-ui Icon Registry\n *\n * System icons used by ry-ui components.\n * Users can override any icon by calling registerIcon() or registerIcons().\n *\n * Usage:\n * import { getIcon, registerIcon } from 'ry-ui';\n *\n * // Get an icon\n * const svg = getIcon('close');\n *\n * // Override a system icon\n * registerIcon('close', '<svg>...custom...</svg>');\n *\n * // Override multiple icons\n * registerIcons({\n * 'close': '<svg>...</svg>',\n * 'check': '<svg>...</svg>',\n * });\n */\n\n// Default system icons (24x24, stroke-based, currentColor)\nconst icons: Record<string, string> = {\n // Close / X\n 'close': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18\"/><path d=\"M6 6l12 12\"/></svg>`,\n\n // Chevron down\n 'chevron-down': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>`,\n\n // Chevron up\n 'chevron-up': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 15l-6-6-6 6\"/></svg>`,\n\n // Chevron right\n 'chevron-right': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>`,\n\n // Chevron left\n 'chevron-left': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>`,\n\n // Check / Checkmark\n 'check': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>`,\n\n // Copy\n 'copy': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"/></svg>`,\n\n // Sun (light mode)\n 'sun': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"M4.93 4.93l1.41 1.41\"/><path d=\"M17.66 17.66l1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"M6.34 17.66l-1.41 1.41\"/><path d=\"M19.07 4.93l-1.41 1.41\"/></svg>`,\n\n // Moon (dark mode)\n 'moon': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z\"/></svg>`,\n\n // Info\n 'info': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n\n // Warning / Alert triangle\n 'warning': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n\n // Error / X circle\n 'error': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M15 9l-6 6\"/><path d=\"M9 9l6 6\"/></svg>`,\n\n // Success / Check circle\n 'success': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9 12l2 2 4-4\"/></svg>`,\n\n // Search\n 'search': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>`,\n\n // Menu / Hamburger\n 'menu': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12h18\"/><path d=\"M3 6h18\"/><path d=\"M3 18h18\"/></svg>`,\n\n // Plus\n 'plus': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>`,\n\n // Minus\n 'minus': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/></svg>`,\n\n // Settings / Gear\n 'settings': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z\"/></svg>`,\n\n // User\n 'user': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`,\n\n // Heart\n 'heart': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z\"/></svg>`,\n\n // Star\n 'star': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`,\n\n // Trash\n 'trash': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\"/></svg>`,\n\n // Edit / Pencil\n 'edit': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n\n // External link\n 'external-link': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>`,\n\n // Download\n 'download': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>`,\n\n // Upload\n 'upload': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n\n // Folder (closed)\n 'folder': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\"/></svg>`,\n\n // Folder open\n 'folder-open': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\"/><path d=\"M2 10h20\"/></svg>`,\n\n // File\n 'file': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`,\n\n // Gradient: solid color\n 'gradient-solid': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"/></svg>`,\n\n // Gradient: linear\n 'gradient-linear': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"3\"/><line x1=\"3\" y1=\"15\" x2=\"15\" y2=\"3\"/><line x1=\"9\" y1=\"21\" x2=\"21\" y2=\"9\"/></svg>`,\n\n // Gradient: radial\n 'gradient-radial': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/><circle cx=\"12\" cy=\"12\" r=\"6.5\"/></svg>`,\n\n // Shape: circle\n 'shape-circle': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/></svg>`,\n\n // Shape: ellipse\n 'shape-ellipse': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"6\"/></svg>`,\n};\n\n/**\n * Get an icon SVG string by name\n */\nexport function getIcon(name: string): string {\n return icons[name] ?? '';\n}\n\n/**\n * Register or override a single icon\n */\nexport function registerIcon(name: string, svg: string): void {\n icons[name] = svg;\n}\n\n/**\n * Register or override multiple icons at once\n */\nexport function registerIcons(newIcons: Record<string, string>): void {\n Object.assign(icons, newIcons);\n}\n\n/**\n * Get all registered icon names\n */\nexport function getIconNames(): string[] {\n return Object.keys(icons);\n}\n","/**\n * <ry-select>\n *\n * Custom select dropdown component with optional multi-select.\n *\n * Usage:\n * <ry-select placeholder=\"Choose country\" name=\"country\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * <ry-option value=\"ca\" disabled>Canada</ry-option>\n * </ry-select>\n *\n * Multi-select:\n * <ry-select multiple clearable placeholder=\"Choose...\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * </ry-select>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\nimport type { SelectOption, ChangeDetail } from '../types.js';\n\nlet selectIdCounter = 0;\n\nexport class RySelect extends RyElement {\n #selectId: string | null = null;\n #highlightedIndex = -1;\n #typeahead = '';\n #typeaheadTimeout: ReturnType<typeof setTimeout> | null = null;\n #selectedValues: Set<string> = new Set();\n\n // Store options reference\n _options: SelectOption[] = [];\n\n get #isMultiple(): boolean {\n return this.hasAttribute('multiple');\n }\n\n static observedAttributes = ['value', 'disabled'] as const;\n\n setup(): void {\n this.#selectId = `ry-select-${++selectIdCounter}`;\n this.#transformMarkup();\n\n // Make focusable\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n // Events\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n this.on(document, 'click', this.#handleOutsideClick);\n\n // Listen for tag removal in multi-select\n if (this.#isMultiple) {\n this.on(this, 'ry:remove', this.#handleTagRemove as EventListener);\n }\n\n // Initialize state\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n\n // Set initial value\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n if (this.#isMultiple) {\n for (const v of initialValue.split(',').map(s => s.trim()).filter(Boolean)) {\n this.#toggleMultiOption(v);\n }\n } else {\n this.value = initialValue;\n }\n }\n }\n\n #transformMarkup(): void {\n // Collect options from ry-option children\n const options: SelectOption[] = [...this.querySelectorAll('ry-option')].map(opt => ({\n value: opt.getAttribute('value') ?? opt.textContent?.trim() ?? '',\n label: opt.textContent?.trim() ?? '',\n disabled: opt.hasAttribute('disabled')\n }));\n\n const placeholder = this.getAttribute('placeholder') ?? 'Select...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n const isMultiple = this.#isMultiple;\n\n // Build native select for form submission\n const nativeOptions = options.map(opt =>\n `<option value=\"${opt.value}\"${opt.disabled ? ' disabled' : ''}>${opt.label}</option>`\n ).join('');\n\n // Build custom dropdown with checkmarks for multi-select\n const listboxOptions = options.map((opt, i) => `\n <div data-ry-target=\"option\" class=\"ry-select__option\"\n role=\"option\"\n id=\"${this.#selectId}-option-${i}\"\n data-value=\"${opt.value}\"\n ${opt.disabled ? 'data-disabled' : ''}\n aria-disabled=\"${opt.disabled}\">\n ${isMultiple ? `<span data-ry-target=\"check\" class=\"ry-select__check\">${getIcon('check')}</span>` : ''}\n <span class=\"ry-select__option-label\">${opt.label}</span>\n </div>\n `).join('');\n\n if (isMultiple) {\n const clearable = this.hasAttribute('clearable');\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-select__trigger ry-select__trigger--multi\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n <div data-ry-target=\"tags\" class=\"ry-select__tags\"></div>\n <span data-ry-target=\"value\" class=\"ry-select__value\">${placeholder}</span>\n ${clearable ? `<button data-ry-target=\"clear\" class=\"ry-select__clear\" aria-label=\"Clear all\" type=\"button\">${getIcon('close')}</button>` : ''}\n <span data-ry-target=\"arrow\" class=\"ry-select__arrow\">▾</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-select__dropdown\" role=\"listbox\" id=\"${this.#selectId}-listbox\" tabindex=\"-1\" aria-multiselectable=\"true\">\n ${listboxOptions}\n </div>\n <select data-ry-target=\"native\" class=\"ry-select__native\" ${name ? `name=\"${name}\"` : ''} multiple tabindex=\"-1\" aria-hidden=\"true\" ${disabled ? 'disabled' : ''}>\n ${nativeOptions}\n </select>\n `;\n\n // Clear button\n const clearBtn = this.$('[data-ry-target=\"clear\"]');\n if (clearBtn) {\n this.on(clearBtn, 'click', (e: MouseEvent) => {\n e.stopPropagation();\n this.#clearAll();\n });\n }\n } else {\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-select__trigger\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n <span data-ry-target=\"value\" class=\"ry-select__value\">${placeholder}</span>\n <span data-ry-target=\"arrow\" class=\"ry-select__arrow\">▾</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-select__dropdown\" role=\"listbox\" id=\"${this.#selectId}-listbox\" tabindex=\"-1\">\n ${listboxOptions}\n </div>\n <select data-ry-target=\"native\" class=\"ry-select__native\" ${name ? `name=\"${name}\"` : ''} tabindex=\"-1\" aria-hidden=\"true\" ${disabled ? 'disabled' : ''}>\n <option value=\"\">${placeholder}</option>\n ${nativeOptions}\n </select>\n `;\n }\n\n // Store options reference\n this._options = options;\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const target = event.target as Element;\n const option = target.closest('[data-ry-target=\"option\"]');\n if (option instanceof HTMLElement && !option.hasAttribute('data-disabled')) {\n if (this.#isMultiple) {\n const val = option.dataset.value ?? '';\n this.#toggleMultiOption(val);\n // Don't close in multi-select\n } else {\n this.#selectOption(option);\n this.close();\n }\n return;\n }\n\n const trigger = target.closest('[data-ry-target=\"trigger\"]');\n if (trigger) {\n this.toggle();\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const isOpen = this.state === 'open';\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (isOpen && this.#highlightedIndex >= 0) {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const option = options[this.#highlightedIndex];\n if (option) {\n if (this.#isMultiple) {\n const val = option.dataset.value ?? '';\n this.#toggleMultiOption(val);\n } else {\n this.#selectOption(option);\n this.close();\n }\n }\n } else {\n this.toggle();\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n this.close();\n }\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n this.open();\n } else {\n this.#highlightNext();\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.#highlightPrev();\n }\n break;\n\n case 'Home':\n if (isOpen) {\n event.preventDefault();\n this.#highlightFirst();\n }\n break;\n\n case 'End':\n if (isOpen) {\n event.preventDefault();\n this.#highlightLast();\n }\n break;\n\n case 'Backspace':\n if (this.#isMultiple && this.#selectedValues.size > 0) {\n const vals = [...this.#selectedValues];\n const last = vals[vals.length - 1];\n if (last) {\n this.#toggleMultiOption(last);\n }\n }\n break;\n\n default:\n // Typeahead\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.#handleTypeahead(event.key);\n }\n break;\n }\n };\n\n #handleOutsideClick = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (!this.contains(target) && this.state === 'open') {\n this.close();\n }\n };\n\n #handleTagRemove = (e: CustomEvent): void => {\n const value = (e.detail as { value: string }).value;\n if (this.#selectedValues.has(value)) {\n this.#toggleMultiOption(value);\n }\n };\n\n #handleTypeahead(char: string): void {\n // Clear timeout\n if (this.#typeaheadTimeout) {\n clearTimeout(this.#typeaheadTimeout);\n }\n\n this.#typeahead += char.toLowerCase();\n\n // Find matching option\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const match = options.findIndex(opt =>\n opt.textContent?.trim().toLowerCase().startsWith(this.#typeahead)\n );\n\n if (match >= 0) {\n if (this.state === 'open') {\n this.#highlightIndex(match);\n } else if (!this.#isMultiple) {\n const option = options[match];\n if (option) {\n this.#selectOption(option);\n }\n }\n }\n\n // Clear typeahead after 500ms\n this.#typeaheadTimeout = setTimeout(() => {\n this.#typeahead = '';\n }, 500);\n }\n\n #highlightIndex(index: number): void {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n if (index < 0 || index >= options.length) return;\n\n // Remove previous highlight\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n\n // Add new highlight\n const option = options[index];\n if (!option) return;\n\n option.setAttribute('data-highlighted', '');\n option.scrollIntoView({ block: 'nearest' });\n this.#highlightedIndex = index;\n\n // Update aria-activedescendant\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-activedescendant', option.id);\n }\n }\n\n #highlightNext(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([data-disabled])');\n const next = Math.min(this.#highlightedIndex + 1, options.length - 1);\n this.#highlightIndex(next);\n }\n\n #highlightPrev(): void {\n const prev = Math.max(this.#highlightedIndex - 1, 0);\n this.#highlightIndex(prev);\n }\n\n #highlightFirst(): void {\n this.#highlightIndex(0);\n }\n\n #highlightLast(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([data-disabled])');\n this.#highlightIndex(options.length - 1);\n }\n\n // --- Multi-select methods ---\n\n #toggleMultiOption(val: string): void {\n const maxSelections = this.getAttribute('max-selections');\n if (this.#selectedValues.has(val)) {\n this.#selectedValues.delete(val);\n } else {\n if (maxSelections && this.#selectedValues.size >= parseInt(maxSelections, 10)) return;\n this.#selectedValues.add(val);\n }\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', [...this.#selectedValues].join(','));\n this.emit<ChangeDetail>('change', { value: this.value, label: '' });\n }\n\n #renderTags(): void {\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n const valueEl = this.$('[data-ry-target=\"value\"]');\n if (!tagsContainer) return;\n\n tagsContainer.innerHTML = '';\n for (const val of this.#selectedValues) {\n const opt = this._options.find(o => o.value === val);\n if (!opt) continue;\n const tag = document.createElement('ry-tag');\n tag.setAttribute('removable', '');\n tag.setAttribute('size', 'sm');\n tag.setAttribute('data-value', val);\n tag.textContent = opt.label;\n tagsContainer.appendChild(tag);\n }\n\n // Show/hide placeholder\n if (valueEl) {\n if (this.#selectedValues.size > 0) {\n (valueEl as HTMLElement).style.display = 'none';\n } else {\n (valueEl as HTMLElement).style.display = '';\n }\n }\n }\n\n #syncMultiNative(): void {\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (!nativeSelect) return;\n for (const opt of nativeSelect.options) {\n opt.selected = this.#selectedValues.has(opt.value);\n }\n }\n\n #updateMultiCheckmarks(): void {\n this.$$('[data-ry-target=\"option\"]').forEach(optEl => {\n const val = (optEl as HTMLElement).dataset.value ?? '';\n if (this.#selectedValues.has(val)) {\n optEl.setAttribute('aria-selected', 'true');\n } else {\n optEl.removeAttribute('aria-selected');\n }\n });\n }\n\n #clearAll(): void {\n this.#selectedValues.clear();\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', '');\n this.emit<ChangeDetail>('change', { value: '', label: '' });\n }\n\n // --- Single-select method ---\n\n #selectOption(optionEl: HTMLElement): void {\n const value = optionEl.dataset.value ?? '';\n const label = optionEl.textContent?.trim() ?? '';\n\n // Update display\n const valueEl = this.$('[data-ry-target=\"value\"]');\n if (valueEl) {\n valueEl.textContent = label;\n valueEl.setAttribute('data-selected', '');\n }\n\n // Update native select\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (nativeSelect) {\n nativeSelect.value = value;\n }\n\n // Update attribute\n this.setAttribute('value', value);\n\n // Update selected state\n this.$$('[data-ry-target=\"option\"]').forEach(opt => {\n opt.removeAttribute('aria-selected');\n });\n optionEl.setAttribute('aria-selected', 'true');\n\n this.emit<ChangeDetail>('change', { value, label });\n }\n\n open(): void {\n if (this.state === 'open') return;\n\n this.state = 'open';\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-expanded', 'true');\n }\n\n // Smart positioning: flip to top if would go off screen\n this.#positionDropdown();\n\n // Highlight current value or first option\n if (!this.#isMultiple) {\n const currentValue = this.getAttribute('value');\n if (currentValue) {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const index = options.findIndex(opt => opt.dataset.value === currentValue);\n if (index >= 0) {\n this.#highlightIndex(index);\n }\n } else {\n this.#highlightIndex(0);\n }\n } else {\n this.#highlightIndex(0);\n }\n\n this.emit('open');\n }\n\n #positionDropdown(): void {\n const dropdown = this.$('[data-ry-target=\"dropdown\"]');\n if (!dropdown) return;\n\n // Reset position\n this.removeAttribute('data-ry-position');\n\n // Check if dropdown would go off bottom of screen\n const rect = this.getBoundingClientRect();\n const dropdownHeight = (dropdown as HTMLElement).scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n // If not enough space below but more space above, flip to top\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n }\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n this.state = 'closed';\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-expanded', 'false');\n }\n\n // Clear highlight\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n this.#highlightedIndex = -1;\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n\n get value(): string {\n if (this.#isMultiple) {\n return [...this.#selectedValues].join(',');\n }\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n if (this.#isMultiple) {\n this.#selectedValues.clear();\n for (const v of val.split(',').map(s => s.trim()).filter(Boolean)) {\n this.#selectedValues.add(v);\n }\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', val);\n } else {\n const option = this.$<HTMLElement>(`[data-ry-target=\"option\"][data-value=\"${val}\"]`);\n if (option) {\n this.#selectOption(option);\n }\n }\n }\n\n get values(): string[] {\n return [...this.#selectedValues];\n }\n\n teardown(): void {\n if (this.#typeaheadTimeout) {\n clearTimeout(this.#typeaheadTimeout);\n }\n }\n}\n\n// Register placeholder element\nclass RyOption extends HTMLElement {}\ncustomElements.define('ry-option', RyOption);\n\ncustomElements.define('ry-select', RySelect);\n","/**\n * <ry-combobox>\n *\n * Searchable dropdown with text input filtering.\n *\n * Usage:\n * <ry-combobox placeholder=\"Search countries...\" name=\"country\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * </ry-combobox>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { SelectOption, ChangeDetail } from '../types.js';\n\nlet comboboxIdCounter = 0;\n\nexport class RyCombobox extends RyElement {\n #comboboxId: string | null = null;\n #highlightedIndex = -1;\n #options: SelectOption[] = [];\n\n static observedAttributes = ['value', 'disabled'] as const;\n\n setup(): void {\n this.#comboboxId = `ry-combobox-${++comboboxIdCounter}`;\n this.#transformMarkup();\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n\n if (input) {\n this.on(input, 'input', this.#handleInputEvent);\n this.on(input, 'focus', this.#handleFocus);\n }\n\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n this.on(document, 'click', this.#handleOutsideClick);\n\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n this.value = initialValue;\n }\n }\n\n #transformMarkup(): void {\n const options: SelectOption[] = [...this.querySelectorAll('ry-option')].map(opt => ({\n value: opt.getAttribute('value') ?? opt.textContent?.trim() ?? '',\n label: opt.textContent?.trim() ?? '',\n disabled: opt.hasAttribute('disabled')\n }));\n\n const placeholder = this.getAttribute('placeholder') ?? 'Search...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n\n const nativeOptions = options.map(opt =>\n `<option value=\"${opt.value}\"${opt.disabled ? ' disabled' : ''}>${opt.label}</option>`\n ).join('');\n\n const listboxOptions = options.map((opt, i) => `\n <div data-ry-target=\"option\" class=\"ry-combobox__option\"\n role=\"option\"\n id=\"${this.#comboboxId}-option-${i}\"\n data-value=\"${opt.value}\"\n ${opt.disabled ? 'data-disabled' : ''}\n aria-disabled=\"${opt.disabled}\">\n ${opt.label}\n </div>\n `).join('');\n\n this.innerHTML = `\n <div data-ry-target=\"input-wrapper\" class=\"ry-combobox__input-wrapper\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-haspopup=\"listbox\"\n aria-owns=\"${this.#comboboxId}-listbox\">\n <input data-ry-target=\"input\" class=\"ry-combobox__input\"\n type=\"text\"\n placeholder=\"${placeholder}\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls=\"${this.#comboboxId}-listbox\"\n ${disabled ? 'disabled' : ''}>\n <span data-ry-target=\"arrow\" class=\"ry-combobox__arrow\">&#9662;</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-combobox__dropdown\"\n role=\"listbox\"\n id=\"${this.#comboboxId}-listbox\"\n tabindex=\"-1\">\n ${listboxOptions}\n <div data-ry-target=\"empty\" class=\"ry-combobox__empty\" hidden>\n No results\n </div>\n </div>\n <select data-ry-target=\"native\" class=\"ry-combobox__native\"\n ${name ? `name=\"${name}\"` : ''}\n tabindex=\"-1\" aria-hidden=\"true\"\n ${disabled ? 'disabled' : ''}>\n <option value=\"\">${placeholder}</option>\n ${nativeOptions}\n </select>\n `;\n\n this.#options = options;\n }\n\n #handleInputEvent = (): void => {\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (!input) return;\n\n const query = input.value.trim();\n this.#filterOptions(query);\n\n if (this.state !== 'open') {\n this.open();\n }\n\n this.emit('input', { value: query });\n };\n\n #filterOptions(query: string): void {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]');\n const lowerQuery = query.toLowerCase();\n let visibleCount = 0;\n\n options.forEach(opt => {\n const label = opt.textContent?.trim().toLowerCase() ?? '';\n const matches = !query || label.includes(lowerQuery);\n if (matches && !opt.hasAttribute('data-disabled')) {\n opt.removeAttribute('hidden');\n visibleCount++;\n } else {\n opt.setAttribute('hidden', '');\n }\n });\n\n const emptyEl = this.$('[data-ry-target=\"empty\"]');\n if (emptyEl) {\n if (visibleCount === 0) {\n emptyEl.removeAttribute('hidden');\n } else {\n emptyEl.setAttribute('hidden', '');\n }\n }\n\n this.#highlightedIndex = -1;\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const target = event.target as Element;\n const option = target.closest('[data-ry-target=\"option\"]');\n if (option instanceof HTMLElement && !option.hasAttribute('data-disabled')) {\n this.#selectOption(option);\n return;\n }\n\n const arrow = target.closest('[data-ry-target=\"arrow\"]');\n if (arrow) {\n this.toggle();\n return;\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (this.hasAttribute('disabled')) return;\n const isOpen = this.state === 'open';\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n this.open();\n } else {\n this.#highlightNext();\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.#highlightPrev();\n }\n break;\n\n case 'Enter':\n if (isOpen && this.#highlightedIndex >= 0) {\n event.preventDefault();\n const visibleOptions = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n const option = visibleOptions[this.#highlightedIndex];\n if (option) {\n this.#selectOption(option);\n }\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n this.close();\n }\n break;\n\n case 'Tab':\n if (isOpen) {\n this.close();\n }\n break;\n }\n };\n\n #handleOutsideClick = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (!this.contains(target) && this.state === 'open') {\n this.close();\n }\n };\n\n #handleFocus = (): void => {\n if (this.hasAttribute('disabled')) return;\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input && input.value) {\n input.select();\n }\n\n this.open();\n };\n\n #selectOption(optionEl: HTMLElement): void {\n const value = optionEl.dataset.value ?? '';\n const label = optionEl.textContent?.trim() ?? '';\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) {\n input.value = label;\n }\n\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (nativeSelect) {\n nativeSelect.value = value;\n }\n\n this.setAttribute('value', value);\n\n this.$$('[data-ry-target=\"option\"]').forEach(opt => {\n opt.removeAttribute('aria-selected');\n });\n optionEl.setAttribute('aria-selected', 'true');\n\n this.close();\n this.emit<ChangeDetail>('change', { value, label });\n }\n\n #highlightIndex(index: number): void {\n const options = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n if (index < 0 || index >= options.length) return;\n\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n\n const option = options[index];\n if (!option) return;\n\n option.setAttribute('data-highlighted', '');\n option.scrollIntoView({ block: 'nearest' });\n this.#highlightedIndex = index;\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-activedescendant', option.id);\n }\n }\n\n #highlightNext(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])');\n const next = Math.min(this.#highlightedIndex + 1, options.length - 1);\n this.#highlightIndex(next);\n }\n\n #highlightPrev(): void {\n const prev = Math.max(this.#highlightedIndex - 1, 0);\n this.#highlightIndex(prev);\n }\n\n #positionDropdown(): void {\n const dropdown = this.$('[data-ry-target=\"dropdown\"]');\n if (!dropdown) return;\n\n this.removeAttribute('data-ry-position');\n\n const rect = this.getBoundingClientRect();\n const dropdownHeight = (dropdown as HTMLElement).scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n }\n }\n\n open(): void {\n if (this.state === 'open') return;\n\n this.state = 'open';\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-expanded', 'true');\n }\n\n // Show all options on open (clear filter)\n this.$$<HTMLElement>('[data-ry-target=\"option\"]').forEach(opt => {\n if (!opt.hasAttribute('data-disabled')) {\n opt.removeAttribute('hidden');\n }\n });\n const emptyEl = this.$('[data-ry-target=\"empty\"]');\n if (emptyEl) {\n emptyEl.setAttribute('hidden', '');\n }\n\n this.#positionDropdown();\n\n // Highlight current value if set\n const currentValue = this.getAttribute('value');\n if (currentValue) {\n const options = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n const index = options.findIndex(opt => opt.dataset.value === currentValue);\n if (index >= 0) {\n this.#highlightIndex(index);\n }\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n this.state = 'closed';\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-expanded', 'false');\n wrapper.removeAttribute('aria-activedescendant');\n }\n\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n this.#highlightedIndex = -1;\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n const option = this.$<HTMLElement>(`[data-ry-target=\"option\"][data-value=\"${val}\"]`);\n if (option) {\n this.#selectOption(option);\n }\n }\n}\n\ncustomElements.define('ry-combobox', RyCombobox);\n","/**\n * <ry-code>\n *\n * Code display component with syntax highlighting.\n *\n * Usage:\n * <ry-code language=\"css\" title=\"styles.css\">\n * .button {\n * background: #3b82f6;\n * border-radius: 8px;\n * }\n * </ry-code>\n *\n * Attributes:\n * - language: css | js | html | json (for syntax highlighting)\n * - title: optional title shown in header\n * - line-numbers: show line numbers\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\ntype Language = 'css' | 'js' | 'javascript' | 'html' | 'json' | 'text';\n\ninterface Token {\n type: 'keyword' | 'property' | 'value' | 'string' | 'number' | 'comment' | 'selector' | 'punctuation' | 'tag' | 'attribute' | 'text' | 'color';\n value: string;\n color?: string;\n}\n\nexport class RyCode extends RyElement {\n #originalContent = '';\n\n static get observedAttributes(): string[] {\n return ['language', 'title', 'line-numbers'];\n }\n\n setup(): void {\n // Check for template first (preserves raw HTML content)\n const template = this.querySelector('template');\n if (template) {\n this.#originalContent = this.#trimIndent(template.innerHTML);\n } else {\n // Fall back to textContent (works for non-HTML code)\n this.#originalContent = this.textContent?.trim() ?? '';\n }\n\n // Build the component structure\n this.#render();\n\n // Add copy button handler\n const copyBtn = this.$<HTMLButtonElement>('[data-ry-target=\"copy\"]');\n if (copyBtn) {\n this.on(copyBtn, 'click', this.#handleCopy);\n }\n }\n\n #render(): void {\n const language = this.getAttribute('language') ?? 'text';\n const title = this.getAttribute('title') ?? language.toUpperCase();\n const showLineNumbers = this.hasAttribute('line-numbers');\n\n const highlighted = this.#highlight(this.#originalContent, language as Language);\n const lines = highlighted.split('\\n');\n\n this.innerHTML = `\n <div data-ry-target=\"header\" class=\"ry-code__header\">\n <span data-ry-target=\"title\" class=\"ry-code__title\">${title}</span>\n <button data-ry-target=\"copy\" class=\"ry-code__copy\" type=\"button\" aria-label=\"Copy code\">\n ${getIcon('copy')}\n </button>\n </div>\n <div data-ry-target=\"content\" class=\"ry-code__content\">\n <pre data-ry-target=\"pre\" class=\"ry-code__pre\"><code data-ry-target=\"code\" class=\"ry-code__code\">${\n showLineNumbers\n ? lines.map((line, i) => `<span class=\"ry-code__line\"><span class=\"ry-code__line-number\">${i + 1}</span><span class=\"ry-code__line-content\">${line || ' '}</span></span>`).join('')\n : highlighted\n }</code></pre>\n </div>\n `;\n }\n\n #handleCopy = async (): Promise<void> => {\n const copyBtn = this.$<HTMLButtonElement>('[data-ry-target=\"copy\"]');\n if (!copyBtn) return;\n\n try {\n await navigator.clipboard.writeText(this.#originalContent);\n\n // Visual feedback\n copyBtn.innerHTML = getIcon('check');\n copyBtn.classList.add('ry-code__copy--success');\n\n this.emit('copy', { code: this.#originalContent });\n\n setTimeout(() => {\n copyBtn.innerHTML = getIcon('copy');\n copyBtn.classList.remove('ry-code__copy--success');\n }, 2000);\n } catch {\n this.emit('copy-error');\n }\n };\n\n #highlight(code: string, language: Language): string {\n switch (language) {\n case 'css':\n return this.#highlightCSS(code);\n case 'js':\n case 'javascript':\n return this.#highlightJS(code);\n case 'html':\n return this.#highlightHTML(code);\n case 'json':\n return this.#highlightJSON(code);\n default:\n return this.#escape(code);\n }\n }\n\n #highlightCSS(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Comments\n if (remaining.startsWith('/*')) {\n const end = remaining.indexOf('*/');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 2) });\n remaining = remaining.slice(end + 2);\n continue;\n }\n }\n\n // Selectors (before {)\n const selectorMatch = remaining.match(/^([.#]?[\\w-]+(?:\\s*,\\s*[.#]?[\\w-]+)*)\\s*(?=\\{)/);\n if (selectorMatch?.[1]) {\n tokens.push({ type: 'selector', value: selectorMatch[1] });\n remaining = remaining.slice(selectorMatch[0].length);\n continue;\n }\n\n // Properties\n const propMatch = remaining.match(/^([\\w-]+)\\s*:/);\n if (propMatch?.[1]) {\n tokens.push({ type: 'property', value: propMatch[1] });\n tokens.push({ type: 'punctuation', value: ':' });\n remaining = remaining.slice(propMatch[0].length);\n continue;\n }\n\n // Color values (hex)\n const hexMatch = remaining.match(/^(#[0-9a-fA-F]{3,8})/);\n if (hexMatch?.[1]) {\n tokens.push({ type: 'color', value: hexMatch[1], color: hexMatch[1] });\n remaining = remaining.slice(hexMatch[1].length);\n continue;\n }\n\n // Color values (rgb/rgba/hsl/hsla)\n const colorFnMatch = remaining.match(/^(rgba?\\([^)]+\\)|hsla?\\([^)]+\\))/i);\n if (colorFnMatch?.[1]) {\n tokens.push({ type: 'color', value: colorFnMatch[1], color: colorFnMatch[1] });\n remaining = remaining.slice(colorFnMatch[1].length);\n continue;\n }\n\n // Numbers with units\n const numMatch = remaining.match(/^(-?[\\d.]+(?:px|em|rem|%|vh|vw|deg|s|ms)?)/);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{};,()]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace or other\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Keywords/values\n const wordMatch = remaining.match(/^([\\w-]+)/);\n if (wordMatch?.[1]) {\n const word = wordMatch[1];\n const cssKeywords = ['inherit', 'initial', 'unset', 'none', 'auto', 'transparent', 'solid', 'dashed', 'dotted', 'flex', 'grid', 'block', 'inline', 'inline-block', 'absolute', 'relative', 'fixed', 'sticky'];\n if (cssKeywords.includes(word)) {\n tokens.push({ type: 'keyword', value: word });\n } else {\n tokens.push({ type: 'value', value: word });\n }\n remaining = remaining.slice(word.length);\n continue;\n }\n\n // Single character fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightJS(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n const jsKeywords = ['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally', 'throw', 'new', 'class', 'extends', 'import', 'export', 'default', 'from', 'async', 'await', 'typeof', 'instanceof', 'in', 'of', 'true', 'false', 'null', 'undefined', 'this', 'super', 'static', 'get', 'set'];\n\n while (remaining.length > 0) {\n // Single-line comments\n if (remaining.startsWith('//')) {\n const end = remaining.indexOf('\\n');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end) });\n remaining = remaining.slice(end);\n continue;\n } else {\n tokens.push({ type: 'comment', value: remaining });\n break;\n }\n }\n\n // Multi-line comments\n if (remaining.startsWith('/*')) {\n const end = remaining.indexOf('*/');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 2) });\n remaining = remaining.slice(end + 2);\n continue;\n }\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"`])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Numbers\n const numMatch = remaining.match(/^(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)/i);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Words\n const wordMatch = remaining.match(/^([a-zA-Z_$][\\w$]*)/);\n if (wordMatch?.[1]) {\n const word = wordMatch[1];\n if (jsKeywords.includes(word)) {\n tokens.push({ type: 'keyword', value: word });\n } else {\n tokens.push({ type: 'text', value: word });\n }\n remaining = remaining.slice(word.length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{}[\\]();,.:?!<>=+\\-*/&|^%~@#]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightHTML(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Comments\n if (remaining.startsWith('<!--')) {\n const end = remaining.indexOf('-->');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 3) });\n remaining = remaining.slice(end + 3);\n continue;\n }\n }\n\n // Tags\n const tagMatch = remaining.match(/^(<\\/?)([\\w-]+)/);\n if (tagMatch?.[1] && tagMatch[2]) {\n tokens.push({ type: 'punctuation', value: tagMatch[1] });\n tokens.push({ type: 'tag', value: tagMatch[2] });\n remaining = remaining.slice(tagMatch[0].length);\n continue;\n }\n\n // Attributes\n const attrMatch = remaining.match(/^([\\w-]+)(=)/);\n if (attrMatch?.[1]) {\n tokens.push({ type: 'attribute', value: attrMatch[1] });\n tokens.push({ type: 'punctuation', value: '=' });\n remaining = remaining.slice(attrMatch[0].length);\n continue;\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Closing >\n if (remaining[0] === '>' || remaining.startsWith('/>')) {\n const punct = remaining.startsWith('/>') ? '/>' : '>';\n tokens.push({ type: 'punctuation', value: punct });\n remaining = remaining.slice(punct.length);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Text content\n const textMatch = remaining.match(/^([^<]+)/);\n if (textMatch?.[1]) {\n tokens.push({ type: 'text', value: textMatch[1] });\n remaining = remaining.slice(textMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightJSON(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Strings (keys and values)\n const strMatch = remaining.match(/^(\"(?:[^\\\\\"]|\\\\.)*\")/);\n if (strMatch?.[1]) {\n // Check if it's a key (followed by :)\n const afterStr = remaining.slice(strMatch[0].length).trimStart();\n if (afterStr.startsWith(':')) {\n tokens.push({ type: 'property', value: strMatch[1] });\n } else {\n tokens.push({ type: 'string', value: strMatch[1] });\n }\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Numbers\n const numMatch = remaining.match(/^(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)/i);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Booleans and null\n const boolMatch = remaining.match(/^(true|false|null)/);\n if (boolMatch?.[1]) {\n tokens.push({ type: 'keyword', value: boolMatch[1] });\n remaining = remaining.slice(boolMatch[1].length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{}[\\]:,]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #tokenToHTML(token: Token): string {\n const escaped = this.#escape(token.value);\n\n switch (token.type) {\n case 'keyword':\n return `<span class=\"ry-code__keyword\">${escaped}</span>`;\n case 'property':\n return `<span class=\"ry-code__property\">${escaped}</span>`;\n case 'value':\n return `<span class=\"ry-code__value\">${escaped}</span>`;\n case 'string':\n return `<span class=\"ry-code__string\">${escaped}</span>`;\n case 'number':\n return `<span class=\"ry-code__number\">${escaped}</span>`;\n case 'comment':\n return `<span class=\"ry-code__comment\">${escaped}</span>`;\n case 'selector':\n return `<span class=\"ry-code__selector\">${escaped}</span>`;\n case 'punctuation':\n return `<span class=\"ry-code__punctuation\">${escaped}</span>`;\n case 'tag':\n return `<span class=\"ry-code__tag\">${escaped}</span>`;\n case 'attribute':\n return `<span class=\"ry-code__attribute\">${escaped}</span>`;\n case 'color':\n return `<span class=\"ry-code__color\"><span class=\"ry-code__color-preview\" style=\"background-color: ${token.color}\"></span>${escaped}</span>`;\n default:\n return escaped;\n }\n }\n\n #escape(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n\n #trimIndent(html: string): string {\n const lines = html.split('\\n');\n\n // Remove empty first/last lines\n while (lines.length && !lines[0]?.trim()) lines.shift();\n while (lines.length && !lines[lines.length - 1]?.trim()) lines.pop();\n\n if (lines.length === 0) return '';\n\n // Find minimum indentation (ignoring empty lines)\n const minIndent = Math.min(\n ...lines\n .filter(line => line.trim())\n .map(line => {\n const match = line.match(/^(\\s*)/);\n return match?.[1]?.length ?? 0;\n })\n );\n\n // Remove common indentation\n return lines\n .map(line => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n\n get code(): string {\n return this.#originalContent;\n }\n\n set code(value: string) {\n this.#originalContent = value;\n this.#render();\n }\n}\n\ncustomElements.define('ry-code', RyCode);\n","/**\n * <ry-example>\n *\n * Displays code and live rendered output side-by-side from a single source.\n * Code is shown on the left using ry-code, live preview on the right.\n *\n * Usage:\n * <ry-example title=\"Accordion\">\n * <template>\n * <accordion>\n * <accordion-item title=\"FAQ\" open>\n * Content here\n * </accordion-item>\n * </accordion>\n * </template>\n * <!-- Optional: JS usage examples in collapsible section -->\n * <script slot=\"js\" type=\"text/plain\">\n * // Listen for changes\n * element.addEventListener('ry:change', (e) => {\n * console.log(e.detail.value);\n * });\n * </script>\n * </ry-example>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { transform } from '../core/ry-transform.js';\n\nexport class RyExample extends RyElement {\n setup(): void {\n const template = this.$<HTMLTemplateElement>('template');\n if (!template) return;\n\n // Get JS usage script (must capture before clearing innerHTML)\n const jsScript = this.$<HTMLScriptElement>('script[slot=\"js\"]');\n const jsSource = jsScript ? this.#trimIndent(jsScript.textContent ?? '') : null;\n\n // Get clean source (with normalized indentation)\n const source = this.#trimIndent(template.innerHTML);\n\n // Transform for live rendering\n const transformed = transform(source);\n\n // Build layout structure\n const stacked = this.hasAttribute('stacked');\n this.innerHTML = `\n <div data-ry-target=\"preview\" class=\"ry-example__preview\"></div>\n <div data-ry-target=\"code\" class=\"ry-example__code\"></div>\n ${jsSource ? '<div data-ry-target=\"usage\" class=\"ry-example__usage\"></div>' : ''}\n `;\n\n if (stacked) {\n this.setAttribute('data-stacked', '');\n }\n\n // Create and inject ry-code with source\n const codeEl = document.createElement('ry-code');\n codeEl.setAttribute('language', 'html');\n codeEl.setAttribute('title', this.getAttribute('title') ?? 'Example');\n codeEl.textContent = source;\n this.$('[data-ry-target=\"code\"]')!.appendChild(codeEl);\n\n // Create and inject live preview\n const previewTemplate = document.createElement('template');\n previewTemplate.innerHTML = transformed;\n this.$('[data-ry-target=\"preview\"]')!.appendChild(previewTemplate.content);\n\n // Add JS usage section if provided\n if (jsSource) {\n this.#buildUsageSection(jsSource);\n }\n }\n\n #buildUsageSection(jsSource: string): void {\n const usageContainer = this.$('[data-ry-target=\"usage\"]');\n if (!usageContainer) return;\n\n // Create toggle button\n const toggle = document.createElement('button');\n toggle.className = 'ry-example__usage-toggle';\n toggle.type = 'button';\n toggle.innerHTML = '<span>JS Usage</span><ry-icon name=\"chevron-down\" size=\"16\"></ry-icon>';\n toggle.setAttribute('aria-expanded', 'false');\n\n // Create content panel\n const panel = document.createElement('div');\n panel.className = 'ry-example__usage-panel';\n panel.hidden = true;\n\n // Create code block for JS\n const jsCodeEl = document.createElement('ry-code');\n jsCodeEl.setAttribute('language', 'js');\n jsCodeEl.setAttribute('title', 'JavaScript');\n jsCodeEl.textContent = jsSource;\n panel.appendChild(jsCodeEl);\n\n usageContainer.appendChild(toggle);\n usageContainer.appendChild(panel);\n\n // Toggle handler\n this.on(toggle, 'click', () => {\n const expanded = toggle.getAttribute('aria-expanded') === 'true';\n toggle.setAttribute('aria-expanded', String(!expanded));\n panel.hidden = expanded;\n });\n }\n\n /**\n * Normalize indentation by removing common leading whitespace\n */\n #trimIndent(html: string): string {\n const lines = html.split('\\n');\n\n // Remove empty first/last lines\n while (lines.length && !lines[0]!.trim()) lines.shift();\n while (lines.length && !lines[lines.length - 1]!.trim()) lines.pop();\n\n if (lines.length === 0) return '';\n\n // Find minimum indentation (ignoring empty lines)\n const minIndent = Math.min(\n ...lines\n .filter(line => line.trim())\n .map(line => {\n const match = line.match(/^(\\s*)/);\n return match?.[1]?.length ?? 0;\n })\n );\n\n // Remove common indentation\n return lines\n .map(line => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n}\n\ncustomElements.define('ry-example', RyExample);\n","/**\n * <ry-icon>\n *\n * Renders an icon from the icon registry.\n *\n * Usage:\n * <ry-icon name=\"close\"></ry-icon>\n * <ry-icon name=\"check\" size=\"16\"></ry-icon>\n * <ry-icon name=\"heart\" size=\"32\"></ry-icon>\n *\n * Attributes:\n * - name: icon name from registry (required)\n * - size: icon size in pixels (default: 24)\n * - label: accessible label (for screen readers)\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyIcon extends RyElement {\n static get observedAttributes(): string[] {\n return ['name', 'size', 'label'];\n }\n\n setup(): void {\n this.#render();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue !== newValue && this.hasAttribute('data-ry-initialized')) {\n this.#render();\n }\n }\n\n #render(): void {\n const name = this.getAttribute('name') ?? '';\n const size = this.getAttribute('size') ?? '24';\n const label = this.getAttribute('label');\n\n const svg = getIcon(name);\n\n if (!svg) {\n this.innerHTML = '';\n return;\n }\n\n // Inject SVG and update size\n this.innerHTML = svg;\n\n const svgEl = this.querySelector('svg');\n if (svgEl) {\n svgEl.setAttribute('width', size);\n svgEl.setAttribute('height', size);\n\n // Accessibility\n if (label) {\n svgEl.setAttribute('role', 'img');\n svgEl.setAttribute('aria-label', label);\n } else {\n svgEl.setAttribute('aria-hidden', 'true');\n }\n }\n }\n\n get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n set name(value: string) {\n this.setAttribute('name', value);\n }\n\n get size(): number {\n return parseInt(this.getAttribute('size') ?? '24', 10);\n }\n\n set size(value: number) {\n this.setAttribute('size', String(value));\n }\n}\n\ncustomElements.define('ry-icon', RyIcon);\n","/**\n * <ry-toggle-button>\n *\n * Standalone toggle button that works as part of a group via shared `name` attribute.\n * Buttons with the same name behave like radio buttons - only one can be pressed at a time.\n *\n * Usage:\n * <ry-toggle-button name=\"view\" value=\"list\" icon=\"list\"></ry-toggle-button>\n * <ry-toggle-button name=\"view\" value=\"grid\" icon=\"grid\" pressed></ry-toggle-button>\n *\n * Conflict detection:\n * Warns in console if same-name buttons span different form/section/fieldset containers.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ChangeDetail } from '../types.js';\n\n// Container types that define logical grouping boundaries\nconst BOUNDARY_SELECTORS = ['form', 'section', 'fieldset', 'ry-section'];\n\n// Global registry: name -> Set of toggle button instances\nconst registry = new Map<string, Set<RyToggleButton>>();\n\n// Track which name groups have already warned about conflicts\nconst warnedGroups = new Set<string>();\n\n/**\n * Find the nearest boundary ancestor (form, section, fieldset)\n */\nfunction findBoundaryAncestor(el: Element): Element | null {\n let current = el.parentElement;\n while (current) {\n if (BOUNDARY_SELECTORS.some(sel => current!.matches(sel))) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\n/**\n * Check if buttons with the same name are in different boundary containers\n */\nfunction checkForConflicts(name: string): void {\n if (warnedGroups.has(name)) return;\n\n const buttons = registry.get(name);\n if (!buttons || buttons.size < 2) return;\n\n const boundaries = new Map<Element | null, RyToggleButton[]>();\n\n for (const btn of buttons) {\n const boundary = findBoundaryAncestor(btn);\n const group = boundaries.get(boundary) ?? [];\n group.push(btn);\n boundaries.set(boundary, group);\n }\n\n // If buttons are in more than one boundary container, warn\n if (boundaries.size > 1) {\n const containerDescriptions: string[] = [];\n for (const [boundary] of boundaries) {\n if (boundary) {\n const id = boundary.id ? `#${boundary.id}` : '';\n const tag = boundary.tagName.toLowerCase();\n containerDescriptions.push(`${tag}${id}`);\n } else {\n containerDescriptions.push('(no container)');\n }\n }\n\n console.warn(\n `ry-toggle-button: Buttons with name=\"${name}\" span multiple containers (${containerDescriptions.join(', ')}). Intentional?`\n );\n warnedGroups.add(name);\n }\n}\n\nexport class RyToggleButton extends RyElement {\n static observedAttributes = ['pressed', 'disabled', 'name', 'value'] as const;\n\n #registered = false;\n\n setup(): void {\n // Set up accessibility\n this.setAttribute('role', 'button');\n this.setAttribute('aria-pressed', String(this.pressed));\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n // Register in the global registry\n this.#register();\n\n // Event handlers\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n teardown(): void {\n this.#unregister();\n }\n\n #register(): void {\n const name = this.name;\n if (!name) return;\n\n if (!registry.has(name)) {\n registry.set(name, new Set());\n }\n registry.get(name)!.add(this);\n this.#registered = true;\n\n // Check for conflicts after a microtask to allow all buttons to register\n queueMicrotask(() => checkForConflicts(name));\n }\n\n #unregister(): void {\n if (!this.#registered) return;\n\n const name = this.name;\n if (name && registry.has(name)) {\n registry.get(name)!.delete(this);\n if (registry.get(name)!.size === 0) {\n registry.delete(name);\n warnedGroups.delete(name);\n }\n }\n this.#registered = false;\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n\n // Toggle this button on (don't toggle off if already pressed)\n if (!this.pressed) {\n this.pressed = true;\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.click();\n }\n };\n\n #unpressOthers(): void {\n const name = this.name;\n if (!name) return;\n\n const siblings = registry.get(name);\n if (!siblings) return;\n\n for (const btn of siblings) {\n if (btn !== this && btn.pressed) {\n btn.pressed = false;\n }\n }\n }\n\n // --- Public API ---\n\n get pressed(): boolean {\n return this.hasAttribute('pressed');\n }\n\n set pressed(value: boolean) {\n const wasPressed = this.pressed;\n\n if (value) {\n this.setAttribute('pressed', '');\n this.setAttribute('aria-pressed', 'true');\n this.#unpressOthers();\n } else {\n this.removeAttribute('pressed');\n this.setAttribute('aria-pressed', 'false');\n }\n\n // Only emit if state actually changed\n if (wasPressed !== value) {\n this.emit<ChangeDetail>('change', {\n value: this.value,\n label: value ? 'pressed' : 'unpressed'\n });\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n this.setAttribute('tabindex', '-1');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n this.setAttribute('tabindex', '0');\n }\n }\n\n get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n set name(value: string) {\n const oldName = this.name;\n if (oldName === value) return;\n\n // Re-register with new name\n this.#unregister();\n if (value) {\n this.setAttribute('name', value);\n } else {\n this.removeAttribute('name');\n }\n this.#register();\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n this.setAttribute('value', val);\n }\n\n get icon(): string {\n return this.getAttribute('icon') ?? '';\n }\n\n set icon(val: string) {\n this.setAttribute('icon', val);\n }\n}\n\ncustomElements.define('ry-toggle-button', RyToggleButton);\n","/**\n * <ry-slider>\n *\n * Range slider component with single or dual handles.\n *\n * Usage:\n * <ry-slider min=\"0\" max=\"100\" value=\"50\"></ry-slider>\n * <ry-slider min=\"0\" max=\"100\" start=\"25\" end=\"75\" range labeled></ry-slider>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RySlider extends RyElement {\n #dragging = false;\n #activeThumb: 'value' | 'start' | 'end' | null = null;\n #track: HTMLElement | null = null;\n #fill: HTMLElement | null = null;\n #thumbs: Map<string, HTMLElement> = new Map();\n #tooltips: Map<string, HTMLElement> = new Map();\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'start', 'end', 'disabled'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#updatePositions();\n }\n\n #buildMarkup(): void {\n const isRange = this.hasAttribute('range');\n const showLabels = this.hasAttribute('labeled');\n const showTooltip = this.hasAttribute('tooltip');\n const isVertical = this.hasAttribute('vertical');\n\n let html = `\n <div data-ry-target=\"track\" class=\"ry-slider__track\">\n <div data-ry-target=\"fill\" class=\"ry-slider__fill\"></div>\n `;\n\n if (isRange) {\n html += `\n <div data-ry-target=\"thumb-start\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"Start value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-start\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n <div data-ry-target=\"thumb-end\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"End value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-end\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n `;\n } else {\n html += `\n <div data-ry-target=\"thumb-value\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"Value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-value\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n `;\n }\n\n html += '</div>';\n\n if (showLabels) {\n html += this.#buildLabels();\n }\n\n this.innerHTML = html;\n\n // Cache references\n this.#track = this.$('[data-ry-target=\"track\"]');\n this.#fill = this.$('[data-ry-target=\"fill\"]');\n\n if (isRange) {\n this.#thumbs.set('start', this.$('[data-ry-target=\"thumb-start\"]')!);\n this.#thumbs.set('end', this.$('[data-ry-target=\"thumb-end\"]')!);\n if (showTooltip) {\n this.#tooltips.set('start', this.$('[data-ry-target=\"tooltip-start\"]')!);\n this.#tooltips.set('end', this.$('[data-ry-target=\"tooltip-end\"]')!);\n }\n } else {\n this.#thumbs.set('value', this.$('[data-ry-target=\"thumb-value\"]')!);\n if (showTooltip) {\n this.#tooltips.set('value', this.$('[data-ry-target=\"tooltip-value\"]')!);\n }\n }\n }\n\n #buildLabels(): string {\n const min = this.min;\n const max = this.max;\n const customLabels = this.getAttribute('labels')?.split(',');\n const labelType = this.getAttribute('label-type') || 'number';\n\n let labels: string[] = [];\n\n if (customLabels) {\n labels = customLabels;\n } else {\n // Show 5 evenly distributed labels (always include min and max)\n const labelCount = 5;\n for (let i = 0; i < labelCount; i++) {\n const ratio = i / (labelCount - 1);\n const val = min + ratio * (max - min);\n if (labelType === 'letter') {\n labels.push(String.fromCharCode(65 + i));\n } else {\n // Round to reasonable precision\n const rounded = Math.round(val * 100) / 100;\n labels.push(String(Number.isInteger(rounded) ? rounded : rounded.toFixed(1)));\n }\n }\n }\n\n return `\n <div data-ry-target=\"labels\" class=\"ry-slider__labels\">\n ${labels.map(l => `<span>${l}</span>`).join('')}\n </div>\n `;\n }\n\n #bindEvents(): void {\n // Track click\n if (this.#track) {\n this.on(this.#track, 'pointerdown', this.#handleTrackDown);\n }\n\n // Thumb events\n for (const [key, thumb] of this.#thumbs) {\n this.on(thumb, 'pointerdown', (e) => this.#handleThumbDown(e, key));\n this.on(thumb, 'keydown', (e) => this.#handleKeydown(e, key));\n }\n\n // Document events for drag\n this.on(document, 'pointermove', this.#handlePointerMove);\n this.on(document, 'pointerup', this.#handlePointerUp);\n }\n\n #handleTrackDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n\n const value = this.#valueFromPointer(e);\n const isRange = this.hasAttribute('range');\n\n if (isRange) {\n // Move closest thumb\n const distToStart = Math.abs(value - this.start);\n const distToEnd = Math.abs(value - this.end);\n if (distToStart < distToEnd) {\n this.start = value;\n this.#activeThumb = 'start';\n } else {\n this.end = value;\n this.#activeThumb = 'end';\n }\n } else {\n this.value = value;\n this.#activeThumb = 'value';\n }\n\n this.#dragging = true;\n this.#updatePositions();\n this.#emitInput();\n };\n\n #handleThumbDown = (e: PointerEvent, key: string): void => {\n if (this.disabled) return;\n e.stopPropagation();\n this.#dragging = true;\n this.#activeThumb = key as 'value' | 'start' | 'end';\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#dragging || !this.#activeThumb) return;\n\n const value = this.#valueFromPointer(e);\n const isRange = this.hasAttribute('range');\n\n if (isRange) {\n if (this.#activeThumb === 'start') {\n // Prevent crossover\n this.start = Math.min(value, this.end);\n } else if (this.#activeThumb === 'end') {\n this.end = Math.max(value, this.start);\n }\n } else {\n this.value = value;\n }\n\n this.#updatePositions();\n this.#emitInput();\n };\n\n #handlePointerUp = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#activeThumb = null;\n this.#emitChange();\n }\n };\n\n #handleKeydown = (e: KeyboardEvent, key: string): void => {\n if (this.disabled) return;\n\n const step = this.step || 1;\n const largeStep = (this.max - this.min) / 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = this.hasAttribute('reversed') ? -step : step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = this.hasAttribute('reversed') ? step : -step;\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n delta = this.min - this.#getValueForKey(key);\n break;\n case 'End':\n delta = this.max - this.#getValueForKey(key);\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const newValue = this.#clamp(this.#getValueForKey(key) + delta);\n\n if (key === 'start') {\n this.start = Math.min(newValue, this.end);\n } else if (key === 'end') {\n this.end = Math.max(newValue, this.start);\n } else {\n this.value = newValue;\n }\n\n this.#updatePositions();\n this.#emitInput();\n this.#emitChange();\n };\n\n #getValueForKey(key: string): number {\n if (key === 'start') return this.start;\n if (key === 'end') return this.end;\n return this.value;\n }\n\n #valueFromPointer(e: PointerEvent): number {\n if (!this.#track) return this.min;\n\n const rect = this.#track.getBoundingClientRect();\n const isVertical = this.hasAttribute('vertical');\n const isReversed = this.hasAttribute('reversed');\n\n let ratio: number;\n if (isVertical) {\n ratio = (rect.bottom - e.clientY) / rect.height;\n } else {\n ratio = (e.clientX - rect.left) / rect.width;\n }\n\n if (isReversed) ratio = 1 - ratio;\n ratio = Math.max(0, Math.min(1, ratio));\n\n const rawValue = this.min + ratio * (this.max - this.min);\n return this.#snapToStep(rawValue);\n }\n\n #snapToStep(value: number): number {\n const step = this.step;\n if (step === 0) return this.#clamp(value);\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return this.#clamp(snapped);\n }\n\n #clamp(value: number): number {\n return Math.max(this.min, Math.min(this.max, value));\n }\n\n #updatePositions(): void {\n const isRange = this.hasAttribute('range');\n const isVertical = this.hasAttribute('vertical');\n const isReversed = this.hasAttribute('reversed');\n\n const toPercent = (val: number) => {\n let pct = ((val - this.min) / (this.max - this.min)) * 100;\n if (isReversed) pct = 100 - pct;\n return pct;\n };\n\n if (isRange) {\n const startPct = toPercent(this.start);\n const endPct = toPercent(this.end);\n const lowPct = Math.min(startPct, endPct);\n const highPct = Math.max(startPct, endPct);\n\n if (this.#fill) {\n if (isVertical) {\n this.#fill.style.bottom = `${lowPct}%`;\n this.#fill.style.height = `${highPct - lowPct}%`;\n this.#fill.style.left = '';\n this.#fill.style.width = '';\n } else {\n this.#fill.style.left = `${lowPct}%`;\n this.#fill.style.width = `${highPct - lowPct}%`;\n this.#fill.style.bottom = '';\n this.#fill.style.height = '';\n }\n }\n\n const startThumb = this.#thumbs.get('start');\n const endThumb = this.#thumbs.get('end');\n if (startThumb) {\n if (isVertical) {\n startThumb.style.bottom = `${startPct}%`;\n startThumb.style.left = '';\n } else {\n startThumb.style.left = `${startPct}%`;\n startThumb.style.bottom = '';\n }\n }\n if (endThumb) {\n if (isVertical) {\n endThumb.style.bottom = `${endPct}%`;\n endThumb.style.left = '';\n } else {\n endThumb.style.left = `${endPct}%`;\n endThumb.style.bottom = '';\n }\n }\n\n // Update tooltips\n this.#updateTooltip('start', this.start);\n this.#updateTooltip('end', this.end);\n\n // Update ARIA\n startThumb?.setAttribute('aria-valuenow', String(this.start));\n startThumb?.setAttribute('aria-valuemin', String(this.min));\n startThumb?.setAttribute('aria-valuemax', String(this.end));\n endThumb?.setAttribute('aria-valuenow', String(this.end));\n endThumb?.setAttribute('aria-valuemin', String(this.start));\n endThumb?.setAttribute('aria-valuemax', String(this.max));\n } else {\n const pct = toPercent(this.value);\n\n if (this.#fill) {\n if (isVertical) {\n this.#fill.style.bottom = '0';\n this.#fill.style.height = `${pct}%`;\n this.#fill.style.left = '';\n this.#fill.style.width = '';\n } else {\n this.#fill.style.left = '0';\n this.#fill.style.width = `${pct}%`;\n this.#fill.style.bottom = '';\n this.#fill.style.height = '';\n }\n }\n\n const thumb = this.#thumbs.get('value');\n if (thumb) {\n if (isVertical) {\n thumb.style.bottom = `${pct}%`;\n thumb.style.left = '';\n } else {\n thumb.style.left = `${pct}%`;\n thumb.style.bottom = '';\n }\n }\n\n // Update tooltip\n this.#updateTooltip('value', this.value);\n\n // Update ARIA\n thumb?.setAttribute('aria-valuenow', String(this.value));\n thumb?.setAttribute('aria-valuemin', String(this.min));\n thumb?.setAttribute('aria-valuemax', String(this.max));\n }\n }\n\n #updateTooltip(key: string, value: number): void {\n const tooltip = this.#tooltips.get(key);\n if (tooltip) {\n const decimals = this.step === 0 ? 2 : (String(this.step).split('.')[1]?.length || 0);\n tooltip.textContent = value.toFixed(decimals);\n }\n }\n\n #emitInput(): void {\n if (this.hasAttribute('range')) {\n this.emit('input', { start: this.start, end: this.end });\n } else {\n this.emit('input', { value: this.value });\n }\n }\n\n #emitChange(): void {\n if (this.hasAttribute('range')) {\n this.emit('change', { start: this.start, end: this.end });\n } else {\n this.emit('change', { value: this.value });\n }\n }\n\n // --- Public API ---\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '1');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? String(this.min));\n }\n set value(val: number) {\n this.setAttribute('value', String(this.#clamp(val)));\n }\n\n get start(): number {\n return parseFloat(this.getAttribute('start') ?? String(this.min));\n }\n set start(val: number) {\n this.setAttribute('start', String(this.#clamp(val)));\n }\n\n get end(): number {\n return parseFloat(this.getAttribute('end') ?? String(this.max));\n }\n set end(val: number) {\n this.setAttribute('end', String(this.#clamp(val)));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n}\n\ncustomElements.define('ry-slider', RySlider);\n","/**\n * <ry-knob>\n *\n * Rotary knob component with drag/wheel interaction.\n *\n * Usage:\n * <ry-knob min=\"0\" max=\"100\" value=\"50\" label=\"Volume\"></ry-knob>\n * <ry-knob min=\"0\" max=\"3\" step=\"1\" labels=\"Off,Low,Med,High\"></ry-knob>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyKnob extends RyElement {\n #dragging = false;\n #startY = 0;\n #startValue = 0;\n #ring: HTMLElement | null = null;\n #indicator: HTMLElement | null = null;\n #display: HTMLElement | null = null;\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'disabled', 'label', 'labels', 'description'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#updateVisuals();\n }\n\n #buildMarkup(): void {\n const label = this.getAttribute('label');\n const description = this.getAttribute('description');\n const titleAttr = description ? ` title=\"${description}\"` : '';\n\n this.innerHTML = `\n <div data-ry-target=\"ring\" class=\"ry-knob__ring\"${titleAttr}>\n <div data-ry-target=\"cap\" class=\"ry-knob__cap\">\n <div data-ry-target=\"indicator\" class=\"ry-knob__indicator\"></div>\n </div>\n </div>\n <span data-ry-target=\"display\" class=\"ry-knob__value\"></span>\n ${label ? `<span data-ry-target=\"label\" class=\"ry-knob__label\"${titleAttr}>${label}</span>` : ''}\n `;\n\n this.#ring = this.$('[data-ry-target=\"ring\"]');\n this.#indicator = this.$('[data-ry-target=\"indicator\"]');\n this.#display = this.$('[data-ry-target=\"display\"]');\n }\n\n #bindEvents(): void {\n if (!this.#ring) return;\n\n // Mouse drag\n this.on(this.#ring, 'mousedown', this.#handleMouseDown);\n this.on(document, 'mousemove', this.#handleMouseMove);\n this.on(document, 'mouseup', this.#handleMouseUp);\n\n // Touch support\n this.on(this.#ring, 'touchstart', this.#handleTouchStart);\n this.on(document, 'touchmove', this.#handleTouchMove);\n this.on(document, 'touchend', this.#handleTouchEnd);\n\n // Wheel\n this.on(this.#ring, 'wheel', this.#handleWheel);\n\n // Keyboard\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleMouseDown = (e: MouseEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#dragging = true;\n this.#startY = e.clientY;\n this.#startValue = this.value;\n this.#ring?.classList.add('ry-knob__ring--dragging');\n this.setAttribute('data-dragging', '');\n };\n\n #handleMouseMove = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n const deltaY = this.#startY - e.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.#updateValue(this.#startValue + deltaY * sensitivity);\n };\n\n #handleMouseUp = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#ring?.classList.remove('ry-knob__ring--dragging');\n this.removeAttribute('data-dragging');\n this.#emitChange();\n }\n };\n\n #handleTouchStart = (e: TouchEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#dragging = true;\n this.#startY = e.touches[0]?.clientY ?? 0;\n this.#startValue = this.value;\n this.#ring?.classList.add('ry-knob__ring--dragging');\n this.setAttribute('data-dragging', '');\n };\n\n #handleTouchMove = (e: TouchEvent): void => {\n if (!this.#dragging) return;\n e.preventDefault();\n const touch = e.touches[0];\n if (!touch) return;\n const deltaY = this.#startY - touch.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.#updateValue(this.#startValue + deltaY * sensitivity);\n };\n\n #handleTouchEnd = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#ring?.classList.remove('ry-knob__ring--dragging');\n this.removeAttribute('data-dragging');\n this.#emitChange();\n }\n };\n\n #handleWheel = (e: WheelEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n const step = this.step || (this.max - this.min) / 50;\n const delta = e.deltaY < 0 ? step : -step;\n this.#updateValue(this.value + delta);\n this.#emitChange();\n };\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n\n const step = this.step || 1;\n const largeStep = (this.max - this.min) / 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n delta = step;\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n delta = -step;\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n this.#updateValue(this.min);\n this.#emitChange();\n return;\n case 'End':\n this.#updateValue(this.max);\n this.#emitChange();\n return;\n default:\n return;\n }\n\n e.preventDefault();\n this.#updateValue(this.value + delta);\n this.#emitChange();\n };\n\n #updateValue(newValue: number): void {\n let clamped = Math.max(this.min, Math.min(this.max, newValue));\n\n // Snap to step if defined\n const step = this.step;\n if (step > 0) {\n clamped = Math.round((clamped - this.min) / step) * step + this.min;\n clamped = Math.max(this.min, Math.min(this.max, clamped));\n }\n\n this.value = clamped;\n this.#updateVisuals();\n this.#emitInput();\n }\n\n #updateVisuals(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n // Rotation: -135deg (min) to +135deg (max) = 270deg range\n const rotation = -135 + percent * 270;\n\n if (this.#ring) {\n this.#ring.style.setProperty('--knob-rotation', `${rotation}deg`);\n this.#ring.style.setProperty('--knob-percent', String(percent));\n }\n\n if (this.#display) {\n this.#display.textContent = this.#formatValue(this.value);\n }\n\n // Update ARIA\n this.setAttribute('aria-valuenow', String(this.value));\n this.setAttribute('aria-valuemin', String(this.min));\n this.setAttribute('aria-valuemax', String(this.max));\n }\n\n #formatValue(value: number): string {\n const labelsAttr = this.getAttribute('labels');\n if (labelsAttr) {\n const labels = labelsAttr.split(',');\n const index = Math.round(value);\n return labels[index] ?? String(index);\n }\n\n const step = this.step;\n if (step >= 1) return Math.round(value).toString();\n if (Math.abs(value) >= 1000) return (value / 1000).toFixed(1) + 'k';\n if (Math.abs(value) >= 100) return Math.round(value).toString();\n if (Math.abs(value) >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n #emitInput(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n this.emit('input', { value: this.value, percent });\n }\n\n #emitChange(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n this.emit('change', { value: this.value, percent });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n if (name === 'value' && this.#ring) {\n this.#updateVisuals();\n }\n }\n\n // --- Public API ---\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '0');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? String(this.min));\n }\n set value(val: number) {\n this.setAttribute('value', String(val));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n}\n\ncustomElements.define('ry-knob', RyKnob);\n","/**\n * <ry-number-select>\n *\n * Numeric input with buttons, drag, keyboard, wheel, and optional typing.\n *\n * Usage:\n * <ry-number-select min=\"0\" max=\"100\" value=\"50\" step=\"1\"></ry-number-select>\n * <ry-number-select min=\"0\" max=\"10\" step=\"0.5\" arrows=\"end\" editable></ry-number-select>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nconst DRAG_PX_PER_STEP = 15;\nconst CLICK_THRESHOLD = 3;\n\nexport class RyNumberSelect extends RyElement {\n #display: HTMLElement | null = null;\n #valueEl: HTMLElement | null = null;\n #inputEl: HTMLInputElement | null = null;\n #decrementBtn: HTMLElement | null = null;\n #incrementBtn: HTMLElement | null = null;\n\n #dragging = false;\n #startX = 0;\n #startY = 0;\n #startValue = 0;\n #editing = false;\n\n #repeatTimer: ReturnType<typeof setTimeout> | null = null;\n #repeatInterval: ReturnType<typeof setTimeout> | null = null;\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'disabled', 'arrows', 'icons', 'drag', 'editable', 'wrap', 'label', 'prefix', 'suffix'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#cacheRefs();\n this.#bindEvents();\n this.#updateDisplay();\n }\n\n #buildMarkup(): void {\n const arrows = this.getAttribute('arrows') ?? 'both';\n const label = this.getAttribute('label');\n const stacked = arrows === 'stacked' || arrows === 'stacked-end' || arrows === 'stacked-start';\n\n const [decIcon, incIcon] = this.#getIcons(stacked);\n\n const showDecrement = arrows !== 'end' && arrows !== 'none';\n const showIncrement = arrows !== 'start' && arrows !== 'none';\n const prefix = this.getAttribute('prefix');\n const suffix = this.getAttribute('suffix');\n\n const decBtn = showDecrement\n ? `<button data-ry-target=\"decrement\" class=\"ry-number-select__btn ry-number-select__decrement\" aria-label=\"Decrease\" tabindex=\"-1\" type=\"button\">${decIcon}</button>`\n : '';\n const incBtn = showIncrement\n ? `<button data-ry-target=\"increment\" class=\"ry-number-select__btn ry-number-select__increment\" aria-label=\"Increase\" tabindex=\"-1\" type=\"button\">${incIcon}</button>`\n : '';\n const display = `\n <div data-ry-target=\"display\" class=\"ry-number-select__display\" tabindex=\"0\" role=\"spinbutton\"\n aria-valuenow=\"${this.value}\" aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n ${label ? `aria-label=\"${label}\"` : ''}>\n ${prefix ? `<span data-ry-target=\"prefix\" class=\"ry-number-select__affix\">${prefix}</span>` : ''}\n <span data-ry-target=\"value\" class=\"ry-number-select__value\">${this.#formatValue(this.value)}</span>\n ${suffix ? `<span data-ry-target=\"suffix\" class=\"ry-number-select__affix\">${suffix}</span>` : ''}\n <input data-ry-target=\"input\" class=\"ry-number-select__input\" type=\"text\" inputmode=\"decimal\" tabindex=\"-1\">\n </div>`;\n const labelEl = label ? `<span data-ry-target=\"label\" class=\"ry-number-select__label\">${label}</span>` : '';\n\n if (arrows === 'stacked') {\n // Vertical: increment on top, display in middle, decrement on bottom\n this.innerHTML = `${incBtn}${display}${decBtn}${labelEl}`;\n } else if (arrows === 'stacked-end') {\n // Horizontal: display, then stacked buttons on the right\n const group = `<div data-ry-target=\"btn-group\" class=\"ry-number-select__btn-group\">${incBtn}${decBtn}</div>`;\n this.innerHTML = `${display}${group}${labelEl}`;\n } else if (arrows === 'stacked-start') {\n // Horizontal: stacked buttons on the left, then display\n const group = `<div data-ry-target=\"btn-group\" class=\"ry-number-select__btn-group\">${incBtn}${decBtn}</div>`;\n this.innerHTML = `${group}${display}${labelEl}`;\n } else {\n this.innerHTML = `${decBtn}${display}${incBtn}${labelEl}`;\n }\n }\n\n #getIcons(stacked: boolean): [string, string] {\n const icons = this.getAttribute('icons') ?? 'plus-minus';\n\n if (icons === 'chevron') {\n if (stacked) {\n return [getIcon('chevron-down') ?? '▾', getIcon('chevron-up') ?? '▴'];\n }\n return [getIcon('chevron-left') ?? '‹', getIcon('chevron-right') ?? '›'];\n }\n\n if (icons === 'arrow') {\n if (stacked) {\n return [getIcon('chevron-down') ?? '▼', getIcon('chevron-up') ?? '▲'];\n }\n return [getIcon('chevron-left') ?? '◀', getIcon('chevron-right') ?? '▶'];\n }\n\n // Default: plus-minus\n return [getIcon('minus') ?? '−', getIcon('plus') ?? '+'];\n }\n\n #cacheRefs(): void {\n this.#display = this.$('[data-ry-target=\"display\"]');\n this.#valueEl = this.$('[data-ry-target=\"value\"]');\n this.#inputEl = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n this.#decrementBtn = this.$('[data-ry-target=\"decrement\"]');\n this.#incrementBtn = this.$('[data-ry-target=\"increment\"]');\n }\n\n #bindEvents(): void {\n // Buttons\n if (this.#decrementBtn) {\n this.on(this.#decrementBtn, 'mousedown', (e: MouseEvent) => { e.preventDefault(); this.#handleButtonDown(-1); });\n this.on(this.#decrementBtn, 'mouseup', () => this.#handleButtonUp());\n this.on(this.#decrementBtn, 'mouseleave', () => this.#handleButtonUp());\n }\n if (this.#incrementBtn) {\n this.on(this.#incrementBtn, 'mousedown', (e: MouseEvent) => { e.preventDefault(); this.#handleButtonDown(1); });\n this.on(this.#incrementBtn, 'mouseup', () => this.#handleButtonUp());\n this.on(this.#incrementBtn, 'mouseleave', () => this.#handleButtonUp());\n }\n\n // Drag on display\n if (this.#display) {\n this.on(this.#display, 'mousedown', this.#handleMouseDown);\n }\n this.on(document, 'mousemove', this.#handleMouseMove);\n this.on(document, 'mouseup', this.#handleMouseUp);\n\n // Touch\n if (this.#display) {\n this.on(this.#display, 'touchstart', this.#handleTouchStart);\n }\n this.on(document, 'touchmove', this.#handleTouchMove);\n this.on(document, 'touchend', this.#handleTouchEnd);\n\n // Keyboard\n if (this.#display) {\n this.on(this.#display, 'keydown', this.#handleKeydown);\n }\n\n // Wheel\n this.on(this, 'wheel', this.#handleWheel);\n\n // Double-click always enters edit mode\n if (this.#display) {\n this.on(this.#display, 'dblclick', () => this.#enterEditMode());\n }\n\n // Edit mode\n if (this.#inputEl) {\n this.on(this.#inputEl, 'blur', () => this.#commitEdit());\n this.on(this.#inputEl, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') { e.preventDefault(); this.#commitEdit(); }\n if (e.key === 'Escape') { e.preventDefault(); this.#cancelEdit(); }\n e.stopPropagation();\n });\n }\n }\n\n // --- Button hold-to-repeat ---\n\n #handleButtonDown(direction: 1 | -1): void {\n if (this.disabled) return;\n\n const step = this.step || 1;\n this.#adjustValue(direction * step);\n this.#emitChange();\n\n this.#repeatTimer = setTimeout(() => {\n let interval = 150;\n const tick = (): void => {\n this.#adjustValue(direction * step);\n this.#emitInput();\n interval = Math.max(40, interval * 0.85);\n this.#repeatInterval = setTimeout(tick, interval);\n };\n tick();\n }, 400);\n }\n\n #handleButtonUp(): void {\n if (this.#repeatTimer) { clearTimeout(this.#repeatTimer); this.#repeatTimer = null; }\n if (this.#repeatInterval) { clearTimeout(this.#repeatInterval); this.#repeatInterval = null; }\n }\n\n // --- Drag helpers ---\n\n get #dragAxis(): 'x' | 'y' | 'none' {\n const val = this.getAttribute('drag');\n if (val === 'x' || val === 'y' || val === 'none') return val;\n // Default: stacked layouts → vertical drag\n const arrows = this.getAttribute('arrows');\n if (arrows === 'stacked' || arrows === 'stacked-end' || arrows === 'stacked-start') return 'y';\n return 'x';\n }\n\n #getDragDelta(clientX: number, clientY: number): number {\n const axis = this.#dragAxis;\n if (axis === 'y') return this.#startY - clientY; // up = increase\n return clientX - this.#startX; // right = increase\n }\n\n #getDragMoved(clientX: number, clientY: number): number {\n const axis = this.#dragAxis;\n if (axis === 'y') return Math.abs(clientY - this.#startY);\n return Math.abs(clientX - this.#startX);\n }\n\n #applyMicroOffset(remainder: number, pxPerStep: number): void {\n if (!this.#valueEl) return;\n const offset = (remainder / pxPerStep) * 4;\n const axis = this.#dragAxis;\n this.#valueEl.style.transform = axis === 'y'\n ? `translateY(${-offset}px)`\n : `translateX(${offset}px)`;\n }\n\n #processDrag(clientX: number, clientY: number, shiftKey: boolean): void {\n const d = this.#getDragDelta(clientX, clientY);\n const step = this.step || 1;\n const effectiveStep = shiftKey ? step * 10 : step;\n const pxPerStep = shiftKey ? DRAG_PX_PER_STEP * 2 : DRAG_PX_PER_STEP;\n const steps = Math.round(d / pxPerStep);\n const newVal = this.#startValue + steps * effectiveStep;\n\n const remainder = d - steps * pxPerStep;\n this.#applyMicroOffset(remainder, pxPerStep);\n\n const clamped = this.hasAttribute('wrap') ? this.#wrapValue(newVal) : this.#clamp(newVal);\n const snapped = this.#snapToStep(clamped);\n\n if (snapped !== this.value) {\n this.value = snapped;\n this.#updateDisplay();\n this.#emitInput();\n }\n }\n\n // --- Mouse drag ---\n\n #handleMouseDown = (e: MouseEvent): void => {\n if (this.disabled || this.#editing || this.#dragAxis === 'none') return;\n e.preventDefault();\n this.#dragging = true;\n this.#startX = e.clientX;\n this.#startY = e.clientY;\n this.#startValue = this.value;\n this.setAttribute('data-dragging', '');\n };\n\n #handleMouseMove = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n this.#processDrag(e.clientX, e.clientY, e.shiftKey);\n };\n\n #handleMouseUp = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n const moved = this.#getDragMoved(e.clientX, e.clientY);\n this.#dragging = false;\n this.removeAttribute('data-dragging');\n\n if (this.#valueEl) {\n this.#valueEl.style.transform = '';\n }\n\n if (moved < CLICK_THRESHOLD && this.hasAttribute('editable')) {\n this.#enterEditMode();\n } else if (moved >= CLICK_THRESHOLD) {\n this.#emitChange();\n }\n };\n\n // --- Touch drag ---\n\n #handleTouchStart = (e: TouchEvent): void => {\n if (this.disabled || this.#editing || this.#dragAxis === 'none') return;\n e.preventDefault();\n this.#dragging = true;\n this.#startX = e.touches[0]?.clientX ?? 0;\n this.#startY = e.touches[0]?.clientY ?? 0;\n this.#startValue = this.value;\n this.setAttribute('data-dragging', '');\n };\n\n #handleTouchMove = (e: TouchEvent): void => {\n if (!this.#dragging) return;\n e.preventDefault();\n const touch = e.touches[0];\n if (!touch) return;\n this.#processDrag(touch.clientX, touch.clientY, false);\n };\n\n #handleTouchEnd = (): void => {\n if (!this.#dragging) return;\n this.#dragging = false;\n this.removeAttribute('data-dragging');\n\n if (this.#valueEl) {\n this.#valueEl.style.transform = '';\n }\n\n this.#emitChange();\n };\n\n // --- Keyboard ---\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.#editing) return;\n\n const step = this.step || 1;\n const largeStep = step * 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n delta = e.shiftKey ? largeStep : step;\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n delta = -(e.shiftKey ? largeStep : step);\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n delta = this.min - this.value;\n break;\n case 'End':\n delta = this.max - this.value;\n break;\n case 'Enter':\n if (this.hasAttribute('editable')) {\n this.#enterEditMode();\n }\n return;\n default:\n if (this.hasAttribute('editable') && /^[0-9.\\-]$/.test(e.key)) {\n this.#enterEditMode(e.key);\n e.preventDefault();\n }\n return;\n }\n\n e.preventDefault();\n this.#adjustValue(delta);\n this.#emitInput();\n this.#emitChange();\n };\n\n // --- Wheel ---\n\n #handleWheel = (e: WheelEvent): void => {\n if (this.disabled || this.#editing) return;\n if (!this.matches(':hover') && !this.contains(document.activeElement)) return;\n\n e.preventDefault();\n const step = this.step || 1;\n const effectiveStep = e.shiftKey ? step * 10 : step;\n const delta = e.deltaY < 0 ? effectiveStep : -effectiveStep;\n this.#adjustValue(delta);\n this.#emitInput();\n this.#emitChange();\n };\n\n // --- Edit mode ---\n\n #enterEditMode(initialChar?: string): void {\n if (this.disabled || this.#editing) return;\n this.#editing = true;\n this.state = 'editing';\n\n if (this.#valueEl) this.#valueEl.style.display = 'none';\n if (this.#inputEl) {\n this.#inputEl.style.display = 'block';\n this.#inputEl.value = initialChar ?? this.#formatValue(this.value);\n this.#inputEl.focus();\n if (initialChar) {\n this.#inputEl.setSelectionRange(1, 1);\n } else {\n this.#inputEl.select();\n }\n }\n }\n\n #commitEdit(): void {\n if (!this.#editing) return;\n this.#editing = false;\n this.state = '';\n\n const raw = parseFloat(this.#inputEl?.value ?? '');\n if (!isNaN(raw)) {\n const clamped = this.#clamp(raw);\n const snapped = this.#snapToStep(clamped);\n this.value = snapped;\n this.#emitChange();\n }\n\n if (this.#valueEl) this.#valueEl.style.display = '';\n if (this.#inputEl) this.#inputEl.style.display = 'none';\n this.#updateDisplay();\n this.#display?.focus();\n }\n\n #cancelEdit(): void {\n if (!this.#editing) return;\n this.#editing = false;\n this.state = '';\n\n if (this.#valueEl) this.#valueEl.style.display = '';\n if (this.#inputEl) this.#inputEl.style.display = 'none';\n this.#display?.focus();\n }\n\n // --- Value management ---\n\n #adjustValue(delta: number): void {\n let newVal = this.value + delta;\n\n if (this.hasAttribute('wrap')) {\n newVal = this.#wrapValue(newVal);\n } else {\n newVal = this.#clamp(newVal);\n }\n\n newVal = this.#snapToStep(newVal);\n this.value = newVal;\n this.#updateDisplay();\n }\n\n #clamp(val: number): number {\n return Math.max(this.min, Math.min(this.max, val));\n }\n\n #wrapValue(val: number): number {\n const step = this.step || 1;\n const range = this.max - this.min + step;\n let wrapped = val;\n while (wrapped > this.max) wrapped -= range;\n while (wrapped < this.min) wrapped += range;\n return wrapped;\n }\n\n #snapToStep(val: number): number {\n const step = this.step;\n if (step <= 0) return this.#clamp(val);\n const snapped = Math.round((val - this.min) / step) * step + this.min;\n return this.#clamp(snapped);\n }\n\n #formatValue(val: number): string {\n const step = this.step;\n if (step >= 1) return Math.round(val).toString();\n const decimals = Math.max(0, -Math.floor(Math.log10(step)));\n return val.toFixed(decimals);\n }\n\n #updateDisplay(): void {\n if (this.#valueEl) {\n this.#valueEl.textContent = this.#formatValue(this.value);\n }\n this.#updateAria();\n }\n\n #updateAria(): void {\n if (this.#display) {\n this.#display.setAttribute('aria-valuenow', String(this.value));\n this.#display.setAttribute('aria-valuemin', String(this.min));\n this.#display.setAttribute('aria-valuemax', String(this.max));\n }\n }\n\n #emitInput(): void {\n this.emit('input', { value: this.value });\n }\n\n #emitChange(): void {\n this.emit('change', { value: this.value });\n }\n\n // --- Public API ---\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? '0');\n }\n set value(val: number) {\n this.setAttribute('value', String(val));\n }\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '1');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get drag(): 'x' | 'y' | 'none' {\n return this.#dragAxis;\n }\n set drag(val: 'x' | 'y' | 'none') {\n this.setAttribute('drag', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) this.setAttribute('disabled', '');\n else this.removeAttribute('disabled');\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n if (name === 'value' && this.#display) {\n this.#updateDisplay();\n }\n }\n\n teardown(): void {\n this.#handleButtonUp();\n }\n}\n\ncustomElements.define('ry-number-select', RyNumberSelect);\n","/**\n * <ry-color-picker>\n *\n * Color picker component with HSV grid, hue slider, and optional alpha slider.\n * Shows as a dropdown trigger by default; add `inline` for always-visible picker.\n *\n * Usage:\n * <ry-color-picker value=\"#ff0000\"></ry-color-picker>\n * <ry-color-picker value=\"#ff0000\" inline></ry-color-picker>\n * <ry-color-picker value=\"hsl(200, 100%, 50%)\" format=\"hsl\" opacity></ry-color-picker>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color conversion utilities (no external dependencies)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HSV {\n h: number; // 0-360\n s: number; // 0-100\n v: number; // 0-100\n}\n\nexport interface RGB {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n}\n\nexport interface HSL {\n h: number; // 0-360\n s: number; // 0-100\n l: number; // 0-100\n}\n\nfunction hsvToRgb(hsv: HSV): RGB {\n const h = hsv.h / 360;\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n let r = 0, g = 0, b = 0;\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0: r = v; g = t; b = p; break;\n case 1: r = q; g = v; b = p; break;\n case 2: r = p; g = v; b = t; break;\n case 3: r = p; g = q; b = v; break;\n case 4: r = t; g = p; b = v; break;\n case 5: r = v; g = p; b = q; break;\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n}\n\nfunction rgbToHsv(rgb: RGB): HSV {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : d / max;\n const v = max;\n\n if (max !== min) {\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n v: Math.round(v * 100)\n };\n}\n\nfunction hsvToHsl(hsv: HSV): HSL {\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n const l = v * (1 - s / 2);\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n\n return {\n h: hsv.h,\n s: Math.round(sl * 100),\n l: Math.round(l * 100)\n };\n}\n\nfunction hslToHsv(hsl: HSL): HSV {\n const s = hsl.s / 100;\n const l = hsl.l / 100;\n\n const v = l + s * Math.min(l, 1 - l);\n const sv = v === 0 ? 0 : 2 * (1 - l / v);\n\n return {\n h: hsl.h,\n s: Math.round(sv * 100),\n v: Math.round(v * 100)\n };\n}\n\nfunction rgbToHex(rgb: RGB): string {\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\nfunction hexToRgb(hex: string): RGB | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n // Try 3-character hex\n const short = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i.exec(hex);\n if (short) {\n return {\n r: parseInt(short[1]! + short[1]!, 16),\n g: parseInt(short[2]! + short[2]!, 16),\n b: parseInt(short[3]! + short[3]!, 16)\n };\n }\n return null;\n }\n return {\n r: parseInt(result[1]!, 16),\n g: parseInt(result[2]!, 16),\n b: parseInt(result[3]!, 16)\n };\n}\n\nfunction parseColor(input: string): { hsv: HSV; alpha: number } | null {\n const str = input.trim().toLowerCase();\n\n // Hex format\n if (str.startsWith('#')) {\n // Check for 8-character hex (with alpha)\n const hexAlpha = /^#([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(str);\n if (hexAlpha) {\n const rgb = {\n r: parseInt(hexAlpha[1]!, 16),\n g: parseInt(hexAlpha[2]!, 16),\n b: parseInt(hexAlpha[3]!, 16)\n };\n const alpha = parseInt(hexAlpha[4]!, 16) / 255;\n return { hsv: rgbToHsv(rgb), alpha: Math.round(alpha * 100) };\n }\n const rgb = hexToRgb(str);\n if (rgb) return { hsv: rgbToHsv(rgb), alpha: 100 };\n return null;\n }\n\n // RGB/RGBA format\n const rgbMatch = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/.exec(str);\n if (rgbMatch) {\n const rgb = {\n r: parseInt(rgbMatch[1]!, 10),\n g: parseInt(rgbMatch[2]!, 10),\n b: parseInt(rgbMatch[3]!, 10)\n };\n const alpha = rgbMatch[4] ? parseFloat(rgbMatch[4]) * 100 : 100;\n return { hsv: rgbToHsv(rgb), alpha };\n }\n\n // HSL/HSLA format\n const hslMatch = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/.exec(str);\n if (hslMatch) {\n const hsl = {\n h: parseFloat(hslMatch[1]!),\n s: parseFloat(hslMatch[2]!),\n l: parseFloat(hslMatch[3]!)\n };\n const alpha = hslMatch[4] ? parseFloat(hslMatch[4]) * 100 : 100;\n return { hsv: hslToHsv(hsl), alpha };\n }\n\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl';\n\nexport class RyColorPicker extends RyElement {\n #hue = 0;\n #saturation = 100;\n #brightness = 100;\n #alpha = 100;\n\n #draggingGrid = false;\n #draggingHue = false;\n #draggingAlpha = false;\n\n #trigger: HTMLElement | null = null;\n #panel: HTMLElement | null = null;\n #grid: HTMLElement | null = null;\n #gridHandle: HTMLElement | null = null;\n #hueSlider: HTMLElement | null = null;\n #hueHandle: HTMLElement | null = null;\n #alphaSlider: HTMLElement | null = null;\n #alphaHandle: HTMLElement | null = null;\n #preview: HTMLElement | null = null;\n #input: HTMLInputElement | null = null;\n\n static observedAttributes = ['value', 'format', 'opacity', 'disabled', 'swatches', 'inline'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#parseInitialValue();\n this.#updateAll();\n }\n\n #buildMarkup(): void {\n const isInline = this.hasAttribute('inline');\n const showAlpha = this.hasAttribute('opacity');\n const swatches = this.getAttribute('swatches');\n\n // Build the picker panel\n let panelHtml = `\n <div data-ry-target=\"grid\" class=\"ry-color-picker__grid\">\n <div data-ry-target=\"grid-handle\" class=\"ry-color-picker__grid-handle\" tabindex=\"0\"></div>\n </div>\n <div data-ry-target=\"controls\" class=\"ry-color-picker__controls\">\n <div data-ry-target=\"sliders\" class=\"ry-color-picker__sliders\">\n <div data-ry-target=\"hue-slider\" class=\"ry-color-picker__slider ry-color-picker__hue\">\n <div data-ry-target=\"hue-handle\" class=\"ry-color-picker__slider-handle\" tabindex=\"0\"></div>\n </div>\n ${showAlpha ? `\n <div data-ry-target=\"alpha-slider\" class=\"ry-color-picker__slider ry-color-picker__alpha\">\n <div data-ry-target=\"alpha-handle\" class=\"ry-color-picker__slider-handle\" tabindex=\"0\"></div>\n </div>\n ` : ''}\n </div>\n <div data-ry-target=\"preview\" class=\"ry-color-picker__preview\">\n <span data-ry-target=\"preview-color\" class=\"ry-color-picker__preview-color\"></span>\n </div>\n </div>\n <div data-ry-target=\"input-row\" class=\"ry-color-picker__input-row\">\n <input data-ry-target=\"input\" type=\"text\" class=\"ry-color-picker__input\" spellcheck=\"false\" />\n <button data-ry-target=\"format-toggle\" type=\"button\" class=\"ry-color-picker__format-toggle\">${this.format.toUpperCase()}</button>\n </div>\n `;\n\n // Add swatches if provided\n if (swatches) {\n const colors = swatches.split(';').map(c => c.trim()).filter(Boolean);\n if (colors.length > 0) {\n panelHtml += `<div data-ry-target=\"swatches\" class=\"ry-color-picker__swatches\">`;\n for (const color of colors) {\n panelHtml += `<button type=\"button\" class=\"ry-color-picker__swatch\" data-color=\"${color}\" style=\"background-color: ${color}\"></button>`;\n }\n panelHtml += `</div>`;\n }\n }\n\n if (isInline) {\n // Inline mode: just show the panel\n this.innerHTML = `<div data-ry-target=\"panel\" class=\"ry-color-picker__panel ry-color-picker__panel--inline\">${panelHtml}</div>`;\n } else {\n // Dropdown mode: trigger + panel\n this.innerHTML = `\n <button data-ry-target=\"trigger\" type=\"button\" class=\"ry-color-picker__trigger\">\n <span data-ry-target=\"trigger-color\" class=\"ry-color-picker__trigger-color\"></span>\n </button>\n <div data-ry-target=\"panel\" class=\"ry-color-picker__panel\">${panelHtml}</div>\n `;\n }\n\n // Cache references\n this.#trigger = this.$('[data-ry-target=\"trigger\"]');\n this.#panel = this.$('[data-ry-target=\"panel\"]');\n this.#grid = this.$('[data-ry-target=\"grid\"]');\n this.#gridHandle = this.$('[data-ry-target=\"grid-handle\"]');\n this.#hueSlider = this.$('[data-ry-target=\"hue-slider\"]');\n this.#hueHandle = this.$('[data-ry-target=\"hue-handle\"]');\n this.#alphaSlider = this.$('[data-ry-target=\"alpha-slider\"]');\n this.#alphaHandle = this.$('[data-ry-target=\"alpha-handle\"]');\n this.#preview = this.$('[data-ry-target=\"preview\"]');\n this.#input = this.$('[data-ry-target=\"input\"]');\n }\n\n #bindEvents(): void {\n // Trigger click (dropdown mode)\n if (this.#trigger) {\n this.on(this.#trigger, 'click', this.#handleTriggerClick);\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleDocumentClick);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleDocumentKeydown);\n\n // Grid dragging\n if (this.#grid) {\n this.on(this.#grid, 'pointerdown', this.#handleGridDown);\n }\n if (this.#gridHandle) {\n this.on(this.#gridHandle, 'keydown', this.#handleGridKeydown);\n }\n\n // Hue slider\n if (this.#hueSlider) {\n this.on(this.#hueSlider, 'pointerdown', this.#handleHueDown);\n }\n if (this.#hueHandle) {\n this.on(this.#hueHandle, 'keydown', this.#handleHueKeydown);\n }\n\n // Alpha slider\n if (this.#alphaSlider) {\n this.on(this.#alphaSlider, 'pointerdown', this.#handleAlphaDown);\n }\n if (this.#alphaHandle) {\n this.on(this.#alphaHandle, 'keydown', this.#handleAlphaKeydown);\n }\n\n // Document events for drag\n this.on(document, 'pointermove', this.#handlePointerMove);\n this.on(document, 'pointerup', this.#handlePointerUp);\n\n // Input\n if (this.#input) {\n this.on(this.#input, 'change', this.#handleInputChange);\n this.on(this.#input, 'keydown', this.#handleInputKeydown);\n }\n\n // Format toggle\n const formatToggle = this.$<HTMLButtonElement>('[data-ry-target=\"format-toggle\"]');\n if (formatToggle) {\n this.on(formatToggle, 'click', this.#handleFormatToggle);\n }\n\n // Swatches\n const swatchContainer = this.$('[data-ry-target=\"swatches\"]');\n if (swatchContainer) {\n this.on(swatchContainer, 'click', this.#handleSwatchClick);\n }\n }\n\n #parseInitialValue(): void {\n const value = this.getAttribute('value');\n if (value) {\n const parsed = parseColor(value);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n this.#alpha = parsed.alpha;\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Dropdown handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleTriggerClick = (): void => {\n if (this.disabled) return;\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n };\n\n #handleDocumentClick = (e: Event): void => {\n if (this.state !== 'open') return;\n if (!this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n #handleDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.state === 'open') {\n this.close();\n this.#trigger?.focus();\n }\n };\n\n open(): void {\n if (this.hasAttribute('inline')) return;\n // Position BEFORE showing to avoid flicker\n this.#positionPanel();\n this.state = 'open';\n }\n\n close(): void {\n if (this.hasAttribute('inline')) return;\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n }\n\n #positionPanel(): void {\n if (!this.#panel || !this.#trigger) return;\n\n const triggerRect = this.#trigger.getBoundingClientRect();\n const panelHeight = 320; // Approximate panel height\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n\n // Open upward if not enough space below and more space above\n if (spaceBelow < panelHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Grid handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleGridDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingGrid = true;\n this.#gridHandle?.focus();\n this.#updateFromGridPointer(e);\n };\n\n #updateFromGridPointer(e: PointerEvent): void {\n if (!this.#grid) return;\n const rect = this.#grid.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));\n\n this.#saturation = Math.round(x * 100);\n this.#brightness = Math.round((1 - y) * 100);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleGridKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n this.#saturation = Math.min(100, this.#saturation + step);\n changed = true;\n break;\n case 'ArrowLeft':\n this.#saturation = Math.max(0, this.#saturation - step);\n changed = true;\n break;\n case 'ArrowUp':\n this.#brightness = Math.min(100, this.#brightness + step);\n changed = true;\n break;\n case 'ArrowDown':\n this.#brightness = Math.max(0, this.#brightness - step);\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Hue handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleHueDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingHue = true;\n this.#hueHandle?.focus();\n this.#updateFromHuePointer(e);\n };\n\n #updateFromHuePointer(e: PointerEvent): void {\n if (!this.#hueSlider) return;\n const rect = this.#hueSlider.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n this.#hue = Math.round(x * 360);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleHueKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n this.#hue = (this.#hue + step) % 360;\n changed = true;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n this.#hue = (this.#hue - step + 360) % 360;\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Alpha handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleAlphaDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingAlpha = true;\n this.#alphaHandle?.focus();\n this.#updateFromAlphaPointer(e);\n };\n\n #updateFromAlphaPointer(e: PointerEvent): void {\n if (!this.#alphaSlider) return;\n const rect = this.#alphaSlider.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n this.#alpha = Math.round(x * 100);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleAlphaKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n this.#alpha = Math.min(100, this.#alpha + step);\n changed = true;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n this.#alpha = Math.max(0, this.#alpha - step);\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Pointer move/up\n // ───────────────────────────────────────────────────────────────────────────\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (this.#draggingGrid) {\n this.#updateFromGridPointer(e);\n } else if (this.#draggingHue) {\n this.#updateFromHuePointer(e);\n } else if (this.#draggingAlpha) {\n this.#updateFromAlphaPointer(e);\n }\n };\n\n #handlePointerUp = (): void => {\n if (this.#draggingGrid || this.#draggingHue || this.#draggingAlpha) {\n this.#draggingGrid = false;\n this.#draggingHue = false;\n this.#draggingAlpha = false;\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Input handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleInputChange = (): void => {\n if (!this.#input) return;\n const parsed = parseColor(this.#input.value);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n this.#emitChange();\n } else {\n // Reset to current value on invalid input\n this.#updateInput();\n }\n };\n\n #handleInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#handleInputChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Format toggle\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleFormatToggle = (): void => {\n const formats: ColorFormat[] = ['hex', 'rgb', 'hsl'];\n const current = this.format;\n const idx = formats.indexOf(current);\n const next = formats[(idx + 1) % formats.length]!;\n this.format = next;\n\n const btn = this.$<HTMLButtonElement>('[data-ry-target=\"format-toggle\"]');\n if (btn) btn.textContent = next.toUpperCase();\n\n this.#updateInput();\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Swatches\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleSwatchClick = (e: Event): void => {\n const target = e.target as HTMLElement;\n if (target.classList.contains('ry-color-picker__swatch')) {\n const color = target.dataset.color;\n if (color) {\n const parsed = parseColor(color);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n }\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Update methods\n // ───────────────────────────────────────────────────────────────────────────\n\n #updateAll(): void {\n this.#updateTrigger();\n this.#updateGrid();\n this.#updateHueSlider();\n this.#updateAlphaSlider();\n this.#updatePreview();\n this.#updateInput();\n this.#syncValueAttribute();\n }\n\n #updateTrigger(): void {\n const triggerColor = this.$('[data-ry-target=\"trigger-color\"]');\n if (triggerColor) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const alpha = this.hasAttribute('opacity') ? this.#alpha / 100 : 1;\n (triggerColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #updateGrid(): void {\n if (this.#grid) {\n // Set grid background to current hue at full saturation\n const rgb = hsvToRgb({ h: this.#hue, s: 100, v: 100 });\n this.#grid.style.setProperty('--grid-hue-color', `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`);\n }\n if (this.#gridHandle) {\n this.#gridHandle.style.left = `${this.#saturation}%`;\n this.#gridHandle.style.top = `${100 - this.#brightness}%`;\n }\n }\n\n #updateHueSlider(): void {\n if (this.#hueHandle) {\n this.#hueHandle.style.left = `${(this.#hue / 360) * 100}%`;\n }\n }\n\n #updateAlphaSlider(): void {\n if (this.#alphaSlider) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n this.#alphaSlider.style.setProperty('--alpha-color', `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`);\n }\n if (this.#alphaHandle) {\n this.#alphaHandle.style.left = `${this.#alpha}%`;\n }\n }\n\n #updatePreview(): void {\n const previewColor = this.$('[data-ry-target=\"preview-color\"]');\n if (previewColor) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const alpha = this.hasAttribute('opacity') ? this.#alpha / 100 : 1;\n (previewColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #updateInput(): void {\n if (this.#input) {\n this.#input.value = this.#formatValue();\n }\n }\n\n #syncValueAttribute(): void {\n // Update the value attribute without triggering attributeChangedCallback loop\n const formatted = this.#formatValue();\n if (this.getAttribute('value') !== formatted) {\n this.setAttribute('value', formatted);\n }\n }\n\n #formatValue(): string {\n const format = this.format;\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const showAlpha = this.hasAttribute('opacity');\n\n switch (format) {\n case 'hex': {\n const hex = rgbToHex(rgb);\n if (showAlpha && this.#alpha < 100) {\n const alphaHex = Math.round((this.#alpha / 100) * 255).toString(16).padStart(2, '0');\n return hex + alphaHex;\n }\n return hex;\n }\n case 'rgb': {\n if (showAlpha) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${(this.#alpha / 100).toFixed(2)})`;\n }\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n }\n case 'hsl': {\n const hsl = hsvToHsl({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n if (showAlpha) {\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${(this.#alpha / 100).toFixed(2)})`;\n }\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n default:\n return rgbToHex(rgb);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Events\n // ───────────────────────────────────────────────────────────────────────────\n\n #emitInput(): void {\n this.emit('input', { value: this.value, hsv: this.hsv, rgb: this.rgb });\n }\n\n #emitChange(): void {\n this.emit('change', { value: this.value, hsv: this.hsv, rgb: this.rgb });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Attribute changed\n // ───────────────────────────────────────────────────────────────────────────\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'value' && this.#grid) {\n // External value change - parse and update\n if (newValue) {\n const parsed = parseColor(newValue);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateTrigger();\n this.#updateGrid();\n this.#updateHueSlider();\n this.#updateAlphaSlider();\n this.#updatePreview();\n // Don't update input here to avoid cursor issues during typing\n }\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────────────────\n\n get value(): string {\n return this.#formatValue();\n }\n\n set value(val: string) {\n const parsed = parseColor(val);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n }\n }\n\n get format(): ColorFormat {\n return (this.getAttribute('format') as ColorFormat) || 'hex';\n }\n\n set format(val: ColorFormat) {\n this.setAttribute('format', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get hsv(): HSV {\n return { h: this.#hue, s: this.#saturation, v: this.#brightness };\n }\n\n get rgb(): RGB {\n return hsvToRgb(this.hsv);\n }\n\n get hsl(): HSL {\n return hsvToHsl(this.hsv);\n }\n\n get alpha(): number {\n return this.#alpha;\n }\n\n set alpha(val: number) {\n this.#alpha = Math.max(0, Math.min(100, val));\n this.#updateAll();\n }\n\n /** Set color from any valid color string */\n setColor(colorString: string): boolean {\n const parsed = parseColor(colorString);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n return true;\n }\n return false;\n }\n\n /** Get color in specific format */\n getFormattedValue(format: ColorFormat): string {\n const originalFormat = this.format;\n this.format = format;\n const value = this.#formatValue();\n this.format = originalFormat;\n return value;\n }\n}\n\ncustomElements.define('ry-color-picker', RyColorPicker);\n","/**\n * <ry-color-input>\n *\n * Input-style color picker with swatch preview and editable hex value.\n * Composes ry-color-picker internally for the picker panel.\n *\n * Usage:\n * <ry-color-input value=\"#ff0000\"></ry-color-input>\n * <ry-color-input value=\"#ff0000\" opacity></ry-color-input>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { RyColorPicker, RGB, HSL, HSV } from './ry-color-picker.js';\n\nexport class RyColorInput extends RyElement {\n #swatch: HTMLElement | null = null;\n #input: HTMLInputElement | null = null;\n #panel: HTMLElement | null = null;\n #picker: RyColorPicker | null = null;\n\n static observedAttributes = ['value', 'format', 'opacity', 'disabled', 'placeholder'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#syncFromValue();\n // Start closed\n this.state = 'closed';\n }\n\n #buildMarkup(): void {\n const showAlpha = this.hasAttribute('opacity');\n const format = this.getAttribute('format') || 'hex';\n const value = this.getAttribute('value') || '#000000';\n const placeholder = this.getAttribute('placeholder') || '#000000';\n\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-color-input__trigger\">\n <button data-ry-target=\"swatch\" type=\"button\" class=\"ry-color-input__swatch\">\n <span data-ry-target=\"swatch-color\" class=\"ry-color-input__swatch-color\"></span>\n </button>\n <input\n data-ry-target=\"input\"\n type=\"text\"\n class=\"ry-color-input__input\"\n value=\"${value.startsWith('#') ? value : '#' + value}\"\n placeholder=\"${placeholder.startsWith('#') ? placeholder : '#' + placeholder}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"7\"\n />\n </div>\n <div data-ry-target=\"panel\" class=\"ry-color-input__panel\">\n <ry-color-picker\n data-ry-target=\"picker\"\n inline\n value=\"${value}\"\n format=\"${format}\"\n ${showAlpha ? 'opacity' : ''}\n ></ry-color-picker>\n </div>\n `;\n\n this.#swatch = this.$('[data-ry-target=\"swatch\"]');\n this.#input = this.$('[data-ry-target=\"input\"]');\n this.#panel = this.$('[data-ry-target=\"panel\"]');\n this.#picker = this.$('[data-ry-target=\"picker\"]') as RyColorPicker;\n }\n\n #bindEvents(): void {\n // Swatch click opens/closes panel\n if (this.#swatch) {\n this.on(this.#swatch, 'click', this.#handleSwatchClick);\n }\n\n // Input changes update the picker\n if (this.#input) {\n this.on(this.#input, 'input', this.#handleInputChange);\n this.on(this.#input, 'keydown', this.#handleInputKeydown);\n this.on(this.#input, 'focus', this.#handleInputFocus);\n }\n\n // Picker changes update the input\n if (this.#picker) {\n this.on(this.#picker, 'ry:input', this.#handlePickerInput);\n this.on(this.#picker, 'ry:change', this.#handlePickerChange);\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleDocumentClick);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleDocumentKeydown);\n }\n\n #handleSwatchClick = (): void => {\n if (this.disabled) return;\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n };\n\n #handleInputFocus = (): void => {\n if (this.disabled) return;\n this.open();\n };\n\n #handleInputChange = (): void => {\n if (!this.#input || !this.#picker) return;\n\n let value = this.#input.value;\n const cursorPos = this.#input.selectionStart ?? value.length;\n\n // Filter to only # and hex characters\n const filtered = value.replace(/[^#a-fA-F0-9]/g, '');\n\n // Normalize: ensure single # at start\n const hexPart = filtered.replace(/#/g, '').slice(0, 6);\n const normalized = '#' + hexPart;\n\n // Only update input if we actually changed something\n if (value !== normalized) {\n this.#input.value = normalized;\n // Keep cursor in reasonable position\n const newPos = Math.min(cursorPos, normalized.length);\n this.#input.setSelectionRange(newPos, newPos);\n }\n\n // Update picker with expanded color\n const expanded = this.#expandPartialHex(normalized);\n if (expanded) {\n this.#picker.setColor(expanded);\n this.#updateSwatch();\n if (this.#isCompleteColor(normalized)) {\n this.#syncValueAttribute();\n }\n this.emit('input', { value: this.value });\n }\n };\n\n #expandPartialHex(value: string): string | null {\n let color = value;\n if (!color.startsWith('#')) color = '#' + color;\n\n const hex = color.slice(1);\n if (!/^[a-fA-F0-9]+$/.test(hex) || hex.length === 0) {\n return null;\n }\n\n // 6 chars - use as-is\n if (hex.length === 6) {\n return color;\n }\n\n // 1-3 chars - pad to 3, then CSS shorthand expand\n // #f → #fff → #ffffff\n // #fa → #faa → #ffaaaa\n // #f00 → #ff0000\n if (hex.length <= 3) {\n const padded = hex.padEnd(3, hex[hex.length - 1]!);\n const [r, g, b] = padded.split('');\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n\n // 4-5 chars - pad with zeros\n // #f00a → #f00a00\n // #f00ab → #f00ab0\n return '#' + hex.padEnd(6, '0');\n }\n\n #isCompleteColor(value: string): boolean {\n // Only 3 or 6 char hex are \"complete\"\n if (/^#[a-fA-F0-9]{6}$/.test(value)) return true;\n if (/^#[a-fA-F0-9]{3}$/.test(value)) return true;\n return false;\n }\n\n #handleInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#handleInputChange();\n this.emit('change', { value: this.value });\n }\n };\n\n #handlePickerInput = (): void => {\n if (!this.#picker || !this.#input) return;\n\n // Don't overwrite input if user is typing in it\n if (document.activeElement !== this.#input) {\n this.#input.value = this.#picker.value;\n }\n\n this.#updateSwatch();\n this.#syncValueAttribute();\n this.emit('input', { value: this.value });\n };\n\n #handlePickerChange = (): void => {\n this.emit('change', { value: this.value });\n };\n\n #handleDocumentClick = (e: Event): void => {\n if (this.state !== 'open') return;\n if (!this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n #handleDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.state === 'open') {\n this.close();\n this.#swatch?.focus();\n }\n };\n\n open(): void {\n this.#positionPanel();\n this.state = 'open';\n }\n\n close(): void {\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n }\n\n #positionPanel(): void {\n if (!this.#panel) return;\n\n const rect = this.getBoundingClientRect();\n const panelHeight = 280;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < panelHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n #updateSwatch(): void {\n const swatchColor = this.$('[data-ry-target=\"swatch-color\"]');\n if (swatchColor && this.#picker) {\n const rgb = this.#picker.rgb;\n const alpha = this.hasAttribute('opacity') ? this.#picker.alpha / 100 : 1;\n (swatchColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #syncFromValue(): void {\n const value = this.getAttribute('value') || '#000000';\n if (this.#picker) {\n this.#picker.setColor(value);\n if (this.#input) {\n // Always show as hex with #\n const hex = this.#picker.value;\n this.#input.value = hex.startsWith('#') ? hex : '#' + hex;\n }\n this.#updateSwatch();\n }\n }\n\n #syncValueAttribute(): void {\n if (this.#picker) {\n const formatted = this.#picker.value;\n if (this.getAttribute('value') !== formatted) {\n this.setAttribute('value', formatted);\n }\n }\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'value' && this.#picker && this.#input) {\n if (newValue) {\n this.#picker.setColor(newValue);\n // Don't overwrite input if user is typing\n if (document.activeElement !== this.#input) {\n this.#input.value = this.#picker.value;\n }\n this.#updateSwatch();\n }\n }\n\n if (name === 'disabled') {\n if (this.#input) {\n if (newValue !== null) {\n this.#input.setAttribute('disabled', '');\n } else {\n this.#input.removeAttribute('disabled');\n }\n }\n }\n }\n\n // Public API\n get value(): string {\n return this.#picker?.value ?? this.getAttribute('value') ?? '#000000';\n }\n\n set value(val: string) {\n if (this.#picker?.setColor(val)) {\n if (this.#input) {\n this.#input.value = this.#picker.value;\n }\n this.#updateSwatch();\n this.#syncValueAttribute();\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get rgb(): RGB {\n return this.#picker?.rgb ?? { r: 0, g: 0, b: 0 };\n }\n\n get hsl(): HSL {\n return this.#picker?.hsl ?? { h: 0, s: 0, l: 0 };\n }\n\n get hsv(): HSV {\n return this.#picker?.hsv ?? { h: 0, s: 0, v: 0 };\n }\n}\n\ncustomElements.define('ry-color-input', RyColorInput);\n","/**\n * <ry-gradient-picker>\n *\n * Gradient editor with draggable color stops, type toggle, and inline color picker.\n * Supports linear and radial gradients with unlimited stops.\n *\n * Usage:\n * <ry-gradient-picker value=\"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\"></ry-gradient-picker>\n * <ry-gradient-picker value=\"radial-gradient(circle, #ff0000 0%, #00ff00 50%, #0000ff 100%)\"></ry-gradient-picker>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\nimport type { RyColorPicker } from './ry-color-picker.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface GradientStop {\n id: string;\n color: string;\n position: number; // 0-100\n}\n\nexport type GradientType = 'solid' | 'linear' | 'radial';\nexport type RadialShape = 'circle' | 'ellipse';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Minimal color parsing for interpolation (avoids touching ry-color-picker)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SimpleRGB { r: number; g: number; b: number }\n\nfunction parseColorToRgb(str: string): SimpleRGB | null {\n const s = str.trim().toLowerCase();\n\n // Hex\n if (s.startsWith('#')) {\n const hex = s.slice(1);\n if (hex.length === 3) {\n return {\n r: parseInt(hex[0]! + hex[0]!, 16),\n g: parseInt(hex[1]! + hex[1]!, 16),\n b: parseInt(hex[2]! + hex[2]!, 16),\n };\n }\n if (hex.length >= 6) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n return null;\n }\n\n // rgb/rgba\n const rgbMatch = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/.exec(s);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1]!, 10),\n g: parseInt(rgbMatch[2]!, 10),\n b: parseInt(rgbMatch[3]!, 10),\n };\n }\n\n // hsl/hsla → convert to RGB\n const hslMatch = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/.exec(s);\n if (hslMatch) {\n const h = parseFloat(hslMatch[1]!) / 360;\n const sat = parseFloat(hslMatch[2]!) / 100;\n const l = parseFloat(hslMatch[3]!) / 100;\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + sat) : l + sat - l * sat;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n}\n\nfunction rgbToHex(rgb: SimpleRGB): string {\n const toHex = (n: number) => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\nfunction lerpRgb(a: SimpleRGB, b: SimpleRGB, t: number): SimpleRGB {\n return {\n r: Math.round(a.r + (b.r - a.r) * t),\n g: Math.round(a.g + (b.g - a.g) * t),\n b: Math.round(a.b + (b.b - a.b) * t),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_VALUE = 'linear-gradient(90deg, #000000 0%, #ffffff 100%)';\nconst DRAG_OFF_THRESHOLD = 50; // px vertical distance to trigger delete\n\nexport class RyGradientPicker extends RyElement {\n #type: GradientType = 'linear';\n #angle = 90;\n #shape: RadialShape = 'circle';\n #stops: GradientStop[] = [];\n #selectedStopId: string | null = null;\n #nextStopId = 0;\n\n #draggingStopId: string | null = null;\n #draggingOffBar = false;\n #barRect: DOMRect | null = null;\n #syncing = false;\n\n // Cached DOM refs\n #bar: HTMLElement | null = null;\n #picker: RyColorPicker | null = null;\n #outputInput: HTMLInputElement | null = null;\n\n static observedAttributes = ['value', 'disabled', 'output'] as const;\n\n setup(): void {\n this.#parseInitialValue();\n this.#buildMarkup();\n this.#bindEvents();\n this.#updateAll();\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Parsing / Serialization\n // ───────────────────────────────────────────────────────────────────────────\n\n #parseInitialValue(): void {\n const val = this.getAttribute('value') || DEFAULT_VALUE;\n if (!this.#parseGradient(val)) {\n this.#parseGradient(DEFAULT_VALUE);\n }\n }\n\n #parseGradient(css: string): boolean {\n const str = css.trim();\n\n // Solid color (not a gradient function)\n if (!str.startsWith('linear-gradient(') && !str.startsWith('radial-gradient(')) {\n const rgb = parseColorToRgb(str);\n if (!rgb) return false;\n this.#type = 'solid';\n this.#stops = [this.#createStop(str, 0), this.#createStop(str, 100)];\n this.#selectedStopId = this.#stops[0]!.id;\n return true;\n }\n\n let type: GradientType;\n let inner: string;\n\n if (str.startsWith('linear-gradient(')) {\n type = 'linear';\n inner = str.slice('linear-gradient('.length, -1);\n } else {\n type = 'radial';\n inner = str.slice('radial-gradient('.length, -1);\n }\n\n // Parse direction/shape from the start of inner\n let angle = 90;\n let shape: RadialShape = 'circle';\n let stopsStr = inner;\n\n if (type === 'linear') {\n // Match angle: \"90deg\" or \"to right\" etc.\n const angleMatch = /^([\\d.]+)deg\\s*,\\s*/.exec(inner);\n if (angleMatch) {\n angle = parseFloat(angleMatch[1]!);\n stopsStr = inner.slice(angleMatch[0].length);\n } else {\n const toMatch = /^to\\s+\\w+(?:\\s+\\w+)?\\s*,\\s*/.exec(inner);\n if (toMatch) {\n // Convert \"to right\" → 90deg, etc. (simplified)\n const dir = toMatch[0].trim().replace(/,\\s*$/, '');\n angle = this.#directionToAngle(dir);\n stopsStr = inner.slice(toMatch[0].length);\n }\n }\n } else {\n // Radial: match \"circle\" or \"ellipse\" at start\n const shapeMatch = /^(circle|ellipse)(?:\\s+at\\s+[^,]+)?\\s*,\\s*/.exec(inner);\n if (shapeMatch) {\n shape = shapeMatch[1] as RadialShape;\n stopsStr = inner.slice(shapeMatch[0].length);\n }\n }\n\n // Parse color stops\n const stops: GradientStop[] = [];\n // Match colors followed by optional percentage\n // This regex handles: #hex, rgb(...), rgba(...), hsl(...), hsla(...), named colors\n const stopRegex = /(#[a-fA-F0-9]{3,8}|rgba?\\([^)]+\\)|hsla?\\([^)]+\\)|[a-z]+)\\s+([\\d.]+)%/g;\n let match: RegExpExecArray | null;\n\n while ((match = stopRegex.exec(stopsStr)) !== null) {\n stops.push(this.#createStop(match[1]!, parseFloat(match[2]!)));\n }\n\n if (stops.length < 2) return false;\n\n this.#type = type;\n this.#angle = angle;\n this.#shape = shape;\n this.#stops = stops;\n this.#selectedStopId = stops[0]!.id;\n return true;\n }\n\n #directionToAngle(dir: string): number {\n const map: Record<string, number> = {\n 'to top': 0, 'to top right': 45, 'to right': 90,\n 'to bottom right': 135, 'to bottom': 180, 'to bottom left': 225,\n 'to left': 270, 'to top left': 315,\n };\n return map[dir] ?? 90;\n }\n\n #serializeGradient(): string {\n if (this.#type === 'solid') {\n return this.#stops[0]?.color ?? '#000000';\n }\n\n const stopsStr = this.#stops\n .map(s => `${s.color} ${Math.round(s.position)}%`)\n .join(', ');\n\n if (this.#type === 'linear') {\n return `linear-gradient(${Math.round(this.#angle)}deg, ${stopsStr})`;\n }\n return `radial-gradient(${this.#shape}, ${stopsStr})`;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Stop management\n // ───────────────────────────────────────────────────────────────────────────\n\n #createStop(color: string, position: number): GradientStop {\n return { id: `stop-${this.#nextStopId++}`, color, position };\n }\n\n /** CSS left value clamped so the stop handle stays within the bar */\n #stopLeft(position: number): string {\n const half = 'calc(var(--ry-gradient-picker-stop-size, 16px) / 2)';\n return `clamp(${half}, ${position}%, calc(100% - ${half}))`;\n }\n\n #addStop(color: string, position: number): void {\n const stop = this.#createStop(color, position);\n this.#stops.push(stop);\n this.#sortStops();\n this.#selectedStopId = stop.id;\n this.#renderStops();\n this.#updateAll();\n }\n\n #removeStop(id: string): boolean {\n if (this.#stops.length <= 2) return false;\n const idx = this.#stops.findIndex(s => s.id === id);\n if (idx === -1) return false;\n\n this.#stops.splice(idx, 1);\n\n // Select a neighbor if we removed the selected stop\n if (this.#selectedStopId === id) {\n this.#selectedStopId = this.#stops[Math.min(idx, this.#stops.length - 1)]?.id ?? null;\n }\n\n this.#renderStops();\n this.#updateAll();\n return true;\n }\n\n #selectStop(id: string): void {\n if (this.#selectedStopId === id) return;\n this.#selectedStopId = id;\n this.#updateStopSelection();\n this.#updatePicker();\n }\n\n #sortStops(): void {\n this.#stops.sort((a, b) => a.position - b.position);\n }\n\n #getSelectedStop(): GradientStop | null {\n return this.#stops.find(s => s.id === this.#selectedStopId) ?? null;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Markup\n // ───────────────────────────────────────────────────────────────────────────\n\n #buildMarkup(): void {\n const showOutput = this.hasAttribute('output');\n const copyIcon = getIcon('copy');\n const solidIcon = getIcon('gradient-solid');\n const linearIcon = getIcon('gradient-linear');\n const radialIcon = getIcon('gradient-radial');\n const circleIcon = getIcon('shape-circle');\n const ellipseIcon = getIcon('shape-ellipse');\n\n let outputHtml = '';\n if (showOutput) {\n outputHtml = `\n <div data-ry-target=\"output-row\" class=\"ry-gradient-picker__output-row\">\n <input data-ry-target=\"output\" type=\"text\" class=\"ry-gradient-picker__output\" spellcheck=\"false\" />\n <button data-ry-target=\"copy-btn\" type=\"button\" class=\"ry-gradient-picker__copy-btn\">${copyIcon}</button>\n </div>`;\n }\n\n this.innerHTML = `\n <div data-ry-target=\"controls\" class=\"ry-gradient-picker__controls\">\n <div data-ry-target=\"type-toggle\" class=\"ry-gradient-picker__type-toggle\">\n <button data-ry-target=\"type-solid\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${solidIcon}</button>\n <button data-ry-target=\"type-linear\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${linearIcon}</button>\n <button data-ry-target=\"type-radial\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${radialIcon}</button>\n </div>\n <div data-ry-target=\"angle-control\" class=\"ry-gradient-picker__angle-control\">\n <ry-number-select data-ry-target=\"angle-select\" min=\"0\" max=\"360\" step=\"1\" value=\"${this.#angle}\" wrap suffix=\"\\u00b0\" size=\"xs\" arrows=\"none\"></ry-number-select>\n </div>\n <div data-ry-target=\"shape-control\" class=\"ry-gradient-picker__shape-control\">\n <button data-ry-target=\"shape-circle\" type=\"button\" class=\"ry-gradient-picker__shape-btn\">${circleIcon}</button>\n <button data-ry-target=\"shape-ellipse\" type=\"button\" class=\"ry-gradient-picker__shape-btn\">${ellipseIcon}</button>\n </div>\n </div>\n <div data-ry-target=\"bar-container\" class=\"ry-gradient-picker__bar-container\">\n <div data-ry-target=\"bar\" class=\"ry-gradient-picker__bar\"></div>\n </div>\n <ry-color-picker data-ry-target=\"picker\" inline opacity></ry-color-picker>\n ${outputHtml}\n `;\n\n // Cache refs\n this.#bar = this.$('[data-ry-target=\"bar\"]');\n this.#picker = this.$('[data-ry-target=\"picker\"]') as RyColorPicker;\n this.#outputInput = this.$('[data-ry-target=\"output\"]') as HTMLInputElement | null;\n\n // Render stop handles on the bar\n this.#renderStops();\n }\n\n #renderStops(): void {\n if (!this.#bar) return;\n\n // Remove existing stop handles\n this.#bar.querySelectorAll('[data-ry-target=\"stop\"]').forEach(el => el.remove());\n\n // Create stop handles\n for (const stop of this.#stops) {\n const el = document.createElement('div');\n el.setAttribute('data-ry-target', 'stop');\n el.setAttribute('data-stop-id', stop.id);\n el.classList.add('ry-gradient-picker__stop');\n el.tabIndex = 0;\n el.style.left = this.#stopLeft(stop.position);\n el.style.setProperty('--stop-color', stop.color);\n if (stop.id === this.#selectedStopId) {\n el.setAttribute('data-selected', '');\n }\n this.#bar.appendChild(el);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Event binding\n // ───────────────────────────────────────────────────────────────────────────\n\n #bindEvents(): void {\n // Bar: click to add, pointerdown on stops, drag and release\n if (this.#bar) {\n this.on(this.#bar, 'pointerdown', this.#handleBarDown);\n this.on(this.#bar, 'pointermove', this.#handlePointerMove);\n this.on(this.#bar, 'pointerup', this.#handlePointerUp);\n this.on(this.#bar, 'lostpointercapture', this.#handlePointerUp);\n }\n\n // Type toggle\n const solidBtn = this.$('[data-ry-target=\"type-solid\"]');\n const linearBtn = this.$('[data-ry-target=\"type-linear\"]');\n const radialBtn = this.$('[data-ry-target=\"type-radial\"]');\n if (solidBtn) this.on(solidBtn, 'click', () => this.#handleTypeToggle('solid'));\n if (linearBtn) this.on(linearBtn, 'click', () => this.#handleTypeToggle('linear'));\n if (radialBtn) this.on(radialBtn, 'click', () => this.#handleTypeToggle('radial'));\n\n // Angle select\n const angleSelect = this.$('[data-ry-target=\"angle-select\"]');\n if (angleSelect) this.on(angleSelect, 'ry:input', this.#handleAngleInput);\n\n // Shape toggle\n const circleBtn = this.$('[data-ry-target=\"shape-circle\"]');\n const ellipseBtn = this.$('[data-ry-target=\"shape-ellipse\"]');\n if (circleBtn) this.on(circleBtn, 'click', () => this.#handleShapeToggle('circle'));\n if (ellipseBtn) this.on(ellipseBtn, 'click', () => this.#handleShapeToggle('ellipse'));\n\n // Color picker\n if (this.#picker) {\n this.on(this.#picker, 'ry:input', this.#handlePickerInput);\n this.on(this.#picker, 'ry:change', this.#handlePickerChange);\n }\n\n // Output input (editable CSS)\n if (this.#outputInput) {\n this.on(this.#outputInput, 'keydown', this.#handleOutputKeydown);\n this.on(this.#outputInput, 'blur', this.#handleOutputBlur);\n }\n\n // Copy button\n const copyBtn = this.$('[data-ry-target=\"copy-btn\"]');\n if (copyBtn) this.on(copyBtn, 'click', this.#handleCopy);\n\n // Keyboard on bar (delegated from stop handles)\n if (this.#bar) {\n this.on(this.#bar, 'keydown', this.#handleStopKeydown);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Bar / Stop interaction handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleBarDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n\n const target = e.target as HTMLElement;\n const stopEl = target.closest('[data-ry-target=\"stop\"]') as HTMLElement | null;\n\n if (stopEl) {\n // Start dragging existing stop\n const stopId = stopEl.getAttribute('data-stop-id');\n if (!stopId) return;\n e.preventDefault();\n this.#draggingStopId = stopId;\n this.#draggingOffBar = false;\n this.#barRect = this.#bar!.getBoundingClientRect();\n this.#selectStop(stopId);\n this.#bar!.setPointerCapture(e.pointerId);\n stopEl.focus();\n } else {\n // Click on empty bar → add stop and start dragging it\n e.preventDefault();\n if (!this.#bar) return;\n const rect = this.#bar.getBoundingClientRect();\n const position = Math.round(Math.max(0, Math.min(100, ((e.clientX - rect.left) / rect.width) * 100)));\n const color = this.#interpolateColorAt(position);\n this.#addStop(color, position);\n const newStopEl = this.#bar.querySelector(`[data-stop-id=\"${this.#selectedStopId}\"]`) as HTMLElement | null;\n newStopEl?.focus();\n // Start dragging the new stop immediately\n this.#draggingStopId = this.#selectedStopId;\n this.#draggingOffBar = false;\n this.#barRect = rect;\n this.#bar.setPointerCapture(e.pointerId);\n this.#emitInput();\n }\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#draggingStopId || !this.#barRect) return;\n\n const stop = this.#stops.find(s => s.id === this.#draggingStopId);\n if (!stop) return;\n\n // Horizontal: position\n const x = Math.max(0, Math.min(1, (e.clientX - this.#barRect.left) / this.#barRect.width));\n stop.position = Math.round(x * 100);\n\n // Vertical: detect drag-off for deletion\n const barCenterY = this.#barRect.top + this.#barRect.height / 2;\n const yDist = Math.abs(e.clientY - barCenterY);\n this.#draggingOffBar = yDist > DRAG_OFF_THRESHOLD && this.#stops.length > 2;\n\n // Update the stop handle\n const stopEl = this.#bar?.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (stopEl) {\n stopEl.style.left = this.#stopLeft(stop.position);\n if (this.#draggingOffBar) {\n stopEl.style.opacity = '0.3';\n stopEl.style.transform = 'translate(-50%, -50%) scale(0.7)';\n } else {\n stopEl.style.opacity = '';\n stopEl.style.transform = '';\n }\n }\n\n this.#sortStops();\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#emitInput();\n };\n\n #handlePointerUp = (): void => {\n if (!this.#draggingStopId) return;\n\n if (this.#draggingOffBar) {\n this.#removeStop(this.#draggingStopId);\n }\n\n this.#draggingStopId = null;\n this.#draggingOffBar = false;\n this.#barRect = null;\n this.#syncValueAttribute();\n this.#emitChange();\n };\n\n #handleStopKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const target = e.target as HTMLElement;\n const stopEl = target.closest('[data-ry-target=\"stop\"]') as HTMLElement | null;\n if (!stopEl) return;\n\n const stopId = stopEl.getAttribute('data-stop-id');\n if (!stopId) return;\n\n const stop = this.#stops.find(s => s.id === stopId);\n if (!stop) return;\n\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n stop.position = Math.min(100, stop.position + step);\n changed = true;\n break;\n case 'ArrowLeft':\n stop.position = Math.max(0, stop.position - step);\n changed = true;\n break;\n case 'Delete':\n case 'Backspace':\n if (this.#removeStop(stopId)) {\n this.#emitInput();\n this.#emitChange();\n }\n e.preventDefault();\n return;\n }\n\n if (changed) {\n e.preventDefault();\n this.#sortStops();\n this.#updateStopPositions();\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Type / Angle / Shape handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleTypeToggle(type: GradientType): void {\n if (this.#type === type) return;\n this.#type = type;\n this.setAttribute('data-ry-type', type);\n this.#updateControls();\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n #handleAngleInput = (e: Event): void => {\n const detail = (e as CustomEvent).detail as { value: number };\n this.#angle = detail.value;\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n };\n\n #handleShapeToggle(shape: RadialShape): void {\n if (this.#shape === shape) return;\n this.#shape = shape;\n this.#updateControls();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Color picker handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handlePickerInput = (): void => {\n const stop = this.#getSelectedStop();\n if (!stop || !this.#picker) return;\n\n stop.color = this.#picker.value;\n this.#updateStopColor(stop);\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#emitInput();\n };\n\n #handlePickerChange = (): void => {\n this.#syncValueAttribute();\n this.#emitChange();\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Copy handler\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleCopy = (): void => {\n const text = this.#serializeGradient();\n navigator.clipboard.writeText(text).then(() => {\n const btn = this.$('[data-ry-target=\"copy-btn\"]');\n if (btn) {\n btn.setAttribute('data-copied', '');\n setTimeout(() => btn.removeAttribute('data-copied'), 1500);\n }\n });\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Output (editable CSS) handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleOutputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#applyOutputValue();\n }\n };\n\n #handleOutputBlur = (): void => {\n this.#applyOutputValue();\n };\n\n #applyOutputValue(): void {\n if (!this.#outputInput) return;\n const val = this.#outputInput.value.trim();\n if (val && this.#parseGradient(val)) {\n this.#renderStops();\n this.#updateAll();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n } else {\n // Reset to current value on invalid input\n this.#updateOutput();\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Color interpolation\n // ───────────────────────────────────────────────────────────────────────────\n\n #interpolateColorAt(position: number): string {\n if (this.#stops.length === 0) return '#808080';\n if (this.#stops.length === 1) return this.#stops[0]!.color;\n\n const sorted = [...this.#stops].sort((a, b) => a.position - b.position);\n\n // Before first or after last\n if (position <= sorted[0]!.position) return sorted[0]!.color;\n if (position >= sorted[sorted.length - 1]!.position) return sorted[sorted.length - 1]!.color;\n\n // Find bracketing stops\n let left = sorted[0]!;\n let right = sorted[1]!;\n for (let i = 0; i < sorted.length - 1; i++) {\n if (sorted[i]!.position <= position && sorted[i + 1]!.position >= position) {\n left = sorted[i]!;\n right = sorted[i + 1]!;\n break;\n }\n }\n\n const range = right.position - left.position;\n if (range === 0) return left.color;\n const t = (position - left.position) / range;\n\n const rgbA = parseColorToRgb(left.color);\n const rgbB = parseColorToRgb(right.color);\n if (!rgbA || !rgbB) return left.color;\n\n return rgbToHex(lerpRgb(rgbA, rgbB, t));\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Update methods\n // ───────────────────────────────────────────────────────────────────────────\n\n #updateAll(): void {\n this.setAttribute('data-ry-type', this.#type);\n this.#updateControls();\n this.#updateBar();\n this.#updatePreview();\n this.#updateStopPositions();\n this.#updateStopSelection();\n this.#updatePicker();\n this.#updateOutput();\n }\n\n #updateControls(): void {\n // Type toggle active state\n const solidBtn = this.$('[data-ry-target=\"type-solid\"]');\n const linearBtn = this.$('[data-ry-target=\"type-linear\"]');\n const radialBtn = this.$('[data-ry-target=\"type-radial\"]');\n if (solidBtn) solidBtn.toggleAttribute('data-active', this.#type === 'solid');\n if (linearBtn) linearBtn.toggleAttribute('data-active', this.#type === 'linear');\n if (radialBtn) radialBtn.toggleAttribute('data-active', this.#type === 'radial');\n\n // Shape toggle active state\n const circleBtn = this.$('[data-ry-target=\"shape-circle\"]');\n const ellipseBtn = this.$('[data-ry-target=\"shape-ellipse\"]');\n if (circleBtn) circleBtn.toggleAttribute('data-active', this.#shape === 'circle');\n if (ellipseBtn) ellipseBtn.toggleAttribute('data-active', this.#shape === 'ellipse');\n\n // Angle select sync\n const angleSelect = this.$('[data-ry-target=\"angle-select\"]');\n if (angleSelect) angleSelect.setAttribute('value', String(this.#angle));\n }\n\n #updatePreview(): void {\n if (!this.#picker) return;\n const swatch = this.#picker.querySelector('[data-ry-target=\"preview-color\"]') as HTMLElement | null;\n if (swatch) {\n swatch.style.backgroundImage = this.#type === 'solid' ? '' : this.#serializeGradient();\n }\n }\n\n #updateBar(): void {\n if (!this.#bar) return;\n const barStops = this.#stops\n .map(s => `${s.color} ${s.position}%`)\n .join(', ');\n this.#bar.style.backgroundImage = `linear-gradient(to right, ${barStops})`;\n }\n\n #updateStopPositions(): void {\n if (!this.#bar) return;\n for (const stop of this.#stops) {\n const el = this.#bar.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.left = this.#stopLeft(stop.position);\n }\n }\n }\n\n #updateStopColor(stop: GradientStop): void {\n if (!this.#bar) return;\n const el = this.#bar.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.setProperty('--stop-color', stop.color);\n }\n }\n\n #updateStopSelection(): void {\n if (!this.#bar) return;\n const allStops = this.#bar.querySelectorAll('[data-ry-target=\"stop\"]');\n for (const el of allStops) {\n if (el.getAttribute('data-stop-id') === this.#selectedStopId) {\n el.setAttribute('data-selected', '');\n } else {\n el.removeAttribute('data-selected');\n }\n }\n }\n\n #updatePicker(): void {\n const stop = this.#getSelectedStop();\n if (!stop || !this.#picker) return;\n this.#picker.setColor(stop.color);\n }\n\n #updateOutput(): void {\n if (this.#outputInput && document.activeElement !== this.#outputInput) {\n this.#outputInput.value = this.#serializeGradient();\n }\n }\n\n #syncValueAttribute(): void {\n const val = this.#serializeGradient();\n if (this.getAttribute('value') !== val) {\n this.#syncing = true;\n this.setAttribute('value', val);\n this.#syncing = false;\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Events\n // ───────────────────────────────────────────────────────────────────────────\n\n #emitInput(): void {\n this.emit('input', {\n value: this.#serializeGradient(),\n type: this.#type,\n angle: this.#angle,\n shape: this.#shape,\n stops: this.stops,\n });\n }\n\n #emitChange(): void {\n this.emit('change', {\n value: this.#serializeGradient(),\n type: this.#type,\n angle: this.#angle,\n shape: this.#shape,\n stops: this.stops,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Attribute changed\n // ───────────────────────────────────────────────────────────────────────────\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue || this.#syncing) return;\n\n if (name === 'value' && this.#bar && newValue) {\n // External value change\n if (this.#parseGradient(newValue)) {\n this.#renderStops();\n this.#updateAll();\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────────────────\n\n get value(): string {\n return this.#serializeGradient();\n }\n\n set value(val: string) {\n if (this.#parseGradient(val)) {\n this.#renderStops();\n this.#updateAll();\n this.#syncValueAttribute();\n }\n }\n\n get type(): GradientType {\n return this.#type;\n }\n\n set type(val: GradientType) {\n this.#handleTypeToggle(val);\n }\n\n get angle(): number {\n return this.#angle;\n }\n\n set angle(val: number) {\n this.#angle = ((val % 360) + 360) % 360;\n this.#updateControls();\n this.#updateOutput();\n this.#syncValueAttribute();\n }\n\n get shape(): RadialShape {\n return this.#shape;\n }\n\n set shape(val: RadialShape) {\n this.#handleShapeToggle(val);\n }\n\n get stops(): GradientStop[] {\n return this.#stops.map(s => ({ ...s }));\n }\n\n get selectedStop(): GradientStop | null {\n const stop = this.#getSelectedStop();\n return stop ? { ...stop } : null;\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n addStop(color: string, position: number): void {\n this.#addStop(color, position);\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n removeStop(id: string): boolean {\n const removed = this.#removeStop(id);\n if (removed) {\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitChange();\n }\n return removed;\n }\n}\n\ncustomElements.define('ry-gradient-picker', RyGradientPicker);\n","/**\n * <ry-tree>\n *\n * Tree view with CSS-only expand/collapse using hidden checkboxes\n * and grid-template-rows animation. Supports drag-and-drop rearranging\n * and JSON serialization.\n *\n * Usage:\n * <ry-tree>\n * <ry-tree-item label=\"src\" open>\n * <ry-tree-item label=\"app\" open>\n * <ry-tree-item label=\"layout.tsx\"></ry-tree-item>\n * </ry-tree-item>\n * </ry-tree-item>\n * </ry-tree>\n *\n * Drag and drop:\n * <ry-tree draggable>...</ry-tree>\n *\n * JS uses data-ry-target for queries, CSS uses .ry-tree__* for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nlet treeIdCounter = 0;\n\nconst DRAG_THRESHOLD = 5;\n\nfunction icon16(name: string): string {\n return getIcon(name)\n .replace(/width=\"24\"/g, 'width=\"16\"')\n .replace(/height=\"24\"/g, 'height=\"16\"')\n .replace(/viewBox/, 'class=\"ry-tree__icon\" viewBox');\n}\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n open?: boolean;\n selected?: boolean;\n}\n\nexport class RyTree extends RyElement {\n // Drag state\n #dragPending = false;\n #dragActive = false;\n #dragOriginX = 0;\n #dragOriginY = 0;\n #draggedItem: HTMLElement | null = null;\n #ghost: HTMLElement | null = null;\n #dropTarget: HTMLElement | null = null;\n #dropPosition: 'before' | 'after' | 'inside' | null = null;\n\n setup(): void {\n this.#build();\n\n // Delegate click for file selection\n this.on(this, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const fileItem = target.closest<HTMLElement>('[data-ry-target=\"file\"]');\n if (!fileItem) return;\n\n this.$$('[data-ry-selected]').forEach(el => el.removeAttribute('data-ry-selected'));\n fileItem.setAttribute('data-ry-selected', '');\n\n this.emit('select', {\n label: fileItem.dataset.ryLabel ?? '',\n });\n });\n\n // Emit toggle events when folders open/close\n this.on(this, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (!input.classList.contains('ry-tree__toggle')) return;\n\n const li = input.closest<HTMLElement>('.ry-tree__item');\n const label = li?.querySelector<HTMLElement>('[data-ry-target=\"folder\"]')?.dataset.ryLabel ?? '';\n\n this.emit('toggle', {\n label,\n open: input.checked,\n });\n });\n\n // Drag and drop — only when draggable attribute is present\n if (this.hasAttribute('sortable')) {\n this.#bindDrag();\n }\n }\n\n // ── Build ──────────────────────────────────────────────────\n\n #build(): void {\n if (this.$('.ry-tree__root')) return;\n\n const items = Array.from(this.children) as HTMLElement[];\n const ul = document.createElement('ul');\n ul.className = 'ry-tree__root';\n\n for (const item of items) {\n ul.appendChild(this.#buildItem(item));\n }\n\n this.innerHTML = '';\n this.appendChild(ul);\n }\n\n #buildItem(source: HTMLElement): HTMLLIElement {\n const li = document.createElement('li');\n li.className = 'ry-tree__item';\n\n const label = source.getAttribute('label') ?? '';\n const isOpen = source.hasAttribute('open');\n const isSelected = source.hasAttribute('selected');\n const children = Array.from(source.children).filter(\n c => c.tagName === 'RY-TREE-ITEM'\n ) as HTMLElement[];\n const isFolder = children.length > 0;\n\n if (isFolder) {\n const id = `ry-tree-${++treeIdCounter}`;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.id = id;\n checkbox.className = 'ry-tree__toggle';\n if (isOpen) checkbox.checked = true;\n\n const labelEl = document.createElement('label');\n labelEl.htmlFor = id;\n labelEl.className = 'ry-tree__label';\n labelEl.setAttribute('data-ry-target', 'folder');\n labelEl.dataset.ryLabel = label;\n labelEl.innerHTML = `\n <span class=\"ry-tree__icon-closed\">${icon16('folder')}</span>\n <span class=\"ry-tree__icon-open\">${icon16('folder-open')}</span>\n ${label}\n `;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'ry-tree__children-wrapper';\n\n const childUl = document.createElement('ul');\n childUl.className = 'ry-tree__children';\n\n for (const child of children) {\n childUl.appendChild(this.#buildItem(child));\n }\n\n wrapper.appendChild(childUl);\n li.appendChild(checkbox);\n li.appendChild(labelEl);\n li.appendChild(wrapper);\n } else {\n const fileEl = document.createElement('div');\n fileEl.className = 'ry-tree__file';\n fileEl.setAttribute('data-ry-target', 'file');\n fileEl.dataset.ryLabel = label;\n if (isSelected) fileEl.setAttribute('data-ry-selected', '');\n fileEl.innerHTML = `${icon16('file')} ${label}`;\n\n li.appendChild(fileEl);\n }\n\n return li;\n }\n\n // ── Serialization ──────────────────────────────────────────\n\n /** Serialize the current tree state to JSON. */\n toJSON(): TreeNode[] {\n const root = this.$<HTMLElement>('.ry-tree__root');\n if (!root) return [];\n return this.#serializeChildren(root);\n }\n\n /** Alias for toJSON(). */\n get value(): TreeNode[] {\n return this.toJSON();\n }\n\n #serializeChildren(container: HTMLElement): TreeNode[] {\n const items = Array.from(container.children).filter(\n (c): c is HTMLElement => c instanceof HTMLElement && c.classList.contains('ry-tree__item')\n );\n return items.map(item => this.#serializeItem(item));\n }\n\n #serializeItem(item: HTMLElement): TreeNode {\n const folderLabel = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"folder\"]');\n const fileDiv = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"file\"]');\n\n if (folderLabel) {\n const toggle = item.querySelector<HTMLInputElement>(':scope > .ry-tree__toggle');\n const childrenList = item.querySelector<HTMLElement>('.ry-tree__children');\n const node: TreeNode = { label: folderLabel.dataset.ryLabel ?? '' };\n if (toggle?.checked) node.open = true;\n if (childrenList) {\n const children = this.#serializeChildren(childrenList);\n if (children.length > 0) node.children = children;\n }\n return node;\n }\n\n // File\n const node: TreeNode = { label: fileDiv?.dataset.ryLabel ?? '' };\n if (fileDiv?.hasAttribute('data-ry-selected')) node.selected = true;\n return node;\n }\n\n /** Create a tree element from JSON data. */\n static from(data: TreeNode[]): RyTree {\n const tree = document.createElement('ry-tree') as RyTree;\n for (const node of data) {\n tree.appendChild(RyTree.#nodeToElement(node));\n }\n return tree;\n }\n\n static #nodeToElement(node: TreeNode): HTMLElement {\n const item = document.createElement('ry-tree-item');\n item.setAttribute('label', node.label);\n if (node.open) item.setAttribute('open', '');\n if (node.selected) item.setAttribute('selected', '');\n if (node.children) {\n for (const child of node.children) {\n item.appendChild(RyTree.#nodeToElement(child));\n }\n }\n return item;\n }\n\n // ── Drag and Drop ──────────────────────────────────────────\n\n #bindDrag(): void {\n this.on(this, 'pointerdown', this.#onPointerDown);\n this.on(document, 'pointermove', this.#onPointerMove);\n this.on(document, 'pointerup', this.#onPointerUp);\n }\n\n #onPointerDown = (e: PointerEvent): void => {\n const target = e.target as HTMLElement;\n const handle = target.closest<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!handle) return;\n\n const item = handle.closest<HTMLElement>('.ry-tree__item');\n if (!item) return;\n\n // Record origin — don't start drag yet (distance threshold)\n this.#dragPending = true;\n this.#dragOriginX = e.clientX;\n this.#dragOriginY = e.clientY;\n this.#draggedItem = item;\n };\n\n #onPointerMove = (e: PointerEvent): void => {\n if (!this.#dragPending && !this.#dragActive) return;\n\n // Check distance threshold before activating\n if (this.#dragPending && !this.#dragActive) {\n const dx = e.clientX - this.#dragOriginX;\n const dy = e.clientY - this.#dragOriginY;\n if (Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n\n // Threshold crossed — activate drag\n this.#dragPending = false;\n this.#dragActive = true;\n this.#activateDrag(e);\n }\n\n if (!this.#dragActive || !this.#ghost) return;\n\n // Update ghost position\n this.#ghost.style.left = `${e.clientX + 12}px`;\n this.#ghost.style.top = `${e.clientY - 14}px`;\n\n // Hide ghost momentarily so elementFromPoint sees through it\n this.#ghost.style.display = 'none';\n const elUnder = document.elementFromPoint(e.clientX, e.clientY);\n this.#ghost.style.display = '';\n\n if (!elUnder) {\n this.#clearIndicator();\n return;\n }\n\n const targetHandle = elUnder.closest<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!targetHandle) {\n this.#clearIndicator();\n return;\n }\n\n const targetItem = targetHandle.closest<HTMLElement>('.ry-tree__item');\n if (!targetItem || targetItem === this.#draggedItem) {\n this.#clearIndicator();\n return;\n }\n\n // Don't allow dropping into own descendants\n if (this.#draggedItem?.contains(targetItem)) {\n this.#clearIndicator();\n return;\n }\n\n // Determine position: top third / middle third / bottom third\n const rect = targetHandle.getBoundingClientRect();\n const relY = e.clientY - rect.top;\n const h = rect.height;\n const isFolder = targetItem.querySelector(':scope > .ry-tree__toggle') !== null;\n\n let position: 'before' | 'after' | 'inside';\n if (isFolder && relY > h * 0.25 && relY < h * 0.75) {\n position = 'inside';\n } else if (relY < h * 0.5) {\n position = 'before';\n } else {\n position = 'after';\n }\n\n this.#setIndicator(targetItem, position);\n };\n\n #onPointerUp = (): void => {\n if (this.#dragActive) {\n this.#finishDrag();\n }\n this.#dragPending = false;\n this.#dragActive = false;\n this.#draggedItem = null;\n };\n\n #activateDrag(e: PointerEvent): void {\n if (!this.#draggedItem) return;\n\n // Prevent the click from toggling the folder checkbox\n e.preventDefault();\n\n // Mark as dragging and collapse to thin placeholder so parent targets are reachable\n this.#draggedItem.setAttribute('data-ry-dragging', '');\n this.#draggedItem.classList.add('ry-tree__item--collapsed');\n\n // Create ghost\n const handle = this.#draggedItem.querySelector<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!handle) return;\n\n const ghost = handle.cloneNode(true) as HTMLElement;\n ghost.className = 'ry-tree__ghost';\n // Copy label/file styles for size\n ghost.style.display = 'flex';\n ghost.style.alignItems = 'center';\n ghost.style.gap = 'var(--ry-space-2, 0.5rem)';\n ghost.style.padding = 'var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem)';\n ghost.style.height = '28px';\n ghost.style.fontSize = 'var(--ry-text-sm, 0.875rem)';\n ghost.style.whiteSpace = 'nowrap';\n ghost.style.left = `${e.clientX + 12}px`;\n ghost.style.top = `${e.clientY - 14}px`;\n document.body.appendChild(ghost);\n this.#ghost = ghost;\n }\n\n #finishDrag(): void {\n // Remove ghost\n if (this.#ghost?.parentNode) {\n this.#ghost.parentNode.removeChild(this.#ghost);\n }\n this.#ghost = null;\n\n // Clear visual\n this.#draggedItem?.classList.remove('ry-tree__item--collapsed');\n this.#draggedItem?.removeAttribute('data-ry-dragging');\n const dropTarget = this.#dropTarget;\n const dropPosition = this.#dropPosition;\n this.#clearIndicator();\n\n // Perform DOM move\n if (this.#draggedItem && dropTarget && dropPosition) {\n this.#performMove(this.#draggedItem, dropTarget, dropPosition);\n }\n }\n\n #setIndicator(item: HTMLElement, position: 'before' | 'after' | 'inside'): void {\n if (this.#dropTarget === item && this.#dropPosition === position) return;\n this.#clearIndicator();\n item.setAttribute('data-ry-drop-target', position);\n this.#dropTarget = item;\n this.#dropPosition = position;\n }\n\n #clearIndicator(): void {\n this.#dropTarget?.removeAttribute('data-ry-drop-target');\n this.#dropTarget = null;\n this.#dropPosition = null;\n }\n\n #performMove(\n draggedItem: HTMLElement,\n dropTarget: HTMLElement,\n position: 'before' | 'after' | 'inside'\n ): void {\n // Safety: can't drop inside own descendant (circular)\n if (position === 'inside' && dropTarget.contains(draggedItem)) return;\n\n const itemLabel = this.#itemLabel(draggedItem);\n const targetLabel = this.#itemLabel(dropTarget);\n\n if (position === 'before') {\n dropTarget.parentNode?.insertBefore(draggedItem, dropTarget);\n } else if (position === 'after') {\n dropTarget.parentNode?.insertBefore(draggedItem, dropTarget.nextSibling);\n } else {\n // Inside — append to folder's children list\n const childrenList = dropTarget.querySelector<HTMLElement>('.ry-tree__children');\n if (childrenList) {\n childrenList.appendChild(draggedItem);\n // Auto-open the folder\n const toggle = dropTarget.querySelector<HTMLInputElement>(':scope > .ry-tree__toggle');\n if (toggle && !toggle.checked) {\n toggle.checked = true;\n }\n }\n }\n\n this.emit('move', {\n item: itemLabel,\n target: targetLabel,\n position,\n });\n }\n\n #itemLabel(item: HTMLElement): string {\n const folder = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"folder\"]');\n const file = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"file\"]');\n return folder?.dataset.ryLabel ?? file?.dataset.ryLabel ?? '';\n }\n}\n\nexport class RyTreeItem extends RyElement {\n // Declarative container consumed by RyTree#build\n}\n\ncustomElements.define('ry-tree', RyTree);\ncustomElements.define('ry-tree-item', RyTreeItem);\n","/**\n * <ry-tag>\n *\n * Removable pill/tag component.\n *\n * Usage:\n * <ry-tag>Default</ry-tag>\n * <ry-tag variant=\"primary\" removable>Removable</ry-tag>\n * <ry-tag size=\"sm\" removable data-value=\"js\">JavaScript</ry-tag>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyTag extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"label\"]')) return;\n\n const text = this.textContent?.trim() ?? '';\n const removable = this.hasAttribute('removable');\n\n this.innerHTML = `<span data-ry-target=\"label\" class=\"ry-tag__label\">${text}</span>${\n removable\n ? `<button data-ry-target=\"remove\" class=\"ry-tag__remove\" aria-label=\"Remove\" type=\"button\">${getIcon('close')}</button>`\n : ''\n }`;\n\n if (removable) {\n const btn = this.$<HTMLButtonElement>('[data-ry-target=\"remove\"]');\n if (btn) {\n this.on(btn, 'click', (e: MouseEvent) => {\n e.stopPropagation();\n this.emit('remove', {\n value: this.dataset.value ?? '',\n label: text\n });\n this.remove();\n });\n }\n }\n }\n\n get label(): string {\n return this.$('[data-ry-target=\"label\"]')?.textContent?.trim() ?? '';\n }\n}\n\ncustomElements.define('ry-tag', RyTag);\n","/**\n * <ry-tag-input>\n *\n * Free-form tag entry with delimiter splitting and paste support.\n *\n * Usage:\n * <ry-tag-input placeholder=\"Add tags...\" delimiter=\",\" max-tags=\"5\" name=\"tags\" value=\"js,ts,css\"></ry-tag-input>\n *\n * Events: ry:change, ry:add, ry:remove\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyTagInput extends RyElement {\n #tags: string[] = [];\n\n setup(): void {\n this.#transformMarkup();\n this.#parseInitialValue();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"container\"]')) return;\n\n const placeholder = this.getAttribute('placeholder') ?? 'Add tag...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n\n this.innerHTML = `\n <div data-ry-target=\"container\" class=\"ry-tag-input__container\">\n <div data-ry-target=\"tags\" class=\"ry-tag-input__tags\"></div>\n <input data-ry-target=\"input\" class=\"ry-tag-input__input\" type=\"text\" placeholder=\"${placeholder}\" ${disabled ? 'disabled' : ''}>\n </div>\n <input data-ry-target=\"hidden\" type=\"hidden\" ${name ? `name=\"${name}\"` : ''}>\n `;\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) {\n this.on(input, 'keydown', this.#handleKeydown as EventListener);\n this.on(input, 'paste', this.#handlePaste as EventListener);\n }\n\n const container = this.$('[data-ry-target=\"container\"]');\n if (container) {\n this.on(container, 'click', () => input?.focus());\n }\n\n this.on(this, 'ry:remove', this.#handleTagRemove as EventListener);\n }\n\n #parseInitialValue(): void {\n const value = this.getAttribute('value');\n if (!value) return;\n\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const parts = value.split(delimiter).map(s => s.trim()).filter(Boolean);\n for (const tag of parts) {\n this.#addTag(tag);\n }\n }\n\n #handleKeydown = (e: KeyboardEvent): void => {\n const input = e.target as HTMLInputElement;\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const val = input.value.trim();\n\n if (e.key === 'Enter' || e.key === delimiter || e.key === 'Tab') {\n if (val) {\n e.preventDefault();\n this.#addTag(val);\n input.value = '';\n } else if (e.key === 'Tab') {\n return; // allow natural tab\n }\n }\n\n if (e.key === 'Backspace' && !input.value && this.#tags.length > 0) {\n this.#removeLastTag();\n }\n };\n\n #handlePaste = (e: ClipboardEvent): void => {\n e.preventDefault();\n const text = e.clipboardData?.getData('text') ?? '';\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const parts = text.split(new RegExp(`[${delimiter}\\\\t\\\\n]+`)).map(s => s.trim()).filter(Boolean);\n for (const tag of parts) {\n this.#addTag(tag);\n }\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) input.value = '';\n };\n\n #handleTagRemove = (e: CustomEvent): void => {\n const value = (e.detail as { value: string }).value;\n const idx = this.#tags.indexOf(value);\n if (idx >= 0) {\n this.#tags.splice(idx, 1);\n this.#syncHidden();\n this.emit('change', { values: [...this.#tags] });\n }\n };\n\n #addTag(text: string): void {\n const maxTags = this.getAttribute('max-tags');\n if (maxTags && this.#tags.length >= parseInt(maxTags, 10)) return;\n\n if (!this.hasAttribute('allow-duplicates') && this.#tags.includes(text)) return;\n\n this.#tags.push(text);\n\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n if (tagsContainer) {\n const tag = document.createElement('ry-tag');\n tag.setAttribute('removable', '');\n tag.setAttribute('size', 'sm');\n tag.setAttribute('data-value', text);\n tag.textContent = text;\n tagsContainer.appendChild(tag);\n }\n\n this.#syncHidden();\n this.emit('add', { value: text });\n this.emit('change', { values: [...this.#tags] });\n }\n\n #removeLastTag(): void {\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n const lastTag = tagsContainer?.lastElementChild;\n if (lastTag) {\n const val = (lastTag as HTMLElement).dataset.value ?? '';\n lastTag.remove();\n this.#tags.pop();\n this.#syncHidden();\n this.emit('remove', { value: val, label: val });\n this.emit('change', { values: [...this.#tags] });\n }\n }\n\n #syncHidden(): void {\n const hidden = this.$<HTMLInputElement>('[data-ry-target=\"hidden\"]');\n const delimiter = this.getAttribute('delimiter') ?? ',';\n if (hidden) {\n hidden.value = this.#tags.join(delimiter);\n }\n }\n\n get value(): string {\n const delimiter = this.getAttribute('delimiter') ?? ',';\n return this.#tags.join(delimiter);\n }\n\n get values(): string[] {\n return [...this.#tags];\n }\n}\n\ncustomElements.define('ry-tag-input', RyTagInput);\n","/**\n * <ry-hero>\n *\n * Hero section component (mostly CSS-only).\n *\n * Usage:\n * <ry-hero align=\"center\">\n * <h1>Build apps faster</h1>\n * <p>Framework-agnostic components.</p>\n * <ry-cluster><ry-button>Get Started</ry-button></ry-cluster>\n * </ry-hero>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyHero extends RyElement {}\n\ncustomElements.define('ry-hero', RyHero);\n","/**\n * <ry-stat>\n *\n * KPI / statistic display with optional trend arrow.\n *\n * Usage:\n * <ry-stat trend=\"up\">\n * <span slot=\"value\">2,847</span>\n * <span slot=\"label\">Active Users</span>\n * </ry-stat>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyStat extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"value\"]')) return;\n\n const valueEl = this.querySelector('[slot=\"value\"]');\n const labelEl = this.querySelector('[slot=\"label\"]');\n const trend = this.getAttribute('trend');\n\n const valueText = valueEl?.textContent?.trim() ?? '';\n const labelText = labelEl?.textContent?.trim() ?? '';\n\n const trendIcon = trend === 'up'\n ? `<span data-ry-target=\"trend\" class=\"ry-stat__trend ry-stat__trend--up\">${getIcon('chevron-up')}</span>`\n : trend === 'down'\n ? `<span data-ry-target=\"trend\" class=\"ry-stat__trend ry-stat__trend--down\">${getIcon('chevron-down')}</span>`\n : '';\n\n this.innerHTML = `\n <div data-ry-target=\"value\" class=\"ry-stat__value\">${valueText}${trendIcon}</div>\n <div data-ry-target=\"label\" class=\"ry-stat__label\">${labelText}</div>\n `;\n }\n}\n\ncustomElements.define('ry-stat', RyStat);\n","/**\n * <ry-feature> + <ry-feature-grid>\n *\n * Feature card with icon + responsive grid.\n *\n * Usage:\n * <ry-feature-grid cols=\"3\">\n * <ry-feature icon=\"settings\">\n * <h3>Easy Setup</h3>\n * <p>One line to get started.</p>\n * </ry-feature>\n * </ry-feature-grid>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyFeature extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"icon\"]')) return;\n\n const iconName = this.getAttribute('icon');\n if (!iconName) return;\n\n const iconSvg = getIcon(iconName);\n if (!iconSvg) return;\n\n const iconDiv = document.createElement('div');\n iconDiv.setAttribute('data-ry-target', 'icon');\n iconDiv.className = 'ry-feature__icon';\n iconDiv.innerHTML = iconSvg;\n this.insertBefore(iconDiv, this.firstChild);\n }\n}\n\nexport class RyFeatureGrid extends RyElement {}\n\ncustomElements.define('ry-feature', RyFeature);\ncustomElements.define('ry-feature-grid', RyFeatureGrid);\n","/**\n * <ry-pricing> + <ry-pricing-card>\n *\n * Pricing section with featured card variant.\n *\n * Usage:\n * <ry-pricing>\n * <ry-pricing-card featured>\n * <h3>Pro</h3>\n * <div slot=\"price\">$29<span>/mo</span></div>\n * <ul><li>Feature 1</li></ul>\n * <ry-button>Choose Pro</ry-button>\n * </ry-pricing-card>\n * </ry-pricing>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyPricing extends RyElement {}\nexport class RyPricingCard extends RyElement {}\n\ncustomElements.define('ry-pricing', RyPricing);\ncustomElements.define('ry-pricing-card', RyPricingCard);\n","/**\n * <ry-carousel>\n *\n * Content slider with autoplay, touch/swipe, dots, arrows, keyboard nav.\n *\n * Usage:\n * <ry-carousel autoplay interval=\"5000\" dots arrows loop>\n * <div>Slide 1</div>\n * <div>Slide 2</div>\n * </ry-carousel>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyCarousel extends RyElement {\n #currentIndex = 0;\n #slideCount = 0;\n #autoplayTimer: ReturnType<typeof setInterval> | null = null;\n #startX = 0;\n #isDragging = false;\n\n setup(): void {\n this.#transformMarkup();\n this.#setupAutoplay();\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n this.on(this, 'keydown', this.#handleKeydown as EventListener);\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"viewport\"]')) return;\n\n const slides = [...this.children];\n this.#slideCount = slides.length;\n if (this.#slideCount === 0) return;\n\n const showArrows = this.hasAttribute('arrows');\n const showDots = this.hasAttribute('dots');\n\n // Wrap slides in track\n const track = document.createElement('div');\n track.setAttribute('data-ry-target', 'track');\n track.className = 'ry-carousel__track';\n for (const slide of slides) {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('data-ry-target', 'slide');\n wrapper.className = 'ry-carousel__slide';\n wrapper.appendChild(slide);\n track.appendChild(wrapper);\n }\n\n // Build viewport\n const viewport = document.createElement('div');\n viewport.setAttribute('data-ry-target', 'viewport');\n viewport.className = 'ry-carousel__viewport';\n viewport.appendChild(track);\n\n this.innerHTML = '';\n this.appendChild(viewport);\n\n // Arrows\n if (showArrows) {\n const prev = document.createElement('button');\n prev.setAttribute('data-ry-target', 'prev');\n prev.className = 'ry-carousel__arrow ry-carousel__arrow--prev';\n prev.setAttribute('aria-label', 'Previous slide');\n prev.setAttribute('type', 'button');\n prev.innerHTML = getIcon('chevron-left');\n this.appendChild(prev);\n this.on(prev, 'click', () => this.prev());\n\n const next = document.createElement('button');\n next.setAttribute('data-ry-target', 'next');\n next.className = 'ry-carousel__arrow ry-carousel__arrow--next';\n next.setAttribute('aria-label', 'Next slide');\n next.setAttribute('type', 'button');\n next.innerHTML = getIcon('chevron-right');\n this.appendChild(next);\n this.on(next, 'click', () => this.next());\n }\n\n // Dots\n if (showDots) {\n const dotsContainer = document.createElement('div');\n dotsContainer.setAttribute('data-ry-target', 'dots');\n dotsContainer.className = 'ry-carousel__dots';\n for (let i = 0; i < this.#slideCount; i++) {\n const dot = document.createElement('button');\n dot.setAttribute('data-ry-target', 'dot');\n dot.className = 'ry-carousel__dot';\n dot.setAttribute('aria-label', `Go to slide ${i + 1}`);\n dot.setAttribute('type', 'button');\n if (i === 0) dot.setAttribute('data-active', '');\n this.on(dot, 'click', () => this.goTo(i));\n dotsContainer.appendChild(dot);\n }\n this.appendChild(dotsContainer);\n }\n\n // Touch/swipe\n this.on(viewport, 'pointerdown', this.#handlePointerDown as EventListener);\n this.on(viewport, 'pointermove', this.#handlePointerMove as EventListener);\n this.on(viewport, 'pointerup', this.#handlePointerUp as EventListener);\n this.on(viewport, 'pointercancel', this.#handlePointerUp as EventListener);\n\n // Pause on hover\n if (this.hasAttribute('pause-on-hover')) {\n this.on(this, 'mouseenter', () => this.#stopAutoplay());\n this.on(this, 'mouseleave', () => this.#setupAutoplay());\n }\n\n this.goTo(0);\n }\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.prev();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n this.next();\n }\n };\n\n #handlePointerDown = (e: PointerEvent): void => {\n this.#startX = e.clientX;\n this.#isDragging = true;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#isDragging) return;\n // Prevent scroll while swiping\n e.preventDefault();\n };\n\n #handlePointerUp = (e: PointerEvent): void => {\n if (!this.#isDragging) return;\n this.#isDragging = false;\n const diff = e.clientX - this.#startX;\n const threshold = 50;\n if (diff > threshold) {\n this.prev();\n } else if (diff < -threshold) {\n this.next();\n }\n };\n\n #setupAutoplay(): void {\n this.#stopAutoplay();\n if (!this.hasAttribute('autoplay')) return;\n const interval = parseInt(this.getAttribute('interval') ?? '5000', 10);\n this.#autoplayTimer = setInterval(() => this.next(), interval);\n }\n\n #stopAutoplay(): void {\n if (this.#autoplayTimer) {\n clearInterval(this.#autoplayTimer);\n this.#autoplayTimer = null;\n }\n }\n\n goTo(index: number): void {\n const loop = this.hasAttribute('loop');\n if (loop) {\n if (index < 0) index = this.#slideCount - 1;\n if (index >= this.#slideCount) index = 0;\n } else {\n if (index < 0 || index >= this.#slideCount) return;\n }\n\n this.#currentIndex = index;\n\n const track = this.$<HTMLElement>('[data-ry-target=\"track\"]');\n if (track) {\n track.style.transform = `translateX(-${index * 100}%)`;\n }\n\n // Update dots\n const dots = this.$$('[data-ry-target=\"dot\"]');\n dots.forEach((dot, i) => {\n if (i === index) {\n dot.setAttribute('data-active', '');\n } else {\n dot.removeAttribute('data-active');\n }\n });\n\n this.emit('change', { index, slide: this.#currentIndex });\n }\n\n next(): void {\n this.goTo(this.#currentIndex + 1);\n }\n\n prev(): void {\n this.goTo(this.#currentIndex - 1);\n }\n\n teardown(): void {\n this.#stopAutoplay();\n }\n}\n\ncustomElements.define('ry-carousel', RyCarousel);\n","/**\n * ry-ui\n *\n * Framework-agnostic, Light DOM web components.\n * CSS is the source of truth.\n *\n * Usage:\n * <script type=\"module\" src=\"ry-ui.js\"></script>\n *\n * Transform wrapper (optional clean syntax):\n * <ry>\n * <accordion>\n * <accordion-item title=\"Foo\">Content</accordion-item>\n * </accordion>\n * </ry>\n *\n * Or use <template ry> for inert content:\n * <template ry>\n * <accordion>...</accordion>\n * </template>\n */\n\n// Types\nexport type {\n ComponentState,\n StateChangeDetail,\n ChangeDetail,\n CleanupFn,\n ToastVariant,\n ToastOptions,\n SelectOption\n} from './types.js';\n\n// Core\nexport { RyElement } from './core/ry-element.js';\nexport { transform, processTransforms } from './core/ry-transform.js';\n\n// Components\nexport { RyAccordion } from './components/ry-accordion.js';\nexport { RyModal } from './components/ry-modal.js';\nexport { RyTabs } from './components/ry-tabs.js';\nexport { RyDropdown } from './components/ry-dropdown.js';\nexport { RyButton } from './components/ry-button.js';\nexport { RyButtonGroup } from './components/ry-button-group.js';\nexport { RySplit } from './components/ry-split.js';\nexport { RyThemeToggle } from './components/ry-theme-toggle.js';\nexport { RyCard } from './components/ry-card.js';\nexport { RyAlert } from './components/ry-alert.js';\nexport { RyField } from './components/ry-field.js';\nexport { RySwitch } from './components/ry-switch.js';\nexport { RyTooltip } from './components/ry-tooltip.js';\nexport { RyDrawer } from './components/ry-drawer.js';\nexport { RyToast } from './components/ry-toast.js';\nexport { RySelect } from './components/ry-select.js';\nexport { RyCombobox } from './components/ry-combobox.js';\nexport { RyCode } from './components/ry-code.js';\nexport { RyExample } from './components/ry-example.js';\nexport { RyIcon } from './components/ry-icon.js';\nexport { RyToggleButton } from './components/ry-toggle-button.js';\nexport { RySlider } from './components/ry-slider.js';\nexport { RyKnob } from './components/ry-knob.js';\nexport { RyNumberSelect } from './components/ry-number-select.js';\nexport { RyColorPicker } from './components/ry-color-picker.js';\nexport type { ColorFormat, RGB, HSL, HSV } from './components/ry-color-picker.js';\nexport { RyColorInput } from './components/ry-color-input.js';\nexport { RyGradientPicker } from './components/ry-gradient-picker.js';\nexport type { GradientStop, GradientType, RadialShape } from './components/ry-gradient-picker.js';\nexport { RyTree, RyTreeItem } from './components/ry-tree.js';\nexport type { TreeNode } from './components/ry-tree.js';\nexport { RyTag } from './components/ry-tag.js';\nexport { RyTagInput } from './components/ry-tag-input.js';\nexport { RyHero } from './components/ry-hero.js';\nexport { RyStat } from './components/ry-stat.js';\nexport { RyFeature, RyFeatureGrid } from './components/ry-feature.js';\nexport { RyPricing, RyPricingCard } from './components/ry-pricing.js';\nexport { RyCarousel } from './components/ry-carousel.js';\n\n// Icon registry\nexport { getIcon, registerIcon, registerIcons, getIconNames } from './core/ry-icons.js';\n\n// Make RyToast globally available for programmatic API\nimport { RyToast as _RyToast } from './components/ry-toast.js';\n\ndeclare global {\n interface Window {\n RyToast: typeof _RyToast;\n }\n}\n\nwindow.RyToast = _RyToast;\n\n// Log version\nconsole.log('ry-ui loaded');\n"],"names":["RyElement","#cleanupFns","#observer","fn","target","event","handler","options","boundHandler","name","detail","value","oldState","selector","callback","resolve","container","focusableSelectors","focusableEls","firstEl","lastEl","handleKeydown","e","RY_COMPONENTS","TRANSFORM_REGEX","transform","html","processTransforms","el","transformed","template","RyAccordion","#transformMinimalMarkup","trigger","#handleTriggerClick","#handleKeydown","#initAria","item","title","isOpen","content","index","panel","triggerId","panelId","triggers","currentIndex","newIndex","openItem","RyModal","#previouslyFocused","#scrollbarWidth","modalId","closeBtn","backdrop","footerContent","bodyContent","n","dialog","RyTabs","tabs","activeIndex","t","defaultActive","tabList","tab","isActive","panels","RyDropdown","#handleClickOutside","triggerButton","menu","items","#positionMenu","rect","menuHeight","spaceBelow","spaceAbove","RyButton","#handleClick","RyButtonGroup","v","#syncPressed","oldValue","newValue","val","current","btn","RySplit","#handle","#dragging","#startX","#startWidth","#restore","sidebar","#onMouseDown","#onTouchStart","#onKeyDown","#onDoubleClick","#getSidebar","#getCurrentWidth","#getMinWidth","#getMaxWidth","#setWidth","px","min","max","clamped","#startDrag","onMove","ev","#onDrag","onUp","#endDrag","touch","onEnd","clientX","delta","#persist","step","width","#clearPersist","#persistKey","key","saved","RyThemeToggle","#themes","#currentIndex","themesAttr","currentTheme","#getIcon","newTheme","RyCard","href","RyAlert","#transformMarkup","variant","dismissible","RyField","#updateError","#updateHint","#updateLabel","input","inputId","labelText","label","errorEl","errorText","hintEl","hintText","describedBy","text","switchIdCounter","RySwitch","#input","#handleChange","id","checked","disabled","tooltipIdCounter","RyTooltip","#showTimeout","#tooltipEl","#tooltipId","#createTooltip","#scheduleShow","#hide","#show","position","RyDrawer","drawerId","side","DEFAULT_DURATION","RyToast","#timeout","#container","#getContainer","toast","message","duration","icon","icons","getIcon","registerIcon","svg","registerIcons","newIcons","getIconNames","selectIdCounter","RySelect","#selectId","#highlightedIndex","#typeahead","#typeaheadTimeout","#selectedValues","#isMultiple","#handleOutsideClick","#handleTagRemove","initialValue","#toggleMultiOption","opt","placeholder","isMultiple","nativeOptions","listboxOptions","i","clearable","clearBtn","#clearAll","option","#selectOption","#highlightNext","#highlightPrev","#highlightFirst","#highlightLast","vals","last","#handleTypeahead","char","match","#highlightIndex","next","prev","maxSelections","#renderTags","#syncMultiNative","#updateMultiCheckmarks","tagsContainer","valueEl","o","tag","nativeSelect","optEl","optionEl","#positionDropdown","currentValue","dropdown","dropdownHeight","RyOption","comboboxIdCounter","RyCombobox","#comboboxId","#options","#handleInputEvent","#handleFocus","query","#filterOptions","lowerQuery","visibleCount","emptyEl","wrapper","RyCode","#originalContent","#trimIndent","#render","copyBtn","#handleCopy","language","showLineNumbers","highlighted","#highlight","lines","line","code","#highlightCSS","#highlightJS","#highlightHTML","#highlightJSON","#escape","tokens","remaining","end","selectorMatch","propMatch","hexMatch","colorFnMatch","numMatch","strMatch","wsMatch","wordMatch","word","fallbackChar","#tokenToHTML","jsKeywords","tagMatch","attrMatch","punct","textMatch","boolMatch","token","escaped","str","minIndent","RyExample","jsScript","jsSource","source","stacked","codeEl","previewTemplate","#buildUsageSection","usageContainer","toggle","jsCodeEl","expanded","RyIcon","_name","size","svgEl","BOUNDARY_SELECTORS","registry","warnedGroups","findBoundaryAncestor","sel","checkForConflicts","buttons","boundaries","boundary","group","containerDescriptions","RyToggleButton","#registered","#register","#unregister","#unpressOthers","siblings","wasPressed","RySlider","#activeThumb","#track","#fill","#thumbs","#tooltips","#buildMarkup","#bindEvents","#updatePositions","isRange","showLabels","showTooltip","#buildLabels","customLabels","labelType","labels","ratio","rounded","l","#handleTrackDown","thumb","#handleThumbDown","#handlePointerMove","#handlePointerUp","#valueFromPointer","distToStart","distToEnd","#emitInput","#emitChange","largeStep","#getValueForKey","#clamp","isVertical","isReversed","rawValue","#snapToStep","snapped","toPercent","pct","startPct","endPct","lowPct","highPct","startThumb","endThumb","#updateTooltip","tooltip","decimals","RyKnob","#startY","#startValue","#ring","#indicator","#display","#updateVisuals","description","titleAttr","#handleMouseDown","#handleMouseMove","#handleMouseUp","#handleTouchStart","#handleTouchMove","#handleTouchEnd","#handleWheel","deltaY","sensitivity","#updateValue","percent","rotation","#formatValue","labelsAttr","DRAG_PX_PER_STEP","CLICK_THRESHOLD","RyNumberSelect","#valueEl","#inputEl","#decrementBtn","#incrementBtn","#editing","#repeatTimer","#repeatInterval","#cacheRefs","#updateDisplay","arrows","decIcon","incIcon","#getIcons","showDecrement","showIncrement","prefix","suffix","decBtn","incBtn","display","labelEl","#handleButtonDown","#handleButtonUp","#enterEditMode","#commitEdit","#cancelEdit","direction","#adjustValue","interval","tick","#dragAxis","#getDragDelta","clientY","#getDragMoved","#applyMicroOffset","remainder","pxPerStep","offset","axis","#processDrag","shiftKey","d","effectiveStep","steps","newVal","#wrapValue","moved","initialChar","raw","range","wrapped","#updateAria","hsvToRgb","hsv","h","s","r","g","b","f","p","q","rgbToHsv","rgb","hsvToHsl","sl","hslToHsv","hsl","sv","rgbToHex","toHex","hexToRgb","hex","result","short","parseColor","hexAlpha","alpha","rgbMatch","hslMatch","RyColorPicker","#hue","#saturation","#brightness","#alpha","#draggingGrid","#draggingHue","#draggingAlpha","#trigger","#panel","#grid","#gridHandle","#hueSlider","#hueHandle","#alphaSlider","#alphaHandle","#preview","#parseInitialValue","#updateAll","isInline","showAlpha","swatches","panelHtml","colors","c","color","#handleDocumentClick","#handleDocumentKeydown","#handleGridDown","#handleGridKeydown","#handleHueDown","#handleHueKeydown","#handleAlphaDown","#handleAlphaKeydown","#handleInputChange","#handleInputKeydown","formatToggle","#handleFormatToggle","swatchContainer","#handleSwatchClick","parsed","#positionPanel","triggerRect","panelHeight","#updateFromGridPointer","x","y","changed","#updateFromHuePointer","#updateFromAlphaPointer","#updateInput","formats","idx","#updateTrigger","#updateGrid","#updateHueSlider","#updateAlphaSlider","#updatePreview","#syncValueAttribute","triggerColor","previewColor","formatted","format","alphaHex","colorString","originalFormat","RyColorInput","#swatch","#picker","#syncFromValue","#handleInputFocus","#handlePickerInput","#handlePickerChange","cursorPos","normalized","newPos","#expandPartialHex","#updateSwatch","#isCompleteColor","padded","swatchColor","parseColorToRgb","sat","hue2rgb","lerpRgb","a","DEFAULT_VALUE","DRAG_OFF_THRESHOLD","RyGradientPicker","#type","#angle","#shape","#stops","#selectedStopId","#nextStopId","#draggingStopId","#draggingOffBar","#barRect","#syncing","#bar","#outputInput","#parseGradient","css","#createStop","type","inner","angle","shape","stopsStr","angleMatch","toMatch","dir","#directionToAngle","shapeMatch","stops","stopRegex","#serializeGradient","#stopLeft","half","#addStop","stop","#sortStops","#renderStops","#removeStop","#selectStop","#updateStopSelection","#updatePicker","#getSelectedStop","showOutput","copyIcon","solidIcon","linearIcon","radialIcon","circleIcon","ellipseIcon","outputHtml","#handleBarDown","solidBtn","linearBtn","radialBtn","#handleTypeToggle","angleSelect","#handleAngleInput","circleBtn","ellipseBtn","#handleShapeToggle","#handleOutputKeydown","#handleOutputBlur","#handleStopKeydown","stopEl","stopId","#interpolateColorAt","barCenterY","yDist","#updateBar","#updateOutput","#updateStopPositions","#updateControls","#updateStopColor","#applyOutputValue","sorted","left","right","rgbA","rgbB","swatch","barStops","allStops","removed","treeIdCounter","DRAG_THRESHOLD","icon16","RyTree","#dragPending","#dragActive","#dragOriginX","#dragOriginY","#draggedItem","#ghost","#dropTarget","#dropPosition","#build","fileItem","#bindDrag","ul","#buildItem","li","isSelected","children","checkbox","childUl","child","fileEl","root","#serializeChildren","#serializeItem","folderLabel","fileDiv","childrenList","node","data","tree","#nodeToElement","#onPointerDown","#onPointerMove","#onPointerUp","handle","dx","dy","#activateDrag","elUnder","#clearIndicator","targetHandle","targetItem","relY","isFolder","#setIndicator","#finishDrag","ghost","dropTarget","dropPosition","#performMove","draggedItem","itemLabel","#itemLabel","targetLabel","folder","file","RyTreeItem","RyTag","removable","RyTagInput","#tags","#handlePaste","delimiter","parts","#addTag","#removeLastTag","#syncHidden","maxTags","lastTag","hidden","RyHero","RyStat","trend","valueText","trendIcon","RyFeature","iconName","iconSvg","iconDiv","RyFeatureGrid","RyPricing","RyPricingCard","RyCarousel","#slideCount","#autoplayTimer","#isDragging","#setupAutoplay","slides","showArrows","showDots","track","slide","viewport","dotsContainer","dot","#handlePointerDown","#stopAutoplay","diff","threshold","_RyToast"],"mappings":"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"}
1
+ {"version":3,"file":"ry-ui.js","sources":["../src/ts/core/ry-element.ts","../src/ts/core/ry-transform.ts","../src/ts/components/ry-accordion.ts","../src/ts/components/ry-modal.ts","../src/ts/components/ry-tabs.ts","../src/ts/components/ry-dropdown.ts","../src/ts/components/ry-button.ts","../src/ts/components/ry-button-group.ts","../src/ts/components/ry-split.ts","../src/ts/components/ry-theme-toggle.ts","../src/ts/components/ry-card.ts","../src/ts/components/ry-alert.ts","../src/ts/components/ry-field.ts","../src/ts/components/ry-switch.ts","../src/ts/components/ry-tooltip.ts","../src/ts/components/ry-drawer.ts","../src/ts/components/ry-toast.ts","../src/ts/core/ry-icons.ts","../src/ts/components/ry-select.ts","../src/ts/components/ry-combobox.ts","../src/ts/components/ry-code.ts","../src/ts/components/ry-example.ts","../src/ts/components/ry-icon.ts","../src/ts/components/ry-toggle-button.ts","../src/ts/components/ry-slider.ts","../src/ts/components/ry-knob.ts","../src/ts/components/ry-number-select.ts","../src/ts/components/ry-color-picker.ts","../src/ts/components/ry-color-input.ts","../src/ts/components/ry-gradient-picker.ts","../src/ts/components/ry-tree.ts","../src/ts/components/ry-tag.ts","../src/ts/components/ry-tag-input.ts","../src/ts/components/ry-hero.ts","../src/ts/components/ry-stat.ts","../src/ts/components/ry-feature.ts","../src/ts/components/ry-pricing.ts","../src/ts/components/ry-carousel.ts","../src/ts/ry-ui.ts"],"sourcesContent":["/**\n * RyElement - Base class for all ry-ui components\n *\n * Provides:\n * - Lifecycle hooks with auto-cleanup\n * - Event helper methods\n * - State management via data attributes\n * - DOM query helpers\n */\n\nimport type { CleanupFn, StateChangeDetail } from '../types.js';\n\nexport class RyElement extends HTMLElement {\n // Store for cleanup functions\n #cleanupFns: CleanupFn[] = [];\n\n // Store for MutationObserver\n #observer: MutationObserver | null = null;\n\n constructor() {\n super();\n }\n\n /**\n * Called when element is added to DOM.\n * Override setup() in subclass instead of this.\n */\n connectedCallback(): void {\n // Mark as initialized\n this.setAttribute('data-ry-initialized', '');\n\n // Call subclass setup\n this.setup?.();\n }\n\n /**\n * Called when element is removed from DOM.\n * Automatically cleans up event listeners and observers.\n */\n disconnectedCallback(): void {\n // Run all cleanup functions\n this.#cleanupFns.forEach(fn => fn());\n this.#cleanupFns = [];\n\n // Disconnect observer\n if (this.#observer) {\n this.#observer.disconnect();\n this.#observer = null;\n }\n\n // Call subclass teardown\n this.teardown?.();\n }\n\n /**\n * Override in subclass for component initialization\n */\n setup?(): void;\n\n /**\n * Override in subclass for cleanup\n */\n teardown?(): void;\n\n /**\n * Add event listener with automatic cleanup on disconnect.\n */\n on<K extends keyof HTMLElementEventMap>(\n target: EventTarget,\n event: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions\n ): (e: HTMLElementEventMap[K]) => void;\n\n on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): EventListener;\n\n on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options: AddEventListenerOptions = {}\n ): EventListener {\n const boundHandler = handler.bind(this) as EventListener;\n target.addEventListener(event, boundHandler, options);\n\n this.#cleanupFns.push(() => {\n target.removeEventListener(event, boundHandler, options);\n });\n\n return boundHandler;\n }\n\n /**\n * Emit a custom event with ry: prefix.\n */\n emit<T = void>(name: string, detail?: T, options: CustomEventInit = {}): boolean {\n const event = new CustomEvent(`ry:${name}`, {\n bubbles: true,\n cancelable: true,\n detail,\n ...options\n });\n return this.dispatchEvent(event);\n }\n\n /**\n * Get/set component state via data attribute.\n */\n get state(): string {\n return this.dataset.ryState ?? 'closed';\n }\n\n set state(value: string) {\n const oldState = this.state;\n if (oldState !== value) {\n this.dataset.ryState = value;\n this.emit<StateChangeDetail>('state-change', { oldState, newState: value });\n }\n }\n\n /**\n * Query within this element.\n */\n $<E extends Element = Element>(selector: string): E | null {\n return this.querySelector<E>(selector);\n }\n\n /**\n * Query all within this element.\n */\n $$<E extends Element = Element>(selector: string): E[] {\n return [...this.querySelectorAll<E>(selector)];\n }\n\n /**\n * Setup a MutationObserver on this element.\n */\n observe(\n callback: MutationCallback,\n options: MutationObserverInit = { childList: true, subtree: true }\n ): void {\n if (this.#observer) {\n this.#observer.disconnect();\n }\n\n this.#observer = new MutationObserver(callback.bind(this));\n this.#observer.observe(this, options);\n }\n\n /**\n * Wait for next animation frame.\n */\n nextFrame(): Promise<number> {\n return new Promise(resolve => requestAnimationFrame(resolve));\n }\n\n /**\n * Trap focus within a container (for modals, dropdowns).\n */\n trapFocus(container: HTMLElement): void {\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(',');\n\n const focusableEls = container.querySelectorAll<HTMLElement>(focusableSelectors);\n const firstEl = focusableEls[0];\n const lastEl = focusableEls[focusableEls.length - 1];\n\n const handleKeydown = (e: KeyboardEvent): void => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstEl) {\n e.preventDefault();\n lastEl?.focus();\n }\n } else {\n if (document.activeElement === lastEl) {\n e.preventDefault();\n firstEl?.focus();\n }\n }\n };\n\n this.on(container, 'keydown', handleKeydown);\n\n // Focus first element\n firstEl?.focus();\n }\n}\n","/**\n * <ry> Transform Wrapper\n *\n * Allows clean, unprefixed markup inside <ry> tags.\n * Converts <accordion> to <ry-accordion>, etc.\n *\n * Usage:\n * <ry>\n * <accordion>\n * <accordion-item title=\"Foo\">Content</accordion-item>\n * </accordion>\n * </ry>\n *\n * Or with <template ry>:\n * <template ry>\n * <accordion>...</accordion>\n * </template>\n *\n * Both prefixed and unprefixed work together:\n * <ry>\n * <accordion>\n * <ry-accordion-item>Already prefixed, unchanged</ry-accordion-item>\n * <accordion-item>Gets transformed</accordion-item>\n * </accordion>\n * </ry>\n */\n\n// All component names that can be transformed\nconst RY_COMPONENTS: readonly string[] = [\n // Layout\n 'page', 'header', 'main', 'footer', 'section', 'aside',\n 'grid', 'stack', 'cluster', 'split', 'center',\n 'nav', 'logo', 'actions',\n // Components\n 'accordion', 'accordion-item',\n 'tabs', 'tab',\n 'modal',\n 'dropdown', 'menu', 'menu-item',\n 'drawer',\n 'toast',\n 'alert',\n 'card',\n 'button',\n 'button-group',\n 'badge',\n 'field',\n 'switch',\n 'tooltip',\n 'select', 'option',\n 'theme-toggle',\n 'divider',\n 'icon',\n 'example',\n 'toggle-button',\n 'slider',\n 'knob',\n 'number-select',\n 'color-picker',\n 'color-input',\n 'gradient-picker',\n 'tree',\n 'tree-item',\n 'tag',\n 'tag-input',\n 'hero',\n 'stat',\n 'feature',\n 'feature-grid',\n 'pricing',\n 'pricing-card',\n 'carousel',\n 'combobox'\n] as const;\n\n// Build regex once - matches tags not already prefixed\nconst TRANSFORM_REGEX = new RegExp(\n `<(/?)(${RY_COMPONENTS.join('|')})(\\\\s|>|/)`,\n 'g'\n);\n\n/**\n * Transform unprefixed markup to ry- prefixed\n */\nexport function transform(html: string): string {\n return html.replace(TRANSFORM_REGEX, '<$1ry-$2$3');\n}\n\n/**\n * Process all <ry> wrappers and <template ry> blocks\n */\nexport function processTransforms(): void {\n // Process <ry> elements\n document.querySelectorAll('ry').forEach(el => {\n const transformed = transform(el.innerHTML);\n const template = document.createElement('template');\n template.innerHTML = transformed;\n el.replaceWith(template.content);\n });\n\n // Process <template ry> elements\n document.querySelectorAll('template[ry]').forEach(el => {\n const transformed = transform((el as HTMLTemplateElement).innerHTML);\n const template = document.createElement('template');\n template.innerHTML = transformed;\n el.replaceWith(template.content);\n });\n}\n\n// Run transforms when DOM is ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', processTransforms);\n} else {\n // DOM already loaded, run immediately\n processTransforms();\n}\n","/**\n * <ry-accordion>\n *\n * Collapsible accordion component.\n *\n * Minimal markup (recommended):\n * <ry-accordion>\n * <ry-accordion-item title=\"Title\" open>Content</ry-accordion-item>\n * </ry-accordion>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n * This decouples behavior from visual design.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface AccordionItemEventDetail {\n item: HTMLElement;\n}\n\nexport class RyAccordion extends RyElement {\n setup(): void {\n // Transform minimal markup to full structure\n this.#transformMinimalMarkup();\n\n // Bind click handlers to all triggers\n this.$$('[data-ry-target=\"trigger\"]').forEach(trigger => {\n this.on(trigger, 'click', this.#handleTriggerClick);\n });\n\n // Keyboard navigation\n this.on(this, 'keydown', this.#handleKeydown);\n\n // Initialize ARIA\n this.#initAria();\n }\n\n #transformMinimalMarkup(): void {\n // Convert <ry-accordion-item> to full structure\n // data-ry-target for JS queries, class for CSS styling\n this.$$('ry-accordion-item').forEach((item) => {\n const title = item.getAttribute('title') ?? 'Untitled';\n const isOpen = item.hasAttribute('open');\n const content = item.innerHTML;\n\n item.outerHTML = `\n <div data-ry-target=\"item\" class=\"ry-accordion__item\" data-ry-state=\"${isOpen ? 'open' : 'closed'}\">\n <button data-ry-target=\"trigger\" class=\"ry-accordion__trigger\" aria-expanded=\"${isOpen}\">\n ${title}\n <span data-ry-target=\"icon\" class=\"ry-accordion__icon\">&#9660;</span>\n </button>\n <div data-ry-target=\"panel\" class=\"ry-accordion__panel\">\n <div class=\"ry-accordion__content\">${content}</div>\n </div>\n </div>\n `;\n });\n }\n\n #initAria(): void {\n this.$$('[data-ry-target=\"item\"]').forEach((item, index) => {\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n const panel = item.querySelector('[data-ry-target=\"panel\"]');\n\n if (!trigger || !panel) return;\n\n // Generate IDs if not present\n const triggerId = trigger.id || `ry-accordion-trigger-${this.id || ''}-${index}`;\n const panelId = panel.id || `ry-accordion-panel-${this.id || ''}-${index}`;\n\n trigger.id = triggerId;\n panel.id = panelId;\n\n trigger.setAttribute('aria-controls', panelId);\n panel.setAttribute('aria-labelledby', triggerId);\n panel.setAttribute('role', 'region');\n\n // Set initial state\n const isOpen = (item as HTMLElement).dataset.ryState === 'open';\n trigger.setAttribute('aria-expanded', String(isOpen));\n });\n }\n\n #handleTriggerClick = (event: Event): void => {\n const trigger = event.currentTarget as HTMLElement;\n const item = trigger.closest('[data-ry-target=\"item\"]') as HTMLElement | null;\n\n if (!item) return;\n\n this.toggle(item);\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (currentIndex === -1) return;\n\n let newIndex: number;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n newIndex = (currentIndex + 1) % triggers.length;\n triggers[newIndex]?.focus();\n break;\n case 'ArrowUp':\n event.preventDefault();\n newIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n triggers[newIndex]?.focus();\n break;\n case 'Home':\n event.preventDefault();\n triggers[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n triggers[triggers.length - 1]?.focus();\n break;\n }\n };\n\n toggle(item: HTMLElement): void {\n const isOpen = item.dataset.ryState === 'open';\n\n if (isOpen) {\n this.close(item);\n } else {\n this.open(item);\n }\n }\n\n open(item: HTMLElement): void {\n // Close others if not multiple mode\n if (!this.hasAttribute('multiple')) {\n this.$$<HTMLElement>('[data-ry-target=\"item\"][data-ry-state=\"open\"]').forEach(openItem => {\n if (openItem !== item) {\n this.close(openItem);\n }\n });\n }\n\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n\n item.dataset.ryState = 'open';\n trigger?.setAttribute('aria-expanded', 'true');\n\n this.emit<AccordionItemEventDetail>('open', { item });\n }\n\n close(item: HTMLElement): void {\n const trigger = item.querySelector('[data-ry-target=\"trigger\"]');\n\n item.dataset.ryState = 'closed';\n trigger?.setAttribute('aria-expanded', 'false');\n\n this.emit<AccordionItemEventDetail>('close', { item });\n }\n\n openAll(): void {\n this.$$<HTMLElement>('[data-ry-target=\"item\"]').forEach(item => this.open(item));\n }\n\n closeAll(): void {\n this.$$<HTMLElement>('[data-ry-target=\"item\"]').forEach(item => this.close(item));\n }\n}\n\ncustomElements.define('ry-accordion', RyAccordion);\n\n// Register placeholder for minimal markup\nif (!customElements.get('ry-accordion-item')) {\n customElements.define('ry-accordion-item', class extends HTMLElement {});\n}\n","/**\n * <ry-modal>\n *\n * Modal dialog with focus trapping and backdrop.\n *\n * Minimal markup (recommended):\n * <ry-button modal=\"my-modal\">Open</ry-button>\n * <ry-modal id=\"my-modal\" title=\"Title\">\n * Content\n * <ry-actions slot=\"footer\">...</ry-actions>\n * </ry-modal>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyModal extends RyElement {\n #previouslyFocused: Element | null = null;\n #scrollbarWidth = 0;\n\n setup(): void {\n // Handle Option B: transform minimal markup\n this.#transformMinimalMarkup();\n\n // Find trigger buttons anywhere in document\n const modalId = this.id;\n if (modalId) {\n // data-ry-modal-trigger attribute\n document.querySelectorAll<HTMLElement>(`[data-ry-modal-trigger=\"${modalId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n\n // modal=\"id\" attribute on ry-button\n document.querySelectorAll<HTMLElement>(`ry-button[modal=\"${modalId}\"], [modal=\"${modalId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n }\n\n // Close buttons inside modal (use [close] attribute)\n this.$$('[close]').forEach(closeBtn => {\n this.on(closeBtn, 'click', () => this.close());\n });\n\n // Backdrop click\n const backdrop = this.$('[data-ry-target=\"backdrop\"]');\n if (backdrop) {\n this.on(backdrop, 'click', () => this.close());\n }\n\n // Escape key\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Calculate scrollbar width\n this.#scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n // Initialize state\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n }\n\n #transformMinimalMarkup(): void {\n // Check if already has full markup\n if (this.$('[data-ry-target=\"dialog\"]')) return;\n\n const title = this.getAttribute('title') ?? '';\n const footerSlot = this.$<HTMLElement>('[slot=\"footer\"]');\n const footerContent = footerSlot?.innerHTML ?? '';\n\n const bodyContent = Array.from(this.childNodes)\n .filter(n => !(n instanceof Element && n.getAttribute('slot') === 'footer'))\n .map(n => n instanceof Element ? n.outerHTML : n.textContent)\n .join('');\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"backdrop\" class=\"ry-modal__backdrop\"></div>\n <div data-ry-target=\"dialog\" class=\"ry-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ry-modal-title-${this.id}\">\n <div data-ry-target=\"header\" class=\"ry-modal__header\">\n <h3 class=\"ry-modal__title\" id=\"ry-modal-title-${this.id}\">${title}</h3>\n <button data-ry-target=\"close\" class=\"ry-modal__close\" close aria-label=\"Close\">&times;</button>\n </div>\n <div data-ry-target=\"body\" class=\"ry-modal__body\">${bodyContent}</div>\n ${footerContent ? `<div data-ry-target=\"footer\" class=\"ry-modal__footer\">${footerContent}</div>` : ''}\n </div>\n `;\n }\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n // Store currently focused element\n this.#previouslyFocused = document.activeElement;\n\n // Lock body scroll via data attribute (CSS handles the style)\n document.body.setAttribute('data-ry-scroll-lock', '');\n document.body.style.setProperty('--ry-scrollbar-width', `${this.#scrollbarWidth}px`);\n\n // Open modal\n this.state = 'open';\n\n // Trap focus\n const dialog = this.$<HTMLElement>('[data-ry-target=\"dialog\"]');\n if (dialog) {\n this.nextFrame().then(() => {\n this.trapFocus(dialog);\n });\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n // Unlock body scroll\n document.body.removeAttribute('data-ry-scroll-lock');\n document.body.style.removeProperty('--ry-scrollbar-width');\n\n // Close modal\n this.state = 'closed';\n\n // Restore focus\n if (this.#previouslyFocused instanceof HTMLElement) {\n this.#previouslyFocused.focus();\n this.#previouslyFocused = null;\n }\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-modal', RyModal);\n","/**\n * <ry-tabs>\n *\n * Tab interface with keyboard navigation.\n *\n * Minimal markup (recommended):\n * <ry-tabs>\n * <ry-tab title=\"Tab 1\" active>Content 1</ry-tab>\n * <ry-tab title=\"Tab 2\">Content 2</ry-tab>\n * </ry-tabs>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface TabChangeDetail {\n index: number;\n trigger: HTMLElement;\n panel: HTMLElement;\n}\n\nexport class RyTabs extends RyElement {\n setup(): void {\n // Transform minimal markup to full structure\n this.#transformMinimalMarkup();\n\n // Bind click handlers\n this.$$('[data-ry-target=\"trigger\"]').forEach(trigger => {\n this.on(trigger, 'click', this.#handleTriggerClick);\n });\n\n // Keyboard navigation\n this.on(this, 'keydown', this.#handleKeydown);\n\n // Initialize ARIA\n this.#initAria();\n }\n\n #transformMinimalMarkup(): void {\n const tabs = this.$$('ry-tab');\n if (tabs.length === 0) return;\n\n const activeIndex = tabs.findIndex(t => t.hasAttribute('active'));\n const defaultActive = activeIndex === -1 ? 0 : activeIndex;\n\n // Build tab list\n // data-ry-target for JS queries, class for CSS styling\n const tabList = document.createElement('div');\n tabList.setAttribute('data-ry-target', 'list');\n tabList.className = 'ry-tabs__list';\n tabList.setAttribute('role', 'tablist');\n\n tabs.forEach((tab, index) => {\n const title = tab.getAttribute('title') ?? `Tab ${index + 1}`;\n const isActive = index === defaultActive;\n\n const trigger = document.createElement('button');\n trigger.setAttribute('data-ry-target', 'trigger');\n trigger.className = 'ry-tabs__trigger';\n trigger.setAttribute('role', 'tab');\n trigger.setAttribute('aria-selected', String(isActive));\n trigger.textContent = title;\n\n tabList.appendChild(trigger);\n\n // Convert ry-tab to panel\n tab.setAttribute('data-ry-target', 'panel');\n tab.className = 'ry-tabs__panel';\n tab.setAttribute('role', 'tabpanel');\n (tab as HTMLElement).dataset.ryState = isActive ? 'active' : '';\n tab.removeAttribute('title');\n tab.removeAttribute('active');\n });\n\n // Insert tab list at beginning\n this.insertBefore(tabList, this.firstChild);\n }\n\n #initAria(): void {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const panels = this.$$<HTMLElement>('[data-ry-target=\"panel\"], ry-tab');\n\n triggers.forEach((trigger, index) => {\n const panel = panels[index];\n if (!panel) return;\n\n // Generate IDs\n const triggerId = trigger.id || `ry-tab-${this.id || ''}-${index}`;\n const panelId = panel.id || `ry-tabpanel-${this.id || ''}-${index}`;\n\n trigger.id = triggerId;\n panel.id = panelId;\n\n trigger.setAttribute('aria-controls', panelId);\n panel.setAttribute('aria-labelledby', triggerId);\n\n // Set tabindex for keyboard nav\n trigger.setAttribute('tabindex', trigger.getAttribute('aria-selected') === 'true' ? '0' : '-1');\n });\n\n // Ensure one tab is active\n const activeIndex = triggers.findIndex(t => t.getAttribute('aria-selected') === 'true');\n if (activeIndex === -1 && triggers.length > 0) {\n this.select(0);\n }\n }\n\n #handleTriggerClick = (event: Event): void => {\n const trigger = event.currentTarget as HTMLElement;\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const index = triggers.indexOf(trigger);\n\n if (index !== -1) {\n this.select(index);\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const currentIndex = triggers.indexOf(document.activeElement as HTMLElement);\n\n if (currentIndex === -1) return;\n\n let newIndex: number;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n newIndex = (currentIndex + 1) % triggers.length;\n this.select(newIndex);\n triggers[newIndex]?.focus();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = (currentIndex - 1 + triggers.length) % triggers.length;\n this.select(newIndex);\n triggers[newIndex]?.focus();\n break;\n case 'Home':\n event.preventDefault();\n this.select(0);\n triggers[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n this.select(triggers.length - 1);\n triggers[triggers.length - 1]?.focus();\n break;\n }\n };\n\n select(index: number): void {\n const triggers = this.$$<HTMLElement>('[data-ry-target=\"trigger\"]');\n const panels = this.$$<HTMLElement>('[data-ry-target=\"panel\"], ry-tab');\n\n if (index < 0 || index >= triggers.length) return;\n\n // Deactivate all\n triggers.forEach(trigger => {\n trigger.setAttribute('aria-selected', 'false');\n trigger.setAttribute('tabindex', '-1');\n });\n\n panels.forEach(panel => {\n panel.dataset.ryState = '';\n panel.removeAttribute('active');\n });\n\n // Activate selected\n const trigger = triggers[index];\n const panel = panels[index];\n\n if (trigger && panel) {\n trigger.setAttribute('aria-selected', 'true');\n trigger.setAttribute('tabindex', '0');\n panel.dataset.ryState = 'active';\n\n this.emit<TabChangeDetail>('change', { index, trigger, panel });\n }\n }\n\n get selectedIndex(): number {\n const triggers = this.$$('[data-ry-target=\"trigger\"]');\n return triggers.findIndex(t => t.getAttribute('aria-selected') === 'true');\n }\n}\n\ncustomElements.define('ry-tabs', RyTabs);\n\n// Register placeholder for minimal markup\nif (!customElements.get('ry-tab')) {\n customElements.define('ry-tab', class extends HTMLElement {});\n}\n","/**\n * <ry-dropdown>\n *\n * Dropdown menu with click-outside handling.\n *\n * Minimal markup (recommended):\n * <ry-dropdown>\n * <ry-button slot=\"trigger\">Options</ry-button>\n * <ry-menu>\n * <ry-menu-item>Edit</ry-menu-item>\n * </ry-menu>\n * </ry-dropdown>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyDropdown extends RyElement {\n setup(): void {\n // Handle Option B: transform minimal markup\n this.#transformMinimalMarkup();\n\n const trigger = this.$<HTMLElement>('[data-ry-target=\"trigger\"]');\n\n if (trigger) {\n this.on(trigger, 'click', () => this.toggle());\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleClickOutside);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Menu item clicks\n this.$$('[data-ry-target=\"item\"], ry-menu-item').forEach(item => {\n this.on(item, 'click', () => this.close());\n });\n\n // Initialize state\n this.state = 'closed';\n }\n\n #transformMinimalMarkup(): void {\n // Handle ry-button with slot=\"trigger\"\n // data-ry-target for JS queries, class for CSS styling\n const triggerButton = this.$('[slot=\"trigger\"], ry-button:first-of-type');\n if (triggerButton && !this.$('[data-ry-target=\"trigger\"]')) {\n triggerButton.setAttribute('data-ry-target', 'trigger');\n }\n\n // Handle ry-menu\n const menu = this.$('ry-menu');\n if (menu && !menu.hasAttribute('data-ry-target')) {\n menu.setAttribute('data-ry-target', 'menu');\n menu.classList.add('ry-dropdown__menu');\n menu.setAttribute('role', 'menu');\n }\n\n // Handle ry-menu-item\n this.$$('ry-menu-item').forEach(item => {\n if (!item.hasAttribute('data-ry-target')) {\n item.setAttribute('data-ry-target', 'item');\n item.classList.add('ry-dropdown__item');\n item.setAttribute('role', 'menuitem');\n }\n });\n }\n\n #handleClickOutside = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (this.state === 'open' && !this.contains(target)) {\n this.close();\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n this.$<HTMLElement>('[data-ry-target=\"trigger\"]')?.focus();\n }\n\n // Arrow key navigation within menu\n if (this.state === 'open' && ['ArrowDown', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n const items = this.$$<HTMLElement>('[data-ry-target=\"item\"], ry-menu-item');\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n let newIndex: number;\n if (event.key === 'ArrowDown') {\n newIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n } else {\n newIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n }\n\n items[newIndex]?.focus();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n this.#positionMenu();\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n trigger?.setAttribute('aria-expanded', 'true');\n\n this.state = 'open';\n\n // Focus first item\n this.nextFrame().then(() => {\n this.$<HTMLElement>('[data-ry-target=\"item\"], ry-menu-item')?.focus();\n });\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n trigger?.setAttribute('aria-expanded', 'false');\n\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n this.emit('close');\n }\n\n #positionMenu(): void {\n const menu = this.$<HTMLElement>('[data-ry-target=\"menu\"], ry-menu');\n if (!menu) return;\n\n const rect = this.getBoundingClientRect();\n const menuHeight = menu.scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < menuHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-dropdown', RyDropdown);\n\n// Register placeholders for minimal markup\nif (!customElements.get('ry-menu')) {\n customElements.define('ry-menu', class extends HTMLElement {});\n}\nif (!customElements.get('ry-menu-item')) {\n customElements.define('ry-menu-item', class extends HTMLElement {});\n}\n","/**\n * <ry-button>\n *\n * Button component that renders as a native button.\n * Supports variant and size attributes.\n *\n * Usage:\n * <ry-button>Click me</ry-button>\n * <ry-button variant=\"ghost\" size=\"sm\">Small ghost</ry-button>\n * <ry-button modal=\"my-modal\">Open modal</ry-button>\n *\n * No data-ry-target needed - button has no internal structure.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyButton extends RyElement {\n setup(): void {\n // Make it focusable and clickable like a button\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n this.setAttribute('role', 'button');\n\n // Handle click\n this.on(this, 'click', this.#handleClick);\n\n // Handle keyboard\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) {\n event.preventDefault();\n return;\n }\n\n // If it has a modal attribute, the modal will handle it\n // Just emit the click event\n this.emit('click', { originalEvent: event });\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.click();\n }\n };\n}\n\ncustomElements.define('ry-button', RyButton);\n","/**\n * <ry-button-group>\n *\n * Segmented control / button group. Groups child buttons with\n * connected borders and optional radio-group behavior.\n *\n * Usage (visual grouping only):\n * <ry-button-group>\n * <ry-button>Left</ry-button>\n * <ry-button>Center</ry-button>\n * <ry-button>Right</ry-button>\n * </ry-button-group>\n *\n * Usage (radio behavior — single selection):\n * <ry-button-group name=\"mode\" value=\"terminal\">\n * <ry-button value=\"direct\">Direct</ry-button>\n * <ry-button value=\"terminal\">Terminal</ry-button>\n * <ry-button value=\"release\">Release</ry-button>\n * </ry-button-group>\n *\n * Emits ry:change with { value } when selection changes.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyButtonGroup extends RyElement {\n static get observedAttributes(): string[] {\n return ['value'];\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(v: string) {\n this.setAttribute('value', v);\n }\n\n setup(): void {\n this.setAttribute('role', 'group');\n this.#syncPressed();\n this.on(this, 'click', this.#handleClick);\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (name === 'value' && oldValue !== newValue) {\n this.#syncPressed();\n }\n }\n\n #handleClick = (e: MouseEvent): void => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('ry-button, ry-toggle-button');\n if (!target || !this.contains(target)) return;\n\n const val = target.getAttribute('value');\n if (val == null) return;\n\n if (this.value !== val) {\n this.value = val;\n this.emit('change', { value: val });\n }\n };\n\n #syncPressed(): void {\n const current = this.value;\n if (!current) return;\n\n for (const btn of this.querySelectorAll<HTMLElement>('ry-button, ry-toggle-button')) {\n if (btn.getAttribute('value') === current) {\n btn.setAttribute('pressed', '');\n btn.setAttribute('aria-pressed', 'true');\n } else {\n btn.removeAttribute('pressed');\n btn.removeAttribute('aria-pressed');\n }\n }\n }\n}\n\ncustomElements.define('ry-button-group', RyButtonGroup);\n","/**\n * <ry-split>\n *\n * Two-column split layout with optional resizable divider and persistence.\n *\n * Usage:\n * <ry-split>\n * <div>Main content</div>\n * <div>Sidebar</div>\n * </ry-split>\n *\n * Resizable with persistence:\n * <ry-split resizable persist=\"my-panel\">\n * <div>Main</div>\n * <div>Panel</div>\n * </ry-split>\n *\n * CSS custom properties:\n * --ry-split-width: Sidebar width (default 300px)\n * --ry-split-min-width: Sidebar minimum during resize (default 100px)\n * --ry-split-max-width: Sidebar maximum during resize (default 80% of container)\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RySplit extends RyElement {\n #handle: HTMLElement | null = null;\n #dragging = false;\n #startX = 0;\n #startWidth = 0;\n\n setup(): void {\n if (!this.hasAttribute('resizable')) return;\n\n // Restore persisted width\n this.#restore();\n\n // Create resize handle\n this.#handle = document.createElement('div');\n this.#handle.setAttribute('data-ry-target', 'handle');\n this.#handle.className = 'ry-split__handle';\n this.#handle.setAttribute('role', 'separator');\n this.#handle.setAttribute('aria-orientation', 'vertical');\n this.#handle.setAttribute('tabindex', '0');\n\n // Insert handle before the last child (the sidebar)\n const sidebar = this.lastElementChild;\n if (sidebar) {\n this.insertBefore(this.#handle, sidebar);\n }\n\n this.on(this.#handle, 'mousedown', this.#onMouseDown);\n this.on(this.#handle, 'touchstart', this.#onTouchStart as EventListener);\n this.on(this.#handle, 'keydown', this.#onKeyDown);\n this.on(this.#handle, 'dblclick', this.#onDoubleClick);\n }\n\n #getSidebar(): HTMLElement | null {\n return this.lastElementChild as HTMLElement | null;\n }\n\n #getCurrentWidth(): number {\n const sidebar = this.#getSidebar();\n if (!sidebar) return 300;\n return sidebar.getBoundingClientRect().width;\n }\n\n #getMinWidth(): number {\n const val = getComputedStyle(this).getPropertyValue('--ry-split-min-width').trim();\n return val ? parseFloat(val) : 100;\n }\n\n #getMaxWidth(): number {\n const val = getComputedStyle(this).getPropertyValue('--ry-split-max-width').trim();\n if (val) return parseFloat(val);\n return this.getBoundingClientRect().width * 0.8;\n }\n\n #setWidth(px: number): void {\n const min = this.#getMinWidth();\n const max = this.#getMaxWidth();\n const clamped = Math.round(Math.max(min, Math.min(max, px)));\n this.style.setProperty('--ry-split-width', `${clamped}px`);\n }\n\n #onMouseDown = (e: MouseEvent): void => {\n e.preventDefault();\n this.#startDrag(e.clientX);\n const onMove = (ev: MouseEvent) => this.#onDrag(ev.clientX);\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n this.#endDrag();\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n #onTouchStart = (e: TouchEvent): void => {\n const touch = e.touches[0];\n if (!touch) return;\n e.preventDefault();\n this.#startDrag(touch.clientX);\n const onMove = (ev: TouchEvent) => {\n const t = ev.touches[0];\n if (t) this.#onDrag(t.clientX);\n };\n const onEnd = () => {\n document.removeEventListener('touchmove', onMove);\n document.removeEventListener('touchend', onEnd);\n this.#endDrag();\n };\n document.addEventListener('touchmove', onMove, { passive: false });\n document.addEventListener('touchend', onEnd);\n };\n\n #startDrag(clientX: number): void {\n this.#dragging = true;\n this.#startX = clientX;\n this.#startWidth = this.#getCurrentWidth();\n this.setAttribute('data-ry-resizing', '');\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n #onDrag(clientX: number): void {\n if (!this.#dragging) return;\n // Dragging left increases sidebar width (sidebar is on the right)\n const delta = this.#startX - clientX;\n this.#setWidth(this.#startWidth + delta);\n }\n\n #endDrag(): void {\n this.#dragging = false;\n this.removeAttribute('data-ry-resizing');\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.#persist();\n this.emit('resize', { width: this.#getCurrentWidth() });\n }\n\n #onKeyDown = (e: KeyboardEvent): void => {\n const step = e.shiftKey ? 50 : 10;\n let width = this.#getCurrentWidth();\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.#setWidth(width + step); // Left grows sidebar\n this.#persist();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n this.#setWidth(width - step); // Right shrinks sidebar\n this.#persist();\n } else if (e.key === 'Home') {\n e.preventDefault();\n this.#setWidth(this.#getMinWidth());\n this.#persist();\n } else if (e.key === 'End') {\n e.preventDefault();\n this.#setWidth(this.#getMaxWidth());\n this.#persist();\n }\n };\n\n #onDoubleClick = (): void => {\n // Reset to default\n this.style.removeProperty('--ry-split-width');\n this.#clearPersist();\n this.emit('resize', { width: this.#getCurrentWidth() });\n };\n\n // Persistence\n #persistKey(): string | null {\n const key = this.getAttribute('persist');\n return key ? `ry-split:${key}` : null;\n }\n\n #persist(): void {\n const key = this.#persistKey();\n if (!key) return;\n try {\n localStorage.setItem(key, String(this.#getCurrentWidth()));\n } catch { /* storage full or unavailable */ }\n }\n\n #restore(): void {\n const key = this.#persistKey();\n if (!key) return;\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n const px = parseFloat(saved);\n if (!isNaN(px)) {\n this.style.setProperty('--ry-split-width', `${px}px`);\n }\n }\n } catch { /* storage unavailable */ }\n }\n\n #clearPersist(): void {\n const key = this.#persistKey();\n if (!key) return;\n try { localStorage.removeItem(key); } catch { /* */ }\n }\n}\n\ncustomElements.define('ry-split', RySplit);\n","/**\n * <ry-theme-toggle>\n *\n * Simple theme switcher button.\n * Cycles through available themes or toggles light/dark.\n *\n * Usage:\n * <ry-theme-toggle></ry-theme-toggle>\n * <ry-theme-toggle themes=\"light,dark,ocean\"></ry-theme-toggle>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\ninterface ThemeChangeDetail {\n theme: string;\n}\n\nexport class RyThemeToggle extends RyElement {\n #themes: string[] = ['light', 'dark'];\n #currentIndex = 0;\n\n setup(): void {\n // Parse themes attribute\n const themesAttr = this.getAttribute('themes');\n if (themesAttr) {\n this.#themes = themesAttr.split(',').map(t => t.trim());\n }\n\n // Get current theme\n const currentTheme = document.documentElement.dataset.ryTheme ?? 'light';\n this.#currentIndex = this.#themes.indexOf(currentTheme);\n if (this.#currentIndex === -1) this.#currentIndex = 0;\n\n // Add button if empty\n if (!this.innerHTML.trim()) {\n this.innerHTML = `<button data-ry-target=\"button\" class=\"ry-btn ry-btn--ghost\">${this.#getIcon()}</button>`;\n }\n\n // Bind click\n this.on(this, 'click', () => this.toggle());\n }\n\n #getIcon(): string {\n const theme = this.#themes[this.#currentIndex];\n switch (theme) {\n case 'dark':\n return '&#9790;'; // Moon\n case 'ocean':\n return '&#127754;'; // Wave\n default:\n return '&#9728;'; // Sun\n }\n }\n\n toggle(): void {\n this.#currentIndex = (this.#currentIndex + 1) % this.#themes.length;\n const newTheme = this.#themes[this.#currentIndex]!;\n\n document.documentElement.dataset.ryTheme = newTheme;\n\n // Update icon\n const btn = this.$('[data-ry-target=\"button\"]');\n if (btn) {\n btn.innerHTML = this.#getIcon();\n }\n\n this.emit<ThemeChangeDetail>('theme-change', { theme: newTheme });\n }\n\n get theme(): string {\n return this.#themes[this.#currentIndex] ?? 'light';\n }\n\n set theme(value: string) {\n const index = this.#themes.indexOf(value);\n if (index !== -1) {\n this.#currentIndex = index;\n document.documentElement.dataset.ryTheme = value;\n\n const btn = this.$('[data-ry-target=\"button\"]');\n if (btn) {\n btn.innerHTML = this.#getIcon();\n }\n }\n }\n}\n\ncustomElements.define('ry-theme-toggle', RyThemeToggle);\n","/**\n * <ry-card>\n *\n * Card container. CSS-only by default.\n * Add `interactive` attribute for clickable cards with href navigation.\n *\n * Usage:\n * <ry-card>Static content</ry-card>\n * <ry-card interactive href=\"/demos/goap\">Clickable card</ry-card>\n * <ry-card interactive>Emits ry:click on click</ry-card>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyCard extends RyElement {\n setup(): void {\n if (!this.hasAttribute('interactive')) return;\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n this.setAttribute('role', 'link');\n\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleClick = (e: MouseEvent): void => {\n // Ignore clicks on links/buttons inside the card\n const target = e.target as HTMLElement;\n if (target.closest('a, button, ry-button')) return;\n\n const href = this.getAttribute('href');\n if (href) {\n window.location.href = href;\n }\n this.emit('click', { originalEvent: e });\n };\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.click();\n }\n };\n}\n\ncustomElements.define('ry-card', RyCard);\n","/**\n * <ry-alert>\n *\n * Alert message component.\n *\n * Usage:\n * <ry-alert>Default info alert</ry-alert>\n * <ry-alert variant=\"success\">Success!</ry-alert>\n * <ry-alert variant=\"warning\" dismissible>Warning with close button</ry-alert>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyAlert extends RyElement {\n setup(): void {\n // Transform minimal markup\n this.#transformMarkup();\n\n // Dismissible (use [close] attribute)\n const closeBtn = this.$('[close]');\n if (closeBtn) {\n this.on(closeBtn, 'click', () => this.dismiss());\n }\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"content\"]')) return;\n\n const variant = this.getAttribute('variant') ?? 'info';\n const dismissible = this.hasAttribute('dismissible');\n const content = this.innerHTML;\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"content\" class=\"ry-alert__content\">${content}</div>\n ${dismissible ? '<button data-ry-target=\"close\" class=\"ry-alert__close\" close aria-label=\"Dismiss\">&times;</button>' : ''}\n `;\n\n this.setAttribute('role', 'alert');\n this.setAttribute('data-variant', variant);\n }\n\n dismiss(): void {\n this.state = 'closed';\n\n // Remove after animation\n setTimeout(() => {\n this.remove();\n }, 200);\n\n this.emit('close');\n }\n}\n\ncustomElements.define('ry-alert', RyAlert);\n","/**\n * <ry-field>\n *\n * Form field wrapper with label, error, and hint.\n *\n * Usage:\n * <ry-field label=\"Email\">\n * <input type=\"email\" placeholder=\"you@example.com\">\n * </ry-field>\n *\n * <ry-field label=\"Password\" hint=\"Min 8 characters\" error=\"Too short\">\n * <input type=\"password\">\n * </ry-field>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyField extends RyElement {\n static get observedAttributes(): string[] {\n return ['label', 'error', 'hint'];\n }\n\n setup(): void {\n this.#transformMarkup();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'error') {\n this.#updateError(newValue);\n } else if (name === 'hint') {\n this.#updateHint(newValue);\n } else if (name === 'label') {\n this.#updateLabel(newValue);\n }\n }\n\n #transformMarkup(): void {\n const input = this.$<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select');\n if (!input) return;\n\n // Generate ID if needed\n const inputId = input.id || `ry-field-${Math.random().toString(36).slice(2, 9)}`;\n input.id = inputId;\n\n // Label\n if (!this.$('[data-ry-target=\"label\"]')) {\n const labelText = this.getAttribute('label');\n if (labelText) {\n const label = document.createElement('label');\n label.setAttribute('data-ry-target', 'label');\n label.className = 'ry-label';\n label.setAttribute('for', inputId);\n label.textContent = labelText;\n this.insertBefore(label, input);\n }\n }\n\n // Error message (hidden by default via CSS when empty)\n if (!this.$('[data-ry-target=\"error\"]')) {\n const errorEl = document.createElement('div');\n errorEl.setAttribute('data-ry-target', 'error');\n errorEl.className = 'ry-field__error';\n errorEl.setAttribute('role', 'alert');\n const errorText = this.getAttribute('error');\n if (errorText) {\n errorEl.textContent = errorText;\n }\n input.insertAdjacentElement('afterend', errorEl);\n }\n\n // Hint text (hidden when error is visible)\n if (!this.$('[data-ry-target=\"hint\"]')) {\n const hintEl = document.createElement('div');\n hintEl.setAttribute('data-ry-target', 'hint');\n hintEl.className = 'ry-field__hint';\n const hintText = this.getAttribute('hint');\n if (hintText) {\n hintEl.textContent = hintText;\n }\n const errorEl = this.$('[data-ry-target=\"error\"]');\n if (errorEl) {\n errorEl.insertAdjacentElement('afterend', hintEl);\n } else {\n input.insertAdjacentElement('afterend', hintEl);\n }\n }\n\n // Link input to error via aria-describedby\n const errorEl = this.$('[data-ry-target=\"error\"]');\n const hintEl = this.$('[data-ry-target=\"hint\"]');\n const describedBy: string[] = [];\n if (errorEl) {\n errorEl.id = `${inputId}-error`;\n describedBy.push(errorEl.id);\n }\n if (hintEl) {\n hintEl.id = `${inputId}-hint`;\n describedBy.push(hintEl.id);\n }\n if (describedBy.length) {\n input.setAttribute('aria-describedby', describedBy.join(' '));\n }\n }\n\n #updateError(text: string | null): void {\n const el = this.$('[data-ry-target=\"error\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n // Toggle invalid state on the input\n const input = this.$<HTMLInputElement>('input, textarea, select');\n if (input) {\n if (text) {\n input.setAttribute('aria-invalid', 'true');\n } else {\n input.removeAttribute('aria-invalid');\n }\n }\n }\n\n #updateHint(text: string | null): void {\n const el = this.$('[data-ry-target=\"hint\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n }\n\n #updateLabel(text: string | null): void {\n const el = this.$('[data-ry-target=\"label\"]');\n if (el) {\n el.textContent = text ?? '';\n }\n }\n}\n\ncustomElements.define('ry-field', RyField);\n","/**\n * <ry-switch>\n *\n * Toggle switch component.\n *\n * Usage:\n * <ry-switch name=\"darkMode\">Dark mode</ry-switch>\n * <ry-switch name=\"notifications\" checked>Enable notifications</ry-switch>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ChangeDetail } from '../types.js';\n\nlet switchIdCounter = 0;\n\nexport class RySwitch extends RyElement {\n #input: HTMLInputElement | null = null;\n\n static observedAttributes = ['checked', 'disabled'] as const;\n\n setup(): void {\n this.#transformMarkup();\n\n this.#input = this.$<HTMLInputElement>('input[type=\"checkbox\"]');\n if (this.#input) {\n this.on(this.#input, 'change', this.#handleChange);\n }\n\n // Keyboard support on the wrapper\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"track\"]')) return;\n\n const id = `ry-switch-${++switchIdCounter}`;\n const name = this.getAttribute('name') ?? '';\n const checked = this.hasAttribute('checked');\n const disabled = this.hasAttribute('disabled');\n const label = this.textContent?.trim() ?? '';\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <label data-ry-target=\"wrapper\" class=\"ry-switch__wrapper\" for=\"${id}\">\n <input\n type=\"checkbox\"\n id=\"${id}\"\n data-ry-target=\"input\"\n class=\"ry-switch__input\"\n ${name ? `name=\"${name}\"` : ''}\n ${checked ? 'checked' : ''}\n ${disabled ? 'disabled' : ''}\n role=\"switch\"\n aria-checked=\"${checked}\"\n >\n <span data-ry-target=\"track\" class=\"ry-switch__track\">\n <span data-ry-target=\"thumb\" class=\"ry-switch__thumb\"></span>\n </span>\n ${label ? `<span data-ry-target=\"label\" class=\"ry-switch__label\">${label}</span>` : ''}\n </label>\n `;\n }\n\n #handleChange = (): void => {\n if (!this.#input) return;\n\n const checked = this.#input.checked;\n this.#input.setAttribute('aria-checked', String(checked));\n\n if (checked) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n\n this.emit<ChangeDetail>('change', {\n value: String(checked),\n label: checked ? 'on' : 'off'\n });\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.#input?.click();\n }\n };\n\n get checked(): boolean {\n return this.#input?.checked ?? false;\n }\n\n set checked(value: boolean) {\n if (this.#input) {\n this.#input.checked = value;\n this.#input.setAttribute('aria-checked', String(value));\n\n if (value) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n }\n\n get value(): string {\n return this.#input?.value ?? '';\n }\n\n set value(val: string) {\n if (this.#input) {\n this.#input.value = val;\n }\n }\n}\n\ncustomElements.define('ry-switch', RySwitch);\n","/**\n * <ry-tooltip>\n *\n * Tooltip component that shows on hover/focus.\n *\n * Usage:\n * <ry-tooltip content=\"Save your changes\">\n * <ry-button>Save</ry-button>\n * </ry-tooltip>\n *\n * <ry-tooltip content=\"Delete item\" position=\"bottom\">\n * <ry-button variant=\"danger\">Delete</ry-button>\n * </ry-tooltip>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nlet tooltipIdCounter = 0;\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nexport class RyTooltip extends RyElement {\n #showTimeout: ReturnType<typeof setTimeout> | null = null;\n #tooltipEl: HTMLElement | null = null;\n #tooltipId: string | null = null;\n\n setup(): void {\n this.#tooltipId = `ry-tooltip-${++tooltipIdCounter}`;\n\n // Create tooltip element\n this.#createTooltip();\n\n // Find trigger (first child element)\n const trigger = this.firstElementChild;\n if (trigger) {\n // Set ARIA\n trigger.setAttribute('aria-describedby', this.#tooltipId);\n\n // Mouse events\n this.on(trigger, 'mouseenter', this.#scheduleShow);\n this.on(trigger, 'mouseleave', this.#hide);\n\n // Focus events\n this.on(trigger, 'focusin', this.#scheduleShow);\n this.on(trigger, 'focusout', this.#hide);\n }\n\n // Escape to hide\n this.on(document, 'keydown', this.#handleKeydown);\n }\n\n #createTooltip(): void {\n // data-ry-target for JS queries, class for CSS styling\n this.#tooltipEl = document.createElement('div');\n this.#tooltipEl.id = this.#tooltipId!;\n this.#tooltipEl.setAttribute('data-ry-target', 'content');\n this.#tooltipEl.className = 'ry-tooltip__content';\n this.#tooltipEl.setAttribute('role', 'tooltip');\n this.#tooltipEl.textContent = this.getAttribute('content') ?? '';\n this.appendChild(this.#tooltipEl);\n }\n\n #scheduleShow = (): void => {\n // Clear any pending hide\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n }\n\n // Delay show by 200ms\n this.#showTimeout = setTimeout(() => {\n this.#show();\n }, 200);\n };\n\n #show = (): void => {\n const position = (this.getAttribute('position') ?? 'top') as TooltipPosition;\n this.setAttribute('data-ry-position', position);\n this.state = 'open';\n // Positioning handled by CSS via data-ry-position attribute\n };\n\n #hide = (): void => {\n // Clear pending show\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n this.#showTimeout = null;\n }\n\n this.state = 'closed';\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.#hide();\n }\n };\n\n teardown(): void {\n if (this.#showTimeout) {\n clearTimeout(this.#showTimeout);\n }\n }\n}\n\ncustomElements.define('ry-tooltip', RyTooltip);\n","/**\n * <ry-drawer>\n *\n * Slide-out drawer/panel component.\n *\n * Usage:\n * <ry-button drawer=\"menu\">Open Menu</ry-button>\n * <ry-drawer id=\"menu\" side=\"left\">\n * <h2>Menu</h2>\n * <nav>...</nav>\n * </ry-drawer>\n *\n * Attributes:\n * - id: Required for trigger binding\n * - side: left (default), right, bottom\n * - open: Initially open\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyDrawer extends RyElement {\n #previouslyFocused: Element | null = null;\n #scrollbarWidth = 0;\n\n setup(): void {\n this.#transformMarkup();\n\n // Find trigger buttons anywhere in document\n const drawerId = this.id;\n if (drawerId) {\n // drawer=\"id\" attribute on ry-button\n document.querySelectorAll<HTMLElement>(`ry-button[drawer=\"${drawerId}\"], [drawer=\"${drawerId}\"]`).forEach(trigger => {\n this.on(trigger, 'click', () => this.open());\n });\n }\n\n // Close buttons inside drawer (use [close] attribute)\n this.$$('[close]').forEach(closeBtn => {\n this.on(closeBtn, 'click', () => this.close());\n });\n\n // Backdrop click\n const backdrop = this.$('[data-ry-target=\"backdrop\"]');\n if (backdrop) {\n this.on(backdrop, 'click', () => this.close());\n }\n\n // Escape key\n this.on(document, 'keydown', this.#handleKeydown);\n\n // Calculate scrollbar width\n this.#scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n // Initialize state\n if (this.hasAttribute('open')) {\n this.state = 'open';\n } else if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n }\n\n #transformMarkup(): void {\n // Check if already has full markup\n if (this.$('[data-ry-target=\"panel\"]')) return;\n\n const side = this.getAttribute('side') ?? 'left';\n const content = this.innerHTML;\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"backdrop\" class=\"ry-drawer__backdrop\"></div>\n <div data-ry-target=\"panel\" class=\"ry-drawer__panel\" role=\"dialog\" aria-modal=\"true\" data-ry-side=\"${side}\">\n <button data-ry-target=\"close\" class=\"ry-drawer__close\" close aria-label=\"Close\">&times;</button>\n <div data-ry-target=\"content\" class=\"ry-drawer__content\">\n ${content}\n </div>\n </div>\n `;\n\n // Set side attribute for CSS\n this.setAttribute('data-ry-side', side);\n }\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.state === 'open') {\n this.close();\n }\n };\n\n open(): void {\n if (this.state === 'open') return;\n\n // Store currently focused element\n this.#previouslyFocused = document.activeElement;\n\n // Lock body scroll via data attribute (CSS handles the style)\n document.body.setAttribute('data-ry-scroll-lock', '');\n document.body.style.setProperty('--ry-scrollbar-width', `${this.#scrollbarWidth}px`);\n\n // Open drawer\n this.state = 'open';\n\n // Trap focus\n const panel = this.$<HTMLElement>('[data-ry-target=\"panel\"]');\n if (panel) {\n this.nextFrame().then(() => {\n this.trapFocus(panel);\n });\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n // Unlock body scroll\n document.body.removeAttribute('data-ry-scroll-lock');\n document.body.style.removeProperty('--ry-scrollbar-width');\n\n // Close drawer\n this.state = 'closed';\n\n // Restore focus\n if (this.#previouslyFocused instanceof HTMLElement) {\n this.#previouslyFocused.focus();\n this.#previouslyFocused = null;\n }\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n}\n\ncustomElements.define('ry-drawer', RyDrawer);\n","/**\n * <ry-toast>\n *\n * Toast notification component with static API.\n *\n * Usage (declarative):\n * <ry-toast variant=\"success\">Saved successfully!</ry-toast>\n *\n * Usage (programmatic):\n * RyToast.success('Saved!');\n * RyToast.error('Failed to save');\n * RyToast.info('Processing...');\n * RyToast.warning('Are you sure?');\n *\n * JS and structure CSS use data-ry-target, theme CSS uses classes.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ToastVariant, ToastOptions } from '../types.js';\n\nconst DEFAULT_DURATION = 4000;\n\nexport class RyToast extends RyElement {\n #timeout: ReturnType<typeof setTimeout> | null = null;\n\n static observedAttributes = ['variant', 'duration'] as const;\n\n // Static container for programmatic toasts\n static #container: HTMLElement | null = null;\n\n static #getContainer(): HTMLElement {\n if (!RyToast.#container) {\n RyToast.#container = document.createElement('div');\n RyToast.#container.setAttribute('data-ry-target', 'toast-container');\n RyToast.#container.className = 'ry-toast-container'; // Keep for theme CSS\n document.body.appendChild(RyToast.#container);\n }\n return RyToast.#container;\n }\n\n // Static API\n static show(options: ToastOptions): RyToast {\n const toast = document.createElement('ry-toast') as RyToast;\n toast.textContent = options.message;\n\n if (options.variant) {\n toast.setAttribute('variant', options.variant);\n }\n if (options.duration !== undefined) {\n toast.setAttribute('duration', String(options.duration));\n }\n\n RyToast.#getContainer().appendChild(toast);\n return toast;\n }\n\n static success(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'success', duration });\n }\n\n static error(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'error', duration });\n }\n\n static info(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'info', duration });\n }\n\n static warning(message: string, duration?: number): RyToast {\n return RyToast.show({ message, variant: 'warning', duration });\n }\n\n setup(): void {\n this.#transformMarkup();\n\n // Close button (use [close] attribute)\n const closeBtn = this.$('[close]');\n if (closeBtn) {\n this.on(closeBtn, 'click', () => this.dismiss());\n }\n\n // Auto-dismiss\n const duration = parseInt(this.getAttribute('duration') ?? String(DEFAULT_DURATION), 10);\n if (duration > 0) {\n this.#timeout = setTimeout(() => this.dismiss(), duration);\n }\n\n // Animate in (CSS expects 'visible' state)\n requestAnimationFrame(() => {\n this.state = 'visible';\n });\n }\n\n #transformMarkup(): void {\n // Check if already transformed\n if (this.$('[data-ry-target=\"content\"]')) return;\n\n const variant = this.getAttribute('variant') ?? 'info';\n const message = this.textContent?.trim() ?? '';\n\n const icon = this.#getIcon(variant as ToastVariant);\n\n // data-ry-target for JS queries, class for CSS styling\n this.innerHTML = `\n <div data-ry-target=\"icon\" class=\"ry-toast__icon\">${icon}</div>\n <div data-ry-target=\"content\" class=\"ry-toast__content\">${message}</div>\n <button data-ry-target=\"close\" class=\"ry-toast__close\" close aria-label=\"Dismiss\">&times;</button>\n `;\n }\n\n #getIcon(variant: ToastVariant): string {\n const icons: Record<ToastVariant, string> = {\n info: 'ℹ',\n success: '✓',\n warning: '⚠',\n error: '✕'\n };\n return icons[variant] ?? icons.info;\n }\n\n dismiss(): void {\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n this.#timeout = null;\n }\n\n this.state = 'hiding';\n\n // Remove after animation\n setTimeout(() => {\n this.remove();\n }, 300);\n\n this.emit('close');\n }\n\n teardown(): void {\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n}\n\ncustomElements.define('ry-toast', RyToast);\n","/**\n * ry-ui Icon Registry\n *\n * System icons used by ry-ui components.\n * Users can override any icon by calling registerIcon() or registerIcons().\n *\n * Usage:\n * import { getIcon, registerIcon } from 'ry-ui';\n *\n * // Get an icon\n * const svg = getIcon('close');\n *\n * // Override a system icon\n * registerIcon('close', '<svg>...custom...</svg>');\n *\n * // Override multiple icons\n * registerIcons({\n * 'close': '<svg>...</svg>',\n * 'check': '<svg>...</svg>',\n * });\n */\n\n// Default system icons (24x24, stroke-based, currentColor)\nconst icons: Record<string, string> = {\n // Close / X\n 'close': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18\"/><path d=\"M6 6l12 12\"/></svg>`,\n\n // Chevron down\n 'chevron-down': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>`,\n\n // Chevron up\n 'chevron-up': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 15l-6-6-6 6\"/></svg>`,\n\n // Chevron right\n 'chevron-right': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>`,\n\n // Chevron left\n 'chevron-left': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>`,\n\n // Check / Checkmark\n 'check': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>`,\n\n // Copy\n 'copy': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"/></svg>`,\n\n // Sun (light mode)\n 'sun': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"M4.93 4.93l1.41 1.41\"/><path d=\"M17.66 17.66l1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"M6.34 17.66l-1.41 1.41\"/><path d=\"M19.07 4.93l-1.41 1.41\"/></svg>`,\n\n // Moon (dark mode)\n 'moon': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z\"/></svg>`,\n\n // Info\n 'info': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n\n // Warning / Alert triangle\n 'warning': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n\n // Error / X circle\n 'error': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M15 9l-6 6\"/><path d=\"M9 9l6 6\"/></svg>`,\n\n // Success / Check circle\n 'success': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9 12l2 2 4-4\"/></svg>`,\n\n // Search\n 'search': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>`,\n\n // Menu / Hamburger\n 'menu': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12h18\"/><path d=\"M3 6h18\"/><path d=\"M3 18h18\"/></svg>`,\n\n // Plus\n 'plus': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>`,\n\n // Minus\n 'minus': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/></svg>`,\n\n // Settings / Gear\n 'settings': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z\"/></svg>`,\n\n // User\n 'user': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`,\n\n // Heart\n 'heart': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z\"/></svg>`,\n\n // Star\n 'star': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`,\n\n // Trash\n 'trash': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\"/></svg>`,\n\n // Edit / Pencil\n 'edit': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n\n // External link\n 'external-link': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>`,\n\n // Download\n 'download': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>`,\n\n // Upload\n 'upload': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>`,\n\n // Folder (closed)\n 'folder': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\"/></svg>`,\n\n // Folder open\n 'folder-open': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\"/><path d=\"M2 10h20\"/></svg>`,\n\n // File\n 'file': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`,\n\n // Gradient: solid color\n 'gradient-solid': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"/></svg>`,\n\n // Gradient: linear\n 'gradient-linear': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"3\"/><line x1=\"3\" y1=\"15\" x2=\"15\" y2=\"3\"/><line x1=\"9\" y1=\"21\" x2=\"21\" y2=\"9\"/></svg>`,\n\n // Gradient: radial\n 'gradient-radial': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/><circle cx=\"12\" cy=\"12\" r=\"6.5\"/></svg>`,\n\n // Shape: circle\n 'shape-circle': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/></svg>`,\n\n // Shape: ellipse\n 'shape-ellipse': `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"6\"/></svg>`,\n};\n\n/**\n * Get an icon SVG string by name\n */\nexport function getIcon(name: string): string {\n return icons[name] ?? '';\n}\n\n/**\n * Register or override a single icon\n */\nexport function registerIcon(name: string, svg: string): void {\n icons[name] = svg;\n}\n\n/**\n * Register or override multiple icons at once\n */\nexport function registerIcons(newIcons: Record<string, string>): void {\n Object.assign(icons, newIcons);\n}\n\n/**\n * Get all registered icon names\n */\nexport function getIconNames(): string[] {\n return Object.keys(icons);\n}\n","/**\n * <ry-select>\n *\n * Custom select dropdown component with optional multi-select.\n *\n * Usage:\n * <ry-select placeholder=\"Choose country\" name=\"country\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * <ry-option value=\"ca\" disabled>Canada</ry-option>\n * </ry-select>\n *\n * Multi-select:\n * <ry-select multiple clearable placeholder=\"Choose...\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * </ry-select>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\nimport type { SelectOption, ChangeDetail } from '../types.js';\n\nlet selectIdCounter = 0;\n\nexport class RySelect extends RyElement {\n #selectId: string | null = null;\n #highlightedIndex = -1;\n #typeahead = '';\n #typeaheadTimeout: ReturnType<typeof setTimeout> | null = null;\n #selectedValues: Set<string> = new Set();\n\n // Store options reference\n _options: SelectOption[] = [];\n\n get #isMultiple(): boolean {\n return this.hasAttribute('multiple');\n }\n\n static observedAttributes = ['value', 'disabled'] as const;\n\n setup(): void {\n this.#selectId = `ry-select-${++selectIdCounter}`;\n this.#transformMarkup();\n\n // Make focusable\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n // Events\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n this.on(document, 'click', this.#handleOutsideClick);\n\n // Listen for tag removal in multi-select\n if (this.#isMultiple) {\n this.on(this, 'ry:remove', this.#handleTagRemove as EventListener);\n }\n\n // Initialize state\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n\n // Set initial value\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n if (this.#isMultiple) {\n for (const v of initialValue.split(',').map(s => s.trim()).filter(Boolean)) {\n this.#toggleMultiOption(v);\n }\n } else {\n this.value = initialValue;\n }\n }\n }\n\n #transformMarkup(): void {\n // Collect options from ry-option children\n const options: SelectOption[] = [...this.querySelectorAll('ry-option')].map(opt => ({\n value: opt.getAttribute('value') ?? opt.textContent?.trim() ?? '',\n label: opt.textContent?.trim() ?? '',\n disabled: opt.hasAttribute('disabled')\n }));\n\n const placeholder = this.getAttribute('placeholder') ?? 'Select...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n const isMultiple = this.#isMultiple;\n\n // Build native select for form submission\n const nativeOptions = options.map(opt =>\n `<option value=\"${opt.value}\"${opt.disabled ? ' disabled' : ''}>${opt.label}</option>`\n ).join('');\n\n // Build custom dropdown with checkmarks for multi-select\n const listboxOptions = options.map((opt, i) => `\n <div data-ry-target=\"option\" class=\"ry-select__option\"\n role=\"option\"\n id=\"${this.#selectId}-option-${i}\"\n data-value=\"${opt.value}\"\n ${opt.disabled ? 'data-disabled' : ''}\n aria-disabled=\"${opt.disabled}\">\n ${isMultiple ? `<span data-ry-target=\"check\" class=\"ry-select__check\">${getIcon('check')}</span>` : ''}\n <span class=\"ry-select__option-label\">${opt.label}</span>\n </div>\n `).join('');\n\n if (isMultiple) {\n const clearable = this.hasAttribute('clearable');\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-select__trigger ry-select__trigger--multi\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n <div data-ry-target=\"tags\" class=\"ry-select__tags\"></div>\n <span data-ry-target=\"value\" class=\"ry-select__value\">${placeholder}</span>\n ${clearable ? `<button data-ry-target=\"clear\" class=\"ry-select__clear\" aria-label=\"Clear all\" type=\"button\">${getIcon('close')}</button>` : ''}\n <span data-ry-target=\"arrow\" class=\"ry-select__arrow\">▾</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-select__dropdown\" role=\"listbox\" id=\"${this.#selectId}-listbox\" tabindex=\"-1\" aria-multiselectable=\"true\">\n ${listboxOptions}\n </div>\n <select data-ry-target=\"native\" class=\"ry-select__native\" ${name ? `name=\"${name}\"` : ''} multiple tabindex=\"-1\" aria-hidden=\"true\" ${disabled ? 'disabled' : ''}>\n ${nativeOptions}\n </select>\n `;\n\n // Clear button\n const clearBtn = this.$('[data-ry-target=\"clear\"]');\n if (clearBtn) {\n this.on(clearBtn, 'click', (e: MouseEvent) => {\n e.stopPropagation();\n this.#clearAll();\n });\n }\n } else {\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-select__trigger\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n <span data-ry-target=\"value\" class=\"ry-select__value\">${placeholder}</span>\n <span data-ry-target=\"arrow\" class=\"ry-select__arrow\">▾</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-select__dropdown\" role=\"listbox\" id=\"${this.#selectId}-listbox\" tabindex=\"-1\">\n ${listboxOptions}\n </div>\n <select data-ry-target=\"native\" class=\"ry-select__native\" ${name ? `name=\"${name}\"` : ''} tabindex=\"-1\" aria-hidden=\"true\" ${disabled ? 'disabled' : ''}>\n <option value=\"\">${placeholder}</option>\n ${nativeOptions}\n </select>\n `;\n }\n\n // Store options reference\n this._options = options;\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const target = event.target as Element;\n const option = target.closest('[data-ry-target=\"option\"]');\n if (option instanceof HTMLElement && !option.hasAttribute('data-disabled')) {\n if (this.#isMultiple) {\n const val = option.dataset.value ?? '';\n this.#toggleMultiOption(val);\n // Don't close in multi-select\n } else {\n this.#selectOption(option);\n this.close();\n }\n return;\n }\n\n const trigger = target.closest('[data-ry-target=\"trigger\"]');\n if (trigger) {\n this.toggle();\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const isOpen = this.state === 'open';\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (isOpen && this.#highlightedIndex >= 0) {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const option = options[this.#highlightedIndex];\n if (option) {\n if (this.#isMultiple) {\n const val = option.dataset.value ?? '';\n this.#toggleMultiOption(val);\n } else {\n this.#selectOption(option);\n this.close();\n }\n }\n } else {\n this.toggle();\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n this.close();\n }\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n this.open();\n } else {\n this.#highlightNext();\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.#highlightPrev();\n }\n break;\n\n case 'Home':\n if (isOpen) {\n event.preventDefault();\n this.#highlightFirst();\n }\n break;\n\n case 'End':\n if (isOpen) {\n event.preventDefault();\n this.#highlightLast();\n }\n break;\n\n case 'Backspace':\n if (this.#isMultiple && this.#selectedValues.size > 0) {\n const vals = [...this.#selectedValues];\n const last = vals[vals.length - 1];\n if (last) {\n this.#toggleMultiOption(last);\n }\n }\n break;\n\n default:\n // Typeahead\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.#handleTypeahead(event.key);\n }\n break;\n }\n };\n\n #handleOutsideClick = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (!this.contains(target) && this.state === 'open') {\n this.close();\n }\n };\n\n #handleTagRemove = (e: CustomEvent): void => {\n const value = (e.detail as { value: string }).value;\n if (this.#selectedValues.has(value)) {\n this.#toggleMultiOption(value);\n }\n };\n\n #handleTypeahead(char: string): void {\n // Clear timeout\n if (this.#typeaheadTimeout) {\n clearTimeout(this.#typeaheadTimeout);\n }\n\n this.#typeahead += char.toLowerCase();\n\n // Find matching option\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const match = options.findIndex(opt =>\n opt.textContent?.trim().toLowerCase().startsWith(this.#typeahead)\n );\n\n if (match >= 0) {\n if (this.state === 'open') {\n this.#highlightIndex(match);\n } else if (!this.#isMultiple) {\n const option = options[match];\n if (option) {\n this.#selectOption(option);\n }\n }\n }\n\n // Clear typeahead after 500ms\n this.#typeaheadTimeout = setTimeout(() => {\n this.#typeahead = '';\n }, 500);\n }\n\n #highlightIndex(index: number): void {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n if (index < 0 || index >= options.length) return;\n\n // Remove previous highlight\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n\n // Add new highlight\n const option = options[index];\n if (!option) return;\n\n option.setAttribute('data-highlighted', '');\n option.scrollIntoView({ block: 'nearest' });\n this.#highlightedIndex = index;\n\n // Update aria-activedescendant\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-activedescendant', option.id);\n }\n }\n\n #highlightNext(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([data-disabled])');\n const next = Math.min(this.#highlightedIndex + 1, options.length - 1);\n this.#highlightIndex(next);\n }\n\n #highlightPrev(): void {\n const prev = Math.max(this.#highlightedIndex - 1, 0);\n this.#highlightIndex(prev);\n }\n\n #highlightFirst(): void {\n this.#highlightIndex(0);\n }\n\n #highlightLast(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([data-disabled])');\n this.#highlightIndex(options.length - 1);\n }\n\n // --- Multi-select methods ---\n\n #toggleMultiOption(val: string): void {\n const maxSelections = this.getAttribute('max-selections');\n if (this.#selectedValues.has(val)) {\n this.#selectedValues.delete(val);\n } else {\n if (maxSelections && this.#selectedValues.size >= parseInt(maxSelections, 10)) return;\n this.#selectedValues.add(val);\n }\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', [...this.#selectedValues].join(','));\n this.emit<ChangeDetail>('change', { value: this.value, label: '' });\n }\n\n #renderTags(): void {\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n const valueEl = this.$('[data-ry-target=\"value\"]');\n if (!tagsContainer) return;\n\n tagsContainer.innerHTML = '';\n for (const val of this.#selectedValues) {\n const opt = this._options.find(o => o.value === val);\n if (!opt) continue;\n const tag = document.createElement('ry-tag');\n tag.setAttribute('removable', '');\n tag.setAttribute('size', 'sm');\n tag.setAttribute('data-value', val);\n tag.textContent = opt.label;\n tagsContainer.appendChild(tag);\n }\n\n // Show/hide placeholder\n if (valueEl) {\n if (this.#selectedValues.size > 0) {\n (valueEl as HTMLElement).style.display = 'none';\n } else {\n (valueEl as HTMLElement).style.display = '';\n }\n }\n }\n\n #syncMultiNative(): void {\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (!nativeSelect) return;\n for (const opt of nativeSelect.options) {\n opt.selected = this.#selectedValues.has(opt.value);\n }\n }\n\n #updateMultiCheckmarks(): void {\n this.$$('[data-ry-target=\"option\"]').forEach(optEl => {\n const val = (optEl as HTMLElement).dataset.value ?? '';\n if (this.#selectedValues.has(val)) {\n optEl.setAttribute('aria-selected', 'true');\n } else {\n optEl.removeAttribute('aria-selected');\n }\n });\n }\n\n #clearAll(): void {\n this.#selectedValues.clear();\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', '');\n this.emit<ChangeDetail>('change', { value: '', label: '' });\n }\n\n // --- Single-select method ---\n\n #selectOption(optionEl: HTMLElement): void {\n const value = optionEl.dataset.value ?? '';\n const label = optionEl.textContent?.trim() ?? '';\n\n // Update display\n const valueEl = this.$('[data-ry-target=\"value\"]');\n if (valueEl) {\n valueEl.textContent = label;\n valueEl.setAttribute('data-selected', '');\n }\n\n // Update native select\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (nativeSelect) {\n nativeSelect.value = value;\n }\n\n // Update attribute\n this.setAttribute('value', value);\n\n // Update selected state\n this.$$('[data-ry-target=\"option\"]').forEach(opt => {\n opt.removeAttribute('aria-selected');\n });\n optionEl.setAttribute('aria-selected', 'true');\n\n this.emit<ChangeDetail>('change', { value, label });\n }\n\n open(): void {\n if (this.state === 'open') return;\n\n this.state = 'open';\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-expanded', 'true');\n }\n\n // Smart positioning: flip to top if would go off screen\n this.#positionDropdown();\n\n // Highlight current value or first option\n if (!this.#isMultiple) {\n const currentValue = this.getAttribute('value');\n if (currentValue) {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]:not([data-disabled])');\n const index = options.findIndex(opt => opt.dataset.value === currentValue);\n if (index >= 0) {\n this.#highlightIndex(index);\n }\n } else {\n this.#highlightIndex(0);\n }\n } else {\n this.#highlightIndex(0);\n }\n\n this.emit('open');\n }\n\n #positionDropdown(): void {\n const dropdown = this.$('[data-ry-target=\"dropdown\"]');\n if (!dropdown) return;\n\n // Reset position\n this.removeAttribute('data-ry-position');\n\n // Check if dropdown would go off bottom of screen\n const rect = this.getBoundingClientRect();\n const dropdownHeight = (dropdown as HTMLElement).scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n // If not enough space below but more space above, flip to top\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n }\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n this.state = 'closed';\n\n const trigger = this.$('[data-ry-target=\"trigger\"]');\n if (trigger) {\n trigger.setAttribute('aria-expanded', 'false');\n }\n\n // Clear highlight\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n this.#highlightedIndex = -1;\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n\n get value(): string {\n if (this.#isMultiple) {\n return [...this.#selectedValues].join(',');\n }\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n if (this.#isMultiple) {\n this.#selectedValues.clear();\n for (const v of val.split(',').map(s => s.trim()).filter(Boolean)) {\n this.#selectedValues.add(v);\n }\n this.#renderTags();\n this.#syncMultiNative();\n this.#updateMultiCheckmarks();\n this.setAttribute('value', val);\n } else {\n const option = this.$<HTMLElement>(`[data-ry-target=\"option\"][data-value=\"${val}\"]`);\n if (option) {\n this.#selectOption(option);\n }\n }\n }\n\n get values(): string[] {\n return [...this.#selectedValues];\n }\n\n teardown(): void {\n if (this.#typeaheadTimeout) {\n clearTimeout(this.#typeaheadTimeout);\n }\n }\n}\n\n// Register placeholder element\nclass RyOption extends HTMLElement {}\ncustomElements.define('ry-option', RyOption);\n\ncustomElements.define('ry-select', RySelect);\n","/**\n * <ry-combobox>\n *\n * Searchable dropdown with text input filtering.\n *\n * Usage:\n * <ry-combobox placeholder=\"Search countries...\" name=\"country\">\n * <ry-option value=\"us\">United States</ry-option>\n * <ry-option value=\"uk\">United Kingdom</ry-option>\n * </ry-combobox>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { SelectOption, ChangeDetail } from '../types.js';\n\nlet comboboxIdCounter = 0;\n\nexport class RyCombobox extends RyElement {\n #comboboxId: string | null = null;\n #highlightedIndex = -1;\n #options: SelectOption[] = [];\n\n static observedAttributes = ['value', 'disabled'] as const;\n\n setup(): void {\n this.#comboboxId = `ry-combobox-${++comboboxIdCounter}`;\n this.#transformMarkup();\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n\n if (input) {\n this.on(input, 'input', this.#handleInputEvent);\n this.on(input, 'focus', this.#handleFocus);\n }\n\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n this.on(this, 'mouseover', this.#handleMouseover);\n this.on(document, 'click', this.#handleOutsideClick);\n\n if (!this.hasAttribute('data-ry-state')) {\n this.state = 'closed';\n }\n\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n this.value = initialValue;\n }\n }\n\n #transformMarkup(): void {\n const options: SelectOption[] = [...this.querySelectorAll('ry-option')].map(opt => ({\n value: opt.getAttribute('value') ?? opt.textContent?.trim() ?? '',\n label: opt.textContent?.trim() ?? '',\n disabled: opt.hasAttribute('disabled')\n }));\n\n const placeholder = this.getAttribute('placeholder') ?? 'Search...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n\n const nativeOptions = options.map(opt =>\n `<option value=\"${opt.value}\"${opt.disabled ? ' disabled' : ''}>${opt.label}</option>`\n ).join('');\n\n const listboxOptions = options.map((opt, i) => `\n <div data-ry-target=\"option\" class=\"ry-combobox__option\"\n role=\"option\"\n id=\"${this.#comboboxId}-option-${i}\"\n data-value=\"${opt.value}\"\n ${opt.disabled ? 'data-disabled' : ''}\n aria-disabled=\"${opt.disabled}\">\n ${opt.label}\n </div>\n `).join('');\n\n this.innerHTML = `\n <div data-ry-target=\"input-wrapper\" class=\"ry-combobox__input-wrapper\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-haspopup=\"listbox\"\n aria-owns=\"${this.#comboboxId}-listbox\">\n <input data-ry-target=\"input\" class=\"ry-combobox__input\"\n type=\"text\"\n placeholder=\"${placeholder}\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls=\"${this.#comboboxId}-listbox\"\n ${disabled ? 'disabled' : ''}>\n <span data-ry-target=\"arrow\" class=\"ry-combobox__arrow\">&#9662;</span>\n </div>\n <div data-ry-target=\"dropdown\" class=\"ry-combobox__dropdown\"\n role=\"listbox\"\n id=\"${this.#comboboxId}-listbox\"\n tabindex=\"-1\">\n ${listboxOptions}\n <div data-ry-target=\"empty\" class=\"ry-combobox__empty\" hidden>\n No results\n </div>\n </div>\n <select data-ry-target=\"native\" class=\"ry-combobox__native\"\n ${name ? `name=\"${name}\"` : ''}\n tabindex=\"-1\" aria-hidden=\"true\"\n ${disabled ? 'disabled' : ''}>\n <option value=\"\">${placeholder}</option>\n ${nativeOptions}\n </select>\n `;\n\n this.#options = options;\n }\n\n #handleInputEvent = (): void => {\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (!input) return;\n\n const query = input.value.trim();\n this.#filterOptions(query);\n\n if (this.state !== 'open') {\n this.open();\n }\n\n this.emit('input', { value: query });\n };\n\n #filterOptions(query: string): void {\n const options = this.$$<HTMLElement>('[data-ry-target=\"option\"]');\n const lowerQuery = query.toLowerCase();\n let visibleCount = 0;\n\n options.forEach(opt => {\n const label = opt.textContent?.trim().toLowerCase() ?? '';\n const matches = !query || label.includes(lowerQuery);\n if (matches && !opt.hasAttribute('data-disabled')) {\n opt.removeAttribute('hidden');\n visibleCount++;\n } else {\n opt.setAttribute('hidden', '');\n }\n });\n\n const emptyEl = this.$('[data-ry-target=\"empty\"]');\n if (emptyEl) {\n if (visibleCount === 0) {\n emptyEl.removeAttribute('hidden');\n } else {\n emptyEl.setAttribute('hidden', '');\n }\n }\n\n this.#highlightedIndex = -1;\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.hasAttribute('disabled')) return;\n\n const target = event.target as Element;\n const option = target.closest('[data-ry-target=\"option\"]');\n if (option instanceof HTMLElement && !option.hasAttribute('data-disabled')) {\n this.#selectOption(option);\n return;\n }\n\n const arrow = target.closest('[data-ry-target=\"arrow\"]');\n if (arrow) {\n this.toggle();\n return;\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (this.hasAttribute('disabled')) return;\n const isOpen = this.state === 'open';\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen) {\n this.open();\n } else {\n this.#highlightNext();\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (isOpen) {\n this.#highlightPrev();\n }\n break;\n\n case 'Enter':\n if (isOpen && this.#highlightedIndex >= 0) {\n event.preventDefault();\n const visibleOptions = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n const option = visibleOptions[this.#highlightedIndex];\n if (option) {\n this.#selectOption(option);\n }\n }\n break;\n\n case 'Escape':\n if (isOpen) {\n event.preventDefault();\n this.close();\n }\n break;\n\n case 'Tab':\n if (isOpen) {\n this.close();\n }\n break;\n }\n };\n\n #handleMouseover = (event: MouseEvent): void => {\n const target = event.target as Element;\n const option = target.closest('[data-ry-target=\"option\"]');\n if (!(option instanceof HTMLElement) || option.hasAttribute('data-disabled') || option.hasAttribute('hidden')) return;\n\n const visibleOptions = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n const index = visibleOptions.indexOf(option);\n if (index >= 0) {\n this.#highlightIndex(index);\n }\n };\n\n #handleOutsideClick = (event: MouseEvent): void => {\n const target = event.target as Node;\n if (!this.contains(target) && this.state === 'open') {\n this.close();\n }\n };\n\n #handleFocus = (): void => {\n if (this.hasAttribute('disabled')) return;\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input && input.value) {\n input.select();\n }\n\n this.open();\n };\n\n #selectOption(optionEl: HTMLElement): void {\n const value = optionEl.dataset.value ?? '';\n const label = optionEl.textContent?.trim() ?? '';\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) {\n input.value = label;\n }\n\n const nativeSelect = this.$<HTMLSelectElement>('[data-ry-target=\"native\"]');\n if (nativeSelect) {\n nativeSelect.value = value;\n }\n\n this.setAttribute('value', value);\n\n this.$$('[data-ry-target=\"option\"]').forEach(opt => {\n opt.removeAttribute('aria-selected');\n });\n optionEl.setAttribute('aria-selected', 'true');\n\n this.close();\n this.emit<ChangeDetail>('change', { value, label });\n }\n\n #highlightIndex(index: number): void {\n const options = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n if (index < 0 || index >= options.length) return;\n\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n\n const option = options[index];\n if (!option) return;\n\n option.setAttribute('data-highlighted', '');\n option.scrollIntoView({ block: 'nearest' });\n this.#highlightedIndex = index;\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-activedescendant', option.id);\n }\n }\n\n #highlightNext(): void {\n const options = this.$$('[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])');\n const next = Math.min(this.#highlightedIndex + 1, options.length - 1);\n this.#highlightIndex(next);\n }\n\n #highlightPrev(): void {\n const prev = Math.max(this.#highlightedIndex - 1, 0);\n this.#highlightIndex(prev);\n }\n\n #positionDropdown(): void {\n const dropdown = this.$('[data-ry-target=\"dropdown\"]');\n if (!dropdown) return;\n\n this.removeAttribute('data-ry-position');\n\n const rect = this.getBoundingClientRect();\n const dropdownHeight = (dropdown as HTMLElement).scrollHeight || 240;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n }\n }\n\n open(): void {\n if (this.state === 'open') return;\n\n this.state = 'open';\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-expanded', 'true');\n }\n\n // Show all options on open (clear filter)\n this.$$<HTMLElement>('[data-ry-target=\"option\"]').forEach(opt => {\n if (!opt.hasAttribute('data-disabled')) {\n opt.removeAttribute('hidden');\n }\n });\n const emptyEl = this.$('[data-ry-target=\"empty\"]');\n if (emptyEl) {\n emptyEl.setAttribute('hidden', '');\n }\n\n this.#positionDropdown();\n\n // Highlight current value if set\n const currentValue = this.getAttribute('value');\n if (currentValue) {\n const options = this.$$<HTMLElement>(\n '[data-ry-target=\"option\"]:not([hidden]):not([data-disabled])'\n );\n const index = options.findIndex(opt => opt.dataset.value === currentValue);\n if (index >= 0) {\n this.#highlightIndex(index);\n }\n }\n\n this.emit('open');\n }\n\n close(): void {\n if (this.state === 'closed') return;\n\n this.state = 'closed';\n\n const wrapper = this.$('[data-ry-target=\"input-wrapper\"]');\n if (wrapper) {\n wrapper.setAttribute('aria-expanded', 'false');\n wrapper.removeAttribute('aria-activedescendant');\n }\n\n this.$$('[data-ry-target=\"option\"][data-highlighted]').forEach(opt => {\n opt.removeAttribute('data-highlighted');\n });\n this.#highlightedIndex = -1;\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n const option = this.$<HTMLElement>(`[data-ry-target=\"option\"][data-value=\"${val}\"]`);\n if (option) {\n this.#selectOption(option);\n }\n }\n}\n\ncustomElements.define('ry-combobox', RyCombobox);\n","/**\n * <ry-code>\n *\n * Code display component with syntax highlighting.\n *\n * Usage:\n * <ry-code language=\"css\" title=\"styles.css\">\n * .button {\n * background: #3b82f6;\n * border-radius: 8px;\n * }\n * </ry-code>\n *\n * Attributes:\n * - language: css | js | html | json (for syntax highlighting)\n * - title: optional title shown in header\n * - line-numbers: show line numbers\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\ntype Language = 'css' | 'js' | 'javascript' | 'html' | 'json' | 'text';\n\ninterface Token {\n type: 'keyword' | 'property' | 'value' | 'string' | 'number' | 'comment' | 'selector' | 'punctuation' | 'tag' | 'attribute' | 'text' | 'color';\n value: string;\n color?: string;\n}\n\nexport class RyCode extends RyElement {\n #originalContent = '';\n\n static get observedAttributes(): string[] {\n return ['language', 'title', 'line-numbers'];\n }\n\n setup(): void {\n // Check for template first (preserves raw HTML content)\n const template = this.querySelector('template');\n if (template) {\n this.#originalContent = this.#trimIndent(template.innerHTML);\n } else {\n // Fall back to textContent (works for non-HTML code)\n this.#originalContent = this.textContent?.trim() ?? '';\n }\n\n // Build the component structure\n this.#render();\n\n // Add copy button handler\n const copyBtn = this.$<HTMLButtonElement>('[data-ry-target=\"copy\"]');\n if (copyBtn) {\n this.on(copyBtn, 'click', this.#handleCopy);\n }\n }\n\n #render(): void {\n const language = this.getAttribute('language') ?? 'text';\n const title = this.getAttribute('title') ?? language.toUpperCase();\n const showLineNumbers = this.hasAttribute('line-numbers');\n\n const highlighted = this.#highlight(this.#originalContent, language as Language);\n const lines = highlighted.split('\\n');\n\n this.innerHTML = `\n <div data-ry-target=\"header\" class=\"ry-code__header\">\n <span data-ry-target=\"title\" class=\"ry-code__title\">${title}</span>\n <button data-ry-target=\"copy\" class=\"ry-code__copy\" type=\"button\" aria-label=\"Copy code\">\n ${getIcon('copy')}\n </button>\n </div>\n <div data-ry-target=\"content\" class=\"ry-code__content\">\n <pre data-ry-target=\"pre\" class=\"ry-code__pre\"><code data-ry-target=\"code\" class=\"ry-code__code\">${\n showLineNumbers\n ? lines.map((line, i) => `<span class=\"ry-code__line\"><span class=\"ry-code__line-number\">${i + 1}</span><span class=\"ry-code__line-content\">${line || ' '}</span></span>`).join('')\n : highlighted\n }</code></pre>\n </div>\n `;\n }\n\n #handleCopy = async (): Promise<void> => {\n const copyBtn = this.$<HTMLButtonElement>('[data-ry-target=\"copy\"]');\n if (!copyBtn) return;\n\n try {\n await navigator.clipboard.writeText(this.#originalContent);\n\n // Visual feedback\n copyBtn.innerHTML = getIcon('check');\n copyBtn.classList.add('ry-code__copy--success');\n\n this.emit('copy', { code: this.#originalContent });\n\n setTimeout(() => {\n copyBtn.innerHTML = getIcon('copy');\n copyBtn.classList.remove('ry-code__copy--success');\n }, 2000);\n } catch {\n this.emit('copy-error');\n }\n };\n\n #highlight(code: string, language: Language): string {\n switch (language) {\n case 'css':\n return this.#highlightCSS(code);\n case 'js':\n case 'javascript':\n return this.#highlightJS(code);\n case 'html':\n return this.#highlightHTML(code);\n case 'json':\n return this.#highlightJSON(code);\n default:\n return this.#escape(code);\n }\n }\n\n #highlightCSS(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Comments\n if (remaining.startsWith('/*')) {\n const end = remaining.indexOf('*/');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 2) });\n remaining = remaining.slice(end + 2);\n continue;\n }\n }\n\n // Selectors (before {)\n const selectorMatch = remaining.match(/^([.#]?[\\w-]+(?:\\s*,\\s*[.#]?[\\w-]+)*)\\s*(?=\\{)/);\n if (selectorMatch?.[1]) {\n tokens.push({ type: 'selector', value: selectorMatch[1] });\n remaining = remaining.slice(selectorMatch[0].length);\n continue;\n }\n\n // Properties\n const propMatch = remaining.match(/^([\\w-]+)\\s*:/);\n if (propMatch?.[1]) {\n tokens.push({ type: 'property', value: propMatch[1] });\n tokens.push({ type: 'punctuation', value: ':' });\n remaining = remaining.slice(propMatch[0].length);\n continue;\n }\n\n // Color values (hex)\n const hexMatch = remaining.match(/^(#[0-9a-fA-F]{3,8})/);\n if (hexMatch?.[1]) {\n tokens.push({ type: 'color', value: hexMatch[1], color: hexMatch[1] });\n remaining = remaining.slice(hexMatch[1].length);\n continue;\n }\n\n // Color values (rgb/rgba/hsl/hsla)\n const colorFnMatch = remaining.match(/^(rgba?\\([^)]+\\)|hsla?\\([^)]+\\))/i);\n if (colorFnMatch?.[1]) {\n tokens.push({ type: 'color', value: colorFnMatch[1], color: colorFnMatch[1] });\n remaining = remaining.slice(colorFnMatch[1].length);\n continue;\n }\n\n // Numbers with units\n const numMatch = remaining.match(/^(-?[\\d.]+(?:px|em|rem|%|vh|vw|deg|s|ms)?)/);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{};,()]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace or other\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Keywords/values\n const wordMatch = remaining.match(/^([\\w-]+)/);\n if (wordMatch?.[1]) {\n const word = wordMatch[1];\n const cssKeywords = ['inherit', 'initial', 'unset', 'none', 'auto', 'transparent', 'solid', 'dashed', 'dotted', 'flex', 'grid', 'block', 'inline', 'inline-block', 'absolute', 'relative', 'fixed', 'sticky'];\n if (cssKeywords.includes(word)) {\n tokens.push({ type: 'keyword', value: word });\n } else {\n tokens.push({ type: 'value', value: word });\n }\n remaining = remaining.slice(word.length);\n continue;\n }\n\n // Single character fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightJS(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n const jsKeywords = ['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally', 'throw', 'new', 'class', 'extends', 'import', 'export', 'default', 'from', 'async', 'await', 'typeof', 'instanceof', 'in', 'of', 'true', 'false', 'null', 'undefined', 'this', 'super', 'static', 'get', 'set'];\n\n while (remaining.length > 0) {\n // Single-line comments\n if (remaining.startsWith('//')) {\n const end = remaining.indexOf('\\n');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end) });\n remaining = remaining.slice(end);\n continue;\n } else {\n tokens.push({ type: 'comment', value: remaining });\n break;\n }\n }\n\n // Multi-line comments\n if (remaining.startsWith('/*')) {\n const end = remaining.indexOf('*/');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 2) });\n remaining = remaining.slice(end + 2);\n continue;\n }\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"`])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Numbers\n const numMatch = remaining.match(/^(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)/i);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Words\n const wordMatch = remaining.match(/^([a-zA-Z_$][\\w$]*)/);\n if (wordMatch?.[1]) {\n const word = wordMatch[1];\n if (jsKeywords.includes(word)) {\n tokens.push({ type: 'keyword', value: word });\n } else {\n tokens.push({ type: 'text', value: word });\n }\n remaining = remaining.slice(word.length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{}[\\]();,.:?!<>=+\\-*/&|^%~@#]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightHTML(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Comments\n if (remaining.startsWith('<!--')) {\n const end = remaining.indexOf('-->');\n if (end !== -1) {\n tokens.push({ type: 'comment', value: remaining.slice(0, end + 3) });\n remaining = remaining.slice(end + 3);\n continue;\n }\n }\n\n // Tags\n const tagMatch = remaining.match(/^(<\\/?)([\\w-]+)/);\n if (tagMatch?.[1] && tagMatch[2]) {\n tokens.push({ type: 'punctuation', value: tagMatch[1] });\n tokens.push({ type: 'tag', value: tagMatch[2] });\n remaining = remaining.slice(tagMatch[0].length);\n continue;\n }\n\n // Attributes\n const attrMatch = remaining.match(/^([\\w-]+)(=)/);\n if (attrMatch?.[1]) {\n tokens.push({ type: 'attribute', value: attrMatch[1] });\n tokens.push({ type: 'punctuation', value: '=' });\n remaining = remaining.slice(attrMatch[0].length);\n continue;\n }\n\n // Strings\n const strMatch = remaining.match(/^(['\"])((?:[^\\\\]|\\\\.)*?)\\1/);\n if (strMatch) {\n tokens.push({ type: 'string', value: strMatch[0] });\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Closing >\n if (remaining[0] === '>' || remaining.startsWith('/>')) {\n const punct = remaining.startsWith('/>') ? '/>' : '>';\n tokens.push({ type: 'punctuation', value: punct });\n remaining = remaining.slice(punct.length);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Text content\n const textMatch = remaining.match(/^([^<]+)/);\n if (textMatch?.[1]) {\n tokens.push({ type: 'text', value: textMatch[1] });\n remaining = remaining.slice(textMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #highlightJSON(code: string): string {\n const tokens: Token[] = [];\n let remaining = code;\n\n while (remaining.length > 0) {\n // Strings (keys and values)\n const strMatch = remaining.match(/^(\"(?:[^\\\\\"]|\\\\.)*\")/);\n if (strMatch?.[1]) {\n // Check if it's a key (followed by :)\n const afterStr = remaining.slice(strMatch[0].length).trimStart();\n if (afterStr.startsWith(':')) {\n tokens.push({ type: 'property', value: strMatch[1] });\n } else {\n tokens.push({ type: 'string', value: strMatch[1] });\n }\n remaining = remaining.slice(strMatch[0].length);\n continue;\n }\n\n // Numbers\n const numMatch = remaining.match(/^(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)/i);\n if (numMatch?.[1]) {\n tokens.push({ type: 'number', value: numMatch[1] });\n remaining = remaining.slice(numMatch[1].length);\n continue;\n }\n\n // Booleans and null\n const boolMatch = remaining.match(/^(true|false|null)/);\n if (boolMatch?.[1]) {\n tokens.push({ type: 'keyword', value: boolMatch[1] });\n remaining = remaining.slice(boolMatch[1].length);\n continue;\n }\n\n // Punctuation\n const char = remaining[0];\n if (char && /^[{}[\\]:,]/.test(char)) {\n tokens.push({ type: 'punctuation', value: char });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch?.[1]) {\n tokens.push({ type: 'text', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Fallback\n const fallbackChar = remaining[0];\n if (fallbackChar) {\n tokens.push({ type: 'text', value: fallbackChar });\n }\n remaining = remaining.slice(1);\n }\n\n return tokens.map(t => this.#tokenToHTML(t)).join('');\n }\n\n #tokenToHTML(token: Token): string {\n const escaped = this.#escape(token.value);\n\n switch (token.type) {\n case 'keyword':\n return `<span class=\"ry-code__keyword\">${escaped}</span>`;\n case 'property':\n return `<span class=\"ry-code__property\">${escaped}</span>`;\n case 'value':\n return `<span class=\"ry-code__value\">${escaped}</span>`;\n case 'string':\n return `<span class=\"ry-code__string\">${escaped}</span>`;\n case 'number':\n return `<span class=\"ry-code__number\">${escaped}</span>`;\n case 'comment':\n return `<span class=\"ry-code__comment\">${escaped}</span>`;\n case 'selector':\n return `<span class=\"ry-code__selector\">${escaped}</span>`;\n case 'punctuation':\n return `<span class=\"ry-code__punctuation\">${escaped}</span>`;\n case 'tag':\n return `<span class=\"ry-code__tag\">${escaped}</span>`;\n case 'attribute':\n return `<span class=\"ry-code__attribute\">${escaped}</span>`;\n case 'color':\n return `<span class=\"ry-code__color\"><span class=\"ry-code__color-preview\" style=\"background-color: ${token.color}\"></span>${escaped}</span>`;\n default:\n return escaped;\n }\n }\n\n #escape(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n\n #trimIndent(html: string): string {\n const lines = html.split('\\n');\n\n // Remove empty first/last lines\n while (lines.length && !lines[0]?.trim()) lines.shift();\n while (lines.length && !lines[lines.length - 1]?.trim()) lines.pop();\n\n if (lines.length === 0) return '';\n\n // Find minimum indentation (ignoring empty lines)\n const minIndent = Math.min(\n ...lines\n .filter(line => line.trim())\n .map(line => {\n const match = line.match(/^(\\s*)/);\n return match?.[1]?.length ?? 0;\n })\n );\n\n // Remove common indentation\n return lines\n .map(line => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n\n get code(): string {\n return this.#originalContent;\n }\n\n set code(value: string) {\n this.#originalContent = value;\n this.#render();\n }\n}\n\ncustomElements.define('ry-code', RyCode);\n","/**\n * <ry-example>\n *\n * Displays code and live rendered output side-by-side from a single source.\n * Code is shown on the left using ry-code, live preview on the right.\n *\n * Usage:\n * <ry-example title=\"Accordion\">\n * <template>\n * <accordion>\n * <accordion-item title=\"FAQ\" open>\n * Content here\n * </accordion-item>\n * </accordion>\n * </template>\n * <!-- Optional: JS usage examples in collapsible section -->\n * <script slot=\"js\" type=\"text/plain\">\n * // Listen for changes\n * element.addEventListener('ry:change', (e) => {\n * console.log(e.detail.value);\n * });\n * </script>\n * </ry-example>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { transform } from '../core/ry-transform.js';\n\nexport class RyExample extends RyElement {\n setup(): void {\n const template = this.$<HTMLTemplateElement>('template');\n if (!template) return;\n\n // Get JS usage script (must capture before clearing innerHTML)\n const jsScript = this.$<HTMLScriptElement>('script[slot=\"js\"]');\n const jsSource = jsScript ? this.#trimIndent(jsScript.textContent ?? '') : null;\n\n // Get clean source (with normalized indentation)\n const source = this.#trimIndent(template.innerHTML);\n\n // Transform for live rendering\n const transformed = transform(source);\n\n // Build layout structure\n const stacked = this.hasAttribute('stacked');\n this.innerHTML = `\n <div data-ry-target=\"preview\" class=\"ry-example__preview\"></div>\n <div data-ry-target=\"code\" class=\"ry-example__code\"></div>\n ${jsSource ? '<div data-ry-target=\"usage\" class=\"ry-example__usage\"></div>' : ''}\n `;\n\n if (stacked) {\n this.setAttribute('data-stacked', '');\n }\n\n // Create and inject ry-code with source\n const codeEl = document.createElement('ry-code');\n codeEl.setAttribute('language', 'html');\n codeEl.setAttribute('title', this.getAttribute('title') ?? 'Example');\n codeEl.textContent = source;\n this.$('[data-ry-target=\"code\"]')!.appendChild(codeEl);\n\n // Create and inject live preview\n const previewTemplate = document.createElement('template');\n previewTemplate.innerHTML = transformed;\n this.$('[data-ry-target=\"preview\"]')!.appendChild(previewTemplate.content);\n\n // Add JS usage section if provided\n if (jsSource) {\n this.#buildUsageSection(jsSource);\n }\n }\n\n #buildUsageSection(jsSource: string): void {\n const usageContainer = this.$('[data-ry-target=\"usage\"]');\n if (!usageContainer) return;\n\n // Create toggle button\n const toggle = document.createElement('button');\n toggle.className = 'ry-example__usage-toggle';\n toggle.type = 'button';\n toggle.innerHTML = '<span>JS Usage</span><ry-icon name=\"chevron-down\" size=\"16\"></ry-icon>';\n toggle.setAttribute('aria-expanded', 'false');\n\n // Create content panel\n const panel = document.createElement('div');\n panel.className = 'ry-example__usage-panel';\n panel.hidden = true;\n\n // Create code block for JS\n const jsCodeEl = document.createElement('ry-code');\n jsCodeEl.setAttribute('language', 'js');\n jsCodeEl.setAttribute('title', 'JavaScript');\n jsCodeEl.textContent = jsSource;\n panel.appendChild(jsCodeEl);\n\n usageContainer.appendChild(toggle);\n usageContainer.appendChild(panel);\n\n // Toggle handler\n this.on(toggle, 'click', () => {\n const expanded = toggle.getAttribute('aria-expanded') === 'true';\n toggle.setAttribute('aria-expanded', String(!expanded));\n panel.hidden = expanded;\n });\n }\n\n /**\n * Normalize indentation by removing common leading whitespace\n */\n #trimIndent(html: string): string {\n const lines = html.split('\\n');\n\n // Remove empty first/last lines\n while (lines.length && !lines[0]!.trim()) lines.shift();\n while (lines.length && !lines[lines.length - 1]!.trim()) lines.pop();\n\n if (lines.length === 0) return '';\n\n // Find minimum indentation (ignoring empty lines)\n const minIndent = Math.min(\n ...lines\n .filter(line => line.trim())\n .map(line => {\n const match = line.match(/^(\\s*)/);\n return match?.[1]?.length ?? 0;\n })\n );\n\n // Remove common indentation\n return lines\n .map(line => line.slice(minIndent))\n .join('\\n')\n .trim();\n }\n}\n\ncustomElements.define('ry-example', RyExample);\n","/**\n * <ry-icon>\n *\n * Renders an icon from the icon registry.\n *\n * Usage:\n * <ry-icon name=\"close\"></ry-icon>\n * <ry-icon name=\"check\" size=\"16\"></ry-icon>\n * <ry-icon name=\"heart\" size=\"32\"></ry-icon>\n *\n * Attributes:\n * - name: icon name from registry (required)\n * - size: icon size in pixels (default: 24)\n * - label: accessible label (for screen readers)\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyIcon extends RyElement {\n static get observedAttributes(): string[] {\n return ['name', 'size', 'label'];\n }\n\n setup(): void {\n this.#render();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue !== newValue && this.hasAttribute('data-ry-initialized')) {\n this.#render();\n }\n }\n\n #render(): void {\n const name = this.getAttribute('name') ?? '';\n const size = this.getAttribute('size') ?? '24';\n const label = this.getAttribute('label');\n\n const svg = getIcon(name);\n\n if (!svg) {\n this.innerHTML = '';\n return;\n }\n\n // Inject SVG and update size\n this.innerHTML = svg;\n\n const svgEl = this.querySelector('svg');\n if (svgEl) {\n svgEl.setAttribute('width', size);\n svgEl.setAttribute('height', size);\n\n // Accessibility\n if (label) {\n svgEl.setAttribute('role', 'img');\n svgEl.setAttribute('aria-label', label);\n } else {\n svgEl.setAttribute('aria-hidden', 'true');\n }\n }\n }\n\n get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n set name(value: string) {\n this.setAttribute('name', value);\n }\n\n get size(): number {\n return parseInt(this.getAttribute('size') ?? '24', 10);\n }\n\n set size(value: number) {\n this.setAttribute('size', String(value));\n }\n}\n\ncustomElements.define('ry-icon', RyIcon);\n","/**\n * <ry-toggle-button>\n *\n * Standalone toggle button that works as part of a group via shared `name` attribute.\n * Buttons with the same name behave like radio buttons - only one can be pressed at a time.\n *\n * Usage:\n * <ry-toggle-button name=\"view\" value=\"list\" icon=\"list\"></ry-toggle-button>\n * <ry-toggle-button name=\"view\" value=\"grid\" icon=\"grid\" pressed></ry-toggle-button>\n *\n * Conflict detection:\n * Warns in console if same-name buttons span different form/section/fieldset containers.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { ChangeDetail } from '../types.js';\n\n// Container types that define logical grouping boundaries\nconst BOUNDARY_SELECTORS = ['form', 'section', 'fieldset', 'ry-section'];\n\n// Global registry: name -> Set of toggle button instances\nconst registry = new Map<string, Set<RyToggleButton>>();\n\n// Track which name groups have already warned about conflicts\nconst warnedGroups = new Set<string>();\n\n/**\n * Find the nearest boundary ancestor (form, section, fieldset)\n */\nfunction findBoundaryAncestor(el: Element): Element | null {\n let current = el.parentElement;\n while (current) {\n if (BOUNDARY_SELECTORS.some(sel => current!.matches(sel))) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\n/**\n * Check if buttons with the same name are in different boundary containers\n */\nfunction checkForConflicts(name: string): void {\n if (warnedGroups.has(name)) return;\n\n const buttons = registry.get(name);\n if (!buttons || buttons.size < 2) return;\n\n const boundaries = new Map<Element | null, RyToggleButton[]>();\n\n for (const btn of buttons) {\n const boundary = findBoundaryAncestor(btn);\n const group = boundaries.get(boundary) ?? [];\n group.push(btn);\n boundaries.set(boundary, group);\n }\n\n // If buttons are in more than one boundary container, warn\n if (boundaries.size > 1) {\n const containerDescriptions: string[] = [];\n for (const [boundary] of boundaries) {\n if (boundary) {\n const id = boundary.id ? `#${boundary.id}` : '';\n const tag = boundary.tagName.toLowerCase();\n containerDescriptions.push(`${tag}${id}`);\n } else {\n containerDescriptions.push('(no container)');\n }\n }\n\n console.warn(\n `ry-toggle-button: Buttons with name=\"${name}\" span multiple containers (${containerDescriptions.join(', ')}). Intentional?`\n );\n warnedGroups.add(name);\n }\n}\n\nexport class RyToggleButton extends RyElement {\n static observedAttributes = ['pressed', 'disabled', 'name', 'value'] as const;\n\n #registered = false;\n\n setup(): void {\n // Set up accessibility\n this.setAttribute('role', 'button');\n this.setAttribute('aria-pressed', String(this.pressed));\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n // Register in the global registry\n this.#register();\n\n // Event handlers\n this.on(this, 'click', this.#handleClick);\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n teardown(): void {\n this.#unregister();\n }\n\n #register(): void {\n const name = this.name;\n if (!name) return;\n\n if (!registry.has(name)) {\n registry.set(name, new Set());\n }\n registry.get(name)!.add(this);\n this.#registered = true;\n\n // Check for conflicts after a microtask to allow all buttons to register\n queueMicrotask(() => checkForConflicts(name));\n }\n\n #unregister(): void {\n if (!this.#registered) return;\n\n const name = this.name;\n if (name && registry.has(name)) {\n registry.get(name)!.delete(this);\n if (registry.get(name)!.size === 0) {\n registry.delete(name);\n warnedGroups.delete(name);\n }\n }\n this.#registered = false;\n }\n\n #handleClick = (event: MouseEvent): void => {\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n\n // Toggle this button on (don't toggle off if already pressed)\n if (!this.pressed) {\n this.pressed = true;\n }\n };\n\n #handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.click();\n }\n };\n\n #unpressOthers(): void {\n const name = this.name;\n if (!name) return;\n\n const siblings = registry.get(name);\n if (!siblings) return;\n\n for (const btn of siblings) {\n if (btn !== this && btn.pressed) {\n btn.pressed = false;\n }\n }\n }\n\n // --- Public API ---\n\n get pressed(): boolean {\n return this.hasAttribute('pressed');\n }\n\n set pressed(value: boolean) {\n const wasPressed = this.pressed;\n\n if (value) {\n this.setAttribute('pressed', '');\n this.setAttribute('aria-pressed', 'true');\n this.#unpressOthers();\n } else {\n this.removeAttribute('pressed');\n this.setAttribute('aria-pressed', 'false');\n }\n\n // Only emit if state actually changed\n if (wasPressed !== value) {\n this.emit<ChangeDetail>('change', {\n value: this.value,\n label: value ? 'pressed' : 'unpressed'\n });\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n this.setAttribute('tabindex', '-1');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n this.setAttribute('tabindex', '0');\n }\n }\n\n get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n set name(value: string) {\n const oldName = this.name;\n if (oldName === value) return;\n\n // Re-register with new name\n this.#unregister();\n if (value) {\n this.setAttribute('name', value);\n } else {\n this.removeAttribute('name');\n }\n this.#register();\n }\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n set value(val: string) {\n this.setAttribute('value', val);\n }\n\n get icon(): string {\n return this.getAttribute('icon') ?? '';\n }\n\n set icon(val: string) {\n this.setAttribute('icon', val);\n }\n}\n\ncustomElements.define('ry-toggle-button', RyToggleButton);\n","/**\n * <ry-slider>\n *\n * Range slider component with single or dual handles.\n *\n * Usage:\n * <ry-slider min=\"0\" max=\"100\" value=\"50\"></ry-slider>\n * <ry-slider min=\"0\" max=\"100\" start=\"25\" end=\"75\" range labeled></ry-slider>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RySlider extends RyElement {\n #dragging = false;\n #activeThumb: 'value' | 'start' | 'end' | null = null;\n #track: HTMLElement | null = null;\n #fill: HTMLElement | null = null;\n #thumbs: Map<string, HTMLElement> = new Map();\n #tooltips: Map<string, HTMLElement> = new Map();\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'start', 'end', 'disabled'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#updatePositions();\n }\n\n #buildMarkup(): void {\n const isRange = this.hasAttribute('range');\n const showLabels = this.hasAttribute('labeled');\n const showTooltip = this.hasAttribute('tooltip');\n const isVertical = this.hasAttribute('vertical');\n\n let html = `\n <div data-ry-target=\"track\" class=\"ry-slider__track\">\n <div data-ry-target=\"fill\" class=\"ry-slider__fill\"></div>\n `;\n\n if (isRange) {\n html += `\n <div data-ry-target=\"thumb-start\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"Start value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-start\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n <div data-ry-target=\"thumb-end\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"End value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-end\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n `;\n } else {\n html += `\n <div data-ry-target=\"thumb-value\" class=\"ry-slider__thumb\" tabindex=\"0\" role=\"slider\" aria-label=\"Value\">\n ${showTooltip ? '<span data-ry-target=\"tooltip-value\" class=\"ry-slider__tooltip\"></span>' : ''}\n </div>\n `;\n }\n\n html += '</div>';\n\n if (showLabels) {\n html += this.#buildLabels();\n }\n\n this.innerHTML = html;\n\n // Cache references\n this.#track = this.$('[data-ry-target=\"track\"]');\n this.#fill = this.$('[data-ry-target=\"fill\"]');\n\n if (isRange) {\n this.#thumbs.set('start', this.$('[data-ry-target=\"thumb-start\"]')!);\n this.#thumbs.set('end', this.$('[data-ry-target=\"thumb-end\"]')!);\n if (showTooltip) {\n this.#tooltips.set('start', this.$('[data-ry-target=\"tooltip-start\"]')!);\n this.#tooltips.set('end', this.$('[data-ry-target=\"tooltip-end\"]')!);\n }\n } else {\n this.#thumbs.set('value', this.$('[data-ry-target=\"thumb-value\"]')!);\n if (showTooltip) {\n this.#tooltips.set('value', this.$('[data-ry-target=\"tooltip-value\"]')!);\n }\n }\n }\n\n #buildLabels(): string {\n const min = this.min;\n const max = this.max;\n const customLabels = this.getAttribute('labels')?.split(',');\n const labelType = this.getAttribute('label-type') || 'number';\n\n let labels: string[] = [];\n\n if (customLabels) {\n labels = customLabels;\n } else {\n // Show 5 evenly distributed labels (always include min and max)\n const labelCount = 5;\n for (let i = 0; i < labelCount; i++) {\n const ratio = i / (labelCount - 1);\n const val = min + ratio * (max - min);\n if (labelType === 'letter') {\n labels.push(String.fromCharCode(65 + i));\n } else {\n // Round to reasonable precision\n const rounded = Math.round(val * 100) / 100;\n labels.push(String(Number.isInteger(rounded) ? rounded : rounded.toFixed(1)));\n }\n }\n }\n\n return `\n <div data-ry-target=\"labels\" class=\"ry-slider__labels\">\n ${labels.map(l => `<span>${l}</span>`).join('')}\n </div>\n `;\n }\n\n #bindEvents(): void {\n // Track click\n if (this.#track) {\n this.on(this.#track, 'pointerdown', this.#handleTrackDown);\n }\n\n // Thumb events\n for (const [key, thumb] of this.#thumbs) {\n this.on(thumb, 'pointerdown', (e) => this.#handleThumbDown(e, key));\n this.on(thumb, 'keydown', (e) => this.#handleKeydown(e, key));\n }\n\n // Document events for drag\n this.on(document, 'pointermove', this.#handlePointerMove);\n this.on(document, 'pointerup', this.#handlePointerUp);\n }\n\n #handleTrackDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n\n const value = this.#valueFromPointer(e);\n const isRange = this.hasAttribute('range');\n\n if (isRange) {\n // Move closest thumb\n const distToStart = Math.abs(value - this.start);\n const distToEnd = Math.abs(value - this.end);\n if (distToStart < distToEnd) {\n this.start = value;\n this.#activeThumb = 'start';\n } else {\n this.end = value;\n this.#activeThumb = 'end';\n }\n } else {\n this.value = value;\n this.#activeThumb = 'value';\n }\n\n this.#dragging = true;\n this.#updatePositions();\n this.#emitInput();\n };\n\n #handleThumbDown = (e: PointerEvent, key: string): void => {\n if (this.disabled) return;\n e.stopPropagation();\n this.#dragging = true;\n this.#activeThumb = key as 'value' | 'start' | 'end';\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#dragging || !this.#activeThumb) return;\n\n const value = this.#valueFromPointer(e);\n const isRange = this.hasAttribute('range');\n\n if (isRange) {\n if (this.#activeThumb === 'start') {\n // Prevent crossover\n this.start = Math.min(value, this.end);\n } else if (this.#activeThumb === 'end') {\n this.end = Math.max(value, this.start);\n }\n } else {\n this.value = value;\n }\n\n this.#updatePositions();\n this.#emitInput();\n };\n\n #handlePointerUp = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#activeThumb = null;\n this.#emitChange();\n }\n };\n\n #handleKeydown = (e: KeyboardEvent, key: string): void => {\n if (this.disabled) return;\n\n const step = this.step || 1;\n const largeStep = (this.max - this.min) / 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = this.hasAttribute('reversed') ? -step : step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = this.hasAttribute('reversed') ? step : -step;\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n delta = this.min - this.#getValueForKey(key);\n break;\n case 'End':\n delta = this.max - this.#getValueForKey(key);\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const newValue = this.#clamp(this.#getValueForKey(key) + delta);\n\n if (key === 'start') {\n this.start = Math.min(newValue, this.end);\n } else if (key === 'end') {\n this.end = Math.max(newValue, this.start);\n } else {\n this.value = newValue;\n }\n\n this.#updatePositions();\n this.#emitInput();\n this.#emitChange();\n };\n\n #getValueForKey(key: string): number {\n if (key === 'start') return this.start;\n if (key === 'end') return this.end;\n return this.value;\n }\n\n #valueFromPointer(e: PointerEvent): number {\n if (!this.#track) return this.min;\n\n const rect = this.#track.getBoundingClientRect();\n const isVertical = this.hasAttribute('vertical');\n const isReversed = this.hasAttribute('reversed');\n\n let ratio: number;\n if (isVertical) {\n ratio = (rect.bottom - e.clientY) / rect.height;\n } else {\n ratio = (e.clientX - rect.left) / rect.width;\n }\n\n if (isReversed) ratio = 1 - ratio;\n ratio = Math.max(0, Math.min(1, ratio));\n\n const rawValue = this.min + ratio * (this.max - this.min);\n return this.#snapToStep(rawValue);\n }\n\n #snapToStep(value: number): number {\n const step = this.step;\n if (step === 0) return this.#clamp(value);\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return this.#clamp(snapped);\n }\n\n #clamp(value: number): number {\n return Math.max(this.min, Math.min(this.max, value));\n }\n\n #updatePositions(): void {\n const isRange = this.hasAttribute('range');\n const isVertical = this.hasAttribute('vertical');\n const isReversed = this.hasAttribute('reversed');\n\n const toPercent = (val: number) => {\n let pct = ((val - this.min) / (this.max - this.min)) * 100;\n if (isReversed) pct = 100 - pct;\n return pct;\n };\n\n if (isRange) {\n const startPct = toPercent(this.start);\n const endPct = toPercent(this.end);\n const lowPct = Math.min(startPct, endPct);\n const highPct = Math.max(startPct, endPct);\n\n if (this.#fill) {\n if (isVertical) {\n this.#fill.style.bottom = `${lowPct}%`;\n this.#fill.style.height = `${highPct - lowPct}%`;\n this.#fill.style.left = '';\n this.#fill.style.width = '';\n } else {\n this.#fill.style.left = `${lowPct}%`;\n this.#fill.style.width = `${highPct - lowPct}%`;\n this.#fill.style.bottom = '';\n this.#fill.style.height = '';\n }\n }\n\n const startThumb = this.#thumbs.get('start');\n const endThumb = this.#thumbs.get('end');\n if (startThumb) {\n if (isVertical) {\n startThumb.style.bottom = `${startPct}%`;\n startThumb.style.left = '';\n } else {\n startThumb.style.left = `${startPct}%`;\n startThumb.style.bottom = '';\n }\n }\n if (endThumb) {\n if (isVertical) {\n endThumb.style.bottom = `${endPct}%`;\n endThumb.style.left = '';\n } else {\n endThumb.style.left = `${endPct}%`;\n endThumb.style.bottom = '';\n }\n }\n\n // Update tooltips\n this.#updateTooltip('start', this.start);\n this.#updateTooltip('end', this.end);\n\n // Update ARIA\n startThumb?.setAttribute('aria-valuenow', String(this.start));\n startThumb?.setAttribute('aria-valuemin', String(this.min));\n startThumb?.setAttribute('aria-valuemax', String(this.end));\n endThumb?.setAttribute('aria-valuenow', String(this.end));\n endThumb?.setAttribute('aria-valuemin', String(this.start));\n endThumb?.setAttribute('aria-valuemax', String(this.max));\n } else {\n const pct = toPercent(this.value);\n\n if (this.#fill) {\n if (isVertical) {\n this.#fill.style.bottom = '0';\n this.#fill.style.height = `${pct}%`;\n this.#fill.style.left = '';\n this.#fill.style.width = '';\n } else {\n this.#fill.style.left = '0';\n this.#fill.style.width = `${pct}%`;\n this.#fill.style.bottom = '';\n this.#fill.style.height = '';\n }\n }\n\n const thumb = this.#thumbs.get('value');\n if (thumb) {\n if (isVertical) {\n thumb.style.bottom = `${pct}%`;\n thumb.style.left = '';\n } else {\n thumb.style.left = `${pct}%`;\n thumb.style.bottom = '';\n }\n }\n\n // Update tooltip\n this.#updateTooltip('value', this.value);\n\n // Update ARIA\n thumb?.setAttribute('aria-valuenow', String(this.value));\n thumb?.setAttribute('aria-valuemin', String(this.min));\n thumb?.setAttribute('aria-valuemax', String(this.max));\n }\n }\n\n #updateTooltip(key: string, value: number): void {\n const tooltip = this.#tooltips.get(key);\n if (tooltip) {\n const decimals = this.step === 0 ? 2 : (String(this.step).split('.')[1]?.length || 0);\n tooltip.textContent = value.toFixed(decimals);\n }\n }\n\n #emitInput(): void {\n if (this.hasAttribute('range')) {\n this.emit('input', { start: this.start, end: this.end });\n } else {\n this.emit('input', { value: this.value });\n }\n }\n\n #emitChange(): void {\n if (this.hasAttribute('range')) {\n this.emit('change', { start: this.start, end: this.end });\n } else {\n this.emit('change', { value: this.value });\n }\n }\n\n // --- Public API ---\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '1');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? String(this.min));\n }\n set value(val: number) {\n this.setAttribute('value', String(this.#clamp(val)));\n }\n\n get start(): number {\n return parseFloat(this.getAttribute('start') ?? String(this.min));\n }\n set start(val: number) {\n this.setAttribute('start', String(this.#clamp(val)));\n }\n\n get end(): number {\n return parseFloat(this.getAttribute('end') ?? String(this.max));\n }\n set end(val: number) {\n this.setAttribute('end', String(this.#clamp(val)));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n}\n\ncustomElements.define('ry-slider', RySlider);\n","/**\n * <ry-knob>\n *\n * Rotary knob component with drag/wheel interaction.\n *\n * Usage:\n * <ry-knob min=\"0\" max=\"100\" value=\"50\" label=\"Volume\"></ry-knob>\n * <ry-knob min=\"0\" max=\"3\" step=\"1\" labels=\"Off,Low,Med,High\"></ry-knob>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyKnob extends RyElement {\n #dragging = false;\n #startY = 0;\n #startValue = 0;\n #ring: HTMLElement | null = null;\n #indicator: HTMLElement | null = null;\n #display: HTMLElement | null = null;\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'disabled', 'label', 'labels', 'description'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#updateVisuals();\n }\n\n #buildMarkup(): void {\n const label = this.getAttribute('label');\n const description = this.getAttribute('description');\n const titleAttr = description ? ` title=\"${description}\"` : '';\n\n this.innerHTML = `\n <div data-ry-target=\"ring\" class=\"ry-knob__ring\"${titleAttr}>\n <div data-ry-target=\"cap\" class=\"ry-knob__cap\">\n <div data-ry-target=\"indicator\" class=\"ry-knob__indicator\"></div>\n </div>\n </div>\n <span data-ry-target=\"display\" class=\"ry-knob__value\"></span>\n ${label ? `<span data-ry-target=\"label\" class=\"ry-knob__label\"${titleAttr}>${label}</span>` : ''}\n `;\n\n this.#ring = this.$('[data-ry-target=\"ring\"]');\n this.#indicator = this.$('[data-ry-target=\"indicator\"]');\n this.#display = this.$('[data-ry-target=\"display\"]');\n }\n\n #bindEvents(): void {\n if (!this.#ring) return;\n\n // Mouse drag\n this.on(this.#ring, 'mousedown', this.#handleMouseDown);\n this.on(document, 'mousemove', this.#handleMouseMove);\n this.on(document, 'mouseup', this.#handleMouseUp);\n\n // Touch support\n this.on(this.#ring, 'touchstart', this.#handleTouchStart);\n this.on(document, 'touchmove', this.#handleTouchMove);\n this.on(document, 'touchend', this.#handleTouchEnd);\n\n // Wheel\n this.on(this.#ring, 'wheel', this.#handleWheel);\n\n // Keyboard\n this.on(this, 'keydown', this.#handleKeydown);\n }\n\n #handleMouseDown = (e: MouseEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#dragging = true;\n this.#startY = e.clientY;\n this.#startValue = this.value;\n this.#ring?.classList.add('ry-knob__ring--dragging');\n this.setAttribute('data-dragging', '');\n };\n\n #handleMouseMove = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n const deltaY = this.#startY - e.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.#updateValue(this.#startValue + deltaY * sensitivity);\n };\n\n #handleMouseUp = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#ring?.classList.remove('ry-knob__ring--dragging');\n this.removeAttribute('data-dragging');\n this.#emitChange();\n }\n };\n\n #handleTouchStart = (e: TouchEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#dragging = true;\n this.#startY = e.touches[0]?.clientY ?? 0;\n this.#startValue = this.value;\n this.#ring?.classList.add('ry-knob__ring--dragging');\n this.setAttribute('data-dragging', '');\n };\n\n #handleTouchMove = (e: TouchEvent): void => {\n if (!this.#dragging) return;\n e.preventDefault();\n const touch = e.touches[0];\n if (!touch) return;\n const deltaY = this.#startY - touch.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.#updateValue(this.#startValue + deltaY * sensitivity);\n };\n\n #handleTouchEnd = (): void => {\n if (this.#dragging) {\n this.#dragging = false;\n this.#ring?.classList.remove('ry-knob__ring--dragging');\n this.removeAttribute('data-dragging');\n this.#emitChange();\n }\n };\n\n #handleWheel = (e: WheelEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n const step = this.step || (this.max - this.min) / 50;\n const delta = e.deltaY < 0 ? step : -step;\n this.#updateValue(this.value + delta);\n this.#emitChange();\n };\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n\n const step = this.step || 1;\n const largeStep = (this.max - this.min) / 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n delta = step;\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n delta = -step;\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n this.#updateValue(this.min);\n this.#emitChange();\n return;\n case 'End':\n this.#updateValue(this.max);\n this.#emitChange();\n return;\n default:\n return;\n }\n\n e.preventDefault();\n this.#updateValue(this.value + delta);\n this.#emitChange();\n };\n\n #updateValue(newValue: number): void {\n let clamped = Math.max(this.min, Math.min(this.max, newValue));\n\n // Snap to step if defined\n const step = this.step;\n if (step > 0) {\n clamped = Math.round((clamped - this.min) / step) * step + this.min;\n clamped = Math.max(this.min, Math.min(this.max, clamped));\n }\n\n this.value = clamped;\n this.#updateVisuals();\n this.#emitInput();\n }\n\n #updateVisuals(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n // Rotation: -135deg (min) to +135deg (max) = 270deg range\n const rotation = -135 + percent * 270;\n\n if (this.#ring) {\n this.#ring.style.setProperty('--knob-rotation', `${rotation}deg`);\n this.#ring.style.setProperty('--knob-percent', String(percent));\n }\n\n if (this.#display) {\n this.#display.textContent = this.#formatValue(this.value);\n }\n\n // Update ARIA\n this.setAttribute('aria-valuenow', String(this.value));\n this.setAttribute('aria-valuemin', String(this.min));\n this.setAttribute('aria-valuemax', String(this.max));\n }\n\n #formatValue(value: number): string {\n const labelsAttr = this.getAttribute('labels');\n if (labelsAttr) {\n const labels = labelsAttr.split(',');\n const index = Math.round(value);\n return labels[index] ?? String(index);\n }\n\n const step = this.step;\n if (step >= 1) return Math.round(value).toString();\n if (Math.abs(value) >= 1000) return (value / 1000).toFixed(1) + 'k';\n if (Math.abs(value) >= 100) return Math.round(value).toString();\n if (Math.abs(value) >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n #emitInput(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n this.emit('input', { value: this.value, percent });\n }\n\n #emitChange(): void {\n const percent = (this.value - this.min) / (this.max - this.min);\n this.emit('change', { value: this.value, percent });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n if (name === 'value' && this.#ring) {\n this.#updateVisuals();\n }\n }\n\n // --- Public API ---\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '0');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? String(this.min));\n }\n set value(val: number) {\n this.setAttribute('value', String(val));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n}\n\ncustomElements.define('ry-knob', RyKnob);\n","/**\n * <ry-number-select>\n *\n * Numeric input with buttons, drag, keyboard, wheel, and optional typing.\n *\n * Usage:\n * <ry-number-select min=\"0\" max=\"100\" value=\"50\" step=\"1\"></ry-number-select>\n * <ry-number-select min=\"0\" max=\"10\" step=\"0.5\" arrows=\"end\" editable></ry-number-select>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nconst DRAG_PX_PER_STEP = 15;\nconst CLICK_THRESHOLD = 3;\n\nexport class RyNumberSelect extends RyElement {\n #display: HTMLElement | null = null;\n #valueEl: HTMLElement | null = null;\n #inputEl: HTMLInputElement | null = null;\n #decrementBtn: HTMLElement | null = null;\n #incrementBtn: HTMLElement | null = null;\n\n #dragging = false;\n #startX = 0;\n #startY = 0;\n #startValue = 0;\n #editing = false;\n\n #repeatTimer: ReturnType<typeof setTimeout> | null = null;\n #repeatInterval: ReturnType<typeof setTimeout> | null = null;\n\n static observedAttributes = ['min', 'max', 'step', 'value', 'disabled', 'arrows', 'icons', 'drag', 'editable', 'wrap', 'label', 'prefix', 'suffix'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#cacheRefs();\n this.#bindEvents();\n this.#updateDisplay();\n }\n\n #buildMarkup(): void {\n const arrows = this.getAttribute('arrows') ?? 'both';\n const label = this.getAttribute('label');\n const stacked = arrows === 'stacked' || arrows === 'stacked-end' || arrows === 'stacked-start';\n\n const [decIcon, incIcon] = this.#getIcons(stacked);\n\n const showDecrement = arrows !== 'end' && arrows !== 'none';\n const showIncrement = arrows !== 'start' && arrows !== 'none';\n const prefix = this.getAttribute('prefix');\n const suffix = this.getAttribute('suffix');\n\n const decBtn = showDecrement\n ? `<button data-ry-target=\"decrement\" class=\"ry-number-select__btn ry-number-select__decrement\" aria-label=\"Decrease\" tabindex=\"-1\" type=\"button\">${decIcon}</button>`\n : '';\n const incBtn = showIncrement\n ? `<button data-ry-target=\"increment\" class=\"ry-number-select__btn ry-number-select__increment\" aria-label=\"Increase\" tabindex=\"-1\" type=\"button\">${incIcon}</button>`\n : '';\n const display = `\n <div data-ry-target=\"display\" class=\"ry-number-select__display\" tabindex=\"0\" role=\"spinbutton\"\n aria-valuenow=\"${this.value}\" aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n ${label ? `aria-label=\"${label}\"` : ''}>\n ${prefix ? `<span data-ry-target=\"prefix\" class=\"ry-number-select__affix\">${prefix}</span>` : ''}\n <span data-ry-target=\"value\" class=\"ry-number-select__value\">${this.#formatValue(this.value)}</span>\n ${suffix ? `<span data-ry-target=\"suffix\" class=\"ry-number-select__affix\">${suffix}</span>` : ''}\n <input data-ry-target=\"input\" class=\"ry-number-select__input\" type=\"text\" inputmode=\"decimal\" tabindex=\"-1\">\n </div>`;\n const labelEl = label ? `<span data-ry-target=\"label\" class=\"ry-number-select__label\">${label}</span>` : '';\n\n if (arrows === 'stacked') {\n // Vertical: increment on top, display in middle, decrement on bottom\n this.innerHTML = `${incBtn}${display}${decBtn}${labelEl}`;\n } else if (arrows === 'stacked-end') {\n // Horizontal: display, then stacked buttons on the right\n const group = `<div data-ry-target=\"btn-group\" class=\"ry-number-select__btn-group\">${incBtn}${decBtn}</div>`;\n this.innerHTML = `${display}${group}${labelEl}`;\n } else if (arrows === 'stacked-start') {\n // Horizontal: stacked buttons on the left, then display\n const group = `<div data-ry-target=\"btn-group\" class=\"ry-number-select__btn-group\">${incBtn}${decBtn}</div>`;\n this.innerHTML = `${group}${display}${labelEl}`;\n } else {\n this.innerHTML = `${decBtn}${display}${incBtn}${labelEl}`;\n }\n }\n\n #getIcons(stacked: boolean): [string, string] {\n const icons = this.getAttribute('icons') ?? 'plus-minus';\n\n if (icons === 'chevron') {\n if (stacked) {\n return [getIcon('chevron-down') ?? '▾', getIcon('chevron-up') ?? '▴'];\n }\n return [getIcon('chevron-left') ?? '‹', getIcon('chevron-right') ?? '›'];\n }\n\n if (icons === 'arrow') {\n if (stacked) {\n return [getIcon('chevron-down') ?? '▼', getIcon('chevron-up') ?? '▲'];\n }\n return [getIcon('chevron-left') ?? '◀', getIcon('chevron-right') ?? '▶'];\n }\n\n // Default: plus-minus\n return [getIcon('minus') ?? '−', getIcon('plus') ?? '+'];\n }\n\n #cacheRefs(): void {\n this.#display = this.$('[data-ry-target=\"display\"]');\n this.#valueEl = this.$('[data-ry-target=\"value\"]');\n this.#inputEl = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n this.#decrementBtn = this.$('[data-ry-target=\"decrement\"]');\n this.#incrementBtn = this.$('[data-ry-target=\"increment\"]');\n }\n\n #bindEvents(): void {\n // Buttons\n if (this.#decrementBtn) {\n this.on(this.#decrementBtn, 'mousedown', (e: MouseEvent) => { e.preventDefault(); this.#handleButtonDown(-1); });\n this.on(this.#decrementBtn, 'mouseup', () => this.#handleButtonUp());\n this.on(this.#decrementBtn, 'mouseleave', () => this.#handleButtonUp());\n }\n if (this.#incrementBtn) {\n this.on(this.#incrementBtn, 'mousedown', (e: MouseEvent) => { e.preventDefault(); this.#handleButtonDown(1); });\n this.on(this.#incrementBtn, 'mouseup', () => this.#handleButtonUp());\n this.on(this.#incrementBtn, 'mouseleave', () => this.#handleButtonUp());\n }\n\n // Drag on display\n if (this.#display) {\n this.on(this.#display, 'mousedown', this.#handleMouseDown);\n }\n this.on(document, 'mousemove', this.#handleMouseMove);\n this.on(document, 'mouseup', this.#handleMouseUp);\n\n // Touch\n if (this.#display) {\n this.on(this.#display, 'touchstart', this.#handleTouchStart);\n }\n this.on(document, 'touchmove', this.#handleTouchMove);\n this.on(document, 'touchend', this.#handleTouchEnd);\n\n // Keyboard\n if (this.#display) {\n this.on(this.#display, 'keydown', this.#handleKeydown);\n }\n\n // Wheel\n this.on(this, 'wheel', this.#handleWheel);\n\n // Double-click always enters edit mode\n if (this.#display) {\n this.on(this.#display, 'dblclick', () => this.#enterEditMode());\n }\n\n // Edit mode\n if (this.#inputEl) {\n this.on(this.#inputEl, 'blur', () => this.#commitEdit());\n this.on(this.#inputEl, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') { e.preventDefault(); this.#commitEdit(); }\n if (e.key === 'Escape') { e.preventDefault(); this.#cancelEdit(); }\n e.stopPropagation();\n });\n }\n }\n\n // --- Button hold-to-repeat ---\n\n #handleButtonDown(direction: 1 | -1): void {\n if (this.disabled) return;\n\n const step = this.step || 1;\n this.#adjustValue(direction * step);\n this.#emitChange();\n\n this.#repeatTimer = setTimeout(() => {\n let interval = 150;\n const tick = (): void => {\n this.#adjustValue(direction * step);\n this.#emitInput();\n interval = Math.max(40, interval * 0.85);\n this.#repeatInterval = setTimeout(tick, interval);\n };\n tick();\n }, 400);\n }\n\n #handleButtonUp(): void {\n if (this.#repeatTimer) { clearTimeout(this.#repeatTimer); this.#repeatTimer = null; }\n if (this.#repeatInterval) { clearTimeout(this.#repeatInterval); this.#repeatInterval = null; }\n }\n\n // --- Drag helpers ---\n\n get #dragAxis(): 'x' | 'y' | 'none' {\n const val = this.getAttribute('drag');\n if (val === 'x' || val === 'y' || val === 'none') return val;\n // Default: stacked layouts → vertical drag\n const arrows = this.getAttribute('arrows');\n if (arrows === 'stacked' || arrows === 'stacked-end' || arrows === 'stacked-start') return 'y';\n return 'x';\n }\n\n #getDragDelta(clientX: number, clientY: number): number {\n const axis = this.#dragAxis;\n if (axis === 'y') return this.#startY - clientY; // up = increase\n return clientX - this.#startX; // right = increase\n }\n\n #getDragMoved(clientX: number, clientY: number): number {\n const axis = this.#dragAxis;\n if (axis === 'y') return Math.abs(clientY - this.#startY);\n return Math.abs(clientX - this.#startX);\n }\n\n #applyMicroOffset(remainder: number, pxPerStep: number): void {\n if (!this.#valueEl) return;\n const offset = (remainder / pxPerStep) * 4;\n const axis = this.#dragAxis;\n this.#valueEl.style.transform = axis === 'y'\n ? `translateY(${-offset}px)`\n : `translateX(${offset}px)`;\n }\n\n #processDrag(clientX: number, clientY: number, shiftKey: boolean): void {\n const d = this.#getDragDelta(clientX, clientY);\n const step = this.step || 1;\n const effectiveStep = shiftKey ? step * 10 : step;\n const pxPerStep = shiftKey ? DRAG_PX_PER_STEP * 2 : DRAG_PX_PER_STEP;\n const steps = Math.round(d / pxPerStep);\n const newVal = this.#startValue + steps * effectiveStep;\n\n const remainder = d - steps * pxPerStep;\n this.#applyMicroOffset(remainder, pxPerStep);\n\n const clamped = this.hasAttribute('wrap') ? this.#wrapValue(newVal) : this.#clamp(newVal);\n const snapped = this.#snapToStep(clamped);\n\n if (snapped !== this.value) {\n this.value = snapped;\n this.#updateDisplay();\n this.#emitInput();\n }\n }\n\n // --- Mouse drag ---\n\n #handleMouseDown = (e: MouseEvent): void => {\n if (this.disabled || this.#editing || this.#dragAxis === 'none') return;\n e.preventDefault();\n this.#dragging = true;\n this.#startX = e.clientX;\n this.#startY = e.clientY;\n this.#startValue = this.value;\n this.setAttribute('data-dragging', '');\n };\n\n #handleMouseMove = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n this.#processDrag(e.clientX, e.clientY, e.shiftKey);\n };\n\n #handleMouseUp = (e: MouseEvent): void => {\n if (!this.#dragging) return;\n const moved = this.#getDragMoved(e.clientX, e.clientY);\n this.#dragging = false;\n this.removeAttribute('data-dragging');\n\n if (this.#valueEl) {\n this.#valueEl.style.transform = '';\n }\n\n if (moved < CLICK_THRESHOLD && this.hasAttribute('editable')) {\n this.#enterEditMode();\n } else if (moved >= CLICK_THRESHOLD) {\n this.#emitChange();\n }\n };\n\n // --- Touch drag ---\n\n #handleTouchStart = (e: TouchEvent): void => {\n if (this.disabled || this.#editing || this.#dragAxis === 'none') return;\n e.preventDefault();\n this.#dragging = true;\n this.#startX = e.touches[0]?.clientX ?? 0;\n this.#startY = e.touches[0]?.clientY ?? 0;\n this.#startValue = this.value;\n this.setAttribute('data-dragging', '');\n };\n\n #handleTouchMove = (e: TouchEvent): void => {\n if (!this.#dragging) return;\n e.preventDefault();\n const touch = e.touches[0];\n if (!touch) return;\n this.#processDrag(touch.clientX, touch.clientY, false);\n };\n\n #handleTouchEnd = (): void => {\n if (!this.#dragging) return;\n this.#dragging = false;\n this.removeAttribute('data-dragging');\n\n if (this.#valueEl) {\n this.#valueEl.style.transform = '';\n }\n\n this.#emitChange();\n };\n\n // --- Keyboard ---\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.#editing) return;\n\n const step = this.step || 1;\n const largeStep = step * 10;\n let delta = 0;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n delta = e.shiftKey ? largeStep : step;\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n delta = -(e.shiftKey ? largeStep : step);\n break;\n case 'PageUp':\n delta = largeStep;\n break;\n case 'PageDown':\n delta = -largeStep;\n break;\n case 'Home':\n delta = this.min - this.value;\n break;\n case 'End':\n delta = this.max - this.value;\n break;\n case 'Enter':\n if (this.hasAttribute('editable')) {\n this.#enterEditMode();\n }\n return;\n default:\n if (this.hasAttribute('editable') && /^[0-9.\\-]$/.test(e.key)) {\n this.#enterEditMode(e.key);\n e.preventDefault();\n }\n return;\n }\n\n e.preventDefault();\n this.#adjustValue(delta);\n this.#emitInput();\n this.#emitChange();\n };\n\n // --- Wheel ---\n\n #handleWheel = (e: WheelEvent): void => {\n if (this.disabled || this.#editing) return;\n if (!this.matches(':hover') && !this.contains(document.activeElement)) return;\n\n e.preventDefault();\n const step = this.step || 1;\n const effectiveStep = e.shiftKey ? step * 10 : step;\n const delta = e.deltaY < 0 ? effectiveStep : -effectiveStep;\n this.#adjustValue(delta);\n this.#emitInput();\n this.#emitChange();\n };\n\n // --- Edit mode ---\n\n #enterEditMode(initialChar?: string): void {\n if (this.disabled || this.#editing) return;\n this.#editing = true;\n this.state = 'editing';\n\n if (this.#valueEl) this.#valueEl.style.display = 'none';\n if (this.#inputEl) {\n this.#inputEl.style.display = 'block';\n this.#inputEl.value = initialChar ?? this.#formatValue(this.value);\n this.#inputEl.focus();\n if (initialChar) {\n this.#inputEl.setSelectionRange(1, 1);\n } else {\n this.#inputEl.select();\n }\n }\n }\n\n #commitEdit(): void {\n if (!this.#editing) return;\n this.#editing = false;\n this.state = '';\n\n const raw = parseFloat(this.#inputEl?.value ?? '');\n if (!isNaN(raw)) {\n const clamped = this.#clamp(raw);\n const snapped = this.#snapToStep(clamped);\n this.value = snapped;\n this.#emitChange();\n }\n\n if (this.#valueEl) this.#valueEl.style.display = '';\n if (this.#inputEl) this.#inputEl.style.display = 'none';\n this.#updateDisplay();\n this.#display?.focus();\n }\n\n #cancelEdit(): void {\n if (!this.#editing) return;\n this.#editing = false;\n this.state = '';\n\n if (this.#valueEl) this.#valueEl.style.display = '';\n if (this.#inputEl) this.#inputEl.style.display = 'none';\n this.#display?.focus();\n }\n\n // --- Value management ---\n\n #adjustValue(delta: number): void {\n let newVal = this.value + delta;\n\n if (this.hasAttribute('wrap')) {\n newVal = this.#wrapValue(newVal);\n } else {\n newVal = this.#clamp(newVal);\n }\n\n newVal = this.#snapToStep(newVal);\n this.value = newVal;\n this.#updateDisplay();\n }\n\n #clamp(val: number): number {\n return Math.max(this.min, Math.min(this.max, val));\n }\n\n #wrapValue(val: number): number {\n const step = this.step || 1;\n const range = this.max - this.min + step;\n let wrapped = val;\n while (wrapped > this.max) wrapped -= range;\n while (wrapped < this.min) wrapped += range;\n return wrapped;\n }\n\n #snapToStep(val: number): number {\n const step = this.step;\n if (step <= 0) return this.#clamp(val);\n const snapped = Math.round((val - this.min) / step) * step + this.min;\n return this.#clamp(snapped);\n }\n\n #formatValue(val: number): string {\n const step = this.step;\n if (step >= 1) return Math.round(val).toString();\n const decimals = Math.max(0, -Math.floor(Math.log10(step)));\n return val.toFixed(decimals);\n }\n\n #updateDisplay(): void {\n if (this.#valueEl) {\n this.#valueEl.textContent = this.#formatValue(this.value);\n }\n this.#updateAria();\n }\n\n #updateAria(): void {\n if (this.#display) {\n this.#display.setAttribute('aria-valuenow', String(this.value));\n this.#display.setAttribute('aria-valuemin', String(this.min));\n this.#display.setAttribute('aria-valuemax', String(this.max));\n }\n }\n\n #emitInput(): void {\n this.emit('input', { value: this.value });\n }\n\n #emitChange(): void {\n this.emit('change', { value: this.value });\n }\n\n // --- Public API ---\n\n get value(): number {\n return parseFloat(this.getAttribute('value') ?? '0');\n }\n set value(val: number) {\n this.setAttribute('value', String(val));\n }\n\n get min(): number {\n return parseFloat(this.getAttribute('min') ?? '0');\n }\n set min(val: number) {\n this.setAttribute('min', String(val));\n }\n\n get max(): number {\n return parseFloat(this.getAttribute('max') ?? '100');\n }\n set max(val: number) {\n this.setAttribute('max', String(val));\n }\n\n get step(): number {\n return parseFloat(this.getAttribute('step') ?? '1');\n }\n set step(val: number) {\n this.setAttribute('step', String(val));\n }\n\n get drag(): 'x' | 'y' | 'none' {\n return this.#dragAxis;\n }\n set drag(val: 'x' | 'y' | 'none') {\n this.setAttribute('drag', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) this.setAttribute('disabled', '');\n else this.removeAttribute('disabled');\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n if (name === 'value' && this.#display) {\n this.#updateDisplay();\n }\n }\n\n teardown(): void {\n this.#handleButtonUp();\n }\n}\n\ncustomElements.define('ry-number-select', RyNumberSelect);\n","/**\n * <ry-color-picker>\n *\n * Color picker component with HSV grid, hue slider, and optional alpha slider.\n * Shows as a dropdown trigger by default; add `inline` for always-visible picker.\n *\n * Usage:\n * <ry-color-picker value=\"#ff0000\"></ry-color-picker>\n * <ry-color-picker value=\"#ff0000\" inline></ry-color-picker>\n * <ry-color-picker value=\"hsl(200, 100%, 50%)\" format=\"hsl\" opacity></ry-color-picker>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color conversion utilities (no external dependencies)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HSV {\n h: number; // 0-360\n s: number; // 0-100\n v: number; // 0-100\n}\n\nexport interface RGB {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n}\n\nexport interface HSL {\n h: number; // 0-360\n s: number; // 0-100\n l: number; // 0-100\n}\n\nfunction hsvToRgb(hsv: HSV): RGB {\n const h = hsv.h / 360;\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n let r = 0, g = 0, b = 0;\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0: r = v; g = t; b = p; break;\n case 1: r = q; g = v; b = p; break;\n case 2: r = p; g = v; b = t; break;\n case 3: r = p; g = q; b = v; break;\n case 4: r = t; g = p; b = v; break;\n case 5: r = v; g = p; b = q; break;\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n}\n\nfunction rgbToHsv(rgb: RGB): HSV {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : d / max;\n const v = max;\n\n if (max !== min) {\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n v: Math.round(v * 100)\n };\n}\n\nfunction hsvToHsl(hsv: HSV): HSL {\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n const l = v * (1 - s / 2);\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n\n return {\n h: hsv.h,\n s: Math.round(sl * 100),\n l: Math.round(l * 100)\n };\n}\n\nfunction hslToHsv(hsl: HSL): HSV {\n const s = hsl.s / 100;\n const l = hsl.l / 100;\n\n const v = l + s * Math.min(l, 1 - l);\n const sv = v === 0 ? 0 : 2 * (1 - l / v);\n\n return {\n h: hsl.h,\n s: Math.round(sv * 100),\n v: Math.round(v * 100)\n };\n}\n\nfunction rgbToHex(rgb: RGB): string {\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\nfunction hexToRgb(hex: string): RGB | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n // Try 3-character hex\n const short = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i.exec(hex);\n if (short) {\n return {\n r: parseInt(short[1]! + short[1]!, 16),\n g: parseInt(short[2]! + short[2]!, 16),\n b: parseInt(short[3]! + short[3]!, 16)\n };\n }\n return null;\n }\n return {\n r: parseInt(result[1]!, 16),\n g: parseInt(result[2]!, 16),\n b: parseInt(result[3]!, 16)\n };\n}\n\nfunction parseColor(input: string): { hsv: HSV; alpha: number } | null {\n const str = input.trim().toLowerCase();\n\n // Hex format\n if (str.startsWith('#')) {\n // Check for 8-character hex (with alpha)\n const hexAlpha = /^#([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(str);\n if (hexAlpha) {\n const rgb = {\n r: parseInt(hexAlpha[1]!, 16),\n g: parseInt(hexAlpha[2]!, 16),\n b: parseInt(hexAlpha[3]!, 16)\n };\n const alpha = parseInt(hexAlpha[4]!, 16) / 255;\n return { hsv: rgbToHsv(rgb), alpha: Math.round(alpha * 100) };\n }\n const rgb = hexToRgb(str);\n if (rgb) return { hsv: rgbToHsv(rgb), alpha: 100 };\n return null;\n }\n\n // RGB/RGBA format\n const rgbMatch = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/.exec(str);\n if (rgbMatch) {\n const rgb = {\n r: parseInt(rgbMatch[1]!, 10),\n g: parseInt(rgbMatch[2]!, 10),\n b: parseInt(rgbMatch[3]!, 10)\n };\n const alpha = rgbMatch[4] ? parseFloat(rgbMatch[4]) * 100 : 100;\n return { hsv: rgbToHsv(rgb), alpha };\n }\n\n // HSL/HSLA format\n const hslMatch = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/.exec(str);\n if (hslMatch) {\n const hsl = {\n h: parseFloat(hslMatch[1]!),\n s: parseFloat(hslMatch[2]!),\n l: parseFloat(hslMatch[3]!)\n };\n const alpha = hslMatch[4] ? parseFloat(hslMatch[4]) * 100 : 100;\n return { hsv: hslToHsv(hsl), alpha };\n }\n\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl';\n\nexport class RyColorPicker extends RyElement {\n #hue = 0;\n #saturation = 100;\n #brightness = 100;\n #alpha = 100;\n\n #draggingGrid = false;\n #draggingHue = false;\n #draggingAlpha = false;\n\n #trigger: HTMLElement | null = null;\n #panel: HTMLElement | null = null;\n #grid: HTMLElement | null = null;\n #gridHandle: HTMLElement | null = null;\n #hueSlider: HTMLElement | null = null;\n #hueHandle: HTMLElement | null = null;\n #alphaSlider: HTMLElement | null = null;\n #alphaHandle: HTMLElement | null = null;\n #preview: HTMLElement | null = null;\n #input: HTMLInputElement | null = null;\n\n static observedAttributes = ['value', 'format', 'opacity', 'disabled', 'swatches', 'inline'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#parseInitialValue();\n this.#updateAll();\n }\n\n #buildMarkup(): void {\n const isInline = this.hasAttribute('inline');\n const showAlpha = this.hasAttribute('opacity');\n const swatches = this.getAttribute('swatches');\n\n // Build the picker panel\n let panelHtml = `\n <div data-ry-target=\"grid\" class=\"ry-color-picker__grid\">\n <div data-ry-target=\"grid-handle\" class=\"ry-color-picker__grid-handle\" tabindex=\"0\"></div>\n </div>\n <div data-ry-target=\"controls\" class=\"ry-color-picker__controls\">\n <div data-ry-target=\"sliders\" class=\"ry-color-picker__sliders\">\n <div data-ry-target=\"hue-slider\" class=\"ry-color-picker__slider ry-color-picker__hue\">\n <div data-ry-target=\"hue-handle\" class=\"ry-color-picker__slider-handle\" tabindex=\"0\"></div>\n </div>\n ${showAlpha ? `\n <div data-ry-target=\"alpha-slider\" class=\"ry-color-picker__slider ry-color-picker__alpha\">\n <div data-ry-target=\"alpha-handle\" class=\"ry-color-picker__slider-handle\" tabindex=\"0\"></div>\n </div>\n ` : ''}\n </div>\n <div data-ry-target=\"preview\" class=\"ry-color-picker__preview\">\n <span data-ry-target=\"preview-color\" class=\"ry-color-picker__preview-color\"></span>\n </div>\n </div>\n <div data-ry-target=\"input-row\" class=\"ry-color-picker__input-row\">\n <input data-ry-target=\"input\" type=\"text\" class=\"ry-color-picker__input\" spellcheck=\"false\" />\n <button data-ry-target=\"format-toggle\" type=\"button\" class=\"ry-color-picker__format-toggle\">${this.format.toUpperCase()}</button>\n </div>\n `;\n\n // Add swatches if provided\n if (swatches) {\n const colors = swatches.split(';').map(c => c.trim()).filter(Boolean);\n if (colors.length > 0) {\n panelHtml += `<div data-ry-target=\"swatches\" class=\"ry-color-picker__swatches\">`;\n for (const color of colors) {\n panelHtml += `<button type=\"button\" class=\"ry-color-picker__swatch\" data-color=\"${color}\" style=\"background-color: ${color}\"></button>`;\n }\n panelHtml += `</div>`;\n }\n }\n\n if (isInline) {\n // Inline mode: just show the panel\n this.innerHTML = `<div data-ry-target=\"panel\" class=\"ry-color-picker__panel ry-color-picker__panel--inline\">${panelHtml}</div>`;\n } else {\n // Dropdown mode: trigger + panel\n this.innerHTML = `\n <button data-ry-target=\"trigger\" type=\"button\" class=\"ry-color-picker__trigger\">\n <span data-ry-target=\"trigger-color\" class=\"ry-color-picker__trigger-color\"></span>\n </button>\n <div data-ry-target=\"panel\" class=\"ry-color-picker__panel\">${panelHtml}</div>\n `;\n }\n\n // Cache references\n this.#trigger = this.$('[data-ry-target=\"trigger\"]');\n this.#panel = this.$('[data-ry-target=\"panel\"]');\n this.#grid = this.$('[data-ry-target=\"grid\"]');\n this.#gridHandle = this.$('[data-ry-target=\"grid-handle\"]');\n this.#hueSlider = this.$('[data-ry-target=\"hue-slider\"]');\n this.#hueHandle = this.$('[data-ry-target=\"hue-handle\"]');\n this.#alphaSlider = this.$('[data-ry-target=\"alpha-slider\"]');\n this.#alphaHandle = this.$('[data-ry-target=\"alpha-handle\"]');\n this.#preview = this.$('[data-ry-target=\"preview\"]');\n this.#input = this.$('[data-ry-target=\"input\"]');\n }\n\n #bindEvents(): void {\n // Trigger click (dropdown mode)\n if (this.#trigger) {\n this.on(this.#trigger, 'click', this.#handleTriggerClick);\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleDocumentClick);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleDocumentKeydown);\n\n // Grid dragging\n if (this.#grid) {\n this.on(this.#grid, 'pointerdown', this.#handleGridDown);\n }\n if (this.#gridHandle) {\n this.on(this.#gridHandle, 'keydown', this.#handleGridKeydown);\n }\n\n // Hue slider\n if (this.#hueSlider) {\n this.on(this.#hueSlider, 'pointerdown', this.#handleHueDown);\n }\n if (this.#hueHandle) {\n this.on(this.#hueHandle, 'keydown', this.#handleHueKeydown);\n }\n\n // Alpha slider\n if (this.#alphaSlider) {\n this.on(this.#alphaSlider, 'pointerdown', this.#handleAlphaDown);\n }\n if (this.#alphaHandle) {\n this.on(this.#alphaHandle, 'keydown', this.#handleAlphaKeydown);\n }\n\n // Document events for drag\n this.on(document, 'pointermove', this.#handlePointerMove);\n this.on(document, 'pointerup', this.#handlePointerUp);\n\n // Input\n if (this.#input) {\n this.on(this.#input, 'change', this.#handleInputChange);\n this.on(this.#input, 'keydown', this.#handleInputKeydown);\n }\n\n // Format toggle\n const formatToggle = this.$<HTMLButtonElement>('[data-ry-target=\"format-toggle\"]');\n if (formatToggle) {\n this.on(formatToggle, 'click', this.#handleFormatToggle);\n }\n\n // Swatches\n const swatchContainer = this.$('[data-ry-target=\"swatches\"]');\n if (swatchContainer) {\n this.on(swatchContainer, 'click', this.#handleSwatchClick);\n }\n }\n\n #parseInitialValue(): void {\n const value = this.getAttribute('value');\n if (value) {\n const parsed = parseColor(value);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n this.#alpha = parsed.alpha;\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Dropdown handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleTriggerClick = (): void => {\n if (this.disabled) return;\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n };\n\n #handleDocumentClick = (e: Event): void => {\n if (this.state !== 'open') return;\n if (!this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n #handleDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.state === 'open') {\n this.close();\n this.#trigger?.focus();\n }\n };\n\n open(): void {\n if (this.hasAttribute('inline')) return;\n // Position BEFORE showing to avoid flicker\n this.#positionPanel();\n this.state = 'open';\n }\n\n close(): void {\n if (this.hasAttribute('inline')) return;\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n }\n\n #positionPanel(): void {\n if (!this.#panel || !this.#trigger) return;\n\n const triggerRect = this.#trigger.getBoundingClientRect();\n const panelHeight = 320; // Approximate panel height\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n\n // Open upward if not enough space below and more space above\n if (spaceBelow < panelHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Grid handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleGridDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingGrid = true;\n this.#gridHandle?.focus();\n this.#updateFromGridPointer(e);\n };\n\n #updateFromGridPointer(e: PointerEvent): void {\n if (!this.#grid) return;\n const rect = this.#grid.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));\n\n this.#saturation = Math.round(x * 100);\n this.#brightness = Math.round((1 - y) * 100);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleGridKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n this.#saturation = Math.min(100, this.#saturation + step);\n changed = true;\n break;\n case 'ArrowLeft':\n this.#saturation = Math.max(0, this.#saturation - step);\n changed = true;\n break;\n case 'ArrowUp':\n this.#brightness = Math.min(100, this.#brightness + step);\n changed = true;\n break;\n case 'ArrowDown':\n this.#brightness = Math.max(0, this.#brightness - step);\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Hue handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleHueDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingHue = true;\n this.#hueHandle?.focus();\n this.#updateFromHuePointer(e);\n };\n\n #updateFromHuePointer(e: PointerEvent): void {\n if (!this.#hueSlider) return;\n const rect = this.#hueSlider.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n this.#hue = Math.round(x * 360);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleHueKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n this.#hue = (this.#hue + step) % 360;\n changed = true;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n this.#hue = (this.#hue - step + 360) % 360;\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Alpha handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleAlphaDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n e.preventDefault();\n this.#draggingAlpha = true;\n this.#alphaHandle?.focus();\n this.#updateFromAlphaPointer(e);\n };\n\n #updateFromAlphaPointer(e: PointerEvent): void {\n if (!this.#alphaSlider) return;\n const rect = this.#alphaSlider.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n this.#alpha = Math.round(x * 100);\n this.#updateAll();\n this.#emitInput();\n }\n\n #handleAlphaKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n this.#alpha = Math.min(100, this.#alpha + step);\n changed = true;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n this.#alpha = Math.max(0, this.#alpha - step);\n changed = true;\n break;\n }\n\n if (changed) {\n e.preventDefault();\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Pointer move/up\n // ───────────────────────────────────────────────────────────────────────────\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (this.#draggingGrid) {\n this.#updateFromGridPointer(e);\n } else if (this.#draggingHue) {\n this.#updateFromHuePointer(e);\n } else if (this.#draggingAlpha) {\n this.#updateFromAlphaPointer(e);\n }\n };\n\n #handlePointerUp = (): void => {\n if (this.#draggingGrid || this.#draggingHue || this.#draggingAlpha) {\n this.#draggingGrid = false;\n this.#draggingHue = false;\n this.#draggingAlpha = false;\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Input handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleInputChange = (): void => {\n if (!this.#input) return;\n const parsed = parseColor(this.#input.value);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n this.#emitChange();\n } else {\n // Reset to current value on invalid input\n this.#updateInput();\n }\n };\n\n #handleInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#handleInputChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Format toggle\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleFormatToggle = (): void => {\n const formats: ColorFormat[] = ['hex', 'rgb', 'hsl'];\n const current = this.format;\n const idx = formats.indexOf(current);\n const next = formats[(idx + 1) % formats.length]!;\n this.format = next;\n\n const btn = this.$<HTMLButtonElement>('[data-ry-target=\"format-toggle\"]');\n if (btn) btn.textContent = next.toUpperCase();\n\n this.#updateInput();\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Swatches\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleSwatchClick = (e: Event): void => {\n const target = e.target as HTMLElement;\n if (target.classList.contains('ry-color-picker__swatch')) {\n const color = target.dataset.color;\n if (color) {\n const parsed = parseColor(color);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n this.#emitInput();\n this.#emitChange();\n }\n }\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Update methods\n // ───────────────────────────────────────────────────────────────────────────\n\n #updateAll(): void {\n this.#updateTrigger();\n this.#updateGrid();\n this.#updateHueSlider();\n this.#updateAlphaSlider();\n this.#updatePreview();\n this.#updateInput();\n this.#syncValueAttribute();\n }\n\n #updateTrigger(): void {\n const triggerColor = this.$('[data-ry-target=\"trigger-color\"]');\n if (triggerColor) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const alpha = this.hasAttribute('opacity') ? this.#alpha / 100 : 1;\n (triggerColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #updateGrid(): void {\n if (this.#grid) {\n // Set grid background to current hue at full saturation\n const rgb = hsvToRgb({ h: this.#hue, s: 100, v: 100 });\n this.#grid.style.setProperty('--grid-hue-color', `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`);\n }\n if (this.#gridHandle) {\n this.#gridHandle.style.left = `${this.#saturation}%`;\n this.#gridHandle.style.top = `${100 - this.#brightness}%`;\n }\n }\n\n #updateHueSlider(): void {\n if (this.#hueHandle) {\n this.#hueHandle.style.left = `${(this.#hue / 360) * 100}%`;\n }\n }\n\n #updateAlphaSlider(): void {\n if (this.#alphaSlider) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n this.#alphaSlider.style.setProperty('--alpha-color', `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`);\n }\n if (this.#alphaHandle) {\n this.#alphaHandle.style.left = `${this.#alpha}%`;\n }\n }\n\n #updatePreview(): void {\n const previewColor = this.$('[data-ry-target=\"preview-color\"]');\n if (previewColor) {\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const alpha = this.hasAttribute('opacity') ? this.#alpha / 100 : 1;\n (previewColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #updateInput(): void {\n if (this.#input) {\n this.#input.value = this.#formatValue();\n }\n }\n\n #syncValueAttribute(): void {\n // Update the value attribute without triggering attributeChangedCallback loop\n const formatted = this.#formatValue();\n if (this.getAttribute('value') !== formatted) {\n this.setAttribute('value', formatted);\n }\n }\n\n #formatValue(): string {\n const format = this.format;\n const rgb = hsvToRgb({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n const showAlpha = this.hasAttribute('opacity');\n\n switch (format) {\n case 'hex': {\n const hex = rgbToHex(rgb);\n if (showAlpha && this.#alpha < 100) {\n const alphaHex = Math.round((this.#alpha / 100) * 255).toString(16).padStart(2, '0');\n return hex + alphaHex;\n }\n return hex;\n }\n case 'rgb': {\n if (showAlpha) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${(this.#alpha / 100).toFixed(2)})`;\n }\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n }\n case 'hsl': {\n const hsl = hsvToHsl({ h: this.#hue, s: this.#saturation, v: this.#brightness });\n if (showAlpha) {\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${(this.#alpha / 100).toFixed(2)})`;\n }\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n default:\n return rgbToHex(rgb);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Events\n // ───────────────────────────────────────────────────────────────────────────\n\n #emitInput(): void {\n this.emit('input', { value: this.value, hsv: this.hsv, rgb: this.rgb });\n }\n\n #emitChange(): void {\n this.emit('change', { value: this.value, hsv: this.hsv, rgb: this.rgb });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Attribute changed\n // ───────────────────────────────────────────────────────────────────────────\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'value' && this.#grid) {\n // External value change - parse and update\n if (newValue) {\n const parsed = parseColor(newValue);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateTrigger();\n this.#updateGrid();\n this.#updateHueSlider();\n this.#updateAlphaSlider();\n this.#updatePreview();\n // Don't update input here to avoid cursor issues during typing\n }\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────────────────\n\n get value(): string {\n return this.#formatValue();\n }\n\n set value(val: string) {\n const parsed = parseColor(val);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n }\n }\n\n get format(): ColorFormat {\n return (this.getAttribute('format') as ColorFormat) || 'hex';\n }\n\n set format(val: ColorFormat) {\n this.setAttribute('format', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get hsv(): HSV {\n return { h: this.#hue, s: this.#saturation, v: this.#brightness };\n }\n\n get rgb(): RGB {\n return hsvToRgb(this.hsv);\n }\n\n get hsl(): HSL {\n return hsvToHsl(this.hsv);\n }\n\n get alpha(): number {\n return this.#alpha;\n }\n\n set alpha(val: number) {\n this.#alpha = Math.max(0, Math.min(100, val));\n this.#updateAll();\n }\n\n /** Set color from any valid color string */\n setColor(colorString: string): boolean {\n const parsed = parseColor(colorString);\n if (parsed) {\n this.#hue = parsed.hsv.h;\n this.#saturation = parsed.hsv.s;\n this.#brightness = parsed.hsv.v;\n if (this.hasAttribute('opacity')) {\n this.#alpha = parsed.alpha;\n }\n this.#updateAll();\n return true;\n }\n return false;\n }\n\n /** Get color in specific format */\n getFormattedValue(format: ColorFormat): string {\n const originalFormat = this.format;\n this.format = format;\n const value = this.#formatValue();\n this.format = originalFormat;\n return value;\n }\n}\n\ncustomElements.define('ry-color-picker', RyColorPicker);\n","/**\n * <ry-color-input>\n *\n * Input-style color picker with swatch preview and editable hex value.\n * Composes ry-color-picker internally for the picker panel.\n *\n * Usage:\n * <ry-color-input value=\"#ff0000\"></ry-color-input>\n * <ry-color-input value=\"#ff0000\" opacity></ry-color-input>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport type { RyColorPicker, RGB, HSL, HSV } from './ry-color-picker.js';\n\nexport class RyColorInput extends RyElement {\n #swatch: HTMLElement | null = null;\n #input: HTMLInputElement | null = null;\n #panel: HTMLElement | null = null;\n #picker: RyColorPicker | null = null;\n\n static observedAttributes = ['value', 'format', 'opacity', 'disabled', 'placeholder'] as const;\n\n setup(): void {\n this.#buildMarkup();\n this.#bindEvents();\n this.#syncFromValue();\n // Start closed\n this.state = 'closed';\n }\n\n #buildMarkup(): void {\n const showAlpha = this.hasAttribute('opacity');\n const format = this.getAttribute('format') || 'hex';\n const value = this.getAttribute('value') || '#000000';\n const placeholder = this.getAttribute('placeholder') || '#000000';\n\n this.innerHTML = `\n <div data-ry-target=\"trigger\" class=\"ry-color-input__trigger\">\n <button data-ry-target=\"swatch\" type=\"button\" class=\"ry-color-input__swatch\">\n <span data-ry-target=\"swatch-color\" class=\"ry-color-input__swatch-color\"></span>\n </button>\n <input\n data-ry-target=\"input\"\n type=\"text\"\n class=\"ry-color-input__input\"\n value=\"${value.startsWith('#') ? value : '#' + value}\"\n placeholder=\"${placeholder.startsWith('#') ? placeholder : '#' + placeholder}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"7\"\n />\n </div>\n <div data-ry-target=\"panel\" class=\"ry-color-input__panel\">\n <ry-color-picker\n data-ry-target=\"picker\"\n inline\n value=\"${value}\"\n format=\"${format}\"\n ${showAlpha ? 'opacity' : ''}\n ></ry-color-picker>\n </div>\n `;\n\n this.#swatch = this.$('[data-ry-target=\"swatch\"]');\n this.#input = this.$('[data-ry-target=\"input\"]');\n this.#panel = this.$('[data-ry-target=\"panel\"]');\n this.#picker = this.$('[data-ry-target=\"picker\"]') as RyColorPicker;\n }\n\n #bindEvents(): void {\n // Swatch click opens/closes panel\n if (this.#swatch) {\n this.on(this.#swatch, 'click', this.#handleSwatchClick);\n }\n\n // Input changes update the picker\n if (this.#input) {\n this.on(this.#input, 'input', this.#handleInputChange);\n this.on(this.#input, 'keydown', this.#handleInputKeydown);\n this.on(this.#input, 'focus', this.#handleInputFocus);\n }\n\n // Picker changes update the input\n if (this.#picker) {\n this.on(this.#picker, 'ry:input', this.#handlePickerInput);\n this.on(this.#picker, 'ry:change', this.#handlePickerChange);\n }\n\n // Click outside to close\n this.on(document, 'click', this.#handleDocumentClick);\n\n // Escape to close\n this.on(document, 'keydown', this.#handleDocumentKeydown);\n }\n\n #handleSwatchClick = (): void => {\n if (this.disabled) return;\n if (this.state === 'open') {\n this.close();\n } else {\n this.open();\n }\n };\n\n #handleInputFocus = (): void => {\n if (this.disabled) return;\n this.open();\n };\n\n #handleInputChange = (): void => {\n if (!this.#input || !this.#picker) return;\n\n let value = this.#input.value;\n const cursorPos = this.#input.selectionStart ?? value.length;\n\n // Filter to only # and hex characters\n const filtered = value.replace(/[^#a-fA-F0-9]/g, '');\n\n // Normalize: ensure single # at start\n const hexPart = filtered.replace(/#/g, '').slice(0, 6);\n const normalized = '#' + hexPart;\n\n // Only update input if we actually changed something\n if (value !== normalized) {\n this.#input.value = normalized;\n // Keep cursor in reasonable position\n const newPos = Math.min(cursorPos, normalized.length);\n this.#input.setSelectionRange(newPos, newPos);\n }\n\n // Update picker with expanded color\n const expanded = this.#expandPartialHex(normalized);\n if (expanded) {\n this.#picker.setColor(expanded);\n this.#updateSwatch();\n if (this.#isCompleteColor(normalized)) {\n this.#syncValueAttribute();\n }\n this.emit('input', { value: this.value });\n }\n };\n\n #expandPartialHex(value: string): string | null {\n let color = value;\n if (!color.startsWith('#')) color = '#' + color;\n\n const hex = color.slice(1);\n if (!/^[a-fA-F0-9]+$/.test(hex) || hex.length === 0) {\n return null;\n }\n\n // 6 chars - use as-is\n if (hex.length === 6) {\n return color;\n }\n\n // 1-3 chars - pad to 3, then CSS shorthand expand\n // #f → #fff → #ffffff\n // #fa → #faa → #ffaaaa\n // #f00 → #ff0000\n if (hex.length <= 3) {\n const padded = hex.padEnd(3, hex[hex.length - 1]!);\n const [r, g, b] = padded.split('');\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n\n // 4-5 chars - pad with zeros\n // #f00a → #f00a00\n // #f00ab → #f00ab0\n return '#' + hex.padEnd(6, '0');\n }\n\n #isCompleteColor(value: string): boolean {\n // Only 3 or 6 char hex are \"complete\"\n if (/^#[a-fA-F0-9]{6}$/.test(value)) return true;\n if (/^#[a-fA-F0-9]{3}$/.test(value)) return true;\n return false;\n }\n\n #handleInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#handleInputChange();\n this.emit('change', { value: this.value });\n }\n };\n\n #handlePickerInput = (): void => {\n if (!this.#picker || !this.#input) return;\n\n // Don't overwrite input if user is typing in it\n if (document.activeElement !== this.#input) {\n this.#input.value = this.#picker.value;\n }\n\n this.#updateSwatch();\n this.#syncValueAttribute();\n this.emit('input', { value: this.value });\n };\n\n #handlePickerChange = (): void => {\n this.emit('change', { value: this.value });\n };\n\n #handleDocumentClick = (e: Event): void => {\n if (this.state !== 'open') return;\n if (!this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n #handleDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.state === 'open') {\n this.close();\n this.#swatch?.focus();\n }\n };\n\n open(): void {\n this.#positionPanel();\n this.state = 'open';\n }\n\n close(): void {\n this.state = 'closed';\n this.removeAttribute('data-ry-position');\n }\n\n #positionPanel(): void {\n if (!this.#panel) return;\n\n const rect = this.getBoundingClientRect();\n const panelHeight = 280;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < panelHeight && spaceAbove > spaceBelow) {\n this.setAttribute('data-ry-position', 'top');\n } else {\n this.setAttribute('data-ry-position', 'bottom');\n }\n }\n\n #updateSwatch(): void {\n const swatchColor = this.$('[data-ry-target=\"swatch-color\"]');\n if (swatchColor && this.#picker) {\n const rgb = this.#picker.rgb;\n const alpha = this.hasAttribute('opacity') ? this.#picker.alpha / 100 : 1;\n (swatchColor as HTMLElement).style.backgroundColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n }\n\n #syncFromValue(): void {\n const value = this.getAttribute('value') || '#000000';\n if (this.#picker) {\n this.#picker.setColor(value);\n if (this.#input) {\n // Always show as hex with #\n const hex = this.#picker.value;\n this.#input.value = hex.startsWith('#') ? hex : '#' + hex;\n }\n this.#updateSwatch();\n }\n }\n\n #syncValueAttribute(): void {\n if (this.#picker) {\n const formatted = this.#picker.value;\n if (this.getAttribute('value') !== formatted) {\n this.setAttribute('value', formatted);\n }\n }\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (name === 'value' && this.#picker && this.#input) {\n if (newValue) {\n this.#picker.setColor(newValue);\n // Don't overwrite input if user is typing\n if (document.activeElement !== this.#input) {\n this.#input.value = this.#picker.value;\n }\n this.#updateSwatch();\n }\n }\n\n if (name === 'disabled') {\n if (this.#input) {\n if (newValue !== null) {\n this.#input.setAttribute('disabled', '');\n } else {\n this.#input.removeAttribute('disabled');\n }\n }\n }\n }\n\n // Public API\n get value(): string {\n return this.#picker?.value ?? this.getAttribute('value') ?? '#000000';\n }\n\n set value(val: string) {\n if (this.#picker?.setColor(val)) {\n if (this.#input) {\n this.#input.value = this.#picker.value;\n }\n this.#updateSwatch();\n this.#syncValueAttribute();\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get rgb(): RGB {\n return this.#picker?.rgb ?? { r: 0, g: 0, b: 0 };\n }\n\n get hsl(): HSL {\n return this.#picker?.hsl ?? { h: 0, s: 0, l: 0 };\n }\n\n get hsv(): HSV {\n return this.#picker?.hsv ?? { h: 0, s: 0, v: 0 };\n }\n}\n\ncustomElements.define('ry-color-input', RyColorInput);\n","/**\n * <ry-gradient-picker>\n *\n * Gradient editor with draggable color stops, type toggle, and inline color picker.\n * Supports linear and radial gradients with unlimited stops.\n *\n * Usage:\n * <ry-gradient-picker value=\"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\"></ry-gradient-picker>\n * <ry-gradient-picker value=\"radial-gradient(circle, #ff0000 0%, #00ff00 50%, #0000ff 100%)\"></ry-gradient-picker>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\nimport type { RyColorPicker } from './ry-color-picker.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface GradientStop {\n id: string;\n color: string;\n position: number; // 0-100\n}\n\nexport type GradientType = 'solid' | 'linear' | 'radial';\nexport type RadialShape = 'circle' | 'ellipse';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Minimal color parsing for interpolation (avoids touching ry-color-picker)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SimpleRGB { r: number; g: number; b: number }\n\nfunction parseColorToRgb(str: string): SimpleRGB | null {\n const s = str.trim().toLowerCase();\n\n // Hex\n if (s.startsWith('#')) {\n const hex = s.slice(1);\n if (hex.length === 3) {\n return {\n r: parseInt(hex[0]! + hex[0]!, 16),\n g: parseInt(hex[1]! + hex[1]!, 16),\n b: parseInt(hex[2]! + hex[2]!, 16),\n };\n }\n if (hex.length >= 6) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n return null;\n }\n\n // rgb/rgba\n const rgbMatch = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/.exec(s);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1]!, 10),\n g: parseInt(rgbMatch[2]!, 10),\n b: parseInt(rgbMatch[3]!, 10),\n };\n }\n\n // hsl/hsla → convert to RGB\n const hslMatch = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/.exec(s);\n if (hslMatch) {\n const h = parseFloat(hslMatch[1]!) / 360;\n const sat = parseFloat(hslMatch[2]!) / 100;\n const l = parseFloat(hslMatch[3]!) / 100;\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + sat) : l + sat - l * sat;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n}\n\nfunction rgbToHex(rgb: SimpleRGB): string {\n const toHex = (n: number) => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\nfunction lerpRgb(a: SimpleRGB, b: SimpleRGB, t: number): SimpleRGB {\n return {\n r: Math.round(a.r + (b.r - a.r) * t),\n g: Math.round(a.g + (b.g - a.g) * t),\n b: Math.round(a.b + (b.b - a.b) * t),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_VALUE = 'linear-gradient(90deg, #000000 0%, #ffffff 100%)';\nconst DRAG_OFF_THRESHOLD = 50; // px vertical distance to trigger delete\n\nexport class RyGradientPicker extends RyElement {\n #type: GradientType = 'linear';\n #angle = 90;\n #shape: RadialShape = 'circle';\n #stops: GradientStop[] = [];\n #selectedStopId: string | null = null;\n #nextStopId = 0;\n\n #draggingStopId: string | null = null;\n #draggingOffBar = false;\n #barRect: DOMRect | null = null;\n #syncing = false;\n\n // Cached DOM refs\n #bar: HTMLElement | null = null;\n #picker: RyColorPicker | null = null;\n #outputInput: HTMLInputElement | null = null;\n\n static observedAttributes = ['value', 'disabled', 'output'] as const;\n\n setup(): void {\n this.#parseInitialValue();\n this.#buildMarkup();\n this.#bindEvents();\n this.#updateAll();\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Parsing / Serialization\n // ───────────────────────────────────────────────────────────────────────────\n\n #parseInitialValue(): void {\n const val = this.getAttribute('value') || DEFAULT_VALUE;\n if (!this.#parseGradient(val)) {\n this.#parseGradient(DEFAULT_VALUE);\n }\n }\n\n #parseGradient(css: string): boolean {\n const str = css.trim();\n\n // Solid color (not a gradient function)\n if (!str.startsWith('linear-gradient(') && !str.startsWith('radial-gradient(')) {\n const rgb = parseColorToRgb(str);\n if (!rgb) return false;\n this.#type = 'solid';\n this.#stops = [this.#createStop(str, 0), this.#createStop(str, 100)];\n this.#selectedStopId = this.#stops[0]!.id;\n return true;\n }\n\n let type: GradientType;\n let inner: string;\n\n if (str.startsWith('linear-gradient(')) {\n type = 'linear';\n inner = str.slice('linear-gradient('.length, -1);\n } else {\n type = 'radial';\n inner = str.slice('radial-gradient('.length, -1);\n }\n\n // Parse direction/shape from the start of inner\n let angle = 90;\n let shape: RadialShape = 'circle';\n let stopsStr = inner;\n\n if (type === 'linear') {\n // Match angle: \"90deg\" or \"to right\" etc.\n const angleMatch = /^([\\d.]+)deg\\s*,\\s*/.exec(inner);\n if (angleMatch) {\n angle = parseFloat(angleMatch[1]!);\n stopsStr = inner.slice(angleMatch[0].length);\n } else {\n const toMatch = /^to\\s+\\w+(?:\\s+\\w+)?\\s*,\\s*/.exec(inner);\n if (toMatch) {\n // Convert \"to right\" → 90deg, etc. (simplified)\n const dir = toMatch[0].trim().replace(/,\\s*$/, '');\n angle = this.#directionToAngle(dir);\n stopsStr = inner.slice(toMatch[0].length);\n }\n }\n } else {\n // Radial: match \"circle\" or \"ellipse\" at start\n const shapeMatch = /^(circle|ellipse)(?:\\s+at\\s+[^,]+)?\\s*,\\s*/.exec(inner);\n if (shapeMatch) {\n shape = shapeMatch[1] as RadialShape;\n stopsStr = inner.slice(shapeMatch[0].length);\n }\n }\n\n // Parse color stops\n const stops: GradientStop[] = [];\n // Match colors followed by optional percentage\n // This regex handles: #hex, rgb(...), rgba(...), hsl(...), hsla(...), named colors\n const stopRegex = /(#[a-fA-F0-9]{3,8}|rgba?\\([^)]+\\)|hsla?\\([^)]+\\)|[a-z]+)\\s+([\\d.]+)%/g;\n let match: RegExpExecArray | null;\n\n while ((match = stopRegex.exec(stopsStr)) !== null) {\n stops.push(this.#createStop(match[1]!, parseFloat(match[2]!)));\n }\n\n if (stops.length < 2) return false;\n\n this.#type = type;\n this.#angle = angle;\n this.#shape = shape;\n this.#stops = stops;\n this.#selectedStopId = stops[0]!.id;\n return true;\n }\n\n #directionToAngle(dir: string): number {\n const map: Record<string, number> = {\n 'to top': 0, 'to top right': 45, 'to right': 90,\n 'to bottom right': 135, 'to bottom': 180, 'to bottom left': 225,\n 'to left': 270, 'to top left': 315,\n };\n return map[dir] ?? 90;\n }\n\n #serializeGradient(): string {\n if (this.#type === 'solid') {\n return this.#stops[0]?.color ?? '#000000';\n }\n\n const stopsStr = this.#stops\n .map(s => `${s.color} ${Math.round(s.position)}%`)\n .join(', ');\n\n if (this.#type === 'linear') {\n return `linear-gradient(${Math.round(this.#angle)}deg, ${stopsStr})`;\n }\n return `radial-gradient(${this.#shape}, ${stopsStr})`;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Stop management\n // ───────────────────────────────────────────────────────────────────────────\n\n #createStop(color: string, position: number): GradientStop {\n return { id: `stop-${this.#nextStopId++}`, color, position };\n }\n\n /** CSS left value clamped so the stop handle stays within the bar */\n #stopLeft(position: number): string {\n const half = 'calc(var(--ry-gradient-picker-stop-size, 16px) / 2)';\n return `clamp(${half}, ${position}%, calc(100% - ${half}))`;\n }\n\n #addStop(color: string, position: number): void {\n const stop = this.#createStop(color, position);\n this.#stops.push(stop);\n this.#sortStops();\n this.#selectedStopId = stop.id;\n this.#renderStops();\n this.#updateAll();\n }\n\n #removeStop(id: string): boolean {\n if (this.#stops.length <= 2) return false;\n const idx = this.#stops.findIndex(s => s.id === id);\n if (idx === -1) return false;\n\n this.#stops.splice(idx, 1);\n\n // Select a neighbor if we removed the selected stop\n if (this.#selectedStopId === id) {\n this.#selectedStopId = this.#stops[Math.min(idx, this.#stops.length - 1)]?.id ?? null;\n }\n\n this.#renderStops();\n this.#updateAll();\n return true;\n }\n\n #selectStop(id: string): void {\n if (this.#selectedStopId === id) return;\n this.#selectedStopId = id;\n this.#updateStopSelection();\n this.#updatePicker();\n }\n\n #sortStops(): void {\n this.#stops.sort((a, b) => a.position - b.position);\n }\n\n #getSelectedStop(): GradientStop | null {\n return this.#stops.find(s => s.id === this.#selectedStopId) ?? null;\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Markup\n // ───────────────────────────────────────────────────────────────────────────\n\n #buildMarkup(): void {\n const showOutput = this.hasAttribute('output');\n const copyIcon = getIcon('copy');\n const solidIcon = getIcon('gradient-solid');\n const linearIcon = getIcon('gradient-linear');\n const radialIcon = getIcon('gradient-radial');\n const circleIcon = getIcon('shape-circle');\n const ellipseIcon = getIcon('shape-ellipse');\n\n let outputHtml = '';\n if (showOutput) {\n outputHtml = `\n <div data-ry-target=\"output-row\" class=\"ry-gradient-picker__output-row\">\n <input data-ry-target=\"output\" type=\"text\" class=\"ry-gradient-picker__output\" spellcheck=\"false\" />\n <button data-ry-target=\"copy-btn\" type=\"button\" class=\"ry-gradient-picker__copy-btn\">${copyIcon}</button>\n </div>`;\n }\n\n this.innerHTML = `\n <div data-ry-target=\"controls\" class=\"ry-gradient-picker__controls\">\n <div data-ry-target=\"type-toggle\" class=\"ry-gradient-picker__type-toggle\">\n <button data-ry-target=\"type-solid\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${solidIcon}</button>\n <button data-ry-target=\"type-linear\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${linearIcon}</button>\n <button data-ry-target=\"type-radial\" type=\"button\" class=\"ry-gradient-picker__type-btn\">${radialIcon}</button>\n </div>\n <div data-ry-target=\"angle-control\" class=\"ry-gradient-picker__angle-control\">\n <ry-number-select data-ry-target=\"angle-select\" min=\"0\" max=\"360\" step=\"1\" value=\"${this.#angle}\" wrap suffix=\"\\u00b0\" size=\"xs\" arrows=\"none\"></ry-number-select>\n </div>\n <div data-ry-target=\"shape-control\" class=\"ry-gradient-picker__shape-control\">\n <button data-ry-target=\"shape-circle\" type=\"button\" class=\"ry-gradient-picker__shape-btn\">${circleIcon}</button>\n <button data-ry-target=\"shape-ellipse\" type=\"button\" class=\"ry-gradient-picker__shape-btn\">${ellipseIcon}</button>\n </div>\n </div>\n <div data-ry-target=\"bar-container\" class=\"ry-gradient-picker__bar-container\">\n <div data-ry-target=\"bar\" class=\"ry-gradient-picker__bar\"></div>\n </div>\n <ry-color-picker data-ry-target=\"picker\" inline opacity></ry-color-picker>\n ${outputHtml}\n `;\n\n // Cache refs\n this.#bar = this.$('[data-ry-target=\"bar\"]');\n this.#picker = this.$('[data-ry-target=\"picker\"]') as RyColorPicker;\n this.#outputInput = this.$('[data-ry-target=\"output\"]') as HTMLInputElement | null;\n\n // Render stop handles on the bar\n this.#renderStops();\n }\n\n #renderStops(): void {\n if (!this.#bar) return;\n\n // Remove existing stop handles\n this.#bar.querySelectorAll('[data-ry-target=\"stop\"]').forEach(el => el.remove());\n\n // Create stop handles\n for (const stop of this.#stops) {\n const el = document.createElement('div');\n el.setAttribute('data-ry-target', 'stop');\n el.setAttribute('data-stop-id', stop.id);\n el.classList.add('ry-gradient-picker__stop');\n el.tabIndex = 0;\n el.style.left = this.#stopLeft(stop.position);\n el.style.setProperty('--stop-color', stop.color);\n if (stop.id === this.#selectedStopId) {\n el.setAttribute('data-selected', '');\n }\n this.#bar.appendChild(el);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Event binding\n // ───────────────────────────────────────────────────────────────────────────\n\n #bindEvents(): void {\n // Bar: click to add, pointerdown on stops, drag and release\n if (this.#bar) {\n this.on(this.#bar, 'pointerdown', this.#handleBarDown);\n this.on(this.#bar, 'pointermove', this.#handlePointerMove);\n this.on(this.#bar, 'pointerup', this.#handlePointerUp);\n this.on(this.#bar, 'lostpointercapture', this.#handlePointerUp);\n }\n\n // Type toggle\n const solidBtn = this.$('[data-ry-target=\"type-solid\"]');\n const linearBtn = this.$('[data-ry-target=\"type-linear\"]');\n const radialBtn = this.$('[data-ry-target=\"type-radial\"]');\n if (solidBtn) this.on(solidBtn, 'click', () => this.#handleTypeToggle('solid'));\n if (linearBtn) this.on(linearBtn, 'click', () => this.#handleTypeToggle('linear'));\n if (radialBtn) this.on(radialBtn, 'click', () => this.#handleTypeToggle('radial'));\n\n // Angle select\n const angleSelect = this.$('[data-ry-target=\"angle-select\"]');\n if (angleSelect) this.on(angleSelect, 'ry:input', this.#handleAngleInput);\n\n // Shape toggle\n const circleBtn = this.$('[data-ry-target=\"shape-circle\"]');\n const ellipseBtn = this.$('[data-ry-target=\"shape-ellipse\"]');\n if (circleBtn) this.on(circleBtn, 'click', () => this.#handleShapeToggle('circle'));\n if (ellipseBtn) this.on(ellipseBtn, 'click', () => this.#handleShapeToggle('ellipse'));\n\n // Color picker\n if (this.#picker) {\n this.on(this.#picker, 'ry:input', this.#handlePickerInput);\n this.on(this.#picker, 'ry:change', this.#handlePickerChange);\n }\n\n // Output input (editable CSS)\n if (this.#outputInput) {\n this.on(this.#outputInput, 'keydown', this.#handleOutputKeydown);\n this.on(this.#outputInput, 'blur', this.#handleOutputBlur);\n }\n\n // Copy button\n const copyBtn = this.$('[data-ry-target=\"copy-btn\"]');\n if (copyBtn) this.on(copyBtn, 'click', this.#handleCopy);\n\n // Keyboard on bar (delegated from stop handles)\n if (this.#bar) {\n this.on(this.#bar, 'keydown', this.#handleStopKeydown);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Bar / Stop interaction handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleBarDown = (e: PointerEvent): void => {\n if (this.disabled) return;\n\n const target = e.target as HTMLElement;\n const stopEl = target.closest('[data-ry-target=\"stop\"]') as HTMLElement | null;\n\n if (stopEl) {\n // Start dragging existing stop\n const stopId = stopEl.getAttribute('data-stop-id');\n if (!stopId) return;\n e.preventDefault();\n this.#draggingStopId = stopId;\n this.#draggingOffBar = false;\n this.#barRect = this.#bar!.getBoundingClientRect();\n this.#selectStop(stopId);\n this.#bar!.setPointerCapture(e.pointerId);\n stopEl.focus();\n } else {\n // Click on empty bar → add stop and start dragging it\n e.preventDefault();\n if (!this.#bar) return;\n const rect = this.#bar.getBoundingClientRect();\n const position = Math.round(Math.max(0, Math.min(100, ((e.clientX - rect.left) / rect.width) * 100)));\n const color = this.#interpolateColorAt(position);\n this.#addStop(color, position);\n const newStopEl = this.#bar.querySelector(`[data-stop-id=\"${this.#selectedStopId}\"]`) as HTMLElement | null;\n newStopEl?.focus();\n // Start dragging the new stop immediately\n this.#draggingStopId = this.#selectedStopId;\n this.#draggingOffBar = false;\n this.#barRect = rect;\n this.#bar.setPointerCapture(e.pointerId);\n this.#emitInput();\n }\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#draggingStopId || !this.#barRect) return;\n\n const stop = this.#stops.find(s => s.id === this.#draggingStopId);\n if (!stop) return;\n\n // Horizontal: position\n const x = Math.max(0, Math.min(1, (e.clientX - this.#barRect.left) / this.#barRect.width));\n stop.position = Math.round(x * 100);\n\n // Vertical: detect drag-off for deletion\n const barCenterY = this.#barRect.top + this.#barRect.height / 2;\n const yDist = Math.abs(e.clientY - barCenterY);\n this.#draggingOffBar = yDist > DRAG_OFF_THRESHOLD && this.#stops.length > 2;\n\n // Update the stop handle\n const stopEl = this.#bar?.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (stopEl) {\n stopEl.style.left = this.#stopLeft(stop.position);\n if (this.#draggingOffBar) {\n stopEl.style.opacity = '0.3';\n stopEl.style.transform = 'translate(-50%, -50%) scale(0.7)';\n } else {\n stopEl.style.opacity = '';\n stopEl.style.transform = '';\n }\n }\n\n this.#sortStops();\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#emitInput();\n };\n\n #handlePointerUp = (): void => {\n if (!this.#draggingStopId) return;\n\n if (this.#draggingOffBar) {\n this.#removeStop(this.#draggingStopId);\n }\n\n this.#draggingStopId = null;\n this.#draggingOffBar = false;\n this.#barRect = null;\n this.#syncValueAttribute();\n this.#emitChange();\n };\n\n #handleStopKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n const target = e.target as HTMLElement;\n const stopEl = target.closest('[data-ry-target=\"stop\"]') as HTMLElement | null;\n if (!stopEl) return;\n\n const stopId = stopEl.getAttribute('data-stop-id');\n if (!stopId) return;\n\n const stop = this.#stops.find(s => s.id === stopId);\n if (!stop) return;\n\n const step = e.shiftKey ? 10 : 1;\n let changed = false;\n\n switch (e.key) {\n case 'ArrowRight':\n stop.position = Math.min(100, stop.position + step);\n changed = true;\n break;\n case 'ArrowLeft':\n stop.position = Math.max(0, stop.position - step);\n changed = true;\n break;\n case 'Delete':\n case 'Backspace':\n if (this.#removeStop(stopId)) {\n this.#emitInput();\n this.#emitChange();\n }\n e.preventDefault();\n return;\n }\n\n if (changed) {\n e.preventDefault();\n this.#sortStops();\n this.#updateStopPositions();\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Type / Angle / Shape handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleTypeToggle(type: GradientType): void {\n if (this.#type === type) return;\n this.#type = type;\n this.setAttribute('data-ry-type', type);\n this.#updateControls();\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n #handleAngleInput = (e: Event): void => {\n const detail = (e as CustomEvent).detail as { value: number };\n this.#angle = detail.value;\n this.#updatePreview();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n };\n\n #handleShapeToggle(shape: RadialShape): void {\n if (this.#shape === shape) return;\n this.#shape = shape;\n this.#updateControls();\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Color picker handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handlePickerInput = (): void => {\n const stop = this.#getSelectedStop();\n if (!stop || !this.#picker) return;\n\n stop.color = this.#picker.value;\n this.#updateStopColor(stop);\n this.#updateBar();\n this.#updatePreview();\n this.#updateOutput();\n this.#emitInput();\n };\n\n #handlePickerChange = (): void => {\n this.#syncValueAttribute();\n this.#emitChange();\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Copy handler\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleCopy = (): void => {\n const text = this.#serializeGradient();\n navigator.clipboard.writeText(text).then(() => {\n const btn = this.$('[data-ry-target=\"copy-btn\"]');\n if (btn) {\n btn.setAttribute('data-copied', '');\n setTimeout(() => btn.removeAttribute('data-copied'), 1500);\n }\n });\n };\n\n // ───────────────────────────────────────────────────────────────────────────\n // Output (editable CSS) handlers\n // ───────────────────────────────────────────────────────────────────────────\n\n #handleOutputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.#applyOutputValue();\n }\n };\n\n #handleOutputBlur = (): void => {\n this.#applyOutputValue();\n };\n\n #applyOutputValue(): void {\n if (!this.#outputInput) return;\n const val = this.#outputInput.value.trim();\n if (val && this.#parseGradient(val)) {\n this.#renderStops();\n this.#updateAll();\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n } else {\n // Reset to current value on invalid input\n this.#updateOutput();\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Color interpolation\n // ───────────────────────────────────────────────────────────────────────────\n\n #interpolateColorAt(position: number): string {\n if (this.#stops.length === 0) return '#808080';\n if (this.#stops.length === 1) return this.#stops[0]!.color;\n\n const sorted = [...this.#stops].sort((a, b) => a.position - b.position);\n\n // Before first or after last\n if (position <= sorted[0]!.position) return sorted[0]!.color;\n if (position >= sorted[sorted.length - 1]!.position) return sorted[sorted.length - 1]!.color;\n\n // Find bracketing stops\n let left = sorted[0]!;\n let right = sorted[1]!;\n for (let i = 0; i < sorted.length - 1; i++) {\n if (sorted[i]!.position <= position && sorted[i + 1]!.position >= position) {\n left = sorted[i]!;\n right = sorted[i + 1]!;\n break;\n }\n }\n\n const range = right.position - left.position;\n if (range === 0) return left.color;\n const t = (position - left.position) / range;\n\n const rgbA = parseColorToRgb(left.color);\n const rgbB = parseColorToRgb(right.color);\n if (!rgbA || !rgbB) return left.color;\n\n return rgbToHex(lerpRgb(rgbA, rgbB, t));\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Update methods\n // ───────────────────────────────────────────────────────────────────────────\n\n #updateAll(): void {\n this.setAttribute('data-ry-type', this.#type);\n this.#updateControls();\n this.#updateBar();\n this.#updatePreview();\n this.#updateStopPositions();\n this.#updateStopSelection();\n this.#updatePicker();\n this.#updateOutput();\n }\n\n #updateControls(): void {\n // Type toggle active state\n const solidBtn = this.$('[data-ry-target=\"type-solid\"]');\n const linearBtn = this.$('[data-ry-target=\"type-linear\"]');\n const radialBtn = this.$('[data-ry-target=\"type-radial\"]');\n if (solidBtn) solidBtn.toggleAttribute('data-active', this.#type === 'solid');\n if (linearBtn) linearBtn.toggleAttribute('data-active', this.#type === 'linear');\n if (radialBtn) radialBtn.toggleAttribute('data-active', this.#type === 'radial');\n\n // Shape toggle active state\n const circleBtn = this.$('[data-ry-target=\"shape-circle\"]');\n const ellipseBtn = this.$('[data-ry-target=\"shape-ellipse\"]');\n if (circleBtn) circleBtn.toggleAttribute('data-active', this.#shape === 'circle');\n if (ellipseBtn) ellipseBtn.toggleAttribute('data-active', this.#shape === 'ellipse');\n\n // Angle select sync\n const angleSelect = this.$('[data-ry-target=\"angle-select\"]');\n if (angleSelect) angleSelect.setAttribute('value', String(this.#angle));\n }\n\n #updatePreview(): void {\n if (!this.#picker) return;\n const swatch = this.#picker.querySelector('[data-ry-target=\"preview-color\"]') as HTMLElement | null;\n if (swatch) {\n swatch.style.backgroundImage = this.#type === 'solid' ? '' : this.#serializeGradient();\n }\n }\n\n #updateBar(): void {\n if (!this.#bar) return;\n const barStops = this.#stops\n .map(s => `${s.color} ${s.position}%`)\n .join(', ');\n this.#bar.style.backgroundImage = `linear-gradient(to right, ${barStops})`;\n }\n\n #updateStopPositions(): void {\n if (!this.#bar) return;\n for (const stop of this.#stops) {\n const el = this.#bar.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.left = this.#stopLeft(stop.position);\n }\n }\n }\n\n #updateStopColor(stop: GradientStop): void {\n if (!this.#bar) return;\n const el = this.#bar.querySelector(`[data-stop-id=\"${stop.id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.setProperty('--stop-color', stop.color);\n }\n }\n\n #updateStopSelection(): void {\n if (!this.#bar) return;\n const allStops = this.#bar.querySelectorAll('[data-ry-target=\"stop\"]');\n for (const el of allStops) {\n if (el.getAttribute('data-stop-id') === this.#selectedStopId) {\n el.setAttribute('data-selected', '');\n } else {\n el.removeAttribute('data-selected');\n }\n }\n }\n\n #updatePicker(): void {\n const stop = this.#getSelectedStop();\n if (!stop || !this.#picker) return;\n this.#picker.setColor(stop.color);\n }\n\n #updateOutput(): void {\n if (this.#outputInput && document.activeElement !== this.#outputInput) {\n this.#outputInput.value = this.#serializeGradient();\n }\n }\n\n #syncValueAttribute(): void {\n const val = this.#serializeGradient();\n if (this.getAttribute('value') !== val) {\n this.#syncing = true;\n this.setAttribute('value', val);\n this.#syncing = false;\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Events\n // ───────────────────────────────────────────────────────────────────────────\n\n #emitInput(): void {\n this.emit('input', {\n value: this.#serializeGradient(),\n type: this.#type,\n angle: this.#angle,\n shape: this.#shape,\n stops: this.stops,\n });\n }\n\n #emitChange(): void {\n this.emit('change', {\n value: this.#serializeGradient(),\n type: this.#type,\n angle: this.#angle,\n shape: this.#shape,\n stops: this.stops,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Attribute changed\n // ───────────────────────────────────────────────────────────────────────────\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue || this.#syncing) return;\n\n if (name === 'value' && this.#bar && newValue) {\n // External value change\n if (this.#parseGradient(newValue)) {\n this.#renderStops();\n this.#updateAll();\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────────────────\n\n get value(): string {\n return this.#serializeGradient();\n }\n\n set value(val: string) {\n if (this.#parseGradient(val)) {\n this.#renderStops();\n this.#updateAll();\n this.#syncValueAttribute();\n }\n }\n\n get type(): GradientType {\n return this.#type;\n }\n\n set type(val: GradientType) {\n this.#handleTypeToggle(val);\n }\n\n get angle(): number {\n return this.#angle;\n }\n\n set angle(val: number) {\n this.#angle = ((val % 360) + 360) % 360;\n this.#updateControls();\n this.#updateOutput();\n this.#syncValueAttribute();\n }\n\n get shape(): RadialShape {\n return this.#shape;\n }\n\n set shape(val: RadialShape) {\n this.#handleShapeToggle(val);\n }\n\n get stops(): GradientStop[] {\n return this.#stops.map(s => ({ ...s }));\n }\n\n get selectedStop(): GradientStop | null {\n const stop = this.#getSelectedStop();\n return stop ? { ...stop } : null;\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n addStop(color: string, position: number): void {\n this.#addStop(color, position);\n this.#syncValueAttribute();\n this.#emitInput();\n this.#emitChange();\n }\n\n removeStop(id: string): boolean {\n const removed = this.#removeStop(id);\n if (removed) {\n this.#updateOutput();\n this.#syncValueAttribute();\n this.#emitChange();\n }\n return removed;\n }\n}\n\ncustomElements.define('ry-gradient-picker', RyGradientPicker);\n","/**\n * <ry-tree>\n *\n * Tree view with CSS-only expand/collapse using hidden checkboxes\n * and grid-template-rows animation. Supports drag-and-drop rearranging\n * and JSON serialization.\n *\n * Usage:\n * <ry-tree>\n * <ry-tree-item label=\"src\" open>\n * <ry-tree-item label=\"app\" open>\n * <ry-tree-item label=\"layout.tsx\"></ry-tree-item>\n * </ry-tree-item>\n * </ry-tree-item>\n * </ry-tree>\n *\n * Drag and drop:\n * <ry-tree draggable>...</ry-tree>\n *\n * JS uses data-ry-target for queries, CSS uses .ry-tree__* for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nlet treeIdCounter = 0;\n\nconst DRAG_THRESHOLD = 5;\n\nfunction icon16(name: string): string {\n return getIcon(name)\n .replace(/width=\"24\"/g, 'width=\"16\"')\n .replace(/height=\"24\"/g, 'height=\"16\"')\n .replace(/viewBox/, 'class=\"ry-tree__icon\" viewBox');\n}\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n open?: boolean;\n selected?: boolean;\n}\n\nexport class RyTree extends RyElement {\n // Drag state\n #dragPending = false;\n #dragActive = false;\n #dragOriginX = 0;\n #dragOriginY = 0;\n #draggedItem: HTMLElement | null = null;\n #ghost: HTMLElement | null = null;\n #dropTarget: HTMLElement | null = null;\n #dropPosition: 'before' | 'after' | 'inside' | null = null;\n\n setup(): void {\n this.#build();\n\n // Delegate click for file selection\n this.on(this, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const fileItem = target.closest<HTMLElement>('[data-ry-target=\"file\"]');\n if (!fileItem) return;\n\n this.$$('[data-ry-selected]').forEach(el => el.removeAttribute('data-ry-selected'));\n fileItem.setAttribute('data-ry-selected', '');\n\n this.emit('select', {\n label: fileItem.dataset.ryLabel ?? '',\n });\n });\n\n // Emit toggle events when folders open/close\n this.on(this, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (!input.classList.contains('ry-tree__toggle')) return;\n\n const li = input.closest<HTMLElement>('.ry-tree__item');\n const label = li?.querySelector<HTMLElement>('[data-ry-target=\"folder\"]')?.dataset.ryLabel ?? '';\n\n this.emit('toggle', {\n label,\n open: input.checked,\n });\n });\n\n // Drag and drop — only when draggable attribute is present\n if (this.hasAttribute('sortable')) {\n this.#bindDrag();\n }\n }\n\n // ── Build ──────────────────────────────────────────────────\n\n #build(): void {\n if (this.$('.ry-tree__root')) return;\n\n const items = Array.from(this.children) as HTMLElement[];\n const ul = document.createElement('ul');\n ul.className = 'ry-tree__root';\n\n for (const item of items) {\n ul.appendChild(this.#buildItem(item));\n }\n\n this.innerHTML = '';\n this.appendChild(ul);\n }\n\n #buildItem(source: HTMLElement): HTMLLIElement {\n const li = document.createElement('li');\n li.className = 'ry-tree__item';\n\n const label = source.getAttribute('label') ?? '';\n const isOpen = source.hasAttribute('open');\n const isSelected = source.hasAttribute('selected');\n const children = Array.from(source.children).filter(\n c => c.tagName === 'RY-TREE-ITEM'\n ) as HTMLElement[];\n const isFolder = children.length > 0;\n\n if (isFolder) {\n const id = `ry-tree-${++treeIdCounter}`;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.id = id;\n checkbox.className = 'ry-tree__toggle';\n if (isOpen) checkbox.checked = true;\n\n const labelEl = document.createElement('label');\n labelEl.htmlFor = id;\n labelEl.className = 'ry-tree__label';\n labelEl.setAttribute('data-ry-target', 'folder');\n labelEl.dataset.ryLabel = label;\n labelEl.innerHTML = `\n <span class=\"ry-tree__icon-closed\">${icon16('folder')}</span>\n <span class=\"ry-tree__icon-open\">${icon16('folder-open')}</span>\n ${label}\n `;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'ry-tree__children-wrapper';\n\n const childUl = document.createElement('ul');\n childUl.className = 'ry-tree__children';\n\n for (const child of children) {\n childUl.appendChild(this.#buildItem(child));\n }\n\n wrapper.appendChild(childUl);\n li.appendChild(checkbox);\n li.appendChild(labelEl);\n li.appendChild(wrapper);\n } else {\n const fileEl = document.createElement('div');\n fileEl.className = 'ry-tree__file';\n fileEl.setAttribute('data-ry-target', 'file');\n fileEl.dataset.ryLabel = label;\n if (isSelected) fileEl.setAttribute('data-ry-selected', '');\n fileEl.innerHTML = `${icon16('file')} ${label}`;\n\n li.appendChild(fileEl);\n }\n\n return li;\n }\n\n // ── Serialization ──────────────────────────────────────────\n\n /** Serialize the current tree state to JSON. */\n toJSON(): TreeNode[] {\n const root = this.$<HTMLElement>('.ry-tree__root');\n if (!root) return [];\n return this.#serializeChildren(root);\n }\n\n /** Alias for toJSON(). */\n get value(): TreeNode[] {\n return this.toJSON();\n }\n\n #serializeChildren(container: HTMLElement): TreeNode[] {\n const items = Array.from(container.children).filter(\n (c): c is HTMLElement => c instanceof HTMLElement && c.classList.contains('ry-tree__item')\n );\n return items.map(item => this.#serializeItem(item));\n }\n\n #serializeItem(item: HTMLElement): TreeNode {\n const folderLabel = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"folder\"]');\n const fileDiv = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"file\"]');\n\n if (folderLabel) {\n const toggle = item.querySelector<HTMLInputElement>(':scope > .ry-tree__toggle');\n const childrenList = item.querySelector<HTMLElement>('.ry-tree__children');\n const node: TreeNode = { label: folderLabel.dataset.ryLabel ?? '' };\n if (toggle?.checked) node.open = true;\n if (childrenList) {\n const children = this.#serializeChildren(childrenList);\n if (children.length > 0) node.children = children;\n }\n return node;\n }\n\n // File\n const node: TreeNode = { label: fileDiv?.dataset.ryLabel ?? '' };\n if (fileDiv?.hasAttribute('data-ry-selected')) node.selected = true;\n return node;\n }\n\n /** Create a tree element from JSON data. */\n static from(data: TreeNode[]): RyTree {\n const tree = document.createElement('ry-tree') as RyTree;\n for (const node of data) {\n tree.appendChild(RyTree.#nodeToElement(node));\n }\n return tree;\n }\n\n static #nodeToElement(node: TreeNode): HTMLElement {\n const item = document.createElement('ry-tree-item');\n item.setAttribute('label', node.label);\n if (node.open) item.setAttribute('open', '');\n if (node.selected) item.setAttribute('selected', '');\n if (node.children) {\n for (const child of node.children) {\n item.appendChild(RyTree.#nodeToElement(child));\n }\n }\n return item;\n }\n\n // ── Drag and Drop ──────────────────────────────────────────\n\n #bindDrag(): void {\n this.on(this, 'pointerdown', this.#onPointerDown);\n this.on(document, 'pointermove', this.#onPointerMove);\n this.on(document, 'pointerup', this.#onPointerUp);\n }\n\n #onPointerDown = (e: PointerEvent): void => {\n const target = e.target as HTMLElement;\n const handle = target.closest<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!handle) return;\n\n const item = handle.closest<HTMLElement>('.ry-tree__item');\n if (!item) return;\n\n // Record origin — don't start drag yet (distance threshold)\n this.#dragPending = true;\n this.#dragOriginX = e.clientX;\n this.#dragOriginY = e.clientY;\n this.#draggedItem = item;\n };\n\n #onPointerMove = (e: PointerEvent): void => {\n if (!this.#dragPending && !this.#dragActive) return;\n\n // Check distance threshold before activating\n if (this.#dragPending && !this.#dragActive) {\n const dx = e.clientX - this.#dragOriginX;\n const dy = e.clientY - this.#dragOriginY;\n if (Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n\n // Threshold crossed — activate drag\n this.#dragPending = false;\n this.#dragActive = true;\n this.#activateDrag(e);\n }\n\n if (!this.#dragActive || !this.#ghost) return;\n\n // Update ghost position\n this.#ghost.style.left = `${e.clientX + 12}px`;\n this.#ghost.style.top = `${e.clientY - 14}px`;\n\n // Hide ghost momentarily so elementFromPoint sees through it\n this.#ghost.style.display = 'none';\n const elUnder = document.elementFromPoint(e.clientX, e.clientY);\n this.#ghost.style.display = '';\n\n if (!elUnder) {\n this.#clearIndicator();\n return;\n }\n\n const targetHandle = elUnder.closest<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!targetHandle) {\n this.#clearIndicator();\n return;\n }\n\n const targetItem = targetHandle.closest<HTMLElement>('.ry-tree__item');\n if (!targetItem || targetItem === this.#draggedItem) {\n this.#clearIndicator();\n return;\n }\n\n // Don't allow dropping into own descendants\n if (this.#draggedItem?.contains(targetItem)) {\n this.#clearIndicator();\n return;\n }\n\n // Determine position: top third / middle third / bottom third\n const rect = targetHandle.getBoundingClientRect();\n const relY = e.clientY - rect.top;\n const h = rect.height;\n const isFolder = targetItem.querySelector(':scope > .ry-tree__toggle') !== null;\n\n let position: 'before' | 'after' | 'inside';\n if (isFolder && relY > h * 0.25 && relY < h * 0.75) {\n position = 'inside';\n } else if (relY < h * 0.5) {\n position = 'before';\n } else {\n position = 'after';\n }\n\n this.#setIndicator(targetItem, position);\n };\n\n #onPointerUp = (): void => {\n if (this.#dragActive) {\n this.#finishDrag();\n }\n this.#dragPending = false;\n this.#dragActive = false;\n this.#draggedItem = null;\n };\n\n #activateDrag(e: PointerEvent): void {\n if (!this.#draggedItem) return;\n\n // Prevent the click from toggling the folder checkbox\n e.preventDefault();\n\n // Mark as dragging and collapse to thin placeholder so parent targets are reachable\n this.#draggedItem.setAttribute('data-ry-dragging', '');\n this.#draggedItem.classList.add('ry-tree__item--collapsed');\n\n // Create ghost\n const handle = this.#draggedItem.querySelector<HTMLElement>('.ry-tree__label, .ry-tree__file');\n if (!handle) return;\n\n const ghost = handle.cloneNode(true) as HTMLElement;\n ghost.className = 'ry-tree__ghost';\n // Copy label/file styles for size\n ghost.style.display = 'flex';\n ghost.style.alignItems = 'center';\n ghost.style.gap = 'var(--ry-space-2, 0.5rem)';\n ghost.style.padding = 'var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem)';\n ghost.style.height = '28px';\n ghost.style.fontSize = 'var(--ry-text-sm, 0.875rem)';\n ghost.style.whiteSpace = 'nowrap';\n ghost.style.left = `${e.clientX + 12}px`;\n ghost.style.top = `${e.clientY - 14}px`;\n document.body.appendChild(ghost);\n this.#ghost = ghost;\n }\n\n #finishDrag(): void {\n // Remove ghost\n if (this.#ghost?.parentNode) {\n this.#ghost.parentNode.removeChild(this.#ghost);\n }\n this.#ghost = null;\n\n // Clear visual\n this.#draggedItem?.classList.remove('ry-tree__item--collapsed');\n this.#draggedItem?.removeAttribute('data-ry-dragging');\n const dropTarget = this.#dropTarget;\n const dropPosition = this.#dropPosition;\n this.#clearIndicator();\n\n // Perform DOM move\n if (this.#draggedItem && dropTarget && dropPosition) {\n this.#performMove(this.#draggedItem, dropTarget, dropPosition);\n }\n }\n\n #setIndicator(item: HTMLElement, position: 'before' | 'after' | 'inside'): void {\n if (this.#dropTarget === item && this.#dropPosition === position) return;\n this.#clearIndicator();\n item.setAttribute('data-ry-drop-target', position);\n this.#dropTarget = item;\n this.#dropPosition = position;\n }\n\n #clearIndicator(): void {\n this.#dropTarget?.removeAttribute('data-ry-drop-target');\n this.#dropTarget = null;\n this.#dropPosition = null;\n }\n\n #performMove(\n draggedItem: HTMLElement,\n dropTarget: HTMLElement,\n position: 'before' | 'after' | 'inside'\n ): void {\n // Safety: can't drop inside own descendant (circular)\n if (position === 'inside' && dropTarget.contains(draggedItem)) return;\n\n const itemLabel = this.#itemLabel(draggedItem);\n const targetLabel = this.#itemLabel(dropTarget);\n\n if (position === 'before') {\n dropTarget.parentNode?.insertBefore(draggedItem, dropTarget);\n } else if (position === 'after') {\n dropTarget.parentNode?.insertBefore(draggedItem, dropTarget.nextSibling);\n } else {\n // Inside — append to folder's children list\n const childrenList = dropTarget.querySelector<HTMLElement>('.ry-tree__children');\n if (childrenList) {\n childrenList.appendChild(draggedItem);\n // Auto-open the folder\n const toggle = dropTarget.querySelector<HTMLInputElement>(':scope > .ry-tree__toggle');\n if (toggle && !toggle.checked) {\n toggle.checked = true;\n }\n }\n }\n\n this.emit('move', {\n item: itemLabel,\n target: targetLabel,\n position,\n });\n }\n\n #itemLabel(item: HTMLElement): string {\n const folder = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"folder\"]');\n const file = item.querySelector<HTMLElement>(':scope > [data-ry-target=\"file\"]');\n return folder?.dataset.ryLabel ?? file?.dataset.ryLabel ?? '';\n }\n}\n\nexport class RyTreeItem extends RyElement {\n // Declarative container consumed by RyTree#build\n}\n\ncustomElements.define('ry-tree', RyTree);\ncustomElements.define('ry-tree-item', RyTreeItem);\n","/**\n * <ry-tag>\n *\n * Removable pill/tag component.\n *\n * Usage:\n * <ry-tag>Default</ry-tag>\n * <ry-tag variant=\"primary\" removable>Removable</ry-tag>\n * <ry-tag size=\"sm\" removable data-value=\"js\">JavaScript</ry-tag>\n *\n * JS uses data-ry-target for queries, CSS uses classes for styling.\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyTag extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"label\"]')) return;\n\n const text = this.textContent?.trim() ?? '';\n const removable = this.hasAttribute('removable');\n\n this.innerHTML = `<span data-ry-target=\"label\" class=\"ry-tag__label\">${text}</span>${\n removable\n ? `<button data-ry-target=\"remove\" class=\"ry-tag__remove\" aria-label=\"Remove\" type=\"button\">${getIcon('close')}</button>`\n : ''\n }`;\n\n if (removable) {\n const btn = this.$<HTMLButtonElement>('[data-ry-target=\"remove\"]');\n if (btn) {\n this.on(btn, 'click', (e: MouseEvent) => {\n e.stopPropagation();\n this.emit('remove', {\n value: this.dataset.value ?? '',\n label: text\n });\n this.remove();\n });\n }\n }\n }\n\n get label(): string {\n return this.$('[data-ry-target=\"label\"]')?.textContent?.trim() ?? '';\n }\n}\n\ncustomElements.define('ry-tag', RyTag);\n","/**\n * <ry-tag-input>\n *\n * Free-form tag entry with delimiter splitting and paste support.\n *\n * Usage:\n * <ry-tag-input placeholder=\"Add tags...\" delimiter=\",\" max-tags=\"5\" name=\"tags\" value=\"js,ts,css\"></ry-tag-input>\n *\n * Events: ry:change, ry:add, ry:remove\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyTagInput extends RyElement {\n #tags: string[] = [];\n\n setup(): void {\n this.#transformMarkup();\n this.#parseInitialValue();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"container\"]')) return;\n\n const placeholder = this.getAttribute('placeholder') ?? 'Add tag...';\n const name = this.getAttribute('name') ?? '';\n const disabled = this.hasAttribute('disabled');\n\n this.innerHTML = `\n <div data-ry-target=\"container\" class=\"ry-tag-input__container\">\n <div data-ry-target=\"tags\" class=\"ry-tag-input__tags\"></div>\n <input data-ry-target=\"input\" class=\"ry-tag-input__input\" type=\"text\" placeholder=\"${placeholder}\" ${disabled ? 'disabled' : ''}>\n </div>\n <input data-ry-target=\"hidden\" type=\"hidden\" ${name ? `name=\"${name}\"` : ''}>\n `;\n\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) {\n this.on(input, 'keydown', this.#handleKeydown as EventListener);\n this.on(input, 'paste', this.#handlePaste as EventListener);\n }\n\n const container = this.$('[data-ry-target=\"container\"]');\n if (container) {\n this.on(container, 'click', () => input?.focus());\n }\n\n this.on(this, 'ry:remove', this.#handleTagRemove as EventListener);\n }\n\n #parseInitialValue(): void {\n const value = this.getAttribute('value');\n if (!value) return;\n\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const parts = value.split(delimiter).map(s => s.trim()).filter(Boolean);\n for (const tag of parts) {\n this.#addTag(tag);\n }\n }\n\n #handleKeydown = (e: KeyboardEvent): void => {\n const input = e.target as HTMLInputElement;\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const val = input.value.trim();\n\n if (e.key === 'Enter' || e.key === delimiter || e.key === 'Tab') {\n if (val) {\n e.preventDefault();\n this.#addTag(val);\n input.value = '';\n } else if (e.key === 'Tab') {\n return; // allow natural tab\n }\n }\n\n if (e.key === 'Backspace' && !input.value && this.#tags.length > 0) {\n this.#removeLastTag();\n }\n };\n\n #handlePaste = (e: ClipboardEvent): void => {\n e.preventDefault();\n const text = e.clipboardData?.getData('text') ?? '';\n const delimiter = this.getAttribute('delimiter') ?? ',';\n const parts = text.split(new RegExp(`[${delimiter}\\\\t\\\\n]+`)).map(s => s.trim()).filter(Boolean);\n for (const tag of parts) {\n this.#addTag(tag);\n }\n const input = this.$<HTMLInputElement>('[data-ry-target=\"input\"]');\n if (input) input.value = '';\n };\n\n #handleTagRemove = (e: CustomEvent): void => {\n const value = (e.detail as { value: string }).value;\n const idx = this.#tags.indexOf(value);\n if (idx >= 0) {\n this.#tags.splice(idx, 1);\n this.#syncHidden();\n this.emit('change', { values: [...this.#tags] });\n }\n };\n\n #addTag(text: string): void {\n const maxTags = this.getAttribute('max-tags');\n if (maxTags && this.#tags.length >= parseInt(maxTags, 10)) return;\n\n if (!this.hasAttribute('allow-duplicates') && this.#tags.includes(text)) return;\n\n this.#tags.push(text);\n\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n if (tagsContainer) {\n const tag = document.createElement('ry-tag');\n tag.setAttribute('removable', '');\n tag.setAttribute('size', 'sm');\n tag.setAttribute('data-value', text);\n tag.textContent = text;\n tagsContainer.appendChild(tag);\n }\n\n this.#syncHidden();\n this.emit('add', { value: text });\n this.emit('change', { values: [...this.#tags] });\n }\n\n #removeLastTag(): void {\n const tagsContainer = this.$('[data-ry-target=\"tags\"]');\n const lastTag = tagsContainer?.lastElementChild;\n if (lastTag) {\n const val = (lastTag as HTMLElement).dataset.value ?? '';\n lastTag.remove();\n this.#tags.pop();\n this.#syncHidden();\n this.emit('remove', { value: val, label: val });\n this.emit('change', { values: [...this.#tags] });\n }\n }\n\n #syncHidden(): void {\n const hidden = this.$<HTMLInputElement>('[data-ry-target=\"hidden\"]');\n const delimiter = this.getAttribute('delimiter') ?? ',';\n if (hidden) {\n hidden.value = this.#tags.join(delimiter);\n }\n }\n\n get value(): string {\n const delimiter = this.getAttribute('delimiter') ?? ',';\n return this.#tags.join(delimiter);\n }\n\n get values(): string[] {\n return [...this.#tags];\n }\n}\n\ncustomElements.define('ry-tag-input', RyTagInput);\n","/**\n * <ry-hero>\n *\n * Hero section component (mostly CSS-only).\n *\n * Usage:\n * <ry-hero align=\"center\">\n * <h1>Build apps faster</h1>\n * <p>Framework-agnostic components.</p>\n * <ry-cluster><ry-button>Get Started</ry-button></ry-cluster>\n * </ry-hero>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyHero extends RyElement {}\n\ncustomElements.define('ry-hero', RyHero);\n","/**\n * <ry-stat>\n *\n * KPI / statistic display with optional trend arrow.\n *\n * Usage:\n * <ry-stat trend=\"up\">\n * <span slot=\"value\">2,847</span>\n * <span slot=\"label\">Active Users</span>\n * </ry-stat>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyStat extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"value\"]')) return;\n\n const valueEl = this.querySelector('[slot=\"value\"]');\n const labelEl = this.querySelector('[slot=\"label\"]');\n const trend = this.getAttribute('trend');\n\n const valueText = valueEl?.textContent?.trim() ?? '';\n const labelText = labelEl?.textContent?.trim() ?? '';\n\n const trendIcon = trend === 'up'\n ? `<span data-ry-target=\"trend\" class=\"ry-stat__trend ry-stat__trend--up\">${getIcon('chevron-up')}</span>`\n : trend === 'down'\n ? `<span data-ry-target=\"trend\" class=\"ry-stat__trend ry-stat__trend--down\">${getIcon('chevron-down')}</span>`\n : '';\n\n this.innerHTML = `\n <div data-ry-target=\"value\" class=\"ry-stat__value\">${valueText}${trendIcon}</div>\n <div data-ry-target=\"label\" class=\"ry-stat__label\">${labelText}</div>\n `;\n }\n}\n\ncustomElements.define('ry-stat', RyStat);\n","/**\n * <ry-feature> + <ry-feature-grid>\n *\n * Feature card with icon + responsive grid.\n *\n * Usage:\n * <ry-feature-grid cols=\"3\">\n * <ry-feature icon=\"settings\">\n * <h3>Easy Setup</h3>\n * <p>One line to get started.</p>\n * </ry-feature>\n * </ry-feature-grid>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyFeature extends RyElement {\n setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"icon\"]')) return;\n\n const iconName = this.getAttribute('icon');\n if (!iconName) return;\n\n const iconSvg = getIcon(iconName);\n if (!iconSvg) return;\n\n const iconDiv = document.createElement('div');\n iconDiv.setAttribute('data-ry-target', 'icon');\n iconDiv.className = 'ry-feature__icon';\n iconDiv.innerHTML = iconSvg;\n this.insertBefore(iconDiv, this.firstChild);\n }\n}\n\nexport class RyFeatureGrid extends RyElement {}\n\ncustomElements.define('ry-feature', RyFeature);\ncustomElements.define('ry-feature-grid', RyFeatureGrid);\n","/**\n * <ry-pricing> + <ry-pricing-card>\n *\n * Pricing section with featured card variant.\n *\n * Usage:\n * <ry-pricing>\n * <ry-pricing-card featured>\n * <h3>Pro</h3>\n * <div slot=\"price\">$29<span>/mo</span></div>\n * <ul><li>Feature 1</li></ul>\n * <ry-button>Choose Pro</ry-button>\n * </ry-pricing-card>\n * </ry-pricing>\n */\n\nimport { RyElement } from '../core/ry-element.js';\n\nexport class RyPricing extends RyElement {}\nexport class RyPricingCard extends RyElement {}\n\ncustomElements.define('ry-pricing', RyPricing);\ncustomElements.define('ry-pricing-card', RyPricingCard);\n","/**\n * <ry-carousel>\n *\n * Content slider with autoplay, touch/swipe, dots, arrows, keyboard nav.\n *\n * Usage:\n * <ry-carousel autoplay interval=\"5000\" dots arrows loop>\n * <div>Slide 1</div>\n * <div>Slide 2</div>\n * </ry-carousel>\n */\n\nimport { RyElement } from '../core/ry-element.js';\nimport { getIcon } from '../core/ry-icons.js';\n\nexport class RyCarousel extends RyElement {\n #currentIndex = 0;\n #slideCount = 0;\n #autoplayTimer: ReturnType<typeof setInterval> | null = null;\n #startX = 0;\n #isDragging = false;\n\n setup(): void {\n this.#transformMarkup();\n this.#setupAutoplay();\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n this.on(this, 'keydown', this.#handleKeydown as EventListener);\n }\n\n #transformMarkup(): void {\n if (this.$('[data-ry-target=\"viewport\"]')) return;\n\n const slides = [...this.children];\n this.#slideCount = slides.length;\n if (this.#slideCount === 0) return;\n\n const showArrows = this.hasAttribute('arrows');\n const showDots = this.hasAttribute('dots');\n\n // Wrap slides in track\n const track = document.createElement('div');\n track.setAttribute('data-ry-target', 'track');\n track.className = 'ry-carousel__track';\n for (const slide of slides) {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('data-ry-target', 'slide');\n wrapper.className = 'ry-carousel__slide';\n wrapper.appendChild(slide);\n track.appendChild(wrapper);\n }\n\n // Build viewport\n const viewport = document.createElement('div');\n viewport.setAttribute('data-ry-target', 'viewport');\n viewport.className = 'ry-carousel__viewport';\n viewport.appendChild(track);\n\n this.innerHTML = '';\n this.appendChild(viewport);\n\n // Arrows\n if (showArrows) {\n const prev = document.createElement('button');\n prev.setAttribute('data-ry-target', 'prev');\n prev.className = 'ry-carousel__arrow ry-carousel__arrow--prev';\n prev.setAttribute('aria-label', 'Previous slide');\n prev.setAttribute('type', 'button');\n prev.innerHTML = getIcon('chevron-left');\n this.appendChild(prev);\n this.on(prev, 'click', () => this.prev());\n\n const next = document.createElement('button');\n next.setAttribute('data-ry-target', 'next');\n next.className = 'ry-carousel__arrow ry-carousel__arrow--next';\n next.setAttribute('aria-label', 'Next slide');\n next.setAttribute('type', 'button');\n next.innerHTML = getIcon('chevron-right');\n this.appendChild(next);\n this.on(next, 'click', () => this.next());\n }\n\n // Dots\n if (showDots) {\n const dotsContainer = document.createElement('div');\n dotsContainer.setAttribute('data-ry-target', 'dots');\n dotsContainer.className = 'ry-carousel__dots';\n for (let i = 0; i < this.#slideCount; i++) {\n const dot = document.createElement('button');\n dot.setAttribute('data-ry-target', 'dot');\n dot.className = 'ry-carousel__dot';\n dot.setAttribute('aria-label', `Go to slide ${i + 1}`);\n dot.setAttribute('type', 'button');\n if (i === 0) dot.setAttribute('data-active', '');\n this.on(dot, 'click', () => this.goTo(i));\n dotsContainer.appendChild(dot);\n }\n this.appendChild(dotsContainer);\n }\n\n // Touch/swipe\n this.on(viewport, 'pointerdown', this.#handlePointerDown as EventListener);\n this.on(viewport, 'pointermove', this.#handlePointerMove as EventListener);\n this.on(viewport, 'pointerup', this.#handlePointerUp as EventListener);\n this.on(viewport, 'pointercancel', this.#handlePointerUp as EventListener);\n\n // Pause on hover\n if (this.hasAttribute('pause-on-hover')) {\n this.on(this, 'mouseenter', () => this.#stopAutoplay());\n this.on(this, 'mouseleave', () => this.#setupAutoplay());\n }\n\n this.goTo(0);\n }\n\n #handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.prev();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n this.next();\n }\n };\n\n #handlePointerDown = (e: PointerEvent): void => {\n this.#startX = e.clientX;\n this.#isDragging = true;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n #handlePointerMove = (e: PointerEvent): void => {\n if (!this.#isDragging) return;\n // Prevent scroll while swiping\n e.preventDefault();\n };\n\n #handlePointerUp = (e: PointerEvent): void => {\n if (!this.#isDragging) return;\n this.#isDragging = false;\n const diff = e.clientX - this.#startX;\n const threshold = 50;\n if (diff > threshold) {\n this.prev();\n } else if (diff < -threshold) {\n this.next();\n }\n };\n\n #setupAutoplay(): void {\n this.#stopAutoplay();\n if (!this.hasAttribute('autoplay')) return;\n const interval = parseInt(this.getAttribute('interval') ?? '5000', 10);\n this.#autoplayTimer = setInterval(() => this.next(), interval);\n }\n\n #stopAutoplay(): void {\n if (this.#autoplayTimer) {\n clearInterval(this.#autoplayTimer);\n this.#autoplayTimer = null;\n }\n }\n\n goTo(index: number): void {\n const loop = this.hasAttribute('loop');\n if (loop) {\n if (index < 0) index = this.#slideCount - 1;\n if (index >= this.#slideCount) index = 0;\n } else {\n if (index < 0 || index >= this.#slideCount) return;\n }\n\n this.#currentIndex = index;\n\n const track = this.$<HTMLElement>('[data-ry-target=\"track\"]');\n if (track) {\n track.style.transform = `translateX(-${index * 100}%)`;\n }\n\n // Update dots\n const dots = this.$$('[data-ry-target=\"dot\"]');\n dots.forEach((dot, i) => {\n if (i === index) {\n dot.setAttribute('data-active', '');\n } else {\n dot.removeAttribute('data-active');\n }\n });\n\n this.emit('change', { index, slide: this.#currentIndex });\n }\n\n next(): void {\n this.goTo(this.#currentIndex + 1);\n }\n\n prev(): void {\n this.goTo(this.#currentIndex - 1);\n }\n\n teardown(): void {\n this.#stopAutoplay();\n }\n}\n\ncustomElements.define('ry-carousel', RyCarousel);\n","/**\n * ry-ui\n *\n * Framework-agnostic, Light DOM web components.\n * CSS is the source of truth.\n *\n * Usage:\n * <script type=\"module\" src=\"ry-ui.js\"></script>\n *\n * Transform wrapper (optional clean syntax):\n * <ry>\n * <accordion>\n * <accordion-item title=\"Foo\">Content</accordion-item>\n * </accordion>\n * </ry>\n *\n * Or use <template ry> for inert content:\n * <template ry>\n * <accordion>...</accordion>\n * </template>\n */\n\n// Types\nexport type {\n ComponentState,\n StateChangeDetail,\n ChangeDetail,\n CleanupFn,\n ToastVariant,\n ToastOptions,\n SelectOption\n} from './types.js';\n\n// Core\nexport { RyElement } from './core/ry-element.js';\nexport { transform, processTransforms } from './core/ry-transform.js';\n\n// Components\nexport { RyAccordion } from './components/ry-accordion.js';\nexport { RyModal } from './components/ry-modal.js';\nexport { RyTabs } from './components/ry-tabs.js';\nexport { RyDropdown } from './components/ry-dropdown.js';\nexport { RyButton } from './components/ry-button.js';\nexport { RyButtonGroup } from './components/ry-button-group.js';\nexport { RySplit } from './components/ry-split.js';\nexport { RyThemeToggle } from './components/ry-theme-toggle.js';\nexport { RyCard } from './components/ry-card.js';\nexport { RyAlert } from './components/ry-alert.js';\nexport { RyField } from './components/ry-field.js';\nexport { RySwitch } from './components/ry-switch.js';\nexport { RyTooltip } from './components/ry-tooltip.js';\nexport { RyDrawer } from './components/ry-drawer.js';\nexport { RyToast } from './components/ry-toast.js';\nexport { RySelect } from './components/ry-select.js';\nexport { RyCombobox } from './components/ry-combobox.js';\nexport { RyCode } from './components/ry-code.js';\nexport { RyExample } from './components/ry-example.js';\nexport { RyIcon } from './components/ry-icon.js';\nexport { RyToggleButton } from './components/ry-toggle-button.js';\nexport { RySlider } from './components/ry-slider.js';\nexport { RyKnob } from './components/ry-knob.js';\nexport { RyNumberSelect } from './components/ry-number-select.js';\nexport { RyColorPicker } from './components/ry-color-picker.js';\nexport type { ColorFormat, RGB, HSL, HSV } from './components/ry-color-picker.js';\nexport { RyColorInput } from './components/ry-color-input.js';\nexport { RyGradientPicker } from './components/ry-gradient-picker.js';\nexport type { GradientStop, GradientType, RadialShape } from './components/ry-gradient-picker.js';\nexport { RyTree, RyTreeItem } from './components/ry-tree.js';\nexport type { TreeNode } from './components/ry-tree.js';\nexport { RyTag } from './components/ry-tag.js';\nexport { RyTagInput } from './components/ry-tag-input.js';\nexport { RyHero } from './components/ry-hero.js';\nexport { RyStat } from './components/ry-stat.js';\nexport { RyFeature, RyFeatureGrid } from './components/ry-feature.js';\nexport { RyPricing, RyPricingCard } from './components/ry-pricing.js';\nexport { RyCarousel } from './components/ry-carousel.js';\n\n// Icon registry\nexport { getIcon, registerIcon, registerIcons, getIconNames } from './core/ry-icons.js';\n\n// Make RyToast globally available for programmatic API\nimport { RyToast as _RyToast } from './components/ry-toast.js';\n\ndeclare global {\n interface Window {\n RyToast: typeof _RyToast;\n }\n}\n\nwindow.RyToast = _RyToast;\n\n// Log version\nconsole.log('ry-ui loaded');\n"],"names":["RyElement","#cleanupFns","#observer","fn","target","event","handler","options","boundHandler","name","detail","value","oldState","selector","callback","resolve","container","focusableSelectors","focusableEls","firstEl","lastEl","handleKeydown","e","RY_COMPONENTS","TRANSFORM_REGEX","transform","html","processTransforms","el","transformed","template","RyAccordion","#transformMinimalMarkup","trigger","#handleTriggerClick","#handleKeydown","#initAria","item","title","isOpen","content","index","panel","triggerId","panelId","triggers","currentIndex","newIndex","openItem","RyModal","#previouslyFocused","#scrollbarWidth","modalId","closeBtn","backdrop","footerContent","bodyContent","n","dialog","RyTabs","tabs","activeIndex","t","defaultActive","tabList","tab","isActive","panels","RyDropdown","#handleClickOutside","triggerButton","menu","items","#positionMenu","rect","menuHeight","spaceBelow","spaceAbove","RyButton","#handleClick","RyButtonGroup","v","#syncPressed","oldValue","newValue","val","current","btn","RySplit","#handle","#dragging","#startX","#startWidth","#restore","sidebar","#onMouseDown","#onTouchStart","#onKeyDown","#onDoubleClick","#getSidebar","#getCurrentWidth","#getMinWidth","#getMaxWidth","#setWidth","px","min","max","clamped","#startDrag","onMove","ev","#onDrag","onUp","#endDrag","touch","onEnd","clientX","delta","#persist","step","width","#clearPersist","#persistKey","key","saved","RyThemeToggle","#themes","#currentIndex","themesAttr","currentTheme","#getIcon","newTheme","RyCard","href","RyAlert","#transformMarkup","variant","dismissible","RyField","#updateError","#updateHint","#updateLabel","input","inputId","labelText","label","errorEl","errorText","hintEl","hintText","describedBy","text","switchIdCounter","RySwitch","#input","#handleChange","id","checked","disabled","tooltipIdCounter","RyTooltip","#showTimeout","#tooltipEl","#tooltipId","#createTooltip","#scheduleShow","#hide","#show","position","RyDrawer","drawerId","side","DEFAULT_DURATION","RyToast","#timeout","#container","#getContainer","toast","message","duration","icon","icons","getIcon","registerIcon","svg","registerIcons","newIcons","getIconNames","selectIdCounter","RySelect","#selectId","#highlightedIndex","#typeahead","#typeaheadTimeout","#selectedValues","#isMultiple","#handleOutsideClick","#handleTagRemove","initialValue","#toggleMultiOption","opt","placeholder","isMultiple","nativeOptions","listboxOptions","i","clearable","clearBtn","#clearAll","option","#selectOption","#highlightNext","#highlightPrev","#highlightFirst","#highlightLast","vals","last","#handleTypeahead","char","match","#highlightIndex","next","prev","maxSelections","#renderTags","#syncMultiNative","#updateMultiCheckmarks","tagsContainer","valueEl","o","tag","nativeSelect","optEl","optionEl","#positionDropdown","currentValue","dropdown","dropdownHeight","RyOption","comboboxIdCounter","RyCombobox","#comboboxId","#options","#handleInputEvent","#handleFocus","#handleMouseover","query","#filterOptions","lowerQuery","visibleCount","emptyEl","wrapper","RyCode","#originalContent","#trimIndent","#render","copyBtn","#handleCopy","language","showLineNumbers","highlighted","#highlight","lines","line","code","#highlightCSS","#highlightJS","#highlightHTML","#highlightJSON","#escape","tokens","remaining","end","selectorMatch","propMatch","hexMatch","colorFnMatch","numMatch","strMatch","wsMatch","wordMatch","word","fallbackChar","#tokenToHTML","jsKeywords","tagMatch","attrMatch","punct","textMatch","boolMatch","token","escaped","str","minIndent","RyExample","jsScript","jsSource","source","stacked","codeEl","previewTemplate","#buildUsageSection","usageContainer","toggle","jsCodeEl","expanded","RyIcon","_name","size","svgEl","BOUNDARY_SELECTORS","registry","warnedGroups","findBoundaryAncestor","sel","checkForConflicts","buttons","boundaries","boundary","group","containerDescriptions","RyToggleButton","#registered","#register","#unregister","#unpressOthers","siblings","wasPressed","RySlider","#activeThumb","#track","#fill","#thumbs","#tooltips","#buildMarkup","#bindEvents","#updatePositions","isRange","showLabels","showTooltip","#buildLabels","customLabels","labelType","labels","ratio","rounded","l","#handleTrackDown","thumb","#handleThumbDown","#handlePointerMove","#handlePointerUp","#valueFromPointer","distToStart","distToEnd","#emitInput","#emitChange","largeStep","#getValueForKey","#clamp","isVertical","isReversed","rawValue","#snapToStep","snapped","toPercent","pct","startPct","endPct","lowPct","highPct","startThumb","endThumb","#updateTooltip","tooltip","decimals","RyKnob","#startY","#startValue","#ring","#indicator","#display","#updateVisuals","description","titleAttr","#handleMouseDown","#handleMouseMove","#handleMouseUp","#handleTouchStart","#handleTouchMove","#handleTouchEnd","#handleWheel","deltaY","sensitivity","#updateValue","percent","rotation","#formatValue","labelsAttr","DRAG_PX_PER_STEP","CLICK_THRESHOLD","RyNumberSelect","#valueEl","#inputEl","#decrementBtn","#incrementBtn","#editing","#repeatTimer","#repeatInterval","#cacheRefs","#updateDisplay","arrows","decIcon","incIcon","#getIcons","showDecrement","showIncrement","prefix","suffix","decBtn","incBtn","display","labelEl","#handleButtonDown","#handleButtonUp","#enterEditMode","#commitEdit","#cancelEdit","direction","#adjustValue","interval","tick","#dragAxis","#getDragDelta","clientY","#getDragMoved","#applyMicroOffset","remainder","pxPerStep","offset","axis","#processDrag","shiftKey","d","effectiveStep","steps","newVal","#wrapValue","moved","initialChar","raw","range","wrapped","#updateAria","hsvToRgb","hsv","h","s","r","g","b","f","p","q","rgbToHsv","rgb","hsvToHsl","sl","hslToHsv","hsl","sv","rgbToHex","toHex","hexToRgb","hex","result","short","parseColor","hexAlpha","alpha","rgbMatch","hslMatch","RyColorPicker","#hue","#saturation","#brightness","#alpha","#draggingGrid","#draggingHue","#draggingAlpha","#trigger","#panel","#grid","#gridHandle","#hueSlider","#hueHandle","#alphaSlider","#alphaHandle","#preview","#parseInitialValue","#updateAll","isInline","showAlpha","swatches","panelHtml","colors","c","color","#handleDocumentClick","#handleDocumentKeydown","#handleGridDown","#handleGridKeydown","#handleHueDown","#handleHueKeydown","#handleAlphaDown","#handleAlphaKeydown","#handleInputChange","#handleInputKeydown","formatToggle","#handleFormatToggle","swatchContainer","#handleSwatchClick","parsed","#positionPanel","triggerRect","panelHeight","#updateFromGridPointer","x","y","changed","#updateFromHuePointer","#updateFromAlphaPointer","#updateInput","formats","idx","#updateTrigger","#updateGrid","#updateHueSlider","#updateAlphaSlider","#updatePreview","#syncValueAttribute","triggerColor","previewColor","formatted","format","alphaHex","colorString","originalFormat","RyColorInput","#swatch","#picker","#syncFromValue","#handleInputFocus","#handlePickerInput","#handlePickerChange","cursorPos","normalized","newPos","#expandPartialHex","#updateSwatch","#isCompleteColor","padded","swatchColor","parseColorToRgb","sat","hue2rgb","lerpRgb","a","DEFAULT_VALUE","DRAG_OFF_THRESHOLD","RyGradientPicker","#type","#angle","#shape","#stops","#selectedStopId","#nextStopId","#draggingStopId","#draggingOffBar","#barRect","#syncing","#bar","#outputInput","#parseGradient","css","#createStop","type","inner","angle","shape","stopsStr","angleMatch","toMatch","dir","#directionToAngle","shapeMatch","stops","stopRegex","#serializeGradient","#stopLeft","half","#addStop","stop","#sortStops","#renderStops","#removeStop","#selectStop","#updateStopSelection","#updatePicker","#getSelectedStop","showOutput","copyIcon","solidIcon","linearIcon","radialIcon","circleIcon","ellipseIcon","outputHtml","#handleBarDown","solidBtn","linearBtn","radialBtn","#handleTypeToggle","angleSelect","#handleAngleInput","circleBtn","ellipseBtn","#handleShapeToggle","#handleOutputKeydown","#handleOutputBlur","#handleStopKeydown","stopEl","stopId","#interpolateColorAt","barCenterY","yDist","#updateBar","#updateOutput","#updateStopPositions","#updateControls","#updateStopColor","#applyOutputValue","sorted","left","right","rgbA","rgbB","swatch","barStops","allStops","removed","treeIdCounter","DRAG_THRESHOLD","icon16","RyTree","#dragPending","#dragActive","#dragOriginX","#dragOriginY","#draggedItem","#ghost","#dropTarget","#dropPosition","#build","fileItem","#bindDrag","ul","#buildItem","li","isSelected","children","checkbox","childUl","child","fileEl","root","#serializeChildren","#serializeItem","folderLabel","fileDiv","childrenList","node","data","tree","#nodeToElement","#onPointerDown","#onPointerMove","#onPointerUp","handle","dx","dy","#activateDrag","elUnder","#clearIndicator","targetHandle","targetItem","relY","isFolder","#setIndicator","#finishDrag","ghost","dropTarget","dropPosition","#performMove","draggedItem","itemLabel","#itemLabel","targetLabel","folder","file","RyTreeItem","RyTag","removable","RyTagInput","#tags","#handlePaste","delimiter","parts","#addTag","#removeLastTag","#syncHidden","maxTags","lastTag","hidden","RyHero","RyStat","trend","valueText","trendIcon","RyFeature","iconName","iconSvg","iconDiv","RyFeatureGrid","RyPricing","RyPricingCard","RyCarousel","#slideCount","#autoplayTimer","#isDragging","#setupAutoplay","slides","showArrows","showDots","track","slide","viewport","dotsContainer","dot","#handlePointerDown","#stopAutoplay","diff","threshold","_RyToast"],"mappings":"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"}