@compa11y/web 0.1.2 → 0.1.5

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 (44) hide show
  1. package/dist/compa11y.iife.js +207 -89
  2. package/dist/compa11y.js +1253 -994
  3. package/dist/components/button.d.ts +0 -1
  4. package/dist/components/checkbox.d.ts +0 -1
  5. package/dist/components/combobox.d.ts +0 -1
  6. package/dist/components/dialog.d.ts +0 -1
  7. package/dist/components/dialog.test.d.ts +0 -1
  8. package/dist/components/input.d.ts +0 -1
  9. package/dist/components/listbox.d.ts +3 -4
  10. package/dist/components/menu.d.ts +3 -1
  11. package/dist/components/menu.test.d.ts +0 -1
  12. package/dist/components/radio-group.d.ts +0 -1
  13. package/dist/components/select.d.ts +0 -1
  14. package/dist/components/switch.d.ts +0 -1
  15. package/dist/components/tabs.d.ts +5 -1
  16. package/dist/components/tabs.test.d.ts +0 -1
  17. package/dist/components/textarea.d.ts +0 -1
  18. package/dist/components/toast.d.ts +48 -0
  19. package/dist/index.d.ts +2 -2
  20. package/dist/utils/base-element.d.ts +0 -1
  21. package/dist/utils/styles.d.ts +5 -2
  22. package/package.json +2 -2
  23. package/dist/compa11y.iife.js.map +0 -1
  24. package/dist/compa11y.js.map +0 -1
  25. package/dist/compa11y.umd.cjs +0 -1633
  26. package/dist/compa11y.umd.cjs.map +0 -1
  27. package/dist/components/button.d.ts.map +0 -1
  28. package/dist/components/checkbox.d.ts.map +0 -1
  29. package/dist/components/combobox.d.ts.map +0 -1
  30. package/dist/components/dialog.d.ts.map +0 -1
  31. package/dist/components/dialog.test.d.ts.map +0 -1
  32. package/dist/components/input.d.ts.map +0 -1
  33. package/dist/components/listbox.d.ts.map +0 -1
  34. package/dist/components/menu.d.ts.map +0 -1
  35. package/dist/components/menu.test.d.ts.map +0 -1
  36. package/dist/components/radio-group.d.ts.map +0 -1
  37. package/dist/components/select.d.ts.map +0 -1
  38. package/dist/components/switch.d.ts.map +0 -1
  39. package/dist/components/tabs.d.ts.map +0 -1
  40. package/dist/components/tabs.test.d.ts.map +0 -1
  41. package/dist/components/textarea.d.ts.map +0 -1
  42. package/dist/index.d.ts.map +0 -1
  43. package/dist/utils/base-element.d.ts.map +0 -1
  44. package/dist/utils/styles.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"compa11y.js","sources":["../src/utils/base-element.ts","../src/utils/styles.ts","../src/components/dialog.ts","../src/components/menu.ts","../src/components/tabs.ts","../src/components/combobox.ts","../src/components/switch.ts","../src/components/select.ts","../src/components/input.ts","../src/components/textarea.ts","../src/components/button.ts","../src/components/listbox.ts","../src/components/checkbox.ts","../src/components/radio-group.ts","../src/index.ts"],"sourcesContent":["/**\n * Base class for compa11y Web Components\n */\n\nimport { generateId } from '@compa11y/core';\n\nexport abstract class Compa11yElement extends HTMLElement {\n protected _internals: ElementInternals | null = null;\n protected _id: string;\n\n constructor() {\n super();\n this._id = generateId(this.tagName.toLowerCase().replace('a11y-', ''));\n\n // Use ElementInternals if available\n if ('attachInternals' in this) {\n this._internals = this.attachInternals();\n }\n }\n\n /**\n * Standard observed attributes\n */\n static get observedAttributes(): string[] {\n return [];\n }\n\n /**\n * Called when element is added to DOM\n */\n connectedCallback(): void {\n this.setupAccessibility();\n this.render();\n this.setupEventListeners();\n }\n\n /**\n * Called when element is removed from DOM\n */\n disconnectedCallback(): void {\n this.cleanupEventListeners();\n }\n\n /**\n * Called when observed attributes change\n */\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue !== newValue) {\n this.onAttributeChange(name, oldValue, newValue);\n }\n }\n\n /**\n * Set up ARIA attributes and roles\n */\n protected abstract setupAccessibility(): void;\n\n /**\n * Render the component\n */\n protected abstract render(): void;\n\n /**\n * Set up event listeners\n */\n protected setupEventListeners(): void {}\n\n /**\n * Clean up event listeners\n */\n protected cleanupEventListeners(): void {}\n\n /**\n * Handle attribute changes\n */\n protected onAttributeChange(\n _name: string,\n _oldValue: string | null,\n _newValue: string | null\n ): void {}\n\n /**\n * Emit a custom event\n */\n protected emit<T>(name: string, detail?: T): boolean {\n return this.dispatchEvent(\n new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n }\n\n /**\n * Query a slot\n */\n protected getSlot(name: string): HTMLSlotElement | null {\n return this.shadowRoot?.querySelector(`slot[name=\"${name}\"]`) ?? null;\n }\n\n /**\n * Get slotted elements\n */\n protected getSlottedElements(slotName?: string): Element[] {\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = this.shadowRoot?.querySelector(\n selector\n ) as HTMLSlotElement | null;\n return slot?.assignedElements() ?? [];\n }\n}\n\n/**\n * Helper to define a custom element safely\n */\nexport function defineElement(\n name: string,\n constructor: CustomElementConstructor\n): void {\n if (!customElements.get(name)) {\n customElements.define(name, constructor);\n }\n}\n","/**\n * Shared styles for compa11y Web Components\n */\n\nexport const VISUALLY_HIDDEN_STYLES = `\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n\nexport const RESET_BUTTON_STYLES = `\n appearance: none;\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n cursor: pointer;\n`;\n\nexport const FOCUS_VISIBLE_STYLES = `\n :host(:focus-visible),\n :focus-visible {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n`;\n\n/**\n * Base styles shared by all components\n */\nexport const BASE_STYLES = `\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: inherit;\n }\n\n ${FOCUS_VISIBLE_STYLES}\n`;\n\n/**\n * Dialog-specific styles\n */\nexport const DIALOG_STYLES = `\n ${BASE_STYLES}\n\n :host {\n position: fixed;\n inset: 0;\n z-index: var(--compa11y-dialog-z-index, 9999);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .overlay {\n position: absolute;\n inset: 0;\n background: var(--compa11y-dialog-overlay-bg, rgba(0, 0, 0, 0.5));\n }\n\n .dialog {\n position: relative;\n background: var(--compa11y-dialog-bg, white);\n border-radius: var(--compa11y-dialog-radius, 8px);\n padding: var(--compa11y-dialog-padding, 1.5rem);\n max-width: var(--compa11y-dialog-max-width, 500px);\n max-height: var(--compa11y-dialog-max-height, 85vh);\n overflow: auto;\n box-shadow: var(--compa11y-dialog-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.25));\n }\n\n ::slotted([slot=\"title\"]) {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n ::slotted([slot=\"description\"]) {\n margin: 0 0 1rem 0;\n color: var(--compa11y-dialog-description-color, #666);\n }\n`;\n\n/**\n * Menu-specific styles\n */\nexport const MENU_STYLES = `\n ${BASE_STYLES}\n\n :host {\n position: relative;\n display: inline-block;\n }\n\n .menu-content {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: var(--compa11y-menu-z-index, 1000);\n min-width: var(--compa11y-menu-min-width, 160px);\n background: var(--compa11y-menu-bg, white);\n border: var(--compa11y-menu-border, 1px solid #e0e0e0);\n border-radius: var(--compa11y-menu-radius, 4px);\n box-shadow: var(--compa11y-menu-shadow, 0 4px 6px -1px rgba(0, 0, 0, 0.1));\n padding: var(--compa11y-menu-padding, 0.25rem 0);\n margin-top: var(--compa11y-menu-offset, 4px);\n }\n\n .menu-content[hidden] {\n display: none;\n }\n\n ::slotted([role=\"menuitem\"]) {\n display: block;\n width: 100%;\n padding: 0.5rem 1rem;\n text-align: left;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n }\n\n ::slotted([role=\"menuitem\"]:hover),\n ::slotted([role=\"menuitem\"][data-highlighted=\"true\"]) {\n background: var(--compa11y-menu-item-hover-bg, #f5f5f5);\n }\n\n ::slotted([role=\"menuitem\"][aria-disabled=\"true\"]) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n ::slotted([role=\"separator\"]) {\n height: 1px;\n margin: 0.25rem 0;\n background: var(--compa11y-menu-separator-color, #e0e0e0);\n }\n`;\n\n/**\n * Tabs-specific styles\n */\nexport const TABS_STYLES = `\n ${BASE_STYLES}\n\n .tablist {\n display: flex;\n border-bottom: var(--compa11y-tabs-border, 1px solid #e0e0e0);\n gap: var(--compa11y-tabs-gap, 0);\n }\n\n :host([orientation=\"vertical\"]) .tablist {\n flex-direction: column;\n border-bottom: none;\n border-right: var(--compa11y-tabs-border, 1px solid #e0e0e0);\n }\n\n ::slotted([role=\"tab\"]) {\n ${RESET_BUTTON_STYLES}\n padding: var(--compa11y-tab-padding, 0.75rem 1rem);\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n font-weight: 500;\n color: var(--compa11y-tab-color, #666);\n transition: all 0.15s ease;\n }\n\n ::slotted([role=\"tab\"]:hover) {\n color: var(--compa11y-tab-hover-color, #333);\n }\n\n ::slotted([role=\"tab\"][aria-selected=\"true\"]) {\n color: var(--compa11y-tab-active-color, #0066cc);\n border-bottom-color: currentColor;\n }\n\n ::slotted([role=\"tab\"][aria-disabled=\"true\"]) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n ::slotted([role=\"tabpanel\"]) {\n padding: var(--compa11y-tabpanel-padding, 1rem 0);\n }\n\n ::slotted([role=\"tabpanel\"][hidden]) {\n display: none;\n }\n`;\n\n/**\n * Combobox-specific styles\n */\nexport const COMBOBOX_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n position: relative;\n width: var(--compa11y-combobox-width, 250px);\n }\n\n .combobox-wrapper {\n position: relative;\n }\n\n .input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n input {\n width: 100%;\n padding: var(--compa11y-combobox-input-padding, 0.5rem 2rem 0.5rem 0.75rem);\n border: var(--compa11y-combobox-border, 1px solid #ccc);\n border-radius: var(--compa11y-combobox-radius, 4px);\n font: inherit;\n background: var(--compa11y-combobox-bg, white);\n color: var(--compa11y-combobox-color, inherit);\n }\n\n input:focus {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: -1px;\n border-color: var(--compa11y-focus-color, #0066cc);\n }\n\n input::placeholder {\n color: var(--compa11y-combobox-placeholder-color, #999);\n }\n\n input:disabled {\n background: var(--compa11y-combobox-disabled-bg, #f5f5f5);\n cursor: not-allowed;\n opacity: 0.7;\n }\n\n .chevron {\n position: absolute;\n right: 0.5rem;\n pointer-events: none;\n font-size: 0.75rem;\n color: var(--compa11y-combobox-chevron-color, #666);\n transition: transform 0.15s ease;\n }\n\n :host([open]) .chevron {\n transform: rotate(180deg);\n }\n\n .clear-button {\n ${RESET_BUTTON_STYLES}\n position: absolute;\n right: 1.5rem;\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 1rem;\n color: var(--compa11y-combobox-clear-color, #666);\n }\n\n .clear-button:hover {\n background: var(--compa11y-combobox-clear-hover-bg, rgba(0, 0, 0, 0.1));\n }\n\n .clear-button[hidden] {\n display: none;\n }\n\n .listbox {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: var(--compa11y-combobox-z-index, 1000);\n max-height: var(--compa11y-combobox-max-height, 200px);\n overflow-y: auto;\n margin: 0;\n padding: var(--compa11y-combobox-listbox-padding, 0.25rem 0);\n background: var(--compa11y-combobox-listbox-bg, white);\n border: var(--compa11y-combobox-listbox-border, 1px solid #e0e0e0);\n border-radius: var(--compa11y-combobox-radius, 4px);\n box-shadow: var(--compa11y-combobox-shadow, 0 4px 6px -1px rgba(0, 0, 0, 0.1));\n list-style: none;\n }\n\n /* Flip chevron when listbox is positioned above */\n :host([data-position=\"top\"]) .chevron {\n transform: rotate(180deg);\n }\n\n :host([data-position=\"top\"][open]) .chevron {\n transform: rotate(0deg);\n }\n\n .listbox[hidden] {\n display: none;\n }\n\n .listbox li[role=\"option\"] {\n padding: var(--compa11y-combobox-option-padding, 0.5rem 0.75rem);\n cursor: pointer;\n transition: background 0.1s ease;\n }\n\n .listbox li[role=\"option\"]:hover,\n .listbox li[role=\"option\"].highlighted {\n background: var(--compa11y-combobox-option-hover-bg, #f5f5f5);\n }\n\n .listbox li[role=\"option\"][aria-selected=\"true\"] {\n background: var(--compa11y-combobox-option-selected-bg, #e6f0ff);\n font-weight: 500;\n }\n\n .listbox li[role=\"option\"].disabled,\n .listbox li[role=\"option\"][aria-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .empty-message {\n padding: var(--compa11y-combobox-option-padding, 0.5rem 0.75rem);\n color: var(--compa11y-combobox-empty-color, #666);\n font-style: italic;\n }\n\n .options-source {\n display: none;\n }\n`;\n\n/**\n * Select-specific styles\n */\nexport const SELECT_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n position: relative;\n width: var(--compa11y-select-width, 250px);\n }\n\n .select-wrapper {\n position: relative;\n }\n\n .select-trigger {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--compa11y-select-trigger-padding, 0.5rem 2rem 0.5rem 0.75rem);\n border: var(--compa11y-select-border, 1px solid #ccc);\n border-radius: var(--compa11y-select-radius, 4px);\n font: inherit;\n background: var(--compa11y-select-bg, white);\n color: var(--compa11y-select-color, inherit);\n cursor: pointer;\n text-align: left;\n position: relative;\n appearance: none;\n }\n\n .select-trigger:focus {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: -1px;\n border-color: var(--compa11y-focus-color, #0066cc);\n }\n\n .select-trigger:disabled {\n background: var(--compa11y-select-disabled-bg, #f5f5f5);\n cursor: not-allowed;\n opacity: 0.7;\n }\n\n .select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .select-value.placeholder {\n color: var(--compa11y-select-placeholder-color, #999);\n }\n\n .chevron {\n position: absolute;\n right: 0.5rem;\n pointer-events: none;\n font-size: 0.75rem;\n color: var(--compa11y-select-chevron-color, #666);\n transition: transform 0.15s ease;\n }\n\n :host([open]) .chevron {\n transform: rotate(180deg);\n }\n\n :host([data-position=\"top\"]) .chevron {\n transform: rotate(180deg);\n }\n\n :host([data-position=\"top\"][open]) .chevron {\n transform: rotate(0deg);\n }\n\n .listbox {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: var(--compa11y-select-z-index, 1000);\n max-height: var(--compa11y-select-max-height, 200px);\n overflow-y: auto;\n margin: 0;\n padding: var(--compa11y-select-listbox-padding, 0.25rem 0);\n background: var(--compa11y-select-listbox-bg, white);\n border: var(--compa11y-select-listbox-border, 1px solid #e0e0e0);\n border-radius: var(--compa11y-select-radius, 4px);\n box-shadow: var(--compa11y-select-shadow, 0 4px 6px -1px rgba(0, 0, 0, 0.1));\n list-style: none;\n margin-top: 4px;\n }\n\n .listbox[hidden] {\n display: none;\n }\n\n .listbox li[role=\"option\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--compa11y-select-option-padding, 0.5rem 0.75rem);\n cursor: pointer;\n transition: background 0.1s ease;\n }\n\n .listbox li[role=\"option\"]:hover,\n .listbox li[role=\"option\"].highlighted {\n background: var(--compa11y-select-option-hover-bg, #f5f5f5);\n }\n\n .listbox li[role=\"option\"][aria-selected=\"true\"] {\n background: var(--compa11y-select-option-selected-bg, #e6f0ff);\n font-weight: 500;\n }\n\n .listbox li[role=\"option\"].disabled,\n .listbox li[role=\"option\"][aria-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .check-mark {\n font-size: 0.875rem;\n color: var(--compa11y-select-check-color, #0066cc);\n margin-left: 0.5rem;\n }\n\n .options-source {\n display: none;\n }\n`;\n\n/**\n * Switch-specific styles\n */\nexport const SWITCH_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n }\n\n .switch-wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--compa11y-switch-gap, 0.5rem);\n }\n\n /* Size variants */\n .switch-wrapper.size-sm .switch-track {\n width: var(--compa11y-switch-width-sm, 32px);\n height: var(--compa11y-switch-height-sm, 18px);\n }\n\n .switch-wrapper.size-sm .switch-thumb {\n width: var(--compa11y-switch-thumb-sm, 14px);\n height: var(--compa11y-switch-thumb-sm, 14px);\n }\n\n .switch-wrapper.size-sm .switch-track.checked .switch-thumb {\n transform: translateX(14px);\n }\n\n .switch-wrapper.size-md .switch-track {\n width: var(--compa11y-switch-width-md, 44px);\n height: var(--compa11y-switch-height-md, 24px);\n }\n\n .switch-wrapper.size-md .switch-thumb {\n width: var(--compa11y-switch-thumb-md, 20px);\n height: var(--compa11y-switch-thumb-md, 20px);\n }\n\n .switch-wrapper.size-md .switch-track.checked .switch-thumb {\n transform: translateX(20px);\n }\n\n .switch-wrapper.size-lg .switch-track {\n width: var(--compa11y-switch-width-lg, 56px);\n height: var(--compa11y-switch-height-lg, 30px);\n }\n\n .switch-wrapper.size-lg .switch-thumb {\n width: var(--compa11y-switch-thumb-lg, 26px);\n height: var(--compa11y-switch-thumb-lg, 26px);\n }\n\n .switch-wrapper.size-lg .switch-track.checked .switch-thumb {\n transform: translateX(26px);\n }\n\n .switch-track {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n padding: 2px;\n border: none;\n border-radius: var(--compa11y-switch-radius, 9999px);\n background: var(--compa11y-switch-bg, #d1d5db);\n cursor: pointer;\n transition: background-color 0.2s ease;\n outline: none;\n }\n\n .switch-track:focus-visible {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n\n .switch-track.checked {\n background: var(--compa11y-switch-checked-bg, #0066cc);\n }\n\n .switch-track:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .switch-thumb {\n position: absolute;\n left: 2px;\n background: var(--compa11y-switch-thumb-bg, white);\n border-radius: 50%;\n box-shadow: var(--compa11y-switch-thumb-shadow, 0 1px 3px rgba(0, 0, 0, 0.2));\n transition: transform 0.2s ease;\n pointer-events: none;\n }\n\n .switch-label {\n user-select: none;\n cursor: pointer;\n color: var(--compa11y-switch-label-color, inherit);\n }\n\n .switch-label.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\n/**\n * Input-specific styles\n */\nexport const INPUT_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n width: var(--compa11y-input-width, 100%);\n }\n\n .input-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .input-label {\n display: block;\n color: var(--compa11y-input-label-color, inherit);\n font-size: var(--compa11y-input-label-size, 0.875rem);\n font-weight: var(--compa11y-input-label-weight, 500);\n }\n\n :host([disabled]) .input-label {\n color: var(--compa11y-input-disabled-color, #999);\n }\n\n .input-required {\n color: var(--compa11y-input-required-color, #ef4444);\n margin-left: 0.125rem;\n }\n\n input {\n width: 100%;\n padding: var(--compa11y-input-padding, 0.5rem 0.75rem);\n border: var(--compa11y-input-border, 1px solid #ccc);\n border-radius: var(--compa11y-input-radius, 4px);\n font: inherit;\n font-size: var(--compa11y-input-font-size, 0.875rem);\n background: var(--compa11y-input-bg, white);\n color: inherit;\n }\n\n input:focus {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: -1px;\n border-color: var(--compa11y-input-border-focus, #0066cc);\n }\n\n input::placeholder {\n color: var(--compa11y-input-placeholder-color, #999);\n }\n\n input:disabled {\n background: var(--compa11y-input-disabled-bg, #f5f5f5);\n cursor: not-allowed;\n opacity: var(--compa11y-input-disabled-opacity, 0.7);\n }\n\n input[readonly] {\n background: var(--compa11y-input-readonly-bg, #f9f9f9);\n }\n\n :host([data-error=\"true\"]) input {\n border-color: var(--compa11y-input-border-error, #ef4444);\n }\n\n :host([data-error=\"true\"]) input:focus {\n outline-color: var(--compa11y-input-border-error, #ef4444);\n border-color: var(--compa11y-input-border-error, #ef4444);\n }\n\n .input-hint {\n color: var(--compa11y-input-hint-color, #666);\n font-size: var(--compa11y-input-hint-size, 0.8125rem);\n }\n\n .input-error {\n color: var(--compa11y-input-error-color, #ef4444);\n font-size: var(--compa11y-input-error-size, 0.8125rem);\n }\n`;\n\n/**\n * Textarea-specific styles\n */\nexport const TEXTAREA_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n width: var(--compa11y-textarea-width, 100%);\n }\n\n .textarea-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .textarea-label {\n display: block;\n color: var(--compa11y-textarea-label-color, inherit);\n font-size: var(--compa11y-textarea-label-size, 0.875rem);\n font-weight: var(--compa11y-textarea-label-weight, 500);\n }\n\n :host([disabled]) .textarea-label {\n color: var(--compa11y-textarea-disabled-color, #999);\n }\n\n .textarea-required {\n color: var(--compa11y-textarea-required-color, #ef4444);\n margin-left: 0.125rem;\n }\n\n textarea {\n width: 100%;\n padding: var(--compa11y-textarea-padding, 0.5rem 0.75rem);\n border: var(--compa11y-textarea-border, 1px solid #ccc);\n border-radius: var(--compa11y-textarea-radius, 4px);\n font: inherit;\n font-size: var(--compa11y-textarea-font-size, 0.875rem);\n line-height: 1.5;\n background: var(--compa11y-textarea-bg, white);\n color: inherit;\n resize: var(--compa11y-textarea-resize, vertical);\n }\n\n textarea:focus {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: -1px;\n border-color: var(--compa11y-textarea-border-focus, #0066cc);\n }\n\n textarea::placeholder {\n color: var(--compa11y-textarea-placeholder-color, #999);\n }\n\n textarea:disabled {\n background: var(--compa11y-textarea-disabled-bg, #f5f5f5);\n cursor: not-allowed;\n opacity: var(--compa11y-textarea-disabled-opacity, 0.7);\n }\n\n textarea[readonly] {\n background: var(--compa11y-textarea-readonly-bg, #f9f9f9);\n }\n\n :host([data-error=\"true\"]) textarea {\n border-color: var(--compa11y-textarea-border-error, #ef4444);\n }\n\n :host([data-error=\"true\"]) textarea:focus {\n outline-color: var(--compa11y-textarea-border-error, #ef4444);\n border-color: var(--compa11y-textarea-border-error, #ef4444);\n }\n\n .textarea-hint {\n color: var(--compa11y-textarea-hint-color, #666);\n font-size: var(--compa11y-textarea-hint-size, 0.8125rem);\n }\n\n .textarea-error {\n color: var(--compa11y-textarea-error-color, #ef4444);\n font-size: var(--compa11y-textarea-error-size, 0.8125rem);\n }\n`;\n\n/**\n * Button-specific styles\n */\nexport const BUTTON_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n }\n\n @keyframes compa11y-spin {\n to { transform: rotate(360deg); }\n }\n\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border-radius: var(--compa11y-button-radius, 4px);\n font: inherit;\n font-weight: var(--compa11y-button-font-weight, 500);\n line-height: 1.5;\n cursor: pointer;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n appearance: none;\n text-decoration: none;\n }\n\n button:focus-visible {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n\n /* Sizes */\n button.size-sm {\n padding: var(--compa11y-button-padding-sm, 0.25rem 0.5rem);\n font-size: var(--compa11y-button-font-size-sm, 0.75rem);\n }\n\n button.size-md {\n padding: var(--compa11y-button-padding-md, 0.5rem 1rem);\n font-size: var(--compa11y-button-font-size-md, 0.875rem);\n }\n\n button.size-lg {\n padding: var(--compa11y-button-padding-lg, 0.75rem 1.5rem);\n font-size: var(--compa11y-button-font-size-lg, 1rem);\n }\n\n /* Variants */\n button.variant-primary {\n background: var(--compa11y-button-primary-bg, #0066cc);\n color: var(--compa11y-button-primary-color, white);\n border: var(--compa11y-button-primary-border, 1px solid #0066cc);\n }\n\n button.variant-primary:hover:not(:disabled):not([aria-disabled=\"true\"]) {\n background: var(--compa11y-button-primary-hover-bg, #0052a3);\n }\n\n button.variant-secondary {\n background: var(--compa11y-button-secondary-bg, white);\n color: var(--compa11y-button-secondary-color, #333);\n border: var(--compa11y-button-secondary-border, 1px solid #ccc);\n }\n\n button.variant-secondary:hover:not(:disabled):not([aria-disabled=\"true\"]) {\n background: var(--compa11y-button-secondary-hover-bg, #f0f0f0);\n }\n\n button.variant-danger {\n background: var(--compa11y-button-danger-bg, #ef4444);\n color: var(--compa11y-button-danger-color, white);\n border: var(--compa11y-button-danger-border, 1px solid #ef4444);\n }\n\n button.variant-danger:hover:not(:disabled):not([aria-disabled=\"true\"]) {\n background: var(--compa11y-button-danger-hover-bg, #dc2626);\n }\n\n button.variant-outline {\n background: var(--compa11y-button-outline-bg, transparent);\n color: var(--compa11y-button-outline-color, #0066cc);\n border: var(--compa11y-button-outline-border, 1px solid #0066cc);\n }\n\n button.variant-outline:hover:not(:disabled):not([aria-disabled=\"true\"]) {\n background: var(--compa11y-button-outline-hover-bg, rgba(0, 102, 204, 0.05));\n }\n\n button.variant-ghost {\n background: var(--compa11y-button-ghost-bg, transparent);\n color: var(--compa11y-button-ghost-color, #333);\n border: var(--compa11y-button-ghost-border, 1px solid transparent);\n }\n\n button.variant-ghost:hover:not(:disabled):not([aria-disabled=\"true\"]) {\n background: var(--compa11y-button-ghost-hover-bg, rgba(0, 0, 0, 0.05));\n }\n\n /* Disabled */\n button:disabled,\n button[aria-disabled=\"true\"] {\n opacity: var(--compa11y-button-disabled-opacity, 0.5);\n cursor: not-allowed;\n }\n\n /* Loading spinner */\n .button-spinner {\n display: inline-block;\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: compa11y-spin 0.6s linear infinite;\n }\n`;\n\n/**\n * Listbox-specific styles\n */\nexport const LISTBOX_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n width: var(--compa11y-listbox-width, 250px);\n }\n\n .listbox-wrapper {\n max-height: var(--compa11y-listbox-max-height, 300px);\n overflow-y: auto;\n border: var(--compa11y-listbox-border, 1px solid #e0e0e0);\n border-radius: var(--compa11y-listbox-radius, 4px);\n background: var(--compa11y-listbox-bg, white);\n padding: var(--compa11y-listbox-padding, 0.25rem 0);\n }\n\n :host([disabled]) .listbox-wrapper {\n opacity: var(--compa11y-listbox-disabled-opacity, 0.5);\n cursor: not-allowed;\n }\n\n :host(:focus-visible) .listbox-wrapper {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n\n :host([orientation=\"horizontal\"]) .listbox-wrapper {\n display: flex;\n flex-wrap: wrap;\n max-height: none;\n overflow-y: visible;\n }\n`;\n\n/**\n * Option-specific styles (for a11y-option inside listbox)\n */\nexport const OPTION_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n }\n\n .option-wrapper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--compa11y-listbox-option-padding, 0.5rem 0.75rem);\n cursor: pointer;\n transition: background 0.1s ease;\n user-select: none;\n }\n\n :host([data-focused]) .option-wrapper {\n background: var(--compa11y-listbox-option-hover-bg, #f5f5f5);\n }\n\n :host([aria-selected=\"true\"]) .option-wrapper {\n background: var(--compa11y-listbox-option-selected-bg, #e6f0ff);\n font-weight: 500;\n }\n\n :host([aria-selected=\"true\"][data-focused]) .option-wrapper {\n background: var(--compa11y-listbox-option-selected-hover-bg, #cce0ff);\n }\n\n :host([aria-disabled=\"true\"]) .option-wrapper {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .option-content {\n flex: 1;\n }\n\n .check-mark {\n font-size: 0.875rem;\n color: var(--compa11y-listbox-check-color, #0066cc);\n margin-left: 0.5rem;\n visibility: hidden;\n }\n\n :host([aria-selected=\"true\"]) .check-mark {\n visibility: visible;\n }\n`;\n\n/**\n * Optgroup-specific styles (for a11y-optgroup inside listbox)\n */\nexport const OPTGROUP_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n }\n\n .optgroup-label {\n padding: var(--compa11y-listbox-group-label-padding, 0.5rem 0.75rem 0.25rem);\n font-size: var(--compa11y-listbox-group-label-size, 0.75rem);\n font-weight: var(--compa11y-listbox-group-label-weight, 600);\n color: var(--compa11y-listbox-group-label-color, #666);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n }\n`;\n\n/**\n * Checkbox-specific styles\n */\nexport const CHECKBOX_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n }\n\n .checkbox-wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--compa11y-checkbox-gap, 0.5rem);\n cursor: pointer;\n user-select: none;\n }\n\n :host([disabled]) .checkbox-wrapper {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .checkbox-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .checkbox-input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n cursor: inherit;\n z-index: 1;\n }\n\n .checkbox-indicator {\n width: var(--compa11y-checkbox-size, 1.25rem);\n height: var(--compa11y-checkbox-size, 1.25rem);\n min-width: 24px;\n min-height: 24px;\n border: var(--compa11y-checkbox-border, 2px solid #666);\n border-radius: var(--compa11y-checkbox-radius, 3px);\n background: var(--compa11y-checkbox-bg, white);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s ease;\n pointer-events: none;\n }\n\n :host([checked]) .checkbox-indicator {\n background: var(--compa11y-checkbox-checked-bg, #0066cc);\n border-color: var(--compa11y-checkbox-checked-border, #0066cc);\n }\n\n :host([indeterminate]) .checkbox-indicator {\n background: var(--compa11y-checkbox-checked-bg, #0066cc);\n border-color: var(--compa11y-checkbox-checked-border, #0066cc);\n }\n\n /* Size variants */\n .checkbox-wrapper.size-sm .checkbox-indicator {\n width: var(--compa11y-checkbox-size-sm, 1rem);\n height: var(--compa11y-checkbox-size-sm, 1rem);\n min-width: 24px;\n min-height: 24px;\n }\n\n .checkbox-wrapper.size-lg .checkbox-indicator {\n width: var(--compa11y-checkbox-size-lg, 1.5rem);\n height: var(--compa11y-checkbox-size-lg, 1.5rem);\n }\n\n /* Check mark SVG */\n .checkbox-check {\n opacity: 0;\n transform: scale(0);\n transition: all 0.15s ease;\n color: var(--compa11y-checkbox-check-color, white);\n }\n\n :host([checked]) .checkbox-check {\n opacity: 1;\n transform: scale(1);\n }\n\n :host([indeterminate]) .checkbox-check {\n opacity: 0;\n transform: scale(0);\n }\n\n /* Indeterminate dash */\n .checkbox-dash {\n opacity: 0;\n transition: all 0.15s ease;\n color: var(--compa11y-checkbox-check-color, white);\n }\n\n :host([indeterminate]) .checkbox-dash {\n opacity: 1;\n }\n\n /* Focus visible on indicator when input is focused */\n .checkbox-input:focus-visible + .checkbox-indicator {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n\n /* Hover */\n .checkbox-wrapper:hover:not([disabled]) .checkbox-indicator {\n border-color: var(--compa11y-checkbox-hover-border, #0066cc);\n }\n\n /* Label and text */\n .checkbox-content {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n padding-top: 0.125rem;\n }\n\n .checkbox-label {\n color: var(--compa11y-checkbox-label-color, inherit);\n font-size: var(--compa11y-checkbox-label-size, 1rem);\n cursor: inherit;\n }\n\n .checkbox-hint {\n color: var(--compa11y-checkbox-hint-color, #666);\n font-size: var(--compa11y-checkbox-hint-size, 0.8125rem);\n }\n\n .checkbox-error {\n color: var(--compa11y-checkbox-error-color, #ef4444);\n font-size: var(--compa11y-checkbox-error-size, 0.8125rem);\n }\n\n .checkbox-required {\n color: var(--compa11y-checkbox-required-color, #ef4444);\n margin-left: 0.125rem;\n }\n\n /* Forced colors / high contrast mode */\n @media (forced-colors: active) {\n .checkbox-indicator {\n border: 2px solid ButtonText;\n }\n\n :host([checked]) .checkbox-indicator,\n :host([indeterminate]) .checkbox-indicator {\n background: Highlight;\n border-color: Highlight;\n }\n\n .checkbox-check,\n .checkbox-dash {\n color: HighlightText;\n }\n }\n`;\n\n/**\n * CheckboxGroup-specific styles\n */\nexport const CHECKBOX_GROUP_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n }\n\n fieldset {\n border: none;\n margin: 0;\n padding: 0;\n min-width: 0;\n }\n\n legend {\n padding: 0;\n margin-bottom: var(--compa11y-checkbox-group-legend-gap, 0.5rem);\n font-weight: var(--compa11y-checkbox-group-legend-weight, 600);\n color: var(--compa11y-checkbox-group-legend-color, inherit);\n font-size: var(--compa11y-checkbox-group-legend-size, 1rem);\n }\n\n .checkbox-group-items {\n display: flex;\n flex-direction: column;\n gap: var(--compa11y-checkbox-group-gap, 0.75rem);\n }\n\n :host([orientation=\"horizontal\"]) .checkbox-group-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .checkbox-group-error {\n color: var(--compa11y-checkbox-group-error-color, #ef4444);\n font-size: var(--compa11y-checkbox-group-error-size, 0.8125rem);\n margin-top: 0.25rem;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n }\n`;\n\n/**\n * RadioGroup-specific styles\n */\nexport const RADIO_GROUP_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: block;\n }\n\n fieldset {\n border: none;\n margin: 0;\n padding: 0;\n min-width: 0;\n }\n\n legend {\n padding: 0;\n margin-bottom: var(--compa11y-radio-group-legend-gap, 0.5rem);\n font-weight: var(--compa11y-radio-group-legend-weight, 600);\n color: var(--compa11y-radio-group-legend-color, inherit);\n font-size: var(--compa11y-radio-group-legend-size, 1rem);\n }\n\n .radio-group-items {\n display: flex;\n flex-direction: column;\n gap: var(--compa11y-radio-group-gap, 0.75rem);\n }\n\n :host([orientation=\"horizontal\"]) .radio-group-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .radio-group-hint {\n color: var(--compa11y-radio-group-hint-color, #666);\n font-size: var(--compa11y-radio-group-hint-size, 0.8125rem);\n margin-top: 0.25rem;\n }\n\n .radio-group-error {\n color: var(--compa11y-radio-group-error-color, #ef4444);\n font-size: var(--compa11y-radio-group-error-size, 0.8125rem);\n margin-top: 0.25rem;\n }\n\n .radio-group-required {\n color: var(--compa11y-radio-group-required-color, #ef4444);\n margin-left: 0.125rem;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n }\n`;\n\n/**\n * Radio-specific styles\n */\nexport const RADIO_STYLES = `\n ${BASE_STYLES}\n\n :host {\n display: inline-block;\n }\n\n .radio-wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--compa11y-radio-gap, 0.5rem);\n cursor: pointer;\n user-select: none;\n }\n\n :host([disabled]) .radio-wrapper {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .radio-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .radio-input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n cursor: inherit;\n z-index: 1;\n }\n\n .radio-circle {\n width: var(--compa11y-radio-size, 1.25rem);\n height: var(--compa11y-radio-size, 1.25rem);\n min-width: 24px;\n min-height: 24px;\n border: var(--compa11y-radio-border, 2px solid #666);\n border-radius: 50%;\n background: var(--compa11y-radio-bg, white);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s ease;\n pointer-events: none;\n }\n\n :host([checked]) .radio-circle {\n background: var(--compa11y-radio-checked-bg, #0066cc);\n border-color: var(--compa11y-radio-checked-border, #0066cc);\n }\n\n /* Focus visible on circle when input is focused */\n .radio-input:focus-visible + .radio-circle {\n outline: 2px solid var(--compa11y-focus-color, #0066cc);\n outline-offset: 2px;\n }\n\n /* Hover */\n .radio-wrapper:hover:not([disabled]) .radio-circle {\n border-color: var(--compa11y-radio-hover-border, #0066cc);\n }\n\n /* Inner dot */\n .radio-dot {\n width: var(--compa11y-radio-dot-size, 0.5rem);\n height: var(--compa11y-radio-dot-size, 0.5rem);\n border-radius: 50%;\n background: var(--compa11y-radio-dot-color, white);\n opacity: 0;\n transform: scale(0);\n transition: all 0.15s ease;\n }\n\n :host([checked]) .radio-dot {\n opacity: 1;\n transform: scale(1);\n }\n\n /* Label and text */\n .radio-content {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n padding-top: 0.125rem;\n }\n\n .radio-label {\n color: var(--compa11y-radio-label-color, inherit);\n font-size: var(--compa11y-radio-label-size, 1rem);\n cursor: inherit;\n }\n\n .radio-hint {\n color: var(--compa11y-radio-hint-color, #666);\n font-size: var(--compa11y-radio-hint-size, 0.8125rem);\n }\n\n /* Forced colors / high contrast mode */\n @media (forced-colors: active) {\n .radio-circle {\n border: 2px solid ButtonText;\n }\n\n :host([checked]) .radio-circle {\n background: Highlight;\n border-color: Highlight;\n }\n\n .radio-dot {\n background: HighlightText;\n }\n }\n`;\n","/**\n * compa11y Dialog Web Component\n *\n * Usage:\n * <a11y-dialog trigger=\"#open-btn\">\n * <h2 slot=\"title\">Dialog Title</h2>\n * <p slot=\"description\">Optional description</p>\n * <div>Dialog content here</div>\n * </a11y-dialog>\n */\n\nimport { announce } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { DIALOG_STYLES } from '../utils/styles';\n\nconst FOCUSABLE_SELECTOR =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport class A11yDialog extends Compa11yElement {\n private _open = false;\n private _previouslyFocused: HTMLElement | null = null;\n private _triggerElement: HTMLElement | null = null;\n\n static get observedAttributes() {\n return ['open', 'trigger', 'close-on-outside-click', 'close-on-escape'];\n }\n\n get open(): boolean {\n return this._open;\n }\n\n set open(value: boolean) {\n const oldValue = this._open;\n this._open = value;\n\n if (value !== oldValue) {\n if (value) {\n this.showDialog();\n } else {\n this.hideDialog();\n }\n }\n\n this.toggleAttribute('open', value);\n }\n\n protected setupAccessibility(): void {\n // Accessibility is set up in render()\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n\n const titleId = `${this._id}-title`;\n const descId = `${this._id}-desc`;\n\n shadow.innerHTML = `\n <style>${DIALOG_STYLES}</style>\n <div class=\"overlay\" part=\"overlay\"></div>\n <div\n class=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"${titleId}\"\n aria-describedby=\"${descId}\"\n part=\"dialog\"\n >\n <div id=\"${titleId}\" part=\"title\">\n <slot name=\"title\"></slot>\n </div>\n <div id=\"${descId}\" part=\"description\">\n <slot name=\"description\"></slot>\n </div>\n <div part=\"content\">\n <slot></slot>\n </div>\n <div part=\"actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n `;\n\n // Hide by default\n if (!this._open) {\n this.style.display = 'none';\n }\n }\n\n protected setupEventListeners(): void {\n // Set up trigger - defer to ensure DOM is ready (Safari fix)\n const triggerSelector = this.getAttribute('trigger');\n if (triggerSelector) {\n // Safari may not have parsed the trigger element yet during connectedCallback\n // Use requestAnimationFrame to defer, then retry with setTimeout as fallback\n const setupTrigger = () => {\n this._triggerElement = document.querySelector(triggerSelector);\n if (this._triggerElement) {\n this._triggerElement.addEventListener(\n 'click',\n this.handleTriggerClick\n );\n // Safari fix: Ensure trigger is in tab order (Safari skips buttons by default)\n if (!this._triggerElement.hasAttribute('tabindex')) {\n this._triggerElement.setAttribute('tabindex', '0');\n }\n }\n };\n\n // Try immediately\n setupTrigger();\n\n // If not found, try after next frame (Safari timing fix)\n if (!this._triggerElement) {\n requestAnimationFrame(() => {\n setupTrigger();\n // Final fallback for very slow Safari parsing\n if (!this._triggerElement) {\n setTimeout(setupTrigger, 0);\n }\n });\n }\n }\n\n // Overlay click\n const overlay = this.shadowRoot?.querySelector('.overlay');\n if (this.getAttribute('close-on-outside-click') !== 'false') {\n overlay?.addEventListener('click', this.handleClose);\n }\n\n // Keyboard handling (Escape and Tab trap)\n this.addEventListener('keydown', this.handleKeyDown);\n }\n\n protected cleanupEventListeners(): void {\n this._triggerElement?.removeEventListener('click', this.handleTriggerClick);\n this.removeEventListener('keydown', this.handleKeyDown);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n if (name === 'open') {\n this.open = newValue !== null;\n }\n }\n\n /**\n * Get all focusable elements in the dialog (light DOM first, then shadow DOM)\n * Per WAI-ARIA best practices: focus should go to dialog content first,\n * close button should be last in tab order\n */\n private getFocusableElements(): HTMLElement[] {\n const elements: HTMLElement[] = [];\n\n // Get focusable elements from light DOM FIRST (slotted content)\n // This ensures Cancel/primary actions get focus before close button\n const lightElements = this.querySelectorAll(FOCUSABLE_SELECTOR);\n lightElements.forEach((el) => elements.push(el as HTMLElement));\n\n // Get focusable elements from shadow DOM LAST (close button)\n if (this.shadowRoot) {\n const shadowElements =\n this.shadowRoot.querySelectorAll(FOCUSABLE_SELECTOR);\n shadowElements.forEach((el) => {\n // Skip the overlay\n if (!el.classList.contains('overlay')) {\n elements.push(el as HTMLElement);\n }\n });\n }\n\n return elements;\n }\n\n private handleTriggerClick = (): void => {\n this.open = true;\n };\n\n private handleClose = (): void => {\n this.open = false;\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (!this._open) return;\n\n // Escape to close\n if (event.key === 'Escape') {\n if (this.getAttribute('close-on-escape') !== 'false') {\n event.preventDefault();\n this.handleClose();\n }\n return;\n }\n\n // Tab trap - must manually manage focus between shadow and light DOM\n if (event.key === 'Tab') {\n event.preventDefault(); // Always prevent default - we manage focus manually\n\n const focusableElements = this.getFocusableElements();\n if (focusableElements.length === 0) return;\n\n // Find currently focused element in either shadow or light DOM\n const activeElement =\n this.shadowRoot?.activeElement || document.activeElement;\n\n // Find current index\n let currentIndex = focusableElements.findIndex(\n (el) => el === activeElement\n );\n\n // If not found, start from beginning (or end for shift+tab)\n if (currentIndex === -1) {\n currentIndex = event.shiftKey ? 0 : focusableElements.length - 1;\n }\n\n // Calculate next index\n let nextIndex: number;\n if (event.shiftKey) {\n // Shift+Tab: go backwards, wrap to end\n nextIndex =\n currentIndex === 0 ? focusableElements.length - 1 : currentIndex - 1;\n } else {\n // Tab: go forwards, wrap to beginning\n nextIndex =\n currentIndex === focusableElements.length - 1 ? 0 : currentIndex + 1;\n }\n\n // Focus the next element\n const nextElement = focusableElements[nextIndex];\n if (nextElement) {\n nextElement.focus();\n }\n }\n };\n\n private showDialog(): void {\n this._previouslyFocused = document.activeElement as HTMLElement;\n this.style.display = 'flex';\n\n // Focus the first focusable element after a short delay\n // to ensure the dialog is fully rendered\n requestAnimationFrame(() => {\n const focusableElements = this.getFocusableElements();\n const firstElement = focusableElements[0];\n if (firstElement) {\n firstElement.focus();\n }\n });\n\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n\n // Announce\n announce('Dialog opened', { politeness: 'polite' });\n\n // Emit event\n this.emit('a11y-dialog-open');\n }\n\n private hideDialog(): void {\n this.style.display = 'none';\n\n // Restore body scroll\n document.body.style.overflow = '';\n\n // Return focus\n this._previouslyFocused?.focus();\n this._previouslyFocused = null;\n\n // Announce\n announce('Dialog closed', { politeness: 'polite' });\n\n // Emit event\n this.emit('a11y-dialog-close');\n }\n\n /**\n * Programmatic open\n */\n show(): void {\n this.open = true;\n }\n\n /**\n * Programmatic close\n */\n close(): void {\n this.open = false;\n }\n}\n\ndefineElement('a11y-dialog', A11yDialog);\n\nexport default A11yDialog;\n","/**\n * compa11y Menu Web Component\n *\n * Usage:\n * <a11y-menu>\n * <button slot=\"trigger\">Open Menu</button>\n * <button role=\"menuitem\">Option 1</button>\n * <button role=\"menuitem\">Option 2</button>\n * <div role=\"separator\"></div>\n * <button role=\"menuitem\">Option 3</button>\n * </a11y-menu>\n */\n\n// No core imports needed - using base element\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { MENU_STYLES } from '../utils/styles';\n\nexport class A11yMenu extends Compa11yElement {\n private _open = false;\n private _highlightedIndex = -1;\n private _menuItems: HTMLElement[] = [];\n\n static get observedAttributes() {\n return ['open'];\n }\n\n get open(): boolean {\n return this._open;\n }\n\n set open(value: boolean) {\n const oldValue = this._open;\n this._open = value;\n\n if (value !== oldValue) {\n this.updateMenuVisibility();\n }\n\n this.toggleAttribute('open', value);\n }\n\n protected setupAccessibility(): void {\n // Set up trigger\n const trigger = this.querySelector('[slot=\"trigger\"]') as HTMLElement;\n if (trigger) {\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', String(this._open));\n trigger.id = trigger.id || `${this._id}-trigger`;\n // Safari fix: Ensure button is in tab order (Safari skips buttons by default)\n if (!trigger.hasAttribute('tabindex')) {\n trigger.setAttribute('tabindex', '0');\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n\n shadow.innerHTML = `\n <style>${MENU_STYLES}</style>\n <slot name=\"trigger\"></slot>\n <div\n class=\"menu-content\"\n role=\"menu\"\n aria-labelledby=\"${this._id}-trigger\"\n tabindex=\"-1\"\n hidden\n part=\"menu\"\n >\n <slot></slot>\n </div>\n `;\n }\n\n protected setupEventListeners(): void {\n // Trigger click - attach to light DOM element\n const trigger = this.querySelector('[slot=\"trigger\"]');\n trigger?.addEventListener('click', this.handleTriggerClick);\n trigger?.addEventListener(\n 'keydown',\n this.handleTriggerKeyDown as EventListener\n );\n\n // Safari fix: Also listen on the trigger slot for clicks\n // Safari has issues with click events on slotted content not bubbling properly\n const triggerSlot = this.shadowRoot?.querySelector('slot[name=\"trigger\"]');\n triggerSlot?.addEventListener('click', this.handleTriggerClick);\n\n // Menu items\n this.addEventListener('click', this.handleItemClick);\n this.addEventListener('keydown', this.handleMenuKeyDown);\n this.addEventListener('mouseover', this.handleMouseOver);\n\n // Outside click\n document.addEventListener('mousedown', this.handleOutsideClick);\n\n // Slot change\n const slot = this.shadowRoot?.querySelector('slot:not([name])');\n slot?.addEventListener('slotchange', this.updateMenuItems);\n\n // Initialize menu items immediately (Safari may not fire slotchange)\n this.updateMenuItems();\n }\n\n protected cleanupEventListeners(): void {\n document.removeEventListener('mousedown', this.handleOutsideClick);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n if (name === 'open') {\n this.open = newValue !== null;\n }\n }\n\n private updateMenuItems = (): void => {\n this._menuItems = Array.from(\n this.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n ) as HTMLElement[];\n\n // Set up IDs and tabindex\n this._menuItems.forEach((item, index) => {\n item.id = item.id || `${this._id}-item-${index}`;\n item.setAttribute('tabindex', '-1');\n });\n };\n\n private _lastClickTime = 0;\n\n private handleTriggerClick = (): void => {\n // Debounce to prevent double-firing (Safari fix has dual listeners)\n const now = Date.now();\n if (now - this._lastClickTime < 50) return;\n this._lastClickTime = now;\n\n this.toggle();\n };\n\n private handleTriggerKeyDown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.toggle();\n if (this._open) {\n this.highlightItem(0);\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this._open) {\n this.show();\n }\n this.highlightItem(0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this._open) {\n this.show();\n }\n this.highlightItem(this._menuItems.length - 1);\n break;\n }\n };\n\n private handleMenuKeyDown = (event: KeyboardEvent): void => {\n if (!this._open) return;\n\n const target = event.target as HTMLElement;\n if (\n !target.hasAttribute('role') ||\n target.getAttribute('role') !== 'menuitem'\n ) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.highlightItem(\n (this._highlightedIndex + 1) % this._menuItems.length\n );\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.highlightItem(\n (this._highlightedIndex - 1 + this._menuItems.length) %\n this._menuItems.length\n );\n break;\n case 'Home':\n event.preventDefault();\n this.highlightItem(0);\n break;\n case 'End':\n event.preventDefault();\n this.highlightItem(this._menuItems.length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.selectItem(this._highlightedIndex);\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Tab':\n this.close();\n break;\n }\n };\n\n private handleItemClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n if (target.getAttribute('role') === 'menuitem') {\n if (target.getAttribute('aria-disabled') !== 'true') {\n const index = this._menuItems.indexOf(target);\n this.selectItem(index);\n }\n }\n };\n\n private handleMouseOver = (event: Event): void => {\n const target = event.target as HTMLElement;\n if (target.getAttribute('role') === 'menuitem') {\n const index = this._menuItems.indexOf(target);\n if (index !== -1) {\n this.highlightItem(index, false);\n }\n }\n };\n\n private handleOutsideClick = (event: MouseEvent): void => {\n if (!this._open) return;\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.close();\n }\n };\n\n private highlightItem(index: number, focus = true): void {\n // Remove highlight from previous\n if (this._highlightedIndex >= 0) {\n const prev = this._menuItems[this._highlightedIndex];\n prev?.removeAttribute('data-highlighted');\n }\n\n // Add highlight to new\n this._highlightedIndex = index;\n const item = this._menuItems[index];\n if (item) {\n item.setAttribute('data-highlighted', 'true');\n if (focus) {\n item.focus();\n }\n\n // Update aria-activedescendant\n const menu = this.shadowRoot?.querySelector('[role=\"menu\"]');\n menu?.setAttribute('aria-activedescendant', item.id);\n }\n }\n\n private selectItem(index: number): void {\n const item = this._menuItems[index];\n if (item) {\n this.emit('a11y-menu-select', { item, index });\n item.click();\n }\n this.close();\n }\n\n private updateMenuVisibility(): void {\n const menu = this.shadowRoot?.querySelector('.menu-content') as HTMLElement;\n const trigger = this.querySelector('[slot=\"trigger\"]') as HTMLElement;\n\n if (this._open) {\n menu?.removeAttribute('hidden');\n trigger?.setAttribute('aria-expanded', 'true');\n this.updateMenuItems();\n this.emit('a11y-menu-open');\n } else {\n menu?.setAttribute('hidden', '');\n trigger?.setAttribute('aria-expanded', 'false');\n this._highlightedIndex = -1;\n\n // Clear highlights\n this._menuItems.forEach((item) => {\n item.removeAttribute('data-highlighted');\n });\n\n // Return focus to trigger\n trigger?.focus();\n this.emit('a11y-menu-close');\n }\n }\n\n /**\n * Show the menu\n */\n show(): void {\n this.open = true;\n }\n\n /**\n * Hide the menu\n */\n close(): void {\n this.open = false;\n }\n\n /**\n * Toggle the menu\n */\n toggle(): void {\n this.open = !this._open;\n }\n}\n\ndefineElement('a11y-menu', A11yMenu);\n\nexport default A11yMenu;\n","/**\n * compa11y Tabs Web Component\n *\n * Usage:\n * <a11y-tabs>\n * <button role=\"tab\" aria-controls=\"panel-1\">Tab 1</button>\n * <button role=\"tab\" aria-controls=\"panel-2\">Tab 2</button>\n * <div role=\"tabpanel\" id=\"panel-1\">Content 1</div>\n * <div role=\"tabpanel\" id=\"panel-2\">Content 2</div>\n * </a11y-tabs>\n */\n\nimport { announce } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { TABS_STYLES } from '../utils/styles';\n\nexport class A11yTabs extends Compa11yElement {\n private _tabs: HTMLElement[] = [];\n private _panels: HTMLElement[] = [];\n private _selectedIndex = 0;\n\n static get observedAttributes() {\n return ['orientation', 'activation-mode', 'selected-index'];\n }\n\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n set selectedIndex(value: number) {\n if (value >= 0 && value < this._tabs.length) {\n this._selectedIndex = value;\n this.updateSelection();\n }\n }\n\n get orientation(): 'horizontal' | 'vertical' {\n return (\n (this.getAttribute('orientation') as 'horizontal' | 'vertical') ||\n 'horizontal'\n );\n }\n\n get activationMode(): 'automatic' | 'manual' {\n return (\n (this.getAttribute('activation-mode') as 'automatic' | 'manual') ||\n 'automatic'\n );\n }\n\n protected setupAccessibility(): void {\n this.updateTabsAndPanels();\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n\n shadow.innerHTML = `\n <style>${TABS_STYLES}</style>\n <div class=\"tablist\" role=\"tablist\" aria-orientation=\"${this.orientation}\" part=\"tablist\">\n <slot name=\"tab\"></slot>\n </div>\n <div class=\"panels\" part=\"panels\">\n <slot name=\"panel\"></slot>\n </div>\n <slot></slot>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('click', this.handleClick);\n this.addEventListener('keydown', this.handleKeyDown);\n\n // Watch for slot changes\n const tabSlot = this.shadowRoot?.querySelector('slot[name=\"tab\"]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=\"panel\"]');\n const defaultSlot = this.shadowRoot?.querySelector('slot:not([name])');\n\n tabSlot?.addEventListener('slotchange', this.updateTabsAndPanels);\n panelSlot?.addEventListener('slotchange', this.updateTabsAndPanels);\n defaultSlot?.addEventListener('slotchange', this.updateTabsAndPanels);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n if (name === 'orientation') {\n const tablist = this.shadowRoot?.querySelector('[role=\"tablist\"]');\n tablist?.setAttribute('aria-orientation', newValue || 'horizontal');\n }\n if (name === 'selected-index' && newValue) {\n this.selectedIndex = parseInt(newValue, 10);\n }\n }\n\n private updateTabsAndPanels = (): void => {\n // Get tabs and panels from slots or direct children\n this._tabs = Array.from(\n this.querySelectorAll('[role=\"tab\"]')\n ) as HTMLElement[];\n\n this._panels = Array.from(\n this.querySelectorAll('[role=\"tabpanel\"]')\n ) as HTMLElement[];\n\n // Set up ARIA relationships\n this._tabs.forEach((tab, index) => {\n const panel = this._panels[index];\n const tabId = tab.id || `${this._id}-tab-${index}`;\n const panelId = panel?.id || `${this._id}-panel-${index}`;\n\n tab.id = tabId;\n tab.setAttribute('aria-controls', panelId);\n tab.setAttribute('tabindex', index === this._selectedIndex ? '0' : '-1');\n tab.setAttribute('aria-selected', String(index === this._selectedIndex));\n\n // Assign to slot if not already\n if (!tab.hasAttribute('slot')) {\n tab.setAttribute('slot', 'tab');\n }\n\n if (panel) {\n panel.id = panelId;\n panel.setAttribute('aria-labelledby', tabId);\n panel.setAttribute('tabindex', '0');\n panel.hidden = index !== this._selectedIndex;\n\n if (!panel.hasAttribute('slot')) {\n panel.setAttribute('slot', 'panel');\n }\n }\n });\n\n this.updateSelection();\n };\n\n private handleClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n if (target.getAttribute('role') === 'tab') {\n const index = this._tabs.indexOf(target);\n if (index !== -1 && target.getAttribute('aria-disabled') !== 'true') {\n this.selectTab(index);\n }\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement;\n if (target.getAttribute('role') !== 'tab') return;\n\n const isHorizontal = this.orientation === 'horizontal';\n const nextKey = isHorizontal ? 'ArrowRight' : 'ArrowDown';\n const prevKey = isHorizontal ? 'ArrowLeft' : 'ArrowUp';\n\n let newIndex = this._selectedIndex;\n\n switch (event.key) {\n case nextKey:\n event.preventDefault();\n newIndex = (this._selectedIndex + 1) % this._tabs.length;\n break;\n case prevKey:\n event.preventDefault();\n newIndex =\n (this._selectedIndex - 1 + this._tabs.length) % this._tabs.length;\n break;\n case 'Home':\n event.preventDefault();\n newIndex = 0;\n break;\n case 'End':\n event.preventDefault();\n newIndex = this._tabs.length - 1;\n break;\n default:\n return;\n }\n\n // Focus the new tab\n this._tabs[newIndex]?.focus();\n\n // Select if automatic activation\n if (this.activationMode === 'automatic') {\n this.selectTab(newIndex);\n }\n };\n\n private selectTab(index: number): void {\n const oldIndex = this._selectedIndex;\n this._selectedIndex = index;\n this.updateSelection();\n\n if (oldIndex !== index) {\n const tab = this._tabs[index];\n announce(`${tab?.textContent || 'Tab'} selected`);\n this.emit('a11y-tabs-change', {\n index,\n tab: this._tabs[index],\n panel: this._panels[index],\n });\n }\n }\n\n private updateSelection(): void {\n this._tabs.forEach((tab, index) => {\n const isSelected = index === this._selectedIndex;\n tab.setAttribute('aria-selected', String(isSelected));\n tab.setAttribute('tabindex', isSelected ? '0' : '-1');\n });\n\n this._panels.forEach((panel, index) => {\n panel.hidden = index !== this._selectedIndex;\n });\n }\n\n /**\n * Select a tab by index\n */\n select(index: number): void {\n this.selectTab(index);\n }\n\n /**\n * Select next tab\n */\n next(): void {\n this.selectTab((this._selectedIndex + 1) % this._tabs.length);\n }\n\n /**\n * Select previous tab\n */\n previous(): void {\n this.selectTab(\n (this._selectedIndex - 1 + this._tabs.length) % this._tabs.length\n );\n }\n}\n\ndefineElement('a11y-tabs', A11yTabs);\n\nexport default A11yTabs;\n","/**\n * compa11y Combobox Web Component\n *\n * Usage:\n * <a11y-combobox placeholder=\"Search...\">\n * <option value=\"1\">Option 1</option>\n * <option value=\"2\">Option 2</option>\n * <option value=\"3\" disabled>Option 3 (disabled)</option>\n * </a11y-combobox>\n */\n\nimport { announce } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { COMBOBOX_STYLES } from '../utils/styles';\n\ninterface ComboboxOption {\n value: string;\n label: string;\n disabled: boolean;\n element: HTMLElement;\n}\n\nexport class A11yCombobox extends Compa11yElement {\n private _open = false;\n private _highlightedIndex = -1;\n private _options: ComboboxOption[] = [];\n private _filteredOptions: ComboboxOption[] = [];\n private _inputValue = '';\n private _selectedValue: string | null = null;\n private _inputElement: HTMLInputElement | null = null;\n private _listboxElement: HTMLElement | null = null;\n\n static get observedAttributes() {\n return ['open', 'value', 'placeholder', 'disabled', 'clearable'];\n }\n\n get open(): boolean {\n return this._open;\n }\n\n set open(value: boolean) {\n const oldValue = this._open;\n this._open = value;\n\n if (value !== oldValue) {\n this.updateListboxVisibility();\n }\n\n this.toggleAttribute('open', value);\n }\n\n get value(): string | null {\n return this._selectedValue;\n }\n\n set value(val: string | null) {\n this._selectedValue = val;\n const option = this._options.find((o) => o.value === val);\n if (option) {\n this._inputValue = option.label;\n if (this._inputElement) {\n this._inputElement.value = option.label;\n }\n }\n this.setAttribute('value', val || '');\n }\n\n protected setupAccessibility(): void {\n // Accessibility is set up in render()\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const inputId = `${this._id}-input`;\n const listboxId = `${this._id}-listbox`;\n const placeholder = this.getAttribute('placeholder') || 'Search...';\n const clearable = this.hasAttribute('clearable');\n\n shadow.innerHTML = `\n <style>${COMBOBOX_STYLES}</style>\n <div class=\"combobox-wrapper\" part=\"wrapper\">\n <div class=\"input-wrapper\" part=\"input-wrapper\">\n <input\n id=\"${inputId}\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-expanded=\"false\"\n aria-controls=\"${listboxId}\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n placeholder=\"${placeholder}\"\n part=\"input\"\n />\n ${\n clearable\n ? `\n <button\n type=\"button\"\n class=\"clear-button\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n hidden\n part=\"clear-button\"\n >×</button>\n `\n : ''\n }\n <span class=\"chevron\" aria-hidden=\"true\" part=\"chevron\">▼</span>\n </div>\n <ul\n id=\"${listboxId}\"\n role=\"listbox\"\n aria-labelledby=\"${inputId}\"\n class=\"listbox\"\n tabindex=\"-1\"\n hidden\n part=\"listbox\"\n ></ul>\n </div>\n <div class=\"options-source\" hidden>\n <slot></slot>\n </div>\n `;\n\n this._inputElement = shadow.querySelector('input');\n this._listboxElement = shadow.querySelector('.listbox');\n }\n\n protected setupEventListeners(): void {\n // Input events\n this._inputElement?.addEventListener('input', this.handleInput);\n this._inputElement?.addEventListener('focus', this.handleFocus);\n this._inputElement?.addEventListener('blur', this.handleBlur);\n this._inputElement?.addEventListener('keydown', this.handleKeyDown);\n\n // Clear button\n const clearButton = this.shadowRoot?.querySelector('.clear-button');\n clearButton?.addEventListener('click', this.handleClear);\n\n // Outside click\n document.addEventListener('mousedown', this.handleOutsideClick);\n\n // Slot change\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.updateOptions);\n\n // Initial options\n this.updateOptions();\n }\n\n protected cleanupEventListeners(): void {\n document.removeEventListener('mousedown', this.handleOutsideClick);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n if (name === 'open') {\n this.open = newValue !== null;\n }\n if (name === 'value') {\n this.value = newValue;\n }\n if (name === 'disabled') {\n if (this._inputElement) {\n this._inputElement.disabled = newValue !== null;\n }\n }\n if (name === 'placeholder') {\n if (this._inputElement) {\n this._inputElement.placeholder = newValue || 'Search...';\n }\n }\n }\n\n private updateOptions = (): void => {\n const optionElements = Array.from(this.querySelectorAll('option'));\n this._options = optionElements.map((el) => ({\n value: el.getAttribute('value') || el.textContent || '',\n label: el.textContent || '',\n disabled: el.hasAttribute('disabled'),\n element: el,\n }));\n this._filteredOptions = [...this._options];\n this.renderOptions();\n };\n\n private renderOptions(): void {\n if (!this._listboxElement) return;\n\n this._listboxElement.innerHTML =\n this._filteredOptions.length === 0\n ? '<li role=\"presentation\" class=\"empty-message\" part=\"empty\">No results found</li>'\n : this._filteredOptions\n .map(\n (option, index) => `\n <li\n id=\"${this._id}-option-${index}\"\n role=\"option\"\n aria-selected=\"${this._selectedValue === option.value}\"\n aria-disabled=\"${option.disabled}\"\n data-value=\"${option.value}\"\n data-index=\"${index}\"\n part=\"option\"\n ${option.disabled ? 'class=\"disabled\"' : ''}\n >${option.label}</li>\n `\n )\n .join('');\n\n // Add click handlers to options\n this._listboxElement\n .querySelectorAll('[role=\"option\"]')\n .forEach((option) => {\n option.addEventListener('click', this.handleOptionClick);\n option.addEventListener('mouseenter', this.handleOptionHover);\n });\n }\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n this._inputValue = target.value;\n\n // Filter options\n const query = this._inputValue.toLowerCase();\n this._filteredOptions = query\n ? this._options.filter((opt) => opt.label.toLowerCase().includes(query))\n : [...this._options];\n\n this.renderOptions();\n this.open = true;\n this._highlightedIndex = 0;\n this.updateHighlight();\n this.updateClearButton();\n\n // Announce results\n const count = this._filteredOptions.length;\n announce(\n count === 0\n ? 'No results'\n : `${count} result${count === 1 ? '' : 's'} available`\n );\n };\n\n private handleFocus = (): void => {\n this.open = true;\n };\n\n private handleBlur = (): void => {\n // Delay close to allow click on options\n setTimeout(() => {\n if (!this.shadowRoot?.activeElement) {\n this.open = false;\n }\n }, 150);\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this._open) {\n this.open = true;\n this._highlightedIndex = 0;\n } else {\n this._highlightedIndex = Math.min(\n this._highlightedIndex + 1,\n this._filteredOptions.length - 1\n );\n }\n this.updateHighlight();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (!this._open) {\n this.open = true;\n this._highlightedIndex = this._filteredOptions.length - 1;\n } else {\n this._highlightedIndex = Math.max(this._highlightedIndex - 1, 0);\n }\n this.updateHighlight();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this._open && this._highlightedIndex >= 0) {\n const option = this._filteredOptions[this._highlightedIndex];\n if (option && !option.disabled) {\n this.selectOption(option);\n }\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.open = false;\n this._highlightedIndex = -1;\n break;\n\n case 'Home':\n if (this._open) {\n event.preventDefault();\n this._highlightedIndex = 0;\n this.updateHighlight();\n }\n break;\n\n case 'End':\n if (this._open) {\n event.preventDefault();\n this._highlightedIndex = this._filteredOptions.length - 1;\n this.updateHighlight();\n }\n break;\n\n case 'Tab':\n // Close dropdown but don't prevent default - let focus move naturally\n if (this._open) {\n this.open = false;\n this._highlightedIndex = -1;\n }\n break;\n }\n };\n\n private handleOptionClick = (event: Event): void => {\n const target = event.currentTarget as HTMLElement;\n const index = parseInt(target.dataset.index || '0', 10);\n const option = this._filteredOptions[index];\n if (option && !option.disabled) {\n this.selectOption(option);\n }\n };\n\n private handleOptionHover = (event: Event): void => {\n const target = event.currentTarget as HTMLElement;\n const index = parseInt(target.dataset.index || '0', 10);\n const option = this._filteredOptions[index];\n if (option && !option.disabled) {\n this._highlightedIndex = index;\n this.updateHighlight();\n }\n };\n\n private handleClear = (): void => {\n this._inputValue = '';\n this._selectedValue = null;\n if (this._inputElement) {\n this._inputElement.value = '';\n this._inputElement.focus();\n }\n this._filteredOptions = [...this._options];\n this.renderOptions();\n this.updateClearButton();\n this.emit('a11y-combobox-clear');\n this.emit('a11y-combobox-change', { value: null, label: null });\n };\n\n private handleOutsideClick = (event: MouseEvent): void => {\n if (!this._open) return;\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.open = false;\n }\n };\n\n private selectOption(option: ComboboxOption): void {\n this._selectedValue = option.value;\n this._inputValue = option.label;\n if (this._inputElement) {\n this._inputElement.value = option.label;\n }\n this.open = false;\n this._highlightedIndex = -1;\n this.renderOptions();\n this.updateClearButton();\n\n announce(`${option.label} selected`);\n this.emit('a11y-combobox-select', {\n value: option.value,\n label: option.label,\n });\n this.emit('a11y-combobox-change', {\n value: option.value,\n label: option.label,\n });\n }\n\n private updateHighlight(): void {\n // Remove all highlights\n this._listboxElement\n ?.querySelectorAll('[role=\"option\"]')\n .forEach((el, i) => {\n el.classList.toggle('highlighted', i === this._highlightedIndex);\n });\n\n // Update aria-activedescendant\n if (this._highlightedIndex >= 0) {\n const optionId = `${this._id}-option-${this._highlightedIndex}`;\n this._inputElement?.setAttribute('aria-activedescendant', optionId);\n\n // Scroll into view\n const option = this._listboxElement?.querySelector(`#${optionId}`);\n option?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n } else {\n this._inputElement?.removeAttribute('aria-activedescendant');\n }\n }\n\n private updateListboxVisibility(): void {\n if (!this._listboxElement || !this._inputElement) return;\n\n if (this._open) {\n this._listboxElement.hidden = false;\n this._inputElement.setAttribute('aria-expanded', 'true');\n\n // Viewport-aware positioning\n this.updateListboxPosition();\n\n this.emit('a11y-combobox-open');\n } else {\n this._listboxElement.hidden = true;\n this._inputElement.setAttribute('aria-expanded', 'false');\n this._highlightedIndex = -1;\n this.updateHighlight();\n\n // Reset position\n this._listboxElement.style.top = '';\n this._listboxElement.style.bottom = '';\n this.removeAttribute('data-position');\n\n this.emit('a11y-combobox-close');\n }\n }\n\n private updateListboxPosition(): void {\n if (!this._listboxElement || !this._inputElement) return;\n\n // Get measurements\n const inputRect = this._inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const listboxHeight = Math.min(\n this._listboxElement.scrollHeight,\n 200 // max-height from CSS\n );\n\n const spaceBelow = viewportHeight - inputRect.bottom;\n const spaceAbove = inputRect.top;\n\n // Determine position: flip to top if not enough space below but more above\n if (spaceBelow < listboxHeight + 8 && spaceAbove > spaceBelow) {\n // Position above the input\n this._listboxElement.style.top = 'auto';\n this._listboxElement.style.bottom = '100%';\n this._listboxElement.style.marginTop = '0';\n this._listboxElement.style.marginBottom = '4px';\n this.setAttribute('data-position', 'top');\n } else {\n // Position below the input (default)\n this._listboxElement.style.top = '100%';\n this._listboxElement.style.bottom = 'auto';\n this._listboxElement.style.marginTop = '4px';\n this._listboxElement.style.marginBottom = '0';\n this.setAttribute('data-position', 'bottom');\n }\n }\n\n private updateClearButton(): void {\n const clearButton = this.shadowRoot?.querySelector(\n '.clear-button'\n ) as HTMLElement;\n if (clearButton) {\n clearButton.hidden = !this._inputValue;\n }\n }\n\n /**\n * Programmatic open\n */\n show(): void {\n this.open = true;\n }\n\n /**\n * Programmatic close\n */\n close(): void {\n this.open = false;\n }\n\n /**\n * Clear the selection\n */\n clear(): void {\n this.handleClear();\n }\n}\n\ndefineElement('a11y-combobox', A11yCombobox);\n\nexport default A11yCombobox;\n","/**\n * compa11y Switch Web Component\n *\n * An accessible toggle switch (on/off control) following WAI-ARIA Switch pattern.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <a11y-switch label=\"Enable notifications\"></a11y-switch>\n *\n * <!-- Checked by default -->\n * <a11y-switch checked label=\"Dark mode\"></a11y-switch>\n *\n * <!-- Disabled -->\n * <a11y-switch disabled label=\"Unavailable feature\"></a11y-switch>\n *\n * <!-- Different sizes -->\n * <a11y-switch size=\"sm\" label=\"Small\"></a11y-switch>\n * <a11y-switch size=\"md\" label=\"Medium\"></a11y-switch>\n * <a11y-switch size=\"lg\" label=\"Large\"></a11y-switch>\n *\n * <!-- Listen to changes -->\n * <a11y-switch\n * label=\"Notifications\"\n * onchange=\"handleChange(event.detail.checked)\"\n * ></a11y-switch>\n * ```\n *\n * @fires change - Emitted when the switch state changes, detail: { checked: boolean }\n *\n * @attr {boolean} checked - Whether the switch is on\n * @attr {boolean} disabled - Whether the switch is disabled\n * @attr {string} label - Visible label text\n * @attr {string} size - Size variant: 'sm' | 'md' | 'lg' (default: 'md')\n * @attr {string} aria-label - Accessible label (if no visible label)\n *\n * @cssprop --compa11y-switch-bg - Background color when unchecked\n * @cssprop --compa11y-switch-checked-bg - Background color when checked\n * @cssprop --compa11y-switch-thumb-bg - Thumb background color\n * @cssprop --compa11y-switch-thumb-shadow - Thumb shadow\n * @cssprop --compa11y-switch-label-color - Label text color\n * @cssprop --compa11y-focus-color - Focus outline color\n */\n\nimport { announcePolite } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { SWITCH_STYLES } from '../utils/styles';\n\nexport class A11ySwitch extends Compa11yElement {\n private _checked = false;\n private _button: HTMLButtonElement | null = null;\n private _label: HTMLLabelElement | null = null;\n\n static get observedAttributes() {\n return ['checked', 'disabled', 'label', 'size', 'aria-label'];\n }\n\n /**\n * Get/set the checked state\n */\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(value: boolean) {\n const oldValue = this._checked;\n this._checked = value;\n this.toggleAttribute('checked', value);\n\n if (value !== oldValue) {\n this.updateVisualState();\n this.emit('change', { checked: value });\n }\n }\n\n /**\n * Get/set the disabled state\n */\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute('disabled', value);\n this.updateDisabledState();\n }\n\n /**\n * Get/set the visible label\n */\n get label(): string {\n return this.getAttribute('label') || '';\n }\n\n set label(value: string) {\n if (value) {\n this.setAttribute('label', value);\n } else {\n this.removeAttribute('label');\n }\n }\n\n /**\n * Get/set the size variant\n */\n get size(): 'sm' | 'md' | 'lg' {\n const size = this.getAttribute('size');\n if (size === 'sm' || size === 'lg') return size;\n return 'md';\n }\n\n set size(value: 'sm' | 'md' | 'lg') {\n this.setAttribute('size', value);\n }\n\n protected setupAccessibility(): void {\n // Set role if not already set\n if (!this.getAttribute('role')) {\n // The button inside has role=\"switch\", host element doesn't need a role\n }\n\n // Warn if no accessible label\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n if (!this.label && !this.getAttribute('aria-label')) {\n console.warn(\n '[compa11y/Switch] Switch has no accessible label. Add label=\"...\" or aria-label=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-switch label=\"Enable feature\"></a11y-switch>'\n );\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const labelId = `${this._id}-label`;\n const hasLabel = Boolean(this.label);\n const ariaLabel = this.getAttribute('aria-label');\n\n // Determine aria-label vs aria-labelledby\n const ariaLabelAttr = hasLabel\n ? ''\n : ariaLabel\n ? `aria-label=\"${ariaLabel}\"`\n : '';\n const ariaLabelledByAttr = hasLabel ? `aria-labelledby=\"${labelId}\"` : '';\n\n shadow.innerHTML = `\n <style>${SWITCH_STYLES}</style>\n <div class=\"switch-wrapper size-${this.size}\" part=\"wrapper\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked=\"${this._checked}\"\n ${ariaLabelAttr}\n ${ariaLabelledByAttr}\n ${this.disabled ? 'disabled' : ''}\n class=\"switch-track ${this._checked ? 'checked' : ''}\"\n part=\"track\"\n tabindex=\"${this.disabled ? '-1' : '0'}\"\n >\n <span class=\"switch-thumb\" part=\"thumb\" aria-hidden=\"true\"></span>\n </button>\n ${\n hasLabel\n ? `<label id=\"${labelId}\" class=\"switch-label ${this.disabled ? 'disabled' : ''}\" part=\"label\">${this.label}</label>`\n : ''\n }\n </div>\n `;\n\n // Cache references\n this._button = shadow.querySelector('button');\n this._label = shadow.querySelector('label');\n }\n\n protected setupEventListeners(): void {\n this._button?.addEventListener('click', this.handleClick);\n this._button?.addEventListener('keydown', this.handleKeyDown);\n this._label?.addEventListener('click', this.handleLabelClick);\n }\n\n protected cleanupEventListeners(): void {\n this._button?.removeEventListener('click', this.handleClick);\n this._button?.removeEventListener('keydown', this.handleKeyDown);\n this._label?.removeEventListener('click', this.handleLabelClick);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n switch (name) {\n case 'checked':\n this._checked = newValue !== null;\n this.updateVisualState();\n break;\n case 'disabled':\n this.updateDisabledState();\n break;\n case 'label':\n case 'aria-label':\n // Re-render to update label\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = '';\n this.render();\n this.setupEventListeners();\n }\n break;\n case 'size':\n this.updateSizeClass();\n break;\n }\n }\n\n /**\n * Handle click on the switch button\n */\n private handleClick = (): void => {\n this.toggle();\n };\n\n /**\n * Handle keyboard events\n * Space and Enter should toggle the switch\n */\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n\n // Space or Enter toggles the switch\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.toggle();\n }\n };\n\n /**\n * Handle click on the label\n */\n private handleLabelClick = (): void => {\n if (this.disabled) return;\n this.toggle();\n // Focus the button after clicking the label (better UX)\n this._button?.focus();\n };\n\n /**\n * Update the visual state (checked class and aria-checked)\n */\n private updateVisualState(): void {\n if (this._button) {\n this._button.setAttribute('aria-checked', String(this._checked));\n this._button.classList.toggle('checked', this._checked);\n }\n }\n\n /**\n * Update the disabled state\n */\n private updateDisabledState(): void {\n if (this._button) {\n if (this.disabled) {\n this._button.setAttribute('disabled', '');\n this._button.setAttribute('tabindex', '-1');\n } else {\n this._button.removeAttribute('disabled');\n this._button.setAttribute('tabindex', '0');\n }\n }\n\n if (this._label) {\n this._label.classList.toggle('disabled', this.disabled);\n }\n }\n\n /**\n * Update the size class\n */\n private updateSizeClass(): void {\n const wrapper = this.shadowRoot?.querySelector('.switch-wrapper');\n if (wrapper) {\n wrapper.classList.remove('size-sm', 'size-md', 'size-lg');\n wrapper.classList.add(`size-${this.size}`);\n }\n }\n\n /**\n * Public method to toggle the switch programmatically\n */\n public toggle(): void {\n if (this.disabled) return;\n\n this.checked = !this.checked;\n\n // Announce state change to screen readers\n const labelText = this.label || this.getAttribute('aria-label') || 'Switch';\n announcePolite(`${labelText} ${this.checked ? 'on' : 'off'}`);\n }\n\n /**\n * Public method to open/close programmatically\n */\n public setChecked(checked: boolean): void {\n this.checked = checked;\n }\n}\n\n// Register the custom element\ndefineElement('a11y-switch', A11ySwitch);\n\nexport default A11ySwitch;\n","/**\n * compa11y Select Web Component\n *\n * A dropdown select component without text filtering.\n * Uses a button trigger and follows WAI-ARIA Listbox pattern.\n *\n * Usage:\n * <a11y-select placeholder=\"Choose...\" aria-label=\"Select a country\">\n * <option value=\"us\">United States</option>\n * <option value=\"uk\">United Kingdom</option>\n * <option value=\"de\" disabled>Germany (unavailable)</option>\n * </a11y-select>\n */\n\nimport { announce, createTypeAhead } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { SELECT_STYLES } from '../utils/styles';\n\ninterface SelectOption {\n value: string;\n label: string;\n disabled: boolean;\n element: HTMLElement;\n}\n\nexport class A11ySelect extends Compa11yElement {\n private _open = false;\n private _highlightedIndex = -1;\n private _options: SelectOption[] = [];\n private _selectedValue: string | null = null;\n private _triggerElement: HTMLButtonElement | null = null;\n private _listboxElement: HTMLElement | null = null;\n private _typeAhead: ReturnType<typeof createTypeAhead> | null = null;\n\n static get observedAttributes() {\n return ['open', 'value', 'placeholder', 'disabled'];\n }\n\n get open(): boolean {\n return this._open;\n }\n\n set open(value: boolean) {\n const oldValue = this._open;\n this._open = value;\n\n if (value !== oldValue) {\n this.updateListboxVisibility();\n }\n\n this.toggleAttribute('open', value);\n }\n\n get value(): string | null {\n return this._selectedValue;\n }\n\n set value(val: string | null) {\n this._selectedValue = val;\n this.updateTriggerText();\n this.setAttribute('value', val || '');\n }\n\n protected setupAccessibility(): void {\n // Accessibility is set up in render()\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const triggerId = `${this._id}-trigger`;\n const listboxId = `${this._id}-listbox`;\n const placeholder =\n this.getAttribute('placeholder') || 'Select an option...';\n const ariaLabel = this.getAttribute('aria-label') || '';\n const ariaLabelledBy = this.getAttribute('aria-labelledby') || '';\n\n shadow.innerHTML = `\n <style>${SELECT_STYLES}</style>\n <div class=\"select-wrapper\" part=\"wrapper\">\n <button\n id=\"${triggerId}\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-controls=\"${listboxId}\"\n aria-haspopup=\"listbox\"\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\n ${ariaLabelledBy ? `aria-labelledby=\"${ariaLabelledBy}\"` : ''}\n class=\"select-trigger\"\n part=\"trigger\"\n >\n <span class=\"select-value placeholder\" part=\"value\">${placeholder}</span>\n <span class=\"chevron\" aria-hidden=\"true\" part=\"chevron\">&#9660;</span>\n </button>\n <ul\n id=\"${listboxId}\"\n role=\"listbox\"\n aria-labelledby=\"${triggerId}\"\n class=\"listbox\"\n tabindex=\"-1\"\n hidden\n part=\"listbox\"\n ></ul>\n </div>\n <div class=\"options-source\" hidden>\n <slot></slot>\n </div>\n `;\n\n this._triggerElement = shadow.querySelector('.select-trigger');\n this._listboxElement = shadow.querySelector('.listbox');\n }\n\n protected setupEventListeners(): void {\n this._triggerElement?.addEventListener('click', this.handleTriggerClick);\n this._triggerElement?.addEventListener('keydown', this.handleKeyDown);\n this._triggerElement?.addEventListener('blur', this.handleBlur);\n\n // Prevent trigger blur when clicking in listbox\n this._listboxElement?.addEventListener(\n 'mousedown',\n this.handleListboxMouseDown\n );\n\n // Outside click\n document.addEventListener('mousedown', this.handleOutsideClick);\n\n // Slot change\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.updateOptions);\n\n // Initial options\n this.updateOptions();\n }\n\n protected cleanupEventListeners(): void {\n document.removeEventListener('mousedown', this.handleOutsideClick);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n if (name === 'open') {\n this.open = newValue !== null;\n }\n if (name === 'value') {\n this.value = newValue;\n }\n if (name === 'disabled') {\n if (this._triggerElement) {\n this._triggerElement.disabled = newValue !== null;\n }\n }\n if (name === 'placeholder') {\n this.updateTriggerText();\n }\n }\n\n private updateOptions = (): void => {\n const optionElements = Array.from(this.querySelectorAll('option'));\n this._options = optionElements.map((el) => ({\n value: el.getAttribute('value') || el.textContent || '',\n label: el.textContent || '',\n disabled: el.hasAttribute('disabled'),\n element: el,\n }));\n\n // Rebuild type-ahead\n this._typeAhead = createTypeAhead(\n this._options.map((o) => o.label),\n { timeout: 500 }\n );\n\n this.renderOptions();\n this.updateTriggerText();\n };\n\n private renderOptions(): void {\n if (!this._listboxElement) return;\n\n this._listboxElement.innerHTML = this._options\n .map(\n (option, index) => `\n <li\n id=\"${this._id}-option-${index}\"\n role=\"option\"\n aria-selected=\"${this._selectedValue === option.value}\"\n aria-disabled=\"${option.disabled}\"\n data-value=\"${option.value}\"\n data-index=\"${index}\"\n part=\"option\"\n ${option.disabled ? 'class=\"disabled\"' : ''}\n >\n <span class=\"option-text\">${option.label}</span>\n ${this._selectedValue === option.value ? '<span class=\"check-mark\" aria-hidden=\"true\">&#10003;</span>' : ''}\n </li>\n `\n )\n .join('');\n\n // Add click/hover handlers to options\n this._listboxElement\n .querySelectorAll('[role=\"option\"]')\n .forEach((option) => {\n option.addEventListener('click', this.handleOptionClick);\n option.addEventListener('mouseenter', this.handleOptionHover);\n });\n }\n\n private handleTriggerClick = (): void => {\n if (this._triggerElement?.disabled) return;\n\n if (this._open) {\n this.open = false;\n this._highlightedIndex = -1;\n } else {\n this.openAndHighlight();\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this._open) {\n this.openAndHighlight();\n } else {\n this.highlightNext();\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (!this._open) {\n this.openAndHighlight(true);\n } else {\n this.highlightPrevious();\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this._open && this._highlightedIndex >= 0) {\n const option = this._options[this._highlightedIndex];\n if (option && !option.disabled) {\n this.selectOption(option);\n }\n } else if (!this._open) {\n this.openAndHighlight();\n }\n break;\n\n case ' ':\n event.preventDefault();\n if (this._open && this._highlightedIndex >= 0) {\n const option = this._options[this._highlightedIndex];\n if (option && !option.disabled) {\n this.selectOption(option);\n }\n } else if (!this._open) {\n this.openAndHighlight();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n if (this._open) {\n this.open = false;\n this._highlightedIndex = -1;\n }\n break;\n\n case 'Home':\n if (this._open) {\n event.preventDefault();\n this._highlightedIndex = this.findFirstEnabled();\n this.updateHighlight();\n }\n break;\n\n case 'End':\n if (this._open) {\n event.preventDefault();\n this._highlightedIndex = this.findLastEnabled();\n this.updateHighlight();\n }\n break;\n\n case 'Tab':\n // Close dropdown but don't prevent default - let focus move naturally\n if (this._open) {\n this.open = false;\n this._highlightedIndex = -1;\n }\n break;\n\n default:\n // Type-ahead: single printable characters\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.metaKey\n ) {\n const match = this._typeAhead?.type(event.key);\n if (match) {\n const index = this._options.findIndex(\n (o) => o.label === match && !o.disabled\n );\n if (index >= 0) {\n if (!this._open) {\n this.open = true;\n }\n this._highlightedIndex = index;\n this.updateHighlight();\n }\n }\n }\n break;\n }\n };\n\n private handleBlur = (): void => {\n setTimeout(() => {\n if (!this.shadowRoot?.activeElement) {\n this.open = false;\n this._highlightedIndex = -1;\n }\n }, 150);\n };\n\n private handleListboxMouseDown = (event: Event): void => {\n // Prevent trigger from losing focus when clicking in listbox\n event.preventDefault();\n };\n\n private handleOptionClick = (event: Event): void => {\n const target = event.currentTarget as HTMLElement;\n const index = parseInt(target.dataset.index || '0', 10);\n const option = this._options[index];\n if (option && !option.disabled) {\n this.selectOption(option);\n }\n };\n\n private handleOptionHover = (event: Event): void => {\n const target = event.currentTarget as HTMLElement;\n const index = parseInt(target.dataset.index || '0', 10);\n const option = this._options[index];\n if (option && !option.disabled) {\n this._highlightedIndex = index;\n this.updateHighlight();\n }\n };\n\n private handleOutsideClick = (event: MouseEvent): void => {\n if (!this._open) return;\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.open = false;\n this._highlightedIndex = -1;\n }\n };\n\n private openAndHighlight(preferLast = false): void {\n this.open = true;\n\n // Highlight selected option, or first/last enabled\n const selectedIndex = this._options.findIndex(\n (o) => o.value === this._selectedValue\n );\n if (selectedIndex >= 0) {\n this._highlightedIndex = selectedIndex;\n } else {\n this._highlightedIndex = preferLast\n ? this.findLastEnabled()\n : this.findFirstEnabled();\n }\n this.updateHighlight();\n\n // Announce options count\n announce(\n `${this._options.length} option${this._options.length === 1 ? '' : 's'} available`\n );\n }\n\n private selectOption(option: SelectOption): void {\n this._selectedValue = option.value;\n this.updateTriggerText();\n this.open = false;\n this._highlightedIndex = -1;\n this.renderOptions();\n\n announce(`${option.label} selected`);\n this.emit('a11y-select-change', {\n value: option.value,\n label: option.label,\n });\n this.emit('change', {\n value: option.value,\n label: option.label,\n });\n }\n\n private updateTriggerText(): void {\n const valueEl = this.shadowRoot?.querySelector('.select-value');\n if (!valueEl) return;\n\n const selectedOption = this._options.find(\n (o) => o.value === this._selectedValue\n );\n const placeholder =\n this.getAttribute('placeholder') || 'Select an option...';\n\n if (selectedOption) {\n valueEl.textContent = selectedOption.label;\n valueEl.classList.remove('placeholder');\n } else {\n valueEl.textContent = placeholder;\n valueEl.classList.add('placeholder');\n }\n }\n\n private highlightNext(): void {\n const next = this.findNextEnabled(this._highlightedIndex, 1);\n if (next >= 0) {\n this._highlightedIndex = next;\n this.updateHighlight();\n }\n }\n\n private highlightPrevious(): void {\n const prev = this.findNextEnabled(this._highlightedIndex, -1);\n if (prev >= 0) {\n this._highlightedIndex = prev;\n this.updateHighlight();\n }\n }\n\n private findNextEnabled(currentIndex: number, direction: 1 | -1): number {\n const length = this._options.length;\n let index = currentIndex + direction;\n\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n\n const startIndex = index;\n while (this._options[index]?.disabled) {\n index += direction;\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n if (index === startIndex) return -1;\n }\n\n return index;\n }\n\n private findFirstEnabled(): number {\n return this._options.findIndex((o) => !o.disabled);\n }\n\n private findLastEnabled(): number {\n for (let i = this._options.length - 1; i >= 0; i--) {\n if (!this._options[i]?.disabled) return i;\n }\n return -1;\n }\n\n private updateHighlight(): void {\n // Remove all highlights\n this._listboxElement\n ?.querySelectorAll('[role=\"option\"]')\n .forEach((el, i) => {\n el.classList.toggle('highlighted', i === this._highlightedIndex);\n });\n\n // Update aria-activedescendant\n if (this._highlightedIndex >= 0) {\n const optionId = `${this._id}-option-${this._highlightedIndex}`;\n this._triggerElement?.setAttribute('aria-activedescendant', optionId);\n\n // Scroll into view\n const option = this._listboxElement?.querySelector(`#${optionId}`);\n option?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n } else {\n this._triggerElement?.removeAttribute('aria-activedescendant');\n }\n }\n\n private updateListboxVisibility(): void {\n if (!this._listboxElement || !this._triggerElement) return;\n\n if (this._open) {\n this._listboxElement.hidden = false;\n this._triggerElement.setAttribute('aria-expanded', 'true');\n\n // Viewport-aware positioning\n this.updateListboxPosition();\n\n this.emit('a11y-select-open');\n } else {\n this._listboxElement.hidden = true;\n this._triggerElement.setAttribute('aria-expanded', 'false');\n this._highlightedIndex = -1;\n this.updateHighlight();\n\n // Reset position\n this._listboxElement.style.top = '';\n this._listboxElement.style.bottom = '';\n this.removeAttribute('data-position');\n\n this.emit('a11y-select-close');\n }\n }\n\n private updateListboxPosition(): void {\n if (!this._listboxElement || !this._triggerElement) return;\n\n const triggerRect = this._triggerElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const listboxHeight = Math.min(this._listboxElement.scrollHeight, 200);\n\n const spaceBelow = viewportHeight - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n\n if (spaceBelow < listboxHeight + 8 && spaceAbove > spaceBelow) {\n this._listboxElement.style.top = 'auto';\n this._listboxElement.style.bottom = '100%';\n this._listboxElement.style.marginTop = '0';\n this._listboxElement.style.marginBottom = '4px';\n this.setAttribute('data-position', 'top');\n } else {\n this._listboxElement.style.top = '100%';\n this._listboxElement.style.bottom = 'auto';\n this._listboxElement.style.marginTop = '4px';\n this._listboxElement.style.marginBottom = '0';\n this.setAttribute('data-position', 'bottom');\n }\n }\n\n /** Programmatic open */\n show(): void {\n this.open = true;\n }\n\n /** Programmatic close */\n close(): void {\n this.open = false;\n }\n}\n\ndefineElement('a11y-select', A11ySelect);\n\nexport default A11ySelect;\n","/**\n * compa11y Input Web Component\n *\n * A foundational accessible input with label, hint, and error support.\n *\n * @example\n * ```html\n * <a11y-input\n * label=\"Full Name\"\n * hint=\"Enter your first and last name\"\n * required\n * placeholder=\"John Doe\"\n * type=\"text\"\n * ></a11y-input>\n *\n * <!-- With error -->\n * <a11y-input\n * label=\"Email\"\n * error=\"Please enter a valid email\"\n * type=\"email\"\n * ></a11y-input>\n *\n * <!-- Disabled -->\n * <a11y-input label=\"Organization\" value=\"Compa11y Inc.\" disabled></a11y-input>\n * ```\n *\n * @fires input - Emitted on each keystroke, detail: { value: string }\n * @fires change - Emitted on blur after value changes, detail: { value: string }\n * @fires a11y-input-focus - Emitted when input gains focus\n * @fires a11y-input-blur - Emitted when input loses focus\n *\n * @attr {string} label - Visible label text\n * @attr {string} hint - Hint/description text\n * @attr {string} error - Error message text\n * @attr {string} type - Input type (text, email, password, number, tel, url, search)\n * @attr {string} placeholder - Placeholder text\n * @attr {string} value - Current value\n * @attr {boolean} disabled - Whether the input is disabled\n * @attr {boolean} readonly - Whether the input is read-only\n * @attr {boolean} required - Whether the input is required\n * @attr {string} name - Name for form submission\n *\n * @cssprop --compa11y-input-border - Border style (default: 1px solid #ccc)\n * @cssprop --compa11y-input-border-focus - Border color on focus (default: #0066cc)\n * @cssprop --compa11y-input-border-error - Border color on error (default: #ef4444)\n * @cssprop --compa11y-input-bg - Background color (default: white)\n * @cssprop --compa11y-input-radius - Border radius (default: 4px)\n * @cssprop --compa11y-input-padding - Input padding (default: 0.5rem 0.75rem)\n * @cssprop --compa11y-input-font-size - Font size (default: 0.875rem)\n * @cssprop --compa11y-input-label-color - Label color (default: inherit)\n * @cssprop --compa11y-input-label-size - Label font size (default: 0.875rem)\n * @cssprop --compa11y-input-label-weight - Label font weight (default: 500)\n * @cssprop --compa11y-input-hint-color - Hint text color (default: #666)\n * @cssprop --compa11y-input-error-color - Error text color (default: #ef4444)\n * @cssprop --compa11y-input-required-color - Required asterisk color (default: #ef4444)\n * @cssprop --compa11y-input-disabled-bg - Disabled background (default: #f5f5f5)\n * @cssprop --compa11y-input-placeholder-color - Placeholder color (default: #999)\n * @cssprop --compa11y-focus-color - Focus outline color (default: #0066cc)\n */\n\nimport { announceAssertive } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { INPUT_STYLES } from '../utils/styles';\n\nexport class A11yInput extends Compa11yElement {\n private _value = '';\n private _inputEl: HTMLInputElement | null = null;\n private _labelEl: HTMLLabelElement | null = null;\n private _hintEl: HTMLElement | null = null;\n private _errorEl: HTMLElement | null = null;\n\n static get observedAttributes() {\n return [\n 'label',\n 'hint',\n 'error',\n 'type',\n 'placeholder',\n 'value',\n 'disabled',\n 'readonly',\n 'required',\n 'name',\n 'autocomplete',\n 'maxlength',\n 'minlength',\n 'pattern',\n 'inputmode',\n 'aria-label',\n 'aria-labelledby',\n ];\n }\n\n // =========================================================================\n // Properties\n // =========================================================================\n\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v;\n if (this._inputEl && this._inputEl.value !== v) {\n this._inputEl.value = v;\n }\n if (v !== old) {\n this.setAttribute('value', v);\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(v: boolean) {\n this.toggleAttribute('disabled', v);\n }\n\n get readOnly(): boolean {\n return this.hasAttribute('readonly');\n }\n\n set readOnly(v: boolean) {\n this.toggleAttribute('readonly', v);\n }\n\n get required(): boolean {\n return this.hasAttribute('required');\n }\n\n set required(v: boolean) {\n this.toggleAttribute('required', v);\n }\n\n get error(): string {\n return this.getAttribute('error') || '';\n }\n\n set error(v: string) {\n if (v) {\n this.setAttribute('error', v);\n } else {\n this.removeAttribute('error');\n }\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n protected setupAccessibility(): void {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n const hasLabel =\n this.hasAttribute('label') ||\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby');\n if (!hasLabel) {\n console.warn(\n '[compa11y/Input] Input has no accessible label. Add label=\"...\", aria-label=\"...\", or aria-labelledby=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-input label=\"Full Name\"></a11y-input>'\n );\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const fieldId = `${this._id}-field`;\n const labelId = `${this._id}-label`;\n const hintId = `${this._id}-hint`;\n const errorId = `${this._id}-error`;\n\n const label = this.getAttribute('label') || '';\n const hint = this.getAttribute('hint') || '';\n const error = this.getAttribute('error') || '';\n const type = this.getAttribute('type') || 'text';\n const placeholder = this.getAttribute('placeholder') || '';\n const name = this.getAttribute('name') || '';\n const autocomplete = this.getAttribute('autocomplete') || '';\n const maxlength = this.getAttribute('maxlength');\n const minlength = this.getAttribute('minlength');\n const pattern = this.getAttribute('pattern');\n const inputmode = this.getAttribute('inputmode');\n const ariaLabel = this.getAttribute('aria-label') || '';\n const ariaLabelledBy = this.getAttribute('aria-labelledby') || '';\n const isDisabled = this.disabled;\n const isReadOnly = this.readOnly;\n const isRequired = this.required;\n const hasError = Boolean(error);\n\n // Build aria-describedby\n const describedByParts: string[] = [];\n if (hint) describedByParts.push(hintId);\n if (hasError) describedByParts.push(errorId);\n const ariaDescribedBy = describedByParts.length\n ? `aria-describedby=\"${describedByParts.join(' ')}\"`\n : '';\n\n // Label attributes\n const ariaLabelAttr =\n !label && ariaLabel ? `aria-label=\"${ariaLabel}\"` : '';\n const ariaLabelledByAttr =\n !label && ariaLabelledBy\n ? `aria-labelledby=\"${ariaLabelledBy}\"`\n : label\n ? `aria-labelledby=\"${labelId}\"`\n : '';\n\n // Set data-error on host for CSS\n this.setAttribute('data-error', hasError ? 'true' : 'false');\n\n shadow.innerHTML = `\n <style>${INPUT_STYLES}</style>\n <div class=\"input-wrapper\" part=\"wrapper\">\n ${\n label\n ? `<label id=\"${labelId}\" for=\"${fieldId}\" class=\"input-label\" part=\"label\">\n ${label}${isRequired ? '<span class=\"input-required\" aria-hidden=\"true\" part=\"required\">*</span>' : ''}\n </label>`\n : ''\n }\n <input\n id=\"${fieldId}\"\n type=\"${type}\"\n value=\"${this._value}\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n ${name ? `name=\"${name}\"` : ''}\n ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n ${maxlength ? `maxlength=\"${maxlength}\"` : ''}\n ${minlength ? `minlength=\"${minlength}\"` : ''}\n ${pattern ? `pattern=\"${pattern}\"` : ''}\n ${inputmode ? `inputmode=\"${inputmode}\"` : ''}\n ${ariaLabelAttr}\n ${ariaLabelledByAttr}\n ${ariaDescribedBy}\n ${hasError ? 'aria-invalid=\"true\"' : ''}\n ${isRequired ? 'aria-required=\"true\"' : ''}\n ${isDisabled ? 'disabled' : ''}\n ${isReadOnly ? 'readonly' : ''}\n part=\"field\"\n />\n ${\n hint\n ? `<div id=\"${hintId}\" class=\"input-hint\" part=\"hint\">${hint}</div>`\n : ''\n }\n ${\n hasError\n ? `<div id=\"${errorId}\" class=\"input-error\" role=\"alert\" part=\"error\">${error}</div>`\n : ''\n }\n </div>\n `;\n\n // Cache element references\n this._inputEl = shadow.querySelector('input');\n this._labelEl = shadow.querySelector('label');\n this._hintEl = shadow.querySelector('.input-hint');\n this._errorEl = shadow.querySelector('.input-error');\n\n // Sync value attribute if set\n const attrValue = this.getAttribute('value');\n if (attrValue && this._inputEl) {\n this._value = attrValue;\n this._inputEl.value = attrValue;\n }\n }\n\n protected setupEventListeners(): void {\n this._inputEl?.addEventListener('input', this.handleInput);\n this._inputEl?.addEventListener('change', this.handleChange);\n this._inputEl?.addEventListener('focus', this.handleFocus);\n this._inputEl?.addEventListener('blur', this.handleBlur);\n }\n\n protected cleanupEventListeners(): void {\n this._inputEl?.removeEventListener('input', this.handleInput);\n this._inputEl?.removeEventListener('change', this.handleChange);\n this._inputEl?.removeEventListener('focus', this.handleFocus);\n this._inputEl?.removeEventListener('blur', this.handleBlur);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n switch (name) {\n case 'value':\n this._value = newValue || '';\n if (this._inputEl && this._inputEl.value !== this._value) {\n this._inputEl.value = this._value;\n }\n break;\n\n case 'error':\n this.updateError(newValue || '');\n break;\n\n case 'hint':\n this.updateHint(newValue || '');\n break;\n\n case 'disabled':\n if (this._inputEl) {\n if (newValue !== null) {\n this._inputEl.setAttribute('disabled', '');\n } else {\n this._inputEl.removeAttribute('disabled');\n }\n }\n break;\n\n case 'readonly':\n if (this._inputEl) {\n if (newValue !== null) {\n this._inputEl.setAttribute('readonly', '');\n } else {\n this._inputEl.removeAttribute('readonly');\n }\n }\n break;\n\n case 'required':\n if (this._inputEl) {\n if (newValue !== null) {\n this._inputEl.setAttribute('aria-required', 'true');\n } else {\n this._inputEl.removeAttribute('aria-required');\n }\n }\n this.updateRequiredIndicator(newValue !== null);\n break;\n\n case 'placeholder':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('placeholder', newValue);\n } else {\n this._inputEl.removeAttribute('placeholder');\n }\n }\n break;\n\n case 'type':\n if (this._inputEl) {\n this._inputEl.type = newValue || 'text';\n }\n break;\n\n case 'name':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('name', newValue);\n } else {\n this._inputEl.removeAttribute('name');\n }\n }\n break;\n\n case 'autocomplete':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('autocomplete', newValue);\n } else {\n this._inputEl.removeAttribute('autocomplete');\n }\n }\n break;\n\n case 'maxlength':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('maxlength', newValue);\n } else {\n this._inputEl.removeAttribute('maxlength');\n }\n }\n break;\n\n case 'minlength':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('minlength', newValue);\n } else {\n this._inputEl.removeAttribute('minlength');\n }\n }\n break;\n\n case 'pattern':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('pattern', newValue);\n } else {\n this._inputEl.removeAttribute('pattern');\n }\n }\n break;\n\n case 'inputmode':\n if (this._inputEl) {\n if (newValue) {\n this._inputEl.setAttribute('inputmode', newValue);\n } else {\n this._inputEl.removeAttribute('inputmode');\n }\n }\n break;\n\n case 'label':\n case 'aria-label':\n case 'aria-labelledby':\n // Structural change - full re-render needed\n if (this.shadowRoot) {\n this.cleanupEventListeners();\n this.shadowRoot.innerHTML = '';\n this.render();\n this.setupEventListeners();\n }\n break;\n }\n }\n\n // =========================================================================\n // Event handlers\n // =========================================================================\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n this._value = target.value;\n this.emit('input', { value: this._value });\n };\n\n private handleChange = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n this._value = target.value;\n this.emit('change', { value: this._value });\n };\n\n private handleFocus = (): void => {\n this.emit('a11y-input-focus');\n };\n\n private handleBlur = (): void => {\n this.emit('a11y-input-blur');\n };\n\n // =========================================================================\n // DOM update helpers\n // =========================================================================\n\n private updateError(error: string): void {\n const hasError = Boolean(error);\n this.setAttribute('data-error', hasError ? 'true' : 'false');\n\n if (this._inputEl) {\n if (hasError) {\n this._inputEl.setAttribute('aria-invalid', 'true');\n } else {\n this._inputEl.removeAttribute('aria-invalid');\n }\n }\n\n if (hasError) {\n if (this._errorEl) {\n // Update existing error element\n this._errorEl.textContent = error;\n } else {\n // Create error element\n const errorId = `${this._id}-error`;\n const errorDiv = document.createElement('div');\n errorDiv.id = errorId;\n errorDiv.className = 'input-error';\n errorDiv.setAttribute('role', 'alert');\n errorDiv.setAttribute('part', 'error');\n errorDiv.textContent = error;\n\n const wrapper = this.shadowRoot?.querySelector('.input-wrapper');\n wrapper?.appendChild(errorDiv);\n this._errorEl = errorDiv;\n\n // Announce the error\n announceAssertive(error);\n }\n this.updateAriaDescribedBy();\n } else {\n if (this._errorEl) {\n this._errorEl.remove();\n this._errorEl = null;\n }\n this.updateAriaDescribedBy();\n }\n }\n\n private updateHint(hint: string): void {\n if (hint) {\n if (this._hintEl) {\n this._hintEl.textContent = hint;\n } else {\n const hintId = `${this._id}-hint`;\n const hintDiv = document.createElement('div');\n hintDiv.id = hintId;\n hintDiv.className = 'input-hint';\n hintDiv.setAttribute('part', 'hint');\n hintDiv.textContent = hint;\n\n // Insert before error element if it exists, otherwise append\n const wrapper = this.shadowRoot?.querySelector('.input-wrapper');\n if (this._errorEl) {\n wrapper?.insertBefore(hintDiv, this._errorEl);\n } else {\n wrapper?.appendChild(hintDiv);\n }\n this._hintEl = hintDiv;\n }\n } else {\n if (this._hintEl) {\n this._hintEl.remove();\n this._hintEl = null;\n }\n }\n this.updateAriaDescribedBy();\n }\n\n private updateAriaDescribedBy(): void {\n if (!this._inputEl) return;\n\n const parts: string[] = [];\n if (this._hintEl) parts.push(this._hintEl.id);\n if (this._errorEl) parts.push(this._errorEl.id);\n\n if (parts.length > 0) {\n this._inputEl.setAttribute('aria-describedby', parts.join(' '));\n } else {\n this._inputEl.removeAttribute('aria-describedby');\n }\n }\n\n private updateRequiredIndicator(isRequired: boolean): void {\n if (!this._labelEl) return;\n\n const existing = this._labelEl.querySelector('.input-required');\n if (isRequired && !existing) {\n const span = document.createElement('span');\n span.className = 'input-required';\n span.setAttribute('aria-hidden', 'true');\n span.setAttribute('part', 'required');\n span.textContent = '*';\n this._labelEl.appendChild(span);\n } else if (!isRequired && existing) {\n existing.remove();\n }\n }\n\n // =========================================================================\n // Public methods\n // =========================================================================\n\n /** Focus the input element */\n public focus(): void {\n this._inputEl?.focus();\n }\n\n /** Blur the input element */\n public blur(): void {\n this._inputEl?.blur();\n }\n\n /** Select all text in the input */\n public select(): void {\n this._inputEl?.select();\n }\n}\n\n// Register the custom element\ndefineElement('a11y-input', A11yInput);\n\nexport default A11yInput;\n","/**\n * compa11y Textarea Web Component\n *\n * A foundational accessible textarea with label, hint, and error support.\n *\n * @example\n * ```html\n * <a11y-textarea\n * label=\"Description\"\n * hint=\"Provide a brief summary\"\n * required\n * rows=\"4\"\n * placeholder=\"Enter description...\"\n * ></a11y-textarea>\n *\n * <!-- With error -->\n * <a11y-textarea\n * label=\"Bio\"\n * error=\"Bio is required\"\n * rows=\"5\"\n * ></a11y-textarea>\n *\n * <!-- Disabled -->\n * <a11y-textarea label=\"Notes\" value=\"Read only content\" disabled></a11y-textarea>\n * ```\n *\n * @fires input - Emitted on each keystroke, detail: { value: string }\n * @fires change - Emitted on blur after value changes, detail: { value: string }\n * @fires a11y-textarea-focus - Emitted when textarea gains focus\n * @fires a11y-textarea-blur - Emitted when textarea loses focus\n *\n * @attr {string} label - Visible label text\n * @attr {string} hint - Hint/description text\n * @attr {string} error - Error message text\n * @attr {string} rows - Number of visible rows (default: 3)\n * @attr {string} resize - Resize behavior (none, both, horizontal, vertical)\n * @attr {string} placeholder - Placeholder text\n * @attr {string} value - Current value\n * @attr {boolean} disabled - Whether the textarea is disabled\n * @attr {boolean} readonly - Whether the textarea is read-only\n * @attr {boolean} required - Whether the textarea is required\n * @attr {string} name - Name for form submission\n *\n * @cssprop --compa11y-textarea-border - Border style (default: 1px solid #ccc)\n * @cssprop --compa11y-textarea-border-focus - Border color on focus (default: #0066cc)\n * @cssprop --compa11y-textarea-border-error - Border color on error (default: #ef4444)\n * @cssprop --compa11y-textarea-bg - Background color (default: white)\n * @cssprop --compa11y-textarea-radius - Border radius (default: 4px)\n * @cssprop --compa11y-textarea-padding - Textarea padding (default: 0.5rem 0.75rem)\n * @cssprop --compa11y-textarea-font-size - Font size (default: 0.875rem)\n * @cssprop --compa11y-textarea-resize - Resize behavior (default: vertical)\n * @cssprop --compa11y-textarea-label-color - Label color (default: inherit)\n * @cssprop --compa11y-textarea-label-size - Label font size (default: 0.875rem)\n * @cssprop --compa11y-textarea-label-weight - Label font weight (default: 500)\n * @cssprop --compa11y-textarea-hint-color - Hint text color (default: #666)\n * @cssprop --compa11y-textarea-error-color - Error text color (default: #ef4444)\n * @cssprop --compa11y-textarea-required-color - Required asterisk color (default: #ef4444)\n * @cssprop --compa11y-textarea-disabled-bg - Disabled background (default: #f5f5f5)\n * @cssprop --compa11y-textarea-placeholder-color - Placeholder color (default: #999)\n * @cssprop --compa11y-focus-color - Focus outline color (default: #0066cc)\n */\n\nimport { announceAssertive } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { TEXTAREA_STYLES } from '../utils/styles';\n\nexport class A11yTextarea extends Compa11yElement {\n private _value = '';\n private _textareaEl: HTMLTextAreaElement | null = null;\n private _labelEl: HTMLLabelElement | null = null;\n private _hintEl: HTMLElement | null = null;\n private _errorEl: HTMLElement | null = null;\n\n static get observedAttributes() {\n return [\n 'label',\n 'hint',\n 'error',\n 'rows',\n 'resize',\n 'placeholder',\n 'value',\n 'disabled',\n 'readonly',\n 'required',\n 'name',\n 'autocomplete',\n 'maxlength',\n 'minlength',\n 'aria-label',\n 'aria-labelledby',\n ];\n }\n\n // =========================================================================\n // Properties\n // =========================================================================\n\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v;\n if (this._textareaEl && this._textareaEl.value !== v) {\n this._textareaEl.value = v;\n }\n if (v !== old) {\n this.setAttribute('value', v);\n }\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(v: boolean) {\n this.toggleAttribute('disabled', v);\n }\n\n get readOnly(): boolean {\n return this.hasAttribute('readonly');\n }\n\n set readOnly(v: boolean) {\n this.toggleAttribute('readonly', v);\n }\n\n get required(): boolean {\n return this.hasAttribute('required');\n }\n\n set required(v: boolean) {\n this.toggleAttribute('required', v);\n }\n\n get error(): string {\n return this.getAttribute('error') || '';\n }\n\n set error(v: string) {\n if (v) {\n this.setAttribute('error', v);\n } else {\n this.removeAttribute('error');\n }\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n protected setupAccessibility(): void {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n const hasLabel =\n this.hasAttribute('label') ||\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby');\n if (!hasLabel) {\n console.warn(\n '[compa11y/Textarea] Textarea has no accessible label. Add label=\"...\", aria-label=\"...\", or aria-labelledby=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-textarea label=\"Description\"></a11y-textarea>'\n );\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const fieldId = `${this._id}-field`;\n const labelId = `${this._id}-label`;\n const hintId = `${this._id}-hint`;\n const errorId = `${this._id}-error`;\n\n const label = this.getAttribute('label') || '';\n const hint = this.getAttribute('hint') || '';\n const error = this.getAttribute('error') || '';\n const rows = this.getAttribute('rows') || '3';\n const placeholder = this.getAttribute('placeholder') || '';\n const name = this.getAttribute('name') || '';\n const autocomplete = this.getAttribute('autocomplete') || '';\n const maxlength = this.getAttribute('maxlength');\n const minlength = this.getAttribute('minlength');\n const ariaLabel = this.getAttribute('aria-label') || '';\n const ariaLabelledBy = this.getAttribute('aria-labelledby') || '';\n const isDisabled = this.disabled;\n const isReadOnly = this.readOnly;\n const isRequired = this.required;\n const hasError = Boolean(error);\n\n // Build aria-describedby\n const describedByParts: string[] = [];\n if (hint) describedByParts.push(hintId);\n if (hasError) describedByParts.push(errorId);\n const ariaDescribedBy = describedByParts.length\n ? `aria-describedby=\"${describedByParts.join(' ')}\"`\n : '';\n\n // Label attributes\n const ariaLabelAttr =\n !label && ariaLabel ? `aria-label=\"${ariaLabel}\"` : '';\n const ariaLabelledByAttr =\n !label && ariaLabelledBy\n ? `aria-labelledby=\"${ariaLabelledBy}\"`\n : label\n ? `aria-labelledby=\"${labelId}\"`\n : '';\n\n // Set data-error on host for CSS\n this.setAttribute('data-error', hasError ? 'true' : 'false');\n\n shadow.innerHTML = `\n <style>${TEXTAREA_STYLES}</style>\n <div class=\"textarea-wrapper\" part=\"wrapper\">\n ${\n label\n ? `<label id=\"${labelId}\" for=\"${fieldId}\" class=\"textarea-label\" part=\"label\">\n ${label}${isRequired ? '<span class=\"textarea-required\" aria-hidden=\"true\" part=\"required\">*</span>' : ''}\n </label>`\n : ''\n }\n <textarea\n id=\"${fieldId}\"\n rows=\"${rows}\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n ${name ? `name=\"${name}\"` : ''}\n ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n ${maxlength ? `maxlength=\"${maxlength}\"` : ''}\n ${minlength ? `minlength=\"${minlength}\"` : ''}\n ${ariaLabelAttr}\n ${ariaLabelledByAttr}\n ${ariaDescribedBy}\n ${hasError ? 'aria-invalid=\"true\"' : ''}\n ${isRequired ? 'aria-required=\"true\"' : ''}\n ${isDisabled ? 'disabled' : ''}\n ${isReadOnly ? 'readonly' : ''}\n part=\"field\"\n >${this._value}</textarea>\n ${\n hint\n ? `<div id=\"${hintId}\" class=\"textarea-hint\" part=\"hint\">${hint}</div>`\n : ''\n }\n ${\n hasError\n ? `<div id=\"${errorId}\" class=\"textarea-error\" role=\"alert\" part=\"error\">${error}</div>`\n : ''\n }\n </div>\n `;\n\n // Cache element references\n this._textareaEl = shadow.querySelector('textarea');\n this._labelEl = shadow.querySelector('label');\n this._hintEl = shadow.querySelector('.textarea-hint');\n this._errorEl = shadow.querySelector('.textarea-error');\n\n // Sync value attribute if set\n const attrValue = this.getAttribute('value');\n if (attrValue && this._textareaEl) {\n this._value = attrValue;\n this._textareaEl.value = attrValue;\n }\n }\n\n protected setupEventListeners(): void {\n this._textareaEl?.addEventListener('input', this.handleInput);\n this._textareaEl?.addEventListener('change', this.handleChange);\n this._textareaEl?.addEventListener('focus', this.handleFocus);\n this._textareaEl?.addEventListener('blur', this.handleBlur);\n }\n\n protected cleanupEventListeners(): void {\n this._textareaEl?.removeEventListener('input', this.handleInput);\n this._textareaEl?.removeEventListener('change', this.handleChange);\n this._textareaEl?.removeEventListener('focus', this.handleFocus);\n this._textareaEl?.removeEventListener('blur', this.handleBlur);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n switch (name) {\n case 'value':\n this._value = newValue || '';\n if (this._textareaEl && this._textareaEl.value !== this._value) {\n this._textareaEl.value = this._value;\n }\n break;\n\n case 'error':\n this.updateError(newValue || '');\n break;\n\n case 'hint':\n this.updateHint(newValue || '');\n break;\n\n case 'disabled':\n if (this._textareaEl) {\n if (newValue !== null) {\n this._textareaEl.setAttribute('disabled', '');\n } else {\n this._textareaEl.removeAttribute('disabled');\n }\n }\n break;\n\n case 'readonly':\n if (this._textareaEl) {\n if (newValue !== null) {\n this._textareaEl.setAttribute('readonly', '');\n } else {\n this._textareaEl.removeAttribute('readonly');\n }\n }\n break;\n\n case 'required':\n if (this._textareaEl) {\n if (newValue !== null) {\n this._textareaEl.setAttribute('aria-required', 'true');\n } else {\n this._textareaEl.removeAttribute('aria-required');\n }\n }\n this.updateRequiredIndicator(newValue !== null);\n break;\n\n case 'placeholder':\n if (this._textareaEl) {\n if (newValue) {\n this._textareaEl.setAttribute('placeholder', newValue);\n } else {\n this._textareaEl.removeAttribute('placeholder');\n }\n }\n break;\n\n case 'rows':\n if (this._textareaEl) {\n this._textareaEl.rows = parseInt(newValue || '3', 10);\n }\n break;\n\n case 'name':\n if (this._textareaEl) {\n if (newValue) {\n this._textareaEl.setAttribute('name', newValue);\n } else {\n this._textareaEl.removeAttribute('name');\n }\n }\n break;\n\n case 'autocomplete':\n if (this._textareaEl) {\n if (newValue) {\n this._textareaEl.setAttribute('autocomplete', newValue);\n } else {\n this._textareaEl.removeAttribute('autocomplete');\n }\n }\n break;\n\n case 'maxlength':\n if (this._textareaEl) {\n if (newValue) {\n this._textareaEl.setAttribute('maxlength', newValue);\n } else {\n this._textareaEl.removeAttribute('maxlength');\n }\n }\n break;\n\n case 'minlength':\n if (this._textareaEl) {\n if (newValue) {\n this._textareaEl.setAttribute('minlength', newValue);\n } else {\n this._textareaEl.removeAttribute('minlength');\n }\n }\n break;\n\n case 'resize':\n // Handled via CSS custom property on :host, but we can also\n // set it inline if the textarea element exists\n if (this._textareaEl) {\n this._textareaEl.style.resize = newValue || 'vertical';\n }\n break;\n\n case 'label':\n case 'aria-label':\n case 'aria-labelledby':\n // Structural change - full re-render needed\n if (this.shadowRoot) {\n this.cleanupEventListeners();\n this.shadowRoot.innerHTML = '';\n this.render();\n this.setupEventListeners();\n }\n break;\n }\n }\n\n // =========================================================================\n // Event handlers\n // =========================================================================\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLTextAreaElement;\n this._value = target.value;\n this.emit('input', { value: this._value });\n };\n\n private handleChange = (event: Event): void => {\n const target = event.target as HTMLTextAreaElement;\n this._value = target.value;\n this.emit('change', { value: this._value });\n };\n\n private handleFocus = (): void => {\n this.emit('a11y-textarea-focus');\n };\n\n private handleBlur = (): void => {\n this.emit('a11y-textarea-blur');\n };\n\n // =========================================================================\n // DOM update helpers\n // =========================================================================\n\n private updateError(error: string): void {\n const hasError = Boolean(error);\n this.setAttribute('data-error', hasError ? 'true' : 'false');\n\n if (this._textareaEl) {\n if (hasError) {\n this._textareaEl.setAttribute('aria-invalid', 'true');\n } else {\n this._textareaEl.removeAttribute('aria-invalid');\n }\n }\n\n if (hasError) {\n if (this._errorEl) {\n // Update existing error element\n this._errorEl.textContent = error;\n } else {\n // Create error element\n const errorId = `${this._id}-error`;\n const errorDiv = document.createElement('div');\n errorDiv.id = errorId;\n errorDiv.className = 'textarea-error';\n errorDiv.setAttribute('role', 'alert');\n errorDiv.setAttribute('part', 'error');\n errorDiv.textContent = error;\n\n const wrapper = this.shadowRoot?.querySelector('.textarea-wrapper');\n wrapper?.appendChild(errorDiv);\n this._errorEl = errorDiv;\n\n // Announce the error\n announceAssertive(error);\n }\n this.updateAriaDescribedBy();\n } else {\n if (this._errorEl) {\n this._errorEl.remove();\n this._errorEl = null;\n }\n this.updateAriaDescribedBy();\n }\n }\n\n private updateHint(hint: string): void {\n if (hint) {\n if (this._hintEl) {\n this._hintEl.textContent = hint;\n } else {\n const hintId = `${this._id}-hint`;\n const hintDiv = document.createElement('div');\n hintDiv.id = hintId;\n hintDiv.className = 'textarea-hint';\n hintDiv.setAttribute('part', 'hint');\n hintDiv.textContent = hint;\n\n // Insert before error element if it exists, otherwise append\n const wrapper = this.shadowRoot?.querySelector('.textarea-wrapper');\n if (this._errorEl) {\n wrapper?.insertBefore(hintDiv, this._errorEl);\n } else {\n wrapper?.appendChild(hintDiv);\n }\n this._hintEl = hintDiv;\n }\n } else {\n if (this._hintEl) {\n this._hintEl.remove();\n this._hintEl = null;\n }\n }\n this.updateAriaDescribedBy();\n }\n\n private updateAriaDescribedBy(): void {\n if (!this._textareaEl) return;\n\n const parts: string[] = [];\n if (this._hintEl) parts.push(this._hintEl.id);\n if (this._errorEl) parts.push(this._errorEl.id);\n\n if (parts.length > 0) {\n this._textareaEl.setAttribute('aria-describedby', parts.join(' '));\n } else {\n this._textareaEl.removeAttribute('aria-describedby');\n }\n }\n\n private updateRequiredIndicator(isRequired: boolean): void {\n if (!this._labelEl) return;\n\n const existing = this._labelEl.querySelector('.textarea-required');\n if (isRequired && !existing) {\n const span = document.createElement('span');\n span.className = 'textarea-required';\n span.setAttribute('aria-hidden', 'true');\n span.setAttribute('part', 'required');\n span.textContent = '*';\n this._labelEl.appendChild(span);\n } else if (!isRequired && existing) {\n existing.remove();\n }\n }\n\n // =========================================================================\n // Public methods\n // =========================================================================\n\n /** Focus the textarea element */\n public focus(): void {\n this._textareaEl?.focus();\n }\n\n /** Blur the textarea element */\n public blur(): void {\n this._textareaEl?.blur();\n }\n\n /** Select all text in the textarea */\n public select(): void {\n this._textareaEl?.select();\n }\n}\n\n// Register the custom element\ndefineElement('a11y-textarea', A11yTextarea);\n\nexport default A11yTextarea;\n","/**\n * compa11y Button Web Component\n *\n * An accessible button with variant, size, loading, and discoverable support.\n *\n * @example\n * ```html\n * <a11y-button variant=\"primary\">Save</a11y-button>\n * <a11y-button variant=\"danger\" loading>Deleting...</a11y-button>\n * <a11y-button variant=\"outline\" disabled discoverable>Unavailable</a11y-button>\n * ```\n *\n * @fires click - Standard click event (prevented when disabled/loading)\n * @fires a11y-button-click - Emitted on click when not disabled/loading\n *\n * @attr {string} variant - Visual variant (primary, secondary, danger, outline, ghost)\n * @attr {string} size - Size (sm, md, lg)\n * @attr {boolean} disabled - Whether the button is disabled\n * @attr {boolean} discoverable - Keep disabled button in tab order with aria-disabled\n * @attr {boolean} loading - Loading state (sets aria-busy, shows spinner)\n * @attr {string} type - Button type (button, submit, reset)\n * @attr {string} aria-label - Accessible label\n *\n * @cssprop --compa11y-button-radius - Border radius (default: 4px)\n * @cssprop --compa11y-button-font-weight - Font weight (default: 500)\n * @cssprop --compa11y-button-disabled-opacity - Disabled opacity (default: 0.5)\n * @cssprop --compa11y-button-primary-bg - Primary background (default: #0066cc)\n * @cssprop --compa11y-button-primary-color - Primary text color (default: white)\n * @cssprop --compa11y-button-danger-bg - Danger background (default: #ef4444)\n * @cssprop --compa11y-button-danger-color - Danger text color (default: white)\n * @cssprop --compa11y-focus-color - Focus outline color (default: #0066cc)\n */\n\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { BUTTON_STYLES } from '../utils/styles';\n\nexport class A11yButton extends Compa11yElement {\n private _buttonEl: HTMLButtonElement | null = null;\n\n static get observedAttributes() {\n return [\n 'variant',\n 'size',\n 'disabled',\n 'discoverable',\n 'loading',\n 'type',\n 'aria-label',\n ];\n }\n\n // =========================================================================\n // Properties\n // =========================================================================\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(v: boolean) {\n this.toggleAttribute('disabled', v);\n }\n\n get discoverable(): boolean {\n return this.hasAttribute('discoverable');\n }\n\n set discoverable(v: boolean) {\n this.toggleAttribute('discoverable', v);\n }\n\n get loading(): boolean {\n return this.hasAttribute('loading');\n }\n\n set loading(v: boolean) {\n this.toggleAttribute('loading', v);\n }\n\n get variant(): string {\n return this.getAttribute('variant') || 'secondary';\n }\n\n set variant(v: string) {\n this.setAttribute('variant', v);\n }\n\n get size(): string {\n return this.getAttribute('size') || 'md';\n }\n\n set size(v: string) {\n this.setAttribute('size', v);\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n protected setupAccessibility(): void {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n const hasLabel =\n this.textContent?.trim() ||\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby');\n if (!hasLabel) {\n console.warn(\n '[compa11y/Button] Button has no accessible label. Add text content, aria-label=\"...\", or aria-labelledby=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-button>Click me</a11y-button>'\n );\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const variant = this.variant;\n const size = this.size;\n const type = this.getAttribute('type') || 'button';\n const ariaLabel = this.getAttribute('aria-label') || '';\n const isDisabled = this.disabled;\n const isDiscoverable = this.discoverable;\n const isLoading = this.loading;\n const isInteractionDisabled = isDisabled || isLoading;\n const useNativeDisabled = isDisabled && !isDiscoverable;\n\n shadow.innerHTML = `\n <style>${BUTTON_STYLES}</style>\n <button\n class=\"variant-${variant} size-${size}\"\n type=\"${type}\"\n ${useNativeDisabled ? 'disabled' : ''}\n ${isInteractionDisabled ? 'aria-disabled=\"true\"' : ''}\n ${isLoading ? 'aria-busy=\"true\"' : ''}\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\n part=\"button\"\n >${isLoading ? '<span class=\"button-spinner\" aria-hidden=\"true\" part=\"spinner\"></span>' : ''}<slot></slot></button>\n `;\n\n this._buttonEl = shadow.querySelector('button');\n }\n\n protected setupEventListeners(): void {\n this._buttonEl?.addEventListener('click', this.handleClick);\n }\n\n protected cleanupEventListeners(): void {\n this._buttonEl?.removeEventListener('click', this.handleClick);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n switch (name) {\n case 'variant': {\n if (!this._buttonEl) break;\n // Remove old variant classes, add new one\n const classes = this._buttonEl.className.split(' ');\n const filtered = classes.filter((c) => !c.startsWith('variant-'));\n filtered.push(`variant-${newValue || 'secondary'}`);\n this._buttonEl.className = filtered.join(' ');\n break;\n }\n\n case 'size': {\n if (!this._buttonEl) break;\n const classes = this._buttonEl.className.split(' ');\n const filtered = classes.filter((c) => !c.startsWith('size-'));\n filtered.push(`size-${newValue || 'md'}`);\n this._buttonEl.className = filtered.join(' ');\n break;\n }\n\n case 'disabled':\n case 'discoverable':\n this.updateDisabledState();\n break;\n\n case 'loading':\n this.updateLoadingState();\n break;\n\n case 'type':\n if (this._buttonEl) {\n this._buttonEl.type = (newValue || 'button') as 'button' | 'reset' | 'submit';\n }\n break;\n\n case 'aria-label':\n if (this._buttonEl) {\n if (newValue) {\n this._buttonEl.setAttribute('aria-label', newValue);\n } else {\n this._buttonEl.removeAttribute('aria-label');\n }\n }\n break;\n }\n }\n\n // =========================================================================\n // Event handlers\n // =========================================================================\n\n private handleClick = (event: Event): void => {\n if (this.disabled || this.loading) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.emit('a11y-button-click');\n };\n\n // =========================================================================\n // DOM update helpers\n // =========================================================================\n\n private updateDisabledState(): void {\n if (!this._buttonEl) return;\n const isDisabled = this.disabled;\n const isDiscoverable = this.discoverable;\n const isLoading = this.loading;\n const useNativeDisabled = isDisabled && !isDiscoverable;\n const isInteractionDisabled = isDisabled || isLoading;\n\n if (useNativeDisabled) {\n this._buttonEl.setAttribute('disabled', '');\n } else {\n this._buttonEl.removeAttribute('disabled');\n }\n\n if (isInteractionDisabled) {\n this._buttonEl.setAttribute('aria-disabled', 'true');\n } else {\n this._buttonEl.removeAttribute('aria-disabled');\n }\n }\n\n private updateLoadingState(): void {\n if (!this._buttonEl) return;\n const isLoading = this.loading;\n\n if (isLoading) {\n this._buttonEl.setAttribute('aria-busy', 'true');\n this._buttonEl.setAttribute('aria-disabled', 'true');\n // Add spinner if not present\n if (!this._buttonEl.querySelector('.button-spinner')) {\n const spinner = document.createElement('span');\n spinner.className = 'button-spinner';\n spinner.setAttribute('aria-hidden', 'true');\n spinner.setAttribute('part', 'spinner');\n this._buttonEl.insertBefore(spinner, this._buttonEl.firstChild);\n }\n } else {\n this._buttonEl.removeAttribute('aria-busy');\n // Remove spinner\n const spinner = this._buttonEl.querySelector('.button-spinner');\n spinner?.remove();\n // Re-evaluate disabled state\n this.updateDisabledState();\n }\n }\n\n // =========================================================================\n // Public methods\n // =========================================================================\n\n /** Focus the button element */\n public focus(): void {\n this._buttonEl?.focus();\n }\n\n /** Blur the button element */\n public blur(): void {\n this._buttonEl?.blur();\n }\n\n /** Programmatically click the button */\n public click(): void {\n this._buttonEl?.click();\n }\n}\n\n// Register the custom element\ndefineElement('a11y-button', A11yButton);\n\nexport default A11yButton;\n","/**\n * A11y Listbox + Option + Optgroup Web Components\n *\n * Accessible listbox custom elements with full keyboard support,\n * single-select (selection follows focus) and multi-select modes,\n * option groups, and type-ahead search.\n *\n * @example\n * ```html\n * <!-- Single select -->\n * <a11y-listbox aria-label=\"Favorite fruit\" value=\"apple\">\n * <a11y-option value=\"apple\">Apple</a11y-option>\n * <a11y-option value=\"banana\" disabled>Banana</a11y-option>\n * <a11y-optgroup label=\"Citrus\">\n * <a11y-option value=\"orange\">Orange</a11y-option>\n * <a11y-option value=\"lemon\">Lemon</a11y-option>\n * </a11y-optgroup>\n * </a11y-listbox>\n *\n * <!-- Multi select -->\n * <a11y-listbox multiple aria-label=\"Toppings\" value=\"cheese,pepperoni\">\n * <a11y-option value=\"cheese\">Cheese</a11y-option>\n * <a11y-option value=\"pepperoni\">Pepperoni</a11y-option>\n * </a11y-listbox>\n * ```\n */\n\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport {\n LISTBOX_STYLES,\n OPTION_STYLES,\n OPTGROUP_STYLES,\n} from '../utils/styles';\nimport { announcePolite, createTypeAhead } from '@compa11y/core';\n\n// ============================================================================\n// A11yOptgroup\n// ============================================================================\n\nexport class A11yOptgroup extends Compa11yElement {\n private _label = '';\n private _disabled = false;\n\n static get observedAttributes() {\n return ['label', 'disabled'];\n }\n\n get label(): string {\n return this._label;\n }\n\n set label(v: string) {\n this._label = v;\n this.setAttribute('label', v);\n this.updateLabel();\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(v: boolean) {\n const newValue = Boolean(v);\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n if (newValue) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n }\n }\n }\n\n protected setupAccessibility(): void {\n this.setAttribute('role', 'group');\n\n this._label = this.getAttribute('label') || '';\n this._disabled = this.hasAttribute('disabled');\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n }\n\n // aria-labelledby set after render when we have the label element ID\n }\n\n protected render(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n\n const labelId = `${this._id}-label`;\n\n this.shadowRoot!.innerHTML = `\n <style>${OPTGROUP_STYLES}</style>\n <div class=\"optgroup-wrapper\" part=\"group\">\n <div class=\"optgroup-label\" part=\"label\" id=\"${labelId}\" role=\"presentation\">\n ${this._label}\n </div>\n <div class=\"optgroup-options\" part=\"options\" role=\"none\">\n <slot></slot>\n </div>\n </div>\n `;\n\n this.setAttribute('aria-labelledby', labelId);\n }\n\n protected setupEventListeners(): void {\n // No direct events — parent handles keyboard\n }\n\n protected cleanupEventListeners(): void {\n // No cleanup needed\n }\n\n private updateLabel(): void {\n const labelEl = this.shadowRoot?.querySelector('.optgroup-label');\n if (labelEl) {\n labelEl.textContent = this._label;\n }\n }\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'label':\n this._label = newValue || '';\n this.updateLabel();\n break;\n case 'disabled':\n this._disabled = newValue !== null;\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n break;\n }\n }\n}\n\n// ============================================================================\n// A11yOption\n// ============================================================================\n\nexport class A11yOption extends Compa11yElement {\n private _value = '';\n private _disabled = false;\n private _selected = false;\n private _discoverable = true;\n\n static get observedAttributes() {\n return ['value', 'disabled', 'discoverable'];\n }\n\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n this._value = v;\n this.setAttribute('value', v);\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(v: boolean) {\n const newValue = Boolean(v);\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n if (newValue) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n }\n }\n }\n\n get selected(): boolean {\n return this._selected;\n }\n\n set selected(v: boolean) {\n const newValue = Boolean(v);\n if (this._selected !== newValue) {\n this._selected = newValue;\n this.setAttribute('aria-selected', String(newValue));\n }\n }\n\n get discoverable(): boolean {\n return this._discoverable;\n }\n\n set discoverable(v: boolean) {\n this._discoverable = Boolean(v);\n }\n\n /**\n * Whether this option is effectively disabled (own disabled or group disabled)\n */\n get effectivelyDisabled(): boolean {\n if (this._disabled) return true;\n const group = this.closest('a11y-optgroup') as A11yOptgroup | null;\n return group?.disabled ?? false;\n }\n\n protected setupAccessibility(): void {\n this.setAttribute('role', 'option');\n this.setAttribute('aria-selected', 'false');\n\n this._value = this.getAttribute('value') || '';\n this._disabled = this.hasAttribute('disabled');\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n }\n\n const discoverableAttr = this.getAttribute('discoverable');\n if (discoverableAttr === 'false' || discoverableAttr === '0') {\n this._discoverable = false;\n }\n }\n\n protected render(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n\n this.shadowRoot!.innerHTML = `\n <style>${OPTION_STYLES}</style>\n <div class=\"option-wrapper\" part=\"option\">\n <span class=\"option-content\" part=\"content\"><slot></slot></span>\n <span class=\"check-mark\" part=\"check\" aria-hidden=\"true\">&#10003;</span>\n </div>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('click', this.handleClick);\n }\n\n protected cleanupEventListeners(): void {\n this.removeEventListener('click', this.handleClick);\n }\n\n private handleClick = (event: Event): void => {\n if (this.effectivelyDisabled) {\n event.preventDefault();\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('option-select', {\n detail: { value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'value':\n this._value = newValue || '';\n break;\n case 'disabled':\n this._disabled = newValue !== null;\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n break;\n case 'discoverable':\n if (newValue === null) {\n this._discoverable = true;\n } else if (newValue === 'false' || newValue === '0') {\n this._discoverable = false;\n } else {\n this._discoverable = true;\n }\n break;\n }\n }\n}\n\n// ============================================================================\n// A11yListbox\n// ============================================================================\n\nexport class A11yListbox extends Compa11yElement {\n private _value: string | null = null;\n private _values: Set<string> = new Set();\n private _multiple = false;\n private _disabled = false;\n private _discoverable = true;\n private _orientation: 'horizontal' | 'vertical' = 'vertical';\n private _focusedIndex = -1;\n private _typeAhead: ReturnType<typeof createTypeAhead> | null = null;\n\n static get observedAttributes() {\n return [\n 'value',\n 'multiple',\n 'disabled',\n 'discoverable',\n 'orientation',\n 'aria-label',\n 'aria-labelledby',\n ];\n }\n\n // ===== Getters/Setters =====\n\n get value(): string | string[] {\n if (this._multiple) {\n return Array.from(this._values);\n }\n return this._value || '';\n }\n\n set value(v: string | string[]) {\n if (this._multiple) {\n const arr = Array.isArray(v) ? v : String(v).split(',').filter(Boolean);\n this._values = new Set(arr);\n this.setAttribute('value', arr.join(','));\n } else {\n const str = Array.isArray(v) ? v[0] || '' : String(v);\n this._value = str;\n this.setAttribute('value', str);\n }\n this.syncOptionStates();\n }\n\n get multiple(): boolean {\n return this._multiple;\n }\n\n set multiple(v: boolean) {\n const newValue = Boolean(v);\n if (this._multiple !== newValue) {\n this._multiple = newValue;\n if (newValue) {\n this.setAttribute('multiple', '');\n this.setAttribute('aria-multiselectable', 'true');\n } else {\n this.removeAttribute('multiple');\n this.removeAttribute('aria-multiselectable');\n }\n }\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(v: boolean) {\n const newValue = Boolean(v);\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n if (newValue) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n }\n }\n }\n\n get discoverable(): boolean {\n return this._discoverable;\n }\n\n set discoverable(v: boolean) {\n this._discoverable = Boolean(v);\n }\n\n get orientation(): 'horizontal' | 'vertical' {\n return this._orientation;\n }\n\n set orientation(v: 'horizontal' | 'vertical') {\n this._orientation = v;\n this.setAttribute('orientation', v);\n this.setAttribute('aria-orientation', v);\n }\n\n // ===== Lifecycle =====\n\n protected setupAccessibility(): void {\n this.setAttribute('role', 'listbox');\n this.setAttribute('aria-orientation', this._orientation);\n\n const hasLabel =\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby');\n if (!hasLabel && process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Compa11y Listbox]: Listbox has no accessible label. ' +\n 'Use aria-label or aria-labelledby.'\n );\n }\n\n // Initialize from attributes\n this._multiple = this.hasAttribute('multiple');\n if (this._multiple) {\n this.setAttribute('aria-multiselectable', 'true');\n }\n\n this._disabled = this.hasAttribute('disabled');\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n }\n\n const orient = this.getAttribute('orientation');\n if (orient === 'horizontal' || orient === 'vertical') {\n this._orientation = orient;\n }\n\n const discoverableAttr = this.getAttribute('discoverable');\n if (discoverableAttr === 'false' || discoverableAttr === '0') {\n this._discoverable = false;\n }\n\n // Parse initial value\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n if (this._multiple) {\n this._values = new Set(initialValue.split(',').filter(Boolean));\n } else {\n this._value = initialValue;\n }\n }\n\n // Tabindex\n if (this._disabled && !this._discoverable) {\n this.setAttribute('tabindex', '-1');\n } else {\n this.setAttribute('tabindex', '0');\n }\n }\n\n protected render(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n\n this.shadowRoot!.innerHTML = `\n <style>${LISTBOX_STYLES}</style>\n <div class=\"listbox-wrapper\" part=\"wrapper\">\n <slot></slot>\n </div>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('keydown', this.handleKeyDown);\n this.addEventListener('focus', this.handleFocus);\n this.addEventListener('option-select', this.handleOptionSelect as EventListener);\n\n // Watch for slotchange to re-index options\n const slot = this.shadowRoot?.querySelector('slot');\n if (slot) {\n slot.addEventListener('slotchange', () => {\n this.rebuildTypeAhead();\n this.syncOptionStates();\n });\n }\n\n // Initial sync\n this.rebuildTypeAhead();\n this.syncOptionStates();\n }\n\n protected cleanupEventListeners(): void {\n this.removeEventListener('keydown', this.handleKeyDown);\n this.removeEventListener('focus', this.handleFocus);\n this.removeEventListener('option-select', this.handleOptionSelect as EventListener);\n }\n\n // ===== Option Queries =====\n\n private getAllOptions(): A11yOption[] {\n return Array.from(this.querySelectorAll('a11y-option')) as A11yOption[];\n }\n\n private getEnabledOptions(): A11yOption[] {\n return this.getAllOptions().filter((option) => !option.effectivelyDisabled);\n }\n\n private getEnabledIndices(): number[] {\n const allOptions = this.getAllOptions();\n const indices: number[] = [];\n allOptions.forEach((opt, i) => {\n if (!opt.effectivelyDisabled) {\n indices.push(i);\n }\n });\n return indices;\n }\n\n // ===== State Sync =====\n\n private syncOptionStates(): void {\n const options = this.getAllOptions();\n\n options.forEach((option) => {\n if (this._multiple) {\n option.selected = this._values.has(option.value);\n } else {\n option.selected = option.value === this._value;\n }\n });\n }\n\n private updateFocusHighlight(): void {\n const options = this.getAllOptions();\n\n options.forEach((opt, i) => {\n if (i === this._focusedIndex) {\n opt.toggleAttribute('data-focused', true);\n } else {\n opt.removeAttribute('data-focused');\n }\n });\n\n // Update aria-activedescendant\n const focusedOption = this._focusedIndex >= 0 ? options[this._focusedIndex] : undefined;\n if (focusedOption) {\n this.setAttribute('aria-activedescendant', focusedOption.id);\n focusedOption.scrollIntoView({ block: 'nearest' });\n } else {\n this.removeAttribute('aria-activedescendant');\n }\n }\n\n // ===== Navigation Helpers =====\n\n private findNextEnabled(currentIndex: number, direction: 1 | -1): number {\n const enabledIndices = this.getEnabledIndices();\n if (enabledIndices.length === 0) return -1;\n\n // Find current position in enabled list\n const currentPos = enabledIndices.indexOf(currentIndex);\n\n if (currentPos === -1) {\n // Current is not enabled, find nearest\n return direction === 1 ? enabledIndices[0]! : enabledIndices[enabledIndices.length - 1]!;\n }\n\n const nextPos = currentPos + direction;\n if (nextPos < 0 || nextPos >= enabledIndices.length) {\n return -1; // No wrapping for listbox\n }\n\n return enabledIndices[nextPos]!;\n }\n\n private findFirstEnabled(): number {\n const indices = this.getEnabledIndices();\n return indices.length > 0 ? indices[0]! : -1;\n }\n\n private findLastEnabled(): number {\n const indices = this.getEnabledIndices();\n return indices.length > 0 ? indices[indices.length - 1]! : -1;\n }\n\n // ===== Selection =====\n\n private selectOption(option: A11yOption): void {\n if (option.effectivelyDisabled || this._disabled) return;\n\n if (this._multiple) {\n this.toggleOptionSelection(option);\n } else {\n this.selectSingle(option);\n }\n }\n\n private selectSingle(option: A11yOption): void {\n const oldValue = this._value;\n this._value = option.value;\n this.setAttribute('value', option.value);\n this.syncOptionStates();\n\n if (oldValue !== this._value) {\n const label = option.textContent?.trim() || option.value;\n this.emit('change', { value: this._value, label });\n this.emit('a11y-listbox-change', { value: this._value, label });\n announcePolite(`${label} selected`);\n }\n }\n\n private toggleOptionSelection(option: A11yOption): void {\n if (option.effectivelyDisabled || this._disabled) return;\n\n const label = option.textContent?.trim() || option.value;\n\n if (this._values.has(option.value)) {\n this._values.delete(option.value);\n option.selected = false;\n announcePolite(`${label} deselected`);\n } else {\n this._values.add(option.value);\n option.selected = true;\n announcePolite(`${label} selected`);\n }\n\n const valueArray = Array.from(this._values);\n this.setAttribute('value', valueArray.join(','));\n\n this.emit('change', { value: valueArray });\n this.emit('a11y-listbox-change', { value: valueArray });\n }\n\n private selectRange(fromIndex: number, toIndex: number): void {\n const options = this.getAllOptions();\n const start = Math.min(fromIndex, toIndex);\n const end = Math.max(fromIndex, toIndex);\n\n for (let i = start; i <= end; i++) {\n const opt = options[i];\n if (opt && !opt.effectivelyDisabled) {\n this._values.add(opt.value);\n opt.selected = true;\n }\n }\n\n const valueArray = Array.from(this._values);\n this.setAttribute('value', valueArray.join(','));\n this.emit('change', { value: valueArray });\n this.emit('a11y-listbox-change', { value: valueArray });\n announcePolite(`${end - start + 1} items selected`);\n }\n\n private toggleSelectAll(): void {\n const enabledOptions = this.getEnabledOptions();\n const allSelected = enabledOptions.every((o) => this._values.has(o.value));\n\n if (allSelected) {\n // Deselect all\n this._values.clear();\n this.getAllOptions().forEach((o) => (o.selected = false));\n announcePolite('All deselected');\n } else {\n // Select all enabled\n enabledOptions.forEach((o) => {\n this._values.add(o.value);\n o.selected = true;\n });\n announcePolite('All selected');\n }\n\n const valueArray = Array.from(this._values);\n this.setAttribute('value', valueArray.join(','));\n this.emit('change', { value: valueArray });\n this.emit('a11y-listbox-change', { value: valueArray });\n }\n\n // ===== Type-ahead =====\n\n private rebuildTypeAhead(): void {\n const labels = this.getAllOptions().map(\n (o) => o.textContent?.trim() || ''\n );\n this._typeAhead = createTypeAhead(labels, { timeout: 500 });\n }\n\n // ===== Event Handlers =====\n\n private handleFocus = (): void => {\n if (this._focusedIndex >= 0) return; // Already has focus state\n\n const options = this.getAllOptions();\n\n // Focus selected option (or first selected in multi)\n if (!this._multiple && this._value) {\n const idx = options.findIndex((o) => o.value === this._value);\n if (idx >= 0) {\n this._focusedIndex = idx;\n this.updateFocusHighlight();\n return;\n }\n } else if (this._multiple && this._values.size > 0) {\n const idx = options.findIndex((o) => this._values.has(o.value));\n if (idx >= 0) {\n this._focusedIndex = idx;\n this.updateFocusHighlight();\n return;\n }\n }\n\n // Default to first enabled option\n this._focusedIndex = this.findFirstEnabled();\n this.updateFocusHighlight();\n };\n\n private handleOptionSelect = (event: CustomEvent): void => {\n if (this._disabled) return;\n\n const value = event.detail?.value;\n if (value === undefined) return;\n\n const options = this.getAllOptions();\n const option = options.find((o) => o.value === value);\n if (!option) return;\n\n // Update focus to clicked option\n const index = options.indexOf(option);\n this._focusedIndex = index;\n this.updateFocusHighlight();\n\n this.selectOption(option);\n\n // Re-focus the listbox container\n this.focus();\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this._disabled && !this._discoverable) return;\n\n const options = this.getAllOptions();\n if (options.length === 0) return;\n\n let nextIndex: number | null = null;\n let handled = false;\n\n if (this._multiple) {\n // Multi-select keyboard\n switch (event.key) {\n case 'ArrowDown':\n if (event.shiftKey) {\n // Shift+Down: move focus AND toggle selection\n nextIndex = this.findNextEnabled(this._focusedIndex, 1);\n if (nextIndex >= 0) {\n this.toggleOptionSelection(options[nextIndex]!);\n }\n } else {\n nextIndex = this.findNextEnabled(this._focusedIndex, 1);\n }\n handled = true;\n break;\n\n case 'ArrowUp':\n if (event.shiftKey) {\n nextIndex = this.findNextEnabled(this._focusedIndex, -1);\n if (nextIndex >= 0) {\n this.toggleOptionSelection(options[nextIndex]!);\n }\n } else {\n nextIndex = this.findNextEnabled(this._focusedIndex, -1);\n }\n handled = true;\n break;\n\n case ' ':\n // Space: toggle focused option\n if (this._focusedIndex >= 0 && options[this._focusedIndex] != null) {\n this.toggleOptionSelection(options[this._focusedIndex]!);\n }\n handled = true;\n break;\n\n case 'Home':\n if (event.ctrlKey && event.shiftKey) {\n // Ctrl+Shift+Home: select range from focus to first\n this.selectRange(this.findFirstEnabled(), this._focusedIndex);\n nextIndex = this.findFirstEnabled();\n } else {\n nextIndex = this.findFirstEnabled();\n }\n handled = true;\n break;\n\n case 'End':\n if (event.ctrlKey && event.shiftKey) {\n // Ctrl+Shift+End: select range from focus to last\n this.selectRange(this._focusedIndex, this.findLastEnabled());\n nextIndex = this.findLastEnabled();\n } else {\n nextIndex = this.findLastEnabled();\n }\n handled = true;\n break;\n\n case 'a':\n if (event.ctrlKey || event.metaKey) {\n this.toggleSelectAll();\n handled = true;\n }\n break;\n\n default:\n // Type-ahead\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.metaKey\n ) {\n const match = this._typeAhead?.type(event.key);\n if (match) {\n const idx = options.findIndex(\n (o) =>\n (o.textContent?.trim() || '') === match &&\n !o.effectivelyDisabled\n );\n if (idx >= 0) {\n nextIndex = idx;\n handled = true;\n }\n }\n }\n break;\n }\n } else {\n // Single-select keyboard (selection follows focus)\n switch (event.key) {\n case 'ArrowDown':\n nextIndex = this.findNextEnabled(this._focusedIndex, 1);\n handled = true;\n break;\n\n case 'ArrowUp':\n nextIndex = this.findNextEnabled(this._focusedIndex, -1);\n handled = true;\n break;\n\n case 'Home':\n nextIndex = this.findFirstEnabled();\n handled = true;\n break;\n\n case 'End':\n nextIndex = this.findLastEnabled();\n handled = true;\n break;\n\n default:\n // Type-ahead\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.metaKey\n ) {\n const match = this._typeAhead?.type(event.key);\n if (match) {\n const idx = options.findIndex(\n (o) =>\n (o.textContent?.trim() || '') === match &&\n !o.effectivelyDisabled\n );\n if (idx >= 0) {\n nextIndex = idx;\n handled = true;\n }\n }\n }\n break;\n }\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (nextIndex !== null && nextIndex >= 0) {\n this._focusedIndex = nextIndex;\n this.updateFocusHighlight();\n\n // Single-select: selection follows focus\n const targetOption = options[nextIndex];\n if (!this._multiple && targetOption) {\n this.selectSingle(targetOption);\n } else if (targetOption) {\n // Multi-select: just announce the focused option\n const label = targetOption.textContent?.trim() || targetOption.value;\n const isSelected = this._values.has(targetOption.value);\n announcePolite(`${label}${isSelected ? ', selected' : ''}`);\n }\n }\n };\n\n // ===== Attribute Changes =====\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'value':\n if (this._multiple) {\n this._values = new Set(\n (newValue || '').split(',').filter(Boolean)\n );\n } else {\n this._value = newValue || null;\n }\n this.syncOptionStates();\n break;\n\n case 'multiple':\n this._multiple = newValue !== null;\n if (this._multiple) {\n this.setAttribute('aria-multiselectable', 'true');\n // Convert single value to multi\n if (this._value) {\n this._values = new Set([this._value]);\n this._value = null;\n }\n } else {\n this.removeAttribute('aria-multiselectable');\n // Convert multi to single (pick first)\n if (this._values.size > 0) {\n this._value = Array.from(this._values)[0] ?? null;\n this._values.clear();\n }\n }\n this.syncOptionStates();\n break;\n\n case 'disabled':\n this._disabled = newValue !== null;\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n if (!this._discoverable) {\n this.setAttribute('tabindex', '-1');\n }\n } else {\n this.removeAttribute('aria-disabled');\n this.setAttribute('tabindex', '0');\n }\n break;\n\n case 'discoverable':\n if (newValue === null) {\n this._discoverable = true;\n } else if (newValue === 'false' || newValue === '0') {\n this._discoverable = false;\n } else {\n this._discoverable = true;\n }\n break;\n\n case 'orientation':\n if (newValue === 'horizontal' || newValue === 'vertical') {\n this._orientation = newValue;\n this.setAttribute('aria-orientation', newValue);\n }\n break;\n\n case 'aria-label':\n case 'aria-labelledby':\n // Handled natively\n break;\n }\n }\n}\n\n// ============================================================================\n// Register elements\n// ============================================================================\n\ndefineElement('a11y-optgroup', A11yOptgroup);\ndefineElement('a11y-option', A11yOption);\ndefineElement('a11y-listbox', A11yListbox);\n","/**\n * compa11y Checkbox Web Components\n *\n * Accessible checkbox and checkbox group components following WAI-ARIA patterns.\n *\n * @example\n * ```html\n * <!-- Basic checkbox -->\n * <a11y-checkbox label=\"Subscribe to updates\"></a11y-checkbox>\n *\n * <!-- With helper text -->\n * <a11y-checkbox label=\"Subscribe\" hint=\"We'll email you weekly.\"></a11y-checkbox>\n *\n * <!-- Checked by default -->\n * <a11y-checkbox checked label=\"Accept terms\"></a11y-checkbox>\n *\n * <!-- Indeterminate / mixed state -->\n * <a11y-checkbox indeterminate label=\"Select all\"></a11y-checkbox>\n *\n * <!-- Disabled -->\n * <a11y-checkbox disabled label=\"Unavailable option\"></a11y-checkbox>\n *\n * <!-- Checkbox group -->\n * <a11y-checkbox-group legend=\"Select toppings\">\n * <a11y-checkbox value=\"cheese\" label=\"Cheese\"></a11y-checkbox>\n * <a11y-checkbox value=\"peppers\" label=\"Peppers\"></a11y-checkbox>\n * <a11y-checkbox value=\"olives\" label=\"Olives\"></a11y-checkbox>\n * </a11y-checkbox-group>\n * ```\n *\n * @fires change - Emitted when checkbox state changes, detail: { checked: boolean, value: string }\n *\n * @attr {boolean} checked - Whether the checkbox is checked\n * @attr {boolean} indeterminate - Whether the checkbox is in indeterminate/mixed state\n * @attr {boolean} disabled - Whether the checkbox is disabled\n * @attr {string} label - Visible label text\n * @attr {string} hint - Helper/description text\n * @attr {string} error - Error message text\n * @attr {string} value - Value for use in checkbox groups\n * @attr {string} name - Form field name\n * @attr {boolean} required - Whether the checkbox is required\n * @attr {string} size - Size variant: 'sm' | 'md' | 'lg' (default: 'md')\n *\n * @cssprop --compa11y-checkbox-size - Checkbox indicator size\n * @cssprop --compa11y-checkbox-bg - Background color when unchecked\n * @cssprop --compa11y-checkbox-border - Border style when unchecked\n * @cssprop --compa11y-checkbox-checked-bg - Background color when checked\n * @cssprop --compa11y-checkbox-checked-border - Border color when checked\n * @cssprop --compa11y-checkbox-check-color - Check mark color\n * @cssprop --compa11y-checkbox-label-color - Label text color\n * @cssprop --compa11y-checkbox-hint-color - Hint text color\n * @cssprop --compa11y-checkbox-error-color - Error text color\n * @cssprop --compa11y-focus-color - Focus outline color\n */\n\nimport { announcePolite } from '@compa11y/core';\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { CHECKBOX_STYLES, CHECKBOX_GROUP_STYLES } from '../utils/styles';\n\n// SVG for checkmark\nconst CHECK_SVG = `<svg class=\"checkbox-check\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>`;\n\n// SVG for indeterminate dash\nconst DASH_SVG = `<svg class=\"checkbox-dash\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 6H9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport class A11yCheckbox extends Compa11yElement {\n private _checked = false;\n private _indeterminate = false;\n private _input: HTMLInputElement | null = null;\n\n static get observedAttributes() {\n return [\n 'checked',\n 'indeterminate',\n 'disabled',\n 'label',\n 'hint',\n 'error',\n 'value',\n 'name',\n 'required',\n 'size',\n 'aria-label',\n 'aria-describedby',\n ];\n }\n\n /**\n * Get/set the checked state\n */\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(value: boolean) {\n const oldValue = this._checked;\n this._checked = value;\n this.toggleAttribute('checked', value);\n\n if (value !== oldValue) {\n this.updateVisualState();\n this.emit('change', { checked: value, value: this.value });\n }\n }\n\n /**\n * Get/set the indeterminate state\n */\n get indeterminate(): boolean {\n return this._indeterminate;\n }\n\n set indeterminate(value: boolean) {\n const oldValue = this._indeterminate;\n this._indeterminate = value;\n this.toggleAttribute('indeterminate', value);\n\n if (value !== oldValue) {\n this.updateVisualState();\n }\n }\n\n /**\n * Get/set the disabled state\n */\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute('disabled', value);\n this.updateDisabledState();\n }\n\n /**\n * Get/set the value\n */\n get value(): string {\n return this.getAttribute('value') || '';\n }\n\n set value(v: string) {\n if (v) {\n this.setAttribute('value', v);\n } else {\n this.removeAttribute('value');\n }\n }\n\n /**\n * Get/set the visible label\n */\n get label(): string {\n return this.getAttribute('label') || '';\n }\n\n set label(value: string) {\n if (value) {\n this.setAttribute('label', value);\n } else {\n this.removeAttribute('label');\n }\n }\n\n /**\n * Get/set the hint text\n */\n get hint(): string {\n return this.getAttribute('hint') || '';\n }\n\n set hint(value: string) {\n if (value) {\n this.setAttribute('hint', value);\n } else {\n this.removeAttribute('hint');\n }\n }\n\n /**\n * Get/set the error message\n */\n get error(): string {\n return this.getAttribute('error') || '';\n }\n\n set error(value: string) {\n if (value) {\n this.setAttribute('error', value);\n } else {\n this.removeAttribute('error');\n }\n }\n\n /**\n * Get/set the size variant\n */\n get size(): 'sm' | 'md' | 'lg' {\n const size = this.getAttribute('size');\n if (size === 'sm' || size === 'lg') return size;\n return 'md';\n }\n\n set size(value: 'sm' | 'md' | 'lg') {\n this.setAttribute('size', value);\n }\n\n /**\n * Get/set required state\n */\n get required(): boolean {\n return this.hasAttribute('required');\n }\n\n set required(value: boolean) {\n this.toggleAttribute('required', value);\n }\n\n protected setupAccessibility(): void {\n // Initialize state from attributes\n this._checked = this.hasAttribute('checked');\n this._indeterminate = this.hasAttribute('indeterminate');\n\n // Warn if no accessible label\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n if (!this.label && !this.getAttribute('aria-label')) {\n console.warn(\n '[compa11y/Checkbox] Checkbox has no accessible label. Add label=\"...\" or aria-label=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-checkbox label=\"Accept terms\"></a11y-checkbox>'\n );\n }\n }\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const inputId = `${this._id}-input`;\n const labelId = `${this._id}-label`;\n const hintId = `${this._id}-hint`;\n const errorId = `${this._id}-error`;\n const hasLabel = Boolean(this.label);\n const hasHint = Boolean(this.hint);\n const hasError = Boolean(this.error);\n const ariaLabel = this.getAttribute('aria-label');\n const name = this.getAttribute('name') || '';\n const externalDescribedBy = this.getAttribute('aria-describedby') || '';\n\n // Build aria-describedby\n const describedByParts: string[] = [];\n if (externalDescribedBy) describedByParts.push(externalDescribedBy);\n if (hasHint) describedByParts.push(hintId);\n if (hasError) describedByParts.push(errorId);\n const describedBy = describedByParts.length\n ? `aria-describedby=\"${describedByParts.join(' ')}\"`\n : '';\n\n // Build aria-label for non-visible-label case\n const ariaLabelAttr =\n !hasLabel && ariaLabel ? `aria-label=\"${ariaLabel}\"` : '';\n\n shadow.innerHTML = `\n <style>${CHECKBOX_STYLES}</style>\n <div class=\"checkbox-wrapper size-${this.size}\" part=\"wrapper\">\n <div class=\"checkbox-control\">\n <input\n type=\"checkbox\"\n class=\"checkbox-input\"\n id=\"${inputId}\"\n ${name ? `name=\"${name}\"` : ''}\n ${this.value ? `value=\"${this.value}\"` : ''}\n ${this._checked ? 'checked' : ''}\n ${this.disabled ? 'disabled' : ''}\n ${this.required ? 'required aria-required=\"true\"' : ''}\n ${describedBy}\n ${ariaLabelAttr}\n ${hasError ? 'aria-invalid=\"true\"' : ''}\n part=\"input\"\n />\n <div class=\"checkbox-indicator\" part=\"indicator\" aria-hidden=\"true\">\n ${CHECK_SVG}\n ${DASH_SVG}\n </div>\n </div>\n ${\n hasLabel || hasHint || hasError\n ? `<div class=\"checkbox-content\">\n ${hasLabel ? `<label for=\"${inputId}\" id=\"${labelId}\" class=\"checkbox-label\" part=\"label\">${this.label}${this.required ? '<span class=\"checkbox-required\" aria-hidden=\"true\">*</span>' : ''}</label>` : ''}\n ${hasHint ? `<div id=\"${hintId}\" class=\"checkbox-hint\" part=\"hint\">${this.hint}</div>` : ''}\n ${hasError ? `<div id=\"${errorId}\" class=\"checkbox-error\" role=\"alert\" part=\"error\">${this.error}</div>` : ''}\n </div>`\n : ''\n }\n </div>\n `;\n\n // Cache reference\n this._input = shadow.querySelector('input');\n\n // Set indeterminate imperatively (no HTML attribute for this)\n if (this._input && this._indeterminate) {\n this._input.indeterminate = true;\n }\n }\n\n protected setupEventListeners(): void {\n this._input?.addEventListener('change', this.handleChange);\n }\n\n protected cleanupEventListeners(): void {\n this._input?.removeEventListener('change', this.handleChange);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n newValue: string | null\n ): void {\n switch (name) {\n case 'checked':\n this._checked = newValue !== null;\n this.updateVisualState();\n break;\n case 'indeterminate':\n this._indeterminate = newValue !== null;\n this.updateVisualState();\n break;\n case 'disabled':\n this.updateDisabledState();\n break;\n case 'label':\n case 'hint':\n case 'error':\n case 'aria-label':\n case 'aria-describedby':\n case 'required':\n case 'name':\n // Re-render for structural changes\n if (this.shadowRoot) {\n this.cleanupEventListeners();\n this.shadowRoot.innerHTML = '';\n this.render();\n this.setupEventListeners();\n }\n break;\n case 'size':\n this.updateSizeClass();\n break;\n }\n }\n\n /**\n * Handle change event from native input\n */\n private handleChange = (): void => {\n if (!this._input) return;\n\n this._checked = this._input.checked;\n this.toggleAttribute('checked', this._checked);\n\n // Clear indeterminate on user interaction\n if (this._indeterminate) {\n this._indeterminate = false;\n this.removeAttribute('indeterminate');\n this._input.indeterminate = false;\n }\n\n this.updateVisualState();\n this.emit('change', { checked: this._checked, value: this.value });\n\n // Announce state change\n const labelText =\n this.label || this.getAttribute('aria-label') || 'Checkbox';\n announcePolite(`${labelText} ${this._checked ? 'checked' : 'unchecked'}`);\n };\n\n /**\n * Update visual state of indicator\n */\n private updateVisualState(): void {\n if (this._input) {\n this._input.checked = this._checked;\n this._input.indeterminate = this._indeterminate;\n }\n }\n\n /**\n * Update disabled state\n */\n private updateDisabledState(): void {\n if (this._input) {\n if (this.disabled) {\n this._input.setAttribute('disabled', '');\n } else {\n this._input.removeAttribute('disabled');\n }\n }\n }\n\n /**\n * Update size class\n */\n private updateSizeClass(): void {\n const wrapper = this.shadowRoot?.querySelector('.checkbox-wrapper');\n if (wrapper) {\n wrapper.classList.remove('size-sm', 'size-md', 'size-lg');\n wrapper.classList.add(`size-${this.size}`);\n }\n }\n\n /**\n * Toggle the checkbox programmatically\n */\n public toggle(): void {\n if (this.disabled) return;\n\n if (this._indeterminate) {\n this.indeterminate = false;\n this.checked = true;\n } else {\n this.checked = !this.checked;\n }\n\n const labelText =\n this.label || this.getAttribute('aria-label') || 'Checkbox';\n announcePolite(`${labelText} ${this.checked ? 'checked' : 'unchecked'}`);\n }\n\n /**\n * Set checked state programmatically\n */\n public setChecked(checked: boolean): void {\n this.checked = checked;\n }\n}\n\n/**\n * compa11y Checkbox Group Web Component\n *\n * Groups related checkboxes with a fieldset/legend for accessibility.\n *\n * @example\n * ```html\n * <a11y-checkbox-group legend=\"Select toppings\" error=\"Pick at least 2\">\n * <a11y-checkbox value=\"cheese\" label=\"Cheese\"></a11y-checkbox>\n * <a11y-checkbox value=\"peppers\" label=\"Peppers\"></a11y-checkbox>\n * <a11y-checkbox value=\"olives\" label=\"Olives\"></a11y-checkbox>\n * </a11y-checkbox-group>\n * ```\n *\n * @fires change - Emitted when any checkbox in the group changes, detail: { value: string[] }\n *\n * @attr {string} legend - Group label displayed as fieldset legend\n * @attr {string} error - Group-level error message\n * @attr {boolean} disabled - Disable all checkboxes in the group\n * @attr {string} orientation - Layout: 'vertical' | 'horizontal' (default: 'vertical')\n *\n * @cssprop --compa11y-checkbox-group-gap - Gap between checkboxes\n * @cssprop --compa11y-checkbox-group-legend-weight - Legend font weight\n * @cssprop --compa11y-checkbox-group-legend-color - Legend text color\n * @cssprop --compa11y-checkbox-group-error-color - Error text color\n */\nexport class A11yCheckboxGroup extends Compa11yElement {\n private _value: string[] = [];\n\n static get observedAttributes() {\n return [\n 'disabled',\n 'legend',\n 'error',\n 'orientation',\n 'aria-label',\n 'aria-labelledby',\n ];\n }\n\n /**\n * Get/set the selected values as an array\n */\n get value(): string[] {\n return [...this._value];\n }\n\n set value(val: string[]) {\n this._value = [...val];\n this.syncCheckboxStates();\n }\n\n /**\n * Get/set the disabled state\n */\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute('disabled', value);\n this.syncDisabledState();\n }\n\n /**\n * Get/set the legend text\n */\n get legend(): string {\n return this.getAttribute('legend') || '';\n }\n\n set legend(value: string) {\n if (value) {\n this.setAttribute('legend', value);\n } else {\n this.removeAttribute('legend');\n }\n }\n\n /**\n * Get/set the error message\n */\n get error(): string {\n return this.getAttribute('error') || '';\n }\n\n set error(value: string) {\n if (value) {\n this.setAttribute('error', value);\n } else {\n this.removeAttribute('error');\n }\n }\n\n /**\n * Get/set the orientation\n */\n get orientation(): 'vertical' | 'horizontal' {\n return this.getAttribute('orientation') === 'horizontal'\n ? 'horizontal'\n : 'vertical';\n }\n\n set orientation(value: 'vertical' | 'horizontal') {\n this.setAttribute('orientation', value);\n }\n\n protected setupAccessibility(): void {\n // Warn if no group label\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV !== 'production'\n ) {\n if (\n !this.legend &&\n !this.getAttribute('aria-label') &&\n !this.getAttribute('aria-labelledby')\n ) {\n console.warn(\n '[compa11y/CheckboxGroup] CheckboxGroup has no accessible label. Add legend=\"...\" or aria-label=\"...\" attribute.\\n' +\n '💡 Suggestion: <a11y-checkbox-group legend=\"Select options\"></a11y-checkbox-group>'\n );\n }\n }\n\n // Initialize value from checked children\n this.initValueFromChildren();\n }\n\n protected render(): void {\n const shadow = this.attachShadow({ mode: 'open' });\n const errorId = `${this._id}-error`;\n const hasLegend = Boolean(this.legend);\n const hasError = Boolean(this.error);\n const ariaLabel = this.getAttribute('aria-label');\n const ariaLabelledby = this.getAttribute('aria-labelledby');\n\n shadow.innerHTML = `\n <style>${CHECKBOX_GROUP_STYLES}</style>\n <fieldset\n part=\"fieldset\"\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\n ${ariaLabelledby ? `aria-labelledby=\"${ariaLabelledby}\"` : ''}\n ${hasError ? `aria-describedby=\"${errorId}\"` : ''}\n ${this.disabled ? 'disabled' : ''}\n >\n ${hasLegend ? `<legend part=\"legend\">${this.legend}</legend>` : ''}\n <div class=\"checkbox-group-items\" part=\"items\">\n <slot></slot>\n </div>\n ${hasError ? `<div id=\"${errorId}\" class=\"checkbox-group-error\" role=\"alert\" part=\"error\">${this.error}</div>` : ''}\n </fieldset>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('change', this.handleChildChange);\n }\n\n protected cleanupEventListeners(): void {\n this.removeEventListener('change', this.handleChildChange);\n }\n\n protected onAttributeChange(\n name: string,\n _oldValue: string | null,\n _newValue: string | null\n ): void {\n switch (name) {\n case 'disabled':\n this.syncDisabledState();\n break;\n case 'legend':\n case 'error':\n case 'aria-label':\n case 'aria-labelledby':\n // Re-render for structural changes\n if (this.shadowRoot) {\n this.cleanupEventListeners();\n this.shadowRoot.innerHTML = '';\n this.render();\n this.setupEventListeners();\n }\n break;\n }\n }\n\n /**\n * Handle change events from child checkboxes\n */\n private handleChildChange = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof A11yCheckbox)) return;\n\n // Don't re-emit our own events\n if (target === (this as unknown)) return;\n\n const checkboxValue = target.value;\n if (!checkboxValue) return;\n\n if (target.checked) {\n if (!this._value.includes(checkboxValue)) {\n this._value = [...this._value, checkboxValue];\n }\n } else {\n this._value = this._value.filter((v) => v !== checkboxValue);\n }\n\n this.emit('change', { value: this._value });\n };\n\n /**\n * Initialize value array from currently checked children\n */\n private initValueFromChildren(): void {\n // Use requestAnimationFrame to wait for children to be upgraded\n requestAnimationFrame(() => {\n const checkboxes = this.querySelectorAll('a11y-checkbox');\n const values: string[] = [];\n checkboxes.forEach((checkbox) => {\n if (\n checkbox.hasAttribute('checked') &&\n checkbox.getAttribute('value')\n ) {\n values.push(checkbox.getAttribute('value')!);\n }\n });\n this._value = values;\n });\n }\n\n /**\n * Sync checkbox checked states from value array\n */\n private syncCheckboxStates(): void {\n const checkboxes = this.querySelectorAll(\n 'a11y-checkbox'\n ) as NodeListOf<A11yCheckbox>;\n checkboxes.forEach((checkbox) => {\n const val = checkbox.value;\n if (val) {\n checkbox.checked = this._value.includes(val);\n }\n });\n }\n\n /**\n * Sync disabled state to children\n */\n private syncDisabledState(): void {\n const fieldset = this.shadowRoot?.querySelector('fieldset');\n if (fieldset) {\n if (this.disabled) {\n fieldset.setAttribute('disabled', '');\n } else {\n fieldset.removeAttribute('disabled');\n }\n }\n }\n}\n\n// Register custom elements\ndefineElement('a11y-checkbox', A11yCheckbox);\ndefineElement('a11y-checkbox-group', A11yCheckboxGroup);\n\nexport default A11yCheckbox;\n","/**\n * A11y RadioGroup + Radio Web Components\n *\n * Accessible radio group custom elements with full keyboard support,\n * roving tabindex, and selection-follows-focus behavior.\n * Follows WAI-ARIA Radio Group pattern.\n *\n * @example\n * ```html\n * <!-- Basic radio group with legend -->\n * <a11y-radio-group legend=\"Favorite color\" value=\"red\">\n * <a11y-radio value=\"red\" label=\"Red\"></a11y-radio>\n * <a11y-radio value=\"green\" label=\"Green\"></a11y-radio>\n * <a11y-radio value=\"blue\" label=\"Blue\"></a11y-radio>\n * </a11y-radio-group>\n *\n * <!-- With aria-label instead of legend -->\n * <a11y-radio-group aria-label=\"Favorite color\" value=\"red\">\n * <a11y-radio value=\"red\" label=\"Red\"></a11y-radio>\n * <a11y-radio value=\"green\" label=\"Green\"></a11y-radio>\n * </a11y-radio-group>\n *\n * <!-- Horizontal orientation -->\n * <a11y-radio-group legend=\"Size\" orientation=\"horizontal\">\n * <a11y-radio value=\"sm\" label=\"Small\"></a11y-radio>\n * <a11y-radio value=\"md\" label=\"Medium\"></a11y-radio>\n * <a11y-radio value=\"lg\" label=\"Large\"></a11y-radio>\n * </a11y-radio-group>\n *\n * <!-- Required with error -->\n * <a11y-radio-group legend=\"Payment method\" required error=\"Please select a payment method\">\n * <a11y-radio value=\"card\" label=\"Credit Card\"></a11y-radio>\n * <a11y-radio value=\"paypal\" label=\"PayPal\"></a11y-radio>\n * </a11y-radio-group>\n *\n * <!-- With disabled options -->\n * <a11y-radio-group legend=\"Delivery speed\" value=\"standard\">\n * <a11y-radio value=\"standard\" label=\"Standard\"></a11y-radio>\n * <a11y-radio value=\"express\" label=\"Express\" disabled></a11y-radio>\n * <a11y-radio value=\"overnight\" label=\"Overnight\"></a11y-radio>\n * </a11y-radio-group>\n * ```\n *\n * Keyboard support:\n * - Tab: Move into/out of the group (lands on checked radio, or first enabled if none checked)\n * - Arrow Down/Right: Move to next radio and select it\n * - Arrow Up/Left: Move to previous radio and select it\n * - Home: Move to first radio and select it\n * - End: Move to last radio and select it\n * - Space: Select the focused radio\n *\n * @fires change - Emitted when selected value changes, detail: { value: string }\n * @fires a11y-radiogroup-change - Namespaced change event, detail: { value: string }\n *\n * @attr {string} value - Currently selected radio value\n * @attr {boolean} disabled - Whether the entire group is disabled\n * @attr {boolean} discoverable - Whether disabled radios remain in tab order (default: true)\n * @attr {string} orientation - Layout: 'horizontal' | 'vertical' (default: 'vertical')\n * @attr {boolean} required - Whether selection is required\n * @attr {string} name - Form field name\n * @attr {string} legend - Visible group label text (renders as fieldset/legend)\n * @attr {string} hint - Helper/description text\n * @attr {string} error - Error message text\n *\n * @cssprop --compa11y-radio-group-gap - Gap between radio items\n * @cssprop --compa11y-radio-group-legend-gap - Gap below legend\n * @cssprop --compa11y-radio-group-legend-weight - Legend font weight\n * @cssprop --compa11y-radio-group-legend-color - Legend text color\n * @cssprop --compa11y-radio-group-legend-size - Legend font size\n * @cssprop --compa11y-radio-group-hint-color - Hint text color\n * @cssprop --compa11y-radio-group-error-color - Error text color\n * @cssprop --compa11y-radio-group-required-color - Required indicator color\n */\n\nimport { Compa11yElement, defineElement } from '../utils/base-element';\nimport { RADIO_GROUP_STYLES, RADIO_STYLES } from '../utils/styles';\nimport { announcePolite } from '@compa11y/core';\n\n// ============================================================================\n// A11yRadioGroup\n// ============================================================================\n\nexport class A11yRadioGroup extends Compa11yElement {\n private _value = '';\n private _disabled = false;\n private _discoverable = true;\n private _orientation: 'horizontal' | 'vertical' = 'vertical';\n private _required = false;\n private _name = '';\n\n static get observedAttributes() {\n return [\n 'value',\n 'disabled',\n 'discoverable',\n 'orientation',\n 'required',\n 'name',\n 'legend',\n 'hint',\n 'error',\n 'aria-label',\n 'aria-labelledby',\n ];\n }\n\n // ===== Getters/Setters =====\n\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n if (this._value !== v) {\n this._value = v;\n this.setAttribute('value', v);\n this.syncRadioStates();\n }\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(v: boolean) {\n const newValue = Boolean(v);\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n if (newValue) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n }\n this.syncRadioStates();\n }\n }\n\n get discoverable(): boolean {\n return this._discoverable;\n }\n\n set discoverable(v: boolean) {\n this._discoverable = Boolean(v);\n }\n\n get required(): boolean {\n return this._required;\n }\n\n set required(v: boolean) {\n this._required = Boolean(v);\n if (this._required) {\n this.setAttribute('aria-required', 'true');\n } else {\n this.removeAttribute('aria-required');\n }\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(v: string) {\n this._name = v;\n this.setAttribute('name', v);\n }\n\n get orientation(): 'horizontal' | 'vertical' {\n return this._orientation;\n }\n\n set orientation(v: 'horizontal' | 'vertical') {\n this._orientation = v;\n this.setAttribute('orientation', v);\n this.setAttribute('aria-orientation', v);\n }\n\n // ===== Lifecycle =====\n\n protected setupAccessibility(): void {\n this.setAttribute('role', 'radiogroup');\n this.setAttribute('aria-orientation', this._orientation);\n\n const hasLabel =\n this.hasAttribute('aria-label') ||\n this.hasAttribute('aria-labelledby') ||\n this.hasAttribute('legend');\n if (!hasLabel && process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Compa11y RadioGroup]: RadioGroup has no accessible label. ' +\n 'Use legend, aria-label, or aria-labelledby.'\n );\n }\n\n // Initialize from attributes\n const initialValue = this.getAttribute('value');\n if (initialValue) {\n this._value = initialValue;\n }\n\n this._disabled = this.hasAttribute('disabled');\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n }\n\n const orient = this.getAttribute('orientation');\n if (orient === 'horizontal' || orient === 'vertical') {\n this._orientation = orient;\n }\n\n this._required = this.hasAttribute('required');\n if (this._required) {\n this.setAttribute('aria-required', 'true');\n }\n\n this._name = this.getAttribute('name') || this._id;\n\n const discoverableAttr = this.getAttribute('discoverable');\n if (discoverableAttr === 'false' || discoverableAttr === '0') {\n this._discoverable = false;\n }\n\n // Set aria-invalid if error is present\n if (this.hasAttribute('error') && this.getAttribute('error')) {\n this.setAttribute('aria-invalid', 'true');\n }\n }\n\n protected render(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n\n const shadow = this.shadowRoot!;\n const legend = this.getAttribute('legend') || '';\n const hint = this.getAttribute('hint') || '';\n const error = this.getAttribute('error') || '';\n const hintId = hint ? `${this._id}-hint` : '';\n const errorId = error ? `${this._id}-error` : '';\n\n // Build aria-describedby from hint and error\n const describedBy = [hintId, errorId].filter(Boolean).join(' ');\n if (describedBy) {\n this.setAttribute('aria-describedby', describedBy);\n } else {\n this.removeAttribute('aria-describedby');\n }\n\n shadow.innerHTML = `\n <style>${RADIO_GROUP_STYLES}</style>\n <fieldset part=\"fieldset\">\n ${\n legend\n ? `<legend part=\"legend\">${legend}${\n this._required\n ? '<span class=\"radio-group-required\" aria-hidden=\"true\"> *</span>'\n : ''\n }</legend>`\n : ''\n }\n <div class=\"radio-group-items\" part=\"items\">\n <slot></slot>\n </div>\n ${hint ? `<div class=\"radio-group-hint\" id=\"${hintId}\" part=\"hint\">${hint}</div>` : ''}\n ${error ? `<div class=\"radio-group-error\" id=\"${errorId}\" part=\"error\" role=\"alert\">${error}</div>` : ''}\n </fieldset>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('keydown', this.handleKeyDown);\n this.addEventListener(\n 'radio-select',\n this.handleRadioSelect as EventListener\n );\n\n // Sync initial state when slotted children change\n const slot = this.shadowRoot?.querySelector('slot');\n if (slot) {\n slot.addEventListener('slotchange', () => {\n this.syncRadioStates();\n });\n }\n }\n\n protected cleanupEventListeners(): void {\n this.removeEventListener('keydown', this.handleKeyDown);\n this.removeEventListener(\n 'radio-select',\n this.handleRadioSelect as EventListener\n );\n }\n\n // ===== Radio Management =====\n\n private getRadios(): A11yRadio[] {\n return Array.from(this.querySelectorAll('a11y-radio')) as A11yRadio[];\n }\n\n private getEnabledRadios(): A11yRadio[] {\n return this.getRadios().filter(\n (radio) => !radio.disabled && !this._disabled\n );\n }\n\n private syncRadioStates(): void {\n const radios = this.getRadios();\n const enabledRadios = this.getEnabledRadios();\n\n radios.forEach((radio) => {\n const isChecked = radio.value === this._value;\n radio.checked = isChecked;\n\n // Roving tabindex: only checked radio (or first enabled if none checked) gets tabindex 0\n if (isChecked) {\n radio.setAttribute('tabindex', '0');\n } else if (!this._value && enabledRadios[0] === radio) {\n radio.setAttribute('tabindex', '0');\n } else {\n radio.setAttribute('tabindex', '-1');\n }\n });\n }\n\n selectRadio(value: string): void {\n if (this._disabled) return;\n\n this._value = value;\n this.setAttribute('value', value);\n this.syncRadioStates();\n\n // Clear error state on selection\n if (this.hasAttribute('aria-invalid')) {\n this.removeAttribute('aria-invalid');\n }\n\n this.emit('change', { value });\n this.emit('a11y-radiogroup-change', { value });\n }\n\n // ===== Event Handlers =====\n\n private handleRadioSelect = (event: CustomEvent): void => {\n if (this._disabled) return;\n\n const value = event.detail?.value;\n if (value !== undefined) {\n this.selectRadio(value);\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this._disabled) return;\n\n const enabledRadios = this.getEnabledRadios();\n if (enabledRadios.length === 0) return;\n\n const currentIndex = enabledRadios.findIndex(\n (r) => r.value === this._value\n );\n\n let nextIndex: number | null = null;\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n nextIndex =\n currentIndex < 0\n ? 0\n : (currentIndex + 1) % enabledRadios.length;\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n nextIndex =\n currentIndex < 0\n ? enabledRadios.length - 1\n : (currentIndex - 1 + enabledRadios.length) %\n enabledRadios.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = enabledRadios.length - 1;\n break;\n case ' ':\n // Space selects the currently focused radio\n event.preventDefault();\n event.stopPropagation();\n {\n const focusedRadio = enabledRadios.find(\n (r) => r === document.activeElement || r.contains(document.activeElement)\n );\n if (focusedRadio && focusedRadio.value !== this._value) {\n this.selectRadio(focusedRadio.value);\n const label =\n focusedRadio.getAttribute('label') || focusedRadio.value;\n announcePolite(`${label} selected`);\n }\n }\n return;\n default:\n return;\n }\n\n if (nextIndex !== null) {\n event.preventDefault();\n event.stopPropagation();\n\n const nextRadio = enabledRadios[nextIndex];\n if (nextRadio) {\n // Selection follows focus\n this.selectRadio(nextRadio.value);\n nextRadio.focus();\n\n const label = nextRadio.getAttribute('label') || nextRadio.value;\n announcePolite(`${label} selected`);\n }\n }\n };\n\n // ===== Attribute Changes =====\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'value':\n this._value = newValue || '';\n this.syncRadioStates();\n break;\n\n case 'disabled':\n this._disabled = newValue !== null;\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n this.syncRadioStates();\n break;\n\n case 'discoverable':\n if (newValue === null) {\n this._discoverable = true;\n } else if (newValue === 'false' || newValue === '0') {\n this._discoverable = false;\n } else {\n this._discoverable = true;\n }\n break;\n\n case 'orientation':\n if (newValue === 'horizontal' || newValue === 'vertical') {\n this._orientation = newValue;\n this.setAttribute('aria-orientation', newValue);\n }\n break;\n\n case 'required':\n this._required = newValue !== null;\n if (this._required) {\n this.setAttribute('aria-required', 'true');\n } else {\n this.removeAttribute('aria-required');\n }\n break;\n\n case 'name':\n this._name = newValue || '';\n break;\n\n case 'error':\n if (newValue) {\n this.setAttribute('aria-invalid', 'true');\n } else {\n this.removeAttribute('aria-invalid');\n }\n this.render();\n break;\n\n case 'legend':\n case 'hint':\n this.render();\n break;\n\n case 'aria-label':\n case 'aria-labelledby':\n // Handled natively\n break;\n }\n }\n}\n\n// ============================================================================\n// A11yRadio\n// ============================================================================\n\n/**\n * Individual radio option for use within a11y-radio-group.\n *\n * @example\n * ```html\n * <a11y-radio value=\"option1\" label=\"Option 1\"></a11y-radio>\n * <a11y-radio value=\"option2\" label=\"Option 2\" hint=\"Additional info\"></a11y-radio>\n * <a11y-radio value=\"option3\" label=\"Option 3\" disabled></a11y-radio>\n * ```\n *\n * @attr {string} value - Radio value\n * @attr {string} label - Visible label text\n * @attr {string} hint - Helper/description text\n * @attr {boolean} checked - Whether this radio is checked\n * @attr {boolean} disabled - Whether this radio is disabled\n * @attr {boolean} discoverable - Whether disabled radio remains in tab order\n *\n * @cssprop --compa11y-radio-size - Radio circle size\n * @cssprop --compa11y-radio-bg - Background when unchecked\n * @cssprop --compa11y-radio-border - Border when unchecked\n * @cssprop --compa11y-radio-checked-bg - Background when checked\n * @cssprop --compa11y-radio-checked-border - Border when checked\n * @cssprop --compa11y-radio-dot-size - Inner dot size\n * @cssprop --compa11y-radio-dot-color - Inner dot color\n * @cssprop --compa11y-radio-hover-border - Border on hover\n * @cssprop --compa11y-radio-label-color - Label text color\n * @cssprop --compa11y-radio-hint-color - Hint text color\n * @cssprop --compa11y-focus-color - Focus outline color\n */\nexport class A11yRadio extends Compa11yElement {\n private _value = '';\n private _checked = false;\n private _disabled = false;\n private _discoverable = true;\n\n static get observedAttributes() {\n return ['value', 'label', 'hint', 'disabled', 'discoverable', 'checked'];\n }\n\n // ===== Getters/Setters =====\n\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n this._value = v;\n this.setAttribute('value', v);\n }\n\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(v: boolean) {\n const newValue = Boolean(v);\n if (this._checked !== newValue) {\n this._checked = newValue;\n if (newValue) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n this.setAttribute('aria-checked', String(newValue));\n this.updateVisual();\n }\n }\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(v: boolean) {\n const newValue = Boolean(v);\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n if (newValue) {\n this.setAttribute('disabled', '');\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('disabled');\n this.removeAttribute('aria-disabled');\n }\n }\n }\n\n get discoverable(): boolean {\n return this._discoverable;\n }\n\n set discoverable(v: boolean | string) {\n let newValue: boolean;\n if (typeof v === 'string') {\n newValue = v !== 'false' && v !== '0';\n } else {\n newValue = Boolean(v);\n }\n\n if (this._discoverable !== newValue) {\n this._discoverable = newValue;\n if (newValue) {\n this.setAttribute('discoverable', '');\n } else {\n this.removeAttribute('discoverable');\n }\n }\n }\n\n // ===== Lifecycle =====\n\n protected setupAccessibility(): void {\n this.setAttribute('role', 'radio');\n this.setAttribute('aria-checked', 'false');\n\n // Initialize from attributes\n this._value = this.getAttribute('value') || '';\n this._checked = this.hasAttribute('checked');\n this._disabled = this.hasAttribute('disabled');\n\n if (this._checked) {\n this.setAttribute('aria-checked', 'true');\n }\n\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n }\n\n const discoverableAttr = this.getAttribute('discoverable');\n if (discoverableAttr === 'false' || discoverableAttr === '0') {\n this._discoverable = false;\n }\n\n // Default tabindex (parent will manage via syncRadioStates)\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '-1');\n }\n }\n\n protected render(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n\n const shadow = this.shadowRoot!;\n const label = this.getAttribute('label') || '';\n const hint = this.getAttribute('hint') || '';\n const labelId = label ? `${this._id}-label` : '';\n const hintId = hint ? `${this._id}-hint` : '';\n\n // Set aria-labelledby if label present\n if (labelId) {\n this.setAttribute('aria-labelledby', labelId);\n }\n\n // Set aria-describedby if hint present\n if (hintId) {\n this.setAttribute('aria-describedby', hintId);\n }\n\n shadow.innerHTML = `\n <style>${RADIO_STYLES}</style>\n <div class=\"radio-wrapper\" part=\"wrapper\">\n <div class=\"radio-control\" part=\"control\">\n <input\n type=\"radio\"\n class=\"radio-input\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ${this._disabled ? 'disabled' : ''}\n />\n <div class=\"radio-circle\" part=\"circle\">\n <div class=\"radio-dot\" part=\"dot\" aria-hidden=\"true\"></div>\n </div>\n </div>\n ${\n label || hint\n ? `<div class=\"radio-content\">\n ${label ? `<span class=\"radio-label\" id=\"${labelId}\" part=\"label\">${label}</span>` : ''}\n ${hint ? `<span class=\"radio-hint\" id=\"${hintId}\" part=\"hint\">${hint}</span>` : ''}\n </div>`\n : ''\n }\n <slot></slot>\n </div>\n `;\n }\n\n protected setupEventListeners(): void {\n this.addEventListener('click', this.handleClick);\n this.addEventListener('keydown', this.handleKeyDown);\n }\n\n protected cleanupEventListeners(): void {\n this.removeEventListener('click', this.handleClick);\n this.removeEventListener('keydown', this.handleKeyDown);\n }\n\n // ===== Event Handlers =====\n\n private handleClick = (event: Event): void => {\n if (this._disabled) {\n event.preventDefault();\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('radio-select', {\n detail: { value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n\n const label = this.getAttribute('label') || this._value;\n announcePolite(`${label} selected`);\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this._disabled) return;\n\n // Space is handled by the parent group for selection\n // Enter also selects for convenience\n if (event.key === 'Enter') {\n event.preventDefault();\n\n this.dispatchEvent(\n new CustomEvent('radio-select', {\n detail: { value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n\n const label = this.getAttribute('label') || this._value;\n announcePolite(`${label} selected`);\n }\n };\n\n // ===== Visual Update =====\n\n private updateVisual(): void {\n if (!this.shadowRoot) return;\n\n const dot = this.shadowRoot.querySelector('.radio-dot') as HTMLElement;\n if (dot) {\n dot.style.opacity = this._checked ? '1' : '0';\n dot.style.transform = this._checked ? 'scale(1)' : 'scale(0)';\n }\n\n const circle = this.shadowRoot.querySelector(\n '.radio-circle'\n ) as HTMLElement;\n if (circle) {\n if (this._checked) {\n circle.style.background =\n 'var(--compa11y-radio-checked-bg, #0066cc)';\n circle.style.borderColor =\n 'var(--compa11y-radio-checked-border, #0066cc)';\n } else {\n circle.style.background = 'var(--compa11y-radio-bg, white)';\n circle.style.borderColor = '';\n }\n }\n }\n\n // ===== Attribute Changes =====\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'value':\n this._value = newValue || '';\n break;\n\n case 'checked':\n this._checked = newValue !== null;\n this.setAttribute('aria-checked', String(this._checked));\n this.updateVisual();\n break;\n\n case 'disabled':\n this._disabled = newValue !== null;\n if (this._disabled) {\n this.setAttribute('aria-disabled', 'true');\n } else {\n this.removeAttribute('aria-disabled');\n }\n break;\n\n case 'discoverable':\n if (newValue === null) {\n this._discoverable = true;\n } else if (newValue === 'false' || newValue === '0') {\n this._discoverable = false;\n } else {\n this._discoverable = true;\n }\n break;\n\n case 'label':\n case 'hint':\n this.render();\n break;\n }\n }\n}\n\n// ============================================================================\n// Register elements\n// ============================================================================\n\ndefineElement('a11y-radio-group', A11yRadioGroup);\ndefineElement('a11y-radio', A11yRadio);\n","/**\n * @compa11y/web\n *\n * Accessible Web Components for any HTML page\n *\n * Usage via CDN:\n * <script src=\"https://unpkg.com/@compa11y/web\"></script>\n *\n * Or import specific components:\n * import '@compa11y/web/dialog';\n */\n\n// Components - importing auto-registers them as custom elements\nimport { A11yDialog } from './components/dialog';\nimport { A11yMenu } from './components/menu';\nimport { A11yTabs } from './components/tabs';\nimport { A11yCombobox } from './components/combobox';\nimport { A11ySwitch } from './components/switch';\nimport { A11ySelect } from './components/select';\nimport { A11yInput } from './components/input';\nimport { A11yTextarea } from './components/textarea';\nimport { A11yButton } from './components/button';\nimport { A11yListbox, A11yOption, A11yOptgroup } from './components/listbox';\nimport { A11yCheckbox, A11yCheckboxGroup } from './components/checkbox';\nimport { A11yRadioGroup, A11yRadio } from './components/radio-group';\n\n// Re-export components\nexport {\n A11yDialog,\n A11yMenu,\n A11yTabs,\n A11yCombobox,\n A11ySwitch,\n A11ySelect,\n A11yInput,\n A11yTextarea,\n A11yButton,\n A11yListbox,\n A11yOption,\n A11yOptgroup,\n A11yCheckbox,\n A11yCheckboxGroup,\n A11yRadioGroup,\n A11yRadio,\n};\n\n// Core utilities for vanilla JS usage\nimport {\n // Announcer\n initAnnouncer,\n announce,\n announcePolite,\n announceAssertive,\n announceStatus,\n announceError,\n // Focus\n initFocusVisible,\n createFocusTrap,\n createFocusScope,\n createRovingTabindex,\n // Keyboard\n createKeyboardManager,\n KeyboardPatterns,\n createTypeAhead,\n // ARIA\n aria,\n buildAriaProps,\n hasAccessibleName,\n // Platform\n isBrowser,\n prefersReducedMotion,\n prefersHighContrast,\n prefersDarkMode,\n} from '@compa11y/core';\n\n// Re-export core utilities\nexport {\n initAnnouncer,\n announce,\n announcePolite,\n announceAssertive,\n announceStatus,\n announceError,\n initFocusVisible,\n createFocusTrap,\n createFocusScope,\n createRovingTabindex,\n createKeyboardManager,\n KeyboardPatterns,\n createTypeAhead,\n aria,\n buildAriaProps,\n hasAccessibleName,\n isBrowser,\n prefersReducedMotion,\n prefersHighContrast,\n prefersDarkMode,\n};\n\n// Initialize core systems when script loads\nif (typeof window !== 'undefined') {\n const init = () => {\n initAnnouncer();\n initFocusVisible();\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n\n // Expose on window for CDN usage (IIFE bundle)\n // This allows: compa11y.announcePolite('message')\n (window as any).compa11y = {\n // Components (classes)\n A11yDialog,\n A11yMenu,\n A11yTabs,\n A11yCombobox,\n A11ySwitch,\n A11ySelect,\n A11yInput,\n A11yTextarea,\n A11yButton,\n A11yListbox,\n A11yOption,\n A11yOptgroup,\n A11yCheckbox,\n A11yCheckboxGroup,\n A11yRadioGroup,\n A11yRadio,\n // Announcer utilities\n initAnnouncer,\n announce,\n announcePolite,\n announceAssertive,\n announceStatus,\n announceError,\n // Focus utilities\n initFocusVisible,\n createFocusTrap,\n createFocusScope,\n createRovingTabindex,\n // Keyboard utilities\n createKeyboardManager,\n KeyboardPatterns,\n createTypeAhead,\n // ARIA utilities\n aria,\n buildAriaProps,\n hasAccessibleName,\n // Platform detection\n isBrowser,\n prefersReducedMotion,\n prefersHighContrast,\n prefersDarkMode,\n };\n}\n"],"names":["Compa11yElement","generateId","name","oldValue","newValue","_name","_oldValue","_newValue","detail","_a","slotName","selector","slot","defineElement","constructor","RESET_BUTTON_STYLES","FOCUS_VISIBLE_STYLES","BASE_STYLES","DIALOG_STYLES","MENU_STYLES","TABS_STYLES","COMBOBOX_STYLES","SELECT_STYLES","SWITCH_STYLES","INPUT_STYLES","TEXTAREA_STYLES","BUTTON_STYLES","LISTBOX_STYLES","OPTION_STYLES","OPTGROUP_STYLES","CHECKBOX_STYLES","CHECKBOX_GROUP_STYLES","RADIO_GROUP_STYLES","RADIO_STYLES","FOCUSABLE_SELECTOR","A11yDialog","event","focusableElements","activeElement","currentIndex","el","nextIndex","nextElement","value","shadow","titleId","descId","triggerSelector","setupTrigger","overlay","elements","firstElement","announce","A11yMenu","item","index","now","target","trigger","triggerSlot","_b","focus","prev","menu","A11yTabs","tab","panel","tabId","panelId","isHorizontal","nextKey","prevKey","newIndex","tabSlot","panelSlot","defaultSlot","_c","tablist","oldIndex","isSelected","A11yCombobox","optionElements","query","opt","count","option","val","o","inputId","listboxId","placeholder","clearable","_d","clearButton","_e","_f","i","optionId","inputRect","viewportHeight","listboxHeight","spaceBelow","spaceAbove","A11ySwitch","size","labelId","hasLabel","ariaLabel","ariaLabelAttr","ariaLabelledByAttr","wrapper","labelText","announcePolite","checked","A11ySelect","createTypeAhead","match","triggerId","ariaLabelledBy","preferLast","selectedIndex","valueEl","selectedOption","next","direction","length","startIndex","triggerRect","A11yInput","v","old","fieldId","hintId","errorId","label","hint","error","type","autocomplete","maxlength","minlength","pattern","inputmode","isDisabled","isReadOnly","isRequired","hasError","describedByParts","ariaDescribedBy","attrValue","errorDiv","announceAssertive","hintDiv","parts","existing","span","A11yTextarea","rows","A11yButton","variant","isDiscoverable","isLoading","isInteractionDisabled","useNativeDisabled","filtered","c","spinner","A11yOptgroup","labelEl","A11yOption","group","discoverableAttr","A11yListbox","options","idx","handled","targetOption","arr","str","orient","initialValue","allOptions","indices","focusedOption","enabledIndices","currentPos","nextPos","valueArray","fromIndex","toIndex","start","end","enabledOptions","labels","CHECK_SVG","DASH_SVG","A11yCheckbox","hasHint","externalDescribedBy","describedBy","A11yCheckboxGroup","checkboxValue","hasLegend","ariaLabelledby","checkboxes","values","checkbox","fieldset","A11yRadioGroup","enabledRadios","r","focusedRadio","nextRadio","legend","radio","radios","isChecked","A11yRadio","dot","circle","init","initAnnouncer","initFocusVisible","announceStatus","announceError","createFocusTrap","createFocusScope","createRovingTabindex","createKeyboardManager","KeyboardPatterns","aria","buildAriaProps","hasAccessibleName","isBrowser","prefersReducedMotion","prefersHighContrast","prefersDarkMode"],"mappings":";;AAMO,MAAeA,UAAwB,YAAY;AAAA,EAIxD,cAAc;AACZ,UAAA,GAJF,KAAU,aAAsC,MAK9C,KAAK,MAAMC,GAAW,KAAK,QAAQ,cAAc,QAAQ,SAAS,EAAE,CAAC,GAGjE,qBAAqB,SACvB,KAAK,aAAa,KAAK,gBAAA;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,qBAA+B;AACxC,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0B;AACxB,SAAK,mBAAA,GACL,KAAK,OAAA,GACL,KAAK,oBAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,uBAA6B;AAC3B,SAAK,sBAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,yBACEC,GACAC,GACAC,GACM;AACN,IAAID,MAAaC,KACf,KAAK,kBAAkBF,GAAMC,GAAUC,CAAQ;AAAA,EAEnD;AAAA;AAAA;AAAA;AAAA,EAeU,sBAA4B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAK7B,wBAA8B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAK/B,kBACRC,GACAC,GACAC,GACM;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKC,KAAQL,GAAcM,GAAqB;AACnD,WAAO,KAAK;AAAA,MACV,IAAI,YAAYN,GAAM;AAAA,QACpB,QAAAM;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MAAA,CACb;AAAA,IAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKU,QAAQN,GAAsC;;AACtD,aAAOO,IAAA,KAAK,eAAL,gBAAAA,EAAiB,cAAc,cAAcP,CAAI,UAAS;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKU,mBAAmBQ,GAA8B;;AACzD,UAAMC,IAAWD,IAAW,cAAcA,CAAQ,OAAO,oBACnDE,KAAOH,IAAA,KAAK,eAAL,gBAAAA,EAAiB;AAAA,MAC5BE;AAAA;AAEF,YAAOC,KAAA,gBAAAA,EAAM,uBAAsB,CAAA;AAAA,EACrC;AACF;AAKO,SAASC,EACdX,GACAY,GACM;AACN,EAAK,eAAe,IAAIZ,CAAI,KAC1B,eAAe,OAAOA,GAAMY,CAAW;AAE3C;AChHO,MAAMC,IAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWtBC,KAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWvBC,IAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBvBD,EAAoB;AAAA,GAMXE,KAAgB;AAAA,IACzBD,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2CFE,KAAc;AAAA,IACvBF,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwDFG,KAAc;AAAA,IACvBH,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAeTF,CAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmCZM,KAAkB;AAAA,IAC3BJ,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0DTF,CAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuFZO,KAAgB;AAAA,IACzBL,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}