@studiometa/ui 0.2.22 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -12
- package/atoms/AnchorScrollTo/AnchorScrollTo.cjs +11 -0
- package/atoms/AnchorScrollTo/AnchorScrollTo.cjs.map +2 -2
- package/atoms/AnchorScrollTo/AnchorScrollTo.js +11 -0
- package/atoms/AnchorScrollTo/AnchorScrollTo.js.map +2 -2
- package/atoms/Button/StyledButton.twig +6 -4
- package/atoms/Button/StyledButtonRounded.twig +65 -0
- package/atoms/Cursor/Cursor.cjs +12 -0
- package/atoms/Cursor/Cursor.cjs.map +2 -2
- package/atoms/Cursor/Cursor.js +12 -0
- package/atoms/Cursor/Cursor.js.map +2 -2
- package/atoms/Figure/Figure.cjs +31 -4
- package/atoms/Figure/Figure.cjs.map +2 -2
- package/atoms/Figure/Figure.d.ts +4 -0
- package/atoms/Figure/Figure.js +31 -4
- package/atoms/Figure/Figure.js.map +2 -2
- package/atoms/Figure/Figure.twig +6 -1
- package/atoms/Figure/FigureTwicpics.cjs +28 -4
- package/atoms/Figure/FigureTwicpics.cjs.map +2 -2
- package/atoms/Figure/FigureTwicpics.d.ts +6 -2
- package/atoms/Figure/FigureTwicpics.js +28 -4
- package/atoms/Figure/FigureTwicpics.js.map +2 -2
- package/atoms/Figure/FigureTwicpics.twig +6 -0
- package/atoms/LargeText/LargeText.cjs +27 -0
- package/atoms/LargeText/LargeText.cjs.map +2 -2
- package/atoms/LargeText/LargeText.js +27 -0
- package/atoms/LargeText/LargeText.js.map +2 -2
- package/atoms/LazyInclude/LazyInclude.cjs +15 -0
- package/atoms/LazyInclude/LazyInclude.cjs.map +2 -2
- package/atoms/LazyInclude/LazyInclude.js +15 -0
- package/atoms/LazyInclude/LazyInclude.js.map +2 -2
- package/atoms/Prefetch/AbstractPrefetch.cjs +12 -0
- package/atoms/Prefetch/AbstractPrefetch.cjs.map +2 -2
- package/atoms/Prefetch/AbstractPrefetch.js +12 -0
- package/atoms/Prefetch/AbstractPrefetch.js.map +2 -2
- package/atoms/Prefetch/PrefetchWhenOver.cjs +6 -0
- package/atoms/Prefetch/PrefetchWhenOver.cjs.map +2 -2
- package/atoms/Prefetch/PrefetchWhenOver.js +6 -0
- package/atoms/Prefetch/PrefetchWhenOver.js.map +2 -2
- package/atoms/Prefetch/PrefetchWhenVisible.cjs +6 -0
- package/atoms/Prefetch/PrefetchWhenVisible.cjs.map +2 -2
- package/atoms/Prefetch/PrefetchWhenVisible.js +6 -0
- package/atoms/Prefetch/PrefetchWhenVisible.js.map +2 -2
- package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs +12 -0
- package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs.map +2 -2
- package/atoms/ScrollAnimation/AbstractScrollAnimation.js +12 -0
- package/atoms/ScrollAnimation/AbstractScrollAnimation.js.map +2 -2
- package/atoms/ScrollAnimation/ScrollAnimation.cjs +6 -0
- package/atoms/ScrollAnimation/ScrollAnimation.cjs.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimation.js +6 -0
- package/atoms/ScrollAnimation/ScrollAnimation.js.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationChild.cjs +18 -1
- package/atoms/ScrollAnimation/ScrollAnimationChild.cjs.map +2 -2
- package/atoms/ScrollAnimation/ScrollAnimationChild.js +18 -1
- package/atoms/ScrollAnimation/ScrollAnimationChild.js.map +2 -2
- package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs +3 -0
- package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js +3 -0
- package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationParent.cjs +6 -0
- package/atoms/ScrollAnimation/ScrollAnimationParent.cjs.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationParent.js +6 -0
- package/atoms/ScrollAnimation/ScrollAnimationParent.js.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs +3 -0
- package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs.map +1 -1
- package/atoms/ScrollAnimation/ScrollAnimationWithEase.js +3 -0
- package/atoms/ScrollAnimation/ScrollAnimationWithEase.js.map +1 -1
- package/atoms/ScrollAnimation/animationScrollWithEase.cjs +6 -0
- package/atoms/ScrollAnimation/animationScrollWithEase.cjs.map +2 -2
- package/atoms/ScrollAnimation/animationScrollWithEase.js +6 -0
- package/atoms/ScrollAnimation/animationScrollWithEase.js.map +2 -2
- package/atoms/ScrollReveal/ScrollReveal.cjs +12 -0
- package/atoms/ScrollReveal/ScrollReveal.cjs.map +1 -1
- package/atoms/ScrollReveal/ScrollReveal.js +12 -0
- package/atoms/ScrollReveal/ScrollReveal.js.map +1 -1
- package/decorators/withTransition.cjs +16 -2
- package/decorators/withTransition.cjs.map +2 -2
- package/decorators/withTransition.js +16 -2
- package/decorators/withTransition.js.map +2 -2
- package/molecules/Accordion/AccordionCore.cjs +9 -0
- package/molecules/Accordion/AccordionCore.cjs.map +2 -2
- package/molecules/Accordion/AccordionCore.js +9 -0
- package/molecules/Accordion/AccordionCore.js.map +2 -2
- package/molecules/Accordion/AccordionItem.cjs +33 -1
- package/molecules/Accordion/AccordionItem.cjs.map +2 -2
- package/molecules/Accordion/AccordionItem.d.ts +1 -1
- package/molecules/Accordion/AccordionItem.js +29 -1
- package/molecules/Accordion/AccordionItem.js.map +2 -2
- package/molecules/Menu/Menu.cjs +47 -0
- package/molecules/Menu/Menu.cjs.map +1 -1
- package/molecules/Menu/Menu.js +47 -0
- package/molecules/Menu/Menu.js.map +1 -1
- package/molecules/Menu/MenuBtn.cjs +24 -0
- package/molecules/Menu/MenuBtn.cjs.map +1 -1
- package/molecules/Menu/MenuBtn.js +24 -0
- package/molecules/Menu/MenuBtn.js.map +1 -1
- package/molecules/Menu/MenuList.cjs +39 -0
- package/molecules/Menu/MenuList.cjs.map +2 -2
- package/molecules/Menu/MenuList.js +39 -0
- package/molecules/Menu/MenuList.js.map +2 -2
- package/molecules/Modal/Modal.cjs +50 -1
- package/molecules/Modal/Modal.cjs.map +2 -2
- package/molecules/Modal/Modal.d.ts +3 -3
- package/molecules/Modal/Modal.js +50 -1
- package/molecules/Modal/Modal.js.map +2 -2
- package/molecules/Modal/ModalWithTransition.cjs +6 -0
- package/molecules/Modal/ModalWithTransition.cjs.map +2 -2
- package/molecules/Modal/ModalWithTransition.js +6 -0
- package/molecules/Modal/ModalWithTransition.js.map +2 -2
- package/molecules/Panel/Panel.cjs +19 -0
- package/molecules/Panel/Panel.cjs.map +2 -2
- package/molecules/Panel/Panel.js +19 -0
- package/molecules/Panel/Panel.js.map +2 -2
- package/molecules/Slider/AbstractSliderChild.cjs +24 -0
- package/molecules/Slider/AbstractSliderChild.cjs.map +2 -2
- package/molecules/Slider/AbstractSliderChild.js +24 -0
- package/molecules/Slider/AbstractSliderChild.js.map +2 -2
- package/molecules/Slider/Slider.cjs +97 -0
- package/molecules/Slider/Slider.cjs.map +2 -2
- package/molecules/Slider/Slider.d.ts +3 -2
- package/molecules/Slider/Slider.js +97 -0
- package/molecules/Slider/Slider.js.map +2 -2
- package/molecules/Slider/SliderBtn.cjs +22 -2
- package/molecules/Slider/SliderBtn.cjs.map +2 -2
- package/molecules/Slider/SliderBtn.d.ts +1 -0
- package/molecules/Slider/SliderBtn.js +22 -2
- package/molecules/Slider/SliderBtn.js.map +2 -2
- package/molecules/Slider/SliderCount.cjs +9 -0
- package/molecules/Slider/SliderCount.cjs.map +2 -2
- package/molecules/Slider/SliderCount.js +9 -0
- package/molecules/Slider/SliderCount.js.map +2 -2
- package/molecules/Slider/SliderDots.cjs +19 -0
- package/molecules/Slider/SliderDots.cjs.map +2 -2
- package/molecules/Slider/SliderDots.js +19 -0
- package/molecules/Slider/SliderDots.js.map +2 -2
- package/molecules/Slider/SliderDrag.cjs +15 -0
- package/molecules/Slider/SliderDrag.cjs.map +2 -2
- package/molecules/Slider/SliderDrag.js +15 -0
- package/molecules/Slider/SliderDrag.js.map +2 -2
- package/molecules/Slider/SliderItem.cjs +75 -14
- package/molecules/Slider/SliderItem.cjs.map +2 -2
- package/molecules/Slider/SliderItem.d.ts +12 -11
- package/molecules/Slider/SliderItem.js +75 -14
- package/molecules/Slider/SliderItem.js.map +2 -2
- package/molecules/Slider/SliderProgress.cjs +6 -0
- package/molecules/Slider/SliderProgress.cjs.map +2 -2
- package/molecules/Slider/SliderProgress.js +6 -0
- package/molecules/Slider/SliderProgress.js.map +2 -2
- package/molecules/Sticky/Sticky.cjs +56 -0
- package/molecules/Sticky/Sticky.cjs.map +2 -2
- package/molecules/Sticky/Sticky.js +56 -0
- package/molecules/Sticky/Sticky.js.map +2 -2
- package/molecules/TableOfContent/TableOfContent.cjs +13 -0
- package/molecules/TableOfContent/TableOfContent.cjs.map +1 -1
- package/molecules/TableOfContent/TableOfContent.js +13 -0
- package/molecules/TableOfContent/TableOfContent.js.map +1 -1
- package/molecules/TableOfContent/TableOfContentAnchor.cjs +16 -0
- package/molecules/TableOfContent/TableOfContentAnchor.cjs.map +2 -2
- package/molecules/TableOfContent/TableOfContentAnchor.js +16 -0
- package/molecules/TableOfContent/TableOfContentAnchor.js.map +2 -2
- package/molecules/Tabs/Tabs.cjs +16 -0
- package/molecules/Tabs/Tabs.cjs.map +2 -2
- package/molecules/Tabs/Tabs.d.ts +3 -3
- package/molecules/Tabs/Tabs.js +16 -0
- package/molecules/Tabs/Tabs.js.map +2 -2
- package/organisms/Frame/Frame.cjs +30 -0
- package/organisms/Frame/Frame.cjs.map +2 -2
- package/organisms/Frame/Frame.js +30 -0
- package/organisms/Frame/Frame.js.map +2 -2
- package/organisms/Frame/FrameAnchor.cjs +6 -0
- package/organisms/Frame/FrameAnchor.cjs.map +1 -1
- package/organisms/Frame/FrameAnchor.js +6 -0
- package/organisms/Frame/FrameAnchor.js.map +1 -1
- package/organisms/Frame/FrameForm.cjs +6 -0
- package/organisms/Frame/FrameForm.cjs.map +1 -1
- package/organisms/Frame/FrameForm.js +6 -0
- package/organisms/Frame/FrameForm.js.map +1 -1
- package/organisms/Frame/FrameTarget.cjs +25 -2
- package/organisms/Frame/FrameTarget.cjs.map +2 -2
- package/organisms/Frame/FrameTarget.js +25 -2
- package/organisms/Frame/FrameTarget.js.map +2 -2
- package/organisms/Hero/Hero.twig +151 -0
- package/package.json +2 -2
- package/primitives/Draggable/Draggable.cjs +18 -0
- package/primitives/Draggable/Draggable.cjs.map +2 -2
- package/primitives/Draggable/Draggable.js +18 -0
- package/primitives/Draggable/Draggable.js.map +2 -2
- package/primitives/Sentinel/Sentinel.cjs +3 -0
- package/primitives/Sentinel/Sentinel.cjs.map +2 -2
- package/primitives/Sentinel/Sentinel.js +3 -0
- package/primitives/Sentinel/Sentinel.js.map +2 -2
- package/primitives/Transition/Transition.cjs +3 -0
- package/primitives/Transition/Transition.cjs.map +1 -1
- package/primitives/Transition/Transition.js +3 -0
- package/primitives/Transition/Transition.js.map +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Menu/MenuList.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([inert])',\n 'area[href]:not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([inert])',\n 'audio:not([inert])',\n 'video:not([inert])',\n '[contenteditable]:not([inert])',\n '[tabindex]:not([inert])',\n].join(',');\n\nexport interface MenuListProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n MenuList: MenuList[];\n };\n}\n\n/**\n * MenuList class.\n */\nexport class MenuList<T extends BaseProps = BaseProps> extends Transition<T & MenuListProps> {\n /**\n * Config.\n */\n static config:BaseConfig = {\n ...Transition.config,\n name: 'MenuList',\n emits: ['items-open', 'items-close', 'items-mouseleave'],\n components: {\n MenuList,\n },\n };\n\n /**\n * Are the menu items visible?\n */\n isOpen = false;\n\n /**\n * Wether the component is hovered.\n */\n isHover = false;\n\n /**\n * Override `Transition` options.\n */\n // @ts-ignore\n get $options() {\n const options = super.$options;\n\n options.leaveKeep = true;\n options.enterKeep = true;\n\n return options;\n }\n\n /**\n * Update tab indexes on mount.\n */\n mounted() {\n this.__updateTabIndexes('close');\n }\n\n /**\n * Set hover state.\n */\n onMouseenter() {\n this.isHover = true;\n }\n\n /**\n * Unset hover state.\n */\n onMouseleave() {\n this.isHover = false;\n }\n\n /**\n * Display the menu items.\n */\n open() {\n if (this.isOpen) {\n return;\n }\n\n // @todo Remove event listener when the close method is called.\n const clickOutsideHandler = (event) => {\n if (!this.$el.contains(event.target)) {\n document.removeEventListener('click', clickOutsideHandler);\n this.close();\n }\n };\n document.addEventListener('click', clickOutsideHandler);\n\n this.__updateTabIndexes('open');\n this.$el.setAttribute('aria-hidden', 'false');\n this.isOpen = true;\n this.enter();\n this.$emit('items-open');\n }\n\n /**\n * Hide the menu items.\n */\n close() {\n if (!this.isOpen) {\n return;\n }\n\n // Close child menu items.\n this.$children.MenuList.forEach((menuItem) => {\n menuItem.close();\n });\n\n if (\n document.activeElement instanceof HTMLElement &&\n this.$el.contains(document.activeElement)\n ) {\n document.activeElement.blur();\n }\n\n this.$el.setAttribute('aria-hidden', 'true');\n this.__updateTabIndexes('close');\n this.isOpen = false;\n this.leave();\n this.$emit('items-close');\n }\n\n /**\n * Toggle the menu items.\n */\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Update `tabindex` attribute of child focusable elements.\n * @private\n */\n __updateTabIndexes(mode:'open'|'close' = 'open') {\n const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(\n (item) => this.__filterFocusableItems(item as HTMLElement),\n );\n\n focusableItems.forEach((item) => {\n if (mode === 'close') {\n item.setAttribute('tabindex', '-1');\n } else {\n item.removeAttribute('tabindex');\n }\n });\n }\n\n /**\n * Filter out items which are inside a child `MenuList` instance.\n * @private\n */\n __filterFocusableItems(item:HTMLElement):boolean {\n let ancestor = item.parentElement;\n\n // @ts-ignore\n while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {\n ancestor = ancestor.parentElement;\n }\n\n return ancestor === null || ancestor === this.$el;\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,kBAAkB;AAE3B,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAYH,MAAM,iBAAkD,WAA8B;AAAA,EAI3F,OAAO,
|
|
4
|
+
"sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([inert])',\n 'area[href]:not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([inert])',\n 'audio:not([inert])',\n 'video:not([inert])',\n '[contenteditable]:not([inert])',\n '[tabindex]:not([inert])',\n].join(',');\n\nexport interface MenuListProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n MenuList: MenuList[];\n };\n}\n\n/**\n * MenuList class.\n */\nexport class MenuList<T extends BaseProps = BaseProps> extends Transition<T & MenuListProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'MenuList',\n emits: ['items-open', 'items-close', 'items-mouseleave'],\n components: {\n MenuList,\n },\n };\n\n /**\n * Are the menu items visible?\n */\n isOpen = false;\n\n /**\n * Wether the component is hovered.\n */\n isHover = false;\n\n /**\n * Override `Transition` options.\n */\n // @ts-ignore\n get $options() {\n const options = super.$options;\n\n options.leaveKeep = true;\n options.enterKeep = true;\n\n return options;\n }\n\n /**\n * Update tab indexes on mount.\n */\n mounted() {\n this.__updateTabIndexes('close');\n }\n\n /**\n * Set hover state.\n */\n onMouseenter() {\n this.isHover = true;\n }\n\n /**\n * Unset hover state.\n */\n onMouseleave() {\n this.isHover = false;\n }\n\n /**\n * Display the menu items.\n */\n open() {\n if (this.isOpen) {\n return;\n }\n\n // @todo Remove event listener when the close method is called.\n const clickOutsideHandler = (event) => {\n if (!this.$el.contains(event.target)) {\n document.removeEventListener('click', clickOutsideHandler);\n this.close();\n }\n };\n document.addEventListener('click', clickOutsideHandler);\n\n this.__updateTabIndexes('open');\n this.$el.setAttribute('aria-hidden', 'false');\n this.isOpen = true;\n this.enter();\n this.$emit('items-open');\n }\n\n /**\n * Hide the menu items.\n */\n close() {\n if (!this.isOpen) {\n return;\n }\n\n // Close child menu items.\n this.$children.MenuList.forEach((menuItem) => {\n menuItem.close();\n });\n\n if (\n document.activeElement instanceof HTMLElement &&\n this.$el.contains(document.activeElement)\n ) {\n document.activeElement.blur();\n }\n\n this.$el.setAttribute('aria-hidden', 'true');\n this.__updateTabIndexes('close');\n this.isOpen = false;\n this.leave();\n this.$emit('items-close');\n }\n\n /**\n * Toggle the menu items.\n */\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Update `tabindex` attribute of child focusable elements.\n * @private\n */\n __updateTabIndexes(mode: 'open' | 'close' = 'open') {\n const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(\n (item) => this.__filterFocusableItems(item as HTMLElement),\n );\n\n focusableItems.forEach((item) => {\n if (mode === 'close') {\n item.setAttribute('tabindex', '-1');\n } else {\n item.removeAttribute('tabindex');\n }\n });\n }\n\n /**\n * Filter out items which are inside a child `MenuList` instance.\n * @private\n */\n __filterFocusableItems(item: HTMLElement): boolean {\n let ancestor = item.parentElement;\n\n // @ts-ignore\n while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {\n ancestor = ancestor.parentElement;\n }\n\n return ancestor === null || ancestor === this.$el;\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,kBAAkB;AAE3B,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAYH,MAAM,iBAAkD,WAA8B;AAAA;AAAA;AAAA;AAAA,EAI3F,OAAO,SAAqB;AAAA,IAC1B,GAAG,WAAW;AAAA,IACd,MAAM;AAAA,IACN,OAAO,CAAC,cAAc,eAAe,kBAAkB;AAAA,IACvD,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,IAAI,WAAW;AACb,UAAM,UAAU,MAAM;AAEtB,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAEpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,mBAAmB,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAGA,UAAM,sBAAsB,CAAC,UAAU;AACrC,UAAI,CAAC,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AACpC,iBAAS,oBAAoB,SAAS,mBAAmB;AACzD,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,mBAAmB;AAEtD,SAAK,mBAAmB,MAAM;AAC9B,SAAK,IAAI,aAAa,eAAe,OAAO;AAC5C,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,YAAY;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAGA,SAAK,UAAU,SAAS,QAAQ,CAAC,aAAa;AAC5C,eAAS,MAAM;AAAA,IACjB,CAAC;AAED,QACE,SAAS,yBAAyB,eAClC,KAAK,IAAI,SAAS,SAAS,aAAa,GACxC;AACA,eAAS,cAAc,KAAK;AAAA,IAC9B;AAEA,SAAK,IAAI,aAAa,eAAe,MAAM;AAC3C,SAAK,mBAAmB,OAAO;AAC/B,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,QAAI,KAAK,QAAQ;AACf,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,OAAyB,QAAQ;AAClD,UAAM,iBAAiB,MAAM,KAAK,KAAK,IAAI,iBAAiB,kBAAkB,CAAC,EAAE;AAAA,MAC/E,CAAC,SAAS,KAAK,uBAAuB,IAAmB;AAAA,IAC3D;AAEA,mBAAe,QAAQ,CAAC,SAAS;AAC/B,UAAI,SAAS,SAAS;AACpB,aAAK,aAAa,YAAY,IAAI;AAAA,MACpC,OAAO;AACL,aAAK,gBAAgB,UAAU;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,MAA4B;AACjD,QAAI,WAAW,KAAK;AAGpB,WAAO,aAAa,CAAC,SAAS,YAAY,CAAC,SAAS,SAAS,IAAI,KAAK,WAAW,IAAI;AACnF,iBAAW,SAAS;AAAA,IACtB;AAEA,WAAO,aAAa,QAAQ,aAAa,KAAK;AAAA,EAChD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -31,20 +31,49 @@ var import_js_toolkit = require("@studiometa/js-toolkit");
|
|
|
31
31
|
var import_utils = require("@studiometa/js-toolkit/utils");
|
|
32
32
|
var { trap, untrap, saveActiveElement } = (0, import_utils.focusTrap)();
|
|
33
33
|
var Modal = class extends import_js_toolkit.Base {
|
|
34
|
+
/**
|
|
35
|
+
* Wether the modal is open or not.
|
|
36
|
+
*/
|
|
34
37
|
isOpen = false;
|
|
38
|
+
/**
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
35
41
|
__refsBackup;
|
|
42
|
+
/**
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
36
45
|
__refModalPlaceholder;
|
|
46
|
+
/**
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
37
49
|
__refModalParentBackup;
|
|
50
|
+
/**
|
|
51
|
+
* @private
|
|
52
|
+
*/
|
|
38
53
|
__refModalUnbindGetRefFilter;
|
|
54
|
+
/**
|
|
55
|
+
* Open the modal on click on the `open` ref.
|
|
56
|
+
*/
|
|
39
57
|
get onOpenClick() {
|
|
40
58
|
return this.open;
|
|
41
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Close the modal on click on the `close` ref.
|
|
62
|
+
*/
|
|
42
63
|
get onCloseClick() {
|
|
43
64
|
return this.close;
|
|
44
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Close the modal on click on the `overlay` ref.
|
|
68
|
+
*
|
|
69
|
+
* @returns {Function} The component's `close` method.
|
|
70
|
+
*/
|
|
45
71
|
get onOverlayClick() {
|
|
46
72
|
return this.close;
|
|
47
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the component's behaviours.
|
|
76
|
+
*/
|
|
48
77
|
mounted() {
|
|
49
78
|
this.isOpen = false;
|
|
50
79
|
this.close();
|
|
@@ -57,6 +86,9 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
57
86
|
target.append(this.$refs.modal);
|
|
58
87
|
}
|
|
59
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Add the moved refs to `this.$refs` when using the `move` options.
|
|
91
|
+
*/
|
|
60
92
|
get $refs() {
|
|
61
93
|
const $refs = super.$refs;
|
|
62
94
|
if (this.$options.move && this.__refsBackup) {
|
|
@@ -68,6 +100,9 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
68
100
|
}
|
|
69
101
|
return $refs;
|
|
70
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Unbind all events on destroy.
|
|
105
|
+
*/
|
|
71
106
|
destroyed() {
|
|
72
107
|
this.close();
|
|
73
108
|
if (this.$options.move && this.__refModalParentBackup) {
|
|
@@ -78,6 +113,9 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
78
113
|
}
|
|
79
114
|
return this;
|
|
80
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Close the modal on `ESC` and trap the tabulation.
|
|
118
|
+
*/
|
|
81
119
|
keyed({ event, isUp, isDown, ESC }) {
|
|
82
120
|
if (!this.isOpen) {
|
|
83
121
|
return;
|
|
@@ -89,6 +127,9 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
89
127
|
this.close();
|
|
90
128
|
}
|
|
91
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Open the modal.
|
|
132
|
+
*/
|
|
92
133
|
async open() {
|
|
93
134
|
if (this.isOpen) {
|
|
94
135
|
return Promise.resolve();
|
|
@@ -115,12 +156,17 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
115
156
|
).then(() => {
|
|
116
157
|
if (this.$options.autofocus && this.$refs.modal.querySelector(this.$options.autofocus)) {
|
|
117
158
|
saveActiveElement();
|
|
118
|
-
const autofocusElement = this.$refs.modal.querySelector(
|
|
159
|
+
const autofocusElement = this.$refs.modal.querySelector(
|
|
160
|
+
this.$options.autofocus
|
|
161
|
+
);
|
|
119
162
|
autofocusElement.focus();
|
|
120
163
|
}
|
|
121
164
|
return Promise.resolve();
|
|
122
165
|
});
|
|
123
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Close the modal.
|
|
169
|
+
*/
|
|
124
170
|
async close() {
|
|
125
171
|
if (!this.isOpen) {
|
|
126
172
|
return Promise.resolve();
|
|
@@ -148,6 +194,9 @@ var Modal = class extends import_js_toolkit.Base {
|
|
|
148
194
|
).then(() => Promise.resolve());
|
|
149
195
|
}
|
|
150
196
|
};
|
|
197
|
+
/**
|
|
198
|
+
* Config.
|
|
199
|
+
*/
|
|
151
200
|
__publicField(Modal, "config", {
|
|
152
201
|
name: "Modal",
|
|
153
202
|
refs: ["close[]", "container", "content", "modal", "open[]", "overlay"],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Modal/Modal.ts"],
|
|
4
|
-
"sourcesContent": ["import { Base, KeyServiceProps } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, focusTrap } from '@studiometa/js-toolkit/utils';\n\nconst { trap, untrap, saveActiveElement } = focusTrap();\n\ntype ModalStates = Partial
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAsC;AAEtC,mBAAsC;AAEtC,IAAM,EAAE,MAAM,QAAQ,kBAAkB,QAAI,wBAAU;
|
|
4
|
+
"sourcesContent": ["import { Base, KeyServiceProps } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, focusTrap } from '@studiometa/js-toolkit/utils';\n\nconst { trap, untrap, saveActiveElement } = focusTrap();\n\ntype ModalStates = Partial<\n Record<'open' | 'active' | 'closed', string | Partial<CSSStyleDeclaration>>\n>;\n// eslint-disable-next-line no-use-before-define\ntype ModalStylesOption = Partial<Record<keyof ModalProps['$refs'], ModalStates>>;\n\nexport interface ModalProps extends BaseProps {\n $refs: {\n close: HTMLElement[];\n container: HTMLElement;\n content: HTMLElement;\n modal: HTMLElement;\n open: HTMLElement[];\n overlay: HTMLElement;\n };\n $options: {\n /**\n * A selector where to move the modal to.\n */\n move: string;\n /**\n * A selector for the element to set the focus to when the modal opens.\n */\n autofocus: string;\n /**\n * Lock or allow scroll in the documentElement.\n */\n scrollLock: boolean;\n /**\n * The styles for the different state of the modal.\n */\n styles: ModalStylesOption;\n };\n}\n\n/**\n * Modal class.\n */\nexport class Modal<T extends BaseProps = BaseProps> extends Base<T & ModalProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Modal',\n refs: ['close[]', 'container', 'content', 'modal', 'open[]', 'overlay'],\n emits: ['open', 'close'],\n options: {\n move: String,\n autofocus: { type: String, default: '[autofocus]' },\n styles: {\n type: Object,\n default: (): ModalStylesOption => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n },\n },\n }),\n },\n scrollLock: {\n type: Boolean,\n default: true,\n },\n },\n };\n\n /**\n * Wether the modal is open or not.\n */\n isOpen = false;\n\n /**\n * @private\n */\n __refsBackup: (T & ModalProps)['$refs'];\n\n /**\n * @private\n */\n __refModalPlaceholder: Comment;\n\n /**\n * @private\n */\n __refModalParentBackup: HTMLElement;\n\n /**\n * @private\n */\n __refModalUnbindGetRefFilter: () => void;\n\n /**\n * Open the modal on click on the `open` ref.\n */\n get onOpenClick() {\n return this.open;\n }\n\n /**\n * Close the modal on click on the `close` ref.\n */\n get onCloseClick() {\n return this.close;\n }\n\n /**\n * Close the modal on click on the `overlay` ref.\n *\n * @returns {Function} The component's `close` method.\n */\n get onOverlayClick() {\n return this.close;\n }\n\n /**\n * Initialize the component's behaviours.\n */\n mounted() {\n this.isOpen = false;\n this.close();\n\n if (this.$options.move) {\n const target = document.querySelector(this.$options.move) || document.body;\n\n this.__refsBackup = this.$refs;\n this.__refModalPlaceholder = document.createComment('');\n this.__refModalParentBackup = this.$refs.modal.parentElement || this.$el;\n this.__refModalParentBackup.insertBefore(this.__refModalPlaceholder, this.$refs.modal);\n\n target.append(this.$refs.modal);\n }\n }\n\n /**\n * Add the moved refs to `this.$refs` when using the `move` options.\n */\n get $refs() {\n const $refs = super.$refs;\n\n if (this.$options.move && this.__refsBackup) {\n Object.entries(this.__refsBackup).forEach(([key, ref]) => {\n if (!$refs[key]) {\n // @ts-ignore\n $refs[key] = ref;\n }\n });\n }\n\n return $refs;\n }\n\n /**\n * Unbind all events on destroy.\n */\n destroyed() {\n this.close();\n\n if (this.$options.move && this.__refModalParentBackup) {\n this.__refModalParentBackup.insertBefore(this.$refs.modal, this.__refModalPlaceholder);\n this.__refModalPlaceholder.remove();\n delete this.__refModalPlaceholder;\n delete this.__refModalParentBackup;\n }\n\n return this;\n }\n\n /**\n * Close the modal on `ESC` and trap the tabulation.\n */\n keyed({ event, isUp, isDown, ESC }: KeyServiceProps) {\n if (!this.isOpen) {\n return;\n }\n\n if (isDown) {\n trap(this.$refs.modal, event);\n }\n\n if (ESC && isUp) {\n this.close();\n }\n }\n\n /**\n * Open the modal.\n */\n async open() {\n if (this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.setAttribute('aria-hidden', 'false');\n\n if (this.$options.scrollLock) {\n document.documentElement.style.overflow = 'hidden';\n }\n\n this.isOpen = true;\n this.$emit('open');\n\n /** @type {ModalRefs} */\n const refs = this.$refs;\n\n return Promise.all(\n Object.entries(this.$options.styles).map(\n ([refName, { open, active, closed } = { open: '', active: '', closed: '' }]) =>\n transition(\n refs[refName],\n {\n from: closed,\n active,\n to: open,\n },\n 'keep',\n ),\n ),\n ).then(() => {\n if (this.$options.autofocus && this.$refs.modal.querySelector(this.$options.autofocus)) {\n saveActiveElement();\n const autofocusElement = this.$refs.modal.querySelector(\n this.$options.autofocus,\n ) as HTMLElement;\n autofocusElement.focus();\n }\n return Promise.resolve();\n });\n }\n\n /**\n * Close the modal.\n */\n async close() {\n if (!this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.setAttribute('aria-hidden', 'true');\n\n if (this.$options.scrollLock) {\n document.documentElement.style.overflow = '';\n }\n\n this.isOpen = false;\n untrap();\n this.$emit('close');\n\n const refs = this.$refs;\n\n return Promise.all(\n Object.entries(this.$options.styles).map(\n ([refName, { open, active, closed } = { open: '', active: '', closed: '' }]) =>\n transition(\n refs[refName],\n {\n from: open,\n active,\n to: closed,\n },\n 'keep',\n ),\n ),\n ).then(() => Promise.resolve());\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Base, KeyServiceProps } from '@studiometa/js-toolkit';
|
|
2
2
|
import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
type ModalStates = Partial<Record<'open' | 'active' | 'closed', string | Partial<CSSStyleDeclaration>>>;
|
|
4
|
+
type ModalStylesOption = Partial<Record<keyof ModalProps['$refs'], ModalStates>>;
|
|
5
5
|
export interface ModalProps extends BaseProps {
|
|
6
6
|
$refs: {
|
|
7
7
|
close: HTMLElement[];
|
|
@@ -79,7 +79,7 @@ export declare class Modal<T extends BaseProps = BaseProps> extends Base<T & Mod
|
|
|
79
79
|
/**
|
|
80
80
|
* Add the moved refs to `this.$refs` when using the `move` options.
|
|
81
81
|
*/
|
|
82
|
-
get $refs(): import("@studiometa/js-toolkit/Base/managers
|
|
82
|
+
get $refs(): import("@studiometa/js-toolkit/Base/managers").RefsManager & (T & ModalProps)["$refs"] & import("@studiometa/js-toolkit/Base").BaseRefs;
|
|
83
83
|
/**
|
|
84
84
|
* Unbind all events on destroy.
|
|
85
85
|
*/
|
package/molecules/Modal/Modal.js
CHANGED
|
@@ -2,6 +2,9 @@ import { Base } from "@studiometa/js-toolkit";
|
|
|
2
2
|
import { transition, focusTrap } from "@studiometa/js-toolkit/utils";
|
|
3
3
|
const { trap, untrap, saveActiveElement } = focusTrap();
|
|
4
4
|
class Modal extends Base {
|
|
5
|
+
/**
|
|
6
|
+
* Config.
|
|
7
|
+
*/
|
|
5
8
|
static config = {
|
|
6
9
|
name: "Modal",
|
|
7
10
|
refs: ["close[]", "container", "content", "modal", "open[]", "overlay"],
|
|
@@ -27,20 +30,49 @@ class Modal extends Base {
|
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Wether the modal is open or not.
|
|
35
|
+
*/
|
|
30
36
|
isOpen = false;
|
|
37
|
+
/**
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
31
40
|
__refsBackup;
|
|
41
|
+
/**
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
32
44
|
__refModalPlaceholder;
|
|
45
|
+
/**
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
33
48
|
__refModalParentBackup;
|
|
49
|
+
/**
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
34
52
|
__refModalUnbindGetRefFilter;
|
|
53
|
+
/**
|
|
54
|
+
* Open the modal on click on the `open` ref.
|
|
55
|
+
*/
|
|
35
56
|
get onOpenClick() {
|
|
36
57
|
return this.open;
|
|
37
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Close the modal on click on the `close` ref.
|
|
61
|
+
*/
|
|
38
62
|
get onCloseClick() {
|
|
39
63
|
return this.close;
|
|
40
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Close the modal on click on the `overlay` ref.
|
|
67
|
+
*
|
|
68
|
+
* @returns {Function} The component's `close` method.
|
|
69
|
+
*/
|
|
41
70
|
get onOverlayClick() {
|
|
42
71
|
return this.close;
|
|
43
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Initialize the component's behaviours.
|
|
75
|
+
*/
|
|
44
76
|
mounted() {
|
|
45
77
|
this.isOpen = false;
|
|
46
78
|
this.close();
|
|
@@ -53,6 +85,9 @@ class Modal extends Base {
|
|
|
53
85
|
target.append(this.$refs.modal);
|
|
54
86
|
}
|
|
55
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Add the moved refs to `this.$refs` when using the `move` options.
|
|
90
|
+
*/
|
|
56
91
|
get $refs() {
|
|
57
92
|
const $refs = super.$refs;
|
|
58
93
|
if (this.$options.move && this.__refsBackup) {
|
|
@@ -64,6 +99,9 @@ class Modal extends Base {
|
|
|
64
99
|
}
|
|
65
100
|
return $refs;
|
|
66
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Unbind all events on destroy.
|
|
104
|
+
*/
|
|
67
105
|
destroyed() {
|
|
68
106
|
this.close();
|
|
69
107
|
if (this.$options.move && this.__refModalParentBackup) {
|
|
@@ -74,6 +112,9 @@ class Modal extends Base {
|
|
|
74
112
|
}
|
|
75
113
|
return this;
|
|
76
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Close the modal on `ESC` and trap the tabulation.
|
|
117
|
+
*/
|
|
77
118
|
keyed({ event, isUp, isDown, ESC }) {
|
|
78
119
|
if (!this.isOpen) {
|
|
79
120
|
return;
|
|
@@ -85,6 +126,9 @@ class Modal extends Base {
|
|
|
85
126
|
this.close();
|
|
86
127
|
}
|
|
87
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Open the modal.
|
|
131
|
+
*/
|
|
88
132
|
async open() {
|
|
89
133
|
if (this.isOpen) {
|
|
90
134
|
return Promise.resolve();
|
|
@@ -111,12 +155,17 @@ class Modal extends Base {
|
|
|
111
155
|
).then(() => {
|
|
112
156
|
if (this.$options.autofocus && this.$refs.modal.querySelector(this.$options.autofocus)) {
|
|
113
157
|
saveActiveElement();
|
|
114
|
-
const autofocusElement = this.$refs.modal.querySelector(
|
|
158
|
+
const autofocusElement = this.$refs.modal.querySelector(
|
|
159
|
+
this.$options.autofocus
|
|
160
|
+
);
|
|
115
161
|
autofocusElement.focus();
|
|
116
162
|
}
|
|
117
163
|
return Promise.resolve();
|
|
118
164
|
});
|
|
119
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Close the modal.
|
|
168
|
+
*/
|
|
120
169
|
async close() {
|
|
121
170
|
if (!this.isOpen) {
|
|
122
171
|
return Promise.resolve();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Modal/Modal.ts"],
|
|
4
|
-
"sourcesContent": ["import { Base, KeyServiceProps } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, focusTrap } from '@studiometa/js-toolkit/utils';\n\nconst { trap, untrap, saveActiveElement } = focusTrap();\n\ntype ModalStates = Partial
|
|
5
|
-
"mappings": "AAAA,SAAS,YAA6B;AAEtC,SAAS,YAAY,iBAAiB;AAEtC,MAAM,EAAE,MAAM,QAAQ,kBAAkB,IAAI,UAAU;
|
|
4
|
+
"sourcesContent": ["import { Base, KeyServiceProps } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, focusTrap } from '@studiometa/js-toolkit/utils';\n\nconst { trap, untrap, saveActiveElement } = focusTrap();\n\ntype ModalStates = Partial<\n Record<'open' | 'active' | 'closed', string | Partial<CSSStyleDeclaration>>\n>;\n// eslint-disable-next-line no-use-before-define\ntype ModalStylesOption = Partial<Record<keyof ModalProps['$refs'], ModalStates>>;\n\nexport interface ModalProps extends BaseProps {\n $refs: {\n close: HTMLElement[];\n container: HTMLElement;\n content: HTMLElement;\n modal: HTMLElement;\n open: HTMLElement[];\n overlay: HTMLElement;\n };\n $options: {\n /**\n * A selector where to move the modal to.\n */\n move: string;\n /**\n * A selector for the element to set the focus to when the modal opens.\n */\n autofocus: string;\n /**\n * Lock or allow scroll in the documentElement.\n */\n scrollLock: boolean;\n /**\n * The styles for the different state of the modal.\n */\n styles: ModalStylesOption;\n };\n}\n\n/**\n * Modal class.\n */\nexport class Modal<T extends BaseProps = BaseProps> extends Base<T & ModalProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Modal',\n refs: ['close[]', 'container', 'content', 'modal', 'open[]', 'overlay'],\n emits: ['open', 'close'],\n options: {\n move: String,\n autofocus: { type: String, default: '[autofocus]' },\n styles: {\n type: Object,\n default: (): ModalStylesOption => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n },\n },\n }),\n },\n scrollLock: {\n type: Boolean,\n default: true,\n },\n },\n };\n\n /**\n * Wether the modal is open or not.\n */\n isOpen = false;\n\n /**\n * @private\n */\n __refsBackup: (T & ModalProps)['$refs'];\n\n /**\n * @private\n */\n __refModalPlaceholder: Comment;\n\n /**\n * @private\n */\n __refModalParentBackup: HTMLElement;\n\n /**\n * @private\n */\n __refModalUnbindGetRefFilter: () => void;\n\n /**\n * Open the modal on click on the `open` ref.\n */\n get onOpenClick() {\n return this.open;\n }\n\n /**\n * Close the modal on click on the `close` ref.\n */\n get onCloseClick() {\n return this.close;\n }\n\n /**\n * Close the modal on click on the `overlay` ref.\n *\n * @returns {Function} The component's `close` method.\n */\n get onOverlayClick() {\n return this.close;\n }\n\n /**\n * Initialize the component's behaviours.\n */\n mounted() {\n this.isOpen = false;\n this.close();\n\n if (this.$options.move) {\n const target = document.querySelector(this.$options.move) || document.body;\n\n this.__refsBackup = this.$refs;\n this.__refModalPlaceholder = document.createComment('');\n this.__refModalParentBackup = this.$refs.modal.parentElement || this.$el;\n this.__refModalParentBackup.insertBefore(this.__refModalPlaceholder, this.$refs.modal);\n\n target.append(this.$refs.modal);\n }\n }\n\n /**\n * Add the moved refs to `this.$refs` when using the `move` options.\n */\n get $refs() {\n const $refs = super.$refs;\n\n if (this.$options.move && this.__refsBackup) {\n Object.entries(this.__refsBackup).forEach(([key, ref]) => {\n if (!$refs[key]) {\n // @ts-ignore\n $refs[key] = ref;\n }\n });\n }\n\n return $refs;\n }\n\n /**\n * Unbind all events on destroy.\n */\n destroyed() {\n this.close();\n\n if (this.$options.move && this.__refModalParentBackup) {\n this.__refModalParentBackup.insertBefore(this.$refs.modal, this.__refModalPlaceholder);\n this.__refModalPlaceholder.remove();\n delete this.__refModalPlaceholder;\n delete this.__refModalParentBackup;\n }\n\n return this;\n }\n\n /**\n * Close the modal on `ESC` and trap the tabulation.\n */\n keyed({ event, isUp, isDown, ESC }: KeyServiceProps) {\n if (!this.isOpen) {\n return;\n }\n\n if (isDown) {\n trap(this.$refs.modal, event);\n }\n\n if (ESC && isUp) {\n this.close();\n }\n }\n\n /**\n * Open the modal.\n */\n async open() {\n if (this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.setAttribute('aria-hidden', 'false');\n\n if (this.$options.scrollLock) {\n document.documentElement.style.overflow = 'hidden';\n }\n\n this.isOpen = true;\n this.$emit('open');\n\n /** @type {ModalRefs} */\n const refs = this.$refs;\n\n return Promise.all(\n Object.entries(this.$options.styles).map(\n ([refName, { open, active, closed } = { open: '', active: '', closed: '' }]) =>\n transition(\n refs[refName],\n {\n from: closed,\n active,\n to: open,\n },\n 'keep',\n ),\n ),\n ).then(() => {\n if (this.$options.autofocus && this.$refs.modal.querySelector(this.$options.autofocus)) {\n saveActiveElement();\n const autofocusElement = this.$refs.modal.querySelector(\n this.$options.autofocus,\n ) as HTMLElement;\n autofocusElement.focus();\n }\n return Promise.resolve();\n });\n }\n\n /**\n * Close the modal.\n */\n async close() {\n if (!this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.setAttribute('aria-hidden', 'true');\n\n if (this.$options.scrollLock) {\n document.documentElement.style.overflow = '';\n }\n\n this.isOpen = false;\n untrap();\n this.$emit('close');\n\n const refs = this.$refs;\n\n return Promise.all(\n Object.entries(this.$options.styles).map(\n ([refName, { open, active, closed } = { open: '', active: '', closed: '' }]) =>\n transition(\n refs[refName],\n {\n from: open,\n active,\n to: closed,\n },\n 'keep',\n ),\n ),\n ).then(() => Promise.resolve());\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -39,11 +39,17 @@ var ModalWithTransition = class extends import_Modal.Modal {
|
|
|
39
39
|
return Promise.resolve();
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* Modal options.
|
|
44
|
+
*/
|
|
42
45
|
__publicField(ModalWithTransition, "config", {
|
|
43
46
|
name: "ModalWithTransition",
|
|
44
47
|
options: {
|
|
45
48
|
styles: {
|
|
46
49
|
type: Object,
|
|
50
|
+
/**
|
|
51
|
+
* @returns {ModalStylesOption}
|
|
52
|
+
*/
|
|
47
53
|
default: () => ({
|
|
48
54
|
modal: {
|
|
49
55
|
closed: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Modal/ModalWithTransition.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { Modal } from './Modal.js';\n\n/**\n * ModalWithTransition class.\n */\nexport class ModalWithTransition<T extends BaseProps = BaseProps> extends Modal<T> {\n /**\n * Modal options.\n */\n static config:BaseConfig = {\n name: 'ModalWithTransition',\n options: {\n styles: {\n type: Object,\n /**\n * @returns {ModalStylesOption}\n */\n default: () => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n },\n active: 'transition duration-500 ease-out-expo',\n },\n overlay: {\n closed: 'opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n container: {\n closed: 'transform scale-95 opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n }),\n },\n },\n };\n\n open() {\n this.$refs.modal.style.visibility = '';\n return super.open();\n }\n\n async close() {\n await super.close();\n this.$refs.modal.style.visibility = 'hidden';\n return Promise.resolve();\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAsB;AAKf,IAAM,sBAAN,cAAmE,mBAAS;AAAA,EAiCjF,OAAO;AACL,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,MAAM,MAAM;AAClB,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAvCE,cAJW,qBAIJ,
|
|
4
|
+
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { Modal } from './Modal.js';\n\n/**\n * ModalWithTransition class.\n */\nexport class ModalWithTransition<T extends BaseProps = BaseProps> extends Modal<T> {\n /**\n * Modal options.\n */\n static config: BaseConfig = {\n name: 'ModalWithTransition',\n options: {\n styles: {\n type: Object,\n /**\n * @returns {ModalStylesOption}\n */\n default: () => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n },\n active: 'transition duration-500 ease-out-expo',\n },\n overlay: {\n closed: 'opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n container: {\n closed: 'transform scale-95 opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n }),\n },\n },\n };\n\n open() {\n this.$refs.modal.style.visibility = '';\n return super.open();\n }\n\n async close() {\n await super.close();\n this.$refs.modal.style.visibility = 'hidden';\n return Promise.resolve();\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAsB;AAKf,IAAM,sBAAN,cAAmE,mBAAS;AAAA,EAiCjF,OAAO;AACL,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,MAAM,MAAM;AAClB,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAAA;AAAA;AAAA;AAvCE,cAJW,qBAIJ,UAAqB;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AAAA,IACP,QAAQ;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA,MAIN,SAAS,OAAO;AAAA,QACd,OAAO;AAAA,UACL,QAAQ;AAAA,YACN,SAAS;AAAA,YACT,eAAe;AAAA,UACjB;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,QACA,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { Modal } from "./Modal.js";
|
|
2
2
|
class ModalWithTransition extends Modal {
|
|
3
|
+
/**
|
|
4
|
+
* Modal options.
|
|
5
|
+
*/
|
|
3
6
|
static config = {
|
|
4
7
|
name: "ModalWithTransition",
|
|
5
8
|
options: {
|
|
6
9
|
styles: {
|
|
7
10
|
type: Object,
|
|
11
|
+
/**
|
|
12
|
+
* @returns {ModalStylesOption}
|
|
13
|
+
*/
|
|
8
14
|
default: () => ({
|
|
9
15
|
modal: {
|
|
10
16
|
closed: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Modal/ModalWithTransition.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { Modal } from './Modal.js';\n\n/**\n * ModalWithTransition class.\n */\nexport class ModalWithTransition<T extends BaseProps = BaseProps> extends Modal<T> {\n /**\n * Modal options.\n */\n static config:BaseConfig = {\n name: 'ModalWithTransition',\n options: {\n styles: {\n type: Object,\n /**\n * @returns {ModalStylesOption}\n */\n default: () => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n },\n active: 'transition duration-500 ease-out-expo',\n },\n overlay: {\n closed: 'opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n container: {\n closed: 'transform scale-95 opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n }),\n },\n },\n };\n\n open() {\n this.$refs.modal.style.visibility = '';\n return super.open();\n }\n\n async close() {\n await super.close();\n this.$refs.modal.style.visibility = 'hidden';\n return Promise.resolve();\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,aAAa;AAKf,MAAM,4BAA6D,MAAS;AAAA,EAIjF,OAAO,
|
|
4
|
+
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { Modal } from './Modal.js';\n\n/**\n * ModalWithTransition class.\n */\nexport class ModalWithTransition<T extends BaseProps = BaseProps> extends Modal<T> {\n /**\n * Modal options.\n */\n static config: BaseConfig = {\n name: 'ModalWithTransition',\n options: {\n styles: {\n type: Object,\n /**\n * @returns {ModalStylesOption}\n */\n default: () => ({\n modal: {\n closed: {\n opacity: '0',\n pointerEvents: 'none',\n },\n active: 'transition duration-500 ease-out-expo',\n },\n overlay: {\n closed: 'opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n container: {\n closed: 'transform scale-95 opacity-0',\n active: 'transition duration-500 ease-out-expo',\n },\n }),\n },\n },\n };\n\n open() {\n this.$refs.modal.style.visibility = '';\n return super.open();\n }\n\n async close() {\n await super.close();\n this.$refs.modal.style.visibility = 'hidden';\n return Promise.resolve();\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,aAAa;AAKf,MAAM,4BAA6D,MAAS;AAAA;AAAA;AAAA;AAAA,EAIjF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,MAAM;AAAA;AAAA;AAAA;AAAA,QAIN,SAAS,OAAO;AAAA,UACd,OAAO;AAAA,YACL,QAAQ;AAAA,cACN,SAAS;AAAA,cACT,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,UACV;AAAA,UACA,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,UACA,WAAW;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AACL,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,MAAM,MAAM;AAClB,SAAK,MAAM,MAAM,MAAM,aAAa;AACpC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -32,6 +32,10 @@ var import_Modal = require("../Modal/index.cjs");
|
|
|
32
32
|
var DEFAULT_POSITION = "left";
|
|
33
33
|
var _Panel = class extends import_Modal.Modal {
|
|
34
34
|
isClosing = false;
|
|
35
|
+
/**
|
|
36
|
+
* Get the translation class.
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
35
39
|
get translateClass() {
|
|
36
40
|
return _Panel.translateClasses[this.$options.position] ?? _Panel.translateClasses[DEFAULT_POSITION];
|
|
37
41
|
}
|
|
@@ -53,6 +57,12 @@ var _Panel = class extends import_Modal.Modal {
|
|
|
53
57
|
};
|
|
54
58
|
return (0, import_utils.matrix)(store[this.$options.position]);
|
|
55
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Animate before opening.
|
|
62
|
+
*
|
|
63
|
+
* @this {PanelInterface}
|
|
64
|
+
* @returns {Promise<void>}
|
|
65
|
+
*/
|
|
56
66
|
async open() {
|
|
57
67
|
if (this.isOpen) {
|
|
58
68
|
return Promise.resolve();
|
|
@@ -75,6 +85,12 @@ var _Panel = class extends import_Modal.Modal {
|
|
|
75
85
|
});
|
|
76
86
|
return super.open();
|
|
77
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Animate before closing.
|
|
90
|
+
*
|
|
91
|
+
* @this {PanelInterface}
|
|
92
|
+
* @returns {Promise<void>}
|
|
93
|
+
*/
|
|
78
94
|
async close() {
|
|
79
95
|
if (!this.isOpen || this.isClosing) {
|
|
80
96
|
return Promise.resolve();
|
|
@@ -107,6 +123,9 @@ var _Panel = class extends import_Modal.Modal {
|
|
|
107
123
|
}
|
|
108
124
|
};
|
|
109
125
|
var Panel = _Panel;
|
|
126
|
+
/**
|
|
127
|
+
* Config.
|
|
128
|
+
*/
|
|
110
129
|
__publicField(Panel, "config", {
|
|
111
130
|
name: "Panel",
|
|
112
131
|
options: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Panel/Panel.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, matrix } from '@studiometa/js-toolkit/utils';\nimport { Modal } from '../Modal/index.js';\n\nexport interface PanelProps extends BaseProps {\n $options: {\n position: 'top' | 'right' | 'bottom' | 'left'
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAmC;AACnC,mBAAsB;AAQtB,IAAM,mBAAmB;AAKlB,IAAM,SAAN,cAAqD,mBAAsB;AAAA,EAqBhF,YAAY;AAAA,EAMZ,IAAI,iBAAiB;AACnB,WACE,OAAM,iBAAiB,KAAK,SAAS,
|
|
4
|
+
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, matrix } from '@studiometa/js-toolkit/utils';\nimport { Modal } from '../Modal/index.js';\n\nexport interface PanelProps extends BaseProps {\n $options: {\n position: 'top' | 'right' | 'bottom' | 'left';\n };\n}\n\nconst DEFAULT_POSITION = 'left';\n\n/**\n * Panel class.\n */\nexport class Panel<T extends BaseProps = BaseProps> extends Modal<T & PanelProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Panel',\n options: {\n position: {\n type: String,\n default: DEFAULT_POSITION,\n },\n },\n };\n\n static translateClasses = {\n top: '-translate-y-full',\n right: 'translate-x-full',\n bottom: 'translate-y-full',\n left: '-translate-x-full',\n };\n\n isClosing = false;\n\n /**\n * Get the translation class.\n * @returns {string}\n */\n get translateClass() {\n return (\n Panel.translateClasses[this.$options.position] ?? Panel.translateClasses[DEFAULT_POSITION]\n );\n }\n\n get containerOffset() {\n const { offsetTop, offsetLeft, offsetWidth, offsetHeight } = this.$refs.container;\n\n const store = {\n top: {\n translateY: (offsetTop + offsetHeight) * -1,\n },\n right: {\n translateX: window.innerWidth - offsetLeft + offsetWidth * 2,\n },\n bottom: {\n translateY: window.innerHeight - offsetTop + offsetHeight * 2,\n },\n left: {\n translateX: (offsetLeft + offsetWidth) * -1,\n },\n };\n\n return matrix(store[this.$options.position]);\n }\n\n /**\n * Animate before opening.\n *\n * @this {PanelInterface}\n * @returns {Promise<void>}\n */\n async open() {\n if (this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.classList.remove('pointer-events-none');\n transition(\n this.$refs.container,\n {\n from: {\n transform: this.containerOffset,\n },\n to: {\n transform: 'none',\n },\n },\n 'keep',\n );\n transition(this.$refs.overlay, {\n from: 'opacity-0',\n });\n\n return super.open();\n }\n\n /**\n * Animate before closing.\n *\n * @this {PanelInterface}\n * @returns {Promise<void>}\n */\n async close() {\n if (!this.isOpen || this.isClosing) {\n return Promise.resolve();\n }\n\n this.isClosing = true;\n\n this.$refs.modal.classList.add('pointer-events-none');\n await Promise.all([\n transition(\n this.$refs.container,\n {\n from: {\n transform: 'none',\n },\n to: {\n transform: this.containerOffset,\n },\n },\n 'keep',\n ),\n transition(\n this.$refs.overlay,\n {\n to: 'opacity-0',\n },\n 'keep',\n ),\n ]);\n\n this.isClosing = false;\n\n return super.close();\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAmC;AACnC,mBAAsB;AAQtB,IAAM,mBAAmB;AAKlB,IAAM,SAAN,cAAqD,mBAAsB;AAAA,EAqBhF,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,IAAI,iBAAiB;AACnB,WACE,OAAM,iBAAiB,KAAK,SAAS,QAAQ,KAAK,OAAM,iBAAiB,gBAAgB;AAAA,EAE7F;AAAA,EAEA,IAAI,kBAAkB;AACpB,UAAM,EAAE,WAAW,YAAY,aAAa,aAAa,IAAI,KAAK,MAAM;AAExE,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,QACH,aAAa,YAAY,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,QACL,YAAY,OAAO,aAAa,aAAa,cAAc;AAAA,MAC7D;AAAA,MACA,QAAQ;AAAA,QACN,YAAY,OAAO,cAAc,YAAY,eAAe;AAAA,MAC9D;AAAA,MACA,MAAM;AAAA,QACJ,aAAa,aAAa,eAAe;AAAA,MAC3C;AAAA,IACF;AAEA,eAAO,qBAAO,MAAM,KAAK,SAAS,QAAQ,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO;AACX,QAAI,KAAK,QAAQ;AACf,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,SAAK,MAAM,MAAM,UAAU,OAAO,qBAAqB;AACvD;AAAA,MACE,KAAK,MAAM;AAAA,MACX;AAAA,QACE,MAAM;AAAA,UACJ,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,IAAI;AAAA,UACF,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,iCAAW,KAAK,MAAM,SAAS;AAAA,MAC7B,MAAM;AAAA,IACR,CAAC;AAED,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQ;AACZ,QAAI,CAAC,KAAK,UAAU,KAAK,WAAW;AAClC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,SAAK,YAAY;AAEjB,SAAK,MAAM,MAAM,UAAU,IAAI,qBAAqB;AACpD,UAAM,QAAQ,IAAI;AAAA,UAChB;AAAA,QACE,KAAK,MAAM;AAAA,QACX;AAAA,UACE,MAAM;AAAA,YACJ,WAAW;AAAA,UACb;AAAA,UACA,IAAI;AAAA,YACF,WAAW,KAAK;AAAA,UAClB;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,UACA;AAAA,QACE,KAAK,MAAM;AAAA,QACX;AAAA,UACE,IAAI;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAEjB,WAAO,MAAM,MAAM;AAAA,EACrB;AACF;AA7HO,IAAM,QAAN;AAAA;AAAA;AAAA;AAIL,cAJW,OAIJ,UAAqB;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AAAA,IACP,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,cAdW,OAcJ,oBAAmB;AAAA,EACxB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/molecules/Panel/Panel.js
CHANGED
|
@@ -2,6 +2,9 @@ import { transition, matrix } from "@studiometa/js-toolkit/utils";
|
|
|
2
2
|
import { Modal } from "../Modal/index.js";
|
|
3
3
|
const DEFAULT_POSITION = "left";
|
|
4
4
|
class Panel extends Modal {
|
|
5
|
+
/**
|
|
6
|
+
* Config.
|
|
7
|
+
*/
|
|
5
8
|
static config = {
|
|
6
9
|
name: "Panel",
|
|
7
10
|
options: {
|
|
@@ -18,6 +21,10 @@ class Panel extends Modal {
|
|
|
18
21
|
left: "-translate-x-full"
|
|
19
22
|
};
|
|
20
23
|
isClosing = false;
|
|
24
|
+
/**
|
|
25
|
+
* Get the translation class.
|
|
26
|
+
* @returns {string}
|
|
27
|
+
*/
|
|
21
28
|
get translateClass() {
|
|
22
29
|
return Panel.translateClasses[this.$options.position] ?? Panel.translateClasses[DEFAULT_POSITION];
|
|
23
30
|
}
|
|
@@ -39,6 +46,12 @@ class Panel extends Modal {
|
|
|
39
46
|
};
|
|
40
47
|
return matrix(store[this.$options.position]);
|
|
41
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Animate before opening.
|
|
51
|
+
*
|
|
52
|
+
* @this {PanelInterface}
|
|
53
|
+
* @returns {Promise<void>}
|
|
54
|
+
*/
|
|
42
55
|
async open() {
|
|
43
56
|
if (this.isOpen) {
|
|
44
57
|
return Promise.resolve();
|
|
@@ -61,6 +74,12 @@ class Panel extends Modal {
|
|
|
61
74
|
});
|
|
62
75
|
return super.open();
|
|
63
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Animate before closing.
|
|
79
|
+
*
|
|
80
|
+
* @this {PanelInterface}
|
|
81
|
+
* @returns {Promise<void>}
|
|
82
|
+
*/
|
|
64
83
|
async close() {
|
|
65
84
|
if (!this.isOpen || this.isClosing) {
|
|
66
85
|
return Promise.resolve();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/ui/molecules/Panel/Panel.ts"],
|
|
4
|
-
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, matrix } from '@studiometa/js-toolkit/utils';\nimport { Modal } from '../Modal/index.js';\n\nexport interface PanelProps extends BaseProps {\n $options: {\n position: 'top' | 'right' | 'bottom' | 'left'
|
|
5
|
-
"mappings": "AACA,SAAS,YAAY,cAAc;AACnC,SAAS,aAAa;AAQtB,MAAM,mBAAmB;AAKlB,MAAM,cAA+C,MAAsB;AAAA,EAIhF,OAAO,
|
|
4
|
+
"sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { transition, matrix } from '@studiometa/js-toolkit/utils';\nimport { Modal } from '../Modal/index.js';\n\nexport interface PanelProps extends BaseProps {\n $options: {\n position: 'top' | 'right' | 'bottom' | 'left';\n };\n}\n\nconst DEFAULT_POSITION = 'left';\n\n/**\n * Panel class.\n */\nexport class Panel<T extends BaseProps = BaseProps> extends Modal<T & PanelProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Panel',\n options: {\n position: {\n type: String,\n default: DEFAULT_POSITION,\n },\n },\n };\n\n static translateClasses = {\n top: '-translate-y-full',\n right: 'translate-x-full',\n bottom: 'translate-y-full',\n left: '-translate-x-full',\n };\n\n isClosing = false;\n\n /**\n * Get the translation class.\n * @returns {string}\n */\n get translateClass() {\n return (\n Panel.translateClasses[this.$options.position] ?? Panel.translateClasses[DEFAULT_POSITION]\n );\n }\n\n get containerOffset() {\n const { offsetTop, offsetLeft, offsetWidth, offsetHeight } = this.$refs.container;\n\n const store = {\n top: {\n translateY: (offsetTop + offsetHeight) * -1,\n },\n right: {\n translateX: window.innerWidth - offsetLeft + offsetWidth * 2,\n },\n bottom: {\n translateY: window.innerHeight - offsetTop + offsetHeight * 2,\n },\n left: {\n translateX: (offsetLeft + offsetWidth) * -1,\n },\n };\n\n return matrix(store[this.$options.position]);\n }\n\n /**\n * Animate before opening.\n *\n * @this {PanelInterface}\n * @returns {Promise<void>}\n */\n async open() {\n if (this.isOpen) {\n return Promise.resolve();\n }\n\n this.$refs.modal.classList.remove('pointer-events-none');\n transition(\n this.$refs.container,\n {\n from: {\n transform: this.containerOffset,\n },\n to: {\n transform: 'none',\n },\n },\n 'keep',\n );\n transition(this.$refs.overlay, {\n from: 'opacity-0',\n });\n\n return super.open();\n }\n\n /**\n * Animate before closing.\n *\n * @this {PanelInterface}\n * @returns {Promise<void>}\n */\n async close() {\n if (!this.isOpen || this.isClosing) {\n return Promise.resolve();\n }\n\n this.isClosing = true;\n\n this.$refs.modal.classList.add('pointer-events-none');\n await Promise.all([\n transition(\n this.$refs.container,\n {\n from: {\n transform: 'none',\n },\n to: {\n transform: this.containerOffset,\n },\n },\n 'keep',\n ),\n transition(\n this.$refs.overlay,\n {\n to: 'opacity-0',\n },\n 'keep',\n ),\n ]);\n\n this.isClosing = false;\n\n return super.close();\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,YAAY,cAAc;AACnC,SAAS,aAAa;AAQtB,MAAM,mBAAmB;AAKlB,MAAM,cAA+C,MAAsB;AAAA;AAAA;AAAA;AAAA,EAIhF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,UAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,mBAAmB;AAAA,IACxB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EAEA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,IAAI,iBAAiB;AACnB,WACE,MAAM,iBAAiB,KAAK,SAAS,QAAQ,KAAK,MAAM,iBAAiB,gBAAgB;AAAA,EAE7F;AAAA,EAEA,IAAI,kBAAkB;AACpB,UAAM,EAAE,WAAW,YAAY,aAAa,aAAa,IAAI,KAAK,MAAM;AAExE,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,QACH,aAAa,YAAY,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,QACL,YAAY,OAAO,aAAa,aAAa,cAAc;AAAA,MAC7D;AAAA,MACA,QAAQ;AAAA,QACN,YAAY,OAAO,cAAc,YAAY,eAAe;AAAA,MAC9D;AAAA,MACA,MAAM;AAAA,QACJ,aAAa,aAAa,eAAe;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO,OAAO,MAAM,KAAK,SAAS,QAAQ,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO;AACX,QAAI,KAAK,QAAQ;AACf,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,SAAK,MAAM,MAAM,UAAU,OAAO,qBAAqB;AACvD;AAAA,MACE,KAAK,MAAM;AAAA,MACX;AAAA,QACE,MAAM;AAAA,UACJ,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,IAAI;AAAA,UACF,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,eAAW,KAAK,MAAM,SAAS;AAAA,MAC7B,MAAM;AAAA,IACR,CAAC;AAED,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQ;AACZ,QAAI,CAAC,KAAK,UAAU,KAAK,WAAW;AAClC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,SAAK,YAAY;AAEjB,SAAK,MAAM,MAAM,UAAU,IAAI,qBAAqB;AACpD,UAAM,QAAQ,IAAI;AAAA,MAChB;AAAA,QACE,KAAK,MAAM;AAAA,QACX;AAAA,UACE,MAAM;AAAA,YACJ,WAAW;AAAA,UACb;AAAA,UACA,IAAI;AAAA,YACF,WAAW,KAAK;AAAA,UAClB;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,KAAK,MAAM;AAAA,QACX;AAAA,UACE,IAAI;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAEjB,WAAO,MAAM,MAAM;AAAA,EACrB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|