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

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 (91) hide show
  1. package/README.md +17 -8
  2. package/custom-elements.json +492 -305
  3. package/package.json +14 -13
  4. package/src/AbstractOverlay.d.ts +54 -0
  5. package/src/AbstractOverlay.dev.js +192 -0
  6. package/src/AbstractOverlay.dev.js.map +7 -0
  7. package/src/AbstractOverlay.js +2 -0
  8. package/src/AbstractOverlay.js.map +7 -0
  9. package/src/Overlay.d.ts +135 -19
  10. package/src/Overlay.dev.js +714 -69
  11. package/src/Overlay.dev.js.map +3 -3
  12. package/src/Overlay.js +30 -1
  13. package/src/Overlay.js.map +3 -3
  14. package/src/OverlayDialog.d.ts +3 -7
  15. package/src/OverlayDialog.dev.js +6 -34
  16. package/src/OverlayDialog.dev.js.map +2 -2
  17. package/src/OverlayDialog.js +1 -1
  18. package/src/OverlayDialog.js.map +3 -3
  19. package/src/OverlayNoPopover.d.ts +3 -7
  20. package/src/OverlayNoPopover.dev.js +7 -46
  21. package/src/OverlayNoPopover.dev.js.map +2 -2
  22. package/src/OverlayNoPopover.js +1 -1
  23. package/src/OverlayNoPopover.js.map +3 -3
  24. package/src/OverlayPopover.d.ts +3 -7
  25. package/src/OverlayPopover.dev.js +18 -49
  26. package/src/OverlayPopover.dev.js.map +2 -2
  27. package/src/OverlayPopover.js +1 -1
  28. package/src/OverlayPopover.js.map +3 -3
  29. package/src/OverlayStack.d.ts +9 -2
  30. package/src/OverlayStack.dev.js +16 -3
  31. package/src/OverlayStack.dev.js.map +2 -2
  32. package/src/OverlayStack.js +1 -1
  33. package/src/OverlayStack.js.map +3 -3
  34. package/src/OverlayTrigger.d.ts +6 -14
  35. package/src/OverlayTrigger.dev.js +0 -47
  36. package/src/OverlayTrigger.dev.js.map +2 -2
  37. package/src/OverlayTrigger.js +2 -2
  38. package/src/OverlayTrigger.js.map +3 -3
  39. package/src/PlacementController.d.ts +3 -1
  40. package/src/PlacementController.dev.js +10 -2
  41. package/src/PlacementController.dev.js.map +2 -2
  42. package/src/PlacementController.js +1 -1
  43. package/src/PlacementController.js.map +2 -2
  44. package/src/VirtualTrigger.dev.js +3 -0
  45. package/src/VirtualTrigger.dev.js.map +2 -2
  46. package/src/VirtualTrigger.js +1 -1
  47. package/src/VirtualTrigger.js.map +3 -3
  48. package/src/fullSizePlugin.dev.js.map +2 -2
  49. package/src/fullSizePlugin.js.map +2 -2
  50. package/src/loader.d.ts +1 -2
  51. package/src/overlay-timer.dev.js.map +2 -2
  52. package/src/overlay-timer.js.map +2 -2
  53. package/src/overlay-types.d.ts +18 -27
  54. package/src/overlay-types.dev.js.map +2 -2
  55. package/src/overlay-types.js.map +2 -2
  56. package/src/overlay.css.dev.js +9 -0
  57. package/src/overlay.css.dev.js.map +7 -0
  58. package/src/overlay.css.js +6 -0
  59. package/src/overlay.css.js.map +7 -0
  60. package/src/topLayerOverTransforms.d.ts +2 -23
  61. package/src/topLayerOverTransforms.dev.js +7 -91
  62. package/src/topLayerOverTransforms.dev.js.map +2 -2
  63. package/src/topLayerOverTransforms.js +1 -1
  64. package/src/topLayerOverTransforms.js.map +3 -3
  65. package/stories/overlay-element.stories.js +2 -6
  66. package/stories/overlay-element.stories.js.map +2 -2
  67. package/stories/overlay.stories.js +46 -15
  68. package/stories/overlay.stories.js.map +2 -2
  69. package/test/index.js +1 -1
  70. package/test/index.js.map +1 -1
  71. package/test/overlay-element.test.js +1 -2
  72. package/test/overlay-element.test.js.map +2 -2
  73. package/test/overlay-trigger-hover-click.test.js +1 -1
  74. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  75. package/test/overlay-trigger-hover.test.js +1 -1
  76. package/test/overlay-trigger-hover.test.js.map +2 -2
  77. package/test/overlay-v1.test.js +2 -11
  78. package/test/overlay-v1.test.js.map +2 -2
  79. package/test/{overlay-v2.test.js → overlay.test.js} +42 -8
  80. package/test/overlay.test.js.map +7 -0
  81. package/src/OverlayBase.d.ts +0 -124
  82. package/src/OverlayBase.dev.js +0 -744
  83. package/src/OverlayBase.dev.js.map +0 -7
  84. package/src/OverlayBase.js +0 -31
  85. package/src/OverlayBase.js.map +0 -7
  86. package/src/overlay-base.css.dev.js +0 -9
  87. package/src/overlay-base.css.dev.js.map +0 -7
  88. package/src/overlay-base.css.js +0 -6
  89. package/src/overlay-base.css.js.map +0 -7
  90. package/test/overlay-v2.test.js.map +0 -7
  91. /package/src/{overlay-base.css.d.ts → overlay.css.d.ts} +0 -0
@@ -3,37 +3,18 @@ import {
3
3
  firstFocusableIn,
4
4
  firstFocusableSlottedIn
5
5
  } from "@spectrum-web-components/shared/src/first-focusable-in.js";
6
+ import { VirtualTrigger } from "./VirtualTrigger.dev.js";
6
7
  import {
7
8
  BeforetoggleClosedEvent,
8
9
  BeforetoggleOpenEvent,
9
- guaranteedTransitionend,
10
+ guaranteedAllTransitionend,
11
+ nextFrame,
10
12
  overlayTimer
11
- } from "./OverlayBase.dev.js";
12
- import { VirtualTrigger } from "./VirtualTrigger.dev.js";
13
- function nextFrame() {
14
- return new Promise((res) => requestAnimationFrame(() => res()));
15
- }
13
+ } from "./AbstractOverlay.dev.js";
16
14
  export function OverlayNoPopover(constructor) {
17
15
  class OverlayWithNoPopover extends constructor {
18
16
  async managePopoverOpen() {
19
- const targetOpenState = this.open;
20
17
  await this.managePosition();
21
- if (this.open !== targetOpenState) {
22
- return;
23
- }
24
- await this.manageDelay(targetOpenState);
25
- if (this.open !== targetOpenState) {
26
- return;
27
- }
28
- await this.ensureOnDOM();
29
- if (this.open !== targetOpenState) {
30
- return;
31
- }
32
- const focusEl = await this.makeTransition(targetOpenState);
33
- if (this.open !== targetOpenState) {
34
- return;
35
- }
36
- await this.applyFocus(targetOpenState, focusEl);
37
18
  }
38
19
  async manageDelay(targetOpenState) {
39
20
  if (targetOpenState === false || targetOpenState !== this.open) {
@@ -47,7 +28,7 @@ export function OverlayNoPopover(constructor) {
47
28
  }
48
29
  }
49
30
  }
50
- async ensureOnDOM() {
31
+ async ensureOnDOM(_targetOpenState) {
51
32
  await nextFrame();
52
33
  await nextFrame();
53
34
  }
@@ -86,6 +67,7 @@ export function OverlayNoPopover(constructor) {
86
67
  return;
87
68
  }
88
69
  const eventName = targetOpenState ? "sp-opened" : "sp-closed";
70
+ this.isVisible = this.isVisible && targetOpenState;
89
71
  el.dispatchEvent(
90
72
  new CustomEvent(eventName, {
91
73
  bubbles: false,
@@ -114,7 +96,7 @@ export function OverlayNoPopover(constructor) {
114
96
  }
115
97
  };
116
98
  this.elements.forEach((el, index) => {
117
- guaranteedTransitionend(
99
+ guaranteedAllTransitionend(
118
100
  el,
119
101
  start(el, index),
120
102
  finish(el, index)
@@ -122,27 +104,6 @@ export function OverlayNoPopover(constructor) {
122
104
  });
123
105
  return focusEl;
124
106
  }
125
- async applyFocus(targetOpenState, focusEl) {
126
- if (this.receivesFocus === "false" || this.type === "hint") {
127
- return;
128
- }
129
- await nextFrame();
130
- await nextFrame();
131
- if (targetOpenState === this.open && !this.open) {
132
- if (
133
- // Only return focus when the trigger is not "virtual"
134
- this.triggerElement && !(this.triggerElement instanceof VirtualTrigger)
135
- ) {
136
- if (this.contains(
137
- this.getRootNode().activeElement
138
- )) {
139
- this.triggerElement.focus();
140
- }
141
- }
142
- return;
143
- }
144
- focusEl == null ? void 0 : focusEl.focus();
145
- }
146
107
  }
147
108
  return OverlayWithNoPopover;
148
109
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayNoPopover.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n overlayTimer,\n} from './OverlayBase.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { OverlayOpenCloseDetail } from './overlay-types.dev.js'\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayNoPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\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();\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 private async manageDelay(targetOpenState: boolean): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async ensureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private 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 // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithNoPopover;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport {\n Constructor,\n OpenableElement,\n OverlayOpenCloseDetail,\n} from './overlay-types.dev.js'\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedAllTransitionend,\n nextFrame,\n overlayTimer,\n} from './AbstractOverlay.dev.js'\nimport type { AbstractOverlay } from './AbstractOverlay.dev.js'\n\nexport function OverlayNoPopover<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n await this.managePosition();\n }\n\n protected override async manageDelay(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n protected override async ensureOnDOM(\n _targetOpenState: boolean\n ): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n protected override async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n this.isVisible = this.isVisible && targetOpenState;\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedAllTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n }\n return OverlayWithNoPopover;\n}\n"],
5
+ "mappings": ";AAWA;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEP,SAAS,sBAAsB;AAM/B;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAGA,gBAAS,iBACZ,aACgC;AAChC,QAAM,6BAA6B,YAAY;AAAA,IAC3C,MAAyB,oBAAmC;AACxD,YAAM,KAAK,eAAe;AAAA,IAC9B;AAAA,IAEA,MAAyB,YACrB,iBACa;AACb,UAAI,oBAAoB,SAAS,oBAAoB,KAAK,MAAM;AAC5D,qBAAa,MAAM,IAAI;AACvB;AAAA,MACJ;AACA,UAAI,KAAK,SAAS;AACd,cAAM,YAAY,MAAM,aAAa,UAAU,IAAI;AACnD,YAAI,WAAW;AACX,eAAK,OAAO,CAAC;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAAA,IAEA,MAAyB,YACrB,kBACa;AACb,YAAM,UAAU;AAChB,YAAM,UAAU;AAAA,IACpB;AAAA,IAEA,MAAyB,eACrB,iBAC2B;AAC3B,UAAI,KAAK,SAAS,iBAAiB;AAC/B,eAAO;AAAA,MACX;AACA,UAAI,UAAU;AACd,YAAM,QAAQ,CAAC,IAAqB,UAAkB,MAAY;AAC9D,YAAI,oBAAoB,KAAK,MAAM;AAC/B;AAAA,QACJ;AACA,YAAI,OAAO,GAAG,SAAS,aAAa;AAChC,aAAG,OAAO;AAAA,QACd;AACA,YAAI,UAAU,GAAG;AACb,gBAAM,QAAQ,kBACR,wBACA;AACN,eAAK,cAAc,IAAI,MAAM,CAAC;AAAA,QAClC;AACA,YAAI,oBAAoB,MAAM;AAC1B;AAAA,QACJ;AACA,kBAAU,WAAW,iBAAiB,EAAE;AACxC,YAAI,SAAS;AACT;AAAA,QACJ;AACA,cAAM,aAAa,GAAG,iBAAiB,MAAM;AAC7C,mBAAW,QAAQ,CAAC,SAAS;AACzB,cAAI,CAAC,SAAS;AACV,sBAAU,wBAAwB,IAAI;AAAA,UAC1C;AAAA,QACJ,CAAC;AAAA,MACL;AACA,YAAM,SAAS,CAAC,IAAqB,UAAkB,MAAY;AAC/D,YAAI,KAAK,SAAS,iBAAiB;AAC/B;AAAA,QACJ;AACA,cAAM,YAAY,kBAAkB,cAAc;AAClD,aAAK,YAAY,KAAK,aAAa;AACnC,WAAG;AAAA,UACC,IAAI,YAAoC,WAAW;AAAA,YAC/C,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ,EAAE,aAAa,KAAK,KAAK;AAAA,UACrC,CAAC;AAAA,QACL;AACA,YAAI,QAAQ,GAAG;AACX;AAAA,QACJ;AACA,cAAM,oBACF,KAAK,0BAA0B;AACnC,aAAK;AAAA,UACD,IAAI,MAAM,WAAW;AAAA,YACjB,SAAS;AAAA,YACT,UAAU;AAAA,UACd,CAAC;AAAA,QACL;AACA,YAAI,KAAK,kBAAkB,CAAC,mBAAmB;AAC3C,UAAC,KAAK,eAA+B;AAAA,YACjC,IAAI,YAAoC,WAAW;AAAA,cAC/C,SAAS;AAAA,cACT,UAAU;AAAA,cACV,QAAQ,EAAE,aAAa,KAAK,KAAK;AAAA,YACrC,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AACA,WAAK,SAAS,QAAQ,CAAC,IAAI,UAAU;AACjC;AAAA,UACI;AAAA,UACA,MAAM,IAAI,KAAK;AAAA,UACf,OAAO,IAAI,KAAK;AAAA,QACpB;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";import{firstFocusableIn as h,firstFocusableSlottedIn as f}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{BeforetoggleClosedEvent as v,BeforetoggleOpenEvent as d,guaranteedTransitionend as y,overlayTimer as l}from"./OverlayBase.js";import{VirtualTrigger as c}from"./VirtualTrigger.js";function r(){return new Promise(a=>requestAnimationFrame(()=>a()))}export function OverlayNoPopover(a){class m extends a{async managePopoverOpen(){const e=this.open;if(await this.managePosition(),this.open!==e||(await this.manageDelay(e),this.open!==e)||(await this.ensureOnDOM(),this.open!==e))return;const t=await this.makeTransition(e);this.open===e&&await this.applyFocus(e,t)}async manageDelay(e){if(e===!1||e!==this.open){l.close(this);return}this.delayed&&await l.openTimer(this)&&(this.open=!e)}async ensureOnDOM(){await r(),await r()}async makeTransition(e){if(this.open!==e)return null;let t=null;const p=(i,o)=>()=>{if(e!==this.open)return;if(typeof i.open!="undefined"&&(i.open=e),o===0){const n=e?d:v;this.dispatchEvent(new n)}if(e!==!0||(t=t||h(i),t))return;i.querySelectorAll("slot").forEach(n=>{t||(t=f(n))})},u=(i,o)=>()=>{if(this.open!==e)return;const s=e?"sp-opened":"sp-closed";if(i.dispatchEvent(new CustomEvent(s,{bubbles:!1,composed:!1,detail:{interaction:this.type}})),o>0)return;const n=this.triggerElement instanceof c;this.dispatchEvent(new Event(s,{bubbles:n,composed:n})),this.triggerElement&&!n&&this.triggerElement.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};return this.elements.forEach((i,o)=>{y(i,p(i,o),u(i,o))}),t}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await r(),await r(),e===this.open&&!this.open){this.triggerElement&&!(this.triggerElement instanceof c)&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}}return m}
1
+ "use strict";import{firstFocusableIn as p,firstFocusableSlottedIn as u}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{VirtualTrigger as f}from"./VirtualTrigger.js";import{BeforetoggleClosedEvent as v,BeforetoggleOpenEvent as h,guaranteedAllTransitionend as b,nextFrame as s,overlayTimer as l}from"./AbstractOverlay.js";export function OverlayNoPopover(a){class c extends a{async managePopoverOpen(){await this.managePosition()}async manageDelay(e){if(e===!1||e!==this.open){l.close(this);return}this.delayed&&await l.openTimer(this)&&(this.open=!e)}async ensureOnDOM(e){await s(),await s()}async makeTransition(e){if(this.open!==e)return null;let o=null;const m=(t,n)=>()=>{if(e!==this.open)return;if(typeof t.open!="undefined"&&(t.open=e),n===0){const i=e?h:v;this.dispatchEvent(new i)}if(e!==!0||(o=o||p(t),o))return;t.querySelectorAll("slot").forEach(i=>{o||(o=u(i))})},d=(t,n)=>()=>{if(this.open!==e)return;const r=e?"sp-opened":"sp-closed";if(this.isVisible=this.isVisible&&e,t.dispatchEvent(new CustomEvent(r,{bubbles:!1,composed:!1,detail:{interaction:this.type}})),n>0)return;const i=this.triggerElement instanceof f;this.dispatchEvent(new Event(r,{bubbles:i,composed:i})),this.triggerElement&&!i&&this.triggerElement.dispatchEvent(new CustomEvent(r,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};return this.elements.forEach((t,n)=>{b(t,m(t,n),d(t,n))}),o}}return c}
2
2
  //# sourceMappingURL=OverlayNoPopover.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayNoPopover.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n overlayTimer,\n} from './OverlayBase.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { OverlayOpenCloseDetail } from './overlay-types.js';\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayNoPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\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();\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 private async manageDelay(targetOpenState: boolean): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async ensureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private 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 // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithNoPopover;\n}\n"],
5
- "mappings": "aAWA,OACI,oBAAAA,EACA,2BAAAC,MACG,4DAEP,OACI,2BAAAC,EACA,yBAAAC,EACA,2BAAAC,EAGA,gBAAAC,MACG,mBACP,OAAS,kBAAAC,MAAsB,sBAS/B,SAASC,GAA2B,CAChC,OAAO,IAAI,QAASC,GAAQ,sBAAsB,IAAMA,EAAI,CAAC,CAAC,CAClE,CAEO,gBAAS,iBACZC,EACgC,CAChC,MAAMC,UAA6BD,CAAY,CAC3C,MAAyB,mBAAmC,CACxD,MAAME,EAAkB,KAAK,KAU7B,GATA,MAAM,KAAK,eAAe,EACtB,KAAK,OAASA,IAGlB,MAAM,KAAK,YAAYA,CAAe,EAClC,KAAK,OAASA,KAGlB,MAAM,KAAK,YAAY,EACnB,KAAK,OAASA,GACd,OAEJ,MAAMC,EAAU,MAAM,KAAK,eAAeD,CAAe,EACrD,KAAK,OAASA,GAGlB,MAAM,KAAK,WAAWA,EAAiBC,CAAO,CAClD,CAEA,MAAc,YAAYD,EAAyC,CAC/D,GAAIA,IAAoB,IAASA,IAAoB,KAAK,KAAM,CAC5DN,EAAa,MAAM,IAAI,EACvB,OAEA,KAAK,SACa,MAAMA,EAAa,UAAU,IAAI,IAE/C,KAAK,KAAO,CAACM,EAGzB,CAEA,MAAc,aAA6B,CACvC,MAAMJ,EAAU,EAChB,MAAMA,EAAU,CACpB,CAEA,MAAc,eACVI,EAC2B,CAC3B,GAAI,KAAK,OAASA,EACd,OAAO,KAEX,IAAIC,EAAU,KACd,MAAMC,EAAQ,CAACC,EAAqBC,IAAkB,IAAY,CAC9D,GAAIJ,IAAoB,KAAK,KACzB,OAKJ,GAHI,OAAOG,EAAG,MAAS,cACnBA,EAAG,KAAOH,GAEVI,IAAU,EAAG,CACb,MAAMC,EAAQL,EACRR,EACAD,EACN,KAAK,cAAc,IAAIc,CAAO,EAMlC,GAJIL,IAAoB,KAGxBC,EAAUA,GAAWZ,EAAiBc,CAAE,EACpCF,GACA,OAEeE,EAAG,iBAAiB,MAAM,EAClC,QAASG,GAAS,CACpBL,IACDA,EAAUX,EAAwBgB,CAAI,EAE9C,CAAC,CACL,EACMC,EAAS,CAACJ,EAAqBC,IAAkB,IAAY,CAC/D,GAAI,KAAK,OAASJ,EACd,OAEJ,MAAMQ,EAAYR,EAAkB,YAAc,YAQlD,GAPAG,EAAG,cACC,IAAI,YAAoCK,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,EACIJ,EAAQ,EACR,OAEJ,MAAMK,EACF,KAAK,0BAA0Bd,EACnC,KAAK,cACD,IAAI,MAAMa,EAAW,CACjB,QAASC,EACT,SAAUA,CACd,CAAC,CACL,EACI,KAAK,gBAAkB,CAACA,GACvB,KAAK,eAA+B,cACjC,IAAI,YAAoCD,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,CAER,EACA,YAAK,SAAS,QAAQ,CAACL,EAAIC,IAAU,CACjCX,EACIU,EACAD,EAAMC,EAAIC,CAAK,EACfG,EAAOJ,EAAIC,CAAK,CACpB,CACJ,CAAC,EACMH,CACX,CAEA,MAAc,WACVD,EACAC,EACa,CAGb,GAAI,OAAK,gBAAkB,SAAW,KAAK,OAAS,QAMpD,IAFA,MAAML,EAAU,EAChB,MAAMA,EAAU,EACZI,IAAoB,KAAK,MAAQ,CAAC,KAAK,KAAM,CAGzC,KAAK,gBACL,EAAE,KAAK,0BAA0BL,IAG7B,KAAK,SACA,KAAK,YAAY,EAAe,aACrC,GAEA,KAAK,eAAe,MAAM,EAGlC,OAGJM,GAAA,MAAAA,EAAS,QACb,CACJ,CACA,OAAOF,CACX",
6
- "names": ["firstFocusableIn", "firstFocusableSlottedIn", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedTransitionend", "overlayTimer", "VirtualTrigger", "nextFrame", "res", "constructor", "OverlayWithNoPopover", "targetOpenState", "focusEl", "start", "el", "index", "event", "slot", "finish", "eventName", "hasVirtualTrigger"]
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport {\n Constructor,\n OpenableElement,\n OverlayOpenCloseDetail,\n} from './overlay-types.js';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedAllTransitionend,\n nextFrame,\n overlayTimer,\n} from './AbstractOverlay.js';\nimport type { AbstractOverlay } from './AbstractOverlay.js';\n\nexport function OverlayNoPopover<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n await this.managePosition();\n }\n\n protected override async manageDelay(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n protected override async ensureOnDOM(\n _targetOpenState: boolean\n ): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n protected override async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n this.isVisible = this.isVisible && targetOpenState;\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedAllTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n }\n return OverlayWithNoPopover;\n}\n"],
5
+ "mappings": "aAWA,OACI,oBAAAA,EACA,2BAAAC,MACG,4DAEP,OAAS,kBAAAC,MAAsB,sBAM/B,OACI,2BAAAC,EACA,yBAAAC,EACA,8BAAAC,EACA,aAAAC,EACA,gBAAAC,MACG,uBAGA,gBAAS,iBACZC,EACgC,CAChC,MAAMC,UAA6BD,CAAY,CAC3C,MAAyB,mBAAmC,CACxD,MAAM,KAAK,eAAe,CAC9B,CAEA,MAAyB,YACrBE,EACa,CACb,GAAIA,IAAoB,IAASA,IAAoB,KAAK,KAAM,CAC5DH,EAAa,MAAM,IAAI,EACvB,OAEA,KAAK,SACa,MAAMA,EAAa,UAAU,IAAI,IAE/C,KAAK,KAAO,CAACG,EAGzB,CAEA,MAAyB,YACrBC,EACa,CACb,MAAML,EAAU,EAChB,MAAMA,EAAU,CACpB,CAEA,MAAyB,eACrBI,EAC2B,CAC3B,GAAI,KAAK,OAASA,EACd,OAAO,KAEX,IAAIE,EAAU,KACd,MAAMC,EAAQ,CAACC,EAAqBC,IAAkB,IAAY,CAC9D,GAAIL,IAAoB,KAAK,KACzB,OAKJ,GAHI,OAAOI,EAAG,MAAS,cACnBA,EAAG,KAAOJ,GAEVK,IAAU,EAAG,CACb,MAAMC,EAAQN,EACRN,EACAD,EACN,KAAK,cAAc,IAAIa,CAAO,EAMlC,GAJIN,IAAoB,KAGxBE,EAAUA,GAAWZ,EAAiBc,CAAE,EACpCF,GACA,OAEeE,EAAG,iBAAiB,MAAM,EAClC,QAASG,GAAS,CACpBL,IACDA,EAAUX,EAAwBgB,CAAI,EAE9C,CAAC,CACL,EACMC,EAAS,CAACJ,EAAqBC,IAAkB,IAAY,CAC/D,GAAI,KAAK,OAASL,EACd,OAEJ,MAAMS,EAAYT,EAAkB,YAAc,YASlD,GARA,KAAK,UAAY,KAAK,WAAaA,EACnCI,EAAG,cACC,IAAI,YAAoCK,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,EACIJ,EAAQ,EACR,OAEJ,MAAMK,EACF,KAAK,0BAA0BlB,EACnC,KAAK,cACD,IAAI,MAAMiB,EAAW,CACjB,QAASC,EACT,SAAUA,CACd,CAAC,CACL,EACI,KAAK,gBAAkB,CAACA,GACvB,KAAK,eAA+B,cACjC,IAAI,YAAoCD,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,CAER,EACA,YAAK,SAAS,QAAQ,CAACL,EAAIC,IAAU,CACjCV,EACIS,EACAD,EAAMC,EAAIC,CAAK,EACfG,EAAOJ,EAAIC,CAAK,CACpB,CACJ,CAAC,EACMH,CACX,CACJ,CACA,OAAOH,CACX",
6
+ "names": ["firstFocusableIn", "firstFocusableSlottedIn", "VirtualTrigger", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedAllTransitionend", "nextFrame", "overlayTimer", "constructor", "OverlayWithNoPopover", "targetOpenState", "_targetOpenState", "focusEl", "start", "el", "index", "event", "slot", "finish", "eventName", "hasVirtualTrigger"]
7
7
  }
@@ -1,8 +1,4 @@
1
1
  import { ReactiveElement } from 'lit';
2
- import { OverlayBase } from './OverlayBase.js';
3
- declare type Constructor<T = Record<string, unknown>> = {
4
- new (...args: any[]): T;
5
- prototype: T;
6
- };
7
- export declare function OverlayPopover<T extends Constructor<OverlayBase>>(constructor: T): T & Constructor<ReactiveElement>;
8
- export {};
2
+ import { Constructor } from './overlay-types.js';
3
+ import type { AbstractOverlay } from './AbstractOverlay.js';
4
+ export declare function OverlayPopover<T extends Constructor<AbstractOverlay>>(constructor: T): T & Constructor<ReactiveElement>;
@@ -3,37 +3,16 @@ import {
3
3
  firstFocusableIn,
4
4
  firstFocusableSlottedIn
5
5
  } from "@spectrum-web-components/shared/src/first-focusable-in.js";
6
+ import { VirtualTrigger } from "./VirtualTrigger.dev.js";
6
7
  import {
7
8
  BeforetoggleClosedEvent,
8
9
  BeforetoggleOpenEvent,
9
- guaranteedTransitionend,
10
+ guaranteedAllTransitionend,
11
+ nextFrame,
10
12
  overlayTimer
11
- } from "./OverlayBase.dev.js";
12
- import { VirtualTrigger } from "./VirtualTrigger.dev.js";
13
- function nextFrame() {
14
- return new Promise((res) => requestAnimationFrame(() => res()));
15
- }
13
+ } from "./AbstractOverlay.dev.js";
16
14
  export function OverlayPopover(constructor) {
17
15
  class OverlayWithPopover extends constructor {
18
- async managePopoverOpen() {
19
- const targetOpenState = this.open;
20
- if (this.open !== targetOpenState) {
21
- return;
22
- }
23
- await this.manageDelay(targetOpenState);
24
- if (this.open !== targetOpenState) {
25
- return;
26
- }
27
- await this.ensureOnDOM(targetOpenState);
28
- if (this.open !== targetOpenState) {
29
- return;
30
- }
31
- const focusEl = await this.makeTransition(targetOpenState);
32
- if (this.open !== targetOpenState) {
33
- return;
34
- }
35
- await this.applyFocus(targetOpenState, focusEl);
36
- }
37
16
  async manageDelay(targetOpenState) {
38
17
  if (targetOpenState === false || targetOpenState !== this.open) {
39
18
  overlayTimer.close(this);
@@ -46,8 +25,13 @@ export function OverlayPopover(constructor) {
46
25
  }
47
26
  }
48
27
  }
49
- async ensureOnDOM(targetOpenState) {
50
- await nextFrame();
28
+ async shouldHidePopover(targetOpenState) {
29
+ if (targetOpenState && this.open !== targetOpenState) {
30
+ return;
31
+ }
32
+ await this.placementController.resetOverlayPosition();
33
+ }
34
+ async shouldShowPopover(targetOpenState) {
51
35
  let popoverOpen = false;
52
36
  try {
53
37
  popoverOpen = this.dialogEl.matches(":popover-open");
@@ -62,6 +46,11 @@ export function OverlayPopover(constructor) {
62
46
  this.dialogEl.showPopover();
63
47
  await this.managePosition();
64
48
  }
49
+ }
50
+ async ensureOnDOM(targetOpenState) {
51
+ await nextFrame();
52
+ await this.shouldHidePopover(targetOpenState);
53
+ await this.shouldShowPopover(targetOpenState);
65
54
  await nextFrame();
66
55
  }
67
56
  async makeTransition(targetOpenState) {
@@ -96,6 +85,7 @@ export function OverlayPopover(constructor) {
96
85
  return;
97
86
  }
98
87
  const eventName = targetOpenState ? "sp-opened" : "sp-closed";
88
+ this.isVisible = this.isVisible && targetOpenState;
99
89
  if (index > 0) {
100
90
  el.dispatchEvent(
101
91
  new CustomEvent(eventName, {
@@ -164,7 +154,7 @@ export function OverlayPopover(constructor) {
164
154
  }
165
155
  };
166
156
  this.elements.forEach((el, index) => {
167
- guaranteedTransitionend(
157
+ guaranteedAllTransitionend(
168
158
  el,
169
159
  start(el, index),
170
160
  finish(el, index)
@@ -172,27 +162,6 @@ export function OverlayPopover(constructor) {
172
162
  });
173
163
  return focusEl;
174
164
  }
175
- async applyFocus(targetOpenState, focusEl) {
176
- if (this.receivesFocus === "false" || this.type === "hint") {
177
- return;
178
- }
179
- await nextFrame();
180
- await nextFrame();
181
- if (targetOpenState === this.open && !this.open) {
182
- if (
183
- // Only return focus when the trigger is not "virtual"
184
- this.triggerElement && !(this.triggerElement instanceof VirtualTrigger)
185
- ) {
186
- if (this.contains(
187
- this.getRootNode().activeElement
188
- )) {
189
- this.triggerElement.focus();
190
- }
191
- }
192
- return;
193
- }
194
- focusEl == null ? void 0 : focusEl.focus();
195
- }
196
165
  }
197
166
  return OverlayWithPopover;
198
167
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayPopover.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n overlayTimer,\n} from './OverlayBase.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { OverlayOpenCloseDetail } from './overlay-types.dev.js'\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\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 private async manageDelay(targetOpenState: boolean): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async ensureOnDOM(targetOpenState: boolean): Promise<void> {\n await nextFrame();\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n await this.managePosition();\n }\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n if (index > 0) {\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(\n eventName,\n {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n }\n )\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private 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 // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithPopover;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport {\n Constructor,\n OpenableElement,\n OverlayOpenCloseDetail,\n} from './overlay-types.dev.js'\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedAllTransitionend,\n nextFrame,\n overlayTimer,\n} from './AbstractOverlay.dev.js'\nimport type { AbstractOverlay } from './AbstractOverlay.dev.js'\n\nexport function OverlayPopover<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async manageDelay(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async shouldHidePopover(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState && this.open !== targetOpenState) {\n return;\n }\n // When in a parent Overlay, this Overlay may need to position itself\n // while closing in due to the parent _also_ closing which means the\n // location can no longer rely on \"top layer over transform\" math.\n await this.placementController.resetOverlayPosition();\n }\n\n private async shouldShowPopover(\n targetOpenState: boolean\n ): Promise<void> {\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n await this.managePosition();\n }\n }\n\n protected override async ensureOnDOM(\n targetOpenState: boolean\n ): Promise<void> {\n await nextFrame();\n await this.shouldHidePopover(targetOpenState);\n await this.shouldShowPopover(targetOpenState);\n await nextFrame();\n }\n\n protected override async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n this.isVisible = this.isVisible && targetOpenState;\n if (index > 0) {\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(\n eventName,\n {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n }\n )\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedAllTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n }\n return OverlayWithPopover;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";import{firstFocusableIn as v,firstFocusableSlottedIn as E}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{BeforetoggleClosedEvent as y,BeforetoggleOpenEvent as g,guaranteedTransitionend as b,overlayTimer as u}from"./OverlayBase.js";import{VirtualTrigger as f}from"./VirtualTrigger.js";function a(){return new Promise(c=>requestAnimationFrame(()=>c()))}export function OverlayPopover(c){class d extends c{async 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 manageDelay(e){if(e===!1||e!==this.open){u.close(this);return}this.delayed&&await u.openTimer(this)&&(this.open=!e)}async ensureOnDOM(e){await a();let t=!1;try{t=this.dialogEl.matches(":popover-open")}catch(p){}let l=!1;try{l=this.dialogEl.matches(":open")}catch(p){}e&&this.open===e&&!t&&!l&&this.isConnected&&(this.dialogEl.showPopover(),await this.managePosition()),await a()}async makeTransition(e){if(this.open!==e)return null;let t=null;const l=(i,o)=>()=>{if(typeof i.open!="undefined"&&(i.open=e),o===0){const n=e?g:y;this.dispatchEvent(new n)}if(!e||(t=t||v(i),t))return;i.querySelectorAll("slot").forEach(n=>{t||(t=E(n))})},p=(i,o)=>async()=>{if(this.open!==e)return;const s=e?"sp-opened":"sp-closed";if(o>0){i.dispatchEvent(new CustomEvent(s,{bubbles:!1,composed:!1,detail:{interaction:this.type}}));return}const n=async()=>{if(this.open!==e)return;await a();const r=this.triggerElement instanceof f;this.dispatchEvent(new Event(s,{bubbles:r,composed:r})),i.dispatchEvent(new Event(s,{bubbles:!1,composed:!1})),this.triggerElement&&!r&&this.triggerElement.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};if(this.open!==e)return;let h=!1;try{h=this.dialogEl.matches(":popover-open")}catch(r){}let m=!1;try{m=this.dialogEl.matches(":open")}catch(r){}e!==!0&&(h||m)&&this.isConnected?(this.dialogEl.addEventListener("beforetoggle",()=>{n()},{once:!0}),this.dialogEl.hidePopover()):n()};return this.elements.forEach((i,o)=>{b(i,l(i,o),p(i,o))}),t}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await a(),await a(),e===this.open&&!this.open){this.triggerElement&&!(this.triggerElement instanceof f)&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}}return d}
1
+ "use strict";import{firstFocusableIn as f,firstFocusableSlottedIn as u}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{VirtualTrigger as E}from"./VirtualTrigger.js";import{BeforetoggleClosedEvent as b,BeforetoggleOpenEvent as y,guaranteedAllTransitionend as P,nextFrame as c,overlayTimer as d}from"./AbstractOverlay.js";export function OverlayPopover(m){class v extends m{async manageDelay(e){if(e===!1||e!==this.open){d.close(this);return}this.delayed&&await d.openTimer(this)&&(this.open=!e)}async shouldHidePopover(e){e&&this.open!==e||await this.placementController.resetOverlayPosition()}async shouldShowPopover(e){let i=!1;try{i=this.dialogEl.matches(":popover-open")}catch(a){}let l=!1;try{l=this.dialogEl.matches(":open")}catch(a){}e&&this.open===e&&!i&&!l&&this.isConnected&&(this.dialogEl.showPopover(),await this.managePosition())}async ensureOnDOM(e){await c(),await this.shouldHidePopover(e),await this.shouldShowPopover(e),await c()}async makeTransition(e){if(this.open!==e)return null;let i=null;const l=(o,s)=>()=>{if(typeof o.open!="undefined"&&(o.open=e),s===0){const t=e?y:b;this.dispatchEvent(new t)}if(!e||(i=i||f(o),i))return;o.querySelectorAll("slot").forEach(t=>{i||(i=u(t))})},a=(o,s)=>async()=>{if(this.open!==e)return;const r=e?"sp-opened":"sp-closed";if(this.isVisible=this.isVisible&&e,s>0){o.dispatchEvent(new CustomEvent(r,{bubbles:!1,composed:!1,detail:{interaction:this.type}}));return}const t=async()=>{if(this.open!==e)return;await c();const n=this.triggerElement instanceof E;this.dispatchEvent(new Event(r,{bubbles:n,composed:n})),o.dispatchEvent(new Event(r,{bubbles:!1,composed:!1})),this.triggerElement&&!n&&this.triggerElement.dispatchEvent(new CustomEvent(r,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};if(this.open!==e)return;let h=!1;try{h=this.dialogEl.matches(":popover-open")}catch(n){}let p=!1;try{p=this.dialogEl.matches(":open")}catch(n){}e!==!0&&(h||p)&&this.isConnected?(this.dialogEl.addEventListener("beforetoggle",()=>{t()},{once:!0}),this.dialogEl.hidePopover()):t()};return this.elements.forEach((o,s)=>{P(o,l(o,s),a(o,s))}),i}}return v}
2
2
  //# sourceMappingURL=OverlayPopover.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayPopover.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n overlayTimer,\n} from './OverlayBase.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { OverlayOpenCloseDetail } from './overlay-types.js';\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\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 private async manageDelay(targetOpenState: boolean): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async ensureOnDOM(targetOpenState: boolean): Promise<void> {\n await nextFrame();\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n await this.managePosition();\n }\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n if (index > 0) {\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(\n eventName,\n {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n }\n )\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private 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 // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithPopover;\n}\n"],
5
- "mappings": "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",
6
- "names": ["firstFocusableIn", "firstFocusableSlottedIn", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedTransitionend", "overlayTimer", "VirtualTrigger", "nextFrame", "res", "constructor", "OverlayWithPopover", "targetOpenState", "focusEl", "popoverOpen", "error", "open", "start", "el", "index", "event", "slot", "finish", "eventName", "reportChange", "hasVirtualTrigger"]
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport {\n Constructor,\n OpenableElement,\n OverlayOpenCloseDetail,\n} from './overlay-types.js';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedAllTransitionend,\n nextFrame,\n overlayTimer,\n} from './AbstractOverlay.js';\nimport type { AbstractOverlay } from './AbstractOverlay.js';\n\nexport function OverlayPopover<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async manageDelay(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState === false || targetOpenState !== this.open) {\n overlayTimer.close(this);\n return;\n }\n if (this.delayed) {\n const cancelled = await overlayTimer.openTimer(this);\n if (cancelled) {\n this.open = !targetOpenState;\n }\n }\n }\n\n private async shouldHidePopover(\n targetOpenState: boolean\n ): Promise<void> {\n if (targetOpenState && this.open !== targetOpenState) {\n return;\n }\n // When in a parent Overlay, this Overlay may need to position itself\n // while closing in due to the parent _also_ closing which means the\n // location can no longer rely on \"top layer over transform\" math.\n await this.placementController.resetOverlayPosition();\n }\n\n private async shouldShowPopover(\n targetOpenState: boolean\n ): Promise<void> {\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n await this.managePosition();\n }\n }\n\n protected override async ensureOnDOM(\n targetOpenState: boolean\n ): Promise<void> {\n await nextFrame();\n await this.shouldHidePopover(targetOpenState);\n await this.shouldShowPopover(targetOpenState);\n await nextFrame();\n }\n\n protected override async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n if (this.open !== targetOpenState) {\n return null;\n }\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n this.isVisible = this.isVisible && targetOpenState;\n if (index > 0) {\n el.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(eventName, {\n bubbles: false,\n composed: false,\n detail: { interaction: this.type },\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>(\n eventName,\n {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n }\n )\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedAllTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n }\n return OverlayWithPopover;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["firstFocusableIn", "firstFocusableSlottedIn", "VirtualTrigger", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedAllTransitionend", "nextFrame", "overlayTimer", "constructor", "OverlayWithPopover", "targetOpenState", "popoverOpen", "error", "open", "focusEl", "start", "el", "index", "event", "slot", "finish", "eventName", "reportChange", "hasVirtualTrigger"]
7
7
  }
@@ -1,17 +1,24 @@
1
- import { OverlayBase as Overlay } from './OverlayBase.js';
1
+ import { Overlay } from './Overlay.js';
2
2
  declare class OverlayStack {
3
3
  private get document();
4
+ private pointerdownPath?;
4
5
  private root;
5
6
  stack: Overlay[];
6
7
  constructor();
7
8
  bindEvents(): void;
8
9
  private closeOverlay;
10
+ /**
11
+ * Cach the `pointerdownTarget` for later testing
12
+ *
13
+ * @param event {ClickEvent}
14
+ */
15
+ handlePointerdown: (event: Event) => void;
9
16
  /**
10
17
  * Close all overlays that are not ancestors of this click event
11
18
  *
12
19
  * @param event {ClickEvent}
13
20
  */
14
- handleClick: (event: Event) => void;
21
+ handlePointerup: () => void;
15
22
  handleBeforetoggle: (event: Event) => void;
16
23
  private handleKeydown;
17
24
  /**
@@ -4,15 +4,27 @@ class OverlayStack {
4
4
  constructor() {
5
5
  this.root = document.body;
6
6
  this.stack = [];
7
+ /**
8
+ * Cach the `pointerdownTarget` for later testing
9
+ *
10
+ * @param event {ClickEvent}
11
+ */
12
+ this.handlePointerdown = (event) => {
13
+ this.pointerdownPath = event.composedPath();
14
+ };
7
15
  /**
8
16
  * Close all overlays that are not ancestors of this click event
9
17
  *
10
18
  * @param event {ClickEvent}
11
19
  */
12
- this.handleClick = (event) => {
20
+ this.handlePointerup = () => {
21
+ var _a;
13
22
  if (!this.stack.length)
14
23
  return;
15
- const composedPath = event.composedPath();
24
+ if (!((_a = this.pointerdownPath) == null ? void 0 : _a.length))
25
+ return;
26
+ const composedPath = this.pointerdownPath;
27
+ this.pointerdownPath = void 0;
16
28
  const nonAncestorOverlays = this.stack.filter((overlay) => {
17
29
  const inStack = composedPath.find(
18
30
  (el) => el === overlay || el === (overlay == null ? void 0 : overlay.triggerElement)
@@ -57,7 +69,8 @@ class OverlayStack {
57
69
  return this.root.ownerDocument || document;
58
70
  }
59
71
  bindEvents() {
60
- this.document.addEventListener("pointerup", this.handleClick);
72
+ this.document.addEventListener("pointerdown", this.handlePointerdown);
73
+ this.document.addEventListener("pointerup", this.handlePointerup);
61
74
  this.document.addEventListener("keydown", this.handleKeydown);
62
75
  }
63
76
  closeOverlay(overlay) {