accented 0.0.0-20250124142030 → 0.0.0-20250223121749

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 (124) hide show
  1. package/README.md +55 -3
  2. package/dist/accented.d.ts +3 -1
  3. package/dist/accented.d.ts.map +1 -1
  4. package/dist/accented.js +69 -50
  5. package/dist/accented.js.map +1 -1
  6. package/dist/constants.d.ts +3 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +3 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/dom-updater.d.ts +1 -1
  11. package/dist/dom-updater.d.ts.map +1 -1
  12. package/dist/dom-updater.js +26 -19
  13. package/dist/dom-updater.js.map +1 -1
  14. package/dist/elements/{accented-container.d.ts → accented-dialog.d.ts} +10 -4
  15. package/dist/elements/accented-dialog.d.ts.map +1 -0
  16. package/dist/elements/accented-dialog.js +361 -0
  17. package/dist/elements/accented-dialog.js.map +1 -0
  18. package/dist/elements/accented-trigger.d.ts +359 -0
  19. package/dist/elements/accented-trigger.d.ts.map +1 -0
  20. package/dist/elements/accented-trigger.js +159 -0
  21. package/dist/elements/accented-trigger.js.map +1 -0
  22. package/dist/intersection-observer.d.ts +5 -0
  23. package/dist/intersection-observer.d.ts.map +1 -0
  24. package/dist/intersection-observer.js +28 -0
  25. package/dist/intersection-observer.js.map +1 -0
  26. package/dist/log-and-rethrow.d.ts +2 -0
  27. package/dist/log-and-rethrow.d.ts.map +1 -0
  28. package/dist/log-and-rethrow.js +7 -0
  29. package/dist/log-and-rethrow.js.map +1 -0
  30. package/dist/logger.d.ts.map +1 -1
  31. package/dist/logger.js +10 -5
  32. package/dist/logger.js.map +1 -1
  33. package/dist/register-elements.d.ts +2 -0
  34. package/dist/register-elements.d.ts.map +1 -0
  35. package/dist/register-elements.js +21 -0
  36. package/dist/register-elements.js.map +1 -0
  37. package/dist/resize-listener.d.ts +2 -0
  38. package/dist/resize-listener.d.ts.map +1 -0
  39. package/dist/resize-listener.js +18 -0
  40. package/dist/resize-listener.js.map +1 -0
  41. package/dist/scanner.d.ts +2 -2
  42. package/dist/scanner.d.ts.map +1 -1
  43. package/dist/scanner.js +97 -33
  44. package/dist/scanner.js.map +1 -1
  45. package/dist/scroll-listeners.d.ts +2 -0
  46. package/dist/scroll-listeners.d.ts.map +1 -0
  47. package/dist/scroll-listeners.js +38 -0
  48. package/dist/scroll-listeners.js.map +1 -0
  49. package/dist/state.d.ts +1 -0
  50. package/dist/state.d.ts.map +1 -1
  51. package/dist/state.js +6 -0
  52. package/dist/state.js.map +1 -1
  53. package/dist/types.d.ts +70 -18
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/types.js +1 -0
  56. package/dist/types.js.map +1 -1
  57. package/dist/utils/deep-merge.js +1 -1
  58. package/dist/utils/deep-merge.js.map +1 -1
  59. package/dist/utils/get-element-html.d.ts +2 -0
  60. package/dist/utils/get-element-html.d.ts.map +1 -0
  61. package/dist/utils/get-element-html.js +14 -0
  62. package/dist/utils/get-element-html.js.map +1 -0
  63. package/dist/utils/get-element-position.d.ts +3 -0
  64. package/dist/utils/get-element-position.d.ts.map +1 -0
  65. package/dist/utils/get-element-position.js +22 -0
  66. package/dist/utils/get-element-position.js.map +1 -0
  67. package/dist/utils/get-scrollable-ancestors.d.ts +2 -0
  68. package/dist/utils/get-scrollable-ancestors.d.ts.map +1 -0
  69. package/dist/utils/get-scrollable-ancestors.js +15 -0
  70. package/dist/utils/get-scrollable-ancestors.js.map +1 -0
  71. package/dist/utils/recalculate-positions.d.ts +2 -0
  72. package/dist/utils/recalculate-positions.d.ts.map +1 -0
  73. package/dist/utils/recalculate-positions.js +27 -0
  74. package/dist/utils/recalculate-positions.js.map +1 -0
  75. package/dist/utils/recalculate-scrollable-ancestors.d.ts +2 -0
  76. package/dist/utils/recalculate-scrollable-ancestors.d.ts.map +1 -0
  77. package/dist/utils/recalculate-scrollable-ancestors.js +13 -0
  78. package/dist/utils/recalculate-scrollable-ancestors.js.map +1 -0
  79. package/dist/utils/supports-anchor-positioning.d.ts +6 -0
  80. package/dist/utils/supports-anchor-positioning.d.ts.map +1 -0
  81. package/dist/utils/supports-anchor-positioning.js +4 -0
  82. package/dist/utils/supports-anchor-positioning.js.map +1 -0
  83. package/dist/utils/transform-violations.d.ts.map +1 -1
  84. package/dist/utils/transform-violations.js +9 -0
  85. package/dist/utils/transform-violations.js.map +1 -1
  86. package/dist/utils/update-elements-with-issues.d.ts +3 -1
  87. package/dist/utils/update-elements-with-issues.d.ts.map +1 -1
  88. package/dist/utils/update-elements-with-issues.js +25 -7
  89. package/dist/utils/update-elements-with-issues.js.map +1 -1
  90. package/dist/validate-options.d.ts +3 -0
  91. package/dist/validate-options.d.ts.map +1 -0
  92. package/dist/validate-options.js +42 -0
  93. package/dist/validate-options.js.map +1 -0
  94. package/package.json +2 -1
  95. package/src/accented.ts +78 -58
  96. package/src/constants.ts +2 -0
  97. package/src/dom-updater.ts +26 -18
  98. package/src/elements/accented-dialog.ts +384 -0
  99. package/src/elements/accented-trigger.ts +179 -0
  100. package/src/intersection-observer.ts +28 -0
  101. package/src/log-and-rethrow.ts +9 -0
  102. package/src/logger.ts +11 -6
  103. package/src/register-elements.ts +21 -0
  104. package/src/resize-listener.ts +17 -0
  105. package/src/scanner.ts +108 -37
  106. package/src/scroll-listeners.ts +37 -0
  107. package/src/state.ts +12 -0
  108. package/src/types.ts +77 -19
  109. package/src/utils/deep-merge.test.ts +7 -0
  110. package/src/utils/deep-merge.ts +1 -1
  111. package/src/utils/get-element-html.ts +13 -0
  112. package/src/utils/get-element-position.ts +21 -0
  113. package/src/utils/get-scrollable-ancestors.ts +14 -0
  114. package/src/utils/recalculate-positions.ts +27 -0
  115. package/src/utils/recalculate-scrollable-ancestors.ts +13 -0
  116. package/src/utils/supports-anchor-positioning.ts +7 -0
  117. package/src/utils/transform-violations.ts +12 -1
  118. package/src/utils/update-elements-with-issues.test.ts +90 -16
  119. package/src/utils/update-elements-with-issues.ts +40 -20
  120. package/src/validate-options.ts +44 -0
  121. package/dist/elements/accented-container.d.ts.map +0 -1
  122. package/dist/elements/accented-container.js +0 -131
  123. package/dist/elements/accented-container.js.map +0 -1
  124. package/src/elements/accented-container.ts +0 -147
@@ -0,0 +1,361 @@
1
+ import { effect } from '@preact/signals-core';
2
+ import getElementHtml from '../utils/get-element-html.js';
3
+ import { accentedUrl } from '../constants.js';
4
+ import logAndRethrow from '../log-and-rethrow.js';
5
+ // We want Accented to not throw an error in Node, and use static imports,
6
+ // so we can't export `class extends HTMLElement` because HTMLElement is not available in Node.
7
+ export default () => {
8
+ const dialogTemplate = document.createElement('template');
9
+ dialogTemplate.innerHTML = `
10
+ <dialog dir="ltr" lang="en" aria-labelledby="title">
11
+ <div id="button-container">
12
+ <button id="close" aria-label="Close">✕</button>
13
+ </div>
14
+ <h2 id="title">Accessibility issues</h2>
15
+ <section id="element-html-container" aria-label="Element">
16
+ <code id="element-html"></code>
17
+ </section>
18
+ <ul id="issues"></ul>
19
+ <section id="footer">
20
+ <p>
21
+ Powered by
22
+ <a href="${accentedUrl}" target="_blank" aria-description="Opens in new tab">Accented</a>
23
+ and
24
+ <a href="https://github.com/dequelabs/axe-core" target="_blank" aria-description="Opens in new tab">axe-core</a>.
25
+ </p>
26
+ </section>
27
+ </dialog>
28
+ `;
29
+ const issueTemplate = document.createElement('template');
30
+ issueTemplate.innerHTML = `
31
+ <li>
32
+ <a target="_blank" aria-description="Opens in new tab"></a>
33
+ <div class="impact"></div>
34
+ <div class="description"></div>
35
+ </li>
36
+ `;
37
+ const descriptionTemplate = document.createElement('template');
38
+ descriptionTemplate.innerHTML = `
39
+ <span></span>
40
+ <ul></ul>
41
+ `;
42
+ const stylesheet = new CSSStyleSheet();
43
+ stylesheet.replaceSync(`
44
+ :host {
45
+ all: initial !important;
46
+
47
+ --light-color: white;
48
+ --dark-color: black;
49
+ --focus-color: #0078d4; /* Contrasts with both white and black. */
50
+
51
+ --impact-minor-color: lightgray;
52
+ --impact-moderate-color: gold;
53
+ --impact-serious-color: #ff9e00;
54
+ --impact-critical-color: #f883ec;
55
+
56
+ /* Spacing and typography custom props, inspired by https://utopia.fyi (simplified). */
57
+
58
+ /* @link https://utopia.fyi/type/calculator?c=320,16,1.2,1240,16,1.2,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */
59
+ --ratio: 1.2;
60
+ --step-0: 1rem;
61
+ --step-1: calc(var(--step-0) * var(--ratio));
62
+ --step-2: calc(var(--step-1) * var(--ratio));
63
+ --step-3: calc(var(--step-2) * var(--ratio));
64
+ --step-4: calc(var(--step-3) * var(--ratio));
65
+ --step--1: calc(var(--step-0) / var(--ratio));
66
+
67
+ /* @link https://utopia.fyi/space/calculator?c=320,16,1.2,1240,16,1.2,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */
68
+ --space-3xs: 0.25rem;
69
+ --space-2xs: 0.5rem;
70
+ --space-xs: 0.75rem;
71
+ --space-s: 1rem;
72
+ --space-m: 1.5rem;
73
+ --space-l: 2rem;
74
+ --space-xl: 3rem;
75
+ --space-2xl: 4rem;
76
+ --space-3xl: 6rem;
77
+ }
78
+
79
+ a[href], button {
80
+ outline-offset: 2px;
81
+ outline-color: var(--focus-color);
82
+ outline-width: 2px;
83
+ outline-style: none;
84
+
85
+ &:focus-visible {
86
+ outline-style: solid;
87
+ }
88
+
89
+ &:hover:not(:focus-visible) {
90
+ outline-style: dashed;
91
+ }
92
+ }
93
+
94
+ a[href] {
95
+ color: currentColor;
96
+ }
97
+
98
+ a[href][target="_blank"]::after {
99
+ content: " ↗";
100
+ }
101
+
102
+ dialog {
103
+ box-sizing: border-box;
104
+ overflow-wrap: break-word;
105
+ font-family: system-ui;
106
+ line-height: 1.5;
107
+ background-color: var(--light-color);
108
+ color: var(--dark-color);
109
+ border: 2px solid currentColor;
110
+ padding: var(--space-l);
111
+ inline-size: min(90ch, calc(100% - var(--space-s)* 2));
112
+ max-block-size: calc(100% - var(--space-s) * 2);
113
+ }
114
+
115
+ #button-container {
116
+ text-align: end;
117
+ }
118
+
119
+ #close {
120
+ background-color: var(--light-color);
121
+ color: var(--dark-color);
122
+ border: 2px solid currentColor;
123
+ padding-inline: var(--space-2xs);
124
+ aspect-ratio: 1 / 1;
125
+ font-size: var(--step-0);
126
+ }
127
+
128
+ h2 {
129
+ font-size: var(--step-4);
130
+ line-height: 1.2;
131
+ margin-block-start: var(--space-s);
132
+ margin-block-end: 0;
133
+ }
134
+
135
+ #element-html-container {
136
+ padding: var(--space-xs);
137
+ border: 2px solid currentColor;
138
+ margin-block-start: var(--space-l);
139
+ }
140
+
141
+ code {
142
+ /* https://systemfontstack.com/ */
143
+ font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
144
+ font-size: var(--step--1);
145
+ }
146
+
147
+ #issues {
148
+ font-size: var(--step-1);
149
+ margin-block-start: var(--space-l);
150
+ padding-inline: 0;
151
+ list-style: none;
152
+
153
+ & > li:not(:first-child) {
154
+ margin-block-start: var(--space-m);
155
+ }
156
+
157
+ a {
158
+ font-weight: bold;
159
+ }
160
+ }
161
+
162
+ .impact {
163
+ margin-block-start: var(--space-2xs);
164
+ font-size: var(--step--1);
165
+
166
+ inline-size: fit-content;
167
+ padding-inline: var(--space-3xs);
168
+
169
+ &[data-impact="minor"] {
170
+ background-color: var(--impact-minor-color);
171
+ }
172
+ &[data-impact="moderate"] {
173
+ background-color: var(--impact-moderate-color);
174
+ }
175
+ &[data-impact="serious"] {
176
+ background-color: var(--impact-serious-color);
177
+ }
178
+ &[data-impact="critical"] {
179
+ background-color: var(--impact-critical-color);
180
+ }
181
+ }
182
+
183
+ .description {
184
+ margin-block-start: var(--space-2xs);
185
+ font-size: var(--step--1);
186
+
187
+ li {
188
+ list-style-type: disc;
189
+ }
190
+ }
191
+
192
+ #footer {
193
+ margin-block-start: var(--space-l);
194
+ font-size: var(--step--1);
195
+
196
+ p {
197
+ margin: 0;
198
+ text-align: end;
199
+ }
200
+ }
201
+ `);
202
+ return class extends HTMLElement {
203
+ #disposeOfEffect;
204
+ #abortController;
205
+ issues;
206
+ element;
207
+ #elementMutationObserver;
208
+ constructor() {
209
+ try {
210
+ super();
211
+ this.attachShadow({ mode: 'open' });
212
+ const content = dialogTemplate.content.cloneNode(true);
213
+ if (this.shadowRoot) {
214
+ this.shadowRoot.adoptedStyleSheets.push(stylesheet);
215
+ this.shadowRoot.append(content);
216
+ }
217
+ }
218
+ catch (error) {
219
+ logAndRethrow(error);
220
+ }
221
+ }
222
+ connectedCallback() {
223
+ try {
224
+ if (this.shadowRoot) {
225
+ const { shadowRoot } = this;
226
+ const dialog = shadowRoot.querySelector('dialog');
227
+ const closeButton = shadowRoot.querySelector('#close');
228
+ this.#abortController = new AbortController();
229
+ closeButton?.addEventListener('click', () => {
230
+ try {
231
+ dialog?.close();
232
+ }
233
+ catch (error) {
234
+ logAndRethrow(error);
235
+ }
236
+ }, { signal: this.#abortController.signal });
237
+ dialog?.addEventListener('click', (event) => {
238
+ try {
239
+ this.#onDialogClick(event);
240
+ }
241
+ catch (error) {
242
+ logAndRethrow(error);
243
+ }
244
+ }, { signal: this.#abortController.signal });
245
+ this.#disposeOfEffect = effect(() => {
246
+ if (this.issues) {
247
+ const issues = this.issues.value;
248
+ const issuesList = shadowRoot.getElementById('issues');
249
+ if (issuesList) {
250
+ issuesList.innerHTML = '';
251
+ for (const issue of issues) {
252
+ const issueContent = issueTemplate.content.cloneNode(true);
253
+ const title = issueContent.querySelector('a');
254
+ const impact = issueContent.querySelector('.impact');
255
+ const description = issueContent.querySelector('.description');
256
+ if (title && impact && description) {
257
+ title.textContent = issue.title + ' (' + issue.id + ')';
258
+ title.href = issue.url;
259
+ impact.textContent = 'User impact: ' + issue.impact;
260
+ impact.setAttribute('data-impact', String(issue.impact));
261
+ const descriptionItems = issue.description.split(/\n\s*/);
262
+ const descriptionContent = descriptionTemplate.content.cloneNode(true);
263
+ const descriptionTitle = descriptionContent.querySelector('span');
264
+ const descriptionList = descriptionContent.querySelector('ul');
265
+ if (descriptionTitle && descriptionList && descriptionItems.length > 1) {
266
+ descriptionTitle.textContent = descriptionItems[0];
267
+ for (const descriptionItem of descriptionItems.slice(1)) {
268
+ const li = document.createElement('li');
269
+ li.textContent = descriptionItem;
270
+ descriptionList.appendChild(li);
271
+ }
272
+ description.appendChild(descriptionContent);
273
+ }
274
+ }
275
+ issuesList.appendChild(issueContent);
276
+ }
277
+ }
278
+ }
279
+ });
280
+ const updateElementHtml = () => {
281
+ if (this.element) {
282
+ const elementHtmlContainer = shadowRoot.getElementById('element-html');
283
+ if (elementHtmlContainer) {
284
+ elementHtmlContainer.textContent = getElementHtml(this.element);
285
+ }
286
+ }
287
+ };
288
+ updateElementHtml();
289
+ this.#elementMutationObserver = new MutationObserver(() => {
290
+ try {
291
+ updateElementHtml();
292
+ }
293
+ catch (error) {
294
+ logAndRethrow(error);
295
+ }
296
+ });
297
+ if (this.element) {
298
+ // We're only outputting the element itself, not its subtree.
299
+ // However, we're still listening for childList changes, because
300
+ // we display an ellipsis if the element has innerHTML,
301
+ // and we leave it empty if the element is empty.
302
+ this.#elementMutationObserver.observe(this.element, {
303
+ attributes: true,
304
+ childList: true
305
+ });
306
+ }
307
+ dialog?.addEventListener('close', () => {
308
+ try {
309
+ this.dispatchEvent(new Event('close'));
310
+ }
311
+ catch (error) {
312
+ logAndRethrow(error);
313
+ }
314
+ }, { signal: this.#abortController.signal });
315
+ }
316
+ }
317
+ catch (error) {
318
+ logAndRethrow(error);
319
+ }
320
+ }
321
+ disconnectedCallback() {
322
+ try {
323
+ if (this.#disposeOfEffect) {
324
+ this.#disposeOfEffect();
325
+ }
326
+ if (this.#abortController) {
327
+ this.#abortController.abort();
328
+ }
329
+ if (this.#elementMutationObserver) {
330
+ this.#elementMutationObserver.disconnect();
331
+ }
332
+ }
333
+ catch (error) {
334
+ logAndRethrow(error);
335
+ }
336
+ }
337
+ showModal() {
338
+ if (this.shadowRoot) {
339
+ const dialog = this.shadowRoot.querySelector('dialog');
340
+ if (dialog) {
341
+ dialog.showModal();
342
+ }
343
+ }
344
+ }
345
+ #onDialogClick(event) {
346
+ const dialog = event.currentTarget;
347
+ if (!dialog || typeof dialog.getBoundingClientRect !== 'function' || typeof dialog.close !== 'function') {
348
+ return;
349
+ }
350
+ const rect = dialog.getBoundingClientRect();
351
+ const isInsideDialog = event.clientX >= rect.left &&
352
+ event.clientX <= rect.right &&
353
+ event.clientY >= rect.top &&
354
+ event.clientY <= rect.bottom;
355
+ if (!isInsideDialog) {
356
+ dialog.close();
357
+ }
358
+ }
359
+ };
360
+ };
361
+ //# sourceMappingURL=accented-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accented-dialog.js","sourceRoot":"","sources":["../../src/elements/accented-dialog.ts"],"names":[],"mappings":"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"}