@pky/open-modal 0.0.1

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 ADDED
File without changes
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var client = require('react-dom/client');
5
+ var classNames = require('classnames');
6
+ var react = require('react');
7
+ var reactDom = require('react-dom');
8
+
9
+ var closeIcon = "data:image/png;base64,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";
10
+
11
+ var styles = {"modal":"index-module__modal___TLS5G","topBar":"index-module__topBar___V8Gsq","content":"index-module__content___tElL8","fullHeight":"index-module__fullHeight___EOzKX","slideOut":"index-module__slideOut___8onmK"};
12
+
13
+ /**
14
+ * 全屏弹窗,从下向上弹出
15
+ */
16
+ const Modal = ({ children, visible, onClose, style, className, contentClassName, fullHeight }) => {
17
+ const [modalElement, setModalElement] = react.useState(null);
18
+ const [isClosing, setIsClosing] = react.useState(false);
19
+ const handleClose = () => {
20
+ setIsClosing(true);
21
+ setTimeout(() => {
22
+ setIsClosing(false);
23
+ onClose?.();
24
+ }, 300);
25
+ };
26
+ react.useEffect(() => {
27
+ if (visible) {
28
+ const newModalElement = document.createElement('div');
29
+ newModalElement.setAttribute('data-body-portal', '');
30
+ document.body.appendChild(newModalElement);
31
+ setModalElement(newModalElement);
32
+ return () => {
33
+ document.body.removeChild(newModalElement);
34
+ };
35
+ }
36
+ }, [visible]);
37
+ react.useEffect(() => { }, []);
38
+ if (!visible || modalElement === null)
39
+ return null;
40
+ return reactDom.createPortal(jsxRuntime.jsxs("div", { className: classNames(styles.modal, className), style: style, children: [!fullHeight && (jsxRuntime.jsx("div", { className: styles.topBar, children: jsxRuntime.jsx("span", { onClick: handleClose, style: { cursor: 'pointer' }, children: jsxRuntime.jsx("img", { src: closeIcon, width: 40, style: { padding: '0 8px' }, alt: "close" }) }) })), jsxRuntime.jsx("div", { className: classNames(styles.content, contentClassName, fullHeight && styles.fullHeight, isClosing && styles.slideOut), children: children })] }), modalElement);
41
+ };
42
+
43
+ const openModal = ({ modalContent, closeCb, ...modalProps }) => {
44
+ return new Promise(resolve => {
45
+ const div = document.createElement('div');
46
+ const root = client.createRoot(div);
47
+ function _render(currentProps) {
48
+ const content = typeof modalContent === 'function'
49
+ ? modalContent({
50
+ onClose,
51
+ onSubmit(v) {
52
+ resolve(v);
53
+ onClose();
54
+ }
55
+ })
56
+ : modalContent;
57
+ root.render(jsxRuntime.jsx(Modal, { ...currentProps, children: content }));
58
+ }
59
+ let newProps = {
60
+ ...modalProps,
61
+ visible: true,
62
+ onClose
63
+ };
64
+ function onClose() {
65
+ newProps = {
66
+ ...newProps,
67
+ visible: false
68
+ };
69
+ _render(newProps);
70
+ closeCb?.();
71
+ }
72
+ _render(newProps);
73
+ });
74
+ };
75
+
76
+ exports.Modal = Modal;
77
+ exports.openModal = openModal;
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ .index-module__modal___TLS5G{background-color:rgba(0,0,0,.5);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1000}.index-module__modal___TLS5G .index-module__topBar___V8Gsq{height:40px;text-align:right}.index-module__modal___TLS5G .index-module__topBar___V8Gsq>span{cursor:pointer;display:inline-block;margin:6px 10px 0 0}.index-module__modal___TLS5G .index-module__content___tElL8{animation:index-module__slideIn___JBZ5J .3s ease;background-color:#fff;height:calc(100vh - 40px)}.index-module__modal___TLS5G .index-module__content___tElL8.index-module__fullHeight___EOzKX{height:100vh}.index-module__modal___TLS5G .index-module__content___tElL8.index-module__slideOut___8onmK{animation:index-module__slideOut___8onmK .3s ease}@keyframes index-module__slideIn___JBZ5J{0%{opacity:0;transform:translateY(50%)}to{opacity:1;transform:translateY(0)}}@keyframes index-module__slideOut___8onmK{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(50%)}}
@@ -0,0 +1,13 @@
1
+ import { ReactElement } from 'react';
2
+ import { ModalProps } from './modal';
3
+ export type OpenModalRenderProps<T> = {
4
+ onClose: () => void;
5
+ onSubmit: (v: T) => void;
6
+ };
7
+ type OpenModalParams<T> = {
8
+ modalContent: ReactElement | ((p: OpenModalRenderProps<T>) => ReactElement);
9
+ closeCb?: () => void;
10
+ } & ModalProps;
11
+ export { Modal } from './modal';
12
+ export declare const openModal: <T>({ modalContent, closeCb, ...modalProps }: OpenModalParams<T>) => Promise<T>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAEpC,OAAO,EAAE,UAAU,EAAS,MAAM,SAAS,CAAA;AAE3C,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;CAAE,CAAA;AAEvF,KAAK,eAAe,CAAC,CAAC,IAAI;IACxB,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAA;IAC3E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,GAAG,UAAU,CAAA;AAEd,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,eAAO,MAAM,SAAS,GAAI,CAAC,EAAG,0CAA0C,eAAe,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAqCrG,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { createRoot } from 'react-dom/client';
3
+ import classNames from 'classnames';
4
+ import { useState, useEffect } from 'react';
5
+ import { createPortal } from 'react-dom';
6
+
7
+ var closeIcon = "data:image/png;base64,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";
8
+
9
+ var styles = {"modal":"index-module__modal___TLS5G","topBar":"index-module__topBar___V8Gsq","content":"index-module__content___tElL8","fullHeight":"index-module__fullHeight___EOzKX","slideOut":"index-module__slideOut___8onmK"};
10
+
11
+ /**
12
+ * 全屏弹窗,从下向上弹出
13
+ */
14
+ const Modal = ({ children, visible, onClose, style, className, contentClassName, fullHeight }) => {
15
+ const [modalElement, setModalElement] = useState(null);
16
+ const [isClosing, setIsClosing] = useState(false);
17
+ const handleClose = () => {
18
+ setIsClosing(true);
19
+ setTimeout(() => {
20
+ setIsClosing(false);
21
+ onClose?.();
22
+ }, 300);
23
+ };
24
+ useEffect(() => {
25
+ if (visible) {
26
+ const newModalElement = document.createElement('div');
27
+ newModalElement.setAttribute('data-body-portal', '');
28
+ document.body.appendChild(newModalElement);
29
+ setModalElement(newModalElement);
30
+ return () => {
31
+ document.body.removeChild(newModalElement);
32
+ };
33
+ }
34
+ }, [visible]);
35
+ useEffect(() => { }, []);
36
+ if (!visible || modalElement === null)
37
+ return null;
38
+ return createPortal(jsxs("div", { className: classNames(styles.modal, className), style: style, children: [!fullHeight && (jsx("div", { className: styles.topBar, children: jsx("span", { onClick: handleClose, style: { cursor: 'pointer' }, children: jsx("img", { src: closeIcon, width: 40, style: { padding: '0 8px' }, alt: "close" }) }) })), jsx("div", { className: classNames(styles.content, contentClassName, fullHeight && styles.fullHeight, isClosing && styles.slideOut), children: children })] }), modalElement);
39
+ };
40
+
41
+ const openModal = ({ modalContent, closeCb, ...modalProps }) => {
42
+ return new Promise(resolve => {
43
+ const div = document.createElement('div');
44
+ const root = createRoot(div);
45
+ function _render(currentProps) {
46
+ const content = typeof modalContent === 'function'
47
+ ? modalContent({
48
+ onClose,
49
+ onSubmit(v) {
50
+ resolve(v);
51
+ onClose();
52
+ }
53
+ })
54
+ : modalContent;
55
+ root.render(jsx(Modal, { ...currentProps, children: content }));
56
+ }
57
+ let newProps = {
58
+ ...modalProps,
59
+ visible: true,
60
+ onClose
61
+ };
62
+ function onClose() {
63
+ newProps = {
64
+ ...newProps,
65
+ visible: false
66
+ };
67
+ _render(newProps);
68
+ closeCb?.();
69
+ }
70
+ _render(newProps);
71
+ });
72
+ };
73
+
74
+ export { Modal, openModal };
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ModalProps {
3
+ children?: ReactNode;
4
+ visible?: boolean;
5
+ onClose?: () => void;
6
+ style?: React.CSSProperties;
7
+ className?: string;
8
+ contentClassName?: string;
9
+ fullHeight?: boolean;
10
+ }
11
+ /**
12
+ * 全屏弹窗,从下向上弹出
13
+ */
14
+ export declare const Modal: ({ children, visible, onClose, style, className, contentClassName, fullHeight }: ModalProps) => import("react").ReactPortal | null;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modal/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAA;AAMtD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,gFAAgF,UAAU,uCAmD/G,CAAA"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@pky/open-modal",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "main": "dist/index.cjs.js",
6
+ "module": "dist/index.esm.js",
7
+ "browser": "dist/index.umd.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "rollup -c ../../rollup.config.js --environment TARGET:open-modal"
14
+ },
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "ISC",
18
+ "dependencies": {
19
+ "@mix-toolkit/better-lazy-image": "workspace:^0.0.1"
20
+ },
21
+ "peerDependencies": {
22
+ "react": ">=18.0.0",
23
+ "react-dom": ">=18.0.0"
24
+ }
25
+ }