accented 0.0.2 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +14 -0
- package/README.md +44 -187
- package/dist/accented.d.ts +8 -8
- package/dist/accented.d.ts.map +1 -1
- package/dist/accented.js +37 -30
- package/dist/accented.js.map +1 -1
- package/dist/common/strings.d.ts +2 -0
- package/dist/common/strings.d.ts.map +1 -0
- package/dist/common/strings.js +2 -0
- package/dist/common/strings.js.map +1 -0
- package/dist/common/tokens.d.ts +7 -0
- package/dist/common/tokens.d.ts.map +1 -0
- package/dist/common/tokens.js +8 -0
- package/dist/common/tokens.js.map +1 -0
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/dom-updater.d.ts +1 -1
- package/dist/dom-updater.d.ts.map +1 -1
- package/dist/dom-updater.js +73 -31
- package/dist/dom-updater.js.map +1 -1
- package/dist/elements/accented-dialog.d.ts +18 -10
- package/dist/elements/accented-dialog.d.ts.map +1 -1
- package/dist/elements/accented-dialog.js +116 -95
- package/dist/elements/accented-dialog.js.map +1 -1
- package/dist/elements/accented-trigger.d.ts +14 -9
- package/dist/elements/accented-trigger.d.ts.map +1 -1
- package/dist/elements/accented-trigger.js +83 -24
- package/dist/elements/accented-trigger.js.map +1 -1
- package/dist/fullscreen-listener.d.ts +2 -0
- package/dist/fullscreen-listener.d.ts.map +1 -0
- package/dist/fullscreen-listener.js +17 -0
- package/dist/fullscreen-listener.js.map +1 -0
- package/dist/intersection-observer.d.ts +1 -1
- package/dist/intersection-observer.d.ts.map +1 -1
- package/dist/intersection-observer.js +12 -6
- package/dist/intersection-observer.js.map +1 -1
- package/dist/log-and-rethrow.d.ts +1 -1
- package/dist/log-and-rethrow.d.ts.map +1 -1
- package/dist/log-and-rethrow.js +2 -3
- package/dist/log-and-rethrow.js.map +1 -1
- package/dist/logger.d.ts +4 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +6 -3
- package/dist/logger.js.map +1 -1
- package/dist/register-elements.d.ts +1 -1
- package/dist/register-elements.d.ts.map +1 -1
- package/dist/register-elements.js +6 -7
- package/dist/register-elements.js.map +1 -1
- package/dist/resize-listener.d.ts +1 -1
- package/dist/resize-listener.d.ts.map +1 -1
- package/dist/resize-listener.js +3 -4
- package/dist/resize-listener.js.map +1 -1
- package/dist/scanner.d.ts +2 -2
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +76 -43
- package/dist/scanner.js.map +1 -1
- package/dist/scroll-listeners.d.ts +1 -1
- package/dist/scroll-listeners.d.ts.map +1 -1
- package/dist/scroll-listeners.js +3 -4
- package/dist/scroll-listeners.js.map +1 -1
- package/dist/state.d.ts +3 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +5 -3
- package/dist/state.js.map +1 -1
- package/dist/task-queue.d.ts +4 -4
- package/dist/task-queue.d.ts.map +1 -1
- package/dist/task-queue.js +3 -2
- package/dist/task-queue.js.map +1 -1
- package/dist/types.d.ts +140 -49
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/are-elements-with-issues-equal.d.ts +3 -0
- package/dist/utils/are-elements-with-issues-equal.d.ts.map +1 -0
- package/dist/utils/are-elements-with-issues-equal.js +5 -0
- package/dist/utils/are-elements-with-issues-equal.js.map +1 -0
- package/dist/utils/are-issue-sets-equal.d.ts +2 -2
- package/dist/utils/are-issue-sets-equal.d.ts.map +1 -1
- package/dist/utils/are-issue-sets-equal.js +3 -3
- package/dist/utils/are-issue-sets-equal.js.map +1 -1
- package/dist/utils/containing-blocks.d.ts +3 -0
- package/dist/utils/containing-blocks.d.ts.map +1 -0
- package/dist/utils/containing-blocks.js +46 -0
- package/dist/utils/containing-blocks.js.map +1 -0
- package/dist/utils/contains.d.ts +2 -0
- package/dist/utils/contains.d.ts.map +1 -0
- package/dist/utils/contains.js +19 -0
- package/dist/utils/contains.js.map +1 -0
- package/dist/utils/deduplicate-nodes.d.ts +2 -0
- package/dist/utils/deduplicate-nodes.d.ts.map +1 -0
- package/dist/utils/deduplicate-nodes.js +4 -0
- package/dist/utils/deduplicate-nodes.js.map +1 -0
- package/dist/utils/deep-merge.d.ts +1 -1
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +8 -5
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/utils/dom-helpers.d.ts +9 -0
- package/dist/utils/dom-helpers.d.ts.map +1 -0
- package/dist/utils/dom-helpers.js +34 -0
- package/dist/utils/dom-helpers.js.map +1 -0
- package/dist/utils/ensure-non-empty.d.ts +2 -0
- package/dist/utils/ensure-non-empty.d.ts.map +1 -0
- package/dist/utils/ensure-non-empty.js +7 -0
- package/dist/utils/ensure-non-empty.js.map +1 -0
- package/dist/utils/get-element-html.d.ts +1 -1
- package/dist/utils/get-element-html.d.ts.map +1 -1
- package/dist/utils/get-element-html.js +4 -2
- package/dist/utils/get-element-html.js.map +1 -1
- package/dist/utils/get-element-position.d.ts +10 -2
- package/dist/utils/get-element-position.d.ts.map +1 -1
- package/dist/utils/get-element-position.js +64 -16
- package/dist/utils/get-element-position.js.map +1 -1
- package/dist/utils/get-parent.d.ts +2 -0
- package/dist/utils/get-parent.d.ts.map +1 -0
- package/dist/utils/get-parent.js +12 -0
- package/dist/utils/get-parent.js.map +1 -0
- package/dist/utils/get-scan-context.d.ts +3 -0
- package/dist/utils/get-scan-context.d.ts.map +1 -0
- package/dist/utils/get-scan-context.js +28 -0
- package/dist/utils/get-scan-context.js.map +1 -0
- package/dist/utils/get-scrollable-ancestors.d.ts +1 -1
- package/dist/utils/get-scrollable-ancestors.d.ts.map +1 -1
- package/dist/utils/get-scrollable-ancestors.js +10 -6
- package/dist/utils/get-scrollable-ancestors.js.map +1 -1
- package/dist/utils/is-node-in-scan-context.d.ts +3 -0
- package/dist/utils/is-node-in-scan-context.d.ts.map +1 -0
- package/dist/utils/is-node-in-scan-context.js +26 -0
- package/dist/utils/is-node-in-scan-context.js.map +1 -0
- package/dist/utils/is-non-empty.d.ts +2 -0
- package/dist/utils/is-non-empty.d.ts.map +1 -0
- package/dist/utils/is-non-empty.js +4 -0
- package/dist/utils/is-non-empty.js.map +1 -0
- package/dist/utils/normalize-context.d.ts +3 -0
- package/dist/utils/normalize-context.d.ts.map +1 -0
- package/dist/utils/normalize-context.js +59 -0
- package/dist/utils/normalize-context.js.map +1 -0
- package/dist/utils/recalculate-positions.d.ts +1 -1
- package/dist/utils/recalculate-positions.d.ts.map +1 -1
- package/dist/utils/recalculate-positions.js +5 -5
- package/dist/utils/recalculate-positions.js.map +1 -1
- package/dist/utils/recalculate-scrollable-ancestors.d.ts +1 -1
- package/dist/utils/recalculate-scrollable-ancestors.d.ts.map +1 -1
- package/dist/utils/recalculate-scrollable-ancestors.js +4 -4
- package/dist/utils/recalculate-scrollable-ancestors.js.map +1 -1
- package/dist/utils/shadow-dom-aware-mutation-observer.d.ts +10 -0
- package/dist/utils/shadow-dom-aware-mutation-observer.d.ts.map +1 -0
- package/dist/utils/shadow-dom-aware-mutation-observer.js +61 -0
- package/dist/utils/shadow-dom-aware-mutation-observer.js.map +1 -0
- package/dist/utils/supports-anchor-positioning.d.ts +1 -1
- package/dist/utils/supports-anchor-positioning.d.ts.map +1 -1
- package/dist/utils/supports-anchor-positioning.js +15 -2
- package/dist/utils/supports-anchor-positioning.js.map +1 -1
- package/dist/utils/transform-violations.d.ts +2 -2
- package/dist/utils/transform-violations.d.ts.map +1 -1
- package/dist/utils/transform-violations.js +25 -10
- package/dist/utils/transform-violations.js.map +1 -1
- package/dist/utils/update-elements-with-issues.d.ts +11 -5
- package/dist/utils/update-elements-with-issues.d.ts.map +1 -1
- package/dist/utils/update-elements-with-issues.js +56 -24
- package/dist/utils/update-elements-with-issues.js.map +1 -1
- package/dist/validate-options.d.ts +2 -2
- package/dist/validate-options.d.ts.map +1 -1
- package/dist/validate-options.js +91 -4
- package/dist/validate-options.js.map +1 -1
- package/package.json +16 -8
- package/src/accented.test.ts +2 -2
- package/src/accented.ts +45 -34
- package/src/common/strings.ts +2 -0
- package/src/common/tokens.ts +10 -0
- package/src/constants.ts +2 -1
- package/src/dom-updater.ts +87 -34
- package/src/elements/accented-dialog.ts +163 -123
- package/src/elements/accented-trigger.ts +128 -50
- package/src/fullscreen-listener.ts +21 -0
- package/src/intersection-observer.ts +27 -16
- package/src/log-and-rethrow.ts +2 -3
- package/src/logger.ts +14 -4
- package/src/register-elements.ts +7 -7
- package/src/resize-listener.ts +15 -11
- package/src/scanner.ts +113 -57
- package/src/scroll-listeners.ts +27 -19
- package/src/state.ts +27 -16
- package/src/task-queue.test.ts +5 -4
- package/src/task-queue.ts +8 -6
- package/src/types.ts +179 -76
- package/src/utils/are-elements-with-issues-equal.ts +11 -0
- package/src/utils/are-issue-sets-equal.test.ts +6 -7
- package/src/utils/are-issue-sets-equal.ts +8 -6
- package/src/utils/containing-blocks.ts +60 -0
- package/src/utils/contains.test.ts +54 -0
- package/src/utils/contains.ts +19 -0
- package/src/utils/deduplicate-nodes.ts +3 -0
- package/src/utils/deep-merge.test.ts +8 -1
- package/src/utils/deep-merge.ts +14 -8
- package/src/utils/dom-helpers.ts +42 -0
- package/src/utils/ensure-non-empty.ts +6 -0
- package/src/utils/get-element-html.ts +4 -2
- package/src/utils/get-element-position.ts +84 -16
- package/src/utils/get-parent.ts +14 -0
- package/src/utils/get-scan-context.test.ts +85 -0
- package/src/utils/get-scan-context.ts +36 -0
- package/src/utils/get-scrollable-ancestors.ts +15 -7
- package/src/utils/is-node-in-scan-context.test.ts +70 -0
- package/src/utils/is-node-in-scan-context.ts +29 -0
- package/src/utils/is-non-empty.ts +3 -0
- package/src/utils/normalize-context.test.ts +105 -0
- package/src/utils/normalize-context.ts +65 -0
- package/src/utils/recalculate-positions.ts +5 -5
- package/src/utils/recalculate-scrollable-ancestors.ts +4 -4
- package/src/utils/shadow-dom-aware-mutation-observer.ts +75 -0
- package/src/utils/supports-anchor-positioning.ts +19 -3
- package/src/utils/transform-violations.test.ts +29 -25
- package/src/utils/transform-violations.ts +32 -12
- package/src/utils/update-elements-with-issues.test.ts +145 -53
- package/src/utils/update-elements-with-issues.ts +123 -54
- package/src/validate-options.ts +154 -14
package/dist/dom-updater.js
CHANGED
|
@@ -1,16 +1,40 @@
|
|
|
1
1
|
import { effect } from '@preact/signals-core';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
2
|
+
import { primaryColorDark } from './common/tokens.js';
|
|
3
|
+
import { extendedElementsWithIssues, rootNodes } from './state.js';
|
|
4
|
+
import { areElementsWithIssuesEqual } from './utils/are-elements-with-issues-equal.js';
|
|
5
|
+
import { isDocument, isDocumentFragment, isShadowRoot } from './utils/dom-helpers.js';
|
|
6
|
+
import { getParent } from './utils/get-parent.js';
|
|
7
|
+
import { supportsAnchorPositioning } from './utils/supports-anchor-positioning.js';
|
|
8
|
+
const shouldInsertTriggerInsideElement = (element) => {
|
|
9
|
+
/**
|
|
10
|
+
* No parent means that the element is a root node,
|
|
11
|
+
* which cannot have siblings.
|
|
12
|
+
*/
|
|
13
|
+
const noParent = !getParent(element);
|
|
14
|
+
/**
|
|
15
|
+
* Table cells get a special treatment because if a sibling to a TH or TD is inserted,
|
|
16
|
+
* it alters the table layout, no matter how that sibling is positioned.
|
|
17
|
+
* We don't want tables to look broken, so we're inserting the trigger inside the table cell.
|
|
18
|
+
*/
|
|
19
|
+
const isTableCell = element.nodeName === 'TH' || element.nodeName === 'TD';
|
|
20
|
+
/**
|
|
21
|
+
* We want to put the trigger inside the <summary> element,
|
|
22
|
+
* because otherwise it will be hidden by the browser when the <details> element is collapsed
|
|
23
|
+
* (since none of the siblings of <summary> are visible then).
|
|
24
|
+
*/
|
|
25
|
+
const isSummary = element.nodeName === 'SUMMARY';
|
|
26
|
+
return noParent || isTableCell || isSummary;
|
|
27
|
+
};
|
|
28
|
+
export function createDomUpdater(name, intersectionObserver) {
|
|
5
29
|
const attrName = `data-${name}`;
|
|
6
30
|
function getAnchorNames(anchorNameValue) {
|
|
7
31
|
return anchorNameValue
|
|
8
32
|
.split(',')
|
|
9
|
-
.map(anchorName => anchorName.trim())
|
|
10
|
-
.filter(anchorName => anchorName.startsWith('--'));
|
|
33
|
+
.map((anchorName) => anchorName.trim())
|
|
34
|
+
.filter((anchorName) => anchorName.startsWith('--'));
|
|
11
35
|
}
|
|
12
|
-
function setAnchorName(
|
|
13
|
-
const anchorNameValue =
|
|
36
|
+
function setAnchorName(elementWithIssues) {
|
|
37
|
+
const { element, id, anchorNameValue } = elementWithIssues;
|
|
14
38
|
const anchorNames = getAnchorNames(anchorNameValue);
|
|
15
39
|
if (anchorNames.length > 0) {
|
|
16
40
|
element.style.setProperty('anchor-name', `${anchorNameValue}, --${name}-anchor-${id}`);
|
|
@@ -19,28 +43,30 @@ export default function createDomUpdater(name, intersectionObserver) {
|
|
|
19
43
|
element.style.setProperty('anchor-name', `--${name}-anchor-${id}`);
|
|
20
44
|
}
|
|
21
45
|
}
|
|
22
|
-
function removeAnchorName(
|
|
23
|
-
const anchorNameValue =
|
|
46
|
+
function removeAnchorName(elementWithIssues) {
|
|
47
|
+
const { element, anchorNameValue } = elementWithIssues;
|
|
24
48
|
const anchorNames = getAnchorNames(anchorNameValue);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
element.style.removeProperty('anchor-name');
|
|
49
|
+
if (anchorNames.length > 0) {
|
|
50
|
+
element.style.setProperty('anchor-name', anchorNames.join(', '));
|
|
28
51
|
}
|
|
29
|
-
else
|
|
30
|
-
element.style.
|
|
52
|
+
else {
|
|
53
|
+
element.style.removeProperty('anchor-name');
|
|
31
54
|
}
|
|
32
55
|
}
|
|
33
56
|
function setIssues(extendedElementsWithIssues) {
|
|
34
57
|
for (const elementWithIssues of extendedElementsWithIssues) {
|
|
58
|
+
if (elementWithIssues.skipRender) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
35
61
|
elementWithIssues.element.setAttribute(attrName, elementWithIssues.id.toString());
|
|
36
62
|
if (supportsAnchorPositioning(window)) {
|
|
37
|
-
setAnchorName(elementWithIssues
|
|
63
|
+
setAnchorName(elementWithIssues);
|
|
38
64
|
}
|
|
39
|
-
if (elementWithIssues.element
|
|
40
|
-
elementWithIssues.element.insertAdjacentElement('
|
|
65
|
+
if (shouldInsertTriggerInsideElement(elementWithIssues.element)) {
|
|
66
|
+
elementWithIssues.element.insertAdjacentElement('beforeend', elementWithIssues.trigger);
|
|
41
67
|
}
|
|
42
68
|
else {
|
|
43
|
-
elementWithIssues.element.insertAdjacentElement('
|
|
69
|
+
elementWithIssues.element.insertAdjacentElement('afterend', elementWithIssues.trigger);
|
|
44
70
|
}
|
|
45
71
|
if (intersectionObserver) {
|
|
46
72
|
intersectionObserver.observe(elementWithIssues.element);
|
|
@@ -49,9 +75,12 @@ export default function createDomUpdater(name, intersectionObserver) {
|
|
|
49
75
|
}
|
|
50
76
|
function removeIssues(extendedElementsWithIssues) {
|
|
51
77
|
for (const elementWithIssues of extendedElementsWithIssues) {
|
|
78
|
+
if (elementWithIssues.skipRender) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
52
81
|
elementWithIssues.element.removeAttribute(attrName);
|
|
53
82
|
if (supportsAnchorPositioning(window)) {
|
|
54
|
-
removeAnchorName(elementWithIssues
|
|
83
|
+
removeAnchorName(elementWithIssues);
|
|
55
84
|
}
|
|
56
85
|
elementWithIssues.trigger.remove();
|
|
57
86
|
if (intersectionObserver) {
|
|
@@ -63,8 +92,10 @@ export default function createDomUpdater(name, intersectionObserver) {
|
|
|
63
92
|
stylesheet.replaceSync(`
|
|
64
93
|
@layer ${name} {
|
|
65
94
|
:root {
|
|
66
|
-
|
|
67
|
-
|
|
95
|
+
/* Ensure that the primary / secondary color combination meets WCAG 1.4.3 Contrast (Minimum) */
|
|
96
|
+
/* OKLCH stuff: https://oklch.com/ */
|
|
97
|
+
--${name}-primary-color: ${primaryColorDark};
|
|
98
|
+
--${name}-secondary-color: oklch(0.98 0 0);
|
|
68
99
|
--${name}-outline-width: 2px;
|
|
69
100
|
--${name}-outline-style: solid;
|
|
70
101
|
}
|
|
@@ -78,25 +109,36 @@ export default function createDomUpdater(name, intersectionObserver) {
|
|
|
78
109
|
}
|
|
79
110
|
`);
|
|
80
111
|
let previousExtendedElementsWithIssues = [];
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
112
|
+
let previousRootNodes = new Set();
|
|
113
|
+
const disposeOfStyleSheetsEffect = effect(() => {
|
|
114
|
+
const newRootNodes = rootNodes.value;
|
|
115
|
+
const addedRootNodes = [...newRootNodes].filter((rootNode) => !previousRootNodes.has(rootNode));
|
|
116
|
+
const removedRootNodes = [...previousRootNodes].filter((rootNode) => !newRootNodes.has(rootNode));
|
|
117
|
+
for (const rootNode of addedRootNodes) {
|
|
118
|
+
if (isDocument(rootNode) || (isDocumentFragment(rootNode) && isShadowRoot(rootNode))) {
|
|
119
|
+
rootNode.adoptedStyleSheets.push(stylesheet);
|
|
120
|
+
}
|
|
85
121
|
}
|
|
86
|
-
|
|
122
|
+
for (const rootNode of removedRootNodes) {
|
|
123
|
+
if (isDocument(rootNode) || (isDocumentFragment(rootNode) && isShadowRoot(rootNode))) {
|
|
124
|
+
rootNode.adoptedStyleSheets.splice(rootNode.adoptedStyleSheets.indexOf(stylesheet), 1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
previousRootNodes = newRootNodes;
|
|
128
|
+
});
|
|
87
129
|
const disposeOfElementsEffect = effect(() => {
|
|
88
|
-
const added = extendedElementsWithIssues.value.filter(elementWithIssues => {
|
|
89
|
-
return !previousExtendedElementsWithIssues.some(previousElementWithIssues => previousElementWithIssues
|
|
130
|
+
const added = extendedElementsWithIssues.value.filter((elementWithIssues) => {
|
|
131
|
+
return !previousExtendedElementsWithIssues.some((previousElementWithIssues) => areElementsWithIssuesEqual(previousElementWithIssues, elementWithIssues));
|
|
90
132
|
});
|
|
91
|
-
const removed = previousExtendedElementsWithIssues.filter(previousElementWithIssues => {
|
|
92
|
-
return !extendedElementsWithIssues.value.some(elementWithIssues => elementWithIssues
|
|
133
|
+
const removed = previousExtendedElementsWithIssues.filter((previousElementWithIssues) => {
|
|
134
|
+
return !extendedElementsWithIssues.value.some((elementWithIssues) => areElementsWithIssuesEqual(elementWithIssues, previousElementWithIssues));
|
|
93
135
|
});
|
|
94
136
|
removeIssues(removed);
|
|
95
137
|
setIssues(added);
|
|
96
138
|
previousExtendedElementsWithIssues = [...extendedElementsWithIssues.value];
|
|
97
139
|
});
|
|
98
140
|
return () => {
|
|
99
|
-
|
|
141
|
+
disposeOfStyleSheetsEffect();
|
|
100
142
|
disposeOfElementsEffect();
|
|
101
143
|
};
|
|
102
144
|
}
|
package/dist/dom-updater.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-updater.js","sourceRoot":"","sources":["../src/dom-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dom-updater.js","sourceRoot":"","sources":["../src/dom-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import type { Issue } from '../types';
|
|
2
1
|
import type { Signal } from '@preact/signals-core';
|
|
2
|
+
import type { Issue } from '../types.ts';
|
|
3
3
|
export interface AccentedDialog extends HTMLElement {
|
|
4
4
|
issues: Signal<Array<Issue>> | undefined;
|
|
5
5
|
element: Element | undefined;
|
|
6
6
|
showModal: () => void;
|
|
7
|
+
open: boolean;
|
|
7
8
|
}
|
|
8
|
-
declare const
|
|
9
|
+
export declare const getAccentedDialog: () => {
|
|
9
10
|
new (): {
|
|
10
|
-
"__#1@#disposeOfEffect": (() => void) | undefined;
|
|
11
11
|
"__#1@#abortController": AbortController | undefined;
|
|
12
12
|
issues: Signal<Array<Issue>> | undefined;
|
|
13
13
|
element: Element | undefined;
|
|
14
|
-
|
|
14
|
+
open: boolean;
|
|
15
15
|
connectedCallback(): void;
|
|
16
16
|
disconnectedCallback(): void;
|
|
17
17
|
showModal(): void;
|
|
18
|
+
/**
|
|
19
|
+
* This can be removed once the closedBy attribute
|
|
20
|
+
* is available in all supported browsers:
|
|
21
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy
|
|
22
|
+
*/
|
|
18
23
|
"__#1@#onDialogClick"(event: MouseEvent): void;
|
|
19
24
|
accessKey: string;
|
|
20
25
|
readonly accessKeyLabel: string;
|
|
@@ -40,13 +45,14 @@ declare const _default: () => {
|
|
|
40
45
|
click(): void;
|
|
41
46
|
hidePopover(): void;
|
|
42
47
|
showPopover(): void;
|
|
43
|
-
togglePopover(
|
|
48
|
+
togglePopover(options?: boolean): boolean;
|
|
44
49
|
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
|
|
45
50
|
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
|
|
46
51
|
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
|
|
47
52
|
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
|
|
48
53
|
readonly attributes: NamedNodeMap;
|
|
49
|
-
|
|
54
|
+
get classList(): DOMTokenList;
|
|
55
|
+
set classList(value: string);
|
|
50
56
|
className: string;
|
|
51
57
|
readonly clientHeight: number;
|
|
52
58
|
readonly clientLeft: number;
|
|
@@ -61,7 +67,8 @@ declare const _default: () => {
|
|
|
61
67
|
onfullscreenerror: ((this: Element, ev: Event) => any) | null;
|
|
62
68
|
outerHTML: string;
|
|
63
69
|
readonly ownerDocument: Document;
|
|
64
|
-
|
|
70
|
+
get part(): DOMTokenList;
|
|
71
|
+
set part(value: string);
|
|
65
72
|
readonly prefix: string | null;
|
|
66
73
|
readonly scrollHeight: number;
|
|
67
74
|
scrollLeft: number;
|
|
@@ -138,7 +145,7 @@ declare const _default: () => {
|
|
|
138
145
|
readonly previousSibling: ChildNode | null;
|
|
139
146
|
textContent: string | null;
|
|
140
147
|
appendChild<T extends Node>(node: T): T;
|
|
141
|
-
cloneNode(
|
|
148
|
+
cloneNode(subtree?: boolean): Node;
|
|
142
149
|
compareDocumentPosition(other: Node): number;
|
|
143
150
|
contains(other: Node | null): boolean;
|
|
144
151
|
getRootNode(options?: GetRootNodeOptions): Node;
|
|
@@ -200,6 +207,7 @@ declare const _default: () => {
|
|
|
200
207
|
ariaPosInSet: string | null;
|
|
201
208
|
ariaPressed: string | null;
|
|
202
209
|
ariaReadOnly: string | null;
|
|
210
|
+
ariaRelevant: string | null;
|
|
203
211
|
ariaRequired: string | null;
|
|
204
212
|
ariaRoleDescription: string | null;
|
|
205
213
|
ariaRowCount: string | null;
|
|
@@ -241,7 +249,8 @@ declare const _default: () => {
|
|
|
241
249
|
replaceChildren(...nodes: (Node | string)[]): void;
|
|
242
250
|
readonly assignedSlot: HTMLSlotElement | null;
|
|
243
251
|
readonly attributeStyleMap: StylePropertyMap;
|
|
244
|
-
|
|
252
|
+
get style(): CSSStyleDeclaration;
|
|
253
|
+
set style(cssText: string);
|
|
245
254
|
contentEditable: string;
|
|
246
255
|
enterKeyHint: string;
|
|
247
256
|
inputMode: string;
|
|
@@ -352,5 +361,4 @@ declare const _default: () => {
|
|
|
352
361
|
focus(options?: FocusOptions): void;
|
|
353
362
|
};
|
|
354
363
|
};
|
|
355
|
-
export default _default;
|
|
356
364
|
//# sourceMappingURL=accented-dialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accented-dialog.d.ts","sourceRoot":"","sources":["../../src/elements/accented-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"accented-dialog.d.ts","sourceRoot":"","sources":["../../src/elements/accented-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;CACf;AAID,eAAO,MAAM,iBAAiB;;iCAoOR,eAAe,GAAG,SAAS;gBAErC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS;iBAE/B,OAAO,GAAG,SAAS;;;;;QAqJ5B;;;;WAIG;qCACmB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBnC,CAAC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import getElementHtml from '../utils/get-element-html.js';
|
|
1
|
+
import { colorDark, colorLight, fontSystemMono, fontSystemSans } from '../common/tokens.js';
|
|
3
2
|
import { accentedUrl } from '../constants.js';
|
|
4
|
-
import logAndRethrow from '../log-and-rethrow.js';
|
|
3
|
+
import { logAndRethrow } from '../log-and-rethrow.js';
|
|
4
|
+
import { getElementHtml } from '../utils/get-element-html.js';
|
|
5
|
+
import { isNonEmpty } from '../utils/is-non-empty.js';
|
|
5
6
|
// We want Accented to not throw an error in Node, and use static imports,
|
|
6
7
|
// so we can't export `class extends HTMLElement` because HTMLElement is not available in Node.
|
|
7
|
-
export
|
|
8
|
+
export const getAccentedDialog = () => {
|
|
8
9
|
const dialogTemplate = document.createElement('template');
|
|
9
10
|
dialogTemplate.innerHTML = `
|
|
10
|
-
<dialog dir="ltr" lang="en" aria-labelledby="title">
|
|
11
|
+
<dialog dir="ltr" lang="en" aria-labelledby="title" closedby="any">
|
|
11
12
|
<div id="button-container">
|
|
12
13
|
<button id="close" aria-label="Close">✕</button>
|
|
13
14
|
</div>
|
|
@@ -44,20 +45,45 @@ export default () => {
|
|
|
44
45
|
:host {
|
|
45
46
|
all: initial !important;
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
--
|
|
49
|
-
--
|
|
48
|
+
/* OKLCH stuff: https://oklch.com/ */
|
|
49
|
+
--light-color: ${colorLight};
|
|
50
|
+
--dark-color: ${colorDark};
|
|
50
51
|
|
|
51
|
-
--
|
|
52
|
-
--
|
|
53
|
-
|
|
54
|
-
--impact-
|
|
52
|
+
--background-color: light-dark(var(--light-color), var(--dark-color));
|
|
53
|
+
--text-color: light-dark(var(--dark-color), var(--light-color));
|
|
54
|
+
|
|
55
|
+
--impact-lightness: 0.80;
|
|
56
|
+
--focus-lightness: 0.45;
|
|
57
|
+
@media (prefers-color-scheme: dark) {
|
|
58
|
+
--impact-lightness: 0.45;
|
|
59
|
+
--focus-lightness: 0.80;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
--blue-hue: 230;
|
|
63
|
+
--gold-hue: 90;
|
|
64
|
+
--red-hue: 0;
|
|
65
|
+
|
|
66
|
+
/* Contrasts with background. */
|
|
67
|
+
--focus-color: oklch(var(--focus-lightness) 0.25 var(--blue-hue));
|
|
68
|
+
|
|
69
|
+
--impact-chroma: 0.16;
|
|
70
|
+
|
|
71
|
+
--impact-moderate-hue: var(--blue-hue);
|
|
72
|
+
--impact-serious-hue: var(--gold-hue);
|
|
73
|
+
--impact-critical-hue: var(--red-hue);
|
|
74
|
+
|
|
75
|
+
--impact-minor-color: oklch(var(--impact-lightness) 0 0);
|
|
76
|
+
--impact-moderate-color: oklch(var(--impact-lightness) var(--impact-chroma) var(--impact-moderate-hue));
|
|
77
|
+
--impact-serious-color: oklch(var(--impact-lightness) var(--impact-chroma) var(--impact-serious-hue));
|
|
78
|
+
--impact-critical-color: oklch(var(--impact-lightness) var(--impact-chroma) var(--impact-critical-hue));
|
|
79
|
+
|
|
80
|
+
--base-size: max(1rem, 16px);
|
|
55
81
|
|
|
56
82
|
/* Spacing and typography custom props, inspired by https://utopia.fyi (simplified). */
|
|
57
83
|
|
|
58
84
|
/* @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
85
|
--ratio: 1.2;
|
|
60
|
-
--step-0:
|
|
86
|
+
--step-0: var(--base-size);
|
|
61
87
|
--step-1: calc(var(--step-0) * var(--ratio));
|
|
62
88
|
--step-2: calc(var(--step-1) * var(--ratio));
|
|
63
89
|
--step-3: calc(var(--step-2) * var(--ratio));
|
|
@@ -65,15 +91,15 @@ export default () => {
|
|
|
65
91
|
--step--1: calc(var(--step-0) / var(--ratio));
|
|
66
92
|
|
|
67
93
|
/* @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.
|
|
69
|
-
--space-2xs: 0.
|
|
70
|
-
--space-xs: 0.
|
|
71
|
-
--space-s:
|
|
72
|
-
--space-m: 1.
|
|
73
|
-
--space-l:
|
|
74
|
-
--space-xl:
|
|
75
|
-
--space-2xl:
|
|
76
|
-
--space-3xl:
|
|
94
|
+
--space-3xs: calc(0.25 * var(--base-size));
|
|
95
|
+
--space-2xs: calc(0.5 * var(--base-size));
|
|
96
|
+
--space-xs: calc(0.75 * var(--base-size));
|
|
97
|
+
--space-s: var(--base-size);
|
|
98
|
+
--space-m: calc(1.5 * var(--base-size));
|
|
99
|
+
--space-l: calc(2 * var(--base-size));
|
|
100
|
+
--space-xl: calc(3 * var(--base-size));
|
|
101
|
+
--space-2xl: calc(4 * var(--base-size));
|
|
102
|
+
--space-3xl: calc(6 * var(--base-size));
|
|
77
103
|
}
|
|
78
104
|
|
|
79
105
|
a[href], button {
|
|
@@ -86,6 +112,7 @@ export default () => {
|
|
|
86
112
|
outline-style: solid;
|
|
87
113
|
}
|
|
88
114
|
|
|
115
|
+
/* We should probably be comfortable with showing these styles on non-hover devices. */
|
|
89
116
|
&:hover:not(:focus-visible) {
|
|
90
117
|
outline-style: dashed;
|
|
91
118
|
}
|
|
@@ -102,14 +129,17 @@ export default () => {
|
|
|
102
129
|
dialog {
|
|
103
130
|
box-sizing: border-box;
|
|
104
131
|
overflow-wrap: break-word;
|
|
105
|
-
font-family:
|
|
132
|
+
font-family: ${fontSystemSans};
|
|
106
133
|
line-height: 1.5;
|
|
107
|
-
|
|
108
|
-
color: var(--
|
|
134
|
+
text-wrap: pretty;
|
|
135
|
+
background-color: var(--background-color);
|
|
136
|
+
color: var(--text-color);
|
|
109
137
|
border: 2px solid currentColor;
|
|
110
138
|
padding: var(--space-l);
|
|
111
139
|
inline-size: min(90ch, calc(100% - var(--space-s)* 2));
|
|
112
140
|
max-block-size: calc(100% - var(--space-s) * 2);
|
|
141
|
+
|
|
142
|
+
color-scheme: light dark;
|
|
113
143
|
}
|
|
114
144
|
|
|
115
145
|
#button-container {
|
|
@@ -117,8 +147,8 @@ export default () => {
|
|
|
117
147
|
}
|
|
118
148
|
|
|
119
149
|
#close {
|
|
120
|
-
background-color: var(--
|
|
121
|
-
color: var(--
|
|
150
|
+
background-color: var(--background-color);
|
|
151
|
+
color: var(--text-color);
|
|
122
152
|
border: 2px solid currentColor;
|
|
123
153
|
padding-inline: var(--space-2xs);
|
|
124
154
|
aspect-ratio: 1 / 1;
|
|
@@ -139,8 +169,7 @@ export default () => {
|
|
|
139
169
|
}
|
|
140
170
|
|
|
141
171
|
code {
|
|
142
|
-
|
|
143
|
-
font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
|
|
172
|
+
font-family: ${fontSystemMono};
|
|
144
173
|
font-size: var(--step--1);
|
|
145
174
|
}
|
|
146
175
|
|
|
@@ -155,7 +184,7 @@ export default () => {
|
|
|
155
184
|
}
|
|
156
185
|
|
|
157
186
|
a {
|
|
158
|
-
font-weight:
|
|
187
|
+
font-weight: 500;
|
|
159
188
|
}
|
|
160
189
|
}
|
|
161
190
|
|
|
@@ -200,14 +229,13 @@ export default () => {
|
|
|
200
229
|
}
|
|
201
230
|
`);
|
|
202
231
|
return class extends HTMLElement {
|
|
203
|
-
#disposeOfEffect;
|
|
204
232
|
#abortController;
|
|
205
233
|
issues;
|
|
206
234
|
element;
|
|
207
|
-
|
|
235
|
+
open = false;
|
|
208
236
|
constructor() {
|
|
237
|
+
super();
|
|
209
238
|
try {
|
|
210
|
-
super();
|
|
211
239
|
this.attachShadow({ mode: 'open' });
|
|
212
240
|
const content = dialogTemplate.content.cloneNode(true);
|
|
213
241
|
if (this.shadowRoot) {
|
|
@@ -242,70 +270,61 @@ export default () => {
|
|
|
242
270
|
logAndRethrow(error);
|
|
243
271
|
}
|
|
244
272
|
}, { signal: this.#abortController.signal });
|
|
245
|
-
|
|
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(() => {
|
|
273
|
+
dialog?.addEventListener('keydown', (event) => {
|
|
290
274
|
try {
|
|
291
|
-
|
|
275
|
+
if (event.key === 'Escape') {
|
|
276
|
+
event.stopPropagation();
|
|
277
|
+
}
|
|
292
278
|
}
|
|
293
279
|
catch (error) {
|
|
294
280
|
logAndRethrow(error);
|
|
295
281
|
}
|
|
296
|
-
});
|
|
282
|
+
}, { signal: this.#abortController.signal });
|
|
283
|
+
if (this.issues) {
|
|
284
|
+
const issues = this.issues.value;
|
|
285
|
+
const issuesList = shadowRoot.getElementById('issues');
|
|
286
|
+
if (issuesList) {
|
|
287
|
+
issuesList.innerHTML = '';
|
|
288
|
+
for (const issue of issues) {
|
|
289
|
+
const issueContent = issueTemplate.content.cloneNode(true);
|
|
290
|
+
const title = issueContent.querySelector('a');
|
|
291
|
+
const impact = issueContent.querySelector('.impact');
|
|
292
|
+
const description = issueContent.querySelector('.description');
|
|
293
|
+
if (title && impact && description) {
|
|
294
|
+
title.textContent = `${issue.title} (${issue.id})`;
|
|
295
|
+
title.href = issue.url;
|
|
296
|
+
impact.textContent = `User impact: ${issue.impact}`;
|
|
297
|
+
impact.setAttribute('data-impact', String(issue.impact));
|
|
298
|
+
const descriptionItems = issue.description.split(/\n\s*/);
|
|
299
|
+
const descriptionContent = descriptionTemplate.content.cloneNode(true);
|
|
300
|
+
const descriptionTitle = descriptionContent.querySelector('span');
|
|
301
|
+
const descriptionList = descriptionContent.querySelector('ul');
|
|
302
|
+
if (descriptionTitle &&
|
|
303
|
+
descriptionList &&
|
|
304
|
+
isNonEmpty(descriptionItems) &&
|
|
305
|
+
descriptionItems.length > 1) {
|
|
306
|
+
descriptionTitle.textContent = descriptionItems[0];
|
|
307
|
+
for (const descriptionItem of descriptionItems.slice(1)) {
|
|
308
|
+
const li = document.createElement('li');
|
|
309
|
+
li.textContent = descriptionItem;
|
|
310
|
+
descriptionList.appendChild(li);
|
|
311
|
+
}
|
|
312
|
+
description.appendChild(descriptionContent);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
issuesList.appendChild(issueContent);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
297
319
|
if (this.element) {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.#elementMutationObserver.observe(this.element, {
|
|
303
|
-
attributes: true,
|
|
304
|
-
childList: true
|
|
305
|
-
});
|
|
320
|
+
const elementHtmlContainer = shadowRoot.getElementById('element-html');
|
|
321
|
+
if (elementHtmlContainer) {
|
|
322
|
+
elementHtmlContainer.textContent = getElementHtml(this.element);
|
|
323
|
+
}
|
|
306
324
|
}
|
|
307
325
|
dialog?.addEventListener('close', () => {
|
|
308
326
|
try {
|
|
327
|
+
this.open = false;
|
|
309
328
|
this.dispatchEvent(new Event('close'));
|
|
310
329
|
}
|
|
311
330
|
catch (error) {
|
|
@@ -320,15 +339,9 @@ export default () => {
|
|
|
320
339
|
}
|
|
321
340
|
disconnectedCallback() {
|
|
322
341
|
try {
|
|
323
|
-
if (this.#disposeOfEffect) {
|
|
324
|
-
this.#disposeOfEffect();
|
|
325
|
-
}
|
|
326
342
|
if (this.#abortController) {
|
|
327
343
|
this.#abortController.abort();
|
|
328
344
|
}
|
|
329
|
-
if (this.#elementMutationObserver) {
|
|
330
|
-
this.#elementMutationObserver.disconnect();
|
|
331
|
-
}
|
|
332
345
|
}
|
|
333
346
|
catch (error) {
|
|
334
347
|
logAndRethrow(error);
|
|
@@ -339,12 +352,20 @@ export default () => {
|
|
|
339
352
|
const dialog = this.shadowRoot.querySelector('dialog');
|
|
340
353
|
if (dialog) {
|
|
341
354
|
dialog.showModal();
|
|
355
|
+
this.open = true;
|
|
342
356
|
}
|
|
343
357
|
}
|
|
344
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* This can be removed once the closedBy attribute
|
|
361
|
+
* is available in all supported browsers:
|
|
362
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy
|
|
363
|
+
*/
|
|
345
364
|
#onDialogClick(event) {
|
|
346
365
|
const dialog = event.currentTarget;
|
|
347
|
-
if (!dialog ||
|
|
366
|
+
if (!dialog ||
|
|
367
|
+
typeof dialog.getBoundingClientRect !== 'function' ||
|
|
368
|
+
typeof dialog.close !== 'function') {
|
|
348
369
|
return;
|
|
349
370
|
}
|
|
350
371
|
const rect = dialog.getBoundingClientRect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accented-dialog.js","sourceRoot":"","sources":["../../src/elements/accented-dialog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accented-dialog.js","sourceRoot":"","sources":["../../src/elements/accented-dialog.ts"],"names":[],"mappings":"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"}
|