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 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
+ [![NPM Version](https://img.shields.io/npm/v/your-package-name.svg)](https://www.npmjs.com/package/your-package-name)
6
+ [![Build Status](https://img.shields.io/travis/com/your-username/your-repo.svg)](https://travis-ci.com/your-username/your-repo)
7
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](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...
@@ -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 };
@@ -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
+ }