@spectrum-web-components/overlay 1.0.0 → 1.0.1

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.
@@ -2133,7 +2133,15 @@
2133
2133
  "type": {
2134
2134
  "text": "void"
2135
2135
  }
2136
- }
2136
+ },
2137
+ "parameters": [
2138
+ {
2139
+ "name": "event",
2140
+ "type": {
2141
+ "text": "Event"
2142
+ }
2143
+ }
2144
+ ]
2137
2145
  },
2138
2146
  {
2139
2147
  "kind": "method",
@@ -2588,7 +2596,7 @@
2588
2596
  "privacy": "private",
2589
2597
  "return": {
2590
2598
  "type": {
2591
- "text": "Promise<void>"
2599
+ "text": "void"
2592
2600
  }
2593
2601
  },
2594
2602
  "parameters": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/overlay",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -160,11 +160,11 @@
160
160
  "dependencies": {
161
161
  "@floating-ui/dom": "^1.6.1",
162
162
  "@floating-ui/utils": "^0.2.1",
163
- "@spectrum-web-components/action-button": "^1.0.0",
164
- "@spectrum-web-components/base": "^1.0.0",
165
- "@spectrum-web-components/reactive-controllers": "^1.0.0",
166
- "@spectrum-web-components/shared": "^1.0.0",
167
- "@spectrum-web-components/theme": "^1.0.0"
163
+ "@spectrum-web-components/action-button": "^1.0.1",
164
+ "@spectrum-web-components/base": "^1.0.1",
165
+ "@spectrum-web-components/reactive-controllers": "^1.0.1",
166
+ "@spectrum-web-components/shared": "^1.0.1",
167
+ "@spectrum-web-components/theme": "^1.0.1"
168
168
  },
169
169
  "types": "./src/index.d.ts",
170
170
  "customElements": "custom-elements.json",
@@ -176,5 +176,5 @@
176
176
  "./stories/overlay-story-components.js",
177
177
  "./**/*.dev.js"
178
178
  ],
179
- "gitHead": "5cf5d34645bf9494ebd20f64c42d1619523d2d84"
179
+ "gitHead": "b359bc0242712be118c5e3e2cc05f88707d3eeb1"
180
180
  }
package/src/Overlay.d.ts CHANGED
@@ -117,7 +117,7 @@ export declare class Overlay extends OverlayFeatures {
117
117
  protected handleBeforetoggle(event: Event & {
118
118
  newState: string;
119
119
  }): void;
120
- protected handleBrowserClose(): void;
120
+ protected handleBrowserClose(event: Event): void;
121
121
  manuallyKeepOpen(): void;
122
122
  protected handleSlotchange(): void;
123
123
  shouldPreventClose(): boolean;
@@ -320,11 +320,12 @@ const _Overlay = class _Overlay extends OverlayFeatures {
320
320
  }
321
321
  handleBeforetoggle(event) {
322
322
  if (event.newState !== "open") {
323
- this.handleBrowserClose();
323
+ this.handleBrowserClose(event);
324
324
  }
325
325
  }
326
- handleBrowserClose() {
326
+ handleBrowserClose(event) {
327
327
  var _a;
328
+ event.stopPropagation();
328
329
  if (!((_a = this.strategy) == null ? void 0 : _a.activelyOpening)) {
329
330
  this.open = false;
330
331
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Overlay.ts"],
4
- "sourcesContent": ["/*\nCopyright 2023 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\n TriggerInteraction,\n} from './overlay-types.dev.js'\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.dev.js'\nimport { OverlayDialog } from './OverlayDialog.dev.js'\nimport { OverlayPopover } from './OverlayPopover.dev.js'\nimport { OverlayNoPopover } from './OverlayNoPopover.dev.js'\nimport { overlayStack } from './OverlayStack.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\nimport type { ClickController } from './ClickController.dev.js'\nimport type { HoverController } from './HoverController.dev.js'\nimport type { LongpressController } from './LongpressController.dev.js'\nexport { LONGPRESS_INSTRUCTIONS } from './LongpressController.dev.js'\nimport { strategies } from './strategies.dev.js'\nimport {\n removeSlottableRequest,\n SlottableRequestEvent,\n} from './slottable-request-event.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n * @fires slottable-request - requests to add or remove slottable content\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\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 get delayed(): boolean {\n return this.elements.at(-1)?.hasAttribute('delayed') || this._delayed;\n }\n\n override set delayed(delayed: boolean) {\n this._delayed = delayed;\n }\n\n private _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 override get disabled(): boolean {\n return this._disabled;\n }\n\n override set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n this.strategy?.abort();\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\"], slot)', // 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 /**\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 override offset: number | [number, number] = 0;\n\n protected override get placementController(): PlacementController {\n if (!this._placementController) {\n this._placementController = new PlacementController(this);\n }\n return this._placementController;\n }\n\n /**\n * Whether the Overlay is projected onto the \"top layer\" or not.\n */\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n // Don't respond when disabled.\n if (open && this.disabled) return;\n // Don't respond when state not dirty\n if (open === this.open) return;\n // Don't respond when you're in the shadow on a longpress\n // Shadow occurs when the first \"click\" would normally close the popover\n if (this.strategy?.activelyOpening && !open) return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n if (this.open) {\n this.requestSlottable();\n }\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 * @type {\"top\" | \"top-start\" | \"top-end\" | \"right\" | \"right-start\" | \"right-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"left-start\" | \"left-end\"}\n */\n @property()\n override placement?: Placement;\n\n /**\n * The state in which the last `request-slottable` event was dispatched.\n * Do not allow overlays from dispatching the same state twice in a row.\n */\n private lastRequestSlottableState = false;\n\n /**\n * Whether to pass focus to the overlay once opened, or\n * to the appropriate value based on the \"type\" of the overlay\n * when set to `\"auto\"`.\n *\n */\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n this.strategy?.shouldCompleteOpen();\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n public strategy?: ClickController | HoverController | LongpressController;\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?: TriggerInteraction;\n\n /**\n * Configures the open/close heuristics of the Overlay.\n * @type {\"auto\" | \"hint\" | \"manual\" | \"modal\" | \"page\"}\n */\n @property()\n override type: OverlayTypes = 'auto';\n\n protected wasOpen = false;\n\n protected override get elementResolver(): ElementResolutionController {\n if (!this._elementResolver) {\n this._elementResolver = new ElementResolutionController(this);\n }\n return this._elementResolver;\n }\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected override returnFocus(): void {\n if (this.open || this.type === 'hint') return;\n\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 (currentNode?.shadowRoot?.activeElement) {\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.receivesFocus !== 'false' &&\n !!(this.triggerElement as HTMLElement)?.focus &&\n (this.contains((this.getRootNode() as Document).activeElement) ||\n getAncestors().includes(this) ||\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n document.activeElement === document.body)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n\n private closeOnFocusOut = (event: FocusEvent): void => {\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n // this.open = false;\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 protected async manageOpen(oldOpen: boolean): Promise<void> {\n // The `.showPopover()` and `.showModal()` events will error on content that is not connected to the DOM.\n // Prevent from entering the manage workflow in order to avoid this.\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n if (this.open && this.state !== 'opened') {\n this.state = 'opening';\n } else if (!this.open && this.state !== 'closed') {\n this.state = 'closing';\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (this.type === 'auto') {\n const listenerRoot = this.getRootNode() as Document;\n if (this.open) {\n listenerRoot.addEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n } else {\n listenerRoot.removeEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n }\n }\n }\n\n protected bindEvents(): void {\n this.strategy?.abort();\n this.strategy = undefined;\n if (!this.hasNonVirtualTrigger) return;\n if (!this.triggerInteraction) return;\n this.strategy = new strategies[this.triggerInteraction](\n this.triggerElement as HTMLElement,\n {\n overlay: this,\n }\n );\n }\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n if (!this.strategy?.activelyOpening) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (!this.elements.length) {\n this.strategy?.releaseDescription();\n } else if (this.hasNonVirtualTrigger) {\n this.strategy?.prepareDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n protected override requestSlottable(): void {\n if (this.lastRequestSlottableState === this.open) {\n return;\n }\n if (!this.open) {\n document.body.offsetHeight;\n }\n /**\n * @ignore\n */\n this.dispatchEvent(\n new SlottableRequestEvent(\n 'overlay-content',\n this.open ? {} : removeSlottableRequest\n )\n );\n this.lastRequestSlottableState = this.open;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${randomID()}`\n );\n }\n if (changes.has('open') && (this.hasUpdated || this.open)) {\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 // Merge multiple possible calls to `bindEvents()`.\n let oldTrigger: HTMLElement | false | undefined = false;\n if (changes.has(elementResolverUpdatedSymbol)) {\n oldTrigger = this.triggerElement as HTMLElement;\n this.triggerElement = this.elementResolver.element;\n }\n if (changes.has('triggerElement')) {\n oldTrigger = changes.get('triggerElement');\n }\n if (oldTrigger !== false) {\n this.bindEvents();\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 if (\n changes.has('state') &&\n this.state === 'closed' &&\n typeof changes.get('state') !== 'undefined'\n ) {\n this.placementController.clearOverlayPosition();\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <slot @slotchange=${this.handleSlotchange}></slot>\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 placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n style=${styleMap(this.dialogStyleMap)}\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n popover=${ifDefined(this.popoverValue)}\n style=${styleMap(this.dialogStyleMap)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasUpdated) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n this.strategy?.releaseDescription();\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
- "mappings": "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",
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 ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\n TriggerInteraction,\n} from './overlay-types.dev.js'\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.dev.js'\nimport { OverlayDialog } from './OverlayDialog.dev.js'\nimport { OverlayPopover } from './OverlayPopover.dev.js'\nimport { OverlayNoPopover } from './OverlayNoPopover.dev.js'\nimport { overlayStack } from './OverlayStack.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\nimport type { ClickController } from './ClickController.dev.js'\nimport type { HoverController } from './HoverController.dev.js'\nimport type { LongpressController } from './LongpressController.dev.js'\nexport { LONGPRESS_INSTRUCTIONS } from './LongpressController.dev.js'\nimport { strategies } from './strategies.dev.js'\nimport {\n removeSlottableRequest,\n SlottableRequestEvent,\n} from './slottable-request-event.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n * @fires slottable-request - requests to add or remove slottable content\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\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 get delayed(): boolean {\n return this.elements.at(-1)?.hasAttribute('delayed') || this._delayed;\n }\n\n override set delayed(delayed: boolean) {\n this._delayed = delayed;\n }\n\n private _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 override get disabled(): boolean {\n return this._disabled;\n }\n\n override set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n this.strategy?.abort();\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\"], slot)', // 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 /**\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 override offset: number | [number, number] = 0;\n\n protected override get placementController(): PlacementController {\n if (!this._placementController) {\n this._placementController = new PlacementController(this);\n }\n return this._placementController;\n }\n\n /**\n * Whether the Overlay is projected onto the \"top layer\" or not.\n */\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n // Don't respond when disabled.\n if (open && this.disabled) return;\n // Don't respond when state not dirty\n if (open === this.open) return;\n // Don't respond when you're in the shadow on a longpress\n // Shadow occurs when the first \"click\" would normally close the popover\n if (this.strategy?.activelyOpening && !open) return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n if (this.open) {\n this.requestSlottable();\n }\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 * @type {\"top\" | \"top-start\" | \"top-end\" | \"right\" | \"right-start\" | \"right-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"left-start\" | \"left-end\"}\n */\n @property()\n override placement?: Placement;\n\n /**\n * The state in which the last `request-slottable` event was dispatched.\n * Do not allow overlays from dispatching the same state twice in a row.\n */\n private lastRequestSlottableState = false;\n\n /**\n * Whether to pass focus to the overlay once opened, or\n * to the appropriate value based on the \"type\" of the overlay\n * when set to `\"auto\"`.\n *\n */\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n this.strategy?.shouldCompleteOpen();\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n public strategy?: ClickController | HoverController | LongpressController;\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?: TriggerInteraction;\n\n /**\n * Configures the open/close heuristics of the Overlay.\n * @type {\"auto\" | \"hint\" | \"manual\" | \"modal\" | \"page\"}\n */\n @property()\n override type: OverlayTypes = 'auto';\n\n protected wasOpen = false;\n\n protected override get elementResolver(): ElementResolutionController {\n if (!this._elementResolver) {\n this._elementResolver = new ElementResolutionController(this);\n }\n return this._elementResolver;\n }\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected override returnFocus(): void {\n if (this.open || this.type === 'hint') return;\n\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 (currentNode?.shadowRoot?.activeElement) {\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.receivesFocus !== 'false' &&\n !!(this.triggerElement as HTMLElement)?.focus &&\n (this.contains((this.getRootNode() as Document).activeElement) ||\n getAncestors().includes(this) ||\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n document.activeElement === document.body)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n\n private closeOnFocusOut = (event: FocusEvent): void => {\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n // this.open = false;\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 protected async manageOpen(oldOpen: boolean): Promise<void> {\n // The `.showPopover()` and `.showModal()` events will error on content that is not connected to the DOM.\n // Prevent from entering the manage workflow in order to avoid this.\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n if (this.open && this.state !== 'opened') {\n this.state = 'opening';\n } else if (!this.open && this.state !== 'closed') {\n this.state = 'closing';\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (this.type === 'auto') {\n const listenerRoot = this.getRootNode() as Document;\n if (this.open) {\n listenerRoot.addEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n } else {\n listenerRoot.removeEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n }\n }\n }\n\n protected bindEvents(): void {\n this.strategy?.abort();\n this.strategy = undefined;\n if (!this.hasNonVirtualTrigger) return;\n if (!this.triggerInteraction) return;\n this.strategy = new strategies[this.triggerInteraction](\n this.triggerElement as HTMLElement,\n {\n overlay: this,\n }\n );\n }\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose(event);\n }\n }\n\n protected handleBrowserClose(event: Event): void {\n event.stopPropagation();\n if (!this.strategy?.activelyOpening) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (!this.elements.length) {\n this.strategy?.releaseDescription();\n } else if (this.hasNonVirtualTrigger) {\n this.strategy?.prepareDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n protected override requestSlottable(): void {\n if (this.lastRequestSlottableState === this.open) {\n return;\n }\n if (!this.open) {\n document.body.offsetHeight;\n }\n /**\n * @ignore\n */\n this.dispatchEvent(\n new SlottableRequestEvent(\n 'overlay-content',\n this.open ? {} : removeSlottableRequest\n )\n );\n this.lastRequestSlottableState = this.open;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${randomID()}`\n );\n }\n if (changes.has('open') && (this.hasUpdated || this.open)) {\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 // Merge multiple possible calls to `bindEvents()`.\n let oldTrigger: HTMLElement | false | undefined = false;\n if (changes.has(elementResolverUpdatedSymbol)) {\n oldTrigger = this.triggerElement as HTMLElement;\n this.triggerElement = this.elementResolver.element;\n }\n if (changes.has('triggerElement')) {\n oldTrigger = changes.get('triggerElement');\n }\n if (oldTrigger !== false) {\n this.bindEvents();\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 if (\n changes.has('state') &&\n this.state === 'closed' &&\n typeof changes.get('state') !== 'undefined'\n ) {\n this.placementController.clearOverlayPosition();\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <slot @slotchange=${this.handleSlotchange}></slot>\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 placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n style=${styleMap(this.dialogStyleMap)}\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n popover=${ifDefined(this.popoverValue)}\n style=${styleMap(this.dialogStyleMap)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasUpdated) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n this.strategy?.releaseDescription();\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["event", "state", "_a"]
7
7
  }
package/src/Overlay.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var b=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var r=(u,a,e,t)=>{for(var o=t>1?void 0:t?E(a,e):a,s=u.length-1,l;s>=0;s--)(l=u[s])&&(o=(t?l(a,e,o):l(o))||o);return t&&o&&b(a,e,o),o};import{html as d}from"@spectrum-web-components/base";import{property as n,query as g,queryAssignedElements as C,state as P}from"@spectrum-web-components/base/src/decorators.js";import{ElementResolutionController as w,elementResolverUpdatedSymbol as T}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{ifDefined as c,styleMap as f}from"@spectrum-web-components/base/src/directives.js";import{randomID as S}from"@spectrum-web-components/shared/src/random-id.js";import{AbstractOverlay as R,nextFrame as v}from"./AbstractOverlay.js";import{OverlayDialog as L}from"./OverlayDialog.js";import{OverlayPopover as O}from"./OverlayPopover.js";import{OverlayNoPopover as M}from"./OverlayNoPopover.js";import{overlayStack as y}from"./OverlayStack.js";import{VirtualTrigger as H}from"./VirtualTrigger.js";import{PlacementController as $}from"./PlacementController.js";export{LONGPRESS_INSTRUCTIONS}from"./LongpressController.js";import{strategies as D}from"./strategies.js";import{removeSlottableRequest as q,SlottableRequestEvent as N}from"./slottable-request-event.js";import F from"./overlay.css.js";const B="showPopover"in document.createElement("div");let p=L(R);B?p=O(p):p=M(p);const i=class i extends p{constructor(){super(...arguments);this._delayed=!1;this._disabled=!1;this.offset=0;this._open=!1;this.lastRequestSlottableState=!1;this.receivesFocus="auto";this._state="closed";this.triggerElement=null;this.type="auto";this.wasOpen=!1;this.closeOnFocusOut=e=>{if(!e.relatedTarget)return;const t=new Event("overlay-relation-query",{bubbles:!0,composed:!0});e.relatedTarget.addEventListener(t.type,o=>{o.composedPath().includes(this)||(this.open=!1)}),e.relatedTarget.dispatchEvent(t)}}get delayed(){var e;return((e=this.elements.at(-1))==null?void 0:e.hasAttribute("delayed"))||this._delayed}set delayed(e){this._delayed=e}get disabled(){return this._disabled}set disabled(e){var t;this._disabled=e,e?((t=this.strategy)==null||t.abort(),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 H)}get placementController(){return this._placementController||(this._placementController=new $(this)),this._placementController}get open(){return this._open}set open(e){var t;e&&this.disabled||e!==this.open&&((t=this.strategy)!=null&&t.activelyOpening&&!e||(this._open=e,this.open&&(i.openCount+=1),this.requestUpdate("open",!this.open),this.open&&this.requestSlottable()))}get state(){return this._state}set state(e){var o;if(e===this.state)return;const t=this.state;this._state=e,(this.state==="opened"||this.state==="closed")&&((o=this.strategy)==null||o.shouldCompleteOpen()),this.requestUpdate("state",t)}get elementResolver(){return this._elementResolver||(this._elementResolver=new w(this)),this._elementResolver}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){if("popover"in this)switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,o=this.placement||"right",s=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:o,tipPadding:s,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 v(),await v(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}returnFocus(){var t;if(this.open||this.type==="hint")return;const e=()=>{var l,m;const o=[];let s=document.activeElement;for(;(l=s==null?void 0:s.shadowRoot)!=null&&l.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const h=s.assignedSlot||s.parentElement||((m=s.getRootNode())==null?void 0:m.host);h&&o.push(h),s=h}return o};this.receivesFocus!=="false"&&((t=this.triggerElement)!=null&&t.focus)&&(this.contains(this.getRootNode().activeElement)||e().includes(this)||document.activeElement===document.body)&&this.triggerElement.focus()}async manageOpen(e){if(!(!this.isConnected&&this.open)&&(this.hasUpdated||await this.updateComplete,this.open?(y.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(),y.remove(this)),this.open&&this.state!=="opened"?this.state="opening":!this.open&&this.state!=="closed"&&(this.state="closing"),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),this.type==="auto")){const t=this.getRootNode();this.open?t.addEventListener("focusout",this.closeOnFocusOut,{capture:!0}):t.removeEventListener("focusout",this.closeOnFocusOut,{capture:!0})}}bindEvents(){var e;(e=this.strategy)==null||e.abort(),this.strategy=void 0,this.hasNonVirtualTrigger&&this.triggerInteraction&&(this.strategy=new D[this.triggerInteraction](this.triggerElement,{overlay:this}))}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose()}handleBrowserClose(){var e;if(!((e=this.strategy)!=null&&e.activelyOpening)){this.open=!1;return}this.manuallyKeepOpen()}manuallyKeepOpen(){this.open=!0,this.placementController.allowPlacementUpdate=!0,this.manageOpen(!1)}handleSlotchange(){var e,t;this.elements.length?this.hasNonVirtualTrigger&&((t=this.strategy)==null||t.prepareDescription(this.triggerElement)):(e=this.strategy)==null||e.releaseDescription()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}requestSlottable(){this.lastRequestSlottableState!==this.open&&(this.open||document.body.offsetHeight,this.dispatchEvent(new N("overlay-content",this.open?{}:q)),this.lastRequestSlottableState=this.open)}willUpdate(e){var o;if(this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${S()}`),e.has("open")&&(this.hasUpdated||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[s,l]=((o=this.trigger)==null?void 0:o.split("@"))||[];this.elementResolver.selector=s?`#${s}`:"",this.triggerInteraction=l}let t=!1;e.has(T)&&(t=this.triggerElement,this.triggerElement=this.elementResolver.element),e.has("triggerElement")&&(t=e.get("triggerElement")),t!==!1&&this.bindEvents()}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()),e.has("state")&&this.state==="closed"&&typeof e.get("state")!="undefined"&&this.placementController.clearOverlayPosition()}renderContent(){return d`
1
+ "use strict";var b=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var r=(u,a,e,t)=>{for(var o=t>1?void 0:t?E(a,e):a,s=u.length-1,l;s>=0;s--)(l=u[s])&&(o=(t?l(a,e,o):l(o))||o);return t&&o&&b(a,e,o),o};import{html as d}from"@spectrum-web-components/base";import{property as n,query as g,queryAssignedElements as C,state as P}from"@spectrum-web-components/base/src/decorators.js";import{ElementResolutionController as w,elementResolverUpdatedSymbol as T}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{ifDefined as c,styleMap as f}from"@spectrum-web-components/base/src/directives.js";import{randomID as S}from"@spectrum-web-components/shared/src/random-id.js";import{AbstractOverlay as R,nextFrame as v}from"./AbstractOverlay.js";import{OverlayDialog as L}from"./OverlayDialog.js";import{OverlayPopover as O}from"./OverlayPopover.js";import{OverlayNoPopover as M}from"./OverlayNoPopover.js";import{overlayStack as y}from"./OverlayStack.js";import{VirtualTrigger as H}from"./VirtualTrigger.js";import{PlacementController as $}from"./PlacementController.js";export{LONGPRESS_INSTRUCTIONS}from"./LongpressController.js";import{strategies as D}from"./strategies.js";import{removeSlottableRequest as q,SlottableRequestEvent as N}from"./slottable-request-event.js";import F from"./overlay.css.js";const B="showPopover"in document.createElement("div");let p=L(R);B?p=O(p):p=M(p);const i=class i extends p{constructor(){super(...arguments);this._delayed=!1;this._disabled=!1;this.offset=0;this._open=!1;this.lastRequestSlottableState=!1;this.receivesFocus="auto";this._state="closed";this.triggerElement=null;this.type="auto";this.wasOpen=!1;this.closeOnFocusOut=e=>{if(!e.relatedTarget)return;const t=new Event("overlay-relation-query",{bubbles:!0,composed:!0});e.relatedTarget.addEventListener(t.type,o=>{o.composedPath().includes(this)||(this.open=!1)}),e.relatedTarget.dispatchEvent(t)}}get delayed(){var e;return((e=this.elements.at(-1))==null?void 0:e.hasAttribute("delayed"))||this._delayed}set delayed(e){this._delayed=e}get disabled(){return this._disabled}set disabled(e){var t;this._disabled=e,e?((t=this.strategy)==null||t.abort(),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 H)}get placementController(){return this._placementController||(this._placementController=new $(this)),this._placementController}get open(){return this._open}set open(e){var t;e&&this.disabled||e!==this.open&&((t=this.strategy)!=null&&t.activelyOpening&&!e||(this._open=e,this.open&&(i.openCount+=1),this.requestUpdate("open",!this.open),this.open&&this.requestSlottable()))}get state(){return this._state}set state(e){var o;if(e===this.state)return;const t=this.state;this._state=e,(this.state==="opened"||this.state==="closed")&&((o=this.strategy)==null||o.shouldCompleteOpen()),this.requestUpdate("state",t)}get elementResolver(){return this._elementResolver||(this._elementResolver=new w(this)),this._elementResolver}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){if("popover"in this)switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,o=this.placement||"right",s=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:o,tipPadding:s,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 v(),await v(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}returnFocus(){var t;if(this.open||this.type==="hint")return;const e=()=>{var l,m;const o=[];let s=document.activeElement;for(;(l=s==null?void 0:s.shadowRoot)!=null&&l.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const h=s.assignedSlot||s.parentElement||((m=s.getRootNode())==null?void 0:m.host);h&&o.push(h),s=h}return o};this.receivesFocus!=="false"&&((t=this.triggerElement)!=null&&t.focus)&&(this.contains(this.getRootNode().activeElement)||e().includes(this)||document.activeElement===document.body)&&this.triggerElement.focus()}async manageOpen(e){if(!(!this.isConnected&&this.open)&&(this.hasUpdated||await this.updateComplete,this.open?(y.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(),y.remove(this)),this.open&&this.state!=="opened"?this.state="opening":!this.open&&this.state!=="closed"&&(this.state="closing"),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),this.type==="auto")){const t=this.getRootNode();this.open?t.addEventListener("focusout",this.closeOnFocusOut,{capture:!0}):t.removeEventListener("focusout",this.closeOnFocusOut,{capture:!0})}}bindEvents(){var e;(e=this.strategy)==null||e.abort(),this.strategy=void 0,this.hasNonVirtualTrigger&&this.triggerInteraction&&(this.strategy=new D[this.triggerInteraction](this.triggerElement,{overlay:this}))}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose(e)}handleBrowserClose(e){var t;if(e.stopPropagation(),!((t=this.strategy)!=null&&t.activelyOpening)){this.open=!1;return}this.manuallyKeepOpen()}manuallyKeepOpen(){this.open=!0,this.placementController.allowPlacementUpdate=!0,this.manageOpen(!1)}handleSlotchange(){var e,t;this.elements.length?this.hasNonVirtualTrigger&&((t=this.strategy)==null||t.prepareDescription(this.triggerElement)):(e=this.strategy)==null||e.releaseDescription()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}requestSlottable(){this.lastRequestSlottableState!==this.open&&(this.open||document.body.offsetHeight,this.dispatchEvent(new N("overlay-content",this.open?{}:q)),this.lastRequestSlottableState=this.open)}willUpdate(e){var o;if(this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${S()}`),e.has("open")&&(this.hasUpdated||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[s,l]=((o=this.trigger)==null?void 0:o.split("@"))||[];this.elementResolver.selector=s?`#${s}`:"",this.triggerInteraction=l}let t=!1;e.has(T)&&(t=this.triggerElement,this.triggerElement=this.elementResolver.element),e.has("triggerElement")&&(t=e.get("triggerElement")),t!==!1&&this.bindEvents()}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()),e.has("state")&&this.state==="closed"&&typeof e.get("state")!="undefined"&&this.placementController.clearOverlayPosition()}renderContent(){return d`
2
2
  <slot @slotchange=${this.handleSlotchange}></slot>
3
3
  `}get dialogStyleMap(){return{"--swc-overlay-open-count":i.openCount.toString()}}renderDialog(){return d`
4
4
  <dialog
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["Overlay.ts"],
4
- "sourcesContent": ["/*\nCopyright 2023 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\n TriggerInteraction,\n} from './overlay-types.js';\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.js';\nimport { OverlayDialog } from './OverlayDialog.js';\nimport { OverlayPopover } from './OverlayPopover.js';\nimport { OverlayNoPopover } from './OverlayNoPopover.js';\nimport { overlayStack } from './OverlayStack.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { PlacementController } from './PlacementController.js';\nimport type { ClickController } from './ClickController.js';\nimport type { HoverController } from './HoverController.js';\nimport type { LongpressController } from './LongpressController.js';\nexport { LONGPRESS_INSTRUCTIONS } from './LongpressController.js';\nimport { strategies } from './strategies.js';\nimport {\n removeSlottableRequest,\n SlottableRequestEvent,\n} from './slottable-request-event.js';\n\nimport styles from './overlay.css.js';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n * @fires slottable-request - requests to add or remove slottable content\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\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 get delayed(): boolean {\n return this.elements.at(-1)?.hasAttribute('delayed') || this._delayed;\n }\n\n override set delayed(delayed: boolean) {\n this._delayed = delayed;\n }\n\n private _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 override get disabled(): boolean {\n return this._disabled;\n }\n\n override set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n this.strategy?.abort();\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\"], slot)', // 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 /**\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 override offset: number | [number, number] = 0;\n\n protected override get placementController(): PlacementController {\n if (!this._placementController) {\n this._placementController = new PlacementController(this);\n }\n return this._placementController;\n }\n\n /**\n * Whether the Overlay is projected onto the \"top layer\" or not.\n */\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n // Don't respond when disabled.\n if (open && this.disabled) return;\n // Don't respond when state not dirty\n if (open === this.open) return;\n // Don't respond when you're in the shadow on a longpress\n // Shadow occurs when the first \"click\" would normally close the popover\n if (this.strategy?.activelyOpening && !open) return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n if (this.open) {\n this.requestSlottable();\n }\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 * @type {\"top\" | \"top-start\" | \"top-end\" | \"right\" | \"right-start\" | \"right-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"left-start\" | \"left-end\"}\n */\n @property()\n override placement?: Placement;\n\n /**\n * The state in which the last `request-slottable` event was dispatched.\n * Do not allow overlays from dispatching the same state twice in a row.\n */\n private lastRequestSlottableState = false;\n\n /**\n * Whether to pass focus to the overlay once opened, or\n * to the appropriate value based on the \"type\" of the overlay\n * when set to `\"auto\"`.\n *\n */\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n this.strategy?.shouldCompleteOpen();\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n public strategy?: ClickController | HoverController | LongpressController;\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?: TriggerInteraction;\n\n /**\n * Configures the open/close heuristics of the Overlay.\n * @type {\"auto\" | \"hint\" | \"manual\" | \"modal\" | \"page\"}\n */\n @property()\n override type: OverlayTypes = 'auto';\n\n protected wasOpen = false;\n\n protected override get elementResolver(): ElementResolutionController {\n if (!this._elementResolver) {\n this._elementResolver = new ElementResolutionController(this);\n }\n return this._elementResolver;\n }\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected override returnFocus(): void {\n if (this.open || this.type === 'hint') return;\n\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 (currentNode?.shadowRoot?.activeElement) {\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.receivesFocus !== 'false' &&\n !!(this.triggerElement as HTMLElement)?.focus &&\n (this.contains((this.getRootNode() as Document).activeElement) ||\n getAncestors().includes(this) ||\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n document.activeElement === document.body)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n\n private closeOnFocusOut = (event: FocusEvent): void => {\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n // this.open = false;\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 protected async manageOpen(oldOpen: boolean): Promise<void> {\n // The `.showPopover()` and `.showModal()` events will error on content that is not connected to the DOM.\n // Prevent from entering the manage workflow in order to avoid this.\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n if (this.open && this.state !== 'opened') {\n this.state = 'opening';\n } else if (!this.open && this.state !== 'closed') {\n this.state = 'closing';\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (this.type === 'auto') {\n const listenerRoot = this.getRootNode() as Document;\n if (this.open) {\n listenerRoot.addEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n } else {\n listenerRoot.removeEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n }\n }\n }\n\n protected bindEvents(): void {\n this.strategy?.abort();\n this.strategy = undefined;\n if (!this.hasNonVirtualTrigger) return;\n if (!this.triggerInteraction) return;\n this.strategy = new strategies[this.triggerInteraction](\n this.triggerElement as HTMLElement,\n {\n overlay: this,\n }\n );\n }\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n if (!this.strategy?.activelyOpening) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (!this.elements.length) {\n this.strategy?.releaseDescription();\n } else if (this.hasNonVirtualTrigger) {\n this.strategy?.prepareDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n protected override requestSlottable(): void {\n if (this.lastRequestSlottableState === this.open) {\n return;\n }\n if (!this.open) {\n document.body.offsetHeight;\n }\n /**\n * @ignore\n */\n this.dispatchEvent(\n new SlottableRequestEvent(\n 'overlay-content',\n this.open ? {} : removeSlottableRequest\n )\n );\n this.lastRequestSlottableState = this.open;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${randomID()}`\n );\n }\n if (changes.has('open') && (this.hasUpdated || this.open)) {\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 // Merge multiple possible calls to `bindEvents()`.\n let oldTrigger: HTMLElement | false | undefined = false;\n if (changes.has(elementResolverUpdatedSymbol)) {\n oldTrigger = this.triggerElement as HTMLElement;\n this.triggerElement = this.elementResolver.element;\n }\n if (changes.has('triggerElement')) {\n oldTrigger = changes.get('triggerElement');\n }\n if (oldTrigger !== false) {\n this.bindEvents();\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 if (\n changes.has('state') &&\n this.state === 'closed' &&\n typeof changes.get('state') !== 'undefined'\n ) {\n this.placementController.clearOverlayPosition();\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <slot @slotchange=${this.handleSlotchange}></slot>\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 placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n style=${styleMap(this.dialogStyleMap)}\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n popover=${ifDefined(this.popoverValue)}\n style=${styleMap(this.dialogStyleMap)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasUpdated) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n this.strategy?.releaseDescription();\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
- "mappings": "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",
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 ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { randomID } from '@spectrum-web-components/shared/src/random-id.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\n TriggerInteraction,\n} from './overlay-types.js';\nimport { AbstractOverlay, nextFrame } from './AbstractOverlay.js';\nimport { OverlayDialog } from './OverlayDialog.js';\nimport { OverlayPopover } from './OverlayPopover.js';\nimport { OverlayNoPopover } from './OverlayNoPopover.js';\nimport { overlayStack } from './OverlayStack.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\nimport { PlacementController } from './PlacementController.js';\nimport type { ClickController } from './ClickController.js';\nimport type { HoverController } from './HoverController.js';\nimport type { LongpressController } from './LongpressController.js';\nexport { LONGPRESS_INSTRUCTIONS } from './LongpressController.js';\nimport { strategies } from './strategies.js';\nimport {\n removeSlottableRequest,\n SlottableRequestEvent,\n} from './slottable-request-event.js';\n\nimport styles from './overlay.css.js';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n * @fires slottable-request - requests to add or remove slottable content\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\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 get delayed(): boolean {\n return this.elements.at(-1)?.hasAttribute('delayed') || this._delayed;\n }\n\n override set delayed(delayed: boolean) {\n this._delayed = delayed;\n }\n\n private _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 override get disabled(): boolean {\n return this._disabled;\n }\n\n override set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n this.strategy?.abort();\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\"], slot)', // 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 /**\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 override offset: number | [number, number] = 0;\n\n protected override get placementController(): PlacementController {\n if (!this._placementController) {\n this._placementController = new PlacementController(this);\n }\n return this._placementController;\n }\n\n /**\n * Whether the Overlay is projected onto the \"top layer\" or not.\n */\n @property({ type: Boolean, reflect: true })\n override get open(): boolean {\n return this._open;\n }\n\n override set open(open: boolean) {\n // Don't respond when disabled.\n if (open && this.disabled) return;\n // Don't respond when state not dirty\n if (open === this.open) return;\n // Don't respond when you're in the shadow on a longpress\n // Shadow occurs when the first \"click\" would normally close the popover\n if (this.strategy?.activelyOpening && !open) return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n if (this.open) {\n this.requestSlottable();\n }\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 * @type {\"top\" | \"top-start\" | \"top-end\" | \"right\" | \"right-start\" | \"right-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"left-start\" | \"left-end\"}\n */\n @property()\n override placement?: Placement;\n\n /**\n * The state in which the last `request-slottable` event was dispatched.\n * Do not allow overlays from dispatching the same state twice in a row.\n */\n private lastRequestSlottableState = false;\n\n /**\n * Whether to pass focus to the overlay once opened, or\n * to the appropriate value based on the \"type\" of the overlay\n * when set to `\"auto\"`.\n *\n */\n @property({ attribute: 'receives-focus' })\n override receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n this.strategy?.shouldCompleteOpen();\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n public strategy?: ClickController | HoverController | LongpressController;\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?: TriggerInteraction;\n\n /**\n * Configures the open/close heuristics of the Overlay.\n * @type {\"auto\" | \"hint\" | \"manual\" | \"modal\" | \"page\"}\n */\n @property()\n override type: OverlayTypes = 'auto';\n\n protected wasOpen = false;\n\n protected override get elementResolver(): ElementResolutionController {\n if (!this._elementResolver) {\n this._elementResolver = new ElementResolutionController(this);\n }\n return this._elementResolver;\n }\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n protected override returnFocus(): void {\n if (this.open || this.type === 'hint') return;\n\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 (currentNode?.shadowRoot?.activeElement) {\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.receivesFocus !== 'false' &&\n !!(this.triggerElement as HTMLElement)?.focus &&\n (this.contains((this.getRootNode() as Document).activeElement) ||\n getAncestors().includes(this) ||\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n document.activeElement === document.body)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n\n private closeOnFocusOut = (event: FocusEvent): void => {\n // If you don't know where the focus went, we can't do anyting here.\n if (!event.relatedTarget) {\n // this.open = false;\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 protected async manageOpen(oldOpen: boolean): Promise<void> {\n // The `.showPopover()` and `.showModal()` events will error on content that is not connected to the DOM.\n // Prevent from entering the manage workflow in order to avoid this.\n if (!this.isConnected && this.open) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n if (this.willPreventClose) {\n document.addEventListener(\n 'pointerup',\n () => {\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n false\n );\n this.willPreventClose = false;\n },\n { once: true }\n );\n this.dialogEl.classList.toggle(\n 'not-immediately-closable',\n true\n );\n }\n } else {\n if (oldOpen) {\n this.dispose();\n }\n overlayStack.remove(this);\n }\n if (this.open && this.state !== 'opened') {\n this.state = 'opening';\n } else if (!this.open && this.state !== 'closed') {\n this.state = 'closing';\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (this.type === 'auto') {\n const listenerRoot = this.getRootNode() as Document;\n if (this.open) {\n listenerRoot.addEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n } else {\n listenerRoot.removeEventListener(\n 'focusout',\n this.closeOnFocusOut,\n { capture: true }\n );\n }\n }\n }\n\n protected bindEvents(): void {\n this.strategy?.abort();\n this.strategy = undefined;\n if (!this.hasNonVirtualTrigger) return;\n if (!this.triggerInteraction) return;\n this.strategy = new strategies[this.triggerInteraction](\n this.triggerElement as HTMLElement,\n {\n overlay: this,\n }\n );\n }\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose(event);\n }\n }\n\n protected handleBrowserClose(event: Event): void {\n event.stopPropagation();\n if (!this.strategy?.activelyOpening) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (!this.elements.length) {\n this.strategy?.releaseDescription();\n } else if (this.hasNonVirtualTrigger) {\n this.strategy?.prepareDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n protected override requestSlottable(): void {\n if (this.lastRequestSlottableState === this.open) {\n return;\n }\n if (!this.open) {\n document.body.offsetHeight;\n }\n /**\n * @ignore\n */\n this.dispatchEvent(\n new SlottableRequestEvent(\n 'overlay-content',\n this.open ? {} : removeSlottableRequest\n )\n );\n this.lastRequestSlottableState = this.open;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${randomID()}`\n );\n }\n if (changes.has('open') && (this.hasUpdated || this.open)) {\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 // Merge multiple possible calls to `bindEvents()`.\n let oldTrigger: HTMLElement | false | undefined = false;\n if (changes.has(elementResolverUpdatedSymbol)) {\n oldTrigger = this.triggerElement as HTMLElement;\n this.triggerElement = this.elementResolver.element;\n }\n if (changes.has('triggerElement')) {\n oldTrigger = changes.get('triggerElement');\n }\n if (oldTrigger !== false) {\n this.bindEvents();\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 if (\n changes.has('state') &&\n this.state === 'closed' &&\n typeof changes.get('state') !== 'undefined'\n ) {\n this.placementController.clearOverlayPosition();\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <slot @slotchange=${this.handleSlotchange}></slot>\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 placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n style=${styleMap(this.dialogStyleMap)}\n @close=${this.handleBrowserClose}\n @cancel=${this.handleBrowserClose}\n @beforetoggle=${this.handleBeforetoggle}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </dialog>\n `;\n }\n\n protected renderPopover(): TemplateResult {\n /**\n * `--swc-overlay-open-count` is applied to mimic the single stack\n * nature of the top layer in browsers that do not yet support it.\n *\n * The value should always be the full number of overlays ever opened\n * which will be added to `--swc-overlay-z-index-base` which can be\n * provided by a consuming developer but defaults to 1000 to beat as\n * much stacking as possible durring fallback delivery.\n **/\n return html`\n <div\n class=\"dialog\"\n part=\"dialog\"\n placement=${ifDefined(\n this.requiresPosition\n ? this.placement || 'right'\n : undefined\n )}\n popover=${ifDefined(this.popoverValue)}\n style=${styleMap(this.dialogStyleMap)}\n @beforetoggle=${this.handleBeforetoggle}\n @close=${this.handleBrowserClose}\n ?is-visible=${this.state !== 'closed'}\n >\n ${this.renderContent()}\n </div>\n `;\n }\n\n public override render(): TemplateResult {\n const isDialog = this.type === 'modal' || this.type === 'page';\n return html`\n ${isDialog ? this.renderDialog() : this.renderPopover()}\n <slot name=\"longpress-describedby-descriptor\"></slot>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('close', () => {\n this.open = false;\n });\n if (this.hasUpdated) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n this.strategy?.releaseDescription();\n this.open = false;\n super.disconnectedCallback();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["html", "property", "query", "queryAssignedElements", "state", "ElementResolutionController", "elementResolverUpdatedSymbol", "ifDefined", "styleMap", "randomID", "AbstractOverlay", "nextFrame", "OverlayDialog", "OverlayPopover", "OverlayNoPopover", "overlayStack", "VirtualTrigger", "PlacementController", "strategies", "removeSlottableRequest", "SlottableRequestEvent", "styles", "supportsPopover", "OverlayFeatures", "_Overlay", "event", "relationEvent", "_a", "delayed", "disabled", "open", "oldState", "offset", "trigger", "placement", "tipPadding", "targetOpenState", "focusEl", "getAncestors", "_b", "ancestors", "currentNode", "ancestor", "oldOpen", "listenerRoot", "shouldPreventClose", "changes", "id", "interaction", "oldTrigger", "isDialog", "__decorateClass"]
7
7
  }
@@ -15,6 +15,7 @@ export function OverlayDialog(constructor) {
15
15
  class OverlayWithDialog extends constructor {
16
16
  async manageDialogOpen() {
17
17
  const targetOpenState = this.open;
18
+ await nextFrame();
18
19
  await this.managePosition();
19
20
  if (this.open !== targetOpenState) {
20
21
  return;
@@ -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 type { SpectrumElement } from '@spectrum-web-components/base';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { Constructor, OpenableElement } from './overlay-types.dev.js'\nimport { guaranteedAllTransitionend, nextFrame } from './AbstractOverlay.dev.js'\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n OverlayStateEvent,\n} from './events.dev.js'\nimport type { AbstractOverlay } from './AbstractOverlay.dev.js'\nimport { userFocusableSelector } from '@spectrum-web-components/shared';\n\nexport function OverlayDialog<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<SpectrumElement> {\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 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 el.open = targetOpenState;\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) {\n // Announce workflow on the first element _only_.\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n if (!targetOpenState) {\n // Show/focus workflow when opening _only_.\n return;\n }\n if (el.matches(userFocusableSelector)) {\n focusEl = el;\n }\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 // In both of these cases the browser will error.\n // You can neither \"reopen\" a <dialog> or open one that is not on the DOM.\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 OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: false,\n })\n );\n return;\n }\n if (!this.isConnected || targetOpenState !== this.open) {\n // Don't lead into the `.close()` workflow if not connected to the DOM.\n // The browser will error in this case.\n return;\n }\n const reportChange = async (): Promise<void> => {\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: true,\n })\n );\n }\n this.state = targetOpenState ? 'opened' : 'closed';\n this.returnFocus();\n // Ensure layout and paint are done and the Overlay is still closed before removing the slottable request.\n await nextFrame();\n await nextFrame();\n if (\n targetOpenState === this.open &&\n targetOpenState === false\n ) {\n this.requestSlottable();\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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",
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 type { SpectrumElement } from '@spectrum-web-components/base';\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { Constructor, OpenableElement } from './overlay-types.dev.js'\nimport { guaranteedAllTransitionend, nextFrame } from './AbstractOverlay.dev.js'\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n OverlayStateEvent,\n} from './events.dev.js'\nimport type { AbstractOverlay } from './AbstractOverlay.dev.js'\nimport { userFocusableSelector } from '@spectrum-web-components/shared';\n\nexport function OverlayDialog<T extends Constructor<AbstractOverlay>>(\n constructor: T\n): T & Constructor<SpectrumElement> {\n class OverlayWithDialog extends constructor {\n protected override async manageDialogOpen(): Promise<void> {\n const targetOpenState = this.open;\n await nextFrame();\n await this.managePosition();\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 el.open = targetOpenState;\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) {\n // Announce workflow on the first element _only_.\n return;\n }\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n if (!targetOpenState) {\n // Show/focus workflow when opening _only_.\n return;\n }\n if (el.matches(userFocusableSelector)) {\n focusEl = el;\n }\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 // In both of these cases the browser will error.\n // You can neither \"reopen\" a <dialog> or open one that is not on the DOM.\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 OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: false,\n })\n );\n return;\n }\n if (!this.isConnected || targetOpenState !== this.open) {\n // Don't lead into the `.close()` workflow if not connected to the DOM.\n // The browser will error in this case.\n return;\n }\n const reportChange = async (): Promise<void> => {\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new OverlayStateEvent(eventName, this, {\n interaction: this.type,\n publish: true,\n })\n );\n }\n this.state = targetOpenState ? 'opened' : 'closed';\n this.returnFocus();\n // Ensure layout and paint are done and the Overlay is still closed before removing the slottable request.\n await nextFrame();\n await nextFrame();\n if (\n targetOpenState === this.open &&\n targetOpenState === false\n ) {\n this.requestSlottable();\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 u,firstFocusableSlottedIn as d}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{VirtualTrigger as f}from"./VirtualTrigger.js";import{guaranteedAllTransitionend as E,nextFrame as c}from"./AbstractOverlay.js";import{BeforetoggleClosedEvent as v,BeforetoggleOpenEvent as g,OverlayStateEvent as l}from"./events.js";import{userFocusableSelector as y}from"@spectrum-web-components/shared";export function OverlayDialog(h){class p extends h{async manageDialogOpen(){const e=this.open;if(await this.managePosition(),this.open!==e)return;const i=await this.dialogMakeTransition(e);this.open===e&&await this.dialogApplyFocus(e,i)}async dialogMakeTransition(e){let i=null;const m=(t,s)=>async()=>{if(t.open=e,!e){const n=()=>{t.removeEventListener("close",n),a(t,s)};t.addEventListener("close",n)}if(s>0)return;const o=e?g:v;this.dispatchEvent(new o),e&&(t.matches(y)&&(i=t),i=i||u(t),i||t.querySelectorAll("slot").forEach(r=>{i||(i=d(r))}),!(!this.isConnected||this.dialogEl.open)&&this.dialogEl.showModal())},a=(t,s)=>()=>{if(this.open!==e)return;const o=e?"sp-opened":"sp-closed";if(s>0){t.dispatchEvent(new l(o,this,{interaction:this.type,publish:!1}));return}if(!this.isConnected||e!==this.open)return;const n=async()=>{const r=this.triggerElement instanceof f;this.dispatchEvent(new l(o,this,{interaction:this.type,publish:r})),t.dispatchEvent(new l(o,this,{interaction:this.type,publish:!1})),this.triggerElement&&!r&&this.triggerElement.dispatchEvent(new l(o,this,{interaction:this.type,publish:!0})),this.state=e?"opened":"closed",this.returnFocus(),await c(),await c(),e===this.open&&e===!1&&this.requestSlottable()};!e&&this.dialogEl.open?(this.dialogEl.addEventListener("close",()=>{n()},{once:!0}),this.dialogEl.close()):n()};return this.elements.forEach((t,s)=>{E(t,m(t,s),a(t,s))}),i}async dialogApplyFocus(e,i){this.applyFocus(e,i)}}return p}
1
+ "use strict";import{firstFocusableIn as u,firstFocusableSlottedIn as d}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{VirtualTrigger as f}from"./VirtualTrigger.js";import{guaranteedAllTransitionend as E,nextFrame as a}from"./AbstractOverlay.js";import{BeforetoggleClosedEvent as v,BeforetoggleOpenEvent as g,OverlayStateEvent as l}from"./events.js";import{userFocusableSelector as y}from"@spectrum-web-components/shared";export function OverlayDialog(h){class p extends h{async manageDialogOpen(){const e=this.open;if(await a(),await this.managePosition(),this.open!==e)return;const i=await this.dialogMakeTransition(e);this.open===e&&await this.dialogApplyFocus(e,i)}async dialogMakeTransition(e){let i=null;const m=(t,s)=>async()=>{if(t.open=e,!e){const n=()=>{t.removeEventListener("close",n),c(t,s)};t.addEventListener("close",n)}if(s>0)return;const o=e?g:v;this.dispatchEvent(new o),e&&(t.matches(y)&&(i=t),i=i||u(t),i||t.querySelectorAll("slot").forEach(r=>{i||(i=d(r))}),!(!this.isConnected||this.dialogEl.open)&&this.dialogEl.showModal())},c=(t,s)=>()=>{if(this.open!==e)return;const o=e?"sp-opened":"sp-closed";if(s>0){t.dispatchEvent(new l(o,this,{interaction:this.type,publish:!1}));return}if(!this.isConnected||e!==this.open)return;const n=async()=>{const r=this.triggerElement instanceof f;this.dispatchEvent(new l(o,this,{interaction:this.type,publish:r})),t.dispatchEvent(new l(o,this,{interaction:this.type,publish:!1})),this.triggerElement&&!r&&this.triggerElement.dispatchEvent(new l(o,this,{interaction:this.type,publish:!0})),this.state=e?"opened":"closed",this.returnFocus(),await a(),await a(),e===this.open&&e===!1&&this.requestSlottable()};!e&&this.dialogEl.open?(this.dialogEl.addEventListener("close",()=>{n()},{once:!0}),this.dialogEl.close()):n()};return this.elements.forEach((t,s)=>{E(t,m(t,s),c(t,s))}),i}async dialogApplyFocus(e,i){this.applyFocus(e,i)}}return p}
2
2
  //# sourceMappingURL=OverlayDialog.js.map