@compa11y/core 0.1.2 → 0.1.3

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 (51) hide show
  1. package/dist/announcer/index.cjs +1 -49
  2. package/dist/announcer/index.js +1 -4
  3. package/dist/aria/index.cjs +1 -24
  4. package/dist/aria/index.js +1 -3
  5. package/dist/chunk-7BL2ABLF.cjs +1 -0
  6. package/dist/chunk-AQ6HEUSD.cjs +1 -0
  7. package/dist/chunk-BAFKUMWA.js +1 -0
  8. package/dist/chunk-C3VZQUKG.js +1 -0
  9. package/dist/chunk-EM45V5TK.cjs +1 -0
  10. package/dist/chunk-KQUAJKTG.cjs +1 -0
  11. package/dist/chunk-OSJIG3A2.cjs +1 -0
  12. package/dist/chunk-RE4QIUWR.js +1 -0
  13. package/dist/chunk-TGXWODB3.js +1 -0
  14. package/dist/chunk-ZAQMM5TA.js +1 -0
  15. package/dist/focus/index.cjs +1 -53
  16. package/dist/focus/index.js +1 -4
  17. package/dist/index.cjs +2 -567
  18. package/dist/index.js +2 -337
  19. package/dist/keyboard/index.cjs +1 -28
  20. package/dist/keyboard/index.js +1 -3
  21. package/package.json +1 -1
  22. package/dist/announcer/index.cjs.map +0 -1
  23. package/dist/announcer/index.js.map +0 -1
  24. package/dist/aria/index.cjs.map +0 -1
  25. package/dist/aria/index.js.map +0 -1
  26. package/dist/chunk-24U5HHMC.js +0 -309
  27. package/dist/chunk-24U5HHMC.js.map +0 -1
  28. package/dist/chunk-2CQOLVQH.js +0 -147
  29. package/dist/chunk-2CQOLVQH.js.map +0 -1
  30. package/dist/chunk-2PUYKF2E.js +0 -631
  31. package/dist/chunk-2PUYKF2E.js.map +0 -1
  32. package/dist/chunk-2WF5Y6D7.js +0 -175
  33. package/dist/chunk-2WF5Y6D7.js.map +0 -1
  34. package/dist/chunk-CQXMBRLD.cjs +0 -657
  35. package/dist/chunk-CQXMBRLD.cjs.map +0 -1
  36. package/dist/chunk-HQOFVJFO.cjs +0 -181
  37. package/dist/chunk-HQOFVJFO.cjs.map +0 -1
  38. package/dist/chunk-NBGFFCIJ.cjs +0 -314
  39. package/dist/chunk-NBGFFCIJ.cjs.map +0 -1
  40. package/dist/chunk-V6TZIZZ4.cjs +0 -158
  41. package/dist/chunk-V6TZIZZ4.cjs.map +0 -1
  42. package/dist/chunk-XEGB27QF.cjs +0 -78
  43. package/dist/chunk-XEGB27QF.cjs.map +0 -1
  44. package/dist/chunk-Z7K2G6FX.js +0 -66
  45. package/dist/chunk-Z7K2G6FX.js.map +0 -1
  46. package/dist/focus/index.cjs.map +0 -1
  47. package/dist/focus/index.js.map +0 -1
  48. package/dist/index.cjs.map +0 -1
  49. package/dist/index.js.map +0 -1
  50. package/dist/keyboard/index.cjs.map +0 -1
  51. package/dist/keyboard/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/dom.ts","../src/focus/focus-trap.ts","../src/focus/focus-visible.ts","../src/focus/focus-scope.ts"],"names":["isBrowser"],"mappings":"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","file":"chunk-CQXMBRLD.cjs","sourcesContent":["/**\n * DOM utilities for accessibility\n */\n\n/**\n * Focusable element selectors\n * Based on WHATWG focus management spec\n */\nexport const FOCUSABLE_SELECTORS = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n 'audio[controls]',\n 'video[controls]',\n 'details > summary:first-of-type',\n 'iframe',\n].join(',');\n\n/**\n * Tabbable element selectors (subset of focusable that can be tabbed to)\n */\nexport const TABBABLE_SELECTORS = [\n 'a[href]:not([tabindex=\"-1\"])',\n 'area[href]:not([tabindex=\"-1\"])',\n 'button:not([disabled]):not([tabindex=\"-1\"])',\n 'input:not([disabled]):not([type=\"hidden\"]):not([tabindex=\"-1\"])',\n 'select:not([disabled]):not([tabindex=\"-1\"])',\n 'textarea:not([disabled]):not([tabindex=\"-1\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]:not([tabindex=\"-1\"])',\n 'audio[controls]:not([tabindex=\"-1\"])',\n 'video[controls]:not([tabindex=\"-1\"])',\n 'details > summary:first-of-type:not([tabindex=\"-1\"])',\n 'iframe:not([tabindex=\"-1\"])',\n].join(',');\n\n/**\n * Check if an element is visible (not hidden by CSS)\n */\nexport function isVisible(element: Element): boolean {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n // Check hidden attribute\n if (element.hidden) {\n return false;\n }\n\n // Check inline display style first (fast path)\n if (element.style.display === 'none') {\n return false;\n }\n\n // Check visibility\n if (element.style.visibility === 'hidden') {\n return false;\n }\n\n // Check computed styles\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n // Check if element is connected to DOM\n if (!element.isConnected) {\n return false;\n }\n\n // Note: We intentionally don't check offsetWidth/offsetHeight here\n // because jsdom and some testing environments return 0 for all elements.\n // The display/visibility checks above are sufficient for accessibility purposes.\n\n return true;\n}\n\n/**\n * Check if an element is focusable\n */\nexport function isFocusable(element: Element): boolean {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n // Must be visible\n if (!isVisible(element)) {\n return false;\n }\n\n // Check if it matches focusable selectors\n if (!element.matches(FOCUSABLE_SELECTORS)) {\n return false;\n }\n\n // Check inert attribute\n if (element.closest('[inert]')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Check if an element is tabbable (can receive focus via Tab key)\n */\nexport function isTabbable(element: Element): boolean {\n if (!isFocusable(element)) {\n return false;\n }\n\n // Elements with tabindex=\"-1\" are focusable but not tabbable\n const tabIndex = (element as HTMLElement).tabIndex;\n if (tabIndex < 0) {\n return false;\n }\n\n return element.matches(TABBABLE_SELECTORS);\n}\n\n/**\n * Get all focusable elements within a container\n */\nexport function getFocusableElements(\n container: HTMLElement\n): HTMLElement[] {\n const elements = Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTORS)\n );\n\n return elements.filter(isFocusable);\n}\n\n/**\n * Get all tabbable elements within a container (sorted by tabIndex)\n */\nexport function getTabbableElements(\n container: HTMLElement\n): HTMLElement[] {\n const elements = Array.from(\n container.querySelectorAll<HTMLElement>(TABBABLE_SELECTORS)\n );\n\n const tabbable = elements.filter(isTabbable);\n\n // Sort by tabIndex (elements with tabIndex > 0 come first, then tabIndex = 0)\n return tabbable.sort((a, b) => {\n const aIndex = Math.max(0, a.tabIndex);\n const bIndex = Math.max(0, b.tabIndex);\n\n if (aIndex === 0 && bIndex === 0) {\n return 0; // Keep DOM order\n }\n if (aIndex === 0) {\n return 1; // a comes after b\n }\n if (bIndex === 0) {\n return -1; // a comes before b\n }\n return aIndex - bIndex;\n });\n}\n\n/**\n * Get the first focusable element in a container\n */\nexport function getFirstFocusable(\n container: HTMLElement\n): HTMLElement | null {\n const elements = getTabbableElements(container);\n return elements[0] ?? null;\n}\n\n/**\n * Get the last focusable element in a container\n */\nexport function getLastFocusable(\n container: HTMLElement\n): HTMLElement | null {\n const elements = getTabbableElements(container);\n return elements[elements.length - 1] ?? null;\n}\n\n/**\n * Check if an element contains the currently focused element\n */\nexport function containsFocus(container: HTMLElement): boolean {\n const activeElement = document.activeElement;\n return activeElement !== null && container.contains(activeElement);\n}\n\n/**\n * Get the next focusable element\n */\nexport function getNextFocusable(\n container: HTMLElement,\n current: HTMLElement,\n wrap = true\n): HTMLElement | null {\n const elements = getTabbableElements(container);\n const currentIndex = elements.indexOf(current);\n\n if (currentIndex === -1) {\n return elements[0] ?? null;\n }\n\n const nextIndex = currentIndex + 1;\n if (nextIndex < elements.length) {\n return elements[nextIndex]!;\n }\n\n return wrap ? (elements[0] ?? null) : null;\n}\n\n/**\n * Get the previous focusable element\n */\nexport function getPreviousFocusable(\n container: HTMLElement,\n current: HTMLElement,\n wrap = true\n): HTMLElement | null {\n const elements = getTabbableElements(container);\n const currentIndex = elements.indexOf(current);\n\n if (currentIndex === -1) {\n return elements[elements.length - 1] ?? null;\n }\n\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n return elements[prevIndex]!;\n }\n\n return wrap ? (elements[elements.length - 1] ?? null) : null;\n}\n\n/**\n * Check if element is within a specific container\n */\nexport function isWithinContainer(\n element: Element,\n container: Element\n): boolean {\n return container.contains(element);\n}\n\n/**\n * Query for an element, supporting various input types\n */\nexport function resolveElement<T extends HTMLElement = HTMLElement>(\n target: T | string | (() => T | null) | null | undefined,\n container: HTMLElement = document.body\n): T | null {\n if (!target) {\n return null;\n }\n\n if (typeof target === 'string') {\n return container.querySelector<T>(target);\n }\n\n if (typeof target === 'function') {\n return target();\n }\n\n return target;\n}\n","/**\n * Focus Trap - Constrains focus within a container\n *\n * Essential for modals, dialogs, and other overlay components\n */\n\nimport type { FocusTrapOptions } from '../types';\nimport {\n getTabbableElements,\n getFirstFocusable,\n containsFocus,\n resolveElement,\n} from '../utils/dom';\n\ninterface FocusTrap {\n activate: () => void;\n deactivate: () => void;\n /** Cleanup without calling onDeactivate - for use in effect cleanup */\n destroy: () => void;\n pause: () => void;\n unpause: () => void;\n isActive: () => boolean;\n isPaused: () => boolean;\n}\n\n// Track active focus traps in a stack (for nested traps)\nconst focusTrapStack: FocusTrap[] = [];\n\n/**\n * Create a focus trap for a container element\n */\nexport function createFocusTrap(\n container: HTMLElement,\n options: FocusTrapOptions = {}\n): FocusTrap {\n const {\n initialFocus,\n returnFocus = true,\n clickOutsideDeactivates = false,\n escapeDeactivates = true,\n onDeactivate,\n onEscapeFocus,\n } = options;\n\n let active = false;\n let paused = false;\n let previouslyFocused: HTMLElement | null = null;\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (paused || !active) return;\n\n if (event.key === 'Tab') {\n handleTabKey(event);\n } else if (event.key === 'Escape' && escapeDeactivates) {\n event.preventDefault();\n event.stopPropagation();\n deactivate();\n }\n }\n\n function handleTabKey(event: KeyboardEvent): void {\n const tabbable = getTabbableElements(container);\n\n if (tabbable.length === 0) {\n // No focusable elements, prevent tab\n event.preventDefault();\n return;\n }\n\n const first = tabbable[0]!;\n const last = tabbable[tabbable.length - 1]!;\n const activeElement = document.activeElement as HTMLElement;\n\n if (event.shiftKey) {\n // Shift+Tab: moving backwards\n if (activeElement === first || !container.contains(activeElement)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n // Tab: moving forwards\n if (activeElement === last || !container.contains(activeElement)) {\n event.preventDefault();\n first.focus();\n }\n }\n }\n\n function handleFocusIn(event: FocusEvent): void {\n if (paused || !active) return;\n\n const target = event.target as HTMLElement;\n\n // If focus moved outside the container, bring it back\n if (!container.contains(target)) {\n // Notify about the escape attempt (useful for portals)\n onEscapeFocus?.(target);\n\n // Refocus inside the container\n const first = getFirstFocusable(container);\n first?.focus();\n }\n }\n\n function handleClick(event: MouseEvent): void {\n if (paused || !active) return;\n\n const target = event.target as HTMLElement;\n\n if (clickOutsideDeactivates && !container.contains(target)) {\n deactivate();\n }\n }\n\n function activate(): void {\n if (active) return;\n\n // Store the currently focused element\n previouslyFocused = document.activeElement as HTMLElement;\n\n // Add to stack\n focusTrapStack.push(trap);\n\n // Pause other active traps\n for (let i = 0; i < focusTrapStack.length - 1; i++) {\n focusTrapStack[i]!.pause();\n }\n\n // Add event listeners\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('focusin', handleFocusIn, true);\n document.addEventListener('click', handleClick, true);\n\n active = true;\n\n // Focus the initial element\n requestAnimationFrame(() => {\n if (!active) return;\n\n const initialElement = resolveElement(initialFocus, container);\n if (initialElement) {\n initialElement.focus();\n } else {\n const first = getFirstFocusable(container);\n if (first) {\n first.focus();\n } else {\n // If no focusable elements, focus the container itself\n container.setAttribute('tabindex', '-1');\n container.focus();\n }\n }\n });\n }\n\n function cleanupTrap(callOnDeactivate: boolean): void {\n if (!active) return;\n\n // Remove event listeners\n document.removeEventListener('keydown', handleKeyDown, true);\n document.removeEventListener('focusin', handleFocusIn, true);\n document.removeEventListener('click', handleClick, true);\n\n active = false;\n paused = false;\n\n // Remove from stack\n const index = focusTrapStack.indexOf(trap);\n if (index > -1) {\n focusTrapStack.splice(index, 1);\n }\n\n // Unpause the previous trap in the stack\n const previousTrap = focusTrapStack[focusTrapStack.length - 1];\n previousTrap?.unpause();\n\n // Return focus\n if (returnFocus && previouslyFocused) {\n const target =\n typeof returnFocus === 'boolean'\n ? previouslyFocused\n : returnFocus;\n\n requestAnimationFrame(() => {\n if (target && 'focus' in target) {\n target.focus();\n }\n });\n }\n\n if (callOnDeactivate) {\n onDeactivate?.();\n }\n }\n\n function deactivate(): void {\n cleanupTrap(true);\n }\n\n function destroy(): void {\n cleanupTrap(false);\n }\n\n function pause(): void {\n if (!active || paused) return;\n paused = true;\n }\n\n function unpause(): void {\n if (!active || !paused) return;\n paused = false;\n\n // Ensure focus is within the container\n if (!containsFocus(container)) {\n const first = getFirstFocusable(container);\n first?.focus();\n }\n }\n\n const trap: FocusTrap = {\n activate,\n deactivate,\n destroy,\n pause,\n unpause,\n isActive: () => active,\n isPaused: () => paused,\n };\n\n return trap;\n}\n\n/**\n * Get the currently active focus trap\n */\nexport function getActiveFocusTrap(): FocusTrap | null {\n return focusTrapStack[focusTrapStack.length - 1] ?? null;\n}\n\n/**\n * Check if there's an active focus trap\n */\nexport function hasFocusTrap(): boolean {\n return focusTrapStack.length > 0;\n}\n","/**\n * Focus Visible Management\n *\n * Provides :focus-visible polyfill behavior and utilities\n * for distinguishing keyboard focus from mouse/touch focus\n */\n\nimport { isBrowser } from '../utils/platform';\n\ntype FocusSource = 'keyboard' | 'mouse' | 'touch' | 'unknown';\n\ninterface FocusVisibleState {\n hadKeyboardEvent: boolean;\n isPointerInput: boolean;\n lastFocusSource: FocusSource;\n}\n\nconst state: FocusVisibleState = {\n hadKeyboardEvent: true, // Assume keyboard initially (conservative)\n isPointerInput: false,\n lastFocusSource: 'unknown',\n};\n\nlet isInitialized = false;\n\n// Keys that indicate keyboard navigation\nconst NAVIGATION_KEYS = new Set([\n 'Tab',\n 'ArrowUp',\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'Enter',\n ' ',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n 'Escape',\n]);\n\n/**\n * Initialize focus-visible tracking\n * Call this once at app startup\n */\nexport function initFocusVisible(): () => void {\n if (!isBrowser() || isInitialized) {\n return () => {};\n }\n\n isInitialized = true;\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (NAVIGATION_KEYS.has(event.key)) {\n state.hadKeyboardEvent = true;\n state.isPointerInput = false;\n state.lastFocusSource = 'keyboard';\n }\n }\n\n function handlePointerDown(event: PointerEvent | MouseEvent): void {\n state.isPointerInput = true;\n state.hadKeyboardEvent = false;\n state.lastFocusSource =\n 'pointerType' in event\n ? event.pointerType === 'touch'\n ? 'touch'\n : 'mouse'\n : 'mouse';\n }\n\n function handleFocus(event: FocusEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n if (state.hadKeyboardEvent || shouldShowFocusForElement(target)) {\n target.dataset.a11ykitFocusVisible = 'true';\n }\n }\n\n function handleBlur(event: FocusEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n delete target.dataset.a11ykitFocusVisible;\n }\n\n function handleVisibilityChange(): void {\n if (document.visibilityState === 'hidden') {\n // When tab becomes hidden, assume next focus could be keyboard\n state.hadKeyboardEvent = true;\n }\n }\n\n // Add event listeners\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('focus', handleFocus, true);\n document.addEventListener('blur', handleBlur, true);\n document.addEventListener('visibilitychange', handleVisibilityChange, true);\n\n // Cleanup function\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n document.removeEventListener('mousedown', handlePointerDown, true);\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('focus', handleFocus, true);\n document.removeEventListener('blur', handleBlur, true);\n document.removeEventListener(\n 'visibilitychange',\n handleVisibilityChange,\n true\n );\n isInitialized = false;\n };\n}\n\n/**\n * Check if focus should always be visible for this element type\n * Some elements (like text inputs) should always show focus ring\n */\nfunction shouldShowFocusForElement(element: HTMLElement): boolean {\n const tagName = element.tagName.toLowerCase();\n const type = element.getAttribute('type')?.toLowerCase();\n\n // Text inputs should always show focus\n if (\n tagName === 'input' &&\n (!type ||\n type === 'text' ||\n type === 'email' ||\n type === 'password' ||\n type === 'search' ||\n type === 'tel' ||\n type === 'url' ||\n type === 'number')\n ) {\n return true;\n }\n\n if (tagName === 'textarea') {\n return true;\n }\n\n if (element.isContentEditable) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if current focus should be visible (keyboard-initiated)\n */\nexport function isFocusVisible(): boolean {\n return state.hadKeyboardEvent;\n}\n\n/**\n * Check if an element has visible focus\n */\nexport function hasVisibleFocus(element: HTMLElement): boolean {\n return element.dataset.a11ykitFocusVisible === 'true';\n}\n\n/**\n * Get the source of the last focus event\n */\nexport function getLastFocusSource(): FocusSource {\n return state.lastFocusSource;\n}\n\n/**\n * Manually set focus as visible (useful for programmatic focus)\n */\nexport function setFocusVisible(element: HTMLElement, visible: boolean): void {\n if (visible) {\n element.dataset.a11ykitFocusVisible = 'true';\n } else {\n delete element.dataset.a11ykitFocusVisible;\n }\n}\n\n/**\n * Focus an element with visible focus ring (keyboard-style)\n */\nexport function focusWithVisibleRing(\n element: HTMLElement,\n options?: FocusOptions\n): void {\n state.hadKeyboardEvent = true;\n state.lastFocusSource = 'keyboard';\n element.focus(options);\n}\n","/**\n * Focus Scope Management\n *\n * Manages focus within a scope, supporting roving tabindex\n * and programmatic focus control\n */\n\nimport {\n getTabbableElements,\n getNextFocusable,\n getPreviousFocusable,\n} from '../utils/dom';\n\nexport interface FocusScopeOptions {\n /** Whether to contain focus within the scope */\n contain?: boolean;\n /** Whether to restore focus when scope is destroyed */\n restoreFocus?: boolean;\n /** Whether to auto-focus the first element */\n autoFocus?: boolean;\n}\n\nexport interface FocusScope {\n /** Focus the first focusable element */\n focusFirst: () => void;\n /** Focus the last focusable element */\n focusLast: () => void;\n /** Focus the next focusable element */\n focusNext: (options?: { wrap?: boolean }) => void;\n /** Focus the previous focusable element */\n focusPrevious: (options?: { wrap?: boolean }) => void;\n /** Focus a specific element by index */\n focusAt: (index: number) => void;\n /** Get the currently focused element within scope */\n getFocused: () => HTMLElement | null;\n /** Get all focusable elements in the scope */\n getElements: () => HTMLElement[];\n /** Destroy the scope and cleanup */\n destroy: () => void;\n}\n\n/**\n * Create a focus scope for a container\n */\nexport function createFocusScope(\n container: HTMLElement,\n options: FocusScopeOptions = {}\n): FocusScope {\n const { contain = false, restoreFocus = false, autoFocus = false } = options;\n\n let previouslyFocused: HTMLElement | null = null;\n let isDestroyed = false;\n\n // Store previously focused element\n if (restoreFocus) {\n previouslyFocused = document.activeElement as HTMLElement;\n }\n\n function getElements(): HTMLElement[] {\n if (isDestroyed) return [];\n return getTabbableElements(container);\n }\n\n function getFocused(): HTMLElement | null {\n const active = document.activeElement;\n if (active && container.contains(active)) {\n return active as HTMLElement;\n }\n return null;\n }\n\n function focusFirst(): void {\n if (isDestroyed) return;\n const elements = getElements();\n elements[0]?.focus();\n }\n\n function focusLast(): void {\n if (isDestroyed) return;\n const elements = getElements();\n elements[elements.length - 1]?.focus();\n }\n\n function focusNext({ wrap = true } = {}): void {\n if (isDestroyed) return;\n const current = getFocused();\n if (!current) {\n focusFirst();\n return;\n }\n const next = getNextFocusable(container, current, wrap);\n next?.focus();\n }\n\n function focusPrevious({ wrap = true } = {}): void {\n if (isDestroyed) return;\n const current = getFocused();\n if (!current) {\n focusLast();\n return;\n }\n const prev = getPreviousFocusable(container, current, wrap);\n prev?.focus();\n }\n\n function focusAt(index: number): void {\n if (isDestroyed) return;\n const elements = getElements();\n const element = elements[index];\n element?.focus();\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (isDestroyed || !contain) return;\n\n if (event.key === 'Tab') {\n const elements = getElements();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = elements[0]!;\n const last = elements[elements.length - 1]!;\n const current = getFocused();\n\n if (event.shiftKey && current === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && current === last) {\n event.preventDefault();\n first.focus();\n }\n }\n }\n\n function destroy(): void {\n if (isDestroyed) return;\n isDestroyed = true;\n\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (restoreFocus && previouslyFocused) {\n previouslyFocused.focus();\n }\n }\n\n // Setup\n if (contain) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n if (autoFocus) {\n requestAnimationFrame(() => {\n if (!isDestroyed) focusFirst();\n });\n }\n\n return {\n focusFirst,\n focusLast,\n focusNext,\n focusPrevious,\n focusAt,\n getFocused,\n getElements,\n destroy,\n };\n}\n\n/**\n * Roving Tabindex - Only one element is tabbable at a time\n * Standard pattern for composite widgets like toolbars, menus, listboxes\n */\nexport interface RovingTabindexOptions {\n /** Current active index */\n initialIndex?: number;\n /** Orientation for arrow key navigation */\n orientation?: 'horizontal' | 'vertical' | 'both';\n /** Whether to wrap around */\n wrap?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (index: number, element: HTMLElement) => void;\n}\n\nexport interface RovingTabindex {\n /** Move to the next item */\n next: () => void;\n /** Move to the previous item */\n previous: () => void;\n /** Move to the first item */\n first: () => void;\n /** Move to the last item */\n last: () => void;\n /** Move to a specific index */\n goto: (index: number) => void;\n /** Get current index */\n getIndex: () => number;\n /** Update elements (call when DOM changes) */\n update: () => void;\n /** Cleanup */\n destroy: () => void;\n}\n\nexport function createRovingTabindex(\n container: HTMLElement,\n selector: string,\n options: RovingTabindexOptions = {}\n): RovingTabindex {\n const {\n initialIndex = 0,\n orientation = 'both',\n wrap = true,\n onSelectionChange,\n } = options;\n\n let elements: HTMLElement[] = [];\n let currentIndex = initialIndex;\n\n function update(): void {\n elements = Array.from(container.querySelectorAll<HTMLElement>(selector));\n\n // Update tabindex attributes\n elements.forEach((el, index) => {\n el.setAttribute('tabindex', index === currentIndex ? '0' : '-1');\n });\n }\n\n function moveTo(index: number): void {\n if (elements.length === 0) return;\n\n let newIndex = index;\n if (newIndex < 0) {\n newIndex = wrap ? elements.length - 1 : 0;\n } else if (newIndex >= elements.length) {\n newIndex = wrap ? 0 : elements.length - 1;\n }\n\n const previousElement = elements[currentIndex];\n const nextElement = elements[newIndex];\n\n if (previousElement) {\n previousElement.setAttribute('tabindex', '-1');\n }\n\n if (nextElement) {\n nextElement.setAttribute('tabindex', '0');\n nextElement.focus();\n onSelectionChange?.(newIndex, nextElement);\n }\n\n currentIndex = newIndex;\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (!elements.includes(target)) return;\n\n let handled = false;\n\n switch (event.key) {\n case 'ArrowRight':\n if (orientation === 'horizontal' || orientation === 'both') {\n moveTo(currentIndex + 1);\n handled = true;\n }\n break;\n case 'ArrowLeft':\n if (orientation === 'horizontal' || orientation === 'both') {\n moveTo(currentIndex - 1);\n handled = true;\n }\n break;\n case 'ArrowDown':\n if (orientation === 'vertical' || orientation === 'both') {\n moveTo(currentIndex + 1);\n handled = true;\n }\n break;\n case 'ArrowUp':\n if (orientation === 'vertical' || orientation === 'both') {\n moveTo(currentIndex - 1);\n handled = true;\n }\n break;\n case 'Home':\n moveTo(0);\n handled = true;\n break;\n case 'End':\n moveTo(elements.length - 1);\n handled = true;\n break;\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n function handleFocus(event: FocusEvent): void {\n const target = event.target as HTMLElement;\n const index = elements.indexOf(target);\n if (index !== -1 && index !== currentIndex) {\n // Update current index when element is focused directly\n const previousElement = elements[currentIndex];\n if (previousElement) {\n previousElement.setAttribute('tabindex', '-1');\n }\n target.setAttribute('tabindex', '0');\n currentIndex = index;\n }\n }\n\n // Initialize\n update();\n container.addEventListener('keydown', handleKeyDown);\n container.addEventListener('focusin', handleFocus);\n\n return {\n next: () => moveTo(currentIndex + 1),\n previous: () => moveTo(currentIndex - 1),\n first: () => moveTo(0),\n last: () => moveTo(elements.length - 1),\n goto: moveTo,\n getIndex: () => currentIndex,\n update,\n destroy: () => {\n container.removeEventListener('keydown', handleKeyDown);\n container.removeEventListener('focusin', handleFocus);\n },\n };\n}\n"]}
@@ -1,181 +0,0 @@
1
- 'use strict';
2
-
3
- // src/keyboard/keyboard-manager.ts
4
- function normalizeKey(event) {
5
- const key = event.key;
6
- switch (key) {
7
- case " ":
8
- return "Space";
9
- case "Esc":
10
- return "Escape";
11
- case "Left":
12
- return "ArrowLeft";
13
- case "Right":
14
- return "ArrowRight";
15
- case "Up":
16
- return "ArrowUp";
17
- case "Down":
18
- return "ArrowDown";
19
- default:
20
- return key;
21
- }
22
- }
23
- function getKeyCombo(event) {
24
- const parts = [];
25
- if (event.ctrlKey) parts.push("Ctrl");
26
- if (event.altKey) parts.push("Alt");
27
- if (event.shiftKey) parts.push("Shift");
28
- if (event.metaKey) parts.push("Meta");
29
- const key = normalizeKey(event);
30
- if (!["Control", "Alt", "Shift", "Meta"].includes(key)) {
31
- parts.push(key);
32
- }
33
- return parts.join("+");
34
- }
35
- function createKeyboardManager(handlers = {}, options = {}) {
36
- const {
37
- preventDefault = true,
38
- stopPropagation = true,
39
- targetSelector
40
- } = options;
41
- const keyHandlers = new Map(
42
- Object.entries(handlers)
43
- );
44
- let attachedElement = null;
45
- function handleKeyDown(event) {
46
- if (targetSelector) {
47
- const target = event.target;
48
- if (!target.matches(targetSelector)) {
49
- return;
50
- }
51
- }
52
- const combo = getKeyCombo(event);
53
- let handler = keyHandlers.get(combo);
54
- if (!handler) {
55
- const key = normalizeKey(event);
56
- handler = keyHandlers.get(key);
57
- }
58
- if (handler) {
59
- const result = handler(event);
60
- if (result !== false) {
61
- if (preventDefault) {
62
- event.preventDefault();
63
- }
64
- if (stopPropagation) {
65
- event.stopPropagation();
66
- }
67
- }
68
- }
69
- }
70
- function attach(element) {
71
- if (attachedElement) {
72
- detach();
73
- }
74
- attachedElement = element;
75
- element.addEventListener("keydown", handleKeyDown);
76
- }
77
- function detach() {
78
- if (attachedElement) {
79
- attachedElement.removeEventListener("keydown", handleKeyDown);
80
- attachedElement = null;
81
- }
82
- }
83
- function on(key, handler) {
84
- keyHandlers.set(key, handler);
85
- }
86
- function off(key) {
87
- keyHandlers.delete(key);
88
- }
89
- function destroy() {
90
- detach();
91
- keyHandlers.clear();
92
- }
93
- return {
94
- attach,
95
- detach,
96
- on,
97
- off,
98
- destroy
99
- };
100
- }
101
- var KeyboardPatterns = {
102
- /**
103
- * Menu/Listbox navigation
104
- */
105
- menu: (options) => ({
106
- ArrowUp: () => options.onUp?.(),
107
- ArrowDown: () => options.onDown?.(),
108
- Enter: () => options.onEnter?.(),
109
- Space: () => options.onEnter?.(),
110
- Escape: () => options.onEscape?.(),
111
- Home: () => options.onHome?.(),
112
- End: () => options.onEnd?.()
113
- }),
114
- /**
115
- * Tab navigation (horizontal)
116
- */
117
- tabs: (options) => ({
118
- ArrowLeft: () => options.onLeft?.(),
119
- ArrowRight: () => options.onRight?.(),
120
- Home: () => options.onHome?.(),
121
- End: () => options.onEnd?.()
122
- }),
123
- /**
124
- * Dialog navigation
125
- */
126
- dialog: (options) => ({
127
- Escape: () => options.onEscape?.()
128
- }),
129
- /**
130
- * Grid navigation (2D)
131
- */
132
- grid: (options) => ({
133
- ArrowUp: () => options.onUp?.(),
134
- ArrowDown: () => options.onDown?.(),
135
- ArrowLeft: () => options.onLeft?.(),
136
- ArrowRight: () => options.onRight?.(),
137
- Home: () => options.onHome?.(),
138
- End: () => options.onEnd?.(),
139
- "Ctrl+Home": () => options.onCtrlHome?.(),
140
- "Ctrl+End": () => options.onCtrlEnd?.()
141
- })
142
- };
143
- function createTypeAhead(items, options = {}) {
144
- const { timeout = 500 } = options;
145
- let search = "";
146
- let timeoutId = null;
147
- function reset() {
148
- search = "";
149
- if (timeoutId) {
150
- clearTimeout(timeoutId);
151
- timeoutId = null;
152
- }
153
- }
154
- function type(char) {
155
- if (char.length !== 1 || char === " ") {
156
- return null;
157
- }
158
- if (timeoutId) {
159
- clearTimeout(timeoutId);
160
- }
161
- search += char.toLowerCase();
162
- timeoutId = setTimeout(reset, timeout);
163
- const match = items.find(
164
- (item) => item.toLowerCase().startsWith(search)
165
- );
166
- return match ?? null;
167
- }
168
- return {
169
- type,
170
- reset,
171
- getSearch: () => search
172
- };
173
- }
174
-
175
- exports.KeyboardPatterns = KeyboardPatterns;
176
- exports.createKeyboardManager = createKeyboardManager;
177
- exports.createTypeAhead = createTypeAhead;
178
- exports.getKeyCombo = getKeyCombo;
179
- exports.normalizeKey = normalizeKey;
180
- //# sourceMappingURL=chunk-HQOFVJFO.cjs.map
181
- //# sourceMappingURL=chunk-HQOFVJFO.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/keyboard/keyboard-manager.ts"],"names":[],"mappings":"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","file":"chunk-HQOFVJFO.cjs","sourcesContent":["/**\n * Keyboard Navigation Manager\n *\n * Provides keyboard navigation patterns for common accessibility scenarios\n */\n\nexport type KeyboardHandler = (event: KeyboardEvent) => void | boolean;\n\nexport interface KeyboardHandlers {\n [key: string]: KeyboardHandler;\n}\n\nexport interface KeyboardManagerOptions {\n /** Prevent default for handled keys */\n preventDefault?: boolean;\n /** Stop propagation for handled keys */\n stopPropagation?: boolean;\n /** Only handle when target matches selector */\n targetSelector?: string;\n}\n\nexport interface KeyboardManager {\n /** Attach to an element */\n attach: (element: HTMLElement) => void;\n /** Detach from current element */\n detach: () => void;\n /** Add a key handler */\n on: (key: string, handler: KeyboardHandler) => void;\n /** Remove a key handler */\n off: (key: string) => void;\n /** Destroy the manager */\n destroy: () => void;\n}\n\n/**\n * Normalize key names for cross-browser compatibility\n */\nexport function normalizeKey(event: KeyboardEvent): string {\n const key = event.key;\n\n // Handle special cases\n switch (key) {\n case ' ':\n return 'Space';\n case 'Esc':\n return 'Escape';\n case 'Left':\n return 'ArrowLeft';\n case 'Right':\n return 'ArrowRight';\n case 'Up':\n return 'ArrowUp';\n case 'Down':\n return 'ArrowDown';\n default:\n return key;\n }\n}\n\n/**\n * Build a key combo string from an event\n */\nexport function getKeyCombo(event: KeyboardEvent): string {\n const parts: string[] = [];\n\n if (event.ctrlKey) parts.push('Ctrl');\n if (event.altKey) parts.push('Alt');\n if (event.shiftKey) parts.push('Shift');\n if (event.metaKey) parts.push('Meta');\n\n const key = normalizeKey(event);\n\n // Don't add modifier keys as the main key\n if (!['Control', 'Alt', 'Shift', 'Meta'].includes(key)) {\n parts.push(key);\n }\n\n return parts.join('+');\n}\n\n/**\n * Create a keyboard manager for handling key events\n */\nexport function createKeyboardManager(\n handlers: KeyboardHandlers = {},\n options: KeyboardManagerOptions = {}\n): KeyboardManager {\n const {\n preventDefault = true,\n stopPropagation = true,\n targetSelector,\n } = options;\n\n const keyHandlers: Map<string, KeyboardHandler> = new Map(\n Object.entries(handlers)\n );\n\n let attachedElement: HTMLElement | null = null;\n\n function handleKeyDown(event: KeyboardEvent): void {\n // Check target selector\n if (targetSelector) {\n const target = event.target as HTMLElement;\n if (!target.matches(targetSelector)) {\n return;\n }\n }\n\n // Try key combo first (e.g., \"Ctrl+A\")\n const combo = getKeyCombo(event);\n let handler = keyHandlers.get(combo);\n\n // Fall back to simple key\n if (!handler) {\n const key = normalizeKey(event);\n handler = keyHandlers.get(key);\n }\n\n if (handler) {\n const result = handler(event);\n\n // If handler returns false explicitly, don't prevent/stop\n if (result !== false) {\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n }\n }\n }\n\n function attach(element: HTMLElement): void {\n if (attachedElement) {\n detach();\n }\n attachedElement = element;\n element.addEventListener('keydown', handleKeyDown);\n }\n\n function detach(): void {\n if (attachedElement) {\n attachedElement.removeEventListener('keydown', handleKeyDown);\n attachedElement = null;\n }\n }\n\n function on(key: string, handler: KeyboardHandler): void {\n keyHandlers.set(key, handler);\n }\n\n function off(key: string): void {\n keyHandlers.delete(key);\n }\n\n function destroy(): void {\n detach();\n keyHandlers.clear();\n }\n\n return {\n attach,\n detach,\n on,\n off,\n destroy,\n };\n}\n\n/**\n * Common keyboard navigation patterns\n */\nexport const KeyboardPatterns = {\n /**\n * Menu/Listbox navigation\n */\n menu: (options: {\n onUp?: () => void;\n onDown?: () => void;\n onEnter?: () => void;\n onEscape?: () => void;\n onHome?: () => void;\n onEnd?: () => void;\n onTypeAhead?: (char: string) => void;\n }): KeyboardHandlers => ({\n ArrowUp: () => options.onUp?.(),\n ArrowDown: () => options.onDown?.(),\n Enter: () => options.onEnter?.(),\n Space: () => options.onEnter?.(),\n Escape: () => options.onEscape?.(),\n Home: () => options.onHome?.(),\n End: () => options.onEnd?.(),\n }),\n\n /**\n * Tab navigation (horizontal)\n */\n tabs: (options: {\n onLeft?: () => void;\n onRight?: () => void;\n onHome?: () => void;\n onEnd?: () => void;\n }): KeyboardHandlers => ({\n ArrowLeft: () => options.onLeft?.(),\n ArrowRight: () => options.onRight?.(),\n Home: () => options.onHome?.(),\n End: () => options.onEnd?.(),\n }),\n\n /**\n * Dialog navigation\n */\n dialog: (options: {\n onEscape?: () => void;\n }): KeyboardHandlers => ({\n Escape: () => options.onEscape?.(),\n }),\n\n /**\n * Grid navigation (2D)\n */\n grid: (options: {\n onUp?: () => void;\n onDown?: () => void;\n onLeft?: () => void;\n onRight?: () => void;\n onHome?: () => void;\n onEnd?: () => void;\n onCtrlHome?: () => void;\n onCtrlEnd?: () => void;\n }): KeyboardHandlers => ({\n ArrowUp: () => options.onUp?.(),\n ArrowDown: () => options.onDown?.(),\n ArrowLeft: () => options.onLeft?.(),\n ArrowRight: () => options.onRight?.(),\n Home: () => options.onHome?.(),\n End: () => options.onEnd?.(),\n 'Ctrl+Home': () => options.onCtrlHome?.(),\n 'Ctrl+End': () => options.onCtrlEnd?.(),\n }),\n};\n\n/**\n * Type-ahead search for menus and listboxes\n */\nexport interface TypeAhead {\n /** Handle a character input */\n type: (char: string) => string | null;\n /** Reset the search */\n reset: () => void;\n /** Get current search string */\n getSearch: () => string;\n}\n\nexport function createTypeAhead(\n items: string[],\n options: { timeout?: number } = {}\n): TypeAhead {\n const { timeout = 500 } = options;\n\n let search = '';\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n function reset(): void {\n search = '';\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n\n function type(char: string): string | null {\n // Only accept single printable characters\n if (char.length !== 1 || char === ' ') {\n return null;\n }\n\n // Clear existing timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n // Add character to search\n search += char.toLowerCase();\n\n // Set new timeout\n timeoutId = setTimeout(reset, timeout);\n\n // Find matching item\n const match = items.find((item) =>\n item.toLowerCase().startsWith(search)\n );\n\n return match ?? null;\n }\n\n return {\n type,\n reset,\n getSearch: () => search,\n };\n}\n"]}
@@ -1,314 +0,0 @@
1
- 'use strict';
2
-
3
- // src/aria/aria-utils.ts
4
- var aria = {
5
- /**
6
- * Set aria-hidden on an element
7
- */
8
- hide(element) {
9
- element.setAttribute("aria-hidden", "true");
10
- },
11
- /**
12
- * Remove aria-hidden from an element
13
- */
14
- show(element) {
15
- element.removeAttribute("aria-hidden");
16
- },
17
- /**
18
- * Set aria-expanded state
19
- */
20
- setExpanded(element, expanded) {
21
- element.setAttribute("aria-expanded", String(expanded));
22
- },
23
- /**
24
- * Set aria-selected state
25
- */
26
- setSelected(element, selected) {
27
- element.setAttribute("aria-selected", String(selected));
28
- },
29
- /**
30
- * Set aria-checked state
31
- */
32
- setChecked(element, checked) {
33
- element.setAttribute("aria-checked", String(checked));
34
- },
35
- /**
36
- * Set aria-pressed state
37
- */
38
- setPressed(element, pressed) {
39
- element.setAttribute("aria-pressed", String(pressed));
40
- },
41
- /**
42
- * Set aria-disabled state
43
- */
44
- setDisabled(element, disabled) {
45
- element.setAttribute("aria-disabled", String(disabled));
46
- },
47
- /**
48
- * Set aria-busy state
49
- */
50
- setBusy(element, busy) {
51
- element.setAttribute("aria-busy", String(busy));
52
- },
53
- /**
54
- * Set aria-current
55
- */
56
- setCurrent(element, value) {
57
- if (value === "false") {
58
- element.removeAttribute("aria-current");
59
- } else {
60
- element.setAttribute("aria-current", value);
61
- }
62
- },
63
- /**
64
- * Set aria-invalid state
65
- */
66
- setInvalid(element, invalid) {
67
- if (invalid === false) {
68
- element.removeAttribute("aria-invalid");
69
- } else {
70
- element.setAttribute("aria-invalid", String(invalid));
71
- }
72
- },
73
- /**
74
- * Set aria-label
75
- */
76
- setLabel(element, label) {
77
- if (label) {
78
- element.setAttribute("aria-label", label);
79
- } else {
80
- element.removeAttribute("aria-label");
81
- }
82
- },
83
- /**
84
- * Set aria-labelledby
85
- */
86
- setLabelledBy(element, ...ids) {
87
- const value = ids.filter(Boolean).join(" ");
88
- if (value) {
89
- element.setAttribute("aria-labelledby", value);
90
- } else {
91
- element.removeAttribute("aria-labelledby");
92
- }
93
- },
94
- /**
95
- * Set aria-describedby
96
- */
97
- setDescribedBy(element, ...ids) {
98
- const value = ids.filter(Boolean).join(" ");
99
- if (value) {
100
- element.setAttribute("aria-describedby", value);
101
- } else {
102
- element.removeAttribute("aria-describedby");
103
- }
104
- },
105
- /**
106
- * Set aria-controls
107
- */
108
- setControls(element, ...ids) {
109
- const value = ids.filter(Boolean).join(" ");
110
- if (value) {
111
- element.setAttribute("aria-controls", value);
112
- } else {
113
- element.removeAttribute("aria-controls");
114
- }
115
- },
116
- /**
117
- * Set aria-owns
118
- */
119
- setOwns(element, ...ids) {
120
- const value = ids.filter(Boolean).join(" ");
121
- if (value) {
122
- element.setAttribute("aria-owns", value);
123
- } else {
124
- element.removeAttribute("aria-owns");
125
- }
126
- },
127
- /**
128
- * Set aria-activedescendant
129
- */
130
- setActiveDescendant(element, id) {
131
- if (id) {
132
- element.setAttribute("aria-activedescendant", id);
133
- } else {
134
- element.removeAttribute("aria-activedescendant");
135
- }
136
- },
137
- /**
138
- * Set aria-haspopup
139
- */
140
- setHasPopup(element, popup) {
141
- if (popup === false) {
142
- element.removeAttribute("aria-haspopup");
143
- } else {
144
- element.setAttribute("aria-haspopup", String(popup));
145
- }
146
- },
147
- /**
148
- * Set aria-level
149
- */
150
- setLevel(element, level) {
151
- element.setAttribute("aria-level", String(level));
152
- },
153
- /**
154
- * Set aria-posinset and aria-setsize
155
- */
156
- setPosition(element, position, setSize) {
157
- element.setAttribute("aria-posinset", String(position));
158
- element.setAttribute("aria-setsize", String(setSize));
159
- },
160
- /**
161
- * Set aria-valuemin, aria-valuemax, aria-valuenow
162
- */
163
- setValue(element, options) {
164
- if (options.min !== void 0) {
165
- element.setAttribute("aria-valuemin", String(options.min));
166
- }
167
- if (options.max !== void 0) {
168
- element.setAttribute("aria-valuemax", String(options.max));
169
- }
170
- if (options.now !== void 0) {
171
- element.setAttribute("aria-valuenow", String(options.now));
172
- }
173
- if (options.text !== void 0) {
174
- element.setAttribute("aria-valuetext", options.text);
175
- }
176
- },
177
- /**
178
- * Set role attribute
179
- */
180
- setRole(element, role) {
181
- if (role) {
182
- element.setAttribute("role", role);
183
- } else {
184
- element.removeAttribute("role");
185
- }
186
- },
187
- /**
188
- * Set aria-modal
189
- */
190
- setModal(element, modal) {
191
- if (modal) {
192
- element.setAttribute("aria-modal", "true");
193
- } else {
194
- element.removeAttribute("aria-modal");
195
- }
196
- },
197
- /**
198
- * Set aria-orientation
199
- */
200
- setOrientation(element, orientation) {
201
- element.setAttribute("aria-orientation", orientation);
202
- },
203
- /**
204
- * Set aria-required
205
- */
206
- setRequired(element, required) {
207
- element.setAttribute("aria-required", String(required));
208
- },
209
- /**
210
- * Set aria-readonly
211
- */
212
- setReadOnly(element, readOnly) {
213
- element.setAttribute("aria-readonly", String(readOnly));
214
- },
215
- /**
216
- * Set aria-autocomplete
217
- */
218
- setAutocomplete(element, value) {
219
- element.setAttribute("aria-autocomplete", value);
220
- },
221
- /**
222
- * Set aria-multiselectable
223
- */
224
- setMultiSelectable(element, multiselectable) {
225
- element.setAttribute("aria-multiselectable", String(multiselectable));
226
- },
227
- /**
228
- * Set aria-sort
229
- */
230
- setSort(element, sort) {
231
- element.setAttribute("aria-sort", sort);
232
- }
233
- };
234
- function buildAriaProps(props) {
235
- const result = {};
236
- if (props.label) result["aria-label"] = props.label;
237
- if (props.labelledBy) {
238
- result["aria-labelledby"] = Array.isArray(props.labelledBy) ? props.labelledBy.join(" ") : props.labelledBy;
239
- }
240
- if (props.describedBy) {
241
- result["aria-describedby"] = Array.isArray(props.describedBy) ? props.describedBy.join(" ") : props.describedBy;
242
- }
243
- if (props.controls) {
244
- result["aria-controls"] = Array.isArray(props.controls) ? props.controls.join(" ") : props.controls;
245
- }
246
- if (props.owns) {
247
- result["aria-owns"] = Array.isArray(props.owns) ? props.owns.join(" ") : props.owns;
248
- }
249
- if (props.expanded !== void 0) result["aria-expanded"] = String(props.expanded);
250
- if (props.selected !== void 0) result["aria-selected"] = String(props.selected);
251
- if (props.checked !== void 0) result["aria-checked"] = String(props.checked);
252
- if (props.pressed !== void 0) result["aria-pressed"] = String(props.pressed);
253
- if (props.disabled !== void 0) result["aria-disabled"] = String(props.disabled);
254
- if (props.hidden !== void 0) result["aria-hidden"] = String(props.hidden);
255
- if (props.modal !== void 0) result["aria-modal"] = String(props.modal);
256
- if (props.busy !== void 0) result["aria-busy"] = String(props.busy);
257
- if (props.current) result["aria-current"] = props.current;
258
- if (props.invalid !== void 0) result["aria-invalid"] = String(props.invalid);
259
- if (props.hasPopup !== void 0) result["aria-haspopup"] = String(props.hasPopup);
260
- if (props.activeDescendant) result["aria-activedescendant"] = props.activeDescendant;
261
- if (props.level !== void 0) result["aria-level"] = String(props.level);
262
- if (props.posInSet !== void 0) result["aria-posinset"] = String(props.posInSet);
263
- if (props.setSize !== void 0) result["aria-setsize"] = String(props.setSize);
264
- if (props.valueMin !== void 0) result["aria-valuemin"] = String(props.valueMin);
265
- if (props.valueMax !== void 0) result["aria-valuemax"] = String(props.valueMax);
266
- if (props.valueNow !== void 0) result["aria-valuenow"] = String(props.valueNow);
267
- if (props.valueText) result["aria-valuetext"] = props.valueText;
268
- if (props.orientation) result["aria-orientation"] = props.orientation;
269
- if (props.required !== void 0) result["aria-required"] = String(props.required);
270
- if (props.readOnly !== void 0) result["aria-readonly"] = String(props.readOnly);
271
- if (props.autocomplete) result["aria-autocomplete"] = props.autocomplete;
272
- if (props.multiSelectable !== void 0) result["aria-multiselectable"] = String(props.multiSelectable);
273
- if (props.sort) result["aria-sort"] = props.sort;
274
- if (props.role) result.role = props.role;
275
- return result;
276
- }
277
- function mergeAriaIds(...ids) {
278
- const filtered = ids.filter(Boolean);
279
- return filtered.length > 0 ? filtered.join(" ") : void 0;
280
- }
281
- function hasAccessibleName(element) {
282
- if (element.getAttribute("aria-label")) {
283
- return true;
284
- }
285
- const labelledBy = element.getAttribute("aria-labelledby");
286
- if (labelledBy) {
287
- const ids = labelledBy.split(" ");
288
- const hasLabelContent = ids.some((id) => {
289
- const labelElement = document.getElementById(id);
290
- return labelElement && labelElement.textContent?.trim();
291
- });
292
- if (hasLabelContent) return true;
293
- }
294
- if (element.textContent?.trim()) {
295
- return true;
296
- }
297
- if (element.getAttribute("title")) {
298
- return true;
299
- }
300
- if ("labels" in element && element.labels?.length) {
301
- return true;
302
- }
303
- if (element.tagName === "IMG" && element.getAttribute("alt")) {
304
- return true;
305
- }
306
- return false;
307
- }
308
-
309
- exports.aria = aria;
310
- exports.buildAriaProps = buildAriaProps;
311
- exports.hasAccessibleName = hasAccessibleName;
312
- exports.mergeAriaIds = mergeAriaIds;
313
- //# sourceMappingURL=chunk-NBGFFCIJ.cjs.map
314
- //# sourceMappingURL=chunk-NBGFFCIJ.cjs.map