@spectrum-web-components/overlay 0.30.0 → 0.30.1-overlay.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +50 -21
- package/sp-overlay.d.ts +6 -0
- package/sp-overlay.dev.js +5 -0
- package/{active-overlay.dev.js.map → sp-overlay.dev.js.map} +3 -3
- package/sp-overlay.js +2 -0
- package/{active-overlay.js.map → sp-overlay.js.map} +4 -4
- package/src/Overlay.d.ts +28 -0
- package/src/Overlay.dev.js +87 -0
- package/src/Overlay.dev.js.map +7 -0
- package/src/Overlay.js +2 -0
- package/src/Overlay.js.map +7 -0
- package/src/OverlayBase.d.ts +117 -0
- package/src/OverlayBase.dev.js +681 -0
- package/src/OverlayBase.dev.js.map +7 -0
- package/src/OverlayBase.js +17 -0
- package/src/OverlayBase.js.map +7 -0
- package/src/OverlayDialog.d.ts +8 -0
- package/src/OverlayDialog.dev.js +150 -0
- package/src/OverlayDialog.dev.js.map +7 -0
- package/src/OverlayDialog.js +2 -0
- package/src/OverlayDialog.js.map +7 -0
- package/src/OverlayNoPopover.d.ts +8 -0
- package/src/OverlayNoPopover.dev.js +120 -0
- package/src/OverlayNoPopover.dev.js.map +7 -0
- package/src/OverlayNoPopover.js +2 -0
- package/src/OverlayNoPopover.js.map +7 -0
- package/src/OverlayPopover.d.ts +8 -0
- package/src/OverlayPopover.dev.js +167 -0
- package/src/OverlayPopover.dev.js.map +7 -0
- package/src/OverlayPopover.js +2 -0
- package/src/OverlayPopover.js.map +7 -0
- package/src/OverlayStack.d.ts +24 -0
- package/src/OverlayStack.dev.js +125 -0
- package/src/OverlayStack.dev.js.map +7 -0
- package/src/OverlayStack.js +2 -0
- package/src/OverlayStack.js.map +7 -0
- package/src/OverlayTrigger.d.ts +19 -31
- package/src/OverlayTrigger.dev.js +116 -245
- package/src/OverlayTrigger.dev.js.map +3 -3
- package/src/OverlayTrigger.js +52 -22
- package/src/OverlayTrigger.js.map +3 -3
- package/src/PlacementController.d.ts +36 -0
- package/src/PlacementController.dev.js +193 -0
- package/src/PlacementController.dev.js.map +7 -0
- package/src/PlacementController.js +2 -0
- package/src/PlacementController.js.map +7 -0
- package/src/VirtualTrigger.dev.js +0 -2
- package/src/VirtualTrigger.dev.js.map +2 -2
- package/src/VirtualTrigger.js +1 -1
- package/src/VirtualTrigger.js.map +3 -3
- package/src/fullSizePlugin.d.ts +12 -0
- package/src/fullSizePlugin.dev.js +39 -0
- package/src/fullSizePlugin.dev.js.map +7 -0
- package/src/fullSizePlugin.js +2 -0
- package/src/fullSizePlugin.js.map +7 -0
- package/src/index.d.ts +2 -3
- package/src/index.dev.js +2 -3
- package/src/index.dev.js.map +2 -2
- package/src/index.js +1 -1
- package/src/index.js.map +2 -2
- package/src/loader.d.ts +2 -2
- package/src/loader.dev.js +2 -19
- package/src/loader.dev.js.map +2 -2
- package/src/loader.js +1 -1
- package/src/loader.js.map +3 -3
- package/src/overlay-base.css.dev.js +9 -0
- package/src/overlay-base.css.dev.js.map +7 -0
- package/src/overlay-base.css.js +6 -0
- package/src/overlay-base.css.js.map +7 -0
- package/src/overlay-trigger.css.dev.js +1 -1
- package/src/overlay-trigger.css.dev.js.map +1 -1
- package/src/overlay-trigger.css.js +1 -1
- package/src/overlay-trigger.css.js.map +1 -1
- package/src/overlay-types.d.ts +3 -3
- package/src/overlay-types.dev.js +1 -0
- package/src/overlay-types.dev.js.map +3 -3
- package/src/overlay-types.js +1 -1
- package/src/overlay-types.js.map +3 -3
- package/src/placement.d.ts +21 -0
- package/src/placement.dev.js +111 -0
- package/src/placement.dev.js.map +7 -0
- package/src/placement.js +2 -0
- package/src/placement.js.map +7 -0
- package/src/topLayerOverTransforms.d.ts +22 -0
- package/src/topLayerOverTransforms.dev.js +165 -0
- package/src/topLayerOverTransforms.dev.js.map +7 -0
- package/src/topLayerOverTransforms.js +2 -0
- package/src/topLayerOverTransforms.js.map +7 -0
- package/stories/overlay-element.stories.js +230 -0
- package/stories/overlay-element.stories.js.map +7 -0
- package/stories/overlay-story-components.js +9 -8
- package/stories/overlay-story-components.js.map +2 -2
- package/stories/overlay.stories.js +672 -646
- package/stories/overlay.stories.js.map +2 -2
- package/sync/overlay-trigger.d.ts +4 -0
- package/sync/overlay-trigger.dev.js +1 -4
- package/sync/overlay-trigger.dev.js.map +2 -2
- package/sync/overlay-trigger.js +1 -1
- package/sync/overlay-trigger.js.map +3 -3
- package/test/benchmark/basic-test.js +1 -1
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/index.js +422 -375
- package/test/index.js.map +3 -3
- package/test/overlay-element.test-vrt.js +5 -0
- package/test/overlay-element.test-vrt.js.map +7 -0
- package/test/overlay-element.test.js +664 -0
- package/test/overlay-element.test.js.map +7 -0
- package/test/overlay-lifecycle.test.js +34 -106
- package/test/overlay-lifecycle.test.js.map +2 -2
- package/test/overlay-trigger-click.test.js +11 -5
- package/test/overlay-trigger-click.test.js.map +2 -2
- package/test/overlay-trigger-extended.test.js +1 -6
- package/test/overlay-trigger-extended.test.js.map +2 -2
- package/test/overlay-trigger-hover-click.test.js +22 -22
- package/test/overlay-trigger-hover-click.test.js.map +2 -2
- package/test/overlay-trigger-hover.test.js +40 -34
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +98 -80
- package/test/overlay-trigger-longpress.test.js.map +2 -2
- package/test/overlay-trigger-sync.test.js +1 -1
- package/test/overlay-trigger-sync.test.js.map +2 -2
- package/test/overlay-trigger.test.js +1 -1
- package/test/overlay-trigger.test.js.map +2 -2
- package/test/overlay-update.test.js +4 -4
- package/test/overlay-update.test.js.map +2 -2
- package/test/overlay.test.js +237 -235
- package/test/overlay.test.js.map +3 -3
- package/active-overlay.d.ts +0 -6
- package/active-overlay.dev.js +0 -5
- package/active-overlay.js +0 -2
- package/custom-elements.json +0 -1203
- package/src/ActiveOverlay.d.ts +0 -84
- package/src/ActiveOverlay.dev.js +0 -517
- package/src/ActiveOverlay.dev.js.map +0 -7
- package/src/ActiveOverlay.js +0 -16
- package/src/ActiveOverlay.js.map +0 -7
- package/src/active-overlay.css.dev.js +0 -13
- package/src/active-overlay.css.dev.js.map +0 -7
- package/src/active-overlay.css.js +0 -10
- package/src/active-overlay.css.js.map +0 -7
- package/src/overlay-stack.d.ts +0 -50
- package/src/overlay-stack.dev.js +0 -514
- package/src/overlay-stack.dev.js.map +0 -7
- package/src/overlay-stack.js +0 -33
- package/src/overlay-stack.js.map +0 -7
- package/src/overlay-utils.d.ts +0 -3
- package/src/overlay-utils.dev.js +0 -31
- package/src/overlay-utils.dev.js.map +0 -7
- package/src/overlay-utils.js +0 -2
- package/src/overlay-utils.js.map +0 -7
- package/src/overlay.d.ts +0 -59
- package/src/overlay.dev.js +0 -127
- package/src/overlay.dev.js.map +0 -7
- package/src/overlay.js +0 -2
- package/src/overlay.js.map +0 -7
- /package/src/{active-overlay.css.d.ts → overlay-base.css.d.ts} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayNoPopover.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n} from './OverlayBase.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayNoPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n await this.ensureOnDOM();\n const focusEl = await this.makeTransition(targetOpenState);\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n private async ensureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\n // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithNoPopover;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{firstFocusableIn as p,firstFocusableSlottedIn as h}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{BeforetoggleClosedEvent as f,BeforetoggleOpenEvent as v,guaranteedTransitionend as d}from"./OverlayBase.js";import{VirtualTrigger as l}from"./VirtualTrigger.js";function r(){return new Promise(a=>requestAnimationFrame(()=>a()))}export function OverlayNoPopover(a){class c extends a{async managePopoverOpen(){const t=this.open;await this.managePosition(),await this.ensureOnDOM();const e=await this.makeTransition(t);await this.applyFocus(t,e)}async ensureOnDOM(){await r(),await r()}async makeTransition(t){let e=null;const m=(n,o)=>()=>{if(t!==this.open)return;if(typeof n.open!="undefined"&&(n.open=t),o===0){const i=t?v:f;this.dispatchEvent(new i)}if(t!==!0||(e=e||p(n),e))return;n.querySelectorAll("slot").forEach(i=>{e||(e=h(i))})},u=(n,o)=>()=>{if(this.open!==t)return;const s=t?"sp-opened":"sp-closed";if(n.dispatchEvent(new Event(s,{bubbles:!1,composed:!1})),o>0)return;const i=this.triggerElement instanceof l;this.dispatchEvent(new Event(s,{bubbles:i,composed:i})),this.triggerElement&&!i&&this.triggerElement.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};return this.elements.forEach((n,o)=>{d(n,m(n,o),u(n,o))}),e}async applyFocus(t,e){if(this.receivesFocus!=="false"){if(await r(),await r(),t===this.open&&!this.open){this.type!=="hint"&&this.triggerElement&&!(this.triggerElement instanceof l)&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}e==null||e.focus()}}}return c}
|
|
2
|
+
//# sourceMappingURL=OverlayNoPopover.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayNoPopover.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n} from './OverlayBase.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayNoPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithNoPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n await this.ensureOnDOM();\n const focusEl = await this.makeTransition(targetOpenState);\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n private async ensureOnDOM(): Promise<void> {\n await nextFrame();\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (targetOpenState !== this.open) {\n return;\n }\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (targetOpenState !== true) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish = (el: OpenableElement, index: number) => (): void => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState ? 'sp-opened' : 'sp-closed';\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (index > 0) {\n return;\n }\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\n // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithNoPopover;\n}\n"],
|
|
5
|
+
"mappings": "aAWA,OACI,oBAAAA,EACA,2BAAAC,MACG,4DAEP,OACI,2BAAAC,EACA,yBAAAC,EACA,2BAAAC,MAGG,mBACP,OAAS,kBAAAC,MAAsB,sBAQ/B,SAASC,GAA2B,CAChC,OAAO,IAAI,QAASC,GAAQ,sBAAsB,IAAMA,EAAI,CAAC,CAAC,CAClE,CAEO,gBAAS,iBACZC,EACgC,CAChC,MAAMC,UAA6BD,CAAY,CAC3C,MAAyB,mBAAmC,CACxD,MAAME,EAAkB,KAAK,KAC7B,MAAM,KAAK,eAAe,EAC1B,MAAM,KAAK,YAAY,EACvB,MAAMC,EAAU,MAAM,KAAK,eAAeD,CAAe,EACzD,MAAM,KAAK,WAAWA,EAAiBC,CAAO,CAClD,CAEA,MAAc,aAA6B,CACvC,MAAML,EAAU,EAChB,MAAMA,EAAU,CACpB,CAEA,MAAc,eACVI,EAC2B,CAC3B,IAAIC,EAAU,KACd,MAAMC,EAAQ,CAACC,EAAqBC,IAAkB,IAAY,CAC9D,GAAIJ,IAAoB,KAAK,KACzB,OAKJ,GAHI,OAAOG,EAAG,MAAS,cACnBA,EAAG,KAAOH,GAEVI,IAAU,EAAG,CACb,MAAMC,EAAQL,EACRP,EACAD,EACN,KAAK,cAAc,IAAIa,CAAO,EAMlC,GAJIL,IAAoB,KAGxBC,EAAUA,GAAWX,EAAiBa,CAAE,EACpCF,GACA,OAEeE,EAAG,iBAAiB,MAAM,EAClC,QAASG,GAAS,CACpBL,IACDA,EAAUV,EAAwBe,CAAI,EAE9C,CAAC,CACL,EACMC,EAAS,CAACJ,EAAqBC,IAAkB,IAAY,CAC/D,GAAI,KAAK,OAASJ,EACd,OAEJ,MAAMQ,EAAYR,EAAkB,YAAc,YAOlD,GANAG,EAAG,cACC,IAAI,MAAMK,EAAW,CACjB,QAAS,GACT,SAAU,EACd,CAAC,CACL,EACIJ,EAAQ,EACR,OAEJ,MAAMK,EACF,KAAK,0BAA0Bd,EACnC,KAAK,cACD,IAAI,MAAMa,EAAW,CACjB,QAASC,EACT,SAAUA,CACd,CAAC,CACL,EACI,KAAK,gBAAkB,CAACA,GACvB,KAAK,eAA+B,cACjC,IAAI,YAAYD,EAAW,CACvB,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAK,IAAK,CACrC,CAAC,CACL,CAER,EACA,YAAK,SAAS,QAAQ,CAACL,EAAIC,IAAU,CACjCV,EACIS,EACAD,EAAMC,EAAIC,CAAK,EACfG,EAAOJ,EAAIC,CAAK,CACpB,CACJ,CAAC,EACMH,CACX,CAEA,MAAc,WACVD,EACAC,EACa,CACb,GAAI,KAAK,gBAAkB,QAM3B,IAFA,MAAML,EAAU,EAChB,MAAMA,EAAU,EACZI,IAAoB,KAAK,MAAQ,CAAC,KAAK,KAAM,CAGzC,KAAK,OAAS,QAEd,KAAK,gBACL,EAAE,KAAK,0BAA0BL,IAG7B,KAAK,SACA,KAAK,YAAY,EAAe,aACrC,GAEA,KAAK,eAAe,MAAM,EAGlC,OAGJM,GAAA,MAAAA,EAAS,QACb,CACJ,CACA,OAAOF,CACX",
|
|
6
|
+
"names": ["firstFocusableIn", "firstFocusableSlottedIn", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedTransitionend", "VirtualTrigger", "nextFrame", "res", "constructor", "OverlayWithNoPopover", "targetOpenState", "focusEl", "start", "el", "index", "event", "slot", "finish", "eventName", "hasVirtualTrigger"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactiveElement } from 'lit';
|
|
2
|
+
import { OverlayBase } from './OverlayBase.js';
|
|
3
|
+
declare type Constructor<T = Record<string, unknown>> = {
|
|
4
|
+
new (...args: any[]): T;
|
|
5
|
+
prototype: T;
|
|
6
|
+
};
|
|
7
|
+
export declare function OverlayPopover<T extends Constructor<OverlayBase>>(constructor: T): T & Constructor<ReactiveElement>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import {
|
|
3
|
+
firstFocusableIn,
|
|
4
|
+
firstFocusableSlottedIn
|
|
5
|
+
} from "@spectrum-web-components/shared/src/first-focusable-in.js";
|
|
6
|
+
import {
|
|
7
|
+
BeforetoggleClosedEvent,
|
|
8
|
+
BeforetoggleOpenEvent,
|
|
9
|
+
guaranteedTransitionend
|
|
10
|
+
} from "./OverlayBase.dev.js";
|
|
11
|
+
import { VirtualTrigger } from "./VirtualTrigger.dev.js";
|
|
12
|
+
function nextFrame() {
|
|
13
|
+
return new Promise((res) => requestAnimationFrame(() => res()));
|
|
14
|
+
}
|
|
15
|
+
export function OverlayPopover(constructor) {
|
|
16
|
+
class OverlayWithPopover extends constructor {
|
|
17
|
+
async managePopoverOpen() {
|
|
18
|
+
const targetOpenState = this.open;
|
|
19
|
+
await this.managePosition();
|
|
20
|
+
await this.ensureOnDOM(targetOpenState);
|
|
21
|
+
const focusEl = await this.makeTransition(targetOpenState);
|
|
22
|
+
await this.applyFocus(targetOpenState, focusEl);
|
|
23
|
+
}
|
|
24
|
+
async ensureOnDOM(targetOpenState) {
|
|
25
|
+
await nextFrame();
|
|
26
|
+
let popoverOpen = false;
|
|
27
|
+
try {
|
|
28
|
+
popoverOpen = this.dialogEl.matches(":popover-open");
|
|
29
|
+
} catch (error) {
|
|
30
|
+
}
|
|
31
|
+
let open = false;
|
|
32
|
+
try {
|
|
33
|
+
open = this.dialogEl.matches(":open");
|
|
34
|
+
} catch (error) {
|
|
35
|
+
}
|
|
36
|
+
if (targetOpenState && this.open === targetOpenState && !popoverOpen && !open && this.isConnected) {
|
|
37
|
+
this.dialogEl.showPopover();
|
|
38
|
+
}
|
|
39
|
+
await nextFrame();
|
|
40
|
+
}
|
|
41
|
+
async makeTransition(targetOpenState) {
|
|
42
|
+
let focusEl = null;
|
|
43
|
+
const start = (el, index) => () => {
|
|
44
|
+
if (typeof el.open !== "undefined") {
|
|
45
|
+
el.open = targetOpenState;
|
|
46
|
+
}
|
|
47
|
+
if (index === 0) {
|
|
48
|
+
const event = targetOpenState ? BeforetoggleOpenEvent : BeforetoggleClosedEvent;
|
|
49
|
+
this.dispatchEvent(new event());
|
|
50
|
+
}
|
|
51
|
+
if (!targetOpenState) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
focusEl = focusEl || firstFocusableIn(el);
|
|
55
|
+
if (focusEl) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const childSlots = el.querySelectorAll("slot");
|
|
59
|
+
childSlots.forEach((slot) => {
|
|
60
|
+
if (!focusEl) {
|
|
61
|
+
focusEl = firstFocusableSlottedIn(slot);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const finish = (el, index) => async () => {
|
|
66
|
+
if (this.open !== targetOpenState) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const eventName = targetOpenState ? "sp-opened" : "sp-closed";
|
|
70
|
+
if (index > 0) {
|
|
71
|
+
el.dispatchEvent(
|
|
72
|
+
new Event(eventName, {
|
|
73
|
+
bubbles: false,
|
|
74
|
+
composed: false
|
|
75
|
+
})
|
|
76
|
+
);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const reportChange = async () => {
|
|
80
|
+
if (this.open !== targetOpenState) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await nextFrame();
|
|
84
|
+
const hasVirtualTrigger = this.triggerElement instanceof VirtualTrigger;
|
|
85
|
+
this.dispatchEvent(
|
|
86
|
+
new Event(eventName, {
|
|
87
|
+
bubbles: hasVirtualTrigger,
|
|
88
|
+
composed: hasVirtualTrigger
|
|
89
|
+
})
|
|
90
|
+
);
|
|
91
|
+
el.dispatchEvent(
|
|
92
|
+
new Event(eventName, {
|
|
93
|
+
bubbles: false,
|
|
94
|
+
composed: false
|
|
95
|
+
})
|
|
96
|
+
);
|
|
97
|
+
if (this.triggerElement && !hasVirtualTrigger) {
|
|
98
|
+
this.triggerElement.dispatchEvent(
|
|
99
|
+
new CustomEvent(eventName, {
|
|
100
|
+
bubbles: true,
|
|
101
|
+
composed: true,
|
|
102
|
+
detail: { interaction: this.type }
|
|
103
|
+
})
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
if (this.open !== targetOpenState) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let popoverOpen = false;
|
|
111
|
+
try {
|
|
112
|
+
popoverOpen = this.dialogEl.matches(":popover-open");
|
|
113
|
+
} catch (error) {
|
|
114
|
+
}
|
|
115
|
+
let open = false;
|
|
116
|
+
try {
|
|
117
|
+
open = this.dialogEl.matches(":open");
|
|
118
|
+
} catch (error) {
|
|
119
|
+
}
|
|
120
|
+
if (targetOpenState !== true && (popoverOpen || open) && this.isConnected) {
|
|
121
|
+
this.dialogEl.addEventListener(
|
|
122
|
+
"beforetoggle",
|
|
123
|
+
() => {
|
|
124
|
+
reportChange();
|
|
125
|
+
},
|
|
126
|
+
{ once: true }
|
|
127
|
+
);
|
|
128
|
+
this.dialogEl.hidePopover();
|
|
129
|
+
} else {
|
|
130
|
+
reportChange();
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
this.elements.forEach((el, index) => {
|
|
134
|
+
guaranteedTransitionend(
|
|
135
|
+
el,
|
|
136
|
+
start(el, index),
|
|
137
|
+
finish(el, index)
|
|
138
|
+
);
|
|
139
|
+
});
|
|
140
|
+
return focusEl;
|
|
141
|
+
}
|
|
142
|
+
async applyFocus(targetOpenState, focusEl) {
|
|
143
|
+
if (this.receivesFocus === "false") {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
await nextFrame();
|
|
147
|
+
await nextFrame();
|
|
148
|
+
if (targetOpenState === this.open && !this.open) {
|
|
149
|
+
if (
|
|
150
|
+
// Do not return focus to trigger when overlay is a "hint" (tooltip)
|
|
151
|
+
this.type !== "hint" && // Only return focus when the trigger is not "virtual"
|
|
152
|
+
this.triggerElement && !(this.triggerElement instanceof VirtualTrigger)
|
|
153
|
+
) {
|
|
154
|
+
if (this.contains(
|
|
155
|
+
this.getRootNode().activeElement
|
|
156
|
+
)) {
|
|
157
|
+
this.triggerElement.focus();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
focusEl == null ? void 0 : focusEl.focus();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return OverlayWithPopover;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=OverlayPopover.dev.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayPopover.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n} from './OverlayBase.dev.js'\nimport { VirtualTrigger } from './VirtualTrigger.dev.js'\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n await this.ensureOnDOM(targetOpenState);\n const focusEl = await this.makeTransition(targetOpenState);\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n private async ensureOnDOM(targetOpenState: boolean): Promise<void> {\n await nextFrame();\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n }\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n if (index > 0) {\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\n // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithPopover;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{firstFocusableIn as f,firstFocusableSlottedIn as v}from"@spectrum-web-components/shared/src/first-focusable-in.js";import{BeforetoggleClosedEvent as E,BeforetoggleOpenEvent as g,guaranteedTransitionend as b}from"./OverlayBase.js";import{VirtualTrigger as u}from"./VirtualTrigger.js";function a(){return new Promise(c=>requestAnimationFrame(()=>c()))}export function OverlayPopover(c){class d extends c{async managePopoverOpen(){const e=this.open;await this.managePosition(),await this.ensureOnDOM(e);const t=await this.makeTransition(e);await this.applyFocus(e,t)}async ensureOnDOM(e){await a();let t=!1;try{t=this.dialogEl.matches(":popover-open")}catch(p){}let l=!1;try{l=this.dialogEl.matches(":open")}catch(p){}e&&this.open===e&&!t&&!l&&this.isConnected&&this.dialogEl.showPopover(),await a()}async makeTransition(e){let t=null;const l=(o,n)=>()=>{if(typeof o.open!="undefined"&&(o.open=e),n===0){const i=e?g:E;this.dispatchEvent(new i)}if(!e||(t=t||f(o),t))return;o.querySelectorAll("slot").forEach(i=>{t||(t=v(i))})},p=(o,n)=>async()=>{if(this.open!==e)return;const s=e?"sp-opened":"sp-closed";if(n>0){o.dispatchEvent(new Event(s,{bubbles:!1,composed:!1}));return}const i=async()=>{if(this.open!==e)return;await a();const r=this.triggerElement instanceof u;this.dispatchEvent(new Event(s,{bubbles:r,composed:r})),o.dispatchEvent(new Event(s,{bubbles:!1,composed:!1})),this.triggerElement&&!r&&this.triggerElement.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,detail:{interaction:this.type}}))};if(this.open!==e)return;let h=!1;try{h=this.dialogEl.matches(":popover-open")}catch(r){}let m=!1;try{m=this.dialogEl.matches(":open")}catch(r){}e!==!0&&(h||m)&&this.isConnected?(this.dialogEl.addEventListener("beforetoggle",()=>{i()},{once:!0}),this.dialogEl.hidePopover()):i()};return this.elements.forEach((o,n)=>{b(o,l(o,n),p(o,n))}),t}async applyFocus(e,t){if(this.receivesFocus!=="false"){if(await a(),await a(),e===this.open&&!this.open){this.type!=="hint"&&this.triggerElement&&!(this.triggerElement instanceof u)&&this.contains(this.getRootNode().activeElement)&&this.triggerElement.focus();return}t==null||t.focus()}}}return d}
|
|
2
|
+
//# sourceMappingURL=OverlayPopover.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayPopover.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n firstFocusableIn,\n firstFocusableSlottedIn,\n} from '@spectrum-web-components/shared/src/first-focusable-in.js';\nimport { ReactiveElement } from 'lit';\nimport {\n BeforetoggleClosedEvent,\n BeforetoggleOpenEvent,\n guaranteedTransitionend,\n OpenableElement,\n OverlayBase,\n} from './OverlayBase.js';\nimport { VirtualTrigger } from './VirtualTrigger.js';\n\ntype Constructor<T = Record<string, unknown>> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): T;\n prototype: T;\n};\n\nfunction nextFrame(): Promise<void> {\n return new Promise((res) => requestAnimationFrame(() => res()));\n}\n\nexport function OverlayPopover<T extends Constructor<OverlayBase>>(\n constructor: T\n): T & Constructor<ReactiveElement> {\n class OverlayWithPopover extends constructor {\n protected override async managePopoverOpen(): Promise<void> {\n const targetOpenState = this.open;\n await this.managePosition();\n await this.ensureOnDOM(targetOpenState);\n const focusEl = await this.makeTransition(targetOpenState);\n await this.applyFocus(targetOpenState, focusEl);\n }\n\n private async ensureOnDOM(targetOpenState: boolean): Promise<void> {\n await nextFrame();\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState &&\n this.open === targetOpenState &&\n !popoverOpen &&\n !open &&\n this.isConnected\n ) {\n this.dialogEl.showPopover();\n }\n await nextFrame();\n }\n\n private async makeTransition(\n targetOpenState: boolean\n ): Promise<HTMLElement | null> {\n let focusEl = null as HTMLElement | null;\n const start = (el: OpenableElement, index: number) => (): void => {\n if (typeof el.open !== 'undefined') {\n el.open = targetOpenState;\n }\n if (index === 0) {\n const event = targetOpenState\n ? BeforetoggleOpenEvent\n : BeforetoggleClosedEvent;\n this.dispatchEvent(new event());\n }\n if (!targetOpenState) {\n return;\n }\n focusEl = focusEl || firstFocusableIn(el);\n if (focusEl) {\n return;\n }\n const childSlots = el.querySelectorAll('slot');\n childSlots.forEach((slot) => {\n if (!focusEl) {\n focusEl = firstFocusableSlottedIn(slot);\n }\n });\n };\n const finish =\n (el: OpenableElement, index: number) =>\n async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n const eventName = targetOpenState\n ? 'sp-opened'\n : 'sp-closed';\n if (index > 0) {\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n return;\n }\n const reportChange = async (): Promise<void> => {\n if (this.open !== targetOpenState) {\n return;\n }\n await nextFrame();\n const hasVirtualTrigger =\n this.triggerElement instanceof VirtualTrigger;\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: hasVirtualTrigger,\n composed: hasVirtualTrigger,\n })\n );\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n if (this.triggerElement && !hasVirtualTrigger) {\n (this.triggerElement as HTMLElement).dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n detail: { interaction: this.type },\n })\n );\n }\n };\n if (this.open !== targetOpenState) {\n return;\n }\n let popoverOpen = false;\n try {\n popoverOpen = this.dialogEl.matches(':popover-open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n let open = false;\n try {\n open = this.dialogEl.matches(':open');\n // eslint-disable-next-line no-empty\n } catch (error) {}\n if (\n targetOpenState !== true &&\n (popoverOpen || open) &&\n this.isConnected\n ) {\n this.dialogEl.addEventListener(\n 'beforetoggle',\n () => {\n reportChange();\n },\n { once: true }\n );\n this.dialogEl.hidePopover();\n } else {\n reportChange();\n }\n };\n this.elements.forEach((el, index) => {\n guaranteedTransitionend(\n el,\n start(el, index),\n finish(el, index)\n );\n });\n return focusEl;\n }\n\n private async applyFocus(\n targetOpenState: boolean,\n focusEl: HTMLElement | null\n ): Promise<void> {\n if (this.receivesFocus === 'false') {\n return;\n }\n\n await nextFrame();\n await nextFrame();\n if (targetOpenState === this.open && !this.open) {\n if (\n // Do not return focus to trigger when overlay is a \"hint\" (tooltip)\n this.type !== 'hint' &&\n // Only return focus when the trigger is not \"virtual\"\n this.triggerElement &&\n !(this.triggerElement instanceof VirtualTrigger)\n ) {\n if (\n this.contains(\n (this.getRootNode() as Document).activeElement\n )\n ) {\n this.triggerElement.focus();\n }\n }\n return;\n }\n\n focusEl?.focus();\n }\n }\n return OverlayWithPopover;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["firstFocusableIn", "firstFocusableSlottedIn", "BeforetoggleClosedEvent", "BeforetoggleOpenEvent", "guaranteedTransitionend", "VirtualTrigger", "nextFrame", "res", "constructor", "OverlayWithPopover", "targetOpenState", "focusEl", "popoverOpen", "error", "open", "start", "el", "index", "event", "slot", "finish", "eventName", "reportChange", "hasVirtualTrigger"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OverlayBase } from './OverlayBase.js';
|
|
2
|
+
declare class OverlayStack {
|
|
3
|
+
private get document();
|
|
4
|
+
private root;
|
|
5
|
+
stack: OverlayBase[];
|
|
6
|
+
constructor();
|
|
7
|
+
bindEvents(): void;
|
|
8
|
+
private closeOverlay;
|
|
9
|
+
handleClick: (event: Event) => void;
|
|
10
|
+
handleBeforetoggle: (event: Event) => void;
|
|
11
|
+
private handleKeydown;
|
|
12
|
+
/**
|
|
13
|
+
* When overlays are added manage the open state of exisiting overlays appropriately:
|
|
14
|
+
* - 'modal': should close other overlays
|
|
15
|
+
* - 'page': should close other overlays
|
|
16
|
+
* - 'hint': shouldn't close other overlays
|
|
17
|
+
* - 'auto': should close other 'auto' overlays and other 'hint' overlays, but not 'manual' overlays
|
|
18
|
+
* - 'manual': shouldn't close other overlays
|
|
19
|
+
*/
|
|
20
|
+
add(overlay: OverlayBase): void;
|
|
21
|
+
remove(overlay: OverlayBase): void;
|
|
22
|
+
}
|
|
23
|
+
export declare const overlayStack: OverlayStack;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const supportsPopover = "showPopover" in document.createElement("div");
|
|
3
|
+
class OverlayStack {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.root = document.body;
|
|
6
|
+
this.stack = [];
|
|
7
|
+
this.handleClick = (event) => {
|
|
8
|
+
if (!this.stack.length)
|
|
9
|
+
return;
|
|
10
|
+
let reverseIndex = -1;
|
|
11
|
+
let overlay = this.stack.at(reverseIndex);
|
|
12
|
+
if (overlay == null ? void 0 : overlay.shouldPreventClose())
|
|
13
|
+
return;
|
|
14
|
+
const composedPath = event.composedPath();
|
|
15
|
+
let shouldClose;
|
|
16
|
+
while (overlay && !shouldClose) {
|
|
17
|
+
shouldClose = overlay.shouldPreventClose() || !composedPath.find(
|
|
18
|
+
(el) => el === overlay || el === (overlay == null ? void 0 : overlay.triggerElement)
|
|
19
|
+
);
|
|
20
|
+
if (!shouldClose) {
|
|
21
|
+
reverseIndex -= 1;
|
|
22
|
+
overlay = this.stack.at(reverseIndex);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!shouldClose || !overlay) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.closeOverlay(overlay);
|
|
29
|
+
let parentToClose = overlay.parentOverlayToForceClose;
|
|
30
|
+
while (parentToClose) {
|
|
31
|
+
this.closeOverlay(parentToClose);
|
|
32
|
+
parentToClose = parentToClose.parentOverlayToForceClose;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
this.handleBeforetoggle = (event) => {
|
|
36
|
+
const { target, newState: open } = event;
|
|
37
|
+
if (open === "open")
|
|
38
|
+
return;
|
|
39
|
+
this.closeOverlay(target);
|
|
40
|
+
};
|
|
41
|
+
this.handleKeydown = (event) => {
|
|
42
|
+
if (event.code !== "Escape")
|
|
43
|
+
return;
|
|
44
|
+
if (supportsPopover)
|
|
45
|
+
return;
|
|
46
|
+
if (!this.stack.length)
|
|
47
|
+
return;
|
|
48
|
+
const last = this.stack.at(-1);
|
|
49
|
+
if (!last)
|
|
50
|
+
return;
|
|
51
|
+
this.closeOverlay(last);
|
|
52
|
+
};
|
|
53
|
+
this.bindEvents();
|
|
54
|
+
}
|
|
55
|
+
get document() {
|
|
56
|
+
return this.root.ownerDocument || document;
|
|
57
|
+
}
|
|
58
|
+
bindEvents() {
|
|
59
|
+
this.document.addEventListener("pointerup", this.handleClick);
|
|
60
|
+
this.document.addEventListener("keydown", this.handleKeydown);
|
|
61
|
+
}
|
|
62
|
+
closeOverlay(overlay) {
|
|
63
|
+
const overlayIndex = this.stack.indexOf(overlay);
|
|
64
|
+
if (overlayIndex > -1) {
|
|
65
|
+
this.stack.splice(overlayIndex, 1);
|
|
66
|
+
}
|
|
67
|
+
overlay.open = false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* When overlays are added manage the open state of exisiting overlays appropriately:
|
|
71
|
+
* - 'modal': should close other overlays
|
|
72
|
+
* - 'page': should close other overlays
|
|
73
|
+
* - 'hint': shouldn't close other overlays
|
|
74
|
+
* - 'auto': should close other 'auto' overlays and other 'hint' overlays, but not 'manual' overlays
|
|
75
|
+
* - 'manual': shouldn't close other overlays
|
|
76
|
+
*/
|
|
77
|
+
add(overlay) {
|
|
78
|
+
if (this.stack.includes(overlay)) {
|
|
79
|
+
const overlayIndex = this.stack.indexOf(overlay);
|
|
80
|
+
if (overlayIndex > -1) {
|
|
81
|
+
this.stack.splice(overlayIndex, 1);
|
|
82
|
+
this.stack.push(overlay);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (overlay.type === "auto" || overlay.type === "modal" || overlay.type === "page") {
|
|
87
|
+
const queryPathEventName = "sp-overlay-query-path";
|
|
88
|
+
const queryPathEvent = new Event(queryPathEventName, {
|
|
89
|
+
composed: true,
|
|
90
|
+
bubbles: true
|
|
91
|
+
});
|
|
92
|
+
overlay.addEventListener(
|
|
93
|
+
queryPathEventName,
|
|
94
|
+
(event) => {
|
|
95
|
+
const path = event.composedPath();
|
|
96
|
+
this.stack.forEach((overlayEl) => {
|
|
97
|
+
const inPath = path.find((el) => el === overlayEl);
|
|
98
|
+
if (!inPath && overlayEl.type !== "manual") {
|
|
99
|
+
this.closeOverlay(overlayEl);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
{ once: true }
|
|
104
|
+
);
|
|
105
|
+
overlay.dispatchEvent(queryPathEvent);
|
|
106
|
+
} else if (overlay.type === "hint") {
|
|
107
|
+
this.stack.forEach((overlayEl) => {
|
|
108
|
+
if (overlayEl.type === "hint") {
|
|
109
|
+
this.closeOverlay(overlayEl);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
requestAnimationFrame(() => {
|
|
114
|
+
this.stack.push(overlay);
|
|
115
|
+
overlay.addEventListener("beforetoggle", this.handleBeforetoggle, {
|
|
116
|
+
once: true
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
remove(overlay) {
|
|
121
|
+
this.closeOverlay(overlay);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const overlayStack = new OverlayStack();
|
|
125
|
+
//# sourceMappingURL=OverlayStack.dev.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayStack.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2023 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\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 { OverlayBase } from './OverlayBase.dev.js'\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nclass OverlayStack {\n private get document(): Document {\n return this.root.ownerDocument /* c8 ignore next */ || document;\n }\n\n private root: HTMLElement = document.body;\n\n stack: OverlayBase[] = [];\n\n constructor() {\n this.bindEvents();\n }\n\n bindEvents(): void {\n this.document.addEventListener('pointerup', this.handleClick);\n this.document.addEventListener('keydown', this.handleKeydown);\n }\n\n private closeOverlay(overlay: OverlayBase): void {\n const overlayIndex = this.stack.indexOf(overlay);\n if (overlayIndex > -1) {\n this.stack.splice(overlayIndex, 1);\n }\n overlay.open = false;\n }\n\n handleClick = (event: Event): void => {\n if (!this.stack.length) return;\n\n let reverseIndex = -1;\n let overlay = this.stack.at(reverseIndex);\n if (overlay?.shouldPreventClose()) return;\n\n const composedPath = event.composedPath();\n let shouldClose;\n while (overlay && !shouldClose) {\n shouldClose =\n overlay.shouldPreventClose() ||\n !composedPath.find(\n (el) => el === overlay || el === overlay?.triggerElement\n );\n if (!shouldClose) {\n reverseIndex -= 1;\n overlay = this.stack.at(reverseIndex);\n }\n }\n if (!shouldClose || !overlay) {\n return;\n }\n\n this.closeOverlay(overlay);\n let parentToClose = overlay.parentOverlayToForceClose;\n while (parentToClose) {\n this.closeOverlay(parentToClose);\n parentToClose = parentToClose.parentOverlayToForceClose;\n }\n };\n\n handleBeforetoggle = (event: Event): void => {\n const { target, newState: open } = event as Event & {\n newState: string;\n };\n if (open === 'open') return;\n this.closeOverlay(target as OverlayBase);\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.code !== 'Escape') return;\n if (supportsPopover) return;\n if (!this.stack.length) return;\n\n const last = this.stack.at(-1);\n if (!last) return;\n this.closeOverlay(last);\n };\n\n /**\n * When overlays are added manage the open state of exisiting overlays appropriately:\n * - 'modal': should close other overlays\n * - 'page': should close other overlays\n * - 'hint': shouldn't close other overlays\n * - 'auto': should close other 'auto' overlays and other 'hint' overlays, but not 'manual' overlays\n * - 'manual': shouldn't close other overlays\n */\n add(overlay: OverlayBase): void {\n if (this.stack.includes(overlay)) {\n const overlayIndex = this.stack.indexOf(overlay);\n if (overlayIndex > -1) {\n this.stack.splice(overlayIndex, 1);\n this.stack.push(overlay);\n }\n return;\n }\n if (\n overlay.type === 'auto' ||\n overlay.type === 'modal' ||\n overlay.type === 'page'\n ) {\n // manage closing open overlays\n const queryPathEventName = 'sp-overlay-query-path';\n const queryPathEvent = new Event(queryPathEventName, {\n composed: true,\n bubbles: true,\n });\n overlay.addEventListener(\n queryPathEventName,\n (event: Event) => {\n const path = event.composedPath();\n this.stack.forEach((overlayEl) => {\n const inPath = path.find((el) => el === overlayEl);\n if (!inPath && overlayEl.type !== 'manual') {\n this.closeOverlay(overlayEl);\n }\n });\n },\n { once: true }\n );\n overlay.dispatchEvent(queryPathEvent);\n } else if (overlay.type === 'hint') {\n this.stack.forEach((overlayEl) => {\n if (overlayEl.type === 'hint') {\n this.closeOverlay(overlayEl);\n }\n });\n }\n requestAnimationFrame(() => {\n this.stack.push(overlay);\n overlay.addEventListener('beforetoggle', this.handleBeforetoggle, {\n once: true,\n });\n });\n }\n\n remove(overlay: OverlayBase): void {\n this.closeOverlay(overlay);\n }\n}\n\nexport const overlayStack = new OverlayStack();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const c="showPopover"in document.createElement("div");class h{constructor(){this.root=document.body;this.stack=[];this.handleClick=e=>{if(!this.stack.length)return;let t=-1,s=this.stack.at(t);if(s!=null&&s.shouldPreventClose())return;const o=e.composedPath();let i;for(;s&&!i;)i=s.shouldPreventClose()||!o.find(a=>a===s||a===(s==null?void 0:s.triggerElement)),i||(t-=1,s=this.stack.at(t));if(!i||!s)return;this.closeOverlay(s);let n=s.parentOverlayToForceClose;for(;n;)this.closeOverlay(n),n=n.parentOverlayToForceClose};this.handleBeforetoggle=e=>{const{target:t,newState:s}=e;s!=="open"&&this.closeOverlay(t)};this.handleKeydown=e=>{if(e.code!=="Escape"||c||!this.stack.length)return;const t=this.stack.at(-1);t&&this.closeOverlay(t)};this.bindEvents()}get document(){return this.root.ownerDocument||document}bindEvents(){this.document.addEventListener("pointerup",this.handleClick),this.document.addEventListener("keydown",this.handleKeydown)}closeOverlay(e){const t=this.stack.indexOf(e);t>-1&&this.stack.splice(t,1),e.open=!1}add(e){if(this.stack.includes(e)){const t=this.stack.indexOf(e);t>-1&&(this.stack.splice(t,1),this.stack.push(e));return}if(e.type==="auto"||e.type==="modal"||e.type==="page"){const t="sp-overlay-query-path",s=new Event(t,{composed:!0,bubbles:!0});e.addEventListener(t,o=>{const i=o.composedPath();this.stack.forEach(n=>{!i.find(r=>r===n)&&n.type!=="manual"&&this.closeOverlay(n)})},{once:!0}),e.dispatchEvent(s)}else e.type==="hint"&&this.stack.forEach(t=>{t.type==="hint"&&this.closeOverlay(t)});requestAnimationFrame(()=>{this.stack.push(e),e.addEventListener("beforetoggle",this.handleBeforetoggle,{once:!0})})}remove(e){this.closeOverlay(e)}}export const overlayStack=new h;
|
|
2
|
+
//# sourceMappingURL=OverlayStack.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["OverlayStack.ts"],
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2023 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\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 { OverlayBase } from './OverlayBase.js';\n\nconst supportsPopover = 'showPopover' in document.createElement('div');\n\nclass OverlayStack {\n private get document(): Document {\n return this.root.ownerDocument /* c8 ignore next */ || document;\n }\n\n private root: HTMLElement = document.body;\n\n stack: OverlayBase[] = [];\n\n constructor() {\n this.bindEvents();\n }\n\n bindEvents(): void {\n this.document.addEventListener('pointerup', this.handleClick);\n this.document.addEventListener('keydown', this.handleKeydown);\n }\n\n private closeOverlay(overlay: OverlayBase): void {\n const overlayIndex = this.stack.indexOf(overlay);\n if (overlayIndex > -1) {\n this.stack.splice(overlayIndex, 1);\n }\n overlay.open = false;\n }\n\n handleClick = (event: Event): void => {\n if (!this.stack.length) return;\n\n let reverseIndex = -1;\n let overlay = this.stack.at(reverseIndex);\n if (overlay?.shouldPreventClose()) return;\n\n const composedPath = event.composedPath();\n let shouldClose;\n while (overlay && !shouldClose) {\n shouldClose =\n overlay.shouldPreventClose() ||\n !composedPath.find(\n (el) => el === overlay || el === overlay?.triggerElement\n );\n if (!shouldClose) {\n reverseIndex -= 1;\n overlay = this.stack.at(reverseIndex);\n }\n }\n if (!shouldClose || !overlay) {\n return;\n }\n\n this.closeOverlay(overlay);\n let parentToClose = overlay.parentOverlayToForceClose;\n while (parentToClose) {\n this.closeOverlay(parentToClose);\n parentToClose = parentToClose.parentOverlayToForceClose;\n }\n };\n\n handleBeforetoggle = (event: Event): void => {\n const { target, newState: open } = event as Event & {\n newState: string;\n };\n if (open === 'open') return;\n this.closeOverlay(target as OverlayBase);\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.code !== 'Escape') return;\n if (supportsPopover) return;\n if (!this.stack.length) return;\n\n const last = this.stack.at(-1);\n if (!last) return;\n this.closeOverlay(last);\n };\n\n /**\n * When overlays are added manage the open state of exisiting overlays appropriately:\n * - 'modal': should close other overlays\n * - 'page': should close other overlays\n * - 'hint': shouldn't close other overlays\n * - 'auto': should close other 'auto' overlays and other 'hint' overlays, but not 'manual' overlays\n * - 'manual': shouldn't close other overlays\n */\n add(overlay: OverlayBase): void {\n if (this.stack.includes(overlay)) {\n const overlayIndex = this.stack.indexOf(overlay);\n if (overlayIndex > -1) {\n this.stack.splice(overlayIndex, 1);\n this.stack.push(overlay);\n }\n return;\n }\n if (\n overlay.type === 'auto' ||\n overlay.type === 'modal' ||\n overlay.type === 'page'\n ) {\n // manage closing open overlays\n const queryPathEventName = 'sp-overlay-query-path';\n const queryPathEvent = new Event(queryPathEventName, {\n composed: true,\n bubbles: true,\n });\n overlay.addEventListener(\n queryPathEventName,\n (event: Event) => {\n const path = event.composedPath();\n this.stack.forEach((overlayEl) => {\n const inPath = path.find((el) => el === overlayEl);\n if (!inPath && overlayEl.type !== 'manual') {\n this.closeOverlay(overlayEl);\n }\n });\n },\n { once: true }\n );\n overlay.dispatchEvent(queryPathEvent);\n } else if (overlay.type === 'hint') {\n this.stack.forEach((overlayEl) => {\n if (overlayEl.type === 'hint') {\n this.closeOverlay(overlayEl);\n }\n });\n }\n requestAnimationFrame(() => {\n this.stack.push(overlay);\n overlay.addEventListener('beforetoggle', this.handleBeforetoggle, {\n once: true,\n });\n });\n }\n\n remove(overlay: OverlayBase): void {\n this.closeOverlay(overlay);\n }\n}\n\nexport const overlayStack = new OverlayStack();\n"],
|
|
5
|
+
"mappings": "aAaA,MAAMA,EAAkB,gBAAiB,SAAS,cAAc,KAAK,EAErE,MAAMC,CAAa,CASf,aAAc,CAJd,KAAQ,KAAoB,SAAS,KAErC,WAAuB,CAAC,EAmBxB,iBAAeC,GAAuB,CAClC,GAAI,CAAC,KAAK,MAAM,OAAQ,OAExB,IAAIC,EAAe,GACfC,EAAU,KAAK,MAAM,GAAGD,CAAY,EACxC,GAAIC,GAAA,MAAAA,EAAS,qBAAsB,OAEnC,MAAMC,EAAeH,EAAM,aAAa,EACxC,IAAII,EACJ,KAAOF,GAAW,CAACE,GACfA,EACIF,EAAQ,mBAAmB,GAC3B,CAACC,EAAa,KACTE,GAAOA,IAAOH,GAAWG,KAAOH,GAAA,YAAAA,EAAS,eAC9C,EACCE,IACDH,GAAgB,EAChBC,EAAU,KAAK,MAAM,GAAGD,CAAY,GAG5C,GAAI,CAACG,GAAe,CAACF,EACjB,OAGJ,KAAK,aAAaA,CAAO,EACzB,IAAII,EAAgBJ,EAAQ,0BAC5B,KAAOI,GACH,KAAK,aAAaA,CAAa,EAC/BA,EAAgBA,EAAc,yBAEtC,EAEA,wBAAsBN,GAAuB,CACzC,KAAM,CAAE,OAAAO,EAAQ,SAAUC,CAAK,EAAIR,EAG/BQ,IAAS,QACb,KAAK,aAAaD,CAAqB,CAC3C,EAEA,KAAQ,cAAiBP,GAA+B,CAGpD,GAFIA,EAAM,OAAS,UACfF,GACA,CAAC,KAAK,MAAM,OAAQ,OAExB,MAAMW,EAAO,KAAK,MAAM,GAAG,EAAE,EACxBA,GACL,KAAK,aAAaA,CAAI,CAC1B,EAhEI,KAAK,WAAW,CACpB,CAVA,IAAY,UAAqB,CAC7B,OAAO,KAAK,KAAK,eAAsC,QAC3D,CAUA,YAAmB,CACf,KAAK,SAAS,iBAAiB,YAAa,KAAK,WAAW,EAC5D,KAAK,SAAS,iBAAiB,UAAW,KAAK,aAAa,CAChE,CAEQ,aAAaP,EAA4B,CAC7C,MAAMQ,EAAe,KAAK,MAAM,QAAQR,CAAO,EAC3CQ,EAAe,IACf,KAAK,MAAM,OAAOA,EAAc,CAAC,EAErCR,EAAQ,KAAO,EACnB,CA4DA,IAAIA,EAA4B,CAC5B,GAAI,KAAK,MAAM,SAASA,CAAO,EAAG,CAC9B,MAAMQ,EAAe,KAAK,MAAM,QAAQR,CAAO,EAC3CQ,EAAe,KACf,KAAK,MAAM,OAAOA,EAAc,CAAC,EACjC,KAAK,MAAM,KAAKR,CAAO,GAE3B,OAEJ,GACIA,EAAQ,OAAS,QACjBA,EAAQ,OAAS,SACjBA,EAAQ,OAAS,OACnB,CAEE,MAAMS,EAAqB,wBACrBC,EAAiB,IAAI,MAAMD,EAAoB,CACjD,SAAU,GACV,QAAS,EACb,CAAC,EACDT,EAAQ,iBACJS,EACCX,GAAiB,CACd,MAAMa,EAAOb,EAAM,aAAa,EAChC,KAAK,MAAM,QAASc,GAAc,CAE1B,CADWD,EAAK,KAAMR,GAAOA,IAAOS,CAAS,GAClCA,EAAU,OAAS,UAC9B,KAAK,aAAaA,CAAS,CAEnC,CAAC,CACL,EACA,CAAE,KAAM,EAAK,CACjB,EACAZ,EAAQ,cAAcU,CAAc,OAC7BV,EAAQ,OAAS,QACxB,KAAK,MAAM,QAASY,GAAc,CAC1BA,EAAU,OAAS,QACnB,KAAK,aAAaA,CAAS,CAEnC,CAAC,EAEL,sBAAsB,IAAM,CACxB,KAAK,MAAM,KAAKZ,CAAO,EACvBA,EAAQ,iBAAiB,eAAgB,KAAK,mBAAoB,CAC9D,KAAM,EACV,CAAC,CACL,CAAC,CACL,CAEA,OAAOA,EAA4B,CAC/B,KAAK,aAAaA,CAAO,CAC7B,CACJ,CAEO,aAAM,aAAe,IAAIH",
|
|
6
|
+
"names": ["supportsPopover", "OverlayStack", "event", "reverseIndex", "overlay", "composedPath", "shouldClose", "el", "parentToClose", "target", "open", "last", "overlayIndex", "queryPathEventName", "queryPathEvent", "path", "overlayEl"]
|
|
7
|
+
}
|
package/src/OverlayTrigger.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { CSSResultArray, PropertyValues, SpectrumElement, TemplateResult } from '@spectrum-web-components/base';
|
|
2
|
-
import {
|
|
2
|
+
import { OverlayTriggerInteractions } from './overlay-types';
|
|
3
|
+
import '../sp-overlay.js';
|
|
4
|
+
import { Placement } from '@floating-ui/dom';
|
|
5
|
+
import { OverlayBase } from './OverlayBase.js';
|
|
3
6
|
export declare type OverlayContentTypes = 'click' | 'hover' | 'longpress';
|
|
4
7
|
export declare const LONGPRESS_INSTRUCTIONS: {
|
|
5
8
|
touch: string;
|
|
@@ -18,50 +21,35 @@ export declare const LONGPRESS_INSTRUCTIONS: {
|
|
|
18
21
|
* @fires sp-closed - Announces that the overlay has been closed
|
|
19
22
|
*/
|
|
20
23
|
export declare class OverlayTrigger extends SpectrumElement {
|
|
21
|
-
private closeClickOverlay?;
|
|
22
|
-
private closeLongpressOverlay?;
|
|
23
|
-
private closeHoverOverlay?;
|
|
24
24
|
static get styles(): CSSResultArray;
|
|
25
25
|
/**
|
|
26
26
|
* @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"}
|
|
27
27
|
* @attr
|
|
28
28
|
*/
|
|
29
|
-
placement
|
|
29
|
+
placement?: Placement;
|
|
30
30
|
type?: OverlayTriggerInteractions;
|
|
31
31
|
offset: number;
|
|
32
32
|
open?: OverlayContentTypes;
|
|
33
33
|
disabled: boolean;
|
|
34
34
|
hasLongpressContent: boolean;
|
|
35
35
|
private longpressDescriptor?;
|
|
36
|
-
private clickContent
|
|
37
|
-
private longpressContent
|
|
38
|
-
private hoverContent
|
|
39
|
-
private targetContent
|
|
40
|
-
|
|
36
|
+
private clickContent;
|
|
37
|
+
private longpressContent;
|
|
38
|
+
private hoverContent;
|
|
39
|
+
private targetContent;
|
|
40
|
+
clickOverlayElement: OverlayBase;
|
|
41
|
+
longpressOverlayElement: OverlayBase;
|
|
42
|
+
hoverOverlayElement: OverlayBase;
|
|
41
43
|
private _longpressId;
|
|
42
|
-
private
|
|
44
|
+
private getAssignedElementsFromSlot;
|
|
45
|
+
private handleTriggerContent;
|
|
46
|
+
private handleClickContent;
|
|
47
|
+
private handleLongpressContent;
|
|
48
|
+
private handleHoverContent;
|
|
49
|
+
private handleBeforetoggle;
|
|
43
50
|
protected render(): TemplateResult;
|
|
44
51
|
protected updated(changes: PropertyValues<this>): void;
|
|
45
52
|
protected manageLongpressDescriptor(): void;
|
|
46
|
-
private closeAllOverlays;
|
|
47
|
-
private manageOpen;
|
|
48
|
-
private openOverlay;
|
|
49
|
-
static openOverlay: (target: HTMLElement, interaction: TriggerInteractions, content: HTMLElement, options: OverlayOptions) => Promise<() => void>;
|
|
50
|
-
private get overlayOptions();
|
|
51
|
-
private onTrigger;
|
|
52
|
-
private prepareToFocusOverlayContent;
|
|
53
|
-
onTriggerClick(): Promise<void>;
|
|
54
|
-
private _longpressEvent?;
|
|
55
|
-
private onTriggerLongpress;
|
|
56
|
-
private abortOverlay;
|
|
57
|
-
onTriggerMouseEnter(): Promise<void>;
|
|
58
|
-
private onClickSlotChange;
|
|
59
|
-
private onLongpressSlotChange;
|
|
60
|
-
private onHoverSlotChange;
|
|
61
|
-
private onTargetSlotChange;
|
|
62
|
-
private extractSlotContentFromEvent;
|
|
63
|
-
private openStatePromise;
|
|
64
|
-
private openStateResolver;
|
|
65
53
|
protected getUpdateComplete(): Promise<boolean>;
|
|
66
|
-
|
|
54
|
+
protected willUpdate(): void;
|
|
67
55
|
}
|