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 +104 -0
- package/dist/Background.d.ts +6 -0
- package/dist/Background.d.ts.map +1 -0
- package/dist/Button.d.ts +8 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Dropdown.d.ts +24 -0
- package/dist/Dropdown.d.ts.map +1 -0
- package/dist/LoadingSpinner.d.ts +5 -0
- package/dist/LoadingSpinner.d.ts.map +1 -0
- package/dist/index.cjs +309 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +7 -0
- package/package.json +63 -0
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 @@
|
|
|
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"}
|
package/dist/Button.d.ts
ADDED
|
@@ -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 @@
|
|
|
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": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC4CE;AA1CF,IAAM,iBAGF;AAAA,EACH,OAAO;AAAA,IACN,SACC;AAAA,IACD,WACC;AAAA,IACD,SACC;AAAA,IACD,QAAQ;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACL,SACC;AAAA,IACD,WACC;AAAA,IACD,SACC;AAAA,IACD,QAAQ;AAAA,EACT;AACD;AAEe,SAAR,OAAwB;AAAA,EAC9B,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ,CAAC;AAAA,EACT;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACJ,GAKG;AACF,QAAM,UACL;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,+LAA+L,eAAe,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS;AAAA,MACpP;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAGD,MAAI,MAAM;AACT,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,QAAQ,SAAS,WAAW;AAAA,QAC5B,KAAI;AAAA,QACJ,WAAU;AAAA,QAET;AAAA;AAAA,IACF;AAAA,EAEF;AAEA,SAAO;AACR;;;ACrEA,mBAAmD;AA2G/C,IAAAA,sBAAA;AA5FJ,IAAM,iBAAmD;AAAA,EACxD,OAAO;AAAA,EACP,MAAM;AACP;AAEA,IAAM,iBAAmD;AAAA,EACxD,OAAO;AAAA,EACP,MAAM;AACP;AAEA,IAAM,sBAAwD;AAAA,EAC7D,OAAO;AAAA,EACP,MAAM;AACP;AAEA,IAAM,gBAGF;AAAA,EACH,OAAO;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACR;AACD;AAEA,IAAM,cAAgD;AAAA,EACrD,OAAO;AAAA,EACP,MAAM;AACP;AAEe,SAAR,SAA0B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AACR,GAAkB;AACjB,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,kBAAc,qBAAuB,IAAI;AAE/C,QAAM,iBAAiB,QAAQ;AAAA,IAC9B,CAAC,QAAQ,OAAO,IAAI,KAAK,EAAE,KAAK,MAAM,OAAO,KAAK,EAAE,KAAK;AAAA,EAC1D;AACA,QAAM,eAAe,iBAClB,eAAe,QACf,QACC,OAAO,KAAK,EAAE,SAAS,KACtB,GAAG,OAAO,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,MAAM,OAAO,KAAK,EAAE,UAAU,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC,KACvF,OAAO,KAAK,IACb;AAEJ,8BAAU,MAAM;AACf,UAAM,qBAAqB,CAAC,UAAsB;AACjD,UACC,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GACjD;AACD,kBAAU,KAAK;AAAA,MAChB;AAAA,IACD;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MACN,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC9D,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,CAAC,gBAAwB;AAC7C,QAAI,UAAU;AACb,eAAS;AAAA,QACR,QAAQ;AAAA,UACP;AAAA,UACA,OAAO;AAAA,QACR;AAAA,MACD,CAAC;AAAA,IACF;AACA,cAAU,KAAK;AAAA,EAChB;AAEA,SACC,8CAAC,SAAI,WAAW,eAAe,SAAS,IAAI,KAAK,aAC/C;AAAA,aACA;AAAA,MAAC;AAAA;AAAA,QACA,SAAS,MAAM;AAAA,QACf,WAAU;AAAA,QAET;AAAA,kBACA,6CAAC,UAAK,WAAW,QAAQ,YAAY,IAAI,CAAC,IACxC,gBACF;AAAA,UAEA;AAAA;AAAA;AAAA,IACF;AAAA,IAED,8CAAC,SAAI,WAAU,YACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,UAChC,WAAW,qKAAqK,eAAe,IAAI,CAAC;AAAA,UACpM,iBAAc;AAAA,UACd,iBAAe;AAAA,UAEf;AAAA,yDAAC,UAAK,WAAU,YAAY,wBAAa;AAAA,YACzC;AAAA,cAAC;AAAA;AAAA,gBACA,WAAW,qCAAqC,eAAe,IAAI,CAAC,IAAI,SAAS,eAAe,EAAE;AAAA,gBAElG;AAAA,kBAAC;AAAA;AAAA,oBACA,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,SAAQ;AAAA,oBAER;AAAA,sBAAC;AAAA;AAAA,wBACA,eAAc;AAAA,wBACd,gBAAe;AAAA,wBACf,aAAY;AAAA,wBACZ,GAAE;AAAA;AAAA,oBACH;AAAA;AAAA,gBACD;AAAA;AAAA,YACD;AAAA;AAAA;AAAA,MACD;AAAA,MAEC,UACA;AAAA,QAAC;AAAA;AAAA,UACA,WAAW,wGAAwG,oBAAoB,IAAI,CAAC;AAAA,UAE5I;AAAA,YAAC;AAAA;AAAA,cACA,MAAK;AAAA,cACL,WAAU;AAAA,cAET,kBAAQ,IAAI,CAAC,WACb;AAAA,gBAAC;AAAA;AAAA,kBAEA,MAAK;AAAA,kBACL,SAAS,MAAM,aAAa,OAAO,KAAK;AAAA,kBACxC,WAAW,uHAAuH,cAAc,IAAI,EAAE,KAAK,IAC1J,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,IAClC,cAAc,IAAI,EAAE,WACpB,cAAc,IAAI,EAAE,UACxB;AAAA,kBACA,MAAK;AAAA,kBACL,iBACC,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA,kBAGrC;AAAA,2BAAO;AAAA,oBACP,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,KACrC;AAAA,sBAAC;AAAA;AAAA,wBACA,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,SAAQ;AAAA,wBAER;AAAA,0BAAC;AAAA;AAAA,4BACA,UAAS;AAAA,4BACT,GAAE;AAAA,4BACF,UAAS;AAAA;AAAA,wBACV;AAAA;AAAA,oBACD;AAAA;AAAA;AAAA,gBAzBI,OAAO;AAAA,cA2Bb,CACA;AAAA;AAAA,UACF;AAAA;AAAA,MACD;AAAA,MAED;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACD;AAAA,OACD;AAAA,KACD;AAEF;;;AChLG,IAAAC,sBAAA;AApBH,IAAM,cAA4D;AAAA,EACjE,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACR;AAEA,IAAM,cAAgD;AAAA,EACrD,OAAO;AAAA,EACP,MAAM;AACP;AAEe,SAAR,eAAgC;AAAA,EACtC,OAAO;AAAA,EACP,OAAO;AACR,GAGG;AACF,SACC,6CAAC,SAAI,WAAU,oCACd;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,GAAG,YAAY,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC;AAAA;AAAA,EACrD,GACD;AAEF;;;ACbG,IAAAC,sBAAA;AAZY,SAAR,WAA4B;AAAA,EAClC,YAAY;AAAA,EACZ,QAAQ,CAAC;AACV,GAGG;AACF,SACC;AAAA,IAAC;AAAA;AAAA,MACA,eAAY;AAAA,MACZ,WAAW,sFAAsF,SAAS;AAAA,MAE1G;AAAA,QAAC;AAAA;AAAA,UACA,WAAU;AAAA,UACV,OAAO;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,YACb,YACC;AAAA,YACD,UACC;AAAA,YACD,GAAG;AAAA,UACJ;AAAA;AAAA,MACD;AAAA;AAAA,EACD;AAEF;",
|
|
6
|
+
"names": ["import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime"]
|
|
7
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|