@ryanhelsing/ry-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +223 -0
  2. package/dist/components/ry-accordion.d.ts +24 -0
  3. package/dist/components/ry-accordion.d.ts.map +1 -0
  4. package/dist/components/ry-alert.d.ts +19 -0
  5. package/dist/components/ry-alert.d.ts.map +1 -0
  6. package/dist/components/ry-button.d.ts +19 -0
  7. package/dist/components/ry-button.d.ts.map +1 -0
  8. package/dist/components/ry-code.d.ts +27 -0
  9. package/dist/components/ry-code.d.ts.map +1 -0
  10. package/dist/components/ry-color-input.d.ts +28 -0
  11. package/dist/components/ry-color-input.d.ts.map +1 -0
  12. package/dist/components/ry-color-picker.d.ts +52 -0
  13. package/dist/components/ry-color-picker.d.ts.map +1 -0
  14. package/dist/components/ry-drawer.d.ts +28 -0
  15. package/dist/components/ry-drawer.d.ts.map +1 -0
  16. package/dist/components/ry-dropdown.d.ts +24 -0
  17. package/dist/components/ry-dropdown.d.ts.map +1 -0
  18. package/dist/components/ry-example.d.ts +23 -0
  19. package/dist/components/ry-example.d.ts.map +1 -0
  20. package/dist/components/ry-field.d.ts +18 -0
  21. package/dist/components/ry-field.d.ts.map +1 -0
  22. package/dist/components/ry-icon.d.ts +27 -0
  23. package/dist/components/ry-icon.d.ts.map +1 -0
  24. package/dist/components/ry-knob.d.ts +27 -0
  25. package/dist/components/ry-knob.d.ts.map +1 -0
  26. package/dist/components/ry-modal.d.ts +23 -0
  27. package/dist/components/ry-modal.d.ts.map +1 -0
  28. package/dist/components/ry-select.d.ts +29 -0
  29. package/dist/components/ry-select.d.ts.map +1 -0
  30. package/dist/components/ry-slider.d.ts +30 -0
  31. package/dist/components/ry-slider.d.ts.map +1 -0
  32. package/dist/components/ry-switch.d.ts +22 -0
  33. package/dist/components/ry-switch.d.ts.map +1 -0
  34. package/dist/components/ry-tabs.d.ts +21 -0
  35. package/dist/components/ry-tabs.d.ts.map +1 -0
  36. package/dist/components/ry-theme-toggle.d.ts +21 -0
  37. package/dist/components/ry-theme-toggle.d.ts.map +1 -0
  38. package/dist/components/ry-toast.d.ts +31 -0
  39. package/dist/components/ry-toast.d.ts.map +1 -0
  40. package/dist/components/ry-toggle-button.d.ts +31 -0
  41. package/dist/components/ry-toggle-button.d.ts.map +1 -0
  42. package/dist/components/ry-tooltip.d.ts +23 -0
  43. package/dist/components/ry-tooltip.d.ts.map +1 -0
  44. package/dist/core/ry-element.d.ts +66 -0
  45. package/dist/core/ry-element.d.ts.map +1 -0
  46. package/dist/core/ry-icons.d.ts +38 -0
  47. package/dist/core/ry-icons.d.ts.map +1 -0
  48. package/dist/core/ry-transform.d.ts +35 -0
  49. package/dist/core/ry-transform.d.ts.map +1 -0
  50. package/dist/css/ry-base.css +155 -0
  51. package/dist/css/ry-components.css +1195 -0
  52. package/dist/css/ry-layout.css +240 -0
  53. package/dist/css/ry-structure.css +1737 -0
  54. package/dist/css/ry-theme.css +1433 -0
  55. package/dist/css/ry-tokens.css +145 -0
  56. package/dist/css/ry-ui.css +1207 -0
  57. package/dist/ry-ui.d.ts +54 -0
  58. package/dist/ry-ui.d.ts.map +1 -0
  59. package/dist/ry-ui.js +2433 -0
  60. package/dist/ry-ui.js.map +1 -0
  61. package/dist/types.d.ts +33 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/package.json +40 -0
@@ -0,0 +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-theme-toggle.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/components/ry-select.ts","../src/ts/core/ry-icons.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-color-picker.ts","../src/ts/components/ry-color-input.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 '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 'color-picker',\n 'color-input'\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 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.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-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-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-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.\n *\n * Usage:\n * <ry-field label=\"Email\">\n * <input type=\"email\" placeholder=\"you@example.com\">\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 setup(): void {\n this.#transformMarkup();\n }\n\n #transformMarkup(): void {\n // If already has label, skip\n if (this.$('[data-ry-target=\"label\"]')) return;\n\n const labelText = this.getAttribute('label');\n if (!labelText) return;\n\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 // data-ry-target for JS queries, class for CSS styling\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\n this.insertBefore(label, input);\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-select>\n *\n * Custom select dropdown component.\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 * 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 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\n // Store options reference\n _options: SelectOption[] = [];\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 // 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 this.value = initialValue;\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\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\n // data-ry-target for JS queries, class for CSS styling\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 ${opt.label}\n </div>\n `).join('');\n\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 // 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 this.#selectOption(option);\n this.close();\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 this.#selectOption(option);\n this.close();\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 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 #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 {\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 #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 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\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 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 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-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\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-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 * </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 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 `;\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\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-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-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 { RyThemeToggle } from './components/ry-theme-toggle.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 { 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 { 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';\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","RyButton","#handleClick","RyThemeToggle","#themes","#currentIndex","themesAttr","currentTheme","#getIcon","newTheme","btn","RyAlert","#transformMarkup","variant","dismissible","RyField","labelText","input","inputId","label","switchIdCounter","RySwitch","#input","#handleChange","id","checked","disabled","val","tooltipIdCounter","RyTooltip","#showTimeout","#tooltipEl","#tooltipId","#createTooltip","#scheduleShow","#hide","#show","position","RyDrawer","drawerId","side","DEFAULT_DURATION","RyToast","#timeout","#container","#getContainer","toast","message","duration","icon","icons","selectIdCounter","RySelect","#selectId","#highlightedIndex","#typeahead","#typeaheadTimeout","#handleOutsideClick","initialValue","opt","placeholder","nativeOptions","listboxOptions","i","option","#selectOption","#highlightNext","#highlightPrev","#highlightFirst","#highlightLast","#handleTypeahead","char","match","#highlightIndex","next","prev","optionEl","valueEl","nativeSelect","#positionDropdown","currentValue","dropdown","rect","dropdownHeight","spaceBelow","spaceAbove","RyOption","getIcon","registerIcon","svg","registerIcons","newIcons","getIconNames","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","source","stacked","codeEl","previewTemplate","RyIcon","_name","oldValue","newValue","size","svgEl","BOUNDARY_SELECTORS","registry","warnedGroups","findBoundaryAncestor","current","sel","checkForConflicts","buttons","boundaries","boundary","group","containerDescriptions","tag","RyToggleButton","#registered","#register","#unregister","#unpressOthers","siblings","wasPressed","RySlider","#dragging","#activeThumb","#track","#fill","#thumbs","#tooltips","#buildMarkup","#bindEvents","#updatePositions","isRange","showLabels","showTooltip","#buildLabels","min","max","customLabels","labelType","labels","ratio","rounded","l","#handleTrackDown","key","thumb","#handleThumbDown","#handlePointerMove","#handlePointerUp","#valueFromPointer","distToStart","distToEnd","#emitInput","#emitChange","step","largeStep","delta","#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","touch","clamped","percent","rotation","#formatValue","labelsAttr","hsvToRgb","hsv","h","s","v","r","g","b","f","p","q","rgbToHsv","rgb","d","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","expanded","#expandPartialHex","#updateSwatch","#isCompleteColor","padded","swatchColor","_RyToast"],"mappings":"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"}