@spectrum-web-components/overlay 0.13.5-express.10 → 0.14.0

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.
@@ -85,6 +85,14 @@
85
85
  },
86
86
  "privacy": "public"
87
87
  },
88
+ {
89
+ "kind": "field",
90
+ "name": "childrenReady",
91
+ "type": {
92
+ "text": "Promise<unknown[]>"
93
+ },
94
+ "privacy": "protected"
95
+ },
88
96
  {
89
97
  "kind": "field",
90
98
  "name": "_state",
@@ -124,7 +132,7 @@
124
132
  "kind": "field",
125
133
  "name": "theme",
126
134
  "type": {
127
- "text": "{\n color?: Color;\n scale?: Scale;\n lang?: string;\n theme?: Flavor;\n }"
135
+ "text": "{\n color?: Color;\n scale?: Scale;\n lang?: string;\n }"
128
136
  },
129
137
  "privacy": "public",
130
138
  "default": "{}"
@@ -259,6 +267,16 @@
259
267
  }
260
268
  ]
261
269
  },
270
+ {
271
+ "kind": "method",
272
+ "name": "openCallback",
273
+ "privacy": "public",
274
+ "return": {
275
+ "type": {
276
+ "text": "Promise<void>"
277
+ }
278
+ }
279
+ },
262
280
  {
263
281
  "kind": "method",
264
282
  "name": "open",
@@ -1146,7 +1164,7 @@
1146
1164
  {
1147
1165
  "kind": "variable",
1148
1166
  "name": "styles",
1149
- "default": "css`\n@keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}#contents,sp-theme{height:100%}#contents{animation-duration:var(--spectrum-global-animation-duration-200,.16s);animation-timing-function:var(\n--spectrum-global-animation-ease-out,ease-out\n);display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([actual-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75));align-items:flex-end;display:inline-flex}:host([actual-placement*=right]) #contents{--sp-overlay-from:translateX(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=left]) #contents{--sp-overlay-from:translateX(var(--spectrum-global-dimension-size-75))}:host([animating]) ::slotted(*){pointer-events:none}:host(:not([animating])) ::slotted(*){pointer-events:auto}#contents ::slotted(*){position:relative}\n`"
1167
+ "default": "css`\n@keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}:host([placement=none]){max-height:var(--swc-visual-viewport-height)}#contents,sp-theme{height:100%}#contents{animation-duration:var(\n--swc-test-duration,var(--spectrum-global-animation-duration-200,.16s)\n);animation-timing-function:var(\n--spectrum-global-animation-ease-out,ease-out\n);display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([actual-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75));align-items:flex-end;display:inline-flex}:host([actual-placement*=right]) #contents{--sp-overlay-from:translateX(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=left]) #contents{--sp-overlay-from:translateX(var(--spectrum-global-dimension-size-75))}:host([animating]) ::slotted(*){pointer-events:none}:host(:not([animating])) ::slotted(*){pointer-events:auto}#contents ::slotted(*){position:relative}\n`"
1150
1168
  }
1151
1169
  ],
1152
1170
  "exports": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/overlay",
3
- "version": "0.13.5-express.10+27420d682",
3
+ "version": "0.14.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -49,10 +49,10 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "@floating-ui/dom": "^0.2.0",
52
- "@spectrum-web-components/action-button": "^0.7.4-express.12+27420d682",
52
+ "@spectrum-web-components/action-button": "^0.7.3",
53
53
  "@spectrum-web-components/base": "^0.5.1",
54
54
  "@spectrum-web-components/shared": "^0.13.3",
55
- "@spectrum-web-components/theme": "^0.9.4-express.12+27420d682",
55
+ "@spectrum-web-components/theme": "^0.9.3",
56
56
  "tslib": "^2.0.0"
57
57
  },
58
58
  "types": "./src/index.d.ts",
@@ -63,5 +63,5 @@
63
63
  "./sync/overlay-trigger.js",
64
64
  "./stories/overlay-story-components.js"
65
65
  ],
66
- "gitHead": "27420d682bb3b3f679875e1f4148c10df0bd738c"
66
+ "gitHead": "f23b15ec952d7450272a8275524c905e028b4ddc"
67
67
  }
@@ -1,5 +1,5 @@
1
1
  import { CSSResultArray, PropertyValues, SpectrumElement, TemplateResult } from '@spectrum-web-components/base';
2
- import { Color, Flavor, Scale } from '@spectrum-web-components/theme';
2
+ import { Color, Scale } from '@spectrum-web-components/theme';
3
3
  import { OverlayOpenDetail, Placement, TriggerInteractions } from './overlay-types.js';
4
4
  import type { VirtualTrigger } from './VirtualTrigger.js';
5
5
  export interface PositionResult {
@@ -22,6 +22,7 @@ export declare class ActiveOverlay extends SpectrumElement {
22
22
  overlayContentTip?: HTMLElement;
23
23
  trigger: HTMLElement;
24
24
  virtualTrigger?: VirtualTrigger;
25
+ protected childrenReady: Promise<unknown[]>;
25
26
  _state: OverlayStateType;
26
27
  get state(): OverlayStateType;
27
28
  set state(state: OverlayStateType);
@@ -31,7 +32,6 @@ export declare class ActiveOverlay extends SpectrumElement {
31
32
  color?: Color;
32
33
  scale?: Scale;
33
34
  lang?: string;
34
- theme?: Flavor;
35
35
  };
36
36
  receivesFocus?: 'auto';
37
37
  tabbingAway: boolean;
@@ -50,6 +50,7 @@ export declare class ActiveOverlay extends SpectrumElement {
50
50
  feature(): void;
51
51
  obscure(nextOverlayInteraction: TriggerInteractions): ActiveOverlay | undefined;
52
52
  firstUpdated(changedProperties: PropertyValues): Promise<void>;
53
+ openCallback(): Promise<void>;
53
54
  private open;
54
55
  private extractDetail;
55
56
  dispose(): void;
@@ -237,12 +237,26 @@ export class ActiveOverlay extends SpectrumElement {
237
237
  this.stealOverlayContent(this.overlayContent);
238
238
  this.state = 'active';
239
239
  this.feature();
240
- if (this.placement && this.placement !== 'none') {
240
+ if (this.placement === 'none') {
241
+ this.style.setProperty('--swc-visual-viewport-height', `${window.innerHeight}px`);
242
+ }
243
+ else if (this.placement) {
241
244
  await this.updateOverlayPosition();
242
245
  document.addEventListener('sp-update-overlays', this.updateOverlayPosition);
243
246
  window.addEventListener('scroll', this.updateOverlayPosition);
244
247
  }
245
- await this.applyContentAnimation('sp-overlay-fade-in');
248
+ const actions = [];
249
+ if (this.placement && this.placement !== 'none') {
250
+ actions.push(this.applyContentAnimation('sp-overlay-fade-in'));
251
+ }
252
+ if (typeof this.overlayContent.updateComplete !==
253
+ 'undefined') {
254
+ actions.push(this.overlayContent.updateComplete);
255
+ }
256
+ this.childrenReady = Promise.all(actions);
257
+ }
258
+ async openCallback() {
259
+ await this.updateComplete;
246
260
  if (this.receivesFocus) {
247
261
  this.focus();
248
262
  }
@@ -344,10 +358,9 @@ export class ActiveOverlay extends SpectrumElement {
344
358
  });
345
359
  }
346
360
  renderTheme(content) {
347
- const { color, scale, lang, theme } = this.theme;
361
+ const { color, scale, lang } = this.theme;
348
362
  return html `
349
363
  <sp-theme
350
- theme=${ifDefined(theme)}
351
364
  color=${ifDefined(color)}
352
365
  scale=${ifDefined(scale)}
353
366
  lang=${ifDefined(lang)}
@@ -373,8 +386,14 @@ export class ActiveOverlay extends SpectrumElement {
373
386
  return overlay;
374
387
  }
375
388
  async getUpdateComplete() {
376
- const complete = (await super.getUpdateComplete());
377
- await this.stealOverlayContentPromise;
389
+ const actions = [
390
+ super.getUpdateComplete(),
391
+ this.stealOverlayContentPromise,
392
+ ];
393
+ if (this.childrenReady) {
394
+ actions.push(this.childrenReady);
395
+ }
396
+ const [complete] = await Promise.all(actions);
378
397
  return complete;
379
398
  }
380
399
  disconnectedCallback() {
@@ -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 type { VirtualTrigger } from './VirtualTrigger.js';\nimport {\n arrow,\n computePosition,\n flip,\n offset,\n shift,\n size,\n} from '@floating-ui/dom';\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 = 'idle' | 'active' | 'hiding' | 'dispose' | '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 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 @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 (this.state === 'active' || this.state === 'hiding') {\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 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 async firstUpdated(\n changedProperties: PropertyValues\n ): Promise<void> {\n super.firstUpdated(changedProperties);\n\n /* c8 ignore next */\n if (!this.overlayContent || !this.trigger) return;\n\n this.stealOverlayContent(\n this.overlayContent as HTMLElement & { placement: Placement }\n );\n\n this.state = 'active';\n this.feature();\n if (this.placement && this.placement !== 'none') {\n await this.updateOverlayPosition();\n document.addEventListener(\n 'sp-update-overlays',\n this.updateOverlayPosition\n );\n window.addEventListener('scroll', this.updateOverlayPosition);\n }\n await this.applyContentAnimation('sp-overlay-fade-in');\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 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 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(\n element: HTMLElement & { placement: Placement }\n ): void {\n this.originalPlacement = element.getAttribute('placement') as Placement;\n this.restoreContent = reparentChildren([element], this, (el) => {\n const slotName = el.slot;\n const placement = el.placement;\n el.removeAttribute('slot');\n return (el) => {\n el.slot = slotName;\n el.placement = placement;\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 private initialHeight!: number;\n private isConstrained = false;\n\n public updateOverlayPosition = async (): Promise<void> => {\n if (!this.placement || this.placement === 'none') {\n return;\n }\n await (document.fonts ? document.fonts.ready : Promise.resolve());\n\n function roundByDPR(num: number): number {\n const dpr = window.devicePixelRatio || 1;\n return Math.round(num * dpr) / dpr || 0;\n }\n\n // See: https://spectrum.adobe.com/page/popover/#Container-padding\n const REQUIRED_DISTANCE_TO_EDGE = 8;\n // See: https://github.com/adobe/spectrum-web-components/issues/910\n const MIN_OVERLAY_HEIGHT = 100;\n\n const middleware = [\n offset(this.offset),\n flip({\n fallbackStrategy: 'initialPlacement',\n }),\n shift({ padding: REQUIRED_DISTANCE_TO_EDGE }),\n size({\n padding: REQUIRED_DISTANCE_TO_EDGE,\n apply: ({ width, height, floating }) => {\n const maxHeight = Math.max(\n MIN_OVERLAY_HEIGHT,\n Math.floor(height)\n );\n const actualHeight = floating.height;\n this.initialHeight = !this.isConstrained\n ? actualHeight\n : this.initialHeight || actualHeight;\n this.isConstrained =\n actualHeight < this.initialHeight ||\n maxHeight <= actualHeight;\n const appliedHeight = this.isConstrained\n ? `${maxHeight}px`\n : '';\n Object.assign(this.style, {\n maxWidth: `${Math.floor(width)}px`,\n maxHeight: appliedHeight,\n height: appliedHeight,\n });\n },\n }),\n ];\n if (this.overlayContentTip) {\n middleware.push(arrow({ element: this.overlayContentTip }));\n }\n const { x, y, placement, middlewareData } = await computePosition(\n this.virtualTrigger || this.trigger,\n this,\n {\n placement: this.placement,\n middleware,\n }\n );\n\n Object.assign(this.style, {\n left: `${roundByDPR(x)}px`,\n top: `${roundByDPR(y)}px`,\n });\n\n if (placement !== this.getAttribute('actual-placement')) {\n this.setAttribute('actual-placement', placement);\n this.overlayContent.setAttribute('placement', placement);\n }\n\n if (this.overlayContentTip && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n Object.assign(this.overlayContentTip.style, {\n left: arrowX != null ? `${roundByDPR(arrowX)}px` : '',\n top: arrowY != null ? `${roundByDPR(arrowY)}px` : '',\n right: '',\n bottom: '',\n });\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 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 disconnectedCallback(): void {\n document.removeEventListener(\n 'sp-update-overlays',\n this.updateOverlayPosition\n );\n window.removeEventListener('scroll', this.updateOverlayPosition);\n super.disconnectedCallback();\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 type { VirtualTrigger } from './VirtualTrigger.js';\nimport {\n arrow,\n computePosition,\n flip,\n offset,\n shift,\n size,\n} from '@floating-ui/dom';\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 = 'idle' | 'active' | 'hiding' | 'dispose' | '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 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 protected childrenReady!: Promise<unknown[]>;\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 (this.state === 'active' || this.state === 'hiding') {\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 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 async firstUpdated(\n changedProperties: PropertyValues\n ): Promise<void> {\n super.firstUpdated(changedProperties);\n\n /* c8 ignore next */\n if (!this.overlayContent || !this.trigger) return;\n\n this.stealOverlayContent(\n this.overlayContent as HTMLElement & { placement: Placement }\n );\n\n this.state = 'active';\n this.feature();\n if (this.placement === 'none') {\n this.style.setProperty(\n '--swc-visual-viewport-height',\n `${window.innerHeight}px`\n );\n } else if (this.placement) {\n await this.updateOverlayPosition();\n document.addEventListener(\n 'sp-update-overlays',\n this.updateOverlayPosition\n );\n window.addEventListener('scroll', this.updateOverlayPosition);\n }\n const actions: Promise<unknown>[] = [];\n if (this.placement && this.placement !== 'none') {\n actions.push(this.applyContentAnimation('sp-overlay-fade-in'));\n }\n if (\n typeof (this.overlayContent as SpectrumElement).updateComplete !==\n 'undefined'\n ) {\n actions.push(\n (this.overlayContent as SpectrumElement).updateComplete\n );\n }\n this.childrenReady = Promise.all(actions);\n }\n\n public async openCallback(): Promise<void> {\n await this.updateComplete;\n if (this.receivesFocus) {\n this.focus();\n }\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 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 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(\n element: HTMLElement & { placement: Placement }\n ): void {\n this.originalPlacement = element.getAttribute('placement') as Placement;\n this.restoreContent = reparentChildren([element], this, (el) => {\n const slotName = el.slot;\n const placement = el.placement;\n el.removeAttribute('slot');\n return (el) => {\n el.slot = slotName;\n el.placement = placement;\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 private initialHeight!: number;\n private isConstrained = false;\n\n public updateOverlayPosition = async (): Promise<void> => {\n if (!this.placement || this.placement === 'none') {\n return;\n }\n await (document.fonts ? document.fonts.ready : Promise.resolve());\n\n function roundByDPR(num: number): number {\n const dpr = window.devicePixelRatio || 1;\n return Math.round(num * dpr) / dpr || 0;\n }\n\n // See: https://spectrum.adobe.com/page/popover/#Container-padding\n const REQUIRED_DISTANCE_TO_EDGE = 8;\n // See: https://github.com/adobe/spectrum-web-components/issues/910\n const MIN_OVERLAY_HEIGHT = 100;\n\n const middleware = [\n offset(this.offset),\n flip({\n fallbackStrategy: 'initialPlacement',\n }),\n shift({ padding: REQUIRED_DISTANCE_TO_EDGE }),\n size({\n padding: REQUIRED_DISTANCE_TO_EDGE,\n apply: ({ width, height, floating }) => {\n const maxHeight = Math.max(\n MIN_OVERLAY_HEIGHT,\n Math.floor(height)\n );\n const actualHeight = floating.height;\n this.initialHeight = !this.isConstrained\n ? actualHeight\n : this.initialHeight || actualHeight;\n this.isConstrained =\n actualHeight < this.initialHeight ||\n maxHeight <= actualHeight;\n const appliedHeight = this.isConstrained\n ? `${maxHeight}px`\n : '';\n Object.assign(this.style, {\n maxWidth: `${Math.floor(width)}px`,\n maxHeight: appliedHeight,\n height: appliedHeight,\n });\n },\n }),\n ];\n if (this.overlayContentTip) {\n middleware.push(arrow({ element: this.overlayContentTip }));\n }\n const { x, y, placement, middlewareData } = await computePosition(\n this.virtualTrigger || this.trigger,\n this,\n {\n placement: this.placement,\n middleware,\n }\n );\n\n Object.assign(this.style, {\n left: `${roundByDPR(x)}px`,\n top: `${roundByDPR(y)}px`,\n });\n\n if (placement !== this.getAttribute('actual-placement')) {\n this.setAttribute('actual-placement', placement);\n this.overlayContent.setAttribute('placement', placement);\n }\n\n if (this.overlayContentTip && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n Object.assign(this.overlayContentTip.style, {\n left: arrowX != null ? `${roundByDPR(arrowX)}px` : '',\n top: arrowY != null ? `${roundByDPR(arrowY)}px` : '',\n right: '',\n bottom: '',\n });\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 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 actions: Promise<unknown>[] = [\n super.getUpdateComplete(),\n this.stealOverlayContentPromise,\n ];\n if (this.childrenReady) {\n actions.push(this.childrenReady);\n }\n const [complete] = await Promise.all(actions);\n return complete as boolean;\n }\n\n disconnectedCallback(): void {\n document.removeEventListener(\n 'sp-update-overlays',\n this.updateOverlayPosition\n );\n window.removeEventListener('scroll', this.updateOverlayPosition);\n super.disconnectedCallback();\n }\n}\n"]}
@@ -11,7 +11,9 @@ governing permissions and limitations under the License.
11
11
  */
12
12
  import { css } from '@spectrum-web-components/base';
13
13
  const styles = css `
14
- @keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}#contents,sp-theme{height:100%}#contents{animation-duration:var(--spectrum-global-animation-duration-200,.16s);animation-timing-function:var(
14
+ @keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}:host([placement=none]){max-height:var(--swc-visual-viewport-height)}#contents,sp-theme{height:100%}#contents{animation-duration:var(
15
+ --swc-test-duration,var(--spectrum-global-animation-duration-200,.16s)
16
+ );animation-timing-function:var(
15
17
  --spectrum-global-animation-ease-out,ease-out
16
18
  );display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([actual-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75));align-items:flex-end;display:inline-flex}:host([actual-placement*=right]) #contents{--sp-overlay-from:translateX(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=left]) #contents{--sp-overlay-from:translateX(var(--spectrum-global-dimension-size-75))}:host([animating]) ::slotted(*){pointer-events:none}:host(:not([animating])) ::slotted(*){pointer-events:auto}#contents ::slotted(*){position:relative}
17
19
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"active-overlay.css.js","sourceRoot":"","sources":["active-overlay.css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AACF,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,MAAM,MAAM,GAAG,GAAG,CAAA;;;;CAIjB,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@keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}#contents,sp-theme{height:100%}#contents{animation-duration:var(--spectrum-global-animation-duration-200,.16s);animation-timing-function:var(\n--spectrum-global-animation-ease-out,ease-out\n);display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([actual-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75));align-items:flex-end;display:inline-flex}:host([actual-placement*=right]) #contents{--sp-overlay-from:translateX(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=left]) #contents{--sp-overlay-from:translateX(var(--spectrum-global-dimension-size-75))}:host([animating]) ::slotted(*){pointer-events:none}:host(:not([animating])) ::slotted(*){pointer-events:auto}#contents ::slotted(*){position:relative}\n`;\nexport default styles;"]}
1
+ {"version":3,"file":"active-overlay.css.js","sourceRoot":"","sources":["active-overlay.css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AACF,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;CAMjB,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@keyframes sp-overlay-fade-in{0%{opacity:0;transform:var(--sp-overlay-from)}to{opacity:1;transform:translate(0)}}@keyframes sp-overlay-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--sp-overlay-from)}}:host{display:inline-block;left:0;pointer-events:none;position:absolute;top:0;z-index:1000}:host(:focus){outline:none}:host([placement=none]){max-height:var(--swc-visual-viewport-height)}#contents,sp-theme{height:100%}#contents{animation-duration:var(\n--swc-test-duration,var(--spectrum-global-animation-duration-200,.16s)\n);animation-timing-function:var(\n--spectrum-global-animation-ease-out,ease-out\n);display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([actual-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75));align-items:flex-end;display:inline-flex}:host([actual-placement*=right]) #contents{--sp-overlay-from:translateX(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(var(--spectrum-global-dimension-size-75)*-1))}:host([actual-placement*=left]) #contents{--sp-overlay-from:translateX(var(--spectrum-global-dimension-size-75))}:host([animating]) ::slotted(*){pointer-events:none}:host(:not([animating])) ::slotted(*){pointer-events:auto}#contents ::slotted(*){position:relative}\n`;\nexport default styles;"]}
@@ -173,6 +173,8 @@ export class OverlayStack {
173
173
  }
174
174
  this.tabTrapper.style.setProperty('--swc-body-margins-inline', `calc(${marginLeft} + ${marginRight})`);
175
175
  this.tabTrapper.style.setProperty('--swc-body-margins-block', `calc(${marginTop} + ${marginBottom})`);
176
+ this.overlayHolder.style.setProperty('--swc-body-margins-inline', `calc(${marginLeft} + ${marginRight})`);
177
+ this.overlayHolder.style.setProperty('--swc-body-margins-block', `calc(${marginTop} + ${marginBottom})`);
176
178
  this._bodyMarginsApplied = !allZero;
177
179
  }
178
180
  startTabTrapping() {
@@ -281,9 +283,7 @@ export class OverlayStack {
281
283
  const { trigger } = activeOverlay;
282
284
  contentWithLifecycle.overlayOpenCallback({ trigger });
283
285
  }
284
- if (details.receivesFocus === 'auto') {
285
- activeOverlay.focus();
286
- }
286
+ activeOverlay.openCallback();
287
287
  return false;
288
288
  });
289
289
  }
@@ -401,8 +401,14 @@ export class OverlayStack {
401
401
  if (!overlay) {
402
402
  return;
403
403
  }
404
- await overlay.hide(animated);
405
404
  const contentWithLifecycle = overlay.overlayContent;
405
+ if (typeof contentWithLifecycle.overlayWillCloseCallback !== 'undefined') {
406
+ const { trigger } = overlay;
407
+ if (contentWithLifecycle.overlayWillCloseCallback({ trigger })) {
408
+ return;
409
+ }
410
+ }
411
+ await overlay.hide(animated);
406
412
  if (typeof contentWithLifecycle.open !== 'undefined') {
407
413
  contentWithLifecycle.open = false;
408
414
  }
@@ -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 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 :host {\n position: relative;\n }\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: none;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n [name=\"open\"]::slotted(*) {\n pointer-events: all;\n }\n #actual[aria-hidden] + #holder {\n display: flex;\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 (\n !this.trappingInited ||\n topOverlay.interaction !== 'modal' ||\n event.target !== this.overlayHolder\n ) {\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 // Allow the overlaid content to do something before it is thrown.\n overlayWillOpenCallback?: (args: { trigger: HTMLElement }) => void;\n // Allow the overlaid content to do something when it has been thrown.\n overlayOpenCallback?: (args: { trigger: HTMLElement }) => void;\n // Allow the overlaid content to do something when its throw has been cancelled.\n overlayOpenCancelledCallback?: (args: { trigger: HTMLElement }) => void;\n // Allow the overlaid content to do something before it is recalled, and return `true` if it will self managing the recall.\n overlayWillCloseCallback?: (args: { trigger: HTMLElement }) => boolean;\n // Allow the overlaid content to do something when it has been recalled.\n overlayCloseCallback?: (args: { trigger: HTMLElement }) => void;\n // Surface possible LitElement lifecycle methods on the synthetically types element.\n updateComplete?: Promise<boolean>;\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 :host {\n position: relative;\n }\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: none;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n [name=\"open\"]::slotted(*) {\n pointer-events: all;\n }\n #actual[aria-hidden] + #holder {\n display: flex;\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.overlayHolder.style.setProperty(\n '--swc-body-margins-inline',\n `calc(${marginLeft} + ${marginRight})`\n );\n this.overlayHolder.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 (\n !this.trappingInited ||\n topOverlay.interaction !== 'modal' ||\n event.target !== this.overlayHolder\n ) {\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 activeOverlay.openCallback();\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 const contentWithLifecycle =\n overlay.overlayContent as unknown as ManagedOverlayContent;\n if (\n typeof contentWithLifecycle.overlayWillCloseCallback !== 'undefined'\n ) {\n const { trigger } = overlay;\n if (contentWithLifecycle.overlayWillCloseCallback({ trigger })) {\n return;\n }\n }\n await overlay.hide(animated);\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"]}
package/src/overlay.js CHANGED
@@ -74,7 +74,6 @@ export class Overlay {
74
74
  color: undefined,
75
75
  scale: undefined,
76
76
  lang: undefined,
77
- theme: undefined,
78
77
  };
79
78
  const queryThemeEvent = new CustomEvent('sp-query-theme', {
80
79
  bubbles: true,
@@ -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;YACf,KAAK,EAAE,SAAS;SACnB,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,WAAW,CAAY,gBAAgB,EAAE;YACjE,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAE1C,MAAM,kBAAkB,GAA8B,EAAE,CAAC;QACzD,MAAM,uBAAuB,GACzB,IAAI,WAAW,CAA4B,kBAAkB,EAAE;YAC3D,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACP,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAE3D,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,iBAClC,YAAY,EACZ,OAAO,EAAE,IAAI,CAAC,cAAc,EAC5B,UAAU,EAAE,kBAAkB,CAAC,wBAAwB,EACvD,OAAO,EACP,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,IAAI,CAAC,KAAK,EACnB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,KAAK,EAAE,gBAAgB,EACvB,aAAa;YACb,sBAAsB;YACtB,cAAc,IACX,kBAAkB,EACvB,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK;QACR,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3D,CAAC;;AAlIc,oBAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAqIrD;;;;;GAKG;AAEH;;;;;GAKG","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 theme: 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"]}
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"]}
@@ -229,7 +229,7 @@ class RecursivePopover extends LitElement {
229
229
  <overlay-trigger placement="${this.placement}" type="modal">
230
230
  <sp-button
231
231
  slot="trigger"
232
- variant="accent"
232
+ variant="cta"
233
233
  @keydown=${this.captureEnter}
234
234
  >
235
235
  Open Popover
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-story-components.js","sourceRoot":"","sources":["overlay-story-components.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*/\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { Overlay, OverlayTrigger, Placement } from '../';\nimport { RadioGroup } from '@spectrum-web-components/radio';\nimport '@spectrum-web-components/button/sp-button.js';\nimport { Button } from '@spectrum-web-components/button';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/radio/sp-radio.js';\nimport '@spectrum-web-components/radio/sp-radio-group.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\n\n// Prevent infinite recursion in browser\nconst MAX_DEPTH = 7;\n\nclass OverlayTargetIcon extends LitElement {\n static get styles(): CSSResultGroup {\n return css`\n :host {\n position: absolute;\n display: block;\n color: var(--spectrum-global-color-magenta-700);\n width: 64px;\n height: 64px;\n top: 0;\n left: 0;\n }\n `;\n }\n\n public render(): TemplateResult {\n return html`\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n data-prefix=\"fas\"\n data-icon=\"bullseye\"\n class=\"svg-inline--fa fa-bullseye fa-w-16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 496 512\"\n >\n <path\n fill=\"currentColor\"\n d=\"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 432c-101.69 0-184-82.29-184-184 0-101.69 82.29-184 184-184 101.69 0 184 82.29 184 184 0 101.69-82.29 184-184 184zm0-312c-70.69 0-128 57.31-128 128s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm0 192c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z\"\n ></path>\n </svg>\n `;\n }\n}\ncustomElements.define('overlay-target-icon', OverlayTargetIcon);\n\nclass OverlayDrag extends LitElement {\n @property({ type: Number })\n private top = 100;\n @property({ type: Number })\n private left = 100;\n\n private targetElement: HTMLElement | undefined | null;\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n ::slotted(*) {\n display: block;\n width: 100%;\n height: 100%;\n }\n `;\n }\n\n private onSlotChange(event: Event & { target: HTMLSlotElement }): void {\n const slot = event.target as HTMLSlotElement;\n this.targetElement = undefined;\n\n const nodes = slot.assignedNodes();\n const slotElement = nodes.find(\n (node) => node instanceof HTMLElement\n ) as HTMLElement;\n if (!slotElement) return;\n\n this.targetElement = slotElement.querySelector(\n '[slot=\"trigger\"]'\n ) as HTMLElement;\n if (!this.targetElement) return;\n\n this.targetElement.addEventListener('mousedown', (event) =>\n this.onMouseDown(event)\n );\n\n this.resetTargetPosition();\n }\n\n private onMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const parent = target.parentElement;\n if (!parent) return;\n\n const max = {\n x: parent.offsetWidth - target.offsetWidth,\n y: parent.offsetHeight - target.offsetHeight,\n };\n const dragStart = {\n x: event.clientX,\n y: event.clientY,\n };\n const originalPos = {\n x: this.left,\n y: this.top,\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const dragDelta = {\n x: event.clientX - dragStart.x,\n y: event.clientY - dragStart.y,\n };\n const newPosition = {\n x: dragDelta.x + originalPos.x,\n y: dragDelta.y + originalPos.y,\n };\n this.left = Math.min(Math.max(newPosition.x, 0), max.x);\n this.top = Math.min(Math.max(newPosition.y, 0), max.y);\n Overlay.update();\n };\n\n const onMouseUp = (): void => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n public resetTargetPosition(): void {\n if (!this.targetElement) return;\n const target = this.targetElement as HTMLElement;\n const parent = target.parentElement;\n if (!parent) return;\n\n this.left = (parent.offsetWidth - target.offsetWidth) / 2;\n this.top = (parent.offsetHeight - target.offsetHeight) / 2;\n }\n\n public updated(): void {\n if (this.targetElement) {\n this.targetElement.style.transform = `translate(${this.left}px, ${this.top}px)`;\n }\n }\n\n public render(): TemplateResult {\n return html`\n <slot @slotchange=${this.onSlotChange}></slot>\n `;\n }\n}\ncustomElements.define('overlay-drag', OverlayDrag);\n\nclass RecursivePopover extends LitElement {\n @property({ type: String })\n private placement: Placement;\n\n @property({ type: Number })\n private depth = 0;\n\n @query('[slot=\"trigger\"]')\n private trigger!: Button;\n\n protected isShiftTabbing = false;\n\n public shadowRoot!: ShadowRoot;\n\n public static get styles(): CSSResultGroup {\n return [\n css`\n :host {\n display: block;\n text-align: center;\n }\n\n overlay-trigger {\n display: inline-flex;\n margin-top: 11px;\n }\n `,\n ];\n }\n\n public constructor() {\n super();\n this.placement = 'right';\n this.depth = 0;\n this.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code } = event;\n if (code === 'Enter') {\n this.trigger.click();\n }\n });\n this.addEventListener('focusin', this.handleFocusin);\n }\n\n private handleFocusin(): void {\n this.focus();\n }\n\n public focus(): void {\n if (this.shadowRoot.activeElement !== null) {\n return;\n }\n const firstFocusable = this.shadowRoot.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n ) as LitElement;\n if (firstFocusable) {\n if (firstFocusable.updateComplete) {\n firstFocusable.updateComplete.then(() =>\n firstFocusable.focus()\n );\n } else {\n firstFocusable.focus();\n }\n return;\n }\n super.focus();\n }\n\n public onRadioChange(event: Event): void {\n const target = event.target as RadioGroup;\n this.placement = target.selected as Placement;\n }\n\n private captureEnter(event: KeyboardEvent): void {\n const { code } = event;\n if (code === 'Enter') {\n event.stopPropagation();\n }\n }\n\n public render(): TemplateResult {\n return html`\n <sp-radio-group\n horizontal\n @change=${this.onRadioChange}\n selected=\"${this.placement}\"\n name=\"group-example\"\n >\n <sp-radio value=\"top\">Top</sp-radio>\n <sp-radio value=\"right\">Right</sp-radio>\n <sp-radio value=\"bottom\">Bottom</sp-radio>\n <sp-radio value=\"left\">Left</sp-radio>\n </sp-radio-group>\n <overlay-trigger placement=\"${this.placement}\" type=\"modal\">\n <sp-button\n slot=\"trigger\"\n variant=\"accent\"\n @keydown=${this.captureEnter}\n >\n Open Popover\n </sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n direction=\"${this.placement}\"\n tip\n open\n >\n ${this.depth < MAX_DEPTH\n ? html`\n <recursive-popover\n position=\"${this.placement}\"\n depth=\"${this.depth + 1}\"\n tabindex=\"0\"\n ></recursive-popover>\n `\n : html`\n <div>Maximum Depth</div>\n `}\n </sp-popover>\n </overlay-trigger>\n `;\n }\n}\ncustomElements.define('recursive-popover', RecursivePopover);\n\nexport class PopoverContent extends LitElement {\n @query('[slot=\"trigger\"]')\n public button!: Button;\n\n @query('overlay-trigger')\n public trigger!: OverlayTrigger;\n\n render(): TemplateResult {\n return html`\n <overlay-trigger>\n <sp-button slot=\"trigger\">Open me</sp-button>\n <sp-popover slot=\"click-content\" direction=\"bottom\" dialog>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n </sp-popover>\n </overlay-trigger>\n `;\n }\n}\n\ncustomElements.define('popover-content', PopoverContent);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'popover-content': PopoverContent;\n }\n}\n"]}
1
+ {"version":3,"file":"overlay-story-components.js","sourceRoot":"","sources":["overlay-story-components.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*/\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\n\nimport { Overlay, OverlayTrigger, Placement } from '../';\nimport { RadioGroup } from '@spectrum-web-components/radio';\nimport '@spectrum-web-components/button/sp-button.js';\nimport { Button } from '@spectrum-web-components/button';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/radio/sp-radio.js';\nimport '@spectrum-web-components/radio/sp-radio-group.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\n\n// Prevent infinite recursion in browser\nconst MAX_DEPTH = 7;\n\nclass OverlayTargetIcon extends LitElement {\n static get styles(): CSSResultGroup {\n return css`\n :host {\n position: absolute;\n display: block;\n color: var(--spectrum-global-color-magenta-700);\n width: 64px;\n height: 64px;\n top: 0;\n left: 0;\n }\n `;\n }\n\n public render(): TemplateResult {\n return html`\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n data-prefix=\"fas\"\n data-icon=\"bullseye\"\n class=\"svg-inline--fa fa-bullseye fa-w-16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 496 512\"\n >\n <path\n fill=\"currentColor\"\n d=\"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 432c-101.69 0-184-82.29-184-184 0-101.69 82.29-184 184-184 101.69 0 184 82.29 184 184 0 101.69-82.29 184-184 184zm0-312c-70.69 0-128 57.31-128 128s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm0 192c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z\"\n ></path>\n </svg>\n `;\n }\n}\ncustomElements.define('overlay-target-icon', OverlayTargetIcon);\n\nclass OverlayDrag extends LitElement {\n @property({ type: Number })\n private top = 100;\n @property({ type: Number })\n private left = 100;\n\n private targetElement: HTMLElement | undefined | null;\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n ::slotted(*) {\n display: block;\n width: 100%;\n height: 100%;\n }\n `;\n }\n\n private onSlotChange(event: Event & { target: HTMLSlotElement }): void {\n const slot = event.target as HTMLSlotElement;\n this.targetElement = undefined;\n\n const nodes = slot.assignedNodes();\n const slotElement = nodes.find(\n (node) => node instanceof HTMLElement\n ) as HTMLElement;\n if (!slotElement) return;\n\n this.targetElement = slotElement.querySelector(\n '[slot=\"trigger\"]'\n ) as HTMLElement;\n if (!this.targetElement) return;\n\n this.targetElement.addEventListener('mousedown', (event) =>\n this.onMouseDown(event)\n );\n\n this.resetTargetPosition();\n }\n\n private onMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const parent = target.parentElement;\n if (!parent) return;\n\n const max = {\n x: parent.offsetWidth - target.offsetWidth,\n y: parent.offsetHeight - target.offsetHeight,\n };\n const dragStart = {\n x: event.clientX,\n y: event.clientY,\n };\n const originalPos = {\n x: this.left,\n y: this.top,\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const dragDelta = {\n x: event.clientX - dragStart.x,\n y: event.clientY - dragStart.y,\n };\n const newPosition = {\n x: dragDelta.x + originalPos.x,\n y: dragDelta.y + originalPos.y,\n };\n this.left = Math.min(Math.max(newPosition.x, 0), max.x);\n this.top = Math.min(Math.max(newPosition.y, 0), max.y);\n Overlay.update();\n };\n\n const onMouseUp = (): void => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n public resetTargetPosition(): void {\n if (!this.targetElement) return;\n const target = this.targetElement as HTMLElement;\n const parent = target.parentElement;\n if (!parent) return;\n\n this.left = (parent.offsetWidth - target.offsetWidth) / 2;\n this.top = (parent.offsetHeight - target.offsetHeight) / 2;\n }\n\n public updated(): void {\n if (this.targetElement) {\n this.targetElement.style.transform = `translate(${this.left}px, ${this.top}px)`;\n }\n }\n\n public render(): TemplateResult {\n return html`\n <slot @slotchange=${this.onSlotChange}></slot>\n `;\n }\n}\ncustomElements.define('overlay-drag', OverlayDrag);\n\nclass RecursivePopover extends LitElement {\n @property({ type: String })\n private placement: Placement;\n\n @property({ type: Number })\n private depth = 0;\n\n @query('[slot=\"trigger\"]')\n private trigger!: Button;\n\n protected isShiftTabbing = false;\n\n public shadowRoot!: ShadowRoot;\n\n public static get styles(): CSSResultGroup {\n return [\n css`\n :host {\n display: block;\n text-align: center;\n }\n\n overlay-trigger {\n display: inline-flex;\n margin-top: 11px;\n }\n `,\n ];\n }\n\n public constructor() {\n super();\n this.placement = 'right';\n this.depth = 0;\n this.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code } = event;\n if (code === 'Enter') {\n this.trigger.click();\n }\n });\n this.addEventListener('focusin', this.handleFocusin);\n }\n\n private handleFocusin(): void {\n this.focus();\n }\n\n public focus(): void {\n if (this.shadowRoot.activeElement !== null) {\n return;\n }\n const firstFocusable = this.shadowRoot.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n ) as LitElement;\n if (firstFocusable) {\n if (firstFocusable.updateComplete) {\n firstFocusable.updateComplete.then(() =>\n firstFocusable.focus()\n );\n } else {\n firstFocusable.focus();\n }\n return;\n }\n super.focus();\n }\n\n public onRadioChange(event: Event): void {\n const target = event.target as RadioGroup;\n this.placement = target.selected as Placement;\n }\n\n private captureEnter(event: KeyboardEvent): void {\n const { code } = event;\n if (code === 'Enter') {\n event.stopPropagation();\n }\n }\n\n public render(): TemplateResult {\n return html`\n <sp-radio-group\n horizontal\n @change=${this.onRadioChange}\n selected=\"${this.placement}\"\n name=\"group-example\"\n >\n <sp-radio value=\"top\">Top</sp-radio>\n <sp-radio value=\"right\">Right</sp-radio>\n <sp-radio value=\"bottom\">Bottom</sp-radio>\n <sp-radio value=\"left\">Left</sp-radio>\n </sp-radio-group>\n <overlay-trigger placement=\"${this.placement}\" type=\"modal\">\n <sp-button\n slot=\"trigger\"\n variant=\"cta\"\n @keydown=${this.captureEnter}\n >\n Open Popover\n </sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n direction=\"${this.placement}\"\n tip\n open\n >\n ${this.depth < MAX_DEPTH\n ? html`\n <recursive-popover\n position=\"${this.placement}\"\n depth=\"${this.depth + 1}\"\n tabindex=\"0\"\n ></recursive-popover>\n `\n : html`\n <div>Maximum Depth</div>\n `}\n </sp-popover>\n </overlay-trigger>\n `;\n }\n}\ncustomElements.define('recursive-popover', RecursivePopover);\n\nexport class PopoverContent extends LitElement {\n @query('[slot=\"trigger\"]')\n public button!: Button;\n\n @query('overlay-trigger')\n public trigger!: OverlayTrigger;\n\n render(): TemplateResult {\n return html`\n <overlay-trigger>\n <sp-button slot=\"trigger\">Open me</sp-button>\n <sp-popover slot=\"click-content\" direction=\"bottom\" dialog>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n <p>This is all the content.</p>\n </sp-popover>\n </overlay-trigger>\n `;\n }\n}\n\ncustomElements.define('popover-content', PopoverContent);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'popover-content': PopoverContent;\n }\n}\n"]}
@@ -516,7 +516,9 @@ class ComplexModalReady extends HTMLElement {
516
516
  picker.open = true;
517
517
  };
518
518
  this.handlePickerOpen = async () => {
519
- await nextFrame();
519
+ const picker = document.querySelector('#test-picker');
520
+ const actions = [nextFrame, picker.updateComplete];
521
+ await Promise.all(actions);
520
522
  this.ready(true);
521
523
  };
522
524
  this.readyPromise = Promise.resolve(false);
@@ -601,7 +603,7 @@ complexModal.decorators = [complexModalDecorator];
601
603
  export const superComplexModal = () => {
602
604
  return html `
603
605
  <overlay-trigger type="modal" placement="none">
604
- <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
606
+ <sp-button slot="trigger" variant="cta">Toggle Dialog</sp-button>
605
607
  <sp-popover dialog slot="click-content">
606
608
  <overlay-trigger>
607
609
  <sp-button slot="trigger" variant="primary">
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.stories.js","sourceRoot":"","sources":["overlay.stories.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\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 { html, TemplateResult } from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport {\n openOverlay,\n Overlay,\n OverlayContentTypes,\n OverlayTrigger,\n Placement,\n VirtualTrigger,\n} from '../';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/dialog/sp-dialog-wrapper.js';\nimport { DialogWrapper } from '@spectrum-web-components/dialog';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-open-in.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { Picker } from '@spectrum-web-components/picker';\nimport '@spectrum-web-components/picker/sp-picker.js';\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport '@spectrum-web-components/menu/sp-menu-item.js';\nimport '@spectrum-web-components/menu/sp-menu-divider.js';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/slider/sp-slider.js';\nimport '@spectrum-web-components/radio/sp-radio.js';\nimport '@spectrum-web-components/radio/sp-radio-group.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport '@spectrum-web-components/theme/sp-theme.js';\nimport '@spectrum-web-components/theme/src/themes.js';\nimport '../../../projects/story-decorator/src/types.js';\n\nimport './overlay-story-components.js';\nimport { render } from 'lit-html';\nimport { Popover } from '@spectrum-web-components/popover';\n\nconst storyStyles = html`\n <style>\n html,\n body,\n #root,\n #root-inner,\n sp-story-decorator {\n height: 100%;\n margin: 0;\n }\n\n sp-story-decorator::part(container) {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n overlay-trigger {\n flex: none;\n }\n\n #styled-div {\n background-color: var(--styled-div-background-color, blue);\n color: white;\n padding: 4px 10px;\n margin-bottom: 10px;\n }\n\n #inner-trigger {\n display: inline-block;\n }\n </style>\n`;\n\nexport default {\n title: 'Overlay',\n argTypes: {\n offset: { control: 'number' },\n placement: {\n control: {\n type: 'inline-radio',\n options: [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'auto',\n 'auto-start',\n 'auto-end',\n 'none',\n ],\n },\n },\n colorStop: {\n control: {\n type: 'inline-radio',\n options: ['light', 'dark'],\n },\n },\n },\n args: {\n placement: 'bottom',\n offset: 0,\n colorStop: 'light',\n },\n};\n\ninterface Properties {\n placement: Placement;\n offset: number;\n open?: OverlayContentTypes;\n}\n\nconst template = ({ placement, offset, open }: Properties): TemplateResult => {\n return html`\n ${storyStyles}\n <overlay-trigger\n id=\"trigger\"\n placement=\"${placement}\"\n offset=\"${offset}\"\n open=${ifDefined(open)}\n >\n <sp-button variant=\"primary\" slot=\"trigger\">Show Popover</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"${placement}\"\n tip\n >\n <div class=\"options-popover-content\">\n <sp-slider\n value=\"5\"\n step=\"0.5\"\n min=\"0\"\n max=\"20\"\n label=\"Awesomeness\"\n ></sp-slider>\n <div id=\"styled-div\">\n The background of this div should be blue\n </div>\n <overlay-trigger id=\"inner-trigger\" placement=\"bottom\">\n <sp-button slot=\"trigger\">Press Me</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n Another Popover\n </div>\n </sp-popover>\n\n <sp-tooltip slot=\"hover-content\" delayed tip=\"bottom\">\n Click to open another popover.\n </sp-tooltip>\n </overlay-trigger>\n </div>\n </sp-popover>\n <sp-tooltip\n slot=\"hover-content\"\n ?delayed=${open !== 'hover'}\n tip=\"bottom\"\n >\n Click to open a popover.\n </sp-tooltip>\n </overlay-trigger>\n `;\n};\n\nexport const Default = (args: Properties): TemplateResult => template(args);\n\nexport const openHoverContent = (args: Properties): TemplateResult =>\n template({\n ...args,\n open: 'hover',\n });\n\nexport const openClickContent = (args: Properties): TemplateResult =>\n template({\n ...args,\n open: 'click',\n });\n\nexport const customizedClickContent = (\n args: Properties\n): TemplateResult => html`\n <style>\n active-overlay::part(theme) {\n --styled-div-background-color: var(--spectrum-semantic-cta-background-color-default);\n --spectrum-button-m-cta-texticon-background-color: rebeccapurple;\n }\n </style>\n </style>\n ${template({\n ...args,\n open: 'click',\n })}\n`;\n\nconst extraText = html`\n <p>This is some text.</p>\n <p>This is some text.</p>\n <p>\n This is a\n <a href=\"#anchor\">link</a>\n .\n </p>\n`;\n\nexport const inline = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"inline\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-overlay slot=\"click-content\">\n <sp-button\n @click=${(event: Event & { target: HTMLElement }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n Close\n </sp-button>\n </sp-overlay>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const replace = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"replace\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-overlay slot=\"click-content\">\n <sp-button\n @click=${(event: Event & { target: HTMLElement }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n Close\n </sp-button>\n </sp-overlay>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const modalLoose = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-dialog\n size=\"s\"\n dismissable\n slot=\"click-content\"\n @closed=${(event: Event & { target: DialogWrapper }) =>\n event.target.dispatchEvent(closeEvent)}\n >\n <h2 slot=\"heading\">Loose Dialog</h2>\n <p>\n The\n <code>sp-dialog</code>\n element is not \"meant\" to be a modal alone. In that way it\n does not manage its own\n <code>open</code>\n attribute or outline when it should have\n <code>pointer-events: auto</code>\n . It's a part of this test suite to prove that content in\n this way can be used in an\n <code>overlay-trigger</code>\n element.\n </p>\n </sp-dialog>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const modalManaged = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-dialog-wrapper\n underlay\n slot=\"click-content\"\n headline=\"Wrapped Dialog w/ Hero Image\"\n confirm-label=\"Keep Both\"\n secondary-label=\"Replace\"\n cancel-label=\"Cancel\"\n footer=\"Content for footer\"\n @confirm=${(event: Event & { target: DialogWrapper }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n @secondary=${(\n event: Event & { target: DialogWrapper }\n ): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n @cancel=${(event: Event & { target: DialogWrapper }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n <p>\n The\n <code>sp-dialog-wrapper</code>\n element has been prepared for use in an\n <code>overlay-trigger</code>\n element by it's combination of modal, underlay, etc. styles\n and features.\n </p>\n </sp-dialog-wrapper>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const deepNesting = (): TemplateResult => {\n const color = window.__swc_hack_knobs__.defaultColor;\n const outter = color === 'light' ? 'dark' : 'light';\n return html`\n ${storyStyles}\n <sp-theme\n color=${outter}\n scale=${window.__swc_hack_knobs__.defaultScale}\n dir=${window.__swc_hack_knobs__.defaultDirection}\n >\n <sp-theme\n color=${color}\n scale=${window.__swc_hack_knobs__.defaultScale}\n dir=${window.__swc_hack_knobs__.defaultDirection}\n >\n <recursive-popover\n tabindex=\"\"\n style=\"\n background-color: var(--spectrum-global-color-gray-100);\n color: var(--spectrum-global-color-gray-800);\n padding: var(--spectrum-global-dimension-size-225);\n \"\n ></recursive-popover>\n </sp-theme>\n </sp-theme>\n `;\n};\n\nexport const edges = (): TemplateResult => {\n return html`\n <style>\n .demo {\n position: absolute;\n }\n .top-left {\n top: 0;\n left: 0;\n }\n .top-right {\n top: 0;\n right: 0;\n }\n .bottom-right {\n bottom: 0;\n right: 0;\n }\n .bottom-left {\n bottom: 0;\n left: 0;\n }\n </style>\n <overlay-trigger class=\"demo top-left\" placement=\"bottom\">\n <sp-button slot=\"trigger\">\n Top/\n <br />\n Left\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"bottom\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger class=\"demo top-right\" placement=\"bottom\">\n <sp-button slot=\"trigger\">\n Top/\n <br />\n Right\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"bottom\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger class=\"demo bottom-left\" placement=\"top\">\n <sp-button slot=\"trigger\">\n Bottom/\n <br />\n Left\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"top\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger placement=\"top\" class=\"demo bottom-right\">\n <sp-button slot=\"trigger\">\n Bottom/\n <br />\n Right\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"top\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n `;\n};\n\nexport const updated = (): TemplateResult => {\n return html`\n ${storyStyles}\n <style>\n sp-tooltip {\n transition: none;\n }\n </style>\n <overlay-drag>\n <overlay-trigger class=\"demo top-left\" placement=\"bottom\">\n <overlay-target-icon\n slot=\"trigger\"\n style=\"translate(400px, 300px)\"\n ></overlay-target-icon>\n <sp-tooltip slot=\"hover-content\" delayed tip=\"bottom\">\n Click to open popover\n </sp-tooltip>\n <sp-popover\n dialog\n slot=\"click-content\"\n position=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n <sp-slider\n value=\"5\"\n step=\"0.5\"\n min=\"0\"\n max=\"20\"\n label=\"Awesomeness\"\n ></sp-slider>\n <div id=\"styled-div\">\n The background of this div should be blue\n </div>\n <overlay-trigger id=\"inner-trigger\" placement=\"bottom\">\n <sp-button slot=\"trigger\">Press Me</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n Another Popover\n </div>\n </sp-popover>\n\n <sp-tooltip\n slot=\"hover-content\"\n delayed\n tip=\"bottom\"\n >\n Click to open another popover.\n </sp-tooltip>\n </overlay-trigger>\n </div>\n </sp-popover>\n </overlay-trigger>\n </overlay-drag>\n `;\n};\n\nexport const sideHoverDraggable = (): TemplateResult => {\n return html`\n ${storyStyles}\n <style>\n sp-tooltip {\n transition: none;\n }\n </style>\n <overlay-drag>\n <overlay-trigger placement=\"right\">\n <overlay-target-icon slot=\"trigger\"></overlay-target-icon>\n <sp-tooltip slot=\"hover-content\" delayed tip=\"right\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n Vivamus egestas sed enim sed condimentum. Nunc facilisis\n scelerisque massa sed luctus. Orci varius natoque penatibus\n et magnis dis parturient montes, nascetur ridiculus mus.\n Suspendisse sagittis sodales purus vitae ultricies. Integer\n at dui sem. Sed quam tortor, ornare in nisi et, rhoncus\n lacinia mauris. Sed vel rutrum mauris, ac pellentesque nibh.\n Sed feugiat semper libero, sit amet vehicula orci fermentum\n id. Vivamus imperdiet egestas luctus. Mauris tincidunt\n malesuada ante, faucibus viverra nunc blandit a. Fusce et\n nisl nisi. Aenean dictum quam id mollis faucibus. Nulla a\n ultricies dui. In hac habitasse platea dictumst. Curabitur\n gravida lobortis vestibulum.\n </sp-tooltip>\n </overlay-trigger>\n </overlay-drag>\n `;\n};\n\nexport const longpress = (): TemplateResult => {\n return html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-tooltip slot=\"hover-content\">Search real hard...</sp-tooltip>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n @change=${(event: Event & { target: HTMLElement }) =>\n event.target.dispatchEvent(\n new Event('close', { bubbles: true })\n )}\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nclass ComplexModalReady extends HTMLElement {\n ready!: (value: boolean | PromiseLike<boolean>) => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise((res) => {\n this.ready = res;\n this.setup();\n });\n }\n\n async setup(): Promise<void> {\n await nextFrame();\n\n const overlay = document.querySelector(\n `overlay-trigger`\n ) as OverlayTrigger;\n overlay.addEventListener('sp-opened', this.handleTriggerOpened);\n }\n\n handleTriggerOpened = async (): Promise<void> => {\n await nextFrame();\n\n const picker = document.querySelector('#test-picker') as Picker;\n picker.addEventListener('sp-opened', this.handlePickerOpen);\n picker.open = true;\n };\n\n handlePickerOpen = async (): Promise<void> => {\n await nextFrame();\n\n this.ready(true);\n };\n\n private readyPromise: Promise<boolean> = Promise.resolve(false);\n\n get updateComplete(): Promise<boolean> {\n return this.readyPromise;\n }\n}\n\ncustomElements.define('complex-modal-ready', ComplexModalReady);\n\nconst complexModalDecorator = (story: () => TemplateResult): TemplateResult => {\n return html`\n ${story()}\n <complex-modal-ready></complex-modal-ready>\n `;\n};\n\nexport const complexModal = (): TemplateResult => {\n return html`\n <style>\n body {\n --swc-margin-test: 10px;\n margin: var(--swc-margin-test);\n }\n sp-story-decorator::part(container) {\n min-height: calc(100vh - (2 * var(--swc-margin-test)));\n padding: 0;\n display: grid;\n place-content: center;\n }\n active-overlay > * {\n --spectrum-global-animation-duration-100: 0ms;\n --spectrum-global-animation-duration-200: 0ms;\n --spectrum-global-animation-duration-300: 0ms;\n --spectrum-global-animation-duration-400: 0ms;\n --spectrum-global-animation-duration-500: 0ms;\n --spectrum-global-animation-duration-600: 0ms;\n --spectrum-global-animation-duration-700: 0ms;\n --spectrum-global-animation-duration-800: 0ms;\n --spectrum-global-animation-duration-900: 0ms;\n --spectrum-global-animation-duration-1000: 0ms;\n --spectrum-global-animation-duration-2000: 0ms;\n --spectrum-global-animation-duration-4000: 0ms;\n --spectrum-coachmark-animation-indicator-ring-duration: 0ms;\n }\n </style>\n <overlay-trigger type=\"modal\" placement=\"none\" open=\"click\">\n <sp-dialog-wrapper\n slot=\"click-content\"\n headline=\"Dialog title\"\n dismissable\n underlay\n footer=\"Content for footer\"\n >\n <sp-field-label for=\"test-picker\">\n Selection type:\n </sp-field-label>\n <sp-picker id=\"test-picker\">\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save selection</sp-menu-item>\n <sp-menu-item disabled>Make work path</sp-menu-item>\n </sp-picker>\n </sp-dialog-wrapper>\n <sp-button slot=\"trigger\" variant=\"primary\">\n Toggle Dialog\n </sp-button>\n </overlay-trigger>\n `;\n};\n\ncomplexModal.decorators = [complexModalDecorator];\n\nexport const superComplexModal = (): TemplateResult => {\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\" variant=\"accent\">Toggle Dialog</sp-button>\n <sp-popover dialog slot=\"click-content\">\n <overlay-trigger>\n <sp-button slot=\"trigger\" variant=\"primary\">\n Toggle Dialog\n </sp-button>\n <sp-popover dialog slot=\"click-content\">\n <overlay-trigger type=\"modal\">\n <sp-button slot=\"trigger\" variant=\"secondary\">\n Toggle Dialog\n </sp-button>\n <sp-popover dialog slot=\"click-content\">\n <p>\n When you get this deep, this ActiveOverlay\n should be the only one in [slot=\"open\"].\n </p>\n <p>\n All of the rest of the ActiveOverlay\n elements should have had their [slot]\n attribute removed.\n </p>\n <p>\n Closing this ActiveOverlay should replace\n them...\n </p>\n </sp-popover>\n </overlay-trigger>\n </sp-popover>\n </overlay-trigger>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\nclass StartEndContextmenu extends HTMLElement {\n shadowRoot!: ShadowRoot;\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n display: flex;\n align-items: stretch;\n }\n div {\n width: 50%;\n height: 100%;\n }\n </style>\n <div id=\"start\"></div>\n <div id=\"end\"></div>\n `;\n }\n}\n\ncustomElements.define('start-end-contextmenu', StartEndContextmenu);\n\nexport const virtualElement = (args: Properties): TemplateResult => {\n const contextMenuTemplate = (kind = ''): TemplateResult => html`\n <sp-popover\n style=\"max-width: 33vw;\"\n @click=${(event: Event) =>\n event.target?.dispatchEvent(\n new Event('close', { bubbles: true })\n )}\n >\n <sp-menu>\n <sp-menu-group>\n <span slot=\"header\">Menu source: ${kind}</span>\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save selection</sp-menu-item>\n <sp-menu-item disabled>Make work path</sp-menu-item>\n </sp-menu-group>\n </sp-menu>\n </sp-popover>\n `;\n const pointerenter = async (event: PointerEvent): Promise<void> => {\n event.preventDefault();\n const source = event.composedPath()[0] as HTMLDivElement;\n const { id } = source;\n const trigger = event.target as HTMLElement;\n const virtualTrigger = new VirtualTrigger(event.clientX, event.clientY);\n const fragment = document.createDocumentFragment();\n render(contextMenuTemplate(id), fragment);\n const popover = fragment.querySelector('sp-popover') as Popover;\n openOverlay(trigger, 'modal', popover, {\n placement: args.placement,\n receivesFocus: 'auto',\n virtualTrigger,\n });\n };\n return html`\n <style>\n .app-root {\n position: absolute;\n inset: 0;\n }\n </style>\n <start-end-contextmenu\n class=\"app-root\"\n @contextmenu=${pointerenter}\n ></start-end-contextmenu>\n `;\n};\n\nvirtualElement.args = {\n placement: 'right-start' as Placement,\n};\n\nexport const detachedElement = (): TemplateResult => {\n let closeOverlay: (() => void) | undefined;\n const openDetachedOverlayContent = async ({\n target,\n }: {\n target: HTMLElement;\n }): Promise<void> => {\n if (closeOverlay) {\n closeOverlay();\n closeOverlay = undefined;\n return;\n }\n const div = document.createElement('div');\n div.textContent = 'This div is overlaid';\n div.setAttribute(\n 'style',\n `\n background-color: var(--spectrum-global-color-gray-50);\n color: var(--spectrum-global-color-gray-800);\n border: 1px solid;\n padding: 2em;\n `\n );\n closeOverlay = await Overlay.open(target, 'click', div, {\n offset: 0,\n placement: 'bottom',\n });\n };\n requestAnimationFrame(() => {\n openDetachedOverlayContent({\n target: document.querySelector(\n '#detached-content-trigger'\n ) as HTMLElement,\n });\n });\n return html`\n <sp-action-button\n id=\"detached-content-trigger\"\n @click=${openDetachedOverlayContent}\n @sp-closed=${() => (closeOverlay = undefined)}\n >\n <sp-icon-open-in\n slot=\"icon\"\n label=\"Open in overlay\"\n ></sp-icon-open-in>\n </sp-action-button>\n `;\n};\n\nclass DefinedOverlayReady extends HTMLElement {\n ready!: (value: boolean | PromiseLike<boolean>) => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise((res) => {\n this.ready = res;\n this.setup();\n });\n }\n\n async setup(): Promise<void> {\n await nextFrame();\n\n const overlay = document.querySelector(\n `overlay-trigger`\n ) as OverlayTrigger;\n const button = document.querySelector(\n `[slot=\"trigger\"]`\n ) as HTMLButtonElement;\n overlay.addEventListener('sp-opened', this.handleTriggerOpened);\n button.click();\n }\n\n handleTriggerOpened = async (): Promise<void> => {\n await nextFrame();\n\n const popover = document.querySelector('popover-content');\n if (!popover) {\n return;\n }\n popover.addEventListener('sp-opened', this.handlePopoverOpen);\n popover.button.click();\n };\n\n handlePopoverOpen = async (): Promise<void> => {\n await nextFrame();\n\n this.ready(true);\n };\n\n private readyPromise: Promise<boolean> = Promise.resolve(false);\n\n get updateComplete(): Promise<boolean> {\n return this.readyPromise;\n }\n}\n\ncustomElements.define('defined-overlay-ready', DefinedOverlayReady);\n\nconst definedOverlayDecorator = (\n story: () => TemplateResult\n): TemplateResult => {\n return html`\n ${story()}\n <defined-overlay-ready></defined-overlay-ready>\n `;\n};\n\nexport const definedOverlayElement = (): TemplateResult => {\n return html`\n <overlay-trigger placement=\"bottom\" type=\"modal\">\n <sp-button variant=\"primary\" slot=\"trigger\">Open popover</sp-button>\n <sp-popover slot=\"click-content\" direction=\"bottom\" dialog>\n <popover-content></popover-content>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\ndefinedOverlayElement.decorators = [definedOverlayDecorator];\n"]}
1
+ {"version":3,"file":"overlay.stories.js","sourceRoot":"","sources":["overlay.stories.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\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 { html, TemplateResult } from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport {\n openOverlay,\n Overlay,\n OverlayContentTypes,\n OverlayTrigger,\n Placement,\n VirtualTrigger,\n} from '../';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/dialog/sp-dialog-wrapper.js';\nimport { DialogWrapper } from '@spectrum-web-components/dialog';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-open-in.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { Picker } from '@spectrum-web-components/picker';\nimport '@spectrum-web-components/picker/sp-picker.js';\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport '@spectrum-web-components/menu/sp-menu-item.js';\nimport '@spectrum-web-components/menu/sp-menu-divider.js';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/slider/sp-slider.js';\nimport '@spectrum-web-components/radio/sp-radio.js';\nimport '@spectrum-web-components/radio/sp-radio-group.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport '@spectrum-web-components/theme/sp-theme.js';\nimport '@spectrum-web-components/theme/src/themes.js';\nimport '../../../projects/story-decorator/src/types.js';\n\nimport './overlay-story-components.js';\nimport { render } from 'lit-html';\nimport { Popover } from '@spectrum-web-components/popover';\n\nconst storyStyles = html`\n <style>\n html,\n body,\n #root,\n #root-inner,\n sp-story-decorator {\n height: 100%;\n margin: 0;\n }\n\n sp-story-decorator::part(container) {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n overlay-trigger {\n flex: none;\n }\n\n #styled-div {\n background-color: var(--styled-div-background-color, blue);\n color: white;\n padding: 4px 10px;\n margin-bottom: 10px;\n }\n\n #inner-trigger {\n display: inline-block;\n }\n </style>\n`;\n\nexport default {\n title: 'Overlay',\n argTypes: {\n offset: { control: 'number' },\n placement: {\n control: {\n type: 'inline-radio',\n options: [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'auto',\n 'auto-start',\n 'auto-end',\n 'none',\n ],\n },\n },\n colorStop: {\n control: {\n type: 'inline-radio',\n options: ['light', 'dark'],\n },\n },\n },\n args: {\n placement: 'bottom',\n offset: 0,\n colorStop: 'light',\n },\n};\n\ninterface Properties {\n placement: Placement;\n offset: number;\n open?: OverlayContentTypes;\n}\n\nconst template = ({ placement, offset, open }: Properties): TemplateResult => {\n return html`\n ${storyStyles}\n <overlay-trigger\n id=\"trigger\"\n placement=\"${placement}\"\n offset=\"${offset}\"\n open=${ifDefined(open)}\n >\n <sp-button variant=\"primary\" slot=\"trigger\">Show Popover</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"${placement}\"\n tip\n >\n <div class=\"options-popover-content\">\n <sp-slider\n value=\"5\"\n step=\"0.5\"\n min=\"0\"\n max=\"20\"\n label=\"Awesomeness\"\n ></sp-slider>\n <div id=\"styled-div\">\n The background of this div should be blue\n </div>\n <overlay-trigger id=\"inner-trigger\" placement=\"bottom\">\n <sp-button slot=\"trigger\">Press Me</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n Another Popover\n </div>\n </sp-popover>\n\n <sp-tooltip slot=\"hover-content\" delayed tip=\"bottom\">\n Click to open another popover.\n </sp-tooltip>\n </overlay-trigger>\n </div>\n </sp-popover>\n <sp-tooltip\n slot=\"hover-content\"\n ?delayed=${open !== 'hover'}\n tip=\"bottom\"\n >\n Click to open a popover.\n </sp-tooltip>\n </overlay-trigger>\n `;\n};\n\nexport const Default = (args: Properties): TemplateResult => template(args);\n\nexport const openHoverContent = (args: Properties): TemplateResult =>\n template({\n ...args,\n open: 'hover',\n });\n\nexport const openClickContent = (args: Properties): TemplateResult =>\n template({\n ...args,\n open: 'click',\n });\n\nexport const customizedClickContent = (\n args: Properties\n): TemplateResult => html`\n <style>\n active-overlay::part(theme) {\n --styled-div-background-color: var(--spectrum-semantic-cta-background-color-default);\n --spectrum-button-m-cta-texticon-background-color: rebeccapurple;\n }\n </style>\n </style>\n ${template({\n ...args,\n open: 'click',\n })}\n`;\n\nconst extraText = html`\n <p>This is some text.</p>\n <p>This is some text.</p>\n <p>\n This is a\n <a href=\"#anchor\">link</a>\n .\n </p>\n`;\n\nexport const inline = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"inline\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-overlay slot=\"click-content\">\n <sp-button\n @click=${(event: Event & { target: HTMLElement }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n Close\n </sp-button>\n </sp-overlay>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const replace = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"replace\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-overlay slot=\"click-content\">\n <sp-button\n @click=${(event: Event & { target: HTMLElement }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n Close\n </sp-button>\n </sp-overlay>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const modalLoose = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-dialog\n size=\"s\"\n dismissable\n slot=\"click-content\"\n @closed=${(event: Event & { target: DialogWrapper }) =>\n event.target.dispatchEvent(closeEvent)}\n >\n <h2 slot=\"heading\">Loose Dialog</h2>\n <p>\n The\n <code>sp-dialog</code>\n element is not \"meant\" to be a modal alone. In that way it\n does not manage its own\n <code>open</code>\n attribute or outline when it should have\n <code>pointer-events: auto</code>\n . It's a part of this test suite to prove that content in\n this way can be used in an\n <code>overlay-trigger</code>\n element.\n </p>\n </sp-dialog>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const modalManaged = (): TemplateResult => {\n const closeEvent = new Event('close', { bubbles: true, composed: true });\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\">Open</sp-button>\n <sp-dialog-wrapper\n underlay\n slot=\"click-content\"\n headline=\"Wrapped Dialog w/ Hero Image\"\n confirm-label=\"Keep Both\"\n secondary-label=\"Replace\"\n cancel-label=\"Cancel\"\n footer=\"Content for footer\"\n @confirm=${(event: Event & { target: DialogWrapper }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n @secondary=${(\n event: Event & { target: DialogWrapper }\n ): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n @cancel=${(event: Event & { target: DialogWrapper }): void => {\n event.target.dispatchEvent(closeEvent);\n }}\n >\n <p>\n The\n <code>sp-dialog-wrapper</code>\n element has been prepared for use in an\n <code>overlay-trigger</code>\n element by it's combination of modal, underlay, etc. styles\n and features.\n </p>\n </sp-dialog-wrapper>\n </overlay-trigger>\n ${extraText}\n `;\n};\n\nexport const deepNesting = (): TemplateResult => {\n const color = window.__swc_hack_knobs__.defaultColor;\n const outter = color === 'light' ? 'dark' : 'light';\n return html`\n ${storyStyles}\n <sp-theme\n color=${outter}\n scale=${window.__swc_hack_knobs__.defaultScale}\n dir=${window.__swc_hack_knobs__.defaultDirection}\n >\n <sp-theme\n color=${color}\n scale=${window.__swc_hack_knobs__.defaultScale}\n dir=${window.__swc_hack_knobs__.defaultDirection}\n >\n <recursive-popover\n tabindex=\"\"\n style=\"\n background-color: var(--spectrum-global-color-gray-100);\n color: var(--spectrum-global-color-gray-800);\n padding: var(--spectrum-global-dimension-size-225);\n \"\n ></recursive-popover>\n </sp-theme>\n </sp-theme>\n `;\n};\n\nexport const edges = (): TemplateResult => {\n return html`\n <style>\n .demo {\n position: absolute;\n }\n .top-left {\n top: 0;\n left: 0;\n }\n .top-right {\n top: 0;\n right: 0;\n }\n .bottom-right {\n bottom: 0;\n right: 0;\n }\n .bottom-left {\n bottom: 0;\n left: 0;\n }\n </style>\n <overlay-trigger class=\"demo top-left\" placement=\"bottom\">\n <sp-button slot=\"trigger\">\n Top/\n <br />\n Left\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"bottom\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger class=\"demo top-right\" placement=\"bottom\">\n <sp-button slot=\"trigger\">\n Top/\n <br />\n Right\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"bottom\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger class=\"demo bottom-left\" placement=\"top\">\n <sp-button slot=\"trigger\">\n Bottom/\n <br />\n Left\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"top\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n <overlay-trigger placement=\"top\" class=\"demo bottom-right\">\n <sp-button slot=\"trigger\">\n Bottom/\n <br />\n Right\n </sp-button>\n <sp-tooltip slot=\"hover-content\" delayed open tip=\"top\">\n Triskaidekaphobia and More\n </sp-tooltip>\n </overlay-trigger>\n `;\n};\n\nexport const updated = (): TemplateResult => {\n return html`\n ${storyStyles}\n <style>\n sp-tooltip {\n transition: none;\n }\n </style>\n <overlay-drag>\n <overlay-trigger class=\"demo top-left\" placement=\"bottom\">\n <overlay-target-icon\n slot=\"trigger\"\n style=\"translate(400px, 300px)\"\n ></overlay-target-icon>\n <sp-tooltip slot=\"hover-content\" delayed tip=\"bottom\">\n Click to open popover\n </sp-tooltip>\n <sp-popover\n dialog\n slot=\"click-content\"\n position=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n <sp-slider\n value=\"5\"\n step=\"0.5\"\n min=\"0\"\n max=\"20\"\n label=\"Awesomeness\"\n ></sp-slider>\n <div id=\"styled-div\">\n The background of this div should be blue\n </div>\n <overlay-trigger id=\"inner-trigger\" placement=\"bottom\">\n <sp-button slot=\"trigger\">Press Me</sp-button>\n <sp-popover\n dialog\n slot=\"click-content\"\n placement=\"bottom\"\n tip\n open\n >\n <div class=\"options-popover-content\">\n Another Popover\n </div>\n </sp-popover>\n\n <sp-tooltip\n slot=\"hover-content\"\n delayed\n tip=\"bottom\"\n >\n Click to open another popover.\n </sp-tooltip>\n </overlay-trigger>\n </div>\n </sp-popover>\n </overlay-trigger>\n </overlay-drag>\n `;\n};\n\nexport const sideHoverDraggable = (): TemplateResult => {\n return html`\n ${storyStyles}\n <style>\n sp-tooltip {\n transition: none;\n }\n </style>\n <overlay-drag>\n <overlay-trigger placement=\"right\">\n <overlay-target-icon slot=\"trigger\"></overlay-target-icon>\n <sp-tooltip slot=\"hover-content\" delayed tip=\"right\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n Vivamus egestas sed enim sed condimentum. Nunc facilisis\n scelerisque massa sed luctus. Orci varius natoque penatibus\n et magnis dis parturient montes, nascetur ridiculus mus.\n Suspendisse sagittis sodales purus vitae ultricies. Integer\n at dui sem. Sed quam tortor, ornare in nisi et, rhoncus\n lacinia mauris. Sed vel rutrum mauris, ac pellentesque nibh.\n Sed feugiat semper libero, sit amet vehicula orci fermentum\n id. Vivamus imperdiet egestas luctus. Mauris tincidunt\n malesuada ante, faucibus viverra nunc blandit a. Fusce et\n nisl nisi. Aenean dictum quam id mollis faucibus. Nulla a\n ultricies dui. In hac habitasse platea dictumst. Curabitur\n gravida lobortis vestibulum.\n </sp-tooltip>\n </overlay-trigger>\n </overlay-drag>\n `;\n};\n\nexport const longpress = (): TemplateResult => {\n return html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-tooltip slot=\"hover-content\">Search real hard...</sp-tooltip>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n @change=${(event: Event & { target: HTMLElement }) =>\n event.target.dispatchEvent(\n new Event('close', { bubbles: true })\n )}\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nclass ComplexModalReady extends HTMLElement {\n ready!: (value: boolean | PromiseLike<boolean>) => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise((res) => {\n this.ready = res;\n this.setup();\n });\n }\n\n async setup(): Promise<void> {\n await nextFrame();\n\n const overlay = document.querySelector(\n `overlay-trigger`\n ) as OverlayTrigger;\n overlay.addEventListener('sp-opened', this.handleTriggerOpened);\n }\n\n handleTriggerOpened = async (): Promise<void> => {\n await nextFrame();\n\n const picker = document.querySelector('#test-picker') as Picker;\n picker.addEventListener('sp-opened', this.handlePickerOpen);\n picker.open = true;\n };\n\n handlePickerOpen = async (): Promise<void> => {\n const picker = document.querySelector('#test-picker') as Picker;\n const actions = [nextFrame, picker.updateComplete];\n\n await Promise.all(actions);\n\n this.ready(true);\n };\n\n private readyPromise: Promise<boolean> = Promise.resolve(false);\n\n get updateComplete(): Promise<boolean> {\n return this.readyPromise;\n }\n}\n\ncustomElements.define('complex-modal-ready', ComplexModalReady);\n\nconst complexModalDecorator = (story: () => TemplateResult): TemplateResult => {\n return html`\n ${story()}\n <complex-modal-ready></complex-modal-ready>\n `;\n};\n\nexport const complexModal = (): TemplateResult => {\n return html`\n <style>\n body {\n --swc-margin-test: 10px;\n margin: var(--swc-margin-test);\n }\n sp-story-decorator::part(container) {\n min-height: calc(100vh - (2 * var(--swc-margin-test)));\n padding: 0;\n display: grid;\n place-content: center;\n }\n active-overlay > * {\n --spectrum-global-animation-duration-100: 0ms;\n --spectrum-global-animation-duration-200: 0ms;\n --spectrum-global-animation-duration-300: 0ms;\n --spectrum-global-animation-duration-400: 0ms;\n --spectrum-global-animation-duration-500: 0ms;\n --spectrum-global-animation-duration-600: 0ms;\n --spectrum-global-animation-duration-700: 0ms;\n --spectrum-global-animation-duration-800: 0ms;\n --spectrum-global-animation-duration-900: 0ms;\n --spectrum-global-animation-duration-1000: 0ms;\n --spectrum-global-animation-duration-2000: 0ms;\n --spectrum-global-animation-duration-4000: 0ms;\n --spectrum-coachmark-animation-indicator-ring-duration: 0ms;\n }\n </style>\n <overlay-trigger type=\"modal\" placement=\"none\" open=\"click\">\n <sp-dialog-wrapper\n slot=\"click-content\"\n headline=\"Dialog title\"\n dismissable\n underlay\n footer=\"Content for footer\"\n >\n <sp-field-label for=\"test-picker\">\n Selection type:\n </sp-field-label>\n <sp-picker id=\"test-picker\">\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save selection</sp-menu-item>\n <sp-menu-item disabled>Make work path</sp-menu-item>\n </sp-picker>\n </sp-dialog-wrapper>\n <sp-button slot=\"trigger\" variant=\"primary\">\n Toggle Dialog\n </sp-button>\n </overlay-trigger>\n `;\n};\n\ncomplexModal.decorators = [complexModalDecorator];\n\nexport const superComplexModal = (): TemplateResult => {\n return html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\" variant=\"cta\">Toggle Dialog</sp-button>\n <sp-popover dialog slot=\"click-content\">\n <overlay-trigger>\n <sp-button slot=\"trigger\" variant=\"primary\">\n Toggle Dialog\n </sp-button>\n <sp-popover dialog slot=\"click-content\">\n <overlay-trigger type=\"modal\">\n <sp-button slot=\"trigger\" variant=\"secondary\">\n Toggle Dialog\n </sp-button>\n <sp-popover dialog slot=\"click-content\">\n <p>\n When you get this deep, this ActiveOverlay\n should be the only one in [slot=\"open\"].\n </p>\n <p>\n All of the rest of the ActiveOverlay\n elements should have had their [slot]\n attribute removed.\n </p>\n <p>\n Closing this ActiveOverlay should replace\n them...\n </p>\n </sp-popover>\n </overlay-trigger>\n </sp-popover>\n </overlay-trigger>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\nclass StartEndContextmenu extends HTMLElement {\n shadowRoot!: ShadowRoot;\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n display: flex;\n align-items: stretch;\n }\n div {\n width: 50%;\n height: 100%;\n }\n </style>\n <div id=\"start\"></div>\n <div id=\"end\"></div>\n `;\n }\n}\n\ncustomElements.define('start-end-contextmenu', StartEndContextmenu);\n\nexport const virtualElement = (args: Properties): TemplateResult => {\n const contextMenuTemplate = (kind = ''): TemplateResult => html`\n <sp-popover\n style=\"max-width: 33vw;\"\n @click=${(event: Event) =>\n event.target?.dispatchEvent(\n new Event('close', { bubbles: true })\n )}\n >\n <sp-menu>\n <sp-menu-group>\n <span slot=\"header\">Menu source: ${kind}</span>\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save selection</sp-menu-item>\n <sp-menu-item disabled>Make work path</sp-menu-item>\n </sp-menu-group>\n </sp-menu>\n </sp-popover>\n `;\n const pointerenter = async (event: PointerEvent): Promise<void> => {\n event.preventDefault();\n const source = event.composedPath()[0] as HTMLDivElement;\n const { id } = source;\n const trigger = event.target as HTMLElement;\n const virtualTrigger = new VirtualTrigger(event.clientX, event.clientY);\n const fragment = document.createDocumentFragment();\n render(contextMenuTemplate(id), fragment);\n const popover = fragment.querySelector('sp-popover') as Popover;\n openOverlay(trigger, 'modal', popover, {\n placement: args.placement,\n receivesFocus: 'auto',\n virtualTrigger,\n });\n };\n return html`\n <style>\n .app-root {\n position: absolute;\n inset: 0;\n }\n </style>\n <start-end-contextmenu\n class=\"app-root\"\n @contextmenu=${pointerenter}\n ></start-end-contextmenu>\n `;\n};\n\nvirtualElement.args = {\n placement: 'right-start' as Placement,\n};\n\nexport const detachedElement = (): TemplateResult => {\n let closeOverlay: (() => void) | undefined;\n const openDetachedOverlayContent = async ({\n target,\n }: {\n target: HTMLElement;\n }): Promise<void> => {\n if (closeOverlay) {\n closeOverlay();\n closeOverlay = undefined;\n return;\n }\n const div = document.createElement('div');\n div.textContent = 'This div is overlaid';\n div.setAttribute(\n 'style',\n `\n background-color: var(--spectrum-global-color-gray-50);\n color: var(--spectrum-global-color-gray-800);\n border: 1px solid;\n padding: 2em;\n `\n );\n closeOverlay = await Overlay.open(target, 'click', div, {\n offset: 0,\n placement: 'bottom',\n });\n };\n requestAnimationFrame(() => {\n openDetachedOverlayContent({\n target: document.querySelector(\n '#detached-content-trigger'\n ) as HTMLElement,\n });\n });\n return html`\n <sp-action-button\n id=\"detached-content-trigger\"\n @click=${openDetachedOverlayContent}\n @sp-closed=${() => (closeOverlay = undefined)}\n >\n <sp-icon-open-in\n slot=\"icon\"\n label=\"Open in overlay\"\n ></sp-icon-open-in>\n </sp-action-button>\n `;\n};\n\nclass DefinedOverlayReady extends HTMLElement {\n ready!: (value: boolean | PromiseLike<boolean>) => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise((res) => {\n this.ready = res;\n this.setup();\n });\n }\n\n async setup(): Promise<void> {\n await nextFrame();\n\n const overlay = document.querySelector(\n `overlay-trigger`\n ) as OverlayTrigger;\n const button = document.querySelector(\n `[slot=\"trigger\"]`\n ) as HTMLButtonElement;\n overlay.addEventListener('sp-opened', this.handleTriggerOpened);\n button.click();\n }\n\n handleTriggerOpened = async (): Promise<void> => {\n await nextFrame();\n\n const popover = document.querySelector('popover-content');\n if (!popover) {\n return;\n }\n popover.addEventListener('sp-opened', this.handlePopoverOpen);\n popover.button.click();\n };\n\n handlePopoverOpen = async (): Promise<void> => {\n await nextFrame();\n\n this.ready(true);\n };\n\n private readyPromise: Promise<boolean> = Promise.resolve(false);\n\n get updateComplete(): Promise<boolean> {\n return this.readyPromise;\n }\n}\n\ncustomElements.define('defined-overlay-ready', DefinedOverlayReady);\n\nconst definedOverlayDecorator = (\n story: () => TemplateResult\n): TemplateResult => {\n return html`\n ${story()}\n <defined-overlay-ready></defined-overlay-ready>\n `;\n};\n\nexport const definedOverlayElement = (): TemplateResult => {\n return html`\n <overlay-trigger placement=\"bottom\" type=\"modal\">\n <sp-button variant=\"primary\" slot=\"trigger\">Open popover</sp-button>\n <sp-popover slot=\"click-content\" direction=\"bottom\" dialog>\n <popover-content></popover-content>\n </sp-popover>\n </overlay-trigger>\n `;\n};\n\ndefinedOverlayElement.decorators = [definedOverlayDecorator];\n"]}