@spectrum-web-components/overlay 0.13.2-express.0 → 0.13.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/custom-elements.json +21 -2
- package/package.json +6 -6
- package/src/ActiveOverlay.d.ts +1 -2
- package/src/ActiveOverlay.js +1 -2
- package/src/ActiveOverlay.js.map +1 -1
- package/src/OverlayTrigger.js +4 -7
- package/src/OverlayTrigger.js.map +1 -1
- package/src/overlay-stack.d.ts +2 -0
- package/src/overlay-stack.js +33 -24
- package/src/overlay-stack.js.map +1 -1
- package/src/overlay-trigger.css.js +1 -1
- package/src/overlay-trigger.css.js.map +1 -1
- package/src/overlay.js +0 -1
- package/src/overlay.js.map +1 -1
package/custom-elements.json
CHANGED
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"kind": "field",
|
|
133
133
|
"name": "theme",
|
|
134
134
|
"type": {
|
|
135
|
-
"text": "{\n color?: Color;\n scale?: Scale;\n lang?: string;\n
|
|
135
|
+
"text": "{\n color?: Color;\n scale?: Scale;\n lang?: string;\n }"
|
|
136
136
|
},
|
|
137
137
|
"privacy": "public",
|
|
138
138
|
"default": "{}"
|
|
@@ -1366,6 +1366,25 @@
|
|
|
1366
1366
|
}
|
|
1367
1367
|
}
|
|
1368
1368
|
},
|
|
1369
|
+
{
|
|
1370
|
+
"kind": "field",
|
|
1371
|
+
"name": "_bodyMarginsApplied",
|
|
1372
|
+
"type": {
|
|
1373
|
+
"text": "boolean"
|
|
1374
|
+
},
|
|
1375
|
+
"privacy": "private",
|
|
1376
|
+
"default": "false"
|
|
1377
|
+
},
|
|
1378
|
+
{
|
|
1379
|
+
"kind": "method",
|
|
1380
|
+
"name": "applyBodyMargins",
|
|
1381
|
+
"privacy": "private",
|
|
1382
|
+
"return": {
|
|
1383
|
+
"type": {
|
|
1384
|
+
"text": "void"
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
},
|
|
1369
1388
|
{
|
|
1370
1389
|
"kind": "method",
|
|
1371
1390
|
"name": "startTabTrapping",
|
|
@@ -1815,7 +1834,7 @@
|
|
|
1815
1834
|
{
|
|
1816
1835
|
"kind": "variable",
|
|
1817
1836
|
"name": "styles",
|
|
1818
|
-
"default": "css`\n
|
|
1837
|
+
"default": "css`\n:host([disabled]) ::slotted([slot=trigger]){pointer-events:none}#overlay-content{display:none}\n`"
|
|
1819
1838
|
}
|
|
1820
1839
|
],
|
|
1821
1840
|
"exports": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/overlay",
|
|
3
|
-
"version": "0.13.2
|
|
3
|
+
"version": "0.13.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
"lit-html"
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@popperjs/core": "^2.
|
|
52
|
-
"@spectrum-web-components/action-button": "^0.7.
|
|
51
|
+
"@popperjs/core": "^2.11.0",
|
|
52
|
+
"@spectrum-web-components/action-button": "^0.7.2",
|
|
53
53
|
"@spectrum-web-components/base": "^0.5.1",
|
|
54
|
-
"@spectrum-web-components/shared": "^0.13.
|
|
55
|
-
"@spectrum-web-components/theme": "^0.9.2
|
|
54
|
+
"@spectrum-web-components/shared": "^0.13.2",
|
|
55
|
+
"@spectrum-web-components/theme": "^0.9.2",
|
|
56
56
|
"popper-max-size-modifier": "^0.2.0",
|
|
57
57
|
"tslib": "^2.0.0"
|
|
58
58
|
},
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"./sync/overlay-trigger.js",
|
|
65
65
|
"./stories/overlay-story-components.js"
|
|
66
66
|
],
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "5ad16bd185710525afa48bd76099cb0ebde4c4cb"
|
|
68
68
|
}
|
package/src/ActiveOverlay.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSSResultArray, PropertyValues, SpectrumElement, TemplateResult } from '@spectrum-web-components/base';
|
|
2
|
-
import { Color,
|
|
2
|
+
import { Color, Scale } from '@spectrum-web-components/theme';
|
|
3
3
|
import { OverlayOpenDetail, Placement, TriggerInteractions } from './overlay-types.js';
|
|
4
4
|
import { VirtualTrigger } from './VirtualTrigger.js';
|
|
5
5
|
export interface PositionResult {
|
|
@@ -32,7 +32,6 @@ export declare class ActiveOverlay extends SpectrumElement {
|
|
|
32
32
|
color?: Color;
|
|
33
33
|
scale?: Scale;
|
|
34
34
|
lang?: string;
|
|
35
|
-
theme?: Flavor;
|
|
36
35
|
};
|
|
37
36
|
receivesFocus?: 'auto';
|
|
38
37
|
tabbingAway: boolean;
|
package/src/ActiveOverlay.js
CHANGED
|
@@ -347,10 +347,9 @@ export class ActiveOverlay extends SpectrumElement {
|
|
|
347
347
|
});
|
|
348
348
|
}
|
|
349
349
|
renderTheme(content) {
|
|
350
|
-
const { color, scale, lang
|
|
350
|
+
const { color, scale, lang } = this.theme;
|
|
351
351
|
return html `
|
|
352
352
|
<sp-theme
|
|
353
|
-
theme=${ifDefined(theme)}
|
|
354
353
|
color=${ifDefined(color)}
|
|
355
354
|
scale=${ifDefined(scale)}
|
|
356
355
|
lang=${ifDefined(lang)}
|
package/src/ActiveOverlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveOverlay.js","sourceRoot":"","sources":["ActiveOverlay.ts"],"names":[],"mappings":"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","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*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport { reparentChildren } from '@spectrum-web-components/shared';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { Color, Flavor, Scale } from '@spectrum-web-components/theme';\nimport styles from './active-overlay.css.js';\nimport {\n OverlayOpenCloseDetail,\n OverlayOpenDetail,\n Placement,\n TriggerInteractions,\n} from './overlay-types.js';\nimport { applyMaxSize, createPopper, Instance, maxSize } from './popper.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\n\nexport interface PositionResult {\n arrowOffsetLeft: number;\n arrowOffsetTop: number;\n maxHeight: number;\n placement: string;\n positionLeft: number;\n positionTop: number;\n}\n\ntype OverlayStateType =\n | 'idle'\n | 'active'\n | 'visible'\n | 'hiding'\n | 'dispose'\n | 'disposed';\ntype ContentAnimation = 'sp-overlay-fade-in' | 'sp-overlay-fade-out';\n\nconst stateMachine: {\n initial: OverlayStateType;\n states: {\n [stateName: string]: {\n on: {\n [transitionName: string]: OverlayStateType;\n };\n };\n };\n} = {\n initial: 'idle',\n states: {\n idle: {\n on: {\n active: 'active',\n },\n },\n active: {\n on: {\n visible: 'visible',\n hiding: 'hiding',\n idle: 'idle',\n },\n },\n visible: {\n on: {\n hiding: 'hiding',\n idle: 'idle',\n },\n },\n hiding: {\n on: {\n dispose: 'dispose',\n },\n },\n dispose: {\n on: {\n disposed: 'disposed',\n },\n },\n disposed: {\n on: {},\n },\n },\n};\n\nconst stateTransition = (\n state?: OverlayStateType,\n event?: string\n): OverlayStateType => {\n if (!state) return stateMachine.initial;\n /* c8 ignore next */\n if (!event) return state;\n return stateMachine.states[state].on[event] || state;\n};\n\nconst parentOverlayOf = (el: Element): ActiveOverlay | null => {\n const closestOverlay = el.closest('active-overlay');\n if (closestOverlay) {\n return closestOverlay;\n }\n const rootNode = el.getRootNode() as ShadowRoot;\n if (rootNode.host) {\n return parentOverlayOf(rootNode.host);\n }\n return null;\n};\n\n/**\n * @element active-overlay\n *\n * @slot - content to display in the overlay\n */\nexport class ActiveOverlay extends SpectrumElement {\n public overlayContent!: HTMLElement;\n public overlayContentTip?: HTMLElement;\n public trigger!: HTMLElement;\n public virtualTrigger?: VirtualTrigger;\n\n private popper?: Instance;\n\n @property()\n public _state = stateTransition();\n public get state(): OverlayStateType {\n return this._state;\n }\n public set state(state: OverlayStateType) {\n const nextState = stateTransition(this.state, state);\n if (nextState === this.state) {\n return;\n }\n this._state = nextState;\n if (\n this.state === 'active' ||\n this.state === 'visible' ||\n this.state === 'hiding'\n ) {\n this.setAttribute('state', this.state);\n } else {\n this.removeAttribute('state');\n }\n }\n\n @property({ reflect: true, type: Boolean })\n public animating = false;\n\n @property({ reflect: true })\n public placement?: Placement;\n @property({ attribute: false })\n public theme: {\n color?: Color;\n scale?: Scale;\n lang?: string;\n theme?: Flavor;\n } = {};\n @property({ attribute: false })\n public receivesFocus?: 'auto';\n\n public tabbingAway = false;\n private originalPlacement?: Placement;\n private restoreContent?: () => Element[];\n\n /**\n * @prop Used by the popper library to indicate where the overlay was\n * actually rendered. Popper may switch which side an overlay\n * is rendered on to fit it on the screen\n */\n @property({ attribute: 'data-popper-placement' })\n public dataPopperPlacement?: Placement;\n\n public focus(): void {\n const firstFocusable = firstFocusableIn(this);\n if (firstFocusable) {\n firstFocusable.focus();\n /* c8 ignore next 3 */\n } else {\n super.focus();\n }\n this.removeAttribute('tabindex');\n }\n\n private get hasTheme(): boolean {\n return !!this.theme.color || !!this.theme.scale || !!this.theme.lang;\n }\n\n public offset = 6;\n public interaction: TriggerInteractions = 'hover';\n private positionAnimationFrame = 0;\n\n private timeout?: number;\n\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n public constructor() {\n super();\n this.stealOverlayContentPromise = new Promise(\n (res) => (this.stealOverlayContentResolver = res)\n );\n }\n\n private _modalRoot?: ActiveOverlay;\n\n public get hasModalRoot(): boolean {\n return !!this._modalRoot;\n }\n\n public feature(): void {\n this.tabIndex = -1;\n const parentOverlay = parentOverlayOf(this.trigger);\n const parentIsModal = parentOverlay && parentOverlay.slot === 'open';\n // If an overlay it triggered from within a \"modal\" overlay, it needs to continue\n // to act like one to get treated correctly in regards to tab trapping.\n if (this.interaction === 'modal' || parentIsModal || this._modalRoot) {\n this.slot = 'open';\n // If this isn't a modal root, walk up the overlays to the next modal root\n // and \"feature\" each on of the intervening overlays.\n if (this._modalRoot) {\n parentOverlay?.feature();\n }\n }\n }\n\n public obscure(\n nextOverlayInteraction: TriggerInteractions\n ): ActiveOverlay | undefined {\n if (this.slot && nextOverlayInteraction === 'modal') {\n this.removeAttribute('slot');\n // Obscure upto and including the next modal root.\n if (this.interaction !== 'modal') {\n const parentOverlay = parentOverlayOf(this.trigger);\n this._modalRoot = parentOverlay?.obscure(\n nextOverlayInteraction\n );\n return this._modalRoot;\n }\n return this;\n }\n return undefined;\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n /* c8 ignore next */\n if (!this.overlayContent) return;\n\n this.stealOverlayContent(this.overlayContent);\n\n /* c8 ignore next */\n if (!this.overlayContent || !this.trigger) return;\n\n if (this.placement && this.placement !== 'none') {\n this.popper = createPopper(\n this.virtualTrigger || this.trigger,\n this,\n {\n placement: this.placement,\n modifiers: [\n maxSize,\n applyMaxSize,\n {\n name: 'arrow',\n options: {\n element: this.overlayContentTip,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, this.offset],\n },\n },\n ],\n }\n );\n }\n\n this.state = 'active';\n\n document.addEventListener('sp-update-overlays', () => {\n this.updateOverlayPosition();\n this.state = 'visible';\n });\n\n this.feature();\n this.updateOverlayPosition()\n .then(() => this.applyContentAnimation('sp-overlay-fade-in'))\n .then(() => {\n if (this.receivesFocus) {\n this.focus();\n }\n this.trigger.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>('sp-opened', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n interaction: this.interaction,\n },\n })\n );\n });\n }\n\n private updateOverlayPopperPlacement(): void {\n /* c8 ignore next */\n const activeWithContent =\n this.state === 'active' && this.overlayContent;\n if (!activeWithContent) return;\n\n if (this.dataPopperPlacement) {\n // Copy this attribute to the actual overlay node so that it can use\n // the attribute for styling shadow DOM elements based on the side\n // that popper has chosen for it\n this.overlayContent.setAttribute(\n 'placement',\n this.dataPopperPlacement\n );\n } else if (this.originalPlacement) {\n this.overlayContent.setAttribute(\n 'placement',\n this.originalPlacement\n );\n } else {\n this.overlayContent.removeAttribute('placement');\n }\n }\n\n public updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('dataPopperPlacement')) {\n this.updateOverlayPopperPlacement();\n }\n }\n\n private open(openDetail: OverlayOpenDetail): void {\n this.extractDetail(openDetail);\n }\n\n private extractDetail(detail: OverlayOpenDetail): void {\n this.overlayContent = detail.content;\n this.overlayContentTip = detail.contentTip;\n this.trigger = detail.trigger;\n this.virtualTrigger = detail.virtualTrigger;\n this.placement = detail.placement;\n this.offset = detail.offset;\n this.interaction = detail.interaction;\n this.theme = detail.theme;\n this.receivesFocus = detail.receivesFocus;\n }\n\n public dispose(): void {\n /* c8 ignore next */\n if (this.state !== 'dispose') return;\n\n /* c8 ignore next 4 */\n if (this.timeout) {\n clearTimeout(this.timeout);\n delete this.timeout;\n }\n\n if (this.popper) {\n this.popper.destroy();\n this.popper = undefined;\n }\n this.trigger.removeEventListener(\n 'keydown',\n this.handleInlineTriggerKeydown\n );\n\n this.returnOverlayContent();\n this.state = 'disposed';\n\n if (this.willNotifyClosed) {\n this.overlayContent.dispatchEvent(new Event('sp-overlay-closed'));\n this.willNotifyClosed = false;\n }\n }\n\n private stealOverlayContent(element: HTMLElement): void {\n this.originalPlacement = element.getAttribute('placement') as Placement;\n this.restoreContent = reparentChildren([element], this, (el) => {\n const slotName = el.slot;\n el.removeAttribute('slot');\n return (el) => {\n el.slot = slotName;\n };\n });\n this.stealOverlayContentResolver();\n }\n\n private willNotifyClosed = false;\n\n private returnOverlayContent(): void {\n /* c8 ignore next */\n if (!this.restoreContent) return;\n\n const [element] = this.restoreContent();\n this.restoreContent = undefined;\n this.willNotifyClosed = true;\n\n if (this.originalPlacement) {\n element.setAttribute('placement', this.originalPlacement);\n delete this.originalPlacement;\n }\n }\n\n public async updateOverlayPosition(): Promise<void> {\n await (document.fonts ? document.fonts.ready : Promise.resolve());\n if (this.popper) {\n await this.popper.update();\n }\n }\n\n public async hide(animated = true): Promise<void> {\n this.state = 'hiding';\n if (animated) {\n await this.applyContentAnimation('sp-overlay-fade-out');\n }\n this.state = 'dispose';\n }\n\n private schedulePositionUpdate(): void {\n // Edge needs a little time to update the DOM before computing the layout\n cancelAnimationFrame(this.positionAnimationFrame);\n this.positionAnimationFrame = requestAnimationFrame(() =>\n this.updateOverlayPosition()\n );\n }\n\n private onSlotChange(): void {\n this.schedulePositionUpdate();\n }\n\n public handleInlineTriggerKeydown = (event: KeyboardEvent): void => {\n const { code, shiftKey } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n if (shiftKey) {\n this.tabbingAway = true;\n this.dispatchEvent(new Event('close'));\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.focus();\n };\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.schedulePositionUpdate();\n }\n\n public applyContentAnimation(\n animation: ContentAnimation\n ): Promise<boolean> {\n return new Promise((resolve): void => {\n const contents = this.shadowRoot.querySelector(\n '#contents'\n ) as HTMLElement;\n const doneHandler = (event: AnimationEvent): void => {\n if (animation !== event.animationName) return;\n contents.removeEventListener('animationend', doneHandler);\n contents.removeEventListener('animationcancel', doneHandler);\n this.animating = false;\n resolve(event.type === 'animationcancel');\n };\n contents.addEventListener('animationend', doneHandler);\n contents.addEventListener('animationcancel', doneHandler);\n\n contents.style.animationName = animation;\n this.animating = true;\n });\n }\n\n public renderTheme(content: TemplateResult): TemplateResult {\n const { color, scale, lang, theme } = this.theme;\n return html`\n <sp-theme\n theme=${ifDefined(theme)}\n color=${ifDefined(color)}\n scale=${ifDefined(scale)}\n lang=${ifDefined(lang)}\n part=\"theme\"\n >\n ${content}\n </sp-theme>\n `;\n }\n\n public render(): TemplateResult {\n const content = html`\n <div id=\"contents\">\n <slot @slotchange=${this.onSlotChange}></slot>\n </div>\n `;\n return this.hasTheme ? this.renderTheme(content) : content;\n }\n\n public static create(details: OverlayOpenDetail): ActiveOverlay {\n const overlay = new ActiveOverlay();\n\n if (details.content) {\n overlay.open(details);\n }\n\n return overlay;\n }\n\n private stealOverlayContentPromise = Promise.resolve();\n private stealOverlayContentResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.stealOverlayContentPromise;\n return complete;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ActiveOverlay.js","sourceRoot":"","sources":["ActiveOverlay.ts"],"names":[],"mappings":"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","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*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport { reparentChildren } from '@spectrum-web-components/shared';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { Color, Scale } from '@spectrum-web-components/theme';\nimport styles from './active-overlay.css.js';\nimport {\n OverlayOpenCloseDetail,\n OverlayOpenDetail,\n Placement,\n TriggerInteractions,\n} from './overlay-types.js';\nimport { applyMaxSize, createPopper, Instance, maxSize } from './popper.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\n\nexport interface PositionResult {\n arrowOffsetLeft: number;\n arrowOffsetTop: number;\n maxHeight: number;\n placement: string;\n positionLeft: number;\n positionTop: number;\n}\n\ntype OverlayStateType =\n | 'idle'\n | 'active'\n | 'visible'\n | 'hiding'\n | 'dispose'\n | 'disposed';\ntype ContentAnimation = 'sp-overlay-fade-in' | 'sp-overlay-fade-out';\n\nconst stateMachine: {\n initial: OverlayStateType;\n states: {\n [stateName: string]: {\n on: {\n [transitionName: string]: OverlayStateType;\n };\n };\n };\n} = {\n initial: 'idle',\n states: {\n idle: {\n on: {\n active: 'active',\n },\n },\n active: {\n on: {\n visible: 'visible',\n hiding: 'hiding',\n idle: 'idle',\n },\n },\n visible: {\n on: {\n hiding: 'hiding',\n idle: 'idle',\n },\n },\n hiding: {\n on: {\n dispose: 'dispose',\n },\n },\n dispose: {\n on: {\n disposed: 'disposed',\n },\n },\n disposed: {\n on: {},\n },\n },\n};\n\nconst stateTransition = (\n state?: OverlayStateType,\n event?: string\n): OverlayStateType => {\n if (!state) return stateMachine.initial;\n /* c8 ignore next */\n if (!event) return state;\n return stateMachine.states[state].on[event] || state;\n};\n\nconst parentOverlayOf = (el: Element): ActiveOverlay | null => {\n const closestOverlay = el.closest('active-overlay');\n if (closestOverlay) {\n return closestOverlay;\n }\n const rootNode = el.getRootNode() as ShadowRoot;\n if (rootNode.host) {\n return parentOverlayOf(rootNode.host);\n }\n return null;\n};\n\n/**\n * @element active-overlay\n *\n * @slot - content to display in the overlay\n */\nexport class ActiveOverlay extends SpectrumElement {\n public overlayContent!: HTMLElement;\n public overlayContentTip?: HTMLElement;\n public trigger!: HTMLElement;\n public virtualTrigger?: VirtualTrigger;\n\n private popper?: Instance;\n\n @property()\n public _state = stateTransition();\n public get state(): OverlayStateType {\n return this._state;\n }\n public set state(state: OverlayStateType) {\n const nextState = stateTransition(this.state, state);\n if (nextState === this.state) {\n return;\n }\n this._state = nextState;\n if (\n this.state === 'active' ||\n this.state === 'visible' ||\n this.state === 'hiding'\n ) {\n this.setAttribute('state', this.state);\n } else {\n this.removeAttribute('state');\n }\n }\n\n @property({ reflect: true, type: Boolean })\n public animating = false;\n\n @property({ reflect: true })\n public placement?: Placement;\n @property({ attribute: false })\n public theme: {\n color?: Color;\n scale?: Scale;\n lang?: string;\n } = {};\n @property({ attribute: false })\n public receivesFocus?: 'auto';\n\n public tabbingAway = false;\n private originalPlacement?: Placement;\n private restoreContent?: () => Element[];\n\n /**\n * @prop Used by the popper library to indicate where the overlay was\n * actually rendered. Popper may switch which side an overlay\n * is rendered on to fit it on the screen\n */\n @property({ attribute: 'data-popper-placement' })\n public dataPopperPlacement?: Placement;\n\n public focus(): void {\n const firstFocusable = firstFocusableIn(this);\n if (firstFocusable) {\n firstFocusable.focus();\n /* c8 ignore next 3 */\n } else {\n super.focus();\n }\n this.removeAttribute('tabindex');\n }\n\n private get hasTheme(): boolean {\n return !!this.theme.color || !!this.theme.scale || !!this.theme.lang;\n }\n\n public offset = 6;\n public interaction: TriggerInteractions = 'hover';\n private positionAnimationFrame = 0;\n\n private timeout?: number;\n\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n public constructor() {\n super();\n this.stealOverlayContentPromise = new Promise(\n (res) => (this.stealOverlayContentResolver = res)\n );\n }\n\n private _modalRoot?: ActiveOverlay;\n\n public get hasModalRoot(): boolean {\n return !!this._modalRoot;\n }\n\n public feature(): void {\n this.tabIndex = -1;\n const parentOverlay = parentOverlayOf(this.trigger);\n const parentIsModal = parentOverlay && parentOverlay.slot === 'open';\n // If an overlay it triggered from within a \"modal\" overlay, it needs to continue\n // to act like one to get treated correctly in regards to tab trapping.\n if (this.interaction === 'modal' || parentIsModal || this._modalRoot) {\n this.slot = 'open';\n // If this isn't a modal root, walk up the overlays to the next modal root\n // and \"feature\" each on of the intervening overlays.\n if (this._modalRoot) {\n parentOverlay?.feature();\n }\n }\n }\n\n public obscure(\n nextOverlayInteraction: TriggerInteractions\n ): ActiveOverlay | undefined {\n if (this.slot && nextOverlayInteraction === 'modal') {\n this.removeAttribute('slot');\n // Obscure upto and including the next modal root.\n if (this.interaction !== 'modal') {\n const parentOverlay = parentOverlayOf(this.trigger);\n this._modalRoot = parentOverlay?.obscure(\n nextOverlayInteraction\n );\n return this._modalRoot;\n }\n return this;\n }\n return undefined;\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n /* c8 ignore next */\n if (!this.overlayContent) return;\n\n this.stealOverlayContent(this.overlayContent);\n\n /* c8 ignore next */\n if (!this.overlayContent || !this.trigger) return;\n\n if (this.placement && this.placement !== 'none') {\n this.popper = createPopper(\n this.virtualTrigger || this.trigger,\n this,\n {\n placement: this.placement,\n modifiers: [\n maxSize,\n applyMaxSize,\n {\n name: 'arrow',\n options: {\n element: this.overlayContentTip,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, this.offset],\n },\n },\n ],\n }\n );\n }\n\n this.state = 'active';\n\n document.addEventListener('sp-update-overlays', () => {\n this.updateOverlayPosition();\n this.state = 'visible';\n });\n\n this.feature();\n this.updateOverlayPosition()\n .then(() => this.applyContentAnimation('sp-overlay-fade-in'))\n .then(() => {\n if (this.receivesFocus) {\n this.focus();\n }\n this.trigger.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>('sp-opened', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n interaction: this.interaction,\n },\n })\n );\n });\n }\n\n private updateOverlayPopperPlacement(): void {\n /* c8 ignore next */\n const activeWithContent =\n this.state === 'active' && this.overlayContent;\n if (!activeWithContent) return;\n\n if (this.dataPopperPlacement) {\n // Copy this attribute to the actual overlay node so that it can use\n // the attribute for styling shadow DOM elements based on the side\n // that popper has chosen for it\n this.overlayContent.setAttribute(\n 'placement',\n this.dataPopperPlacement\n );\n } else if (this.originalPlacement) {\n this.overlayContent.setAttribute(\n 'placement',\n this.originalPlacement\n );\n } else {\n this.overlayContent.removeAttribute('placement');\n }\n }\n\n public updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('dataPopperPlacement')) {\n this.updateOverlayPopperPlacement();\n }\n }\n\n private open(openDetail: OverlayOpenDetail): void {\n this.extractDetail(openDetail);\n }\n\n private extractDetail(detail: OverlayOpenDetail): void {\n this.overlayContent = detail.content;\n this.overlayContentTip = detail.contentTip;\n this.trigger = detail.trigger;\n this.virtualTrigger = detail.virtualTrigger;\n this.placement = detail.placement;\n this.offset = detail.offset;\n this.interaction = detail.interaction;\n this.theme = detail.theme;\n this.receivesFocus = detail.receivesFocus;\n }\n\n public dispose(): void {\n /* c8 ignore next */\n if (this.state !== 'dispose') return;\n\n /* c8 ignore next 4 */\n if (this.timeout) {\n clearTimeout(this.timeout);\n delete this.timeout;\n }\n\n if (this.popper) {\n this.popper.destroy();\n this.popper = undefined;\n }\n this.trigger.removeEventListener(\n 'keydown',\n this.handleInlineTriggerKeydown\n );\n\n this.returnOverlayContent();\n this.state = 'disposed';\n\n if (this.willNotifyClosed) {\n this.overlayContent.dispatchEvent(new Event('sp-overlay-closed'));\n this.willNotifyClosed = false;\n }\n }\n\n private stealOverlayContent(element: HTMLElement): void {\n this.originalPlacement = element.getAttribute('placement') as Placement;\n this.restoreContent = reparentChildren([element], this, (el) => {\n const slotName = el.slot;\n el.removeAttribute('slot');\n return (el) => {\n el.slot = slotName;\n };\n });\n this.stealOverlayContentResolver();\n }\n\n private willNotifyClosed = false;\n\n private returnOverlayContent(): void {\n /* c8 ignore next */\n if (!this.restoreContent) return;\n\n const [element] = this.restoreContent();\n this.restoreContent = undefined;\n this.willNotifyClosed = true;\n\n if (this.originalPlacement) {\n element.setAttribute('placement', this.originalPlacement);\n delete this.originalPlacement;\n }\n }\n\n public async updateOverlayPosition(): Promise<void> {\n await (document.fonts ? document.fonts.ready : Promise.resolve());\n if (this.popper) {\n await this.popper.update();\n }\n }\n\n public async hide(animated = true): Promise<void> {\n this.state = 'hiding';\n if (animated) {\n await this.applyContentAnimation('sp-overlay-fade-out');\n }\n this.state = 'dispose';\n }\n\n private schedulePositionUpdate(): void {\n // Edge needs a little time to update the DOM before computing the layout\n cancelAnimationFrame(this.positionAnimationFrame);\n this.positionAnimationFrame = requestAnimationFrame(() =>\n this.updateOverlayPosition()\n );\n }\n\n private onSlotChange(): void {\n this.schedulePositionUpdate();\n }\n\n public handleInlineTriggerKeydown = (event: KeyboardEvent): void => {\n const { code, shiftKey } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n if (shiftKey) {\n this.tabbingAway = true;\n this.dispatchEvent(new Event('close'));\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.focus();\n };\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.schedulePositionUpdate();\n }\n\n public applyContentAnimation(\n animation: ContentAnimation\n ): Promise<boolean> {\n return new Promise((resolve): void => {\n const contents = this.shadowRoot.querySelector(\n '#contents'\n ) as HTMLElement;\n const doneHandler = (event: AnimationEvent): void => {\n if (animation !== event.animationName) return;\n contents.removeEventListener('animationend', doneHandler);\n contents.removeEventListener('animationcancel', doneHandler);\n this.animating = false;\n resolve(event.type === 'animationcancel');\n };\n contents.addEventListener('animationend', doneHandler);\n contents.addEventListener('animationcancel', doneHandler);\n\n contents.style.animationName = animation;\n this.animating = true;\n });\n }\n\n public renderTheme(content: TemplateResult): TemplateResult {\n const { color, scale, lang } = this.theme;\n return html`\n <sp-theme\n color=${ifDefined(color)}\n scale=${ifDefined(scale)}\n lang=${ifDefined(lang)}\n part=\"theme\"\n >\n ${content}\n </sp-theme>\n `;\n }\n\n public render(): TemplateResult {\n const content = html`\n <div id=\"contents\">\n <slot @slotchange=${this.onSlotChange}></slot>\n </div>\n `;\n return this.hasTheme ? this.renderTheme(content) : content;\n }\n\n public static create(details: OverlayOpenDetail): ActiveOverlay {\n const overlay = new ActiveOverlay();\n\n if (details.content) {\n overlay.open(details);\n }\n\n return overlay;\n }\n\n private stealOverlayContentPromise = Promise.resolve();\n private stealOverlayContentResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.stealOverlayContentPromise;\n return complete;\n }\n}\n"]}
|
package/src/OverlayTrigger.js
CHANGED
|
@@ -57,7 +57,7 @@ export class OverlayTrigger extends LitElement {
|
|
|
57
57
|
// Keyboard event availability documented in README.md
|
|
58
58
|
/* eslint-disable lit-a11y/click-events-have-key-events */
|
|
59
59
|
return html `
|
|
60
|
-
<
|
|
60
|
+
<slot
|
|
61
61
|
id="trigger"
|
|
62
62
|
@click=${this.onTrigger}
|
|
63
63
|
@longpress=${this.onTrigger}
|
|
@@ -66,12 +66,9 @@ export class OverlayTrigger extends LitElement {
|
|
|
66
66
|
@focusin=${this.onTrigger}
|
|
67
67
|
@focusout=${this.onTrigger}
|
|
68
68
|
@sp-closed=${this.handleClose}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
name="trigger"
|
|
73
|
-
></slot>
|
|
74
|
-
</div>
|
|
69
|
+
@slotchange=${this.onTargetSlotChange}
|
|
70
|
+
name="trigger"
|
|
71
|
+
></slot>
|
|
75
72
|
<div id="overlay-content">
|
|
76
73
|
<slot
|
|
77
74
|
@slotchange=${this.onClickSlotChange}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayTrigger.js","sourceRoot":"","sources":["OverlayTrigger.ts"],"names":[],"mappings":"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","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*/\n\nimport {\n CSSResultArray,\n html,\n LitElement,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends LitElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <div\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n >\n <slot\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n </div>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected updated(changes: PropertyValues): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n this.type && this.type !== 'inline' ? 'auto' : undefined,\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"OverlayTrigger.js","sourceRoot":"","sources":["OverlayTrigger.ts"],"names":[],"mappings":"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","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*/\n\nimport {\n CSSResultArray,\n html,\n LitElement,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends LitElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <slot\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected updated(changes: PropertyValues): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n this.type && this.type !== 'inline' ? 'auto' : undefined,\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"]}
|
package/src/overlay-stack.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export declare class OverlayStack {
|
|
|
13
13
|
private overlayHolder;
|
|
14
14
|
private _eventsAreBound;
|
|
15
15
|
private initTabTrapping;
|
|
16
|
+
private _bodyMarginsApplied;
|
|
17
|
+
private applyBodyMargins;
|
|
16
18
|
private startTabTrapping;
|
|
17
19
|
private stopTabTrapping;
|
|
18
20
|
private forwardContextmenuEvent;
|
package/src/overlay-stack.js
CHANGED
|
@@ -28,9 +28,10 @@ export class OverlayStack {
|
|
|
28
28
|
this.canTabTrap = true;
|
|
29
29
|
this.trappingInited = false;
|
|
30
30
|
this._eventsAreBound = false;
|
|
31
|
+
this._bodyMarginsApplied = false;
|
|
31
32
|
this.forwardContextmenuEvent = async (event) => {
|
|
32
33
|
const topOverlay = this.overlays[this.overlays.length - 1];
|
|
33
|
-
if (topOverlay.interaction !== 'modal') {
|
|
34
|
+
if (!this.trappingInited || topOverlay.interaction !== 'modal') {
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
36
37
|
event.stopPropagation();
|
|
@@ -98,6 +99,9 @@ export class OverlayStack {
|
|
|
98
99
|
};
|
|
99
100
|
}
|
|
100
101
|
initTabTrapping() {
|
|
102
|
+
if (this.trappingInited)
|
|
103
|
+
return;
|
|
104
|
+
this.trappingInited = true;
|
|
101
105
|
/* c8 ignore next 4 */
|
|
102
106
|
if (this.document.body.shadowRoot) {
|
|
103
107
|
this.canTabTrap = false;
|
|
@@ -110,7 +114,6 @@ export class OverlayStack {
|
|
|
110
114
|
}
|
|
111
115
|
const root = this.document.body.shadowRoot;
|
|
112
116
|
root.innerHTML = `
|
|
113
|
-
<div id="actual"><slot></slot></div>
|
|
114
117
|
<style>
|
|
115
118
|
#actual {
|
|
116
119
|
position: relative;
|
|
@@ -128,22 +131,19 @@ export class OverlayStack {
|
|
|
128
131
|
top: 0;
|
|
129
132
|
left: 0;
|
|
130
133
|
position: fixed;
|
|
131
|
-
pointer-events: none;
|
|
132
134
|
}
|
|
133
135
|
[name="open"]::slotted(*) {
|
|
134
136
|
pointer-events: all;
|
|
135
137
|
}
|
|
136
|
-
#holder
|
|
137
|
-
display: none
|
|
138
|
-
}
|
|
139
|
-
#actual[aria-hidden] {
|
|
140
|
-
touch-action: none;
|
|
138
|
+
#holder {
|
|
139
|
+
display: none;
|
|
141
140
|
}
|
|
142
|
-
#actual[
|
|
143
|
-
|
|
141
|
+
#actual[aria-hidden] + #holder {
|
|
142
|
+
display: block;
|
|
144
143
|
}
|
|
145
144
|
</style>
|
|
146
|
-
<div id="
|
|
145
|
+
<div id="actual"><slot></slot></div>
|
|
146
|
+
<div id="holder"><slot name="open"></slot></div>
|
|
147
147
|
`;
|
|
148
148
|
this.tabTrapper = root.querySelector('#actual');
|
|
149
149
|
this.overlayHolder = root.querySelector('#holder');
|
|
@@ -151,25 +151,36 @@ export class OverlayStack {
|
|
|
151
151
|
if (this.tabTrapper.shadowRoot) {
|
|
152
152
|
this.tabTrapper.shadowRoot.innerHTML = '<slot></slot>';
|
|
153
153
|
}
|
|
154
|
+
this.overlayHolder.addEventListener('contextmenu', this.forwardContextmenuEvent, true);
|
|
155
|
+
requestAnimationFrame(() => {
|
|
156
|
+
this.applyBodyMargins();
|
|
157
|
+
const observer = new ResizeObserver(() => {
|
|
158
|
+
this.applyBodyMargins();
|
|
159
|
+
});
|
|
160
|
+
observer.observe(document.body);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
applyBodyMargins() {
|
|
164
|
+
const { marginLeft, marginRight, marginTop, marginBottom } = getComputedStyle(document.body);
|
|
165
|
+
const allZero = parseFloat(marginLeft) === 0 &&
|
|
166
|
+
parseFloat(marginRight) === 0 &&
|
|
167
|
+
parseFloat(marginTop) === 0 &&
|
|
168
|
+
parseFloat(marginBottom) === 0;
|
|
169
|
+
if (allZero && !this._bodyMarginsApplied) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
this.tabTrapper.style.setProperty('--swc-body-margins-inline', `calc(${marginLeft} + ${marginRight})`);
|
|
173
|
+
this.tabTrapper.style.setProperty('--swc-body-margins-block', `calc(${marginTop} + ${marginBottom})`);
|
|
174
|
+
this._bodyMarginsApplied = !allZero;
|
|
154
175
|
}
|
|
155
176
|
startTabTrapping() {
|
|
156
|
-
|
|
157
|
-
this.initTabTrapping();
|
|
158
|
-
this.trappingInited = true;
|
|
159
|
-
}
|
|
177
|
+
this.initTabTrapping();
|
|
160
178
|
/* c8 ignore next 3 */
|
|
161
179
|
if (!this.canTabTrap) {
|
|
162
180
|
return;
|
|
163
181
|
}
|
|
164
182
|
this.tabTrapper.tabIndex = -1;
|
|
165
|
-
this.tabTrapper.addEventListener('contextmenu', this.forwardContextmenuEvent, true);
|
|
166
183
|
this.tabTrapper.setAttribute('aria-hidden', 'true');
|
|
167
|
-
this.overlayHolder.hidden = false;
|
|
168
|
-
requestAnimationFrame(() => {
|
|
169
|
-
const bodyStyles = getComputedStyle(document.body);
|
|
170
|
-
this.tabTrapper.style.setProperty('--swc-body-margins-inline', `calc(${bodyStyles.marginLeft} + ${bodyStyles.marginRight})`);
|
|
171
|
-
this.tabTrapper.style.setProperty('--swc-body-margins-block', `calc(${bodyStyles.marginTop} + ${bodyStyles.marginBottom})`);
|
|
172
|
-
});
|
|
173
184
|
}
|
|
174
185
|
stopTabTrapping() {
|
|
175
186
|
/* c8 ignore next 3 */
|
|
@@ -177,9 +188,7 @@ export class OverlayStack {
|
|
|
177
188
|
return;
|
|
178
189
|
}
|
|
179
190
|
this.tabTrapper.removeAttribute('tabindex');
|
|
180
|
-
this.tabTrapper.removeEventListener('contextmenu', this.forwardContextmenuEvent, true);
|
|
181
191
|
this.tabTrapper.removeAttribute('aria-hidden');
|
|
182
|
-
this.overlayHolder.hidden = true;
|
|
183
192
|
}
|
|
184
193
|
get document() {
|
|
185
194
|
return this.root.ownerDocument /* c8 ignore next */ || document;
|
package/src/overlay-stack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay-stack.js","sourceRoot":"","sources":["overlay-stack.ts"],"names":[],"mappings":"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","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*/\n\nimport { ActiveOverlay } from './ActiveOverlay.js';\nimport { OverlayOpenCloseDetail, OverlayOpenDetail } from './overlay-types';\nimport { OverlayTimer } from './overlay-timer.js';\nimport '../active-overlay.js';\n\nfunction isLeftClick(event: MouseEvent): boolean {\n return event.button === 0;\n}\n\nfunction hasModifier(event: MouseEvent): boolean {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\ninterface ManagedOverlayContent {\n open: boolean;\n overlayWillOpenCallback?: (args: { trigger: HTMLElement }) => void;\n overlayOpenCallback?: (args: { trigger: HTMLElement }) => void;\n overlayOpenCancelledCallback?: (args: { trigger: HTMLElement }) => void;\n overlayCloseCallback?: (args: { trigger: HTMLElement }) => void;\n}\n\nexport class OverlayStack {\n public overlays: ActiveOverlay[] = [];\n\n private preventMouseRootClose = false;\n private root: HTMLElement = document.body;\n private handlingResize = false;\n private overlayTimer = new OverlayTimer();\n\n private canTabTrap = true;\n private trappingInited = false;\n private tabTrapper!: HTMLElement;\n private overlayHolder!: HTMLElement;\n private _eventsAreBound = false;\n\n private initTabTrapping(): void {\n /* c8 ignore next 4 */\n if (this.document.body.shadowRoot) {\n this.canTabTrap = false;\n return;\n }\n this.document.body.attachShadow({ mode: 'open' });\n /* c8 ignore next 3 */\n if (!this.document.body.shadowRoot) {\n return;\n }\n const root = this.document.body.shadowRoot as ShadowRoot;\n root.innerHTML = `\n <div id=\"actual\"><slot></slot></div>\n <style>\n #actual {\n position: relative;\n height: calc(100% - var(--swc-body-margins-block, 0px));\n z-index: 0;\n min-height: calc(100vh - var(--swc-body-margins-block, 0px));\n }\n #holder {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n position: fixed;\n pointer-events: none;\n }\n [name=\"open\"]::slotted(*) {\n pointer-events: all;\n }\n #holder[hidden] {\n display: none !important;\n }\n #actual[aria-hidden] {\n touch-action: none;\n }\n #actual[tabindex=\"-1\"] ::slotted(*) {\n pointer-events: none; /* just in case? */\n }\n </style>\n <div id=\"holder\" hidden><slot name=\"open\"></slot></div>\n `;\n this.tabTrapper = root.querySelector('#actual') as HTMLElement;\n this.overlayHolder = root.querySelector('#holder') as HTMLElement;\n this.tabTrapper.attachShadow({ mode: 'open' });\n if (this.tabTrapper.shadowRoot) {\n this.tabTrapper.shadowRoot.innerHTML = '<slot></slot>';\n }\n }\n\n private startTabTrapping(): void {\n if (!this.trappingInited) {\n this.initTabTrapping();\n this.trappingInited = true;\n }\n /* c8 ignore next 3 */\n if (!this.canTabTrap) {\n return;\n }\n this.tabTrapper.tabIndex = -1;\n this.tabTrapper.addEventListener(\n 'contextmenu',\n this.forwardContextmenuEvent,\n true\n );\n this.tabTrapper.setAttribute('aria-hidden', 'true');\n this.overlayHolder.hidden = false;\n requestAnimationFrame(() => {\n const bodyStyles = getComputedStyle(document.body);\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-inline',\n `calc(${bodyStyles.marginLeft} + ${bodyStyles.marginRight})`\n );\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-block',\n `calc(${bodyStyles.marginTop} + ${bodyStyles.marginBottom})`\n );\n });\n }\n\n private stopTabTrapping(): void {\n /* c8 ignore next 3 */\n if (!this.canTabTrap || !this.trappingInited) {\n return;\n }\n this.tabTrapper.removeAttribute('tabindex');\n this.tabTrapper.removeEventListener(\n 'contextmenu',\n this.forwardContextmenuEvent,\n true\n );\n this.tabTrapper.removeAttribute('aria-hidden');\n this.overlayHolder.hidden = true;\n }\n\n private forwardContextmenuEvent = async (\n event: MouseEvent\n ): Promise<void> => {\n const topOverlay = this.overlays[this.overlays.length - 1];\n if (topOverlay.interaction !== 'modal') {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n await this.closeTopOverlay();\n let target = document.elementFromPoint(event.clientX, event.clientY);\n while (target?.shadowRoot) {\n const innerTarget = (\n target.shadowRoot as unknown as {\n elementFromPoint: (x: number, y: number) => Element | null;\n }\n ).elementFromPoint(event.clientX, event.clientY);\n if (!innerTarget || innerTarget === target) {\n break;\n }\n target = innerTarget;\n }\n target?.dispatchEvent(new MouseEvent('contextmenu', event));\n };\n\n private get document(): Document {\n return this.root.ownerDocument /* c8 ignore next */ || document;\n }\n\n private get topOverlay(): ActiveOverlay | undefined {\n return this.overlays.slice(-1)[0];\n }\n\n private findOverlayForContent(\n overlayContent: HTMLElement\n ): ActiveOverlay | undefined {\n for (const item of this.overlays) {\n if (overlayContent === item.overlayContent) {\n return item;\n }\n }\n return undefined;\n }\n\n private addEventListeners(): void {\n if (this._eventsAreBound) return;\n this._eventsAreBound = true;\n this.document.addEventListener('click', this.handleMouseCapture, true);\n this.document.addEventListener('click', this.handleMouse);\n this.document.addEventListener('keyup', this.handleKeyUp);\n window.addEventListener('resize', this.handleResize);\n }\n\n private isClickOverlayActiveForTrigger(trigger: HTMLElement): boolean {\n return this.overlays.some(\n (item) => trigger === item.trigger && item.interaction === 'click'\n );\n }\n\n public async openOverlay(details: OverlayOpenDetail): Promise<boolean> {\n this.addEventListeners();\n if (this.findOverlayForContent(details.content)) {\n return false;\n }\n if (details.notImmediatelyClosable) {\n this._doesNotCloseOnFirstClick = true;\n }\n if (details.interaction === 'modal') {\n this.startTabTrapping();\n }\n\n const contentWithLifecycle =\n details.content as unknown as ManagedOverlayContent;\n if (contentWithLifecycle.overlayWillOpenCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayWillOpenCallback({ trigger });\n }\n\n if (details.delayed) {\n const cancelledPromise = this.overlayTimer.openTimer(\n details.content\n );\n const promises = [cancelledPromise];\n if (details.abortPromise) {\n promises.push(details.abortPromise);\n }\n const cancelled = await Promise.race(promises);\n if (cancelled) {\n if (contentWithLifecycle.overlayOpenCancelledCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayOpenCancelledCallback({\n trigger,\n });\n }\n return cancelled;\n }\n }\n\n if (details.interaction === 'click') {\n this.closeAllHoverOverlays();\n } else if (\n details.interaction === 'hover' &&\n this.isClickOverlayActiveForTrigger(details.trigger)\n ) {\n // Don't show a hover popover if the click popover is already active\n return true;\n }\n\n const activeOverlay = ActiveOverlay.create(details);\n\n if (this.overlays.length) {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.obscure(activeOverlay.interaction);\n }\n\n document.body.appendChild(activeOverlay);\n\n /**\n * The following work to make the new overlay the \"top\" of the stack\n * has to happen AFTER the current call stack completes in case there\n * is work there in to remove the previous \"top\" overlay.\n */\n return new Promise((res) => requestAnimationFrame(res)).then(\n async () => {\n this.overlays.push(activeOverlay);\n await activeOverlay.updateComplete;\n this.addOverlayEventListeners(activeOverlay);\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = true;\n }\n if (contentWithLifecycle.overlayOpenCallback) {\n const { trigger } = activeOverlay;\n contentWithLifecycle.overlayOpenCallback({ trigger });\n }\n if (details.receivesFocus === 'auto') {\n activeOverlay.focus();\n }\n return false;\n }\n );\n }\n\n public addOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('close', () => {\n this.hideAndCloseOverlay(activeOverlay);\n });\n switch (activeOverlay.interaction) {\n case 'replace':\n this.addReplaceOverlayEventListeners(activeOverlay);\n break;\n case 'inline':\n this.addInlineOverlayEventListeners(activeOverlay);\n break;\n }\n }\n\n public addReplaceOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n event.stopPropagation();\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.tabbingAway = true;\n activeOverlay.trigger.focus();\n activeOverlay.trigger.dispatchEvent(\n new KeyboardEvent('keydown', event)\n );\n });\n }\n\n public addInlineOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.trigger.addEventListener(\n 'keydown',\n activeOverlay.handleInlineTriggerKeydown\n );\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code, shiftKey } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n activeOverlay.tabbingAway = true;\n if (shiftKey) {\n const returnFocusElement = document.createElement('span');\n returnFocusElement.tabIndex = -1;\n if (activeOverlay.trigger.hasAttribute('slot')) {\n returnFocusElement.slot = activeOverlay.trigger.slot;\n }\n activeOverlay.trigger.insertAdjacentElement(\n 'afterend',\n returnFocusElement\n );\n returnFocusElement.focus();\n returnFocusElement.remove();\n return;\n }\n\n event.stopPropagation();\n const triggerWithLifecycle =\n activeOverlay.trigger as unknown as ManagedOverlayContent;\n if (typeof triggerWithLifecycle.open !== 'undefined') {\n triggerWithLifecycle.open = false;\n }\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.trigger.focus();\n });\n }\n\n public closeOverlay(content: HTMLElement): void {\n this.overlayTimer.close(content);\n requestAnimationFrame(() => {\n const overlay = this.findOverlayForContent(content);\n this.hideAndCloseOverlay(overlay);\n });\n }\n\n private handleMouseCapture = (event: MouseEvent): void => {\n const topOverlay = this.topOverlay;\n if (\n !event.target ||\n !topOverlay ||\n !topOverlay.overlayContent ||\n hasModifier(event) ||\n !isLeftClick(event)\n ) {\n this.preventMouseRootClose = true;\n return;\n }\n\n if (event.target instanceof Node) {\n const path = event.composedPath();\n if (path.indexOf(topOverlay.overlayContent) >= 0) {\n this.preventMouseRootClose = true;\n return;\n }\n this.preventMouseRootClose = false;\n }\n };\n\n private closeAllHoverOverlays(): void {\n for (const overlay of this.overlays) {\n if (overlay.interaction === 'hover') {\n this.hideAndCloseOverlay(overlay, false);\n }\n }\n }\n\n private manageFocusAfterCloseWhenOverlaysRemain(): void {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.feature();\n // Push focus in the the next remaining overlay as needed when a `type=\"modal\"` overlay exists.\n if (topOverlay.interaction === 'modal' || topOverlay.hasModalRoot) {\n topOverlay.focus();\n } else {\n this.stopTabTrapping();\n }\n }\n\n private manageFocusAfterCloseWhenLastOverlay(overlay: ActiveOverlay): void {\n this.stopTabTrapping();\n const isModal = overlay.interaction === 'modal';\n const isReplace = overlay.interaction === 'replace';\n const isInline = overlay.interaction === 'inline';\n const isTabbingAwayFromInlineOrReplace =\n (isReplace || isInline) && !overlay.tabbingAway;\n overlay.tabbingAway = false;\n if (!isModal && !isTabbingAwayFromInlineOrReplace) {\n return;\n }\n // Manage post closure focus when needed.\n const overlayRoot = overlay.overlayContent.getRootNode() as ShadowRoot;\n const overlayContentActiveElement = overlayRoot.activeElement;\n let triggerRoot: ShadowRoot;\n let triggerActiveElement: Element | null;\n const contentContainsActiveElement = (): boolean =>\n overlay.overlayContent.contains(overlayContentActiveElement);\n const triggerRootContainsActiveElement = (): boolean => {\n triggerRoot = overlay.trigger.getRootNode() as ShadowRoot;\n triggerActiveElement = triggerRoot.activeElement;\n return triggerRoot.contains(triggerActiveElement);\n };\n const triggerHostIsActiveElement = (): boolean =>\n triggerRoot.host && triggerRoot.host === triggerActiveElement;\n // Return focus to the trigger as long as the user hasn't actively focused\n // something outside of the current overlay interface; trigger, root, host.\n if (\n isModal ||\n contentContainsActiveElement() ||\n triggerRootContainsActiveElement() ||\n triggerHostIsActiveElement()\n ) {\n overlay.trigger.focus();\n }\n }\n\n private async hideAndCloseOverlay(\n overlay?: ActiveOverlay,\n animated?: boolean\n ): Promise<void> {\n if (!overlay) {\n return;\n }\n await overlay.hide(animated);\n const contentWithLifecycle =\n overlay.overlayContent as unknown as ManagedOverlayContent;\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = false;\n }\n if (contentWithLifecycle.overlayCloseCallback) {\n const { trigger } = overlay;\n contentWithLifecycle.overlayCloseCallback({ trigger });\n }\n\n if (overlay.state != 'dispose') return;\n\n const index = this.overlays.indexOf(overlay);\n if (index >= 0) {\n this.overlays.splice(index, 1);\n }\n\n if (this.overlays.length) {\n this.manageFocusAfterCloseWhenOverlaysRemain();\n } else {\n this.manageFocusAfterCloseWhenLastOverlay(overlay);\n }\n\n overlay.remove();\n overlay.dispose();\n\n overlay.trigger.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>('sp-closed', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n interaction: overlay.interaction,\n },\n })\n );\n }\n\n private closeTopOverlay(): Promise<void> {\n return this.hideAndCloseOverlay(this.topOverlay);\n }\n\n /**\n * A \"longpress\" occurs before the \"click\" that creates it has occured.\n * In that way the first click will still be part of the \"longpress\" and\n * not part of closing the overlay.\n */\n private _doesNotCloseOnFirstClick = false;\n\n private handleMouse = (event: Event): void => {\n if (this._doesNotCloseOnFirstClick) {\n this._doesNotCloseOnFirstClick = false;\n return;\n }\n if (this.preventMouseRootClose || event.defaultPrevented) {\n return;\n }\n this.closeTopOverlay();\n };\n\n private handleKeyUp = (event: KeyboardEvent): void => {\n if (event.code === 'Escape') {\n this.closeTopOverlay();\n }\n };\n\n private handleResize = (): void => {\n if (this.handlingResize) return;\n\n this.handlingResize = true;\n requestAnimationFrame(async () => {\n const promises = this.overlays.map((overlay) =>\n overlay.updateOverlayPosition()\n );\n await Promise.all(promises);\n this.handlingResize = false;\n });\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"overlay-stack.js","sourceRoot":"","sources":["overlay-stack.ts"],"names":[],"mappings":"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","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*/\n\nimport { ActiveOverlay } from './ActiveOverlay.js';\nimport { OverlayOpenCloseDetail, OverlayOpenDetail } from './overlay-types';\nimport { OverlayTimer } from './overlay-timer.js';\nimport '../active-overlay.js';\n\nfunction isLeftClick(event: MouseEvent): boolean {\n return event.button === 0;\n}\n\nfunction hasModifier(event: MouseEvent): boolean {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\ninterface ManagedOverlayContent {\n open: boolean;\n overlayWillOpenCallback?: (args: { trigger: HTMLElement }) => void;\n overlayOpenCallback?: (args: { trigger: HTMLElement }) => void;\n overlayOpenCancelledCallback?: (args: { trigger: HTMLElement }) => void;\n overlayCloseCallback?: (args: { trigger: HTMLElement }) => void;\n}\n\nexport class OverlayStack {\n public overlays: ActiveOverlay[] = [];\n\n private preventMouseRootClose = false;\n private root: HTMLElement = document.body;\n private handlingResize = false;\n private overlayTimer = new OverlayTimer();\n\n private canTabTrap = true;\n private trappingInited = false;\n private tabTrapper!: HTMLElement;\n private overlayHolder!: HTMLElement;\n private _eventsAreBound = false;\n\n private initTabTrapping(): void {\n if (this.trappingInited) return;\n this.trappingInited = true;\n /* c8 ignore next 4 */\n if (this.document.body.shadowRoot) {\n this.canTabTrap = false;\n return;\n }\n this.document.body.attachShadow({ mode: 'open' });\n /* c8 ignore next 3 */\n if (!this.document.body.shadowRoot) {\n return;\n }\n const root = this.document.body.shadowRoot as ShadowRoot;\n root.innerHTML = `\n <style>\n #actual {\n position: relative;\n height: calc(100% - var(--swc-body-margins-block, 0px));\n z-index: 0;\n min-height: calc(100vh - var(--swc-body-margins-block, 0px));\n }\n #holder {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n position: fixed;\n }\n [name=\"open\"]::slotted(*) {\n pointer-events: all;\n }\n #holder {\n display: none;\n }\n #actual[aria-hidden] + #holder {\n display: block;\n }\n </style>\n <div id=\"actual\"><slot></slot></div>\n <div id=\"holder\"><slot name=\"open\"></slot></div>\n `;\n this.tabTrapper = root.querySelector('#actual') as HTMLElement;\n this.overlayHolder = root.querySelector('#holder') as HTMLElement;\n this.tabTrapper.attachShadow({ mode: 'open' });\n if (this.tabTrapper.shadowRoot) {\n this.tabTrapper.shadowRoot.innerHTML = '<slot></slot>';\n }\n this.overlayHolder.addEventListener(\n 'contextmenu',\n this.forwardContextmenuEvent,\n true\n );\n requestAnimationFrame(() => {\n this.applyBodyMargins();\n const observer = new ResizeObserver(() => {\n this.applyBodyMargins();\n });\n observer.observe(document.body);\n });\n }\n\n private _bodyMarginsApplied = false;\n\n private applyBodyMargins(): void {\n const { marginLeft, marginRight, marginTop, marginBottom } =\n getComputedStyle(document.body);\n const allZero =\n parseFloat(marginLeft) === 0 &&\n parseFloat(marginRight) === 0 &&\n parseFloat(marginTop) === 0 &&\n parseFloat(marginBottom) === 0;\n if (allZero && !this._bodyMarginsApplied) {\n return;\n }\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-inline',\n `calc(${marginLeft} + ${marginRight})`\n );\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-block',\n `calc(${marginTop} + ${marginBottom})`\n );\n this._bodyMarginsApplied = !allZero;\n }\n\n private startTabTrapping(): void {\n this.initTabTrapping();\n /* c8 ignore next 3 */\n if (!this.canTabTrap) {\n return;\n }\n this.tabTrapper.tabIndex = -1;\n this.tabTrapper.setAttribute('aria-hidden', 'true');\n }\n\n private stopTabTrapping(): void {\n /* c8 ignore next 3 */\n if (!this.canTabTrap || !this.trappingInited) {\n return;\n }\n this.tabTrapper.removeAttribute('tabindex');\n this.tabTrapper.removeAttribute('aria-hidden');\n }\n\n private forwardContextmenuEvent = async (\n event: MouseEvent\n ): Promise<void> => {\n const topOverlay = this.overlays[this.overlays.length - 1];\n if (!this.trappingInited || topOverlay.interaction !== 'modal') {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n await this.closeTopOverlay();\n let target = document.elementFromPoint(event.clientX, event.clientY);\n while (target?.shadowRoot) {\n const innerTarget = (\n target.shadowRoot as unknown as {\n elementFromPoint: (x: number, y: number) => Element | null;\n }\n ).elementFromPoint(event.clientX, event.clientY);\n if (!innerTarget || innerTarget === target) {\n break;\n }\n target = innerTarget;\n }\n target?.dispatchEvent(new MouseEvent('contextmenu', event));\n };\n\n private get document(): Document {\n return this.root.ownerDocument /* c8 ignore next */ || document;\n }\n\n private get topOverlay(): ActiveOverlay | undefined {\n return this.overlays.slice(-1)[0];\n }\n\n private findOverlayForContent(\n overlayContent: HTMLElement\n ): ActiveOverlay | undefined {\n for (const item of this.overlays) {\n if (overlayContent === item.overlayContent) {\n return item;\n }\n }\n return undefined;\n }\n\n private addEventListeners(): void {\n if (this._eventsAreBound) return;\n this._eventsAreBound = true;\n this.document.addEventListener('click', this.handleMouseCapture, true);\n this.document.addEventListener('click', this.handleMouse);\n this.document.addEventListener('keyup', this.handleKeyUp);\n window.addEventListener('resize', this.handleResize);\n }\n\n private isClickOverlayActiveForTrigger(trigger: HTMLElement): boolean {\n return this.overlays.some(\n (item) => trigger === item.trigger && item.interaction === 'click'\n );\n }\n\n public async openOverlay(details: OverlayOpenDetail): Promise<boolean> {\n this.addEventListeners();\n if (this.findOverlayForContent(details.content)) {\n return false;\n }\n if (details.notImmediatelyClosable) {\n this._doesNotCloseOnFirstClick = true;\n }\n if (details.interaction === 'modal') {\n this.startTabTrapping();\n }\n\n const contentWithLifecycle =\n details.content as unknown as ManagedOverlayContent;\n if (contentWithLifecycle.overlayWillOpenCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayWillOpenCallback({ trigger });\n }\n\n if (details.delayed) {\n const cancelledPromise = this.overlayTimer.openTimer(\n details.content\n );\n const promises = [cancelledPromise];\n if (details.abortPromise) {\n promises.push(details.abortPromise);\n }\n const cancelled = await Promise.race(promises);\n if (cancelled) {\n if (contentWithLifecycle.overlayOpenCancelledCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayOpenCancelledCallback({\n trigger,\n });\n }\n return cancelled;\n }\n }\n\n if (details.interaction === 'click') {\n this.closeAllHoverOverlays();\n } else if (\n details.interaction === 'hover' &&\n this.isClickOverlayActiveForTrigger(details.trigger)\n ) {\n // Don't show a hover popover if the click popover is already active\n return true;\n }\n\n const activeOverlay = ActiveOverlay.create(details);\n\n if (this.overlays.length) {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.obscure(activeOverlay.interaction);\n }\n\n document.body.appendChild(activeOverlay);\n\n /**\n * The following work to make the new overlay the \"top\" of the stack\n * has to happen AFTER the current call stack completes in case there\n * is work there in to remove the previous \"top\" overlay.\n */\n return new Promise((res) => requestAnimationFrame(res)).then(\n async () => {\n this.overlays.push(activeOverlay);\n await activeOverlay.updateComplete;\n this.addOverlayEventListeners(activeOverlay);\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = true;\n }\n if (contentWithLifecycle.overlayOpenCallback) {\n const { trigger } = activeOverlay;\n contentWithLifecycle.overlayOpenCallback({ trigger });\n }\n if (details.receivesFocus === 'auto') {\n activeOverlay.focus();\n }\n return false;\n }\n );\n }\n\n public addOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('close', () => {\n this.hideAndCloseOverlay(activeOverlay);\n });\n switch (activeOverlay.interaction) {\n case 'replace':\n this.addReplaceOverlayEventListeners(activeOverlay);\n break;\n case 'inline':\n this.addInlineOverlayEventListeners(activeOverlay);\n break;\n }\n }\n\n public addReplaceOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n event.stopPropagation();\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.tabbingAway = true;\n activeOverlay.trigger.focus();\n activeOverlay.trigger.dispatchEvent(\n new KeyboardEvent('keydown', event)\n );\n });\n }\n\n public addInlineOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.trigger.addEventListener(\n 'keydown',\n activeOverlay.handleInlineTriggerKeydown\n );\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code, shiftKey } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n activeOverlay.tabbingAway = true;\n if (shiftKey) {\n const returnFocusElement = document.createElement('span');\n returnFocusElement.tabIndex = -1;\n if (activeOverlay.trigger.hasAttribute('slot')) {\n returnFocusElement.slot = activeOverlay.trigger.slot;\n }\n activeOverlay.trigger.insertAdjacentElement(\n 'afterend',\n returnFocusElement\n );\n returnFocusElement.focus();\n returnFocusElement.remove();\n return;\n }\n\n event.stopPropagation();\n const triggerWithLifecycle =\n activeOverlay.trigger as unknown as ManagedOverlayContent;\n if (typeof triggerWithLifecycle.open !== 'undefined') {\n triggerWithLifecycle.open = false;\n }\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.trigger.focus();\n });\n }\n\n public closeOverlay(content: HTMLElement): void {\n this.overlayTimer.close(content);\n requestAnimationFrame(() => {\n const overlay = this.findOverlayForContent(content);\n this.hideAndCloseOverlay(overlay);\n });\n }\n\n private handleMouseCapture = (event: MouseEvent): void => {\n const topOverlay = this.topOverlay;\n if (\n !event.target ||\n !topOverlay ||\n !topOverlay.overlayContent ||\n hasModifier(event) ||\n !isLeftClick(event)\n ) {\n this.preventMouseRootClose = true;\n return;\n }\n\n if (event.target instanceof Node) {\n const path = event.composedPath();\n if (path.indexOf(topOverlay.overlayContent) >= 0) {\n this.preventMouseRootClose = true;\n return;\n }\n this.preventMouseRootClose = false;\n }\n };\n\n private closeAllHoverOverlays(): void {\n for (const overlay of this.overlays) {\n if (overlay.interaction === 'hover') {\n this.hideAndCloseOverlay(overlay, false);\n }\n }\n }\n\n private manageFocusAfterCloseWhenOverlaysRemain(): void {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.feature();\n // Push focus in the the next remaining overlay as needed when a `type=\"modal\"` overlay exists.\n if (topOverlay.interaction === 'modal' || topOverlay.hasModalRoot) {\n topOverlay.focus();\n } else {\n this.stopTabTrapping();\n }\n }\n\n private manageFocusAfterCloseWhenLastOverlay(overlay: ActiveOverlay): void {\n this.stopTabTrapping();\n const isModal = overlay.interaction === 'modal';\n const isReplace = overlay.interaction === 'replace';\n const isInline = overlay.interaction === 'inline';\n const isTabbingAwayFromInlineOrReplace =\n (isReplace || isInline) && !overlay.tabbingAway;\n overlay.tabbingAway = false;\n if (!isModal && !isTabbingAwayFromInlineOrReplace) {\n return;\n }\n // Manage post closure focus when needed.\n const overlayRoot = overlay.overlayContent.getRootNode() as ShadowRoot;\n const overlayContentActiveElement = overlayRoot.activeElement;\n let triggerRoot: ShadowRoot;\n let triggerActiveElement: Element | null;\n const contentContainsActiveElement = (): boolean =>\n overlay.overlayContent.contains(overlayContentActiveElement);\n const triggerRootContainsActiveElement = (): boolean => {\n triggerRoot = overlay.trigger.getRootNode() as ShadowRoot;\n triggerActiveElement = triggerRoot.activeElement;\n return triggerRoot.contains(triggerActiveElement);\n };\n const triggerHostIsActiveElement = (): boolean =>\n triggerRoot.host && triggerRoot.host === triggerActiveElement;\n // Return focus to the trigger as long as the user hasn't actively focused\n // something outside of the current overlay interface; trigger, root, host.\n if (\n isModal ||\n contentContainsActiveElement() ||\n triggerRootContainsActiveElement() ||\n triggerHostIsActiveElement()\n ) {\n overlay.trigger.focus();\n }\n }\n\n private async hideAndCloseOverlay(\n overlay?: ActiveOverlay,\n animated?: boolean\n ): Promise<void> {\n if (!overlay) {\n return;\n }\n await overlay.hide(animated);\n const contentWithLifecycle =\n overlay.overlayContent as unknown as ManagedOverlayContent;\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = false;\n }\n if (contentWithLifecycle.overlayCloseCallback) {\n const { trigger } = overlay;\n contentWithLifecycle.overlayCloseCallback({ trigger });\n }\n\n if (overlay.state != 'dispose') return;\n\n const index = this.overlays.indexOf(overlay);\n if (index >= 0) {\n this.overlays.splice(index, 1);\n }\n\n if (this.overlays.length) {\n this.manageFocusAfterCloseWhenOverlaysRemain();\n } else {\n this.manageFocusAfterCloseWhenLastOverlay(overlay);\n }\n\n overlay.remove();\n overlay.dispose();\n\n overlay.trigger.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>('sp-closed', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n interaction: overlay.interaction,\n },\n })\n );\n }\n\n private closeTopOverlay(): Promise<void> {\n return this.hideAndCloseOverlay(this.topOverlay);\n }\n\n /**\n * A \"longpress\" occurs before the \"click\" that creates it has occured.\n * In that way the first click will still be part of the \"longpress\" and\n * not part of closing the overlay.\n */\n private _doesNotCloseOnFirstClick = false;\n\n private handleMouse = (event: Event): void => {\n if (this._doesNotCloseOnFirstClick) {\n this._doesNotCloseOnFirstClick = false;\n return;\n }\n if (this.preventMouseRootClose || event.defaultPrevented) {\n return;\n }\n this.closeTopOverlay();\n };\n\n private handleKeyUp = (event: KeyboardEvent): void => {\n if (event.code === 'Escape') {\n this.closeTopOverlay();\n }\n };\n\n private handleResize = (): void => {\n if (this.handlingResize) return;\n\n this.handlingResize = true;\n requestAnimationFrame(async () => {\n const promises = this.overlays.map((overlay) =>\n overlay.updateOverlayPosition()\n );\n await Promise.all(promises);\n this.handlingResize = false;\n });\n };\n}\n"]}
|
|
@@ -11,7 +11,7 @@ governing permissions and limitations under the License.
|
|
|
11
11
|
*/
|
|
12
12
|
import { css } from '@spectrum-web-components/base';
|
|
13
13
|
const styles = css `
|
|
14
|
-
|
|
14
|
+
:host([disabled]) ::slotted([slot=trigger]){pointer-events:none}#overlay-content{display:none}
|
|
15
15
|
`;
|
|
16
16
|
export default styles;
|
|
17
17
|
//# sourceMappingURL=overlay-trigger.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay-trigger.css.js","sourceRoot":"","sources":["overlay-trigger.css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AACF,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,MAAM,MAAM,GAAG,GAAG,CAAA;;CAEjB,CAAC;AACF,eAAe,MAAM,CAAC","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 { css } from '@spectrum-web-components/base';\nconst styles = css`\n
|
|
1
|
+
{"version":3,"file":"overlay-trigger.css.js","sourceRoot":"","sources":["overlay-trigger.css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AACF,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,MAAM,MAAM,GAAG,GAAG,CAAA;;CAEjB,CAAC;AACF,eAAe,MAAM,CAAC","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 { css } from '@spectrum-web-components/base';\nconst styles = css`\n:host([disabled]) ::slotted([slot=trigger]){pointer-events:none}#overlay-content{display:none}\n`;\nexport default styles;"]}
|
package/src/overlay.js
CHANGED
package/src/overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAQF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,OAAO;IAQhB;;;;;OAKG;IACH,YACI,KAAkB,EAClB,WAAgC,EAChC,cAA2B;QAdvB,WAAM,GAAG,KAAK,CAAC;QAgBnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,KAAK,CAAC,IAAI,CACpB,KAAkB,EAClB,WAAgC,EAChC,cAA2B,EAC3B,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QAChE,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,GAAS,EAAE;YACd,OAAO,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,MAAM;QAChB,MAAM,kBAAkB,GAAG,IAAI,WAAW,CAAC,oBAAoB,EAAE;YAC7D,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,IAAI,CAAC,EACd,YAAY,EACZ,OAAO,EACP,MAAM,GAAG,CAAC,EACV,SAAS,GAAG,KAAK,EACjB,aAAa,EACb,sBAAsB,EACtB,cAAc,GACD;QACb,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAE7B,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SACzD;QAED,MAAM,gBAAgB,GAAc;YAChC,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["overlay.ts"],"names":[],"mappings":"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","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*/\n\nimport { ThemeData } from '@spectrum-web-components/theme';\nimport {\n OverlayDisplayQueryDetail,\n OverlayOptions,\n TriggerInteractions,\n} from './overlay-types';\nimport { OverlayStack } from './overlay-stack.js';\n\n/**\n * This class allows access to the overlay system which allows a client to\n * position an element in the overlay positioned relative to another node.\n */\nexport class Overlay {\n private static overlayStack = new OverlayStack();\n\n private isOpen = false;\n private overlayElement: HTMLElement;\n private owner: HTMLElement;\n private interaction: TriggerInteractions;\n\n /**\n *\n * @param owner the parent element we will use to position the overlay element\n * @param interaction the type of interaction that caused this overlay to be shown\n * @param overlayElement the item to display as an overlay\n */\n constructor(\n owner: HTMLElement,\n interaction: TriggerInteractions,\n overlayElement: HTMLElement\n ) {\n this.owner = owner;\n this.overlayElement = overlayElement;\n this.interaction = interaction;\n }\n\n /**\n * Open an overlay\n *\n * @param owner the parent element we will use to position the overlay element\n * @param interaction the type of interaction that caused this overlay to be shown\n * @param overlayElement the item to display as an overlay\n * @param options display parameters\n * @param options.delayed if true delay opening of the overlay based on the global warmup/cooldown timer\n * @param options.offset distance to offset the overlay\n * @param options.placement side on which to position the overlay\n * @returns an Overlay object which can be used to close the overlay\n */\n public static async open(\n owner: HTMLElement,\n interaction: TriggerInteractions,\n overlayElement: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n const overlay = new Overlay(owner, interaction, overlayElement);\n await overlay.open(options);\n return (): void => {\n overlay.close();\n };\n }\n\n public static update(): void {\n const overlayUpdateEvent = new CustomEvent('sp-update-overlays', {\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n document.dispatchEvent(overlayUpdateEvent);\n }\n\n /**\n * Open an overlay\n *\n * @param options display parameters\n * @param options.delayed delay before opening the overlay\n * @param options.offset distance to offset the overlay\n * @param options.placement side on which to position the overlay\n * @returns a Promise that resolves to true if this operation was cancelled\n */\n public async open({\n abortPromise,\n delayed,\n offset = 0,\n placement = 'top',\n receivesFocus,\n notImmediatelyClosable,\n virtualTrigger,\n }: OverlayOptions): Promise<boolean> {\n /* c8 ignore next */\n if (this.isOpen) return true;\n\n if (delayed === undefined) {\n delayed = this.overlayElement.hasAttribute('delayed');\n }\n\n const queryThemeDetail: ThemeData = {\n color: undefined,\n scale: undefined,\n lang: undefined,\n };\n const queryThemeEvent = new CustomEvent<ThemeData>('sp-query-theme', {\n bubbles: true,\n composed: true,\n detail: queryThemeDetail,\n cancelable: true,\n });\n this.owner.dispatchEvent(queryThemeEvent);\n\n const overlayDetailQuery: OverlayDisplayQueryDetail = {};\n const queryOverlayDetailEvent =\n new CustomEvent<OverlayDisplayQueryDetail>('sp-overlay-query', {\n bubbles: true,\n composed: true,\n detail: overlayDetailQuery,\n cancelable: true,\n });\n this.overlayElement.dispatchEvent(queryOverlayDetailEvent);\n\n await Overlay.overlayStack.openOverlay({\n abortPromise,\n content: this.overlayElement,\n contentTip: overlayDetailQuery.overlayContentTipElement,\n delayed,\n offset: offset,\n placement: placement,\n trigger: this.owner,\n interaction: this.interaction,\n theme: queryThemeDetail,\n receivesFocus,\n notImmediatelyClosable,\n virtualTrigger,\n ...overlayDetailQuery,\n });\n this.isOpen = true;\n return true;\n }\n\n /**\n * Close the overlay if it is open\n */\n public close(): void {\n Overlay.overlayStack.closeOverlay(this.overlayElement);\n }\n}\n\n/**\n * Announces that an overlay-based UI element has opened\n * @event sp-open\n * @type {object}\n * @property {TriggerInteractions} interaction type of interaction that triggered the opening\n */\n\n/**\n * Announces that an overlay-based UI element has opened\n * @event sp-close\n * @type {object}\n * @property {TriggerInteractions} interaction type of interaction that triggered the closing\n */\n"]}
|