@launchpad-ui/drawer 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Drawer.d.ts +2 -1
- package/dist/Drawer.d.ts.map +1 -1
- package/dist/index.es.js +13 -9
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/style.css +28 -24
- package/package.json +5 -5
package/dist/Drawer.d.ts
CHANGED
@@ -5,9 +5,10 @@ type DrawerProps = {
|
|
5
5
|
onCancel?(): void;
|
6
6
|
'data-test-id'?: string;
|
7
7
|
size?: 'small' | 'medium' | 'large' | 'xLarge' | 'full';
|
8
|
+
theme?: 'dark' | 'default';
|
8
9
|
hideCancel?: boolean;
|
9
10
|
};
|
10
|
-
declare const Drawer: ({ className, children, onCancel, size, "data-test-id": testId, hideCancel, }: DrawerProps) => JSX.Element;
|
11
|
+
declare const Drawer: ({ className, children, onCancel, size, "data-test-id": testId, theme, hideCancel, }: DrawerProps) => JSX.Element;
|
11
12
|
export { Drawer };
|
12
13
|
export type { DrawerProps };
|
13
14
|
//# sourceMappingURL=Drawer.d.ts.map
|
package/dist/Drawer.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../src/Drawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,OAAO,CAAC;AAoCnD,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,IAAI,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,MAAM,
|
1
|
+
{"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../src/Drawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,OAAO,CAAC;AAoCnD,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,IAAI,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,MAAM,wFAQT,WAAW,gBAgFb,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/index.es.js
CHANGED
@@ -10,15 +10,15 @@ import { LazyMotion, m } from "framer-motion";
|
|
10
10
|
import { useRef, useEffect, Suspense } from "react";
|
11
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
12
12
|
const DRAWER_LABELLED_BY = "drawer-title";
|
13
|
-
const drawer = "
|
14
|
-
const overlay$1 = "
|
15
|
-
const content = "
|
16
|
-
const small = "
|
17
|
-
const medium = "
|
18
|
-
const large = "
|
19
|
-
const xLarge = "
|
20
|
-
const full = "
|
21
|
-
const closeButton = "
|
13
|
+
const drawer = "_drawer_b2us9_12";
|
14
|
+
const overlay$1 = "_overlay_b2us9_34";
|
15
|
+
const content = "_content_b2us9_43";
|
16
|
+
const small = "_small_b2us9_57";
|
17
|
+
const medium = "_medium_b2us9_61";
|
18
|
+
const large = "_large_b2us9_65";
|
19
|
+
const xLarge = "_xLarge_b2us9_69";
|
20
|
+
const full = "_full_b2us9_73";
|
21
|
+
const closeButton = "_closeButton_b2us9_87";
|
22
22
|
const styles = {
|
23
23
|
drawer,
|
24
24
|
overlay: overlay$1,
|
@@ -68,6 +68,7 @@ const Drawer = ({
|
|
68
68
|
onCancel,
|
69
69
|
size = "small",
|
70
70
|
"data-test-id": testId = "drawer",
|
71
|
+
theme,
|
71
72
|
hideCancel = false
|
72
73
|
}) => {
|
73
74
|
const ref = useRef(null);
|
@@ -126,6 +127,9 @@ const Drawer = ({
|
|
126
127
|
"aria-modal": true,
|
127
128
|
className: styles.content,
|
128
129
|
tabIndex: -1,
|
130
|
+
...theme ? {
|
131
|
+
"data-theme": theme
|
132
|
+
} : {},
|
129
133
|
children: [!hideCancel && /* @__PURE__ */ jsx(IconButton, {
|
130
134
|
"aria-label": "close",
|
131
135
|
icon: /* @__PURE__ */ jsx(Close, {
|
package/dist/index.es.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/constants.ts","../src/Drawer.tsx","../src/DrawerHeader.tsx"],"sourcesContent":["export const DRAWER_LABELLED_BY = 'drawer-title';\n","import type { Variants } from 'framer-motion';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { FocusTrap } from '@launchpad-ui/focus-trap';\nimport { Close } from '@launchpad-ui/icons';\nimport { Portal } from '@launchpad-ui/portal';\nimport { Progress } from '@launchpad-ui/progress';\nimport { usePreventScroll } from '@react-aria/overlays';\nimport { cx } from 'classix';\nimport { LazyMotion, m } from 'framer-motion';\nimport { Suspense, useEffect, useRef } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\nimport styles from './styles/Drawer.module.css';\n\nconst overlay: Variants = {\n visible: { opacity: 1, transition: { duration: 0.15 } },\n hidden: { opacity: 0 },\n};\n\nconst slideRight: Variants = {\n hidden: { opacity: 0, x: '25%' },\n visible: {\n opacity: 1,\n x: '0%',\n transition: { type: 'spring', delay: 0.15, duration: 0.2, bounce: 0 },\n },\n};\n\nconst loadFeatures = () =>\n import(\n /* webpackChunkName: \"lp-drawer-framer-features\" */\n /* webpackExports: \"domAnimation\" */\n 'framer-motion'\n ).then((res) => res.domAnimation);\n\ntype DrawerProps = {\n children?: ReactNode;\n className?: string;\n onCancel?(): void;\n 'data-test-id'?: string;\n size?: 'small' | 'medium' | 'large' | 'xLarge' | 'full';\n hideCancel?: boolean;\n};\n\nconst Drawer = ({\n className,\n children,\n onCancel,\n size = 'small',\n 'data-test-id': testId = 'drawer',\n hideCancel = false,\n}: DrawerProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n usePreventScroll();\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n event.stopImmediatePropagation();\n const latest = [...document.querySelectorAll('[data-drawer]')].pop();\n if (event.key === 'Escape' && latest === ref.current) {\n close();\n }\n };\n\n const close = () => {\n onCancel?.();\n };\n\n document.body.classList.add('has-overlay');\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.classList.remove('has-overlay');\n document.removeEventListener('keydown', handleEscape);\n };\n }, [onCancel, testId]);\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onCancel && onCancel();\n }\n };\n\n return (\n <Portal>\n <LazyMotion strict features={loadFeatures}>\n <div\n className={cx(styles.drawer, styles[size], className)}\n data-drawer\n data-test-id={testId}\n ref={ref}\n >\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={overlay}\n transition={{ duration: 0.15 }}\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n >\n <FocusTrap autoFocus restoreFocus>\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={slideRight}\n role=\"dialog\"\n aria-labelledby={DRAWER_LABELLED_BY}\n aria-modal\n className={styles.content}\n tabIndex={-1}\n >\n {!hideCancel && (\n <IconButton\n aria-label=\"close\"\n icon={<Close size=\"medium\" />}\n className={styles.closeButton}\n onClick={onCancel}\n data-test-id=\"drawer-close-button\"\n />\n )}\n <Suspense fallback={<Progress />}>{children}</Suspense>\n </m.div>\n </FocusTrap>\n </m.div>\n </div>\n </LazyMotion>\n </Portal>\n );\n};\n\nexport { Drawer };\nexport type { DrawerProps };\n","import type { HTMLAttributes } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\n\ntype DrawerHeaderProps = HTMLAttributes<HTMLDivElement> & {\n closeable?: boolean;\n titleID?: string;\n titleClassName?: string;\n onClose?(): void;\n 'data-test-id'?: string;\n};\n\nconst DrawerHeader = ({\n className,\n children,\n titleID,\n titleClassName,\n 'data-test-id': testId = 'drawer-header',\n ...rest\n}: DrawerHeaderProps) => {\n return (\n <div data-test-id={testId} className={className} {...rest}>\n <h2 id={DRAWER_LABELLED_BY} className={titleClassName}>\n {children}\n </h2>\n </div>\n );\n};\n\nexport { DrawerHeader };\nexport type { DrawerHeaderProps };\n"],"names":["overlay","visible","opacity","transition","duration","hidden","slideRight","x","type","delay","bounce","loadFeatures","then","res","domAnimation","Drawer","className","children","onCancel","size","testId","hideCancel","ref","useRef","useEffect","handleEscape","event","stopImmediatePropagation","latest","document","querySelectorAll","pop","key","current","close","body","classList","add","addEventListener","remove","removeEventListener","handleOverlayClick","target","currentTarget","cx","styles","drawer","
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/constants.ts","../src/Drawer.tsx","../src/DrawerHeader.tsx"],"sourcesContent":["export const DRAWER_LABELLED_BY = 'drawer-title';\n","import type { Variants } from 'framer-motion';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { FocusTrap } from '@launchpad-ui/focus-trap';\nimport { Close } from '@launchpad-ui/icons';\nimport { Portal } from '@launchpad-ui/portal';\nimport { Progress } from '@launchpad-ui/progress';\nimport { usePreventScroll } from '@react-aria/overlays';\nimport { cx } from 'classix';\nimport { LazyMotion, m } from 'framer-motion';\nimport { Suspense, useEffect, useRef } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\nimport styles from './styles/Drawer.module.css';\n\nconst overlay: Variants = {\n visible: { opacity: 1, transition: { duration: 0.15 } },\n hidden: { opacity: 0 },\n};\n\nconst slideRight: Variants = {\n hidden: { opacity: 0, x: '25%' },\n visible: {\n opacity: 1,\n x: '0%',\n transition: { type: 'spring', delay: 0.15, duration: 0.2, bounce: 0 },\n },\n};\n\nconst loadFeatures = () =>\n import(\n /* webpackChunkName: \"lp-drawer-framer-features\" */\n /* webpackExports: \"domAnimation\" */\n 'framer-motion'\n ).then((res) => res.domAnimation);\n\ntype DrawerProps = {\n children?: ReactNode;\n className?: string;\n onCancel?(): void;\n 'data-test-id'?: string;\n size?: 'small' | 'medium' | 'large' | 'xLarge' | 'full';\n theme?: 'dark' | 'default';\n hideCancel?: boolean;\n};\n\nconst Drawer = ({\n className,\n children,\n onCancel,\n size = 'small',\n 'data-test-id': testId = 'drawer',\n theme,\n hideCancel = false,\n}: DrawerProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n usePreventScroll();\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n event.stopImmediatePropagation();\n const latest = [...document.querySelectorAll('[data-drawer]')].pop();\n if (event.key === 'Escape' && latest === ref.current) {\n close();\n }\n };\n\n const close = () => {\n onCancel?.();\n };\n\n document.body.classList.add('has-overlay');\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.classList.remove('has-overlay');\n document.removeEventListener('keydown', handleEscape);\n };\n }, [onCancel, testId]);\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onCancel && onCancel();\n }\n };\n\n return (\n <Portal>\n <LazyMotion strict features={loadFeatures}>\n <div\n className={cx(styles.drawer, styles[size], className)}\n data-drawer\n data-test-id={testId}\n ref={ref}\n >\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={overlay}\n transition={{ duration: 0.15 }}\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n >\n <FocusTrap autoFocus restoreFocus>\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={slideRight}\n role=\"dialog\"\n aria-labelledby={DRAWER_LABELLED_BY}\n aria-modal\n className={styles.content}\n tabIndex={-1}\n {...(theme ? { 'data-theme': theme } : {})}\n >\n {!hideCancel && (\n <IconButton\n aria-label=\"close\"\n icon={<Close size=\"medium\" />}\n className={styles.closeButton}\n onClick={onCancel}\n data-test-id=\"drawer-close-button\"\n />\n )}\n <Suspense fallback={<Progress />}>{children}</Suspense>\n </m.div>\n </FocusTrap>\n </m.div>\n </div>\n </LazyMotion>\n </Portal>\n );\n};\n\nexport { Drawer };\nexport type { DrawerProps };\n","import type { HTMLAttributes } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\n\ntype DrawerHeaderProps = HTMLAttributes<HTMLDivElement> & {\n closeable?: boolean;\n titleID?: string;\n titleClassName?: string;\n onClose?(): void;\n 'data-test-id'?: string;\n};\n\nconst DrawerHeader = ({\n className,\n children,\n titleID,\n titleClassName,\n 'data-test-id': testId = 'drawer-header',\n ...rest\n}: DrawerHeaderProps) => {\n return (\n <div data-test-id={testId} className={className} {...rest}>\n <h2 id={DRAWER_LABELLED_BY} className={titleClassName}>\n {children}\n </h2>\n </div>\n );\n};\n\nexport { DrawerHeader };\nexport type { DrawerHeaderProps };\n"],"names":["overlay","visible","opacity","transition","duration","hidden","slideRight","x","type","delay","bounce","loadFeatures","then","res","domAnimation","Drawer","className","children","onCancel","size","testId","theme","hideCancel","ref","useRef","useEffect","handleEscape","event","stopImmediatePropagation","latest","document","querySelectorAll","pop","key","current","close","body","classList","add","addEventListener","remove","removeEventListener","handleOverlayClick","target","currentTarget","Portal","LazyMotion","strict","features","cx","styles","drawer","m","div","initial","animate","variants","role","onMouseDown","FocusTrap","autoFocus","restoreFocus","DRAWER_LABELLED_BY","content","tabIndex","IconButton","icon","Close","closeButton","onClick","_jsx","Suspense","fallback","Progress","DrawerHeader","titleID","titleClassName","rest","id"],"mappings":"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"}
|
package/dist/index.js
CHANGED
@@ -30,15 +30,15 @@ function _interopNamespace(e) {
|
|
30
30
|
return Object.freeze(n);
|
31
31
|
}
|
32
32
|
const DRAWER_LABELLED_BY = "drawer-title";
|
33
|
-
const drawer = "
|
34
|
-
const overlay$1 = "
|
35
|
-
const content = "
|
36
|
-
const small = "
|
37
|
-
const medium = "
|
38
|
-
const large = "
|
39
|
-
const xLarge = "
|
40
|
-
const full = "
|
41
|
-
const closeButton = "
|
33
|
+
const drawer = "_drawer_b2us9_12";
|
34
|
+
const overlay$1 = "_overlay_b2us9_34";
|
35
|
+
const content = "_content_b2us9_43";
|
36
|
+
const small = "_small_b2us9_57";
|
37
|
+
const medium = "_medium_b2us9_61";
|
38
|
+
const large = "_large_b2us9_65";
|
39
|
+
const xLarge = "_xLarge_b2us9_69";
|
40
|
+
const full = "_full_b2us9_73";
|
41
|
+
const closeButton = "_closeButton_b2us9_87";
|
42
42
|
const styles = {
|
43
43
|
drawer,
|
44
44
|
overlay: overlay$1,
|
@@ -86,6 +86,7 @@ const Drawer = ({
|
|
86
86
|
onCancel,
|
87
87
|
size = "small",
|
88
88
|
"data-test-id": testId = "drawer",
|
89
|
+
theme,
|
89
90
|
hideCancel = false
|
90
91
|
}) => {
|
91
92
|
const ref = react.useRef(null);
|
@@ -144,6 +145,9 @@ const Drawer = ({
|
|
144
145
|
"aria-modal": true,
|
145
146
|
className: styles.content,
|
146
147
|
tabIndex: -1,
|
148
|
+
...theme ? {
|
149
|
+
"data-theme": theme
|
150
|
+
} : {},
|
147
151
|
children: [!hideCancel && /* @__PURE__ */ jsxRuntime.jsx(button.IconButton, {
|
148
152
|
"aria-label": "close",
|
149
153
|
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Close, {
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/Drawer.tsx","../src/DrawerHeader.tsx"],"sourcesContent":["export const DRAWER_LABELLED_BY = 'drawer-title';\n","import type { Variants } from 'framer-motion';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { FocusTrap } from '@launchpad-ui/focus-trap';\nimport { Close } from '@launchpad-ui/icons';\nimport { Portal } from '@launchpad-ui/portal';\nimport { Progress } from '@launchpad-ui/progress';\nimport { usePreventScroll } from '@react-aria/overlays';\nimport { cx } from 'classix';\nimport { LazyMotion, m } from 'framer-motion';\nimport { Suspense, useEffect, useRef } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\nimport styles from './styles/Drawer.module.css';\n\nconst overlay: Variants = {\n visible: { opacity: 1, transition: { duration: 0.15 } },\n hidden: { opacity: 0 },\n};\n\nconst slideRight: Variants = {\n hidden: { opacity: 0, x: '25%' },\n visible: {\n opacity: 1,\n x: '0%',\n transition: { type: 'spring', delay: 0.15, duration: 0.2, bounce: 0 },\n },\n};\n\nconst loadFeatures = () =>\n import(\n /* webpackChunkName: \"lp-drawer-framer-features\" */\n /* webpackExports: \"domAnimation\" */\n 'framer-motion'\n ).then((res) => res.domAnimation);\n\ntype DrawerProps = {\n children?: ReactNode;\n className?: string;\n onCancel?(): void;\n 'data-test-id'?: string;\n size?: 'small' | 'medium' | 'large' | 'xLarge' | 'full';\n hideCancel?: boolean;\n};\n\nconst Drawer = ({\n className,\n children,\n onCancel,\n size = 'small',\n 'data-test-id': testId = 'drawer',\n hideCancel = false,\n}: DrawerProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n usePreventScroll();\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n event.stopImmediatePropagation();\n const latest = [...document.querySelectorAll('[data-drawer]')].pop();\n if (event.key === 'Escape' && latest === ref.current) {\n close();\n }\n };\n\n const close = () => {\n onCancel?.();\n };\n\n document.body.classList.add('has-overlay');\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.classList.remove('has-overlay');\n document.removeEventListener('keydown', handleEscape);\n };\n }, [onCancel, testId]);\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onCancel && onCancel();\n }\n };\n\n return (\n <Portal>\n <LazyMotion strict features={loadFeatures}>\n <div\n className={cx(styles.drawer, styles[size], className)}\n data-drawer\n data-test-id={testId}\n ref={ref}\n >\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={overlay}\n transition={{ duration: 0.15 }}\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n >\n <FocusTrap autoFocus restoreFocus>\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={slideRight}\n role=\"dialog\"\n aria-labelledby={DRAWER_LABELLED_BY}\n aria-modal\n className={styles.content}\n tabIndex={-1}\n >\n {!hideCancel && (\n <IconButton\n aria-label=\"close\"\n icon={<Close size=\"medium\" />}\n className={styles.closeButton}\n onClick={onCancel}\n data-test-id=\"drawer-close-button\"\n />\n )}\n <Suspense fallback={<Progress />}>{children}</Suspense>\n </m.div>\n </FocusTrap>\n </m.div>\n </div>\n </LazyMotion>\n </Portal>\n );\n};\n\nexport { Drawer };\nexport type { DrawerProps };\n","import type { HTMLAttributes } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\n\ntype DrawerHeaderProps = HTMLAttributes<HTMLDivElement> & {\n closeable?: boolean;\n titleID?: string;\n titleClassName?: string;\n onClose?(): void;\n 'data-test-id'?: string;\n};\n\nconst DrawerHeader = ({\n className,\n children,\n titleID,\n titleClassName,\n 'data-test-id': testId = 'drawer-header',\n ...rest\n}: DrawerHeaderProps) => {\n return (\n <div data-test-id={testId} className={className} {...rest}>\n <h2 id={DRAWER_LABELLED_BY} className={titleClassName}>\n {children}\n </h2>\n </div>\n );\n};\n\nexport { DrawerHeader };\nexport type { DrawerHeaderProps };\n"],"names":["overlay","visible","opacity","transition","duration","hidden","slideRight","x","type","delay","bounce","loadFeatures","then","res","domAnimation","Drawer","className","children","onCancel","size","testId","hideCancel","ref","useRef","usePreventScroll","useEffect","handleEscape","event","stopImmediatePropagation","latest","document","querySelectorAll","pop","key","current","close","body","classList","add","addEventListener","remove","removeEventListener","handleOverlayClick","target","currentTarget","Portal","LazyMotion","cx","styles","drawer","
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/Drawer.tsx","../src/DrawerHeader.tsx"],"sourcesContent":["export const DRAWER_LABELLED_BY = 'drawer-title';\n","import type { Variants } from 'framer-motion';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { FocusTrap } from '@launchpad-ui/focus-trap';\nimport { Close } from '@launchpad-ui/icons';\nimport { Portal } from '@launchpad-ui/portal';\nimport { Progress } from '@launchpad-ui/progress';\nimport { usePreventScroll } from '@react-aria/overlays';\nimport { cx } from 'classix';\nimport { LazyMotion, m } from 'framer-motion';\nimport { Suspense, useEffect, useRef } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\nimport styles from './styles/Drawer.module.css';\n\nconst overlay: Variants = {\n visible: { opacity: 1, transition: { duration: 0.15 } },\n hidden: { opacity: 0 },\n};\n\nconst slideRight: Variants = {\n hidden: { opacity: 0, x: '25%' },\n visible: {\n opacity: 1,\n x: '0%',\n transition: { type: 'spring', delay: 0.15, duration: 0.2, bounce: 0 },\n },\n};\n\nconst loadFeatures = () =>\n import(\n /* webpackChunkName: \"lp-drawer-framer-features\" */\n /* webpackExports: \"domAnimation\" */\n 'framer-motion'\n ).then((res) => res.domAnimation);\n\ntype DrawerProps = {\n children?: ReactNode;\n className?: string;\n onCancel?(): void;\n 'data-test-id'?: string;\n size?: 'small' | 'medium' | 'large' | 'xLarge' | 'full';\n theme?: 'dark' | 'default';\n hideCancel?: boolean;\n};\n\nconst Drawer = ({\n className,\n children,\n onCancel,\n size = 'small',\n 'data-test-id': testId = 'drawer',\n theme,\n hideCancel = false,\n}: DrawerProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n usePreventScroll();\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n event.stopImmediatePropagation();\n const latest = [...document.querySelectorAll('[data-drawer]')].pop();\n if (event.key === 'Escape' && latest === ref.current) {\n close();\n }\n };\n\n const close = () => {\n onCancel?.();\n };\n\n document.body.classList.add('has-overlay');\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.classList.remove('has-overlay');\n document.removeEventListener('keydown', handleEscape);\n };\n }, [onCancel, testId]);\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onCancel && onCancel();\n }\n };\n\n return (\n <Portal>\n <LazyMotion strict features={loadFeatures}>\n <div\n className={cx(styles.drawer, styles[size], className)}\n data-drawer\n data-test-id={testId}\n ref={ref}\n >\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={overlay}\n transition={{ duration: 0.15 }}\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n >\n <FocusTrap autoFocus restoreFocus>\n <m.div\n initial=\"hidden\"\n animate=\"visible\"\n variants={slideRight}\n role=\"dialog\"\n aria-labelledby={DRAWER_LABELLED_BY}\n aria-modal\n className={styles.content}\n tabIndex={-1}\n {...(theme ? { 'data-theme': theme } : {})}\n >\n {!hideCancel && (\n <IconButton\n aria-label=\"close\"\n icon={<Close size=\"medium\" />}\n className={styles.closeButton}\n onClick={onCancel}\n data-test-id=\"drawer-close-button\"\n />\n )}\n <Suspense fallback={<Progress />}>{children}</Suspense>\n </m.div>\n </FocusTrap>\n </m.div>\n </div>\n </LazyMotion>\n </Portal>\n );\n};\n\nexport { Drawer };\nexport type { DrawerProps };\n","import type { HTMLAttributes } from 'react';\n\nimport { DRAWER_LABELLED_BY } from './constants';\n\ntype DrawerHeaderProps = HTMLAttributes<HTMLDivElement> & {\n closeable?: boolean;\n titleID?: string;\n titleClassName?: string;\n onClose?(): void;\n 'data-test-id'?: string;\n};\n\nconst DrawerHeader = ({\n className,\n children,\n titleID,\n titleClassName,\n 'data-test-id': testId = 'drawer-header',\n ...rest\n}: DrawerHeaderProps) => {\n return (\n <div data-test-id={testId} className={className} {...rest}>\n <h2 id={DRAWER_LABELLED_BY} className={titleClassName}>\n {children}\n </h2>\n </div>\n );\n};\n\nexport { DrawerHeader };\nexport type { DrawerHeaderProps };\n"],"names":["overlay","visible","opacity","transition","duration","hidden","slideRight","x","type","delay","bounce","loadFeatures","then","res","domAnimation","Drawer","className","children","onCancel","size","testId","theme","hideCancel","ref","useRef","usePreventScroll","useEffect","handleEscape","event","stopImmediatePropagation","latest","document","querySelectorAll","pop","key","current","close","body","classList","add","addEventListener","remove","removeEventListener","handleOverlayClick","target","currentTarget","Portal","LazyMotion","strict","features","cx","styles","drawer","m","div","initial","animate","variants","role","onMouseDown","FocusTrap","autoFocus","restoreFocus","DRAWER_LABELLED_BY","content","tabIndex","IconButton","icon","Close","closeButton","onClick","_jsx","Suspense","fallback","Progress","DrawerHeader","titleID","titleClassName","rest","id"],"mappings":"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"}
|
package/dist/style.css
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
-
:root
|
2
|
-
|
1
|
+
:root,
|
2
|
+
[data-theme='default'] {
|
3
|
+
--lp-component-drawer-color-bg-overlay: rgba(40, 40, 40, 0.5);
|
3
4
|
}
|
4
|
-
|
5
|
-
:
|
6
|
-
--page-gutter-width: 4rem;
|
7
|
-
}
|
5
|
+
[data-theme='dark'] {
|
6
|
+
--lp-component-drawer-color-bg-overlay: rgba(25, 25, 25, 0.75);
|
8
7
|
}
|
9
|
-
.
|
10
|
-
|
11
|
-
|
12
|
-
._drawer_9a6so_17 {
|
8
|
+
._drawer_b2us9_12 {
|
9
|
+
--page-gutter-width: 1rem;
|
10
|
+
|
13
11
|
z-index: var(--lp-z-index-400);
|
14
12
|
position: fixed;
|
15
13
|
top: 0;
|
@@ -18,18 +16,24 @@
|
|
18
16
|
left: 0;
|
19
17
|
transform: translateZ(0);
|
20
18
|
}
|
21
|
-
|
19
|
+
@media screen and (min-width: 740px) {
|
20
|
+
._drawer_b2us9_12 {
|
21
|
+
--page-gutter-width: 4rem;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
.has-overlay {
|
25
|
+
overflow: hidden;
|
26
|
+
}
|
27
|
+
._overlay_b2us9_34 {
|
22
28
|
position: fixed;
|
23
29
|
top: 0;
|
24
30
|
right: 0;
|
25
31
|
bottom: 0;
|
26
32
|
left: 0;
|
27
33
|
background-color: rgba(40, 40, 40, 0.5);
|
34
|
+
background-color: var(--lp-component-drawer-color-bg-overlay);
|
28
35
|
}
|
29
|
-
|
30
|
-
background-color: rgba(25, 25, 25, 0.75);
|
31
|
-
}
|
32
|
-
._content_9a6so_40 {
|
36
|
+
._content_b2us9_43 {
|
33
37
|
background-color: var(--lp-color-bg-ui-primary);
|
34
38
|
position: absolute;
|
35
39
|
top: 0;
|
@@ -38,39 +42,39 @@
|
|
38
42
|
overflow: auto;
|
39
43
|
width: 100vw;
|
40
44
|
max-width: 100vw;
|
45
|
+
color: var(--lp-color-text-ui-secondary);
|
41
46
|
box-shadow: -1px 0 4px var(--lp-color-shadow-ui-primary);
|
42
47
|
}
|
43
48
|
@media screen and (min-width: 740px) {
|
44
|
-
.
|
49
|
+
._small_b2us9_57 ._content_b2us9_43 {
|
45
50
|
width: 45rem;
|
46
51
|
}
|
47
52
|
|
48
|
-
.
|
53
|
+
._medium_b2us9_61 ._content_b2us9_43 {
|
49
54
|
width: 65rem;
|
50
55
|
}
|
51
56
|
|
52
|
-
.
|
57
|
+
._large_b2us9_65 ._content_b2us9_43 {
|
53
58
|
width: 80rem;
|
54
59
|
}
|
55
60
|
|
56
|
-
.
|
61
|
+
._xLarge_b2us9_69 ._content_b2us9_43 {
|
57
62
|
width: 120rem;
|
58
63
|
}
|
59
64
|
|
60
|
-
.
|
65
|
+
._full_b2us9_73 ._content_b2us9_43 {
|
61
66
|
width: 100%;
|
62
67
|
max-width: none;
|
63
68
|
max-width: initial;
|
64
69
|
}
|
65
70
|
}
|
66
|
-
.
|
67
|
-
padding: 3.2rem 1rem;
|
71
|
+
._content_b2us9_43 section {
|
68
72
|
padding: 3.2rem var(--page-gutter-width);
|
69
73
|
}
|
70
|
-
.
|
74
|
+
._content_b2us9_43 section + section {
|
71
75
|
border-top: 1px dotted var(--lp-color-gray-100);
|
72
76
|
}
|
73
|
-
.
|
77
|
+
._closeButton_b2us9_87 {
|
74
78
|
position: absolute;
|
75
79
|
right: 1rem;
|
76
80
|
top: 1rem;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@launchpad-ui/drawer",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.3.0",
|
4
4
|
"status": "alpha",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
@@ -29,12 +29,12 @@
|
|
29
29
|
"@react-aria/overlays": "3.12.1",
|
30
30
|
"classix": "2.1.17",
|
31
31
|
"framer-motion": "9.0.3",
|
32
|
-
"@launchpad-ui/button": "~0.
|
32
|
+
"@launchpad-ui/button": "~0.8.0",
|
33
33
|
"@launchpad-ui/focus-trap": "~0.1.4",
|
34
|
-
"@launchpad-ui/icons": "~0.7.
|
34
|
+
"@launchpad-ui/icons": "~0.7.2",
|
35
35
|
"@launchpad-ui/portal": "~0.1.2",
|
36
|
-
"@launchpad-ui/progress": "~0.5.
|
37
|
-
"@launchpad-ui/tokens": "~0.
|
36
|
+
"@launchpad-ui/progress": "~0.5.19",
|
37
|
+
"@launchpad-ui/tokens": "~0.5.0"
|
38
38
|
},
|
39
39
|
"peerDependencies": {
|
40
40
|
"react": "18.2.0",
|