@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.
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/announcer/index.cjs +49 -0
- package/dist/announcer/index.cjs.map +1 -0
- package/dist/announcer/index.d.cts +61 -0
- package/dist/announcer/index.d.ts +61 -0
- package/dist/announcer/index.js +4 -0
- package/dist/announcer/index.js.map +1 -0
- package/dist/aria/index.cjs +24 -0
- package/dist/aria/index.cjs.map +1 -0
- package/dist/aria/index.d.cts +176 -0
- package/dist/aria/index.d.ts +176 -0
- package/dist/aria/index.js +3 -0
- package/dist/aria/index.js.map +1 -0
- package/dist/chunk-24U5HHMC.js +309 -0
- package/dist/chunk-24U5HHMC.js.map +1 -0
- package/dist/chunk-2CQOLVQH.js +147 -0
- package/dist/chunk-2CQOLVQH.js.map +1 -0
- package/dist/chunk-2PUYKF2E.js +631 -0
- package/dist/chunk-2PUYKF2E.js.map +1 -0
- package/dist/chunk-2WF5Y6D7.js +175 -0
- package/dist/chunk-2WF5Y6D7.js.map +1 -0
- package/dist/chunk-CQXMBRLD.cjs +657 -0
- package/dist/chunk-CQXMBRLD.cjs.map +1 -0
- package/dist/chunk-HQOFVJFO.cjs +181 -0
- package/dist/chunk-HQOFVJFO.cjs.map +1 -0
- package/dist/chunk-NBGFFCIJ.cjs +314 -0
- package/dist/chunk-NBGFFCIJ.cjs.map +1 -0
- package/dist/chunk-V6TZIZZ4.cjs +158 -0
- package/dist/chunk-V6TZIZZ4.cjs.map +1 -0
- package/dist/chunk-XEGB27QF.cjs +78 -0
- package/dist/chunk-XEGB27QF.cjs.map +1 -0
- package/dist/chunk-Z7K2G6FX.js +66 -0
- package/dist/chunk-Z7K2G6FX.js.map +1 -0
- package/dist/focus/index.cjs +53 -0
- package/dist/focus/index.cjs.map +1 -0
- package/dist/focus/index.d.cts +139 -0
- package/dist/focus/index.d.ts +139 -0
- package/dist/focus/index.js +4 -0
- package/dist/focus/index.js.map +1 -0
- package/dist/index.cjs +573 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +241 -0
- package/dist/index.d.ts +241 -0
- package/dist/index.js +343 -0
- package/dist/index.js.map +1 -0
- package/dist/keyboard/index.cjs +28 -0
- package/dist/keyboard/index.cjs.map +1 -0
- package/dist/keyboard/index.d.cts +102 -0
- package/dist/keyboard/index.d.ts +102 -0
- package/dist/keyboard/index.js +3 -0
- package/dist/keyboard/index.js.map +1 -0
- package/dist/types-DDSPmE8m.d.cts +52 -0
- package/dist/types-DDSPmE8m.d.ts +52 -0
- package/package.json +78 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkCQXMBRLD_cjs = require('./chunk-CQXMBRLD.cjs');
|
|
4
|
+
var chunkHQOFVJFO_cjs = require('./chunk-HQOFVJFO.cjs');
|
|
5
|
+
var chunkV6TZIZZ4_cjs = require('./chunk-V6TZIZZ4.cjs');
|
|
6
|
+
var chunkXEGB27QF_cjs = require('./chunk-XEGB27QF.cjs');
|
|
7
|
+
var chunkNBGFFCIJ_cjs = require('./chunk-NBGFFCIJ.cjs');
|
|
8
|
+
|
|
9
|
+
// src/utils/id.ts
|
|
10
|
+
var idCounter = 0;
|
|
11
|
+
var PREFIX = "compa11y";
|
|
12
|
+
function generateId(prefix) {
|
|
13
|
+
const id = ++idCounter;
|
|
14
|
+
return prefix ? `${PREFIX}-${prefix}-${id}` : `${PREFIX}-${id}`;
|
|
15
|
+
}
|
|
16
|
+
function generateIds(parts, prefix) {
|
|
17
|
+
const baseId = generateId(prefix);
|
|
18
|
+
const ids = {};
|
|
19
|
+
for (const part of parts) {
|
|
20
|
+
ids[part] = `${baseId}-${part}`;
|
|
21
|
+
}
|
|
22
|
+
return ids;
|
|
23
|
+
}
|
|
24
|
+
function resetIdCounter() {
|
|
25
|
+
idCounter = 0;
|
|
26
|
+
}
|
|
27
|
+
function createIdScope(componentName) {
|
|
28
|
+
const scopeId = generateId(componentName);
|
|
29
|
+
return {
|
|
30
|
+
id: scopeId,
|
|
31
|
+
generate: (suffix) => `${scopeId}-${suffix}`,
|
|
32
|
+
generateMultiple: (parts) => {
|
|
33
|
+
const ids = {};
|
|
34
|
+
for (const part of parts) {
|
|
35
|
+
ids[part] = `${scopeId}-${part}`;
|
|
36
|
+
}
|
|
37
|
+
return ids;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/dev/warnings.ts
|
|
43
|
+
var warningHandler = null;
|
|
44
|
+
var issuedWarnings = /* @__PURE__ */ new Set();
|
|
45
|
+
function isDev() {
|
|
46
|
+
return typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
|
|
47
|
+
}
|
|
48
|
+
function setWarningHandler(handler) {
|
|
49
|
+
warningHandler = handler;
|
|
50
|
+
}
|
|
51
|
+
function createWarningKey(warning) {
|
|
52
|
+
return `${warning.component}:${warning.message}`;
|
|
53
|
+
}
|
|
54
|
+
function warn(warning) {
|
|
55
|
+
if (!isDev()) return;
|
|
56
|
+
const key = createWarningKey(warning);
|
|
57
|
+
if (issuedWarnings.has(key)) return;
|
|
58
|
+
issuedWarnings.add(key);
|
|
59
|
+
if (warningHandler) {
|
|
60
|
+
warningHandler(warning);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const prefix = `[compa11y/${warning.component}]`;
|
|
64
|
+
const style = getConsoleStyle(warning.type);
|
|
65
|
+
const message = warning.suggestion ? `${warning.message}
|
|
66
|
+
|
|
67
|
+
\u{1F4A1} Suggestion: ${warning.suggestion}` : warning.message;
|
|
68
|
+
switch (warning.type) {
|
|
69
|
+
case "error":
|
|
70
|
+
console.error(`%c${prefix}%c ${message}`, style, "");
|
|
71
|
+
break;
|
|
72
|
+
case "warning":
|
|
73
|
+
console.warn(`%c${prefix}%c ${message}`, style, "");
|
|
74
|
+
break;
|
|
75
|
+
case "info":
|
|
76
|
+
console.info(`%c${prefix}%c ${message}`, style, "");
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
if (warning.element) {
|
|
80
|
+
console.log("Element:", warning.element);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function getConsoleStyle(type) {
|
|
84
|
+
switch (type) {
|
|
85
|
+
case "error":
|
|
86
|
+
return "background: #ff5555; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;";
|
|
87
|
+
case "warning":
|
|
88
|
+
return "background: #ffaa00; color: black; padding: 2px 4px; border-radius: 2px; font-weight: bold;";
|
|
89
|
+
case "info":
|
|
90
|
+
return "background: #5555ff; color: white; padding: 2px 4px; border-radius: 2px; font-weight: bold;";
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function clearWarnings() {
|
|
94
|
+
issuedWarnings.clear();
|
|
95
|
+
}
|
|
96
|
+
var checks = {
|
|
97
|
+
/**
|
|
98
|
+
* Check for missing accessible label
|
|
99
|
+
*/
|
|
100
|
+
accessibleLabel(element, component, propName = "aria-label") {
|
|
101
|
+
if (!element) return;
|
|
102
|
+
if (!chunkNBGFFCIJ_cjs.hasAccessibleName(element)) {
|
|
103
|
+
warn({
|
|
104
|
+
type: "error",
|
|
105
|
+
component,
|
|
106
|
+
message: `Missing accessible label. Screen reader users will not be able to understand this element.`,
|
|
107
|
+
suggestion: `Add ${propName}, aria-labelledby, or visible text content.`,
|
|
108
|
+
element
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
/**
|
|
113
|
+
* Check for missing required prop
|
|
114
|
+
*/
|
|
115
|
+
requiredProp(value, propName, component) {
|
|
116
|
+
if (value === void 0 || value === null || value === "") {
|
|
117
|
+
warn({
|
|
118
|
+
type: "error",
|
|
119
|
+
component,
|
|
120
|
+
message: `Missing required prop "${propName}".`,
|
|
121
|
+
suggestion: `Provide a value for the "${propName}" prop.`
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Check for invalid ARIA role
|
|
127
|
+
*/
|
|
128
|
+
validRole(role, component, element) {
|
|
129
|
+
if (!role) return;
|
|
130
|
+
const validRoles = /* @__PURE__ */ new Set([
|
|
131
|
+
"alert",
|
|
132
|
+
"alertdialog",
|
|
133
|
+
"application",
|
|
134
|
+
"article",
|
|
135
|
+
"banner",
|
|
136
|
+
"button",
|
|
137
|
+
"cell",
|
|
138
|
+
"checkbox",
|
|
139
|
+
"columnheader",
|
|
140
|
+
"combobox",
|
|
141
|
+
"complementary",
|
|
142
|
+
"contentinfo",
|
|
143
|
+
"definition",
|
|
144
|
+
"dialog",
|
|
145
|
+
"directory",
|
|
146
|
+
"document",
|
|
147
|
+
"feed",
|
|
148
|
+
"figure",
|
|
149
|
+
"form",
|
|
150
|
+
"grid",
|
|
151
|
+
"gridcell",
|
|
152
|
+
"group",
|
|
153
|
+
"heading",
|
|
154
|
+
"img",
|
|
155
|
+
"link",
|
|
156
|
+
"list",
|
|
157
|
+
"listbox",
|
|
158
|
+
"listitem",
|
|
159
|
+
"log",
|
|
160
|
+
"main",
|
|
161
|
+
"marquee",
|
|
162
|
+
"math",
|
|
163
|
+
"menu",
|
|
164
|
+
"menubar",
|
|
165
|
+
"menuitem",
|
|
166
|
+
"menuitemcheckbox",
|
|
167
|
+
"menuitemradio",
|
|
168
|
+
"navigation",
|
|
169
|
+
"none",
|
|
170
|
+
"note",
|
|
171
|
+
"option",
|
|
172
|
+
"presentation",
|
|
173
|
+
"progressbar",
|
|
174
|
+
"radio",
|
|
175
|
+
"radiogroup",
|
|
176
|
+
"region",
|
|
177
|
+
"row",
|
|
178
|
+
"rowgroup",
|
|
179
|
+
"rowheader",
|
|
180
|
+
"scrollbar",
|
|
181
|
+
"search",
|
|
182
|
+
"searchbox",
|
|
183
|
+
"separator",
|
|
184
|
+
"slider",
|
|
185
|
+
"spinbutton",
|
|
186
|
+
"status",
|
|
187
|
+
"switch",
|
|
188
|
+
"tab",
|
|
189
|
+
"table",
|
|
190
|
+
"tablist",
|
|
191
|
+
"tabpanel",
|
|
192
|
+
"term",
|
|
193
|
+
"textbox",
|
|
194
|
+
"timer",
|
|
195
|
+
"toolbar",
|
|
196
|
+
"tooltip",
|
|
197
|
+
"tree",
|
|
198
|
+
"treegrid",
|
|
199
|
+
"treeitem"
|
|
200
|
+
]);
|
|
201
|
+
if (!validRoles.has(role)) {
|
|
202
|
+
warn({
|
|
203
|
+
type: "warning",
|
|
204
|
+
component,
|
|
205
|
+
message: `Invalid ARIA role "${role}".`,
|
|
206
|
+
suggestion: "Use a valid ARIA role from the WAI-ARIA specification.",
|
|
207
|
+
element
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
/**
|
|
212
|
+
* Check for interactive element without keyboard support
|
|
213
|
+
*/
|
|
214
|
+
keyboardAccessible(element, component, handlers) {
|
|
215
|
+
if (!element) return;
|
|
216
|
+
if (handlers.onClick && !handlers.onKeyDown) {
|
|
217
|
+
const tagName = element.tagName.toLowerCase();
|
|
218
|
+
const role = element.getAttribute("role");
|
|
219
|
+
if (["button", "a", "input", "select", "textarea"].includes(tagName)) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const interactiveRoles = ["button", "link", "menuitem", "option", "tab"];
|
|
223
|
+
if (role && interactiveRoles.includes(role)) {
|
|
224
|
+
warn({
|
|
225
|
+
type: "warning",
|
|
226
|
+
component,
|
|
227
|
+
message: `Element has onClick but no onKeyDown handler.`,
|
|
228
|
+
suggestion: "Add keyboard event handling for Enter and Space keys.",
|
|
229
|
+
element
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
/**
|
|
235
|
+
* Check tabIndex usage
|
|
236
|
+
*/
|
|
237
|
+
tabIndex(tabIndex, component, element) {
|
|
238
|
+
if (tabIndex === void 0) return;
|
|
239
|
+
if (tabIndex > 0) {
|
|
240
|
+
warn({
|
|
241
|
+
type: "warning",
|
|
242
|
+
component,
|
|
243
|
+
message: `Positive tabIndex (${tabIndex}) disrupts natural tab order.`,
|
|
244
|
+
suggestion: "Use tabIndex={0} or tabIndex={-1} instead. Rely on DOM order for tab sequence.",
|
|
245
|
+
element
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
/**
|
|
250
|
+
* Check for autofocus in dialogs
|
|
251
|
+
*/
|
|
252
|
+
dialogAutoFocus(hasAutoFocus, component) {
|
|
253
|
+
if (!hasAutoFocus) {
|
|
254
|
+
warn({
|
|
255
|
+
type: "info",
|
|
256
|
+
component,
|
|
257
|
+
message: "No initial focus element specified for dialog.",
|
|
258
|
+
suggestion: "Consider setting initialFocus to guide keyboard users."
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
/**
|
|
263
|
+
* Check for missing form labels
|
|
264
|
+
*/
|
|
265
|
+
formLabel(inputElement, labelId, component) {
|
|
266
|
+
if (!inputElement) return;
|
|
267
|
+
const hasLabel = labelId || inputElement.getAttribute("aria-label") || inputElement.getAttribute("aria-labelledby") || inputElement.labels?.length;
|
|
268
|
+
if (!hasLabel) {
|
|
269
|
+
warn({
|
|
270
|
+
type: "error",
|
|
271
|
+
component,
|
|
272
|
+
message: "Form input is missing an accessible label.",
|
|
273
|
+
suggestion: "Add a <label>, aria-label, or aria-labelledby.",
|
|
274
|
+
element: inputElement
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
/**
|
|
279
|
+
* Check for missing alt text on images
|
|
280
|
+
*/
|
|
281
|
+
imageAlt(element, component) {
|
|
282
|
+
if (!element || element.tagName !== "IMG") return;
|
|
283
|
+
const alt = element.getAttribute("alt");
|
|
284
|
+
const role = element.getAttribute("role");
|
|
285
|
+
if (alt === null && role !== "presentation" && role !== "none") {
|
|
286
|
+
warn({
|
|
287
|
+
type: "error",
|
|
288
|
+
component,
|
|
289
|
+
message: "Image is missing alt attribute.",
|
|
290
|
+
suggestion: 'Add alt="" for decorative images or descriptive alt text for meaningful images.',
|
|
291
|
+
element
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
function createComponentWarnings(componentName) {
|
|
297
|
+
return {
|
|
298
|
+
error: (message, suggestion, element) => warn({
|
|
299
|
+
type: "error",
|
|
300
|
+
component: componentName,
|
|
301
|
+
message,
|
|
302
|
+
suggestion,
|
|
303
|
+
element
|
|
304
|
+
}),
|
|
305
|
+
warning: (message, suggestion, element) => warn({
|
|
306
|
+
type: "warning",
|
|
307
|
+
component: componentName,
|
|
308
|
+
message,
|
|
309
|
+
suggestion,
|
|
310
|
+
element
|
|
311
|
+
}),
|
|
312
|
+
info: (message, suggestion, element) => warn({
|
|
313
|
+
type: "info",
|
|
314
|
+
component: componentName,
|
|
315
|
+
message,
|
|
316
|
+
suggestion,
|
|
317
|
+
element
|
|
318
|
+
}),
|
|
319
|
+
checks: {
|
|
320
|
+
accessibleLabel: (element, propName) => checks.accessibleLabel(element, componentName, propName),
|
|
321
|
+
requiredProp: (value, propName) => checks.requiredProp(value, propName, componentName),
|
|
322
|
+
keyboardAccessible: (element, handlers) => checks.keyboardAccessible(element, componentName, handlers),
|
|
323
|
+
tabIndex: (tabIndex, element) => checks.tabIndex(tabIndex, componentName, element)
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// src/index.ts
|
|
329
|
+
function initA11yKit() {
|
|
330
|
+
const cleanups = [];
|
|
331
|
+
import('./focus/index.cjs').then(({ initFocusVisible: initFocusVisible2 }) => {
|
|
332
|
+
cleanups.push(initFocusVisible2());
|
|
333
|
+
});
|
|
334
|
+
import('./announcer/index.cjs').then(({ initAnnouncer: initAnnouncer2 }) => {
|
|
335
|
+
cleanups.push(initAnnouncer2());
|
|
336
|
+
});
|
|
337
|
+
return () => {
|
|
338
|
+
cleanups.forEach((cleanup) => cleanup());
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
Object.defineProperty(exports, "FOCUSABLE_SELECTORS", {
|
|
343
|
+
enumerable: true,
|
|
344
|
+
get: function () { return chunkCQXMBRLD_cjs.FOCUSABLE_SELECTORS; }
|
|
345
|
+
});
|
|
346
|
+
Object.defineProperty(exports, "TABBABLE_SELECTORS", {
|
|
347
|
+
enumerable: true,
|
|
348
|
+
get: function () { return chunkCQXMBRLD_cjs.TABBABLE_SELECTORS; }
|
|
349
|
+
});
|
|
350
|
+
Object.defineProperty(exports, "containsFocus", {
|
|
351
|
+
enumerable: true,
|
|
352
|
+
get: function () { return chunkCQXMBRLD_cjs.containsFocus; }
|
|
353
|
+
});
|
|
354
|
+
Object.defineProperty(exports, "createFocusScope", {
|
|
355
|
+
enumerable: true,
|
|
356
|
+
get: function () { return chunkCQXMBRLD_cjs.createFocusScope; }
|
|
357
|
+
});
|
|
358
|
+
Object.defineProperty(exports, "createFocusTrap", {
|
|
359
|
+
enumerable: true,
|
|
360
|
+
get: function () { return chunkCQXMBRLD_cjs.createFocusTrap; }
|
|
361
|
+
});
|
|
362
|
+
Object.defineProperty(exports, "createRovingTabindex", {
|
|
363
|
+
enumerable: true,
|
|
364
|
+
get: function () { return chunkCQXMBRLD_cjs.createRovingTabindex; }
|
|
365
|
+
});
|
|
366
|
+
Object.defineProperty(exports, "focusWithVisibleRing", {
|
|
367
|
+
enumerable: true,
|
|
368
|
+
get: function () { return chunkCQXMBRLD_cjs.focusWithVisibleRing; }
|
|
369
|
+
});
|
|
370
|
+
Object.defineProperty(exports, "getActiveFocusTrap", {
|
|
371
|
+
enumerable: true,
|
|
372
|
+
get: function () { return chunkCQXMBRLD_cjs.getActiveFocusTrap; }
|
|
373
|
+
});
|
|
374
|
+
Object.defineProperty(exports, "getFirstFocusable", {
|
|
375
|
+
enumerable: true,
|
|
376
|
+
get: function () { return chunkCQXMBRLD_cjs.getFirstFocusable; }
|
|
377
|
+
});
|
|
378
|
+
Object.defineProperty(exports, "getFocusableElements", {
|
|
379
|
+
enumerable: true,
|
|
380
|
+
get: function () { return chunkCQXMBRLD_cjs.getFocusableElements; }
|
|
381
|
+
});
|
|
382
|
+
Object.defineProperty(exports, "getLastFocusSource", {
|
|
383
|
+
enumerable: true,
|
|
384
|
+
get: function () { return chunkCQXMBRLD_cjs.getLastFocusSource; }
|
|
385
|
+
});
|
|
386
|
+
Object.defineProperty(exports, "getLastFocusable", {
|
|
387
|
+
enumerable: true,
|
|
388
|
+
get: function () { return chunkCQXMBRLD_cjs.getLastFocusable; }
|
|
389
|
+
});
|
|
390
|
+
Object.defineProperty(exports, "getNextFocusable", {
|
|
391
|
+
enumerable: true,
|
|
392
|
+
get: function () { return chunkCQXMBRLD_cjs.getNextFocusable; }
|
|
393
|
+
});
|
|
394
|
+
Object.defineProperty(exports, "getPreviousFocusable", {
|
|
395
|
+
enumerable: true,
|
|
396
|
+
get: function () { return chunkCQXMBRLD_cjs.getPreviousFocusable; }
|
|
397
|
+
});
|
|
398
|
+
Object.defineProperty(exports, "getTabbableElements", {
|
|
399
|
+
enumerable: true,
|
|
400
|
+
get: function () { return chunkCQXMBRLD_cjs.getTabbableElements; }
|
|
401
|
+
});
|
|
402
|
+
Object.defineProperty(exports, "hasFocusTrap", {
|
|
403
|
+
enumerable: true,
|
|
404
|
+
get: function () { return chunkCQXMBRLD_cjs.hasFocusTrap; }
|
|
405
|
+
});
|
|
406
|
+
Object.defineProperty(exports, "hasVisibleFocus", {
|
|
407
|
+
enumerable: true,
|
|
408
|
+
get: function () { return chunkCQXMBRLD_cjs.hasVisibleFocus; }
|
|
409
|
+
});
|
|
410
|
+
Object.defineProperty(exports, "initFocusVisible", {
|
|
411
|
+
enumerable: true,
|
|
412
|
+
get: function () { return chunkCQXMBRLD_cjs.initFocusVisible; }
|
|
413
|
+
});
|
|
414
|
+
Object.defineProperty(exports, "isFocusVisible", {
|
|
415
|
+
enumerable: true,
|
|
416
|
+
get: function () { return chunkCQXMBRLD_cjs.isFocusVisible; }
|
|
417
|
+
});
|
|
418
|
+
Object.defineProperty(exports, "isFocusable", {
|
|
419
|
+
enumerable: true,
|
|
420
|
+
get: function () { return chunkCQXMBRLD_cjs.isFocusable; }
|
|
421
|
+
});
|
|
422
|
+
Object.defineProperty(exports, "isTabbable", {
|
|
423
|
+
enumerable: true,
|
|
424
|
+
get: function () { return chunkCQXMBRLD_cjs.isTabbable; }
|
|
425
|
+
});
|
|
426
|
+
Object.defineProperty(exports, "isVisible", {
|
|
427
|
+
enumerable: true,
|
|
428
|
+
get: function () { return chunkCQXMBRLD_cjs.isVisible; }
|
|
429
|
+
});
|
|
430
|
+
Object.defineProperty(exports, "isWithinContainer", {
|
|
431
|
+
enumerable: true,
|
|
432
|
+
get: function () { return chunkCQXMBRLD_cjs.isWithinContainer; }
|
|
433
|
+
});
|
|
434
|
+
Object.defineProperty(exports, "resolveElement", {
|
|
435
|
+
enumerable: true,
|
|
436
|
+
get: function () { return chunkCQXMBRLD_cjs.resolveElement; }
|
|
437
|
+
});
|
|
438
|
+
Object.defineProperty(exports, "setFocusVisible", {
|
|
439
|
+
enumerable: true,
|
|
440
|
+
get: function () { return chunkCQXMBRLD_cjs.setFocusVisible; }
|
|
441
|
+
});
|
|
442
|
+
Object.defineProperty(exports, "KeyboardPatterns", {
|
|
443
|
+
enumerable: true,
|
|
444
|
+
get: function () { return chunkHQOFVJFO_cjs.KeyboardPatterns; }
|
|
445
|
+
});
|
|
446
|
+
Object.defineProperty(exports, "createKeyboardManager", {
|
|
447
|
+
enumerable: true,
|
|
448
|
+
get: function () { return chunkHQOFVJFO_cjs.createKeyboardManager; }
|
|
449
|
+
});
|
|
450
|
+
Object.defineProperty(exports, "createTypeAhead", {
|
|
451
|
+
enumerable: true,
|
|
452
|
+
get: function () { return chunkHQOFVJFO_cjs.createTypeAhead; }
|
|
453
|
+
});
|
|
454
|
+
Object.defineProperty(exports, "getKeyCombo", {
|
|
455
|
+
enumerable: true,
|
|
456
|
+
get: function () { return chunkHQOFVJFO_cjs.getKeyCombo; }
|
|
457
|
+
});
|
|
458
|
+
Object.defineProperty(exports, "normalizeKey", {
|
|
459
|
+
enumerable: true,
|
|
460
|
+
get: function () { return chunkHQOFVJFO_cjs.normalizeKey; }
|
|
461
|
+
});
|
|
462
|
+
Object.defineProperty(exports, "announce", {
|
|
463
|
+
enumerable: true,
|
|
464
|
+
get: function () { return chunkV6TZIZZ4_cjs.announce; }
|
|
465
|
+
});
|
|
466
|
+
Object.defineProperty(exports, "announceAssertive", {
|
|
467
|
+
enumerable: true,
|
|
468
|
+
get: function () { return chunkV6TZIZZ4_cjs.announceAssertive; }
|
|
469
|
+
});
|
|
470
|
+
Object.defineProperty(exports, "announceError", {
|
|
471
|
+
enumerable: true,
|
|
472
|
+
get: function () { return chunkV6TZIZZ4_cjs.announceError; }
|
|
473
|
+
});
|
|
474
|
+
Object.defineProperty(exports, "announcePolite", {
|
|
475
|
+
enumerable: true,
|
|
476
|
+
get: function () { return chunkV6TZIZZ4_cjs.announcePolite; }
|
|
477
|
+
});
|
|
478
|
+
Object.defineProperty(exports, "announceProgress", {
|
|
479
|
+
enumerable: true,
|
|
480
|
+
get: function () { return chunkV6TZIZZ4_cjs.announceProgress; }
|
|
481
|
+
});
|
|
482
|
+
Object.defineProperty(exports, "announceStatus", {
|
|
483
|
+
enumerable: true,
|
|
484
|
+
get: function () { return chunkV6TZIZZ4_cjs.announceStatus; }
|
|
485
|
+
});
|
|
486
|
+
Object.defineProperty(exports, "clearAnnouncements", {
|
|
487
|
+
enumerable: true,
|
|
488
|
+
get: function () { return chunkV6TZIZZ4_cjs.clearAnnouncements; }
|
|
489
|
+
});
|
|
490
|
+
Object.defineProperty(exports, "createAnnouncer", {
|
|
491
|
+
enumerable: true,
|
|
492
|
+
get: function () { return chunkV6TZIZZ4_cjs.createAnnouncer; }
|
|
493
|
+
});
|
|
494
|
+
Object.defineProperty(exports, "initAnnouncer", {
|
|
495
|
+
enumerable: true,
|
|
496
|
+
get: function () { return chunkV6TZIZZ4_cjs.initAnnouncer; }
|
|
497
|
+
});
|
|
498
|
+
Object.defineProperty(exports, "queueAnnouncement", {
|
|
499
|
+
enumerable: true,
|
|
500
|
+
get: function () { return chunkV6TZIZZ4_cjs.queueAnnouncement; }
|
|
501
|
+
});
|
|
502
|
+
Object.defineProperty(exports, "createMediaQueryListener", {
|
|
503
|
+
enumerable: true,
|
|
504
|
+
get: function () { return chunkXEGB27QF_cjs.createMediaQueryListener; }
|
|
505
|
+
});
|
|
506
|
+
Object.defineProperty(exports, "getScreenReaderHints", {
|
|
507
|
+
enumerable: true,
|
|
508
|
+
get: function () { return chunkXEGB27QF_cjs.getScreenReaderHints; }
|
|
509
|
+
});
|
|
510
|
+
Object.defineProperty(exports, "isAndroid", {
|
|
511
|
+
enumerable: true,
|
|
512
|
+
get: function () { return chunkXEGB27QF_cjs.isAndroid; }
|
|
513
|
+
});
|
|
514
|
+
Object.defineProperty(exports, "isBrowser", {
|
|
515
|
+
enumerable: true,
|
|
516
|
+
get: function () { return chunkXEGB27QF_cjs.isBrowser; }
|
|
517
|
+
});
|
|
518
|
+
Object.defineProperty(exports, "isIOS", {
|
|
519
|
+
enumerable: true,
|
|
520
|
+
get: function () { return chunkXEGB27QF_cjs.isIOS; }
|
|
521
|
+
});
|
|
522
|
+
Object.defineProperty(exports, "isMac", {
|
|
523
|
+
enumerable: true,
|
|
524
|
+
get: function () { return chunkXEGB27QF_cjs.isMac; }
|
|
525
|
+
});
|
|
526
|
+
Object.defineProperty(exports, "isTouchDevice", {
|
|
527
|
+
enumerable: true,
|
|
528
|
+
get: function () { return chunkXEGB27QF_cjs.isTouchDevice; }
|
|
529
|
+
});
|
|
530
|
+
Object.defineProperty(exports, "isWindows", {
|
|
531
|
+
enumerable: true,
|
|
532
|
+
get: function () { return chunkXEGB27QF_cjs.isWindows; }
|
|
533
|
+
});
|
|
534
|
+
Object.defineProperty(exports, "prefersDarkMode", {
|
|
535
|
+
enumerable: true,
|
|
536
|
+
get: function () { return chunkXEGB27QF_cjs.prefersDarkMode; }
|
|
537
|
+
});
|
|
538
|
+
Object.defineProperty(exports, "prefersHighContrast", {
|
|
539
|
+
enumerable: true,
|
|
540
|
+
get: function () { return chunkXEGB27QF_cjs.prefersHighContrast; }
|
|
541
|
+
});
|
|
542
|
+
Object.defineProperty(exports, "prefersReducedMotion", {
|
|
543
|
+
enumerable: true,
|
|
544
|
+
get: function () { return chunkXEGB27QF_cjs.prefersReducedMotion; }
|
|
545
|
+
});
|
|
546
|
+
Object.defineProperty(exports, "aria", {
|
|
547
|
+
enumerable: true,
|
|
548
|
+
get: function () { return chunkNBGFFCIJ_cjs.aria; }
|
|
549
|
+
});
|
|
550
|
+
Object.defineProperty(exports, "buildAriaProps", {
|
|
551
|
+
enumerable: true,
|
|
552
|
+
get: function () { return chunkNBGFFCIJ_cjs.buildAriaProps; }
|
|
553
|
+
});
|
|
554
|
+
Object.defineProperty(exports, "hasAccessibleName", {
|
|
555
|
+
enumerable: true,
|
|
556
|
+
get: function () { return chunkNBGFFCIJ_cjs.hasAccessibleName; }
|
|
557
|
+
});
|
|
558
|
+
Object.defineProperty(exports, "mergeAriaIds", {
|
|
559
|
+
enumerable: true,
|
|
560
|
+
get: function () { return chunkNBGFFCIJ_cjs.mergeAriaIds; }
|
|
561
|
+
});
|
|
562
|
+
exports.checks = checks;
|
|
563
|
+
exports.clearWarnings = clearWarnings;
|
|
564
|
+
exports.createComponentWarnings = createComponentWarnings;
|
|
565
|
+
exports.createIdScope = createIdScope;
|
|
566
|
+
exports.generateId = generateId;
|
|
567
|
+
exports.generateIds = generateIds;
|
|
568
|
+
exports.initA11yKit = initA11yKit;
|
|
569
|
+
exports.resetIdCounter = resetIdCounter;
|
|
570
|
+
exports.setWarningHandler = setWarningHandler;
|
|
571
|
+
exports.warn = warn;
|
|
572
|
+
//# sourceMappingURL=index.cjs.map
|
|
573
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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 'checkbox',\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 'menuitemcheckbox',\n 'menuitemradio',\n 'navigation',\n 'none',\n 'note',\n 'option',\n 'presentation',\n 'progressbar',\n 'radio',\n 'radiogroup',\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 initA11yKit(): () => 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"]}
|