cr-ui-lib 1.0.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/README.md +81 -0
- package/dist/index.d.mts +36 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +181 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +152 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# cr-fe-ui-components
|
|
2
|
+
|
|
3
|
+
Welcome to `cr-fe-ui-components`! This is the official reusable UI component library for ChartRequest's frontend applications. It provides a collection of consistent, tested, and theme-friendly React components designed to streamline development and unify our user experience.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/your-package-name)
|
|
6
|
+
[](https://travis-ci.com/your-username/your-repo)
|
|
7
|
+
[](LICENSE.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Goals
|
|
12
|
+
|
|
13
|
+
Our primary goals for this library are to promote efficiency and consistency across all our projects.
|
|
14
|
+
|
|
15
|
+
* **Reusable Components**: Build components once and use them everywhere across all ChartRequest projects.
|
|
16
|
+
* **Design Consistency**: Maintain a shared design system with unified styling, behavior, and UX patterns.
|
|
17
|
+
* **Isolated Development**: A dedicated playground to quickly build, test, and iterate on components in isolation.
|
|
18
|
+
|
|
19
|
+
## Project Structure
|
|
20
|
+
|
|
21
|
+
The repository is organized into two main directories: the library source code and the development playground.
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
cr-fe-ui-components/
|
|
25
|
+
│
|
|
26
|
+
├── src/ # Source code for the UI library
|
|
27
|
+
│ ├── components/ # Individual React components
|
|
28
|
+
│ │ ├── Button/
|
|
29
|
+
│ │ │ ├── Button.tsx
|
|
30
|
+
│ │ │ ├── Button.test.tsx
|
|
31
|
+
│ │ │ └── Button.css
|
|
32
|
+
│ │ │── assets # Assets for reusable components
|
|
33
|
+
│ │ │
|
|
34
|
+
│ │ └── ...
|
|
35
|
+
│ ├── index.ts # Main entry point exporting all components
|
|
36
|
+
│ └── utility/ # Helper functions for all components
|
|
37
|
+
├── playground/ # A standalone app for testing and demoing components
|
|
38
|
+
│ ├── App.tsx # Example usage of library components
|
|
39
|
+
│ └── ...
|
|
40
|
+
│
|
|
41
|
+
├── package.json
|
|
42
|
+
└── README.md
|
|
43
|
+
```
|
|
44
|
+
**src/:** Contains all the component code that gets published.
|
|
45
|
+
|
|
46
|
+
**playground/:** A Vite/CRA environment for visually testing and verifying components before they are published.
|
|
47
|
+
|
|
48
|
+
**Available Scripts**
|
|
49
|
+
|
|
50
|
+
**Main Folder:**
|
|
51
|
+
1. npm install - install the dependency only
|
|
52
|
+
|
|
53
|
+
**Run the Playground:**
|
|
54
|
+
This command starts the development server for the playground/ app, allowing you to see your components in action.
|
|
55
|
+
1. npm install - install dependencies
|
|
56
|
+
2. npm run dev - start the app
|
|
57
|
+
|
|
58
|
+
**How to use library?:**
|
|
59
|
+
1. Use global.css config and tailwind.config.js
|
|
60
|
+
2. config file setup: https://drive.google.com/file/d/1k8NoLdUX6xoE3qreR_B61A7To8Jnilya/view?usp=drive_link
|
|
61
|
+
|
|
62
|
+
## Tech Stack
|
|
63
|
+
React 18+
|
|
64
|
+
TypeScript
|
|
65
|
+
Tailwind
|
|
66
|
+
|
|
67
|
+
## Contributing
|
|
68
|
+
|
|
69
|
+
1. Add new components in src/components/.
|
|
70
|
+
|
|
71
|
+
2. Use the playground to develop and preview your component.
|
|
72
|
+
|
|
73
|
+
3. Write tests to ensure consistency.
|
|
74
|
+
|
|
75
|
+
4. Update the documentation accordingly.
|
|
76
|
+
|
|
77
|
+
5. Documentation
|
|
78
|
+
|
|
79
|
+
a. Devplan - https://docs.google.com/document/d/1_cqbxp1bRtyzRW8GsrXXNRjsXAeMykgVPul1uSsuMgY/edit?tab=t.0
|
|
80
|
+
|
|
81
|
+
b. Component Usage - soon...
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
type NavBarProps = {
|
|
2
|
+
children?: React.ReactNode;
|
|
3
|
+
wrapperClassName?: string;
|
|
4
|
+
innerClassName?: string;
|
|
5
|
+
} & React.HTMLAttributes<HTMLElement>;
|
|
6
|
+
declare const NavBar: ({ children, wrapperClassName, innerClassName, ...rest }: NavBarProps) => JSX.Element;
|
|
7
|
+
|
|
8
|
+
type ModalProps = {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
type?: "left" | "right" | "center";
|
|
11
|
+
onClose?: () => void;
|
|
12
|
+
widthClassName?: string;
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
overlayClassName?: string;
|
|
15
|
+
modalClassName?: string;
|
|
16
|
+
stayMounted?: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare const Modal: ({ isOpen, type, onClose, widthClassName, children, overlayClassName, modalClassName, stayMounted, }: ModalProps) => JSX.Element | null;
|
|
19
|
+
|
|
20
|
+
type PopupWrapperProps = {
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
isOpen: boolean;
|
|
24
|
+
stayMounted?: boolean;
|
|
25
|
+
};
|
|
26
|
+
declare const PopupWrapper: ({ children, className, isOpen, stayMounted, }: PopupWrapperProps) => JSX.Element | null;
|
|
27
|
+
|
|
28
|
+
type LayoutProps = {
|
|
29
|
+
children: React.ReactNode;
|
|
30
|
+
wrapperClassName?: string;
|
|
31
|
+
navClassName?: string;
|
|
32
|
+
navProps?: React.HTMLAttributes<HTMLElement>;
|
|
33
|
+
} & React.HTMLAttributes<HTMLDivElement>;
|
|
34
|
+
declare const SideNav: ({ children, wrapperClassName, navClassName, navProps, ...rest }: LayoutProps) => JSX.Element;
|
|
35
|
+
|
|
36
|
+
export { Modal, NavBar, type NavBarProps, PopupWrapper, SideNav, type LayoutProps as SideNavProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
type NavBarProps = {
|
|
2
|
+
children?: React.ReactNode;
|
|
3
|
+
wrapperClassName?: string;
|
|
4
|
+
innerClassName?: string;
|
|
5
|
+
} & React.HTMLAttributes<HTMLElement>;
|
|
6
|
+
declare const NavBar: ({ children, wrapperClassName, innerClassName, ...rest }: NavBarProps) => JSX.Element;
|
|
7
|
+
|
|
8
|
+
type ModalProps = {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
type?: "left" | "right" | "center";
|
|
11
|
+
onClose?: () => void;
|
|
12
|
+
widthClassName?: string;
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
overlayClassName?: string;
|
|
15
|
+
modalClassName?: string;
|
|
16
|
+
stayMounted?: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare const Modal: ({ isOpen, type, onClose, widthClassName, children, overlayClassName, modalClassName, stayMounted, }: ModalProps) => JSX.Element | null;
|
|
19
|
+
|
|
20
|
+
type PopupWrapperProps = {
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
isOpen: boolean;
|
|
24
|
+
stayMounted?: boolean;
|
|
25
|
+
};
|
|
26
|
+
declare const PopupWrapper: ({ children, className, isOpen, stayMounted, }: PopupWrapperProps) => JSX.Element | null;
|
|
27
|
+
|
|
28
|
+
type LayoutProps = {
|
|
29
|
+
children: React.ReactNode;
|
|
30
|
+
wrapperClassName?: string;
|
|
31
|
+
navClassName?: string;
|
|
32
|
+
navProps?: React.HTMLAttributes<HTMLElement>;
|
|
33
|
+
} & React.HTMLAttributes<HTMLDivElement>;
|
|
34
|
+
declare const SideNav: ({ children, wrapperClassName, navClassName, navProps, ...rest }: LayoutProps) => JSX.Element;
|
|
35
|
+
|
|
36
|
+
export { Modal, NavBar, type NavBarProps, PopupWrapper, SideNav, type LayoutProps as SideNavProps };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.ts
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
Modal: () => Modal_default,
|
|
25
|
+
NavBar: () => NavBar_default,
|
|
26
|
+
PopupWrapper: () => PopupWrapper_default,
|
|
27
|
+
SideNav: () => SideNav_default
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
|
+
|
|
31
|
+
// src/components/wrappers/NavBar.tsx
|
|
32
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
33
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
34
|
+
var NavBar = ({
|
|
35
|
+
children,
|
|
36
|
+
wrapperClassName,
|
|
37
|
+
innerClassName,
|
|
38
|
+
...rest
|
|
39
|
+
}) => {
|
|
40
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
41
|
+
"nav",
|
|
42
|
+
{
|
|
43
|
+
...rest,
|
|
44
|
+
className: (0, import_tailwind_merge.twMerge)(
|
|
45
|
+
"z-20 w-full px-4 shadow-navbar bg-white h-[80px]",
|
|
46
|
+
wrapperClassName
|
|
47
|
+
),
|
|
48
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
className: (0, import_tailwind_merge.twMerge)(
|
|
52
|
+
"h-[80px] flex justify-between items-center gap-2 px-4 py-1",
|
|
53
|
+
innerClassName
|
|
54
|
+
),
|
|
55
|
+
children
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
var NavBar_default = NavBar;
|
|
62
|
+
|
|
63
|
+
// src/components/wrappers/Modal.tsx
|
|
64
|
+
var import_tailwind_merge2 = require("tailwind-merge");
|
|
65
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
66
|
+
var Modal = ({
|
|
67
|
+
isOpen,
|
|
68
|
+
type = "right",
|
|
69
|
+
onClose,
|
|
70
|
+
widthClassName = "w-[300px]",
|
|
71
|
+
children,
|
|
72
|
+
overlayClassName,
|
|
73
|
+
modalClassName,
|
|
74
|
+
stayMounted = false
|
|
75
|
+
}) => {
|
|
76
|
+
if (!stayMounted && !isOpen) return null;
|
|
77
|
+
let positionClasses = "";
|
|
78
|
+
if (type === "left") {
|
|
79
|
+
positionClasses = "left-0 top-0 h-full";
|
|
80
|
+
} else if (type === "right") {
|
|
81
|
+
positionClasses = "right-0 top-0 h-full";
|
|
82
|
+
} else if (type === "center") {
|
|
83
|
+
positionClasses = "top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2";
|
|
84
|
+
}
|
|
85
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
86
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: (0, import_tailwind_merge2.twMerge)(
|
|
90
|
+
"fixed inset-0 bg-black bg-opacity-50 z-40",
|
|
91
|
+
stayMounted ? isOpen ? "block" : "hidden" : "block",
|
|
92
|
+
overlayClassName
|
|
93
|
+
),
|
|
94
|
+
onClick: onClose,
|
|
95
|
+
"aria-hidden": !isOpen
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
className: (0, import_tailwind_merge2.twMerge)(
|
|
102
|
+
`fixed bg-white shadow-xl z-50 transform transition-transform duration-300 ease-in-out ${positionClasses}`,
|
|
103
|
+
stayMounted ? isOpen ? "block" : "hidden" : "block",
|
|
104
|
+
widthClassName,
|
|
105
|
+
modalClassName
|
|
106
|
+
),
|
|
107
|
+
role: "dialog",
|
|
108
|
+
"aria-modal": "true",
|
|
109
|
+
children
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
] });
|
|
113
|
+
};
|
|
114
|
+
var Modal_default = Modal;
|
|
115
|
+
|
|
116
|
+
// src/components/wrappers/PopupWrapper.tsx
|
|
117
|
+
var import_tailwind_merge3 = require("tailwind-merge");
|
|
118
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
119
|
+
var PopupWrapper = ({
|
|
120
|
+
children,
|
|
121
|
+
className,
|
|
122
|
+
isOpen = false,
|
|
123
|
+
stayMounted = false
|
|
124
|
+
}) => {
|
|
125
|
+
if (!stayMounted && !isOpen) return null;
|
|
126
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
className: (0, import_tailwind_merge3.twMerge)(
|
|
130
|
+
"absolute right-0 top-1 mt-10 shadow-lg bg-white rounded-lg p-4 w-80 z-10 border border-opacity-10",
|
|
131
|
+
isOpen ? "block" : "hidden",
|
|
132
|
+
className
|
|
133
|
+
),
|
|
134
|
+
children
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
var PopupWrapper_default = PopupWrapper;
|
|
139
|
+
|
|
140
|
+
// src/components/wrappers/SideNav.tsx
|
|
141
|
+
var import_tailwind_merge4 = require("tailwind-merge");
|
|
142
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
143
|
+
var SideNav = ({
|
|
144
|
+
children,
|
|
145
|
+
wrapperClassName,
|
|
146
|
+
navClassName,
|
|
147
|
+
navProps,
|
|
148
|
+
...rest
|
|
149
|
+
}) => {
|
|
150
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
151
|
+
"div",
|
|
152
|
+
{
|
|
153
|
+
...rest,
|
|
154
|
+
className: (0, import_tailwind_merge4.twMerge)(
|
|
155
|
+
"bg-base sm:min-w-[260px] shadow-sidebar relative sm:flex flex-col justify-between h-screen max-h-screen",
|
|
156
|
+
wrapperClassName
|
|
157
|
+
),
|
|
158
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
159
|
+
"nav",
|
|
160
|
+
{
|
|
161
|
+
...navProps,
|
|
162
|
+
className: (0, import_tailwind_merge4.twMerge)(
|
|
163
|
+
"relative flex flex-col w-full gap-1 px-4 pt-4",
|
|
164
|
+
navClassName,
|
|
165
|
+
navProps == null ? void 0 : navProps.className
|
|
166
|
+
),
|
|
167
|
+
children
|
|
168
|
+
}
|
|
169
|
+
)
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
var SideNav_default = SideNav;
|
|
174
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
175
|
+
0 && (module.exports = {
|
|
176
|
+
Modal,
|
|
177
|
+
NavBar,
|
|
178
|
+
PopupWrapper,
|
|
179
|
+
SideNav
|
|
180
|
+
});
|
|
181
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/wrappers/NavBar.tsx","../src/components/wrappers/Modal.tsx","../src/components/wrappers/PopupWrapper.tsx","../src/components/wrappers/SideNav.tsx"],"sourcesContent":["export * from \"./components/wrappers\";\n","import { twMerge } from \"tailwind-merge\";\n\nexport type NavBarProps = {\n children?: React.ReactNode;\n wrapperClassName?: string;\n innerClassName?: string;\n} & React.HTMLAttributes<HTMLElement>; // allow props like onClick, id, aria-*\n\nconst NavBar = ({\n children,\n wrapperClassName,\n innerClassName,\n ...rest\n}: NavBarProps) => {\n return (\n <nav\n {...rest}\n className={twMerge(\n \"z-20 w-full px-4 shadow-navbar bg-white h-[80px]\",\n wrapperClassName\n )}\n >\n <div\n className={twMerge(\n \"h-[80px] flex justify-between items-center gap-2 px-4 py-1\",\n innerClassName\n )}\n >\n {children}\n </div>\n </nav>\n );\n};\n\nexport default NavBar;\n","import { twMerge } from \"tailwind-merge\";\n\ntype ModalProps = {\n isOpen: boolean;\n type?: \"left\" | \"right\" | \"center\";\n onClose?: () => void;\n widthClassName?: string;\n children?: React.ReactNode;\n overlayClassName?: string;\n modalClassName?: string;\n stayMounted?: boolean;\n};\n\nconst Modal = ({\n isOpen,\n type = \"right\",\n onClose,\n widthClassName = \"w-[300px]\",\n children,\n overlayClassName,\n modalClassName,\n stayMounted = false,\n}: ModalProps) => {\n if (!stayMounted && !isOpen) return null;\n\n let positionClasses = \"\";\n if (type === \"left\") {\n positionClasses = \"left-0 top-0 h-full\";\n } else if (type === \"right\") {\n positionClasses = \"right-0 top-0 h-full\";\n } else if (type === \"center\") {\n positionClasses =\n \"top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\";\n }\n\n return (\n <>\n <div\n className={twMerge(\n \"fixed inset-0 bg-black bg-opacity-50 z-40\",\n stayMounted ? (isOpen ? \"block\" : \"hidden\") : \"block\",\n overlayClassName\n )}\n onClick={onClose}\n aria-hidden={!isOpen}\n />\n\n <div\n className={twMerge(\n `fixed bg-white shadow-xl z-50 transform transition-transform duration-300 ease-in-out ${positionClasses}`,\n stayMounted ? (isOpen ? \"block\" : \"hidden\") : \"block\",\n widthClassName,\n modalClassName\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {children}\n </div>\n </>\n );\n};\n\nexport default Modal;\n","import { twMerge } from \"tailwind-merge\";\n\ntype PopupWrapperProps = {\n children?: React.ReactNode;\n className?: string;\n isOpen: boolean;\n stayMounted?: boolean;\n};\n\nconst PopupWrapper = ({\n children,\n className,\n isOpen = false,\n stayMounted = false,\n}: PopupWrapperProps) => {\n if (!stayMounted && !isOpen) return null;\n\n return (\n <div\n className={twMerge(\n \"absolute right-0 top-1 mt-10 shadow-lg bg-white rounded-lg p-4 w-80 z-10 border border-opacity-10\",\n isOpen ? \"block\" : \"hidden\",\n className\n )}\n >\n {children}\n </div>\n );\n};\n\nexport default PopupWrapper;\n","import { twMerge } from \"tailwind-merge\";\n\nexport type LayoutProps = {\n children: React.ReactNode;\n wrapperClassName?: string;\n navClassName?: string;\n navProps?: React.HTMLAttributes<HTMLElement>;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst SideNav = ({\n children,\n wrapperClassName,\n navClassName,\n navProps,\n ...rest\n}: LayoutProps) => {\n return (\n <div\n {...rest}\n className={twMerge(\n \"bg-base sm:min-w-[260px] shadow-sidebar relative sm:flex flex-col justify-between h-screen max-h-screen\",\n wrapperClassName\n )}\n >\n <nav\n {...navProps}\n className={twMerge(\n \"relative flex flex-col w-full gap-1 px-4 pt-4\",\n navClassName,\n navProps?.className\n )}\n >\n {children}\n </nav>\n </div>\n );\n};\n\nexport default SideNav;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,4BAAwB;AAsBlB;AAdN,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,iBAAQ;;;AClCf,IAAAA,yBAAwB;AAoCpB,IAAAC,sBAAA;AAvBJ,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAAkB;AAChB,MAAI,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEpC,MAAI,kBAAkB;AACtB,MAAI,SAAS,QAAQ;AACnB,sBAAkB;AAAA,EACpB,WAAW,SAAS,SAAS;AAC3B,sBAAkB;AAAA,EACpB,WAAW,SAAS,UAAU;AAC5B,sBACE;AAAA,EACJ;AAEA,SACE,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,UACT;AAAA,UACA,cAAe,SAAS,UAAU,WAAY;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,eAAa,CAAC;AAAA;AAAA,IAChB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,UACT,yFAAyF,eAAe;AAAA,UACxG,cAAe,SAAS,UAAU,WAAY;AAAA,UAC9C;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QAEV;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEA,IAAO,gBAAQ;;;AC/Df,IAAAC,yBAAwB;AAkBpB,IAAAC,sBAAA;AATJ,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAChB,MAAyB;AACvB,MAAI,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,uBAAQ;;;AC9Bf,IAAAC,yBAAwB;AAwBlB,IAAAC,sBAAA;AAfN,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,eAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,qCAAU;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kBAAQ;","names":["import_tailwind_merge","import_jsx_runtime","import_tailwind_merge","import_jsx_runtime","import_tailwind_merge","import_jsx_runtime"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/wrappers/NavBar.tsx
|
|
4
|
+
import { twMerge } from "tailwind-merge";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
var NavBar = ({
|
|
7
|
+
children,
|
|
8
|
+
wrapperClassName,
|
|
9
|
+
innerClassName,
|
|
10
|
+
...rest
|
|
11
|
+
}) => {
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
"nav",
|
|
14
|
+
{
|
|
15
|
+
...rest,
|
|
16
|
+
className: twMerge(
|
|
17
|
+
"z-20 w-full px-4 shadow-navbar bg-white h-[80px]",
|
|
18
|
+
wrapperClassName
|
|
19
|
+
),
|
|
20
|
+
children: /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
className: twMerge(
|
|
24
|
+
"h-[80px] flex justify-between items-center gap-2 px-4 py-1",
|
|
25
|
+
innerClassName
|
|
26
|
+
),
|
|
27
|
+
children
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
var NavBar_default = NavBar;
|
|
34
|
+
|
|
35
|
+
// src/components/wrappers/Modal.tsx
|
|
36
|
+
import { twMerge as twMerge2 } from "tailwind-merge";
|
|
37
|
+
import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
38
|
+
var Modal = ({
|
|
39
|
+
isOpen,
|
|
40
|
+
type = "right",
|
|
41
|
+
onClose,
|
|
42
|
+
widthClassName = "w-[300px]",
|
|
43
|
+
children,
|
|
44
|
+
overlayClassName,
|
|
45
|
+
modalClassName,
|
|
46
|
+
stayMounted = false
|
|
47
|
+
}) => {
|
|
48
|
+
if (!stayMounted && !isOpen) return null;
|
|
49
|
+
let positionClasses = "";
|
|
50
|
+
if (type === "left") {
|
|
51
|
+
positionClasses = "left-0 top-0 h-full";
|
|
52
|
+
} else if (type === "right") {
|
|
53
|
+
positionClasses = "right-0 top-0 h-full";
|
|
54
|
+
} else if (type === "center") {
|
|
55
|
+
positionClasses = "top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2";
|
|
56
|
+
}
|
|
57
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
58
|
+
/* @__PURE__ */ jsx2(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
className: twMerge2(
|
|
62
|
+
"fixed inset-0 bg-black bg-opacity-50 z-40",
|
|
63
|
+
stayMounted ? isOpen ? "block" : "hidden" : "block",
|
|
64
|
+
overlayClassName
|
|
65
|
+
),
|
|
66
|
+
onClick: onClose,
|
|
67
|
+
"aria-hidden": !isOpen
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsx2(
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
className: twMerge2(
|
|
74
|
+
`fixed bg-white shadow-xl z-50 transform transition-transform duration-300 ease-in-out ${positionClasses}`,
|
|
75
|
+
stayMounted ? isOpen ? "block" : "hidden" : "block",
|
|
76
|
+
widthClassName,
|
|
77
|
+
modalClassName
|
|
78
|
+
),
|
|
79
|
+
role: "dialog",
|
|
80
|
+
"aria-modal": "true",
|
|
81
|
+
children
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] });
|
|
85
|
+
};
|
|
86
|
+
var Modal_default = Modal;
|
|
87
|
+
|
|
88
|
+
// src/components/wrappers/PopupWrapper.tsx
|
|
89
|
+
import { twMerge as twMerge3 } from "tailwind-merge";
|
|
90
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
91
|
+
var PopupWrapper = ({
|
|
92
|
+
children,
|
|
93
|
+
className,
|
|
94
|
+
isOpen = false,
|
|
95
|
+
stayMounted = false
|
|
96
|
+
}) => {
|
|
97
|
+
if (!stayMounted && !isOpen) return null;
|
|
98
|
+
return /* @__PURE__ */ jsx3(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
className: twMerge3(
|
|
102
|
+
"absolute right-0 top-1 mt-10 shadow-lg bg-white rounded-lg p-4 w-80 z-10 border border-opacity-10",
|
|
103
|
+
isOpen ? "block" : "hidden",
|
|
104
|
+
className
|
|
105
|
+
),
|
|
106
|
+
children
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
};
|
|
110
|
+
var PopupWrapper_default = PopupWrapper;
|
|
111
|
+
|
|
112
|
+
// src/components/wrappers/SideNav.tsx
|
|
113
|
+
import { twMerge as twMerge4 } from "tailwind-merge";
|
|
114
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
115
|
+
var SideNav = ({
|
|
116
|
+
children,
|
|
117
|
+
wrapperClassName,
|
|
118
|
+
navClassName,
|
|
119
|
+
navProps,
|
|
120
|
+
...rest
|
|
121
|
+
}) => {
|
|
122
|
+
return /* @__PURE__ */ jsx4(
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
...rest,
|
|
126
|
+
className: twMerge4(
|
|
127
|
+
"bg-base sm:min-w-[260px] shadow-sidebar relative sm:flex flex-col justify-between h-screen max-h-screen",
|
|
128
|
+
wrapperClassName
|
|
129
|
+
),
|
|
130
|
+
children: /* @__PURE__ */ jsx4(
|
|
131
|
+
"nav",
|
|
132
|
+
{
|
|
133
|
+
...navProps,
|
|
134
|
+
className: twMerge4(
|
|
135
|
+
"relative flex flex-col w-full gap-1 px-4 pt-4",
|
|
136
|
+
navClassName,
|
|
137
|
+
navProps == null ? void 0 : navProps.className
|
|
138
|
+
),
|
|
139
|
+
children
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
var SideNav_default = SideNav;
|
|
146
|
+
export {
|
|
147
|
+
Modal_default as Modal,
|
|
148
|
+
NavBar_default as NavBar,
|
|
149
|
+
PopupWrapper_default as PopupWrapper,
|
|
150
|
+
SideNav_default as SideNav
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/wrappers/NavBar.tsx","../src/components/wrappers/Modal.tsx","../src/components/wrappers/PopupWrapper.tsx","../src/components/wrappers/SideNav.tsx"],"sourcesContent":["import { twMerge } from \"tailwind-merge\";\n\nexport type NavBarProps = {\n children?: React.ReactNode;\n wrapperClassName?: string;\n innerClassName?: string;\n} & React.HTMLAttributes<HTMLElement>; // allow props like onClick, id, aria-*\n\nconst NavBar = ({\n children,\n wrapperClassName,\n innerClassName,\n ...rest\n}: NavBarProps) => {\n return (\n <nav\n {...rest}\n className={twMerge(\n \"z-20 w-full px-4 shadow-navbar bg-white h-[80px]\",\n wrapperClassName\n )}\n >\n <div\n className={twMerge(\n \"h-[80px] flex justify-between items-center gap-2 px-4 py-1\",\n innerClassName\n )}\n >\n {children}\n </div>\n </nav>\n );\n};\n\nexport default NavBar;\n","import { twMerge } from \"tailwind-merge\";\n\ntype ModalProps = {\n isOpen: boolean;\n type?: \"left\" | \"right\" | \"center\";\n onClose?: () => void;\n widthClassName?: string;\n children?: React.ReactNode;\n overlayClassName?: string;\n modalClassName?: string;\n stayMounted?: boolean;\n};\n\nconst Modal = ({\n isOpen,\n type = \"right\",\n onClose,\n widthClassName = \"w-[300px]\",\n children,\n overlayClassName,\n modalClassName,\n stayMounted = false,\n}: ModalProps) => {\n if (!stayMounted && !isOpen) return null;\n\n let positionClasses = \"\";\n if (type === \"left\") {\n positionClasses = \"left-0 top-0 h-full\";\n } else if (type === \"right\") {\n positionClasses = \"right-0 top-0 h-full\";\n } else if (type === \"center\") {\n positionClasses =\n \"top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\";\n }\n\n return (\n <>\n <div\n className={twMerge(\n \"fixed inset-0 bg-black bg-opacity-50 z-40\",\n stayMounted ? (isOpen ? \"block\" : \"hidden\") : \"block\",\n overlayClassName\n )}\n onClick={onClose}\n aria-hidden={!isOpen}\n />\n\n <div\n className={twMerge(\n `fixed bg-white shadow-xl z-50 transform transition-transform duration-300 ease-in-out ${positionClasses}`,\n stayMounted ? (isOpen ? \"block\" : \"hidden\") : \"block\",\n widthClassName,\n modalClassName\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {children}\n </div>\n </>\n );\n};\n\nexport default Modal;\n","import { twMerge } from \"tailwind-merge\";\n\ntype PopupWrapperProps = {\n children?: React.ReactNode;\n className?: string;\n isOpen: boolean;\n stayMounted?: boolean;\n};\n\nconst PopupWrapper = ({\n children,\n className,\n isOpen = false,\n stayMounted = false,\n}: PopupWrapperProps) => {\n if (!stayMounted && !isOpen) return null;\n\n return (\n <div\n className={twMerge(\n \"absolute right-0 top-1 mt-10 shadow-lg bg-white rounded-lg p-4 w-80 z-10 border border-opacity-10\",\n isOpen ? \"block\" : \"hidden\",\n className\n )}\n >\n {children}\n </div>\n );\n};\n\nexport default PopupWrapper;\n","import { twMerge } from \"tailwind-merge\";\n\nexport type LayoutProps = {\n children: React.ReactNode;\n wrapperClassName?: string;\n navClassName?: string;\n navProps?: React.HTMLAttributes<HTMLElement>;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst SideNav = ({\n children,\n wrapperClassName,\n navClassName,\n navProps,\n ...rest\n}: LayoutProps) => {\n return (\n <div\n {...rest}\n className={twMerge(\n \"bg-base sm:min-w-[260px] shadow-sidebar relative sm:flex flex-col justify-between h-screen max-h-screen\",\n wrapperClassName\n )}\n >\n <nav\n {...navProps}\n className={twMerge(\n \"relative flex flex-col w-full gap-1 px-4 pt-4\",\n navClassName,\n navProps?.className\n )}\n >\n {children}\n </nav>\n </div>\n );\n};\n\nexport default SideNav;\n"],"mappings":";;;AAAA,SAAS,eAAe;AAsBlB;AAdN,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,iBAAQ;;;AClCf,SAAS,WAAAA,gBAAe;AAoCpB,mBACE,OAAAC,MADF;AAvBJ,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAAkB;AAChB,MAAI,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEpC,MAAI,kBAAkB;AACtB,MAAI,SAAS,QAAQ;AACnB,sBAAkB;AAAA,EACpB,WAAW,SAAS,SAAS;AAC3B,sBAAkB;AAAA,EACpB,WAAW,SAAS,UAAU;AAC5B,sBACE;AAAA,EACJ;AAEA,SACE,iCACE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD;AAAA,UACT;AAAA,UACA,cAAe,SAAS,UAAU,WAAY;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,eAAa,CAAC;AAAA;AAAA,IAChB;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD;AAAA,UACT,yFAAyF,eAAe;AAAA,UACxG,cAAe,SAAS,UAAU,WAAY;AAAA,UAC9C;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QAEV;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEA,IAAO,gBAAQ;;;AC/Df,SAAS,WAAAE,gBAAe;AAkBpB,gBAAAC,YAAA;AATJ,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAChB,MAAyB;AACvB,MAAI,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEpC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,uBAAQ;;;AC9Bf,SAAS,WAAAE,gBAAe;AAwBlB,gBAAAC,YAAA;AAfN,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAWD;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,WAAWD;AAAA,YACT;AAAA,YACA;AAAA,YACA,qCAAU;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kBAAQ;","names":["twMerge","jsx","twMerge","jsx","twMerge","jsx"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cr-ui-lib",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.mjs",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsup",
|
|
12
|
+
"dev": "tsup --watch",
|
|
13
|
+
"clean": "rm -rf dist",
|
|
14
|
+
"typecheck": "tsc --noEmit"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "",
|
|
18
|
+
"license": "ISC",
|
|
19
|
+
"description": "",
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/react": "18.0.21",
|
|
22
|
+
"@types/react-dom": "18.0.6",
|
|
23
|
+
"tsup": "^8.5.0",
|
|
24
|
+
"typescript": "^5.6.2",
|
|
25
|
+
"next": "^12.3.1"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"react": ">=18",
|
|
29
|
+
"react-dom": ">=18",
|
|
30
|
+
"tailwindcss": ">=3",
|
|
31
|
+
"tailwind-merge": ">=2.0.0",
|
|
32
|
+
"react-chartjs-2": ">= 5.3.0",
|
|
33
|
+
"chart.js": ">=4.4.7",
|
|
34
|
+
"next": ">=12",
|
|
35
|
+
"lucide-react": ">=0.525.0",
|
|
36
|
+
"date-fns": ">=2.0.1",
|
|
37
|
+
"react-datepicker": ">=4.10.0",
|
|
38
|
+
"react-paginate": ">=8.3.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18",
|
|
42
|
+
"npm": ">=8"
|
|
43
|
+
}
|
|
44
|
+
}
|