cephie-ui 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,104 @@
1
+ # 🎨 cephie-ui
2
+
3
+ A production-ready React component library built with TypeScript, optimized for Next.js, and compiled with Bun.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install cephie-ui
9
+ # or
10
+ yarn add cephie-ui
11
+ # or
12
+ bun add cephie-ui
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Dropdown Component
18
+
19
+ ```tsx
20
+ import { Dropdown, DropdownItem } from 'cephie-ui';
21
+
22
+ export default function MyComponent() {
23
+ return (
24
+ <Dropdown trigger="Menu">
25
+ <DropdownItem onClick={() => console.log('Edit')}>Edit</DropdownItem>
26
+ <DropdownItem onClick={() => console.log('Delete')}>Delete</DropdownItem>
27
+ </Dropdown>
28
+ );
29
+ }
30
+ ```
31
+
32
+ ### Button Component
33
+
34
+ ```tsx
35
+ import { Button } from 'cephie-ui';
36
+
37
+ export default function MyComponent() {
38
+ return (
39
+ <>
40
+ <Button>Primary</Button>
41
+ <Button variant="secondary">Secondary</Button>
42
+ <Button variant="danger" size="lg">Delete</Button>
43
+ </>
44
+ );
45
+ }
46
+ ```
47
+
48
+ ### Badge Component
49
+
50
+ ```tsx
51
+ import { Badge } from 'cephie-ui';
52
+
53
+ export default function MyComponent() {
54
+ return (
55
+ <>
56
+ <Badge>Default</Badge>
57
+ <Badge variant="success">Success</Badge>
58
+ <Badge variant="warning">Warning</Badge>
59
+ <Badge variant="error">Error</Badge>
60
+ <Badge variant="info">Info</Badge>
61
+ </>
62
+ );
63
+ }
64
+ ```
65
+
66
+ ## Development
67
+
68
+ ### Install Dependencies
69
+
70
+ ```bash
71
+ bun install
72
+ ```
73
+
74
+ ### Build
75
+
76
+ ```bash
77
+ bun run build
78
+ ```
79
+
80
+ ### Watch Mode
81
+
82
+ ```bash
83
+ bun run dev
84
+ ```
85
+
86
+ ## Components
87
+
88
+ - **Dropdown** - Flexible dropdown menu component
89
+ - **Button** - Styled button with variants and sizes
90
+ - **Badge** - Status badge with multiple variants
91
+
92
+ ## Features
93
+
94
+ ✅ Built with TypeScript
95
+ ✅ React 18+ compatible
96
+ ✅ Next.js ready
97
+ ✅ ESM and CommonJS support
98
+ ✅ Tree-shakeable
99
+ ✅ Fully typed
100
+ ✅ Tailwind CSS ready
101
+
102
+ ## License
103
+
104
+ ISC
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export default function Background({ className, style }: {
3
+ className?: string;
4
+ style?: React.CSSProperties;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=Background.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Background.d.ts","sourceRoot":"","sources":["../src/components/Background.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAClC,SAAc,EACd,KAAU,EACV,EAAE;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC5B,2CAoBA"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export default function Button({ variant, mode, href, newTab, className, style, children, type, disabled, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement> & {
3
+ variant?: 'primary' | 'secondary' | 'success' | 'danger';
4
+ mode?: 'light' | 'dark';
5
+ href?: string;
6
+ newTab?: boolean;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/components/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA0B1B,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC9B,OAAmB,EACnB,IAAa,EACb,IAAI,EACJ,MAAc,EACd,SAAc,EACd,KAAU,EACV,QAAQ,EACR,IAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACR,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClD,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzD,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,2CA2BA"}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ interface DropdownProps {
3
+ label?: string;
4
+ icon?: React.ReactNode;
5
+ options: {
6
+ label: string;
7
+ value: string;
8
+ }[];
9
+ value?: string;
10
+ onChange?: (e: {
11
+ target: {
12
+ name: string;
13
+ value: string;
14
+ };
15
+ }) => void;
16
+ name?: string;
17
+ id?: string;
18
+ className?: string;
19
+ required?: boolean;
20
+ mode?: 'light' | 'dark';
21
+ }
22
+ export default function Dropdown({ label, icon, options, value, onChange, name, id, className, required, mode }: DropdownProps): import("react/jsx-runtime").JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=Dropdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../src/components/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,UAAU,aAAa;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAsCD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAChC,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAS,EACT,EAAO,EACP,SAAc,EACd,QAAgB,EAChB,IAAa,EACb,EAAE,aAAa,2CAwIf"}
@@ -0,0 +1,5 @@
1
+ export default function LoadingSpinner({ size, mode }: {
2
+ size?: 'small' | 'medium' | 'large';
3
+ mode?: 'light' | 'dark';
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=LoadingSpinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingSpinner.d.ts","sourceRoot":"","sources":["../src/components/LoadingSpinner.tsx"],"names":[],"mappings":"AAaA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACtC,IAAe,EACf,IAAa,EACb,EAAE;IACF,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB,2CAQA"}
package/dist/index.cjs ADDED
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/components/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Background: () => Background,
24
+ Button: () => Button,
25
+ Dropdown: () => Dropdown,
26
+ LoadingSpinner: () => LoadingSpinner
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+
30
+ // src/components/Button.tsx
31
+ var import_jsx_runtime = require("react/jsx-runtime");
32
+ var variantClasses = {
33
+ light: {
34
+ primary: "bg-zinc-950 text-white hover:bg-zinc-800 focus-visible:outline-zinc-900",
35
+ secondary: "bg-zinc-200 text-zinc-900 hover:bg-zinc-300 focus-visible:outline-zinc-400",
36
+ success: "bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800",
37
+ danger: "bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800"
38
+ },
39
+ dark: {
40
+ primary: "bg-zinc-50 text-zinc-950 hover:bg-zinc-200 focus-visible:outline-zinc-50",
41
+ secondary: "bg-zinc-800 text-zinc-50 hover:bg-zinc-700 focus-visible:outline-zinc-700",
42
+ success: "bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800",
43
+ danger: "bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800"
44
+ }
45
+ };
46
+ function Button({
47
+ variant = "primary",
48
+ mode = "dark",
49
+ href,
50
+ newTab = false,
51
+ className = "",
52
+ style = {},
53
+ children,
54
+ type = "button",
55
+ disabled,
56
+ ...props
57
+ }) {
58
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
59
+ "button",
60
+ {
61
+ className: `rounded-2xl px-6 py-3 text-sm font-semibold shadow-sm focus-visible:outline-2 focus-visible:outline-offset-2 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed ${variantClasses[mode][variant]} ${className}`,
62
+ style,
63
+ type,
64
+ disabled,
65
+ ...props,
66
+ children
67
+ }
68
+ );
69
+ if (href) {
70
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
71
+ "a",
72
+ {
73
+ href,
74
+ target: newTab ? "_blank" : "_self",
75
+ rel: "noopener noreferrer",
76
+ className: "contents",
77
+ children: content
78
+ }
79
+ );
80
+ }
81
+ return content;
82
+ }
83
+
84
+ // src/components/Dropdown.tsx
85
+ var import_react = require("react");
86
+ var import_jsx_runtime2 = require("react/jsx-runtime");
87
+ var triggerClasses = {
88
+ light: "bg-zinc-50 border-zinc-200 text-zinc-900 focus:ring-blue-500/20 focus:border-blue-500 focus:bg-white",
89
+ dark: "bg-zinc-900/50 border-zinc-800 text-zinc-50 focus:ring-zinc-700 focus:border-zinc-600 focus:bg-zinc-900"
90
+ };
91
+ var chevronClasses = {
92
+ light: "text-zinc-400",
93
+ dark: "text-zinc-500"
94
+ };
95
+ var dropdownListClasses = {
96
+ light: "bg-white border-zinc-200 shadow-xl",
97
+ dark: "bg-zinc-900 border-zinc-800 shadow-2xl backdrop-blur-xl"
98
+ };
99
+ var optionClasses = {
100
+ light: {
101
+ selected: "text-blue-600 bg-blue-50/50",
102
+ unselected: "text-zinc-700",
103
+ hover: "hover:bg-zinc-50"
104
+ },
105
+ dark: {
106
+ selected: "text-zinc-50 bg-zinc-800",
107
+ unselected: "text-zinc-400",
108
+ hover: "hover:bg-zinc-800"
109
+ }
110
+ };
111
+ var iconClasses = {
112
+ light: "text-blue-500",
113
+ dark: "text-zinc-400"
114
+ };
115
+ function Dropdown({
116
+ label,
117
+ icon,
118
+ options,
119
+ value,
120
+ onChange,
121
+ name = "",
122
+ id = "",
123
+ className = "",
124
+ required = false,
125
+ mode = "dark"
126
+ }) {
127
+ const [isOpen, setIsOpen] = (0, import_react.useState)(false);
128
+ const dropdownRef = (0, import_react.useRef)(null);
129
+ const selectedOption = options.find(
130
+ (opt) => String(opt.value).trim() === String(value).trim()
131
+ );
132
+ const displayLabel = selectedOption ? selectedOption.label : value ? String(value).length > 20 ? `${String(value).substring(0, 8)}...${String(value).substring(String(value).length - 4)}` : String(value) : "Select an option...";
133
+ (0, import_react.useEffect)(() => {
134
+ const handleClickOutside = (event) => {
135
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
136
+ setIsOpen(false);
137
+ }
138
+ };
139
+ document.addEventListener("mousedown", handleClickOutside);
140
+ return () => document.removeEventListener("mousedown", handleClickOutside);
141
+ }, []);
142
+ const handleSelect = (optionValue) => {
143
+ if (onChange) {
144
+ onChange({
145
+ target: {
146
+ name,
147
+ value: optionValue
148
+ }
149
+ });
150
+ }
151
+ setIsOpen(false);
152
+ };
153
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `space-y-1.5 ${className}`, ref: dropdownRef, children: [
154
+ label && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
155
+ "label",
156
+ {
157
+ htmlFor: id || name,
158
+ className: "flex items-center text-xs font-bold uppercase tracking-wider text-zinc-500 ml-1 font-montserrat",
159
+ children: [
160
+ icon && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `mr-2 ${iconClasses[mode]}`, children: icon }),
161
+ label
162
+ ]
163
+ }
164
+ ),
165
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "relative", children: [
166
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
167
+ "button",
168
+ {
169
+ type: "button",
170
+ onClick: () => setIsOpen(!isOpen),
171
+ className: `w-full px-4 py-3 border rounded-xl focus:ring-2 outline-none transition-colors font-montserrat cursor-pointer flex items-center justify-between text-left text-sm ${triggerClasses[mode]}`,
172
+ "aria-haspopup": "listbox",
173
+ "aria-expanded": isOpen,
174
+ children: [
175
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "truncate", children: displayLabel }),
176
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
177
+ "div",
178
+ {
179
+ className: `transition-transform duration-200 ${chevronClasses[mode]} ${isOpen ? "rotate-180" : ""}`,
180
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
181
+ "svg",
182
+ {
183
+ className: "w-4 h-4",
184
+ fill: "none",
185
+ stroke: "currentColor",
186
+ viewBox: "0 0 24 24",
187
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
188
+ "path",
189
+ {
190
+ strokeLinecap: "round",
191
+ strokeLinejoin: "round",
192
+ strokeWidth: "2",
193
+ d: "M19 9l-7 7-7-7"
194
+ }
195
+ )
196
+ }
197
+ )
198
+ }
199
+ )
200
+ ]
201
+ }
202
+ ),
203
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
204
+ "div",
205
+ {
206
+ className: `absolute z-50 w-full mt-2 border rounded-2xl overflow-hidden animate-in fade-in zoom-in duration-200 ${dropdownListClasses[mode]}`,
207
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
208
+ "div",
209
+ {
210
+ role: "listbox",
211
+ className: "py-1.5 px-1.5 max-h-60 overflow-y-auto",
212
+ children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
213
+ "button",
214
+ {
215
+ type: "button",
216
+ onClick: () => handleSelect(option.value),
217
+ className: `w-full px-4 py-2.5 rounded-xl text-left font-montserrat transition-colors flex items-center justify-between text-sm ${optionClasses[mode].hover} ${String(option.value) === String(value) ? optionClasses[mode].selected : optionClasses[mode].unselected}`,
218
+ role: "option",
219
+ "aria-selected": String(option.value) === String(value),
220
+ children: [
221
+ option.label,
222
+ String(option.value) === String(value) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
223
+ "svg",
224
+ {
225
+ className: "w-3.5 h-3.5",
226
+ fill: "currentColor",
227
+ viewBox: "0 0 20 20",
228
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
229
+ "path",
230
+ {
231
+ fillRule: "evenodd",
232
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
233
+ clipRule: "evenodd"
234
+ }
235
+ )
236
+ }
237
+ )
238
+ ]
239
+ },
240
+ option.value
241
+ ))
242
+ }
243
+ )
244
+ }
245
+ ),
246
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
247
+ "input",
248
+ {
249
+ type: "hidden",
250
+ name,
251
+ value,
252
+ required
253
+ }
254
+ )
255
+ ] })
256
+ ] });
257
+ }
258
+
259
+ // src/components/LoadingSpinner.tsx
260
+ var import_jsx_runtime3 = require("react/jsx-runtime");
261
+ var sizeClasses = {
262
+ small: "h-4 w-4 border-2",
263
+ medium: "h-8 w-8 border-3",
264
+ large: "h-12 w-12 border-4"
265
+ };
266
+ var modeClasses = {
267
+ light: "border-zinc-200 border-t-zinc-800",
268
+ dark: "border-zinc-800 border-t-zinc-200"
269
+ };
270
+ function LoadingSpinner({
271
+ size = "medium",
272
+ mode = "dark"
273
+ }) {
274
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
275
+ "div",
276
+ {
277
+ className: `${sizeClasses[size]} ${modeClasses[mode]} animate-spin rounded-full`
278
+ }
279
+ ) });
280
+ }
281
+
282
+ // src/components/Background.tsx
283
+ var import_jsx_runtime4 = require("react/jsx-runtime");
284
+ function Background({
285
+ className = "",
286
+ style = {}
287
+ }) {
288
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
289
+ "div",
290
+ {
291
+ "aria-hidden": "true",
292
+ className: `absolute inset-0 z-0 pointer-events-none flex items-center justify-center blur-3xl ${className}`,
293
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
294
+ "div",
295
+ {
296
+ className: "absolute left-1/2 top-0 -translate-x-1/2 rotate-20 opacity-30",
297
+ style: {
298
+ width: "60rem",
299
+ aspectRatio: "1200/700",
300
+ background: "linear-gradient(to top right, #38bdf8, #1e40af)",
301
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)",
302
+ ...style
303
+ }
304
+ }
305
+ )
306
+ }
307
+ );
308
+ }
309
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/index.ts", "../src/components/Button.tsx", "../src/components/Dropdown.tsx", "../src/components/LoadingSpinner.tsx", "../src/components/Background.tsx"],
4
+ "sourcesContent": ["export { default as Button } from './Button';\nexport { default as Dropdown } from './Dropdown';\nexport { default as LoadingSpinner } from './LoadingSpinner';\nexport { default as Background } from './Background';\n", "import React from 'react';\n\nconst variantClasses: Record<\n\t'light' | 'dark',\n\tRecord<'primary' | 'secondary' | 'success' | 'danger', string>\n> = {\n\tlight: {\n\t\tprimary:\n\t\t\t'bg-zinc-950 text-white hover:bg-zinc-800 focus-visible:outline-zinc-900',\n\t\tsecondary:\n\t\t\t'bg-zinc-200 text-zinc-900 hover:bg-zinc-300 focus-visible:outline-zinc-400',\n\t\tsuccess:\n\t\t\t'bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800',\n\t\tdanger: 'bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800'\n\t},\n\tdark: {\n\t\tprimary:\n\t\t\t'bg-zinc-50 text-zinc-950 hover:bg-zinc-200 focus-visible:outline-zinc-50',\n\t\tsecondary:\n\t\t\t'bg-zinc-800 text-zinc-50 hover:bg-zinc-700 focus-visible:outline-zinc-700',\n\t\tsuccess:\n\t\t\t'bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800',\n\t\tdanger: 'bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800'\n\t}\n};\n\nexport default function Button({\n\tvariant = 'primary',\n\tmode = 'dark',\n\thref,\n\tnewTab = false,\n\tclassName = '',\n\tstyle = {},\n\tchildren,\n\ttype = 'button',\n\tdisabled,\n\t...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n\tvariant?: 'primary' | 'secondary' | 'success' | 'danger';\n\tmode?: 'light' | 'dark';\n\thref?: string;\n\tnewTab?: boolean;\n}) {\n\tconst content = (\n\t\t<button\n\t\t\tclassName={`rounded-2xl px-6 py-3 text-sm font-semibold shadow-sm focus-visible:outline-2 focus-visible:outline-offset-2 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed ${variantClasses[mode][variant]} ${className}`}\n\t\t\tstyle={style}\n\t\t\ttype={type}\n\t\t\tdisabled={disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n\n\tif (href) {\n\t\treturn (\n\t\t\t<a\n\t\t\t\thref={href}\n\t\t\t\ttarget={newTab ? '_blank' : '_self'}\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tclassName=\"contents\"\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</a>\n\t\t);\n\t}\n\n\treturn content;\n}\n", "import React, { useState, useRef, useEffect } from 'react';\r\n\r\ninterface DropdownProps {\r\n\tlabel?: string;\r\n\ticon?: React.ReactNode;\r\n\toptions: { label: string; value: string }[];\r\n\tvalue?: string;\r\n\tonChange?: (e: { target: { name: string; value: string } }) => void;\r\n\tname?: string;\r\n\tid?: string;\r\n\tclassName?: string;\r\n\trequired?: boolean;\r\n\tmode?: 'light' | 'dark';\r\n}\r\n\r\nconst triggerClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'bg-zinc-50 border-zinc-200 text-zinc-900 focus:ring-blue-500/20 focus:border-blue-500 focus:bg-white',\r\n\tdark: 'bg-zinc-900/50 border-zinc-800 text-zinc-50 focus:ring-zinc-700 focus:border-zinc-600 focus:bg-zinc-900'\r\n};\r\n\r\nconst chevronClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'text-zinc-400',\r\n\tdark: 'text-zinc-500'\r\n};\r\n\r\nconst dropdownListClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'bg-white border-zinc-200 shadow-xl',\r\n\tdark: 'bg-zinc-900 border-zinc-800 shadow-2xl backdrop-blur-xl'\r\n};\r\n\r\nconst optionClasses: Record<\r\n\t'light' | 'dark',\r\n\t{ selected: string; unselected: string; hover: string }\r\n> = {\r\n\tlight: {\r\n\t\tselected: 'text-blue-600 bg-blue-50/50',\r\n\t\tunselected: 'text-zinc-700',\r\n\t\thover: 'hover:bg-zinc-50'\r\n\t},\r\n\tdark: {\r\n\t\tselected: 'text-zinc-50 bg-zinc-800',\r\n\t\tunselected: 'text-zinc-400',\r\n\t\thover: 'hover:bg-zinc-800'\r\n\t}\r\n};\r\n\r\nconst iconClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'text-blue-500',\r\n\tdark: 'text-zinc-400'\r\n};\r\n\r\nexport default function Dropdown({\r\n\tlabel,\r\n\ticon,\r\n\toptions,\r\n\tvalue,\r\n\tonChange,\r\n\tname = '',\r\n\tid = '',\r\n\tclassName = '',\r\n\trequired = false,\r\n\tmode = 'dark'\r\n}: DropdownProps) {\r\n\tconst [isOpen, setIsOpen] = useState(false);\r\n\tconst dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst selectedOption = options.find(\r\n\t\t(opt) => String(opt.value).trim() === String(value).trim()\r\n\t);\r\n\tconst displayLabel = selectedOption\r\n\t\t? selectedOption.label\r\n\t\t: value\r\n\t\t\t? String(value).length > 20\r\n\t\t\t\t? `${String(value).substring(0, 8)}...${String(value).substring(String(value).length - 4)}`\r\n\t\t\t\t: String(value)\r\n\t\t\t: 'Select an option...';\r\n\r\n\tuseEffect(() => {\r\n\t\tconst handleClickOutside = (event: MouseEvent) => {\r\n\t\t\tif (\r\n\t\t\t\tdropdownRef.current &&\r\n\t\t\t\t!dropdownRef.current.contains(event.target as Node)\r\n\t\t\t) {\r\n\t\t\t\tsetIsOpen(false);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\r\n\t\treturn () =>\r\n\t\t\tdocument.removeEventListener('mousedown', handleClickOutside);\r\n\t}, []);\r\n\r\n\tconst handleSelect = (optionValue: string) => {\r\n\t\tif (onChange) {\r\n\t\t\tonChange({\r\n\t\t\t\ttarget: {\r\n\t\t\t\t\tname,\r\n\t\t\t\t\tvalue: optionValue\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tsetIsOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div className={`space-y-1.5 ${className}`} ref={dropdownRef}>\r\n\t\t\t{label && (\r\n\t\t\t\t<label\r\n\t\t\t\t\thtmlFor={id || name}\r\n\t\t\t\t\tclassName=\"flex items-center text-xs font-bold uppercase tracking-wider text-zinc-500 ml-1 font-montserrat\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{icon && (\r\n\t\t\t\t\t\t<span className={`mr-2 ${iconClasses[mode]}`}>\r\n\t\t\t\t\t\t\t{icon}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{label}\r\n\t\t\t\t</label>\r\n\t\t\t)}\r\n\t\t\t<div className=\"relative\">\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tonClick={() => setIsOpen(!isOpen)}\r\n\t\t\t\t\tclassName={`w-full px-4 py-3 border rounded-xl focus:ring-2 outline-none transition-colors font-montserrat cursor-pointer flex items-center justify-between text-left text-sm ${triggerClasses[mode]}`}\r\n\t\t\t\t\taria-haspopup=\"listbox\"\r\n\t\t\t\t\taria-expanded={isOpen}\r\n\t\t\t\t>\r\n\t\t\t\t\t<span className=\"truncate\">{displayLabel}</span>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`transition-transform duration-200 ${chevronClasses[mode]} ${isOpen ? 'rotate-180' : ''}`}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\tclassName=\"w-4 h-4\"\r\n\t\t\t\t\t\t\tfill=\"none\"\r\n\t\t\t\t\t\t\tstroke=\"currentColor\"\r\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\r\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\r\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\r\n\t\t\t\t\t\t\t\td=\"M19 9l-7 7-7-7\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t{isOpen && (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`absolute z-50 w-full mt-2 border rounded-2xl overflow-hidden animate-in fade-in zoom-in duration-200 ${dropdownListClasses[mode]}`}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\trole=\"listbox\"\r\n\t\t\t\t\t\t\tclassName=\"py-1.5 px-1.5 max-h-60 overflow-y-auto\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{options.map((option) => (\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tkey={option.value}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tonClick={() => handleSelect(option.value)}\r\n\t\t\t\t\t\t\t\t\tclassName={`w-full px-4 py-2.5 rounded-xl text-left font-montserrat transition-colors flex items-center justify-between text-sm ${optionClasses[mode].hover} ${\r\n\t\t\t\t\t\t\t\t\t\tString(option.value) === String(value)\r\n\t\t\t\t\t\t\t\t\t\t\t? optionClasses[mode].selected\r\n\t\t\t\t\t\t\t\t\t\t\t: optionClasses[mode].unselected\r\n\t\t\t\t\t\t\t\t\t}`}\r\n\t\t\t\t\t\t\t\t\trole=\"option\"\r\n\t\t\t\t\t\t\t\t\taria-selected={\r\n\t\t\t\t\t\t\t\t\t\tString(option.value) === String(value)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{option.label}\r\n\t\t\t\t\t\t\t\t\t{String(option.value) === String(value) && (\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-3.5 h-3.5\"\r\n\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\r\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t\t<input\r\n\t\t\t\t\ttype=\"hidden\"\r\n\t\t\t\t\tname={name}\r\n\t\t\t\t\tvalue={value}\r\n\t\t\t\t\trequired={required}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "import React from 'react';\n\nconst sizeClasses: Record<'small' | 'medium' | 'large', string> = {\n\tsmall: 'h-4 w-4 border-2',\n\tmedium: 'h-8 w-8 border-3',\n\tlarge: 'h-12 w-12 border-4'\n};\n\nconst modeClasses: Record<'light' | 'dark', string> = {\n\tlight: 'border-zinc-200 border-t-zinc-800',\n\tdark: 'border-zinc-800 border-t-zinc-200'\n};\n\nexport default function LoadingSpinner({\n\tsize = 'medium',\n\tmode = 'dark'\n}: {\n\tsize?: 'small' | 'medium' | 'large';\n\tmode?: 'light' | 'dark';\n}) {\n\treturn (\n\t\t<div className=\"flex items-center justify-center\">\n\t\t\t<div\n\t\t\t\tclassName={`${sizeClasses[size]} ${modeClasses[mode]} animate-spin rounded-full`}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n", "import React from 'react';\n\nexport default function Background({\n\tclassName = '',\n\tstyle = {}\n}: {\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={`absolute inset-0 z-0 pointer-events-none flex items-center justify-center blur-3xl ${className}`}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"absolute left-1/2 top-0 -translate-x-1/2 rotate-20 opacity-30\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: '60rem',\n\t\t\t\t\taspectRatio: '1200/700',\n\t\t\t\t\tbackground:\n\t\t\t\t\t\t'linear-gradient(to top right, #38bdf8, #1e40af)',\n\t\t\t\t\tclipPath:\n\t\t\t\t\t\t'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',\n\t\t\t\t\t...style\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime"]
7
+ }
@@ -0,0 +1,5 @@
1
+ export { default as Button } from './Button';
2
+ export { default as Dropdown } from './Dropdown';
3
+ export { default as LoadingSpinner } from './LoadingSpinner';
4
+ export { default as Background } from './Background';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,286 @@
1
+ // src/components/Button.tsx
2
+ import { jsx } from "react/jsx-runtime";
3
+ var variantClasses = {
4
+ light: {
5
+ primary: "bg-zinc-950 text-white hover:bg-zinc-800 focus-visible:outline-zinc-900",
6
+ secondary: "bg-zinc-200 text-zinc-900 hover:bg-zinc-300 focus-visible:outline-zinc-400",
7
+ success: "bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800",
8
+ danger: "bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800"
9
+ },
10
+ dark: {
11
+ primary: "bg-zinc-50 text-zinc-950 hover:bg-zinc-200 focus-visible:outline-zinc-50",
12
+ secondary: "bg-zinc-800 text-zinc-50 hover:bg-zinc-700 focus-visible:outline-zinc-700",
13
+ success: "bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800",
14
+ danger: "bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800"
15
+ }
16
+ };
17
+ function Button({
18
+ variant = "primary",
19
+ mode = "dark",
20
+ href,
21
+ newTab = false,
22
+ className = "",
23
+ style = {},
24
+ children,
25
+ type = "button",
26
+ disabled,
27
+ ...props
28
+ }) {
29
+ const content = /* @__PURE__ */ jsx(
30
+ "button",
31
+ {
32
+ className: `rounded-2xl px-6 py-3 text-sm font-semibold shadow-sm focus-visible:outline-2 focus-visible:outline-offset-2 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed ${variantClasses[mode][variant]} ${className}`,
33
+ style,
34
+ type,
35
+ disabled,
36
+ ...props,
37
+ children
38
+ }
39
+ );
40
+ if (href) {
41
+ return /* @__PURE__ */ jsx(
42
+ "a",
43
+ {
44
+ href,
45
+ target: newTab ? "_blank" : "_self",
46
+ rel: "noopener noreferrer",
47
+ className: "contents",
48
+ children: content
49
+ }
50
+ );
51
+ }
52
+ return content;
53
+ }
54
+
55
+ // src/components/Dropdown.tsx
56
+ import { useState, useRef, useEffect } from "react";
57
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
58
+ var triggerClasses = {
59
+ light: "bg-zinc-50 border-zinc-200 text-zinc-900 focus:ring-blue-500/20 focus:border-blue-500 focus:bg-white",
60
+ dark: "bg-zinc-900/50 border-zinc-800 text-zinc-50 focus:ring-zinc-700 focus:border-zinc-600 focus:bg-zinc-900"
61
+ };
62
+ var chevronClasses = {
63
+ light: "text-zinc-400",
64
+ dark: "text-zinc-500"
65
+ };
66
+ var dropdownListClasses = {
67
+ light: "bg-white border-zinc-200 shadow-xl",
68
+ dark: "bg-zinc-900 border-zinc-800 shadow-2xl backdrop-blur-xl"
69
+ };
70
+ var optionClasses = {
71
+ light: {
72
+ selected: "text-blue-600 bg-blue-50/50",
73
+ unselected: "text-zinc-700",
74
+ hover: "hover:bg-zinc-50"
75
+ },
76
+ dark: {
77
+ selected: "text-zinc-50 bg-zinc-800",
78
+ unselected: "text-zinc-400",
79
+ hover: "hover:bg-zinc-800"
80
+ }
81
+ };
82
+ var iconClasses = {
83
+ light: "text-blue-500",
84
+ dark: "text-zinc-400"
85
+ };
86
+ function Dropdown({
87
+ label,
88
+ icon,
89
+ options,
90
+ value,
91
+ onChange,
92
+ name = "",
93
+ id = "",
94
+ className = "",
95
+ required = false,
96
+ mode = "dark"
97
+ }) {
98
+ const [isOpen, setIsOpen] = useState(false);
99
+ const dropdownRef = useRef(null);
100
+ const selectedOption = options.find(
101
+ (opt) => String(opt.value).trim() === String(value).trim()
102
+ );
103
+ const displayLabel = selectedOption ? selectedOption.label : value ? String(value).length > 20 ? `${String(value).substring(0, 8)}...${String(value).substring(String(value).length - 4)}` : String(value) : "Select an option...";
104
+ useEffect(() => {
105
+ const handleClickOutside = (event) => {
106
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
107
+ setIsOpen(false);
108
+ }
109
+ };
110
+ document.addEventListener("mousedown", handleClickOutside);
111
+ return () => document.removeEventListener("mousedown", handleClickOutside);
112
+ }, []);
113
+ const handleSelect = (optionValue) => {
114
+ if (onChange) {
115
+ onChange({
116
+ target: {
117
+ name,
118
+ value: optionValue
119
+ }
120
+ });
121
+ }
122
+ setIsOpen(false);
123
+ };
124
+ return /* @__PURE__ */ jsxs("div", { className: `space-y-1.5 ${className}`, ref: dropdownRef, children: [
125
+ label && /* @__PURE__ */ jsxs(
126
+ "label",
127
+ {
128
+ htmlFor: id || name,
129
+ className: "flex items-center text-xs font-bold uppercase tracking-wider text-zinc-500 ml-1 font-montserrat",
130
+ children: [
131
+ icon && /* @__PURE__ */ jsx2("span", { className: `mr-2 ${iconClasses[mode]}`, children: icon }),
132
+ label
133
+ ]
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
137
+ /* @__PURE__ */ jsxs(
138
+ "button",
139
+ {
140
+ type: "button",
141
+ onClick: () => setIsOpen(!isOpen),
142
+ className: `w-full px-4 py-3 border rounded-xl focus:ring-2 outline-none transition-colors font-montserrat cursor-pointer flex items-center justify-between text-left text-sm ${triggerClasses[mode]}`,
143
+ "aria-haspopup": "listbox",
144
+ "aria-expanded": isOpen,
145
+ children: [
146
+ /* @__PURE__ */ jsx2("span", { className: "truncate", children: displayLabel }),
147
+ /* @__PURE__ */ jsx2(
148
+ "div",
149
+ {
150
+ className: `transition-transform duration-200 ${chevronClasses[mode]} ${isOpen ? "rotate-180" : ""}`,
151
+ children: /* @__PURE__ */ jsx2(
152
+ "svg",
153
+ {
154
+ className: "w-4 h-4",
155
+ fill: "none",
156
+ stroke: "currentColor",
157
+ viewBox: "0 0 24 24",
158
+ children: /* @__PURE__ */ jsx2(
159
+ "path",
160
+ {
161
+ strokeLinecap: "round",
162
+ strokeLinejoin: "round",
163
+ strokeWidth: "2",
164
+ d: "M19 9l-7 7-7-7"
165
+ }
166
+ )
167
+ }
168
+ )
169
+ }
170
+ )
171
+ ]
172
+ }
173
+ ),
174
+ isOpen && /* @__PURE__ */ jsx2(
175
+ "div",
176
+ {
177
+ className: `absolute z-50 w-full mt-2 border rounded-2xl overflow-hidden animate-in fade-in zoom-in duration-200 ${dropdownListClasses[mode]}`,
178
+ children: /* @__PURE__ */ jsx2(
179
+ "div",
180
+ {
181
+ role: "listbox",
182
+ className: "py-1.5 px-1.5 max-h-60 overflow-y-auto",
183
+ children: options.map((option) => /* @__PURE__ */ jsxs(
184
+ "button",
185
+ {
186
+ type: "button",
187
+ onClick: () => handleSelect(option.value),
188
+ className: `w-full px-4 py-2.5 rounded-xl text-left font-montserrat transition-colors flex items-center justify-between text-sm ${optionClasses[mode].hover} ${String(option.value) === String(value) ? optionClasses[mode].selected : optionClasses[mode].unselected}`,
189
+ role: "option",
190
+ "aria-selected": String(option.value) === String(value),
191
+ children: [
192
+ option.label,
193
+ String(option.value) === String(value) && /* @__PURE__ */ jsx2(
194
+ "svg",
195
+ {
196
+ className: "w-3.5 h-3.5",
197
+ fill: "currentColor",
198
+ viewBox: "0 0 20 20",
199
+ children: /* @__PURE__ */ jsx2(
200
+ "path",
201
+ {
202
+ fillRule: "evenodd",
203
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
204
+ clipRule: "evenodd"
205
+ }
206
+ )
207
+ }
208
+ )
209
+ ]
210
+ },
211
+ option.value
212
+ ))
213
+ }
214
+ )
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsx2(
218
+ "input",
219
+ {
220
+ type: "hidden",
221
+ name,
222
+ value,
223
+ required
224
+ }
225
+ )
226
+ ] })
227
+ ] });
228
+ }
229
+
230
+ // src/components/LoadingSpinner.tsx
231
+ import { jsx as jsx3 } from "react/jsx-runtime";
232
+ var sizeClasses = {
233
+ small: "h-4 w-4 border-2",
234
+ medium: "h-8 w-8 border-3",
235
+ large: "h-12 w-12 border-4"
236
+ };
237
+ var modeClasses = {
238
+ light: "border-zinc-200 border-t-zinc-800",
239
+ dark: "border-zinc-800 border-t-zinc-200"
240
+ };
241
+ function LoadingSpinner({
242
+ size = "medium",
243
+ mode = "dark"
244
+ }) {
245
+ return /* @__PURE__ */ jsx3("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx3(
246
+ "div",
247
+ {
248
+ className: `${sizeClasses[size]} ${modeClasses[mode]} animate-spin rounded-full`
249
+ }
250
+ ) });
251
+ }
252
+
253
+ // src/components/Background.tsx
254
+ import { jsx as jsx4 } from "react/jsx-runtime";
255
+ function Background({
256
+ className = "",
257
+ style = {}
258
+ }) {
259
+ return /* @__PURE__ */ jsx4(
260
+ "div",
261
+ {
262
+ "aria-hidden": "true",
263
+ className: `absolute inset-0 z-0 pointer-events-none flex items-center justify-center blur-3xl ${className}`,
264
+ children: /* @__PURE__ */ jsx4(
265
+ "div",
266
+ {
267
+ className: "absolute left-1/2 top-0 -translate-x-1/2 rotate-20 opacity-30",
268
+ style: {
269
+ width: "60rem",
270
+ aspectRatio: "1200/700",
271
+ background: "linear-gradient(to top right, #38bdf8, #1e40af)",
272
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)",
273
+ ...style
274
+ }
275
+ }
276
+ )
277
+ }
278
+ );
279
+ }
280
+ export {
281
+ Background,
282
+ Button,
283
+ Dropdown,
284
+ LoadingSpinner
285
+ };
286
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/Button.tsx", "../src/components/Dropdown.tsx", "../src/components/LoadingSpinner.tsx", "../src/components/Background.tsx"],
4
+ "sourcesContent": ["import React from 'react';\n\nconst variantClasses: Record<\n\t'light' | 'dark',\n\tRecord<'primary' | 'secondary' | 'success' | 'danger', string>\n> = {\n\tlight: {\n\t\tprimary:\n\t\t\t'bg-zinc-950 text-white hover:bg-zinc-800 focus-visible:outline-zinc-900',\n\t\tsecondary:\n\t\t\t'bg-zinc-200 text-zinc-900 hover:bg-zinc-300 focus-visible:outline-zinc-400',\n\t\tsuccess:\n\t\t\t'bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800',\n\t\tdanger: 'bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800'\n\t},\n\tdark: {\n\t\tprimary:\n\t\t\t'bg-zinc-50 text-zinc-950 hover:bg-zinc-200 focus-visible:outline-zinc-50',\n\t\tsecondary:\n\t\t\t'bg-zinc-800 text-zinc-50 hover:bg-zinc-700 focus-visible:outline-zinc-700',\n\t\tsuccess:\n\t\t\t'bg-green-600 text-white hover:bg-green-700 focus-visible:outline-green-800',\n\t\tdanger: 'bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-800'\n\t}\n};\n\nexport default function Button({\n\tvariant = 'primary',\n\tmode = 'dark',\n\thref,\n\tnewTab = false,\n\tclassName = '',\n\tstyle = {},\n\tchildren,\n\ttype = 'button',\n\tdisabled,\n\t...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n\tvariant?: 'primary' | 'secondary' | 'success' | 'danger';\n\tmode?: 'light' | 'dark';\n\thref?: string;\n\tnewTab?: boolean;\n}) {\n\tconst content = (\n\t\t<button\n\t\t\tclassName={`rounded-2xl px-6 py-3 text-sm font-semibold shadow-sm focus-visible:outline-2 focus-visible:outline-offset-2 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed ${variantClasses[mode][variant]} ${className}`}\n\t\t\tstyle={style}\n\t\t\ttype={type}\n\t\t\tdisabled={disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n\n\tif (href) {\n\t\treturn (\n\t\t\t<a\n\t\t\t\thref={href}\n\t\t\t\ttarget={newTab ? '_blank' : '_self'}\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tclassName=\"contents\"\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</a>\n\t\t);\n\t}\n\n\treturn content;\n}\n", "import React, { useState, useRef, useEffect } from 'react';\r\n\r\ninterface DropdownProps {\r\n\tlabel?: string;\r\n\ticon?: React.ReactNode;\r\n\toptions: { label: string; value: string }[];\r\n\tvalue?: string;\r\n\tonChange?: (e: { target: { name: string; value: string } }) => void;\r\n\tname?: string;\r\n\tid?: string;\r\n\tclassName?: string;\r\n\trequired?: boolean;\r\n\tmode?: 'light' | 'dark';\r\n}\r\n\r\nconst triggerClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'bg-zinc-50 border-zinc-200 text-zinc-900 focus:ring-blue-500/20 focus:border-blue-500 focus:bg-white',\r\n\tdark: 'bg-zinc-900/50 border-zinc-800 text-zinc-50 focus:ring-zinc-700 focus:border-zinc-600 focus:bg-zinc-900'\r\n};\r\n\r\nconst chevronClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'text-zinc-400',\r\n\tdark: 'text-zinc-500'\r\n};\r\n\r\nconst dropdownListClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'bg-white border-zinc-200 shadow-xl',\r\n\tdark: 'bg-zinc-900 border-zinc-800 shadow-2xl backdrop-blur-xl'\r\n};\r\n\r\nconst optionClasses: Record<\r\n\t'light' | 'dark',\r\n\t{ selected: string; unselected: string; hover: string }\r\n> = {\r\n\tlight: {\r\n\t\tselected: 'text-blue-600 bg-blue-50/50',\r\n\t\tunselected: 'text-zinc-700',\r\n\t\thover: 'hover:bg-zinc-50'\r\n\t},\r\n\tdark: {\r\n\t\tselected: 'text-zinc-50 bg-zinc-800',\r\n\t\tunselected: 'text-zinc-400',\r\n\t\thover: 'hover:bg-zinc-800'\r\n\t}\r\n};\r\n\r\nconst iconClasses: Record<'light' | 'dark', string> = {\r\n\tlight: 'text-blue-500',\r\n\tdark: 'text-zinc-400'\r\n};\r\n\r\nexport default function Dropdown({\r\n\tlabel,\r\n\ticon,\r\n\toptions,\r\n\tvalue,\r\n\tonChange,\r\n\tname = '',\r\n\tid = '',\r\n\tclassName = '',\r\n\trequired = false,\r\n\tmode = 'dark'\r\n}: DropdownProps) {\r\n\tconst [isOpen, setIsOpen] = useState(false);\r\n\tconst dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst selectedOption = options.find(\r\n\t\t(opt) => String(opt.value).trim() === String(value).trim()\r\n\t);\r\n\tconst displayLabel = selectedOption\r\n\t\t? selectedOption.label\r\n\t\t: value\r\n\t\t\t? String(value).length > 20\r\n\t\t\t\t? `${String(value).substring(0, 8)}...${String(value).substring(String(value).length - 4)}`\r\n\t\t\t\t: String(value)\r\n\t\t\t: 'Select an option...';\r\n\r\n\tuseEffect(() => {\r\n\t\tconst handleClickOutside = (event: MouseEvent) => {\r\n\t\t\tif (\r\n\t\t\t\tdropdownRef.current &&\r\n\t\t\t\t!dropdownRef.current.contains(event.target as Node)\r\n\t\t\t) {\r\n\t\t\t\tsetIsOpen(false);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\r\n\t\treturn () =>\r\n\t\t\tdocument.removeEventListener('mousedown', handleClickOutside);\r\n\t}, []);\r\n\r\n\tconst handleSelect = (optionValue: string) => {\r\n\t\tif (onChange) {\r\n\t\t\tonChange({\r\n\t\t\t\ttarget: {\r\n\t\t\t\t\tname,\r\n\t\t\t\t\tvalue: optionValue\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tsetIsOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div className={`space-y-1.5 ${className}`} ref={dropdownRef}>\r\n\t\t\t{label && (\r\n\t\t\t\t<label\r\n\t\t\t\t\thtmlFor={id || name}\r\n\t\t\t\t\tclassName=\"flex items-center text-xs font-bold uppercase tracking-wider text-zinc-500 ml-1 font-montserrat\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{icon && (\r\n\t\t\t\t\t\t<span className={`mr-2 ${iconClasses[mode]}`}>\r\n\t\t\t\t\t\t\t{icon}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{label}\r\n\t\t\t\t</label>\r\n\t\t\t)}\r\n\t\t\t<div className=\"relative\">\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tonClick={() => setIsOpen(!isOpen)}\r\n\t\t\t\t\tclassName={`w-full px-4 py-3 border rounded-xl focus:ring-2 outline-none transition-colors font-montserrat cursor-pointer flex items-center justify-between text-left text-sm ${triggerClasses[mode]}`}\r\n\t\t\t\t\taria-haspopup=\"listbox\"\r\n\t\t\t\t\taria-expanded={isOpen}\r\n\t\t\t\t>\r\n\t\t\t\t\t<span className=\"truncate\">{displayLabel}</span>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`transition-transform duration-200 ${chevronClasses[mode]} ${isOpen ? 'rotate-180' : ''}`}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\tclassName=\"w-4 h-4\"\r\n\t\t\t\t\t\t\tfill=\"none\"\r\n\t\t\t\t\t\t\tstroke=\"currentColor\"\r\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\r\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\r\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\r\n\t\t\t\t\t\t\t\td=\"M19 9l-7 7-7-7\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t{isOpen && (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`absolute z-50 w-full mt-2 border rounded-2xl overflow-hidden animate-in fade-in zoom-in duration-200 ${dropdownListClasses[mode]}`}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\trole=\"listbox\"\r\n\t\t\t\t\t\t\tclassName=\"py-1.5 px-1.5 max-h-60 overflow-y-auto\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{options.map((option) => (\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tkey={option.value}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tonClick={() => handleSelect(option.value)}\r\n\t\t\t\t\t\t\t\t\tclassName={`w-full px-4 py-2.5 rounded-xl text-left font-montserrat transition-colors flex items-center justify-between text-sm ${optionClasses[mode].hover} ${\r\n\t\t\t\t\t\t\t\t\t\tString(option.value) === String(value)\r\n\t\t\t\t\t\t\t\t\t\t\t? optionClasses[mode].selected\r\n\t\t\t\t\t\t\t\t\t\t\t: optionClasses[mode].unselected\r\n\t\t\t\t\t\t\t\t\t}`}\r\n\t\t\t\t\t\t\t\t\trole=\"option\"\r\n\t\t\t\t\t\t\t\t\taria-selected={\r\n\t\t\t\t\t\t\t\t\t\tString(option.value) === String(value)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{option.label}\r\n\t\t\t\t\t\t\t\t\t{String(option.value) === String(value) && (\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-3.5 h-3.5\"\r\n\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\r\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t\t<input\r\n\t\t\t\t\ttype=\"hidden\"\r\n\t\t\t\t\tname={name}\r\n\t\t\t\t\tvalue={value}\r\n\t\t\t\t\trequired={required}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "import React from 'react';\n\nconst sizeClasses: Record<'small' | 'medium' | 'large', string> = {\n\tsmall: 'h-4 w-4 border-2',\n\tmedium: 'h-8 w-8 border-3',\n\tlarge: 'h-12 w-12 border-4'\n};\n\nconst modeClasses: Record<'light' | 'dark', string> = {\n\tlight: 'border-zinc-200 border-t-zinc-800',\n\tdark: 'border-zinc-800 border-t-zinc-200'\n};\n\nexport default function LoadingSpinner({\n\tsize = 'medium',\n\tmode = 'dark'\n}: {\n\tsize?: 'small' | 'medium' | 'large';\n\tmode?: 'light' | 'dark';\n}) {\n\treturn (\n\t\t<div className=\"flex items-center justify-center\">\n\t\t\t<div\n\t\t\t\tclassName={`${sizeClasses[size]} ${modeClasses[mode]} animate-spin rounded-full`}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n", "import React from 'react';\n\nexport default function Background({\n\tclassName = '',\n\tstyle = {}\n}: {\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={`absolute inset-0 z-0 pointer-events-none flex items-center justify-center blur-3xl ${className}`}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"absolute left-1/2 top-0 -translate-x-1/2 rotate-20 opacity-30\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: '60rem',\n\t\t\t\t\taspectRatio: '1200/700',\n\t\t\t\t\tbackground:\n\t\t\t\t\t\t'linear-gradient(to top right, #38bdf8, #1e40af)',\n\t\t\t\t\tclipPath:\n\t\t\t\t\t\t'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',\n\t\t\t\t\t...style\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsx", "jsx"]
7
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "cephie-ui",
3
+ "version": "1.0.0",
4
+ "description": "A React component library compatible with Next.js",
5
+ "license": "ISC",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "./components/*": {
17
+ "types": "./dist/components/*.d.ts",
18
+ "import": "./dist/components/*.js",
19
+ "require": "./dist/components/*.cjs"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "scripts": {
26
+ "build": "bun run src/build.ts && tsc -p tsconfig.build.json",
27
+ "dev": "bun run src/build.ts --watch",
28
+ "prepublishOnly": "bun run build",
29
+ "test": "echo \"Error: no test specified\" && exit 1"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/cephie-studios/ui.git"
34
+ },
35
+ "keywords": [
36
+ "react",
37
+ "components",
38
+ "ui",
39
+ "nextjs"
40
+ ],
41
+ "author": "Cephie Studios",
42
+ "bugs": {
43
+ "url": "https://github.com/cephie-studios/ui/issues"
44
+ },
45
+ "homepage": "https://github.com/cephie-studios/ui#readme",
46
+ "peerDependencies": {
47
+ "react": "^18.0.0",
48
+ "react-dom": "^18.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^25.3.0",
52
+ "@types/react": "latest",
53
+ "@types/react-dom": "latest",
54
+ "esbuild": "^0.27.3",
55
+ "react": "latest",
56
+ "react-dom": "latest",
57
+ "typescript": "latest"
58
+ },
59
+ "dependencies": {
60
+ "path": "^0.12.7",
61
+ "url": "^0.11.4"
62
+ }
63
+ }