@compa11y/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compa11y.umd.cjs","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/index.ts"],"sourcesContent":["/**\n * Base class for compa11y Web Components\n */\n\nimport { generateId } from '@compa11y/core';\n\nexport abstract class A11yKitElement 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 * 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 * 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 { A11yKitElement, 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 A11yKitElement {\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 { A11yKitElement, defineElement } from '../utils/base-element';\nimport { MENU_STYLES } from '../utils/styles';\n\nexport class A11yMenu extends A11yKitElement {\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 { A11yKitElement, defineElement } from '../utils/base-element';\nimport { TABS_STYLES } from '../utils/styles';\n\nexport class A11yTabs extends A11yKitElement {\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 { A11yKitElement, 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 A11yKitElement {\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 { A11yKitElement, defineElement } from '../utils/base-element';\nimport { SWITCH_STYLES } from '../utils/styles';\n\nexport class A11ySwitch extends A11yKitElement {\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/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';\n\n// Re-export components\nexport { A11yDialog, A11yMenu, A11yTabs, A11yCombobox, A11ySwitch };\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 // 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":["A11yKitElement","generateId","name","oldValue","newValue","_name","_oldValue","_newValue","detail","_a","slotName","selector","slot","defineElement","constructor","RESET_BUTTON_STYLES","BASE_STYLES","DIALOG_STYLES","MENU_STYLES","TABS_STYLES","COMBOBOX_STYLES","SWITCH_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","init","initAnnouncer","initFocusVisible","announceAssertive","announceStatus","announceError","createFocusTrap","createFocusScope","createRovingTabindex","createKeyboardManager","KeyboardPatterns","createTypeAhead","aria","buildAriaProps","hasAccessibleName","isBrowser","prefersReducedMotion","prefersHighContrast","prefersDarkMode"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { A11yKitElement } from '../utils/base-element';
2
+
3
+ export declare class A11yCombobox extends A11yKitElement {
4
+ private _open;
5
+ private _highlightedIndex;
6
+ private _options;
7
+ private _filteredOptions;
8
+ private _inputValue;
9
+ private _selectedValue;
10
+ private _inputElement;
11
+ private _listboxElement;
12
+ static get observedAttributes(): string[];
13
+ get open(): boolean;
14
+ set open(value: boolean);
15
+ get value(): string | null;
16
+ set value(val: string | null);
17
+ protected setupAccessibility(): void;
18
+ protected render(): void;
19
+ protected setupEventListeners(): void;
20
+ protected cleanupEventListeners(): void;
21
+ protected onAttributeChange(name: string, _oldValue: string | null, newValue: string | null): void;
22
+ private updateOptions;
23
+ private renderOptions;
24
+ private handleInput;
25
+ private handleFocus;
26
+ private handleBlur;
27
+ private handleKeyDown;
28
+ private handleOptionClick;
29
+ private handleOptionHover;
30
+ private handleClear;
31
+ private handleOutsideClick;
32
+ private selectOption;
33
+ private updateHighlight;
34
+ private updateListboxVisibility;
35
+ private updateListboxPosition;
36
+ private updateClearButton;
37
+ /**
38
+ * Programmatic open
39
+ */
40
+ show(): void;
41
+ /**
42
+ * Programmatic close
43
+ */
44
+ close(): void;
45
+ /**
46
+ * Clear the selection
47
+ */
48
+ clear(): void;
49
+ }
50
+ export default A11yCombobox;
51
+ //# sourceMappingURL=combobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAUtE,qBAAa,YAAa,SAAQ,cAAc;IAC9C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CAA4B;IAEnD,MAAM,KAAK,kBAAkB,aAE5B;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAStB;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAU3B;IAED,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAIpC,SAAS,CAAC,MAAM,IAAI,IAAI;IA0DxB,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAsBrC,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAIvC,SAAS,CAAC,iBAAiB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAmBP,OAAO,CAAC,aAAa,CAUnB;IAEF,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,WAAW,CAuBjB;IAEF,OAAO,CAAC,WAAW,CAEjB;IAEF,OAAO,CAAC,UAAU,CAOhB;IAEF,OAAO,CAAC,aAAa,CAmEnB;IAEF,OAAO,CAAC,iBAAiB,CAOvB;IAEF,OAAO,CAAC,iBAAiB,CAQvB;IAEF,OAAO,CAAC,WAAW,CAYjB;IAEF,OAAO,CAAC,kBAAkB,CAOxB;IAEF,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAID,eAAe,YAAY,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { A11yKitElement } from '../utils/base-element';
2
+
3
+ export declare class A11yDialog extends A11yKitElement {
4
+ private _open;
5
+ private _previouslyFocused;
6
+ private _triggerElement;
7
+ static get observedAttributes(): string[];
8
+ get open(): boolean;
9
+ set open(value: boolean);
10
+ protected setupAccessibility(): void;
11
+ protected render(): void;
12
+ protected setupEventListeners(): void;
13
+ protected cleanupEventListeners(): void;
14
+ protected onAttributeChange(name: string, _oldValue: string | null, newValue: string | null): void;
15
+ /**
16
+ * Get all focusable elements in the dialog (light DOM first, then shadow DOM)
17
+ * Per WAI-ARIA best practices: focus should go to dialog content first,
18
+ * close button should be last in tab order
19
+ */
20
+ private getFocusableElements;
21
+ private handleTriggerClick;
22
+ private handleClose;
23
+ private handleKeyDown;
24
+ private showDialog;
25
+ private hideDialog;
26
+ /**
27
+ * Programmatic open
28
+ */
29
+ show(): void;
30
+ /**
31
+ * Programmatic close
32
+ */
33
+ close(): void;
34
+ }
35
+ export default A11yDialog;
36
+ //# sourceMappingURL=dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/components/dialog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAMtE,qBAAa,UAAW,SAAQ,cAAc;IAC5C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,eAAe,CAA4B;IAEnD,MAAM,KAAK,kBAAkB,aAE5B;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAatB;IAED,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAIpC,SAAS,CAAC,MAAM,IAAI,IAAI;IAsCxB,SAAS,CAAC,mBAAmB,IAAI,IAAI;IA6CrC,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAKvC,SAAS,CAAC,iBAAiB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAMP;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,kBAAkB,CAExB;IAEF,OAAO,CAAC,WAAW,CAEjB;IAEF,OAAO,CAAC,aAAa,CAmDnB;IAEF,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAID,eAAe,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=dialog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.test.d.ts","sourceRoot":"","sources":["../../src/components/dialog.test.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { A11yKitElement } from '../utils/base-element';
2
+
3
+ export declare class A11yMenu extends A11yKitElement {
4
+ private _open;
5
+ private _highlightedIndex;
6
+ private _menuItems;
7
+ static get observedAttributes(): string[];
8
+ get open(): boolean;
9
+ set open(value: boolean);
10
+ protected setupAccessibility(): void;
11
+ protected render(): void;
12
+ protected setupEventListeners(): void;
13
+ protected cleanupEventListeners(): void;
14
+ protected onAttributeChange(name: string, _oldValue: string | null, newValue: string | null): void;
15
+ private updateMenuItems;
16
+ private _lastClickTime;
17
+ private handleTriggerClick;
18
+ private handleTriggerKeyDown;
19
+ private handleMenuKeyDown;
20
+ private handleItemClick;
21
+ private handleMouseOver;
22
+ private handleOutsideClick;
23
+ private highlightItem;
24
+ private selectItem;
25
+ private updateMenuVisibility;
26
+ /**
27
+ * Show the menu
28
+ */
29
+ show(): void;
30
+ /**
31
+ * Hide the menu
32
+ */
33
+ close(): void;
34
+ /**
35
+ * Toggle the menu
36
+ */
37
+ toggle(): void;
38
+ }
39
+ export default A11yMenu;
40
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/components/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAGtE,qBAAa,QAAS,SAAQ,cAAc;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,UAAU,CAAqB;IAEvC,MAAM,KAAK,kBAAkB,aAE5B;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAStB;IAED,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAcpC,SAAS,CAAC,MAAM,IAAI,IAAI;IAmBxB,SAAS,CAAC,mBAAmB,IAAI,IAAI;IA8BrC,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAIvC,SAAS,CAAC,iBAAiB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAMP,OAAO,CAAC,eAAe,CAUrB;IAEF,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,kBAAkB,CAOxB;IAEF,OAAO,CAAC,oBAAoB,CAyB1B;IAEF,OAAO,CAAC,iBAAiB,CA8CvB;IAEF,OAAO,CAAC,eAAe,CAQrB;IAEF,OAAO,CAAC,eAAe,CAQrB;IAEF,OAAO,CAAC,kBAAkB,CAOxB;IAEF,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,IAAI;CAGf;AAID,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=menu.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.test.d.ts","sourceRoot":"","sources":["../../src/components/menu.test.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { A11yKitElement } from '../utils/base-element';
2
+
3
+ export declare class A11ySwitch extends A11yKitElement {
4
+ private _checked;
5
+ private _button;
6
+ private _label;
7
+ static get observedAttributes(): string[];
8
+ /**
9
+ * Get/set the checked state
10
+ */
11
+ get checked(): boolean;
12
+ set checked(value: boolean);
13
+ /**
14
+ * Get/set the disabled state
15
+ */
16
+ get disabled(): boolean;
17
+ set disabled(value: boolean);
18
+ /**
19
+ * Get/set the visible label
20
+ */
21
+ get label(): string;
22
+ set label(value: string);
23
+ /**
24
+ * Get/set the size variant
25
+ */
26
+ get size(): 'sm' | 'md' | 'lg';
27
+ set size(value: 'sm' | 'md' | 'lg');
28
+ protected setupAccessibility(): void;
29
+ protected render(): void;
30
+ protected setupEventListeners(): void;
31
+ protected cleanupEventListeners(): void;
32
+ protected onAttributeChange(name: string, _oldValue: string | null, newValue: string | null): void;
33
+ /**
34
+ * Handle click on the switch button
35
+ */
36
+ private handleClick;
37
+ /**
38
+ * Handle keyboard events
39
+ * Space and Enter should toggle the switch
40
+ */
41
+ private handleKeyDown;
42
+ /**
43
+ * Handle click on the label
44
+ */
45
+ private handleLabelClick;
46
+ /**
47
+ * Update the visual state (checked class and aria-checked)
48
+ */
49
+ private updateVisualState;
50
+ /**
51
+ * Update the disabled state
52
+ */
53
+ private updateDisabledState;
54
+ /**
55
+ * Update the size class
56
+ */
57
+ private updateSizeClass;
58
+ /**
59
+ * Public method to toggle the switch programmatically
60
+ */
61
+ toggle(): void;
62
+ /**
63
+ * Public method to open/close programmatically
64
+ */
65
+ setChecked(checked: boolean): void;
66
+ }
67
+ export default A11ySwitch;
68
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/components/switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAGtE,qBAAa,UAAW,SAAQ,cAAc;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAiC;IAE/C,MAAM,KAAK,kBAAkB,aAE5B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EASzB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAG1B;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAMtB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAI7B;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAEjC;IAED,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAoBpC,SAAS,CAAC,MAAM,IAAI,IAAI;IA2CxB,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAMrC,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAMvC,SAAS,CAAC,iBAAiB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAwBP;;OAEG;IACH,OAAO,CAAC,WAAW,CAEjB;IAEF;;;OAGG;IACH,OAAO,CAAC,aAAa,CAQnB;IAEF;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAKtB;IAEF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACI,MAAM,IAAI,IAAI;IAUrB;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAG1C;AAKD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { A11yKitElement } from '../utils/base-element';
2
+
3
+ export declare class A11yTabs extends A11yKitElement {
4
+ private _tabs;
5
+ private _panels;
6
+ private _selectedIndex;
7
+ static get observedAttributes(): string[];
8
+ get selectedIndex(): number;
9
+ set selectedIndex(value: number);
10
+ get orientation(): 'horizontal' | 'vertical';
11
+ get activationMode(): 'automatic' | 'manual';
12
+ protected setupAccessibility(): void;
13
+ protected render(): void;
14
+ protected setupEventListeners(): void;
15
+ protected onAttributeChange(name: string, _oldValue: string | null, newValue: string | null): void;
16
+ private updateTabsAndPanels;
17
+ private handleClick;
18
+ private handleKeyDown;
19
+ private selectTab;
20
+ private updateSelection;
21
+ /**
22
+ * Select a tab by index
23
+ */
24
+ select(index: number): void;
25
+ /**
26
+ * Select next tab
27
+ */
28
+ next(): void;
29
+ /**
30
+ * Select previous tab
31
+ */
32
+ previous(): void;
33
+ }
34
+ export default A11yTabs;
35
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAGtE,qBAAa,QAAS,SAAQ,cAAc;IAC1C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,cAAc,CAAK;IAE3B,MAAM,KAAK,kBAAkB,aAE5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,EAK9B;IAED,IAAI,WAAW,IAAI,YAAY,GAAG,UAAU,CAK3C;IAED,IAAI,cAAc,IAAI,WAAW,GAAG,QAAQ,CAK3C;IAED,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAIpC,SAAS,CAAC,MAAM,IAAI,IAAI;IAexB,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAcrC,SAAS,CAAC,iBAAiB,CACzB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAUP,OAAO,CAAC,mBAAmB,CAuCzB;IAEF,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,aAAa,CAuCnB;IAEF,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,QAAQ,IAAI,IAAI;CAKjB;AAID,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=tabs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.test.d.ts","sourceRoot":"","sources":["../../src/components/tabs.test.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { A11yDialog } from './components/dialog';
2
+ import { A11yMenu } from './components/menu';
3
+ import { A11yTabs } from './components/tabs';
4
+ import { A11yCombobox } from './components/combobox';
5
+ import { A11ySwitch } from './components/switch';
6
+ import { initAnnouncer, announce, announcePolite, announceAssertive, announceStatus, announceError, initFocusVisible, createFocusTrap, createFocusScope, createRovingTabindex, createKeyboardManager, KeyboardPatterns, createTypeAhead, aria, buildAriaProps, hasAccessibleName, isBrowser, prefersReducedMotion, prefersHighContrast, prefersDarkMode } from '@compa11y/core';
7
+
8
+ export { A11yDialog, A11yMenu, A11yTabs, A11yCombobox, A11ySwitch };
9
+ export { initAnnouncer, announce, announcePolite, announceAssertive, announceStatus, announceError, initFocusVisible, createFocusTrap, createFocusScope, createRovingTabindex, createKeyboardManager, KeyboardPatterns, createTypeAhead, aria, buildAriaProps, hasAccessibleName, isBrowser, prefersReducedMotion, prefersHighContrast, prefersDarkMode, };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAGpE,OAAO,EAEL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EAEb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EAEpB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAEf,IAAI,EACJ,cAAc,EACd,iBAAiB,EAEjB,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Base class for compa11y Web Components
3
+ */
4
+ export declare abstract class A11yKitElement extends HTMLElement {
5
+ protected _internals: ElementInternals | null;
6
+ protected _id: string;
7
+ constructor();
8
+ /**
9
+ * Standard observed attributes
10
+ */
11
+ static get observedAttributes(): string[];
12
+ /**
13
+ * Called when element is added to DOM
14
+ */
15
+ connectedCallback(): void;
16
+ /**
17
+ * Called when element is removed from DOM
18
+ */
19
+ disconnectedCallback(): void;
20
+ /**
21
+ * Called when observed attributes change
22
+ */
23
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
24
+ /**
25
+ * Set up ARIA attributes and roles
26
+ */
27
+ protected abstract setupAccessibility(): void;
28
+ /**
29
+ * Render the component
30
+ */
31
+ protected abstract render(): void;
32
+ /**
33
+ * Set up event listeners
34
+ */
35
+ protected setupEventListeners(): void;
36
+ /**
37
+ * Clean up event listeners
38
+ */
39
+ protected cleanupEventListeners(): void;
40
+ /**
41
+ * Handle attribute changes
42
+ */
43
+ protected onAttributeChange(_name: string, _oldValue: string | null, _newValue: string | null): void;
44
+ /**
45
+ * Emit a custom event
46
+ */
47
+ protected emit<T>(name: string, detail?: T): boolean;
48
+ /**
49
+ * Query a slot
50
+ */
51
+ protected getSlot(name: string): HTMLSlotElement | null;
52
+ /**
53
+ * Get slotted elements
54
+ */
55
+ protected getSlottedElements(slotName?: string): Element[];
56
+ }
57
+ /**
58
+ * Helper to define a custom element safely
59
+ */
60
+ export declare function defineElement(name: string, constructor: CustomElementConstructor): void;
61
+ //# sourceMappingURL=base-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-element.d.ts","sourceRoot":"","sources":["../../src/utils/base-element.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,8BAAsB,cAAe,SAAQ,WAAW;IACtD,SAAS,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACrD,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;;IAYtB;;OAEG;IACH,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;OAEG;IACH,wBAAwB,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI;IAMP;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,IAAI;IAE7C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;IAEjC;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAErC;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAEvC;;OAEG;IACH,SAAS,CAAC,iBAAiB,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,IAAI;IAEP;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO;IAWpD;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAIvD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;CAO3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,wBAAwB,GACpC,IAAI,CAIN"}