@efiche/design 0.1.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/dist/index.js ADDED
@@ -0,0 +1,841 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+
33
+ // src/components/ThemeProvider.tsx
34
+ import { createContext, useContext, useState } from "react";
35
+ import { jsx } from "react/jsx-runtime";
36
+ var ThemeContext = createContext(null);
37
+ var ThemeProvider = ({
38
+ children,
39
+ defaultTheme = "light"
40
+ }) => {
41
+ const [theme, setTheme] = useState(defaultTheme);
42
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { theme, toggle: () => setTheme((t) => t === "light" ? "dark" : "light") }, children: /* @__PURE__ */ jsx("div", { className: theme === "dark" ? "ds-theme-dark" : "ds-theme", children }) });
43
+ };
44
+ var useTheme = () => {
45
+ const ctx = useContext(ThemeContext);
46
+ if (!ctx) throw new Error("useTheme must be used inside <ThemeProvider>");
47
+ return ctx;
48
+ };
49
+
50
+ // src/components/Accordion/Accordion.tsx
51
+ import { useState as useState2 } from "react";
52
+ import { ChevronDown } from "lucide-react";
53
+
54
+ // src/components/Accordion/Accordion.module.css
55
+ var Accordion_default = {};
56
+
57
+ // src/components/Accordion/Accordion.tsx
58
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
59
+ var Accordion = ({ items, defaultValue, multiple = false }) => {
60
+ const [open, setOpen] = useState2(() => {
61
+ if (!defaultValue) return /* @__PURE__ */ new Set();
62
+ if (Array.isArray(defaultValue)) return new Set(defaultValue);
63
+ return /* @__PURE__ */ new Set([defaultValue]);
64
+ });
65
+ const toggle = (value) => {
66
+ setOpen((prev) => {
67
+ const next = new Set(prev);
68
+ if (next.has(value)) {
69
+ next.delete(value);
70
+ } else {
71
+ if (!multiple) next.clear();
72
+ next.add(value);
73
+ }
74
+ return next;
75
+ });
76
+ };
77
+ return /* @__PURE__ */ jsx2("div", { className: Accordion_default.root, children: items.map((item) => {
78
+ const isOpen = open.has(item.value);
79
+ return /* @__PURE__ */ jsxs("div", { className: Accordion_default.item, children: [
80
+ /* @__PURE__ */ jsxs(
81
+ "button",
82
+ {
83
+ className: Accordion_default.trigger,
84
+ onClick: () => toggle(item.value),
85
+ "aria-expanded": isOpen,
86
+ children: [
87
+ /* @__PURE__ */ jsx2("span", { children: item.trigger }),
88
+ /* @__PURE__ */ jsx2(
89
+ ChevronDown,
90
+ {
91
+ size: 16,
92
+ className: `${Accordion_default.chevron} ${isOpen ? Accordion_default["chevron-open"] : ""}`
93
+ }
94
+ )
95
+ ]
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx2("div", { className: `${Accordion_default.panel} ${isOpen ? Accordion_default["panel-open"] : ""}`, children: /* @__PURE__ */ jsx2("div", { className: Accordion_default.content, children: item.content }) })
99
+ ] }, item.value);
100
+ }) });
101
+ };
102
+ var Accordion_default2 = Accordion;
103
+
104
+ // src/components/Alert/Alert.tsx
105
+ import { Info, CheckCircle2, AlertTriangle, AlertCircle } from "lucide-react";
106
+
107
+ // src/components/Alert/Alert.module.css
108
+ var Alert_default = {};
109
+
110
+ // src/components/Alert/Alert.tsx
111
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
112
+ var icons = {
113
+ info: /* @__PURE__ */ jsx3(Info, { size: 16 }),
114
+ success: /* @__PURE__ */ jsx3(CheckCircle2, { size: 16 }),
115
+ warning: /* @__PURE__ */ jsx3(AlertTriangle, { size: 16 }),
116
+ danger: /* @__PURE__ */ jsx3(AlertCircle, { size: 16 })
117
+ };
118
+ var Alert = ({ variant = "info", title, description }) => /* @__PURE__ */ jsxs2("div", { className: `${Alert_default.alert} ${Alert_default[variant]}`, role: "alert", children: [
119
+ /* @__PURE__ */ jsx3("span", { className: Alert_default.icon, children: icons[variant] }),
120
+ /* @__PURE__ */ jsxs2("div", { className: Alert_default.content, children: [
121
+ /* @__PURE__ */ jsx3("p", { className: Alert_default.title, children: title }),
122
+ /* @__PURE__ */ jsx3("p", { className: Alert_default.description, children: description })
123
+ ] })
124
+ ] });
125
+ var Alert_default2 = Alert;
126
+
127
+ // src/components/Avatar/Avatar.module.css
128
+ var Avatar_default = {};
129
+
130
+ // src/components/Avatar/Avatar.tsx
131
+ import { jsx as jsx4 } from "react/jsx-runtime";
132
+ var Avatar = ({ fallback, size = "md", style, className }) => /* @__PURE__ */ jsx4(
133
+ "div",
134
+ {
135
+ className: `${Avatar_default.avatar} ${Avatar_default[size]}${className ? ` ${className}` : ""}`,
136
+ style,
137
+ "aria-label": fallback,
138
+ children: fallback
139
+ }
140
+ );
141
+ var Avatar_default2 = Avatar;
142
+
143
+ // src/components/Badge/Badge.module.css
144
+ var Badge_default = {};
145
+
146
+ // src/components/Badge/Badge.tsx
147
+ import { jsx as jsx5 } from "react/jsx-runtime";
148
+ var Badge = ({ variant = "default", size = "md", children, style }) => /* @__PURE__ */ jsx5("span", { className: `${Badge_default.badge} ${Badge_default[variant]} ${Badge_default[size]}`, style, children });
149
+ var Badge_default2 = Badge;
150
+
151
+ // src/components/Breadcrumb/Breadcrumb.tsx
152
+ import { ChevronRight } from "lucide-react";
153
+
154
+ // src/components/Breadcrumb/Breadcrumb.module.css
155
+ var Breadcrumb_default = {};
156
+
157
+ // src/components/Breadcrumb/Breadcrumb.tsx
158
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
159
+ var Breadcrumb = ({ items }) => /* @__PURE__ */ jsx6("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx6("ol", { className: Breadcrumb_default.list, children: items.map((item, i) => {
160
+ const isLast = i === items.length - 1;
161
+ return /* @__PURE__ */ jsxs3("li", { className: Breadcrumb_default.item, children: [
162
+ i > 0 && /* @__PURE__ */ jsx6(ChevronRight, { size: 14, className: Breadcrumb_default.separator, "aria-hidden": true }),
163
+ isLast || !item.href ? /* @__PURE__ */ jsx6("span", { className: `${Breadcrumb_default.link} ${isLast ? Breadcrumb_default.current : ""}`, children: item.label }) : /* @__PURE__ */ jsx6("a", { href: item.href, className: Breadcrumb_default.link, children: item.label })
164
+ ] }, item.label);
165
+ }) }) });
166
+ var Breadcrumb_default2 = Breadcrumb;
167
+
168
+ // src/components/Button/Button.tsx
169
+ import { LoaderCircle } from "lucide-react";
170
+
171
+ // src/components/Button/Button.module.css
172
+ var Button_default = {};
173
+
174
+ // src/components/Button/Button.tsx
175
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
176
+ var Button = (_a) => {
177
+ var _b = _a, {
178
+ text,
179
+ children,
180
+ loading = false,
181
+ disabled = false,
182
+ icon,
183
+ iconPosition = "left",
184
+ outline = false,
185
+ ghost = false,
186
+ danger = false,
187
+ warning = false,
188
+ info = false,
189
+ success = false,
190
+ variant,
191
+ small = false,
192
+ large = false,
193
+ size,
194
+ className
195
+ } = _b, props = __objRest(_b, [
196
+ "text",
197
+ "children",
198
+ "loading",
199
+ "disabled",
200
+ "icon",
201
+ "iconPosition",
202
+ "outline",
203
+ "ghost",
204
+ "danger",
205
+ "warning",
206
+ "info",
207
+ "success",
208
+ "variant",
209
+ "small",
210
+ "large",
211
+ "size",
212
+ "className"
213
+ ]);
214
+ const resolvedVariant = variant != null ? variant : danger ? "danger" : warning ? "warning" : info ? "info" : success ? "success" : ghost ? "ghost" : outline ? "outline" : "solid";
215
+ const resolvedSize = size != null ? size : small ? "sm" : large ? "lg" : "md";
216
+ const content = children != null ? children : text;
217
+ const showIcon = icon && !loading;
218
+ const classes = [
219
+ Button_default.button,
220
+ Button_default[resolvedVariant],
221
+ Button_default[resolvedSize],
222
+ loading ? Button_default.loading : "",
223
+ className != null ? className : ""
224
+ ].filter(Boolean).join(" ");
225
+ return /* @__PURE__ */ jsxs4(
226
+ "button",
227
+ __spreadProps(__spreadValues({
228
+ disabled: disabled || loading,
229
+ className: classes
230
+ }, props), {
231
+ children: [
232
+ loading ? /* @__PURE__ */ jsx7(LoaderCircle, { className: Button_default.spinner, "aria-hidden": true }) : null,
233
+ showIcon && iconPosition === "left" ? icon : null,
234
+ content,
235
+ showIcon && iconPosition === "right" ? icon : null
236
+ ]
237
+ })
238
+ );
239
+ };
240
+ var Button_default2 = Button;
241
+
242
+ // src/components/Card/Card.module.css
243
+ var Card_default = {};
244
+
245
+ // src/components/Card/Card.tsx
246
+ import { jsx as jsx8 } from "react/jsx-runtime";
247
+ var Card = (_a) => {
248
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
249
+ return /* @__PURE__ */ jsx8("div", __spreadValues({ className: `${Card_default.card}${className ? ` ${className}` : ""}` }, props));
250
+ };
251
+ var CardHeader = (_a) => {
252
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
253
+ return /* @__PURE__ */ jsx8("div", __spreadValues({ className: `${Card_default.header}${className ? ` ${className}` : ""}` }, props));
254
+ };
255
+ var CardTitle = (_a) => {
256
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
257
+ return /* @__PURE__ */ jsx8("h3", __spreadValues({ className: `${Card_default.title}${className ? ` ${className}` : ""}` }, props));
258
+ };
259
+ var CardDescription = (_a) => {
260
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
261
+ return /* @__PURE__ */ jsx8("p", __spreadValues({ className: `${Card_default.description}${className ? ` ${className}` : ""}` }, props));
262
+ };
263
+ var CardContent = (_a) => {
264
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
265
+ return /* @__PURE__ */ jsx8("div", __spreadValues({ className: `${Card_default.content}${className ? ` ${className}` : ""}` }, props));
266
+ };
267
+ var CardFooter = (_a) => {
268
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
269
+ return /* @__PURE__ */ jsx8("div", __spreadValues({ className: `${Card_default.footer}${className ? ` ${className}` : ""}` }, props));
270
+ };
271
+
272
+ // src/components/Checkbox/Checkbox.tsx
273
+ import { useState as useState3 } from "react";
274
+
275
+ // src/components/Checkbox/Checkbox.module.css
276
+ var Checkbox_default = {};
277
+
278
+ // src/components/Checkbox/Checkbox.tsx
279
+ import { jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
280
+ var Checkbox = ({
281
+ label,
282
+ checked,
283
+ defaultChecked = false,
284
+ disabled,
285
+ id,
286
+ onChange
287
+ }) => {
288
+ const [internal, setInternal] = useState3(defaultChecked);
289
+ const isChecked = checked !== void 0 ? checked : internal;
290
+ const handleChange = () => {
291
+ if (disabled) return;
292
+ const next = !isChecked;
293
+ setInternal(next);
294
+ onChange == null ? void 0 : onChange(next);
295
+ };
296
+ return /* @__PURE__ */ jsxs5("label", { className: `${Checkbox_default.container} ${disabled ? Checkbox_default.disabled : ""}`, htmlFor: id, children: [
297
+ /* @__PURE__ */ jsx9(
298
+ "input",
299
+ {
300
+ type: "checkbox",
301
+ id,
302
+ checked: isChecked,
303
+ disabled,
304
+ onChange: handleChange,
305
+ className: Checkbox_default.input
306
+ }
307
+ ),
308
+ /* @__PURE__ */ jsx9("span", { className: `${Checkbox_default.box} ${isChecked ? Checkbox_default.checked : ""}`, children: isChecked && /* @__PURE__ */ jsx9("svg", { viewBox: "0 0 12 10", fill: "none", className: Checkbox_default.checkmark, children: /* @__PURE__ */ jsx9("path", { d: "M1 5l3.5 3.5L11 1", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
309
+ label && /* @__PURE__ */ jsx9("span", { className: Checkbox_default.label, children: label })
310
+ ] });
311
+ };
312
+ var Checkbox_default2 = Checkbox;
313
+
314
+ // src/components/CopyButton/CopyButton.tsx
315
+ import { Check, Copy } from "lucide-react";
316
+ import { useState as useState4 } from "react";
317
+
318
+ // src/components/CopyButton/CopyButton.module.css
319
+ var CopyButton_default = {};
320
+
321
+ // src/components/CopyButton/CopyButton.tsx
322
+ import { jsx as jsx10 } from "react/jsx-runtime";
323
+ var CopyButton = ({ text }) => {
324
+ const [copied, setCopied] = useState4(false);
325
+ const handleCopy = () => {
326
+ navigator.clipboard.writeText(text);
327
+ setCopied(true);
328
+ setTimeout(() => setCopied(false), 2e3);
329
+ };
330
+ return /* @__PURE__ */ jsx10(
331
+ "button",
332
+ {
333
+ className: CopyButton_default.copyButton,
334
+ onClick: handleCopy,
335
+ "aria-label": copied ? "Copied" : `Copy ${text}`,
336
+ children: copied ? /* @__PURE__ */ jsx10(Check, { className: CopyButton_default.icon }) : /* @__PURE__ */ jsx10(Copy, { className: CopyButton_default.icon })
337
+ }
338
+ );
339
+ };
340
+ var CopyButton_default2 = CopyButton;
341
+
342
+ // src/components/FileUpload/FileUpload.tsx
343
+ import { Upload } from "lucide-react";
344
+ import { useRef, useState as useState5 } from "react";
345
+
346
+ // src/components/FileUpload/FileUpload.module.css
347
+ var FileUpload_default = {};
348
+
349
+ // src/components/FileUpload/FileUpload.tsx
350
+ import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
351
+ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
352
+ const [isDragging, setIsDragging] = useState5(false);
353
+ const [fileNames, setFileNames] = useState5([]);
354
+ const inputRef = useRef(null);
355
+ const handleFiles = (list) => {
356
+ setFileNames(Array.from(list).map((f) => f.name));
357
+ onFileSelect == null ? void 0 : onFileSelect(list);
358
+ };
359
+ return /* @__PURE__ */ jsxs6(
360
+ "div",
361
+ {
362
+ className: `${FileUpload_default.zone} ${isDragging ? FileUpload_default.dragging : ""} ${disabled ? FileUpload_default.disabled : ""}`,
363
+ onClick: () => {
364
+ var _a;
365
+ return !disabled && ((_a = inputRef.current) == null ? void 0 : _a.click());
366
+ },
367
+ onDragOver: (e) => {
368
+ e.preventDefault();
369
+ setIsDragging(true);
370
+ },
371
+ onDragLeave: () => setIsDragging(false),
372
+ onDrop: (e) => {
373
+ e.preventDefault();
374
+ setIsDragging(false);
375
+ if (!disabled && e.dataTransfer.files.length) handleFiles(e.dataTransfer.files);
376
+ },
377
+ children: [
378
+ /* @__PURE__ */ jsx11(
379
+ "input",
380
+ {
381
+ ref: inputRef,
382
+ type: "file",
383
+ accept,
384
+ multiple,
385
+ disabled,
386
+ className: FileUpload_default.input,
387
+ onChange: (e) => e.target.files && handleFiles(e.target.files)
388
+ }
389
+ ),
390
+ /* @__PURE__ */ jsx11(Upload, { size: 32, className: FileUpload_default.icon }),
391
+ fileNames.length > 0 ? /* @__PURE__ */ jsx11("p", { className: FileUpload_default.fileName, children: fileNames.join(", ") }) : /* @__PURE__ */ jsxs6("p", { className: FileUpload_default.hint, children: [
392
+ /* @__PURE__ */ jsx11("strong", { children: "Click to upload" }),
393
+ " or drag and drop"
394
+ ] })
395
+ ]
396
+ }
397
+ );
398
+ };
399
+ var FileUpload_default2 = FileUpload;
400
+
401
+ // src/components/Input/Input.module.css
402
+ var Input_default = {};
403
+
404
+ // src/components/Input/Input.tsx
405
+ import { jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
406
+ var Input = (_a) => {
407
+ var _b = _a, {
408
+ error,
409
+ success,
410
+ leftIcon,
411
+ rightIcon,
412
+ className
413
+ } = _b, props = __objRest(_b, [
414
+ "error",
415
+ "success",
416
+ "leftIcon",
417
+ "rightIcon",
418
+ "className"
419
+ ]);
420
+ const wrapperClasses = [
421
+ Input_default.wrapper,
422
+ error ? Input_default.error : "",
423
+ success ? Input_default.success : "",
424
+ leftIcon ? Input_default.hasLeft : "",
425
+ rightIcon ? Input_default.hasRight : "",
426
+ className != null ? className : ""
427
+ ].filter(Boolean).join(" ");
428
+ return /* @__PURE__ */ jsxs7("div", { className: wrapperClasses, children: [
429
+ leftIcon && /* @__PURE__ */ jsx12("span", { className: Input_default.leftIcon, children: leftIcon }),
430
+ /* @__PURE__ */ jsx12("input", __spreadValues({ className: Input_default.input }, props)),
431
+ rightIcon && /* @__PURE__ */ jsx12("span", { className: Input_default.rightIcon, children: rightIcon })
432
+ ] });
433
+ };
434
+ var Input_default2 = Input;
435
+
436
+ // src/components/Label/Label.module.css
437
+ var Label_default = {};
438
+
439
+ // src/components/Label/Label.tsx
440
+ import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
441
+ var Label = (_a) => {
442
+ var _b = _a, { children, required, className } = _b, props = __objRest(_b, ["children", "required", "className"]);
443
+ return /* @__PURE__ */ jsxs8("label", __spreadProps(__spreadValues({ className: `${Label_default.label} ${className != null ? className : ""}` }, props), { children: [
444
+ children,
445
+ required && /* @__PURE__ */ jsx13("span", { className: Label_default.required, children: "*" })
446
+ ] }));
447
+ };
448
+ var Label_default2 = Label;
449
+
450
+ // src/components/PasswordInput/PasswordInput.tsx
451
+ import { Eye, EyeOff } from "lucide-react";
452
+ import { useState as useState6 } from "react";
453
+ import { jsx as jsx14 } from "react/jsx-runtime";
454
+ var PasswordInput = (props) => {
455
+ const [visible, setVisible] = useState6(false);
456
+ return /* @__PURE__ */ jsx14(
457
+ Input_default2,
458
+ __spreadProps(__spreadValues({}, props), {
459
+ type: visible ? "text" : "password",
460
+ rightIcon: /* @__PURE__ */ jsx14(
461
+ "button",
462
+ {
463
+ type: "button",
464
+ onClick: () => setVisible((v) => !v),
465
+ style: { background: "none", border: "none", cursor: "pointer", padding: 0, display: "flex", pointerEvents: "all" },
466
+ tabIndex: -1,
467
+ children: visible ? /* @__PURE__ */ jsx14(EyeOff, { size: 16 }) : /* @__PURE__ */ jsx14(Eye, { size: 16 })
468
+ }
469
+ )
470
+ })
471
+ );
472
+ };
473
+ var PasswordInput_default = PasswordInput;
474
+
475
+ // src/components/Progress/Progress.module.css
476
+ var Progress_default = {};
477
+
478
+ // src/components/Progress/Progress.tsx
479
+ import { jsx as jsx15 } from "react/jsx-runtime";
480
+ var Progress = ({ value = 0 }) => {
481
+ const pct = Math.min(100, Math.max(0, value));
482
+ return /* @__PURE__ */ jsx15(
483
+ "div",
484
+ {
485
+ className: Progress_default.track,
486
+ role: "progressbar",
487
+ "aria-valuenow": pct,
488
+ "aria-valuemin": 0,
489
+ "aria-valuemax": 100,
490
+ children: /* @__PURE__ */ jsx15("div", { className: Progress_default.fill, style: { width: `${pct}%` } })
491
+ }
492
+ );
493
+ };
494
+ var Progress_default2 = Progress;
495
+
496
+ // src/components/RadioGroup/RadioGroup.tsx
497
+ import { useState as useState7 } from "react";
498
+
499
+ // src/components/RadioGroup/RadioGroup.module.css
500
+ var RadioGroup_default = {};
501
+
502
+ // src/components/RadioGroup/RadioGroup.tsx
503
+ import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
504
+ var RadioGroup = ({
505
+ options,
506
+ name,
507
+ value,
508
+ defaultValue = "",
509
+ disabled,
510
+ onChange
511
+ }) => {
512
+ const [internal, setInternal] = useState7(defaultValue);
513
+ const selected = value !== void 0 ? value : internal;
514
+ const handleChange = (val) => {
515
+ if (disabled) return;
516
+ setInternal(val);
517
+ onChange == null ? void 0 : onChange(val);
518
+ };
519
+ return /* @__PURE__ */ jsx16("div", { className: RadioGroup_default.group, children: options.map((option) => /* @__PURE__ */ jsxs9(
520
+ "label",
521
+ {
522
+ className: `${RadioGroup_default.item} ${disabled ? RadioGroup_default.disabled : ""}`,
523
+ children: [
524
+ /* @__PURE__ */ jsx16(
525
+ "input",
526
+ {
527
+ type: "radio",
528
+ name,
529
+ value: option.value,
530
+ checked: selected === option.value,
531
+ disabled,
532
+ onChange: () => handleChange(option.value),
533
+ className: RadioGroup_default.input
534
+ }
535
+ ),
536
+ /* @__PURE__ */ jsx16("span", { className: `${RadioGroup_default.dot} ${selected === option.value ? RadioGroup_default.checked : ""}`, children: selected === option.value && /* @__PURE__ */ jsx16("span", { className: RadioGroup_default.inner }) }),
537
+ /* @__PURE__ */ jsx16("span", { className: RadioGroup_default.label, children: option.label })
538
+ ]
539
+ },
540
+ option.value
541
+ )) });
542
+ };
543
+ var RadioGroup_default2 = RadioGroup;
544
+
545
+ // src/components/Select/Select.tsx
546
+ import { Check as Check2, ChevronDown as ChevronDown2 } from "lucide-react";
547
+ import { useEffect, useRef as useRef2, useState as useState8 } from "react";
548
+
549
+ // src/components/Select/Select.module.css
550
+ var Select_default = {};
551
+
552
+ // src/components/Select/Select.tsx
553
+ import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
554
+ var Select = ({
555
+ options,
556
+ value,
557
+ defaultValue = "",
558
+ placeholder = "Choose an option",
559
+ disabled,
560
+ onChange
561
+ }) => {
562
+ var _a;
563
+ const [internal, setInternal] = useState8(defaultValue);
564
+ const [open, setOpen] = useState8(false);
565
+ const ref = useRef2(null);
566
+ const selected = value !== void 0 ? value : internal;
567
+ const selectedLabel = (_a = options.find((o) => o.value === selected)) == null ? void 0 : _a.label;
568
+ const handleSelect = (val) => {
569
+ setInternal(val);
570
+ setOpen(false);
571
+ onChange == null ? void 0 : onChange(val);
572
+ };
573
+ useEffect(() => {
574
+ const handleOutside = (e) => {
575
+ if (ref.current && !ref.current.contains(e.target)) setOpen(false);
576
+ };
577
+ document.addEventListener("mousedown", handleOutside);
578
+ return () => document.removeEventListener("mousedown", handleOutside);
579
+ }, []);
580
+ return /* @__PURE__ */ jsxs10("div", { ref, className: `${Select_default.wrapper} ${disabled ? Select_default.disabled : ""}`, children: [
581
+ /* @__PURE__ */ jsxs10(
582
+ "button",
583
+ {
584
+ type: "button",
585
+ className: `${Select_default.trigger} ${open ? Select_default.open : ""}`,
586
+ onClick: () => !disabled && setOpen((o) => !o),
587
+ disabled,
588
+ children: [
589
+ /* @__PURE__ */ jsx17("span", { className: selectedLabel ? Select_default.value : Select_default.placeholder, children: selectedLabel != null ? selectedLabel : placeholder }),
590
+ /* @__PURE__ */ jsx17(ChevronDown2, { size: 16, className: `${Select_default.chevron} ${open ? Select_default.chevronOpen : ""}` })
591
+ ]
592
+ }
593
+ ),
594
+ open && /* @__PURE__ */ jsx17("div", { className: Select_default.dropdown, children: options.map((option) => /* @__PURE__ */ jsxs10(
595
+ "div",
596
+ {
597
+ className: `${Select_default.option} ${selected === option.value ? Select_default.selected : ""}`,
598
+ onClick: () => handleSelect(option.value),
599
+ children: [
600
+ selected === option.value ? /* @__PURE__ */ jsx17(Check2, { size: 14, className: Select_default.checkIcon }) : /* @__PURE__ */ jsx17("span", { className: Select_default.checkSpacer }),
601
+ option.label
602
+ ]
603
+ },
604
+ option.value
605
+ )) })
606
+ ] });
607
+ };
608
+ var Select_default2 = Select;
609
+
610
+ // src/components/Skeleton/Skeleton.module.css
611
+ var Skeleton_default = {};
612
+
613
+ // src/components/Skeleton/Skeleton.tsx
614
+ import { jsx as jsx18 } from "react/jsx-runtime";
615
+ var Skeleton = ({ height = "1rem", width = "100%", circle = false }) => /* @__PURE__ */ jsx18(
616
+ "div",
617
+ {
618
+ className: `${Skeleton_default.skeleton} ${circle ? Skeleton_default.circle : ""}`,
619
+ style: { height, width },
620
+ "aria-hidden": "true"
621
+ }
622
+ );
623
+ var Skeleton_default2 = Skeleton;
624
+
625
+ // src/components/Slider/Slider.tsx
626
+ import { useState as useState9 } from "react";
627
+
628
+ // src/components/Slider/Slider.module.css
629
+ var Slider_default = {};
630
+
631
+ // src/components/Slider/Slider.tsx
632
+ import { jsx as jsx19 } from "react/jsx-runtime";
633
+ var Slider = ({
634
+ value,
635
+ defaultValue = 50,
636
+ min = 0,
637
+ max = 100,
638
+ step = 1,
639
+ disabled,
640
+ onChange
641
+ }) => {
642
+ const [internal, setInternal] = useState9(defaultValue);
643
+ const current = value !== void 0 ? value : internal;
644
+ const fill = `${(current - min) / (max - min) * 100}%`;
645
+ const handleChange = (e) => {
646
+ const val = Number(e.target.value);
647
+ setInternal(val);
648
+ onChange == null ? void 0 : onChange(val);
649
+ };
650
+ return /* @__PURE__ */ jsx19("div", { className: `${Slider_default.wrapper} ${disabled ? Slider_default.disabled : ""}`, children: /* @__PURE__ */ jsx19(
651
+ "input",
652
+ {
653
+ type: "range",
654
+ min,
655
+ max,
656
+ step,
657
+ value: current,
658
+ disabled,
659
+ onChange: handleChange,
660
+ className: Slider_default.range,
661
+ style: { "--fill": fill }
662
+ }
663
+ ) });
664
+ };
665
+ var Slider_default2 = Slider;
666
+
667
+ // src/components/Spinner/Spinner.tsx
668
+ import { Loader2 } from "lucide-react";
669
+
670
+ // src/components/Spinner/Spinner.module.css
671
+ var Spinner_default = {};
672
+
673
+ // src/components/Spinner/Spinner.tsx
674
+ import { jsx as jsx20 } from "react/jsx-runtime";
675
+ var sizePx = { sm: 16, md: 24, lg: 32 };
676
+ var Spinner = ({ size = "md" }) => /* @__PURE__ */ jsx20(Loader2, { size: sizePx[size], className: Spinner_default.spinner, "aria-label": "Loading" });
677
+ var Spinner_default2 = Spinner;
678
+
679
+ // src/components/Switch/Switch.tsx
680
+ import { useState as useState10 } from "react";
681
+
682
+ // src/components/Switch/Switch.module.css
683
+ var Switch_default = {};
684
+
685
+ // src/components/Switch/Switch.tsx
686
+ import { jsx as jsx21, jsxs as jsxs11 } from "react/jsx-runtime";
687
+ var Switch = ({
688
+ label,
689
+ checked,
690
+ defaultChecked = false,
691
+ disabled,
692
+ id,
693
+ onChange
694
+ }) => {
695
+ const [internal, setInternal] = useState10(defaultChecked);
696
+ const isOn = checked !== void 0 ? checked : internal;
697
+ const handleToggle = () => {
698
+ if (disabled) return;
699
+ const next = !isOn;
700
+ setInternal(next);
701
+ onChange == null ? void 0 : onChange(next);
702
+ };
703
+ return /* @__PURE__ */ jsxs11("label", { className: `${Switch_default.container} ${disabled ? Switch_default.disabled : ""}`, htmlFor: id, children: [
704
+ /* @__PURE__ */ jsx21(
705
+ "input",
706
+ {
707
+ type: "checkbox",
708
+ id,
709
+ checked: isOn,
710
+ disabled,
711
+ onChange: handleToggle,
712
+ className: Switch_default.input
713
+ }
714
+ ),
715
+ /* @__PURE__ */ jsx21("span", { className: `${Switch_default.track} ${isOn ? Switch_default.on : ""}`, children: /* @__PURE__ */ jsx21("span", { className: `${Switch_default.thumb} ${isOn ? Switch_default.thumbOn : ""}` }) }),
716
+ label && /* @__PURE__ */ jsx21("span", { className: Switch_default.label, children: label })
717
+ ] });
718
+ };
719
+ var Switch_default2 = Switch;
720
+
721
+ // src/components/Table/Table.module.css
722
+ var Table_default = {};
723
+
724
+ // src/components/Table/Table.tsx
725
+ import { jsx as jsx22 } from "react/jsx-runtime";
726
+ var Table = (_a) => {
727
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
728
+ return /* @__PURE__ */ jsx22("div", { className: Table_default.wrapper, children: /* @__PURE__ */ jsx22("table", __spreadValues({ className: `${Table_default.table}${className ? ` ${className}` : ""}` }, props)) });
729
+ };
730
+ var TableHead = (props) => /* @__PURE__ */ jsx22("thead", __spreadValues({}, props));
731
+ var TableBody = (props) => /* @__PURE__ */ jsx22("tbody", __spreadValues({}, props));
732
+ var TableRow = (_a) => {
733
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
734
+ return /* @__PURE__ */ jsx22("tr", __spreadValues({ className: `${Table_default.row}${className ? ` ${className}` : ""}` }, props));
735
+ };
736
+ var TableHeader = (_a) => {
737
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
738
+ return /* @__PURE__ */ jsx22("th", __spreadValues({ className: `${Table_default.th}${className ? ` ${className}` : ""}` }, props));
739
+ };
740
+ var TableCell = (_a) => {
741
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
742
+ return /* @__PURE__ */ jsx22("td", __spreadValues({ className: `${Table_default.td}${className ? ` ${className}` : ""}` }, props));
743
+ };
744
+
745
+ // src/components/Tabs/Tabs.tsx
746
+ import { useState as useState11 } from "react";
747
+
748
+ // src/components/Tabs/Tabs.module.css
749
+ var Tabs_default = {};
750
+
751
+ // src/components/Tabs/Tabs.tsx
752
+ import { jsx as jsx23, jsxs as jsxs12 } from "react/jsx-runtime";
753
+ var Tabs = ({ tabs, defaultValue }) => {
754
+ var _a, _b;
755
+ const [active, setActive] = useState11((_b = defaultValue != null ? defaultValue : (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : "");
756
+ const activeTab = tabs.find((t) => t.value === active);
757
+ return /* @__PURE__ */ jsxs12("div", { className: Tabs_default.root, children: [
758
+ /* @__PURE__ */ jsx23("div", { className: Tabs_default.list, role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ jsxs12(
759
+ "button",
760
+ {
761
+ role: "tab",
762
+ "aria-selected": active === tab.value,
763
+ className: `${Tabs_default.trigger} ${active === tab.value ? Tabs_default.active : ""}`,
764
+ onClick: () => setActive(tab.value),
765
+ children: [
766
+ tab.icon && /* @__PURE__ */ jsx23("span", { className: Tabs_default["trigger-icon"], children: tab.icon }),
767
+ tab.label
768
+ ]
769
+ },
770
+ tab.value
771
+ )) }),
772
+ /* @__PURE__ */ jsx23("div", { className: Tabs_default.content, role: "tabpanel", children: activeTab == null ? void 0 : activeTab.content })
773
+ ] });
774
+ };
775
+ var Tabs_default2 = Tabs;
776
+
777
+ // src/components/Textarea/Textarea.module.css
778
+ var Textarea_default = {};
779
+
780
+ // src/components/Textarea/Textarea.tsx
781
+ import { jsx as jsx24 } from "react/jsx-runtime";
782
+ var Textarea = (_a) => {
783
+ var _b = _a, { error, className } = _b, props = __objRest(_b, ["error", "className"]);
784
+ const classes = [
785
+ Textarea_default.textarea,
786
+ error ? Textarea_default.error : "",
787
+ className != null ? className : ""
788
+ ].filter(Boolean).join(" ");
789
+ return /* @__PURE__ */ jsx24("textarea", __spreadValues({ className: classes }, props));
790
+ };
791
+ var Textarea_default2 = Textarea;
792
+
793
+ // src/components/Tooltip/Tooltip.module.css
794
+ var Tooltip_default = {};
795
+
796
+ // src/components/Tooltip/Tooltip.tsx
797
+ import { jsx as jsx25, jsxs as jsxs13 } from "react/jsx-runtime";
798
+ var Tooltip = ({ content, children, position = "top" }) => /* @__PURE__ */ jsxs13("span", { className: Tooltip_default.wrapper, children: [
799
+ children,
800
+ /* @__PURE__ */ jsx25("span", { className: `${Tooltip_default.tooltip} ${Tooltip_default[position]}`, role: "tooltip", children: content })
801
+ ] });
802
+ var Tooltip_default2 = Tooltip;
803
+ export {
804
+ Accordion_default2 as Accordion,
805
+ Alert_default2 as Alert,
806
+ Avatar_default2 as Avatar,
807
+ Badge_default2 as Badge,
808
+ Breadcrumb_default2 as Breadcrumb,
809
+ Button_default2 as Button,
810
+ Card,
811
+ CardContent,
812
+ CardDescription,
813
+ CardFooter,
814
+ CardHeader,
815
+ CardTitle,
816
+ Checkbox_default2 as Checkbox,
817
+ CopyButton_default2 as CopyButton,
818
+ FileUpload_default2 as FileUpload,
819
+ Input_default2 as Input,
820
+ Label_default2 as Label,
821
+ PasswordInput_default as PasswordInput,
822
+ Progress_default2 as Progress,
823
+ RadioGroup_default2 as RadioGroup,
824
+ Select_default2 as Select,
825
+ Skeleton_default2 as Skeleton,
826
+ Slider_default2 as Slider,
827
+ Spinner_default2 as Spinner,
828
+ Switch_default2 as Switch,
829
+ Table,
830
+ TableBody,
831
+ TableCell,
832
+ TableHead,
833
+ TableHeader,
834
+ TableRow,
835
+ Tabs_default2 as Tabs,
836
+ Textarea_default2 as Textarea,
837
+ ThemeProvider,
838
+ Tooltip_default2 as Tooltip,
839
+ useTheme
840
+ };
841
+ //# sourceMappingURL=index.js.map