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 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
- ### `getImplicitRole`
9
+ ### Element API
10
10
 
11
- Returns the implicit ARIA role of an HTML element according to the [HTML-ARIA specification](https://www.w3.org/TR/html-aria/). This provides the default role that each HTML element has.
11
+ Create an element instance to access various HTML standard utilities:
12
12
 
13
13
  ```typescript
14
- import { getImplicitRole } from "html-standard";
15
-
16
- // Basic usage
17
- getImplicitRole("button"); // 'button'
18
- getImplicitRole("nav"); // 'navigation'
19
- getImplicitRole("div"); // 'generic'
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
- // Elements with attribute-dependent roles
22
- getImplicitRole("a", {
23
- attribute: (key) => (key === "href" ? "https://example.com" : null),
24
- }); // 'link'
42
+ ### Accessibility API
25
43
 
26
- getImplicitRole("a", {
27
- attribute: () => null,
28
- }); // 'generic' (without href)
44
+ Access accessibility utilities directly:
29
45
 
30
- getImplicitRole("input", {
31
- attribute: (key) => (key === "type" ? "checkbox" : null),
32
- }); // 'checkbox'
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
- - Implements implicit role mapping from the HTML Living Standard
38
- - Supports attribute-dependent roles (e.g., `<a>`, `<input>`, `<img>`, `<select>`)
39
- - Case-insensitive element name handling
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
- getImplicitRole: () => getImplicitRole
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/html-aria/implicit-role/implicit-role.ts
129
+ // src/accessibility/implicit-role/implicit-role.ts
75
130
  var IMPLICIT_ROLE = {
76
- a: ({ has }) => has("href") ? ROLES.LINK : ROLES.GENERIC,
131
+ a: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
77
132
  abbr: () => null,
78
133
  address: () => ROLES.GROUP,
79
- area: ({ has }) => has("href") ? ROLES.LINK : ROLES.GENERIC,
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: () => null,
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: ({ get }) => {
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: ({ get }) => {
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: ({ has }) => has("multiple") ? ROLES.LISTBOX : ROLES.COMBOBOX,
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
- var getImplicitRoleInternal = (name, attribute) => {
231
- const getRoleFn = IMPLICIT_ROLE[name.toLowerCase()];
232
- if (!getRoleFn) {
233
- return null;
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/html-aria/implicit-role/get-implicit-role.ts
242
- var DEFAULT_OPTIONS = {
243
- attribute: () => null
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 getImplicitRole(element, options = DEFAULT_OPTIONS) {
246
- return getImplicitRoleInternal(element, options.attribute);
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
- getImplicitRole
325
+ accessibility,
326
+ element
251
327
  });
252
328
  //# sourceMappingURL=index.cjs.map
@@ -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 GetAttributeValue = (key: string) => string | number | null;
2
- interface GetImplicitRoleOptions {
3
- attribute: GetAttributeValue;
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 getImplicitRole(element: string, options?: GetImplicitRoleOptions): string | null;
59
+ declare function accessibility(name: string, options: ElementOptions): AccessibilitySpec;
7
60
 
8
- export { type GetAttributeValue, type GetImplicitRoleOptions, getImplicitRole };
61
+ export { type AttributeValue, type ElementSpec, accessibility, element };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,61 @@
1
- type GetAttributeValue = (key: string) => string | number | null;
2
- interface GetImplicitRoleOptions {
3
- attribute: GetAttributeValue;
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 getImplicitRole(element: string, options?: GetImplicitRoleOptions): string | null;
59
+ declare function accessibility(name: string, options: ElementOptions): AccessibilitySpec;
7
60
 
8
- export { type GetAttributeValue, type GetImplicitRoleOptions, getImplicitRole };
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/html-aria/implicit-role/implicit-role.ts
102
+ // src/accessibility/implicit-role/implicit-role.ts
49
103
  var IMPLICIT_ROLE = {
50
- a: ({ has }) => has("href") ? ROLES.LINK : ROLES.GENERIC,
104
+ a: (element2) => element2.attributes.has("href") ? ROLES.LINK : ROLES.GENERIC,
51
105
  abbr: () => null,
52
106
  address: () => ROLES.GROUP,
53
- area: ({ has }) => has("href") ? ROLES.LINK : ROLES.GENERIC,
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: () => null,
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: ({ get }) => {
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: ({ get }) => {
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: ({ has }) => has("multiple") ? ROLES.LISTBOX : ROLES.COMBOBOX,
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
- var getImplicitRoleInternal = (name, attribute) => {
205
- const getRoleFn = IMPLICIT_ROLE[name.toLowerCase()];
206
- if (!getRoleFn) {
207
- return null;
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/html-aria/implicit-role/get-implicit-role.ts
216
- var DEFAULT_OPTIONS = {
217
- attribute: () => null
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 getImplicitRole(element, options = DEFAULT_OPTIONS) {
220
- return getImplicitRoleInternal(element, options.attribute);
293
+ function element(name, options = DEFAULT_ELEMENT_OPTIONS) {
294
+ return new Element(name, options);
221
295
  }
222
296
  export {
223
- getImplicitRole
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "html-standard",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",