html-standard 0.0.7 → 0.0.8
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/README.md +43 -21
- package/dist/index.cjs +100 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -5
- package/dist/index.d.ts +58 -5
- package/dist/index.js +98 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,37 +6,59 @@ A TypeScript library that provides utilities for working with the HTML Living St
|
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
###
|
|
9
|
+
### Element API
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Create an element instance to access various HTML standard utilities:
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
// Basic usage
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
import { element } from "html-standard";
|
|
15
|
+
|
|
16
|
+
// Basic usage without attributes
|
|
17
|
+
const button = element("button");
|
|
18
|
+
button.accessibility.implicitRole(); // 'button'
|
|
19
|
+
|
|
20
|
+
const nav = element("nav");
|
|
21
|
+
nav.accessibility.implicitRole(); // 'navigation'
|
|
22
|
+
|
|
23
|
+
// Elements with attributes
|
|
24
|
+
const anchor = element("a", {
|
|
25
|
+
attributes: {
|
|
26
|
+
get: (key) => (key === "href" ? "https://example.com" : null),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
anchor.accessibility.implicitRole(); // 'link'
|
|
30
|
+
|
|
31
|
+
const anchorWithoutHref = element("a");
|
|
32
|
+
anchorWithoutHref.accessibility.implicitRole(); // 'generic'
|
|
33
|
+
|
|
34
|
+
const checkbox = element("input", {
|
|
35
|
+
attributes: {
|
|
36
|
+
get: (key) => (key === "type" ? "checkbox" : null),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
checkbox.accessibility.implicitRole(); // 'checkbox'
|
|
40
|
+
```
|
|
20
41
|
|
|
21
|
-
|
|
22
|
-
getImplicitRole("a", {
|
|
23
|
-
attribute: (key) => (key === "href" ? "https://example.com" : null),
|
|
24
|
-
}); // 'link'
|
|
42
|
+
### Accessibility API
|
|
25
43
|
|
|
26
|
-
|
|
27
|
-
attribute: () => null,
|
|
28
|
-
}); // 'generic' (without href)
|
|
44
|
+
Access accessibility utilities directly:
|
|
29
45
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
46
|
+
```typescript
|
|
47
|
+
import { accessibility } from "html-standard";
|
|
48
|
+
|
|
49
|
+
const buttonA11y = accessibility("button", {
|
|
50
|
+
attributes: {
|
|
51
|
+
get: () => null,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
buttonA11y.implicitRole(); // 'button'
|
|
33
55
|
```
|
|
34
56
|
|
|
35
57
|
**Key Features:**
|
|
36
58
|
|
|
37
|
-
-
|
|
38
|
-
- Supports
|
|
39
|
-
- Case-
|
|
59
|
+
- **Implicit ARIA Roles**: Get the default ARIA role for HTML elements according to the [HTML-ARIA specification](https://www.w3.org/TR/html-aria/)
|
|
60
|
+
- **Attribute-Dependent Roles**: Supports roles that vary based on element attributes (e.g., `<a>`, `<input>`, `<img>`, `<select>`)
|
|
61
|
+
- **Case-Insensitive**: Element names are handled case-insensitively
|
|
40
62
|
|
|
41
63
|
## Installation
|
|
42
64
|
|
package/dist/index.cjs
CHANGED
|
@@ -20,10 +20,64 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
|
|
23
|
+
accessibility: () => accessibility,
|
|
24
|
+
element: () => element
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(index_exports);
|
|
26
27
|
|
|
28
|
+
// src/constants/defaults.ts
|
|
29
|
+
var DEFAULT_ATTRIBUTES_OPTIONS = {
|
|
30
|
+
get(_) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var DEFAULT_ELEMENT_OPTIONS = {
|
|
35
|
+
attributes: {
|
|
36
|
+
get(_) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/core/attribute-state.ts
|
|
43
|
+
var AttributeState = class {
|
|
44
|
+
constructor(options = DEFAULT_ATTRIBUTES_OPTIONS) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
}
|
|
47
|
+
get(key) {
|
|
48
|
+
return this.options.get(key);
|
|
49
|
+
}
|
|
50
|
+
has(key) {
|
|
51
|
+
return this.options.get(key) !== null;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/core/element-state.ts
|
|
56
|
+
var ElementState = class _ElementState {
|
|
57
|
+
constructor(name, options) {
|
|
58
|
+
this.options = options;
|
|
59
|
+
this.name = name.toLowerCase();
|
|
60
|
+
}
|
|
61
|
+
get attributes() {
|
|
62
|
+
return new AttributeState(this.options.attributes);
|
|
63
|
+
}
|
|
64
|
+
parent() {
|
|
65
|
+
if (!this.options.ancestors) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const iterator = this.options.ancestors()[Symbol.iterator]();
|
|
69
|
+
const first = iterator.next();
|
|
70
|
+
if (first.done || !first.value) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return new _ElementState(first.value.name, first.value);
|
|
74
|
+
}
|
|
75
|
+
anceters() {
|
|
76
|
+
var _a, _b;
|
|
77
|
+
return ((_b = (_a = this.options).ancestors) == null ? void 0 : _b.call(_a)) || [];
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
27
81
|
// src/constants/roles.ts
|
|
28
82
|
var ROLES = {
|
|
29
83
|
ARTICLE: "article",
|
|
@@ -35,6 +89,7 @@ var ROLES = {
|
|
|
35
89
|
CODE: "code",
|
|
36
90
|
COMBOBOX: "combobox",
|
|
37
91
|
COMPLEMENTARY: "complementary",
|
|
92
|
+
CONTENTINFO: "contentinfo",
|
|
38
93
|
DELETION: "deletion",
|
|
39
94
|
DIALOG: "dialog",
|
|
40
95
|
DOCUMENT: "document",
|
|
@@ -71,12 +126,12 @@ var ROLES = {
|
|
|
71
126
|
TIME: "time"
|
|
72
127
|
};
|
|
73
128
|
|
|
74
|
-
// src/
|
|
129
|
+
// src/accessibility/implicit-role/implicit-role.ts
|
|
75
130
|
var IMPLICIT_ROLE = {
|
|
76
|
-
a: (
|
|
131
|
+
a: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
|
|
77
132
|
abbr: () => null,
|
|
78
133
|
address: () => ROLES.GROUP,
|
|
79
|
-
area: (
|
|
134
|
+
area: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
|
|
80
135
|
article: () => ROLES.ARTICLE,
|
|
81
136
|
aside: () => ROLES.COMPLEMENTARY,
|
|
82
137
|
audio: () => null,
|
|
@@ -109,7 +164,15 @@ var IMPLICIT_ROLE = {
|
|
|
109
164
|
fieldset: () => ROLES.GROUP,
|
|
110
165
|
figcaption: () => null,
|
|
111
166
|
figure: () => ROLES.FIGURE,
|
|
112
|
-
footer: () =>
|
|
167
|
+
footer: (element2) => {
|
|
168
|
+
const sectioningElements = ["article", "aside", "main", "nav", "section"];
|
|
169
|
+
for (const ancestor of element2.anceters()) {
|
|
170
|
+
if (sectioningElements.includes(ancestor.name.toLowerCase())) {
|
|
171
|
+
return ROLES.GENERIC;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return ROLES.CONTENTINFO;
|
|
175
|
+
},
|
|
113
176
|
form: () => ROLES.FORM,
|
|
114
177
|
h1: () => ROLES.HEADING,
|
|
115
178
|
h2: () => ROLES.HEADING,
|
|
@@ -119,18 +182,19 @@ var IMPLICIT_ROLE = {
|
|
|
119
182
|
h6: () => ROLES.HEADING,
|
|
120
183
|
head: () => null,
|
|
121
184
|
header: () => null,
|
|
185
|
+
// TODO: banner if not descendant of article/aside/main/nav/section, otherwise generic
|
|
122
186
|
hgroup: () => ROLES.GROUP,
|
|
123
187
|
hr: () => ROLES.SEPARATOR,
|
|
124
188
|
html: () => ROLES.DOCUMENT,
|
|
125
189
|
i: () => ROLES.GENERIC,
|
|
126
190
|
iframe: () => null,
|
|
127
|
-
img: (
|
|
128
|
-
const alt = get("alt");
|
|
191
|
+
img: (element2) => {
|
|
192
|
+
const alt = element2.attributes.get("alt");
|
|
129
193
|
if (alt === "") return null;
|
|
130
194
|
return ROLES.IMG;
|
|
131
195
|
},
|
|
132
|
-
input: (
|
|
133
|
-
const type = get("type") || "text";
|
|
196
|
+
input: (element2) => {
|
|
197
|
+
const type = element2.attributes.get("type") || "text";
|
|
134
198
|
switch (type) {
|
|
135
199
|
case "button":
|
|
136
200
|
case "image":
|
|
@@ -171,6 +235,7 @@ var IMPLICIT_ROLE = {
|
|
|
171
235
|
label: () => null,
|
|
172
236
|
legend: () => null,
|
|
173
237
|
li: () => null,
|
|
238
|
+
// TODO: listitem if child of ol/ul/menu, otherwise generic
|
|
174
239
|
link: () => null,
|
|
175
240
|
main: () => ROLES.MAIN,
|
|
176
241
|
map: () => null,
|
|
@@ -199,7 +264,7 @@ var IMPLICIT_ROLE = {
|
|
|
199
264
|
script: () => null,
|
|
200
265
|
search: () => ROLES.SEARCH,
|
|
201
266
|
section: () => null,
|
|
202
|
-
select: (
|
|
267
|
+
select: (element2) => element2.attributes.has("multiple") ? ROLES.LISTBOX : ROLES.COMBOBOX,
|
|
203
268
|
slot: () => null,
|
|
204
269
|
small: () => ROLES.GENERIC,
|
|
205
270
|
span: () => ROLES.GENERIC,
|
|
@@ -227,26 +292,37 @@ var IMPLICIT_ROLE = {
|
|
|
227
292
|
video: () => null,
|
|
228
293
|
wbr: () => null
|
|
229
294
|
};
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
295
|
+
|
|
296
|
+
// src/accessibility/accessibility.ts
|
|
297
|
+
var Accessibility = class {
|
|
298
|
+
constructor(element2) {
|
|
299
|
+
this.element = element2;
|
|
300
|
+
}
|
|
301
|
+
implicitRole() {
|
|
302
|
+
var _a, _b, _c;
|
|
303
|
+
return (_c = (_b = (_a = IMPLICIT_ROLE)[this.element.name.toLowerCase()]) == null ? void 0 : _b.call(_a, this.element)) != null ? _c : null;
|
|
234
304
|
}
|
|
235
|
-
return getRoleFn({
|
|
236
|
-
get: (key) => attribute(key),
|
|
237
|
-
has: (key) => attribute(key) !== null
|
|
238
|
-
});
|
|
239
305
|
};
|
|
306
|
+
function accessibility(name, options) {
|
|
307
|
+
return new Accessibility(new ElementState(name, options));
|
|
308
|
+
}
|
|
240
309
|
|
|
241
|
-
// src/
|
|
242
|
-
var
|
|
243
|
-
|
|
310
|
+
// src/element.ts
|
|
311
|
+
var Element = class {
|
|
312
|
+
constructor(name, options) {
|
|
313
|
+
this.name = name;
|
|
314
|
+
this.options = options;
|
|
315
|
+
}
|
|
316
|
+
get accessibility() {
|
|
317
|
+
return accessibility(this.name, this.options);
|
|
318
|
+
}
|
|
244
319
|
};
|
|
245
|
-
function
|
|
246
|
-
return
|
|
320
|
+
function element(name, options = DEFAULT_ELEMENT_OPTIONS) {
|
|
321
|
+
return new Element(name, options);
|
|
247
322
|
}
|
|
248
323
|
// Annotate the CommonJS export names for ESM import in node:
|
|
249
324
|
0 && (module.exports = {
|
|
250
|
-
|
|
325
|
+
accessibility,
|
|
326
|
+
element
|
|
251
327
|
});
|
|
252
328
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants/roles.ts","../src/html-aria/implicit-role/implicit-role.ts","../src/html-aria/implicit-role/get-implicit-role.ts"],"sourcesContent":["export * from \"./html-aria/implicit-role\";\n","// ARIA roles used in implicit role mapping\nexport const ROLES = {\n ARTICLE: \"article\",\n BLOCKQUOTE: \"blockquote\",\n BUTTON: \"button\",\n CAPTION: \"caption\",\n CELL: \"cell\",\n CHECKBOX: \"checkbox\",\n CODE: \"code\",\n COMBOBOX: \"combobox\",\n COMPLEMENTARY: \"complementary\",\n DELETION: \"deletion\",\n DIALOG: \"dialog\",\n DOCUMENT: \"document\",\n EMPHASIS: \"emphasis\",\n FIGURE: \"figure\",\n FORM: \"form\",\n GENERIC: \"generic\",\n GROUP: \"group\",\n HEADING: \"heading\",\n IMG: \"img\",\n INSERTION: \"insertion\",\n LINK: \"link\",\n LIST: \"list\",\n LISTBOX: \"listbox\",\n MAIN: \"main\",\n METER: \"meter\",\n NAVIGATION: \"navigation\",\n OPTION: \"option\",\n PARAGRAPH: \"paragraph\",\n PROGRESSBAR: \"progressbar\",\n RADIO: \"radio\",\n ROW: \"row\",\n ROWGROUP: \"rowgroup\",\n SEARCH: \"search\",\n SEARCHBOX: \"searchbox\",\n SEPARATOR: \"separator\",\n SLIDER: \"slider\",\n SPINBUTTON: \"spinbutton\",\n STATUS: \"status\",\n STRONG: \"strong\",\n TABLE: \"table\",\n TERM: \"term\",\n TEXTBOX: \"textbox\",\n TIME: \"time\",\n} as const;\n","import { GetAttributeValue } from \"./types\";\nimport { ROLES } from \"../../constants/roles\";\n\n/**\n * https://www.w3.org/TR/html-aria/?utm_source=chatgpt.com#docconformance\n */\n\nconst IMPLICIT_ROLE: Record<\n string,\n (args: {\n get: (key: string) => string | number | null;\n has: (key: string) => boolean;\n }) => string | null\n> = {\n a: ({ has }) => (has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n abbr: () => null,\n address: () => ROLES.GROUP,\n area: ({ has }) => (has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n article: () => ROLES.ARTICLE,\n aside: () => ROLES.COMPLEMENTARY,\n audio: () => null,\n b: () => ROLES.GENERIC,\n base: () => null,\n bdi: () => ROLES.GENERIC,\n bdo: () => ROLES.GENERIC,\n blockquote: () => ROLES.BLOCKQUOTE,\n body: () => ROLES.GENERIC,\n br: () => null,\n button: () => ROLES.BUTTON,\n canvas: () => null,\n caption: () => ROLES.CAPTION,\n cite: () => null,\n code: () => ROLES.CODE,\n col: () => null,\n colgroup: () => null,\n data: () => ROLES.GENERIC,\n datalist: () => ROLES.LISTBOX,\n dd: () => null,\n del: () => ROLES.DELETION,\n details: () => ROLES.GROUP,\n dfn: () => ROLES.TERM,\n dialog: () => ROLES.DIALOG,\n div: () => ROLES.GENERIC,\n dl: () => null,\n dt: () => null,\n em: () => ROLES.EMPHASIS,\n embed: () => null,\n fieldset: () => ROLES.GROUP,\n figcaption: () => null,\n figure: () => ROLES.FIGURE,\n footer: () => null,\n form: () => ROLES.FORM,\n h1: () => ROLES.HEADING,\n h2: () => ROLES.HEADING,\n h3: () => ROLES.HEADING,\n h4: () => ROLES.HEADING,\n h5: () => ROLES.HEADING,\n h6: () => ROLES.HEADING,\n head: () => null,\n header: () => null,\n hgroup: () => ROLES.GROUP,\n hr: () => ROLES.SEPARATOR,\n html: () => ROLES.DOCUMENT,\n i: () => ROLES.GENERIC,\n iframe: () => null,\n img: ({ get }) => {\n const alt = get(\"alt\");\n if (alt === \"\") return null;\n return ROLES.IMG;\n },\n input: ({ get }) => {\n const type = get(\"type\") || \"text\";\n switch (type) {\n case \"button\":\n case \"image\":\n case \"reset\":\n case \"submit\":\n return ROLES.BUTTON;\n case \"checkbox\":\n return ROLES.CHECKBOX;\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"file\":\n case \"hidden\":\n case \"month\":\n case \"password\":\n case \"time\":\n case \"week\":\n return null;\n case \"email\":\n case \"tel\":\n case \"text\":\n case \"url\":\n return ROLES.TEXTBOX;\n case \"number\":\n return ROLES.SPINBUTTON;\n case \"radio\":\n return ROLES.RADIO;\n case \"range\":\n return ROLES.SLIDER;\n case \"search\":\n return ROLES.SEARCHBOX;\n default:\n return ROLES.TEXTBOX;\n }\n },\n ins: () => ROLES.INSERTION,\n kbd: () => null,\n label: () => null,\n legend: () => null,\n li: () => null,\n link: () => null,\n main: () => ROLES.MAIN,\n map: () => null,\n mark: () => null,\n menu: () => ROLES.LIST,\n meta: () => null,\n meter: () => ROLES.METER,\n nav: () => ROLES.NAVIGATION,\n noscript: () => null,\n object: () => null,\n ol: () => ROLES.LIST,\n optgroup: () => ROLES.GROUP,\n option: () => ROLES.OPTION,\n output: () => ROLES.STATUS,\n p: () => ROLES.PARAGRAPH,\n param: () => null,\n picture: () => null,\n pre: () => ROLES.GENERIC,\n progress: () => ROLES.PROGRESSBAR,\n q: () => ROLES.GENERIC,\n rp: () => null,\n rt: () => null,\n ruby: () => null,\n s: () => ROLES.DELETION,\n samp: () => ROLES.GENERIC,\n script: () => null,\n search: () => ROLES.SEARCH,\n section: () => null,\n select: ({ has }) => (has(\"multiple\") ? ROLES.LISTBOX : ROLES.COMBOBOX),\n slot: () => null,\n small: () => ROLES.GENERIC,\n span: () => ROLES.GENERIC,\n strong: () => ROLES.STRONG,\n style: () => null,\n sub: () => null,\n summary: () => ROLES.BUTTON,\n sup: () => null,\n svg: () => null,\n table: () => ROLES.TABLE,\n tbody: () => ROLES.ROWGROUP,\n td: () => ROLES.CELL,\n template: () => null,\n textarea: () => ROLES.TEXTBOX,\n tfoot: () => ROLES.ROWGROUP,\n th: () => null,\n thead: () => ROLES.ROWGROUP,\n time: () => ROLES.TIME,\n title: () => null,\n tr: () => ROLES.ROW,\n track: () => null,\n u: () => null,\n ul: () => ROLES.LIST,\n var: () => null,\n video: () => null,\n wbr: () => null,\n};\n\nexport const getImplicitRoleInternal = (\n name: string,\n attribute: GetAttributeValue,\n): string | null => {\n const getRoleFn = IMPLICIT_ROLE[name.toLowerCase()];\n if (!getRoleFn) {\n return null;\n }\n return getRoleFn({\n get: (key) => attribute(key),\n has: (key) => attribute(key) !== null,\n });\n};\n","import { GetImplicitRoleOptions } from \"./types\";\nimport { getImplicitRoleInternal } from \"./implicit-role\";\n\nconst DEFAULT_OPTIONS: GetImplicitRoleOptions = {\n attribute: () => null,\n};\n\nexport function getImplicitRole(\n element: string,\n options: GetImplicitRoleOptions = DEFAULT_OPTIONS,\n): string | null {\n return getImplicitRoleInternal(element, options.attribute);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants/defaults.ts","../src/core/attribute-state.ts","../src/core/element-state.ts","../src/constants/roles.ts","../src/accessibility/implicit-role/implicit-role.ts","../src/accessibility/accessibility.ts","../src/element.ts"],"sourcesContent":["export { element } from \"./element\";\nexport { accessibility } from \"./accessibility\";\nexport type { AttributeValue, ElementSpec } from \"./types\";\n","import { AttributesOptions, ElementOptions } from \"../types\";\n\nexport const DEFAULT_ATTRIBUTES_OPTIONS: AttributesOptions = {\n get(_) {\n return null;\n },\n};\n\nexport const DEFAULT_ELEMENT_OPTIONS: ElementOptions = {\n attributes: {\n get(_) {\n return null;\n },\n },\n};\n","import { DEFAULT_ATTRIBUTES_OPTIONS } from \"../constants/defaults\";\nimport { AttributesOptions, AttributeValue } from \"../types\";\n\nexport class AttributeState {\n constructor(\n private options: AttributesOptions = DEFAULT_ATTRIBUTES_OPTIONS,\n ) {}\n\n get(key: string): AttributeValue {\n return this.options.get(key);\n }\n\n has(key: string): boolean {\n return this.options.get(key) !== null;\n }\n}\n","import { ElementOptions } from \"../types\";\nimport { AttributeState } from \"./attribute-state\";\n\nexport class ElementState {\n public readonly name: string;\n\n constructor(\n name: string,\n private options: ElementOptions,\n ) {\n this.name = name.toLowerCase();\n }\n\n get attributes(): AttributeState {\n return new AttributeState(this.options.attributes);\n }\n\n parent(): ElementState | null {\n if (!this.options.ancestors) {\n return null;\n }\n\n const iterator = this.options.ancestors()[Symbol.iterator]();\n const first = iterator.next();\n\n if (first.done || !first.value) {\n return null;\n }\n\n return new ElementState(first.value.name, first.value);\n }\n\n anceters(): Iterable<\n {\n name: string;\n } & ElementOptions\n > {\n return this.options.ancestors?.() || [];\n }\n}\n","// ARIA roles used in implicit role mapping\nexport const ROLES = {\n ARTICLE: \"article\",\n BLOCKQUOTE: \"blockquote\",\n BUTTON: \"button\",\n CAPTION: \"caption\",\n CELL: \"cell\",\n CHECKBOX: \"checkbox\",\n CODE: \"code\",\n COMBOBOX: \"combobox\",\n COMPLEMENTARY: \"complementary\",\n CONTENTINFO: \"contentinfo\",\n DELETION: \"deletion\",\n DIALOG: \"dialog\",\n DOCUMENT: \"document\",\n EMPHASIS: \"emphasis\",\n FIGURE: \"figure\",\n FORM: \"form\",\n GENERIC: \"generic\",\n GROUP: \"group\",\n HEADING: \"heading\",\n IMG: \"img\",\n INSERTION: \"insertion\",\n LINK: \"link\",\n LIST: \"list\",\n LISTBOX: \"listbox\",\n MAIN: \"main\",\n METER: \"meter\",\n NAVIGATION: \"navigation\",\n OPTION: \"option\",\n PARAGRAPH: \"paragraph\",\n PROGRESSBAR: \"progressbar\",\n RADIO: \"radio\",\n ROW: \"row\",\n ROWGROUP: \"rowgroup\",\n SEARCH: \"search\",\n SEARCHBOX: \"searchbox\",\n SEPARATOR: \"separator\",\n SLIDER: \"slider\",\n SPINBUTTON: \"spinbutton\",\n STATUS: \"status\",\n STRONG: \"strong\",\n TABLE: \"table\",\n TERM: \"term\",\n TEXTBOX: \"textbox\",\n TIME: \"time\",\n} as const;\n","import { ROLES } from \"../../constants/roles\";\nimport { ElementState } from \"../../core\";\n\n/**\n * https://www.w3.org/TR/html-aria/\n */\nexport const IMPLICIT_ROLE: Record<\n string,\n (element: ElementState) => string | null\n> = {\n a: (element) => (element.attributes.has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n abbr: () => null,\n address: () => ROLES.GROUP,\n area: (element) =>\n element.attributes.has(\"href\") ? ROLES.LINK : ROLES.GENERIC,\n article: () => ROLES.ARTICLE,\n aside: () => ROLES.COMPLEMENTARY,\n audio: () => null,\n b: () => ROLES.GENERIC,\n base: () => null,\n bdi: () => ROLES.GENERIC,\n bdo: () => ROLES.GENERIC,\n blockquote: () => ROLES.BLOCKQUOTE,\n body: () => ROLES.GENERIC,\n br: () => null,\n button: () => ROLES.BUTTON,\n canvas: () => null,\n caption: () => ROLES.CAPTION,\n cite: () => null,\n code: () => ROLES.CODE,\n col: () => null,\n colgroup: () => null,\n data: () => ROLES.GENERIC,\n datalist: () => ROLES.LISTBOX,\n dd: () => null,\n del: () => ROLES.DELETION,\n details: () => ROLES.GROUP,\n dfn: () => ROLES.TERM,\n dialog: () => ROLES.DIALOG,\n div: () => ROLES.GENERIC,\n dl: () => null,\n dt: () => null,\n em: () => ROLES.EMPHASIS,\n embed: () => null,\n fieldset: () => ROLES.GROUP,\n figcaption: () => null,\n figure: () => ROLES.FIGURE,\n footer: (element) => {\n const sectioningElements = [\"article\", \"aside\", \"main\", \"nav\", \"section\"];\n for (const ancestor of element.anceters()) {\n if (sectioningElements.includes(ancestor.name.toLowerCase())) {\n return ROLES.GENERIC;\n }\n }\n return ROLES.CONTENTINFO;\n },\n form: () => ROLES.FORM,\n h1: () => ROLES.HEADING,\n h2: () => ROLES.HEADING,\n h3: () => ROLES.HEADING,\n h4: () => ROLES.HEADING,\n h5: () => ROLES.HEADING,\n h6: () => ROLES.HEADING,\n head: () => null,\n header: () => null, // TODO: banner if not descendant of article/aside/main/nav/section, otherwise generic\n hgroup: () => ROLES.GROUP,\n hr: () => ROLES.SEPARATOR,\n html: () => ROLES.DOCUMENT,\n i: () => ROLES.GENERIC,\n iframe: () => null,\n img: (element) => {\n const alt = element.attributes.get(\"alt\");\n if (alt === \"\") return null;\n return ROLES.IMG;\n },\n input: (element) => {\n const type = element.attributes.get(\"type\") || \"text\";\n switch (type) {\n case \"button\":\n case \"image\":\n case \"reset\":\n case \"submit\":\n return ROLES.BUTTON;\n case \"checkbox\":\n return ROLES.CHECKBOX;\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"file\":\n case \"hidden\":\n case \"month\":\n case \"password\":\n case \"time\":\n case \"week\":\n return null;\n case \"email\":\n case \"tel\":\n case \"text\":\n case \"url\":\n return ROLES.TEXTBOX;\n case \"number\":\n return ROLES.SPINBUTTON;\n case \"radio\":\n return ROLES.RADIO;\n case \"range\":\n return ROLES.SLIDER;\n case \"search\":\n return ROLES.SEARCHBOX;\n default:\n return ROLES.TEXTBOX;\n }\n },\n ins: () => ROLES.INSERTION,\n kbd: () => null,\n label: () => null,\n legend: () => null,\n li: () => null, // TODO: listitem if child of ol/ul/menu, otherwise generic\n link: () => null,\n main: () => ROLES.MAIN,\n map: () => null,\n mark: () => null,\n menu: () => ROLES.LIST,\n meta: () => null,\n meter: () => ROLES.METER,\n nav: () => ROLES.NAVIGATION,\n noscript: () => null,\n object: () => null,\n ol: () => ROLES.LIST,\n optgroup: () => ROLES.GROUP,\n option: () => ROLES.OPTION,\n output: () => ROLES.STATUS,\n p: () => ROLES.PARAGRAPH,\n param: () => null,\n picture: () => null,\n pre: () => ROLES.GENERIC,\n progress: () => ROLES.PROGRESSBAR,\n q: () => ROLES.GENERIC,\n rp: () => null,\n rt: () => null,\n ruby: () => null,\n s: () => ROLES.DELETION,\n samp: () => ROLES.GENERIC,\n script: () => null,\n search: () => ROLES.SEARCH,\n section: () => null,\n select: (element) =>\n element.attributes.has(\"multiple\") ? ROLES.LISTBOX : ROLES.COMBOBOX,\n slot: () => null,\n small: () => ROLES.GENERIC,\n span: () => ROLES.GENERIC,\n strong: () => ROLES.STRONG,\n style: () => null,\n sub: () => null,\n summary: () => ROLES.BUTTON,\n sup: () => null,\n svg: () => null,\n table: () => ROLES.TABLE,\n tbody: () => ROLES.ROWGROUP,\n td: () => ROLES.CELL,\n template: () => null,\n textarea: () => ROLES.TEXTBOX,\n tfoot: () => ROLES.ROWGROUP,\n th: () => null,\n thead: () => ROLES.ROWGROUP,\n time: () => ROLES.TIME,\n title: () => null,\n tr: () => ROLES.ROW,\n track: () => null,\n u: () => null,\n ul: () => ROLES.LIST,\n var: () => null,\n video: () => null,\n wbr: () => null,\n};\n","import { ElementState } from \"../core\";\nimport type { AccessibilitySpec, ElementOptions } from \"../types\";\nimport { IMPLICIT_ROLE } from \"./implicit-role\";\n\nclass Accessibility implements AccessibilitySpec {\n constructor(private element: ElementState) {}\n\n implicitRole(): string | null {\n return (\n IMPLICIT_ROLE[this.element.name.toLowerCase()]?.(this.element) ?? null\n );\n }\n}\n\nexport function accessibility(\n name: string,\n options: ElementOptions,\n): AccessibilitySpec {\n return new Accessibility(new ElementState(name, options));\n}\n","import { accessibility } from \"./accessibility\";\nimport { DEFAULT_ELEMENT_OPTIONS } from \"./constants\";\nimport { ElementSpec, ElementOptions } from \"./types\";\n\nclass Element implements ElementSpec {\n constructor(\n private name: string,\n private options: ElementOptions,\n ) {}\n\n get accessibility() {\n return accessibility(this.name, this.options);\n }\n}\n\nexport function element(\n name: string,\n options: ElementOptions = DEFAULT_ELEMENT_OPTIONS,\n): ElementSpec {\n return new Element(name, options);\n}\n"],"mappings":"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","names":["element","element"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,8 +1,61 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
type AttributeValue = string | true | null;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for accessing element attributes.
|
|
5
|
+
*/
|
|
6
|
+
interface AttributesOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Retrieves the value of the specified attribute.
|
|
9
|
+
*
|
|
10
|
+
* @param key - The attribute name to retrieve
|
|
11
|
+
* @returns The attribute value, or `null` if the attribute does not exist
|
|
12
|
+
*/
|
|
13
|
+
get(key: string): AttributeValue;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Options for configuring element behavior and context.
|
|
17
|
+
*/
|
|
18
|
+
interface ElementOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Optional attributes accessor for the element.
|
|
21
|
+
*/
|
|
22
|
+
attributes?: AttributesOptions;
|
|
23
|
+
/**
|
|
24
|
+
* Optional function that returns an iterable of ancestor elements.
|
|
25
|
+
* The iterable provides access to parent and ancestor element information.
|
|
26
|
+
*
|
|
27
|
+
* @returns An iterable of ancestor element options, with the first element being the direct parent
|
|
28
|
+
*/
|
|
29
|
+
ancestors?: () => Iterable<{
|
|
30
|
+
name: string;
|
|
31
|
+
} & ElementOptions>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Specification for accessibility-related functionality of HTML elements.
|
|
35
|
+
*/
|
|
36
|
+
interface AccessibilitySpec {
|
|
37
|
+
/**
|
|
38
|
+
* Returns the implicit ARIA role of the HTML element.
|
|
39
|
+
* Determines the default ARIA role based on the element name and its attributes
|
|
40
|
+
* according to the HTML-ARIA specification.
|
|
41
|
+
*
|
|
42
|
+
* @returns The implicit ARIA role string (e.g., "button", "navigation", "generic"),
|
|
43
|
+
* or `null` if the element has no implicit role.
|
|
44
|
+
*/
|
|
45
|
+
implicitRole(): string | null;
|
|
4
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Specification for HTML element functionality.
|
|
49
|
+
*/
|
|
50
|
+
interface ElementSpec {
|
|
51
|
+
/**
|
|
52
|
+
* Accessibility-related functionality for the element.
|
|
53
|
+
*/
|
|
54
|
+
accessibility: AccessibilitySpec;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
declare function element(name: string, options?: ElementOptions): ElementSpec;
|
|
5
58
|
|
|
6
|
-
declare function
|
|
59
|
+
declare function accessibility(name: string, options: ElementOptions): AccessibilitySpec;
|
|
7
60
|
|
|
8
|
-
export { type
|
|
61
|
+
export { type AttributeValue, type ElementSpec, accessibility, element };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,61 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
type AttributeValue = string | true | null;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for accessing element attributes.
|
|
5
|
+
*/
|
|
6
|
+
interface AttributesOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Retrieves the value of the specified attribute.
|
|
9
|
+
*
|
|
10
|
+
* @param key - The attribute name to retrieve
|
|
11
|
+
* @returns The attribute value, or `null` if the attribute does not exist
|
|
12
|
+
*/
|
|
13
|
+
get(key: string): AttributeValue;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Options for configuring element behavior and context.
|
|
17
|
+
*/
|
|
18
|
+
interface ElementOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Optional attributes accessor for the element.
|
|
21
|
+
*/
|
|
22
|
+
attributes?: AttributesOptions;
|
|
23
|
+
/**
|
|
24
|
+
* Optional function that returns an iterable of ancestor elements.
|
|
25
|
+
* The iterable provides access to parent and ancestor element information.
|
|
26
|
+
*
|
|
27
|
+
* @returns An iterable of ancestor element options, with the first element being the direct parent
|
|
28
|
+
*/
|
|
29
|
+
ancestors?: () => Iterable<{
|
|
30
|
+
name: string;
|
|
31
|
+
} & ElementOptions>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Specification for accessibility-related functionality of HTML elements.
|
|
35
|
+
*/
|
|
36
|
+
interface AccessibilitySpec {
|
|
37
|
+
/**
|
|
38
|
+
* Returns the implicit ARIA role of the HTML element.
|
|
39
|
+
* Determines the default ARIA role based on the element name and its attributes
|
|
40
|
+
* according to the HTML-ARIA specification.
|
|
41
|
+
*
|
|
42
|
+
* @returns The implicit ARIA role string (e.g., "button", "navigation", "generic"),
|
|
43
|
+
* or `null` if the element has no implicit role.
|
|
44
|
+
*/
|
|
45
|
+
implicitRole(): string | null;
|
|
4
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Specification for HTML element functionality.
|
|
49
|
+
*/
|
|
50
|
+
interface ElementSpec {
|
|
51
|
+
/**
|
|
52
|
+
* Accessibility-related functionality for the element.
|
|
53
|
+
*/
|
|
54
|
+
accessibility: AccessibilitySpec;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
declare function element(name: string, options?: ElementOptions): ElementSpec;
|
|
5
58
|
|
|
6
|
-
declare function
|
|
59
|
+
declare function accessibility(name: string, options: ElementOptions): AccessibilitySpec;
|
|
7
60
|
|
|
8
|
-
export { type
|
|
61
|
+
export { type AttributeValue, type ElementSpec, accessibility, element };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,56 @@
|
|
|
1
|
+
// src/constants/defaults.ts
|
|
2
|
+
var DEFAULT_ATTRIBUTES_OPTIONS = {
|
|
3
|
+
get(_) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
var DEFAULT_ELEMENT_OPTIONS = {
|
|
8
|
+
attributes: {
|
|
9
|
+
get(_) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// src/core/attribute-state.ts
|
|
16
|
+
var AttributeState = class {
|
|
17
|
+
constructor(options = DEFAULT_ATTRIBUTES_OPTIONS) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
get(key) {
|
|
21
|
+
return this.options.get(key);
|
|
22
|
+
}
|
|
23
|
+
has(key) {
|
|
24
|
+
return this.options.get(key) !== null;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/core/element-state.ts
|
|
29
|
+
var ElementState = class _ElementState {
|
|
30
|
+
constructor(name, options) {
|
|
31
|
+
this.options = options;
|
|
32
|
+
this.name = name.toLowerCase();
|
|
33
|
+
}
|
|
34
|
+
get attributes() {
|
|
35
|
+
return new AttributeState(this.options.attributes);
|
|
36
|
+
}
|
|
37
|
+
parent() {
|
|
38
|
+
if (!this.options.ancestors) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const iterator = this.options.ancestors()[Symbol.iterator]();
|
|
42
|
+
const first = iterator.next();
|
|
43
|
+
if (first.done || !first.value) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return new _ElementState(first.value.name, first.value);
|
|
47
|
+
}
|
|
48
|
+
anceters() {
|
|
49
|
+
var _a, _b;
|
|
50
|
+
return ((_b = (_a = this.options).ancestors) == null ? void 0 : _b.call(_a)) || [];
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
1
54
|
// src/constants/roles.ts
|
|
2
55
|
var ROLES = {
|
|
3
56
|
ARTICLE: "article",
|
|
@@ -9,6 +62,7 @@ var ROLES = {
|
|
|
9
62
|
CODE: "code",
|
|
10
63
|
COMBOBOX: "combobox",
|
|
11
64
|
COMPLEMENTARY: "complementary",
|
|
65
|
+
CONTENTINFO: "contentinfo",
|
|
12
66
|
DELETION: "deletion",
|
|
13
67
|
DIALOG: "dialog",
|
|
14
68
|
DOCUMENT: "document",
|
|
@@ -45,12 +99,12 @@ var ROLES = {
|
|
|
45
99
|
TIME: "time"
|
|
46
100
|
};
|
|
47
101
|
|
|
48
|
-
// src/
|
|
102
|
+
// src/accessibility/implicit-role/implicit-role.ts
|
|
49
103
|
var IMPLICIT_ROLE = {
|
|
50
|
-
a: (
|
|
104
|
+
a: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
|
|
51
105
|
abbr: () => null,
|
|
52
106
|
address: () => ROLES.GROUP,
|
|
53
|
-
area: (
|
|
107
|
+
area: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
|
|
54
108
|
article: () => ROLES.ARTICLE,
|
|
55
109
|
aside: () => ROLES.COMPLEMENTARY,
|
|
56
110
|
audio: () => null,
|
|
@@ -83,7 +137,15 @@ var IMPLICIT_ROLE = {
|
|
|
83
137
|
fieldset: () => ROLES.GROUP,
|
|
84
138
|
figcaption: () => null,
|
|
85
139
|
figure: () => ROLES.FIGURE,
|
|
86
|
-
footer: () =>
|
|
140
|
+
footer: (element2) => {
|
|
141
|
+
const sectioningElements = ["article", "aside", "main", "nav", "section"];
|
|
142
|
+
for (const ancestor of element2.anceters()) {
|
|
143
|
+
if (sectioningElements.includes(ancestor.name.toLowerCase())) {
|
|
144
|
+
return ROLES.GENERIC;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return ROLES.CONTENTINFO;
|
|
148
|
+
},
|
|
87
149
|
form: () => ROLES.FORM,
|
|
88
150
|
h1: () => ROLES.HEADING,
|
|
89
151
|
h2: () => ROLES.HEADING,
|
|
@@ -93,18 +155,19 @@ var IMPLICIT_ROLE = {
|
|
|
93
155
|
h6: () => ROLES.HEADING,
|
|
94
156
|
head: () => null,
|
|
95
157
|
header: () => null,
|
|
158
|
+
// TODO: banner if not descendant of article/aside/main/nav/section, otherwise generic
|
|
96
159
|
hgroup: () => ROLES.GROUP,
|
|
97
160
|
hr: () => ROLES.SEPARATOR,
|
|
98
161
|
html: () => ROLES.DOCUMENT,
|
|
99
162
|
i: () => ROLES.GENERIC,
|
|
100
163
|
iframe: () => null,
|
|
101
|
-
img: (
|
|
102
|
-
const alt = get("alt");
|
|
164
|
+
img: (element2) => {
|
|
165
|
+
const alt = element2.attributes.get("alt");
|
|
103
166
|
if (alt === "") return null;
|
|
104
167
|
return ROLES.IMG;
|
|
105
168
|
},
|
|
106
|
-
input: (
|
|
107
|
-
const type = get("type") || "text";
|
|
169
|
+
input: (element2) => {
|
|
170
|
+
const type = element2.attributes.get("type") || "text";
|
|
108
171
|
switch (type) {
|
|
109
172
|
case "button":
|
|
110
173
|
case "image":
|
|
@@ -145,6 +208,7 @@ var IMPLICIT_ROLE = {
|
|
|
145
208
|
label: () => null,
|
|
146
209
|
legend: () => null,
|
|
147
210
|
li: () => null,
|
|
211
|
+
// TODO: listitem if child of ol/ul/menu, otherwise generic
|
|
148
212
|
link: () => null,
|
|
149
213
|
main: () => ROLES.MAIN,
|
|
150
214
|
map: () => null,
|
|
@@ -173,7 +237,7 @@ var IMPLICIT_ROLE = {
|
|
|
173
237
|
script: () => null,
|
|
174
238
|
search: () => ROLES.SEARCH,
|
|
175
239
|
section: () => null,
|
|
176
|
-
select: (
|
|
240
|
+
select: (element2) => element2.attributes.has("multiple") ? ROLES.LISTBOX : ROLES.COMBOBOX,
|
|
177
241
|
slot: () => null,
|
|
178
242
|
small: () => ROLES.GENERIC,
|
|
179
243
|
span: () => ROLES.GENERIC,
|
|
@@ -201,25 +265,36 @@ var IMPLICIT_ROLE = {
|
|
|
201
265
|
video: () => null,
|
|
202
266
|
wbr: () => null
|
|
203
267
|
};
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
268
|
+
|
|
269
|
+
// src/accessibility/accessibility.ts
|
|
270
|
+
var Accessibility = class {
|
|
271
|
+
constructor(element2) {
|
|
272
|
+
this.element = element2;
|
|
273
|
+
}
|
|
274
|
+
implicitRole() {
|
|
275
|
+
var _a, _b, _c;
|
|
276
|
+
return (_c = (_b = (_a = IMPLICIT_ROLE)[this.element.name.toLowerCase()]) == null ? void 0 : _b.call(_a, this.element)) != null ? _c : null;
|
|
208
277
|
}
|
|
209
|
-
return getRoleFn({
|
|
210
|
-
get: (key) => attribute(key),
|
|
211
|
-
has: (key) => attribute(key) !== null
|
|
212
|
-
});
|
|
213
278
|
};
|
|
279
|
+
function accessibility(name, options) {
|
|
280
|
+
return new Accessibility(new ElementState(name, options));
|
|
281
|
+
}
|
|
214
282
|
|
|
215
|
-
// src/
|
|
216
|
-
var
|
|
217
|
-
|
|
283
|
+
// src/element.ts
|
|
284
|
+
var Element = class {
|
|
285
|
+
constructor(name, options) {
|
|
286
|
+
this.name = name;
|
|
287
|
+
this.options = options;
|
|
288
|
+
}
|
|
289
|
+
get accessibility() {
|
|
290
|
+
return accessibility(this.name, this.options);
|
|
291
|
+
}
|
|
218
292
|
};
|
|
219
|
-
function
|
|
220
|
-
return
|
|
293
|
+
function element(name, options = DEFAULT_ELEMENT_OPTIONS) {
|
|
294
|
+
return new Element(name, options);
|
|
221
295
|
}
|
|
222
296
|
export {
|
|
223
|
-
|
|
297
|
+
accessibility,
|
|
298
|
+
element
|
|
224
299
|
};
|
|
225
300
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants/roles.ts","../src/html-aria/implicit-role/implicit-role.ts","../src/html-aria/implicit-role/get-implicit-role.ts"],"sourcesContent":["// ARIA roles used in implicit role mapping\nexport const ROLES = {\n ARTICLE: \"article\",\n BLOCKQUOTE: \"blockquote\",\n BUTTON: \"button\",\n CAPTION: \"caption\",\n CELL: \"cell\",\n CHECKBOX: \"checkbox\",\n CODE: \"code\",\n COMBOBOX: \"combobox\",\n COMPLEMENTARY: \"complementary\",\n DELETION: \"deletion\",\n DIALOG: \"dialog\",\n DOCUMENT: \"document\",\n EMPHASIS: \"emphasis\",\n FIGURE: \"figure\",\n FORM: \"form\",\n GENERIC: \"generic\",\n GROUP: \"group\",\n HEADING: \"heading\",\n IMG: \"img\",\n INSERTION: \"insertion\",\n LINK: \"link\",\n LIST: \"list\",\n LISTBOX: \"listbox\",\n MAIN: \"main\",\n METER: \"meter\",\n NAVIGATION: \"navigation\",\n OPTION: \"option\",\n PARAGRAPH: \"paragraph\",\n PROGRESSBAR: \"progressbar\",\n RADIO: \"radio\",\n ROW: \"row\",\n ROWGROUP: \"rowgroup\",\n SEARCH: \"search\",\n SEARCHBOX: \"searchbox\",\n SEPARATOR: \"separator\",\n SLIDER: \"slider\",\n SPINBUTTON: \"spinbutton\",\n STATUS: \"status\",\n STRONG: \"strong\",\n TABLE: \"table\",\n TERM: \"term\",\n TEXTBOX: \"textbox\",\n TIME: \"time\",\n} as const;\n","import { GetAttributeValue } from \"./types\";\nimport { ROLES } from \"../../constants/roles\";\n\n/**\n * https://www.w3.org/TR/html-aria/?utm_source=chatgpt.com#docconformance\n */\n\nconst IMPLICIT_ROLE: Record<\n string,\n (args: {\n get: (key: string) => string | number | null;\n has: (key: string) => boolean;\n }) => string | null\n> = {\n a: ({ has }) => (has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n abbr: () => null,\n address: () => ROLES.GROUP,\n area: ({ has }) => (has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n article: () => ROLES.ARTICLE,\n aside: () => ROLES.COMPLEMENTARY,\n audio: () => null,\n b: () => ROLES.GENERIC,\n base: () => null,\n bdi: () => ROLES.GENERIC,\n bdo: () => ROLES.GENERIC,\n blockquote: () => ROLES.BLOCKQUOTE,\n body: () => ROLES.GENERIC,\n br: () => null,\n button: () => ROLES.BUTTON,\n canvas: () => null,\n caption: () => ROLES.CAPTION,\n cite: () => null,\n code: () => ROLES.CODE,\n col: () => null,\n colgroup: () => null,\n data: () => ROLES.GENERIC,\n datalist: () => ROLES.LISTBOX,\n dd: () => null,\n del: () => ROLES.DELETION,\n details: () => ROLES.GROUP,\n dfn: () => ROLES.TERM,\n dialog: () => ROLES.DIALOG,\n div: () => ROLES.GENERIC,\n dl: () => null,\n dt: () => null,\n em: () => ROLES.EMPHASIS,\n embed: () => null,\n fieldset: () => ROLES.GROUP,\n figcaption: () => null,\n figure: () => ROLES.FIGURE,\n footer: () => null,\n form: () => ROLES.FORM,\n h1: () => ROLES.HEADING,\n h2: () => ROLES.HEADING,\n h3: () => ROLES.HEADING,\n h4: () => ROLES.HEADING,\n h5: () => ROLES.HEADING,\n h6: () => ROLES.HEADING,\n head: () => null,\n header: () => null,\n hgroup: () => ROLES.GROUP,\n hr: () => ROLES.SEPARATOR,\n html: () => ROLES.DOCUMENT,\n i: () => ROLES.GENERIC,\n iframe: () => null,\n img: ({ get }) => {\n const alt = get(\"alt\");\n if (alt === \"\") return null;\n return ROLES.IMG;\n },\n input: ({ get }) => {\n const type = get(\"type\") || \"text\";\n switch (type) {\n case \"button\":\n case \"image\":\n case \"reset\":\n case \"submit\":\n return ROLES.BUTTON;\n case \"checkbox\":\n return ROLES.CHECKBOX;\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"file\":\n case \"hidden\":\n case \"month\":\n case \"password\":\n case \"time\":\n case \"week\":\n return null;\n case \"email\":\n case \"tel\":\n case \"text\":\n case \"url\":\n return ROLES.TEXTBOX;\n case \"number\":\n return ROLES.SPINBUTTON;\n case \"radio\":\n return ROLES.RADIO;\n case \"range\":\n return ROLES.SLIDER;\n case \"search\":\n return ROLES.SEARCHBOX;\n default:\n return ROLES.TEXTBOX;\n }\n },\n ins: () => ROLES.INSERTION,\n kbd: () => null,\n label: () => null,\n legend: () => null,\n li: () => null,\n link: () => null,\n main: () => ROLES.MAIN,\n map: () => null,\n mark: () => null,\n menu: () => ROLES.LIST,\n meta: () => null,\n meter: () => ROLES.METER,\n nav: () => ROLES.NAVIGATION,\n noscript: () => null,\n object: () => null,\n ol: () => ROLES.LIST,\n optgroup: () => ROLES.GROUP,\n option: () => ROLES.OPTION,\n output: () => ROLES.STATUS,\n p: () => ROLES.PARAGRAPH,\n param: () => null,\n picture: () => null,\n pre: () => ROLES.GENERIC,\n progress: () => ROLES.PROGRESSBAR,\n q: () => ROLES.GENERIC,\n rp: () => null,\n rt: () => null,\n ruby: () => null,\n s: () => ROLES.DELETION,\n samp: () => ROLES.GENERIC,\n script: () => null,\n search: () => ROLES.SEARCH,\n section: () => null,\n select: ({ has }) => (has(\"multiple\") ? ROLES.LISTBOX : ROLES.COMBOBOX),\n slot: () => null,\n small: () => ROLES.GENERIC,\n span: () => ROLES.GENERIC,\n strong: () => ROLES.STRONG,\n style: () => null,\n sub: () => null,\n summary: () => ROLES.BUTTON,\n sup: () => null,\n svg: () => null,\n table: () => ROLES.TABLE,\n tbody: () => ROLES.ROWGROUP,\n td: () => ROLES.CELL,\n template: () => null,\n textarea: () => ROLES.TEXTBOX,\n tfoot: () => ROLES.ROWGROUP,\n th: () => null,\n thead: () => ROLES.ROWGROUP,\n time: () => ROLES.TIME,\n title: () => null,\n tr: () => ROLES.ROW,\n track: () => null,\n u: () => null,\n ul: () => ROLES.LIST,\n var: () => null,\n video: () => null,\n wbr: () => null,\n};\n\nexport const getImplicitRoleInternal = (\n name: string,\n attribute: GetAttributeValue,\n): string | null => {\n const getRoleFn = IMPLICIT_ROLE[name.toLowerCase()];\n if (!getRoleFn) {\n return null;\n }\n return getRoleFn({\n get: (key) => attribute(key),\n has: (key) => attribute(key) !== null,\n });\n};\n","import { GetImplicitRoleOptions } from \"./types\";\nimport { getImplicitRoleInternal } from \"./implicit-role\";\n\nconst DEFAULT_OPTIONS: GetImplicitRoleOptions = {\n attribute: () => null,\n};\n\nexport function getImplicitRole(\n element: string,\n options: GetImplicitRoleOptions = DEFAULT_OPTIONS,\n): string | null {\n return getImplicitRoleInternal(element, options.attribute);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/defaults.ts","../src/core/attribute-state.ts","../src/core/element-state.ts","../src/constants/roles.ts","../src/accessibility/implicit-role/implicit-role.ts","../src/accessibility/accessibility.ts","../src/element.ts"],"sourcesContent":["import { AttributesOptions, ElementOptions } from \"../types\";\n\nexport const DEFAULT_ATTRIBUTES_OPTIONS: AttributesOptions = {\n get(_) {\n return null;\n },\n};\n\nexport const DEFAULT_ELEMENT_OPTIONS: ElementOptions = {\n attributes: {\n get(_) {\n return null;\n },\n },\n};\n","import { DEFAULT_ATTRIBUTES_OPTIONS } from \"../constants/defaults\";\nimport { AttributesOptions, AttributeValue } from \"../types\";\n\nexport class AttributeState {\n constructor(\n private options: AttributesOptions = DEFAULT_ATTRIBUTES_OPTIONS,\n ) {}\n\n get(key: string): AttributeValue {\n return this.options.get(key);\n }\n\n has(key: string): boolean {\n return this.options.get(key) !== null;\n }\n}\n","import { ElementOptions } from \"../types\";\nimport { AttributeState } from \"./attribute-state\";\n\nexport class ElementState {\n public readonly name: string;\n\n constructor(\n name: string,\n private options: ElementOptions,\n ) {\n this.name = name.toLowerCase();\n }\n\n get attributes(): AttributeState {\n return new AttributeState(this.options.attributes);\n }\n\n parent(): ElementState | null {\n if (!this.options.ancestors) {\n return null;\n }\n\n const iterator = this.options.ancestors()[Symbol.iterator]();\n const first = iterator.next();\n\n if (first.done || !first.value) {\n return null;\n }\n\n return new ElementState(first.value.name, first.value);\n }\n\n anceters(): Iterable<\n {\n name: string;\n } & ElementOptions\n > {\n return this.options.ancestors?.() || [];\n }\n}\n","// ARIA roles used in implicit role mapping\nexport const ROLES = {\n ARTICLE: \"article\",\n BLOCKQUOTE: \"blockquote\",\n BUTTON: \"button\",\n CAPTION: \"caption\",\n CELL: \"cell\",\n CHECKBOX: \"checkbox\",\n CODE: \"code\",\n COMBOBOX: \"combobox\",\n COMPLEMENTARY: \"complementary\",\n CONTENTINFO: \"contentinfo\",\n DELETION: \"deletion\",\n DIALOG: \"dialog\",\n DOCUMENT: \"document\",\n EMPHASIS: \"emphasis\",\n FIGURE: \"figure\",\n FORM: \"form\",\n GENERIC: \"generic\",\n GROUP: \"group\",\n HEADING: \"heading\",\n IMG: \"img\",\n INSERTION: \"insertion\",\n LINK: \"link\",\n LIST: \"list\",\n LISTBOX: \"listbox\",\n MAIN: \"main\",\n METER: \"meter\",\n NAVIGATION: \"navigation\",\n OPTION: \"option\",\n PARAGRAPH: \"paragraph\",\n PROGRESSBAR: \"progressbar\",\n RADIO: \"radio\",\n ROW: \"row\",\n ROWGROUP: \"rowgroup\",\n SEARCH: \"search\",\n SEARCHBOX: \"searchbox\",\n SEPARATOR: \"separator\",\n SLIDER: \"slider\",\n SPINBUTTON: \"spinbutton\",\n STATUS: \"status\",\n STRONG: \"strong\",\n TABLE: \"table\",\n TERM: \"term\",\n TEXTBOX: \"textbox\",\n TIME: \"time\",\n} as const;\n","import { ROLES } from \"../../constants/roles\";\nimport { ElementState } from \"../../core\";\n\n/**\n * https://www.w3.org/TR/html-aria/\n */\nexport const IMPLICIT_ROLE: Record<\n string,\n (element: ElementState) => string | null\n> = {\n a: (element) => (element.attributes.has(\"href\") ? ROLES.LINK : ROLES.GENERIC),\n abbr: () => null,\n address: () => ROLES.GROUP,\n area: (element) =>\n element.attributes.has(\"href\") ? ROLES.LINK : ROLES.GENERIC,\n article: () => ROLES.ARTICLE,\n aside: () => ROLES.COMPLEMENTARY,\n audio: () => null,\n b: () => ROLES.GENERIC,\n base: () => null,\n bdi: () => ROLES.GENERIC,\n bdo: () => ROLES.GENERIC,\n blockquote: () => ROLES.BLOCKQUOTE,\n body: () => ROLES.GENERIC,\n br: () => null,\n button: () => ROLES.BUTTON,\n canvas: () => null,\n caption: () => ROLES.CAPTION,\n cite: () => null,\n code: () => ROLES.CODE,\n col: () => null,\n colgroup: () => null,\n data: () => ROLES.GENERIC,\n datalist: () => ROLES.LISTBOX,\n dd: () => null,\n del: () => ROLES.DELETION,\n details: () => ROLES.GROUP,\n dfn: () => ROLES.TERM,\n dialog: () => ROLES.DIALOG,\n div: () => ROLES.GENERIC,\n dl: () => null,\n dt: () => null,\n em: () => ROLES.EMPHASIS,\n embed: () => null,\n fieldset: () => ROLES.GROUP,\n figcaption: () => null,\n figure: () => ROLES.FIGURE,\n footer: (element) => {\n const sectioningElements = [\"article\", \"aside\", \"main\", \"nav\", \"section\"];\n for (const ancestor of element.anceters()) {\n if (sectioningElements.includes(ancestor.name.toLowerCase())) {\n return ROLES.GENERIC;\n }\n }\n return ROLES.CONTENTINFO;\n },\n form: () => ROLES.FORM,\n h1: () => ROLES.HEADING,\n h2: () => ROLES.HEADING,\n h3: () => ROLES.HEADING,\n h4: () => ROLES.HEADING,\n h5: () => ROLES.HEADING,\n h6: () => ROLES.HEADING,\n head: () => null,\n header: () => null, // TODO: banner if not descendant of article/aside/main/nav/section, otherwise generic\n hgroup: () => ROLES.GROUP,\n hr: () => ROLES.SEPARATOR,\n html: () => ROLES.DOCUMENT,\n i: () => ROLES.GENERIC,\n iframe: () => null,\n img: (element) => {\n const alt = element.attributes.get(\"alt\");\n if (alt === \"\") return null;\n return ROLES.IMG;\n },\n input: (element) => {\n const type = element.attributes.get(\"type\") || \"text\";\n switch (type) {\n case \"button\":\n case \"image\":\n case \"reset\":\n case \"submit\":\n return ROLES.BUTTON;\n case \"checkbox\":\n return ROLES.CHECKBOX;\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"file\":\n case \"hidden\":\n case \"month\":\n case \"password\":\n case \"time\":\n case \"week\":\n return null;\n case \"email\":\n case \"tel\":\n case \"text\":\n case \"url\":\n return ROLES.TEXTBOX;\n case \"number\":\n return ROLES.SPINBUTTON;\n case \"radio\":\n return ROLES.RADIO;\n case \"range\":\n return ROLES.SLIDER;\n case \"search\":\n return ROLES.SEARCHBOX;\n default:\n return ROLES.TEXTBOX;\n }\n },\n ins: () => ROLES.INSERTION,\n kbd: () => null,\n label: () => null,\n legend: () => null,\n li: () => null, // TODO: listitem if child of ol/ul/menu, otherwise generic\n link: () => null,\n main: () => ROLES.MAIN,\n map: () => null,\n mark: () => null,\n menu: () => ROLES.LIST,\n meta: () => null,\n meter: () => ROLES.METER,\n nav: () => ROLES.NAVIGATION,\n noscript: () => null,\n object: () => null,\n ol: () => ROLES.LIST,\n optgroup: () => ROLES.GROUP,\n option: () => ROLES.OPTION,\n output: () => ROLES.STATUS,\n p: () => ROLES.PARAGRAPH,\n param: () => null,\n picture: () => null,\n pre: () => ROLES.GENERIC,\n progress: () => ROLES.PROGRESSBAR,\n q: () => ROLES.GENERIC,\n rp: () => null,\n rt: () => null,\n ruby: () => null,\n s: () => ROLES.DELETION,\n samp: () => ROLES.GENERIC,\n script: () => null,\n search: () => ROLES.SEARCH,\n section: () => null,\n select: (element) =>\n element.attributes.has(\"multiple\") ? ROLES.LISTBOX : ROLES.COMBOBOX,\n slot: () => null,\n small: () => ROLES.GENERIC,\n span: () => ROLES.GENERIC,\n strong: () => ROLES.STRONG,\n style: () => null,\n sub: () => null,\n summary: () => ROLES.BUTTON,\n sup: () => null,\n svg: () => null,\n table: () => ROLES.TABLE,\n tbody: () => ROLES.ROWGROUP,\n td: () => ROLES.CELL,\n template: () => null,\n textarea: () => ROLES.TEXTBOX,\n tfoot: () => ROLES.ROWGROUP,\n th: () => null,\n thead: () => ROLES.ROWGROUP,\n time: () => ROLES.TIME,\n title: () => null,\n tr: () => ROLES.ROW,\n track: () => null,\n u: () => null,\n ul: () => ROLES.LIST,\n var: () => null,\n video: () => null,\n wbr: () => null,\n};\n","import { ElementState } from \"../core\";\nimport type { AccessibilitySpec, ElementOptions } from \"../types\";\nimport { IMPLICIT_ROLE } from \"./implicit-role\";\n\nclass Accessibility implements AccessibilitySpec {\n constructor(private element: ElementState) {}\n\n implicitRole(): string | null {\n return (\n IMPLICIT_ROLE[this.element.name.toLowerCase()]?.(this.element) ?? null\n );\n }\n}\n\nexport function accessibility(\n name: string,\n options: ElementOptions,\n): AccessibilitySpec {\n return new Accessibility(new ElementState(name, options));\n}\n","import { accessibility } from \"./accessibility\";\nimport { DEFAULT_ELEMENT_OPTIONS } from \"./constants\";\nimport { ElementSpec, ElementOptions } from \"./types\";\n\nclass Element implements ElementSpec {\n constructor(\n private name: string,\n private options: ElementOptions,\n ) {}\n\n get accessibility() {\n return accessibility(this.name, this.options);\n }\n}\n\nexport function element(\n name: string,\n options: ElementOptions = DEFAULT_ELEMENT_OPTIONS,\n): ElementSpec {\n return new Element(name, options);\n}\n"],"mappings":"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","names":["element","element"]}
|