@dnanpm/ui-components 0.7.0 → 0.8.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/components/Breadcrumb/Breadcrumb.css +9 -9
- package/dist/components/Breadcrumb/Breadcrumb.module.css.cjs +6 -6
- package/dist/components/Breadcrumb/Breadcrumb.module.css.js +6 -6
- package/dist/components/Button/Button.css +32 -30
- package/dist/components/Button/Button.module.css.cjs +11 -11
- package/dist/components/Button/Button.module.css.js +11 -11
- package/dist/components/ButtonCard/ButtonCard.cjs +105 -0
- package/dist/components/ButtonCard/ButtonCard.cjs.map +1 -0
- package/dist/components/ButtonCard/ButtonCard.css +167 -0
- package/dist/components/ButtonCard/ButtonCard.d.ts +3 -0
- package/dist/components/ButtonCard/ButtonCard.d.ts.map +1 -0
- package/dist/components/ButtonCard/ButtonCard.js +105 -0
- package/dist/components/ButtonCard/ButtonCard.js.map +1 -0
- package/dist/components/ButtonCard/ButtonCard.module.css.cjs +18 -0
- package/dist/components/ButtonCard/ButtonCard.module.css.cjs.map +1 -0
- package/dist/components/ButtonCard/ButtonCard.module.css.js +19 -0
- package/dist/components/ButtonCard/ButtonCard.module.css.js.map +1 -0
- package/dist/components/ButtonCard/ButtonCard.types.d.ts +103 -0
- package/dist/components/ButtonCard/ButtonCard.types.d.ts.map +1 -0
- package/dist/components/ButtonCard/index.d.ts +3 -0
- package/dist/components/ButtonCard/index.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.cjs +101 -0
- package/dist/components/Drawer/Drawer.cjs.map +1 -0
- package/dist/components/Drawer/Drawer.css +219 -0
- package/dist/components/Drawer/Drawer.d.ts +3 -0
- package/dist/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.js +101 -0
- package/dist/components/Drawer/Drawer.js.map +1 -0
- package/dist/components/Drawer/Drawer.module.css.cjs +37 -0
- package/dist/components/Drawer/Drawer.module.css.cjs.map +1 -0
- package/dist/components/Drawer/Drawer.module.css.js +37 -0
- package/dist/components/Drawer/Drawer.module.css.js.map +1 -0
- package/dist/components/Drawer/Drawer.types.d.ts +63 -0
- package/dist/components/Drawer/Drawer.types.d.ts.map +1 -0
- package/dist/components/Drawer/index.d.ts +3 -0
- package/dist/components/Drawer/index.d.ts.map +1 -0
- package/dist/components/Footer/Footer.css +81 -74
- package/dist/components/Footer/Footer.module.css.cjs +39 -39
- package/dist/components/Footer/Footer.module.css.js +39 -39
- package/dist/components/FunctionButton/FunctionButton.cjs +34 -0
- package/dist/components/FunctionButton/FunctionButton.cjs.map +1 -0
- package/dist/components/FunctionButton/FunctionButton.css +125 -0
- package/dist/components/FunctionButton/FunctionButton.d.ts +3 -0
- package/dist/components/FunctionButton/FunctionButton.d.ts.map +1 -0
- package/dist/components/FunctionButton/FunctionButton.js +34 -0
- package/dist/components/FunctionButton/FunctionButton.js.map +1 -0
- package/dist/components/FunctionButton/FunctionButton.module.css.cjs +11 -0
- package/dist/components/FunctionButton/FunctionButton.module.css.cjs.map +1 -0
- package/dist/components/FunctionButton/FunctionButton.module.css.js +12 -0
- package/dist/components/FunctionButton/FunctionButton.module.css.js.map +1 -0
- package/dist/components/FunctionButton/FunctionButton.types.d.ts +21 -0
- package/dist/components/FunctionButton/FunctionButton.types.d.ts.map +1 -0
- package/dist/components/FunctionButton/index.d.ts +3 -0
- package/dist/components/FunctionButton/index.d.ts.map +1 -0
- package/dist/components/IconButton/IconButton.css +31 -32
- package/dist/components/IconButton/IconButton.module.css.cjs +9 -9
- package/dist/components/IconButton/IconButton.module.css.js +9 -9
- package/dist/components/MainNavigation/MainNavigation.cjs +10 -26
- package/dist/components/MainNavigation/MainNavigation.cjs.map +1 -1
- package/dist/components/MainNavigation/MainNavigation.css +158 -156
- package/dist/components/MainNavigation/MainNavigation.d.ts.map +1 -1
- package/dist/components/MainNavigation/MainNavigation.js +10 -26
- package/dist/components/MainNavigation/MainNavigation.js.map +1 -1
- package/dist/components/MainNavigation/MainNavigation.module.css.cjs +68 -68
- package/dist/components/MainNavigation/MainNavigation.module.css.js +68 -68
- package/dist/components/Modal/Modal.cjs +101 -0
- package/dist/components/Modal/Modal.cjs.map +1 -0
- package/dist/components/Modal/Modal.css +205 -0
- package/dist/components/Modal/Modal.d.ts +3 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -0
- package/dist/components/Modal/Modal.js +101 -0
- package/dist/components/Modal/Modal.js.map +1 -0
- package/dist/components/Modal/Modal.module.css.cjs +39 -0
- package/dist/components/Modal/Modal.module.css.cjs.map +1 -0
- package/dist/components/Modal/Modal.module.css.js +39 -0
- package/dist/components/Modal/Modal.module.css.js.map +1 -0
- package/dist/components/Modal/Modal.types.d.ts +62 -0
- package/dist/components/Modal/Modal.types.d.ts.map +1 -0
- package/dist/components/Modal/index.d.ts +3 -0
- package/dist/components/Modal/index.d.ts.map +1 -0
- package/dist/components/Modal/useDialogDismissal.cjs +41 -0
- package/dist/components/Modal/useDialogDismissal.cjs.map +1 -0
- package/dist/components/Modal/useDialogDismissal.d.ts +17 -0
- package/dist/components/Modal/useDialogDismissal.d.ts.map +1 -0
- package/dist/components/Modal/useDialogDismissal.js +41 -0
- package/dist/components/Modal/useDialogDismissal.js.map +1 -0
- package/dist/components/Modal/useNativeDialog.cjs +126 -0
- package/dist/components/Modal/useNativeDialog.cjs.map +1 -0
- package/dist/components/Modal/useNativeDialog.d.ts +14 -0
- package/dist/components/Modal/useNativeDialog.d.ts.map +1 -0
- package/dist/components/Modal/useNativeDialog.js +126 -0
- package/dist/components/Modal/useNativeDialog.js.map +1 -0
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/styles/utils/elevation.module.css.cjs +3 -0
- package/dist/styles/utils/elevation.module.css.cjs.map +1 -1
- package/dist/styles/utils/elevation.module.css.js +4 -1
- package/dist/styles/utils/elevation.module.css.js.map +1 -1
- package/dist/styles/utils/focus.css +21 -22
- package/dist/styles/utils/focus.module.css.cjs +3 -6
- package/dist/styles/utils/focus.module.css.cjs.map +1 -1
- package/dist/styles/utils/focus.module.css.js +4 -7
- package/dist/styles/utils/focus.module.css.js.map +1 -1
- package/dist/styles/utils/text-decoration.css +3 -2
- package/dist/styles/utils/text-decoration.module.css.cjs +2 -2
- package/dist/styles/utils/text-decoration.module.css.js +2 -2
- package/package.json +3 -3
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
3
|
+
import { Close } from "@dnanpm/icons";
|
|
4
|
+
import elevationStyles from "../../styles/utils/elevation.module.css.js";
|
|
5
|
+
import focusStyles from "../../styles/utils/focus.module.css.js";
|
|
6
|
+
import styles from "./Modal.module.css.js";
|
|
7
|
+
import { useDialogDismissal } from "./useDialogDismissal.js";
|
|
8
|
+
import { useNativeDialog } from "./useNativeDialog.js";
|
|
9
|
+
import { cn } from "../../utils/cn/cn.js";
|
|
10
|
+
const Modal = ({
|
|
11
|
+
open,
|
|
12
|
+
onOpenChange,
|
|
13
|
+
title,
|
|
14
|
+
description,
|
|
15
|
+
children,
|
|
16
|
+
footer,
|
|
17
|
+
size = "medium",
|
|
18
|
+
headerStyle = "light",
|
|
19
|
+
fixedTitle = false,
|
|
20
|
+
alignToTop = false,
|
|
21
|
+
disableCloseOptions = false,
|
|
22
|
+
closeLabel = "Sulje dialogi",
|
|
23
|
+
keepMounted = false,
|
|
24
|
+
className,
|
|
25
|
+
ref,
|
|
26
|
+
onKeyDown,
|
|
27
|
+
onClick,
|
|
28
|
+
onPointerDown,
|
|
29
|
+
"aria-label": ariaLabel,
|
|
30
|
+
"aria-labelledby": ariaLabelledBy,
|
|
31
|
+
"aria-describedby": ariaDescribedBy,
|
|
32
|
+
...props
|
|
33
|
+
}) => {
|
|
34
|
+
const titleId = useId();
|
|
35
|
+
const descriptionId = useId();
|
|
36
|
+
const { dialogRef, close, phase, isPresent } = useNativeDialog({
|
|
37
|
+
open: open ?? false,
|
|
38
|
+
keepMounted,
|
|
39
|
+
onOpenChange
|
|
40
|
+
});
|
|
41
|
+
const describedBy = [description ? descriptionId : void 0, ariaDescribedBy].filter(Boolean).join(" ") || void 0;
|
|
42
|
+
const dialogDismissalProps = useDialogDismissal({
|
|
43
|
+
close,
|
|
44
|
+
disableCloseOptions,
|
|
45
|
+
onClick,
|
|
46
|
+
onKeyDown,
|
|
47
|
+
onPointerDown
|
|
48
|
+
});
|
|
49
|
+
if (!isPresent) return null;
|
|
50
|
+
return /* @__PURE__ */ jsxs(
|
|
51
|
+
"dialog",
|
|
52
|
+
{
|
|
53
|
+
...props,
|
|
54
|
+
ref: (node) => {
|
|
55
|
+
dialogRef.current = node;
|
|
56
|
+
if (typeof ref === "function") ref(node);
|
|
57
|
+
else if (ref) ref.current = node;
|
|
58
|
+
},
|
|
59
|
+
className: cn(
|
|
60
|
+
styles.modal,
|
|
61
|
+
elevationStyles.elevationHigh,
|
|
62
|
+
styles[`modal--${size}`],
|
|
63
|
+
styles[`modal--${headerStyle}`],
|
|
64
|
+
{ [styles["modal--fixed-title"]]: fixedTitle },
|
|
65
|
+
{ [styles["modal--align-top"]]: alignToTop },
|
|
66
|
+
{ [styles["modal--opening"]]: phase !== "closing" },
|
|
67
|
+
{ [styles["modal--closing"]]: phase === "closing" },
|
|
68
|
+
className
|
|
69
|
+
),
|
|
70
|
+
"aria-label": ariaLabel,
|
|
71
|
+
"aria-labelledby": ariaLabelledBy ?? (!ariaLabel && title ? titleId : void 0),
|
|
72
|
+
"aria-describedby": describedBy,
|
|
73
|
+
...dialogDismissalProps,
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ jsxs("div", { className: styles.modal__container, children: [
|
|
76
|
+
!disableCloseOptions && /* @__PURE__ */ jsx(
|
|
77
|
+
"button",
|
|
78
|
+
{
|
|
79
|
+
type: "button",
|
|
80
|
+
className: cn(styles.modal__close, focusStyles.focusable),
|
|
81
|
+
"aria-label": closeLabel,
|
|
82
|
+
"data-dialog-autofocus": "true",
|
|
83
|
+
onClick: close,
|
|
84
|
+
children: /* @__PURE__ */ jsx(Close, { "aria-hidden": "true" })
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
(title || description) && /* @__PURE__ */ jsxs("div", { className: styles.modal__title, children: [
|
|
88
|
+
title && /* @__PURE__ */ jsx("h2", { id: titleId, className: styles.modal__heading, children: title }),
|
|
89
|
+
description && /* @__PURE__ */ jsx("div", { id: descriptionId, className: styles.modal__description, children: description })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsx("div", { className: styles.modal__content, children })
|
|
92
|
+
] }),
|
|
93
|
+
footer && /* @__PURE__ */ jsx("div", { className: styles["modal__bottom-bar"], children: footer })
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
};
|
|
98
|
+
export {
|
|
99
|
+
Modal
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=Modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import { useId } from 'react';\nimport { Close } from '@dnanpm/icons';\nimport { cn } from '../../utils/cn';\nimport elevationStyles from '../../styles/utils/elevation.module.css';\nimport focusStyles from '../../styles/utils/focus.module.css';\nimport styles from './Modal.module.css';\nimport { useDialogDismissal } from './useDialogDismissal';\nimport { useNativeDialog } from './useNativeDialog';\nimport type { ModalProps } from './Modal.types';\n\nexport const Modal = ({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n size = 'medium',\n headerStyle = 'light',\n fixedTitle = false,\n alignToTop = false,\n disableCloseOptions = false,\n closeLabel = 'Sulje dialogi',\n keepMounted = false,\n className,\n ref,\n onKeyDown,\n onClick,\n onPointerDown,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n}: ModalProps) => {\n const titleId = useId();\n const descriptionId = useId();\n const { dialogRef, close, phase, isPresent } = useNativeDialog({\n open: open ?? false,\n keepMounted,\n onOpenChange,\n });\n const describedBy =\n [description ? descriptionId : undefined, ariaDescribedBy].filter(Boolean).join(' ') ||\n undefined;\n const dialogDismissalProps = useDialogDismissal({\n close,\n disableCloseOptions,\n onClick,\n onKeyDown,\n onPointerDown,\n });\n\n if (!isPresent) return null;\n\n return (\n <dialog\n {...props}\n ref={(node) => {\n dialogRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n className={cn(\n styles.modal,\n elevationStyles.elevationHigh,\n styles[`modal--${size}`],\n styles[`modal--${headerStyle}`],\n { [styles['modal--fixed-title']]: fixedTitle },\n { [styles['modal--align-top']]: alignToTop },\n { [styles['modal--opening']]: phase !== 'closing' },\n { [styles['modal--closing']]: phase === 'closing' },\n className,\n )}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ?? (!ariaLabel && title ? titleId : undefined)}\n aria-describedby={describedBy}\n {...dialogDismissalProps}\n >\n <div className={styles.modal__container}>\n {!disableCloseOptions && (\n <button\n type=\"button\"\n className={cn(styles.modal__close, focusStyles.focusable)}\n aria-label={closeLabel}\n data-dialog-autofocus=\"true\"\n onClick={close}\n >\n <Close aria-hidden=\"true\" />\n </button>\n )}\n {(title || description) && (\n <div className={styles.modal__title}>\n {title && (\n <h2 id={titleId} className={styles.modal__heading}>\n {title}\n </h2>\n )}\n {description && (\n <div id={descriptionId} className={styles.modal__description}>\n {description}\n </div>\n )}\n </div>\n )}\n <div className={styles.modal__content}>{children}</div>\n </div>\n {footer && <div className={styles['modal__bottom-bar']}>{footer}</div>}\n </dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUO,MAAM,QAAQ,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,GAAG;AACP,MAAkB;AACd,QAAM,UAAU,MAAA;AAChB,QAAM,gBAAgB,MAAA;AACtB,QAAM,EAAE,WAAW,OAAO,OAAO,UAAA,IAAc,gBAAgB;AAAA,IAC3D,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,EAAA,CACH;AACD,QAAM,cACF,CAAC,cAAc,gBAAgB,QAAW,eAAe,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACnF;AACJ,QAAM,uBAAuB,mBAAmB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH;AAED,MAAI,CAAC,UAAW,QAAO;AAEvB,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,KAAK,CAAC,SAAS;AACX,kBAAU,UAAU;AACpB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAC9B,SAAS,UAAU;AAAA,MAChC;AAAA,MACA,WAAW;AAAA,QACP,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,OAAO,UAAU,IAAI,EAAE;AAAA,QACvB,OAAO,UAAU,WAAW,EAAE;AAAA,QAC9B,EAAE,CAAC,OAAO,oBAAoB,CAAC,GAAG,WAAA;AAAA,QAClC,EAAE,CAAC,OAAO,kBAAkB,CAAC,GAAG,WAAA;AAAA,QAChC,EAAE,CAAC,OAAO,gBAAgB,CAAC,GAAG,UAAU,UAAA;AAAA,QACxC,EAAE,CAAC,OAAO,gBAAgB,CAAC,GAAG,UAAU,UAAA;AAAA,QACxC;AAAA,MAAA;AAAA,MAEJ,cAAY;AAAA,MACZ,mBAAiB,mBAAmB,CAAC,aAAa,QAAQ,UAAU;AAAA,MACpE,oBAAkB;AAAA,MACjB,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAW,OAAO,kBAClB,UAAA;AAAA,UAAA,CAAC,uBACE;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAW,GAAG,OAAO,cAAc,YAAY,SAAS;AAAA,cACxD,cAAY;AAAA,cACZ,yBAAsB;AAAA,cACtB,SAAS;AAAA,cAET,UAAA,oBAAC,OAAA,EAAM,eAAY,OAAA,CAAO;AAAA,YAAA;AAAA,UAAA;AAAA,WAGhC,SAAS,gBACP,qBAAC,OAAA,EAAI,WAAW,OAAO,cAClB,UAAA;AAAA,YAAA,6BACI,MAAA,EAAG,IAAI,SAAS,WAAW,OAAO,gBAC9B,UAAA,MAAA,CACL;AAAA,YAEH,mCACI,OAAA,EAAI,IAAI,eAAe,WAAW,OAAO,oBACrC,UAAA,YAAA,CACL;AAAA,UAAA,GAER;AAAA,UAEJ,oBAAC,OAAA,EAAI,WAAW,OAAO,gBAAiB,SAAA,CAAS;AAAA,QAAA,GACrD;AAAA,QACC,UAAU,oBAAC,OAAA,EAAI,WAAW,OAAO,mBAAmB,GAAI,UAAA,OAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5E;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require('./Modal.css');
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
4
|
+
const modal = "_modal_ewl1e_1";
|
|
5
|
+
const modal__container = "_modal__container_ewl1e_64";
|
|
6
|
+
const modal__title = "_modal__title_ewl1e_76";
|
|
7
|
+
const modal__heading = "_modal__heading_ewl1e_86";
|
|
8
|
+
const modal__description = "_modal__description_ewl1e_94";
|
|
9
|
+
const modal__content = "_modal__content_ewl1e_98";
|
|
10
|
+
const modal__close = "_modal__close_ewl1e_111";
|
|
11
|
+
const styles = {
|
|
12
|
+
modal,
|
|
13
|
+
"modal--align-top": "_modal--align-top_ewl1e_21",
|
|
14
|
+
"modal--small": "_modal--small_ewl1e_38",
|
|
15
|
+
"modal--medium": "_modal--medium_ewl1e_42",
|
|
16
|
+
"modal--large": "_modal--large_ewl1e_45",
|
|
17
|
+
"modal--opening": "_modal--opening_ewl1e_49",
|
|
18
|
+
"modal-open": "_modal-open_ewl1e_1",
|
|
19
|
+
"modal--closing": "_modal--closing_ewl1e_52",
|
|
20
|
+
"modal-close": "_modal-close_ewl1e_1",
|
|
21
|
+
modal__container,
|
|
22
|
+
"modal--fixed-title": "_modal--fixed-title_ewl1e_72",
|
|
23
|
+
modal__title,
|
|
24
|
+
modal__heading,
|
|
25
|
+
modal__description,
|
|
26
|
+
modal__content,
|
|
27
|
+
modal__close,
|
|
28
|
+
"modal__bottom-bar": "_modal__bottom-bar_ewl1e_132",
|
|
29
|
+
"modal--dark": "_modal--dark_ewl1e_137"
|
|
30
|
+
};
|
|
31
|
+
exports.default = styles;
|
|
32
|
+
exports.modal = modal;
|
|
33
|
+
exports.modal__close = modal__close;
|
|
34
|
+
exports.modal__container = modal__container;
|
|
35
|
+
exports.modal__content = modal__content;
|
|
36
|
+
exports.modal__description = modal__description;
|
|
37
|
+
exports.modal__heading = modal__heading;
|
|
38
|
+
exports.modal__title = modal__title;
|
|
39
|
+
//# sourceMappingURL=Modal.module.css.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import './Modal.css';
|
|
2
|
+
const modal = "_modal_ewl1e_1";
|
|
3
|
+
const modal__container = "_modal__container_ewl1e_64";
|
|
4
|
+
const modal__title = "_modal__title_ewl1e_76";
|
|
5
|
+
const modal__heading = "_modal__heading_ewl1e_86";
|
|
6
|
+
const modal__description = "_modal__description_ewl1e_94";
|
|
7
|
+
const modal__content = "_modal__content_ewl1e_98";
|
|
8
|
+
const modal__close = "_modal__close_ewl1e_111";
|
|
9
|
+
const styles = {
|
|
10
|
+
modal,
|
|
11
|
+
"modal--align-top": "_modal--align-top_ewl1e_21",
|
|
12
|
+
"modal--small": "_modal--small_ewl1e_38",
|
|
13
|
+
"modal--medium": "_modal--medium_ewl1e_42",
|
|
14
|
+
"modal--large": "_modal--large_ewl1e_45",
|
|
15
|
+
"modal--opening": "_modal--opening_ewl1e_49",
|
|
16
|
+
"modal-open": "_modal-open_ewl1e_1",
|
|
17
|
+
"modal--closing": "_modal--closing_ewl1e_52",
|
|
18
|
+
"modal-close": "_modal-close_ewl1e_1",
|
|
19
|
+
modal__container,
|
|
20
|
+
"modal--fixed-title": "_modal--fixed-title_ewl1e_72",
|
|
21
|
+
modal__title,
|
|
22
|
+
modal__heading,
|
|
23
|
+
modal__description,
|
|
24
|
+
modal__content,
|
|
25
|
+
modal__close,
|
|
26
|
+
"modal__bottom-bar": "_modal__bottom-bar_ewl1e_132",
|
|
27
|
+
"modal--dark": "_modal--dark_ewl1e_137"
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
styles as default,
|
|
31
|
+
modal,
|
|
32
|
+
modal__close,
|
|
33
|
+
modal__container,
|
|
34
|
+
modal__content,
|
|
35
|
+
modal__description,
|
|
36
|
+
modal__heading,
|
|
37
|
+
modal__title
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=Modal.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, ReactNode } from 'react';
|
|
2
|
+
export type ModalSize = 'small' | 'medium' | 'large';
|
|
3
|
+
export type ModalHeaderStyle = 'light' | 'dark';
|
|
4
|
+
type ModalAccessibleName = {
|
|
5
|
+
readonly title: ReactNode;
|
|
6
|
+
readonly 'aria-label'?: string;
|
|
7
|
+
readonly 'aria-labelledby'?: never;
|
|
8
|
+
} | {
|
|
9
|
+
readonly title: ReactNode;
|
|
10
|
+
readonly 'aria-label'?: never;
|
|
11
|
+
readonly 'aria-labelledby': string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly title: ReactNode;
|
|
14
|
+
readonly 'aria-label'?: never;
|
|
15
|
+
readonly 'aria-labelledby'?: never;
|
|
16
|
+
} | {
|
|
17
|
+
readonly title?: never;
|
|
18
|
+
readonly 'aria-label': string;
|
|
19
|
+
readonly 'aria-labelledby'?: never;
|
|
20
|
+
} | {
|
|
21
|
+
readonly title?: never;
|
|
22
|
+
readonly 'aria-label'?: never;
|
|
23
|
+
readonly 'aria-labelledby': string;
|
|
24
|
+
};
|
|
25
|
+
export type ModalProps = Omit<ComponentPropsWithRef<'dialog'>, 'children' | 'open' | 'onClose' | 'onCancel' | 'aria-label' | 'aria-labelledby' | 'title'> & ModalAccessibleName & {
|
|
26
|
+
/**
|
|
27
|
+
* Controls whether the dialog is open. The dialog unmounts after its close animation unless
|
|
28
|
+
* `keepMounted` is true.
|
|
29
|
+
* `undefined` is treated as closed. @default false
|
|
30
|
+
*/
|
|
31
|
+
readonly open?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Keeps the closed dialog and its descendants mounted, preserving their React state and effects.
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
readonly keepMounted?: boolean;
|
|
37
|
+
/** Called with false when the user requests closing. Opening and closing are controlled by `open`. */
|
|
38
|
+
readonly onOpenChange?: (open: boolean) => void;
|
|
39
|
+
/** Supporting text displayed below the heading. */
|
|
40
|
+
readonly description?: ReactNode;
|
|
41
|
+
/** Content displayed in the dialog body. */
|
|
42
|
+
readonly children: ReactNode;
|
|
43
|
+
/** Optional content displayed in the bottom action bar. */
|
|
44
|
+
readonly footer?: ReactNode;
|
|
45
|
+
/** Dialog width. */
|
|
46
|
+
readonly size?: ModalSize;
|
|
47
|
+
/** Visual style of the header and close button. */
|
|
48
|
+
readonly headerStyle?: ModalHeaderStyle;
|
|
49
|
+
/** Keeps the header fixed while the body scrolls. @default false */
|
|
50
|
+
readonly fixedTitle?: boolean;
|
|
51
|
+
/** Aligns the dialog to the top instead of vertically centering it. @default false */
|
|
52
|
+
readonly alignToTop?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Disables the close button, backdrop click, and Escape key. Provide an action that sets
|
|
55
|
+
* `open` to false when this is enabled. @default false
|
|
56
|
+
*/
|
|
57
|
+
readonly disableCloseOptions?: boolean;
|
|
58
|
+
/** Accessible label for the close button. @default 'Sulje dialogi' */
|
|
59
|
+
readonly closeLabel?: string;
|
|
60
|
+
};
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=Modal.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.types.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/Modal.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,KAAK,mBAAmB,GAClB;IACI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC;CACtC,GACD;IACI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACtC,GACD;IACI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC;CACtC,GACD;IACI,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC;CACtC,GACD;IACI,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACtC,CAAC;AAER,MAAM,MAAM,UAAU,GAAG,IAAI,CACzB,qBAAqB,CAAC,QAAQ,CAAC,EAC/B,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAC5F,GACG,mBAAmB,GAAG;IAClB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,sEAAsE;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const useDialogDismissal = ({
|
|
5
|
+
close,
|
|
6
|
+
disableCloseOptions,
|
|
7
|
+
onClick,
|
|
8
|
+
onKeyDown,
|
|
9
|
+
onPointerDown
|
|
10
|
+
}) => {
|
|
11
|
+
const backdropPointerDownRef = react.useRef(false);
|
|
12
|
+
return {
|
|
13
|
+
onCancel: (event) => {
|
|
14
|
+
event.preventDefault();
|
|
15
|
+
backdropPointerDownRef.current = false;
|
|
16
|
+
if (!disableCloseOptions) close();
|
|
17
|
+
},
|
|
18
|
+
onKeyDownCapture: (event) => {
|
|
19
|
+
if (event.key === "Escape") {
|
|
20
|
+
backdropPointerDownRef.current = false;
|
|
21
|
+
if (disableCloseOptions) event.preventDefault();
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
onKeyDown: (event) => {
|
|
25
|
+
onKeyDown?.(event);
|
|
26
|
+
},
|
|
27
|
+
onPointerDown: (event) => {
|
|
28
|
+
backdropPointerDownRef.current = event.target === event.currentTarget;
|
|
29
|
+
onPointerDown?.(event);
|
|
30
|
+
},
|
|
31
|
+
onClick: (event) => {
|
|
32
|
+
onClick?.(event);
|
|
33
|
+
if (!disableCloseOptions && event.target === event.currentTarget) close();
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
backdropPointerDownRef.current = false;
|
|
36
|
+
}, 0);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
exports.useDialogDismissal = useDialogDismissal;
|
|
41
|
+
//# sourceMappingURL=useDialogDismissal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDialogDismissal.cjs","sources":["../../../src/components/Modal/useDialogDismissal.ts"],"sourcesContent":["import { useRef } from 'react';\nimport type { ComponentPropsWithRef } from 'react';\n\ninterface UseDialogDismissalOptions {\n close: () => void;\n disableCloseOptions: boolean;\n onClick?: ComponentPropsWithRef<'dialog'>['onClick'];\n onKeyDown?: ComponentPropsWithRef<'dialog'>['onKeyDown'];\n onPointerDown?: ComponentPropsWithRef<'dialog'>['onPointerDown'];\n}\n\nexport const useDialogDismissal = ({\n close,\n disableCloseOptions,\n onClick,\n onKeyDown,\n onPointerDown,\n}: UseDialogDismissalOptions) => {\n const backdropPointerDownRef = useRef(false);\n\n return {\n onCancel: (event: React.SyntheticEvent<HTMLDialogElement>) => {\n event.preventDefault();\n backdropPointerDownRef.current = false;\n if (!disableCloseOptions) close();\n },\n onKeyDownCapture: (event: React.KeyboardEvent<HTMLDialogElement>) => {\n if (event.key === 'Escape') {\n backdropPointerDownRef.current = false;\n if (disableCloseOptions) event.preventDefault();\n }\n },\n onKeyDown: (event: React.KeyboardEvent<HTMLDialogElement>) => {\n onKeyDown?.(event);\n },\n onPointerDown: (event: React.PointerEvent<HTMLDialogElement>) => {\n backdropPointerDownRef.current = event.target === event.currentTarget;\n onPointerDown?.(event);\n },\n onClick: (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (!disableCloseOptions && event.target === event.currentTarget) close();\n setTimeout(() => {\n backdropPointerDownRef.current = false;\n }, 0);\n },\n };\n};\n"],"names":["useRef"],"mappings":";;;AAWO,MAAM,qBAAqB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAiC;AAC7B,QAAM,yBAAyBA,MAAAA,OAAO,KAAK;AAE3C,SAAO;AAAA,IACH,UAAU,CAAC,UAAmD;AAC1D,YAAM,eAAA;AACN,6BAAuB,UAAU;AACjC,UAAI,CAAC,oBAAqB,OAAA;AAAA,IAC9B;AAAA,IACA,kBAAkB,CAAC,UAAkD;AACjE,UAAI,MAAM,QAAQ,UAAU;AACxB,+BAAuB,UAAU;AACjC,YAAI,2BAA2B,eAAA;AAAA,MACnC;AAAA,IACJ;AAAA,IACA,WAAW,CAAC,UAAkD;AAC1D,kBAAY,KAAK;AAAA,IACrB;AAAA,IACA,eAAe,CAAC,UAAiD;AAC7D,6BAAuB,UAAU,MAAM,WAAW,MAAM;AACxD,sBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,SAAS,CAAC,UAA+C;AACrD,gBAAU,KAAK;AACf,UAAI,CAAC,uBAAuB,MAAM,WAAW,MAAM,cAAe,OAAA;AAClE,iBAAW,MAAM;AACb,+BAAuB,UAAU;AAAA,MACrC,GAAG,CAAC;AAAA,IACR;AAAA,EAAA;AAER;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
interface UseDialogDismissalOptions {
|
|
3
|
+
close: () => void;
|
|
4
|
+
disableCloseOptions: boolean;
|
|
5
|
+
onClick?: ComponentPropsWithRef<'dialog'>['onClick'];
|
|
6
|
+
onKeyDown?: ComponentPropsWithRef<'dialog'>['onKeyDown'];
|
|
7
|
+
onPointerDown?: ComponentPropsWithRef<'dialog'>['onPointerDown'];
|
|
8
|
+
}
|
|
9
|
+
export declare const useDialogDismissal: ({ close, disableCloseOptions, onClick, onKeyDown, onPointerDown, }: UseDialogDismissalOptions) => {
|
|
10
|
+
onCancel: (event: React.SyntheticEvent<HTMLDialogElement>) => void;
|
|
11
|
+
onKeyDownCapture: (event: React.KeyboardEvent<HTMLDialogElement>) => void;
|
|
12
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLDialogElement>) => void;
|
|
13
|
+
onPointerDown: (event: React.PointerEvent<HTMLDialogElement>) => void;
|
|
14
|
+
onClick: (event: React.MouseEvent<HTMLDialogElement>) => void;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useDialogDismissal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDialogDismissal.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/useDialogDismissal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,UAAU,yBAAyB;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC;IACzD,aAAa,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,kBAAkB,GAAI,oEAMhC,yBAAyB;sBAIF,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC;8BAK/B,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC;uBAM7C,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC;2BAGlC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC;qBAI3C,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC;CAQ3D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useRef } from "react";
|
|
2
|
+
const useDialogDismissal = ({
|
|
3
|
+
close,
|
|
4
|
+
disableCloseOptions,
|
|
5
|
+
onClick,
|
|
6
|
+
onKeyDown,
|
|
7
|
+
onPointerDown
|
|
8
|
+
}) => {
|
|
9
|
+
const backdropPointerDownRef = useRef(false);
|
|
10
|
+
return {
|
|
11
|
+
onCancel: (event) => {
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
backdropPointerDownRef.current = false;
|
|
14
|
+
if (!disableCloseOptions) close();
|
|
15
|
+
},
|
|
16
|
+
onKeyDownCapture: (event) => {
|
|
17
|
+
if (event.key === "Escape") {
|
|
18
|
+
backdropPointerDownRef.current = false;
|
|
19
|
+
if (disableCloseOptions) event.preventDefault();
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
onKeyDown: (event) => {
|
|
23
|
+
onKeyDown?.(event);
|
|
24
|
+
},
|
|
25
|
+
onPointerDown: (event) => {
|
|
26
|
+
backdropPointerDownRef.current = event.target === event.currentTarget;
|
|
27
|
+
onPointerDown?.(event);
|
|
28
|
+
},
|
|
29
|
+
onClick: (event) => {
|
|
30
|
+
onClick?.(event);
|
|
31
|
+
if (!disableCloseOptions && event.target === event.currentTarget) close();
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
backdropPointerDownRef.current = false;
|
|
34
|
+
}, 0);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export {
|
|
39
|
+
useDialogDismissal
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=useDialogDismissal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDialogDismissal.js","sources":["../../../src/components/Modal/useDialogDismissal.ts"],"sourcesContent":["import { useRef } from 'react';\nimport type { ComponentPropsWithRef } from 'react';\n\ninterface UseDialogDismissalOptions {\n close: () => void;\n disableCloseOptions: boolean;\n onClick?: ComponentPropsWithRef<'dialog'>['onClick'];\n onKeyDown?: ComponentPropsWithRef<'dialog'>['onKeyDown'];\n onPointerDown?: ComponentPropsWithRef<'dialog'>['onPointerDown'];\n}\n\nexport const useDialogDismissal = ({\n close,\n disableCloseOptions,\n onClick,\n onKeyDown,\n onPointerDown,\n}: UseDialogDismissalOptions) => {\n const backdropPointerDownRef = useRef(false);\n\n return {\n onCancel: (event: React.SyntheticEvent<HTMLDialogElement>) => {\n event.preventDefault();\n backdropPointerDownRef.current = false;\n if (!disableCloseOptions) close();\n },\n onKeyDownCapture: (event: React.KeyboardEvent<HTMLDialogElement>) => {\n if (event.key === 'Escape') {\n backdropPointerDownRef.current = false;\n if (disableCloseOptions) event.preventDefault();\n }\n },\n onKeyDown: (event: React.KeyboardEvent<HTMLDialogElement>) => {\n onKeyDown?.(event);\n },\n onPointerDown: (event: React.PointerEvent<HTMLDialogElement>) => {\n backdropPointerDownRef.current = event.target === event.currentTarget;\n onPointerDown?.(event);\n },\n onClick: (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (!disableCloseOptions && event.target === event.currentTarget) close();\n setTimeout(() => {\n backdropPointerDownRef.current = false;\n }, 0);\n },\n };\n};\n"],"names":[],"mappings":";AAWO,MAAM,qBAAqB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAiC;AAC7B,QAAM,yBAAyB,OAAO,KAAK;AAE3C,SAAO;AAAA,IACH,UAAU,CAAC,UAAmD;AAC1D,YAAM,eAAA;AACN,6BAAuB,UAAU;AACjC,UAAI,CAAC,oBAAqB,OAAA;AAAA,IAC9B;AAAA,IACA,kBAAkB,CAAC,UAAkD;AACjE,UAAI,MAAM,QAAQ,UAAU;AACxB,+BAAuB,UAAU;AACjC,YAAI,2BAA2B,eAAA;AAAA,MACnC;AAAA,IACJ;AAAA,IACA,WAAW,CAAC,UAAkD;AAC1D,kBAAY,KAAK;AAAA,IACrB;AAAA,IACA,eAAe,CAAC,UAAiD;AAC7D,6BAAuB,UAAU,MAAM,WAAW,MAAM;AACxD,sBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,SAAS,CAAC,UAA+C;AACrD,gBAAU,KAAK;AACf,UAAI,CAAC,uBAAuB,MAAM,WAAW,MAAM,cAAe,OAAA;AAClE,iBAAW,MAAM;AACb,+BAAuB,UAAU;AAAA,MACrC,GAAG,CAAC;AAAA,IACR;AAAA,EAAA;AAER;"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
let bodyScrollLockCount = 0;
|
|
5
|
+
let previousBodyOverflow = "";
|
|
6
|
+
const lockBodyScroll = () => {
|
|
7
|
+
if (bodyScrollLockCount === 0) {
|
|
8
|
+
previousBodyOverflow = document.body.style.overflow;
|
|
9
|
+
document.body.style.overflow = "hidden";
|
|
10
|
+
}
|
|
11
|
+
bodyScrollLockCount += 1;
|
|
12
|
+
};
|
|
13
|
+
const unlockBodyScroll = () => {
|
|
14
|
+
bodyScrollLockCount = Math.max(bodyScrollLockCount - 1, 0);
|
|
15
|
+
if (bodyScrollLockCount === 0) {
|
|
16
|
+
document.body.style.overflow = previousBodyOverflow;
|
|
17
|
+
previousBodyOverflow = "";
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const setDialogOpen = (dialog, open) => {
|
|
21
|
+
{
|
|
22
|
+
if (typeof dialog.showModal === "function") {
|
|
23
|
+
if (!dialog.open) dialog.showModal();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const findAutofocusTarget = (dialog) => {
|
|
28
|
+
if (dialog.hasAttribute("autofocus")) return dialog;
|
|
29
|
+
return dialog.querySelector("[autofocus]") ?? Array.from(dialog.querySelectorAll("*")).find(
|
|
30
|
+
(element) => "autofocus" in element && element.autofocus
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
const useNativeDialog = ({ open, keepMounted, onOpenChange }) => {
|
|
34
|
+
const dialogRef = react.useRef(null);
|
|
35
|
+
const restoreFocusRef = react.useRef(null);
|
|
36
|
+
const closeTimerRef = react.useRef(null);
|
|
37
|
+
const bodyScrollLockedRef = react.useRef(false);
|
|
38
|
+
const [phase, setPhase] = react.useState("closed");
|
|
39
|
+
const isPresent = keepMounted || open || phase !== "closed";
|
|
40
|
+
const notifyOpenChange = react.useCallback(
|
|
41
|
+
(nextOpen) => {
|
|
42
|
+
onOpenChange?.(nextOpen);
|
|
43
|
+
},
|
|
44
|
+
[onOpenChange]
|
|
45
|
+
);
|
|
46
|
+
const finishClose = react.useCallback(() => {
|
|
47
|
+
const dialog = dialogRef.current;
|
|
48
|
+
if (!dialog) return;
|
|
49
|
+
closeTimerRef.current = null;
|
|
50
|
+
if (dialog.open) {
|
|
51
|
+
dialog.close();
|
|
52
|
+
} else {
|
|
53
|
+
setPhase("closed");
|
|
54
|
+
}
|
|
55
|
+
}, []);
|
|
56
|
+
const close = react.useCallback(() => notifyOpenChange(false), [notifyOpenChange]);
|
|
57
|
+
const clearCloseTimer = react.useCallback(() => {
|
|
58
|
+
if (closeTimerRef.current) clearTimeout(closeTimerRef.current);
|
|
59
|
+
closeTimerRef.current = null;
|
|
60
|
+
}, []);
|
|
61
|
+
react.useEffect(() => {
|
|
62
|
+
const dialog = dialogRef.current;
|
|
63
|
+
if (!dialog) return;
|
|
64
|
+
if (open) {
|
|
65
|
+
clearCloseTimer();
|
|
66
|
+
if (phase === "closing" || phase === "closed") setPhase("open");
|
|
67
|
+
if (!dialog.open) {
|
|
68
|
+
restoreFocusRef.current = document.activeElement;
|
|
69
|
+
const autofocusTarget = findAutofocusTarget(dialog);
|
|
70
|
+
const existingFocusTarget = document.activeElement instanceof HTMLElement && document.activeElement !== dialog && dialog.contains(document.activeElement) ? document.activeElement : null;
|
|
71
|
+
setDialogOpen(dialog);
|
|
72
|
+
(autofocusTarget ?? existingFocusTarget ?? dialog.querySelector("[data-dialog-autofocus]"))?.focus();
|
|
73
|
+
}
|
|
74
|
+
if (dialog.open && !bodyScrollLockedRef.current) {
|
|
75
|
+
lockBodyScroll();
|
|
76
|
+
bodyScrollLockedRef.current = true;
|
|
77
|
+
}
|
|
78
|
+
} else if (dialog.open && phase === "open") {
|
|
79
|
+
setPhase("closing");
|
|
80
|
+
}
|
|
81
|
+
}, [clearCloseTimer, open, phase]);
|
|
82
|
+
react.useEffect(() => {
|
|
83
|
+
if (phase !== "closing") return;
|
|
84
|
+
const dialog = dialogRef.current;
|
|
85
|
+
if (!dialog || !dialog.open) return;
|
|
86
|
+
const styles = window.getComputedStyle(dialog);
|
|
87
|
+
const durations = `${styles.transitionDuration},${styles.animationDuration}`.split(",").map((duration2) => {
|
|
88
|
+
const value = Number.parseFloat(duration2);
|
|
89
|
+
return Number.isFinite(value) ? duration2.trim().endsWith("ms") ? value : value * 1e3 : 0;
|
|
90
|
+
});
|
|
91
|
+
const duration = Math.max(...durations, 0);
|
|
92
|
+
closeTimerRef.current = setTimeout(finishClose, duration);
|
|
93
|
+
return () => {
|
|
94
|
+
clearCloseTimer();
|
|
95
|
+
};
|
|
96
|
+
}, [clearCloseTimer, finishClose, phase]);
|
|
97
|
+
react.useEffect(
|
|
98
|
+
() => () => {
|
|
99
|
+
clearCloseTimer();
|
|
100
|
+
if (bodyScrollLockedRef.current) {
|
|
101
|
+
unlockBodyScroll();
|
|
102
|
+
bodyScrollLockedRef.current = false;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
[clearCloseTimer]
|
|
106
|
+
);
|
|
107
|
+
react.useEffect(() => {
|
|
108
|
+
const dialog = dialogRef.current;
|
|
109
|
+
if (!dialog) return;
|
|
110
|
+
const handleClose = () => {
|
|
111
|
+
clearCloseTimer();
|
|
112
|
+
setPhase("closed");
|
|
113
|
+
if (bodyScrollLockedRef.current) {
|
|
114
|
+
unlockBodyScroll();
|
|
115
|
+
bodyScrollLockedRef.current = false;
|
|
116
|
+
}
|
|
117
|
+
restoreFocusRef.current?.focus();
|
|
118
|
+
restoreFocusRef.current = null;
|
|
119
|
+
};
|
|
120
|
+
dialog.addEventListener("close", handleClose);
|
|
121
|
+
return () => dialog.removeEventListener("close", handleClose);
|
|
122
|
+
}, [clearCloseTimer, isPresent]);
|
|
123
|
+
return { dialogRef, close, phase, isPresent };
|
|
124
|
+
};
|
|
125
|
+
exports.useNativeDialog = useNativeDialog;
|
|
126
|
+
//# sourceMappingURL=useNativeDialog.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNativeDialog.cjs","sources":["../../../src/components/Modal/useNativeDialog.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseNativeDialogOptions {\n open: boolean;\n keepMounted: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\ntype DialogPhase = 'closed' | 'open' | 'closing';\n\nlet bodyScrollLockCount = 0;\nlet previousBodyOverflow = '';\n\nconst lockBodyScroll = () => {\n if (bodyScrollLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n bodyScrollLockCount += 1;\n};\n\nconst unlockBodyScroll = () => {\n bodyScrollLockCount = Math.max(bodyScrollLockCount - 1, 0);\n if (bodyScrollLockCount === 0) {\n document.body.style.overflow = previousBodyOverflow;\n previousBodyOverflow = '';\n }\n};\n\nconst setDialogOpen = (dialog: HTMLDialogElement, open: boolean) => {\n if (open) {\n if (typeof dialog.showModal === 'function') {\n if (!dialog.open) dialog.showModal();\n }\n } else if (dialog.open) {\n if (typeof dialog.close === 'function') {\n dialog.close();\n }\n }\n};\n\nconst findAutofocusTarget = (dialog: HTMLDialogElement) => {\n if (dialog.hasAttribute('autofocus')) return dialog;\n\n return (\n dialog.querySelector<HTMLElement>('[autofocus]') ??\n Array.from(dialog.querySelectorAll<HTMLElement>('*')).find(\n (element) =>\n 'autofocus' in element &&\n (element as HTMLElement & { autofocus: boolean }).autofocus,\n )\n );\n};\n\nexport const useNativeDialog = ({ open, keepMounted, onOpenChange }: UseNativeDialogOptions) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const bodyScrollLockedRef = useRef(false);\n const [phase, setPhase] = useState<DialogPhase>('closed');\n const isPresent = keepMounted || open || phase !== 'closed';\n\n const notifyOpenChange = useCallback(\n (nextOpen: boolean) => {\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const finishClose = useCallback(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n closeTimerRef.current = null;\n if (dialog.open) {\n dialog.close();\n } else {\n setPhase('closed');\n }\n }, []);\n\n const close = useCallback(() => notifyOpenChange(false), [notifyOpenChange]);\n\n const clearCloseTimer = useCallback(() => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }, []);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open) {\n clearCloseTimer();\n if (phase === 'closing' || phase === 'closed') setPhase('open');\n if (!dialog.open) {\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n const autofocusTarget = findAutofocusTarget(dialog);\n const existingFocusTarget =\n document.activeElement instanceof HTMLElement &&\n document.activeElement !== dialog &&\n dialog.contains(document.activeElement)\n ? document.activeElement\n : null;\n setDialogOpen(dialog, true);\n (\n autofocusTarget ??\n existingFocusTarget ??\n dialog.querySelector<HTMLElement>('[data-dialog-autofocus]')\n )?.focus();\n }\n if (dialog.open && !bodyScrollLockedRef.current) {\n lockBodyScroll();\n bodyScrollLockedRef.current = true;\n }\n } else if (dialog.open && phase === 'open') {\n setPhase('closing');\n }\n }, [clearCloseTimer, open, phase]);\n\n useEffect(() => {\n if (phase !== 'closing') return;\n const dialog = dialogRef.current;\n if (!dialog || !dialog.open) return;\n\n const styles = window.getComputedStyle(dialog);\n const durations = `${styles.transitionDuration},${styles.animationDuration}`\n .split(',')\n .map((duration) => {\n const value = Number.parseFloat(duration);\n return Number.isFinite(value)\n ? duration.trim().endsWith('ms')\n ? value\n : value * 1000\n : 0;\n });\n const duration = Math.max(...durations, 0);\n closeTimerRef.current = setTimeout(finishClose, duration);\n\n return () => {\n clearCloseTimer();\n };\n }, [clearCloseTimer, finishClose, phase]);\n\n useEffect(\n () => () => {\n clearCloseTimer();\n if (bodyScrollLockedRef.current) {\n unlockBodyScroll();\n bodyScrollLockedRef.current = false;\n }\n },\n [clearCloseTimer],\n );\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleClose = () => {\n clearCloseTimer();\n setPhase('closed');\n if (bodyScrollLockedRef.current) {\n unlockBodyScroll();\n bodyScrollLockedRef.current = false;\n }\n restoreFocusRef.current?.focus();\n restoreFocusRef.current = null;\n };\n\n dialog.addEventListener('close', handleClose);\n return () => dialog.removeEventListener('close', handleClose);\n }, [clearCloseTimer, isPresent]);\n\n return { dialogRef, close, phase, isPresent };\n};\n"],"names":["useRef","useState","useCallback","useEffect","duration"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface UseNativeDialogOptions {
|
|
2
|
+
open: boolean;
|
|
3
|
+
keepMounted: boolean;
|
|
4
|
+
onOpenChange?: (open: boolean) => void;
|
|
5
|
+
}
|
|
6
|
+
type DialogPhase = 'closed' | 'open' | 'closing';
|
|
7
|
+
export declare const useNativeDialog: ({ open, keepMounted, onOpenChange }: UseNativeDialogOptions) => {
|
|
8
|
+
dialogRef: import('react').RefObject<HTMLDialogElement | null>;
|
|
9
|
+
close: () => void;
|
|
10
|
+
phase: DialogPhase;
|
|
11
|
+
isPresent: boolean;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=useNativeDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNativeDialog.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/useNativeDialog.ts"],"names":[],"mappings":"AAEA,UAAU,sBAAsB;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,KAAK,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AA8CjD,eAAO,MAAM,eAAe,GAAI,qCAAqC,sBAAsB;;;;;CAwH1F,CAAC"}
|