@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
@@ -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 { noop, OverlayBase } from './OverlayBase.dev.js'\nimport { OverlayDialog } from './OverlayDialog.dev.js'\nimport { OverlayPopover } from './OverlayPopover.dev.js'\nimport { OverlayNoPopover } from './OverlayNoPopover.dev.js'\nimport type {\n OverlayOptionsV1,\n TriggerInteractionsV1,\n} from './overlay-types.dev.js'\nimport { Placement } from '@floating-ui/dom/src/types.js';\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { reparentChildren } from '@spectrum-web-components/shared';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(OverlayBase);\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\ntype OverlayOptions = {\n delayed?: boolean;\n notImmediatelyClosable?: boolean;\n offset?: number | [number, number]; // supporting multi-axis\n placement?: Placement;\n receivesFocus?: 'auto' | 'true' | 'false';\n trigger?: HTMLElement | VirtualTrigger;\n type?: 'modal' | 'page' | 'hint' | 'auto' | 'manual';\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 implements OverlayBase {\n public static update(): void {\n const overlayUpdateEvent = new CustomEvent('sp-update-overlays', {\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n document.dispatchEvent(overlayUpdateEvent);\n }\n\n public static async open(\n target: HTMLElement,\n interaction: TriggerInteractionsV1,\n content: HTMLElement,\n options: OverlayOptionsV1\n ): Promise<() => void>;\n public static async open(\n content: HTMLElement,\n options?: OverlayOptions\n ): Promise<Overlay>;\n public static async open(\n targetOrContent: HTMLElement,\n interactionOrOptions:\n | TriggerInteractionsV1\n | OverlayOptions\n | undefined,\n content?: HTMLElement,\n options?: OverlayOptionsV1\n ): Promise<Overlay | (() => void)> {\n const v2 = arguments.length === 2;\n const overlayContent = content || targetOrContent;\n const overlay = new Overlay();\n overlay.dispose = () => {\n overlay.addEventListener('sp-closed', () => {\n if (!restored) {\n restoreContent();\n restored = true;\n }\n requestAnimationFrame(() => {\n overlay.remove();\n });\n });\n overlay.open = false;\n overlay.dispose = noop;\n };\n let restored = false;\n const restoreContent = reparentChildren([overlayContent], overlay, {\n position: 'beforeend',\n prepareCallback: (el) => {\n const slot = el.slot;\n el.removeAttribute('slot');\n return () => {\n el.slot = slot;\n };\n },\n });\n if (v2) {\n const options = interactionOrOptions as OverlayOptions;\n overlay.append(overlayContent);\n overlay.receivesFocus = options.receivesFocus ?? 'auto';\n overlay.triggerElement = options.trigger || null;\n overlay.type = options.type || 'modal';\n overlay.offset = options.offset || 6;\n overlay.placement = options.placement;\n overlay.willPreventClose = !!options.notImmediatelyClosable;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Do we want to \"open\" this path, or leave that to the consumer?\n overlay.open = true;\n });\n });\n return overlay;\n } else if (overlayContent && options) {\n const target = targetOrContent;\n const interaction = interactionOrOptions;\n overlay.receivesFocus = options.receivesFocus ?? 'auto';\n overlay.triggerElement = options.virtualTrigger || target;\n overlay.type =\n interaction === 'modal'\n ? 'modal'\n : interaction === 'hover'\n ? 'hint'\n : 'auto';\n overlay.offset = options.offset ?? 6;\n overlay.placement = options.placement;\n overlay.willPreventClose = !!options.notImmediatelyClosable;\n // This is super dirty...find a better way.\n // Maybe imperative open should go _at the end_ of everything?\n // Having an option is likely useful.\n // Make imperative overlays less useful?\n // Delete the imperative approach to an overlay?\n // Possibly the giving all of the responsiblities to the user is the best path.\n const parent = target.getRootNode() as Document;\n if (parent === document) {\n target.insertAdjacentElement('afterend', overlay);\n } else {\n parent.append(overlay);\n }\n await new Promise<void>((res) =>\n requestAnimationFrame(() => requestAnimationFrame(() => res()))\n );\n overlay.open = true;\n return overlay.dispose;\n }\n /* c8 ignore next 1 */\n return overlay;\n }\n}\n"],
5
- "mappings": ";AAWA,SAAS,MAAM,mBAAmB;AAClC,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAOjC,SAAS,wBAAwB;AAEjC,MAAM,kBAAkB,iBAAiB,SAAS,cAAc,KAAK;AAErE,IAAI,kBAAkB,cAAc,WAAW;AAC/C,IAAI,iBAAiB;AACjB,oBAAkB,eAAe,eAAe;AACpD,OAAO;AACH,oBAAkB,iBAAiB,eAAe;AACtD;AAkBO,aAAM,gBAAgB,gBAAuC;AAAA,EAChE,OAAc,SAAe;AACzB,UAAM,qBAAqB,IAAI,YAAY,sBAAsB;AAAA,MAC7D,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IAChB,CAAC;AACD,aAAS,cAAc,kBAAkB;AAAA,EAC7C;AAAA,EAYA,aAAoB,KAChB,iBACA,sBAIA,SACA,SAC+B;AA5EvC;AA6EQ,UAAM,KAAK,UAAU,WAAW;AAChC,UAAM,iBAAiB,WAAW;AAClC,UAAM,UAAU,IAAI,QAAQ;AAC5B,YAAQ,UAAU,MAAM;AACpB,cAAQ,iBAAiB,aAAa,MAAM;AACxC,YAAI,CAAC,UAAU;AACX,yBAAe;AACf,qBAAW;AAAA,QACf;AACA,8BAAsB,MAAM;AACxB,kBAAQ,OAAO;AAAA,QACnB,CAAC;AAAA,MACL,CAAC;AACD,cAAQ,OAAO;AACf,cAAQ,UAAU;AAAA,IACtB;AACA,QAAI,WAAW;AACf,UAAM,iBAAiB,iBAAiB,CAAC,cAAc,GAAG,SAAS;AAAA,MAC/D,UAAU;AAAA,MACV,iBAAiB,CAAC,OAAO;AACrB,cAAM,OAAO,GAAG;AAChB,WAAG,gBAAgB,MAAM;AACzB,eAAO,MAAM;AACT,aAAG,OAAO;AAAA,QACd;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,QAAI,IAAI;AACJ,YAAMA,WAAU;AAChB,cAAQ,OAAO,cAAc;AAC7B,cAAQ,iBAAgB,KAAAA,SAAQ,kBAAR,YAAyB;AACjD,cAAQ,iBAAiBA,SAAQ,WAAW;AAC5C,cAAQ,OAAOA,SAAQ,QAAQ;AAC/B,cAAQ,SAASA,SAAQ,UAAU;AACnC,cAAQ,YAAYA,SAAQ;AAC5B,cAAQ,mBAAmB,CAAC,CAACA,SAAQ;AACrC,4BAAsB,MAAM;AACxB,8BAAsB,MAAM;AAExB,kBAAQ,OAAO;AAAA,QACnB,CAAC;AAAA,MACL,CAAC;AACD,aAAO;AAAA,IACX,WAAW,kBAAkB,SAAS;AAClC,YAAM,SAAS;AACf,YAAM,cAAc;AACpB,cAAQ,iBAAgB,aAAQ,kBAAR,YAAyB;AACjD,cAAQ,iBAAiB,QAAQ,kBAAkB;AACnD,cAAQ,OACJ,gBAAgB,UACV,UACA,gBAAgB,UAChB,SACA;AACV,cAAQ,UAAS,aAAQ,WAAR,YAAkB;AACnC,cAAQ,YAAY,QAAQ;AAC5B,cAAQ,mBAAmB,CAAC,CAAC,QAAQ;AAOrC,YAAM,SAAS,OAAO,YAAY;AAClC,UAAI,WAAW,UAAU;AACrB,eAAO,sBAAsB,YAAY,OAAO;AAAA,MACpD,OAAO;AACH,eAAO,OAAO,OAAO;AAAA,MACzB;AACA,YAAM,IAAI;AAAA,QAAc,CAAC,QACrB,sBAAsB,MAAM,sBAAsB,MAAM,IAAI,CAAC,CAAC;AAAA,MAClE;AACA,cAAQ,OAAO;AACf,aAAO,QAAQ;AAAA,IACnB;AAEA,WAAO;AAAA,EACX;AACJ;",
6
- "names": ["options"]
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"]
7
7
  }
package/src/Overlay.js CHANGED
@@ -1,2 +1,31 @@
1
- "use strict";import{noop as g,OverlayBase as b}from"./OverlayBase.js";import{OverlayDialog as O}from"./OverlayDialog.js";import{OverlayPopover as E}from"./OverlayPopover.js";import{OverlayNoPopover as P}from"./OverlayNoPopover.js";import{reparentChildren as T}from"@spectrum-web-components/shared";const F="showPopover"in document.createElement("div");let r=O(b);F?r=E(r):r=P(r);export class Overlay extends r{static update(){const n=new CustomEvent("sp-update-overlays",{bubbles:!0,composed:!0,cancelable:!0});document.dispatchEvent(n)}static async open(n,l,v,o){var m,p,c;const d=arguments.length===2,s=v||n,e=new Overlay;e.dispose=()=>{e.addEventListener("sp-closed",()=>{i||(y(),i=!0),requestAnimationFrame(()=>{e.remove()})}),e.open=!1,e.dispose=g};let i=!1;const y=T([s],e,{position:"beforeend",prepareCallback:t=>{const a=t.slot;return t.removeAttribute("slot"),()=>{t.slot=a}}});if(d){const t=l;return e.append(s),e.receivesFocus=(m=t.receivesFocus)!=null?m:"auto",e.triggerElement=t.trigger||null,e.type=t.type||"modal",e.offset=t.offset||6,e.placement=t.placement,e.willPreventClose=!!t.notImmediatelyClosable,requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.open=!0})}),e}else if(s&&o){const t=n,a=l;e.receivesFocus=(p=o.receivesFocus)!=null?p:"auto",e.triggerElement=o.virtualTrigger||t,e.type=a==="modal"?"modal":a==="hover"?"hint":"auto",e.offset=(c=o.offset)!=null?c:6,e.placement=o.placement,e.willPreventClose=!!o.notImmediatelyClosable;const u=t.getRootNode();return u===document?t.insertAdjacentElement("afterend",e):u.append(e),await new Promise(f=>requestAnimationFrame(()=>requestAnimationFrame(()=>f()))),e.open=!0,e.dispose}return e}}
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">
3
+ <slot @slotchange=${this.handleSlotchange}></slot>
4
+ </div>
5
+ `}get dialogStyleMap(){return{"--swc-overlay-open-count":g.openCount.toString()}}renderDialog(){return c`
6
+ <dialog
7
+ class="dialog"
8
+ part="dialog"
9
+ @close=${this.handleBrowserClose}
10
+ @cancel=${this.handleBrowserClose}
11
+ @beforetoggle=${this.handleBeforetoggle}
12
+ ?is-visible=${this.isVisible}
13
+ >
14
+ ${this.renderContent()}
15
+ </dialog>
16
+ `}renderPopover(){const t="popover"in this?this.popoverValue:void 0;return c`
17
+ <div
18
+ class="dialog"
19
+ part="dialog"
20
+ popover=${M(t)}
21
+ @beforetoggle=${this.handleBeforetoggle}
22
+ @close=${this.handleBrowserClose}
23
+ ?is-visible=${this.isVisible}
24
+ >
25
+ ${this.renderContent()}
26
+ </div>
27
+ `}render(){const e=this.type==="modal"||this.type==="page";return c`
28
+ ${e?this.renderDialog():this.renderPopover()}
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);
2
31
  //# sourceMappingURL=Overlay.js.map
@@ -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 { noop, OverlayBase } from './OverlayBase.js';\nimport { OverlayDialog } from './OverlayDialog.js';\nimport { OverlayPopover } from './OverlayPopover.js';\nimport { OverlayNoPopover } from './OverlayNoPopover.js';\nimport type {\n OverlayOptionsV1,\n TriggerInteractionsV1,\n} from './overlay-types.js';\nimport { Placement } from '@floating-ui/dom/src/types.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { reparentChildren } from '@spectrum-web-components/shared';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(OverlayBase);\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\ntype OverlayOptions = {\n delayed?: boolean;\n notImmediatelyClosable?: boolean;\n offset?: number | [number, number]; // supporting multi-axis\n placement?: Placement;\n receivesFocus?: 'auto' | 'true' | 'false';\n trigger?: HTMLElement | VirtualTrigger;\n type?: 'modal' | 'page' | 'hint' | 'auto' | 'manual';\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 implements OverlayBase {\n public static update(): void {\n const overlayUpdateEvent = new CustomEvent('sp-update-overlays', {\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n document.dispatchEvent(overlayUpdateEvent);\n }\n\n public static async open(\n target: HTMLElement,\n interaction: TriggerInteractionsV1,\n content: HTMLElement,\n options: OverlayOptionsV1\n ): Promise<() => void>;\n public static async open(\n content: HTMLElement,\n options?: OverlayOptions\n ): Promise<Overlay>;\n public static async open(\n targetOrContent: HTMLElement,\n interactionOrOptions:\n | TriggerInteractionsV1\n | OverlayOptions\n | undefined,\n content?: HTMLElement,\n options?: OverlayOptionsV1\n ): Promise<Overlay | (() => void)> {\n const v2 = arguments.length === 2;\n const overlayContent = content || targetOrContent;\n const overlay = new Overlay();\n overlay.dispose = () => {\n overlay.addEventListener('sp-closed', () => {\n if (!restored) {\n restoreContent();\n restored = true;\n }\n requestAnimationFrame(() => {\n overlay.remove();\n });\n });\n overlay.open = false;\n overlay.dispose = noop;\n };\n let restored = false;\n const restoreContent = reparentChildren([overlayContent], overlay, {\n position: 'beforeend',\n prepareCallback: (el) => {\n const slot = el.slot;\n el.removeAttribute('slot');\n return () => {\n el.slot = slot;\n };\n },\n });\n if (v2) {\n const options = interactionOrOptions as OverlayOptions;\n overlay.append(overlayContent);\n overlay.receivesFocus = options.receivesFocus ?? 'auto';\n overlay.triggerElement = options.trigger || null;\n overlay.type = options.type || 'modal';\n overlay.offset = options.offset || 6;\n overlay.placement = options.placement;\n overlay.willPreventClose = !!options.notImmediatelyClosable;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Do we want to \"open\" this path, or leave that to the consumer?\n overlay.open = true;\n });\n });\n return overlay;\n } else if (overlayContent && options) {\n const target = targetOrContent;\n const interaction = interactionOrOptions;\n overlay.receivesFocus = options.receivesFocus ?? 'auto';\n overlay.triggerElement = options.virtualTrigger || target;\n overlay.type =\n interaction === 'modal'\n ? 'modal'\n : interaction === 'hover'\n ? 'hint'\n : 'auto';\n overlay.offset = options.offset ?? 6;\n overlay.placement = options.placement;\n overlay.willPreventClose = !!options.notImmediatelyClosable;\n // This is super dirty...find a better way.\n // Maybe imperative open should go _at the end_ of everything?\n // Having an option is likely useful.\n // Make imperative overlays less useful?\n // Delete the imperative approach to an overlay?\n // Possibly the giving all of the responsiblities to the user is the best path.\n const parent = target.getRootNode() as Document;\n if (parent === document) {\n target.insertAdjacentElement('afterend', overlay);\n } else {\n parent.append(overlay);\n }\n await new Promise<void>((res) =>\n requestAnimationFrame(() => requestAnimationFrame(() => res()))\n );\n overlay.open = true;\n return overlay.dispose;\n }\n /* c8 ignore next 1 */\n return overlay;\n }\n}\n"],
5
- "mappings": "aAWA,OAAS,QAAAA,EAAM,eAAAC,MAAmB,mBAClC,OAAS,iBAAAC,MAAqB,qBAC9B,OAAS,kBAAAC,MAAsB,sBAC/B,OAAS,oBAAAC,MAAwB,wBAOjC,OAAS,oBAAAC,MAAwB,kCAEjC,MAAMC,EAAkB,gBAAiB,SAAS,cAAc,KAAK,EAErE,IAAIC,EAAkBL,EAAcD,CAAW,EAC3CK,EACAC,EAAkBJ,EAAeI,CAAe,EAEhDA,EAAkBH,EAAiBG,CAAe,EAmB/C,aAAM,gBAAgBA,CAAuC,CAChE,OAAc,QAAe,CACzB,MAAMC,EAAqB,IAAI,YAAY,qBAAsB,CAC7D,QAAS,GACT,SAAU,GACV,WAAY,EAChB,CAAC,EACD,SAAS,cAAcA,CAAkB,CAC7C,CAYA,aAAoB,KAChBC,EACAC,EAIAC,EACAC,EAC+B,CA5EvC,IAAAC,EAAAC,EAAAC,EA6EQ,MAAMC,EAAK,UAAU,SAAW,EAC1BC,EAAiBN,GAAWF,EAC5BS,EAAU,IAAI,QACpBA,EAAQ,QAAU,IAAM,CACpBA,EAAQ,iBAAiB,YAAa,IAAM,CACnCC,IACDC,EAAe,EACfD,EAAW,IAEf,sBAAsB,IAAM,CACxBD,EAAQ,OAAO,CACnB,CAAC,CACL,CAAC,EACDA,EAAQ,KAAO,GACfA,EAAQ,QAAUlB,CACtB,EACA,IAAImB,EAAW,GACf,MAAMC,EAAiBf,EAAiB,CAACY,CAAc,EAAGC,EAAS,CAC/D,SAAU,YACV,gBAAkBG,GAAO,CACrB,MAAMC,EAAOD,EAAG,KAChB,OAAAA,EAAG,gBAAgB,MAAM,EAClB,IAAM,CACTA,EAAG,KAAOC,CACd,CACJ,CACJ,CAAC,EACD,GAAIN,EAAI,CACJ,MAAMJ,EAAUF,EAChB,OAAAQ,EAAQ,OAAOD,CAAc,EAC7BC,EAAQ,eAAgBL,EAAAD,EAAQ,gBAAR,KAAAC,EAAyB,OACjDK,EAAQ,eAAiBN,EAAQ,SAAW,KAC5CM,EAAQ,KAAON,EAAQ,MAAQ,QAC/BM,EAAQ,OAASN,EAAQ,QAAU,EACnCM,EAAQ,UAAYN,EAAQ,UAC5BM,EAAQ,iBAAmB,CAAC,CAACN,EAAQ,uBACrC,sBAAsB,IAAM,CACxB,sBAAsB,IAAM,CAExBM,EAAQ,KAAO,EACnB,CAAC,CACL,CAAC,EACMA,UACAD,GAAkBL,EAAS,CAClC,MAAMW,EAASd,EACTe,EAAcd,EACpBQ,EAAQ,eAAgBJ,EAAAF,EAAQ,gBAAR,KAAAE,EAAyB,OACjDI,EAAQ,eAAiBN,EAAQ,gBAAkBW,EACnDL,EAAQ,KACJM,IAAgB,QACV,QACAA,IAAgB,QAChB,OACA,OACVN,EAAQ,QAASH,EAAAH,EAAQ,SAAR,KAAAG,EAAkB,EACnCG,EAAQ,UAAYN,EAAQ,UAC5BM,EAAQ,iBAAmB,CAAC,CAACN,EAAQ,uBAOrC,MAAMa,EAASF,EAAO,YAAY,EAClC,OAAIE,IAAW,SACXF,EAAO,sBAAsB,WAAYL,CAAO,EAEhDO,EAAO,OAAOP,CAAO,EAEzB,MAAM,IAAI,QAAeQ,GACrB,sBAAsB,IAAM,sBAAsB,IAAMA,EAAI,CAAC,CAAC,CAClE,EACAR,EAAQ,KAAO,GACRA,EAAQ,QAGnB,OAAOA,CACX,CACJ",
6
- "names": ["noop", "OverlayBase", "OverlayDialog", "OverlayPopover", "OverlayNoPopover", "reparentChildren", "supportsPopover", "OverlayFeatures", "overlayUpdateEvent", "targetOrContent", "interactionOrOptions", "content", "options", "_a", "_b", "_c", "v2", "overlayContent", "overlay", "restored", "restoreContent", "el", "slot", "target", "interaction", "parent", "res"]
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.js';\nimport { OverlayDialog } from './OverlayDialog.js';\nimport { OpenableElement, OverlayTypes, Placement } from './overlay-types.js';\nimport { OverlayPopover } from './OverlayPopover.js';\nimport { OverlayNoPopover } from './OverlayNoPopover.js';\nimport { overlayStack } from './OverlayStack.js';\nimport { noop } from './AbstractOverlay.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { PlacementController } from './PlacementController.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": ["html", "property", "query", "queryAssignedElements", "state", "isAndroid", "isIOS", "ElementResolutionController", "elementResolverUpdatedSymbol", "conditionAttributeWithId", "ifDefined", "styleMap", "AbstractOverlay", "nextFrame", "OverlayDialog", "OverlayPopover", "OverlayNoPopover", "overlayStack", "noop", "VirtualTrigger", "PlacementController", "styles", "LONGPRESS_DURATION", "supportsPopover", "OverlayFeatures", "_Overlay", "event", "triggerElement", "code", "altKey", "child", "el", "disabled", "open", "offset", "trigger", "placement", "tipPadding", "targetOpenState", "focusEl", "oldOpen", "_a", "getAncestors", "ancestors", "currentNode", "ancestor", "nextTriggerElement", "options", "longpressDescription", "messageType", "releaseLongpressDescribedby", "triggerRoot", "contentRoot", "overlayRoot", "releaseAriaDescribedby", "appliedIds", "index", "shouldPreventClose", "changes", "relationEvent", "id", "interaction", "oldTrigger", "popoverValue", "isDialog", "__decorateClass"]
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 OverlayDialog<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 OverlayDialog<T extends Constructor<AbstractOverlay>>(constructor: T): T & Constructor<ReactiveElement>;
@@ -3,15 +3,12 @@ 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
- } from "./OverlayBase.dev.js";
11
- import { VirtualTrigger } from "./VirtualTrigger.dev.js";
12
- function nextFrame() {
13
- return new Promise((res) => requestAnimationFrame(() => res()));
14
- }
10
+ guaranteedAllTransitionend
11
+ } from "./AbstractOverlay.dev.js";
15
12
  export function OverlayDialog(constructor) {
16
13
  class OverlayWithDialog extends constructor {
17
14
  async manageDialogOpen() {
@@ -20,7 +17,6 @@ export function OverlayDialog(constructor) {
20
17
  if (this.open !== targetOpenState) {
21
18
  return;
22
19
  }
23
- await this.dialogEnsureOnDOM();
24
20
  if (this.open !== targetOpenState) {
25
21
  return;
26
22
  }
@@ -30,12 +26,6 @@ export function OverlayDialog(constructor) {
30
26
  }
31
27
  await this.dialogApplyFocus(targetOpenState, focusEl);
32
28
  }
33
- async dialogEnsureOnDOM() {
34
- await nextFrame();
35
- await nextFrame();
36
- await nextFrame();
37
- await nextFrame();
38
- }
39
29
  async dialogMakeTransition(targetOpenState) {
40
30
  let focusEl = null;
41
31
  const start = (el, index) => async () => {
@@ -73,6 +63,7 @@ export function OverlayDialog(constructor) {
73
63
  return;
74
64
  }
75
65
  const eventName = targetOpenState ? "sp-opened" : "sp-closed";
66
+ this.isVisible = this.isVisible && targetOpenState;
76
67
  if (index > 0) {
77
68
  el.dispatchEvent(
78
69
  new CustomEvent(eventName, {
@@ -124,7 +115,7 @@ export function OverlayDialog(constructor) {
124
115
  }
125
116
  };
126
117
  this.elements.forEach((el, index) => {
127
- guaranteedTransitionend(
118
+ guaranteedAllTransitionend(
128
119
  el,
129
120
  start(el, index),
130
121
  finish(el, index)
@@ -133,26 +124,7 @@ export function OverlayDialog(constructor) {
133
124
  return focusEl;
134
125
  }
135
126
  async dialogApplyFocus(targetOpenState, focusEl) {
136
- if (this.receivesFocus === "false") {
137
- return;
138
- }
139
- await nextFrame();
140
- await nextFrame();
141
- if (targetOpenState === this.open && !this.open) {
142
- if (
143
- // Do not return focus to trigger when overlay is a "hint" (tooltip)
144
- this.type !== "hint" && // Only return focus when the trigger is not "virtual"
145
- this.triggerElement && !(this.triggerElement instanceof VirtualTrigger)
146
- ) {
147
- if (this.contains(
148
- this.getRootNode().activeElement
149
- )) {
150
- this.triggerElement.focus();
151
- }
152
- }
153
- return;
154
- }
155
- focusEl == null ? void 0 : focusEl.focus();
127
+ this.applyFocus(targetOpenState, focusEl);
156
128
  }
157
129
  }
158
130
  return OverlayWithDialog;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayDialog.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 { ReactiveElement } from 'lit';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\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 OverlayDialog<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithDialog extends constructor {\n protected override async manageDialogOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogEnsureOnDOM();\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.dialogMakeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogApplyFocus(targetOpenState, focusEl);\n }\n\n protected async dialogEnsureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n await nextFrame();\n await nextFrame();\n }\n\n protected async dialogMakeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (!targetOpenState) {\n const close = (): void => {\n el.removeEventListener('close', close);\n finish(el, index);\n };\n el.addEventListener('close', close);\n }\n if (index > 0 || !targetOpenState) {\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n focusEl = focusEl || firstFocusableIn(el);\n if (!focusEl) {\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n }\n if (!this.isConnected || this.dialogEl.open) {\n return;\n }\n this.dialogEl.showModal();\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 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 if (!this.isConnected || targetOpenState !== this.open) {\n return;\n }\n const reportChange = (): void => {\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>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (!targetOpenState && this.dialogEl.open) {\n this.dialogEl.addEventListener(\n 'close',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.close();\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 protected async dialogApplyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n /**\n * Focus should handled natively in `<dialog>` elements when leveraging `.showModal()`, but it's NOT.\n * - webkit bug: https://bugs.webkit.org/show_bug.cgi?id=255507\n * - firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1828398\n **/\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\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 OverlayWithDialog;\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 { ReactiveElement } from 'lit';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\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} from './AbstractOverlay.dev.js'\nimport type { AbstractOverlay } from './AbstractOverlay.dev.js'\n\nexport function OverlayDialog<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithDialog extends constructor {\n protected override async manageDialogOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n if (this.open !== targetOpenState) {\n return;\n }\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.dialogMakeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogApplyFocus(targetOpenState, focusEl);\n }\n\n protected async dialogMakeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (!targetOpenState) {\n const close = (): void => {\n el.removeEventListener('close', close);\n finish(el, index);\n };\n el.addEventListener('close', close);\n }\n if (index > 0 || !targetOpenState) {\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n focusEl = focusEl || firstFocusableIn(el);\n if (!focusEl) {\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n }\n if (!this.isConnected || this.dialogEl.open) {\n return;\n }\n this.dialogEl.showModal();\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 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 if (!this.isConnected || targetOpenState !== this.open) {\n return;\n }\n const reportChange = (): void => {\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>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (!targetOpenState && this.dialogEl.open) {\n this.dialogEl.addEventListener(\n 'close',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.close();\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 protected async dialogApplyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n /**\n * Focus should be handled natively in `<dialog>` elements when leveraging `.showModal()`, but it's NOT.\n * - webkit bug: https://bugs.webkit.org/show_bug.cgi?id=255507\n * - firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1828398\n **/\n this.applyFocus(targetOpenState, focusEl);\n }\n }\n return OverlayWithDialog;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";import{firstFocusableIn as p,firstFocusableSlottedIn as u}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{BeforetoggleClosedEvent as f,BeforetoggleOpenEvent as v,guaranteedTransitionend as E}from"./OverlayBase.js";import{VirtualTrigger as d}from"./VirtualTrigger.js";function r(){return new Promise(l=>requestAnimationFrame(()=>l()))}export function OverlayDialog(l){class m extends l{async manageDialogOpen(){const e=this.open;if(await this.managePosition(),this.open!==e||(await this.dialogEnsureOnDOM(),this.open!==e))return;const i=await this.dialogMakeTransition(e);this.open===e&&await this.dialogApplyFocus(e,i)}async dialogEnsureOnDOM(){await r(),await r(),await r(),await r()}async dialogMakeTransition(e){let i=null;const h=(t,n)=>async()=>{if(typeof t.open!="undefined"&&(t.open=e),!e){const s=()=>{t.removeEventListener("close",s),c(t,n)};t.addEventListener("close",s)}if(n>0||!e)return;const o=e?v:f;this.dispatchEvent(new o),i=i||p(t),i||t.querySelectorAll("slot").forEach(a=>{i||(i=u(a))}),!(!this.isConnected||this.dialogEl.open)&&this.dialogEl.showModal()},c=(t,n)=>()=>{if(this.open!==e)return;const o=e?"sp-opened":"sp-closed";if(n>0){t.dispatchEvent(new CustomEvent(o,{bubbles:!1,composed:!1,detail:{interaction:this.type}}));return}if(!this.isConnected||e!==this.open)return;const s=()=>{const a=this.triggerElement instanceof d;this.dispatchEvent(new Event(o,{bubbles:a,composed:a})),t.dispatchEvent(new Event(o,{bubbles:!1,composed:!1})),this.triggerElement&&!a&&this.triggerElement.dispatchEvent(new CustomEvent(o,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};!e&&this.dialogEl.open?(this.dialogEl.addEventListener("close",()=>{s()},{once:!0}),this.dialogEl.close()):s()};return this.elements.forEach((t,n)=>{E(t,h(t,n),c(t,n))}),i}async dialogApplyFocus(e,i){if(this.receivesFocus!=="false"){if(await r(),await r(),e===this.open&&!this.open){this.type!=="hint"&&this.triggerElement&&!(this.triggerElement instanceof d)&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}i==null||i.focus()}}}return m}
1
+ "use strict";import{firstFocusableIn as p,firstFocusableSlottedIn as h}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{VirtualTrigger as m}from"./VirtualTrigger.js";import{BeforetoggleClosedEvent as u,BeforetoggleOpenEvent as f,guaranteedAllTransitionend as E}from"./AbstractOverlay.js";export function OverlayDialog(a){class c extends a{async manageDialogOpen(){const e=this.open;if(await this.managePosition(),this.open!==e||this.open!==e)return;const o=await this.dialogMakeTransition(e);this.open===e&&await this.dialogApplyFocus(e,o)}async dialogMakeTransition(e){let o=null;const d=(t,i)=>async()=>{if(typeof t.open!="undefined"&&(t.open=e),!e){const n=()=>{t.removeEventListener("close",n),r(t,i)};t.addEventListener("close",n)}if(i>0||!e)return;const s=e?f:u;this.dispatchEvent(new s),o=o||p(t),o||t.querySelectorAll("slot").forEach(l=>{o||(o=h(l))}),!(!this.isConnected||this.dialogEl.open)&&this.dialogEl.showModal()},r=(t,i)=>()=>{if(this.open!==e)return;const s=e?"sp-opened":"sp-closed";if(this.isVisible=this.isVisible&&e,i>0){t.dispatchEvent(new CustomEvent(s,{bubbles:!1,composed:!1,detail:{interaction:this.type}}));return}if(!this.isConnected||e!==this.open)return;const n=()=>{const l=this.triggerElement instanceof m;this.dispatchEvent(new Event(s,{bubbles:l,composed:l})),t.dispatchEvent(new Event(s,{bubbles:!1,composed:!1})),this.triggerElement&&!l&&this.triggerElement.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};!e&&this.dialogEl.open?(this.dialogEl.addEventListener("close",()=>{n()},{once:!0}),this.dialogEl.close()):n()};return this.elements.forEach((t,i)=>{E(t,d(t,i),r(t,i))}),o}async dialogApplyFocus(e,o){this.applyFocus(e,o)}}return c}
2
2
  //# sourceMappingURL=OverlayDialog.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["OverlayDialog.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 { ReactiveElement } from 'lit';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\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 OverlayDialog<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithDialog extends constructor {\n protected override async manageDialogOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogEnsureOnDOM();\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.dialogMakeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogApplyFocus(targetOpenState, focusEl);\n }\n\n protected async dialogEnsureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n await nextFrame();\n await nextFrame();\n }\n\n protected async dialogMakeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (!targetOpenState) {\n const close = (): void => {\n el.removeEventListener('close', close);\n finish(el, index);\n };\n el.addEventListener('close', close);\n }\n if (index > 0 || !targetOpenState) {\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n focusEl = focusEl || firstFocusableIn(el);\n if (!focusEl) {\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n }\n if (!this.isConnected || this.dialogEl.open) {\n return;\n }\n this.dialogEl.showModal();\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 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 if (!this.isConnected || targetOpenState !== this.open) {\n return;\n }\n const reportChange = (): void => {\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>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (!targetOpenState && this.dialogEl.open) {\n this.dialogEl.addEventListener(\n 'close',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.close();\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 protected async dialogApplyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n /**\n * Focus should handled natively in `<dialog>` elements when leveraging `.showModal()`, but it's NOT.\n * - webkit bug: https://bugs.webkit.org/show_bug.cgi?id=255507\n * - firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1828398\n **/\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\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 OverlayWithDialog;\n}\n"],
5
- "mappings": "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",
6
- "names": ["firstFocusableIn", "firstFocusableSlottedIn", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedTransitionend", "VirtualTrigger", "nextFrame", "res", "constructor", "OverlayWithDialog", "targetOpenState", "focusEl", "start", "el", "index", "close", "finish", "event", "slot", "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 { ReactiveElement } from 'lit';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\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} from './AbstractOverlay.js';\nimport type { AbstractOverlay } from './AbstractOverlay.js';\n\nexport function OverlayDialog<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithDialog extends constructor {\n protected override async manageDialogOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n if (this.open !== targetOpenState) {\n return;\n }\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.dialogMakeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.dialogApplyFocus(targetOpenState, focusEl);\n }\n\n protected async dialogMakeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (!targetOpenState) {\n const close = (): void => {\n el.removeEventListener('close', close);\n finish(el, index);\n };\n el.addEventListener('close', close);\n }\n if (index > 0 || !targetOpenState) {\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n focusEl = focusEl || firstFocusableIn(el);\n if (!focusEl) {\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n }\n if (!this.isConnected || this.dialogEl.open) {\n return;\n }\n this.dialogEl.showModal();\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 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 if (!this.isConnected || targetOpenState !== this.open) {\n return;\n }\n const reportChange = (): void => {\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>(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (!targetOpenState && this.dialogEl.open) {\n this.dialogEl.addEventListener(\n 'close',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.close();\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 protected async dialogApplyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n /**\n * Focus should be handled natively in `<dialog>` elements when leveraging `.showModal()`, but it's NOT.\n * - webkit bug: https://bugs.webkit.org/show_bug.cgi?id=255507\n * - firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1828398\n **/\n this.applyFocus(targetOpenState, focusEl);\n }\n }\n return OverlayWithDialog;\n}\n"],
5
+ "mappings": "aAYA,OACI,oBAAAA,EACA,2BAAAC,MACG,4DACP,OAAS,kBAAAC,MAAsB,sBAM/B,OACI,2BAAAC,EACA,yBAAAC,EACA,8BAAAC,MACG,uBAGA,gBAAS,cACZC,EACgC,CAChC,MAAMC,UAA0BD,CAAY,CACxC,MAAyB,kBAAkC,CACvD,MAAME,EAAkB,KAAK,KAK7B,GAJA,MAAM,KAAK,eAAe,EACtB,KAAK,OAASA,GAGd,KAAK,OAASA,EACd,OAEJ,MAAMC,EAAU,MAAM,KAAK,qBAAqBD,CAAe,EAC3D,KAAK,OAASA,GAGlB,MAAM,KAAK,iBAAiBA,EAAiBC,CAAO,CACxD,CAEA,MAAgB,qBACZD,EAC2B,CAC3B,IAAIC,EAAU,KACd,MAAMC,EACF,CAACC,EAAqBC,IACtB,SAA2B,CAIvB,GAHI,OAAOD,EAAG,MAAS,cACnBA,EAAG,KAAOH,GAEV,CAACA,EAAiB,CAClB,MAAMK,EAAQ,IAAY,CACtBF,EAAG,oBAAoB,QAASE,CAAK,EACrCC,EAAOH,EAAIC,CAAK,CACpB,EACAD,EAAG,iBAAiB,QAASE,CAAK,EAEtC,GAAID,EAAQ,GAAK,CAACJ,EACd,OAEJ,MAAMO,EAAQP,EACRJ,EACAD,EACN,KAAK,cAAc,IAAIY,CAAO,EAC9BN,EAAUA,GAAWT,EAAiBW,CAAE,EACnCF,GACkBE,EAAG,iBAAiB,MAAM,EAClC,QAASK,GAAS,CACpBP,IACDA,EAAUR,EAAwBe,CAAI,EAE9C,CAAC,EAED,GAAC,KAAK,aAAe,KAAK,SAAS,OAGvC,KAAK,SAAS,UAAU,CAC5B,EACEF,EAAS,CAACH,EAAqBC,IAAkB,IAAY,CAC/D,GAAI,KAAK,OAASJ,EACd,OAEJ,MAAMS,EAAYT,EAAkB,YAAc,YAElD,GADA,KAAK,UAAY,KAAK,WAAaA,EAC/BI,EAAQ,EAAG,CACXD,EAAG,cACC,IAAI,YAAoCM,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,EACA,OAEJ,GAAI,CAAC,KAAK,aAAeT,IAAoB,KAAK,KAC9C,OAEJ,MAAMU,EAAe,IAAY,CAC7B,MAAMC,EACF,KAAK,0BAA0BjB,EACnC,KAAK,cACD,IAAI,MAAMe,EAAW,CACjB,QAASE,EACT,SAAUA,CACd,CAAC,CACL,EACAR,EAAG,cACC,IAAI,MAAMM,EAAW,CACjB,QAAS,GACT,SAAU,EACd,CAAC,CACL,EACI,KAAK,gBAAkB,CAACE,GACvB,KAAK,eAA+B,cACjC,IAAI,YAAoCF,EAAW,CAC/C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,CAER,EACI,CAACT,GAAmB,KAAK,SAAS,MAClC,KAAK,SAAS,iBACV,QACA,IAAM,CACFU,EAAa,CACjB,EACA,CAAE,KAAM,EAAK,CACjB,EACA,KAAK,SAAS,MAAM,GAEpBA,EAAa,CAErB,EACA,YAAK,SAAS,QAAQ,CAACP,EAAIC,IAAU,CACjCP,EACIM,EACAD,EAAMC,EAAIC,CAAK,EACfE,EAAOH,EAAIC,CAAK,CACpB,CACJ,CAAC,EACMH,CACX,CAEA,MAAgB,iBACZD,EACAC,EACa,CAMb,KAAK,WAAWD,EAAiBC,CAAO,CAC5C,CACJ,CACA,OAAOF,CACX",
6
+ "names": ["firstFocusableIn", "firstFocusableSlottedIn", "VirtualTrigger", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedAllTransitionend", "constructor", "OverlayWithDialog", "targetOpenState", "focusEl", "start", "el", "index", "close", "finish", "event", "slot", "eventName", "reportChange", "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 OverlayNoPopover<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 OverlayNoPopover<T extends Constructor<AbstractOverlay>>(constructor: T): T & Constructor<ReactiveElement>;