@compa11y/core 0.1.2 ā 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/announcer/index.cjs +1 -49
- package/dist/announcer/index.js +1 -4
- package/dist/aria/index.cjs +1 -24
- package/dist/aria/index.js +1 -3
- package/dist/chunk-7BL2ABLF.cjs +1 -0
- package/dist/chunk-AQ6HEUSD.cjs +1 -0
- package/dist/chunk-C3VZQUKG.js +1 -0
- package/dist/chunk-EM45V5TK.cjs +1 -0
- package/dist/chunk-KQUAJKTG.cjs +1 -0
- package/dist/chunk-QGEFH2VG.js +1 -0
- package/dist/chunk-RE4QIUWR.js +1 -0
- package/dist/chunk-TGXWODB3.js +1 -0
- package/dist/chunk-Y2RTDE4A.cjs +1 -0
- package/dist/chunk-ZAQMM5TA.js +1 -0
- package/dist/focus/index.cjs +1 -53
- package/dist/focus/index.d.cts +63 -1
- package/dist/focus/index.d.ts +63 -1
- package/dist/focus/index.js +1 -4
- package/dist/index.cjs +2 -567
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -337
- package/dist/keyboard/index.cjs +1 -28
- package/dist/keyboard/index.js +1 -3
- package/package.json +1 -1
- package/dist/announcer/index.cjs.map +0 -1
- package/dist/announcer/index.js.map +0 -1
- package/dist/aria/index.cjs.map +0 -1
- package/dist/aria/index.js.map +0 -1
- package/dist/chunk-24U5HHMC.js +0 -309
- package/dist/chunk-24U5HHMC.js.map +0 -1
- package/dist/chunk-2CQOLVQH.js +0 -147
- package/dist/chunk-2CQOLVQH.js.map +0 -1
- package/dist/chunk-2PUYKF2E.js +0 -631
- package/dist/chunk-2PUYKF2E.js.map +0 -1
- package/dist/chunk-2WF5Y6D7.js +0 -175
- package/dist/chunk-2WF5Y6D7.js.map +0 -1
- package/dist/chunk-CQXMBRLD.cjs +0 -657
- package/dist/chunk-CQXMBRLD.cjs.map +0 -1
- package/dist/chunk-HQOFVJFO.cjs +0 -181
- package/dist/chunk-HQOFVJFO.cjs.map +0 -1
- package/dist/chunk-NBGFFCIJ.cjs +0 -314
- package/dist/chunk-NBGFFCIJ.cjs.map +0 -1
- package/dist/chunk-V6TZIZZ4.cjs +0 -158
- package/dist/chunk-V6TZIZZ4.cjs.map +0 -1
- package/dist/chunk-XEGB27QF.cjs +0 -78
- package/dist/chunk-XEGB27QF.cjs.map +0 -1
- package/dist/chunk-Z7K2G6FX.js +0 -66
- package/dist/chunk-Z7K2G6FX.js.map +0 -1
- package/dist/focus/index.cjs.map +0 -1
- package/dist/focus/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/keyboard/index.cjs.map +0 -1
- package/dist/keyboard/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-V6TZIZZ4.cjs
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-XEGB27QF.cjs
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/platform.ts"],"names":[],"mappings":"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","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"]}
|
package/dist/chunk-Z7K2G6FX.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/focus/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
package/dist/focus/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/id.ts","../src/dev/warnings.ts","../src/index.ts"],"names":["hasAccessibleName","initFocusVisible","initAnnouncer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ID generation utilities for accessible components\n *\n * Generates unique, predictable IDs for ARIA relationships\n */\n\nlet idCounter = 0;\n\nconst PREFIX = 'compa11y';\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n const id = ++idCounter;\n return prefix ? `${PREFIX}-${prefix}-${id}` : `${PREFIX}-${id}`;\n}\n\n/**\n * Generate a set of related IDs for a component\n * Useful for complex components with multiple ARIA relationships\n */\nexport function generateIds<T extends readonly string[]>(\n parts: T,\n prefix?: string\n): Record<T[number], string> {\n const baseId = generateId(prefix);\n const ids = {} as Record<string, string>;\n\n for (const part of parts) {\n ids[part] = `${baseId}-${part}`;\n }\n\n return ids as Record<T[number], string>;\n}\n\n/**\n * Reset the ID counter (useful for testing)\n */\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\n/**\n * Create a scoped ID generator for a component instance\n */\nexport function createIdScope(componentName: string) {\n const scopeId = generateId(componentName);\n\n return {\n id: scopeId,\n generate: (suffix: string) => `${scopeId}-${suffix}`,\n generateMultiple: <T extends readonly string[]>(parts: T) => {\n const ids = {} as Record<string, string>;\n for (const part of parts) {\n ids[part] = `${scopeId}-${part}`;\n }\n return ids as Record<T[number], string>;\n },\n };\n}\n","/**\n * Developer Warnings System\n *\n * Provides development-time feedback for accessibility issues\n */\n\nimport type { DevWarning, DevWarningHandler } from '../types';\nimport { hasAccessibleName } from '../aria/aria-utils';\n\n// Global warning handler\nlet warningHandler: DevWarningHandler | null = null;\n\n// Track issued warnings to avoid duplicates\nconst issuedWarnings = new Set<string>();\n\n// Check if we're in development mode\nfunction isDev(): boolean {\n return (\n typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production'\n );\n}\n\n/**\n * Set a custom warning handler\n */\nexport function setWarningHandler(handler: DevWarningHandler | null): void {\n warningHandler = handler;\n}\n\n/**\n * Create a warning key for deduplication\n */\nfunction createWarningKey(warning: DevWarning): string {\n return `${warning.component}:${warning.message}`;\n}\n\n/**\n * Issue a development warning\n */\nexport function warn(warning: DevWarning): void {\n if (!isDev()) return;\n\n const key = createWarningKey(warning);\n if (issuedWarnings.has(key)) return;\n issuedWarnings.add(key);\n\n if (warningHandler) {\n warningHandler(warning);\n return;\n }\n\n const prefix = `[compa11y/${warning.component}]`;\n const style = getConsoleStyle(warning.type);\n\n const message = warning.suggestion\n ? `${warning.message}\\n\\nš” Suggestion: ${warning.suggestion}`\n : warning.message;\n\n switch (warning.type) {\n case 'error':\n console.error(`%c${prefix}%c ${message}`, style, '');\n break;\n case 'warning':\n console.warn(`%c${prefix}%c ${message}`, style, '');\n break;\n case 'info':\n console.info(`%c${prefix}%c ${message}`, style, '');\n break;\n }\n\n if (warning.element) {\n console.log('Element:', warning.element);\n }\n}\n\n/**\n * Get console style for warning type\n */\nfunction getConsoleStyle(type: DevWarning['type']): string {\n switch (type) {\n case 'error':\n return 'background: #ff5555; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n case 'warning':\n return 'background: #ffaa00; color: black; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n case 'info':\n return 'background: #5555ff; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n }\n}\n\n/**\n * Clear issued warnings (useful for testing)\n */\nexport function clearWarnings(): void {\n issuedWarnings.clear();\n}\n\n/**\n * Pre-built warning checks\n */\nexport const checks = {\n /**\n * Check for missing accessible label\n */\n accessibleLabel(\n element: HTMLElement | null,\n component: string,\n propName = 'aria-label'\n ): void {\n if (!element) return;\n\n if (!hasAccessibleName(element)) {\n warn({\n type: 'error',\n component,\n message: `Missing accessible label. Screen reader users will not be able to understand this element.`,\n suggestion: `Add ${propName}, aria-labelledby, or visible text content.`,\n element,\n });\n }\n },\n\n /**\n * Check for missing required prop\n */\n requiredProp(value: unknown, propName: string, component: string): void {\n if (value === undefined || value === null || value === '') {\n warn({\n type: 'error',\n component,\n message: `Missing required prop \"${propName}\".`,\n suggestion: `Provide a value for the \"${propName}\" prop.`,\n });\n }\n },\n\n /**\n * Check for invalid ARIA role\n */\n validRole(\n role: string | undefined,\n component: string,\n element?: HTMLElement\n ): void {\n if (!role) return;\n\n const validRoles = new Set([\n 'alert',\n 'alertdialog',\n 'application',\n 'article',\n 'banner',\n 'button',\n 'cell',\n 'columnheader',\n 'combobox',\n 'complementary',\n 'contentinfo',\n 'definition',\n 'dialog',\n 'directory',\n 'document',\n 'feed',\n 'figure',\n 'form',\n 'grid',\n 'gridcell',\n 'group',\n 'heading',\n 'img',\n 'link',\n 'list',\n 'listbox',\n 'listitem',\n 'log',\n 'main',\n 'marquee',\n 'math',\n 'menu',\n 'menubar',\n 'menuitem',\n 'navigation',\n 'none',\n 'note',\n 'option',\n 'presentation',\n 'progressbar',\n 'region',\n 'row',\n 'rowgroup',\n 'rowheader',\n 'scrollbar',\n 'search',\n 'searchbox',\n 'separator',\n 'slider',\n 'spinbutton',\n 'status',\n 'switch',\n 'tab',\n 'table',\n 'tablist',\n 'tabpanel',\n 'term',\n 'textbox',\n 'timer',\n 'toolbar',\n 'tooltip',\n 'tree',\n 'treegrid',\n 'treeitem',\n ]);\n\n if (!validRoles.has(role)) {\n warn({\n type: 'warning',\n component,\n message: `Invalid ARIA role \"${role}\".`,\n suggestion: 'Use a valid ARIA role from the WAI-ARIA specification.',\n element,\n });\n }\n },\n\n /**\n * Check for interactive element without keyboard support\n */\n keyboardAccessible(\n element: HTMLElement | null,\n component: string,\n handlers: { onClick?: unknown; onKeyDown?: unknown }\n ): void {\n if (!element) return;\n\n if (handlers.onClick && !handlers.onKeyDown) {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Native interactive elements are fine\n if (['button', 'a', 'input', 'select', 'textarea'].includes(tagName)) {\n return;\n }\n\n // Elements with interactive roles need keyboard handling\n const interactiveRoles = ['button', 'link', 'menuitem', 'option', 'tab'];\n if (role && interactiveRoles.includes(role)) {\n warn({\n type: 'warning',\n component,\n message: `Element has onClick but no onKeyDown handler.`,\n suggestion: 'Add keyboard event handling for Enter and Space keys.',\n element,\n });\n }\n }\n },\n\n /**\n * Check tabIndex usage\n */\n tabIndex(\n tabIndex: number | undefined,\n component: string,\n element?: HTMLElement\n ): void {\n if (tabIndex === undefined) return;\n\n if (tabIndex > 0) {\n warn({\n type: 'warning',\n component,\n message: `Positive tabIndex (${tabIndex}) disrupts natural tab order.`,\n suggestion:\n 'Use tabIndex={0} or tabIndex={-1} instead. Rely on DOM order for tab sequence.',\n element,\n });\n }\n },\n\n /**\n * Check for autofocus in dialogs\n */\n dialogAutoFocus(hasAutoFocus: boolean, component: string): void {\n if (!hasAutoFocus) {\n warn({\n type: 'info',\n component,\n message: 'No initial focus element specified for dialog.',\n suggestion: 'Consider setting initialFocus to guide keyboard users.',\n });\n }\n },\n\n /**\n * Check for missing form labels\n */\n formLabel(\n inputElement: HTMLElement | null,\n labelId: string | undefined,\n component: string\n ): void {\n if (!inputElement) return;\n\n const hasLabel =\n labelId ||\n inputElement.getAttribute('aria-label') ||\n inputElement.getAttribute('aria-labelledby') ||\n (inputElement as HTMLInputElement).labels?.length;\n\n if (!hasLabel) {\n warn({\n type: 'error',\n component,\n message: 'Form input is missing an accessible label.',\n suggestion: 'Add a <label>, aria-label, or aria-labelledby.',\n element: inputElement,\n });\n }\n },\n\n /**\n * Check for missing alt text on images\n */\n imageAlt(element: HTMLElement | null, component: string): void {\n if (!element || element.tagName !== 'IMG') return;\n\n const alt = element.getAttribute('alt');\n const role = element.getAttribute('role');\n\n if (alt === null && role !== 'presentation' && role !== 'none') {\n warn({\n type: 'error',\n component,\n message: 'Image is missing alt attribute.',\n suggestion:\n 'Add alt=\"\" for decorative images or descriptive alt text for meaningful images.',\n element,\n });\n }\n },\n};\n\n/**\n * Create a component-scoped warning function\n */\nexport function createComponentWarnings(componentName: string) {\n return {\n error: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'error',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n warning: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'warning',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n info: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'info',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n checks: {\n accessibleLabel: (element: HTMLElement | null, propName?: string) =>\n checks.accessibleLabel(element, componentName, propName),\n requiredProp: (value: unknown, propName: string) =>\n checks.requiredProp(value, propName, componentName),\n keyboardAccessible: (\n element: HTMLElement | null,\n handlers: { onClick?: unknown; onKeyDown?: unknown }\n ) => checks.keyboardAccessible(element, componentName, handlers),\n tabIndex: (tabIndex: number | undefined, element?: HTMLElement) =>\n checks.tabIndex(tabIndex, componentName, element),\n },\n };\n}\n","/**\n * @compa11y/core\n *\n * Framework-agnostic accessibility primitives\n *\n * This package provides the foundational utilities used by all\n * compa11y packages (React, Web Components, etc.)\n */\n\n// Types\nexport * from './types';\n\n// Utilities\nexport * from './utils/id';\nexport * from './utils/dom';\nexport * from './utils/platform';\n\n// Focus Management\nexport * from './focus';\n\n// Keyboard Navigation\nexport * from './keyboard';\n\n// Screen Reader Announcements\nexport * from './announcer';\n\n// ARIA Utilities\nexport * from './aria';\n\n// Development Tools\nexport * from './dev';\n\n/**\n * Initialize all compa11y systems\n * Call this once at app startup for optimal behavior\n */\nexport function initCompa11y(): () => void {\n const cleanups: Array<() => void> = [];\n\n // Dynamic imports to support tree-shaking\n // These are safe because they're from this package\n import('./focus').then(({ initFocusVisible }) => {\n cleanups.push(initFocusVisible());\n });\n\n import('./announcer').then(({ initAnnouncer }) => {\n cleanups.push(initAnnouncer());\n });\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n };\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/id.ts","../src/dev/warnings.ts","../src/index.ts"],"names":["initFocusVisible","initAnnouncer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ID generation utilities for accessible components\n *\n * Generates unique, predictable IDs for ARIA relationships\n */\n\nlet idCounter = 0;\n\nconst PREFIX = 'compa11y';\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n const id = ++idCounter;\n return prefix ? `${PREFIX}-${prefix}-${id}` : `${PREFIX}-${id}`;\n}\n\n/**\n * Generate a set of related IDs for a component\n * Useful for complex components with multiple ARIA relationships\n */\nexport function generateIds<T extends readonly string[]>(\n parts: T,\n prefix?: string\n): Record<T[number], string> {\n const baseId = generateId(prefix);\n const ids = {} as Record<string, string>;\n\n for (const part of parts) {\n ids[part] = `${baseId}-${part}`;\n }\n\n return ids as Record<T[number], string>;\n}\n\n/**\n * Reset the ID counter (useful for testing)\n */\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\n/**\n * Create a scoped ID generator for a component instance\n */\nexport function createIdScope(componentName: string) {\n const scopeId = generateId(componentName);\n\n return {\n id: scopeId,\n generate: (suffix: string) => `${scopeId}-${suffix}`,\n generateMultiple: <T extends readonly string[]>(parts: T) => {\n const ids = {} as Record<string, string>;\n for (const part of parts) {\n ids[part] = `${scopeId}-${part}`;\n }\n return ids as Record<T[number], string>;\n },\n };\n}\n","/**\n * Developer Warnings System\n *\n * Provides development-time feedback for accessibility issues\n */\n\nimport type { DevWarning, DevWarningHandler } from '../types';\nimport { hasAccessibleName } from '../aria/aria-utils';\n\n// Global warning handler\nlet warningHandler: DevWarningHandler | null = null;\n\n// Track issued warnings to avoid duplicates\nconst issuedWarnings = new Set<string>();\n\n// Check if we're in development mode\nfunction isDev(): boolean {\n return (\n typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production'\n );\n}\n\n/**\n * Set a custom warning handler\n */\nexport function setWarningHandler(handler: DevWarningHandler | null): void {\n warningHandler = handler;\n}\n\n/**\n * Create a warning key for deduplication\n */\nfunction createWarningKey(warning: DevWarning): string {\n return `${warning.component}:${warning.message}`;\n}\n\n/**\n * Issue a development warning\n */\nexport function warn(warning: DevWarning): void {\n if (!isDev()) return;\n\n const key = createWarningKey(warning);\n if (issuedWarnings.has(key)) return;\n issuedWarnings.add(key);\n\n if (warningHandler) {\n warningHandler(warning);\n return;\n }\n\n const prefix = `[compa11y/${warning.component}]`;\n const style = getConsoleStyle(warning.type);\n\n const message = warning.suggestion\n ? `${warning.message}\\n\\nš” Suggestion: ${warning.suggestion}`\n : warning.message;\n\n switch (warning.type) {\n case 'error':\n console.error(`%c${prefix}%c ${message}`, style, '');\n break;\n case 'warning':\n console.warn(`%c${prefix}%c ${message}`, style, '');\n break;\n case 'info':\n console.info(`%c${prefix}%c ${message}`, style, '');\n break;\n }\n\n if (warning.element) {\n console.log('Element:', warning.element);\n }\n}\n\n/**\n * Get console style for warning type\n */\nfunction getConsoleStyle(type: DevWarning['type']): string {\n switch (type) {\n case 'error':\n return 'background: #ff5555; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n case 'warning':\n return 'background: #ffaa00; color: black; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n case 'info':\n return 'background: #5555ff; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;';\n }\n}\n\n/**\n * Clear issued warnings (useful for testing)\n */\nexport function clearWarnings(): void {\n issuedWarnings.clear();\n}\n\n/**\n * Pre-built warning checks\n */\nexport const checks = {\n /**\n * Check for missing accessible label\n */\n accessibleLabel(\n element: HTMLElement | null,\n component: string,\n propName = 'aria-label'\n ): void {\n if (!element) return;\n\n if (!hasAccessibleName(element)) {\n warn({\n type: 'error',\n component,\n message: `Missing accessible label. Screen reader users will not be able to understand this element.`,\n suggestion: `Add ${propName}, aria-labelledby, or visible text content.`,\n element,\n });\n }\n },\n\n /**\n * Check for missing required prop\n */\n requiredProp(value: unknown, propName: string, component: string): void {\n if (value === undefined || value === null || value === '') {\n warn({\n type: 'error',\n component,\n message: `Missing required prop \"${propName}\".`,\n suggestion: `Provide a value for the \"${propName}\" prop.`,\n });\n }\n },\n\n /**\n * Check for invalid ARIA role\n */\n validRole(\n role: string | undefined,\n component: string,\n element?: HTMLElement\n ): void {\n if (!role) return;\n\n const validRoles = new Set([\n 'alert',\n 'alertdialog',\n 'application',\n 'article',\n 'banner',\n 'button',\n 'cell',\n 'columnheader',\n 'combobox',\n 'complementary',\n 'contentinfo',\n 'definition',\n 'dialog',\n 'directory',\n 'document',\n 'feed',\n 'figure',\n 'form',\n 'grid',\n 'gridcell',\n 'group',\n 'heading',\n 'img',\n 'link',\n 'list',\n 'listbox',\n 'listitem',\n 'log',\n 'main',\n 'marquee',\n 'math',\n 'menu',\n 'menubar',\n 'menuitem',\n 'navigation',\n 'none',\n 'note',\n 'option',\n 'presentation',\n 'progressbar',\n 'region',\n 'row',\n 'rowgroup',\n 'rowheader',\n 'scrollbar',\n 'search',\n 'searchbox',\n 'separator',\n 'slider',\n 'spinbutton',\n 'status',\n 'switch',\n 'tab',\n 'table',\n 'tablist',\n 'tabpanel',\n 'term',\n 'textbox',\n 'timer',\n 'toolbar',\n 'tooltip',\n 'tree',\n 'treegrid',\n 'treeitem',\n ]);\n\n if (!validRoles.has(role)) {\n warn({\n type: 'warning',\n component,\n message: `Invalid ARIA role \"${role}\".`,\n suggestion: 'Use a valid ARIA role from the WAI-ARIA specification.',\n element,\n });\n }\n },\n\n /**\n * Check for interactive element without keyboard support\n */\n keyboardAccessible(\n element: HTMLElement | null,\n component: string,\n handlers: { onClick?: unknown; onKeyDown?: unknown }\n ): void {\n if (!element) return;\n\n if (handlers.onClick && !handlers.onKeyDown) {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Native interactive elements are fine\n if (['button', 'a', 'input', 'select', 'textarea'].includes(tagName)) {\n return;\n }\n\n // Elements with interactive roles need keyboard handling\n const interactiveRoles = ['button', 'link', 'menuitem', 'option', 'tab'];\n if (role && interactiveRoles.includes(role)) {\n warn({\n type: 'warning',\n component,\n message: `Element has onClick but no onKeyDown handler.`,\n suggestion: 'Add keyboard event handling for Enter and Space keys.',\n element,\n });\n }\n }\n },\n\n /**\n * Check tabIndex usage\n */\n tabIndex(\n tabIndex: number | undefined,\n component: string,\n element?: HTMLElement\n ): void {\n if (tabIndex === undefined) return;\n\n if (tabIndex > 0) {\n warn({\n type: 'warning',\n component,\n message: `Positive tabIndex (${tabIndex}) disrupts natural tab order.`,\n suggestion:\n 'Use tabIndex={0} or tabIndex={-1} instead. Rely on DOM order for tab sequence.',\n element,\n });\n }\n },\n\n /**\n * Check for autofocus in dialogs\n */\n dialogAutoFocus(hasAutoFocus: boolean, component: string): void {\n if (!hasAutoFocus) {\n warn({\n type: 'info',\n component,\n message: 'No initial focus element specified for dialog.',\n suggestion: 'Consider setting initialFocus to guide keyboard users.',\n });\n }\n },\n\n /**\n * Check for missing form labels\n */\n formLabel(\n inputElement: HTMLElement | null,\n labelId: string | undefined,\n component: string\n ): void {\n if (!inputElement) return;\n\n const hasLabel =\n labelId ||\n inputElement.getAttribute('aria-label') ||\n inputElement.getAttribute('aria-labelledby') ||\n (inputElement as HTMLInputElement).labels?.length;\n\n if (!hasLabel) {\n warn({\n type: 'error',\n component,\n message: 'Form input is missing an accessible label.',\n suggestion: 'Add a <label>, aria-label, or aria-labelledby.',\n element: inputElement,\n });\n }\n },\n\n /**\n * Check for missing alt text on images\n */\n imageAlt(element: HTMLElement | null, component: string): void {\n if (!element || element.tagName !== 'IMG') return;\n\n const alt = element.getAttribute('alt');\n const role = element.getAttribute('role');\n\n if (alt === null && role !== 'presentation' && role !== 'none') {\n warn({\n type: 'error',\n component,\n message: 'Image is missing alt attribute.',\n suggestion:\n 'Add alt=\"\" for decorative images or descriptive alt text for meaningful images.',\n element,\n });\n }\n },\n};\n\n/**\n * Create a component-scoped warning function\n */\nexport function createComponentWarnings(componentName: string) {\n return {\n error: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'error',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n warning: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'warning',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n info: (message: string, suggestion?: string, element?: Element) =>\n warn({\n type: 'info',\n component: componentName,\n message,\n suggestion,\n element,\n }),\n checks: {\n accessibleLabel: (element: HTMLElement | null, propName?: string) =>\n checks.accessibleLabel(element, componentName, propName),\n requiredProp: (value: unknown, propName: string) =>\n checks.requiredProp(value, propName, componentName),\n keyboardAccessible: (\n element: HTMLElement | null,\n handlers: { onClick?: unknown; onKeyDown?: unknown }\n ) => checks.keyboardAccessible(element, componentName, handlers),\n tabIndex: (tabIndex: number | undefined, element?: HTMLElement) =>\n checks.tabIndex(tabIndex, componentName, element),\n },\n };\n}\n","/**\n * @compa11y/core\n *\n * Framework-agnostic accessibility primitives\n *\n * This package provides the foundational utilities used by all\n * compa11y packages (React, Web Components, etc.)\n */\n\n// Types\nexport * from './types';\n\n// Utilities\nexport * from './utils/id';\nexport * from './utils/dom';\nexport * from './utils/platform';\n\n// Focus Management\nexport * from './focus';\n\n// Keyboard Navigation\nexport * from './keyboard';\n\n// Screen Reader Announcements\nexport * from './announcer';\n\n// ARIA Utilities\nexport * from './aria';\n\n// Development Tools\nexport * from './dev';\n\n/**\n * Initialize all compa11y systems\n * Call this once at app startup for optimal behavior\n */\nexport function initCompa11y(): () => void {\n const cleanups: Array<() => void> = [];\n\n // Dynamic imports to support tree-shaking\n // These are safe because they're from this package\n import('./focus').then(({ initFocusVisible }) => {\n cleanups.push(initFocusVisible());\n });\n\n import('./announcer').then(({ initAnnouncer }) => {\n cleanups.push(initAnnouncer());\n });\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|