@spectrum-web-components/overlay 0.40.0 → 0.40.2
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.
- package/README.md +12 -0
- package/custom-elements.json +1 -1
- package/package.json +7 -7
- package/src/Overlay.d.ts +1 -1
- package/src/Overlay.dev.js +8 -3
- package/src/Overlay.dev.js.map +2 -2
- package/src/Overlay.js +1 -1
- package/src/Overlay.js.map +2 -2
- package/src/OverlayDialog.dev.js +1 -3
- package/src/OverlayDialog.dev.js.map +2 -2
- package/src/OverlayDialog.js +1 -1
- package/src/OverlayDialog.js.map +2 -2
- package/src/OverlayNoPopover.dev.js +1 -3
- package/src/OverlayNoPopover.dev.js.map +2 -2
- package/src/OverlayNoPopover.js +1 -1
- package/src/OverlayNoPopover.js.map +2 -2
- package/src/OverlayPopover.dev.js +1 -3
- package/src/OverlayPopover.dev.js.map +2 -2
- package/src/OverlayPopover.js +1 -1
- package/src/OverlayPopover.js.map +2 -2
- package/stories/index.js +40 -0
- package/stories/index.js.map +7 -0
- package/stories/overlay-element.stories.js +7 -0
- package/stories/overlay-element.stories.js.map +2 -2
- package/stories/overlay-story-components.js +32 -0
- package/stories/overlay-story-components.js.map +2 -2
- package/test/index.js +7 -5
- package/test/index.js.map +2 -2
- package/test/overlay-update.test.js +2 -0
- package/test/overlay-update.test.js.map +2 -2
package/README.md
CHANGED
|
@@ -41,6 +41,8 @@ By leveraging the `trigger` attribute to pass an ID reference to another element
|
|
|
41
41
|
</sp-overlay>
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
When a `<sp-overlay>` element is opened, it will pass that state to its direct children elements as the property `open`, which it will set to `true`. Elements should react to this by initiating any transition between closed and open that they see fit. Similarly, `open` will be set to `false` when the `<sp-overlay>` element is closed.
|
|
45
|
+
|
|
44
46
|
### Action bar
|
|
45
47
|
|
|
46
48
|
```html
|
|
@@ -169,6 +171,16 @@ When a `triggerElement` is present, either through an ID reference established v
|
|
|
169
171
|
- **if you have a `placement` but not a `triggerElement`** the `<sp-overlay>` will not be positioned due to their being nothing for the `plaement` to reference when so doing
|
|
170
172
|
- **if no `placement` is available** the content will not be placed with the expectation that the content itself or the consuming application will handle placement of the overlaid content. This is commonly what will happen for `type="modal"` and `type="page"` overlays as they are likely meant to cover the entire screen, whether visibly (via an `<sp-underlay>`, an element that includes one, or similar) or figuratively (as when modal content is not delivered with a backdrop or scrim).
|
|
171
173
|
|
|
174
|
+
### Type
|
|
175
|
+
|
|
176
|
+
The `type` of an Overlay outlines a number of things about the interaction model within which is works.
|
|
177
|
+
|
|
178
|
+
- `'modal'` Overlays are opened with the `showModal()` method on a `<dialog>` element, which causes the Overlay to accept focus and trap the tab stop within the content of said Overlay.
|
|
179
|
+
- `'page'` Overlays will act in a similar manner to a `'modal'` Overlay, however they will not be allowed to close via the "light dismiss" algorithm (e.g. the Escape key).
|
|
180
|
+
- `'hint'` Overlays are much like tooltips so they are not just ephemeral, but they are delivered primarily as a visual helper and exist outside of the tab order. In this way, be sure _not_ to place interactive content within this type of Overlay.
|
|
181
|
+
- `'auto'` Overlays provide a place for content that is ephemeral _and_ interactive. These Overlays can accept focus but will close when losing that focus, or when interacting with other parts of the page.
|
|
182
|
+
- `'manual'` Overlays act much like `"auto"` Overlays, but do not close when losing focus or interacting with other parts of the page. When a `"manual"` Overlay is at the top of the "overlay stack", it will still respond to the Escape key and close.
|
|
183
|
+
|
|
172
184
|
### Events
|
|
173
185
|
|
|
174
186
|
When fully open the `<sp-overlay>` element will dispatch the `sp-opened` event, and when fully closed the `sp-closed` event will be dispatched. "Fully" in this context means that all CSS transitions that have dispatched `transitionrun` events on the direct children of the `<sp-overlay>` element have successfully dispatched their `transitionend` or `transitioncancel` event. Keep in mind the following:
|
package/custom-elements.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/overlay",
|
|
3
|
-
"version": "0.40.
|
|
3
|
+
"version": "0.40.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -128,11 +128,11 @@
|
|
|
128
128
|
"dependencies": {
|
|
129
129
|
"@floating-ui/dom": "^1.5.3",
|
|
130
130
|
"@floating-ui/utils": "^0.1.6",
|
|
131
|
-
"@spectrum-web-components/action-button": "^0.40.
|
|
132
|
-
"@spectrum-web-components/base": "^0.40.
|
|
133
|
-
"@spectrum-web-components/reactive-controllers": "^0.40.
|
|
134
|
-
"@spectrum-web-components/shared": "^0.40.
|
|
135
|
-
"@spectrum-web-components/theme": "^0.40.
|
|
131
|
+
"@spectrum-web-components/action-button": "^0.40.2",
|
|
132
|
+
"@spectrum-web-components/base": "^0.40.2",
|
|
133
|
+
"@spectrum-web-components/reactive-controllers": "^0.40.2",
|
|
134
|
+
"@spectrum-web-components/shared": "^0.40.2",
|
|
135
|
+
"@spectrum-web-components/theme": "^0.40.2"
|
|
136
136
|
},
|
|
137
137
|
"types": "./src/index.d.ts",
|
|
138
138
|
"customElements": "custom-elements.json",
|
|
@@ -144,5 +144,5 @@
|
|
|
144
144
|
"./stories/overlay-story-components.js",
|
|
145
145
|
"./**/*.dev.js"
|
|
146
146
|
],
|
|
147
|
-
"gitHead": "
|
|
147
|
+
"gitHead": "e5fd35c7a98569150ca695ec0e0e7411c9c64c28"
|
|
148
148
|
}
|
package/src/Overlay.d.ts
CHANGED
|
@@ -116,7 +116,7 @@ export declare class Overlay extends OverlayFeatures {
|
|
|
116
116
|
protected bindClickEvents(triggerElement: HTMLElement): void;
|
|
117
117
|
protected bindLongpressEvents(triggerElement: HTMLElement): void;
|
|
118
118
|
protected bindHoverEvents(triggerElement: HTMLElement): void;
|
|
119
|
-
protected manageTriggerElement(triggerElement: HTMLElement |
|
|
119
|
+
protected manageTriggerElement(triggerElement: HTMLElement | undefined): void;
|
|
120
120
|
private elementIds;
|
|
121
121
|
private prepareLongpressDescription;
|
|
122
122
|
private prepareAriaDescribedby;
|
package/src/Overlay.dev.js
CHANGED
|
@@ -435,8 +435,10 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
435
435
|
(_a = this.abortController) == null ? void 0 : _a.abort();
|
|
436
436
|
}
|
|
437
437
|
bindEvents() {
|
|
438
|
+
var _a;
|
|
438
439
|
if (!this.hasNonVirtualTrigger)
|
|
439
440
|
return;
|
|
441
|
+
(_a = this.abortController) == null ? void 0 : _a.abort();
|
|
440
442
|
this.abortController = new AbortController();
|
|
441
443
|
const nextTriggerElement = this.triggerElement;
|
|
442
444
|
switch (this.triggerInteraction) {
|
|
@@ -661,13 +663,16 @@ const _Overlay = class _Overlay extends OverlayFeatures {
|
|
|
661
663
|
this.elementResolver.selector = id ? `#${id}` : "";
|
|
662
664
|
this.triggerInteraction = interaction;
|
|
663
665
|
}
|
|
664
|
-
|
|
666
|
+
let oldTrigger = false;
|
|
665
667
|
if (changes.has(elementResolverUpdatedSymbol)) {
|
|
668
|
+
oldTrigger = this.triggerElement;
|
|
666
669
|
this.triggerElement = this.elementResolver.element;
|
|
667
|
-
this.manageTriggerElement(oldTrigger);
|
|
668
670
|
}
|
|
669
671
|
if (changes.has("triggerElement")) {
|
|
670
|
-
|
|
672
|
+
oldTrigger = changes.get("triggerElement");
|
|
673
|
+
}
|
|
674
|
+
if (oldTrigger !== false) {
|
|
675
|
+
this.manageTriggerElement(oldTrigger);
|
|
671
676
|
}
|
|
672
677
|
}
|
|
673
678
|
updated(changes) {
|
package/src/Overlay.dev.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["Overlay.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nCopyright 2023 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\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 { noop } from './AbstractOverlay.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst LONGPRESS_DURATION = 300;\nconst HOVER_DELAY = 300;\n\ntype LongpressEvent = {\n source: 'pointer' | 'keyboard';\n};\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\n\n abortController!: AbortController;\n\n /**\n * An Overlay that is `delayed` will wait until a warm-up period of 1000ms\n * has completed before opening. Once the warmup period has completed, all\n * subsequent Overlays will open immediately. When no Overlays are opened,\n * a cooldown period of 1000ms will begin. Once the cooldown has completed,\n * the next Overlay to be opened will be subject to the warm-up period if\n * provided that option.\n */\n @property({ type: Boolean })\n override 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 get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.wasOpen = this.open;\n this.open = false;\n } else {\n this.bindEvents();\n this.open = this.open || this.wasOpen;\n this.wasOpen = false;\n }\n }\n\n private _disabled = false;\n\n @queryAssignedElements({\n flatten: true,\n selector: ':not([slot=\"longpress-describedby-descriptor\"], 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 protected longpressState: 'null' | 'potential' | 'opening' | 'pressed' =\n 'null';\n\n private longressTimeout!: ReturnType<typeof setTimeout>;\n private hoverTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * The `offset` property accepts either a single number, to\n * define the offset of the Overlay along the main axis from\n * the trigger, or 2-tuple, to define the offset along the\n * main axis and the cross axis. This option has no effect\n * when there is no trigger element.\n */\n @property({ type: Number })\n override offset: number | [number, number] = 6;\n\n protected override placementController = new PlacementController(this);\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 (\n (this.longpressState === 'opening' ||\n this.longpressState === 'pressed') &&\n !open\n )\n return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n }\n\n private _open = false;\n\n static openCount = 1;\n\n /**\n * Instruct the Overlay where to place itself in\n * relationship to the trigger element.\n * @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 * 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 private releaseAriaDescribedby = noop;\n private releaseLongpressDescribedby = noop;\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState =\n this.longpressState === 'pressed'\n ? 'null'\n : this.longpressState;\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n @property({ type: Number, attribute: 'tip-padding' })\n tipPadding?: number;\n\n /**\n * An optional ID reference for the trigger element combined with the optional\n * interaction (click | hover | longpress) by which the overlay shold open\n * the overlay with an `@`: e.g. `trigger@click` opens the overlay when an\n * element with the ID \"trigger\" is clicked.\n */\n @property()\n trigger?: string;\n\n /**\n * An element reference for the trigger element that the overlay should relate to.\n */\n @property({ attribute: false })\n override triggerElement: HTMLElement | VirtualTrigger | null = null;\n\n /**\n * The specific interaction to listen for on the `triggerElement` to open the overlay.\n */\n @property({ attribute: false })\n triggerInteraction?: 'click' | 'longpress' | 'hover';\n\n /**\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 private elementResolver = new ElementResolutionController(this);\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n 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 if (!this.open && this.type !== 'hint') {\n // If the focus remains inside of the overlay or\n // a slotted descendent of the overlay you need to return\n // focus back to the trigger.\n const getAncestors = (): HTMLElement[] => {\n const ancestors: HTMLElement[] = [];\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n let currentNode = document.activeElement;\n while (\n currentNode?.shadowRoot &&\n currentNode.shadowRoot.activeElement\n ) {\n currentNode = currentNode.shadowRoot.activeElement;\n }\n while (currentNode) {\n const ancestor =\n currentNode.assignedSlot ||\n currentNode.parentElement ||\n (currentNode.getRootNode() as ShadowRoot)?.host;\n if (ancestor) {\n ancestors.push(ancestor as HTMLElement);\n }\n currentNode = ancestor;\n }\n return ancestors;\n };\n if (\n (this.triggerElement as HTMLElement)?.focus &&\n (this.contains(\n (this.getRootNode() as Document).activeElement\n ) ||\n getAncestors().includes(this))\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n }\n\n protected unbindEvents(): void {\n this.abortController?.abort();\n }\n\n protected bindEvents(): void {\n if (!this.hasNonVirtualTrigger) return;\n this.abortController = new AbortController();\n const nextTriggerElement = this.triggerElement as HTMLElement;\n switch (this.triggerInteraction) {\n case 'click':\n this.bindClickEvents(nextTriggerElement);\n return;\n case 'longpress':\n this.bindLongpressEvents(nextTriggerElement);\n return;\n case 'hover':\n this.bindHoverEvents(nextTriggerElement);\n return;\n }\n }\n\n protected bindClickEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('click', this.handleClick, options);\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdownForClick,\n options\n );\n }\n\n protected bindLongpressEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener(\n 'longpress',\n this.handleLongpress,\n options\n );\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown,\n options\n );\n this.prepareLongpressDescription(triggerElement);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only bind keyboard events when the trigger element isn't doing it for us.\n return;\n }\n triggerElement.addEventListener('keydown', this.handleKeydown, options);\n triggerElement.addEventListener('keyup', this.handleKeyup, options);\n }\n\n protected bindHoverEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('focusin', this.handleFocusin, options);\n triggerElement.addEventListener(\n 'focusout',\n this.handleFocusout,\n options\n );\n triggerElement.addEventListener(\n 'pointerenter',\n this.handlePointerenter,\n options\n );\n triggerElement.addEventListener(\n 'pointerleave',\n this.handlePointerleave,\n options\n );\n this.addEventListener(\n 'pointerenter',\n this.handleOverlayPointerenter,\n options\n );\n this.addEventListener(\n 'pointerleave',\n this.handleOverlayPointerleave,\n options\n );\n }\n\n protected manageTriggerElement(triggerElement: HTMLElement | null): void {\n if (triggerElement) {\n this.unbindEvents();\n this.releaseAriaDescribedby();\n }\n const missingOrVirtual =\n !this.triggerElement ||\n this.triggerElement instanceof VirtualTrigger;\n if (missingOrVirtual) {\n return;\n }\n this.bindEvents();\n if (this.receivesFocus === 'true') return;\n\n this.prepareAriaDescribedby();\n }\n\n private elementIds: string[] = [];\n\n private prepareLongpressDescription(trigger: HTMLElement): void {\n if (\n // only \"longpress\" relationships are described this way\n this.triggerInteraction !== 'longpress' ||\n // do not reapply until target it recycled\n this.releaseLongpressDescribedby !== noop ||\n // require \"longpress content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const longpressDescription = document.createElement('div');\n longpressDescription.id = `longpress-describedby-descriptor-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];\n longpressDescription.slot = 'longpress-describedby-descriptor';\n const triggerParent = trigger.getRootNode() as HTMLElement;\n const overlayParent = this.getRootNode() as HTMLElement;\n // Manage the placement of the helper element in an accessible place with\n // the lowest chance of negatively affecting the layout of the page.\n if (triggerParent === overlayParent) {\n // Trigger and Overlay in same DOM tree...\n // Append helper element to Overlay.\n this.append(longpressDescription);\n } else {\n // If Trigger in <body>, hide helper\n longpressDescription.hidden = !('host' in triggerParent);\n // Trigger and Overlay in different DOM tree, Trigger in shadow tree...\n // Insert helper element after Trigger.\n trigger.insertAdjacentElement('afterend', longpressDescription);\n }\n\n const releaseLongpressDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [longpressDescription.id]\n );\n this.releaseLongpressDescribedby = () => {\n releaseLongpressDescribedby();\n longpressDescription.remove();\n this.releaseLongpressDescribedby = noop;\n };\n }\n\n private prepareAriaDescribedby(): void {\n if (\n // only \"hover\" relationships establed described by content\n this.triggerInteraction !== 'hover' ||\n // do not reapply until target is recycled\n this.releaseAriaDescribedby !== noop ||\n // require \"hover content\" to apply relationship\n !this.elements.length ||\n // Virtual triggers can have no aria content\n !this.hasNonVirtualTrigger\n ) {\n return;\n }\n\n const trigger = this.triggerElement as HTMLElement;\n const triggerRoot = trigger.getRootNode();\n const contentRoot = this.elements[0].getRootNode();\n const overlayRoot = this.getRootNode();\n if (triggerRoot == overlayRoot) {\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = noop;\n };\n } else if (triggerRoot === contentRoot) {\n this.elementIds = this.elements.map((el) => el.id);\n const appliedIds = this.elements.map((el) => {\n if (!el.id) {\n el.id = `${this.tagName.toLowerCase()}-helper-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n }\n return el.id;\n });\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n appliedIds\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseAriaDescribedby = noop;\n };\n }\n }\n\n private handlePointerdown = (event: PointerEvent): void => {\n if (!this.triggerElement) return;\n if (event.button !== 0) return;\n const triggerElement = this.triggerElement as HTMLElement;\n this.longpressState = 'potential';\n document.addEventListener('pointerup', this.handlePointerup);\n document.addEventListener('pointercancel', this.handlePointerup);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only dispatch longpress event if the trigger element isn't doing it for us.\n return;\n }\n this.longressTimeout = setTimeout(() => {\n if (!triggerElement) return;\n triggerElement.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'pointer',\n },\n })\n );\n }, LONGPRESS_DURATION);\n };\n\n private handlePointerup = (): void => {\n clearTimeout(this.longressTimeout);\n if (!this.triggerElement) return;\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState = this.state === 'opening' ? 'pressed' : 'null';\n document.removeEventListener('pointerup', this.handlePointerup);\n document.removeEventListener('pointercancel', this.handlePointerup);\n };\n\n /**\n * @private\n */\n protected handleKeydown = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (code === 'ArrowDown') {\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n }\n };\n\n protected handleKeyup = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (!this.triggerElement || !this.hasNonVirtualTrigger) {\n return;\n }\n event.stopPropagation();\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'keyboard',\n },\n })\n );\n setTimeout(() => {\n this.longpressState = 'null';\n });\n }\n };\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n protected handlePointerdownForClick = (): void => {\n this.preventNextToggle = this.open;\n };\n\n protected handleClick = (): void => {\n if (\n this.longpressState === 'opening' ||\n this.longpressState === 'pressed'\n ) {\n return;\n }\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n };\n\n private focusedin = false;\n\n protected handleFocusin = (): void => {\n this.open = true;\n this.focusedin = true;\n };\n\n protected handleFocusout = (): void => {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n };\n\n private pointerentered = false;\n\n protected handlePointerenter = (): void => {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n delete this.hoverTimeout;\n }\n if (this.disabled) return;\n this.open = true;\n this.pointerentered = true;\n };\n\n // set a timeout once the pointer enters and the overlay is shown\n // give the user time to enter the overlay\n\n protected handleOverlayPointerenter = (): void => {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n delete this.hoverTimeout;\n }\n };\n\n protected handlePointerleave = (): void => {\n this.doPointerleave();\n };\n\n protected handleOverlayPointerleave = (): void => {\n this.doPointerleave();\n };\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.triggerElement as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n\n this.hoverTimeout = setTimeout(() => {\n this.open = false;\n }, HOVER_DELAY);\n }\n\n protected handleLongpress = (): void => {\n this.open = true;\n this.longpressState =\n this.longpressState === 'potential' ? 'opening' : 'pressed';\n };\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n if (\n this.longpressState !== 'opening' &&\n this.longpressState !== 'pressed'\n ) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n super.manuallyKeepOpen();\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (this.triggerElement) {\n this.prepareAriaDescribedby();\n }\n if (!this.elements.length) {\n this.releaseLongpressDescribedby();\n } else if (this.hasNonVirtualTrigger) {\n this.prepareLongpressDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${crypto\n .randomUUID()\n .slice(0, 8)}`\n );\n }\n if (\n changes.has('open') &&\n (typeof changes.get('open') !== 'undefined' || this.open)\n ) {\n this.manageOpen(changes.get('open'));\n }\n if (changes.has('trigger')) {\n const [id, interaction] = this.trigger?.split('@') || [];\n this.elementResolver.selector = id ? `#${id}` : '';\n this.triggerInteraction = interaction as\n | 'click'\n | 'longpress'\n | 'hover'\n | undefined;\n }\n const oldTrigger = this.triggerElement as HTMLElement;\n if (changes.has(elementResolverUpdatedSymbol)) {\n this.triggerElement = this.elementResolver.element;\n this.manageTriggerElement(oldTrigger);\n }\n if (changes.has('triggerElement')) {\n this.manageTriggerElement(changes.get('triggerElement'));\n }\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (changes.has('placement')) {\n if (this.placement) {\n this.dialogEl.setAttribute('actual-placement', this.placement);\n } else {\n this.dialogEl.removeAttribute('actual-placement');\n }\n if (this.open && typeof changes.get('placement') !== 'undefined') {\n this.placementController.resetOverlayPosition();\n }\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <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.hasNonVirtualTrigger) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.releaseAriaDescribedby();\n this.releaseLongpressDescribedby();\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 isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport {\n ifDefined,\n StyleInfo,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport type {\n OpenableElement,\n OverlayState,\n OverlayTypes,\n Placement,\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 { noop } from './AbstractOverlay.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\n\nimport styles from './overlay.css.js';\n\nconst LONGPRESS_DURATION = 300;\nconst HOVER_DELAY = 300;\n\ntype LongpressEvent = {\n source: 'pointer' | 'keyboard';\n};\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nlet OverlayFeatures = OverlayDialog(AbstractOverlay);\n/* c8 ignore next 2 */\nif (supportsPopover) {\n OverlayFeatures = OverlayPopover(OverlayFeatures);\n} else {\n OverlayFeatures = OverlayNoPopover(OverlayFeatures);\n}\n\n/**\n * @element sp-overlay\n *\n * @fires sp-opened - announces that an overlay has completed any entry animations\n * @fires sp-closed - announce that an overlay has compelted any exit animations\n */\nexport class Overlay extends OverlayFeatures {\n static override styles = [styles];\n\n abortController!: AbortController;\n\n /**\n * An Overlay that is `delayed` will wait until a warm-up period of 1000ms\n * has completed before opening. Once the warmup period has completed, all\n * subsequent Overlays will open immediately. When no Overlays are opened,\n * a cooldown period of 1000ms will begin. Once the cooldown has completed,\n * the next Overlay to be opened will be subject to the warm-up period if\n * provided that option.\n */\n @property({ type: Boolean })\n override 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 get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.wasOpen = this.open;\n this.open = false;\n } else {\n this.bindEvents();\n this.open = this.open || this.wasOpen;\n this.wasOpen = false;\n }\n }\n\n private _disabled = false;\n\n @queryAssignedElements({\n flatten: true,\n selector: ':not([slot=\"longpress-describedby-descriptor\"], 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 protected longpressState: 'null' | 'potential' | 'opening' | 'pressed' =\n 'null';\n\n private longressTimeout!: ReturnType<typeof setTimeout>;\n private hoverTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * The `offset` property accepts either a single number, to\n * define the offset of the Overlay along the main axis from\n * the trigger, or 2-tuple, to define the offset along the\n * main axis and the cross axis. This option has no effect\n * when there is no trigger element.\n */\n @property({ type: Number })\n override offset: number | [number, number] = 6;\n\n protected override placementController = new PlacementController(this);\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 (\n (this.longpressState === 'opening' ||\n this.longpressState === 'pressed') &&\n !open\n )\n return;\n this._open = open;\n if (this.open) {\n Overlay.openCount += 1;\n }\n this.requestUpdate('open', !this.open);\n }\n\n private _open = false;\n\n static openCount = 1;\n\n /**\n * Instruct the Overlay where to place itself in\n * relationship to the trigger element.\n * @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 * 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 private releaseAriaDescribedby = noop;\n private releaseLongpressDescribedby = noop;\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @state()\n override get state(): OverlayState {\n return this._state;\n }\n\n override set state(state) {\n if (state === this.state) return;\n const oldState = this.state;\n this._state = state;\n if (this.state === 'opened' || this.state === 'closed') {\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState =\n this.longpressState === 'pressed'\n ? 'null'\n : this.longpressState;\n }\n this.requestUpdate('state', oldState);\n }\n\n override _state: OverlayState = 'closed';\n\n @property({ type: Number, attribute: 'tip-padding' })\n tipPadding?: number;\n\n /**\n * An optional ID reference for the trigger element combined with the optional\n * interaction (click | hover | longpress) by which the overlay shold open\n * the overlay with an `@`: e.g. `trigger@click` opens the overlay when an\n * element with the ID \"trigger\" is clicked.\n */\n @property()\n trigger?: string;\n\n /**\n * An element reference for the trigger element that the overlay should relate to.\n */\n @property({ attribute: false })\n override triggerElement: HTMLElement | VirtualTrigger | null = null;\n\n /**\n * The specific interaction to listen for on the `triggerElement` to open the overlay.\n */\n @property({ attribute: false })\n triggerInteraction?: 'click' | 'longpress' | 'hover';\n\n /**\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 private elementResolver = new ElementResolutionController(this);\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n const hasPopoverAttribute = 'popover' in this;\n if (!hasPopoverAttribute) {\n return undefined;\n }\n /* c8 ignore next 9 */\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected get requiresPosition(): boolean {\n // Do not position \"page\" overlays as they should block the entire UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automatically position content, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected override managePosition(): void {\n if (!this.requiresPosition || !this.open) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n const tipPadding = this.tipPadding;\n\n this.placementController.placeOverlay(this.dialogEl, {\n offset,\n placement,\n tipPadding,\n trigger,\n type: this.type,\n });\n }\n\n protected override async managePopoverOpen(): Promise<void> {\n super.managePopoverOpen();\n const targetOpenState = this.open;\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n await this.manageDelay(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.ensureOnDOM(targetOpenState);\n /* c8 ignore next 3 */\n if (this.open !== targetOpenState) {\n return;\n }\n const focusEl = await this.makeTransition(targetOpenState);\n if (this.open !== targetOpenState) {\n return;\n }\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n protected override async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n // Do not move focus when explicitly told not to\n // and when the Overlay is a \"hint\"\n if (this.receivesFocus === 'false' || this.type === 'hint') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n this.hasNonVirtualTrigger &&\n this.contains((this.getRootNode() as Document).activeElement)\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n return;\n }\n focusEl?.focus();\n }\n\n 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 if (!this.open && this.type !== 'hint') {\n // If the focus remains inside of the overlay or\n // a slotted descendent of the overlay you need to return\n // focus back to the trigger.\n const getAncestors = (): HTMLElement[] => {\n const ancestors: HTMLElement[] = [];\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n let currentNode = document.activeElement;\n while (\n currentNode?.shadowRoot &&\n currentNode.shadowRoot.activeElement\n ) {\n currentNode = currentNode.shadowRoot.activeElement;\n }\n while (currentNode) {\n const ancestor =\n currentNode.assignedSlot ||\n currentNode.parentElement ||\n (currentNode.getRootNode() as ShadowRoot)?.host;\n if (ancestor) {\n ancestors.push(ancestor as HTMLElement);\n }\n currentNode = ancestor;\n }\n return ancestors;\n };\n if (\n (this.triggerElement as HTMLElement)?.focus &&\n (this.contains(\n (this.getRootNode() as Document).activeElement\n ) ||\n getAncestors().includes(this))\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n }\n\n protected unbindEvents(): void {\n this.abortController?.abort();\n }\n\n protected bindEvents(): void {\n if (!this.hasNonVirtualTrigger) return;\n // Clean up listeners if they've already been bound\n this.abortController?.abort();\n this.abortController = new AbortController();\n const nextTriggerElement = this.triggerElement as HTMLElement;\n switch (this.triggerInteraction) {\n case 'click':\n this.bindClickEvents(nextTriggerElement);\n return;\n case 'longpress':\n this.bindLongpressEvents(nextTriggerElement);\n return;\n case 'hover':\n this.bindHoverEvents(nextTriggerElement);\n return;\n }\n }\n\n protected bindClickEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('click', this.handleClick, options);\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdownForClick,\n options\n );\n }\n\n protected bindLongpressEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener(\n 'longpress',\n this.handleLongpress,\n options\n );\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown,\n options\n );\n this.prepareLongpressDescription(triggerElement);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only bind keyboard events when the trigger element isn't doing it for us.\n return;\n }\n triggerElement.addEventListener('keydown', this.handleKeydown, options);\n triggerElement.addEventListener('keyup', this.handleKeyup, options);\n }\n\n protected bindHoverEvents(triggerElement: HTMLElement): void {\n const options = { signal: this.abortController.signal };\n triggerElement.addEventListener('focusin', this.handleFocusin, options);\n triggerElement.addEventListener(\n 'focusout',\n this.handleFocusout,\n options\n );\n triggerElement.addEventListener(\n 'pointerenter',\n this.handlePointerenter,\n options\n );\n triggerElement.addEventListener(\n 'pointerleave',\n this.handlePointerleave,\n options\n );\n this.addEventListener(\n 'pointerenter',\n this.handleOverlayPointerenter,\n options\n );\n this.addEventListener(\n 'pointerleave',\n this.handleOverlayPointerleave,\n options\n );\n }\n\n protected manageTriggerElement(\n triggerElement: HTMLElement | undefined\n ): void {\n if (triggerElement) {\n this.unbindEvents();\n this.releaseAriaDescribedby();\n }\n const missingOrVirtual =\n !this.triggerElement ||\n this.triggerElement instanceof VirtualTrigger;\n if (missingOrVirtual) {\n return;\n }\n this.bindEvents();\n if (this.receivesFocus === 'true') return;\n\n this.prepareAriaDescribedby();\n }\n\n private elementIds: string[] = [];\n\n private prepareLongpressDescription(trigger: HTMLElement): void {\n if (\n // only \"longpress\" relationships are described this way\n this.triggerInteraction !== 'longpress' ||\n // do not reapply until target it recycled\n this.releaseLongpressDescribedby !== noop ||\n // require \"longpress content\" to apply relationship\n !this.elements.length\n ) {\n return;\n }\n\n const longpressDescription = document.createElement('div');\n longpressDescription.id = `longpress-describedby-descriptor-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];\n longpressDescription.slot = 'longpress-describedby-descriptor';\n const triggerParent = trigger.getRootNode() as HTMLElement;\n const overlayParent = this.getRootNode() as HTMLElement;\n // Manage the placement of the helper element in an accessible place with\n // the lowest chance of negatively affecting the layout of the page.\n if (triggerParent === overlayParent) {\n // Trigger and Overlay in same DOM tree...\n // Append helper element to Overlay.\n this.append(longpressDescription);\n } else {\n // If Trigger in <body>, hide helper\n longpressDescription.hidden = !('host' in triggerParent);\n // Trigger and Overlay in different DOM tree, Trigger in shadow tree...\n // Insert helper element after Trigger.\n trigger.insertAdjacentElement('afterend', longpressDescription);\n }\n\n const releaseLongpressDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [longpressDescription.id]\n );\n this.releaseLongpressDescribedby = () => {\n releaseLongpressDescribedby();\n longpressDescription.remove();\n this.releaseLongpressDescribedby = noop;\n };\n }\n\n private prepareAriaDescribedby(): void {\n if (\n // only \"hover\" relationships establed described by content\n this.triggerInteraction !== 'hover' ||\n // do not reapply until target is recycled\n this.releaseAriaDescribedby !== noop ||\n // require \"hover content\" to apply relationship\n !this.elements.length ||\n // Virtual triggers can have no aria content\n !this.hasNonVirtualTrigger\n ) {\n return;\n }\n\n const trigger = this.triggerElement as HTMLElement;\n const triggerRoot = trigger.getRootNode();\n const contentRoot = this.elements[0].getRootNode();\n const overlayRoot = this.getRootNode();\n if (triggerRoot == overlayRoot) {\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = noop;\n };\n } else if (triggerRoot === contentRoot) {\n this.elementIds = this.elements.map((el) => el.id);\n const appliedIds = this.elements.map((el) => {\n if (!el.id) {\n el.id = `${this.tagName.toLowerCase()}-helper-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n }\n return el.id;\n });\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n appliedIds\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseAriaDescribedby = noop;\n };\n }\n }\n\n private handlePointerdown = (event: PointerEvent): void => {\n if (!this.triggerElement) return;\n if (event.button !== 0) return;\n const triggerElement = this.triggerElement as HTMLElement;\n this.longpressState = 'potential';\n document.addEventListener('pointerup', this.handlePointerup);\n document.addEventListener('pointercancel', this.handlePointerup);\n if (\n (triggerElement as HTMLElement & { holdAffordance: boolean })\n .holdAffordance\n ) {\n // Only dispatch longpress event if the trigger element isn't doing it for us.\n return;\n }\n this.longressTimeout = setTimeout(() => {\n if (!triggerElement) return;\n triggerElement.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'pointer',\n },\n })\n );\n }, LONGPRESS_DURATION);\n };\n\n private handlePointerup = (): void => {\n clearTimeout(this.longressTimeout);\n if (!this.triggerElement) return;\n // When triggered by the pointer, the last of `opened`\n // or `pointerup` should move the `longpressState` to\n // `null` so that the earlier event can void the \"light\n // dismiss\" and keep the Overlay open.\n this.longpressState = this.state === 'opening' ? 'pressed' : 'null';\n document.removeEventListener('pointerup', this.handlePointerup);\n document.removeEventListener('pointercancel', this.handlePointerup);\n };\n\n /**\n * @private\n */\n protected handleKeydown = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (code === 'ArrowDown') {\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n }\n };\n\n protected handleKeyup = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (!this.triggerElement || !this.hasNonVirtualTrigger) {\n return;\n }\n event.stopPropagation();\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'keyboard',\n },\n })\n );\n setTimeout(() => {\n this.longpressState = 'null';\n });\n }\n };\n\n /**\n * An overlay with a `click` interaction should not close on click `triggerElement`.\n * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the\n * overlay is `open` to prevent from toggling the overlay when the click event\n * propagates later in the interaction.\n */\n private preventNextToggle = false;\n\n protected handlePointerdownForClick = (): void => {\n this.preventNextToggle = this.open;\n };\n\n protected handleClick = (): void => {\n if (\n this.longpressState === 'opening' ||\n this.longpressState === 'pressed'\n ) {\n return;\n }\n if (!this.preventNextToggle) {\n this.open = !this.open;\n }\n this.preventNextToggle = false;\n };\n\n private focusedin = false;\n\n protected handleFocusin = (): void => {\n this.open = true;\n this.focusedin = true;\n };\n\n protected handleFocusout = (): void => {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n };\n\n private pointerentered = false;\n\n protected handlePointerenter = (): void => {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n delete this.hoverTimeout;\n }\n if (this.disabled) return;\n this.open = true;\n this.pointerentered = true;\n };\n\n // set a timeout once the pointer enters and the overlay is shown\n // give the user time to enter the overlay\n\n protected handleOverlayPointerenter = (): void => {\n if (this.hoverTimeout) {\n clearTimeout(this.hoverTimeout);\n delete this.hoverTimeout;\n }\n };\n\n protected handlePointerleave = (): void => {\n this.doPointerleave();\n };\n\n protected handleOverlayPointerleave = (): void => {\n this.doPointerleave();\n };\n\n protected doPointerleave(): void {\n this.pointerentered = false;\n const triggerElement = this.triggerElement as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n\n this.hoverTimeout = setTimeout(() => {\n this.open = false;\n }, HOVER_DELAY);\n }\n\n protected handleLongpress = (): void => {\n this.open = true;\n this.longpressState =\n this.longpressState === 'potential' ? 'opening' : 'pressed';\n };\n\n protected handleBeforetoggle(event: Event & { newState: string }): void {\n if (event.newState !== 'open') {\n this.handleBrowserClose();\n }\n }\n\n protected handleBrowserClose(): void {\n if (\n this.longpressState !== 'opening' &&\n this.longpressState !== 'pressed'\n ) {\n this.open = false;\n return;\n }\n this.manuallyKeepOpen();\n }\n\n public override manuallyKeepOpen(): void {\n super.manuallyKeepOpen();\n this.open = true;\n this.placementController.allowPlacementUpdate = true;\n this.manageOpen(false);\n }\n\n protected handleSlotchange(): void {\n if (this.triggerElement) {\n this.prepareAriaDescribedby();\n }\n if (!this.elements.length) {\n this.releaseLongpressDescribedby();\n } else if (this.hasNonVirtualTrigger) {\n this.prepareLongpressDescription(\n this.triggerElement as HTMLElement\n );\n }\n }\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${crypto\n .randomUUID()\n .slice(0, 8)}`\n );\n }\n if (\n changes.has('open') &&\n (typeof changes.get('open') !== 'undefined' || this.open)\n ) {\n this.manageOpen(changes.get('open'));\n }\n if (changes.has('trigger')) {\n const [id, interaction] = this.trigger?.split('@') || [];\n this.elementResolver.selector = id ? `#${id}` : '';\n this.triggerInteraction = interaction as\n | 'click'\n | 'longpress'\n | 'hover'\n | undefined;\n }\n // Merge multiple possible calls to manageTriggerElement().\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.manageTriggerElement(oldTrigger);\n }\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (changes.has('placement')) {\n if (this.placement) {\n this.dialogEl.setAttribute('actual-placement', this.placement);\n } else {\n this.dialogEl.removeAttribute('actual-placement');\n }\n if (this.open && typeof changes.get('placement') !== 'undefined') {\n this.placementController.resetOverlayPosition();\n }\n }\n }\n\n protected renderContent(): TemplateResult {\n return html`\n <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.hasNonVirtualTrigger) {\n this.bindEvents();\n }\n }\n\n override disconnectedCallback(): void {\n if (this.hasNonVirtualTrigger) {\n this.unbindEvents();\n }\n this.releaseAriaDescribedby();\n this.releaseLongpressDescribedby();\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 P=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var n=(v,h,e,t)=>{for(var i=t>1?void 0:t?w(h,e):h,r=v.length-1,s;r>=0;r--)(s=v[r])&&(i=(t?s(h,e,i):s(i))||i);return t&&i&&P(h,e,i),i};import{html as u}from"@spectrum-web-components/base";import{property as l,query as f,queryAssignedElements as C,state as D}from"@spectrum-web-components/base/src/decorators.js";import{isAndroid as S,isIOS as A}from"@spectrum-web-components/shared/src/platform.js";import{ElementResolutionController as R,elementResolverUpdatedSymbol as O}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{conditionAttributeWithId as g}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ifDefined as m,styleMap as b}from"@spectrum-web-components/base/src/directives.js";import{AbstractOverlay as M,nextFrame as E}from"./AbstractOverlay.js";import{OverlayDialog as N}from"./OverlayDialog.js";import{OverlayPopover as H}from"./OverlayPopover.js";import{OverlayNoPopover as k}from"./OverlayNoPopover.js";import{overlayStack as y}from"./OverlayStack.js";import{noop as d}from"./AbstractOverlay.js";import{VirtualTrigger as T}from"./VirtualTrigger.js";import{PlacementController as $}from"./PlacementController.js";import I from"./overlay.css.js";const V=300,F=300;export const LONGPRESS_INSTRUCTIONS={touch:"Double tap and long press for additional options",keyboard:"Press Space or Alt+Down Arrow for additional options",mouse:"Click and hold for additional options"};const U="showPopover"in document.createElement("div");let c=N(M);U?c=H(c):c=k(c);const o=class o extends c{constructor(){super(...arguments);this._delayed=!1;this._disabled=!1;this.longpressState="null";this.offset=6;this.placementController=new $(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=d;this.releaseLongpressDescribedby=d;this._state="closed";this.triggerElement=null;this.type="auto";this.wasOpen=!1;this.elementResolver=new R(this);this.closeOnFocusOut=e=>{if(!e.relatedTarget)return;const t=new Event("overlay-relation-query",{bubbles:!0,composed:!0});e.relatedTarget.addEventListener(t.type,i=>{i.composedPath().includes(this)||(this.open=!1)}),e.relatedTarget.dispatchEvent(t)};this.elementIds=[];this.handlePointerdown=e=>{if(!this.triggerElement||e.button!==0)return;const t=this.triggerElement;this.longpressState="potential",document.addEventListener("pointerup",this.handlePointerup),document.addEventListener("pointercancel",this.handlePointerup),!t.holdAffordance&&(this.longressTimeout=setTimeout(()=>{t&&t.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"pointer"}}))},V))};this.handlePointerup=()=>{clearTimeout(this.longressTimeout),this.triggerElement&&(this.longpressState=this.state==="opening"?"pressed":"null",document.removeEventListener("pointerup",this.handlePointerup),document.removeEventListener("pointercancel",this.handlePointerup))};this.handleKeydown=e=>{const{code:t,altKey:i}=e;(t==="Space"||i&&t==="ArrowDown")&&t==="ArrowDown"&&(e.stopPropagation(),e.stopImmediatePropagation())};this.handleKeyup=e=>{const{code:t,altKey:i}=e;if(t==="Space"||i&&t==="ArrowDown"){if(!this.triggerElement||!this.hasNonVirtualTrigger)return;e.stopPropagation(),this.triggerElement.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"keyboard"}})),setTimeout(()=>{this.longpressState="null"})}};this.preventNextToggle=!1;this.handlePointerdownForClick=()=>{this.preventNextToggle=this.open};this.handleClick=()=>{this.longpressState==="opening"||this.longpressState==="pressed"||(this.preventNextToggle||(this.open=!this.open),this.preventNextToggle=!1)};this.focusedin=!1;this.handleFocusin=()=>{this.open=!0,this.focusedin=!0};this.handleFocusout=()=>{this.focusedin=!1,!this.pointerentered&&(this.open=!1)};this.pointerentered=!1;this.handlePointerenter=()=>{this.hoverTimeout&&(clearTimeout(this.hoverTimeout),delete this.hoverTimeout),!this.disabled&&(this.open=!0,this.pointerentered=!0)};this.handleOverlayPointerenter=()=>{this.hoverTimeout&&(clearTimeout(this.hoverTimeout),delete this.hoverTimeout)};this.handlePointerleave=()=>{this.doPointerleave()};this.handleOverlayPointerleave=()=>{this.doPointerleave()};this.handleLongpress=()=>{this.open=!0,this.longpressState=this.longpressState==="potential"?"opening":"pressed"}}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){this._disabled=e,e?(this.hasNonVirtualTrigger&&this.unbindEvents(),this.wasOpen=this.open,this.open=!1):(this.bindEvents(),this.open=this.open||this.wasOpen,this.wasOpen=!1)}get hasNonVirtualTrigger(){return!!this.triggerElement&&!(this.triggerElement instanceof T)}get open(){return this._open}set open(e){e&&this.disabled||e!==this.open&&((this.longpressState==="opening"||this.longpressState==="pressed")&&!e||(this._open=e,this.open&&(o.openCount+=1),this.requestUpdate("open",!this.open)))}get state(){return this._state}set state(e){if(e===this.state)return;const t=this.state;this._state=e,(this.state==="opened"||this.state==="closed")&&(this.longpressState=this.longpressState==="pressed"?"null":this.longpressState),this.requestUpdate("state",t)}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){if("popover"in this)switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,i=this.placement||"right",r=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:i,tipPadding:r,trigger:t,type:this.type})}async managePopoverOpen(){super.managePopoverOpen();const e=this.open;if(this.open!==e||(await this.manageDelay(e),this.open!==e)||(await this.ensureOnDOM(e),this.open!==e))return;const t=await this.makeTransition(e);this.open===e&&await this.applyFocus(e,t)}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await E(),await E(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}async manageOpen(e){var t;if(!(!this.isConnected&&this.open)){if(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 i=this.getRootNode();this.open?i.addEventListener("focusout",this.closeOnFocusOut,{capture:!0}):i.removeEventListener("focusout",this.closeOnFocusOut,{capture:!0})}if(!this.open&&this.type!=="hint"){const i=()=>{var p;const r=[];let s=document.activeElement;for(;s!=null&&s.shadowRoot&&s.shadowRoot.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const a=s.assignedSlot||s.parentElement||((p=s.getRootNode())==null?void 0:p.host);a&&r.push(a),s=a}return r};(t=this.triggerElement)!=null&&t.focus&&(this.contains(this.getRootNode().activeElement)||i().includes(this))&&this.triggerElement.focus()}}}unbindEvents(){var e;(e=this.abortController)==null||e.abort()}bindEvents(){if(!this.hasNonVirtualTrigger)return;this.abortController=new AbortController;const e=this.triggerElement;switch(this.triggerInteraction){case"click":this.bindClickEvents(e);return;case"longpress":this.bindLongpressEvents(e);return;case"hover":this.bindHoverEvents(e);return}}bindClickEvents(e){const t={signal:this.abortController.signal};e.addEventListener("click",this.handleClick,t),e.addEventListener("pointerdown",this.handlePointerdownForClick,t)}bindLongpressEvents(e){const t={signal:this.abortController.signal};e.addEventListener("longpress",this.handleLongpress,t),e.addEventListener("pointerdown",this.handlePointerdown,t),this.prepareLongpressDescription(e),!e.holdAffordance&&(e.addEventListener("keydown",this.handleKeydown,t),e.addEventListener("keyup",this.handleKeyup,t))}bindHoverEvents(e){const t={signal:this.abortController.signal};e.addEventListener("focusin",this.handleFocusin,t),e.addEventListener("focusout",this.handleFocusout,t),e.addEventListener("pointerenter",this.handlePointerenter,t),e.addEventListener("pointerleave",this.handlePointerleave,t),this.addEventListener("pointerenter",this.handleOverlayPointerenter,t),this.addEventListener("pointerleave",this.handleOverlayPointerleave,t)}manageTriggerElement(e){e&&(this.unbindEvents(),this.releaseAriaDescribedby()),!(!this.triggerElement||this.triggerElement instanceof T)&&(this.bindEvents(),this.receivesFocus!=="true"&&this.prepareAriaDescribedby())}prepareLongpressDescription(e){if(this.triggerInteraction!=="longpress"||this.releaseLongpressDescribedby!==d||!this.elements.length)return;const t=document.createElement("div");t.id=`longpress-describedby-descriptor-${crypto.randomUUID().slice(0,8)}`;const i=A()||S()?"touch":"keyboard";t.textContent=LONGPRESS_INSTRUCTIONS[i],t.slot="longpress-describedby-descriptor";const r=e.getRootNode(),s=this.getRootNode();r===s?this.append(t):(t.hidden=!("host"in r),e.insertAdjacentElement("afterend",t));const p=g(e,"aria-describedby",[t.id]);this.releaseLongpressDescribedby=()=>{p(),t.remove(),this.releaseLongpressDescribedby=d}}prepareAriaDescribedby(){if(this.triggerInteraction!=="hover"||this.releaseAriaDescribedby!==d||!this.elements.length||!this.hasNonVirtualTrigger)return;const e=this.triggerElement,t=e.getRootNode(),i=this.elements[0].getRootNode(),r=this.getRootNode();if(t==r){const s=g(e,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{s(),this.releaseAriaDescribedby=d}}else if(t===i){this.elementIds=this.elements.map(a=>a.id);const s=this.elements.map(a=>(a.id||(a.id=`${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0,8)}`),a.id)),p=g(e,"aria-describedby",s);this.releaseAriaDescribedby=()=>{p(),this.elements.map((a,L)=>{a.id=this.elementIds[L]}),this.releaseAriaDescribedby=d}}}doPointerleave(){this.pointerentered=!1;const e=this.triggerElement;this.focusedin&&e.matches(":focus-visible")||(this.hoverTimeout=setTimeout(()=>{this.open=!1},F))}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose()}handleBrowserClose(){if(this.longpressState!=="opening"&&this.longpressState!=="pressed"){this.open=!1;return}this.manuallyKeepOpen()}manuallyKeepOpen(){super.manuallyKeepOpen(),this.open=!0,this.placementController.allowPlacementUpdate=!0,this.manageOpen(!1)}handleSlotchange(){this.triggerElement&&this.prepareAriaDescribedby(),this.elements.length?this.hasNonVirtualTrigger&&this.prepareLongpressDescription(this.triggerElement):this.releaseLongpressDescribedby()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}willUpdate(e){var i;if(this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0,8)}`),e.has("open")&&(typeof e.get("open")!="undefined"||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[r,s]=((i=this.trigger)==null?void 0:i.split("@"))||[];this.elementResolver.selector=r?`#${r}`:"",this.triggerInteraction=s}const t=this.triggerElement;e.has(O)&&(this.triggerElement=this.elementResolver.element,this.manageTriggerElement(t)),e.has("triggerElement")&&this.manageTriggerElement(e.get("triggerElement"))}updated(e){super.updated(e),e.has("placement")&&(this.placement?this.dialogEl.setAttribute("actual-placement",this.placement):this.dialogEl.removeAttribute("actual-placement"),this.open&&typeof e.get("placement")!="undefined"&&this.placementController.resetOverlayPosition())}renderContent(){return u`
|
|
1
|
+
"use strict";var P=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var n=(v,h,e,t)=>{for(var i=t>1?void 0:t?w(h,e):h,r=v.length-1,s;r>=0;r--)(s=v[r])&&(i=(t?s(h,e,i):s(i))||i);return t&&i&&P(h,e,i),i};import{html as u}from"@spectrum-web-components/base";import{property as l,query as f,queryAssignedElements as C,state as D}from"@spectrum-web-components/base/src/decorators.js";import{isAndroid as S,isIOS as A}from"@spectrum-web-components/shared/src/platform.js";import{ElementResolutionController as R,elementResolverUpdatedSymbol as M}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{conditionAttributeWithId as g}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ifDefined as m,styleMap as b}from"@spectrum-web-components/base/src/directives.js";import{AbstractOverlay as O,nextFrame as E}from"./AbstractOverlay.js";import{OverlayDialog as H}from"./OverlayDialog.js";import{OverlayPopover as N}from"./OverlayPopover.js";import{OverlayNoPopover as k}from"./OverlayNoPopover.js";import{overlayStack as y}from"./OverlayStack.js";import{noop as d}from"./AbstractOverlay.js";import{VirtualTrigger as T}from"./VirtualTrigger.js";import{PlacementController as $}from"./PlacementController.js";import I from"./overlay.css.js";const V=300,F=300;export const LONGPRESS_INSTRUCTIONS={touch:"Double tap and long press for additional options",keyboard:"Press Space or Alt+Down Arrow for additional options",mouse:"Click and hold for additional options"};const U="showPopover"in document.createElement("div");let c=H(O);U?c=N(c):c=k(c);const o=class o extends c{constructor(){super(...arguments);this._delayed=!1;this._disabled=!1;this.longpressState="null";this.offset=6;this.placementController=new $(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=d;this.releaseLongpressDescribedby=d;this._state="closed";this.triggerElement=null;this.type="auto";this.wasOpen=!1;this.elementResolver=new R(this);this.closeOnFocusOut=e=>{if(!e.relatedTarget)return;const t=new Event("overlay-relation-query",{bubbles:!0,composed:!0});e.relatedTarget.addEventListener(t.type,i=>{i.composedPath().includes(this)||(this.open=!1)}),e.relatedTarget.dispatchEvent(t)};this.elementIds=[];this.handlePointerdown=e=>{if(!this.triggerElement||e.button!==0)return;const t=this.triggerElement;this.longpressState="potential",document.addEventListener("pointerup",this.handlePointerup),document.addEventListener("pointercancel",this.handlePointerup),!t.holdAffordance&&(this.longressTimeout=setTimeout(()=>{t&&t.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"pointer"}}))},V))};this.handlePointerup=()=>{clearTimeout(this.longressTimeout),this.triggerElement&&(this.longpressState=this.state==="opening"?"pressed":"null",document.removeEventListener("pointerup",this.handlePointerup),document.removeEventListener("pointercancel",this.handlePointerup))};this.handleKeydown=e=>{const{code:t,altKey:i}=e;(t==="Space"||i&&t==="ArrowDown")&&t==="ArrowDown"&&(e.stopPropagation(),e.stopImmediatePropagation())};this.handleKeyup=e=>{const{code:t,altKey:i}=e;if(t==="Space"||i&&t==="ArrowDown"){if(!this.triggerElement||!this.hasNonVirtualTrigger)return;e.stopPropagation(),this.triggerElement.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"keyboard"}})),setTimeout(()=>{this.longpressState="null"})}};this.preventNextToggle=!1;this.handlePointerdownForClick=()=>{this.preventNextToggle=this.open};this.handleClick=()=>{this.longpressState==="opening"||this.longpressState==="pressed"||(this.preventNextToggle||(this.open=!this.open),this.preventNextToggle=!1)};this.focusedin=!1;this.handleFocusin=()=>{this.open=!0,this.focusedin=!0};this.handleFocusout=()=>{this.focusedin=!1,!this.pointerentered&&(this.open=!1)};this.pointerentered=!1;this.handlePointerenter=()=>{this.hoverTimeout&&(clearTimeout(this.hoverTimeout),delete this.hoverTimeout),!this.disabled&&(this.open=!0,this.pointerentered=!0)};this.handleOverlayPointerenter=()=>{this.hoverTimeout&&(clearTimeout(this.hoverTimeout),delete this.hoverTimeout)};this.handlePointerleave=()=>{this.doPointerleave()};this.handleOverlayPointerleave=()=>{this.doPointerleave()};this.handleLongpress=()=>{this.open=!0,this.longpressState=this.longpressState==="potential"?"opening":"pressed"}}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){this._disabled=e,e?(this.hasNonVirtualTrigger&&this.unbindEvents(),this.wasOpen=this.open,this.open=!1):(this.bindEvents(),this.open=this.open||this.wasOpen,this.wasOpen=!1)}get hasNonVirtualTrigger(){return!!this.triggerElement&&!(this.triggerElement instanceof T)}get open(){return this._open}set open(e){e&&this.disabled||e!==this.open&&((this.longpressState==="opening"||this.longpressState==="pressed")&&!e||(this._open=e,this.open&&(o.openCount+=1),this.requestUpdate("open",!this.open)))}get state(){return this._state}set state(e){if(e===this.state)return;const t=this.state;this._state=e,(this.state==="opened"||this.state==="closed")&&(this.longpressState=this.longpressState==="pressed"?"null":this.longpressState),this.requestUpdate("state",t)}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){if("popover"in this)switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition||!this.open)return;const e=this.offset||0,t=this.triggerElement,i=this.placement||"right",r=this.tipPadding;this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:i,tipPadding:r,trigger:t,type:this.type})}async managePopoverOpen(){super.managePopoverOpen();const e=this.open;if(this.open!==e||(await this.manageDelay(e),this.open!==e)||(await this.ensureOnDOM(e),this.open!==e))return;const t=await this.makeTransition(e);this.open===e&&await this.applyFocus(e,t)}async applyFocus(e,t){if(!(this.receivesFocus==="false"||this.type==="hint")){if(await E(),await E(),e===this.open&&!this.open){this.hasNonVirtualTrigger&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}async manageOpen(e){var t;if(!(!this.isConnected&&this.open)){if(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 i=this.getRootNode();this.open?i.addEventListener("focusout",this.closeOnFocusOut,{capture:!0}):i.removeEventListener("focusout",this.closeOnFocusOut,{capture:!0})}if(!this.open&&this.type!=="hint"){const i=()=>{var p;const r=[];let s=document.activeElement;for(;s!=null&&s.shadowRoot&&s.shadowRoot.activeElement;)s=s.shadowRoot.activeElement;for(;s;){const a=s.assignedSlot||s.parentElement||((p=s.getRootNode())==null?void 0:p.host);a&&r.push(a),s=a}return r};(t=this.triggerElement)!=null&&t.focus&&(this.contains(this.getRootNode().activeElement)||i().includes(this))&&this.triggerElement.focus()}}}unbindEvents(){var e;(e=this.abortController)==null||e.abort()}bindEvents(){var t;if(!this.hasNonVirtualTrigger)return;(t=this.abortController)==null||t.abort(),this.abortController=new AbortController;const e=this.triggerElement;switch(this.triggerInteraction){case"click":this.bindClickEvents(e);return;case"longpress":this.bindLongpressEvents(e);return;case"hover":this.bindHoverEvents(e);return}}bindClickEvents(e){const t={signal:this.abortController.signal};e.addEventListener("click",this.handleClick,t),e.addEventListener("pointerdown",this.handlePointerdownForClick,t)}bindLongpressEvents(e){const t={signal:this.abortController.signal};e.addEventListener("longpress",this.handleLongpress,t),e.addEventListener("pointerdown",this.handlePointerdown,t),this.prepareLongpressDescription(e),!e.holdAffordance&&(e.addEventListener("keydown",this.handleKeydown,t),e.addEventListener("keyup",this.handleKeyup,t))}bindHoverEvents(e){const t={signal:this.abortController.signal};e.addEventListener("focusin",this.handleFocusin,t),e.addEventListener("focusout",this.handleFocusout,t),e.addEventListener("pointerenter",this.handlePointerenter,t),e.addEventListener("pointerleave",this.handlePointerleave,t),this.addEventListener("pointerenter",this.handleOverlayPointerenter,t),this.addEventListener("pointerleave",this.handleOverlayPointerleave,t)}manageTriggerElement(e){e&&(this.unbindEvents(),this.releaseAriaDescribedby()),!(!this.triggerElement||this.triggerElement instanceof T)&&(this.bindEvents(),this.receivesFocus!=="true"&&this.prepareAriaDescribedby())}prepareLongpressDescription(e){if(this.triggerInteraction!=="longpress"||this.releaseLongpressDescribedby!==d||!this.elements.length)return;const t=document.createElement("div");t.id=`longpress-describedby-descriptor-${crypto.randomUUID().slice(0,8)}`;const i=A()||S()?"touch":"keyboard";t.textContent=LONGPRESS_INSTRUCTIONS[i],t.slot="longpress-describedby-descriptor";const r=e.getRootNode(),s=this.getRootNode();r===s?this.append(t):(t.hidden=!("host"in r),e.insertAdjacentElement("afterend",t));const p=g(e,"aria-describedby",[t.id]);this.releaseLongpressDescribedby=()=>{p(),t.remove(),this.releaseLongpressDescribedby=d}}prepareAriaDescribedby(){if(this.triggerInteraction!=="hover"||this.releaseAriaDescribedby!==d||!this.elements.length||!this.hasNonVirtualTrigger)return;const e=this.triggerElement,t=e.getRootNode(),i=this.elements[0].getRootNode(),r=this.getRootNode();if(t==r){const s=g(e,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{s(),this.releaseAriaDescribedby=d}}else if(t===i){this.elementIds=this.elements.map(a=>a.id);const s=this.elements.map(a=>(a.id||(a.id=`${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0,8)}`),a.id)),p=g(e,"aria-describedby",s);this.releaseAriaDescribedby=()=>{p(),this.elements.map((a,L)=>{a.id=this.elementIds[L]}),this.releaseAriaDescribedby=d}}}doPointerleave(){this.pointerentered=!1;const e=this.triggerElement;this.focusedin&&e.matches(":focus-visible")||(this.hoverTimeout=setTimeout(()=>{this.open=!1},F))}handleBeforetoggle(e){e.newState!=="open"&&this.handleBrowserClose()}handleBrowserClose(){if(this.longpressState!=="opening"&&this.longpressState!=="pressed"){this.open=!1;return}this.manuallyKeepOpen()}manuallyKeepOpen(){super.manuallyKeepOpen(),this.open=!0,this.placementController.allowPlacementUpdate=!0,this.manageOpen(!1)}handleSlotchange(){this.triggerElement&&this.prepareAriaDescribedby(),this.elements.length?this.hasNonVirtualTrigger&&this.prepareLongpressDescription(this.triggerElement):this.releaseLongpressDescribedby()}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}willUpdate(e){var i;if(this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0,8)}`),e.has("open")&&(typeof e.get("open")!="undefined"||this.open)&&this.manageOpen(e.get("open")),e.has("trigger")){const[r,s]=((i=this.trigger)==null?void 0:i.split("@"))||[];this.elementResolver.selector=r?`#${r}`:"",this.triggerInteraction=s}let t=!1;e.has(M)&&(t=this.triggerElement,this.triggerElement=this.elementResolver.element),e.has("triggerElement")&&(t=e.get("triggerElement")),t!==!1&&this.manageTriggerElement(t)}updated(e){super.updated(e),e.has("placement")&&(this.placement?this.dialogEl.setAttribute("actual-placement",this.placement):this.dialogEl.removeAttribute("actual-placement"),this.open&&typeof e.get("placement")!="undefined"&&this.placementController.resetOverlayPosition())}renderContent(){return u`
|
|
2
2
|
<slot @slotchange=${this.handleSlotchange}></slot>
|
|
3
3
|
`}get dialogStyleMap(){return{"--swc-overlay-open-count":o.openCount.toString()}}renderDialog(){return u`
|
|
4
4
|
<dialog
|