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

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.
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayTrigger.js","sourceRoot":"","sources":["OverlayTrigger.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n LitElement,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { property } from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends LitElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <slot\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected updated(changes: PropertyValues): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n this.type && this.type !== 'inline' ? 'auto' : undefined,\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"]}
1
+ {"version":3,"file":"OverlayTrigger.js","sourceRoot":"","sources":["OverlayTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;;;AAEF,OAAO,EAEH,IAAI,EAEJ,eAAe,GAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,QAAQ,EACR,KAAK,GACR,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAC7F,OAAO,EACH,SAAS,EACT,KAAK,GACR,MAAM,iDAAiD,CAAC;AAQzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAS5D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,KAAK,EAAE,kDAAkD;IACzD,QAAQ,EAAE,sDAAsD;IAChE,KAAK,EAAE,uCAAuC;CACjD,CAAC;AACF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IAAnD;;QASI;;;WAGG;QAEI,cAAS,GAAc,QAAQ,CAAC;QAMhC,WAAM,GAAG,CAAC,CAAC;QAMX,aAAQ,GAAG,KAAK,CAAC;QAGjB,wBAAmB,GAAG,KAAK,CAAC;QAQ3B,iBAAY,GAAG,kCAAkC,CAAC;QA6PlD,iBAAY,GAAiC,GAAG,EAAE;YACtD,OAAO;QACX,CAAC,CAAC;QA4DM,qBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAajD,CAAC;IAxWU,MAAM,KAAK,MAAM;QACpB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAgCO,WAAW,CAAC,KAA2C;QAC3D,IACI,KAAK;YACL,KAAK,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI;YACtC,KAAK,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI,EACxC;YACE,OAAO;SACV;QACD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAES,MAAM;QACZ,sDAAsD;QACtD,0DAA0D;QAC1D,OAAO,IAAI,CAAA;;;yBAGM,IAAI,CAAC,SAAS;6BACV,IAAI,CAAC,SAAS;8BACb,IAAI,CAAC,SAAS;8BACd,IAAI,CAAC,SAAS;2BACjB,IAAI,CAAC,SAAS;4BACb,IAAI,CAAC,SAAS;6BACb,IAAI,CAAC,WAAW;8BACf,IAAI,CAAC,kBAAkB;;;;;kCAKnB,IAAI,CAAC,iBAAiB;;;;kCAItB,IAAI,CAAC,qBAAqB;;;;kCAI1B,IAAI,CAAC,iBAAiB;;;6BAG3B,IAAI,CAAC,YAAY;;SAErC,CAAC;QACF,yDAAyD;IAC7D,CAAC;IAES,OAAO,CAAC,OAA6B;QAC3C,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;SACV;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE,CAAC;SACrB;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;YACpC,IAAI,CAAC,yBAAyB,EAAE,CAAC;SACpC;IACL,CAAC;IAES,yBAAyB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAC9B,kBAAkB,CACF,CAAC;QACrB,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACjE,IAAI,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,aAAa,CAC7C,KAAK,CACO,CAAC;gBAEjB,IAAI,CAAC,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;gBAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;aACrD;YACD,MAAM,WAAW,GAAG,KAAK,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;YAClE,IAAI,CAAC,mBAAmB,CAAC,WAAW;gBAChC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC3C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACvC;aAAM;YACH,IAAI,IAAI,CAAC,mBAAmB;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAChE,WAAW,GAAG,WAAW,CAAC,MAAM,CAC5B,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,YAAY,CACnD,CAAC;SACL;QACD,IAAI,WAAW,CAAC,MAAM,EAAE;YACpB,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;aAAM;YACH,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;SAC/C;IACL,CAAC;IAEO,gBAAgB;QACpB,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE3C;YACI,mBAAmB;YACnB,mBAAmB;YACnB,uBAAuB;SAE9B,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAwB,CAAC;YACnD,IAAI,QAAQ,IAAI,IAAI;gBAAE,OAAO;YAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,MAAM,QAAQ,CAAC,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,UAAU;;QACd,MAAM,YAAY,GAAqD;YACnE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE;YAClC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACvC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC1C,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;SACtC,CAAC;QACF,YAAY,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,MAAM,CAAC,EAAE,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,WAAW,CACrB,MAAmB,EACnB,WAAgC,EAChC,OAAoB,EACpB,OAAuB;QAEvB,IAAI,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAC1C,CAAC;QACF,IAAI,CAAC,gBAAgB,CACjB,WAAW,EACX,GAAG,EAAE;YACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACjB,CAAC;QACF,OAAO,cAAc,CAAC,WAAW,CAC7B,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,CACV,CAAC;IACN,CAAC;IAWD,IAAY,cAAc;QACtB,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EACT,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC/D,CAAC;IACN,CAAC;IAEO,SAAS,CAAC,KAAkC;QAChD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,QAAQ,KAAK,CAAC,IAAI,EAAE;YAChB,KAAK,YAAY,CAAC;YAClB,KAAK,SAAS;gBACV,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;oBACjC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;iBACvB;gBACD,OAAO;YACX,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU;gBACX,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;oBACvB,IAAI,CAAC,WAAW,EAAE,CAAC;iBACtB;gBACD,OAAO;YACX,KAAK,OAAO;gBACR,IAAI,IAAI,CAAC,YAAY,EAAE;oBACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;iBAC1B;qBAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE;oBAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;iBAC1B;gBACD,OAAO;YACX,KAAK,WAAW;gBACZ,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;iBAC1B;gBACD,OAAO;SACd;IACL,CAAC;IAEO,4BAA4B,CAAC,cAA2B;QAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;YACvB,OAAO;SACV;QACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,EAAE;YACjB,cAAc,CAAC,QAAQ,GAAG,CAAC,CAAC;SAC/B;IACL,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,IACI,CAAC,IAAI,CAAC,aAAa;YACnB,CAAC,IAAI,CAAC,YAAY;YAClB,IAAI,CAAC,iBAAiB,EACxB;YACE,OAAO;SACV;QACD,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CACrC,aAAa,EACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAC/B,YAAY,EACZ,IAAI,CAAC,cAAc,CACtB,CAAC;IACN,CAAC;IAIO,KAAK,CAAC,kBAAkB;;QAC5B,IACI,CAAC,IAAI,CAAC,aAAa;YACnB,CAAC,IAAI,CAAC,gBAAgB;YACtB,IAAI,CAAC,qBAAqB,EAC5B;YACE,OAAO;SACV;QACD,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,sBAAsB,GACxB,CAAA,MAAA,MAAA,IAAI,CAAC,eAAe,0CAAE,MAAM,0CAAE,MAAM,MAAK,UAAU,CAAC;QACxD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CACzC,aAAa,EACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EACnC,gBAAgB,kCAET,IAAI,CAAC,cAAc,KACtB,aAAa,EAAE,MAAM,EACrB,sBAAsB,IAE7B,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IACrC,CAAC;IAMM,KAAK,CAAC,mBAAmB;QAC5B,IACI,CAAC,IAAI,CAAC,aAAa;YACnB,CAAC,IAAI,CAAC,YAAY;YAClB,IAAI,CAAC,iBAAiB,EACxB;YACE,OAAO;SACV;QACD,MAAM,YAAY,GAAqB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvD,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CACrC,aAAa,EACb,OAAO,EACP,YAAY,kBAER,YAAY,IACT,IAAI,CAAC,cAAc,EAE7B,CAAC;IACN,CAAC;IAEO,iBAAiB,CACrB,KAA0C;QAE1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,qBAAqB,CACzB,KAA0C;QAE1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,mBAAmB;YACpB,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,iBAAiB,CACrB,KAA0C;QAE1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,kBAAkB,CACtB,KAA0C;QAE1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEO,2BAA2B,CAAC,KAAY;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAyB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,WAAW,CAAgB,CAAC;IAC5E,CAAC;IAKS,KAAK,CAAC,iBAAiB;QAC7B,MAAM,QAAQ,GAAG,CAAC,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAY,CAAC;QAC9D,MAAM,IAAI,CAAC,gBAAgB,CAAC;QAC5B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,oBAAoB;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,KAAK,CAAC,oBAAoB,EAAE,CAAC;IACjC,CAAC;;;AArLa,0BAAW,GAAG,KAAK,EAC7B,MAAmB,EACnB,WAAgC,EAChC,OAAoB,EACpB,OAAuB,EACJ,EAAE;IACrB,OAAO,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAE,CAAA;AAhLF;IADC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iDACW;AAGvC;IADC,QAAQ,EAAE;4CACgE;AAG3E;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CACxB;AAGlB;IADC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;4CACM;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gDACnB;AAGxB;IADC,KAAK,EAAE;2DAC2B","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 {\n property,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport type { LongpressEvent } from '@spectrum-web-components/action-button';\nimport { firstFocusableIn } from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport {\n isAndroid,\n isIOS,\n} from '@spectrum-web-components/shared/src/platform.js';\n\nimport {\n OverlayOpenCloseDetail,\n OverlayOptions,\n Placement,\n TriggerInteractions,\n} from './overlay-types';\nimport { openOverlay } from './loader.js';\nimport overlayTriggerStyles from './overlay-trigger.css.js';\n\nexport type OverlayContentTypes = 'click' | 'hover' | 'longpress';\n\ntype closeOverlay =\n | 'closeClickOverlay'\n | 'closeHoverOverlay'\n | 'closeLongpressOverlay';\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n/**\n * @element overlay-trigger\n *\n * @slot trigger - The content that will trigger the various overlays\n * @slot hover-content - The content that will be displayed on hover\n * @slot click-content - The content that will be displayed on click\n * @slot longpress-content - The content that will be displayed on click\n *\n * @fires sp-opened - Announces that the overlay has been opened\n * @fires sp-closed - Announces that the overlay has been closed\n */\nexport class OverlayTrigger extends SpectrumElement {\n private closeClickOverlay?: Promise<() => void>;\n private closeLongpressOverlay?: Promise<() => void>;\n private closeHoverOverlay?: Promise<() => void>;\n\n public static get styles(): CSSResultArray {\n return [overlayTriggerStyles];\n }\n\n /**\n * @type {\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\"}\n * @attr\n */\n @property({ reflect: true })\n public placement: Placement = 'bottom';\n\n @property()\n public type?: Extract<TriggerInteractions, 'inline' | 'modal' | 'replace'>;\n\n @property({ type: Number, reflect: true })\n public offset = 6;\n\n @property({ reflect: true })\n public open?: OverlayContentTypes;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @state()\n public hasLongpressContent = false;\n\n private longpressDescriptor?: HTMLElement;\n private clickContent?: HTMLElement;\n private longpressContent?: HTMLElement;\n private hoverContent?: HTMLElement;\n private targetContent?: HTMLElement;\n\n private _longpressId = `longpress-describedby-descriptor`;\n\n private handleClose(event?: CustomEvent<OverlayOpenCloseDetail>): void {\n if (\n event &&\n event.detail.interaction !== this.open &&\n event.detail.interaction !== this.type\n ) {\n return;\n }\n this.removeAttribute('open');\n }\n\n protected render(): TemplateResult {\n // Keyboard event availability documented in README.md\n /* eslint-disable lit-a11y/click-events-have-key-events */\n return html`\n <slot\n id=\"trigger\"\n @click=${this.onTrigger}\n @longpress=${this.onTrigger}\n @mouseenter=${this.onTrigger}\n @mouseleave=${this.onTrigger}\n @focusin=${this.onTrigger}\n @focusout=${this.onTrigger}\n @sp-closed=${this.handleClose}\n @slotchange=${this.onTargetSlotChange}\n name=\"trigger\"\n ></slot>\n <div id=\"overlay-content\">\n <slot\n @slotchange=${this.onClickSlotChange}\n name=\"click-content\"\n ></slot>\n <slot\n @slotchange=${this.onLongpressSlotChange}\n name=\"longpress-content\"\n ></slot>\n <slot\n @slotchange=${this.onHoverSlotChange}\n name=\"hover-content\"\n ></slot>\n <slot name=${this._longpressId}></slot>\n </div>\n `;\n /* eslint-enable lit-a11y/click-events-have-key-events */\n }\n\n protected updated(changes: PropertyValues<this>): void {\n super.updated(changes);\n if (this.disabled && changes.has('disabled')) {\n this.closeAllOverlays();\n return;\n }\n if (changes.has('open')) {\n this.manageOpen();\n }\n if (changes.has('hasLongpressContent')) {\n this.manageLongpressDescriptor();\n }\n }\n\n protected manageLongpressDescriptor(): void {\n const trigger = this.querySelector(\n '[slot=\"trigger\"]'\n ) as SpectrumElement;\n const ariaDescribedby = trigger.getAttribute('aria-describedby');\n let descriptors = ariaDescribedby ? ariaDescribedby.split(/\\s+/) : [];\n\n if (this.hasLongpressContent) {\n if (!this.longpressDescriptor) {\n this.longpressDescriptor = document.createElement(\n 'div'\n ) as HTMLElement;\n\n this.longpressDescriptor.id = this._longpressId;\n this.longpressDescriptor.slot = this._longpressId;\n }\n const messageType = isIOS() || isAndroid() ? 'touch' : 'keyboard';\n this.longpressDescriptor.textContent =\n LONGPRESS_INSTRUCTIONS[messageType];\n this.appendChild(this.longpressDescriptor);\n descriptors.push(this._longpressId);\n } else {\n if (this.longpressDescriptor) this.longpressDescriptor.remove();\n descriptors = descriptors.filter(\n (descriptor) => descriptor !== this._longpressId\n );\n }\n if (descriptors.length) {\n trigger.setAttribute('aria-describedby', descriptors.join(' '));\n } else {\n trigger.removeAttribute('aria-describedby');\n }\n }\n\n private closeAllOverlays(): void {\n if (this.abortOverlay) this.abortOverlay(true);\n (\n [\n 'closeClickOverlay',\n 'closeHoverOverlay',\n 'closeLongpressOverlay',\n ] as closeOverlay[]\n ).forEach(async (name) => {\n const canClose = this[name] as Promise<() => void>;\n if (canClose == null) return;\n delete this[name];\n (await canClose)();\n });\n }\n\n private manageOpen(): void {\n const openHandlers: Record<OverlayContentTypes | 'none', () => void> = {\n click: () => this.onTriggerClick(),\n hover: () => this.onTriggerMouseEnter(),\n longpress: () => this.onTriggerLongpress(),\n none: () => this.closeAllOverlays(),\n };\n openHandlers[this.open ?? 'none']();\n }\n\n private async openOverlay(\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> {\n this.openStatePromise = new Promise(\n (res) => (this.openStateResolver = res)\n );\n this.addEventListener(\n 'sp-opened',\n () => {\n this.openStateResolver();\n },\n { once: true }\n );\n return OverlayTrigger.openOverlay(\n target,\n interaction,\n content,\n options\n );\n }\n\n public static openOverlay = async (\n target: HTMLElement,\n interaction: TriggerInteractions,\n content: HTMLElement,\n options: OverlayOptions\n ): Promise<() => void> => {\n return openOverlay(target, interaction, content, options);\n };\n\n private get overlayOptions(): OverlayOptions {\n return {\n offset: this.offset,\n placement: this.placement,\n receivesFocus:\n this.type && this.type !== 'inline' ? 'auto' : undefined,\n };\n }\n\n private onTrigger(event: CustomEvent<LongpressEvent>): void {\n if (this.disabled) return;\n\n switch (event.type) {\n case 'mouseenter':\n case 'focusin':\n if (!this.open && this.hoverContent) {\n this.open = 'hover';\n }\n return;\n case 'mouseleave':\n case 'focusout':\n if (this.open === 'hover') {\n this.handleClose();\n }\n return;\n case 'click':\n if (this.clickContent) {\n this.open = event.type;\n } else if (this.closeHoverOverlay) {\n event.preventDefault();\n }\n return;\n case 'longpress':\n if (this.longpressContent) {\n this._longpressEvent = event;\n this.open = event.type;\n }\n return;\n }\n }\n\n private prepareToFocusOverlayContent(overlayContent: HTMLElement): void {\n if (this.type !== 'modal') {\n return;\n }\n const firstFocusable = firstFocusableIn(overlayContent);\n if (!firstFocusable) {\n overlayContent.tabIndex = 0;\n }\n }\n\n public async onTriggerClick(): Promise<void> {\n if (\n !this.targetContent ||\n !this.clickContent ||\n this.closeClickOverlay\n ) {\n return;\n }\n const { targetContent, clickContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(clickContent);\n this.closeClickOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'click',\n clickContent,\n this.overlayOptions\n );\n }\n\n private _longpressEvent?: CustomEvent<LongpressEvent>;\n\n private async onTriggerLongpress(): Promise<void> {\n if (\n !this.targetContent ||\n !this.longpressContent ||\n this.closeLongpressOverlay\n ) {\n return;\n }\n const { targetContent, longpressContent } = this;\n this.closeAllOverlays();\n this.prepareToFocusOverlayContent(longpressContent);\n const notImmediatelyClosable =\n this._longpressEvent?.detail?.source !== 'keyboard';\n this.closeLongpressOverlay = this.openOverlay(\n targetContent,\n this.type ? this.type : 'longpress',\n longpressContent,\n {\n ...this.overlayOptions,\n receivesFocus: 'auto',\n notImmediatelyClosable,\n }\n );\n this._longpressEvent = undefined;\n }\n\n private abortOverlay: (cancelled: boolean) => void = () => {\n return;\n };\n\n public async onTriggerMouseEnter(): Promise<void> {\n if (\n !this.targetContent ||\n !this.hoverContent ||\n this.closeHoverOverlay\n ) {\n return;\n }\n const abortPromise: Promise<boolean> = new Promise((res) => {\n this.abortOverlay = res;\n });\n const { targetContent, hoverContent } = this;\n this.closeHoverOverlay = this.openOverlay(\n targetContent,\n 'hover',\n hoverContent,\n {\n abortPromise,\n ...this.overlayOptions,\n }\n );\n }\n\n private onClickSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.clickContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onLongpressSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.longpressContent = this.extractSlotContentFromEvent(event);\n this.hasLongpressContent =\n !!this.longpressContent || !!this.closeLongpressOverlay;\n this.manageOpen();\n }\n\n private onHoverSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.hoverContent = this.extractSlotContentFromEvent(event);\n this.manageOpen();\n }\n\n private onTargetSlotChange(\n event: Event & { target: HTMLSlotElement }\n ): void {\n this.targetContent = this.extractSlotContentFromEvent(event);\n }\n\n private extractSlotContentFromEvent(event: Event): HTMLElement | undefined {\n const slot = event.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.find((node) => node instanceof HTMLElement) as HTMLElement;\n }\n\n private openStatePromise = Promise.resolve();\n private openStateResolver!: () => void;\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n await this.openStatePromise;\n return complete;\n }\n\n public disconnectedCallback(): void {\n this.closeAllOverlays();\n super.disconnectedCallback();\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { VirtualElement } from './popper.js';
2
- export declare class VirtualTrigger implements VirtualElement {
1
+ export declare class VirtualTrigger {
3
2
  private x;
4
3
  private y;
5
4
  constructor(x: number, y: number);
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualTrigger.js","sourceRoot":"","sources":["VirtualTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;EASE;AAGF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,cAAc;IAIvB,YAAmB,CAAS,EAAE,CAAS;QAH/B,MAAC,GAAG,CAAC,CAAC;QACN,MAAC,GAAG,CAAC,CAAC;QAGV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAEM,wBAAwB,CAAC,CAAS,EAAE,CAAS;QAChD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAEM,qBAAqB;QACxB,OAAO;YACH,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,IAAI,CAAC,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,CAAC;YACb,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,CAAC;YACZ,MAAM;gBACF,OAAO;YACX,CAAC;SACJ,CAAC;IACN,CAAC;CACJ","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*/\n\nimport type { VirtualElement } from './popper.js';\nimport { Overlay } from './overlay.js';\n\nexport class VirtualTrigger implements VirtualElement {\n private x = 0;\n private y = 0;\n\n public constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n public updateBoundingClientRect(x: number, y: number): void {\n this.x = x;\n this.y = y;\n Overlay.update();\n }\n\n public getBoundingClientRect(): DOMRect {\n return {\n width: 0,\n height: 0,\n top: this.y,\n right: this.x,\n y: this.y,\n x: this.x,\n bottom: this.y,\n left: this.x,\n toJSON() {\n return;\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"VirtualTrigger.js","sourceRoot":"","sources":["VirtualTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;EASE;AAEF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,cAAc;IAIvB,YAAmB,CAAS,EAAE,CAAS;QAH/B,MAAC,GAAG,CAAC,CAAC;QACN,MAAC,GAAG,CAAC,CAAC;QAGV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAEM,wBAAwB,CAAC,CAAS,EAAE,CAAS;QAChD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAEM,qBAAqB;QACxB,OAAO;YACH,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,IAAI,CAAC,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,CAAC;YACb,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,CAAC;YACZ,MAAM;gBACF,OAAO;YACX,CAAC;SACJ,CAAC;IACN,CAAC;CACJ","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*/\n\nimport { Overlay } from './overlay.js';\n\nexport class VirtualTrigger {\n private x = 0;\n private y = 0;\n\n public constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n public updateBoundingClientRect(x: number, y: number): void {\n this.x = x;\n this.y = y;\n Overlay.update();\n }\n\n public getBoundingClientRect(): DOMRect {\n return {\n width: 0,\n height: 0,\n top: this.y,\n right: this.x,\n y: this.y,\n x: this.x,\n bottom: this.y,\n left: this.x,\n toJSON() {\n return;\n },\n };\n }\n}\n"]}
@@ -13,7 +13,7 @@ import { css } from '@spectrum-web-components/base';
13
13
  const styles = css `
14
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(
15
15
  --spectrum-global-animation-ease-out,ease-out
16
- );display:inline-block;opacity:1;pointer-events:none;visibility:visible}:host([data-popper-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75))}:host([data-popper-placement*=right]) #contents{--sp-overlay-from:translateX(calc(-1*var(--spectrum-global-dimension-size-75)))}:host([data-popper-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(-1*var(--spectrum-global-dimension-size-75)))}:host([data-popper-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}
16
+ );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
17
  `;
18
18
  export default styles;
19
19
  //# sourceMappingURL=active-overlay.css.js.map
@@ -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([data-popper-placement*=top]) #contents{--sp-overlay-from:translateY(var(--spectrum-global-dimension-size-75))}:host([data-popper-placement*=right]) #contents{--sp-overlay-from:translateX(calc(-1*var(--spectrum-global-dimension-size-75)))}:host([data-popper-placement*=bottom]) #contents{--sp-overlay-from:translateY(calc(-1*var(--spectrum-global-dimension-size-75)))}:host([data-popper-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;;;;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;"]}
@@ -31,7 +31,9 @@ export class OverlayStack {
31
31
  this._bodyMarginsApplied = false;
32
32
  this.forwardContextmenuEvent = async (event) => {
33
33
  const topOverlay = this.overlays[this.overlays.length - 1];
34
- if (!this.trappingInited || topOverlay.interaction !== 'modal') {
34
+ if (!this.trappingInited ||
35
+ topOverlay.interaction !== 'modal' ||
36
+ event.target !== this.overlayHolder) {
35
37
  return;
36
38
  }
37
39
  event.stopPropagation();
@@ -115,6 +117,9 @@ export class OverlayStack {
115
117
  const root = this.document.body.shadowRoot;
116
118
  root.innerHTML = `
117
119
  <style>
120
+ :host {
121
+ position: relative;
122
+ }
118
123
  #actual {
119
124
  position: relative;
120
125
  height: calc(100% - var(--swc-body-margins-block, 0px));
@@ -122,24 +127,21 @@ export class OverlayStack {
122
127
  min-height: calc(100vh - var(--swc-body-margins-block, 0px));
123
128
  }
124
129
  #holder {
125
- display: flex;
130
+ display: none;
126
131
  align-items: center;
127
132
  justify-content: center;
128
133
  flex-flow: column;
129
- height: 100%;
130
134
  width: 100%;
135
+ height: 100%;
136
+ position: absolute;
131
137
  top: 0;
132
138
  left: 0;
133
- position: fixed;
134
139
  }
135
140
  [name="open"]::slotted(*) {
136
141
  pointer-events: all;
137
142
  }
138
- #holder {
139
- display: none;
140
- }
141
143
  #actual[aria-hidden] + #holder {
142
- display: block;
144
+ display: flex;
143
145
  }
144
146
  </style>
145
147
  <div id="actual"><slot></slot></div>
@@ -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 #actual {\n position: relative;\n height: calc(100% - var(--swc-body-margins-block, 0px));\n z-index: 0;\n min-height: calc(100vh - var(--swc-body-margins-block, 0px));\n }\n #holder {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n position: fixed;\n }\n [name=\"open\"]::slotted(*) {\n pointer-events: all;\n }\n #holder {\n display: none;\n }\n #actual[aria-hidden] + #holder {\n display: block;\n }\n </style>\n <div id=\"actual\"><slot></slot></div>\n <div id=\"holder\"><slot name=\"open\"></slot></div>\n `;\n this.tabTrapper = root.querySelector('#actual') as HTMLElement;\n this.overlayHolder = root.querySelector('#holder') as HTMLElement;\n this.tabTrapper.attachShadow({ mode: 'open' });\n if (this.tabTrapper.shadowRoot) {\n this.tabTrapper.shadowRoot.innerHTML = '<slot></slot>';\n }\n this.overlayHolder.addEventListener(\n 'contextmenu',\n this.forwardContextmenuEvent,\n true\n );\n requestAnimationFrame(() => {\n this.applyBodyMargins();\n const observer = new ResizeObserver(() => {\n this.applyBodyMargins();\n });\n observer.observe(document.body);\n });\n }\n\n private _bodyMarginsApplied = false;\n\n private applyBodyMargins(): void {\n const { marginLeft, marginRight, marginTop, marginBottom } =\n getComputedStyle(document.body);\n const allZero =\n parseFloat(marginLeft) === 0 &&\n parseFloat(marginRight) === 0 &&\n parseFloat(marginTop) === 0 &&\n parseFloat(marginBottom) === 0;\n if (allZero && !this._bodyMarginsApplied) {\n return;\n }\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-inline',\n `calc(${marginLeft} + ${marginRight})`\n );\n this.tabTrapper.style.setProperty(\n '--swc-body-margins-block',\n `calc(${marginTop} + ${marginBottom})`\n );\n this._bodyMarginsApplied = !allZero;\n }\n\n private startTabTrapping(): void {\n this.initTabTrapping();\n /* c8 ignore next 3 */\n if (!this.canTabTrap) {\n return;\n }\n this.tabTrapper.tabIndex = -1;\n this.tabTrapper.setAttribute('aria-hidden', 'true');\n }\n\n private stopTabTrapping(): void {\n /* c8 ignore next 3 */\n if (!this.canTabTrap || !this.trappingInited) {\n return;\n }\n this.tabTrapper.removeAttribute('tabindex');\n this.tabTrapper.removeAttribute('aria-hidden');\n }\n\n private forwardContextmenuEvent = async (\n event: MouseEvent\n ): Promise<void> => {\n const topOverlay = this.overlays[this.overlays.length - 1];\n if (!this.trappingInited || topOverlay.interaction !== 'modal') {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n await this.closeTopOverlay();\n let target = document.elementFromPoint(event.clientX, event.clientY);\n while (target?.shadowRoot) {\n const innerTarget = (\n target.shadowRoot as unknown as {\n elementFromPoint: (x: number, y: number) => Element | null;\n }\n ).elementFromPoint(event.clientX, event.clientY);\n if (!innerTarget || innerTarget === target) {\n break;\n }\n target = innerTarget;\n }\n target?.dispatchEvent(new MouseEvent('contextmenu', event));\n };\n\n private get document(): Document {\n return this.root.ownerDocument /* c8 ignore next */ || document;\n }\n\n private get topOverlay(): ActiveOverlay | undefined {\n return this.overlays.slice(-1)[0];\n }\n\n private findOverlayForContent(\n overlayContent: HTMLElement\n ): ActiveOverlay | undefined {\n for (const item of this.overlays) {\n if (overlayContent === item.overlayContent) {\n return item;\n }\n }\n return undefined;\n }\n\n private addEventListeners(): void {\n if (this._eventsAreBound) return;\n this._eventsAreBound = true;\n this.document.addEventListener('click', this.handleMouseCapture, true);\n this.document.addEventListener('click', this.handleMouse);\n this.document.addEventListener('keyup', this.handleKeyUp);\n window.addEventListener('resize', this.handleResize);\n }\n\n private isClickOverlayActiveForTrigger(trigger: HTMLElement): boolean {\n return this.overlays.some(\n (item) => trigger === item.trigger && item.interaction === 'click'\n );\n }\n\n public async openOverlay(details: OverlayOpenDetail): Promise<boolean> {\n this.addEventListeners();\n if (this.findOverlayForContent(details.content)) {\n return false;\n }\n if (details.notImmediatelyClosable) {\n this._doesNotCloseOnFirstClick = true;\n }\n if (details.interaction === 'modal') {\n this.startTabTrapping();\n }\n\n const contentWithLifecycle =\n details.content as unknown as ManagedOverlayContent;\n if (contentWithLifecycle.overlayWillOpenCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayWillOpenCallback({ trigger });\n }\n\n if (details.delayed) {\n const cancelledPromise = this.overlayTimer.openTimer(\n details.content\n );\n const promises = [cancelledPromise];\n if (details.abortPromise) {\n promises.push(details.abortPromise);\n }\n const cancelled = await Promise.race(promises);\n if (cancelled) {\n if (contentWithLifecycle.overlayOpenCancelledCallback) {\n const { trigger } = details;\n contentWithLifecycle.overlayOpenCancelledCallback({\n trigger,\n });\n }\n return cancelled;\n }\n }\n\n if (details.interaction === 'click') {\n this.closeAllHoverOverlays();\n } else if (\n details.interaction === 'hover' &&\n this.isClickOverlayActiveForTrigger(details.trigger)\n ) {\n // Don't show a hover popover if the click popover is already active\n return true;\n }\n\n const activeOverlay = ActiveOverlay.create(details);\n\n if (this.overlays.length) {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.obscure(activeOverlay.interaction);\n }\n\n document.body.appendChild(activeOverlay);\n\n /**\n * The following work to make the new overlay the \"top\" of the stack\n * has to happen AFTER the current call stack completes in case there\n * is work there in to remove the previous \"top\" overlay.\n */\n return new Promise((res) => requestAnimationFrame(res)).then(\n async () => {\n this.overlays.push(activeOverlay);\n await activeOverlay.updateComplete;\n this.addOverlayEventListeners(activeOverlay);\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = true;\n }\n if (contentWithLifecycle.overlayOpenCallback) {\n const { trigger } = activeOverlay;\n contentWithLifecycle.overlayOpenCallback({ trigger });\n }\n if (details.receivesFocus === 'auto') {\n activeOverlay.focus();\n }\n return false;\n }\n );\n }\n\n public addOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('close', () => {\n this.hideAndCloseOverlay(activeOverlay);\n });\n switch (activeOverlay.interaction) {\n case 'replace':\n this.addReplaceOverlayEventListeners(activeOverlay);\n break;\n case 'inline':\n this.addInlineOverlayEventListeners(activeOverlay);\n break;\n }\n }\n\n public addReplaceOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n event.stopPropagation();\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.tabbingAway = true;\n activeOverlay.trigger.focus();\n activeOverlay.trigger.dispatchEvent(\n new KeyboardEvent('keydown', event)\n );\n });\n }\n\n public addInlineOverlayEventListeners(activeOverlay: ActiveOverlay): void {\n activeOverlay.trigger.addEventListener(\n 'keydown',\n activeOverlay.handleInlineTriggerKeydown\n );\n activeOverlay.addEventListener('keydown', (event: KeyboardEvent) => {\n const { code, shiftKey } = event;\n /* c8 ignore next */\n if (code !== 'Tab') return;\n\n activeOverlay.tabbingAway = true;\n if (shiftKey) {\n const returnFocusElement = document.createElement('span');\n returnFocusElement.tabIndex = -1;\n if (activeOverlay.trigger.hasAttribute('slot')) {\n returnFocusElement.slot = activeOverlay.trigger.slot;\n }\n activeOverlay.trigger.insertAdjacentElement(\n 'afterend',\n returnFocusElement\n );\n returnFocusElement.focus();\n returnFocusElement.remove();\n return;\n }\n\n event.stopPropagation();\n const triggerWithLifecycle =\n activeOverlay.trigger as unknown as ManagedOverlayContent;\n if (typeof triggerWithLifecycle.open !== 'undefined') {\n triggerWithLifecycle.open = false;\n }\n this.closeOverlay(activeOverlay.overlayContent);\n activeOverlay.trigger.focus();\n });\n }\n\n public closeOverlay(content: HTMLElement): void {\n this.overlayTimer.close(content);\n requestAnimationFrame(() => {\n const overlay = this.findOverlayForContent(content);\n this.hideAndCloseOverlay(overlay);\n });\n }\n\n private handleMouseCapture = (event: MouseEvent): void => {\n const topOverlay = this.topOverlay;\n if (\n !event.target ||\n !topOverlay ||\n !topOverlay.overlayContent ||\n hasModifier(event) ||\n !isLeftClick(event)\n ) {\n this.preventMouseRootClose = true;\n return;\n }\n\n if (event.target instanceof Node) {\n const path = event.composedPath();\n if (path.indexOf(topOverlay.overlayContent) >= 0) {\n this.preventMouseRootClose = true;\n return;\n }\n this.preventMouseRootClose = false;\n }\n };\n\n private closeAllHoverOverlays(): void {\n for (const overlay of this.overlays) {\n if (overlay.interaction === 'hover') {\n this.hideAndCloseOverlay(overlay, false);\n }\n }\n }\n\n private manageFocusAfterCloseWhenOverlaysRemain(): void {\n const topOverlay = this.overlays[this.overlays.length - 1];\n topOverlay.feature();\n // Push focus in the the next remaining overlay as needed when a `type=\"modal\"` overlay exists.\n if (topOverlay.interaction === 'modal' || topOverlay.hasModalRoot) {\n topOverlay.focus();\n } else {\n this.stopTabTrapping();\n }\n }\n\n private manageFocusAfterCloseWhenLastOverlay(overlay: ActiveOverlay): void {\n this.stopTabTrapping();\n const isModal = overlay.interaction === 'modal';\n const isReplace = overlay.interaction === 'replace';\n const isInline = overlay.interaction === 'inline';\n const isTabbingAwayFromInlineOrReplace =\n (isReplace || isInline) && !overlay.tabbingAway;\n overlay.tabbingAway = false;\n if (!isModal && !isTabbingAwayFromInlineOrReplace) {\n return;\n }\n // Manage post closure focus when needed.\n const overlayRoot = overlay.overlayContent.getRootNode() as ShadowRoot;\n const overlayContentActiveElement = overlayRoot.activeElement;\n let triggerRoot: ShadowRoot;\n let triggerActiveElement: Element | null;\n const contentContainsActiveElement = (): boolean =>\n overlay.overlayContent.contains(overlayContentActiveElement);\n const triggerRootContainsActiveElement = (): boolean => {\n triggerRoot = overlay.trigger.getRootNode() as ShadowRoot;\n triggerActiveElement = triggerRoot.activeElement;\n return triggerRoot.contains(triggerActiveElement);\n };\n const triggerHostIsActiveElement = (): boolean =>\n triggerRoot.host && triggerRoot.host === triggerActiveElement;\n // Return focus to the trigger as long as the user hasn't actively focused\n // something outside of the current overlay interface; trigger, root, host.\n if (\n isModal ||\n contentContainsActiveElement() ||\n triggerRootContainsActiveElement() ||\n triggerHostIsActiveElement()\n ) {\n overlay.trigger.focus();\n }\n }\n\n private async hideAndCloseOverlay(\n overlay?: ActiveOverlay,\n animated?: boolean\n ): Promise<void> {\n if (!overlay) {\n return;\n }\n await overlay.hide(animated);\n const contentWithLifecycle =\n overlay.overlayContent as unknown as ManagedOverlayContent;\n if (typeof contentWithLifecycle.open !== 'undefined') {\n contentWithLifecycle.open = false;\n }\n if (contentWithLifecycle.overlayCloseCallback) {\n const { trigger } = overlay;\n contentWithLifecycle.overlayCloseCallback({ trigger });\n }\n\n if (overlay.state != 'dispose') return;\n\n const index = this.overlays.indexOf(overlay);\n if (index >= 0) {\n this.overlays.splice(index, 1);\n }\n\n if (this.overlays.length) {\n this.manageFocusAfterCloseWhenOverlaysRemain();\n } else {\n this.manageFocusAfterCloseWhenLastOverlay(overlay);\n }\n\n overlay.remove();\n overlay.dispose();\n\n overlay.trigger.dispatchEvent(\n new CustomEvent<OverlayOpenCloseDetail>('sp-closed', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n interaction: overlay.interaction,\n },\n })\n );\n }\n\n private closeTopOverlay(): Promise<void> {\n return this.hideAndCloseOverlay(this.topOverlay);\n }\n\n /**\n * A \"longpress\" occurs before the \"click\" that creates it has occured.\n * In that way the first click will still be part of the \"longpress\" and\n * not part of closing the overlay.\n */\n private _doesNotCloseOnFirstClick = false;\n\n private handleMouse = (event: Event): void => {\n if (this._doesNotCloseOnFirstClick) {\n this._doesNotCloseOnFirstClick = false;\n return;\n }\n if (this.preventMouseRootClose || event.defaultPrevented) {\n return;\n }\n this.closeTopOverlay();\n };\n\n private handleKeyUp = (event: KeyboardEvent): void => {\n if (event.code === 'Escape') {\n this.closeTopOverlay();\n }\n };\n\n private handleResize = (): void => {\n if (this.handlingResize) return;\n\n this.handlingResize = true;\n requestAnimationFrame(async () => {\n const promises = this.overlays.map((overlay) =>\n overlay.updateOverlayPosition()\n );\n await Promise.all(promises);\n this.handlingResize = false;\n });\n };\n}\n"]}
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,6 +1,6 @@
1
1
  import { ThemeData } from '@spectrum-web-components/theme';
2
- import { Placement as PopperPlacement } from './popper';
3
- import { VirtualTrigger } from './VirtualTrigger.js';
2
+ import type { Placement as FloatingUIPlacement } from '@floating-ui/dom';
3
+ import type { VirtualTrigger } from './VirtualTrigger.js';
4
4
  export declare type TriggerInteractions = 'click' | 'longpress' | 'hover' | 'custom' | 'replace' | 'inline' | 'modal';
5
5
  export interface OverlayOpenDetail {
6
6
  content: HTMLElement;
@@ -28,7 +28,7 @@ export interface OverlayDisplayQueryDetail {
28
28
  overlayRootElement?: HTMLElement;
29
29
  overlayContentTipElement?: HTMLElement;
30
30
  }
31
- export declare type Placement = PopperPlacement | 'none';
31
+ export declare type Placement = FloatingUIPlacement | 'none';
32
32
  export declare type OverlayOptions = {
33
33
  delayed?: boolean;
34
34
  placement?: Placement;
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-types.js","sourceRoot":"","sources":["overlay-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE","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 { Placement as PopperPlacement } from './popper';\nimport { VirtualTrigger } from './VirtualTrigger.js';\n\nexport type TriggerInteractions =\n | 'click'\n | 'longpress'\n | 'hover'\n | 'custom'\n | 'replace'\n | 'inline'\n | 'modal';\n\nexport interface OverlayOpenDetail {\n content: HTMLElement;\n contentTip?: HTMLElement;\n delayed: boolean;\n offset: number;\n placement?: Placement;\n receivesFocus?: 'auto';\n virtualTrigger?: VirtualTrigger;\n trigger: HTMLElement;\n interaction: TriggerInteractions;\n theme: ThemeData;\n notImmediatelyClosable?: boolean;\n abortPromise?: Promise<boolean>;\n}\n\nexport interface OverlayOpenCloseDetail {\n interaction: TriggerInteractions;\n}\n\n/**\n * Used, via an event, to query details about how an element should be shown in\n * an overlay\n */\nexport interface OverlayDisplayQueryDetail {\n overlayRootName?: string;\n overlayRootElement?: HTMLElement;\n overlayContentTipElement?: HTMLElement;\n}\n\nexport type Placement = PopperPlacement | 'none';\n\nexport type OverlayOptions = {\n delayed?: boolean;\n placement?: Placement;\n offset?: number;\n receivesFocus?: 'auto';\n notImmediatelyClosable?: boolean;\n abortPromise?: Promise<boolean>;\n virtualTrigger?: VirtualTrigger;\n};\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-overlay-query': CustomEvent<OverlayDisplayQueryDetail>;\n 'sp-open': CustomEvent<OverlayOpenCloseDetail>;\n 'sp-close': CustomEvent<OverlayOpenCloseDetail>;\n }\n}\n"]}
1
+ {"version":3,"file":"overlay-types.js","sourceRoot":"","sources":["overlay-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE","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 type { Placement as FloatingUIPlacement } from '@floating-ui/dom';\nimport type { VirtualTrigger } from './VirtualTrigger.js';\n\nexport type TriggerInteractions =\n | 'click'\n | 'longpress'\n | 'hover'\n | 'custom'\n | 'replace'\n | 'inline'\n | 'modal';\n\nexport interface OverlayOpenDetail {\n content: HTMLElement;\n contentTip?: HTMLElement;\n delayed: boolean;\n offset: number;\n placement?: Placement;\n receivesFocus?: 'auto';\n virtualTrigger?: VirtualTrigger;\n trigger: HTMLElement;\n interaction: TriggerInteractions;\n theme: ThemeData;\n notImmediatelyClosable?: boolean;\n abortPromise?: Promise<boolean>;\n}\n\nexport interface OverlayOpenCloseDetail {\n interaction: TriggerInteractions;\n}\n\n/**\n * Used, via an event, to query details about how an element should be shown in\n * an overlay\n */\nexport interface OverlayDisplayQueryDetail {\n overlayRootName?: string;\n overlayRootElement?: HTMLElement;\n overlayContentTipElement?: HTMLElement;\n}\n\nexport type Placement = FloatingUIPlacement | 'none';\n\nexport type OverlayOptions = {\n delayed?: boolean;\n placement?: Placement;\n offset?: number;\n receivesFocus?: 'auto';\n notImmediatelyClosable?: boolean;\n abortPromise?: Promise<boolean>;\n virtualTrigger?: VirtualTrigger;\n};\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'sp-overlay-query': CustomEvent<OverlayDisplayQueryDetail>;\n 'sp-open': CustomEvent<OverlayOpenCloseDetail>;\n 'sp-close': CustomEvent<OverlayOpenCloseDetail>;\n }\n}\n"]}
package/src/overlay.js CHANGED
@@ -74,6 +74,7 @@ export class Overlay {
74
74
  color: undefined,
75
75
  scale: undefined,
76
76
  lang: undefined,
77
+ theme: undefined,
77
78
  };
78
79
  const queryThemeEvent = new CustomEvent('sp-query-theme', {
79
80
  bubbles: true,
@@ -1 +1 @@
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"]}
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"]}
@@ -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="cta"
232
+ variant="accent"
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=\"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"]}
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"]}
@@ -601,7 +601,7 @@ complexModal.decorators = [complexModalDecorator];
601
601
  export const superComplexModal = () => {
602
602
  return html `
603
603
  <overlay-trigger type="modal" placement="none">
604
- <sp-button slot="trigger" variant="cta">Toggle Dialog</sp-button>
604
+ <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
605
605
  <sp-popover dialog slot="click-content">
606
606
  <overlay-trigger>
607
607
  <sp-button slot="trigger" variant="primary">
@@ -707,7 +707,7 @@ export const virtualElement = (args) => {
707
707
  `;
708
708
  };
709
709
  virtualElement.args = {
710
- placement: 'right-end',
710
+ placement: 'right-start',
711
711
  };
712
712
  export const detachedElement = () => {
713
713
  let closeOverlay;