@spectrum-web-components/overlay 0.41.0 → 0.41.2
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/custom-elements.json +996 -314
- package/package.json +31 -7
- package/src/AbstractOverlay.d.ts +13 -3
- package/src/AbstractOverlay.dev.js +54 -19
- package/src/AbstractOverlay.dev.js.map +2 -2
- package/src/AbstractOverlay.js +1 -1
- package/src/AbstractOverlay.js.map +3 -3
- package/src/ClickController.d.ts +14 -0
- package/src/ClickController.dev.js +42 -0
- package/src/ClickController.dev.js.map +7 -0
- package/src/ClickController.js +2 -0
- package/src/ClickController.js.map +7 -0
- package/src/HoverController.d.ts +19 -0
- package/src/HoverController.dev.js +141 -0
- package/src/HoverController.dev.js.map +7 -0
- package/src/HoverController.js +2 -0
- package/src/HoverController.js.map +7 -0
- package/src/InteractionController.d.ts +23 -0
- package/src/InteractionController.dev.js +45 -0
- package/src/InteractionController.dev.js.map +7 -0
- package/src/InteractionController.js +2 -0
- package/src/InteractionController.js.map +7 -0
- package/src/LongpressController.d.ts +21 -0
- package/src/LongpressController.dev.js +157 -0
- package/src/LongpressController.dev.js.map +7 -0
- package/src/LongpressController.js +2 -0
- package/src/LongpressController.js.map +7 -0
- package/src/Overlay.d.ts +17 -50
- package/src/Overlay.dev.js +86 -363
- package/src/Overlay.dev.js.map +2 -2
- package/src/Overlay.js +10 -10
- package/src/Overlay.js.map +3 -3
- package/src/OverlayDialog.dev.js +8 -1
- package/src/OverlayDialog.dev.js.map +2 -2
- package/src/OverlayDialog.js +1 -1
- package/src/OverlayDialog.js.map +3 -3
- package/src/OverlayNoPopover.dev.js +9 -3
- package/src/OverlayNoPopover.dev.js.map +2 -2
- package/src/OverlayNoPopover.js +1 -1
- package/src/OverlayNoPopover.js.map +3 -3
- package/src/OverlayPopover.dev.js +10 -1
- package/src/OverlayPopover.dev.js.map +2 -2
- package/src/OverlayPopover.js +1 -1
- package/src/OverlayPopover.js.map +3 -3
- package/src/OverlayStack.dev.js +3 -0
- package/src/OverlayStack.dev.js.map +2 -2
- package/src/OverlayStack.js +1 -1
- package/src/OverlayStack.js.map +2 -2
- package/src/index.d.ts +1 -0
- package/src/index.dev.js +1 -0
- package/src/index.dev.js.map +2 -2
- package/src/index.js +1 -1
- package/src/index.js.map +2 -2
- package/src/overlay-trigger-directive.d.ts +31 -0
- package/src/overlay-trigger-directive.dev.js +102 -0
- package/src/overlay-trigger-directive.dev.js.map +7 -0
- package/src/overlay-trigger-directive.js +2 -0
- package/src/overlay-trigger-directive.js.map +7 -0
- package/src/overlay-trigger.css.dev.js +1 -1
- package/src/overlay-trigger.css.dev.js.map +1 -1
- package/src/overlay-trigger.css.js +1 -1
- package/src/overlay-trigger.css.js.map +1 -1
- package/src/overlay-types.d.ts +7 -0
- package/src/overlay-types.dev.js.map +1 -1
- package/src/overlay-types.js.map +1 -1
- package/src/overlay.css.dev.js +1 -3
- package/src/overlay.css.dev.js.map +2 -2
- package/src/overlay.css.js +1 -3
- package/src/overlay.css.js.map +2 -2
- package/src/slottable-request-event.d.ts +7 -0
- package/src/slottable-request-event.dev.js +28 -0
- package/src/slottable-request-event.dev.js.map +7 -0
- package/src/slottable-request-event.js +2 -0
- package/src/slottable-request-event.js.map +7 -0
- package/stories/overlay-directive.stories.js +203 -0
- package/stories/overlay-directive.stories.js.map +7 -0
- package/stories/overlay-element.stories.js +44 -1
- package/stories/overlay-element.stories.js.map +2 -2
- package/stories/overlay.stories.js +9 -9
- package/stories/overlay.stories.js.map +2 -2
- package/test/benchmark/basic-test.js +24 -1
- package/test/benchmark/basic-test.js.map +2 -2
- package/test/benchmark/directive-test.js +42 -0
- package/test/benchmark/directive-test.js.map +7 -0
- package/test/benchmark/element-test.js +40 -0
- package/test/benchmark/element-test.js.map +7 -0
- package/test/benchmark/lazy-test.js +48 -0
- package/test/benchmark/lazy-test.js.map +7 -0
- package/test/index.js +11 -176
- package/test/index.js.map +2 -2
- package/test/overlay-directive.test-vrt.js +5 -0
- package/test/overlay-directive.test-vrt.js.map +7 -0
- package/test/overlay-directive.test.js +147 -0
- package/test/overlay-directive.test.js.map +7 -0
- package/test/overlay-element.test.js +152 -1
- package/test/overlay-element.test.js.map +2 -2
- package/test/overlay-trigger-directive.test.js +75 -0
- package/test/overlay-trigger-directive.test.js.map +7 -0
- package/test/overlay-trigger-extended.test.js +1 -1
- package/test/overlay-trigger-extended.test.js.map +2 -2
package/src/Overlay.dev.js
CHANGED
|
@@ -19,15 +19,10 @@ import {
|
|
|
19
19
|
queryAssignedElements,
|
|
20
20
|
state
|
|
21
21
|
} from "@spectrum-web-components/base/src/decorators.js";
|
|
22
|
-
import {
|
|
23
|
-
isAndroid,
|
|
24
|
-
isIOS
|
|
25
|
-
} from "@spectrum-web-components/shared/src/platform.js";
|
|
26
22
|
import {
|
|
27
23
|
ElementResolutionController,
|
|
28
24
|
elementResolverUpdatedSymbol
|
|
29
25
|
} from "@spectrum-web-components/reactive-controllers/src/ElementResolution.js";
|
|
30
|
-
import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
|
|
31
26
|
import {
|
|
32
27
|
ifDefined,
|
|
33
28
|
styleMap
|
|
@@ -38,17 +33,17 @@ import { OverlayDialog } from "./OverlayDialog.dev.js";
|
|
|
38
33
|
import { OverlayPopover } from "./OverlayPopover.dev.js";
|
|
39
34
|
import { OverlayNoPopover } from "./OverlayNoPopover.dev.js";
|
|
40
35
|
import { overlayStack } from "./OverlayStack.dev.js";
|
|
41
|
-
import { noop } from "./AbstractOverlay.dev.js";
|
|
42
36
|
import { VirtualTrigger } from "./VirtualTrigger.dev.js";
|
|
43
37
|
import { PlacementController } from "./PlacementController.dev.js";
|
|
38
|
+
import { ClickController } from "./ClickController.dev.js";
|
|
39
|
+
import { HoverController } from "./HoverController.dev.js";
|
|
40
|
+
import { LongpressController } from "./LongpressController.dev.js";
|
|
41
|
+
export { LONGPRESS_INSTRUCTIONS } from "./LongpressController.dev.js";
|
|
42
|
+
import {
|
|
43
|
+
removeSlottableRequest,
|
|
44
|
+
SlottableRequestEvent
|
|
45
|
+
} from "./slottable-request-event.dev.js";
|
|
44
46
|
import styles from "./overlay.css.js";
|
|
45
|
-
const LONGPRESS_DURATION = 300;
|
|
46
|
-
const HOVER_DELAY = 300;
|
|
47
|
-
export const LONGPRESS_INSTRUCTIONS = {
|
|
48
|
-
touch: "Double tap and long press for additional options",
|
|
49
|
-
keyboard: "Press Space or Alt+Down Arrow for additional options",
|
|
50
|
-
mouse: "Click and hold for additional options"
|
|
51
|
-
};
|
|
52
47
|
const supportsPopover = "showPopover" in document.createElement("div");
|
|
53
48
|
let OverlayFeatures = OverlayDialog(AbstractOverlay);
|
|
54
49
|
if (supportsPopover) {
|
|
@@ -56,23 +51,23 @@ if (supportsPopover) {
|
|
|
56
51
|
} else {
|
|
57
52
|
OverlayFeatures = OverlayNoPopover(OverlayFeatures);
|
|
58
53
|
}
|
|
54
|
+
export const strategies = {
|
|
55
|
+
click: ClickController,
|
|
56
|
+
longpress: LongpressController,
|
|
57
|
+
hover: HoverController
|
|
58
|
+
};
|
|
59
59
|
const _Overlay = class _Overlay extends OverlayFeatures {
|
|
60
60
|
constructor() {
|
|
61
61
|
super(...arguments);
|
|
62
62
|
this._delayed = false;
|
|
63
63
|
this._disabled = false;
|
|
64
|
-
this.longpressState = "null";
|
|
65
64
|
this.offset = 0;
|
|
66
|
-
this.placementController = new PlacementController(this);
|
|
67
65
|
this._open = false;
|
|
68
66
|
this.receivesFocus = "auto";
|
|
69
|
-
this.releaseAriaDescribedby = noop;
|
|
70
|
-
this.releaseLongpressDescribedby = noop;
|
|
71
67
|
this._state = "closed";
|
|
72
68
|
this.triggerElement = null;
|
|
73
69
|
this.type = "auto";
|
|
74
70
|
this.wasOpen = false;
|
|
75
|
-
this.elementResolver = new ElementResolutionController(this);
|
|
76
71
|
this.closeOnFocusOut = (event) => {
|
|
77
72
|
if (!event.relatedTarget) {
|
|
78
73
|
return;
|
|
@@ -91,133 +86,6 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
91
86
|
);
|
|
92
87
|
event.relatedTarget.dispatchEvent(relationEvent);
|
|
93
88
|
};
|
|
94
|
-
this.elementIds = [];
|
|
95
|
-
this.handlePointerdown = (event) => {
|
|
96
|
-
if (!this.triggerElement)
|
|
97
|
-
return;
|
|
98
|
-
if (event.button !== 0)
|
|
99
|
-
return;
|
|
100
|
-
const triggerElement = this.triggerElement;
|
|
101
|
-
this.longpressState = "potential";
|
|
102
|
-
document.addEventListener("pointerup", this.handlePointerup);
|
|
103
|
-
document.addEventListener("pointercancel", this.handlePointerup);
|
|
104
|
-
if (triggerElement.holdAffordance) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
this.longressTimeout = setTimeout(() => {
|
|
108
|
-
if (!triggerElement)
|
|
109
|
-
return;
|
|
110
|
-
triggerElement.dispatchEvent(
|
|
111
|
-
new CustomEvent("longpress", {
|
|
112
|
-
bubbles: true,
|
|
113
|
-
composed: true,
|
|
114
|
-
detail: {
|
|
115
|
-
source: "pointer"
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
);
|
|
119
|
-
}, LONGPRESS_DURATION);
|
|
120
|
-
};
|
|
121
|
-
this.handlePointerup = () => {
|
|
122
|
-
clearTimeout(this.longressTimeout);
|
|
123
|
-
if (!this.triggerElement)
|
|
124
|
-
return;
|
|
125
|
-
this.longpressState = this.state === "opening" ? "pressed" : "null";
|
|
126
|
-
document.removeEventListener("pointerup", this.handlePointerup);
|
|
127
|
-
document.removeEventListener("pointercancel", this.handlePointerup);
|
|
128
|
-
};
|
|
129
|
-
/**
|
|
130
|
-
* @private
|
|
131
|
-
*/
|
|
132
|
-
this.handleKeydown = (event) => {
|
|
133
|
-
const { code, altKey } = event;
|
|
134
|
-
if (code === "Space" || altKey && code === "ArrowDown") {
|
|
135
|
-
if (code === "ArrowDown") {
|
|
136
|
-
event.stopPropagation();
|
|
137
|
-
event.stopImmediatePropagation();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
this.handleKeyup = (event) => {
|
|
142
|
-
const { code, altKey } = event;
|
|
143
|
-
if (code === "Space" || altKey && code === "ArrowDown") {
|
|
144
|
-
if (!this.triggerElement || !this.hasNonVirtualTrigger) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
event.stopPropagation();
|
|
148
|
-
this.triggerElement.dispatchEvent(
|
|
149
|
-
new CustomEvent("longpress", {
|
|
150
|
-
bubbles: true,
|
|
151
|
-
composed: true,
|
|
152
|
-
detail: {
|
|
153
|
-
source: "keyboard"
|
|
154
|
-
}
|
|
155
|
-
})
|
|
156
|
-
);
|
|
157
|
-
setTimeout(() => {
|
|
158
|
-
this.longpressState = "null";
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* An overlay with a `click` interaction should not close on click `triggerElement`.
|
|
164
|
-
* When a click is initiated (`pointerdown`), apply `preventNextToggle` when the
|
|
165
|
-
* overlay is `open` to prevent from toggling the overlay when the click event
|
|
166
|
-
* propagates later in the interaction.
|
|
167
|
-
*/
|
|
168
|
-
this.preventNextToggle = false;
|
|
169
|
-
this.handlePointerdownForClick = () => {
|
|
170
|
-
this.preventNextToggle = this.open;
|
|
171
|
-
};
|
|
172
|
-
this.handleClick = () => {
|
|
173
|
-
if (this.longpressState === "opening" || this.longpressState === "pressed") {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (!this.preventNextToggle) {
|
|
177
|
-
this.open = !this.open;
|
|
178
|
-
}
|
|
179
|
-
this.preventNextToggle = false;
|
|
180
|
-
};
|
|
181
|
-
this.focusedin = false;
|
|
182
|
-
this.handleFocusin = () => {
|
|
183
|
-
this.open = true;
|
|
184
|
-
this.focusedin = true;
|
|
185
|
-
};
|
|
186
|
-
this.handleFocusout = () => {
|
|
187
|
-
this.focusedin = false;
|
|
188
|
-
if (this.pointerentered)
|
|
189
|
-
return;
|
|
190
|
-
this.open = false;
|
|
191
|
-
};
|
|
192
|
-
this.pointerentered = false;
|
|
193
|
-
this.handlePointerenter = () => {
|
|
194
|
-
if (this.hoverTimeout) {
|
|
195
|
-
clearTimeout(this.hoverTimeout);
|
|
196
|
-
delete this.hoverTimeout;
|
|
197
|
-
}
|
|
198
|
-
if (this.disabled)
|
|
199
|
-
return;
|
|
200
|
-
this.open = true;
|
|
201
|
-
this.pointerentered = true;
|
|
202
|
-
};
|
|
203
|
-
// set a timeout once the pointer enters and the overlay is shown
|
|
204
|
-
// give the user time to enter the overlay
|
|
205
|
-
this.handleOverlayPointerenter = () => {
|
|
206
|
-
if (this.hoverTimeout) {
|
|
207
|
-
clearTimeout(this.hoverTimeout);
|
|
208
|
-
delete this.hoverTimeout;
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
this.handlePointerleave = () => {
|
|
212
|
-
this.doPointerleave();
|
|
213
|
-
};
|
|
214
|
-
this.handleOverlayPointerleave = () => {
|
|
215
|
-
this.doPointerleave();
|
|
216
|
-
};
|
|
217
|
-
this.handleLongpress = () => {
|
|
218
|
-
this.open = true;
|
|
219
|
-
this.longpressState = this.longpressState === "potential" ? "opening" : "pressed";
|
|
220
|
-
};
|
|
221
89
|
}
|
|
222
90
|
get delayed() {
|
|
223
91
|
var _a;
|
|
@@ -230,11 +98,10 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
230
98
|
return this._disabled;
|
|
231
99
|
}
|
|
232
100
|
set disabled(disabled) {
|
|
101
|
+
var _a;
|
|
233
102
|
this._disabled = disabled;
|
|
234
103
|
if (disabled) {
|
|
235
|
-
|
|
236
|
-
this.unbindEvents();
|
|
237
|
-
}
|
|
104
|
+
(_a = this.strategy) == null ? void 0 : _a.abort();
|
|
238
105
|
this.wasOpen = this.open;
|
|
239
106
|
this.open = false;
|
|
240
107
|
} else {
|
|
@@ -246,35 +113,52 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
246
113
|
get hasNonVirtualTrigger() {
|
|
247
114
|
return !!this.triggerElement && !(this.triggerElement instanceof VirtualTrigger);
|
|
248
115
|
}
|
|
116
|
+
get placementController() {
|
|
117
|
+
if (!this._placementController) {
|
|
118
|
+
this._placementController = new PlacementController(this);
|
|
119
|
+
}
|
|
120
|
+
return this._placementController;
|
|
121
|
+
}
|
|
249
122
|
get open() {
|
|
250
123
|
return this._open;
|
|
251
124
|
}
|
|
252
125
|
set open(open) {
|
|
126
|
+
var _a;
|
|
253
127
|
if (open && this.disabled)
|
|
254
128
|
return;
|
|
255
129
|
if (open === this.open)
|
|
256
130
|
return;
|
|
257
|
-
if ((this.
|
|
131
|
+
if (((_a = this.strategy) == null ? void 0 : _a.activelyOpening) && !open)
|
|
258
132
|
return;
|
|
259
133
|
this._open = open;
|
|
260
134
|
if (this.open) {
|
|
261
135
|
_Overlay.openCount += 1;
|
|
262
136
|
}
|
|
263
137
|
this.requestUpdate("open", !this.open);
|
|
138
|
+
if (this.open) {
|
|
139
|
+
this.requestSlottable();
|
|
140
|
+
}
|
|
264
141
|
}
|
|
265
142
|
get state() {
|
|
266
143
|
return this._state;
|
|
267
144
|
}
|
|
268
145
|
set state(state2) {
|
|
146
|
+
var _a;
|
|
269
147
|
if (state2 === this.state)
|
|
270
148
|
return;
|
|
271
149
|
const oldState = this.state;
|
|
272
150
|
this._state = state2;
|
|
273
151
|
if (this.state === "opened" || this.state === "closed") {
|
|
274
|
-
|
|
152
|
+
(_a = this.strategy) == null ? void 0 : _a.shouldCompleteOpen();
|
|
275
153
|
}
|
|
276
154
|
this.requestUpdate("state", oldState);
|
|
277
155
|
}
|
|
156
|
+
get elementResolver() {
|
|
157
|
+
if (!this._elementResolver) {
|
|
158
|
+
this._elementResolver = new ElementResolutionController(this);
|
|
159
|
+
}
|
|
160
|
+
return this._elementResolver;
|
|
161
|
+
}
|
|
278
162
|
get usesDialog() {
|
|
279
163
|
return this.type === "modal" || this.type === "page";
|
|
280
164
|
}
|
|
@@ -349,8 +233,32 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
349
233
|
}
|
|
350
234
|
focusEl == null ? void 0 : focusEl.focus();
|
|
351
235
|
}
|
|
352
|
-
|
|
236
|
+
returnFocus() {
|
|
353
237
|
var _a;
|
|
238
|
+
if (this.open || this.type === "hint")
|
|
239
|
+
return;
|
|
240
|
+
const getAncestors = () => {
|
|
241
|
+
var _a2, _b;
|
|
242
|
+
const ancestors = [];
|
|
243
|
+
let currentNode = document.activeElement;
|
|
244
|
+
while ((_a2 = currentNode == null ? void 0 : currentNode.shadowRoot) == null ? void 0 : _a2.activeElement) {
|
|
245
|
+
currentNode = currentNode.shadowRoot.activeElement;
|
|
246
|
+
}
|
|
247
|
+
while (currentNode) {
|
|
248
|
+
const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_b = currentNode.getRootNode()) == null ? void 0 : _b.host);
|
|
249
|
+
if (ancestor) {
|
|
250
|
+
ancestors.push(ancestor);
|
|
251
|
+
}
|
|
252
|
+
currentNode = ancestor;
|
|
253
|
+
}
|
|
254
|
+
return ancestors;
|
|
255
|
+
};
|
|
256
|
+
if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(this.getRootNode().activeElement) || getAncestors().includes(this) || // eslint-disable-next-line @spectrum-web-components/document-active-element
|
|
257
|
+
document.activeElement === document.body)) {
|
|
258
|
+
this.triggerElement.focus();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async manageOpen(oldOpen) {
|
|
354
262
|
if (!this.isConnected && this.open)
|
|
355
263
|
return;
|
|
356
264
|
if (!this.hasUpdated) {
|
|
@@ -407,211 +315,19 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
407
315
|
);
|
|
408
316
|
}
|
|
409
317
|
}
|
|
410
|
-
if (!this.open && this.type !== "hint") {
|
|
411
|
-
const getAncestors = () => {
|
|
412
|
-
var _a2;
|
|
413
|
-
const ancestors = [];
|
|
414
|
-
let currentNode = document.activeElement;
|
|
415
|
-
while ((currentNode == null ? void 0 : currentNode.shadowRoot) && currentNode.shadowRoot.activeElement) {
|
|
416
|
-
currentNode = currentNode.shadowRoot.activeElement;
|
|
417
|
-
}
|
|
418
|
-
while (currentNode) {
|
|
419
|
-
const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_a2 = currentNode.getRootNode()) == null ? void 0 : _a2.host);
|
|
420
|
-
if (ancestor) {
|
|
421
|
-
ancestors.push(ancestor);
|
|
422
|
-
}
|
|
423
|
-
currentNode = ancestor;
|
|
424
|
-
}
|
|
425
|
-
return ancestors;
|
|
426
|
-
};
|
|
427
|
-
if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(
|
|
428
|
-
this.getRootNode().activeElement
|
|
429
|
-
) || getAncestors().includes(this))) {
|
|
430
|
-
this.triggerElement.focus();
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
unbindEvents() {
|
|
435
|
-
var _a;
|
|
436
|
-
(_a = this.abortController) == null ? void 0 : _a.abort();
|
|
437
318
|
}
|
|
438
319
|
bindEvents() {
|
|
439
320
|
var _a;
|
|
321
|
+
(_a = this.strategy) == null ? void 0 : _a.abort();
|
|
322
|
+
this.strategy = void 0;
|
|
440
323
|
if (!this.hasNonVirtualTrigger)
|
|
441
324
|
return;
|
|
442
|
-
(
|
|
443
|
-
this.abortController = new AbortController();
|
|
444
|
-
const nextTriggerElement = this.triggerElement;
|
|
445
|
-
switch (this.triggerInteraction) {
|
|
446
|
-
case "click":
|
|
447
|
-
this.bindClickEvents(nextTriggerElement);
|
|
448
|
-
return;
|
|
449
|
-
case "longpress":
|
|
450
|
-
this.bindLongpressEvents(nextTriggerElement);
|
|
451
|
-
return;
|
|
452
|
-
case "hover":
|
|
453
|
-
this.bindHoverEvents(nextTriggerElement);
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
bindClickEvents(triggerElement) {
|
|
458
|
-
const options = { signal: this.abortController.signal };
|
|
459
|
-
triggerElement.addEventListener("click", this.handleClick, options);
|
|
460
|
-
triggerElement.addEventListener(
|
|
461
|
-
"pointerdown",
|
|
462
|
-
this.handlePointerdownForClick,
|
|
463
|
-
options
|
|
464
|
-
);
|
|
465
|
-
}
|
|
466
|
-
bindLongpressEvents(triggerElement) {
|
|
467
|
-
const options = { signal: this.abortController.signal };
|
|
468
|
-
triggerElement.addEventListener(
|
|
469
|
-
"longpress",
|
|
470
|
-
this.handleLongpress,
|
|
471
|
-
options
|
|
472
|
-
);
|
|
473
|
-
triggerElement.addEventListener(
|
|
474
|
-
"pointerdown",
|
|
475
|
-
this.handlePointerdown,
|
|
476
|
-
options
|
|
477
|
-
);
|
|
478
|
-
this.prepareLongpressDescription(triggerElement);
|
|
479
|
-
if (triggerElement.holdAffordance) {
|
|
480
|
-
return;
|
|
481
|
-
}
|
|
482
|
-
triggerElement.addEventListener("keydown", this.handleKeydown, options);
|
|
483
|
-
triggerElement.addEventListener("keyup", this.handleKeyup, options);
|
|
484
|
-
}
|
|
485
|
-
bindHoverEvents(triggerElement) {
|
|
486
|
-
const options = { signal: this.abortController.signal };
|
|
487
|
-
triggerElement.addEventListener("focusin", this.handleFocusin, options);
|
|
488
|
-
triggerElement.addEventListener(
|
|
489
|
-
"focusout",
|
|
490
|
-
this.handleFocusout,
|
|
491
|
-
options
|
|
492
|
-
);
|
|
493
|
-
triggerElement.addEventListener(
|
|
494
|
-
"pointerenter",
|
|
495
|
-
this.handlePointerenter,
|
|
496
|
-
options
|
|
497
|
-
);
|
|
498
|
-
triggerElement.addEventListener(
|
|
499
|
-
"pointerleave",
|
|
500
|
-
this.handlePointerleave,
|
|
501
|
-
options
|
|
502
|
-
);
|
|
503
|
-
this.addEventListener(
|
|
504
|
-
"pointerenter",
|
|
505
|
-
this.handleOverlayPointerenter,
|
|
506
|
-
options
|
|
507
|
-
);
|
|
508
|
-
this.addEventListener(
|
|
509
|
-
"pointerleave",
|
|
510
|
-
this.handleOverlayPointerleave,
|
|
511
|
-
options
|
|
512
|
-
);
|
|
513
|
-
}
|
|
514
|
-
manageTriggerElement(triggerElement) {
|
|
515
|
-
if (triggerElement) {
|
|
516
|
-
this.unbindEvents();
|
|
517
|
-
this.releaseAriaDescribedby();
|
|
518
|
-
}
|
|
519
|
-
const missingOrVirtual = !this.triggerElement || this.triggerElement instanceof VirtualTrigger;
|
|
520
|
-
if (missingOrVirtual) {
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
this.bindEvents();
|
|
524
|
-
if (this.receivesFocus === "true")
|
|
525
|
-
return;
|
|
526
|
-
this.prepareAriaDescribedby();
|
|
527
|
-
}
|
|
528
|
-
prepareLongpressDescription(trigger) {
|
|
529
|
-
if (
|
|
530
|
-
// only "longpress" relationships are described this way
|
|
531
|
-
this.triggerInteraction !== "longpress" || // do not reapply until target it recycled
|
|
532
|
-
this.releaseLongpressDescribedby !== noop || // require "longpress content" to apply relationship
|
|
533
|
-
!this.elements.length
|
|
534
|
-
) {
|
|
325
|
+
if (!this.triggerInteraction)
|
|
535
326
|
return;
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
const messageType = isIOS() || isAndroid() ? "touch" : "keyboard";
|
|
540
|
-
longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];
|
|
541
|
-
longpressDescription.slot = "longpress-describedby-descriptor";
|
|
542
|
-
const triggerParent = trigger.getRootNode();
|
|
543
|
-
const overlayParent = this.getRootNode();
|
|
544
|
-
if (triggerParent === overlayParent) {
|
|
545
|
-
this.append(longpressDescription);
|
|
546
|
-
} else {
|
|
547
|
-
longpressDescription.hidden = !("host" in triggerParent);
|
|
548
|
-
trigger.insertAdjacentElement("afterend", longpressDescription);
|
|
549
|
-
}
|
|
550
|
-
const releaseLongpressDescribedby = conditionAttributeWithId(
|
|
551
|
-
trigger,
|
|
552
|
-
"aria-describedby",
|
|
553
|
-
[longpressDescription.id]
|
|
327
|
+
this.strategy = new strategies[this.triggerInteraction](
|
|
328
|
+
this,
|
|
329
|
+
this.triggerElement
|
|
554
330
|
);
|
|
555
|
-
this.releaseLongpressDescribedby = () => {
|
|
556
|
-
releaseLongpressDescribedby();
|
|
557
|
-
longpressDescription.remove();
|
|
558
|
-
this.releaseLongpressDescribedby = noop;
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
prepareAriaDescribedby() {
|
|
562
|
-
if (
|
|
563
|
-
// only "hover" relationships establed described by content
|
|
564
|
-
this.triggerInteraction !== "hover" || // do not reapply until target is recycled
|
|
565
|
-
this.releaseAriaDescribedby !== noop || // require "hover content" to apply relationship
|
|
566
|
-
!this.elements.length || // Virtual triggers can have no aria content
|
|
567
|
-
!this.hasNonVirtualTrigger
|
|
568
|
-
) {
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
const trigger = this.triggerElement;
|
|
572
|
-
const triggerRoot = trigger.getRootNode();
|
|
573
|
-
const contentRoot = this.elements[0].getRootNode();
|
|
574
|
-
const overlayRoot = this.getRootNode();
|
|
575
|
-
if (triggerRoot == overlayRoot) {
|
|
576
|
-
const releaseAriaDescribedby = conditionAttributeWithId(
|
|
577
|
-
trigger,
|
|
578
|
-
"aria-describedby",
|
|
579
|
-
[this.id]
|
|
580
|
-
);
|
|
581
|
-
this.releaseAriaDescribedby = () => {
|
|
582
|
-
releaseAriaDescribedby();
|
|
583
|
-
this.releaseAriaDescribedby = noop;
|
|
584
|
-
};
|
|
585
|
-
} else if (triggerRoot === contentRoot) {
|
|
586
|
-
this.elementIds = this.elements.map((el) => el.id);
|
|
587
|
-
const appliedIds = this.elements.map((el) => {
|
|
588
|
-
if (!el.id) {
|
|
589
|
-
el.id = `${this.tagName.toLowerCase()}-helper-${randomID()}`;
|
|
590
|
-
}
|
|
591
|
-
return el.id;
|
|
592
|
-
});
|
|
593
|
-
const releaseAriaDescribedby = conditionAttributeWithId(
|
|
594
|
-
trigger,
|
|
595
|
-
"aria-describedby",
|
|
596
|
-
appliedIds
|
|
597
|
-
);
|
|
598
|
-
this.releaseAriaDescribedby = () => {
|
|
599
|
-
releaseAriaDescribedby();
|
|
600
|
-
this.elements.map((el, index) => {
|
|
601
|
-
el.id = this.elementIds[index];
|
|
602
|
-
});
|
|
603
|
-
this.releaseAriaDescribedby = noop;
|
|
604
|
-
};
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
doPointerleave() {
|
|
608
|
-
this.pointerentered = false;
|
|
609
|
-
const triggerElement = this.triggerElement;
|
|
610
|
-
if (this.focusedin && triggerElement.matches(":focus-visible"))
|
|
611
|
-
return;
|
|
612
|
-
this.hoverTimeout = setTimeout(() => {
|
|
613
|
-
this.open = false;
|
|
614
|
-
}, HOVER_DELAY);
|
|
615
331
|
}
|
|
616
332
|
handleBeforetoggle(event) {
|
|
617
333
|
if (event.newState !== "open") {
|
|
@@ -619,7 +335,8 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
619
335
|
}
|
|
620
336
|
}
|
|
621
337
|
handleBrowserClose() {
|
|
622
|
-
|
|
338
|
+
var _a;
|
|
339
|
+
if (!((_a = this.strategy) == null ? void 0 : _a.activelyOpening)) {
|
|
623
340
|
this.open = false;
|
|
624
341
|
return;
|
|
625
342
|
}
|
|
@@ -631,13 +348,11 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
631
348
|
this.manageOpen(false);
|
|
632
349
|
}
|
|
633
350
|
handleSlotchange() {
|
|
634
|
-
|
|
635
|
-
this.prepareAriaDescribedby();
|
|
636
|
-
}
|
|
351
|
+
var _a, _b;
|
|
637
352
|
if (!this.elements.length) {
|
|
638
|
-
this.
|
|
353
|
+
(_a = this.strategy) == null ? void 0 : _a.releaseDescription();
|
|
639
354
|
} else if (this.hasNonVirtualTrigger) {
|
|
640
|
-
this.
|
|
355
|
+
(_b = this.strategy) == null ? void 0 : _b.prepareDescription(
|
|
641
356
|
this.triggerElement
|
|
642
357
|
);
|
|
643
358
|
}
|
|
@@ -647,6 +362,17 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
647
362
|
this.willPreventClose = false;
|
|
648
363
|
return shouldPreventClose;
|
|
649
364
|
}
|
|
365
|
+
requestSlottable() {
|
|
366
|
+
if (!this.open) {
|
|
367
|
+
document.body.offsetHeight;
|
|
368
|
+
}
|
|
369
|
+
this.dispatchEvent(
|
|
370
|
+
new SlottableRequestEvent(
|
|
371
|
+
"overlay-content",
|
|
372
|
+
this.open ? {} : removeSlottableRequest
|
|
373
|
+
)
|
|
374
|
+
);
|
|
375
|
+
}
|
|
650
376
|
willUpdate(changes) {
|
|
651
377
|
var _a;
|
|
652
378
|
if (!this.hasAttribute("id")) {
|
|
@@ -672,7 +398,7 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
672
398
|
oldTrigger = changes.get("triggerElement");
|
|
673
399
|
}
|
|
674
400
|
if (oldTrigger !== false) {
|
|
675
|
-
this.
|
|
401
|
+
this.bindEvents();
|
|
676
402
|
}
|
|
677
403
|
}
|
|
678
404
|
updated(changes) {
|
|
@@ -687,7 +413,7 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
687
413
|
this.placementController.resetOverlayPosition();
|
|
688
414
|
}
|
|
689
415
|
}
|
|
690
|
-
if (changes.has("state") && this.state === "closed") {
|
|
416
|
+
if (changes.has("state") && this.state === "closed" && typeof changes.get("state") !== "undefined") {
|
|
691
417
|
this.placementController.clearOverlayPosition();
|
|
692
418
|
}
|
|
693
419
|
}
|
|
@@ -749,16 +475,13 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
749
475
|
this.addEventListener("close", () => {
|
|
750
476
|
this.open = false;
|
|
751
477
|
});
|
|
752
|
-
if (this.
|
|
478
|
+
if (this.hasUpdated) {
|
|
753
479
|
this.bindEvents();
|
|
754
480
|
}
|
|
755
481
|
}
|
|
756
482
|
disconnectedCallback() {
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
}
|
|
760
|
-
this.releaseAriaDescribedby();
|
|
761
|
-
this.releaseLongpressDescribedby();
|
|
483
|
+
var _a;
|
|
484
|
+
(_a = this.strategy) == null ? void 0 : _a.releaseDescription();
|
|
762
485
|
this.open = false;
|
|
763
486
|
super.disconnectedCallback();
|
|
764
487
|
}
|