@compa11y/core 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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/announcer/index.cjs +49 -0
  4. package/dist/announcer/index.cjs.map +1 -0
  5. package/dist/announcer/index.d.cts +61 -0
  6. package/dist/announcer/index.d.ts +61 -0
  7. package/dist/announcer/index.js +4 -0
  8. package/dist/announcer/index.js.map +1 -0
  9. package/dist/aria/index.cjs +24 -0
  10. package/dist/aria/index.cjs.map +1 -0
  11. package/dist/aria/index.d.cts +176 -0
  12. package/dist/aria/index.d.ts +176 -0
  13. package/dist/aria/index.js +3 -0
  14. package/dist/aria/index.js.map +1 -0
  15. package/dist/chunk-24U5HHMC.js +309 -0
  16. package/dist/chunk-24U5HHMC.js.map +1 -0
  17. package/dist/chunk-2CQOLVQH.js +147 -0
  18. package/dist/chunk-2CQOLVQH.js.map +1 -0
  19. package/dist/chunk-2PUYKF2E.js +631 -0
  20. package/dist/chunk-2PUYKF2E.js.map +1 -0
  21. package/dist/chunk-2WF5Y6D7.js +175 -0
  22. package/dist/chunk-2WF5Y6D7.js.map +1 -0
  23. package/dist/chunk-CQXMBRLD.cjs +657 -0
  24. package/dist/chunk-CQXMBRLD.cjs.map +1 -0
  25. package/dist/chunk-HQOFVJFO.cjs +181 -0
  26. package/dist/chunk-HQOFVJFO.cjs.map +1 -0
  27. package/dist/chunk-NBGFFCIJ.cjs +314 -0
  28. package/dist/chunk-NBGFFCIJ.cjs.map +1 -0
  29. package/dist/chunk-V6TZIZZ4.cjs +158 -0
  30. package/dist/chunk-V6TZIZZ4.cjs.map +1 -0
  31. package/dist/chunk-XEGB27QF.cjs +78 -0
  32. package/dist/chunk-XEGB27QF.cjs.map +1 -0
  33. package/dist/chunk-Z7K2G6FX.js +66 -0
  34. package/dist/chunk-Z7K2G6FX.js.map +1 -0
  35. package/dist/focus/index.cjs +53 -0
  36. package/dist/focus/index.cjs.map +1 -0
  37. package/dist/focus/index.d.cts +139 -0
  38. package/dist/focus/index.d.ts +139 -0
  39. package/dist/focus/index.js +4 -0
  40. package/dist/focus/index.js.map +1 -0
  41. package/dist/index.cjs +573 -0
  42. package/dist/index.cjs.map +1 -0
  43. package/dist/index.d.cts +241 -0
  44. package/dist/index.d.ts +241 -0
  45. package/dist/index.js +343 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/keyboard/index.cjs +28 -0
  48. package/dist/keyboard/index.cjs.map +1 -0
  49. package/dist/keyboard/index.d.cts +102 -0
  50. package/dist/keyboard/index.d.ts +102 -0
  51. package/dist/keyboard/index.js +3 -0
  52. package/dist/keyboard/index.js.map +1 -0
  53. package/dist/types-DDSPmE8m.d.cts +52 -0
  54. package/dist/types-DDSPmE8m.d.ts +52 -0
  55. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/aria/aria-utils.ts"],"names":[],"mappings":"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","file":"chunk-NBGFFCIJ.cjs","sourcesContent":["/**\n * ARIA Utilities\n *\n * Helpers for managing ARIA attributes and relationships\n */\n\nimport type { AriaRole } from '../types';\n\n/**\n * ARIA attribute helpers\n */\nexport const aria = {\n /**\n * Set aria-hidden on an element\n */\n hide(element: HTMLElement): void {\n element.setAttribute('aria-hidden', 'true');\n },\n\n /**\n * Remove aria-hidden from an element\n */\n show(element: HTMLElement): void {\n element.removeAttribute('aria-hidden');\n },\n\n /**\n * Set aria-expanded state\n */\n setExpanded(element: HTMLElement, expanded: boolean): void {\n element.setAttribute('aria-expanded', String(expanded));\n },\n\n /**\n * Set aria-selected state\n */\n setSelected(element: HTMLElement, selected: boolean): void {\n element.setAttribute('aria-selected', String(selected));\n },\n\n /**\n * Set aria-checked state\n */\n setChecked(element: HTMLElement, checked: boolean | 'mixed'): void {\n element.setAttribute('aria-checked', String(checked));\n },\n\n /**\n * Set aria-pressed state\n */\n setPressed(element: HTMLElement, pressed: boolean | 'mixed'): void {\n element.setAttribute('aria-pressed', String(pressed));\n },\n\n /**\n * Set aria-disabled state\n */\n setDisabled(element: HTMLElement, disabled: boolean): void {\n element.setAttribute('aria-disabled', String(disabled));\n },\n\n /**\n * Set aria-busy state\n */\n setBusy(element: HTMLElement, busy: boolean): void {\n element.setAttribute('aria-busy', String(busy));\n },\n\n /**\n * Set aria-current\n */\n setCurrent(\n element: HTMLElement,\n value: 'page' | 'step' | 'location' | 'date' | 'time' | 'true' | 'false'\n ): void {\n if (value === 'false') {\n element.removeAttribute('aria-current');\n } else {\n element.setAttribute('aria-current', value);\n }\n },\n\n /**\n * Set aria-invalid state\n */\n setInvalid(element: HTMLElement, invalid: boolean | 'grammar' | 'spelling'): void {\n if (invalid === false) {\n element.removeAttribute('aria-invalid');\n } else {\n element.setAttribute('aria-invalid', String(invalid));\n }\n },\n\n /**\n * Set aria-label\n */\n setLabel(element: HTMLElement, label: string): void {\n if (label) {\n element.setAttribute('aria-label', label);\n } else {\n element.removeAttribute('aria-label');\n }\n },\n\n /**\n * Set aria-labelledby\n */\n setLabelledBy(element: HTMLElement, ...ids: string[]): void {\n const value = ids.filter(Boolean).join(' ');\n if (value) {\n element.setAttribute('aria-labelledby', value);\n } else {\n element.removeAttribute('aria-labelledby');\n }\n },\n\n /**\n * Set aria-describedby\n */\n setDescribedBy(element: HTMLElement, ...ids: string[]): void {\n const value = ids.filter(Boolean).join(' ');\n if (value) {\n element.setAttribute('aria-describedby', value);\n } else {\n element.removeAttribute('aria-describedby');\n }\n },\n\n /**\n * Set aria-controls\n */\n setControls(element: HTMLElement, ...ids: string[]): void {\n const value = ids.filter(Boolean).join(' ');\n if (value) {\n element.setAttribute('aria-controls', value);\n } else {\n element.removeAttribute('aria-controls');\n }\n },\n\n /**\n * Set aria-owns\n */\n setOwns(element: HTMLElement, ...ids: string[]): void {\n const value = ids.filter(Boolean).join(' ');\n if (value) {\n element.setAttribute('aria-owns', value);\n } else {\n element.removeAttribute('aria-owns');\n }\n },\n\n /**\n * Set aria-activedescendant\n */\n setActiveDescendant(element: HTMLElement, id: string | null): void {\n if (id) {\n element.setAttribute('aria-activedescendant', id);\n } else {\n element.removeAttribute('aria-activedescendant');\n }\n },\n\n /**\n * Set aria-haspopup\n */\n setHasPopup(\n element: HTMLElement,\n popup: 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog' | boolean\n ): void {\n if (popup === false) {\n element.removeAttribute('aria-haspopup');\n } else {\n element.setAttribute('aria-haspopup', String(popup));\n }\n },\n\n /**\n * Set aria-level\n */\n setLevel(element: HTMLElement, level: number): void {\n element.setAttribute('aria-level', String(level));\n },\n\n /**\n * Set aria-posinset and aria-setsize\n */\n setPosition(element: HTMLElement, position: number, setSize: number): void {\n element.setAttribute('aria-posinset', String(position));\n element.setAttribute('aria-setsize', String(setSize));\n },\n\n /**\n * Set aria-valuemin, aria-valuemax, aria-valuenow\n */\n setValue(\n element: HTMLElement,\n options: {\n min?: number;\n max?: number;\n now?: number;\n text?: string;\n }\n ): void {\n if (options.min !== undefined) {\n element.setAttribute('aria-valuemin', String(options.min));\n }\n if (options.max !== undefined) {\n element.setAttribute('aria-valuemax', String(options.max));\n }\n if (options.now !== undefined) {\n element.setAttribute('aria-valuenow', String(options.now));\n }\n if (options.text !== undefined) {\n element.setAttribute('aria-valuetext', options.text);\n }\n },\n\n /**\n * Set role attribute\n */\n setRole(element: HTMLElement, role: AriaRole | null): void {\n if (role) {\n element.setAttribute('role', role);\n } else {\n element.removeAttribute('role');\n }\n },\n\n /**\n * Set aria-modal\n */\n setModal(element: HTMLElement, modal: boolean): void {\n if (modal) {\n element.setAttribute('aria-modal', 'true');\n } else {\n element.removeAttribute('aria-modal');\n }\n },\n\n /**\n * Set aria-orientation\n */\n setOrientation(element: HTMLElement, orientation: 'horizontal' | 'vertical'): void {\n element.setAttribute('aria-orientation', orientation);\n },\n\n /**\n * Set aria-required\n */\n setRequired(element: HTMLElement, required: boolean): void {\n element.setAttribute('aria-required', String(required));\n },\n\n /**\n * Set aria-readonly\n */\n setReadOnly(element: HTMLElement, readOnly: boolean): void {\n element.setAttribute('aria-readonly', String(readOnly));\n },\n\n /**\n * Set aria-autocomplete\n */\n setAutocomplete(element: HTMLElement, value: 'none' | 'inline' | 'list' | 'both'): void {\n element.setAttribute('aria-autocomplete', value);\n },\n\n /**\n * Set aria-multiselectable\n */\n setMultiSelectable(element: HTMLElement, multiselectable: boolean): void {\n element.setAttribute('aria-multiselectable', String(multiselectable));\n },\n\n /**\n * Set aria-sort\n */\n setSort(element: HTMLElement, sort: 'none' | 'ascending' | 'descending' | 'other'): void {\n element.setAttribute('aria-sort', sort);\n },\n};\n\n/**\n * Build ARIA props object for React/JS usage\n */\nexport function buildAriaProps(props: {\n label?: string;\n labelledBy?: string | string[];\n describedBy?: string | string[];\n controls?: string | string[];\n owns?: string | string[];\n expanded?: boolean;\n selected?: boolean;\n checked?: boolean | 'mixed';\n pressed?: boolean | 'mixed';\n disabled?: boolean;\n hidden?: boolean;\n modal?: boolean;\n busy?: boolean;\n current?: 'page' | 'step' | 'location' | 'date' | 'time' | 'true' | 'false';\n invalid?: boolean | 'grammar' | 'spelling';\n hasPopup?: 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog' | boolean;\n activeDescendant?: string;\n level?: number;\n posInSet?: number;\n setSize?: number;\n valueMin?: number;\n valueMax?: number;\n valueNow?: number;\n valueText?: string;\n orientation?: 'horizontal' | 'vertical';\n required?: boolean;\n readOnly?: boolean;\n autocomplete?: 'none' | 'inline' | 'list' | 'both';\n multiSelectable?: boolean;\n sort?: 'none' | 'ascending' | 'descending' | 'other';\n role?: AriaRole;\n}): Record<string, string | undefined> {\n const result: Record<string, string | undefined> = {};\n\n if (props.label) result['aria-label'] = props.label;\n if (props.labelledBy) {\n result['aria-labelledby'] = Array.isArray(props.labelledBy)\n ? props.labelledBy.join(' ')\n : props.labelledBy;\n }\n if (props.describedBy) {\n result['aria-describedby'] = Array.isArray(props.describedBy)\n ? props.describedBy.join(' ')\n : props.describedBy;\n }\n if (props.controls) {\n result['aria-controls'] = Array.isArray(props.controls)\n ? props.controls.join(' ')\n : props.controls;\n }\n if (props.owns) {\n result['aria-owns'] = Array.isArray(props.owns)\n ? props.owns.join(' ')\n : props.owns;\n }\n if (props.expanded !== undefined) result['aria-expanded'] = String(props.expanded);\n if (props.selected !== undefined) result['aria-selected'] = String(props.selected);\n if (props.checked !== undefined) result['aria-checked'] = String(props.checked);\n if (props.pressed !== undefined) result['aria-pressed'] = String(props.pressed);\n if (props.disabled !== undefined) result['aria-disabled'] = String(props.disabled);\n if (props.hidden !== undefined) result['aria-hidden'] = String(props.hidden);\n if (props.modal !== undefined) result['aria-modal'] = String(props.modal);\n if (props.busy !== undefined) result['aria-busy'] = String(props.busy);\n if (props.current) result['aria-current'] = props.current;\n if (props.invalid !== undefined) result['aria-invalid'] = String(props.invalid);\n if (props.hasPopup !== undefined) result['aria-haspopup'] = String(props.hasPopup);\n if (props.activeDescendant) result['aria-activedescendant'] = props.activeDescendant;\n if (props.level !== undefined) result['aria-level'] = String(props.level);\n if (props.posInSet !== undefined) result['aria-posinset'] = String(props.posInSet);\n if (props.setSize !== undefined) result['aria-setsize'] = String(props.setSize);\n if (props.valueMin !== undefined) result['aria-valuemin'] = String(props.valueMin);\n if (props.valueMax !== undefined) result['aria-valuemax'] = String(props.valueMax);\n if (props.valueNow !== undefined) result['aria-valuenow'] = String(props.valueNow);\n if (props.valueText) result['aria-valuetext'] = props.valueText;\n if (props.orientation) result['aria-orientation'] = props.orientation;\n if (props.required !== undefined) result['aria-required'] = String(props.required);\n if (props.readOnly !== undefined) result['aria-readonly'] = String(props.readOnly);\n if (props.autocomplete) result['aria-autocomplete'] = props.autocomplete;\n if (props.multiSelectable !== undefined) result['aria-multiselectable'] = String(props.multiSelectable);\n if (props.sort) result['aria-sort'] = props.sort;\n if (props.role) result.role = props.role;\n\n return result;\n}\n\n/**\n * Merge multiple aria-labelledby or aria-describedby values\n */\nexport function mergeAriaIds(...ids: (string | undefined | null)[]): string | undefined {\n const filtered = ids.filter(Boolean) as string[];\n return filtered.length > 0 ? filtered.join(' ') : undefined;\n}\n\n/**\n * Check if an element has an accessible name\n */\nexport function hasAccessibleName(element: HTMLElement): boolean {\n // Check aria-label\n if (element.getAttribute('aria-label')) {\n return true;\n }\n\n // Check aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const ids = labelledBy.split(' ');\n const hasLabelContent = ids.some((id) => {\n const labelElement = document.getElementById(id);\n return labelElement && labelElement.textContent?.trim();\n });\n if (hasLabelContent) return true;\n }\n\n // Check text content (for buttons, links, etc.)\n if (element.textContent?.trim()) {\n return true;\n }\n\n // Check title attribute (fallback)\n if (element.getAttribute('title')) {\n return true;\n }\n\n // Check associated label (for form elements)\n if ('labels' in element && (element as HTMLInputElement).labels?.length) {\n return true;\n }\n\n // Check alt attribute (for images)\n if (element.tagName === 'IMG' && element.getAttribute('alt')) {\n return true;\n }\n\n return false;\n}\n"]}
@@ -0,0 +1,158 @@
1
+ 'use strict';
2
+
3
+ var chunkXEGB27QF_cjs = require('./chunk-XEGB27QF.cjs');
4
+
5
+ // src/announcer/live-announcer.ts
6
+ var politeRegion = null;
7
+ var assertiveRegion = null;
8
+ var isInitialized = false;
9
+ var messageQueue = [];
10
+ var queueTimeout = null;
11
+ function getHiddenStyles() {
12
+ return {
13
+ position: "absolute",
14
+ width: "1px",
15
+ height: "1px",
16
+ padding: "0",
17
+ margin: "-1px",
18
+ overflow: "hidden",
19
+ clip: "rect(0, 0, 0, 0)",
20
+ whiteSpace: "nowrap",
21
+ border: "0"
22
+ };
23
+ }
24
+ function createLiveRegion(politeness) {
25
+ const element = document.createElement("div");
26
+ element.setAttribute("role", "status");
27
+ element.setAttribute("aria-live", politeness);
28
+ element.setAttribute("aria-atomic", "true");
29
+ element.setAttribute("aria-relevant", "additions text");
30
+ element.id = `compa11y-announcer-${politeness}`;
31
+ const styles = getHiddenStyles();
32
+ Object.assign(element.style, styles);
33
+ document.body.appendChild(element);
34
+ return { element, politeness };
35
+ }
36
+ function initAnnouncer() {
37
+ if (!chunkXEGB27QF_cjs.isBrowser() || isInitialized) {
38
+ return () => {
39
+ };
40
+ }
41
+ isInitialized = true;
42
+ politeRegion = createLiveRegion("polite");
43
+ assertiveRegion = createLiveRegion("assertive");
44
+ return () => {
45
+ if (politeRegion) {
46
+ politeRegion.element.remove();
47
+ politeRegion = null;
48
+ }
49
+ if (assertiveRegion) {
50
+ assertiveRegion.element.remove();
51
+ assertiveRegion = null;
52
+ }
53
+ if (queueTimeout) {
54
+ clearTimeout(queueTimeout);
55
+ queueTimeout = null;
56
+ }
57
+ messageQueue = [];
58
+ isInitialized = false;
59
+ };
60
+ }
61
+ function ensureAnnouncer() {
62
+ if (!isInitialized && chunkXEGB27QF_cjs.isBrowser()) {
63
+ initAnnouncer();
64
+ }
65
+ }
66
+ function clearRegion(region) {
67
+ region.element.textContent = "";
68
+ }
69
+ function announce(message, options = {}) {
70
+ if (!chunkXEGB27QF_cjs.isBrowser()) return;
71
+ const {
72
+ politeness = "polite",
73
+ delay = 0,
74
+ clearPrevious = false,
75
+ timeout = 7e3
76
+ } = options;
77
+ ensureAnnouncer();
78
+ const region = politeness === "assertive" ? assertiveRegion : politeRegion;
79
+ if (!region) return;
80
+ const doAnnounce = () => {
81
+ if (clearPrevious) {
82
+ clearRegion(region);
83
+ }
84
+ region.element.textContent = "";
85
+ requestAnimationFrame(() => {
86
+ region.element.textContent = message;
87
+ if (timeout > 0) {
88
+ setTimeout(() => {
89
+ if (region.element.textContent === message) {
90
+ region.element.textContent = "";
91
+ }
92
+ }, timeout);
93
+ }
94
+ });
95
+ };
96
+ if (delay > 0) {
97
+ setTimeout(doAnnounce, delay);
98
+ } else {
99
+ doAnnounce();
100
+ }
101
+ }
102
+ function announcePolite(message, options) {
103
+ announce(message, { ...options, politeness: "polite" });
104
+ }
105
+ function announceAssertive(message, options) {
106
+ announce(message, { ...options, politeness: "assertive" });
107
+ }
108
+ function clearAnnouncements() {
109
+ if (politeRegion) clearRegion(politeRegion);
110
+ if (assertiveRegion) clearRegion(assertiveRegion);
111
+ }
112
+ function queueAnnouncement(message, options = {}) {
113
+ const { debounce = 150, ...announceOptions } = options;
114
+ messageQueue.push({ message, options: announceOptions });
115
+ if (queueTimeout) {
116
+ clearTimeout(queueTimeout);
117
+ }
118
+ queueTimeout = setTimeout(() => {
119
+ const lastMessage = messageQueue[messageQueue.length - 1];
120
+ if (lastMessage) {
121
+ announce(lastMessage.message, lastMessage.options);
122
+ }
123
+ messageQueue = [];
124
+ queueTimeout = null;
125
+ }, debounce);
126
+ }
127
+ function createAnnouncer(defaultOptions = {}) {
128
+ return {
129
+ announce: (message, options) => announce(message, { ...defaultOptions, ...options }),
130
+ polite: (message, options) => announcePolite(message, { ...defaultOptions, ...options }),
131
+ assertive: (message, options) => announceAssertive(message, { ...defaultOptions, ...options }),
132
+ queue: (message, options) => queueAnnouncement(message, { ...defaultOptions, ...options }),
133
+ clear: clearAnnouncements
134
+ };
135
+ }
136
+ function announceStatus(message) {
137
+ announcePolite(message);
138
+ }
139
+ function announceError(message) {
140
+ announceAssertive(message);
141
+ }
142
+ function announceProgress(current, total, template = "{current} of {total}") {
143
+ const message = template.replace("{current}", String(current)).replace("{total}", String(total));
144
+ announcePolite(message);
145
+ }
146
+
147
+ exports.announce = announce;
148
+ exports.announceAssertive = announceAssertive;
149
+ exports.announceError = announceError;
150
+ exports.announcePolite = announcePolite;
151
+ exports.announceProgress = announceProgress;
152
+ exports.announceStatus = announceStatus;
153
+ exports.clearAnnouncements = clearAnnouncements;
154
+ exports.createAnnouncer = createAnnouncer;
155
+ exports.initAnnouncer = initAnnouncer;
156
+ exports.queueAnnouncement = queueAnnouncement;
157
+ //# sourceMappingURL=chunk-V6TZIZZ4.cjs.map
158
+ //# sourceMappingURL=chunk-V6TZIZZ4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/announcer/live-announcer.ts"],"names":["isBrowser"],"mappings":"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","file":"chunk-V6TZIZZ4.cjs","sourcesContent":["/**\n * Live Announcer\n *\n * Provides screen reader announcements via ARIA live regions\n */\n\nimport type { AriaLivePoliteness, AnnouncerOptions } from '../types';\nimport { isBrowser } from '../utils/platform';\n\ninterface LiveRegion {\n element: HTMLElement;\n politeness: AriaLivePoliteness;\n}\n\n// Singleton regions\nlet politeRegion: LiveRegion | null = null;\nlet assertiveRegion: LiveRegion | null = null;\nlet isInitialized = false;\n\n// Message queue for debouncing\nlet messageQueue: Array<{\n message: string;\n options: AnnouncerOptions;\n}> = [];\nlet queueTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Create the visually hidden styles for live regions\n */\nfunction getHiddenStyles(): Partial<CSSStyleDeclaration> {\n return {\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 whiteSpace: 'nowrap',\n border: '0',\n };\n}\n\n/**\n * Create a live region element\n */\nfunction createLiveRegion(politeness: AriaLivePoliteness): LiveRegion {\n const element = document.createElement('div');\n\n // Set ARIA attributes\n element.setAttribute('role', 'status');\n element.setAttribute('aria-live', politeness);\n element.setAttribute('aria-atomic', 'true');\n element.setAttribute('aria-relevant', 'additions text');\n element.id = `compa11y-announcer-${politeness}`;\n\n // Apply visually hidden styles\n const styles = getHiddenStyles();\n Object.assign(element.style, styles);\n\n // Add to DOM\n document.body.appendChild(element);\n\n return { element, politeness };\n}\n\n/**\n * Initialize the live announcer\n * Call this once at app startup\n */\nexport function initAnnouncer(): () => void {\n if (!isBrowser() || isInitialized) {\n return () => {};\n }\n\n isInitialized = true;\n\n // Create live regions\n politeRegion = createLiveRegion('polite');\n assertiveRegion = createLiveRegion('assertive');\n\n // Cleanup function\n return () => {\n if (politeRegion) {\n politeRegion.element.remove();\n politeRegion = null;\n }\n if (assertiveRegion) {\n assertiveRegion.element.remove();\n assertiveRegion = null;\n }\n if (queueTimeout) {\n clearTimeout(queueTimeout);\n queueTimeout = null;\n }\n messageQueue = [];\n isInitialized = false;\n };\n}\n\n/**\n * Get or create the announcer (auto-init if needed)\n */\nfunction ensureAnnouncer(): void {\n if (!isInitialized && isBrowser()) {\n initAnnouncer();\n }\n}\n\n/**\n * Clear a live region's content\n */\nfunction clearRegion(region: LiveRegion): void {\n region.element.textContent = '';\n}\n\n/**\n * Announce a message to screen readers\n */\nexport function announce(\n message: string,\n options: AnnouncerOptions = {}\n): void {\n if (!isBrowser()) return;\n\n const {\n politeness = 'polite',\n delay = 0,\n clearPrevious = false,\n timeout = 7000,\n } = options;\n\n ensureAnnouncer();\n\n const region = politeness === 'assertive' ? assertiveRegion : politeRegion;\n if (!region) return;\n\n const doAnnounce = () => {\n if (clearPrevious) {\n clearRegion(region);\n }\n\n region.element.textContent = '';\n\n requestAnimationFrame(() => {\n region.element.textContent = message;\n\n // Auto-clear after timeout\n if (timeout > 0) {\n setTimeout(() => {\n if (region.element.textContent === message) {\n region.element.textContent = '';\n }\n }, timeout);\n }\n });\n };\n\n if (delay > 0) {\n setTimeout(doAnnounce, delay);\n } else {\n doAnnounce();\n }\n}\n\n/**\n * Announce a polite message (non-interruptive)\n */\nexport function announcePolite(\n message: string,\n options?: Omit<AnnouncerOptions, 'politeness'>\n): void {\n announce(message, { ...options, politeness: 'polite' });\n}\n\n/**\n * Announce an assertive message (interruptive)\n */\nexport function announceAssertive(\n message: string,\n options?: Omit<AnnouncerOptions, 'politeness'>\n): void {\n announce(message, { ...options, politeness: 'assertive' });\n}\n\n/**\n * Clear all announcements\n */\nexport function clearAnnouncements(): void {\n if (politeRegion) clearRegion(politeRegion);\n if (assertiveRegion) clearRegion(assertiveRegion);\n}\n\n/**\n * Queue multiple announcements (debounced)\n */\nexport function queueAnnouncement(\n message: string,\n options: AnnouncerOptions & { debounce?: number } = {}\n): void {\n const { debounce = 150, ...announceOptions } = options;\n\n messageQueue.push({ message, options: announceOptions });\n\n if (queueTimeout) {\n clearTimeout(queueTimeout);\n }\n\n queueTimeout = setTimeout(() => {\n // Combine messages or use the last one\n const lastMessage = messageQueue[messageQueue.length - 1];\n if (lastMessage) {\n announce(lastMessage.message, lastMessage.options);\n }\n messageQueue = [];\n queueTimeout = null;\n }, debounce);\n}\n\n/**\n * Create an announcer instance for a specific context\n */\nexport function createAnnouncer(defaultOptions: AnnouncerOptions = {}) {\n return {\n announce: (message: string, options?: AnnouncerOptions) =>\n announce(message, { ...defaultOptions, ...options }),\n polite: (message: string, options?: Omit<AnnouncerOptions, 'politeness'>) =>\n announcePolite(message, { ...defaultOptions, ...options }),\n assertive: (\n message: string,\n options?: Omit<AnnouncerOptions, 'politeness'>\n ) => announceAssertive(message, { ...defaultOptions, ...options }),\n queue: (\n message: string,\n options?: AnnouncerOptions & { debounce?: number }\n ) => queueAnnouncement(message, { ...defaultOptions, ...options }),\n clear: clearAnnouncements,\n };\n}\n\n/**\n * Status announcer - for status updates like \"Saved\", \"Loading complete\"\n */\nexport function announceStatus(message: string): void {\n announcePolite(message);\n}\n\n/**\n * Error announcer - for error messages\n */\nexport function announceError(message: string): void {\n announceAssertive(message);\n}\n\n/**\n * Progress announcer - for progress updates\n */\nexport function announceProgress(\n current: number,\n total: number,\n template = '{current} of {total}'\n): void {\n const message = template\n .replace('{current}', String(current))\n .replace('{total}', String(total));\n announcePolite(message);\n}\n"]}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ // src/utils/platform.ts
4
+ function isBrowser() {
5
+ return typeof window !== "undefined" && typeof document !== "undefined";
6
+ }
7
+ function isMac() {
8
+ if (!isBrowser()) return false;
9
+ return /Mac|iPod|iPhone|iPad/.test(navigator.platform);
10
+ }
11
+ function isIOS() {
12
+ if (!isBrowser()) return false;
13
+ return /iPod|iPhone|iPad/.test(navigator.platform) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
14
+ }
15
+ function isAndroid() {
16
+ if (!isBrowser()) return false;
17
+ return /Android/.test(navigator.userAgent);
18
+ }
19
+ function isWindows() {
20
+ if (!isBrowser()) return false;
21
+ return /Win/.test(navigator.platform);
22
+ }
23
+ function isTouchDevice() {
24
+ if (!isBrowser()) return false;
25
+ return "ontouchstart" in window || navigator.maxTouchPoints > 0;
26
+ }
27
+ function prefersReducedMotion() {
28
+ if (!isBrowser()) return false;
29
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
30
+ }
31
+ function prefersHighContrast() {
32
+ if (!isBrowser()) return false;
33
+ return window.matchMedia("(prefers-contrast: more)").matches || window.matchMedia("(-ms-high-contrast: active)").matches;
34
+ }
35
+ function prefersDarkMode() {
36
+ if (!isBrowser()) return false;
37
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
38
+ }
39
+ function getScreenReaderHints() {
40
+ if (!isBrowser()) {
41
+ return { possibleScreenReader: false, forcedColors: false };
42
+ }
43
+ const forcedColors = window.matchMedia("(forced-colors: active)").matches;
44
+ return {
45
+ possibleScreenReader: forcedColors,
46
+ forcedColors
47
+ };
48
+ }
49
+ function createMediaQueryListener(query, callback) {
50
+ if (!isBrowser()) {
51
+ return () => {
52
+ };
53
+ }
54
+ const mediaQuery = window.matchMedia(query);
55
+ callback(mediaQuery.matches);
56
+ if (mediaQuery.addEventListener) {
57
+ const handler = (e) => callback(e.matches);
58
+ mediaQuery.addEventListener("change", handler);
59
+ return () => mediaQuery.removeEventListener("change", handler);
60
+ }
61
+ const legacyHandler = () => callback(mediaQuery.matches);
62
+ mediaQuery.addListener(legacyHandler);
63
+ return () => mediaQuery.removeListener(legacyHandler);
64
+ }
65
+
66
+ exports.createMediaQueryListener = createMediaQueryListener;
67
+ exports.getScreenReaderHints = getScreenReaderHints;
68
+ exports.isAndroid = isAndroid;
69
+ exports.isBrowser = isBrowser;
70
+ exports.isIOS = isIOS;
71
+ exports.isMac = isMac;
72
+ exports.isTouchDevice = isTouchDevice;
73
+ exports.isWindows = isWindows;
74
+ exports.prefersDarkMode = prefersDarkMode;
75
+ exports.prefersHighContrast = prefersHighContrast;
76
+ exports.prefersReducedMotion = prefersReducedMotion;
77
+ //# sourceMappingURL=chunk-XEGB27QF.cjs.map
78
+ //# sourceMappingURL=chunk-XEGB27QF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/platform.ts"],"names":[],"mappings":";;;AASO,SAAS,SAAA,GAAqB;AACnC,EAAA,OACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,QAAA,KAAa,WAAA;AAExB;AAKO,SAAS,KAAA,GAAiB;AAC/B,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACvD;AAKO,SAAS,KAAA,GAAiB;AAC/B,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,kBAAA,CAAmB,KAAK,SAAA,CAAU,QAAQ,KAC9C,SAAA,CAAU,QAAA,KAAa,UAAA,IAAc,SAAA,CAAU,cAAA,GAAiB,CAAA;AACrE;AAKO,SAAS,SAAA,GAAqB;AACnC,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC3C;AAKO,SAAS,SAAA,GAAqB;AACnC,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACtC;AAKO,SAAS,aAAA,GAAyB;AACvC,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,cAAA,IAAkB,MAAA,IAAU,SAAA,CAAU,cAAA,GAAiB,CAAA;AAChE;AAKO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAKO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OACE,MAAA,CAAO,WAAW,0BAA0B,CAAA,CAAE,WAC9C,MAAA,CAAO,UAAA,CAAW,6BAA6B,CAAA,CAAE,OAAA;AAErD;AAKO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,KAAA;AACzB,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC3D;AAMO,SAAS,oBAAA,GAGd;AACA,EAAA,IAAI,CAAC,WAAU,EAAG;AAChB,IAAA,OAAO,EAAE,oBAAA,EAAsB,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM;AAAA,EAC5D;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,yBAAyB,CAAA,CAAE,OAAA;AAIlE,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,YAAA;AAAA,IACtB;AAAA,GACF;AACF;AAKO,SAAS,wBAAA,CACd,OACA,QAAA,EACY;AACZ,EAAA,IAAI,CAAC,WAAU,EAAG;AAChB,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAG1C,EAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAG3B,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B,QAAA,CAAS,EAAE,OAAO,CAAA;AAC9D,IAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAC7C,IAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACvD,EAAA,UAAA,CAAW,YAAY,aAAa,CAAA;AACpC,EAAA,OAAO,MAAM,UAAA,CAAW,cAAA,CAAe,aAAa,CAAA;AACtD","file":"chunk-XEGB27QF.cjs","sourcesContent":["/**\n * Platform detection utilities\n *\n * Used for platform-specific accessibility behavior\n */\n\n/**\n * Check if we're in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Detect if running on macOS\n */\nexport function isMac(): boolean {\n if (!isBrowser()) return false;\n return /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n}\n\n/**\n * Detect if running on iOS\n */\nexport function isIOS(): boolean {\n if (!isBrowser()) return false;\n return /iPod|iPhone|iPad/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n}\n\n/**\n * Detect if running on Android\n */\nexport function isAndroid(): boolean {\n if (!isBrowser()) return false;\n return /Android/.test(navigator.userAgent);\n}\n\n/**\n * Detect if running on Windows\n */\nexport function isWindows(): boolean {\n if (!isBrowser()) return false;\n return /Win/.test(navigator.platform);\n}\n\n/**\n * Detect if using a touch device\n */\nexport function isTouchDevice(): boolean {\n if (!isBrowser()) return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * Detect if user prefers reduced motion\n */\nexport function prefersReducedMotion(): boolean {\n if (!isBrowser()) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Detect if user prefers high contrast\n */\nexport function prefersHighContrast(): boolean {\n if (!isBrowser()) return false;\n return (\n window.matchMedia('(prefers-contrast: more)').matches ||\n window.matchMedia('(-ms-high-contrast: active)').matches\n );\n}\n\n/**\n * Detect if user prefers dark color scheme\n */\nexport function prefersDarkMode(): boolean {\n if (!isBrowser()) return false;\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/**\n * Get the current screen reader mode (if detectable)\n * Note: This is not 100% reliable and should not be depended upon\n */\nexport function getScreenReaderHints(): {\n possibleScreenReader: boolean;\n forcedColors: boolean;\n} {\n if (!isBrowser()) {\n return { possibleScreenReader: false, forcedColors: false };\n }\n\n const forcedColors = window.matchMedia('(forced-colors: active)').matches;\n\n // Heuristic: users with forced colors often use screen readers\n // But this is NOT a reliable indicator\n return {\n possibleScreenReader: forcedColors,\n forcedColors,\n };\n}\n\n/**\n * Create a media query listener with cleanup\n */\nexport function createMediaQueryListener(\n query: string,\n callback: (matches: boolean) => void\n): () => void {\n if (!isBrowser()) {\n return () => {};\n }\n\n const mediaQuery = window.matchMedia(query);\n\n // Initial call\n callback(mediaQuery.matches);\n\n // Modern API\n if (mediaQuery.addEventListener) {\n const handler = (e: MediaQueryListEvent) => callback(e.matches);\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Legacy API (Safari < 14)\n const legacyHandler = () => callback(mediaQuery.matches);\n mediaQuery.addListener(legacyHandler);\n return () => mediaQuery.removeListener(legacyHandler);\n}\n"]}
@@ -0,0 +1,66 @@
1
+ // src/utils/platform.ts
2
+ function isBrowser() {
3
+ return typeof window !== "undefined" && typeof document !== "undefined";
4
+ }
5
+ function isMac() {
6
+ if (!isBrowser()) return false;
7
+ return /Mac|iPod|iPhone|iPad/.test(navigator.platform);
8
+ }
9
+ function isIOS() {
10
+ if (!isBrowser()) return false;
11
+ return /iPod|iPhone|iPad/.test(navigator.platform) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
12
+ }
13
+ function isAndroid() {
14
+ if (!isBrowser()) return false;
15
+ return /Android/.test(navigator.userAgent);
16
+ }
17
+ function isWindows() {
18
+ if (!isBrowser()) return false;
19
+ return /Win/.test(navigator.platform);
20
+ }
21
+ function isTouchDevice() {
22
+ if (!isBrowser()) return false;
23
+ return "ontouchstart" in window || navigator.maxTouchPoints > 0;
24
+ }
25
+ function prefersReducedMotion() {
26
+ if (!isBrowser()) return false;
27
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
28
+ }
29
+ function prefersHighContrast() {
30
+ if (!isBrowser()) return false;
31
+ return window.matchMedia("(prefers-contrast: more)").matches || window.matchMedia("(-ms-high-contrast: active)").matches;
32
+ }
33
+ function prefersDarkMode() {
34
+ if (!isBrowser()) return false;
35
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
36
+ }
37
+ function getScreenReaderHints() {
38
+ if (!isBrowser()) {
39
+ return { possibleScreenReader: false, forcedColors: false };
40
+ }
41
+ const forcedColors = window.matchMedia("(forced-colors: active)").matches;
42
+ return {
43
+ possibleScreenReader: forcedColors,
44
+ forcedColors
45
+ };
46
+ }
47
+ function createMediaQueryListener(query, callback) {
48
+ if (!isBrowser()) {
49
+ return () => {
50
+ };
51
+ }
52
+ const mediaQuery = window.matchMedia(query);
53
+ callback(mediaQuery.matches);
54
+ if (mediaQuery.addEventListener) {
55
+ const handler = (e) => callback(e.matches);
56
+ mediaQuery.addEventListener("change", handler);
57
+ return () => mediaQuery.removeEventListener("change", handler);
58
+ }
59
+ const legacyHandler = () => callback(mediaQuery.matches);
60
+ mediaQuery.addListener(legacyHandler);
61
+ return () => mediaQuery.removeListener(legacyHandler);
62
+ }
63
+
64
+ export { createMediaQueryListener, getScreenReaderHints, isAndroid, isBrowser, isIOS, isMac, isTouchDevice, isWindows, prefersDarkMode, prefersHighContrast, prefersReducedMotion };
65
+ //# sourceMappingURL=chunk-Z7K2G6FX.js.map
66
+ //# sourceMappingURL=chunk-Z7K2G6FX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/platform.ts"],"names":[],"mappings":"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","file":"chunk-Z7K2G6FX.js","sourcesContent":["/**\n * Platform detection utilities\n *\n * Used for platform-specific accessibility behavior\n */\n\n/**\n * Check if we're in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Detect if running on macOS\n */\nexport function isMac(): boolean {\n if (!isBrowser()) return false;\n return /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n}\n\n/**\n * Detect if running on iOS\n */\nexport function isIOS(): boolean {\n if (!isBrowser()) return false;\n return /iPod|iPhone|iPad/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n}\n\n/**\n * Detect if running on Android\n */\nexport function isAndroid(): boolean {\n if (!isBrowser()) return false;\n return /Android/.test(navigator.userAgent);\n}\n\n/**\n * Detect if running on Windows\n */\nexport function isWindows(): boolean {\n if (!isBrowser()) return false;\n return /Win/.test(navigator.platform);\n}\n\n/**\n * Detect if using a touch device\n */\nexport function isTouchDevice(): boolean {\n if (!isBrowser()) return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * Detect if user prefers reduced motion\n */\nexport function prefersReducedMotion(): boolean {\n if (!isBrowser()) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Detect if user prefers high contrast\n */\nexport function prefersHighContrast(): boolean {\n if (!isBrowser()) return false;\n return (\n window.matchMedia('(prefers-contrast: more)').matches ||\n window.matchMedia('(-ms-high-contrast: active)').matches\n );\n}\n\n/**\n * Detect if user prefers dark color scheme\n */\nexport function prefersDarkMode(): boolean {\n if (!isBrowser()) return false;\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/**\n * Get the current screen reader mode (if detectable)\n * Note: This is not 100% reliable and should not be depended upon\n */\nexport function getScreenReaderHints(): {\n possibleScreenReader: boolean;\n forcedColors: boolean;\n} {\n if (!isBrowser()) {\n return { possibleScreenReader: false, forcedColors: false };\n }\n\n const forcedColors = window.matchMedia('(forced-colors: active)').matches;\n\n // Heuristic: users with forced colors often use screen readers\n // But this is NOT a reliable indicator\n return {\n possibleScreenReader: forcedColors,\n forcedColors,\n };\n}\n\n/**\n * Create a media query listener with cleanup\n */\nexport function createMediaQueryListener(\n query: string,\n callback: (matches: boolean) => void\n): () => void {\n if (!isBrowser()) {\n return () => {};\n }\n\n const mediaQuery = window.matchMedia(query);\n\n // Initial call\n callback(mediaQuery.matches);\n\n // Modern API\n if (mediaQuery.addEventListener) {\n const handler = (e: MediaQueryListEvent) => callback(e.matches);\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Legacy API (Safari < 14)\n const legacyHandler = () => callback(mediaQuery.matches);\n mediaQuery.addListener(legacyHandler);\n return () => mediaQuery.removeListener(legacyHandler);\n}\n"]}
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var chunkCQXMBRLD_cjs = require('../chunk-CQXMBRLD.cjs');
4
+ require('../chunk-XEGB27QF.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "createFocusScope", {
9
+ enumerable: true,
10
+ get: function () { return chunkCQXMBRLD_cjs.createFocusScope; }
11
+ });
12
+ Object.defineProperty(exports, "createFocusTrap", {
13
+ enumerable: true,
14
+ get: function () { return chunkCQXMBRLD_cjs.createFocusTrap; }
15
+ });
16
+ Object.defineProperty(exports, "createRovingTabindex", {
17
+ enumerable: true,
18
+ get: function () { return chunkCQXMBRLD_cjs.createRovingTabindex; }
19
+ });
20
+ Object.defineProperty(exports, "focusWithVisibleRing", {
21
+ enumerable: true,
22
+ get: function () { return chunkCQXMBRLD_cjs.focusWithVisibleRing; }
23
+ });
24
+ Object.defineProperty(exports, "getActiveFocusTrap", {
25
+ enumerable: true,
26
+ get: function () { return chunkCQXMBRLD_cjs.getActiveFocusTrap; }
27
+ });
28
+ Object.defineProperty(exports, "getLastFocusSource", {
29
+ enumerable: true,
30
+ get: function () { return chunkCQXMBRLD_cjs.getLastFocusSource; }
31
+ });
32
+ Object.defineProperty(exports, "hasFocusTrap", {
33
+ enumerable: true,
34
+ get: function () { return chunkCQXMBRLD_cjs.hasFocusTrap; }
35
+ });
36
+ Object.defineProperty(exports, "hasVisibleFocus", {
37
+ enumerable: true,
38
+ get: function () { return chunkCQXMBRLD_cjs.hasVisibleFocus; }
39
+ });
40
+ Object.defineProperty(exports, "initFocusVisible", {
41
+ enumerable: true,
42
+ get: function () { return chunkCQXMBRLD_cjs.initFocusVisible; }
43
+ });
44
+ Object.defineProperty(exports, "isFocusVisible", {
45
+ enumerable: true,
46
+ get: function () { return chunkCQXMBRLD_cjs.isFocusVisible; }
47
+ });
48
+ Object.defineProperty(exports, "setFocusVisible", {
49
+ enumerable: true,
50
+ get: function () { return chunkCQXMBRLD_cjs.setFocusVisible; }
51
+ });
52
+ //# sourceMappingURL=index.cjs.map
53
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,139 @@
1
+ import { F as FocusTrapOptions } from '../types-DDSPmE8m.cjs';
2
+
3
+ /**
4
+ * Focus Trap - Constrains focus within a container
5
+ *
6
+ * Essential for modals, dialogs, and other overlay components
7
+ */
8
+
9
+ interface FocusTrap {
10
+ activate: () => void;
11
+ deactivate: () => void;
12
+ /** Cleanup without calling onDeactivate - for use in effect cleanup */
13
+ destroy: () => void;
14
+ pause: () => void;
15
+ unpause: () => void;
16
+ isActive: () => boolean;
17
+ isPaused: () => boolean;
18
+ }
19
+ /**
20
+ * Create a focus trap for a container element
21
+ */
22
+ declare function createFocusTrap(container: HTMLElement, options?: FocusTrapOptions): FocusTrap;
23
+ /**
24
+ * Get the currently active focus trap
25
+ */
26
+ declare function getActiveFocusTrap(): FocusTrap | null;
27
+ /**
28
+ * Check if there's an active focus trap
29
+ */
30
+ declare function hasFocusTrap(): boolean;
31
+
32
+ /**
33
+ * Focus Visible Management
34
+ *
35
+ * Provides :focus-visible polyfill behavior and utilities
36
+ * for distinguishing keyboard focus from mouse/touch focus
37
+ */
38
+ type FocusSource = 'keyboard' | 'mouse' | 'touch' | 'unknown';
39
+ /**
40
+ * Initialize focus-visible tracking
41
+ * Call this once at app startup
42
+ */
43
+ declare function initFocusVisible(): () => void;
44
+ /**
45
+ * Check if current focus should be visible (keyboard-initiated)
46
+ */
47
+ declare function isFocusVisible(): boolean;
48
+ /**
49
+ * Check if an element has visible focus
50
+ */
51
+ declare function hasVisibleFocus(element: HTMLElement): boolean;
52
+ /**
53
+ * Get the source of the last focus event
54
+ */
55
+ declare function getLastFocusSource(): FocusSource;
56
+ /**
57
+ * Manually set focus as visible (useful for programmatic focus)
58
+ */
59
+ declare function setFocusVisible(element: HTMLElement, visible: boolean): void;
60
+ /**
61
+ * Focus an element with visible focus ring (keyboard-style)
62
+ */
63
+ declare function focusWithVisibleRing(element: HTMLElement, options?: FocusOptions): void;
64
+
65
+ /**
66
+ * Focus Scope Management
67
+ *
68
+ * Manages focus within a scope, supporting roving tabindex
69
+ * and programmatic focus control
70
+ */
71
+ interface FocusScopeOptions {
72
+ /** Whether to contain focus within the scope */
73
+ contain?: boolean;
74
+ /** Whether to restore focus when scope is destroyed */
75
+ restoreFocus?: boolean;
76
+ /** Whether to auto-focus the first element */
77
+ autoFocus?: boolean;
78
+ }
79
+ interface FocusScope {
80
+ /** Focus the first focusable element */
81
+ focusFirst: () => void;
82
+ /** Focus the last focusable element */
83
+ focusLast: () => void;
84
+ /** Focus the next focusable element */
85
+ focusNext: (options?: {
86
+ wrap?: boolean;
87
+ }) => void;
88
+ /** Focus the previous focusable element */
89
+ focusPrevious: (options?: {
90
+ wrap?: boolean;
91
+ }) => void;
92
+ /** Focus a specific element by index */
93
+ focusAt: (index: number) => void;
94
+ /** Get the currently focused element within scope */
95
+ getFocused: () => HTMLElement | null;
96
+ /** Get all focusable elements in the scope */
97
+ getElements: () => HTMLElement[];
98
+ /** Destroy the scope and cleanup */
99
+ destroy: () => void;
100
+ }
101
+ /**
102
+ * Create a focus scope for a container
103
+ */
104
+ declare function createFocusScope(container: HTMLElement, options?: FocusScopeOptions): FocusScope;
105
+ /**
106
+ * Roving Tabindex - Only one element is tabbable at a time
107
+ * Standard pattern for composite widgets like toolbars, menus, listboxes
108
+ */
109
+ interface RovingTabindexOptions {
110
+ /** Current active index */
111
+ initialIndex?: number;
112
+ /** Orientation for arrow key navigation */
113
+ orientation?: 'horizontal' | 'vertical' | 'both';
114
+ /** Whether to wrap around */
115
+ wrap?: boolean;
116
+ /** Called when selection changes */
117
+ onSelectionChange?: (index: number, element: HTMLElement) => void;
118
+ }
119
+ interface RovingTabindex {
120
+ /** Move to the next item */
121
+ next: () => void;
122
+ /** Move to the previous item */
123
+ previous: () => void;
124
+ /** Move to the first item */
125
+ first: () => void;
126
+ /** Move to the last item */
127
+ last: () => void;
128
+ /** Move to a specific index */
129
+ goto: (index: number) => void;
130
+ /** Get current index */
131
+ getIndex: () => number;
132
+ /** Update elements (call when DOM changes) */
133
+ update: () => void;
134
+ /** Cleanup */
135
+ destroy: () => void;
136
+ }
137
+ declare function createRovingTabindex(container: HTMLElement, selector: string, options?: RovingTabindexOptions): RovingTabindex;
138
+
139
+ export { type FocusScope, type FocusScopeOptions, type RovingTabindex, type RovingTabindexOptions, createFocusScope, createFocusTrap, createRovingTabindex, focusWithVisibleRing, getActiveFocusTrap, getLastFocusSource, hasFocusTrap, hasVisibleFocus, initFocusVisible, isFocusVisible, setFocusVisible };