accented 0.0.1-dev.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/NOTICE +14 -0
  2. package/README.md +71 -0
  3. package/dist/accented.d.ts +28 -7
  4. package/dist/accented.d.ts.map +1 -1
  5. package/dist/accented.js +107 -42
  6. package/dist/accented.js.map +1 -1
  7. package/dist/common/tokens.d.ts +7 -0
  8. package/dist/common/tokens.d.ts.map +1 -0
  9. package/dist/common/tokens.js +8 -0
  10. package/dist/common/tokens.js.map +1 -0
  11. package/dist/constants.d.ts +4 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +4 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/dom-updater.d.ts +1 -6
  16. package/dist/dom-updater.d.ts.map +1 -1
  17. package/dist/dom-updater.js +136 -20
  18. package/dist/dom-updater.js.map +1 -1
  19. package/dist/elements/accented-dialog.d.ts +359 -0
  20. package/dist/elements/accented-dialog.d.ts.map +1 -0
  21. package/dist/elements/accented-dialog.js +377 -0
  22. package/dist/elements/accented-dialog.js.map +1 -0
  23. package/dist/elements/accented-trigger.d.ts +364 -0
  24. package/dist/elements/accented-trigger.d.ts.map +1 -0
  25. package/dist/elements/accented-trigger.js +214 -0
  26. package/dist/elements/accented-trigger.js.map +1 -0
  27. package/dist/fullscreen-listener.d.ts +2 -0
  28. package/dist/fullscreen-listener.d.ts.map +1 -0
  29. package/dist/fullscreen-listener.js +17 -0
  30. package/dist/fullscreen-listener.js.map +1 -0
  31. package/dist/intersection-observer.d.ts +5 -0
  32. package/dist/intersection-observer.d.ts.map +1 -0
  33. package/dist/intersection-observer.js +34 -0
  34. package/dist/intersection-observer.js.map +1 -0
  35. package/dist/log-and-rethrow.d.ts +2 -0
  36. package/dist/log-and-rethrow.d.ts.map +1 -0
  37. package/dist/log-and-rethrow.js +6 -0
  38. package/dist/log-and-rethrow.js.map +1 -0
  39. package/dist/logger.d.ts +2 -0
  40. package/dist/logger.d.ts.map +1 -0
  41. package/dist/logger.js +28 -0
  42. package/dist/logger.js.map +1 -0
  43. package/dist/register-elements.d.ts +2 -0
  44. package/dist/register-elements.d.ts.map +1 -0
  45. package/dist/register-elements.js +20 -0
  46. package/dist/register-elements.js.map +1 -0
  47. package/dist/resize-listener.d.ts +2 -0
  48. package/dist/resize-listener.d.ts.map +1 -0
  49. package/dist/resize-listener.js +17 -0
  50. package/dist/resize-listener.js.map +1 -0
  51. package/dist/scanner.d.ts +3 -0
  52. package/dist/scanner.d.ts.map +1 -0
  53. package/dist/scanner.js +153 -0
  54. package/dist/scanner.js.map +1 -0
  55. package/dist/scroll-listeners.d.ts +2 -0
  56. package/dist/scroll-listeners.d.ts.map +1 -0
  57. package/dist/scroll-listeners.js +37 -0
  58. package/dist/scroll-listeners.js.map +1 -0
  59. package/dist/state.d.ts +7 -0
  60. package/dist/state.d.ts.map +1 -0
  61. package/dist/state.js +16 -0
  62. package/dist/state.js.map +1 -0
  63. package/dist/task-queue.d.ts +5 -6
  64. package/dist/task-queue.d.ts.map +1 -1
  65. package/dist/task-queue.js +30 -25
  66. package/dist/task-queue.js.map +1 -1
  67. package/dist/types.d.ts +227 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/utils/are-elements-with-issues-equal.d.ts +3 -0
  72. package/dist/utils/are-elements-with-issues-equal.d.ts.map +1 -0
  73. package/dist/utils/are-elements-with-issues-equal.js +5 -0
  74. package/dist/utils/are-elements-with-issues-equal.js.map +1 -0
  75. package/dist/utils/are-issue-sets-equal.d.ts +3 -0
  76. package/dist/utils/are-issue-sets-equal.d.ts.map +1 -0
  77. package/dist/utils/are-issue-sets-equal.js +6 -0
  78. package/dist/utils/are-issue-sets-equal.js.map +1 -0
  79. package/dist/utils/containing-blocks.d.ts +3 -0
  80. package/dist/utils/containing-blocks.d.ts.map +1 -0
  81. package/dist/utils/containing-blocks.js +46 -0
  82. package/dist/utils/containing-blocks.js.map +1 -0
  83. package/dist/utils/contains.d.ts +2 -0
  84. package/dist/utils/contains.d.ts.map +1 -0
  85. package/dist/utils/contains.js +19 -0
  86. package/dist/utils/contains.js.map +1 -0
  87. package/dist/utils/deduplicate-nodes.d.ts +2 -0
  88. package/dist/utils/deduplicate-nodes.d.ts.map +1 -0
  89. package/dist/utils/deduplicate-nodes.js +4 -0
  90. package/dist/utils/deduplicate-nodes.js.map +1 -0
  91. package/dist/utils/deep-merge.d.ts +4 -0
  92. package/dist/utils/deep-merge.d.ts.map +1 -0
  93. package/dist/utils/deep-merge.js +21 -0
  94. package/dist/utils/deep-merge.js.map +1 -0
  95. package/dist/utils/dom-helpers.d.ts +9 -0
  96. package/dist/utils/dom-helpers.d.ts.map +1 -0
  97. package/dist/utils/dom-helpers.js +34 -0
  98. package/dist/utils/dom-helpers.js.map +1 -0
  99. package/dist/utils/ensure-non-empty.d.ts +2 -0
  100. package/dist/utils/ensure-non-empty.d.ts.map +1 -0
  101. package/dist/utils/ensure-non-empty.js +7 -0
  102. package/dist/utils/ensure-non-empty.js.map +1 -0
  103. package/dist/utils/get-element-html.d.ts +2 -0
  104. package/dist/utils/get-element-html.d.ts.map +1 -0
  105. package/dist/utils/get-element-html.js +16 -0
  106. package/dist/utils/get-element-html.js.map +1 -0
  107. package/dist/utils/get-element-position.d.ts +11 -0
  108. package/dist/utils/get-element-position.d.ts.map +1 -0
  109. package/dist/utils/get-element-position.js +70 -0
  110. package/dist/utils/get-element-position.js.map +1 -0
  111. package/dist/utils/get-parent.d.ts +2 -0
  112. package/dist/utils/get-parent.d.ts.map +1 -0
  113. package/dist/utils/get-parent.js +12 -0
  114. package/dist/utils/get-parent.js.map +1 -0
  115. package/dist/utils/get-scan-context.d.ts +3 -0
  116. package/dist/utils/get-scan-context.d.ts.map +1 -0
  117. package/dist/utils/get-scan-context.js +28 -0
  118. package/dist/utils/get-scan-context.js.map +1 -0
  119. package/dist/utils/get-scrollable-ancestors.d.ts +2 -0
  120. package/dist/utils/get-scrollable-ancestors.d.ts.map +1 -0
  121. package/dist/utils/get-scrollable-ancestors.js +19 -0
  122. package/dist/utils/get-scrollable-ancestors.js.map +1 -0
  123. package/dist/utils/is-node-in-scan-context.d.ts +3 -0
  124. package/dist/utils/is-node-in-scan-context.d.ts.map +1 -0
  125. package/dist/utils/is-node-in-scan-context.js +26 -0
  126. package/dist/utils/is-node-in-scan-context.js.map +1 -0
  127. package/dist/utils/is-non-empty.d.ts +2 -0
  128. package/dist/utils/is-non-empty.d.ts.map +1 -0
  129. package/dist/utils/is-non-empty.js +4 -0
  130. package/dist/utils/is-non-empty.js.map +1 -0
  131. package/dist/utils/normalize-context.d.ts +3 -0
  132. package/dist/utils/normalize-context.d.ts.map +1 -0
  133. package/dist/utils/normalize-context.js +59 -0
  134. package/dist/utils/normalize-context.js.map +1 -0
  135. package/dist/utils/recalculate-positions.d.ts +2 -0
  136. package/dist/utils/recalculate-positions.d.ts.map +1 -0
  137. package/dist/utils/recalculate-positions.js +27 -0
  138. package/dist/utils/recalculate-positions.js.map +1 -0
  139. package/dist/utils/recalculate-scrollable-ancestors.d.ts +2 -0
  140. package/dist/utils/recalculate-scrollable-ancestors.d.ts.map +1 -0
  141. package/dist/utils/recalculate-scrollable-ancestors.js +13 -0
  142. package/dist/utils/recalculate-scrollable-ancestors.js.map +1 -0
  143. package/dist/utils/shadow-dom-aware-mutation-observer.d.ts +10 -0
  144. package/dist/utils/shadow-dom-aware-mutation-observer.d.ts.map +1 -0
  145. package/dist/utils/shadow-dom-aware-mutation-observer.js +61 -0
  146. package/dist/utils/shadow-dom-aware-mutation-observer.js.map +1 -0
  147. package/dist/utils/supports-anchor-positioning.d.ts +6 -0
  148. package/dist/utils/supports-anchor-positioning.d.ts.map +1 -0
  149. package/dist/utils/supports-anchor-positioning.js +4 -0
  150. package/dist/utils/supports-anchor-positioning.js.map +1 -0
  151. package/dist/utils/transform-violations.d.ts +4 -0
  152. package/dist/utils/transform-violations.d.ts.map +1 -0
  153. package/dist/utils/transform-violations.js +61 -0
  154. package/dist/utils/transform-violations.js.map +1 -0
  155. package/dist/utils/update-elements-with-issues.d.ts +13 -0
  156. package/dist/utils/update-elements-with-issues.d.ts.map +1 -0
  157. package/dist/utils/update-elements-with-issues.js +96 -0
  158. package/dist/utils/update-elements-with-issues.js.map +1 -0
  159. package/dist/validate-options.d.ts +3 -0
  160. package/dist/validate-options.d.ts.map +1 -0
  161. package/dist/validate-options.js +129 -0
  162. package/dist/validate-options.js.map +1 -0
  163. package/package.json +21 -8
  164. package/src/accented.test.ts +24 -0
  165. package/src/accented.ts +130 -0
  166. package/src/common/tokens.ts +10 -0
  167. package/src/constants.ts +3 -0
  168. package/src/dom-updater.ts +165 -0
  169. package/src/elements/accented-dialog.ts +419 -0
  170. package/src/elements/accented-trigger.ts +251 -0
  171. package/src/fullscreen-listener.ts +21 -0
  172. package/src/intersection-observer.ts +39 -0
  173. package/src/log-and-rethrow.ts +8 -0
  174. package/src/logger.ts +36 -0
  175. package/src/register-elements.ts +21 -0
  176. package/src/resize-listener.ts +21 -0
  177. package/src/scanner.ts +195 -0
  178. package/src/scroll-listeners.ts +45 -0
  179. package/src/state.ts +35 -0
  180. package/src/task-queue.test.ts +136 -0
  181. package/src/task-queue.ts +61 -0
  182. package/src/types.ts +258 -0
  183. package/src/utils/are-elements-with-issues-equal.ts +11 -0
  184. package/src/utils/are-issue-sets-equal.test.ts +53 -0
  185. package/src/utils/are-issue-sets-equal.ts +12 -0
  186. package/src/utils/containing-blocks.ts +60 -0
  187. package/src/utils/contains.test.ts +54 -0
  188. package/src/utils/contains.ts +19 -0
  189. package/src/utils/deduplicate-nodes.ts +3 -0
  190. package/src/utils/deep-merge.test.ts +41 -0
  191. package/src/utils/deep-merge.ts +24 -0
  192. package/src/utils/dom-helpers.ts +42 -0
  193. package/src/utils/ensure-non-empty.ts +6 -0
  194. package/src/utils/get-element-html.ts +15 -0
  195. package/src/utils/get-element-position.ts +89 -0
  196. package/src/utils/get-parent.ts +14 -0
  197. package/src/utils/get-scan-context.test.ts +85 -0
  198. package/src/utils/get-scan-context.ts +36 -0
  199. package/src/utils/get-scrollable-ancestors.ts +22 -0
  200. package/src/utils/is-node-in-scan-context.test.ts +70 -0
  201. package/src/utils/is-node-in-scan-context.ts +29 -0
  202. package/src/utils/is-non-empty.ts +3 -0
  203. package/src/utils/normalize-context.test.ts +105 -0
  204. package/src/utils/normalize-context.ts +65 -0
  205. package/src/utils/recalculate-positions.ts +27 -0
  206. package/src/utils/recalculate-scrollable-ancestors.ts +13 -0
  207. package/src/utils/shadow-dom-aware-mutation-observer.ts +75 -0
  208. package/src/utils/supports-anchor-positioning.ts +7 -0
  209. package/src/utils/transform-violations.test.ts +128 -0
  210. package/src/utils/transform-violations.ts +74 -0
  211. package/src/utils/update-elements-with-issues.test.ts +371 -0
  212. package/src/utils/update-elements-with-issues.ts +144 -0
  213. package/src/validate-options.ts +184 -0
  214. package/dist/utils/issuesToElements.d.ts +0 -3
  215. package/dist/utils/issuesToElements.d.ts.map +0 -1
  216. package/dist/utils/issuesToElements.js +0 -16
  217. package/dist/utils/issuesToElements.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export declare function getParent(element: Element): Element | null;
2
+ //# sourceMappingURL=get-parent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-parent.d.ts","sourceRoot":"","sources":["../../src/utils/get-parent.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAW1D"}
@@ -0,0 +1,12 @@
1
+ import { isDocumentFragment, isShadowRoot } from './dom-helpers.js';
2
+ export function getParent(element) {
3
+ if (element.parentElement) {
4
+ return element.parentElement;
5
+ }
6
+ const rootNode = element.getRootNode();
7
+ if (isDocumentFragment(rootNode) && isShadowRoot(rootNode)) {
8
+ return rootNode.host;
9
+ }
10
+ return null;
11
+ }
12
+ //# sourceMappingURL=get-parent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-parent.js","sourceRoot":"","sources":["../../src/utils/get-parent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,aAAa,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Context, ScanContext } from '../types.ts';
2
+ export declare function getScanContext(nodes: Array<Node>, context: Context): ScanContext;
3
+ //# sourceMappingURL=get-scan-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-scan-context.d.ts","sourceRoot":"","sources":["../../src/utils/get-scan-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMxD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CA6BhF"}
@@ -0,0 +1,28 @@
1
+ import { contains } from './contains.js';
2
+ import { deduplicateNodes } from './deduplicate-nodes.js';
3
+ import { isNodeInScanContext } from './is-node-in-scan-context.js';
4
+ import { normalizeContext } from './normalize-context.js';
5
+ export function getScanContext(nodes, context) {
6
+ const { include: contextInclude, exclude: contextExclude } = normalizeContext(context);
7
+ // Filter only nodes that are included by context (see isNodeInContext above).
8
+ const nodesInContext = nodes.filter((node) => isNodeInScanContext(node, {
9
+ include: contextInclude,
10
+ exclude: contextExclude,
11
+ }));
12
+ const include = [];
13
+ const exclude = [];
14
+ // Adds all nodesInContext to the include array.
15
+ include.push(...nodesInContext);
16
+ // Now add any included and excluded context nodes that are contained by any of the original nodes.
17
+ for (const node of nodes) {
18
+ const includeDescendants = contextInclude.filter((item) => contains(node, item));
19
+ include.push(...includeDescendants);
20
+ const excludeDescendants = contextExclude.filter((item) => contains(node, item));
21
+ exclude.push(...excludeDescendants);
22
+ }
23
+ return {
24
+ include: deduplicateNodes(include),
25
+ exclude: deduplicateNodes(exclude),
26
+ };
27
+ }
28
+ //# sourceMappingURL=get-scan-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-scan-context.js","sourceRoot":"","sources":["../../src/utils/get-scan-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,KAAkB,EAAE,OAAgB;IACjE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEvF,8EAA8E;IAC9E,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3C,mBAAmB,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,cAAc;KACxB,CAAC,CACH,CAAC;IAEF,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,gDAAgD;IAChD,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAEhC,mGAAmG;IACnG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;QACpC,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAClC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getScrollableAncestors(element: Element, win: Window): Set<Element>;
2
+ //# sourceMappingURL=get-scrollable-ancestors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-scrollable-ancestors.d.ts","sourceRoot":"","sources":["../../src/utils/get-scrollable-ancestors.ts"],"names":[],"mappings":"AAIA,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,gBAiBnE"}
@@ -0,0 +1,19 @@
1
+ import { getParent } from './get-parent.js';
2
+ const scrollableOverflowValues = new Set(['auto', 'scroll', 'hidden']);
3
+ export function getScrollableAncestors(element, win) {
4
+ let currentElement = element;
5
+ const scrollableAncestors = new Set();
6
+ while (true) {
7
+ currentElement = getParent(currentElement);
8
+ if (!currentElement) {
9
+ break;
10
+ }
11
+ const computedStyle = win.getComputedStyle(currentElement);
12
+ if (scrollableOverflowValues.has(computedStyle.overflowX) ||
13
+ scrollableOverflowValues.has(computedStyle.overflowY)) {
14
+ scrollableAncestors.add(currentElement);
15
+ }
16
+ }
17
+ return scrollableAncestors;
18
+ }
19
+ //# sourceMappingURL=get-scrollable-ancestors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-scrollable-ancestors.js","sourceRoot":"","sources":["../../src/utils/get-scrollable-ancestors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,GAAW;IAClE,IAAI,cAAc,GAAmB,OAAO,CAAC;IAC7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAW,CAAC;IAC/C,OAAO,IAAI,EAAE,CAAC;QACZ,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QACD,MAAM,aAAa,GAAG,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC3D,IACE,wBAAwB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC;YACrD,wBAAwB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,EACrD,CAAC;YACD,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ScanContext } from '../types.ts';
2
+ export declare function isNodeInScanContext(node: Node, { include, exclude }: ScanContext): boolean;
3
+ //# sourceMappingURL=is-node-in-scan-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-node-in-scan-context.d.ts","sourceRoot":"","sources":["../../src/utils/is-node-in-scan-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc/C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,OAAO,CAY1F"}
@@ -0,0 +1,26 @@
1
+ /* Adapted from https://github.com/dequelabs/axe-core/blob/fd6239bfc97ebc904044f93f68d7e49137f744ad/lib/core/utils/is-node-in-context.js */
2
+ import { contains } from './contains.js';
3
+ import { ensureNonEmpty } from './ensure-non-empty.js';
4
+ function getDeepest(nodes) {
5
+ let deepest = nodes[0];
6
+ for (const node of nodes.slice(1)) {
7
+ if (!contains(node, deepest)) {
8
+ deepest = node;
9
+ }
10
+ }
11
+ return deepest;
12
+ }
13
+ export function isNodeInScanContext(node, { include, exclude }) {
14
+ const filteredInclude = include.filter((includeNode) => contains(includeNode, node));
15
+ if (filteredInclude.length === 0) {
16
+ return false;
17
+ }
18
+ const filteredExclude = exclude.filter((excludeNode) => contains(excludeNode, node));
19
+ if (filteredExclude.length === 0) {
20
+ return true;
21
+ }
22
+ const deepestInclude = getDeepest(ensureNonEmpty(filteredInclude));
23
+ const deepestExclude = getDeepest(ensureNonEmpty(filteredExclude));
24
+ return contains(deepestExclude, deepestInclude);
25
+ }
26
+ //# sourceMappingURL=is-node-in-scan-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-node-in-scan-context.js","sourceRoot":"","sources":["../../src/utils/is-node-in-scan-context.ts"],"names":[],"mappings":"AAAA,2IAA2I;AAG3I,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,SAAS,UAAU,CAAC,KAAwB;IAC1C,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAe;IAC/E,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACrF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACrF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isNonEmpty<T>(arr: T[]): arr is [T, ...T[]];
2
+ //# sourceMappingURL=is-non-empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-non-empty.d.ts","sourceRoot":"","sources":["../../src/utils/is-non-empty.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAE1D"}
@@ -0,0 +1,4 @@
1
+ export function isNonEmpty(arr) {
2
+ return arr.length > 0;
3
+ }
4
+ //# sourceMappingURL=is-non-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-non-empty.js","sourceRoot":"","sources":["../../src/utils/is-non-empty.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAI,GAAQ;IACpC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Context, ScanContext } from '../types.ts';
2
+ export declare function normalizeContext(context: Context): ScanContext;
3
+ //# sourceMappingURL=normalize-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-context.d.ts","sourceRoot":"","sources":["../../src/utils/normalize-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,WAAW,EAAY,MAAM,aAAa,CAAC;AA8C/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAkB9D"}
@@ -0,0 +1,59 @@
1
+ import { deduplicateNodes } from './deduplicate-nodes.js';
2
+ import { isNode, isNodeList } from './dom-helpers.js';
3
+ import { isNonEmpty } from './is-non-empty.js';
4
+ function recursiveSelectAll(selectors, root) {
5
+ const nodesOnCurrentLevel = root.querySelectorAll(selectors[0]);
6
+ if (selectors.length === 1) {
7
+ return Array.from(nodesOnCurrentLevel);
8
+ }
9
+ const restSelectors = selectors.slice(1);
10
+ if (!isNonEmpty(restSelectors)) {
11
+ throw new Error('Error: the restSelectors array must not be empty.');
12
+ }
13
+ const selected = [];
14
+ for (const node of nodesOnCurrentLevel) {
15
+ if (node.shadowRoot) {
16
+ selected.push(...recursiveSelectAll(restSelectors, node.shadowRoot));
17
+ }
18
+ }
19
+ return selected;
20
+ }
21
+ function selectorToNodes(selector) {
22
+ if (typeof selector === 'string') {
23
+ return recursiveSelectAll([selector], document);
24
+ }
25
+ if (isNode(selector)) {
26
+ return [selector];
27
+ }
28
+ return recursiveSelectAll(selector.fromShadowDom, document);
29
+ }
30
+ function contextPropToNodes(contextProp) {
31
+ let nodes = [];
32
+ if (typeof contextProp === 'object' && (Array.isArray(contextProp) || isNodeList(contextProp))) {
33
+ nodes = Array.from(contextProp).flatMap((item) => selectorToNodes(item));
34
+ }
35
+ else {
36
+ nodes = selectorToNodes(contextProp);
37
+ }
38
+ return deduplicateNodes(nodes);
39
+ }
40
+ export function normalizeContext(context) {
41
+ let contextInclude = [];
42
+ let contextExclude = [];
43
+ if (typeof context === 'object' && ('include' in context || 'exclude' in context)) {
44
+ if (context.include !== undefined) {
45
+ contextInclude = contextPropToNodes(context.include);
46
+ }
47
+ if (context.exclude !== undefined) {
48
+ contextExclude = contextPropToNodes(context.exclude);
49
+ }
50
+ }
51
+ else {
52
+ contextInclude = contextPropToNodes(context);
53
+ }
54
+ return {
55
+ include: contextInclude,
56
+ exclude: contextExclude,
57
+ };
58
+ }
59
+ //# sourceMappingURL=normalize-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-context.js","sourceRoot":"","sources":["../../src/utils/normalize-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function recalculatePositions(): void;
2
+ //# sourceMappingURL=recalculate-positions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recalculate-positions.d.ts","sourceRoot":"","sources":["../../src/utils/recalculate-positions.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,SAmBnC"}
@@ -0,0 +1,27 @@
1
+ import { batch } from '@preact/signals-core';
2
+ import { logAndRethrow } from '../log-and-rethrow.js';
3
+ import { extendedElementsWithIssues } from '../state.js';
4
+ import { getElementPosition } from './get-element-position.js';
5
+ let frameRequested = false;
6
+ export function recalculatePositions() {
7
+ if (frameRequested) {
8
+ return;
9
+ }
10
+ frameRequested = true;
11
+ window.requestAnimationFrame(() => {
12
+ try {
13
+ frameRequested = false;
14
+ batch(() => {
15
+ for (const { element, position, visible } of extendedElementsWithIssues.value) {
16
+ if (visible.value && element.isConnected) {
17
+ position.value = getElementPosition(element, window);
18
+ }
19
+ }
20
+ });
21
+ }
22
+ catch (error) {
23
+ logAndRethrow(error);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=recalculate-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recalculate-positions.js","sourceRoot":"","sources":["../../src/utils/recalculate-positions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,oBAAoB;IAClC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC;YACH,cAAc,GAAG,KAAK,CAAC;YACvB,KAAK,CAAC,GAAG,EAAE;gBACT,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,0BAA0B,CAAC,KAAK,EAAE,CAAC;oBAC9E,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;wBACzC,QAAQ,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function recalculateScrollableAncestors(): void;
2
+ //# sourceMappingURL=recalculate-scrollable-ancestors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recalculate-scrollable-ancestors.d.ts","sourceRoot":"","sources":["../../src/utils/recalculate-scrollable-ancestors.ts"],"names":[],"mappings":"AAIA,wBAAgB,8BAA8B,SAQ7C"}
@@ -0,0 +1,13 @@
1
+ import { batch } from '@preact/signals-core';
2
+ import { extendedElementsWithIssues } from '../state.js';
3
+ import { getScrollableAncestors } from './get-scrollable-ancestors.js';
4
+ export function recalculateScrollableAncestors() {
5
+ batch(() => {
6
+ for (const { element, scrollableAncestors } of extendedElementsWithIssues.value) {
7
+ if (element.isConnected) {
8
+ scrollableAncestors.value = getScrollableAncestors(element, window);
9
+ }
10
+ }
11
+ });
12
+ }
13
+ //# sourceMappingURL=recalculate-scrollable-ancestors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recalculate-scrollable-ancestors.js","sourceRoot":"","sources":["../../src/utils/recalculate-scrollable-ancestors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,UAAU,8BAA8B;IAC5C,KAAK,CAAC,GAAG,EAAE;QACT,KAAK,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,0BAA0B,CAAC,KAAK,EAAE,CAAC;YAChF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,mBAAmB,CAAC,KAAK,GAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function createShadowDOMAwareMutationObserver(name: string, callback: MutationCallback): {
2
+ "__#4@#shadowRoots": Set<unknown>;
3
+ "__#4@#options": MutationObserverInit | undefined;
4
+ observe(target: Node, options?: MutationObserverInit): void;
5
+ disconnect(): void;
6
+ "__#4@#observeShadowRoots": (elements: Array<Element | Document | DocumentFragment>) => void;
7
+ "__#4@#deleteShadowRoots": (elements: Array<Element | Document | DocumentFragment>) => void;
8
+ takeRecords(): MutationRecord[];
9
+ };
10
+ //# sourceMappingURL=shadow-dom-aware-mutation-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-dom-aware-mutation-observer.d.ts","sourceRoot":"","sources":["../../src/utils/shadow-dom-aware-mutation-observer.ts"],"names":[],"mappings":"AAGA,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB;;qBAI/E,oBAAoB,GAAG,SAAS;oBA2BjB,IAAI,YAAY,oBAAoB,GAAG,IAAI;kBAQ7C,IAAI;iCAKJ,UAAU,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,gBAAgB,CAAC;gCAcvD,UAAU,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,gBAAgB,CAAC;;EAa/E"}
@@ -0,0 +1,61 @@
1
+ import { getAccentedElementNames } from '../constants.js';
2
+ import { isDocument, isDocumentFragment, isElement } from './dom-helpers.js';
3
+ export function createShadowDOMAwareMutationObserver(name, callback) {
4
+ class ShadowDOMAwareMutationObserver extends MutationObserver {
5
+ #shadowRoots = new Set();
6
+ #options;
7
+ constructor(callback) {
8
+ super((mutations, observer) => {
9
+ const accentedElementNames = getAccentedElementNames(name);
10
+ const childListMutations = mutations.filter((mutation) => mutation.type === 'childList');
11
+ const newElements = childListMutations
12
+ .flatMap((mutation) => [...mutation.addedNodes])
13
+ .filter((node) => isElement(node))
14
+ .filter((node) => !accentedElementNames.includes(node.nodeName.toLowerCase()));
15
+ this.#observeShadowRoots(newElements);
16
+ const removedElements = childListMutations
17
+ .flatMap((mutation) => [...mutation.removedNodes])
18
+ .filter((node) => isElement(node))
19
+ .filter((node) => !accentedElementNames.includes(node.nodeName.toLowerCase()));
20
+ // Mutation observer has no "unobserve" method, so we're simply deleting
21
+ // the elements from the set of shadow roots.
22
+ this.#deleteShadowRoots(removedElements);
23
+ callback(mutations, observer);
24
+ });
25
+ }
26
+ observe(target, options) {
27
+ this.#options ??= options;
28
+ if (isElement(target) || isDocument(target) || isDocumentFragment(target)) {
29
+ this.#observeShadowRoots([target]);
30
+ }
31
+ super.observe(target, options);
32
+ }
33
+ disconnect() {
34
+ this.#shadowRoots.clear();
35
+ super.disconnect();
36
+ }
37
+ #observeShadowRoots = (elements) => {
38
+ const shadowRoots = elements
39
+ .flatMap((element) => [...element.querySelectorAll('*')])
40
+ .filter((element) => element.shadowRoot)
41
+ .map((element) => element.shadowRoot);
42
+ for (const shadowRoot of shadowRoots) {
43
+ if (shadowRoot) {
44
+ this.#shadowRoots.add(shadowRoot);
45
+ this.observe(shadowRoot, this.#options);
46
+ }
47
+ }
48
+ };
49
+ #deleteShadowRoots = (elements) => {
50
+ const shadowRoots = elements
51
+ .flatMap((element) => [...element.querySelectorAll('*')])
52
+ .filter((element) => element.shadowRoot)
53
+ .map((element) => element.shadowRoot);
54
+ for (const shadowRoot of shadowRoots) {
55
+ this.#shadowRoots.delete(shadowRoot);
56
+ }
57
+ };
58
+ }
59
+ return new ShadowDOMAwareMutationObserver(callback);
60
+ }
61
+ //# sourceMappingURL=shadow-dom-aware-mutation-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-dom-aware-mutation-observer.js","sourceRoot":"","sources":["../../src/utils/shadow-dom-aware-mutation-observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type WindowWithCSS = Window & {
2
+ CSS: typeof CSS;
3
+ };
4
+ export declare function supportsAnchorPositioning(win: WindowWithCSS): boolean;
5
+ export {};
6
+ //# sourceMappingURL=supports-anchor-positioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports-anchor-positioning.d.ts","sourceRoot":"","sources":["../../src/utils/supports-anchor-positioning.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,MAAM,GAAG;IAC5B,GAAG,EAAE,OAAO,GAAG,CAAC;CACjB,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,aAAa,WAE3D"}
@@ -0,0 +1,4 @@
1
+ export function supportsAnchorPositioning(win) {
2
+ return win.CSS.supports('anchor-name: --foo') && win.CSS.supports('position-anchor: --foo');
3
+ }
4
+ //# sourceMappingURL=supports-anchor-positioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports-anchor-positioning.js","sourceRoot":"","sources":["../../src/utils/supports-anchor-positioning.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,yBAAyB,CAAC,GAAkB;IAC1D,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AxeResults } from 'axe-core';
2
+ import type { ElementWithIssues } from '../types.ts';
3
+ export declare function transformViolations(violations: typeof AxeResults.violations, name: string): ElementWithIssues[];
4
+ //# sourceMappingURL=transform-violations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-violations.d.ts","sourceRoot":"","sources":["../../src/utils/transform-violations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAS,MAAM,aAAa,CAAC;AA0B5D,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,uBA8CzF"}
@@ -0,0 +1,61 @@
1
+ // This is a list of axe-core violations (their ids) that may be flagged by axe-core
2
+ // as false positives if an Accented trigger is a descendant of the element with the issue.
3
+ const violationsAffectedByAccentedTriggers = [
4
+ 'aria-hidden-focus',
5
+ 'aria-text',
6
+ 'definition-list',
7
+ 'label-content-name-mismatch',
8
+ 'list',
9
+ 'nested-interactive',
10
+ 'scrollable-region-focusable', // The Accented trigger might make the content grow such that scrolling is required.
11
+ ];
12
+ function maybeCausedByAccented(violationId, element, name) {
13
+ return (violationsAffectedByAccentedTriggers.includes(violationId) &&
14
+ Boolean(element.querySelector(`${name}-trigger`)));
15
+ }
16
+ function impactCompare(a, b) {
17
+ const impactOrder = [null, 'minor', 'moderate', 'serious', 'critical'];
18
+ return impactOrder.indexOf(a) - impactOrder.indexOf(b);
19
+ }
20
+ export function transformViolations(violations, name) {
21
+ const elementsWithIssues = [];
22
+ for (const violation of violations) {
23
+ for (const node of violation.nodes) {
24
+ const { element, target } = node;
25
+ // Although axe-core can perform iframe scanning, I haven't succeeded in it,
26
+ // and the docs suggest that the axe-core script should be explicitly included
27
+ // in each of the iframed documents anyway.
28
+ // It seems preferable to disallow iframe scanning and not report issues in elements within iframes
29
+ // in the case that such issues are for some reason reported by axe-core.
30
+ // A consumer of Accented can instead scan the iframed document by calling Accented initialization from that document.
31
+ const isInIframe = target.length > 1;
32
+ if (element && !isInIframe && !maybeCausedByAccented(violation.id, element, name)) {
33
+ const issue = {
34
+ id: violation.id,
35
+ title: violation.help,
36
+ description: node.failureSummary ?? violation.description,
37
+ url: violation.helpUrl,
38
+ impact: violation.impact ?? null,
39
+ };
40
+ const existingElement = elementsWithIssues.find((elementWithIssues) => elementWithIssues.element === element);
41
+ if (existingElement === undefined) {
42
+ elementsWithIssues.push({
43
+ element,
44
+ rootNode: element.getRootNode(),
45
+ issues: [issue],
46
+ });
47
+ }
48
+ else {
49
+ existingElement.issues.push(issue);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ for (const elementWithIssues of elementsWithIssues) {
55
+ elementWithIssues.issues.sort((a, b) => {
56
+ return -impactCompare(a.impact, b.impact) || a.id.localeCompare(b.id);
57
+ });
58
+ }
59
+ return elementsWithIssues;
60
+ }
61
+ //# sourceMappingURL=transform-violations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-violations.js","sourceRoot":"","sources":["../../src/utils/transform-violations.ts"],"names":[],"mappings":"AAGA,oFAAoF;AACpF,2FAA2F;AAC3F,MAAM,oCAAoC,GAAG;IAC3C,mBAAmB;IACnB,WAAW;IACX,iBAAiB;IACjB,6BAA6B;IAC7B,MAAM;IACN,oBAAoB;IACpB,6BAA6B,EAAE,oFAAoF;CACpH,CAAC;AAEF,SAAS,qBAAqB,CAAC,WAAmB,EAAE,OAAoB,EAAE,IAAY;IACpF,OAAO,CACL,oCAAoC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,CAAc,EAAE,CAAc;IACnD,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACvE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAwC,EAAE,IAAY;IACxF,MAAM,kBAAkB,GAA6B,EAAE,CAAC;IAExD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAEjC,4EAA4E;YAC5E,8EAA8E;YAC9E,2CAA2C;YAC3C,mGAAmG;YACnG,yEAAyE;YACzE,sHAAsH;YACtH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAErC,IAAI,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,GAAU;oBACnB,EAAE,EAAE,SAAS,CAAC,EAAE;oBAChB,KAAK,EAAE,SAAS,CAAC,IAAI;oBACrB,WAAW,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,WAAW;oBACzD,GAAG,EAAE,SAAS,CAAC,OAAO;oBACtB,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,IAAI;iBACjC,CAAC;gBACF,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAC7C,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,KAAK,OAAO,CAC7D,CAAC;gBACF,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBAClC,kBAAkB,CAAC,IAAI,CAAC;wBACtB,OAAO;wBACP,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE;wBAC/B,MAAM,EAAE,CAAC,KAAK,CAAC;qBAChB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;QACnD,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Signal } from '@preact/signals-core';
2
+ import type { AxeResults } from 'axe-core';
3
+ import type { ExtendedElementWithIssues, ScanContext } from '../types.ts';
4
+ export declare function updateElementsWithIssues({ extendedElementsWithIssues, scanContext, violations, win, name, }: {
5
+ extendedElementsWithIssues: Signal<Array<ExtendedElementWithIssues>>;
6
+ scanContext: ScanContext;
7
+ violations: typeof AxeResults.violations;
8
+ win: Window & {
9
+ CSS: typeof CSS;
10
+ };
11
+ name: string;
12
+ }): void;
13
+ //# sourceMappingURL=update-elements-with-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-elements-with-issues.d.ts","sourceRoot":"","sources":["../../src/utils/update-elements-with-issues.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA6B1E,wBAAgB,wBAAwB,CAAC,EACvC,0BAA0B,EAC1B,WAAW,EACX,UAAU,EACV,GAAG,EACH,IAAI,GACL,EAAE;IACD,0BAA0B,EAAE,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACrE,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,OAAO,UAAU,CAAC,UAAU,CAAC;IACzC,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,OAAO,GAAG,CAAA;KAAE,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd,QAiGA"}
@@ -0,0 +1,96 @@
1
+ import { batch, signal } from '@preact/signals-core';
2
+ import { areElementsWithIssuesEqual } from './are-elements-with-issues-equal.js';
3
+ import { areIssueSetsEqual } from './are-issue-sets-equal.js';
4
+ import { isSvgElement } from './dom-helpers.js';
5
+ import { getElementPosition } from './get-element-position.js';
6
+ import { getParent } from './get-parent.js';
7
+ import { getScrollableAncestors } from './get-scrollable-ancestors.js';
8
+ import { isNodeInScanContext } from './is-node-in-scan-context.js';
9
+ import { supportsAnchorPositioning } from './supports-anchor-positioning.js';
10
+ import { transformViolations } from './transform-violations.js';
11
+ function shouldSkipRender(element) {
12
+ // Skip rendering if the element is inside an SVG:
13
+ // https://github.com/pomerantsev/accented/issues/62
14
+ const parent = getParent(element);
15
+ const isInsideSvg = Boolean(parent && isSvgElement(parent));
16
+ // Some issues, such as meta-viewport, are on <head> descendants,
17
+ // but since <head> is never rendered, we don't want to output anything
18
+ // for those in the DOM.
19
+ // We're not anticipating the use of shadow DOM in <head>,
20
+ // so the use of .closest() should be fine.
21
+ const isInsideHead = element.closest('head') !== null;
22
+ return isInsideSvg || isInsideHead;
23
+ }
24
+ let count = 0;
25
+ export function updateElementsWithIssues({ extendedElementsWithIssues, scanContext, violations, win, name, }) {
26
+ const updatedElementsWithIssues = transformViolations(violations, name);
27
+ batch(() => {
28
+ for (const updatedElementWithIssues of updatedElementsWithIssues) {
29
+ const existingElementIndex = extendedElementsWithIssues.value.findIndex((extendedElementWithIssues) => areElementsWithIssuesEqual(extendedElementWithIssues, updatedElementWithIssues));
30
+ if (existingElementIndex > -1 &&
31
+ extendedElementsWithIssues.value[existingElementIndex] &&
32
+ !areIssueSetsEqual(extendedElementsWithIssues.value[existingElementIndex].issues.value, updatedElementWithIssues.issues)) {
33
+ extendedElementsWithIssues.value[existingElementIndex].issues.value =
34
+ updatedElementWithIssues.issues;
35
+ }
36
+ }
37
+ const addedElementsWithIssues = updatedElementsWithIssues.filter((updatedElementWithIssues) => {
38
+ return !extendedElementsWithIssues.value.some((extendedElementWithIssues) => areElementsWithIssuesEqual(extendedElementWithIssues, updatedElementWithIssues));
39
+ });
40
+ // Only consider an element to be removed in two cases:
41
+ // 1. It has been removed from the DOM.
42
+ // 2. It is within the scan context, but not among updatedElementsWithIssues.
43
+ const removedElementsWithIssues = extendedElementsWithIssues.value.filter((extendedElementWithIssues) => {
44
+ const isConnected = extendedElementWithIssues.element.isConnected;
45
+ const hasNoMoreIssues = isNodeInScanContext(extendedElementWithIssues.element, scanContext) &&
46
+ !updatedElementsWithIssues.some((updatedElementWithIssues) => areElementsWithIssuesEqual(updatedElementWithIssues, extendedElementWithIssues));
47
+ return !isConnected || hasNoMoreIssues;
48
+ });
49
+ if (addedElementsWithIssues.length > 0 || removedElementsWithIssues.length > 0) {
50
+ extendedElementsWithIssues.value = [...extendedElementsWithIssues.value]
51
+ .filter((extendedElementWithIssues) => {
52
+ return !removedElementsWithIssues.some((removedElementWithIssues) => areElementsWithIssuesEqual(removedElementWithIssues, extendedElementWithIssues));
53
+ })
54
+ .concat(addedElementsWithIssues
55
+ .filter((addedElementWithIssues) => addedElementWithIssues.element.isConnected)
56
+ .map((addedElementWithIssues) => {
57
+ const id = count++;
58
+ const trigger = win.document.createElement(`${name}-trigger`);
59
+ const elementZIndex = Number.parseInt(win.getComputedStyle(addedElementWithIssues.element).zIndex, 10);
60
+ if (!Number.isNaN(elementZIndex)) {
61
+ trigger.style.setProperty('z-index', (elementZIndex + 1).toString(), 'important');
62
+ }
63
+ trigger.style.setProperty('position-anchor', `--${name}-anchor-${id}`, 'important');
64
+ trigger.dataset.id = id.toString();
65
+ const accentedDialog = win.document.createElement(`${name}-dialog`);
66
+ trigger.dialog = accentedDialog;
67
+ const position = getElementPosition(addedElementWithIssues.element, win);
68
+ trigger.position = signal(position);
69
+ trigger.visible = signal(true);
70
+ trigger.element = addedElementWithIssues.element;
71
+ const scrollableAncestors = supportsAnchorPositioning(win)
72
+ ? new Set()
73
+ : getScrollableAncestors(addedElementWithIssues.element, win);
74
+ const issues = signal(addedElementWithIssues.issues);
75
+ accentedDialog.issues = issues;
76
+ accentedDialog.element = addedElementWithIssues.element;
77
+ return {
78
+ id,
79
+ element: addedElementWithIssues.element,
80
+ skipRender: shouldSkipRender(addedElementWithIssues.element),
81
+ rootNode: addedElementWithIssues.rootNode,
82
+ visible: trigger.visible,
83
+ position: trigger.position,
84
+ scrollableAncestors: signal(scrollableAncestors),
85
+ anchorNameValue: addedElementWithIssues.element.style.getPropertyValue('anchor-name') ||
86
+ win
87
+ .getComputedStyle(addedElementWithIssues.element)
88
+ .getPropertyValue('anchor-name'),
89
+ trigger,
90
+ issues,
91
+ };
92
+ }));
93
+ }
94
+ });
95
+ }
96
+ //# sourceMappingURL=update-elements-with-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-elements-with-issues.js","sourceRoot":"","sources":["../../src/utils/update-elements-with-issues.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,SAAS,gBAAgB,CAAC,OAAgB;IACxC,kDAAkD;IAClD,oDAAoD;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5D,iEAAiE;IACjE,uEAAuE;IACvE,wBAAwB;IACxB,0DAA0D;IAC1D,2CAA2C;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAEtD,OAAO,WAAW,IAAI,YAAY,CAAC;AACrC,CAAC;AAED,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,MAAM,UAAU,wBAAwB,CAAC,EACvC,0BAA0B,EAC1B,WAAW,EACX,UAAU,EACV,GAAG,EACH,IAAI,GAOL;IACC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAExE,KAAK,CAAC,GAAG,EAAE;QACT,KAAK,MAAM,wBAAwB,IAAI,yBAAyB,EAAE,CAAC;YACjE,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,KAAK,CAAC,SAAS,CACrE,CAAC,yBAAyB,EAAE,EAAE,CAC5B,0BAA0B,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAClF,CAAC;YACF,IACE,oBAAoB,GAAG,CAAC,CAAC;gBACzB,0BAA0B,CAAC,KAAK,CAAC,oBAAoB,CAAC;gBACtD,CAAC,iBAAiB,CAChB,0BAA0B,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK,EACnE,wBAAwB,CAAC,MAAM,CAChC,EACD,CAAC;gBACD,0BAA0B,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK;oBACjE,wBAAwB,CAAC,MAAM,CAAC;YACpC,CAAC;QACH,CAAC;QAED,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC,wBAAwB,EAAE,EAAE;YAC5F,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,yBAAyB,EAAE,EAAE,CAC1E,0BAA0B,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAChF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,uDAAuD;QACvD,uCAAuC;QACvC,6EAA6E;QAC7E,MAAM,yBAAyB,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CACvE,CAAC,yBAAyB,EAAE,EAAE;YAC5B,MAAM,WAAW,GAAG,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC;YAClE,MAAM,eAAe,GACnB,mBAAmB,CAAC,yBAAyB,CAAC,OAAO,EAAE,WAAW,CAAC;gBACnE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,EAAE,CAC3D,0BAA0B,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAChF,CAAC;YACJ,OAAO,CAAC,WAAW,IAAI,eAAe,CAAC;QACzC,CAAC,CACF,CAAC;QAEF,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/E,0BAA0B,CAAC,KAAK,GAAG,CAAC,GAAG,0BAA0B,CAAC,KAAK,CAAC;iBACrE,MAAM,CAAC,CAAC,yBAAyB,EAAE,EAAE;gBACpC,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,EAAE,CAClE,0BAA0B,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAChF,CAAC;YACJ,CAAC,CAAC;iBACD,MAAM,CACL,uBAAuB;iBACpB,MAAM,CAAC,CAAC,sBAAsB,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;iBAC9E,GAAG,CAAC,CAAC,sBAAsB,EAAE,EAAE;gBAC9B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,UAAU,CAAoB,CAAC;gBACjF,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CACnC,GAAG,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,MAAM,EAC3D,EAAE,CACH,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;gBACpF,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,IAAI,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;gBACpF,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS,CAAmB,CAAC;gBACtF,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC;gBAChC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACzE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBACjD,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,GAAG,CAAC;oBACxD,CAAC,CAAC,IAAI,GAAG,EAAe;oBACxB,CAAC,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAChE,MAAM,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACrD,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC/B,cAAc,CAAC,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBACxD,OAAO;oBACL,EAAE;oBACF,OAAO,EAAE,sBAAsB,CAAC,OAAO;oBACvC,UAAU,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,CAAC;oBAC5D,QAAQ,EAAE,sBAAsB,CAAC,QAAQ;oBACzC,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,CAAC;oBAChD,eAAe,EACb,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC;wBACpE,GAAG;6BACA,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,CAAC;6BAChD,gBAAgB,CAAC,aAAa,CAAC;oBACpC,OAAO;oBACP,MAAM;iBACP,CAAC;YACJ,CAAC,CAAC,CACL,CAAC;QACN,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}