@spectrum-web-components/overlay 0.16.3 → 0.16.6-devmode.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 (96) hide show
  1. package/active-overlay.dev.js +3 -0
  2. package/active-overlay.dev.js.map +7 -0
  3. package/active-overlay.js +3 -14
  4. package/active-overlay.js.map +7 -1
  5. package/overlay-trigger.dev.js +3 -0
  6. package/overlay-trigger.dev.js.map +7 -0
  7. package/overlay-trigger.js +3 -14
  8. package/overlay-trigger.js.map +7 -1
  9. package/package.json +69 -15
  10. package/src/ActiveOverlay.d.ts +2 -2
  11. package/src/ActiveOverlay.dev.js +445 -0
  12. package/src/ActiveOverlay.dev.js.map +7 -0
  13. package/src/ActiveOverlay.js +404 -423
  14. package/src/ActiveOverlay.js.map +7 -1
  15. package/src/OverlayTrigger.dev.js +293 -0
  16. package/src/OverlayTrigger.dev.js.map +7 -0
  17. package/src/OverlayTrigger.js +245 -264
  18. package/src/OverlayTrigger.js.map +7 -1
  19. package/src/VirtualTrigger.dev.js +30 -0
  20. package/src/VirtualTrigger.dev.js.map +7 -0
  21. package/src/VirtualTrigger.js +28 -38
  22. package/src/VirtualTrigger.js.map +7 -1
  23. package/src/active-overlay.css.dev.js +12 -0
  24. package/src/active-overlay.css.dev.js.map +7 -0
  25. package/src/active-overlay.css.js +3 -14
  26. package/src/active-overlay.css.js.map +7 -1
  27. package/src/index.dev.js +7 -0
  28. package/src/index.dev.js.map +7 -0
  29. package/src/index.js +7 -18
  30. package/src/index.js.map +7 -1
  31. package/src/loader.dev.js +5 -0
  32. package/src/loader.dev.js.map +7 -0
  33. package/src/loader.js +3 -14
  34. package/src/loader.js.map +7 -1
  35. package/src/overlay-events.d.ts +11 -0
  36. package/src/overlay-events.dev.js +7 -0
  37. package/src/overlay-events.dev.js.map +7 -0
  38. package/src/overlay-events.js +7 -0
  39. package/src/overlay-events.js.map +7 -0
  40. package/src/overlay-stack.d.ts +2 -0
  41. package/src/overlay-stack.dev.js +436 -0
  42. package/src/overlay-stack.dev.js.map +7 -0
  43. package/src/overlay-stack.js +374 -419
  44. package/src/overlay-stack.js.map +7 -1
  45. package/src/overlay-timer.dev.js +71 -0
  46. package/src/overlay-timer.dev.js.map +7 -0
  47. package/src/overlay-timer.js +64 -82
  48. package/src/overlay-timer.js.map +7 -1
  49. package/src/overlay-trigger.css.dev.js +6 -0
  50. package/src/overlay-trigger.css.dev.js.map +7 -0
  51. package/src/overlay-trigger.css.js +3 -14
  52. package/src/overlay-trigger.css.js.map +7 -1
  53. package/src/overlay-types.dev.js +1 -0
  54. package/src/overlay-types.dev.js.map +7 -0
  55. package/src/overlay-types.js +1 -13
  56. package/src/overlay-types.js.map +7 -1
  57. package/src/overlay-utils.dev.js +28 -0
  58. package/src/overlay-utils.dev.js.map +7 -0
  59. package/src/overlay-utils.js +22 -33
  60. package/src/overlay-utils.js.map +7 -1
  61. package/src/overlay.dev.js +85 -0
  62. package/src/overlay.dev.js.map +7 -0
  63. package/src/overlay.js +83 -119
  64. package/src/overlay.js.map +7 -1
  65. package/stories/overlay-story-components.js +188 -184
  66. package/stories/overlay-story-components.js.map +7 -1
  67. package/stories/overlay.stories.js +238 -228
  68. package/stories/overlay.stories.js.map +7 -1
  69. package/sync/overlay-trigger.dev.js +7 -0
  70. package/sync/overlay-trigger.dev.js.map +7 -0
  71. package/sync/overlay-trigger.js +5 -16
  72. package/sync/overlay-trigger.js.map +7 -1
  73. package/test/benchmark/basic-test.js +7 -18
  74. package/test/benchmark/basic-test.js.map +7 -1
  75. package/test/overlay-lifecycle.test.js +107 -115
  76. package/test/overlay-lifecycle.test.js.map +7 -1
  77. package/test/overlay-timer.test.js +110 -122
  78. package/test/overlay-timer.test.js.map +7 -1
  79. package/test/overlay-trigger-click.test.js +43 -48
  80. package/test/overlay-trigger-click.test.js.map +7 -1
  81. package/test/overlay-trigger-extended.test.js +167 -182
  82. package/test/overlay-trigger-extended.test.js.map +7 -1
  83. package/test/overlay-trigger-hover-click.test.js +59 -73
  84. package/test/overlay-trigger-hover-click.test.js.map +7 -1
  85. package/test/overlay-trigger-hover.test.js +74 -77
  86. package/test/overlay-trigger-hover.test.js.map +7 -1
  87. package/test/overlay-trigger-longpress.test.js +166 -178
  88. package/test/overlay-trigger-longpress.test.js.map +7 -1
  89. package/test/overlay-trigger-sync.test.js +400 -422
  90. package/test/overlay-trigger-sync.test.js.map +7 -1
  91. package/test/overlay-trigger.test.js +400 -422
  92. package/test/overlay-trigger.test.js.map +7 -1
  93. package/test/overlay.test-vrt.js +4 -15
  94. package/test/overlay.test-vrt.js.map +7 -1
  95. package/test/overlay.test.js +458 -479
  96. package/test/overlay.test.js.map +7 -1
@@ -1,70 +1,58 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- var _a;
13
- import { __decorate } from "tslib";
14
- import { html, SpectrumElement, } from '@spectrum-web-components/base';
15
- import { property, state, } from '@spectrum-web-components/base/src/decorators.js';
16
- import { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';
17
- import { isAndroid, isIOS, } from '@spectrum-web-components/shared/src/platform.js';
18
- import { openOverlay } from './loader.js';
19
- import overlayTriggerStyles from './overlay-trigger.css.js';
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result)
9
+ __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import {
13
+ html,
14
+ SpectrumElement
15
+ } from "@spectrum-web-components/base";
16
+ import {
17
+ property,
18
+ state
19
+ } from "@spectrum-web-components/base/src/decorators.js";
20
+ import { firstFocusableIn } from "@spectrum-web-components/shared/src/first-focusable-in.js";
21
+ import {
22
+ isAndroid,
23
+ isIOS
24
+ } from "@spectrum-web-components/shared/src/platform.js";
25
+ import { openOverlay } from "./loader.js";
26
+ import overlayTriggerStyles from "./overlay-trigger.css.js";
20
27
  export const LONGPRESS_INSTRUCTIONS = {
21
- touch: 'Double tap and long press for additional options',
22
- keyboard: 'Press Space or Alt+Down Arrow for additional options',
23
- mouse: 'Click and hold for additional options',
28
+ touch: "Double tap and long press for additional options",
29
+ keyboard: "Press Space or Alt+Down Arrow for additional options",
30
+ mouse: "Click and hold for additional options"
24
31
  };
25
- /**
26
- * @element overlay-trigger
27
- *
28
- * @slot trigger - The content that will trigger the various overlays
29
- * @slot hover-content - The content that will be displayed on hover
30
- * @slot click-content - The content that will be displayed on click
31
- * @slot longpress-content - The content that will be displayed on click
32
- *
33
- * @fires sp-opened - Announces that the overlay has been opened
34
- * @fires sp-closed - Announces that the overlay has been closed
35
- */
36
- export class OverlayTrigger extends SpectrumElement {
37
- constructor() {
38
- super(...arguments);
39
- /**
40
- * @type {"auto" | "auto-start" | "auto-end" | "top" | "bottom" | "right" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | "none"}
41
- * @attr
42
- */
43
- this.placement = 'bottom';
44
- this.offset = 6;
45
- this.disabled = false;
46
- this.hasLongpressContent = false;
47
- this._longpressId = `longpress-describedby-descriptor`;
48
- this.abortOverlay = () => {
49
- return;
50
- };
51
- this.openStatePromise = Promise.resolve();
52
- }
53
- static get styles() {
54
- return [overlayTriggerStyles];
55
- }
56
- handleClose(event) {
57
- if (event &&
58
- event.detail.interaction !== this.open &&
59
- event.detail.interaction !== this.type) {
60
- return;
61
- }
62
- this.removeAttribute('open');
32
+ const _OverlayTrigger = class extends SpectrumElement {
33
+ constructor() {
34
+ super(...arguments);
35
+ this.placement = "bottom";
36
+ this.offset = 6;
37
+ this.disabled = false;
38
+ this.hasLongpressContent = false;
39
+ this._longpressId = `longpress-describedby-descriptor`;
40
+ this.abortOverlay = () => {
41
+ return;
42
+ };
43
+ this.openStatePromise = Promise.resolve();
44
+ }
45
+ static get styles() {
46
+ return [overlayTriggerStyles];
47
+ }
48
+ handleClose(event) {
49
+ if (event && event.detail.interaction !== this.open && event.detail.interaction !== this.type) {
50
+ return;
63
51
  }
64
- render() {
65
- // Keyboard event availability documented in README.md
66
- /* eslint-disable lit-a11y/click-events-have-key-events */
67
- return html `
52
+ this.removeAttribute("open");
53
+ }
54
+ render() {
55
+ return html`
68
56
  <slot
69
57
  id="trigger"
70
58
  @click=${this.onTrigger}
@@ -93,220 +81,213 @@ export class OverlayTrigger extends SpectrumElement {
93
81
  <slot name=${this._longpressId}></slot>
94
82
  </div>
95
83
  `;
96
- /* eslint-enable lit-a11y/click-events-have-key-events */
97
- }
98
- updated(changes) {
99
- super.updated(changes);
100
- if (this.disabled && changes.has('disabled')) {
101
- this.closeAllOverlays();
102
- return;
103
- }
104
- if (changes.has('open')) {
105
- this.manageOpen();
106
- }
107
- if (changes.has('hasLongpressContent')) {
108
- this.manageLongpressDescriptor();
109
- }
110
- }
111
- manageLongpressDescriptor() {
112
- const trigger = this.querySelector('[slot="trigger"]');
113
- const ariaDescribedby = trigger.getAttribute('aria-describedby');
114
- let descriptors = ariaDescribedby ? ariaDescribedby.split(/\s+/) : [];
115
- if (this.hasLongpressContent) {
116
- if (!this.longpressDescriptor) {
117
- this.longpressDescriptor = document.createElement('div');
118
- this.longpressDescriptor.id = this._longpressId;
119
- this.longpressDescriptor.slot = this._longpressId;
120
- }
121
- const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';
122
- this.longpressDescriptor.textContent =
123
- LONGPRESS_INSTRUCTIONS[messageType];
124
- this.appendChild(this.longpressDescriptor);
125
- descriptors.push(this._longpressId);
126
- }
127
- else {
128
- if (this.longpressDescriptor)
129
- this.longpressDescriptor.remove();
130
- descriptors = descriptors.filter((descriptor) => descriptor !== this._longpressId);
131
- }
132
- if (descriptors.length) {
133
- trigger.setAttribute('aria-describedby', descriptors.join(' '));
134
- }
135
- else {
136
- trigger.removeAttribute('aria-describedby');
137
- }
84
+ }
85
+ updated(changes) {
86
+ super.updated(changes);
87
+ if (this.disabled && changes.has("disabled")) {
88
+ this.closeAllOverlays();
89
+ return;
138
90
  }
139
- closeAllOverlays() {
140
- if (this.abortOverlay)
141
- this.abortOverlay(true);
142
- [
143
- 'closeClickOverlay',
144
- 'closeHoverOverlay',
145
- 'closeLongpressOverlay',
146
- ].forEach(async (name) => {
147
- const canClose = this[name];
148
- if (canClose == null)
149
- return;
150
- delete this[name];
151
- (await canClose)();
152
- });
91
+ if (changes.has("open")) {
92
+ this.manageOpen();
153
93
  }
154
- manageOpen() {
155
- var _b;
156
- const openHandlers = {
157
- click: () => this.onTriggerClick(),
158
- hover: () => this.onTriggerMouseEnter(),
159
- longpress: () => this.onTriggerLongpress(),
160
- none: () => this.closeAllOverlays(),
161
- };
162
- openHandlers[(_b = this.open) !== null && _b !== void 0 ? _b : 'none']();
94
+ if (changes.has("hasLongpressContent")) {
95
+ this.manageLongpressDescriptor();
163
96
  }
164
- async openOverlay(target, interaction, content, options) {
165
- this.openStatePromise = new Promise((res) => (this.openStateResolver = res));
166
- this.addEventListener('sp-opened', () => {
167
- this.openStateResolver();
168
- }, { once: true });
169
- return OverlayTrigger.openOverlay(target, interaction, content, options);
97
+ }
98
+ manageLongpressDescriptor() {
99
+ const trigger = this.querySelector('[slot="trigger"]');
100
+ const ariaDescribedby = trigger.getAttribute("aria-describedby");
101
+ let descriptors = ariaDescribedby ? ariaDescribedby.split(/\s+/) : [];
102
+ if (this.hasLongpressContent) {
103
+ if (!this.longpressDescriptor) {
104
+ this.longpressDescriptor = document.createElement("div");
105
+ this.longpressDescriptor.id = this._longpressId;
106
+ this.longpressDescriptor.slot = this._longpressId;
107
+ }
108
+ const messageType = isIOS() || isAndroid() ? "touch" : "keyboard";
109
+ this.longpressDescriptor.textContent = LONGPRESS_INSTRUCTIONS[messageType];
110
+ this.appendChild(this.longpressDescriptor);
111
+ descriptors.push(this._longpressId);
112
+ } else {
113
+ if (this.longpressDescriptor)
114
+ this.longpressDescriptor.remove();
115
+ descriptors = descriptors.filter((descriptor) => descriptor !== this._longpressId);
170
116
  }
171
- get overlayOptions() {
172
- return {
173
- offset: this.offset,
174
- placement: this.placement,
175
- receivesFocus: !this.type || this.type === 'inline' || this.open === 'hover'
176
- ? undefined
177
- : 'auto',
178
- };
117
+ if (descriptors.length) {
118
+ trigger.setAttribute("aria-describedby", descriptors.join(" "));
119
+ } else {
120
+ trigger.removeAttribute("aria-describedby");
179
121
  }
180
- onTrigger(event) {
181
- if (this.disabled)
182
- return;
183
- switch (event.type) {
184
- case 'mouseenter':
185
- case 'focusin':
186
- if (!this.open && this.hoverContent) {
187
- this.open = 'hover';
188
- }
189
- return;
190
- case 'mouseleave':
191
- case 'focusout':
192
- if (this.open === 'hover') {
193
- this.handleClose();
194
- }
195
- return;
196
- case 'click':
197
- if (this.clickContent) {
198
- this.open = event.type;
199
- }
200
- else if (this.closeHoverOverlay) {
201
- event.preventDefault();
202
- }
203
- return;
204
- case 'longpress':
205
- if (this.longpressContent) {
206
- this._longpressEvent = event;
207
- this.open = event.type;
208
- }
209
- return;
122
+ }
123
+ closeAllOverlays() {
124
+ if (this.abortOverlay)
125
+ this.abortOverlay(true);
126
+ [
127
+ "closeClickOverlay",
128
+ "closeHoverOverlay",
129
+ "closeLongpressOverlay"
130
+ ].forEach(async (name) => {
131
+ const canClose = this[name];
132
+ if (canClose == null)
133
+ return;
134
+ delete this[name];
135
+ (await canClose)();
136
+ });
137
+ }
138
+ manageOpen() {
139
+ var _a;
140
+ const openHandlers = {
141
+ click: () => this.onTriggerClick(),
142
+ hover: () => this.onTriggerMouseEnter(),
143
+ longpress: () => this.onTriggerLongpress(),
144
+ none: () => this.closeAllOverlays()
145
+ };
146
+ openHandlers[(_a = this.open) != null ? _a : "none"]();
147
+ }
148
+ async openOverlay(target, interaction, content, options) {
149
+ this.openStatePromise = new Promise((res) => this.openStateResolver = res);
150
+ this.addEventListener("sp-opened", () => {
151
+ this.openStateResolver();
152
+ }, { once: true });
153
+ return _OverlayTrigger.openOverlay(target, interaction, content, options);
154
+ }
155
+ get overlayOptions() {
156
+ return {
157
+ offset: this.offset,
158
+ placement: this.placement,
159
+ receivesFocus: !this.type || this.type === "inline" || this.open === "hover" ? void 0 : "auto"
160
+ };
161
+ }
162
+ onTrigger(event) {
163
+ if (this.disabled)
164
+ return;
165
+ switch (event.type) {
166
+ case "mouseenter":
167
+ case "focusin":
168
+ if (!this.open && this.hoverContent) {
169
+ this.open = "hover";
210
170
  }
211
- }
212
- prepareToFocusOverlayContent(overlayContent) {
213
- if (this.type !== 'modal') {
214
- return;
171
+ return;
172
+ case "mouseleave":
173
+ case "focusout":
174
+ if (this.open === "hover") {
175
+ this.handleClose();
215
176
  }
216
- const firstFocusable = firstFocusableIn(overlayContent);
217
- if (!firstFocusable) {
218
- overlayContent.tabIndex = 0;
177
+ return;
178
+ case "click":
179
+ if (this.clickContent) {
180
+ this.open = event.type;
181
+ } else if (this.closeHoverOverlay) {
182
+ event.preventDefault();
219
183
  }
220
- }
221
- async onTriggerClick() {
222
- if (!this.targetContent ||
223
- !this.clickContent ||
224
- this.closeClickOverlay) {
225
- return;
184
+ return;
185
+ case "longpress":
186
+ if (this.longpressContent) {
187
+ this._longpressEvent = event;
188
+ this.open = event.type;
226
189
  }
227
- const { targetContent, clickContent } = this;
228
- this.closeAllOverlays();
229
- this.prepareToFocusOverlayContent(clickContent);
230
- this.closeClickOverlay = this.openOverlay(targetContent, this.type ? this.type : 'click', clickContent, this.overlayOptions);
190
+ return;
231
191
  }
232
- async onTriggerLongpress() {
233
- var _b, _c;
234
- if (!this.targetContent ||
235
- !this.longpressContent ||
236
- this.closeLongpressOverlay) {
237
- return;
238
- }
239
- const { targetContent, longpressContent } = this;
240
- this.closeAllOverlays();
241
- this.prepareToFocusOverlayContent(longpressContent);
242
- const notImmediatelyClosable = ((_c = (_b = this._longpressEvent) === null || _b === void 0 ? void 0 : _b.detail) === null || _c === void 0 ? void 0 : _c.source) !== 'keyboard';
243
- this.closeLongpressOverlay = this.openOverlay(targetContent, this.type ? this.type : 'longpress', longpressContent, Object.assign(Object.assign({}, this.overlayOptions), { receivesFocus: 'auto', notImmediatelyClosable }));
244
- this._longpressEvent = undefined;
192
+ }
193
+ prepareToFocusOverlayContent(overlayContent) {
194
+ if (this.type !== "modal") {
195
+ return;
245
196
  }
246
- async onTriggerMouseEnter() {
247
- if (!this.targetContent ||
248
- !this.hoverContent ||
249
- this.closeHoverOverlay) {
250
- return;
251
- }
252
- const abortPromise = new Promise((res) => {
253
- this.abortOverlay = res;
254
- });
255
- const { targetContent, hoverContent } = this;
256
- this.closeHoverOverlay = this.openOverlay(targetContent, 'hover', hoverContent, Object.assign({ abortPromise }, this.overlayOptions));
197
+ const firstFocusable = firstFocusableIn(overlayContent);
198
+ if (!firstFocusable) {
199
+ overlayContent.tabIndex = 0;
257
200
  }
258
- onClickSlotChange(event) {
259
- this.clickContent = this.extractSlotContentFromEvent(event);
260
- this.manageOpen();
201
+ }
202
+ async onTriggerClick() {
203
+ if (!this.targetContent || !this.clickContent || this.closeClickOverlay) {
204
+ return;
261
205
  }
262
- onLongpressSlotChange(event) {
263
- this.longpressContent = this.extractSlotContentFromEvent(event);
264
- this.hasLongpressContent =
265
- !!this.longpressContent || !!this.closeLongpressOverlay;
266
- this.manageOpen();
206
+ const { targetContent, clickContent } = this;
207
+ this.closeAllOverlays();
208
+ this.prepareToFocusOverlayContent(clickContent);
209
+ this.closeClickOverlay = this.openOverlay(targetContent, this.type ? this.type : "click", clickContent, this.overlayOptions);
210
+ }
211
+ async onTriggerLongpress() {
212
+ var _a, _b;
213
+ if (!this.targetContent || !this.longpressContent || this.closeLongpressOverlay) {
214
+ return;
267
215
  }
268
- onHoverSlotChange(event) {
269
- this.hoverContent = this.extractSlotContentFromEvent(event);
270
- this.manageOpen();
216
+ const { targetContent, longpressContent } = this;
217
+ this.closeAllOverlays();
218
+ this.prepareToFocusOverlayContent(longpressContent);
219
+ const notImmediatelyClosable = ((_b = (_a = this._longpressEvent) == null ? void 0 : _a.detail) == null ? void 0 : _b.source) !== "keyboard";
220
+ this.closeLongpressOverlay = this.openOverlay(targetContent, this.type ? this.type : "longpress", longpressContent, {
221
+ ...this.overlayOptions,
222
+ receivesFocus: "auto",
223
+ notImmediatelyClosable
224
+ });
225
+ this._longpressEvent = void 0;
226
+ }
227
+ async onTriggerMouseEnter() {
228
+ if (!this.targetContent || !this.hoverContent || this.closeHoverOverlay) {
229
+ return;
271
230
  }
272
- onTargetSlotChange(event) {
273
- this.targetContent = this.extractSlotContentFromEvent(event);
274
- }
275
- extractSlotContentFromEvent(event) {
276
- const slot = event.target;
277
- const nodes = slot.assignedNodes({ flatten: true });
278
- return nodes.find((node) => node instanceof HTMLElement);
279
- }
280
- async getUpdateComplete() {
281
- const complete = (await super.getUpdateComplete());
282
- await this.openStatePromise;
283
- return complete;
284
- }
285
- disconnectedCallback() {
286
- this.closeAllOverlays();
287
- super.disconnectedCallback();
288
- }
289
- }
290
- _a = OverlayTrigger;
231
+ const abortPromise = new Promise((res) => {
232
+ this.abortOverlay = res;
233
+ });
234
+ const { targetContent, hoverContent } = this;
235
+ this.closeHoverOverlay = this.openOverlay(targetContent, "hover", hoverContent, {
236
+ abortPromise,
237
+ ...this.overlayOptions
238
+ });
239
+ }
240
+ onClickSlotChange(event) {
241
+ this.clickContent = this.extractSlotContentFromEvent(event);
242
+ this.manageOpen();
243
+ }
244
+ onLongpressSlotChange(event) {
245
+ this.longpressContent = this.extractSlotContentFromEvent(event);
246
+ this.hasLongpressContent = !!this.longpressContent || !!this.closeLongpressOverlay;
247
+ this.manageOpen();
248
+ }
249
+ onHoverSlotChange(event) {
250
+ this.hoverContent = this.extractSlotContentFromEvent(event);
251
+ this.manageOpen();
252
+ }
253
+ onTargetSlotChange(event) {
254
+ this.targetContent = this.extractSlotContentFromEvent(event);
255
+ }
256
+ extractSlotContentFromEvent(event) {
257
+ const slot = event.target;
258
+ const nodes = slot.assignedNodes({ flatten: true });
259
+ return nodes.find((node) => node instanceof HTMLElement);
260
+ }
261
+ async getUpdateComplete() {
262
+ const complete = await super.getUpdateComplete();
263
+ await this.openStatePromise;
264
+ return complete;
265
+ }
266
+ disconnectedCallback() {
267
+ this.closeAllOverlays();
268
+ super.disconnectedCallback();
269
+ }
270
+ };
271
+ export let OverlayTrigger = _OverlayTrigger;
291
272
  OverlayTrigger.openOverlay = async (target, interaction, content, options) => {
292
- return openOverlay(target, interaction, content, options);
273
+ return openOverlay(target, interaction, content, options);
293
274
  };
294
- __decorate([
295
- property({ reflect: true })
296
- ], OverlayTrigger.prototype, "placement", void 0);
297
- __decorate([
298
- property()
299
- ], OverlayTrigger.prototype, "type", void 0);
300
- __decorate([
301
- property({ type: Number, reflect: true })
302
- ], OverlayTrigger.prototype, "offset", void 0);
303
- __decorate([
304
- property({ reflect: true })
305
- ], OverlayTrigger.prototype, "open", void 0);
306
- __decorate([
307
- property({ type: Boolean, reflect: true })
308
- ], OverlayTrigger.prototype, "disabled", void 0);
309
- __decorate([
310
- state()
311
- ], OverlayTrigger.prototype, "hasLongpressContent", void 0);
312
- //# sourceMappingURL=OverlayTrigger.js.map
275
+ __decorateClass([
276
+ property({ reflect: true })
277
+ ], OverlayTrigger.prototype, "placement", 2);
278
+ __decorateClass([
279
+ property()
280
+ ], OverlayTrigger.prototype, "type", 2);
281
+ __decorateClass([
282
+ property({ type: Number, reflect: true })
283
+ ], OverlayTrigger.prototype, "offset", 2);
284
+ __decorateClass([
285
+ property({ reflect: true })
286
+ ], OverlayTrigger.prototype, "open", 2);
287
+ __decorateClass([
288
+ property({ type: Boolean, reflect: true })
289
+ ], OverlayTrigger.prototype, "disabled", 2);
290
+ __decorateClass([
291
+ state()
292
+ ], OverlayTrigger.prototype, "hasLongpressContent", 2);
293
+ //# sourceMappingURL=OverlayTrigger.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"OverlayTrigger.js","sourceRoot":"","sources":["OverlayTrigger.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport {\n isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends SpectrumElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static override get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @state()\n public hasLongpressContent = false;\n\n private longpressDescriptor?: HTMLElement;\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private _longpressId = `longpress-describedby-descriptor`;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected override render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <slot\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n <slot name=${this._longpressId}></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n if (changes.has('hasLongpressContent')) {\n this.manageLongpressDescriptor();\n }\n }\n\n protected manageLongpressDescriptor(): void {\n const trigger = this.querySelector(\n '[slot=\"trigger\"]'\n ) as SpectrumElement;\n const ariaDescribedby = trigger.getAttribute('aria-describedby');\n let descriptors = ariaDescribedby ? ariaDescribedby.split(/\\s+/) : [];\n\n if (this.hasLongpressContent) {\n if (!this.longpressDescriptor) {\n this.longpressDescriptor = document.createElement(\n 'div'\n ) as HTMLElement;\n\n this.longpressDescriptor.id = this._longpressId;\n this.longpressDescriptor.slot = this._longpressId;\n }\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n this.longpressDescriptor.textContent =\n LONGPRESS_INSTRUCTIONS[messageType];\n this.appendChild(this.longpressDescriptor);\n descriptors.push(this._longpressId);\n } else {\n if (this.longpressDescriptor) this.longpressDescriptor.remove();\n descriptors = descriptors.filter(\n (descriptor) => descriptor !== this._longpressId\n );\n }\n if (descriptors.length) {\n trigger.setAttribute('aria-describedby', descriptors.join(' '));\n } else {\n trigger.removeAttribute('aria-describedby');\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n !this.type || this.type === 'inline' || this.open === 'hover'\n ? undefined\n : 'auto',\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.hasLongpressContent =\n !!this.longpressContent || !!this.closeLongpressOverlay;\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public override disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["OverlayTrigger.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport {\n isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends SpectrumElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static override get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @state()\n public hasLongpressContent = false;\n\n private longpressDescriptor?: HTMLElement;\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private _longpressId = `longpress-describedby-descriptor`;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected override render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <slot\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n <slot name=${this._longpressId}></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected override updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n if (changes.has('hasLongpressContent')) {\n this.manageLongpressDescriptor();\n }\n }\n\n protected manageLongpressDescriptor(): void {\n const trigger = this.querySelector(\n '[slot=\"trigger\"]'\n ) as SpectrumElement;\n const ariaDescribedby = trigger.getAttribute('aria-describedby');\n let descriptors = ariaDescribedby ? ariaDescribedby.split(/\\s+/) : [];\n\n if (this.hasLongpressContent) {\n if (!this.longpressDescriptor) {\n this.longpressDescriptor = document.createElement(\n 'div'\n ) as HTMLElement;\n\n this.longpressDescriptor.id = this._longpressId;\n this.longpressDescriptor.slot = this._longpressId;\n }\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n this.longpressDescriptor.textContent =\n LONGPRESS_INSTRUCTIONS[messageType];\n this.appendChild(this.longpressDescriptor);\n descriptors.push(this._longpressId);\n } else {\n if (this.longpressDescriptor) this.longpressDescriptor.remove();\n descriptors = descriptors.filter(\n (descriptor) => descriptor !== this._longpressId\n );\n }\n if (descriptors.length) {\n trigger.setAttribute('aria-describedby', descriptors.join(' '));\n } else {\n trigger.removeAttribute('aria-describedby');\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n !this.type || this.type === 'inline' || this.open === 'hover'\n ? undefined\n : 'auto',\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.hasLongpressContent =\n !!this.longpressContent || !!this.closeLongpressOverlay;\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected override async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public override disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }