accented 0.0.2 → 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 (212) hide show
  1. package/NOTICE +14 -0
  2. package/README.md +44 -187
  3. package/dist/accented.d.ts +8 -8
  4. package/dist/accented.d.ts.map +1 -1
  5. package/dist/accented.js +37 -30
  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 +2 -1
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +2 -1
  14. package/dist/constants.js.map +1 -1
  15. package/dist/dom-updater.d.ts +1 -1
  16. package/dist/dom-updater.d.ts.map +1 -1
  17. package/dist/dom-updater.js +73 -31
  18. package/dist/dom-updater.js.map +1 -1
  19. package/dist/elements/accented-dialog.d.ts +13 -10
  20. package/dist/elements/accented-dialog.d.ts.map +1 -1
  21. package/dist/elements/accented-dialog.js +110 -94
  22. package/dist/elements/accented-dialog.js.map +1 -1
  23. package/dist/elements/accented-trigger.d.ts +14 -9
  24. package/dist/elements/accented-trigger.d.ts.map +1 -1
  25. package/dist/elements/accented-trigger.js +77 -22
  26. package/dist/elements/accented-trigger.js.map +1 -1
  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 +1 -1
  32. package/dist/intersection-observer.d.ts.map +1 -1
  33. package/dist/intersection-observer.js +12 -6
  34. package/dist/intersection-observer.js.map +1 -1
  35. package/dist/log-and-rethrow.d.ts +1 -1
  36. package/dist/log-and-rethrow.d.ts.map +1 -1
  37. package/dist/log-and-rethrow.js +2 -3
  38. package/dist/log-and-rethrow.js.map +1 -1
  39. package/dist/logger.d.ts +1 -1
  40. package/dist/logger.d.ts.map +1 -1
  41. package/dist/logger.js +6 -3
  42. package/dist/logger.js.map +1 -1
  43. package/dist/register-elements.d.ts +1 -1
  44. package/dist/register-elements.d.ts.map +1 -1
  45. package/dist/register-elements.js +6 -7
  46. package/dist/register-elements.js.map +1 -1
  47. package/dist/resize-listener.d.ts +1 -1
  48. package/dist/resize-listener.d.ts.map +1 -1
  49. package/dist/resize-listener.js +3 -4
  50. package/dist/resize-listener.js.map +1 -1
  51. package/dist/scanner.d.ts +2 -2
  52. package/dist/scanner.d.ts.map +1 -1
  53. package/dist/scanner.js +76 -43
  54. package/dist/scanner.js.map +1 -1
  55. package/dist/scroll-listeners.d.ts +1 -1
  56. package/dist/scroll-listeners.d.ts.map +1 -1
  57. package/dist/scroll-listeners.js +3 -4
  58. package/dist/scroll-listeners.js.map +1 -1
  59. package/dist/state.d.ts +3 -2
  60. package/dist/state.d.ts.map +1 -1
  61. package/dist/state.js +5 -3
  62. package/dist/state.js.map +1 -1
  63. package/dist/task-queue.d.ts +4 -4
  64. package/dist/task-queue.d.ts.map +1 -1
  65. package/dist/task-queue.js +3 -2
  66. package/dist/task-queue.js.map +1 -1
  67. package/dist/types.d.ts +140 -49
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js.map +1 -1
  70. package/dist/utils/are-elements-with-issues-equal.d.ts +3 -0
  71. package/dist/utils/are-elements-with-issues-equal.d.ts.map +1 -0
  72. package/dist/utils/are-elements-with-issues-equal.js +5 -0
  73. package/dist/utils/are-elements-with-issues-equal.js.map +1 -0
  74. package/dist/utils/are-issue-sets-equal.d.ts +2 -2
  75. package/dist/utils/are-issue-sets-equal.d.ts.map +1 -1
  76. package/dist/utils/are-issue-sets-equal.js +3 -3
  77. package/dist/utils/are-issue-sets-equal.js.map +1 -1
  78. package/dist/utils/containing-blocks.d.ts +3 -0
  79. package/dist/utils/containing-blocks.d.ts.map +1 -0
  80. package/dist/utils/containing-blocks.js +46 -0
  81. package/dist/utils/containing-blocks.js.map +1 -0
  82. package/dist/utils/contains.d.ts +2 -0
  83. package/dist/utils/contains.d.ts.map +1 -0
  84. package/dist/utils/contains.js +19 -0
  85. package/dist/utils/contains.js.map +1 -0
  86. package/dist/utils/deduplicate-nodes.d.ts +2 -0
  87. package/dist/utils/deduplicate-nodes.d.ts.map +1 -0
  88. package/dist/utils/deduplicate-nodes.js +4 -0
  89. package/dist/utils/deduplicate-nodes.js.map +1 -0
  90. package/dist/utils/deep-merge.d.ts +1 -1
  91. package/dist/utils/deep-merge.d.ts.map +1 -1
  92. package/dist/utils/deep-merge.js +8 -5
  93. package/dist/utils/deep-merge.js.map +1 -1
  94. package/dist/utils/dom-helpers.d.ts +9 -0
  95. package/dist/utils/dom-helpers.d.ts.map +1 -0
  96. package/dist/utils/dom-helpers.js +34 -0
  97. package/dist/utils/dom-helpers.js.map +1 -0
  98. package/dist/utils/ensure-non-empty.d.ts +2 -0
  99. package/dist/utils/ensure-non-empty.d.ts.map +1 -0
  100. package/dist/utils/ensure-non-empty.js +7 -0
  101. package/dist/utils/ensure-non-empty.js.map +1 -0
  102. package/dist/utils/get-element-html.d.ts +1 -1
  103. package/dist/utils/get-element-html.d.ts.map +1 -1
  104. package/dist/utils/get-element-html.js +4 -2
  105. package/dist/utils/get-element-html.js.map +1 -1
  106. package/dist/utils/get-element-position.d.ts +10 -2
  107. package/dist/utils/get-element-position.d.ts.map +1 -1
  108. package/dist/utils/get-element-position.js +64 -16
  109. package/dist/utils/get-element-position.js.map +1 -1
  110. package/dist/utils/get-parent.d.ts +2 -0
  111. package/dist/utils/get-parent.d.ts.map +1 -0
  112. package/dist/utils/get-parent.js +12 -0
  113. package/dist/utils/get-parent.js.map +1 -0
  114. package/dist/utils/get-scan-context.d.ts +3 -0
  115. package/dist/utils/get-scan-context.d.ts.map +1 -0
  116. package/dist/utils/get-scan-context.js +28 -0
  117. package/dist/utils/get-scan-context.js.map +1 -0
  118. package/dist/utils/get-scrollable-ancestors.d.ts +1 -1
  119. package/dist/utils/get-scrollable-ancestors.d.ts.map +1 -1
  120. package/dist/utils/get-scrollable-ancestors.js +10 -6
  121. package/dist/utils/get-scrollable-ancestors.js.map +1 -1
  122. package/dist/utils/is-node-in-scan-context.d.ts +3 -0
  123. package/dist/utils/is-node-in-scan-context.d.ts.map +1 -0
  124. package/dist/utils/is-node-in-scan-context.js +26 -0
  125. package/dist/utils/is-node-in-scan-context.js.map +1 -0
  126. package/dist/utils/is-non-empty.d.ts +2 -0
  127. package/dist/utils/is-non-empty.d.ts.map +1 -0
  128. package/dist/utils/is-non-empty.js +4 -0
  129. package/dist/utils/is-non-empty.js.map +1 -0
  130. package/dist/utils/normalize-context.d.ts +3 -0
  131. package/dist/utils/normalize-context.d.ts.map +1 -0
  132. package/dist/utils/normalize-context.js +59 -0
  133. package/dist/utils/normalize-context.js.map +1 -0
  134. package/dist/utils/recalculate-positions.d.ts +1 -1
  135. package/dist/utils/recalculate-positions.d.ts.map +1 -1
  136. package/dist/utils/recalculate-positions.js +5 -5
  137. package/dist/utils/recalculate-positions.js.map +1 -1
  138. package/dist/utils/recalculate-scrollable-ancestors.d.ts +1 -1
  139. package/dist/utils/recalculate-scrollable-ancestors.d.ts.map +1 -1
  140. package/dist/utils/recalculate-scrollable-ancestors.js +4 -4
  141. package/dist/utils/recalculate-scrollable-ancestors.js.map +1 -1
  142. package/dist/utils/shadow-dom-aware-mutation-observer.d.ts +10 -0
  143. package/dist/utils/shadow-dom-aware-mutation-observer.d.ts.map +1 -0
  144. package/dist/utils/shadow-dom-aware-mutation-observer.js +61 -0
  145. package/dist/utils/shadow-dom-aware-mutation-observer.js.map +1 -0
  146. package/dist/utils/supports-anchor-positioning.d.ts +1 -1
  147. package/dist/utils/supports-anchor-positioning.d.ts.map +1 -1
  148. package/dist/utils/supports-anchor-positioning.js +1 -1
  149. package/dist/utils/supports-anchor-positioning.js.map +1 -1
  150. package/dist/utils/transform-violations.d.ts +2 -2
  151. package/dist/utils/transform-violations.d.ts.map +1 -1
  152. package/dist/utils/transform-violations.js +23 -10
  153. package/dist/utils/transform-violations.js.map +1 -1
  154. package/dist/utils/update-elements-with-issues.d.ts +11 -5
  155. package/dist/utils/update-elements-with-issues.d.ts.map +1 -1
  156. package/dist/utils/update-elements-with-issues.js +56 -24
  157. package/dist/utils/update-elements-with-issues.js.map +1 -1
  158. package/dist/validate-options.d.ts +2 -2
  159. package/dist/validate-options.d.ts.map +1 -1
  160. package/dist/validate-options.js +91 -4
  161. package/dist/validate-options.js.map +1 -1
  162. package/package.json +15 -7
  163. package/src/accented.test.ts +2 -2
  164. package/src/accented.ts +45 -34
  165. package/src/common/tokens.ts +10 -0
  166. package/src/constants.ts +2 -1
  167. package/src/dom-updater.ts +87 -34
  168. package/src/elements/accented-dialog.ts +157 -122
  169. package/src/elements/accented-trigger.ts +119 -47
  170. package/src/fullscreen-listener.ts +21 -0
  171. package/src/intersection-observer.ts +27 -16
  172. package/src/log-and-rethrow.ts +2 -3
  173. package/src/logger.ts +14 -4
  174. package/src/register-elements.ts +7 -7
  175. package/src/resize-listener.ts +15 -11
  176. package/src/scanner.ts +113 -57
  177. package/src/scroll-listeners.ts +27 -19
  178. package/src/state.ts +27 -16
  179. package/src/task-queue.test.ts +5 -4
  180. package/src/task-queue.ts +8 -6
  181. package/src/types.ts +179 -76
  182. package/src/utils/are-elements-with-issues-equal.ts +11 -0
  183. package/src/utils/are-issue-sets-equal.test.ts +10 -6
  184. package/src/utils/are-issue-sets-equal.ts +8 -6
  185. package/src/utils/containing-blocks.ts +60 -0
  186. package/src/utils/contains.test.ts +54 -0
  187. package/src/utils/contains.ts +19 -0
  188. package/src/utils/deduplicate-nodes.ts +3 -0
  189. package/src/utils/deep-merge.test.ts +8 -1
  190. package/src/utils/deep-merge.ts +14 -8
  191. package/src/utils/dom-helpers.ts +42 -0
  192. package/src/utils/ensure-non-empty.ts +6 -0
  193. package/src/utils/get-element-html.ts +4 -2
  194. package/src/utils/get-element-position.ts +84 -16
  195. package/src/utils/get-parent.ts +14 -0
  196. package/src/utils/get-scan-context.test.ts +85 -0
  197. package/src/utils/get-scan-context.ts +36 -0
  198. package/src/utils/get-scrollable-ancestors.ts +15 -7
  199. package/src/utils/is-node-in-scan-context.test.ts +70 -0
  200. package/src/utils/is-node-in-scan-context.ts +29 -0
  201. package/src/utils/is-non-empty.ts +3 -0
  202. package/src/utils/normalize-context.test.ts +105 -0
  203. package/src/utils/normalize-context.ts +65 -0
  204. package/src/utils/recalculate-positions.ts +5 -5
  205. package/src/utils/recalculate-scrollable-ancestors.ts +4 -4
  206. package/src/utils/shadow-dom-aware-mutation-observer.ts +75 -0
  207. package/src/utils/supports-anchor-positioning.ts +3 -3
  208. package/src/utils/transform-violations.test.ts +28 -24
  209. package/src/utils/transform-violations.ts +30 -12
  210. package/src/utils/update-elements-with-issues.test.ts +139 -51
  211. package/src/utils/update-elements-with-issues.ts +123 -54
  212. package/src/validate-options.ts +154 -14
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BaseElementWithIssues } from '../types.ts';
2
+ export declare function areElementsWithIssuesEqual(elementWithIssues1: BaseElementWithIssues, elementWithIssues2: BaseElementWithIssues): boolean;
3
+ //# sourceMappingURL=are-elements-with-issues-equal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"are-elements-with-issues-equal.d.ts","sourceRoot":"","sources":["../../src/utils/are-elements-with-issues-equal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,0BAA0B,CACxC,kBAAkB,EAAE,qBAAqB,EACzC,kBAAkB,EAAE,qBAAqB,WAM1C"}
@@ -0,0 +1,5 @@
1
+ export function areElementsWithIssuesEqual(elementWithIssues1, elementWithIssues2) {
2
+ return (elementWithIssues1.element === elementWithIssues2.element &&
3
+ elementWithIssues1.rootNode === elementWithIssues2.rootNode);
4
+ }
5
+ //# sourceMappingURL=are-elements-with-issues-equal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"are-elements-with-issues-equal.js","sourceRoot":"","sources":["../../src/utils/are-elements-with-issues-equal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CACxC,kBAAyC,EACzC,kBAAyC;IAEzC,OAAO,CACL,kBAAkB,CAAC,OAAO,KAAK,kBAAkB,CAAC,OAAO;QACzD,kBAAkB,CAAC,QAAQ,KAAK,kBAAkB,CAAC,QAAQ,CAC5D,CAAC;AACJ,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { Issue } from '../types';
2
- export default function areIssueSetsEqual(issues1: Array<Issue>, issues2: Array<Issue>): boolean;
1
+ import type { Issue } from '../types.ts';
2
+ export declare function areIssueSetsEqual(issues1: Array<Issue>, issues2: Array<Issue>): boolean;
3
3
  //# sourceMappingURL=are-issue-sets-equal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"are-issue-sets-equal.d.ts","sourceRoot":"","sources":["../../src/utils/are-issue-sets-equal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAItC,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,WAKrF"}
1
+ {"version":3,"file":"are-issue-sets-equal.d.ts","sourceRoot":"","sources":["../../src/utils/are-issue-sets-equal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,WAO7E"}
@@ -1,6 +1,6 @@
1
1
  const issueProps = ['id', 'title', 'description', 'url', 'impact'];
2
- export default function areIssueSetsEqual(issues1, issues2) {
3
- return issues1.length === issues2.length &&
4
- issues1.every(issue1 => Boolean(issues2.find(issue2 => issueProps.every(prop => issue2[prop] === issue1[prop]))));
2
+ export function areIssueSetsEqual(issues1, issues2) {
3
+ return (issues1.length === issues2.length &&
4
+ issues1.every((issue1) => Boolean(issues2.find((issue2) => issueProps.every((prop) => issue2[prop] === issue1[prop])))));
5
5
  }
6
6
  //# sourceMappingURL=are-issue-sets-equal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"are-issue-sets-equal.js","sourceRoot":"","sources":["../../src/utils/are-issue-sets-equal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEvF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,OAAqB,EAAE,OAAqB;IACpF,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACpD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CACxD,CAAC,CAAC,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"are-issue-sets-equal.js","sourceRoot":"","sources":["../../src/utils/are-issue-sets-equal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEvF,MAAM,UAAU,iBAAiB,CAAC,OAAqB,EAAE,OAAqB;IAC5E,OAAO,CACL,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QACjC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC7F,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function createsContainingBlock(prop: keyof CSSStyleDeclaration): boolean;
2
+ export declare function initializeContainingBlockSupportSet(): void;
3
+ //# sourceMappingURL=containing-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containing-blocks.d.ts","sourceRoot":"","sources":["../../src/utils/containing-blocks.ts"],"names":[],"mappings":"AAuCA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,mBAAmB,WAErE;AAED,wBAAgB,mCAAmC,SAgBlD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Tests whether a particular combination of CSS property and value on an element
3
+ * makes that element a containing block.
4
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_display/Containing_block
5
+ *
6
+ * The function is meant to be run with properties that behave inconsistently across browsers.
7
+ *
8
+ * It's only meant to be used during initialization.
9
+ */
10
+ function testContainingBlockCreation(prop, value) {
11
+ const container = document.createElement('div');
12
+ container.style[prop] = value;
13
+ container.style.position = 'fixed';
14
+ container.style.insetInlineStart = '10px';
15
+ container.style.insetBlockStart = '10px';
16
+ const element = document.createElement('div');
17
+ element.style.position = 'fixed';
18
+ element.style.insetInlineStart = '0';
19
+ element.style.insetBlockStart = '0';
20
+ container.appendChild(element);
21
+ document.body.appendChild(container);
22
+ const containerRect = container.getBoundingClientRect();
23
+ const elementRect = element.getBoundingClientRect();
24
+ container.remove();
25
+ return containerRect.top === elementRect.top && containerRect.left === elementRect.left;
26
+ }
27
+ // This is the set we'll use to store the properties that _may_ create containing blocks
28
+ // (the behavior of the ones that we'll be checking is inconsistent across browsers
29
+ // at the time of writing this comment).
30
+ const propsAffectingContainingBlocks = new Set();
31
+ export function createsContainingBlock(prop) {
32
+ return propsAffectingContainingBlocks.has(prop);
33
+ }
34
+ export function initializeContainingBlockSupportSet() {
35
+ const propsToTest = [
36
+ { prop: 'filter', value: 'blur(1px)' },
37
+ { prop: 'backdropFilter', value: 'blur(1px)' },
38
+ { prop: 'containerType', value: 'size' },
39
+ ];
40
+ for (const { prop, value } of propsToTest) {
41
+ if (testContainingBlockCreation(prop, value)) {
42
+ propsAffectingContainingBlocks.add(prop);
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=containing-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containing-blocks.js","sourceRoot":"","sources":["../../src/utils/containing-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,SAAS,2BAA2B,CAClC,IAAO,EACP,KAA6B;IAE7B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;IACnC,SAAS,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAC1C,SAAS,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC;IAEzC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC;IAEpC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAEpD,SAAS,CAAC,MAAM,EAAE,CAAC;IAEnB,OAAO,aAAa,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,IAAI,aAAa,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;AAC1F,CAAC;AAED,wFAAwF;AACxF,mFAAmF;AACnF,wCAAwC;AACxC,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE5E,MAAM,UAAU,sBAAsB,CAAC,IAA+B;IACpE,OAAO,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mCAAmC;IAKjD,MAAM,WAAW,GAAqE;QACpF,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE;QACtC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE;QAC9C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE;KACzC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC;QAC1C,IAAI,2BAA2B,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC7C,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function contains(ancestor: Node, descendant: Node): boolean;
2
+ //# sourceMappingURL=contains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains.d.ts","sourceRoot":"","sources":["../../src/utils/contains.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAgBlE"}
@@ -0,0 +1,19 @@
1
+ import { isDocumentFragment, isShadowRoot } from './dom-helpers.js';
2
+ export function contains(ancestor, descendant) {
3
+ if (ancestor.contains(descendant)) {
4
+ return true;
5
+ }
6
+ let rootNode = descendant.getRootNode();
7
+ while (rootNode) {
8
+ if (!(isDocumentFragment(rootNode) && isShadowRoot(rootNode))) {
9
+ return false;
10
+ }
11
+ const host = rootNode.host;
12
+ if (ancestor.contains(host)) {
13
+ return true;
14
+ }
15
+ rootNode = host.getRootNode();
16
+ }
17
+ return false;
18
+ }
19
+ //# sourceMappingURL=contains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains.js","sourceRoot":"","sources":["../../src/utils/contains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,UAAU,QAAQ,CAAC,QAAc,EAAE,UAAgB;IACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function deduplicateNodes(nodes: Array<Node>): Array<Node>;
2
+ //# sourceMappingURL=deduplicate-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicate-nodes.d.ts","sourceRoot":"","sources":["../../src/utils/deduplicate-nodes.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAEhE"}
@@ -0,0 +1,4 @@
1
+ export function deduplicateNodes(nodes) {
2
+ return [...new Set(nodes)];
3
+ }
4
+ //# sourceMappingURL=deduplicate-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicate-nodes.js","sourceRoot":"","sources":["../../src/utils/deduplicate-nodes.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC"}
@@ -1,4 +1,4 @@
1
1
  type AnyObject = Record<string, any>;
2
- export default function deepMerge(target: AnyObject, source: AnyObject): AnyObject;
2
+ export declare function deepMerge(target: AnyObject, source: AnyObject): AnyObject;
3
3
  export {};
4
4
  //# sourceMappingURL=deep-merge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deep-merge.d.ts","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAejF"}
1
+ {"version":3,"file":"deep-merge.d.ts","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAKrC,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAezE"}
@@ -1,12 +1,15 @@
1
- export default function deepMerge(target, source) {
1
+ import { isNode } from './dom-helpers.js';
2
+ const isObject = (obj) => typeof obj === 'object' && obj !== null && !Array.isArray(obj);
3
+ export function deepMerge(target, source) {
2
4
  const output = { ...target };
3
5
  for (const key of Object.keys(source)) {
4
- if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key])) {
5
- if (!(key in target)) {
6
- output[key] = source[key];
6
+ if (isObject(source[key])) {
7
+ // Don't merge DOM nodes.
8
+ if (isObject(target[key]) && !isNode(target[key])) {
9
+ output[key] = deepMerge(target[key], source[key]);
7
10
  }
8
11
  else {
9
- output[key] = deepMerge(target[key], source[key]);
12
+ output[key] = source[key];
10
13
  }
11
14
  }
12
15
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"deep-merge.js","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAiB,EAAE,MAAiB;IACpE,MAAM,MAAM,GAAG,EAAC,GAAG,MAAM,EAAC,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aACI,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"deep-merge.js","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK1C,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAoB,EAAE,CAClD,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEjE,MAAM,UAAU,SAAS,CAAC,MAAiB,EAAE,MAAiB;IAC5D,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1B,yBAAyB;YACzB,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function isNode(obj: object): obj is Node;
2
+ export declare function isNodeList(obj: object): obj is NodeList;
3
+ export declare function isElement(node: Node): node is Element;
4
+ export declare function isDocument(node: Node): node is Document;
5
+ export declare function isDocumentFragment(node: Node): node is DocumentFragment;
6
+ export declare function isShadowRoot(documentFragment: DocumentFragment): documentFragment is ShadowRoot;
7
+ export declare function isHtmlElement(element: Element): element is HTMLElement;
8
+ export declare function isSvgElement(element: Element): element is SVGElement;
9
+ //# sourceMappingURL=dom-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/dom-helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,IAAI,CAO/C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,QAAQ,CAEvD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,OAAO,CAErD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,gBAAgB,CAEvE;AAED,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,gBAAgB,IAAI,UAAU,CAE/F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,WAAW,CAKtE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,UAAU,CAKpE"}
@@ -0,0 +1,34 @@
1
+ export function isNode(obj) {
2
+ return ('nodeType' in obj &&
3
+ typeof obj.nodeType === 'number' &&
4
+ 'nodeName' in obj &&
5
+ typeof obj.nodeName === 'string');
6
+ }
7
+ export function isNodeList(obj) {
8
+ return Object.prototype.toString.call(obj) === '[object NodeList]';
9
+ }
10
+ export function isElement(node) {
11
+ return typeof Node !== 'undefined' && node.nodeType === Node.ELEMENT_NODE;
12
+ }
13
+ export function isDocument(node) {
14
+ return typeof Node !== 'undefined' && node.nodeType === Node.DOCUMENT_NODE;
15
+ }
16
+ export function isDocumentFragment(node) {
17
+ return typeof Node !== 'undefined' && node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
18
+ }
19
+ export function isShadowRoot(documentFragment) {
20
+ return 'host' in documentFragment;
21
+ }
22
+ export function isHtmlElement(element) {
23
+ // We can't use instanceof because it may not work across contexts
24
+ // (such as when an element is moved from an iframe).
25
+ // This heuristic seems to be the most robust and fastest that I could think of.
26
+ return element.constructor.name.startsWith('HTML');
27
+ }
28
+ export function isSvgElement(element) {
29
+ // We can't use instanceof because it may not work across contexts
30
+ // (such as when an element is moved from an iframe).
31
+ // This heuristic seems to be the most robust and fastest that I could think of.
32
+ return element.constructor.name.startsWith('SVG');
33
+ }
34
+ //# sourceMappingURL=dom-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-helpers.js","sourceRoot":"","sources":["../../src/utils/dom-helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,OAAO,CACL,UAAU,IAAI,GAAG;QACjB,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAChC,UAAU,IAAI,GAAG;QACjB,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,mBAAmB,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,OAAO,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAU;IAC3C,OAAO,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,sBAAsB,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,gBAAkC;IAC7D,OAAO,MAAM,IAAI,gBAAgB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,kEAAkE;IAClE,qDAAqD;IACrD,gFAAgF;IAChF,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,kEAAkE;IAClE,qDAAqD;IACrD,gFAAgF;IAChF,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ensureNonEmpty<T>(arr: T[]): [T, ...T[]];
2
+ //# sourceMappingURL=ensure-non-empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-non-empty.d.ts","sourceRoot":"","sources":["../../src/utils/ensure-non-empty.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAKvD"}
@@ -0,0 +1,7 @@
1
+ export function ensureNonEmpty(arr) {
2
+ if (arr.length === 0) {
3
+ throw new Error('Array must not be empty');
4
+ }
5
+ return arr;
6
+ }
7
+ //# sourceMappingURL=ensure-non-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-non-empty.js","sourceRoot":"","sources":["../../src/utils/ensure-non-empty.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAI,GAAQ;IACxC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAkB,CAAC;AAC5B,CAAC"}
@@ -1,2 +1,2 @@
1
- export default function getElementHtml(element: Element): string;
1
+ export declare function getElementHtml(element: Element): string;
2
2
  //# sourceMappingURL=get-element-html.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-html.d.ts","sourceRoot":"","sources":["../../src/utils/get-element-html.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,OAAO,UAYtD"}
1
+ {"version":3,"file":"get-element-html.d.ts","sourceRoot":"","sources":["../../src/utils/get-element-html.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,UAc9C"}
@@ -1,4 +1,4 @@
1
- export default function getElementHtml(element) {
1
+ export function getElementHtml(element) {
2
2
  const outerHtml = element.outerHTML;
3
3
  const innerHtml = element.innerHTML;
4
4
  if (!innerHtml) {
@@ -9,6 +9,8 @@ export default function getElementHtml(element) {
9
9
  // This shouldn't be happening, but if it does, we can just return the outer HTML.
10
10
  return outerHtml;
11
11
  }
12
- return outerHtml.slice(0, index) + '…' + outerHtml.slice(index + innerHtml.length);
12
+ const openingTag = outerHtml.slice(0, index);
13
+ const closingTag = outerHtml.slice(index + innerHtml.length);
14
+ return `${openingTag}…${closingTag}`;
13
15
  }
14
16
  //# sourceMappingURL=get-element-html.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-html.js","sourceRoot":"","sources":["../../src/utils/get-element-html.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,kFAAkF;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"get-element-html.js","sourceRoot":"","sources":["../../src/utils/get-element-html.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,kFAAkF;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,GAAG,UAAU,IAAI,UAAU,EAAE,CAAC;AACvC,CAAC"}
@@ -1,3 +1,11 @@
1
- import type { Position } from '../types';
2
- export default function getElementPosition(element: Element, win: Window): Position;
1
+ import type { Position } from '../types.ts';
2
+ /**
3
+ * https://github.com/pomerantsev/accented/issues/116
4
+ *
5
+ * This calculation leads to incorrectly positioned Accented triggers when all of the following are true:
6
+ * * The element is an SVG element.
7
+ * * The element itself, or one of the element's ancestors has a scale or rotate transform.
8
+ * * The browser doesn't support anchor positioning.
9
+ */
10
+ export declare function getElementPosition(element: Element, win: Window): Position;
3
11
  //# sourceMappingURL=get-element-position.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-position.d.ts","sourceRoot":"","sources":["../../src/utils/get-element-position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAkBlF"}
1
+ {"version":3,"file":"get-element-position.d.ts","sourceRoot":"","sources":["../../src/utils/get-element-position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8C5C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAkC1E"}
@@ -1,22 +1,70 @@
1
- export default function getElementPosition(element, win) {
2
- const rect = element.getBoundingClientRect();
3
- const direction = win.getComputedStyle(element).direction;
4
- if (direction === 'ltr') {
5
- return {
6
- inlineEndLeft: rect.right,
7
- blockStartTop: rect.top,
8
- direction
9
- };
1
+ import { createsContainingBlock } from './containing-blocks.js';
2
+ import { isHtmlElement } from './dom-helpers.js';
3
+ import { getParent } from './get-parent.js';
4
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_display/Containing_block#identifying_the_containing_block
5
+ function isContainingBlock(element, win) {
6
+ const style = win.getComputedStyle(element);
7
+ const { transform, perspective, contain, contentVisibility, containerType, filter, backdropFilter, willChange, } = style;
8
+ const containItems = contain.split(' ');
9
+ const willChangeItems = willChange.split(/\s*,\s*/);
10
+ return (transform !== 'none' ||
11
+ perspective !== 'none' ||
12
+ containItems.some((item) => ['layout', 'paint', 'strict', 'content'].includes(item)) ||
13
+ contentVisibility === 'auto' ||
14
+ (createsContainingBlock('containerType') && containerType !== 'normal') ||
15
+ (createsContainingBlock('filter') && filter !== 'none') ||
16
+ (createsContainingBlock('backdropFilter') && backdropFilter !== 'none') ||
17
+ willChangeItems.some((item) => ['transform', 'perspective', 'contain', 'filter', 'backdrop-filter'].includes(item)));
18
+ }
19
+ function getNonInitialContainingBlock(element, win) {
20
+ let currentElement = element;
21
+ while (currentElement) {
22
+ currentElement = getParent(currentElement);
23
+ if (currentElement && isContainingBlock(currentElement, win)) {
24
+ return currentElement;
25
+ }
10
26
  }
11
- else if (direction === 'rtl') {
27
+ return null;
28
+ }
29
+ /**
30
+ * https://github.com/pomerantsev/accented/issues/116
31
+ *
32
+ * This calculation leads to incorrectly positioned Accented triggers when all of the following are true:
33
+ * * The element is an SVG element.
34
+ * * The element itself, or one of the element's ancestors has a scale or rotate transform.
35
+ * * The browser doesn't support anchor positioning.
36
+ */
37
+ export function getElementPosition(element, win) {
38
+ const nonInitialContainingBlock = getNonInitialContainingBlock(element, win);
39
+ // If an element has a containing block as an ancestor,
40
+ // and that containing block is not the <html> element (the initial containing block),
41
+ // fixed positioning works differently.
42
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_display/Containing_block#effects_of_the_containing_block
43
+ // https://achrafkassioui.com/blog/position-fixed-and-CSS-transforms/
44
+ if (nonInitialContainingBlock) {
45
+ if (isHtmlElement(element)) {
46
+ const width = element.offsetWidth;
47
+ const height = element.offsetHeight;
48
+ let left = element.offsetLeft;
49
+ let top = element.offsetTop;
50
+ let currentElement = element.offsetParent;
51
+ // Non-initial containing block may not be an offset parent, we have to account for that as well.
52
+ while (currentElement && currentElement !== nonInitialContainingBlock) {
53
+ left += currentElement.offsetLeft;
54
+ top += currentElement.offsetTop;
55
+ currentElement = currentElement.offsetParent;
56
+ }
57
+ return { top, left, width, height };
58
+ }
59
+ const elementRect = element.getBoundingClientRect();
60
+ const nonInitialContainingBlockRect = nonInitialContainingBlock.getBoundingClientRect();
12
61
  return {
13
- inlineEndLeft: rect.left,
14
- blockStartTop: rect.top,
15
- direction
62
+ top: elementRect.top - nonInitialContainingBlockRect.top,
63
+ height: elementRect.height,
64
+ left: elementRect.left - nonInitialContainingBlockRect.left,
65
+ width: elementRect.width,
16
66
  };
17
67
  }
18
- else {
19
- throw new Error(`The element ${element} has a direction "${direction}", which is not supported.`);
20
- }
68
+ return element.getBoundingClientRect();
21
69
  }
22
70
  //# sourceMappingURL=get-element-position.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-position.js","sourceRoot":"","sources":["../../src/utils/get-element-position.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,OAAgB,EAAE,GAAW;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;IAC1D,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,aAAa,EAAE,IAAI,CAAC,GAAG;YACvB,SAAS;SACV,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,IAAI;YACxB,aAAa,EAAE,IAAI,CAAC,GAAG;YACvB,SAAS;SACV,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,qBAAqB,SAAS,4BAA4B,CAAC,CAAC;IACpG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get-element-position.js","sourceRoot":"","sources":["../../src/utils/get-element-position.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -1,2 +1,2 @@
1
- export default function getScrollableAncestors(element: HTMLElement, win: Window): Set<HTMLElement>;
1
+ export declare function getScrollableAncestors(element: Element, win: Window): Set<Element>;
2
2
  //# sourceMappingURL=get-scrollable-ancestors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-scrollable-ancestors.d.ts","sourceRoot":"","sources":["../../src/utils/get-scrollable-ancestors.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,oBAWhF"}
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"}
@@ -1,15 +1,19 @@
1
+ import { getParent } from './get-parent.js';
1
2
  const scrollableOverflowValues = new Set(['auto', 'scroll', 'hidden']);
2
- export default function getScrollableAncestors(element, win) {
3
+ export function getScrollableAncestors(element, win) {
3
4
  let currentElement = element;
4
- let scrollableAncestors = new Set();
5
- while (currentElement.parentElement) {
6
- currentElement = currentElement.parentElement;
5
+ const scrollableAncestors = new Set();
6
+ while (true) {
7
+ currentElement = getParent(currentElement);
8
+ if (!currentElement) {
9
+ break;
10
+ }
7
11
  const computedStyle = win.getComputedStyle(currentElement);
8
- if (scrollableOverflowValues.has(computedStyle.overflowX) || scrollableOverflowValues.has(computedStyle.overflowY)) {
12
+ if (scrollableOverflowValues.has(computedStyle.overflowX) ||
13
+ scrollableOverflowValues.has(computedStyle.overflowY)) {
9
14
  scrollableAncestors.add(currentElement);
10
15
  }
11
16
  }
12
17
  return scrollableAncestors;
13
18
  }
14
- ;
15
19
  //# sourceMappingURL=get-scrollable-ancestors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-scrollable-ancestors.js","sourceRoot":"","sources":["../../src/utils/get-scrollable-ancestors.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAE,OAAoB,EAAE,GAAW;IAC/E,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,IAAI,mBAAmB,GAAG,IAAI,GAAG,EAAe,CAAC;IACjD,OAAO,cAAc,CAAC,aAAa,EAAE,CAAC;QACpC,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;QAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,wBAAwB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACnH,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAAA,CAAC"}
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"}