@spectrum-web-components/overlay 0.35.1-rc.15 → 0.35.1-rc.25

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 (54) hide show
  1. package/README.md +72 -69
  2. package/custom-elements.json +33 -18
  3. package/package.json +8 -8
  4. package/src/AbstractOverlay.d.ts +4 -2
  5. package/src/AbstractOverlay.dev.js +6 -0
  6. package/src/AbstractOverlay.dev.js.map +2 -2
  7. package/src/AbstractOverlay.js +1 -1
  8. package/src/AbstractOverlay.js.map +3 -3
  9. package/src/Overlay.d.ts +5 -3
  10. package/src/Overlay.dev.js +62 -28
  11. package/src/Overlay.dev.js.map +3 -3
  12. package/src/Overlay.js +7 -7
  13. package/src/Overlay.js.map +3 -3
  14. package/src/OverlayDialog.dev.js +5 -2
  15. package/src/OverlayDialog.dev.js.map +2 -2
  16. package/src/OverlayDialog.js +1 -1
  17. package/src/OverlayDialog.js.map +2 -2
  18. package/src/OverlayNoPopover.dev.js +1 -1
  19. package/src/OverlayNoPopover.dev.js.map +2 -2
  20. package/src/OverlayNoPopover.js +1 -1
  21. package/src/OverlayNoPopover.js.map +2 -2
  22. package/src/OverlayPopover.dev.js +4 -3
  23. package/src/OverlayPopover.dev.js.map +2 -2
  24. package/src/OverlayPopover.js +1 -1
  25. package/src/OverlayPopover.js.map +2 -2
  26. package/src/OverlayStack.d.ts +7 -0
  27. package/src/OverlayStack.dev.js +11 -0
  28. package/src/OverlayStack.dev.js.map +2 -2
  29. package/src/OverlayStack.js +1 -1
  30. package/src/OverlayStack.js.map +3 -3
  31. package/src/OverlayTrigger.d.ts +0 -1
  32. package/src/OverlayTrigger.dev.js +1 -6
  33. package/src/OverlayTrigger.dev.js.map +2 -2
  34. package/src/OverlayTrigger.js +2 -2
  35. package/src/OverlayTrigger.js.map +2 -2
  36. package/src/overlay-types.d.ts +1 -0
  37. package/src/overlay-types.dev.js.map +1 -1
  38. package/src/overlay-types.js.map +1 -1
  39. package/src/overlay.css.dev.js +1 -1
  40. package/src/overlay.css.dev.js.map +1 -1
  41. package/src/overlay.css.js +1 -1
  42. package/src/overlay.css.js.map +1 -1
  43. package/src/topLayerOverTransforms.dev.js +2 -3
  44. package/src/topLayerOverTransforms.dev.js.map +2 -2
  45. package/src/topLayerOverTransforms.js +1 -1
  46. package/src/topLayerOverTransforms.js.map +2 -2
  47. package/stories/overlay-element.stories.js +5 -4
  48. package/stories/overlay-element.stories.js.map +2 -2
  49. package/test/overlay-trigger-extended.test.js +34 -29
  50. package/test/overlay-trigger-extended.test.js.map +2 -2
  51. package/test/overlay-trigger-hover-click.test.js +5 -2
  52. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  53. package/test/overlay-trigger-longpress.test.js +109 -6
  54. package/test/overlay-trigger-longpress.test.js.map +2 -2
@@ -59,14 +59,14 @@ const _Overlay = class extends OverlayFeatures {
59
59
  super(...arguments);
60
60
  this.delayed = false;
61
61
  this._disabled = false;
62
- this.longpressed = false;
63
- this.isVisible = false;
62
+ this.longpressState = "null";
64
63
  this.offset = 6;
65
64
  this.placementController = new PlacementController(this);
66
65
  this._open = false;
67
66
  this.receivesFocus = "auto";
68
67
  this.releaseAriaDescribedby = noop;
69
68
  this.releaseLongpressDescribedby = noop;
69
+ this._state = "closed";
70
70
  this.triggerElement = null;
71
71
  this.type = "hint";
72
72
  this.wasOpen = false;
@@ -78,9 +78,12 @@ const _Overlay = class extends OverlayFeatures {
78
78
  if (event.button !== 0)
79
79
  return;
80
80
  const triggerElement = this.triggerElement;
81
- this.longpressed = false;
81
+ this.longpressState = "potential";
82
82
  triggerElement.addEventListener("pointerup", this.handlePointerup);
83
83
  triggerElement.addEventListener("pointercancel", this.handlePointerup);
84
+ if (triggerElement.holdAffordance) {
85
+ return;
86
+ }
84
87
  this.longressTimeout = setTimeout(() => {
85
88
  if (!triggerElement)
86
89
  return;
@@ -99,12 +102,7 @@ const _Overlay = class extends OverlayFeatures {
99
102
  clearTimeout(this.longressTimeout);
100
103
  if (!this.triggerElement)
101
104
  return;
102
- if (this.longpressed) {
103
- this.open = true;
104
- }
105
- setTimeout(() => {
106
- this.longpressed = false;
107
- });
105
+ this.longpressState = this.state === "opening" ? "pressed" : "null";
108
106
  const triggerElement = this.triggerElement;
109
107
  triggerElement.removeEventListener("pointerup", this.handlePointerup);
110
108
  triggerElement.removeEventListener(
@@ -127,8 +125,11 @@ const _Overlay = class extends OverlayFeatures {
127
125
  this.handleKeyup = (event) => {
128
126
  const { code, altKey } = event;
129
127
  if (code === "Space" || altKey && code === "ArrowDown") {
128
+ if (!this.triggerElement || !this.hasNonVirtualTrigger) {
129
+ return;
130
+ }
130
131
  event.stopPropagation();
131
- this.dispatchEvent(
132
+ this.triggerElement.dispatchEvent(
132
133
  new CustomEvent("longpress", {
133
134
  bubbles: true,
134
135
  composed: true,
@@ -137,6 +138,9 @@ const _Overlay = class extends OverlayFeatures {
137
138
  }
138
139
  })
139
140
  );
141
+ setTimeout(() => {
142
+ this.longpressState = "null";
143
+ });
140
144
  }
141
145
  };
142
146
  /**
@@ -150,8 +154,9 @@ const _Overlay = class extends OverlayFeatures {
150
154
  this.preventNextToggle = this.open;
151
155
  };
152
156
  this.handleClick = () => {
153
- if (this.longpressed)
157
+ if (this.longpressState === "opening" || this.longpressState === "pressed") {
154
158
  return;
159
+ }
155
160
  if (!this.preventNextToggle) {
156
161
  this.open = !this.open;
157
162
  }
@@ -198,7 +203,7 @@ const _Overlay = class extends OverlayFeatures {
198
203
  };
199
204
  this.handleLongpress = () => {
200
205
  this.open = true;
201
- this.longpressed = true;
206
+ this.longpressState = this.longpressState === "potential" ? "opening" : "pressed";
202
207
  };
203
208
  this.willPreventClose = false;
204
209
  }
@@ -230,17 +235,35 @@ const _Overlay = class extends OverlayFeatures {
230
235
  return;
231
236
  if (open === this.open)
232
237
  return;
238
+ if ((this.longpressState === "opening" || this.longpressState === "pressed") && !open)
239
+ return;
233
240
  this._open = open;
234
241
  if (this.open) {
235
242
  _Overlay.openCount += 1;
236
- this.isVisible = true;
237
243
  }
238
244
  this.requestUpdate("open", !this.open);
239
245
  }
246
+ get state() {
247
+ return this._state;
248
+ }
249
+ set state(state2) {
250
+ if (state2 === this.state)
251
+ return;
252
+ const oldState = this.state;
253
+ this._state = state2;
254
+ if (this.state === "opened" || this.state === "closed") {
255
+ this.longpressState = this.longpressState === "pressed" ? "null" : this.longpressState;
256
+ }
257
+ this.requestUpdate("state", oldState);
258
+ }
240
259
  get usesDialog() {
241
260
  return this.type === "modal" || this.type === "page";
242
261
  }
243
262
  get popoverValue() {
263
+ const hasPopoverAttribute = "popover" in this;
264
+ if (!hasPopoverAttribute) {
265
+ return void 0;
266
+ }
244
267
  switch (this.type) {
245
268
  case "modal":
246
269
  case "page":
@@ -339,6 +362,11 @@ const _Overlay = class extends OverlayFeatures {
339
362
  }
340
363
  overlayStack.remove(this);
341
364
  }
365
+ if (this.open && this.state !== "opened") {
366
+ this.state = "opening";
367
+ } else if (!this.open && this.state !== "closed") {
368
+ this.state = "closing";
369
+ }
342
370
  if (this.usesDialog) {
343
371
  this.manageDialogOpen();
344
372
  } else {
@@ -401,18 +429,21 @@ const _Overlay = class extends OverlayFeatures {
401
429
  bindLongpressEvents(triggerElement) {
402
430
  const options = { signal: this.abortController.signal };
403
431
  triggerElement.addEventListener(
404
- "pointerdown",
405
- this.handlePointerdown,
432
+ "longpress",
433
+ this.handleLongpress,
406
434
  options
407
435
  );
408
- triggerElement.addEventListener("keydown", this.handleKeydown, options);
409
- triggerElement.addEventListener("keyup", this.handleKeyup, options);
410
436
  triggerElement.addEventListener(
411
- "longpress",
412
- this.handleLongpress,
437
+ "pointerdown",
438
+ this.handlePointerdown,
413
439
  options
414
440
  );
415
441
  this.prepareLongpressDescription(triggerElement);
442
+ if (triggerElement.holdAffordance) {
443
+ return;
444
+ }
445
+ triggerElement.addEventListener("keydown", this.handleKeydown, options);
446
+ triggerElement.addEventListener("keyup", this.handleKeyup, options);
416
447
  }
417
448
  bindHoverEvents(triggerElement) {
418
449
  const options = { signal: this.abortController.signal };
@@ -535,7 +566,12 @@ const _Overlay = class extends OverlayFeatures {
535
566
  }
536
567
  }
537
568
  handleBrowserClose() {
538
- this.open = false;
569
+ if (this.longpressState !== "opening" && this.longpressState !== "pressed") {
570
+ this.open = false;
571
+ return;
572
+ }
573
+ this.open = true;
574
+ this.manageOpen(false);
539
575
  }
540
576
  handleSlotchange() {
541
577
  if (this.triggerElement) {
@@ -635,23 +671,21 @@ const _Overlay = class extends OverlayFeatures {
635
671
  @close=${this.handleBrowserClose}
636
672
  @cancel=${this.handleBrowserClose}
637
673
  @beforetoggle=${this.handleBeforetoggle}
638
- ?is-visible=${this.isVisible}
674
+ ?is-visible=${this.state !== "closed"}
639
675
  >
640
676
  ${this.renderContent()}
641
677
  </dialog>
642
678
  `;
643
679
  }
644
680
  renderPopover() {
645
- const hasPopoverAttribute = "popover" in this;
646
- const popoverValue = hasPopoverAttribute ? this.popoverValue : void 0;
647
681
  return html`
648
682
  <div
649
683
  class="dialog"
650
684
  part="dialog"
651
- popover=${ifDefined(popoverValue)}
685
+ popover=${ifDefined(this.popoverValue)}
652
686
  @beforetoggle=${this.handleBeforetoggle}
653
687
  @close=${this.handleBrowserClose}
654
- ?is-visible=${this.isVisible}
688
+ ?is-visible=${this.state !== "closed"}
655
689
  >
656
690
  ${this.renderContent()}
657
691
  </div>
@@ -700,9 +734,6 @@ __decorateClass([
700
734
  // gather only elements slotted into the default slot
701
735
  })
702
736
  ], Overlay.prototype, "elements", 2);
703
- __decorateClass([
704
- state()
705
- ], Overlay.prototype, "isVisible", 2);
706
737
  __decorateClass([
707
738
  property({ type: Number })
708
739
  ], Overlay.prototype, "offset", 2);
@@ -718,6 +749,9 @@ __decorateClass([
718
749
  __decorateClass([
719
750
  query("slot")
720
751
  ], Overlay.prototype, "slotEl", 2);
752
+ __decorateClass([
753
+ state()
754
+ ], Overlay.prototype, "state", 1);
721
755
  __decorateClass([
722
756
  property({ type: Number, attribute: "tip-padding" })
723
757
  ], Overlay.prototype, "tipPadding", 2);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Overlay.ts"],
4
- "sourcesContent": ["/*\nCopyright 2023 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*/\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\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';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.dev.js'\nimport { OverlayDialog } from './OverlayDialog.dev.js'\nimport { OpenableElement, OverlayTypes, Placement } from './overlay-types.dev.js'\nimport { OverlayPopover } from './OverlayPopover.dev.js'\nimport { OverlayNoPopover } from './OverlayNoPopover.dev.js'\nimport { overlayStack } from './OverlayStack.dev.js'\nimport { noop } from './AbstractOverlay.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst LONGPRESS_DURATION = 300;\n\ntype LongpressEvent = {\n source: 'pointer' | 'keyboard';\n};\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\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\n\n abortController!: AbortController;\n\n /**\n * An Overlay that is `delayed` will wait until a warm-up period of 1000ms\n * has completed before opening. Once the warmup period has completed, all\n * subsequent Overlays will open immediately. When no Overlays are opened,\n * a cooldown period of 1000ms will begin. Once the cooldown has completed,\n * the next Overlay to be opened will be subject to the warm-up period if\n * provided that option.\n */\n @property({ type: Boolean })\n override delayed = false;\n\n @query('.dialog')\n override dialogEl!: HTMLDialogElement & {\n showPopover(): void;\n hidePopover(): void;\n };\n\n /**\n * Whether the overlay is currently functional or not\n */\n @property({ type: Boolean })\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.wasOpen = this.open;\n this.open = false;\n } else {\n this.bindEvents();\n this.open = this.open || this.wasOpen;\n this.wasOpen = false;\n }\n }\n\n private _disabled = false;\n\n @queryAssignedElements({\n flatten: true,\n selector: ':not([slot=\"longpress-describedby-descriptor\"])', // gather only elements slotted into the default slot\n })\n override elements!: OpenableElement[];\n\n public parentOverlayToForceClose?: Overlay;\n\n private get hasNonVirtualTrigger(): boolean {\n return (\n !!this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n );\n }\n\n protected longpressed = false;\n\n private longressTimeout!: ReturnType<typeof setTimeout>;\n\n @state()\n override isVisible = false;\n\n /**\n * The `offset` property accepts either a single number, to\n * define the offset of the Overlay along the main axis from\n * the trigger, or 2-tuple, to define the offset along the\n * main axis and the cross axis. This option has no effect\n * when there is no trigger element.\n */\n @property({ type: Number })\n offset: number | [number, number] = 6;\n\n protected override placementController = new PlacementController(this);\n\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n if (open && this.disabled) return;\n if (open === this.open) return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n this.isVisible = true;\n }\n this.requestUpdate('open', !this.open);\n }\n\n private _open = false;\n\n static openCount = 1;\n\n /**\n * Instruct the Overlay where to place itself in\n * relationship to the trigger element.\n */\n @property()\n placement?: Placement;\n\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n private releaseAriaDescribedby = noop;\n private releaseLongpressDescribedby = noop;\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @property({ type: Number, attribute: 'tip-padding' })\n tipPadding?: number;\n\n /**\n * An optional ID reference for the trigger element combined with the optional\n * interaction (click | hover | longpress) by which the overlay shold open\n * the overlay with an `@`: e.g. `trigger@click` opens the overlay when an\n * element with the ID \"trigger\" is clicked.\n */\n @property()\n trigger?: string;\n\n /**\n * An element reference for the trigger element that the overlay should relate to.\n */\n @property({ attribute: false })\n override triggerElement: HTMLElement | VirtualTrigger | null = null;\n\n /**\n * The specific interaction to listen for on the `triggerElement` to open the overlay.\n */\n @property({ attribute: false })\n triggerInteraction?: 'click' | 'longpress' | 'hover';\n\n @property()\n override type: OverlayTypes = 'hint';\n\n protected wasOpen = false;\n\n private elementResolver = new ElementResolutionController(this);\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected async manageOpen(oldOpen: boolean): Promise<void> {\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (!this.open) {\n // If the focus remains inside of the overlay or\n // a slotted descendent of the overlay you need to return\n // focus back to the trigger.\n const getAncestors = (): HTMLElement[] => {\n const ancestors: HTMLElement[] = [];\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n let currentNode = document.activeElement;\n while (\n currentNode?.shadowRoot &&\n currentNode.shadowRoot.activeElement\n ) {\n currentNode = currentNode.shadowRoot.activeElement;\n }\n while (currentNode) {\n const ancestor =\n currentNode.assignedSlot ||\n currentNode.parentElement ||\n (currentNode.getRootNode() as ShadowRoot)?.host;\n if (ancestor) {\n ancestors.push(ancestor as HTMLElement);\n }\n currentNode = ancestor;\n }\n return ancestors;\n };\n if (\n (this.triggerElement as HTMLElement)?.focus &&\n (this.contains(\n (this.getRootNode() as Document).activeElement\n ) ||\n getAncestors().includes(this))\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n }\n\n protected unbindEvents(): void {\n this.abortController?.abort();\n }\n\n protected bindEvents(): void {\n if (!this.hasNonVirtualTrigger) return;\n this.abortController = new AbortController();\n const nextTriggerElement = this.triggerElement as HTMLElement;\n switch (this.triggerInteraction) {\n case 'click':\n this.bindClickEvents(nextTriggerElement);\n return;\n case 'longpress':\n this.bindLongpressEvents(nextTriggerElement);\n return;\n case 'hover':\n this.bindHoverEvents(nextTriggerElement);\n return;\n }\n }\n\n protected bindClickEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('click', this.handleClick, options);\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdownForClick,\n options\n );\n }\n\n protected bindLongpressEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown,\n options\n );\n triggerElement.addEventListener('keydown', this.handleKeydown, options);\n triggerElement.addEventListener('keyup', this.handleKeyup, options);\n triggerElement.addEventListener(\n 'longpress',\n this.handleLongpress,\n options\n );\n\n this.prepareLongpressDescription(triggerElement);\n }\n\n protected bindHoverEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('focusin', this.handleFocusin, options);\n triggerElement.addEventListener(\n 'focusout',\n this.handleFocusout,\n options\n );\n triggerElement.addEventListener(\n 'pointerenter',\n this.handlePointerenter,\n options\n );\n triggerElement.addEventListener(\n 'pointerleave',\n this.handlePointerleave,\n options\n );\n this.addEventListener(\n 'pointerleave',\n this.handleOverlayPointerleave,\n options\n );\n if (this.receivesFocus === 'true') return;\n\n this.prepareAriaDescribedby(triggerElement);\n }\n\n protected manageTriggerElement(triggerElement: HTMLElement | null): void {\n if (triggerElement) {\n this.unbindEvents();\n this.releaseAriaDescribedby();\n }\n const missingOrVirtual =\n !this.triggerElement ||\n this.triggerElement instanceof VirtualTrigger;\n if (missingOrVirtual) {\n return;\n }\n this.bindEvents();\n }\n\n private elementIds: string[] = [];\n\n private prepareLongpressDescription(trigger: HTMLElement): void {\n if (\n // only \"longpress\" relationships are described this way\n this.triggerInteraction !== 'longpress' ||\n // do not reapply until target it recycled\n this.releaseLongpressDescribedby !== noop ||\n // require \"longpress content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const longpressDescription = document.createElement('div');\n longpressDescription.id = `longpress-describedby-descriptor-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];\n longpressDescription.slot = 'longpress-describedby-descriptor';\n trigger.insertAdjacentElement('afterend', longpressDescription);\n\n const releaseLongpressDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [longpressDescription.id]\n );\n this.releaseLongpressDescribedby = () => {\n releaseLongpressDescribedby();\n longpressDescription.remove();\n this.releaseLongpressDescribedby = noop;\n };\n }\n\n private prepareAriaDescribedby(trigger: HTMLElement): void {\n if (\n // only \"hover\" relationships establed described by content\n this.triggerInteraction !== 'hover' ||\n // do not reapply until target is recycled\n this.releaseAriaDescribedby !== noop ||\n // require \"hover content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const triggerRoot = trigger.getRootNode();\n const contentRoot = this.elements[0].getRootNode();\n const overlayRoot = this.getRootNode();\n if (triggerRoot == overlayRoot) {\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = noop;\n };\n } else if (triggerRoot === contentRoot) {\n this.elementIds = this.elements.map((el) => el.id);\n const appliedIds = this.elements.map((el) => {\n if (!el.id) {\n el.id = `${this.tagName.toLowerCase()}-helper-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n }\n return el.id;\n });\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n appliedIds\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseAriaDescribedby = noop;\n };\n }\n }\n\n private handlePointerdown = (event: PointerEvent): void => {\n if (!this.triggerElement) return;\n if (event.button !== 0) return;\n const triggerElement = this.triggerElement as HTMLElement;\n this.longpressed = false;\n triggerElement.addEventListener('pointerup', this.handlePointerup);\n triggerElement.addEventListener('pointercancel', this.handlePointerup);\n this.longressTimeout = setTimeout(() => {\n if (!triggerElement) return;\n triggerElement.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'pointer',\n },\n })\n );\n }, LONGPRESS_DURATION);\n };\n\n private handlePointerup = (): void => {\n clearTimeout(this.longressTimeout);\n if (!this.triggerElement) return;\n if (this.longpressed) {\n this.open = true;\n }\n setTimeout(() => {\n this.longpressed = false;\n });\n const triggerElement = this.triggerElement as HTMLElement;\n triggerElement.removeEventListener('pointerup', this.handlePointerup);\n triggerElement.removeEventListener(\n 'pointercancel',\n this.handlePointerup\n );\n };\n\n /**\n * @private\n */\n protected handleKeydown = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (code === 'ArrowDown') {\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n }\n };\n\n protected handleKeyup = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n event.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'keyboard',\n },\n })\n );\n }\n };\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n protected handlePointerdownForClick = (): void => {\n this.preventNextToggle = this.open;\n };\n\n protected handleClick = (): void => {\n if (this.longpressed) return;\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n };\n\n private focusedin = false;\n\n protected handleFocusin = (): void => {\n this.open = true;\n this.focusedin = true;\n };\n\n protected handleFocusout = (): void => {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n };\n\n private pointerentered = false;\n\n protected handlePointerenter = (): void => {\n if (this.disabled) return;\n this.open = true;\n this.pointerentered = true;\n };\n\n protected handlePointerleave = (event: PointerEvent): void => {\n if (\n this === event.relatedTarget ||\n this.contains(event.relatedTarget as Node) ||\n [...this.children].find((child) => {\n if (child.localName !== 'slot') {\n return false;\n }\n return (child as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .find((el) => {\n return (\n el === event.relatedTarget ||\n el.contains(event.relatedTarget as Node)\n );\n });\n })\n ) {\n return;\n }\n this.doPointerleave();\n };\n\n protected handleOverlayPointerleave = (event: PointerEvent): void => {\n if (\n this.triggerElement === event.relatedTarget ||\n (this.hasNonVirtualTrigger &&\n (this.triggerElement as HTMLElement).contains(\n event.relatedTarget as Node\n ))\n ) {\n return;\n }\n this.doPointerleave();\n };\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.triggerElement as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n this.open = false;\n }\n\n protected handleLongpress = (): void => {\n this.open = true;\n this.longpressed = true;\n };\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n this.open = false;\n }\n\n protected handleSlotchange(): void {\n if (this.triggerElement) {\n this.prepareAriaDescribedby(this.triggerElement as HTMLElement);\n }\n if (!this.elements.length) {\n this.releaseLongpressDescribedby();\n } else if (this.hasNonVirtualTrigger) {\n this.prepareLongpressDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public willPreventClose = false;\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasUpdated) {\n this.addEventListener('focusout', (event: FocusEvent) => {\n // Only \"auto\" popovers should close on any sort of focusout\n if (this.type !== 'auto') {\n return;\n }\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n return;\n }\n const relationEvent = new Event('overlay-relation-query', {\n bubbles: true,\n composed: true,\n });\n event.relatedTarget.addEventListener(\n relationEvent.type,\n (event: Event) => {\n if (!event.composedPath().includes(this)) {\n this.open = false;\n }\n }\n );\n event.relatedTarget.dispatchEvent(relationEvent);\n });\n }\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${crypto\n .randomUUID()\n .slice(0, 8)}`\n );\n }\n if (\n changes.has('open') &&\n (typeof changes.get('open') !== 'undefined' || this.open)\n ) {\n this.manageOpen(changes.get('open'));\n }\n if (changes.has('trigger')) {\n const [id, interaction] = this.trigger?.split('@') || [];\n this.elementResolver.selector = id ? `#${id}` : '';\n this.triggerInteraction = interaction as\n | 'click'\n | 'longpress'\n | 'hover'\n | undefined;\n }\n const oldTrigger = this.triggerElement as HTMLElement;\n if (changes.has(elementResolverUpdatedSymbol)) {\n this.triggerElement = this.elementResolver.element;\n this.manageTriggerElement(oldTrigger);\n }\n if (changes.has('triggerElement')) {\n this.manageTriggerElement(changes.get('triggerElement'));\n }\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (changes.has('placement')) {\n if (this.placement) {\n this.dialogEl.setAttribute('actual-placement', this.placement);\n } else {\n this.dialogEl.removeAttribute('actual-placement');\n }\n if (this.open && typeof changes.get('placement') !== 'undefined') {\n this.placementController.resetOverlayPosition();\n }\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <div style=${styleMap(this.dialogStyleMap)} part=\"content\">\n <slot @slotchange=${this.handleSlotchange}></slot>\n </div>\n `;\n }\n\n private get dialogStyleMap(): StyleInfo {\n return {\n '--swc-overlay-open-count': Overlay.openCount.toString(),\n };\n }\n\n protected renderDialog(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <dialog\n class=\"dialog\"\n part=\"dialog\"\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.isVisible}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n const hasPopoverAttribute = 'popover' in this;\n const popoverValue = hasPopoverAttribute\n ? this.popoverValue\n : undefined;\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n popover=${ifDefined(popoverValue)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.isVisible}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasNonVirtualTrigger) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["_a", "event"]
4
+ "sourcesContent": ["/*\nCopyright 2023 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*/\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\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';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.dev.js'\nimport { OverlayDialog } from './OverlayDialog.dev.js'\nimport {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\n} from './overlay-types.dev.js'\nimport { OverlayPopover } from './OverlayPopover.dev.js'\nimport { OverlayNoPopover } from './OverlayNoPopover.dev.js'\nimport { overlayStack } from './OverlayStack.dev.js'\nimport { noop } from './AbstractOverlay.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst LONGPRESS_DURATION = 300;\n\ntype LongpressEvent = {\n source: 'pointer' | 'keyboard';\n};\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\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\n\n abortController!: AbortController;\n\n /**\n * An Overlay that is `delayed` will wait until a warm-up period of 1000ms\n * has completed before opening. Once the warmup period has completed, all\n * subsequent Overlays will open immediately. When no Overlays are opened,\n * a cooldown period of 1000ms will begin. Once the cooldown has completed,\n * the next Overlay to be opened will be subject to the warm-up period if\n * provided that option.\n */\n @property({ type: Boolean })\n override delayed = false;\n\n @query('.dialog')\n override dialogEl!: HTMLDialogElement & {\n showPopover(): void;\n hidePopover(): void;\n };\n\n /**\n * Whether the overlay is currently functional or not\n */\n @property({ type: Boolean })\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.wasOpen = this.open;\n this.open = false;\n } else {\n this.bindEvents();\n this.open = this.open || this.wasOpen;\n this.wasOpen = false;\n }\n }\n\n private _disabled = false;\n\n @queryAssignedElements({\n flatten: true,\n selector: ':not([slot=\"longpress-describedby-descriptor\"])', // gather only elements slotted into the default slot\n })\n override elements!: OpenableElement[];\n\n public parentOverlayToForceClose?: Overlay;\n\n private get hasNonVirtualTrigger(): boolean {\n return (\n !!this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n );\n }\n\n protected longpressState: 'null' | 'potential' | 'opening' | 'pressed' =\n 'null';\n\n private longressTimeout!: ReturnType<typeof setTimeout>;\n\n /**\n * The `offset` property accepts either a single number, to\n * define the offset of the Overlay along the main axis from\n * the trigger, or 2-tuple, to define the offset along the\n * main axis and the cross axis. This option has no effect\n * when there is no trigger element.\n */\n @property({ type: Number })\n offset: number | [number, number] = 6;\n\n protected override placementController = new PlacementController(this);\n\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n // Don't respond when disabled.\n if (open && this.disabled) return;\n // Don't respond when state not dirty\n if (open === this.open) return;\n // Don't respond when you're in the shadow on a longpress\n // Shadow occurs when the first \"click\" would normally close the popover\n if (\n (this.longpressState === 'opening' ||\n this.longpressState === 'pressed') &&\n !open\n )\n return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n }\n\n private _open = false;\n\n static openCount = 1;\n\n /**\n * Instruct the Overlay where to place itself in\n * relationship to the trigger element.\n */\n @property()\n placement?: Placement;\n\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n private releaseAriaDescribedby = noop;\n private releaseLongpressDescribedby = noop;\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState =\n this.longpressState === 'pressed'\n ? 'null'\n : this.longpressState;\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n @property({ type: Number, attribute: 'tip-padding' })\n tipPadding?: number;\n\n /**\n * An optional ID reference for the trigger element combined with the optional\n * interaction (click | hover | longpress) by which the overlay shold open\n * the overlay with an `@`: e.g. `trigger@click` opens the overlay when an\n * element with the ID \"trigger\" is clicked.\n */\n @property()\n trigger?: string;\n\n /**\n * An element reference for the trigger element that the overlay should relate to.\n */\n @property({ attribute: false })\n override triggerElement: HTMLElement | VirtualTrigger | null = null;\n\n /**\n * The specific interaction to listen for on the `triggerElement` to open the overlay.\n */\n @property({ attribute: false })\n triggerInteraction?: 'click' | 'longpress' | 'hover';\n\n @property()\n override type: OverlayTypes = 'hint';\n\n protected wasOpen = false;\n\n private elementResolver = new ElementResolutionController(this);\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected async manageOpen(oldOpen: boolean): Promise<void> {\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n if (this.open && this.state !== 'opened') {\n this.state = 'opening';\n } else if (!this.open && this.state !== 'closed') {\n this.state = 'closing';\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (!this.open) {\n // If the focus remains inside of the overlay or\n // a slotted descendent of the overlay you need to return\n // focus back to the trigger.\n const getAncestors = (): HTMLElement[] => {\n const ancestors: HTMLElement[] = [];\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n let currentNode = document.activeElement;\n while (\n currentNode?.shadowRoot &&\n currentNode.shadowRoot.activeElement\n ) {\n currentNode = currentNode.shadowRoot.activeElement;\n }\n while (currentNode) {\n const ancestor =\n currentNode.assignedSlot ||\n currentNode.parentElement ||\n (currentNode.getRootNode() as ShadowRoot)?.host;\n if (ancestor) {\n ancestors.push(ancestor as HTMLElement);\n }\n currentNode = ancestor;\n }\n return ancestors;\n };\n if (\n (this.triggerElement as HTMLElement)?.focus &&\n (this.contains(\n (this.getRootNode() as Document).activeElement\n ) ||\n getAncestors().includes(this))\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n }\n\n protected unbindEvents(): void {\n this.abortController?.abort();\n }\n\n protected bindEvents(): void {\n if (!this.hasNonVirtualTrigger) return;\n this.abortController = new AbortController();\n const nextTriggerElement = this.triggerElement as HTMLElement;\n switch (this.triggerInteraction) {\n case 'click':\n this.bindClickEvents(nextTriggerElement);\n return;\n case 'longpress':\n this.bindLongpressEvents(nextTriggerElement);\n return;\n case 'hover':\n this.bindHoverEvents(nextTriggerElement);\n return;\n }\n }\n\n protected bindClickEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('click', this.handleClick, options);\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdownForClick,\n options\n );\n }\n\n protected bindLongpressEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener(\n 'longpress',\n this.handleLongpress,\n options\n );\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown,\n options\n );\n this.prepareLongpressDescription(triggerElement);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only bind keyboard events when the trigger element isn't doing it for us.\n return;\n }\n triggerElement.addEventListener('keydown', this.handleKeydown, options);\n triggerElement.addEventListener('keyup', this.handleKeyup, options);\n }\n\n protected bindHoverEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('focusin', this.handleFocusin, options);\n triggerElement.addEventListener(\n 'focusout',\n this.handleFocusout,\n options\n );\n triggerElement.addEventListener(\n 'pointerenter',\n this.handlePointerenter,\n options\n );\n triggerElement.addEventListener(\n 'pointerleave',\n this.handlePointerleave,\n options\n );\n this.addEventListener(\n 'pointerleave',\n this.handleOverlayPointerleave,\n options\n );\n if (this.receivesFocus === 'true') return;\n\n this.prepareAriaDescribedby(triggerElement);\n }\n\n protected manageTriggerElement(triggerElement: HTMLElement | null): void {\n if (triggerElement) {\n this.unbindEvents();\n this.releaseAriaDescribedby();\n }\n const missingOrVirtual =\n !this.triggerElement ||\n this.triggerElement instanceof VirtualTrigger;\n if (missingOrVirtual) {\n return;\n }\n this.bindEvents();\n }\n\n private elementIds: string[] = [];\n\n private prepareLongpressDescription(trigger: HTMLElement): void {\n if (\n // only \"longpress\" relationships are described this way\n this.triggerInteraction !== 'longpress' ||\n // do not reapply until target it recycled\n this.releaseLongpressDescribedby !== noop ||\n // require \"longpress content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const longpressDescription = document.createElement('div');\n longpressDescription.id = `longpress-describedby-descriptor-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];\n longpressDescription.slot = 'longpress-describedby-descriptor';\n trigger.insertAdjacentElement('afterend', longpressDescription);\n\n const releaseLongpressDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [longpressDescription.id]\n );\n this.releaseLongpressDescribedby = () => {\n releaseLongpressDescribedby();\n longpressDescription.remove();\n this.releaseLongpressDescribedby = noop;\n };\n }\n\n private prepareAriaDescribedby(trigger: HTMLElement): void {\n if (\n // only \"hover\" relationships establed described by content\n this.triggerInteraction !== 'hover' ||\n // do not reapply until target is recycled\n this.releaseAriaDescribedby !== noop ||\n // require \"hover content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const triggerRoot = trigger.getRootNode();\n const contentRoot = this.elements[0].getRootNode();\n const overlayRoot = this.getRootNode();\n if (triggerRoot == overlayRoot) {\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = noop;\n };\n } else if (triggerRoot === contentRoot) {\n this.elementIds = this.elements.map((el) => el.id);\n const appliedIds = this.elements.map((el) => {\n if (!el.id) {\n el.id = `${this.tagName.toLowerCase()}-helper-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n }\n return el.id;\n });\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n appliedIds\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseAriaDescribedby = noop;\n };\n }\n }\n\n private handlePointerdown = (event: PointerEvent): void => {\n if (!this.triggerElement) return;\n if (event.button !== 0) return;\n const triggerElement = this.triggerElement as HTMLElement;\n this.longpressState = 'potential';\n triggerElement.addEventListener('pointerup', this.handlePointerup);\n triggerElement.addEventListener('pointercancel', this.handlePointerup);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only dispatch longpress event if the trigger element isn't doing it for us.\n return;\n }\n this.longressTimeout = setTimeout(() => {\n if (!triggerElement) return;\n triggerElement.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'pointer',\n },\n })\n );\n }, LONGPRESS_DURATION);\n };\n\n private handlePointerup = (): void => {\n clearTimeout(this.longressTimeout);\n if (!this.triggerElement) return;\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState = this.state === 'opening' ? 'pressed' : 'null';\n const triggerElement = this.triggerElement as HTMLElement;\n triggerElement.removeEventListener('pointerup', this.handlePointerup);\n triggerElement.removeEventListener(\n 'pointercancel',\n this.handlePointerup\n );\n };\n\n /**\n * @private\n */\n protected handleKeydown = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (code === 'ArrowDown') {\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n }\n };\n\n protected handleKeyup = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (!this.triggerElement || !this.hasNonVirtualTrigger) {\n return;\n }\n event.stopPropagation();\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'keyboard',\n },\n })\n );\n setTimeout(() => {\n this.longpressState = 'null';\n });\n }\n };\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n protected handlePointerdownForClick = (): void => {\n this.preventNextToggle = this.open;\n };\n\n protected handleClick = (): void => {\n if (\n this.longpressState === 'opening' ||\n this.longpressState === 'pressed'\n ) {\n return;\n }\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n };\n\n private focusedin = false;\n\n protected handleFocusin = (): void => {\n this.open = true;\n this.focusedin = true;\n };\n\n protected handleFocusout = (): void => {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n };\n\n private pointerentered = false;\n\n protected handlePointerenter = (): void => {\n if (this.disabled) return;\n this.open = true;\n this.pointerentered = true;\n };\n\n protected handlePointerleave = (event: PointerEvent): void => {\n if (\n this === event.relatedTarget ||\n this.contains(event.relatedTarget as Node) ||\n [...this.children].find((child) => {\n if (child.localName !== 'slot') {\n return false;\n }\n return (child as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .find((el) => {\n return (\n el === event.relatedTarget ||\n el.contains(event.relatedTarget as Node)\n );\n });\n })\n ) {\n return;\n }\n this.doPointerleave();\n };\n\n protected handleOverlayPointerleave = (event: PointerEvent): void => {\n if (\n this.triggerElement === event.relatedTarget ||\n (this.hasNonVirtualTrigger &&\n (this.triggerElement as HTMLElement).contains(\n event.relatedTarget as Node\n ))\n ) {\n return;\n }\n this.doPointerleave();\n };\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.triggerElement as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n this.open = false;\n }\n\n protected handleLongpress = (): void => {\n this.open = true;\n this.longpressState =\n this.longpressState === 'potential' ? 'opening' : 'pressed';\n };\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n if (\n this.longpressState !== 'opening' &&\n this.longpressState !== 'pressed'\n ) {\n this.open = false;\n return;\n }\n this.open = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (this.triggerElement) {\n this.prepareAriaDescribedby(this.triggerElement as HTMLElement);\n }\n if (!this.elements.length) {\n this.releaseLongpressDescribedby();\n } else if (this.hasNonVirtualTrigger) {\n this.prepareLongpressDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public willPreventClose = false;\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasUpdated) {\n this.addEventListener('focusout', (event: FocusEvent) => {\n // Only \"auto\" popovers should close on any sort of focusout\n if (this.type !== 'auto') {\n return;\n }\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n return;\n }\n const relationEvent = new Event('overlay-relation-query', {\n bubbles: true,\n composed: true,\n });\n event.relatedTarget.addEventListener(\n relationEvent.type,\n (event: Event) => {\n if (!event.composedPath().includes(this)) {\n this.open = false;\n }\n }\n );\n event.relatedTarget.dispatchEvent(relationEvent);\n });\n }\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${crypto\n .randomUUID()\n .slice(0, 8)}`\n );\n }\n if (\n changes.has('open') &&\n (typeof changes.get('open') !== 'undefined' || this.open)\n ) {\n this.manageOpen(changes.get('open'));\n }\n if (changes.has('trigger')) {\n const [id, interaction] = this.trigger?.split('@') || [];\n this.elementResolver.selector = id ? `#${id}` : '';\n this.triggerInteraction = interaction as\n | 'click'\n | 'longpress'\n | 'hover'\n | undefined;\n }\n const oldTrigger = this.triggerElement as HTMLElement;\n if (changes.has(elementResolverUpdatedSymbol)) {\n this.triggerElement = this.elementResolver.element;\n this.manageTriggerElement(oldTrigger);\n }\n if (changes.has('triggerElement')) {\n this.manageTriggerElement(changes.get('triggerElement'));\n }\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (changes.has('placement')) {\n if (this.placement) {\n this.dialogEl.setAttribute('actual-placement', this.placement);\n } else {\n this.dialogEl.removeAttribute('actual-placement');\n }\n if (this.open && typeof changes.get('placement') !== 'undefined') {\n this.placementController.resetOverlayPosition();\n }\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <div style=${styleMap(this.dialogStyleMap)} part=\"content\">\n <slot @slotchange=${this.handleSlotchange}></slot>\n </div>\n `;\n }\n\n private get dialogStyleMap(): StyleInfo {\n return {\n '--swc-overlay-open-count': Overlay.openCount.toString(),\n };\n }\n\n protected renderDialog(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <dialog\n class=\"dialog\"\n part=\"dialog\"\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n popover=${ifDefined(this.popoverValue)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasNonVirtualTrigger) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;AAWA;AAAA,EACI;AAAA,OAGG;AACP;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP;AAAA,EACI;AAAA,EACA;AAAA,OACG;AACP;AAAA,EACI;AAAA,EACA;AAAA,OACG;AACP,SAAS,gCAAgC;AACzC;AAAA,EACI;AAAA,EAEA;AAAA,OACG;AAEP,SAAS,iBAAiB,iBAAiB;AAC3C,SAAS,qBAAqB;AAO9B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AAEpC,OAAO,YAAY;AAEnB,MAAM,qBAAqB;AAMpB,aAAM,yBAAyB;AAAA,EAClC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AACX;AAEA,MAAM,kBAAkB,iBAAiB,SAAS,cAAc,KAAK;AAErE,IAAI,kBAAkB,cAAc,eAAe;AAEnD,IAAI,iBAAiB;AACjB,oBAAkB,eAAe,eAAe;AACpD,OAAO;AACH,oBAAkB,iBAAiB,eAAe;AACtD;AAQO,MAAM,WAAN,cAAsB,gBAAgB;AAAA,EAAtC;AAAA;AAcH,SAAS,UAAU;AA+BnB,SAAQ,YAAY;AAiBpB,SAAU,iBACN;AAYJ,kBAAoC;AAEpC,SAAmB,sBAAsB,IAAI,oBAAoB,IAAI;AA2BrE,SAAQ,QAAQ;AAYhB,SAAS,gBAA2C;AAEpD,SAAQ,yBAAyB;AACjC,SAAQ,8BAA8B;AA2BtC,SAAS,SAAuB;AAkBhC,SAAS,iBAAsD;AAS/D,SAAS,OAAqB;AAE9B,SAAU,UAAU;AAEpB,SAAQ,kBAAkB,IAAI,4BAA4B,IAAI;AAmR9D,SAAQ,aAAuB,CAAC;AAqFhC,SAAQ,oBAAoB,CAAC,UAA8B;AACvD,UAAI,CAAC,KAAK;AAAgB;AAC1B,UAAI,MAAM,WAAW;AAAG;AACxB,YAAM,iBAAiB,KAAK;AAC5B,WAAK,iBAAiB;AACtB,qBAAe,iBAAiB,aAAa,KAAK,eAAe;AACjE,qBAAe,iBAAiB,iBAAiB,KAAK,eAAe;AACrE,UACK,eACI,gBACP;AAEE;AAAA,MACJ;AACA,WAAK,kBAAkB,WAAW,MAAM;AACpC,YAAI,CAAC;AAAgB;AACrB,uBAAe;AAAA,UACX,IAAI,YAA4B,aAAa;AAAA,YACzC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACJ,QAAQ;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,GAAG,kBAAkB;AAAA,IACzB;AAEA,SAAQ,kBAAkB,MAAY;AAClC,mBAAa,KAAK,eAAe;AACjC,UAAI,CAAC,KAAK;AAAgB;AAK1B,WAAK,iBAAiB,KAAK,UAAU,YAAY,YAAY;AAC7D,YAAM,iBAAiB,KAAK;AAC5B,qBAAe,oBAAoB,aAAa,KAAK,eAAe;AACpE,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAKA;AAAA;AAAA;AAAA,SAAU,gBAAgB,CAAC,UAA+B;AACtD,YAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAI,SAAS,WAAY,UAAU,SAAS,aAAc;AACtD,YAAI,SAAS,aAAa;AACtB,gBAAM,gBAAgB;AACtB,gBAAM,yBAAyB;AAAA,QACnC;AAAA,MACJ;AAAA,IACJ;AAEA,SAAU,cAAc,CAAC,UAA+B;AACpD,YAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAI,SAAS,WAAY,UAAU,SAAS,aAAc;AACtD,YAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,sBAAsB;AACpD;AAAA,QACJ;AACA,cAAM,gBAAgB;AACtB,QAAC,KAAK,eAA+B;AAAA,UACjC,IAAI,YAA4B,aAAa;AAAA,YACzC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACJ,QAAQ;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AACA,mBAAW,MAAM;AACb,eAAK,iBAAiB;AAAA,QAC1B,CAAC;AAAA,MACL;AAAA,IACJ;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,oBAAoB;AAE5B,SAAU,4BAA4B,MAAY;AAC9C,WAAK,oBAAoB,KAAK;AAAA,IAClC;AAEA,SAAU,cAAc,MAAY;AAChC,UACI,KAAK,mBAAmB,aACxB,KAAK,mBAAmB,WAC1B;AACE;AAAA,MACJ;AACA,UAAI,CAAC,KAAK,mBAAmB;AACzB,aAAK,OAAO,CAAC,KAAK;AAAA,MACtB;AACA,WAAK,oBAAoB;AAAA,IAC7B;AAEA,SAAQ,YAAY;AAEpB,SAAU,gBAAgB,MAAY;AAClC,WAAK,OAAO;AACZ,WAAK,YAAY;AAAA,IACrB;AAEA,SAAU,iBAAiB,MAAY;AACnC,WAAK,YAAY;AACjB,UAAI,KAAK;AAAgB;AACzB,WAAK,OAAO;AAAA,IAChB;AAEA,SAAQ,iBAAiB;AAEzB,SAAU,qBAAqB,MAAY;AACvC,UAAI,KAAK;AAAU;AACnB,WAAK,OAAO;AACZ,WAAK,iBAAiB;AAAA,IAC1B;AAEA,SAAU,qBAAqB,CAAC,UAA8B;AAC1D,UACI,SAAS,MAAM,iBACf,KAAK,SAAS,MAAM,aAAqB,KACzC,CAAC,GAAG,KAAK,QAAQ,EAAE,KAAK,CAAC,UAAU;AAC/B,YAAI,MAAM,cAAc,QAAQ;AAC5B,iBAAO;AAAA,QACX;AACA,eAAQ,MACH,iBAAiB,EAAE,SAAS,KAAK,CAAC,EAClC,KAAK,CAAC,OAAO;AACV,iBACI,OAAO,MAAM,iBACb,GAAG,SAAS,MAAM,aAAqB;AAAA,QAE/C,CAAC;AAAA,MACT,CAAC,GACH;AACE;AAAA,MACJ;AACA,WAAK,eAAe;AAAA,IACxB;AAEA,SAAU,4BAA4B,CAAC,UAA8B;AACjE,UACI,KAAK,mBAAmB,MAAM,iBAC7B,KAAK,wBACD,KAAK,eAA+B;AAAA,QACjC,MAAM;AAAA,MACV,GACN;AACE;AAAA,MACJ;AACA,WAAK,eAAe;AAAA,IACxB;AASA,SAAU,kBAAkB,MAAY;AACpC,WAAK,OAAO;AACZ,WAAK,iBACD,KAAK,mBAAmB,cAAc,YAAY;AAAA,IAC1D;AAiCA,SAAO,mBAAmB;AAAA;AAAA,EA5sB1B,IAAI,WAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,SAAS,UAAmB;AAC5B,SAAK,YAAY;AACjB,QAAI,UAAU;AACV,UAAI,KAAK,sBAAsB;AAC3B,aAAK,aAAa;AAAA,MACtB;AACA,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO;AAAA,IAChB,OAAO;AACH,WAAK,WAAW;AAChB,WAAK,OAAO,KAAK,QAAQ,KAAK;AAC9B,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EAYA,IAAY,uBAAgC;AACxC,WACI,CAAC,CAAC,KAAK,kBACP,EAAE,KAAK,0BAA0B;AAAA,EAEzC;AAAA,EAoBA,IAAa,OAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAa,KAAK,MAAe;AAE7B,QAAI,QAAQ,KAAK;AAAU;AAE3B,QAAI,SAAS,KAAK;AAAM;AAGxB,SACK,KAAK,mBAAmB,aACrB,KAAK,mBAAmB,cAC5B,CAAC;AAED;AACJ,SAAK,QAAQ;AACb,QAAI,KAAK,MAAM;AACX,eAAQ,aAAa;AAAA,IACzB;AACA,SAAK,cAAc,QAAQ,CAAC,KAAK,IAAI;AAAA,EACzC;AAAA,EAuBA,IAAa,QAAsB;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAa,MAAMA,QAAO;AACtB,QAAIA,WAAU,KAAK;AAAO;AAC1B,UAAM,WAAW,KAAK;AACtB,SAAK,SAASA;AACd,QAAI,KAAK,UAAU,YAAY,KAAK,UAAU,UAAU;AAKpD,WAAK,iBACD,KAAK,mBAAmB,YAClB,SACA,KAAK;AAAA,IACnB;AACA,SAAK,cAAc,SAAS,QAAQ;AAAA,EACxC;AAAA,EAmCA,IAAY,aAAsB;AAC9B,WAAO,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,IAAY,eAA8C;AACtD,UAAM,sBAAsB,aAAa;AACzC,QAAI,CAAC,qBAAqB;AACtB,aAAO;AAAA,IACX;AAEA,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO,KAAK;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,IAAc,mBAA4B;AAEtC,QAAI,KAAK,SAAS,UAAU,CAAC,KAAK;AAAM,aAAO;AAG/C,QAAI,CAAC,KAAK,kBAAmB,CAAC,KAAK,aAAa,KAAK,SAAS;AAC1D,aAAO;AACX,WAAO;AAAA,EACX;AAAA,EAEmB,iBAAuB;AACtC,QAAI,CAAC,KAAK,oBAAoB,CAAC,KAAK;AAAM;AAE1C,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,UAAU,KAAK;AACrB,UAAM,YAAa,KAAK,aAA2B;AACnD,UAAM,aAAa,KAAK;AAExB,SAAK,oBAAoB,aAAa,KAAK,UAAU;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EAEA,MAAyB,oBAAmC;AACxD,UAAM,kBAAkB;AACxB,UAAM,kBAAkB,KAAK;AAE7B,QAAI,KAAK,SAAS,iBAAiB;AAC/B;AAAA,IACJ;AACA,UAAM,KAAK,YAAY,eAAe;AACtC,QAAI,KAAK,SAAS,iBAAiB;AAC/B;AAAA,IACJ;AACA,UAAM,KAAK,YAAY,eAAe;AAEtC,QAAI,KAAK,SAAS,iBAAiB;AAC/B;AAAA,IACJ;AACA,UAAM,UAAU,MAAM,KAAK,eAAe,eAAe;AACzD,QAAI,KAAK,SAAS,iBAAiB;AAC/B;AAAA,IACJ;AACA,UAAM,KAAK,WAAW,iBAAiB,OAAO;AAAA,EAClD;AAAA,EAEA,MAAyB,WACrB,iBACA,SACa;AAGb,QAAI,KAAK,kBAAkB,WAAW,KAAK,SAAS,QAAQ;AACxD;AAAA,IACJ;AAEA,UAAM,UAAU;AAChB,UAAM,UAAU;AAChB,QAAI,oBAAoB,KAAK,QAAQ,CAAC,KAAK,MAAM;AAC7C,UACI,KAAK,wBACL,KAAK,SAAU,KAAK,YAAY,EAAe,aAAa,GAC9D;AACE,QAAC,KAAK,eAA+B,MAAM;AAAA,MAC/C;AACA;AAAA,IACJ;AACA,uCAAS;AAAA,EACb;AAAA,EAEA,MAAgB,WAAW,SAAiC;AApWhE;AAqWQ,QAAI,CAAC,KAAK,eAAe,KAAK;AAAM;AAEpC,QAAI,CAAC,KAAK,YAAY;AAClB,YAAM,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,MAAM;AACX,mBAAa,IAAI,IAAI;AACrB,UAAI,KAAK,kBAAkB;AACvB,iBAAS;AAAA,UACL;AAAA,UACA,MAAM;AACF,iBAAK,SAAS,UAAU;AAAA,cACpB;AAAA,cACA;AAAA,YACJ;AACA,iBAAK,mBAAmB;AAAA,UAC5B;AAAA,UACA,EAAE,MAAM,KAAK;AAAA,QACjB;AACA,aAAK,SAAS,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,UAAI,SAAS;AACT,aAAK,QAAQ;AAAA,MACjB;AACA,mBAAa,OAAO,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,QAAQ,KAAK,UAAU,UAAU;AACtC,WAAK,QAAQ;AAAA,IACjB,WAAW,CAAC,KAAK,QAAQ,KAAK,UAAU,UAAU;AAC9C,WAAK,QAAQ;AAAA,IACjB;AAEA,QAAI,KAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IAC1B,OAAO;AACH,WAAK,kBAAkB;AAAA,IAC3B;AACA,QAAI,CAAC,KAAK,MAAM;AAIZ,YAAM,eAAe,MAAqB;AAnZtD,YAAAC;AAoZgB,cAAM,YAA2B,CAAC;AAElC,YAAI,cAAc,SAAS;AAC3B,gBACI,2CAAa,eACb,YAAY,WAAW,eACzB;AACE,wBAAc,YAAY,WAAW;AAAA,QACzC;AACA,eAAO,aAAa;AAChB,gBAAM,WACF,YAAY,gBACZ,YAAY,mBACXA,MAAA,YAAY,YAAY,MAAxB,gBAAAA,IAA0C;AAC/C,cAAI,UAAU;AACV,sBAAU,KAAK,QAAuB;AAAA,UAC1C;AACA,wBAAc;AAAA,QAClB;AACA,eAAO;AAAA,MACX;AACA,YACK,UAAK,mBAAL,mBAAqC,WACrC,KAAK;AAAA,QACD,KAAK,YAAY,EAAe;AAAA,MACrC,KACI,aAAa,EAAE,SAAS,IAAI,IAClC;AACE,QAAC,KAAK,eAA+B,MAAM;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEU,eAAqB;AArbnC;AAsbQ,eAAK,oBAAL,mBAAsB;AAAA,EAC1B;AAAA,EAEU,aAAmB;AACzB,QAAI,CAAC,KAAK;AAAsB;AAChC,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,UAAM,qBAAqB,KAAK;AAChC,YAAQ,KAAK,oBAAoB;AAAA,MAC7B,KAAK;AACD,aAAK,gBAAgB,kBAAkB;AACvC;AAAA,MACJ,KAAK;AACD,aAAK,oBAAoB,kBAAkB;AAC3C;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,kBAAkB;AACvC;AAAA,IACR;AAAA,EACJ;AAAA,EAEU,gBAAgB,gBAAmC;AACzD,UAAM,UAAU,EAAE,QAAQ,KAAK,gBAAgB,OAAO;AACtD,mBAAe,iBAAiB,SAAS,KAAK,aAAa,OAAO;AAClE,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAAA,EAEU,oBAAoB,gBAAmC;AAC7D,UAAM,UAAU,EAAE,QAAQ,KAAK,gBAAgB,OAAO;AACtD,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,SAAK,4BAA4B,cAAc;AAC/C,QACK,eACI,gBACP;AAEE;AAAA,IACJ;AACA,mBAAe,iBAAiB,WAAW,KAAK,eAAe,OAAO;AACtE,mBAAe,iBAAiB,SAAS,KAAK,aAAa,OAAO;AAAA,EACtE;AAAA,EAEU,gBAAgB,gBAAmC;AACzD,UAAM,UAAU,EAAE,QAAQ,KAAK,gBAAgB,OAAO;AACtD,mBAAe,iBAAiB,WAAW,KAAK,eAAe,OAAO;AACtE,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,mBAAe;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,SAAK;AAAA,MACD;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACJ;AACA,QAAI,KAAK,kBAAkB;AAAQ;AAEnC,SAAK,uBAAuB,cAAc;AAAA,EAC9C;AAAA,EAEU,qBAAqB,gBAA0C;AACrE,QAAI,gBAAgB;AAChB,WAAK,aAAa;AAClB,WAAK,uBAAuB;AAAA,IAChC;AACA,UAAM,mBACF,CAAC,KAAK,kBACN,KAAK,0BAA0B;AACnC,QAAI,kBAAkB;AAClB;AAAA,IACJ;AACA,SAAK,WAAW;AAAA,EACpB;AAAA,EAIQ,4BAA4B,SAA4B;AAC5D;AAAA;AAAA,MAEI,KAAK,uBAAuB;AAAA,MAE5B,KAAK,gCAAgC;AAAA,MAErC,CAAC,KAAK,SAAS;AAAA,MACjB;AACE;AAAA,IACJ;AAEA,UAAM,uBAAuB,SAAS,cAAc,KAAK;AACzD,yBAAqB,KAAK,oCAAoC,OACzD,WAAW,EACX,MAAM,GAAG,CAAC;AACf,UAAM,cAAc,MAAM,KAAK,UAAU,IAAI,UAAU;AACvD,yBAAqB,cAAc,uBAAuB,WAAW;AACrE,yBAAqB,OAAO;AAC5B,YAAQ,sBAAsB,YAAY,oBAAoB;AAE9D,UAAM,8BAA8B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,CAAC,qBAAqB,EAAE;AAAA,IAC5B;AACA,SAAK,8BAA8B,MAAM;AACrC,kCAA4B;AAC5B,2BAAqB,OAAO;AAC5B,WAAK,8BAA8B;AAAA,IACvC;AAAA,EACJ;AAAA,EAEQ,uBAAuB,SAA4B;AACvD;AAAA;AAAA,MAEI,KAAK,uBAAuB;AAAA,MAE5B,KAAK,2BAA2B;AAAA,MAEhC,CAAC,KAAK,SAAS;AAAA,MACjB;AACE;AAAA,IACJ;AAEA,UAAM,cAAc,QAAQ,YAAY;AACxC,UAAM,cAAc,KAAK,SAAS,CAAC,EAAE,YAAY;AACjD,UAAM,cAAc,KAAK,YAAY;AACrC,QAAI,eAAe,aAAa;AAC5B,YAAM,yBAAyB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,CAAC,KAAK,EAAE;AAAA,MACZ;AACA,WAAK,yBAAyB,MAAM;AAChC,+BAAuB;AACvB,aAAK,yBAAyB;AAAA,MAClC;AAAA,IACJ,WAAW,gBAAgB,aAAa;AACpC,WAAK,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO,GAAG,EAAE;AACjD,YAAM,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO;AACzC,YAAI,CAAC,GAAG,IAAI;AACR,aAAG,KAAK,GAAG,KAAK,QAAQ,YAAY,YAAY,OAC3C,WAAW,EACX,MAAM,GAAG,CAAC;AAAA,QACnB;AACA,eAAO,GAAG;AAAA,MACd,CAAC;AACD,YAAM,yBAAyB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA,WAAK,yBAAyB,MAAM;AAChC,+BAAuB;AACvB,aAAK,SAAS,IAAI,CAAC,IAAI,UAAU;AAC7B,aAAG,KAAK,KAAK,WAAW,KAAK;AAAA,QACjC,CAAC;AACD,aAAK,yBAAyB;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA,EAmKU,iBAAuB;AAC7B,SAAK,iBAAiB;AACtB,UAAM,iBAAiB,KAAK;AAC5B,QAAI,KAAK,aAAa,eAAe,QAAQ,gBAAgB;AAAG;AAChE,SAAK,OAAO;AAAA,EAChB;AAAA,EAQU,mBAAmB,OAA2C;AACpE,QAAI,MAAM,aAAa,QAAQ;AAC3B,WAAK,mBAAmB;AAAA,IAC5B;AAAA,EACJ;AAAA,EAEU,qBAA2B;AACjC,QACI,KAAK,mBAAmB,aACxB,KAAK,mBAAmB,WAC1B;AACE,WAAK,OAAO;AACZ;AAAA,IACJ;AACA,SAAK,OAAO;AACZ,SAAK,WAAW,KAAK;AAAA,EACzB;AAAA,EAEU,mBAAyB;AAC/B,QAAI,KAAK,gBAAgB;AACrB,WAAK,uBAAuB,KAAK,cAA6B;AAAA,IAClE;AACA,QAAI,CAAC,KAAK,SAAS,QAAQ;AACvB,WAAK,4BAA4B;AAAA,IACrC,WAAW,KAAK,sBAAsB;AAClC,WAAK;AAAA,QACD,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAAA,EAIO,qBAA8B;AACjC,UAAM,qBAAqB,KAAK;AAChC,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACX;AAAA,EAES,WAAW,SAA+B;AAh0BvD;AAi0BQ,QAAI,CAAC,KAAK,YAAY;AAClB,WAAK,iBAAiB,YAAY,CAAC,UAAsB;AAErD,YAAI,KAAK,SAAS,QAAQ;AACtB;AAAA,QACJ;AAEA,YAAI,CAAC,MAAM,eAAe;AACtB;AAAA,QACJ;AACA,cAAM,gBAAgB,IAAI,MAAM,0BAA0B;AAAA,UACtD,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AACD,cAAM,cAAc;AAAA,UAChB,cAAc;AAAA,UACd,CAACC,WAAiB;AACd,gBAAI,CAACA,OAAM,aAAa,EAAE,SAAS,IAAI,GAAG;AACtC,mBAAK,OAAO;AAAA,YAChB;AAAA,UACJ;AAAA,QACJ;AACA,cAAM,cAAc,cAAc,aAAa;AAAA,MACnD,CAAC;AAAA,IACL;AACA,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC1B,WAAK;AAAA,QACD;AAAA,QACA,GAAG,KAAK,QAAQ,YAAY,KAAK,OAC5B,WAAW,EACX,MAAM,GAAG,CAAC;AAAA,MACnB;AAAA,IACJ;AACA,QACI,QAAQ,IAAI,MAAM,MACjB,OAAO,QAAQ,IAAI,MAAM,MAAM,eAAe,KAAK,OACtD;AACE,WAAK,WAAW,QAAQ,IAAI,MAAM,CAAC;AAAA,IACvC;AACA,QAAI,QAAQ,IAAI,SAAS,GAAG;AACxB,YAAM,CAAC,IAAI,WAAW,MAAI,UAAK,YAAL,mBAAc,MAAM,SAAQ,CAAC;AACvD,WAAK,gBAAgB,WAAW,KAAK,IAAI,OAAO;AAChD,WAAK,qBAAqB;AAAA,IAK9B;AACA,UAAM,aAAa,KAAK;AACxB,QAAI,QAAQ,IAAI,4BAA4B,GAAG;AAC3C,WAAK,iBAAiB,KAAK,gBAAgB;AAC3C,WAAK,qBAAqB,UAAU;AAAA,IACxC;AACA,QAAI,QAAQ,IAAI,gBAAgB,GAAG;AAC/B,WAAK,qBAAqB,QAAQ,IAAI,gBAAgB,CAAC;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEmB,QAAQ,SAA+B;AACtD,UAAM,QAAQ,OAAO;AACrB,QAAI,QAAQ,IAAI,WAAW,GAAG;AAC1B,UAAI,KAAK,WAAW;AAChB,aAAK,SAAS,aAAa,oBAAoB,KAAK,SAAS;AAAA,MACjE,OAAO;AACH,aAAK,SAAS,gBAAgB,kBAAkB;AAAA,MACpD;AACA,UAAI,KAAK,QAAQ,OAAO,QAAQ,IAAI,WAAW,MAAM,aAAa;AAC9D,aAAK,oBAAoB,qBAAqB;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEU,gBAAgC;AACtC,WAAO;AAAA,yBACU,SAAS,KAAK,cAAc;AAAA,oCACjB,KAAK;AAAA;AAAA;AAAA,EAGrC;AAAA,EAEA,IAAY,iBAA4B;AACpC,WAAO;AAAA,MACH,4BAA4B,SAAQ,UAAU,SAAS;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEU,eAA+B;AAUrC,WAAO;AAAA;AAAA;AAAA;AAAA,yBAIU,KAAK;AAAA,0BACJ,KAAK;AAAA,gCACC,KAAK;AAAA,8BACP,KAAK,UAAU;AAAA;AAAA,kBAE3B,KAAK,cAAc;AAAA;AAAA;AAAA,EAGjC;AAAA,EAEU,gBAAgC;AAUtC,WAAO;AAAA;AAAA;AAAA;AAAA,0BAIW,UAAU,KAAK,YAAY;AAAA,gCACrB,KAAK;AAAA,yBACZ,KAAK;AAAA,8BACA,KAAK,UAAU;AAAA;AAAA,kBAE3B,KAAK,cAAc;AAAA;AAAA;AAAA,EAGjC;AAAA,EAEgB,SAAyB;AACrC,UAAM,WAAW,KAAK,SAAS,WAAW,KAAK,SAAS;AACxD,WAAO;AAAA,cACD,WAAW,KAAK,aAAa,IAAI,KAAK,cAAc;AAAA;AAAA;AAAA,EAG9D;AAAA,EAES,oBAA0B;AAC/B,UAAM,kBAAkB;AACxB,SAAK,iBAAiB,SAAS,MAAM;AACjC,WAAK,OAAO;AAAA,IAChB,CAAC;AACD,QAAI,KAAK,sBAAsB;AAC3B,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAES,uBAA6B;AAClC,QAAI,KAAK,sBAAsB;AAC3B,WAAK,aAAa;AAAA,IACtB;AACA,SAAK,OAAO;AACZ,UAAM,qBAAqB;AAAA,EAC/B;AACJ;AA94BO,WAAM,UAAN;AAAM,QACO,SAAS,CAAC,MAAM;AADvB,QA0GF,YAAY;AA5FV;AAAA,EADR,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAblB,QAcA;AAGA;AAAA,EADR,MAAM,SAAS;AAAA,GAhBP,QAiBA;AASL;AAAA,EADH,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAzBlB,QA0BL;AAyBK;AAAA,EAJR,sBAAsB;AAAA,IACnB,SAAS;AAAA,IACT,UAAU;AAAA;AAAA,EACd,CAAC;AAAA,GAlDQ,QAmDA;AAwBT;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA1EjB,QA2ET;AAKa;AAAA,EADZ,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA/EjC,QAgFI;AAiCb;AAAA,EADC,SAAS;AAAA,GAhHD,QAiHT;AAGS;AAAA,EADR,SAAS,EAAE,WAAW,iBAAiB,CAAC;AAAA,GAnHhC,QAoHA;AAMT;AAAA,EADC,MAAM,MAAM;AAAA,GAzHJ,QA0HT;AAGa;AAAA,EADZ,MAAM;AAAA,GA5HE,QA6HI;AAwBb;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,cAAc,CAAC;AAAA,GApJ3C,QAqJT;AASA;AAAA,EADC,SAAS;AAAA,GA7JD,QA8JT;AAMS;AAAA,EADR,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAnKrB,QAoKA;AAMT;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAzKrB,QA0KT;AAGS;AAAA,EADR,SAAS;AAAA,GA5KD,QA6KA;",
6
+ "names": ["state", "_a", "event"]
7
7
  }
package/src/Overlay.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var T=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var o=(m,p,e,t)=>{for(var i=t>1?void 0:t?L(p,e):p,r=m.length-1,s;r>=0;r--)(s=m[r])&&(i=(t?s(p,e,i):s(i))||i);return t&&i&&T(p,e,i),i};import{html as c}from"@spectrum-web-components/base";import{property as a,query as v,queryAssignedElements as P,state as w}from"@spectrum-web-components/base/src/decorators.js";import{isAndroid as C,isIOS as D}from"@spectrum-web-components/shared/src/platform.js";import{ElementResolutionController as A,elementResolverUpdatedSymbol as N}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{conditionAttributeWithId as u}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ifDefined as M,styleMap as H}from"@spectrum-web-components/base/src/directives.js";import{AbstractOverlay as R,nextFrame as f}from"./AbstractOverlay.js";import{OverlayDialog as S}from"./OverlayDialog.js";import{OverlayPopover as k}from"./OverlayPopover.js";import{OverlayNoPopover as V}from"./OverlayNoPopover.js";import{overlayStack as b}from"./OverlayStack.js";import{noop as l}from"./AbstractOverlay.js";import{VirtualTrigger as E}from"./VirtualTrigger.js";import{PlacementController as I}from"./PlacementController.js";import $ from"./overlay.css.js";const O=300;export const LONGPRESS_INSTRUCTIONS={touch:"Double tap and long press for additional options",keyboard:"Press Space or Alt+Down Arrow for additional options",mouse:"Click and hold for additional options"};const F="showPopover"in document.createElement("div");let h=S(R);F?h=k(h):h=V(h);const g=class extends h{constructor(){super(...arguments);this.delayed=!1;this._disabled=!1;this.longpressed=!1;this.isVisible=!1;this.offset=6;this.placementController=new I(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=l;this.releaseLongpressDescribedby=l;this.triggerElement=null;this.type="hint";this.wasOpen=!1;this.elementResolver=new A(this);this.elementIds=[];this.handlePointerdown=e=>{if(!this.triggerElement||e.button!==0)return;const t=this.triggerElement;this.longpressed=!1,t.addEventListener("pointerup",this.handlePointerup),t.addEventListener("pointercancel",this.handlePointerup),this.longressTimeout=setTimeout(()=>{t&&t.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"pointer"}}))},O)};this.handlePointerup=()=>{if(clearTimeout(this.longressTimeout),!this.triggerElement)return;this.longpressed&&(this.open=!0),setTimeout(()=>{this.longpressed=!1});const e=this.triggerElement;e.removeEventListener("pointerup",this.handlePointerup),e.removeEventListener("pointercancel",this.handlePointerup)};this.handleKeydown=e=>{const{code:t,altKey:i}=e;(t==="Space"||i&&t==="ArrowDown")&&t==="ArrowDown"&&(e.stopPropagation(),e.stopImmediatePropagation())};this.handleKeyup=e=>{const{code:t,altKey:i}=e;(t==="Space"||i&&t==="ArrowDown")&&(e.stopPropagation(),this.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"keyboard"}})))};this.preventNextToggle=!1;this.handlePointerdownForClick=()=>{this.preventNextToggle=this.open};this.handleClick=()=>{this.longpressed||(this.preventNextToggle||(this.open=!this.open),this.preventNextToggle=!1)};this.focusedin=!1;this.handleFocusin=()=>{this.open=!0,this.focusedin=!0};this.handleFocusout=()=>{this.focusedin=!1,!this.pointerentered&&(this.open=!1)};this.pointerentered=!1;this.handlePointerenter=()=>{this.disabled||(this.open=!0,this.pointerentered=!0)};this.handlePointerleave=e=>{this===e.relatedTarget||this.contains(e.relatedTarget)||[...this.children].find(t=>t.localName!=="slot"?!1:t.assignedElements({flatten:!0}).find(i=>i===e.relatedTarget||i.contains(e.relatedTarget)))||this.doPointerleave()};this.handleOverlayPointerleave=e=>{this.triggerElement===e.relatedTarget||this.hasNonVirtualTrigger&&this.triggerElement.contains(e.relatedTarget)||this.doPointerleave()};this.handleLongpress=()=>{this.open=!0,this.longpressed=!0};this.willPreventClose=!1}get disabled(){return this._disabled}set disabled(e){this._disabled=e,e?(this.hasNonVirtualTrigger&&this.unbindEvents(),this.wasOpen=this.open,this.open=!1):(this.bindEvents(),this.open=this.open||this.wasOpen,this.wasOpen=!1)}get hasNonVirtualTrigger(){return!!this.triggerElement&&!(this.triggerElement instanceof E)}get open(){return this._open}set open(e){e&&this.disabled||e!==this.open&&(this._open=e,this.open&&(g.openCount+=1,this.isVisible=!0),this.requestUpdate("open",!this.open))}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,i=this.placement||"right",r=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:i,tipPadding:r,trigger:t,type:this.type})}async managePopoverOpen(){super.managePopoverOpen();const e=this.open;if(this.open!==e||(await this.manageDelay(e),this.open!==e)||(await this.ensureOnDOM(e),this.open!==e))return;const t=await this.makeTransition(e);this.open===e&&await this.applyFocus(e,t)}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await f(),await f(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}async manageOpen(e){var t;if(!(!this.isConnected&&this.open)&&(this.hasUpdated||await this.updateComplete,this.open?(b.add(this),this.willPreventClose&&(document.addEventListener("pointerup",()=>{this.dialogEl.classList.toggle("not-immediately-closable",!1),this.willPreventClose=!1},{once:!0}),this.dialogEl.classList.toggle("not-immediately-closable",!0))):(e&&this.dispose(),b.remove(this)),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),!this.open)){const i=()=>{var d;const r=[];let s=document.activeElement;for(;s!=null&&s.shadowRoot&&s.shadowRoot.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const n=s.assignedSlot||s.parentElement||((d=s.getRootNode())==null?void 0:d.host);n&&r.push(n),s=n}return r};(t=this.triggerElement)!=null&&t.focus&&(this.contains(this.getRootNode().activeElement)||i().includes(this))&&this.triggerElement.focus()}}unbindEvents(){var e;(e=this.abortController)==null||e.abort()}bindEvents(){if(!this.hasNonVirtualTrigger)return;this.abortController=new AbortController;const e=this.triggerElement;switch(this.triggerInteraction){case"click":this.bindClickEvents(e);return;case"longpress":this.bindLongpressEvents(e);return;case"hover":this.bindHoverEvents(e);return}}bindClickEvents(e){const t={signal:this.abortController.signal};e.addEventListener("click",this.handleClick,t),e.addEventListener("pointerdown",this.handlePointerdownForClick,t)}bindLongpressEvents(e){const t={signal:this.abortController.signal};e.addEventListener("pointerdown",this.handlePointerdown,t),e.addEventListener("keydown",this.handleKeydown,t),e.addEventListener("keyup",this.handleKeyup,t),e.addEventListener("longpress",this.handleLongpress,t),this.prepareLongpressDescription(e)}bindHoverEvents(e){const t={signal:this.abortController.signal};e.addEventListener("focusin",this.handleFocusin,t),e.addEventListener("focusout",this.handleFocusout,t),e.addEventListener("pointerenter",this.handlePointerenter,t),e.addEventListener("pointerleave",this.handlePointerleave,t),this.addEventListener("pointerleave",this.handleOverlayPointerleave,t),this.receivesFocus!=="true"&&this.prepareAriaDescribedby(e)}manageTriggerElement(e){e&&(this.unbindEvents(),this.releaseAriaDescribedby()),!(!this.triggerElement||this.triggerElement instanceof E)&&this.bindEvents()}prepareLongpressDescription(e){if(this.triggerInteraction!=="longpress"||this.releaseLongpressDescribedby!==l||!this.elements.length)return;const t=document.createElement("div");t.id=`longpress-describedby-descriptor-${crypto.randomUUID().slice(0,8)}`;const i=D()||C()?"touch":"keyboard";t.textContent=LONGPRESS_INSTRUCTIONS[i],t.slot="longpress-describedby-descriptor",e.insertAdjacentElement("afterend",t);const r=u(e,"aria-describedby",[t.id]);this.releaseLongpressDescribedby=()=>{r(),t.remove(),this.releaseLongpressDescribedby=l}}prepareAriaDescribedby(e){if(this.triggerInteraction!=="hover"||this.releaseAriaDescribedby!==l||!this.elements.length)return;const t=e.getRootNode(),i=this.elements[0].getRootNode(),r=this.getRootNode();if(t==r){const s=u(e,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{s(),this.releaseAriaDescribedby=l}}else if(t===i){this.elementIds=this.elements.map(n=>n.id);const s=this.elements.map(n=>(n.id||(n.id=`${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0,8)}`),n.id)),d=u(e,"aria-describedby",s);this.releaseAriaDescribedby=()=>{d(),this.elements.map((n,y)=>{n.id=this.elementIds[y]}),this.releaseAriaDescribedby=l}}}doPointerleave(){this.pointerentered=!1;const e=this.triggerElement;this.focusedin&&e.matches(":focus-visible")||(this.open=!1)}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose()}handleBrowserClose(){this.open=!1}handleSlotchange(){this.triggerElement&&this.prepareAriaDescribedby(this.triggerElement),this.elements.length?this.hasNonVirtualTrigger&&this.prepareLongpressDescription(this.triggerElement):this.releaseLongpressDescribedby()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}willUpdate(e){var i;if(this.hasUpdated||this.addEventListener("focusout",r=>{if(this.type!=="auto"||!r.relatedTarget)return;const s=new Event("overlay-relation-query",{bubbles:!0,composed:!0});r.relatedTarget.addEventListener(s.type,d=>{d.composedPath().includes(this)||(this.open=!1)}),r.relatedTarget.dispatchEvent(s)}),this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0,8)}`),e.has("open")&&(typeof e.get("open")!="undefined"||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[r,s]=((i=this.trigger)==null?void 0:i.split("@"))||[];this.elementResolver.selector=r?`#${r}`:"",this.triggerInteraction=s}const t=this.triggerElement;e.has(N)&&(this.triggerElement=this.elementResolver.element,this.manageTriggerElement(t)),e.has("triggerElement")&&this.manageTriggerElement(e.get("triggerElement"))}updated(e){super.updated(e),e.has("placement")&&(this.placement?this.dialogEl.setAttribute("actual-placement",this.placement):this.dialogEl.removeAttribute("actual-placement"),this.open&&typeof e.get("placement")!="undefined"&&this.placementController.resetOverlayPosition())}renderContent(){return c`
2
- <div style=${H(this.dialogStyleMap)} part="content">
1
+ "use strict";var T=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var o=(m,p,e,t)=>{for(var i=t>1?void 0:t?L(p,e):p,r=m.length-1,s;r>=0;r--)(s=m[r])&&(i=(t?s(p,e,i):s(i))||i);return t&&i&&T(p,e,i),i};import{html as c}from"@spectrum-web-components/base";import{property as a,query as v,queryAssignedElements as P,state as w}from"@spectrum-web-components/base/src/decorators.js";import{isAndroid as C,isIOS as S}from"@spectrum-web-components/shared/src/platform.js";import{ElementResolutionController as D,elementResolverUpdatedSymbol as A}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{conditionAttributeWithId as u}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ifDefined as M,styleMap as N}from"@spectrum-web-components/base/src/directives.js";import{AbstractOverlay as H,nextFrame as f}from"./AbstractOverlay.js";import{OverlayDialog as R}from"./OverlayDialog.js";import{OverlayPopover as k}from"./OverlayPopover.js";import{OverlayNoPopover as O}from"./OverlayNoPopover.js";import{overlayStack as b}from"./OverlayStack.js";import{noop as l}from"./AbstractOverlay.js";import{VirtualTrigger as E}from"./VirtualTrigger.js";import{PlacementController as I}from"./PlacementController.js";import $ from"./overlay.css.js";const V=300;export const LONGPRESS_INSTRUCTIONS={touch:"Double tap and long press for additional options",keyboard:"Press Space or Alt+Down Arrow for additional options",mouse:"Click and hold for additional options"};const F="showPopover"in document.createElement("div");let h=R(H);F?h=k(h):h=O(h);const g=class extends h{constructor(){super(...arguments);this.delayed=!1;this._disabled=!1;this.longpressState="null";this.offset=6;this.placementController=new I(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=l;this.releaseLongpressDescribedby=l;this._state="closed";this.triggerElement=null;this.type="hint";this.wasOpen=!1;this.elementResolver=new D(this);this.elementIds=[];this.handlePointerdown=e=>{if(!this.triggerElement||e.button!==0)return;const t=this.triggerElement;this.longpressState="potential",t.addEventListener("pointerup",this.handlePointerup),t.addEventListener("pointercancel",this.handlePointerup),!t.holdAffordance&&(this.longressTimeout=setTimeout(()=>{t&&t.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"pointer"}}))},V))};this.handlePointerup=()=>{if(clearTimeout(this.longressTimeout),!this.triggerElement)return;this.longpressState=this.state==="opening"?"pressed":"null";const e=this.triggerElement;e.removeEventListener("pointerup",this.handlePointerup),e.removeEventListener("pointercancel",this.handlePointerup)};this.handleKeydown=e=>{const{code:t,altKey:i}=e;(t==="Space"||i&&t==="ArrowDown")&&t==="ArrowDown"&&(e.stopPropagation(),e.stopImmediatePropagation())};this.handleKeyup=e=>{const{code:t,altKey:i}=e;if(t==="Space"||i&&t==="ArrowDown"){if(!this.triggerElement||!this.hasNonVirtualTrigger)return;e.stopPropagation(),this.triggerElement.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"keyboard"}})),setTimeout(()=>{this.longpressState="null"})}};this.preventNextToggle=!1;this.handlePointerdownForClick=()=>{this.preventNextToggle=this.open};this.handleClick=()=>{this.longpressState==="opening"||this.longpressState==="pressed"||(this.preventNextToggle||(this.open=!this.open),this.preventNextToggle=!1)};this.focusedin=!1;this.handleFocusin=()=>{this.open=!0,this.focusedin=!0};this.handleFocusout=()=>{this.focusedin=!1,!this.pointerentered&&(this.open=!1)};this.pointerentered=!1;this.handlePointerenter=()=>{this.disabled||(this.open=!0,this.pointerentered=!0)};this.handlePointerleave=e=>{this===e.relatedTarget||this.contains(e.relatedTarget)||[...this.children].find(t=>t.localName!=="slot"?!1:t.assignedElements({flatten:!0}).find(i=>i===e.relatedTarget||i.contains(e.relatedTarget)))||this.doPointerleave()};this.handleOverlayPointerleave=e=>{this.triggerElement===e.relatedTarget||this.hasNonVirtualTrigger&&this.triggerElement.contains(e.relatedTarget)||this.doPointerleave()};this.handleLongpress=()=>{this.open=!0,this.longpressState=this.longpressState==="potential"?"opening":"pressed"};this.willPreventClose=!1}get disabled(){return this._disabled}set disabled(e){this._disabled=e,e?(this.hasNonVirtualTrigger&&this.unbindEvents(),this.wasOpen=this.open,this.open=!1):(this.bindEvents(),this.open=this.open||this.wasOpen,this.wasOpen=!1)}get hasNonVirtualTrigger(){return!!this.triggerElement&&!(this.triggerElement instanceof E)}get open(){return this._open}set open(e){e&&this.disabled||e!==this.open&&((this.longpressState==="opening"||this.longpressState==="pressed")&&!e||(this._open=e,this.open&&(g.openCount+=1),this.requestUpdate("open",!this.open)))}get state(){return this._state}set state(e){if(e===this.state)return;const t=this.state;this._state=e,(this.state==="opened"||this.state==="closed")&&(this.longpressState=this.longpressState==="pressed"?"null":this.longpressState),this.requestUpdate("state",t)}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){if("popover"in this)switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,i=this.placement||"right",r=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:i,tipPadding:r,trigger:t,type:this.type})}async managePopoverOpen(){super.managePopoverOpen();const e=this.open;if(this.open!==e||(await this.manageDelay(e),this.open!==e)||(await this.ensureOnDOM(e),this.open!==e))return;const t=await this.makeTransition(e);this.open===e&&await this.applyFocus(e,t)}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await f(),await f(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}async manageOpen(e){var t;if(!(!this.isConnected&&this.open)&&(this.hasUpdated||await this.updateComplete,this.open?(b.add(this),this.willPreventClose&&(document.addEventListener("pointerup",()=>{this.dialogEl.classList.toggle("not-immediately-closable",!1),this.willPreventClose=!1},{once:!0}),this.dialogEl.classList.toggle("not-immediately-closable",!0))):(e&&this.dispose(),b.remove(this)),this.open&&this.state!=="opened"?this.state="opening":!this.open&&this.state!=="closed"&&(this.state="closing"),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),!this.open)){const i=()=>{var d;const r=[];let s=document.activeElement;for(;s!=null&&s.shadowRoot&&s.shadowRoot.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const n=s.assignedSlot||s.parentElement||((d=s.getRootNode())==null?void 0:d.host);n&&r.push(n),s=n}return r};(t=this.triggerElement)!=null&&t.focus&&(this.contains(this.getRootNode().activeElement)||i().includes(this))&&this.triggerElement.focus()}}unbindEvents(){var e;(e=this.abortController)==null||e.abort()}bindEvents(){if(!this.hasNonVirtualTrigger)return;this.abortController=new AbortController;const e=this.triggerElement;switch(this.triggerInteraction){case"click":this.bindClickEvents(e);return;case"longpress":this.bindLongpressEvents(e);return;case"hover":this.bindHoverEvents(e);return}}bindClickEvents(e){const t={signal:this.abortController.signal};e.addEventListener("click",this.handleClick,t),e.addEventListener("pointerdown",this.handlePointerdownForClick,t)}bindLongpressEvents(e){const t={signal:this.abortController.signal};e.addEventListener("longpress",this.handleLongpress,t),e.addEventListener("pointerdown",this.handlePointerdown,t),this.prepareLongpressDescription(e),!e.holdAffordance&&(e.addEventListener("keydown",this.handleKeydown,t),e.addEventListener("keyup",this.handleKeyup,t))}bindHoverEvents(e){const t={signal:this.abortController.signal};e.addEventListener("focusin",this.handleFocusin,t),e.addEventListener("focusout",this.handleFocusout,t),e.addEventListener("pointerenter",this.handlePointerenter,t),e.addEventListener("pointerleave",this.handlePointerleave,t),this.addEventListener("pointerleave",this.handleOverlayPointerleave,t),this.receivesFocus!=="true"&&this.prepareAriaDescribedby(e)}manageTriggerElement(e){e&&(this.unbindEvents(),this.releaseAriaDescribedby()),!(!this.triggerElement||this.triggerElement instanceof E)&&this.bindEvents()}prepareLongpressDescription(e){if(this.triggerInteraction!=="longpress"||this.releaseLongpressDescribedby!==l||!this.elements.length)return;const t=document.createElement("div");t.id=`longpress-describedby-descriptor-${crypto.randomUUID().slice(0,8)}`;const i=S()||C()?"touch":"keyboard";t.textContent=LONGPRESS_INSTRUCTIONS[i],t.slot="longpress-describedby-descriptor",e.insertAdjacentElement("afterend",t);const r=u(e,"aria-describedby",[t.id]);this.releaseLongpressDescribedby=()=>{r(),t.remove(),this.releaseLongpressDescribedby=l}}prepareAriaDescribedby(e){if(this.triggerInteraction!=="hover"||this.releaseAriaDescribedby!==l||!this.elements.length)return;const t=e.getRootNode(),i=this.elements[0].getRootNode(),r=this.getRootNode();if(t==r){const s=u(e,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{s(),this.releaseAriaDescribedby=l}}else if(t===i){this.elementIds=this.elements.map(n=>n.id);const s=this.elements.map(n=>(n.id||(n.id=`${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0,8)}`),n.id)),d=u(e,"aria-describedby",s);this.releaseAriaDescribedby=()=>{d(),this.elements.map((n,y)=>{n.id=this.elementIds[y]}),this.releaseAriaDescribedby=l}}}doPointerleave(){this.pointerentered=!1;const e=this.triggerElement;this.focusedin&&e.matches(":focus-visible")||(this.open=!1)}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose()}handleBrowserClose(){if(this.longpressState!=="opening"&&this.longpressState!=="pressed"){this.open=!1;return}this.open=!0,this.manageOpen(!1)}handleSlotchange(){this.triggerElement&&this.prepareAriaDescribedby(this.triggerElement),this.elements.length?this.hasNonVirtualTrigger&&this.prepareLongpressDescription(this.triggerElement):this.releaseLongpressDescribedby()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}willUpdate(e){var i;if(this.hasUpdated||this.addEventListener("focusout",r=>{if(this.type!=="auto"||!r.relatedTarget)return;const s=new Event("overlay-relation-query",{bubbles:!0,composed:!0});r.relatedTarget.addEventListener(s.type,d=>{d.composedPath().includes(this)||(this.open=!1)}),r.relatedTarget.dispatchEvent(s)}),this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0,8)}`),e.has("open")&&(typeof e.get("open")!="undefined"||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[r,s]=((i=this.trigger)==null?void 0:i.split("@"))||[];this.elementResolver.selector=r?`#${r}`:"",this.triggerInteraction=s}const t=this.triggerElement;e.has(A)&&(this.triggerElement=this.elementResolver.element,this.manageTriggerElement(t)),e.has("triggerElement")&&this.manageTriggerElement(e.get("triggerElement"))}updated(e){super.updated(e),e.has("placement")&&(this.placement?this.dialogEl.setAttribute("actual-placement",this.placement):this.dialogEl.removeAttribute("actual-placement"),this.open&&typeof e.get("placement")!="undefined"&&this.placementController.resetOverlayPosition())}renderContent(){return c`
2
+ <div style=${N(this.dialogStyleMap)} part="content">
3
3
  <slot @slotchange=${this.handleSlotchange}></slot>
4
4
  </div>
5
5
  `}get dialogStyleMap(){return{"--swc-overlay-open-count":g.openCount.toString()}}renderDialog(){return c`
@@ -9,23 +9,23 @@
9
9
  @close=${this.handleBrowserClose}
10
10
  @cancel=${this.handleBrowserClose}
11
11
  @beforetoggle=${this.handleBeforetoggle}
12
- ?is-visible=${this.isVisible}
12
+ ?is-visible=${this.state!=="closed"}
13
13
  >
14
14
  ${this.renderContent()}
15
15
  </dialog>
16
- `}renderPopover(){const t="popover"in this?this.popoverValue:void 0;return c`
16
+ `}renderPopover(){return c`
17
17
  <div
18
18
  class="dialog"
19
19
  part="dialog"
20
- popover=${M(t)}
20
+ popover=${M(this.popoverValue)}
21
21
  @beforetoggle=${this.handleBeforetoggle}
22
22
  @close=${this.handleBrowserClose}
23
- ?is-visible=${this.isVisible}
23
+ ?is-visible=${this.state!=="closed"}
24
24
  >
25
25
  ${this.renderContent()}
26
26
  </div>
27
27
  `}render(){const e=this.type==="modal"||this.type==="page";return c`
28
28
  ${e?this.renderDialog():this.renderPopover()}
29
29
  <slot name="longpress-describedby-descriptor"></slot>
30
- `}connectedCallback(){super.connectedCallback(),this.addEventListener("close",()=>{this.open=!1}),this.hasNonVirtualTrigger&&this.bindEvents()}disconnectedCallback(){this.hasNonVirtualTrigger&&this.unbindEvents(),this.open=!1,super.disconnectedCallback()}};export let Overlay=g;Overlay.styles=[$],Overlay.openCount=1,o([a({type:Boolean})],Overlay.prototype,"delayed",2),o([v(".dialog")],Overlay.prototype,"dialogEl",2),o([a({type:Boolean})],Overlay.prototype,"disabled",1),o([P({flatten:!0,selector:':not([slot="longpress-describedby-descriptor"])'})],Overlay.prototype,"elements",2),o([w()],Overlay.prototype,"isVisible",2),o([a({type:Number})],Overlay.prototype,"offset",2),o([a({type:Boolean,reflect:!0})],Overlay.prototype,"open",1),o([a()],Overlay.prototype,"placement",2),o([a({attribute:"receives-focus"})],Overlay.prototype,"receivesFocus",2),o([v("slot")],Overlay.prototype,"slotEl",2),o([a({type:Number,attribute:"tip-padding"})],Overlay.prototype,"tipPadding",2),o([a()],Overlay.prototype,"trigger",2),o([a({attribute:!1})],Overlay.prototype,"triggerElement",2),o([a({attribute:!1})],Overlay.prototype,"triggerInteraction",2),o([a()],Overlay.prototype,"type",2);
30
+ `}connectedCallback(){super.connectedCallback(),this.addEventListener("close",()=>{this.open=!1}),this.hasNonVirtualTrigger&&this.bindEvents()}disconnectedCallback(){this.hasNonVirtualTrigger&&this.unbindEvents(),this.open=!1,super.disconnectedCallback()}};export let Overlay=g;Overlay.styles=[$],Overlay.openCount=1,o([a({type:Boolean})],Overlay.prototype,"delayed",2),o([v(".dialog")],Overlay.prototype,"dialogEl",2),o([a({type:Boolean})],Overlay.prototype,"disabled",1),o([P({flatten:!0,selector:':not([slot="longpress-describedby-descriptor"])'})],Overlay.prototype,"elements",2),o([a({type:Number})],Overlay.prototype,"offset",2),o([a({type:Boolean,reflect:!0})],Overlay.prototype,"open",1),o([a()],Overlay.prototype,"placement",2),o([a({attribute:"receives-focus"})],Overlay.prototype,"receivesFocus",2),o([v("slot")],Overlay.prototype,"slotEl",2),o([w()],Overlay.prototype,"state",1),o([a({type:Number,attribute:"tip-padding"})],Overlay.prototype,"tipPadding",2),o([a()],Overlay.prototype,"trigger",2),o([a({attribute:!1})],Overlay.prototype,"triggerElement",2),o([a({attribute:!1})],Overlay.prototype,"triggerInteraction",2),o([a()],Overlay.prototype,"type",2);
31
31
  //# sourceMappingURL=Overlay.js.map