@spectrum-web-components/overlay 0.19.0 → 0.19.2-overlay.33

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 (114) hide show
  1. package/package.json +56 -5
  2. package/sp-overlay.d.ts +11 -0
  3. package/sp-overlay.dev.js +14 -0
  4. package/sp-overlay.dev.js.map +7 -0
  5. package/sp-overlay.js +2 -0
  6. package/sp-overlay.js.map +7 -0
  7. package/src/OverlayBase.d.ts +91 -0
  8. package/src/OverlayBase.dev.js +521 -0
  9. package/src/OverlayBase.dev.js.map +7 -0
  10. package/src/OverlayBase.js +16 -0
  11. package/src/OverlayBase.js.map +7 -0
  12. package/src/OverlayDialog.d.ts +8 -0
  13. package/src/OverlayDialog.dev.js +43 -0
  14. package/src/OverlayDialog.dev.js.map +7 -0
  15. package/src/OverlayDialog.js +2 -0
  16. package/src/OverlayDialog.js.map +7 -0
  17. package/src/OverlayElement.d.ts +66 -0
  18. package/src/OverlayElement.dev.js +371 -0
  19. package/src/OverlayElement.dev.js.map +7 -0
  20. package/src/OverlayElement.js +9 -0
  21. package/src/OverlayElement.js.map +7 -0
  22. package/src/OverlayNoPopover.d.ts +8 -0
  23. package/src/OverlayNoPopover.dev.js +63 -0
  24. package/src/OverlayNoPopover.dev.js.map +7 -0
  25. package/src/OverlayNoPopover.js +2 -0
  26. package/src/OverlayNoPopover.js.map +7 -0
  27. package/src/OverlayPopover.d.ts +8 -0
  28. package/src/OverlayPopover.dev.js +37 -0
  29. package/src/OverlayPopover.dev.js.map +7 -0
  30. package/src/OverlayPopover.js +2 -0
  31. package/src/OverlayPopover.js.map +7 -0
  32. package/src/OverlayStack.d.ts +24 -0
  33. package/src/OverlayStack.dev.js +113 -0
  34. package/src/OverlayStack.dev.js.map +7 -0
  35. package/src/OverlayStack.js +2 -0
  36. package/src/OverlayStack.js.map +7 -0
  37. package/src/OverlayTrigger.d.ts +18 -31
  38. package/src/OverlayTrigger.dev.js +137 -245
  39. package/src/OverlayTrigger.dev.js.map +3 -3
  40. package/src/OverlayTrigger.js +54 -22
  41. package/src/OverlayTrigger.js.map +3 -3
  42. package/src/PlacementController.d.ts +35 -0
  43. package/src/PlacementController.dev.js +172 -0
  44. package/src/PlacementController.dev.js.map +7 -0
  45. package/src/PlacementController.js +2 -0
  46. package/src/PlacementController.js.map +7 -0
  47. package/src/fullSizePlugin.d.ts +12 -0
  48. package/src/fullSizePlugin.dev.js +39 -0
  49. package/src/fullSizePlugin.dev.js.map +7 -0
  50. package/src/fullSizePlugin.js +2 -0
  51. package/src/fullSizePlugin.js.map +7 -0
  52. package/src/overlay-base.css.d.ts +2 -0
  53. package/src/overlay-base.css.dev.js +9 -0
  54. package/src/overlay-base.css.dev.js.map +7 -0
  55. package/src/overlay-base.css.js +6 -0
  56. package/src/overlay-base.css.js.map +7 -0
  57. package/src/overlay-element.css.d.ts +2 -0
  58. package/src/overlay-element.css.dev.js +7 -0
  59. package/src/overlay-element.css.dev.js.map +7 -0
  60. package/src/overlay-element.css.js +4 -0
  61. package/src/overlay-element.css.js.map +7 -0
  62. package/src/overlay-trigger.css.dev.js +1 -1
  63. package/src/overlay-trigger.css.dev.js.map +1 -1
  64. package/src/overlay-trigger.css.js +1 -1
  65. package/src/overlay-trigger.css.js.map +1 -1
  66. package/src/placement.d.ts +21 -0
  67. package/src/placement.dev.js +111 -0
  68. package/src/placement.dev.js.map +7 -0
  69. package/src/placement.js +2 -0
  70. package/src/placement.js.map +7 -0
  71. package/src/sizePlugin.d.ts +12 -0
  72. package/src/sizePlugin.dev.js +18 -0
  73. package/src/sizePlugin.dev.js.map +7 -0
  74. package/src/sizePlugin.js +2 -0
  75. package/src/sizePlugin.js.map +7 -0
  76. package/src/topLayerOverTransforms.d.ts +22 -0
  77. package/src/topLayerOverTransforms.dev.js +161 -0
  78. package/src/topLayerOverTransforms.dev.js.map +7 -0
  79. package/src/topLayerOverTransforms.js +2 -0
  80. package/src/topLayerOverTransforms.js.map +7 -0
  81. package/stories/overlay-element.stories.js +216 -0
  82. package/stories/overlay-element.stories.js.map +7 -0
  83. package/stories/overlay-story-components.js +1 -2
  84. package/stories/overlay-story-components.js.map +2 -2
  85. package/stories/overlay.stories.js +652 -637
  86. package/stories/overlay.stories.js.map +2 -2
  87. package/sync/overlay-trigger.d.ts +4 -0
  88. package/sync/overlay-trigger.dev.js +1 -3
  89. package/sync/overlay-trigger.dev.js.map +2 -2
  90. package/sync/overlay-trigger.js +1 -1
  91. package/sync/overlay-trigger.js.map +3 -3
  92. package/test/index.js +3 -3
  93. package/test/index.js.map +2 -2
  94. package/test/overlay-element.test-vrt.js +5 -0
  95. package/test/overlay-element.test-vrt.js.map +7 -0
  96. package/test/overlay-element.test.js +739 -0
  97. package/test/overlay-element.test.js.map +7 -0
  98. package/test/overlay-lifecycle.test.js +15 -61
  99. package/test/overlay-lifecycle.test.js.map +2 -2
  100. package/test/overlay-trigger-click.test.js +3 -2
  101. package/test/overlay-trigger-click.test.js.map +2 -2
  102. package/test/overlay-trigger-extended.test.js +1 -1
  103. package/test/overlay-trigger-extended.test.js.map +2 -2
  104. package/test/overlay-trigger-hover-click.test.js +1 -1
  105. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  106. package/test/overlay-trigger-hover.test.js +2 -2
  107. package/test/overlay-trigger-hover.test.js.map +2 -2
  108. package/test/overlay-trigger-longpress.test.js +1 -1
  109. package/test/overlay-trigger-longpress.test.js.map +2 -2
  110. package/test/overlay-update.test.js +4 -4
  111. package/test/overlay-update.test.js.map +2 -2
  112. package/test/overlay.test.js +3 -3
  113. package/test/overlay.test.js.map +2 -2
  114. package/custom-elements.json +0 -1191
@@ -16,69 +16,146 @@ import {
16
16
  } from "@spectrum-web-components/base";
17
17
  import {
18
18
  property,
19
+ query,
19
20
  state
20
21
  } from "@spectrum-web-components/base/src/decorators.js";
21
- import { firstFocusableIn } from "@spectrum-web-components/shared/src/first-focusable-in.js";
22
22
  import {
23
23
  isAndroid,
24
24
  isIOS
25
25
  } from "@spectrum-web-components/shared/src/platform.js";
26
- import { openOverlay } from "./loader.dev.js";
27
26
  import overlayTriggerStyles from "./overlay-trigger.css.js";
27
+ import "../sp-overlay.dev.js";
28
28
  export const LONGPRESS_INSTRUCTIONS = {
29
29
  touch: "Double tap and long press for additional options",
30
30
  keyboard: "Press Space or Alt+Down Arrow for additional options",
31
31
  mouse: "Click and hold for additional options"
32
32
  };
33
- const _OverlayTrigger = class extends SpectrumElement {
33
+ export class OverlayTrigger extends SpectrumElement {
34
34
  constructor() {
35
35
  super(...arguments);
36
- this.placement = "bottom";
37
36
  this.offset = 6;
38
37
  this.disabled = false;
39
38
  this.hasLongpressContent = false;
39
+ this.clickContent = [];
40
+ this.longpressContent = [];
41
+ this.hoverContent = [];
42
+ this.targetContent = [];
40
43
  this._longpressId = `longpress-describedby-descriptor`;
41
- this.abortOverlay = () => {
42
- return;
43
- };
44
- this.openStatePromise = Promise.resolve();
45
44
  }
46
45
  static get styles() {
47
46
  return [overlayTriggerStyles];
48
47
  }
49
- handleClose(event) {
50
- if (event && event.detail.interaction !== this.open && event.detail.interaction !== this.type) {
51
- return;
52
- }
53
- this.removeAttribute("open");
48
+ getAssignedElementsFromEvent(event) {
49
+ const target = event.target;
50
+ return target.assignedElements({ flatten: true });
51
+ }
52
+ handleTriggerContent(event) {
53
+ this.targetContent = this.getAssignedElementsFromEvent(event);
54
+ }
55
+ handleClickContent(event) {
56
+ this.clickContent = this.getAssignedElementsFromEvent(event);
57
+ }
58
+ handleLongpressContent(event) {
59
+ this.longpressContent = this.getAssignedElementsFromEvent(event);
60
+ }
61
+ handleHoverContent(event) {
62
+ this.hoverContent = this.getAssignedElementsFromEvent(event);
54
63
  }
55
64
  render() {
56
65
  return html`
57
66
  <slot
58
67
  id="trigger"
59
- @click=${this.onTrigger}
60
- @longpress=${this.onTrigger}
61
- @mouseenter=${this.onTrigger}
62
- @mouseleave=${this.onTrigger}
63
- @focusin=${this.onTrigger}
64
- @focusout=${this.onTrigger}
65
- @sp-closed=${this.handleClose}
66
- @slotchange=${this.onTargetSlotChange}
67
68
  name="trigger"
69
+ @slotchange=${this.handleTriggerContent}
68
70
  ></slot>
69
71
  <div id="overlay-content">
70
- <slot
71
- @slotchange=${this.onClickSlotChange}
72
- name="click-content"
73
- ></slot>
74
- <slot
75
- @slotchange=${this.onLongpressSlotChange}
76
- name="longpress-content"
77
- ></slot>
78
- <slot
79
- @slotchange=${this.onHoverSlotChange}
80
- name="hover-content"
81
- ></slot>
72
+ <sp-overlay
73
+ id="click-overlay"
74
+ ?disabled=${!this.clickContent.length}
75
+ ?open=${this.open === "click" && !!this.clickContent.length}
76
+ .offset=${this.offset}
77
+ .placement=${this.placement}
78
+ .triggerElement=${this.targetContent[0]}
79
+ .triggerInteraction=${"click"}
80
+ .type=${this.type !== "modal" ? "auto" : "modal"}
81
+ @sp-closed=${(event) => {
82
+ const target = event.composedPath()[0];
83
+ if (target !== this.clickOverlayElement)
84
+ return;
85
+ if (this.open === "click") {
86
+ this.open = void 0;
87
+ }
88
+ }}
89
+ @sp-opened=${(event) => {
90
+ const target = event.composedPath()[0];
91
+ if (target !== this.clickOverlayElement)
92
+ return;
93
+ this.open = "click";
94
+ }}
95
+ >
96
+ <slot
97
+ name="click-content"
98
+ @slotchange=${this.handleClickContent}
99
+ ></slot>
100
+ </sp-overlay>
101
+ <sp-overlay
102
+ id="longpress-overlay"
103
+ ?disabled=${!this.longpressContent.length}
104
+ ?open=${this.open === "longpress" && !!this.longpressContent.length}
105
+ .offset=${this.offset}
106
+ .placement=${this.placement}
107
+ .triggerElement=${this.targetContent[0]}
108
+ .triggerInteraction=${"longpress"}
109
+ .type=${"auto"}
110
+ @sp-closed=${(event) => {
111
+ const target = event.composedPath()[0];
112
+ if (target !== this.longpressOverlayElement)
113
+ return;
114
+ if (this.open === "longpress") {
115
+ this.open = void 0;
116
+ }
117
+ }}
118
+ @sp-opened=${(event) => {
119
+ const target = event.composedPath()[0];
120
+ if (target !== this.longpressOverlayElement)
121
+ return;
122
+ this.open = "longpress";
123
+ }}
124
+ >
125
+ <slot
126
+ name="longpress-content"
127
+ @slotchange=${this.handleLongpressContent}
128
+ ></slot>
129
+ </sp-overlay>
130
+ <sp-overlay
131
+ id="hover-overlay"
132
+ ?disabled=${!this.hoverContent.length}
133
+ ?open=${this.open === "hover" && !!this.hoverContent.length}
134
+ .offset=${this.offset}
135
+ .placement=${this.placement}
136
+ .triggerElement=${this.targetContent[0]}
137
+ .triggerInteraction=${"hover"}
138
+ .type=${"hint"}
139
+ @sp-closed=${(event) => {
140
+ const target = event.composedPath()[0];
141
+ if (target !== this.hoverOverlayElement)
142
+ return;
143
+ if (this.open === "hover") {
144
+ this.open = void 0;
145
+ }
146
+ }}
147
+ @sp-opened=${(event) => {
148
+ const target = event.composedPath()[0];
149
+ if (target !== this.hoverOverlayElement)
150
+ return;
151
+ this.open = "hover";
152
+ }}
153
+ >
154
+ <slot
155
+ name="hover-content"
156
+ @slotchange=${this.handleHoverContent}
157
+ ></slot>
158
+ </sp-overlay>
82
159
  <slot name=${this._longpressId}></slot>
83
160
  </div>
84
161
  `;
@@ -86,12 +163,9 @@ const _OverlayTrigger = class extends SpectrumElement {
86
163
  updated(changes) {
87
164
  super.updated(changes);
88
165
  if (this.disabled && changes.has("disabled")) {
89
- this.closeAllOverlays();
166
+ this.open = void 0;
90
167
  return;
91
168
  }
92
- if (changes.has("open")) {
93
- this.manageOpen();
94
- }
95
169
  if (changes.has("hasLongpressContent")) {
96
170
  this.manageLongpressDescriptor();
97
171
  }
@@ -127,219 +201,16 @@ const _OverlayTrigger = class extends SpectrumElement {
127
201
  trigger.removeAttribute("aria-describedby");
128
202
  }
129
203
  }
130
- closeAllOverlays() {
131
- if (this.abortOverlay)
132
- this.abortOverlay(true);
133
- [
134
- "closeClickOverlay",
135
- "closeHoverOverlay",
136
- "closeLongpressOverlay"
137
- ].forEach(async (name) => {
138
- const canClose = this[name];
139
- if (canClose == null)
140
- return;
141
- delete this[name];
142
- (await canClose)();
143
- });
144
- this.overlaidContent = void 0;
145
- }
146
- manageOpen() {
147
- var _a;
148
- const openHandlers = {
149
- click: () => this.onTriggerClick(),
150
- hover: () => this.onTriggerMouseEnter(),
151
- longpress: () => this.onTriggerLongpress(),
152
- none: () => this.closeAllOverlays()
153
- };
154
- openHandlers[(_a = this.open) != null ? _a : "none"]();
155
- }
156
- async openOverlay(target, interaction, content, options) {
157
- this.openStatePromise = new Promise(
158
- (res) => this.openStateResolver = res
159
- );
160
- this.addEventListener(
161
- "sp-opened",
162
- () => {
163
- this.openStateResolver();
164
- },
165
- { once: true }
166
- );
167
- this.overlaidContent = content;
168
- return _OverlayTrigger.openOverlay(
169
- target,
170
- interaction,
171
- content,
172
- options
173
- );
174
- }
175
- get overlayOptions() {
176
- return {
177
- offset: this.offset,
178
- placement: this.placement,
179
- receivesFocus: !this.type || this.type === "inline" || this.open === "hover" ? void 0 : "auto"
180
- };
181
- }
182
- onTrigger(event) {
183
- const mouseIsEnteringHoverContent = event.type === "mouseleave" && this.open === "hover" && event.relatedTarget === this.overlaidContent;
184
- if (mouseIsEnteringHoverContent && this.overlaidContent) {
185
- this.overlaidContent.addEventListener(
186
- "mouseleave",
187
- (event2) => {
188
- const mouseIsEnteringTrigger = event2.relatedTarget === this.targetContent;
189
- if (mouseIsEnteringTrigger) {
190
- return;
191
- }
192
- this.onTrigger(
193
- event2
194
- );
195
- },
196
- { once: true }
197
- );
198
- return;
199
- }
200
- if (this.disabled)
201
- return;
202
- switch (event.type) {
203
- case "mouseenter":
204
- case "focusin":
205
- if (!this.open && this.hoverContent) {
206
- this.open = "hover";
207
- }
208
- return;
209
- case "mouseleave":
210
- case "focusout":
211
- if (this.open === "hover") {
212
- this.handleClose();
213
- }
214
- return;
215
- case "click":
216
- if (this.clickContent) {
217
- this.open = event.type;
218
- }
219
- return;
220
- case "longpress":
221
- if (this.longpressContent) {
222
- this._longpressEvent = event;
223
- this.open = event.type;
224
- }
225
- return;
226
- }
227
- }
228
- prepareToFocusOverlayContent(overlayContent) {
229
- if (this.type !== "modal") {
230
- return;
231
- }
232
- const firstFocusable = firstFocusableIn(overlayContent);
233
- if (!firstFocusable) {
234
- overlayContent.tabIndex = 0;
235
- }
236
- }
237
- async onTriggerClick() {
238
- if (!this.targetContent || !this.clickContent || this.closeClickOverlay) {
239
- return;
240
- }
241
- const { targetContent, clickContent } = this;
242
- this.closeAllOverlays();
243
- this.prepareToFocusOverlayContent(clickContent);
244
- if (true) {
245
- window.__swc.ignoreWarningLevels.deprecation = true;
246
- }
247
- this.closeClickOverlay = this.openOverlay(
248
- targetContent,
249
- this.type ? this.type : "click",
250
- clickContent,
251
- this.overlayOptions
252
- );
253
- if (true) {
254
- window.__swc.ignoreWarningLevels.deprecation = false;
255
- }
256
- }
257
- async onTriggerLongpress() {
258
- var _a, _b;
259
- if (!this.targetContent || !this.longpressContent || this.closeLongpressOverlay) {
260
- return;
261
- }
262
- const { targetContent, longpressContent } = this;
263
- this.closeAllOverlays();
264
- this.prepareToFocusOverlayContent(longpressContent);
265
- const notImmediatelyClosable = ((_b = (_a = this._longpressEvent) == null ? void 0 : _a.detail) == null ? void 0 : _b.source) !== "keyboard";
266
- if (true) {
267
- window.__swc.ignoreWarningLevels.deprecation = true;
268
- }
269
- this.closeLongpressOverlay = this.openOverlay(
270
- targetContent,
271
- this.type ? this.type : "longpress",
272
- longpressContent,
273
- {
274
- ...this.overlayOptions,
275
- receivesFocus: "auto",
276
- notImmediatelyClosable
277
- }
278
- );
279
- if (true) {
280
- window.__swc.ignoreWarningLevels.deprecation = false;
281
- }
282
- this._longpressEvent = void 0;
283
- }
284
- async onTriggerMouseEnter() {
285
- if (!this.targetContent || !this.hoverContent || this.closeHoverOverlay) {
286
- return;
287
- }
288
- const abortPromise = new Promise((res) => {
289
- this.abortOverlay = res;
290
- });
291
- const { targetContent, hoverContent } = this;
292
- if (true) {
293
- window.__swc.ignoreWarningLevels.deprecation = true;
294
- }
295
- this.closeHoverOverlay = this.openOverlay(
296
- targetContent,
297
- "hover",
298
- hoverContent,
299
- {
300
- abortPromise,
301
- ...this.overlayOptions
302
- }
303
- );
304
- if (true) {
305
- window.__swc.ignoreWarningLevels.deprecation = false;
306
- }
307
- }
308
- onClickSlotChange(event) {
309
- this.clickContent = this.extractSlotContentFromEvent(event);
310
- this.manageOpen();
311
- }
312
- onLongpressSlotChange(event) {
313
- this.longpressContent = this.extractSlotContentFromEvent(event);
314
- this.hasLongpressContent = !!this.longpressContent || !!this.closeLongpressOverlay;
315
- this.manageOpen();
316
- }
317
- onHoverSlotChange(event) {
318
- this.hoverContent = this.extractSlotContentFromEvent(event);
319
- this.manageOpen();
320
- }
321
- onTargetSlotChange(event) {
322
- this.targetContent = this.extractSlotContentFromEvent(event);
323
- }
324
- extractSlotContentFromEvent(event) {
325
- const slot = event.target;
326
- const nodes = slot.assignedNodes({ flatten: true });
327
- return nodes.find((node) => node instanceof HTMLElement);
328
- }
329
204
  async getUpdateComplete() {
330
205
  const complete = await super.getUpdateComplete();
331
- await this.openStatePromise;
332
206
  return complete;
333
207
  }
334
- disconnectedCallback() {
335
- this.closeAllOverlays();
336
- super.disconnectedCallback();
208
+ willUpdate() {
209
+ if (this.placement === "none") {
210
+ this.placement = void 0;
211
+ }
337
212
  }
338
- };
339
- export let OverlayTrigger = _OverlayTrigger;
340
- OverlayTrigger.openOverlay = async (target, interaction, content, options) => {
341
- return openOverlay(target, interaction, content, options);
342
- };
213
+ }
343
214
  __decorateClass([
344
215
  property({ reflect: true })
345
216
  ], OverlayTrigger.prototype, "placement", 2);
@@ -358,4 +229,25 @@ __decorateClass([
358
229
  __decorateClass([
359
230
  state()
360
231
  ], OverlayTrigger.prototype, "hasLongpressContent", 2);
232
+ __decorateClass([
233
+ state()
234
+ ], OverlayTrigger.prototype, "clickContent", 2);
235
+ __decorateClass([
236
+ state()
237
+ ], OverlayTrigger.prototype, "longpressContent", 2);
238
+ __decorateClass([
239
+ state()
240
+ ], OverlayTrigger.prototype, "hoverContent", 2);
241
+ __decorateClass([
242
+ state()
243
+ ], OverlayTrigger.prototype, "targetContent", 2);
244
+ __decorateClass([
245
+ query("#click-overlay", true)
246
+ ], OverlayTrigger.prototype, "clickOverlayElement", 2);
247
+ __decorateClass([
248
+ query("#longpress-overlay", true)
249
+ ], OverlayTrigger.prototype, "longpressOverlayElement", 2);
250
+ __decorateClass([
251
+ query("#hover-overlay", true)
252
+ ], OverlayTrigger.prototype, "hoverOverlayElement", 2);
361
253
  //# sourceMappingURL=OverlayTrigger.dev.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 OverlayTriggerInteractions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.dev.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/**\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?: OverlayTriggerInteractions;\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 private overlaidContent?: 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 this.overlaidContent = undefined;\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 this.overlaidContent = content;\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 const mouseIsEnteringHoverContent =\n event.type === 'mouseleave' &&\n this.open === 'hover' &&\n (event as unknown as MouseEvent).relatedTarget ===\n this.overlaidContent;\n if (mouseIsEnteringHoverContent && this.overlaidContent) {\n this.overlaidContent.addEventListener(\n 'mouseleave',\n (event: MouseEvent) => {\n const mouseIsEnteringTrigger =\n event.relatedTarget === this.targetContent;\n if (mouseIsEnteringTrigger) {\n return;\n }\n this.onTrigger(\n event as unknown as CustomEvent<LongpressEvent>\n );\n },\n { once: true }\n );\n return;\n }\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 }\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 if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = true;\n }\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = false;\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 if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = true;\n }\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 if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = false;\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 if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = true;\n }\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n if (window.__swc.DEBUG) {\n window.__swc.ignoreWarningLevels.deprecation = false;\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": ["event"]
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 query,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\n\nimport { OverlayTriggerInteractions } from './overlay-types';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\nimport '../sp-overlay.dev.js'\nimport { Placement } from '@floating-ui/dom';\nimport { OverlayBase } from './OverlayBase';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\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/**\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 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;\n\n @property()\n public type?: OverlayTriggerInteractions;\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\n @state()\n private clickContent: HTMLElement[] = [];\n\n @state()\n private longpressContent: HTMLElement[] = [];\n\n @state()\n private hoverContent: HTMLElement[] = [];\n\n @state()\n private targetContent: HTMLElement[] = [];\n\n @query('#click-overlay', true)\n clickOverlayElement!: OverlayBase;\n\n @query('#longpress-overlay', true)\n longpressOverlayElement!: OverlayBase;\n\n @query('#hover-overlay', true)\n hoverOverlayElement!: OverlayBase;\n\n private _longpressId = `longpress-describedby-descriptor`;\n\n private getAssignedElementsFromEvent(event: Event): HTMLElement[] {\n const target = event.target as HTMLSlotElement;\n return target.assignedElements({ flatten: true }) as HTMLElement[];\n }\n\n private handleTriggerContent(event: Event): void {\n this.targetContent = this.getAssignedElementsFromEvent(event);\n }\n\n private handleClickContent(event: Event): void {\n this.clickContent = this.getAssignedElementsFromEvent(event);\n }\n\n private handleLongpressContent(event: Event): void {\n this.longpressContent = this.getAssignedElementsFromEvent(event);\n }\n\n private handleHoverContent(event: Event): void {\n this.hoverContent = this.getAssignedElementsFromEvent(event);\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 name=\"trigger\"\n @slotchange=${this.handleTriggerContent}\n ></slot>\n <div id=\"overlay-content\">\n <sp-overlay\n id=\"click-overlay\"\n ?disabled=${!this.clickContent.length}\n ?open=${this.open === 'click' && !!this.clickContent.length}\n .offset=${this.offset}\n .placement=${this.placement}\n .triggerElement=${this.targetContent[0]}\n .triggerInteraction=${'click'}\n .type=${this.type !== 'modal' ? 'auto' : 'modal'}\n @sp-closed=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.clickOverlayElement) return;\n if (this.open === 'click') {\n this.open = undefined;\n }\n }}\n @sp-opened=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.clickOverlayElement) return;\n this.open = 'click';\n }}\n >\n <slot\n name=\"click-content\"\n @slotchange=${this.handleClickContent}\n ></slot>\n </sp-overlay>\n <sp-overlay\n id=\"longpress-overlay\"\n ?disabled=${!this.longpressContent.length}\n ?open=${this.open === 'longpress' &&\n !!this.longpressContent.length}\n .offset=${this.offset}\n .placement=${this.placement}\n .triggerElement=${this.targetContent[0]}\n .triggerInteraction=${'longpress'}\n .type=${'auto'}\n @sp-closed=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.longpressOverlayElement) return;\n if (this.open === 'longpress') {\n this.open = undefined;\n }\n }}\n @sp-opened=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.longpressOverlayElement) return;\n this.open = 'longpress';\n }}\n >\n <slot\n name=\"longpress-content\"\n @slotchange=${this.handleLongpressContent}\n ></slot>\n </sp-overlay>\n <sp-overlay\n id=\"hover-overlay\"\n ?disabled=${!this.hoverContent.length}\n ?open=${this.open === 'hover' && !!this.hoverContent.length}\n .offset=${this.offset}\n .placement=${this.placement}\n .triggerElement=${this.targetContent[0]}\n .triggerInteraction=${'hover'}\n .type=${'hint'}\n @sp-closed=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.hoverOverlayElement) return;\n if (this.open === 'hover') {\n this.open = undefined;\n }\n }}\n @sp-opened=${(event: Event) => {\n const target = event.composedPath()[0];\n if (target !== this.hoverOverlayElement) return;\n this.open = 'hover';\n }}\n >\n <slot\n name=\"hover-content\"\n @slotchange=${this.handleHoverContent}\n ></slot>\n </sp-overlay>\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.open = undefined;\n return;\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 protected override async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n return complete;\n }\n\n protected override willUpdate(): void {\n if ((this.placement as unknown as 'none') === 'none') {\n this.placement = undefined;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }