@efiche/design 0.1.7 → 0.1.8

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.cjs CHANGED
@@ -50,10 +50,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
50
50
  var index_exports = {};
51
51
  __export(index_exports, {
52
52
  Accordion: () => Accordion_default,
53
- Alert: () => Alert_default2,
54
- Avatar: () => Avatar_default2,
55
- Badge: () => Badge_default2,
56
- Breadcrumb: () => Breadcrumb_default2,
53
+ Alert: () => Alert_default,
54
+ Avatar: () => Avatar_default,
55
+ Badge: () => Badge_default,
56
+ Breadcrumb: () => Breadcrumb_default,
57
57
  Button: () => Button_default,
58
58
  Card: () => Card,
59
59
  CardContent: () => CardContent,
@@ -61,29 +61,29 @@ __export(index_exports, {
61
61
  CardFooter: () => CardFooter,
62
62
  CardHeader: () => CardHeader,
63
63
  CardTitle: () => CardTitle,
64
- Checkbox: () => Checkbox_default2,
65
- CopyButton: () => CopyButton_default2,
66
- FileUpload: () => FileUpload_default2,
67
- Input: () => Input_default2,
68
- Label: () => Label_default2,
64
+ Checkbox: () => Checkbox_default,
65
+ CopyButton: () => CopyButton_default,
66
+ FileUpload: () => FileUpload_default,
67
+ Input: () => Input_default,
68
+ Label: () => Label_default,
69
69
  PasswordInput: () => PasswordInput_default,
70
- Progress: () => Progress_default2,
71
- RadioGroup: () => RadioGroup_default2,
72
- Select: () => Select_default2,
73
- Skeleton: () => Skeleton_default2,
74
- Slider: () => Slider_default2,
75
- Spinner: () => Spinner_default2,
76
- Switch: () => Switch_default2,
70
+ Progress: () => Progress_default,
71
+ RadioGroup: () => RadioGroup_default,
72
+ Select: () => Select_default,
73
+ Skeleton: () => Skeleton_default,
74
+ Slider: () => Slider_default,
75
+ Spinner: () => Spinner_default,
76
+ Switch: () => Switch_default,
77
77
  Table: () => Table,
78
78
  TableBody: () => TableBody,
79
79
  TableCell: () => TableCell,
80
80
  TableHead: () => TableHead,
81
81
  TableHeader: () => TableHeader,
82
82
  TableRow: () => TableRow,
83
- Tabs: () => Tabs_default2,
84
- Textarea: () => Textarea_default2,
83
+ Tabs: () => Tabs_default,
84
+ Textarea: () => Textarea_default,
85
85
  ThemeProvider: () => ThemeProvider,
86
- Tooltip: () => Tooltip_default2,
86
+ Tooltip: () => Tooltip_default,
87
87
  useTheme: () => useTheme
88
88
  });
89
89
  module.exports = __toCommonJS(index_exports);
@@ -201,71 +201,144 @@ var Accordion_default = Accordion;
201
201
 
202
202
  // src/components/Alert/Alert.tsx
203
203
  var import_lucide_react2 = require("lucide-react");
204
-
205
- // src/components/Alert/Alert.module.css
206
- var Alert_default = {};
207
-
208
- // src/components/Alert/Alert.tsx
209
204
  var import_jsx_runtime3 = require("react/jsx-runtime");
205
+ var variantMap = {
206
+ info: { bg: "var(--ds-info-bg, #eff6ff)", border: "var(--ds-info, #3b82f6)", icon: "var(--ds-info, #3b82f6)", title: "var(--ds-info-title, #1e3a8a)", desc: "var(--ds-info-desc, #1e40af)" },
207
+ success: { bg: "var(--ds-success-bg, #f0fdf4)", border: "var(--ds-success, #22c55e)", icon: "var(--ds-success, #22c55e)", title: "var(--ds-success-title, #14532d)", desc: "var(--ds-success-desc, #166534)" },
208
+ warning: { bg: "var(--ds-warning-bg, #fffbeb)", border: "var(--ds-warning, #f59e0b)", icon: "var(--ds-warning, #f59e0b)", title: "var(--ds-warning-title, #78350f)", desc: "var(--ds-warning-desc, #92400e)" },
209
+ danger: { bg: "var(--ds-danger-bg, #fef2f2)", border: "var(--ds-danger, #ef4444)", icon: "var(--ds-danger, #ef4444)", title: "var(--ds-danger-title, #7f1d1d)", desc: "var(--ds-danger-desc, #991b1b)" }
210
+ };
210
211
  var icons = {
211
212
  info: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Info, { size: 16 }),
212
213
  success: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.CheckCircle2, { size: 16 }),
213
214
  warning: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.AlertTriangle, { size: 16 }),
214
215
  danger: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.AlertCircle, { size: 16 })
215
216
  };
216
- var Alert = ({ variant = "info", title, description }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: `${Alert_default.alert} ${Alert_default[variant]}`, role: "alert", children: [
217
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: Alert_default.icon, children: icons[variant] }),
218
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Alert_default.content, children: [
219
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: Alert_default.title, children: title }),
220
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: Alert_default.description, children: description })
221
- ] })
222
- ] });
223
- var Alert_default2 = Alert;
224
-
225
- // src/components/Avatar/Avatar.module.css
226
- var Avatar_default = {};
217
+ var Alert = ({ variant = "info", title, description }) => {
218
+ const v = variantMap[variant];
219
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { role: "alert", style: {
220
+ display: "flex",
221
+ gap: "0.75rem",
222
+ padding: "1rem",
223
+ borderRadius: "0.5rem",
224
+ borderLeft: `4px solid ${v.border}`,
225
+ backgroundColor: v.bg
226
+ }, children: [
227
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { flexShrink: 0, marginTop: "0.125rem", color: v.icon }, children: icons[variant] }),
228
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { flex: 1 }, children: [
229
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { style: { fontWeight: 600, fontSize: "0.875rem", marginBottom: "0.25rem", marginTop: 0, color: v.title }, children: title }),
230
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { style: { fontSize: "0.875rem", margin: 0, color: v.desc }, children: description })
231
+ ] })
232
+ ] });
233
+ };
234
+ var Alert_default = Alert;
227
235
 
228
236
  // src/components/Avatar/Avatar.tsx
229
237
  var import_jsx_runtime4 = require("react/jsx-runtime");
238
+ var sizeMap = {
239
+ sm: { width: "2rem", height: "2rem", fontSize: "0.625rem" },
240
+ md: { width: "2.5rem", height: "2.5rem", fontSize: "0.875rem" },
241
+ lg: { width: "4rem", height: "4rem", fontSize: "1.25rem" }
242
+ };
230
243
  var Avatar = ({ fallback, size = "md", style, className }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
231
244
  "div",
232
245
  {
233
- className: `${Avatar_default.avatar} ${Avatar_default[size]}${className ? ` ${className}` : ""}`,
234
- style,
246
+ className,
235
247
  "aria-label": fallback,
248
+ style: __spreadValues(__spreadValues({
249
+ display: "inline-flex",
250
+ alignItems: "center",
251
+ justifyContent: "center",
252
+ borderRadius: "9999px",
253
+ backgroundColor: "var(--ds-accent, #f1f5f9)",
254
+ color: "var(--ds-text-primary, #0f172a)",
255
+ fontWeight: 600,
256
+ flexShrink: 0,
257
+ userSelect: "none"
258
+ }, sizeMap[size]), style),
236
259
  children: fallback
237
260
  }
238
261
  );
239
- var Avatar_default2 = Avatar;
240
-
241
- // src/components/Badge/Badge.module.css
242
- var Badge_default = {};
262
+ var Avatar_default = Avatar;
243
263
 
244
264
  // src/components/Badge/Badge.tsx
245
265
  var import_jsx_runtime5 = require("react/jsx-runtime");
246
- var Badge = ({ variant = "default", size = "md", children, style }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `${Badge_default.badge} ${Badge_default[variant]} ${Badge_default[size]}`, style, children });
247
- var Badge_default2 = Badge;
266
+ var variantMap2 = {
267
+ default: { backgroundColor: "var(--ds-primary, #3b82f6)", color: "#fff" },
268
+ secondary: { backgroundColor: "var(--ds-muted, #f1f5f9)", color: "var(--ds-text-secondary, #64748b)" },
269
+ outline: { backgroundColor: "transparent", border: "1px solid var(--ds-border, #e2e8f0)", color: "var(--ds-text-primary, #0f172a)" },
270
+ danger: { backgroundColor: "var(--ds-danger, #ef4444)", color: "#fff" },
271
+ success: { backgroundColor: "var(--ds-success, #22c55e)", color: "#fff" },
272
+ warning: { backgroundColor: "var(--ds-warning, #f59e0b)", color: "#fff" },
273
+ info: { backgroundColor: "var(--ds-info, #3b82f6)", color: "#fff" }
274
+ };
275
+ var sizeMap2 = {
276
+ sm: { padding: "0.125rem 0.5rem", fontSize: "0.625rem" },
277
+ md: { padding: "0.25rem 0.625rem", fontSize: "0.75rem" },
278
+ lg: { padding: "0.375rem 0.875rem", fontSize: "0.875rem" }
279
+ };
280
+ var Badge = ({ variant = "default", size = "md", children, style }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: __spreadValues(__spreadValues(__spreadValues({
281
+ display: "inline-flex",
282
+ alignItems: "center",
283
+ gap: "0.25rem",
284
+ borderRadius: "9999px",
285
+ fontWeight: 500,
286
+ whiteSpace: "nowrap"
287
+ }, variantMap2[variant]), sizeMap2[size]), style), children });
288
+ var Badge_default = Badge;
248
289
 
249
290
  // src/components/Breadcrumb/Breadcrumb.tsx
291
+ var import_react3 = require("react");
250
292
  var import_lucide_react3 = require("lucide-react");
251
-
252
- // src/components/Breadcrumb/Breadcrumb.module.css
253
- var Breadcrumb_default = {};
254
-
255
- // src/components/Breadcrumb/Breadcrumb.tsx
256
293
  var import_jsx_runtime6 = require("react/jsx-runtime");
257
- var Breadcrumb = ({ items }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ol", { className: Breadcrumb_default.list, children: items.map((item, i) => {
258
- const isLast = i === items.length - 1;
259
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: Breadcrumb_default.item, children: [
260
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react3.ChevronRight, { size: 14, className: Breadcrumb_default.separator, "aria-hidden": true }),
261
- isLast || !item.href ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `${Breadcrumb_default.link} ${isLast ? Breadcrumb_default.current : ""}`, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("a", { href: item.href, className: Breadcrumb_default.link, children: item.label })
262
- ] }, item.label);
263
- }) }) });
264
- var Breadcrumb_default2 = Breadcrumb;
294
+ var Breadcrumb = ({ items }) => {
295
+ const [hovered, setHovered] = (0, import_react3.useState)(null);
296
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ol", { style: {
297
+ display: "flex",
298
+ flexWrap: "wrap",
299
+ alignItems: "center",
300
+ listStyle: "none",
301
+ padding: 0,
302
+ margin: 0,
303
+ fontSize: "0.875rem"
304
+ }, children: items.map((item, i) => {
305
+ const isLast = i === items.length - 1;
306
+ const isHovered = hovered === item.label;
307
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { style: { display: "flex", alignItems: "center" }, children: [
308
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
309
+ import_lucide_react3.ChevronRight,
310
+ {
311
+ size: 14,
312
+ "aria-hidden": true,
313
+ style: { color: "var(--ds-text-secondary, #64748b)", margin: "0 0.25rem", flexShrink: 0 }
314
+ }
315
+ ),
316
+ isLast || !item.href ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: {
317
+ color: isLast ? "var(--ds-text-primary, #0f172a)" : "var(--ds-text-secondary, #64748b)",
318
+ fontWeight: isLast ? 500 : void 0,
319
+ cursor: isLast ? "default" : void 0
320
+ }, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
321
+ "a",
322
+ {
323
+ href: item.href,
324
+ onMouseEnter: () => setHovered(item.label),
325
+ onMouseLeave: () => setHovered(null),
326
+ style: {
327
+ color: "var(--ds-text-secondary, #64748b)",
328
+ textDecoration: isHovered ? "underline" : "none",
329
+ transition: "color 0.15s"
330
+ },
331
+ children: item.label
332
+ }
333
+ )
334
+ ] }, item.label);
335
+ }) }) });
336
+ };
337
+ var Breadcrumb_default = Breadcrumb;
265
338
 
266
339
  // src/components/Button/Button.tsx
267
340
  var import_lucide_react4 = require("lucide-react");
268
- var import_react3 = require("react");
341
+ var import_react4 = require("react");
269
342
  var import_jsx_runtime7 = require("react/jsx-runtime");
270
343
  var variantStyles = {
271
344
  solid: { backgroundColor: "var(--ds-primary, #3b82f6)", color: "#fff", borderColor: "transparent" },
@@ -328,7 +401,7 @@ var Button = (_a) => {
328
401
  "size",
329
402
  "style"
330
403
  ]);
331
- const [hovered, setHovered] = (0, import_react3.useState)(false);
404
+ const [hovered, setHovered] = (0, import_react4.useState)(false);
332
405
  const resolvedVariant = variant != null ? variant : danger ? "danger" : warning ? "warning" : info ? "info" : success ? "success" : ghost ? "ghost" : outline ? "outline" : "solid";
333
406
  const resolvedSize = size != null ? size : small ? "sm" : large ? "lg" : "md";
334
407
  const isDisabled = disabled || loading;
@@ -374,43 +447,58 @@ var Button = (_a) => {
374
447
  };
375
448
  var Button_default = Button;
376
449
 
377
- // src/components/Card/Card.module.css
378
- var Card_default = {};
379
-
380
450
  // src/components/Card/Card.tsx
381
451
  var import_jsx_runtime8 = require("react/jsx-runtime");
382
452
  var Card = (_a) => {
383
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
384
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ className: `${Card_default.card}${className ? ` ${className}` : ""}` }, props));
453
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
454
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ style: __spreadValues({
455
+ border: "1px solid var(--ds-border, #e2e8f0)",
456
+ borderRadius: "0.5rem",
457
+ backgroundColor: "var(--ds-card, #ffffff)"
458
+ }, style) }, props));
385
459
  };
386
460
  var CardHeader = (_a) => {
387
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
388
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ className: `${Card_default.header}${className ? ` ${className}` : ""}` }, props));
461
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
462
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ style: __spreadValues({
463
+ display: "flex",
464
+ flexDirection: "column",
465
+ gap: "0.375rem",
466
+ padding: "1.5rem 1.5rem 0"
467
+ }, style) }, props));
389
468
  };
390
469
  var CardTitle = (_a) => {
391
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
392
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", __spreadValues({ className: `${Card_default.title}${className ? ` ${className}` : ""}` }, props));
470
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
471
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", __spreadValues({ style: __spreadValues({
472
+ fontSize: "1rem",
473
+ fontWeight: 600,
474
+ color: "var(--ds-text-primary, #0f172a)",
475
+ margin: 0,
476
+ lineHeight: 1.4
477
+ }, style) }, props));
393
478
  };
394
479
  var CardDescription = (_a) => {
395
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
396
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", __spreadValues({ className: `${Card_default.description}${className ? ` ${className}` : ""}` }, props));
480
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
481
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", __spreadValues({ style: __spreadValues({
482
+ fontSize: "0.875rem",
483
+ color: "var(--ds-text-secondary, #64748b)",
484
+ margin: 0
485
+ }, style) }, props));
397
486
  };
398
487
  var CardContent = (_a) => {
399
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
400
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ className: `${Card_default.content}${className ? ` ${className}` : ""}` }, props));
488
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
489
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ style: __spreadValues({ padding: "1.5rem" }, style) }, props));
401
490
  };
402
491
  var CardFooter = (_a) => {
403
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
404
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ className: `${Card_default.footer}${className ? ` ${className}` : ""}` }, props));
492
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
493
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", __spreadValues({ style: __spreadValues({
494
+ display: "flex",
495
+ alignItems: "center",
496
+ padding: "0 1.5rem 1.5rem"
497
+ }, style) }, props));
405
498
  };
406
499
 
407
500
  // src/components/Checkbox/Checkbox.tsx
408
- var import_react4 = require("react");
409
-
410
- // src/components/Checkbox/Checkbox.module.css
411
- var Checkbox_default = {};
412
-
413
- // src/components/Checkbox/Checkbox.tsx
501
+ var import_react5 = require("react");
414
502
  var import_jsx_runtime9 = require("react/jsx-runtime");
415
503
  var Checkbox = ({
416
504
  label,
@@ -420,7 +508,7 @@ var Checkbox = ({
420
508
  id,
421
509
  onChange
422
510
  }) => {
423
- const [internal, setInternal] = (0, import_react4.useState)(defaultChecked);
511
+ const [internal, setInternal] = (0, import_react5.useState)(defaultChecked);
424
512
  const isChecked = checked !== void 0 ? checked : internal;
425
513
  const handleChange = () => {
426
514
  if (disabled) return;
@@ -428,7 +516,14 @@ var Checkbox = ({
428
516
  setInternal(next);
429
517
  onChange == null ? void 0 : onChange(next);
430
518
  };
431
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { className: `${Checkbox_default.container} ${disabled ? Checkbox_default.disabled : ""}`, htmlFor: id, children: [
519
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { htmlFor: id, style: {
520
+ display: "inline-flex",
521
+ alignItems: "center",
522
+ gap: "0.5rem",
523
+ cursor: disabled ? "not-allowed" : "pointer",
524
+ userSelect: "none",
525
+ opacity: disabled ? 0.5 : 1
526
+ }, children: [
432
527
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
433
528
  "input",
434
529
  {
@@ -437,26 +532,33 @@ var Checkbox = ({
437
532
  checked: isChecked,
438
533
  disabled,
439
534
  onChange: handleChange,
440
- className: Checkbox_default.input
535
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
441
536
  }
442
537
  ),
443
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: `${Checkbox_default.box} ${isChecked ? Checkbox_default.checked : ""}`, children: isChecked && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("svg", { viewBox: "0 0 12 10", fill: "none", className: Checkbox_default.checkmark, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M1 5l3.5 3.5L11 1", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
444
- label && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: Checkbox_default.label, children: label })
538
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: {
539
+ width: "1.125rem",
540
+ height: "1.125rem",
541
+ border: `2px solid ${isChecked ? "var(--ds-primary, #3b82f6)" : "var(--ds-border, #e2e8f0)"}`,
542
+ borderRadius: "0.25rem",
543
+ display: "flex",
544
+ alignItems: "center",
545
+ justifyContent: "center",
546
+ flexShrink: 0,
547
+ transition: "background-color 0.15s, border-color 0.15s",
548
+ backgroundColor: isChecked ? "var(--ds-primary, #3b82f6)" : "var(--ds-card, #fff)"
549
+ }, children: isChecked && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("svg", { viewBox: "0 0 12 10", fill: "none", style: { width: "0.625rem", height: "0.625rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M1 5l3.5 3.5L11 1", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
550
+ label && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontSize: "0.875rem", color: "var(--ds-text-primary, #0f172a)" }, children: label })
445
551
  ] });
446
552
  };
447
- var Checkbox_default2 = Checkbox;
553
+ var Checkbox_default = Checkbox;
448
554
 
449
555
  // src/components/CopyButton/CopyButton.tsx
450
556
  var import_lucide_react5 = require("lucide-react");
451
- var import_react5 = require("react");
452
-
453
- // src/components/CopyButton/CopyButton.module.css
454
- var CopyButton_default = {};
455
-
456
- // src/components/CopyButton/CopyButton.tsx
557
+ var import_react6 = require("react");
457
558
  var import_jsx_runtime10 = require("react/jsx-runtime");
458
559
  var CopyButton = ({ text }) => {
459
- const [copied, setCopied] = (0, import_react5.useState)(false);
560
+ const [copied, setCopied] = (0, import_react6.useState)(false);
561
+ const [hovered, setHovered] = (0, import_react6.useState)(false);
460
562
  const handleCopy = () => {
461
563
  navigator.clipboard.writeText(text);
462
564
  setCopied(true);
@@ -465,40 +567,51 @@ var CopyButton = ({ text }) => {
465
567
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
466
568
  "button",
467
569
  {
468
- className: CopyButton_default.copyButton,
469
570
  onClick: handleCopy,
571
+ onMouseEnter: () => setHovered(true),
572
+ onMouseLeave: () => setHovered(false),
470
573
  "aria-label": copied ? "Copied" : `Copy ${text}`,
471
- children: copied ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react5.Check, { className: CopyButton_default.icon }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react5.Copy, { className: CopyButton_default.icon })
574
+ style: {
575
+ display: "inline-flex",
576
+ alignItems: "center",
577
+ justifyContent: "center",
578
+ padding: "0.25rem",
579
+ border: "none",
580
+ borderRadius: "0.25rem",
581
+ backgroundColor: hovered ? "var(--ds-accent, #f1f5f9)" : "transparent",
582
+ color: hovered ? "var(--ds-text-primary, #0f172a)" : "var(--ds-text-secondary, #64748b)",
583
+ cursor: "pointer",
584
+ transition: "background-color 0.15s, color 0.15s"
585
+ },
586
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react5.Check, { style: { width: "1rem", height: "1rem" } }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react5.Copy, { style: { width: "1rem", height: "1rem" } })
472
587
  }
473
588
  );
474
589
  };
475
- var CopyButton_default2 = CopyButton;
590
+ var CopyButton_default = CopyButton;
476
591
 
477
592
  // src/components/FileUpload/FileUpload.tsx
478
593
  var import_lucide_react6 = require("lucide-react");
479
- var import_react6 = require("react");
480
-
481
- // src/components/FileUpload/FileUpload.module.css
482
- var FileUpload_default = {};
483
-
484
- // src/components/FileUpload/FileUpload.tsx
594
+ var import_react7 = require("react");
485
595
  var import_jsx_runtime11 = require("react/jsx-runtime");
486
596
  var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
487
- const [isDragging, setIsDragging] = (0, import_react6.useState)(false);
488
- const [fileNames, setFileNames] = (0, import_react6.useState)([]);
489
- const inputRef = (0, import_react6.useRef)(null);
597
+ const [isDragging, setIsDragging] = (0, import_react7.useState)(false);
598
+ const [isHovered, setIsHovered] = (0, import_react7.useState)(false);
599
+ const [fileNames, setFileNames] = (0, import_react7.useState)([]);
600
+ const inputRef = (0, import_react7.useRef)(null);
490
601
  const handleFiles = (list) => {
491
602
  setFileNames(Array.from(list).map((f) => f.name));
492
603
  onFileSelect == null ? void 0 : onFileSelect(list);
493
604
  };
605
+ const isActive = isDragging || isHovered;
494
606
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
495
607
  "div",
496
608
  {
497
- className: `${FileUpload_default.zone} ${isDragging ? FileUpload_default.dragging : ""} ${disabled ? FileUpload_default.disabled : ""}`,
498
609
  onClick: () => {
499
610
  var _a;
500
611
  return !disabled && ((_a = inputRef.current) == null ? void 0 : _a.click());
501
612
  },
613
+ onMouseEnter: () => !disabled && setIsHovered(true),
614
+ onMouseLeave: () => setIsHovered(false),
502
615
  onDragOver: (e) => {
503
616
  e.preventDefault();
504
617
  setIsDragging(true);
@@ -509,6 +622,20 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
509
622
  setIsDragging(false);
510
623
  if (!disabled && e.dataTransfer.files.length) handleFiles(e.dataTransfer.files);
511
624
  },
625
+ style: {
626
+ border: `2px dashed ${isActive ? "var(--ds-primary, #3b82f6)" : "var(--ds-border, #e2e8f0)"}`,
627
+ borderRadius: "0.5rem",
628
+ padding: "2rem",
629
+ display: "flex",
630
+ flexDirection: "column",
631
+ alignItems: "center",
632
+ gap: "0.5rem",
633
+ cursor: disabled ? "not-allowed" : "pointer",
634
+ backgroundColor: isActive ? "var(--ds-primary-50, #eff6ff)" : "var(--ds-muted, #f1f5f9)",
635
+ transition: "border-color 0.15s, background-color 0.15s",
636
+ textAlign: "center",
637
+ opacity: disabled ? 0.5 : 1
638
+ },
512
639
  children: [
513
640
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
514
641
  "input",
@@ -518,12 +645,12 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
518
645
  accept,
519
646
  multiple,
520
647
  disabled,
521
- className: FileUpload_default.input,
648
+ style: { display: "none" },
522
649
  onChange: (e) => e.target.files && handleFiles(e.target.files)
523
650
  }
524
651
  ),
525
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Upload, { size: 32, className: FileUpload_default.icon }),
526
- fileNames.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: FileUpload_default.fileName, children: fileNames.join(", ") }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("p", { className: FileUpload_default.hint, children: [
652
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Upload, { size: 32, style: { color: "var(--ds-text-secondary, #64748b)" } }),
653
+ fileNames.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { style: { fontSize: "0.875rem", color: "var(--ds-primary, #3b82f6)", fontWeight: 500, margin: 0 }, children: fileNames.join(", ") }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("p", { style: { fontSize: "0.875rem", color: "var(--ds-text-secondary, #64748b)", margin: 0 }, children: [
527
654
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "Click to upload" }),
528
655
  " or drag and drop"
529
656
  ] })
@@ -531,65 +658,91 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
531
658
  }
532
659
  );
533
660
  };
534
- var FileUpload_default2 = FileUpload;
535
-
536
- // src/components/Input/Input.module.css
537
- var Input_default = {};
661
+ var FileUpload_default = FileUpload;
538
662
 
539
663
  // src/components/Input/Input.tsx
540
664
  var import_jsx_runtime12 = require("react/jsx-runtime");
665
+ var inputCSS = `
666
+ [data-ds-input]::placeholder { color: var(--ds-text-secondary, #64748b); }
667
+ [data-ds-input]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }
668
+ [data-ds-input]:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--ds-muted, #f1f5f9); }
669
+ [data-ds-input][data-error="true"]:focus { border-color: var(--ds-danger, #ef4444); box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15); }
670
+ [data-ds-input][data-success="true"]:focus { border-color: var(--ds-success, #22c55e); box-shadow: 0 0 0 3px rgb(34 197 94 / 0.15); }
671
+ `;
541
672
  var Input = (_a) => {
542
- var _b = _a, {
543
- error,
544
- success,
545
- leftIcon,
546
- rightIcon,
547
- className
548
- } = _b, props = __objRest(_b, [
549
- "error",
550
- "success",
551
- "leftIcon",
552
- "rightIcon",
553
- "className"
554
- ]);
555
- const wrapperClasses = [
556
- Input_default.wrapper,
557
- error ? Input_default.error : "",
558
- success ? Input_default.success : "",
559
- leftIcon ? Input_default.hasLeft : "",
560
- rightIcon ? Input_default.hasRight : "",
561
- className != null ? className : ""
562
- ].filter(Boolean).join(" ");
563
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: wrapperClasses, children: [
564
- leftIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: Input_default.leftIcon, children: leftIcon }),
565
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("input", __spreadValues({ className: Input_default.input }, props)),
566
- rightIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: Input_default.rightIcon, children: rightIcon })
673
+ var _b = _a, { error, success, leftIcon, rightIcon, style } = _b, props = __objRest(_b, ["error", "success", "leftIcon", "rightIcon", "style"]);
674
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
675
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("style", { href: "ds-input", precedence: "low", children: inputCSS }),
676
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { position: "relative", display: "flex", alignItems: "center", width: "100%" }, children: [
677
+ leftIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: {
678
+ position: "absolute",
679
+ left: "0.625rem",
680
+ display: "flex",
681
+ alignItems: "center",
682
+ color: "var(--ds-text-secondary, #64748b)",
683
+ pointerEvents: "none"
684
+ }, children: leftIcon }),
685
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
686
+ "input",
687
+ __spreadValues({
688
+ "data-ds-input": "",
689
+ "data-error": error ? "true" : void 0,
690
+ "data-success": success ? "true" : void 0,
691
+ style: __spreadValues({
692
+ width: "100%",
693
+ height: "2.25rem",
694
+ paddingTop: 0,
695
+ paddingBottom: 0,
696
+ paddingLeft: leftIcon ? "2.25rem" : "0.75rem",
697
+ paddingRight: rightIcon ? "2.25rem" : "0.75rem",
698
+ border: `1px solid ${error ? "var(--ds-danger, #ef4444)" : success ? "var(--ds-success, #22c55e)" : "var(--ds-border, #e2e8f0)"}`,
699
+ borderRadius: "0.375rem",
700
+ fontSize: "0.875rem",
701
+ backgroundColor: "var(--ds-card, #fff)",
702
+ color: "var(--ds-text-primary, #0f172a)",
703
+ fontFamily: "inherit",
704
+ transition: "border-color 0.15s, box-shadow 0.15s"
705
+ }, style)
706
+ }, props)
707
+ ),
708
+ rightIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: {
709
+ position: "absolute",
710
+ right: "0.625rem",
711
+ display: "flex",
712
+ alignItems: "center",
713
+ color: "var(--ds-text-secondary, #64748b)",
714
+ pointerEvents: "none"
715
+ }, children: rightIcon })
716
+ ] })
567
717
  ] });
568
718
  };
569
- var Input_default2 = Input;
570
-
571
- // src/components/Label/Label.module.css
572
- var Label_default = {};
719
+ var Input_default = Input;
573
720
 
574
721
  // src/components/Label/Label.tsx
575
722
  var import_jsx_runtime13 = require("react/jsx-runtime");
576
723
  var Label = (_a) => {
577
- var _b = _a, { children, required, className } = _b, props = __objRest(_b, ["children", "required", "className"]);
578
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("label", __spreadProps(__spreadValues({ className: `${Label_default.label} ${className != null ? className : ""}` }, props), { children: [
724
+ var _b = _a, { children, required, style } = _b, props = __objRest(_b, ["children", "required", "style"]);
725
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("label", __spreadProps(__spreadValues({ style: __spreadValues({
726
+ display: "block",
727
+ fontSize: "0.875rem",
728
+ fontWeight: 500,
729
+ color: "var(--ds-text-primary, #0f172a)",
730
+ marginBottom: "0.375rem"
731
+ }, style) }, props), { children: [
579
732
  children,
580
- required && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: Label_default.required, children: "*" })
733
+ required && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { color: "var(--ds-danger, #ef4444)", marginLeft: "0.25rem" }, children: "*" })
581
734
  ] }));
582
735
  };
583
- var Label_default2 = Label;
736
+ var Label_default = Label;
584
737
 
585
738
  // src/components/PasswordInput/PasswordInput.tsx
586
739
  var import_lucide_react7 = require("lucide-react");
587
- var import_react7 = require("react");
740
+ var import_react8 = require("react");
588
741
  var import_jsx_runtime14 = require("react/jsx-runtime");
589
742
  var PasswordInput = (props) => {
590
- const [visible, setVisible] = (0, import_react7.useState)(false);
743
+ const [visible, setVisible] = (0, import_react8.useState)(false);
591
744
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
592
- Input_default2,
745
+ Input_default,
593
746
  __spreadProps(__spreadValues({}, props), {
594
747
  type: visible ? "text" : "password",
595
748
  rightIcon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
@@ -607,9 +760,6 @@ var PasswordInput = (props) => {
607
760
  };
608
761
  var PasswordInput_default = PasswordInput;
609
762
 
610
- // src/components/Progress/Progress.module.css
611
- var Progress_default = {};
612
-
613
763
  // src/components/Progress/Progress.tsx
614
764
  var import_jsx_runtime15 = require("react/jsx-runtime");
615
765
  var Progress = ({ value = 0 }) => {
@@ -617,24 +767,31 @@ var Progress = ({ value = 0 }) => {
617
767
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
618
768
  "div",
619
769
  {
620
- className: Progress_default.track,
621
770
  role: "progressbar",
622
771
  "aria-valuenow": pct,
623
772
  "aria-valuemin": 0,
624
773
  "aria-valuemax": 100,
625
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: Progress_default.fill, style: { width: `${pct}%` } })
774
+ style: {
775
+ width: "100%",
776
+ height: "0.5rem",
777
+ backgroundColor: "var(--ds-border, #e2e8f0)",
778
+ borderRadius: "9999px",
779
+ overflow: "hidden"
780
+ },
781
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: {
782
+ height: "100%",
783
+ width: `${pct}%`,
784
+ backgroundColor: "var(--ds-primary, #3b82f6)",
785
+ borderRadius: "9999px",
786
+ transition: "width 0.3s ease"
787
+ } })
626
788
  }
627
789
  );
628
790
  };
629
- var Progress_default2 = Progress;
630
-
631
- // src/components/RadioGroup/RadioGroup.tsx
632
- var import_react8 = require("react");
633
-
634
- // src/components/RadioGroup/RadioGroup.module.css
635
- var RadioGroup_default = {};
791
+ var Progress_default = Progress;
636
792
 
637
793
  // src/components/RadioGroup/RadioGroup.tsx
794
+ var import_react9 = require("react");
638
795
  var import_jsx_runtime16 = require("react/jsx-runtime");
639
796
  var RadioGroup = ({
640
797
  options,
@@ -644,48 +801,65 @@ var RadioGroup = ({
644
801
  disabled,
645
802
  onChange
646
803
  }) => {
647
- const [internal, setInternal] = (0, import_react8.useState)(defaultValue);
804
+ const [internal, setInternal] = (0, import_react9.useState)(defaultValue);
648
805
  const selected = value !== void 0 ? value : internal;
649
806
  const handleChange = (val) => {
650
807
  if (disabled) return;
651
808
  setInternal(val);
652
809
  onChange == null ? void 0 : onChange(val);
653
810
  };
654
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: RadioGroup_default.group, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
655
- "label",
656
- {
657
- className: `${RadioGroup_default.item} ${disabled ? RadioGroup_default.disabled : ""}`,
658
- children: [
659
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
660
- "input",
661
- {
662
- type: "radio",
663
- name,
664
- value: option.value,
665
- checked: selected === option.value,
666
- disabled,
667
- onChange: () => handleChange(option.value),
668
- className: RadioGroup_default.input
669
- }
670
- ),
671
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: `${RadioGroup_default.dot} ${selected === option.value ? RadioGroup_default.checked : ""}`, children: selected === option.value && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: RadioGroup_default.inner }) }),
672
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: RadioGroup_default.label, children: option.label })
673
- ]
674
- },
675
- option.value
676
- )) });
811
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "0.5rem" }, children: options.map((option) => {
812
+ const isSelected = selected === option.value;
813
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("label", { style: {
814
+ display: "inline-flex",
815
+ alignItems: "center",
816
+ gap: "0.5rem",
817
+ cursor: disabled ? "not-allowed" : "pointer",
818
+ userSelect: "none",
819
+ opacity: disabled ? 0.5 : 1
820
+ }, children: [
821
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
822
+ "input",
823
+ {
824
+ type: "radio",
825
+ name,
826
+ value: option.value,
827
+ checked: isSelected,
828
+ disabled,
829
+ onChange: () => handleChange(option.value),
830
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
831
+ }
832
+ ),
833
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
834
+ width: "1.125rem",
835
+ height: "1.125rem",
836
+ borderRadius: "9999px",
837
+ border: `2px solid ${isSelected ? "var(--ds-primary, #3b82f6)" : "var(--ds-border, #e2e8f0)"}`,
838
+ display: "flex",
839
+ alignItems: "center",
840
+ justifyContent: "center",
841
+ flexShrink: 0,
842
+ backgroundColor: "var(--ds-card, #fff)",
843
+ transition: "border-color 0.15s"
844
+ }, children: isSelected && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
845
+ width: "0.5rem",
846
+ height: "0.5rem",
847
+ borderRadius: "9999px",
848
+ backgroundColor: "var(--ds-primary, #3b82f6)"
849
+ } }) }),
850
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: "0.875rem", color: "var(--ds-text-primary, #0f172a)" }, children: option.label })
851
+ ] }, option.value);
852
+ }) });
677
853
  };
678
- var RadioGroup_default2 = RadioGroup;
854
+ var RadioGroup_default = RadioGroup;
679
855
 
680
856
  // src/components/Select/Select.tsx
681
857
  var import_lucide_react8 = require("lucide-react");
682
- var import_react9 = require("react");
683
-
684
- // src/components/Select/Select.module.css
685
- var Select_default = {};
686
-
687
- // src/components/Select/Select.tsx
858
+ var import_react10 = require("react");
688
859
  var import_jsx_runtime17 = require("react/jsx-runtime");
860
+ var selectCSS = `
861
+ [data-ds-select-trigger]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }
862
+ `;
689
863
  var Select = ({
690
864
  options,
691
865
  value,
@@ -695,9 +869,10 @@ var Select = ({
695
869
  onChange
696
870
  }) => {
697
871
  var _a;
698
- const [internal, setInternal] = (0, import_react9.useState)(defaultValue);
699
- const [open, setOpen] = (0, import_react9.useState)(false);
700
- const ref = (0, import_react9.useRef)(null);
872
+ const [internal, setInternal] = (0, import_react10.useState)(defaultValue);
873
+ const [open, setOpen] = (0, import_react10.useState)(false);
874
+ const [hoveredOption, setHoveredOption] = (0, import_react10.useState)(null);
875
+ const ref = (0, import_react10.useRef)(null);
701
876
  const selected = value !== void 0 ? value : internal;
702
877
  const selectedLabel = (_a = options.find((o) => o.value === selected)) == null ? void 0 : _a.label;
703
878
  const handleSelect = (val) => {
@@ -705,66 +880,175 @@ var Select = ({
705
880
  setOpen(false);
706
881
  onChange == null ? void 0 : onChange(val);
707
882
  };
708
- (0, import_react9.useEffect)(() => {
883
+ (0, import_react10.useEffect)(() => {
709
884
  const handleOutside = (e) => {
710
885
  if (ref.current && !ref.current.contains(e.target)) setOpen(false);
711
886
  };
712
887
  document.addEventListener("mousedown", handleOutside);
713
888
  return () => document.removeEventListener("mousedown", handleOutside);
714
889
  }, []);
715
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { ref, className: `${Select_default.wrapper} ${disabled ? Select_default.disabled : ""}`, children: [
716
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
717
- "button",
718
- {
719
- type: "button",
720
- className: `${Select_default.trigger} ${open ? Select_default.open : ""}`,
721
- onClick: () => !disabled && setOpen((o) => !o),
722
- disabled,
723
- children: [
724
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: selectedLabel ? Select_default.value : Select_default.placeholder, children: selectedLabel != null ? selectedLabel : placeholder }),
725
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.ChevronDown, { size: 16, className: `${Select_default.chevron} ${open ? Select_default.chevronOpen : ""}` })
726
- ]
727
- }
728
- ),
729
- open && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: Select_default.dropdown, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
730
- "div",
731
- {
732
- className: `${Select_default.option} ${selected === option.value ? Select_default.selected : ""}`,
733
- onClick: () => handleSelect(option.value),
734
- children: [
735
- selected === option.value ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.Check, { size: 14, className: Select_default.checkIcon }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: Select_default.checkSpacer }),
736
- option.label
737
- ]
738
- },
739
- option.value
740
- )) })
890
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
891
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("style", { href: "ds-select", precedence: "low", children: selectCSS }),
892
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { ref, style: {
893
+ position: "relative",
894
+ width: "100%",
895
+ opacity: disabled ? 0.5 : 1,
896
+ pointerEvents: disabled ? "none" : void 0
897
+ }, children: [
898
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
899
+ "button",
900
+ {
901
+ type: "button",
902
+ "data-ds-select-trigger": "",
903
+ onClick: () => !disabled && setOpen((o) => !o),
904
+ disabled,
905
+ style: {
906
+ width: "100%",
907
+ height: "2.25rem",
908
+ padding: "0 0.75rem",
909
+ border: `1px solid ${open ? "var(--ds-primary, #3b82f6)" : "var(--ds-border, #e2e8f0)"}`,
910
+ borderRadius: "0.375rem",
911
+ fontSize: "0.875rem",
912
+ backgroundColor: "var(--ds-card, #fff)",
913
+ cursor: "pointer",
914
+ display: "flex",
915
+ alignItems: "center",
916
+ justifyContent: "space-between",
917
+ gap: "0.5rem",
918
+ boxShadow: open ? "0 0 0 3px rgb(59 130 246 / 0.15)" : "none",
919
+ transition: "border-color 0.15s, box-shadow 0.15s",
920
+ textAlign: "left",
921
+ fontFamily: "inherit"
922
+ },
923
+ children: [
924
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { color: selectedLabel ? "var(--ds-text-primary, #0f172a)" : "var(--ds-text-secondary, #64748b)" }, children: selectedLabel != null ? selectedLabel : placeholder }),
925
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
926
+ import_lucide_react8.ChevronDown,
927
+ {
928
+ size: 16,
929
+ style: {
930
+ flexShrink: 0,
931
+ color: "var(--ds-text-secondary, #64748b)",
932
+ transition: "transform 0.15s",
933
+ transform: open ? "rotate(180deg)" : "rotate(0deg)"
934
+ }
935
+ }
936
+ )
937
+ ]
938
+ }
939
+ ),
940
+ open && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
941
+ position: "absolute",
942
+ top: "calc(100% + 0.25rem)",
943
+ left: 0,
944
+ right: 0,
945
+ zIndex: 50,
946
+ backgroundColor: "var(--ds-card, #fff)",
947
+ border: "1px solid var(--ds-border, #e2e8f0)",
948
+ borderRadius: "0.375rem",
949
+ boxShadow: "0 10px 15px -3px rgb(0 0 0 / 0.1)",
950
+ overflow: "hidden"
951
+ }, children: options.map((option) => {
952
+ const isSelected = selected === option.value;
953
+ const isHovered = hoveredOption === option.value;
954
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
955
+ "div",
956
+ {
957
+ onClick: () => handleSelect(option.value),
958
+ onMouseEnter: () => setHoveredOption(option.value),
959
+ onMouseLeave: () => setHoveredOption(null),
960
+ style: {
961
+ padding: "0.5rem 0.75rem",
962
+ fontSize: "0.875rem",
963
+ cursor: "pointer",
964
+ display: "flex",
965
+ alignItems: "center",
966
+ gap: "0.5rem",
967
+ color: "var(--ds-text-primary, #0f172a)",
968
+ backgroundColor: isSelected || isHovered ? "var(--ds-muted, #f1f5f9)" : "transparent",
969
+ fontWeight: isSelected ? 500 : void 0,
970
+ transition: "background-color 0.1s"
971
+ },
972
+ children: [
973
+ isSelected ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.Check, { size: 14, style: { color: "var(--ds-primary, #3b82f6)", flexShrink: 0 } }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { width: 14, flexShrink: 0 } }),
974
+ option.label
975
+ ]
976
+ },
977
+ option.value
978
+ );
979
+ }) })
980
+ ] })
741
981
  ] });
742
982
  };
743
- var Select_default2 = Select;
744
-
745
- // src/components/Skeleton/Skeleton.module.css
746
- var Skeleton_default = {};
983
+ var Select_default = Select;
747
984
 
748
985
  // src/components/Skeleton/Skeleton.tsx
749
986
  var import_jsx_runtime18 = require("react/jsx-runtime");
750
- var Skeleton = ({ height = "1rem", width = "100%", circle = false }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
751
- "div",
752
- {
753
- className: `${Skeleton_default.skeleton} ${circle ? Skeleton_default.circle : ""}`,
754
- style: { height, width },
755
- "aria-hidden": "true"
756
- }
757
- );
758
- var Skeleton_default2 = Skeleton;
759
-
760
- // src/components/Slider/Slider.tsx
761
- var import_react10 = require("react");
762
-
763
- // src/components/Slider/Slider.module.css
764
- var Slider_default = {};
987
+ var Skeleton = ({ height = "1rem", width = "100%", circle = false }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
988
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("style", { href: "ds-skeleton", precedence: "low", children: `
989
+ @keyframes ds-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
990
+ [data-ds-skeleton] { animation: ds-pulse 1.5s ease-in-out infinite; }
991
+ ` }),
992
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
993
+ "div",
994
+ {
995
+ "data-ds-skeleton": "",
996
+ "aria-hidden": "true",
997
+ style: {
998
+ height,
999
+ width,
1000
+ backgroundColor: "var(--ds-muted, #f1f5f9)",
1001
+ borderRadius: circle ? "9999px" : "0.375rem"
1002
+ }
1003
+ }
1004
+ )
1005
+ ] });
1006
+ var Skeleton_default = Skeleton;
765
1007
 
766
1008
  // src/components/Slider/Slider.tsx
1009
+ var import_react11 = require("react");
767
1010
  var import_jsx_runtime19 = require("react/jsx-runtime");
1011
+ var sliderCSS = `
1012
+ [data-ds-slider] {
1013
+ -webkit-appearance: none;
1014
+ appearance: none;
1015
+ width: 100%;
1016
+ height: 0.375rem;
1017
+ border-radius: 9999px;
1018
+ outline: none;
1019
+ cursor: pointer;
1020
+ background: linear-gradient(
1021
+ to right,
1022
+ var(--ds-primary, #3b82f6) 0%,
1023
+ var(--ds-primary, #3b82f6) var(--fill, 50%),
1024
+ var(--ds-border, #e2e8f0) var(--fill, 50%),
1025
+ var(--ds-border, #e2e8f0) 100%
1026
+ );
1027
+ }
1028
+ [data-ds-slider]::-webkit-slider-thumb {
1029
+ -webkit-appearance: none;
1030
+ appearance: none;
1031
+ width: 1.125rem;
1032
+ height: 1.125rem;
1033
+ border-radius: 9999px;
1034
+ background-color: var(--ds-primary, #3b82f6);
1035
+ cursor: pointer;
1036
+ border: 2px solid #fff;
1037
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);
1038
+ transition: transform 0.1s;
1039
+ }
1040
+ [data-ds-slider]::-webkit-slider-thumb:hover { transform: scale(1.2); }
1041
+ [data-ds-slider]::-moz-range-thumb {
1042
+ width: 1.125rem;
1043
+ height: 1.125rem;
1044
+ border-radius: 9999px;
1045
+ background-color: var(--ds-primary, #3b82f6);
1046
+ cursor: pointer;
1047
+ border: 2px solid #fff;
1048
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);
1049
+ }
1050
+ [data-ds-slider]:disabled { cursor: not-allowed; }
1051
+ `;
768
1052
  var Slider = ({
769
1053
  value,
770
1054
  defaultValue = 50,
@@ -774,7 +1058,7 @@ var Slider = ({
774
1058
  disabled,
775
1059
  onChange
776
1060
  }) => {
777
- const [internal, setInternal] = (0, import_react10.useState)(defaultValue);
1061
+ const [internal, setInternal] = (0, import_react11.useState)(defaultValue);
778
1062
  const current = value !== void 0 ? value : internal;
779
1063
  const fill = `${(current - min) / (max - min) * 100}%`;
780
1064
  const handleChange = (e) => {
@@ -782,42 +1066,49 @@ var Slider = ({
782
1066
  setInternal(val);
783
1067
  onChange == null ? void 0 : onChange(val);
784
1068
  };
785
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: `${Slider_default.wrapper} ${disabled ? Slider_default.disabled : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
786
- "input",
787
- {
788
- type: "range",
789
- min,
790
- max,
791
- step,
792
- value: current,
793
- disabled,
794
- onChange: handleChange,
795
- className: Slider_default.range,
796
- style: { "--fill": fill }
797
- }
798
- ) });
1069
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
1070
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("style", { href: "ds-slider", precedence: "low", children: sliderCSS }),
1071
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { style: {
1072
+ width: "100%",
1073
+ padding: "0.25rem 0",
1074
+ opacity: disabled ? 0.5 : 1
1075
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1076
+ "input",
1077
+ {
1078
+ type: "range",
1079
+ "data-ds-slider": "",
1080
+ min,
1081
+ max,
1082
+ step,
1083
+ value: current,
1084
+ disabled,
1085
+ onChange: handleChange,
1086
+ style: { "--fill": fill }
1087
+ }
1088
+ ) })
1089
+ ] });
799
1090
  };
800
- var Slider_default2 = Slider;
1091
+ var Slider_default = Slider;
801
1092
 
802
1093
  // src/components/Spinner/Spinner.tsx
803
1094
  var import_lucide_react9 = require("lucide-react");
804
-
805
- // src/components/Spinner/Spinner.module.css
806
- var Spinner_default = {};
807
-
808
- // src/components/Spinner/Spinner.tsx
809
1095
  var import_jsx_runtime20 = require("react/jsx-runtime");
810
1096
  var sizePx = { sm: 16, md: 24, lg: 32 };
811
- var Spinner = ({ size = "md" }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react9.Loader2, { size: sizePx[size], className: Spinner_default.spinner, "aria-label": "Loading" });
812
- var Spinner_default2 = Spinner;
813
-
814
- // src/components/Switch/Switch.tsx
815
- var import_react11 = require("react");
816
-
817
- // src/components/Switch/Switch.module.css
818
- var Switch_default = {};
1097
+ var Spinner = ({ size = "md" }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
1098
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("style", { href: "ds-spin", precedence: "low", children: `@keyframes ds-spin { to { transform: rotate(360deg); } }` }),
1099
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1100
+ import_lucide_react9.Loader2,
1101
+ {
1102
+ size: sizePx[size],
1103
+ "aria-label": "Loading",
1104
+ style: { color: "var(--ds-primary, #3b82f6)", animation: "ds-spin 0.75s linear infinite" }
1105
+ }
1106
+ )
1107
+ ] });
1108
+ var Spinner_default = Spinner;
819
1109
 
820
1110
  // src/components/Switch/Switch.tsx
1111
+ var import_react12 = require("react");
821
1112
  var import_jsx_runtime21 = require("react/jsx-runtime");
822
1113
  var Switch = ({
823
1114
  label,
@@ -827,7 +1118,7 @@ var Switch = ({
827
1118
  id,
828
1119
  onChange
829
1120
  }) => {
830
- const [internal, setInternal] = (0, import_react11.useState)(defaultChecked);
1121
+ const [internal, setInternal] = (0, import_react12.useState)(defaultChecked);
831
1122
  const isOn = checked !== void 0 ? checked : internal;
832
1123
  const handleToggle = () => {
833
1124
  if (disabled) return;
@@ -835,7 +1126,14 @@ var Switch = ({
835
1126
  setInternal(next);
836
1127
  onChange == null ? void 0 : onChange(next);
837
1128
  };
838
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("label", { className: `${Switch_default.container} ${disabled ? Switch_default.disabled : ""}`, htmlFor: id, children: [
1129
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("label", { htmlFor: id, style: {
1130
+ display: "inline-flex",
1131
+ alignItems: "center",
1132
+ gap: "0.625rem",
1133
+ cursor: disabled ? "not-allowed" : "pointer",
1134
+ userSelect: "none",
1135
+ opacity: disabled ? 0.5 : 1
1136
+ }, children: [
839
1137
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
840
1138
  "input",
841
1139
  {
@@ -844,97 +1142,248 @@ var Switch = ({
844
1142
  checked: isOn,
845
1143
  disabled,
846
1144
  onChange: handleToggle,
847
- className: Switch_default.input
1145
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
848
1146
  }
849
1147
  ),
850
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: `${Switch_default.track} ${isOn ? Switch_default.on : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: `${Switch_default.thumb} ${isOn ? Switch_default.thumbOn : ""}` }) }),
851
- label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: Switch_default.label, children: label })
1148
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { style: {
1149
+ width: "2.75rem",
1150
+ height: "1.5rem",
1151
+ borderRadius: "9999px",
1152
+ backgroundColor: isOn ? "var(--ds-primary, #3b82f6)" : "var(--ds-border, #e2e8f0)",
1153
+ position: "relative",
1154
+ transition: "background-color 0.2s",
1155
+ flexShrink: 0
1156
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { style: {
1157
+ position: "absolute",
1158
+ top: "0.175rem",
1159
+ left: "0.175rem",
1160
+ width: "1.15rem",
1161
+ height: "1.15rem",
1162
+ borderRadius: "9999px",
1163
+ backgroundColor: "#fff",
1164
+ boxShadow: "0 1px 3px 0 rgb(0 0 0 / 0.15)",
1165
+ transition: "transform 0.2s",
1166
+ transform: isOn ? "translateX(1.25rem)" : "translateX(0)"
1167
+ } }) }),
1168
+ label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { style: { fontSize: "0.875rem", color: "var(--ds-text-primary, #0f172a)" }, children: label })
852
1169
  ] });
853
1170
  };
854
- var Switch_default2 = Switch;
855
-
856
- // src/components/Table/Table.module.css
857
- var Table_default = {};
1171
+ var Switch_default = Switch;
858
1172
 
859
1173
  // src/components/Table/Table.tsx
860
1174
  var import_jsx_runtime22 = require("react/jsx-runtime");
1175
+ var tableCSS = `
1176
+ [data-ds-table-row]:hover [data-ds-table-cell] { background-color: var(--ds-muted, #f1f5f9); }
1177
+ `;
861
1178
  var Table = (_a) => {
862
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
863
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: Table_default.wrapper, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("table", __spreadValues({ className: `${Table_default.table}${className ? ` ${className}` : ""}` }, props)) });
1179
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
1180
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
1181
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("style", { href: "ds-table", precedence: "low", children: tableCSS }),
1182
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { style: {
1183
+ width: "100%",
1184
+ overflowX: "auto",
1185
+ border: "1px solid var(--ds-border, #e2e8f0)",
1186
+ borderRadius: "0.5rem"
1187
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("table", __spreadValues({ style: __spreadValues({
1188
+ width: "100%",
1189
+ borderCollapse: "collapse",
1190
+ fontSize: "0.875rem"
1191
+ }, style) }, props)) })
1192
+ ] });
864
1193
  };
865
1194
  var TableHead = (props) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("thead", __spreadValues({}, props));
866
1195
  var TableBody = (props) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("tbody", __spreadValues({}, props));
867
1196
  var TableRow = (_a) => {
868
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
869
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("tr", __spreadValues({ className: `${Table_default.row}${className ? ` ${className}` : ""}` }, props));
1197
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
1198
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("tr", __spreadValues({ "data-ds-table-row": "", style }, props));
870
1199
  };
871
1200
  var TableHeader = (_a) => {
872
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
873
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("th", __spreadValues({ className: `${Table_default.th}${className ? ` ${className}` : ""}` }, props));
1201
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
1202
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("th", __spreadValues({ style: __spreadValues({
1203
+ padding: "0.75rem 1rem",
1204
+ textAlign: "left",
1205
+ fontWeight: 500,
1206
+ color: "var(--ds-text-secondary, #64748b)",
1207
+ backgroundColor: "var(--ds-muted, #f1f5f9)",
1208
+ borderBottom: "1px solid var(--ds-border, #e2e8f0)",
1209
+ whiteSpace: "nowrap"
1210
+ }, style) }, props));
874
1211
  };
875
1212
  var TableCell = (_a) => {
876
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
877
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("td", __spreadValues({ className: `${Table_default.td}${className ? ` ${className}` : ""}` }, props));
1213
+ var _b = _a, { style } = _b, props = __objRest(_b, ["style"]);
1214
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1215
+ "td",
1216
+ __spreadValues({
1217
+ "data-ds-table-cell": "",
1218
+ style: __spreadValues({
1219
+ padding: "0.75rem 1rem",
1220
+ borderBottom: "1px solid var(--ds-border, #e2e8f0)",
1221
+ color: "var(--ds-text-primary, #0f172a)",
1222
+ transition: "background-color 0.1s"
1223
+ }, style)
1224
+ }, props)
1225
+ );
878
1226
  };
879
1227
 
880
1228
  // src/components/Tabs/Tabs.tsx
881
- var import_react12 = require("react");
882
-
883
- // src/components/Tabs/Tabs.module.css
884
- var Tabs_default = {};
885
-
886
- // src/components/Tabs/Tabs.tsx
1229
+ var import_react13 = require("react");
887
1230
  var import_jsx_runtime23 = require("react/jsx-runtime");
888
1231
  var Tabs = ({ tabs, defaultValue }) => {
889
1232
  var _a, _b;
890
- const [active, setActive] = (0, import_react12.useState)((_b = defaultValue != null ? defaultValue : (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : "");
1233
+ const [active, setActive] = (0, import_react13.useState)((_b = defaultValue != null ? defaultValue : (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : "");
1234
+ const [hovered, setHovered] = (0, import_react13.useState)(null);
891
1235
  const activeTab = tabs.find((t) => t.value === active);
892
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: Tabs_default.root, children: [
893
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: Tabs_default.list, role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
894
- "button",
895
- {
896
- role: "tab",
897
- "aria-selected": active === tab.value,
898
- className: `${Tabs_default.trigger} ${active === tab.value ? Tabs_default.active : ""}`,
899
- onClick: () => setActive(tab.value),
900
- children: [
901
- tab.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: Tabs_default["trigger-icon"], children: tab.icon }),
902
- tab.label
903
- ]
904
- },
905
- tab.value
906
- )) }),
907
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: Tabs_default.content, role: "tabpanel", children: activeTab == null ? void 0 : activeTab.content })
1236
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", flexDirection: "column" }, children: [
1237
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { role: "tablist", style: {
1238
+ display: "inline-flex",
1239
+ backgroundColor: "var(--ds-muted, #f1f5f9)",
1240
+ borderRadius: "0.5rem",
1241
+ padding: "0.25rem",
1242
+ gap: "0.125rem"
1243
+ }, children: tabs.map((tab) => {
1244
+ const isActive = active === tab.value;
1245
+ const isHovered = hovered === tab.value;
1246
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1247
+ "button",
1248
+ {
1249
+ role: "tab",
1250
+ "aria-selected": isActive,
1251
+ onClick: () => setActive(tab.value),
1252
+ onMouseEnter: () => setHovered(tab.value),
1253
+ onMouseLeave: () => setHovered(null),
1254
+ style: {
1255
+ display: "inline-flex",
1256
+ alignItems: "center",
1257
+ gap: "0.375rem",
1258
+ padding: "0.375rem 0.75rem",
1259
+ fontSize: "0.875rem",
1260
+ fontWeight: 500,
1261
+ borderRadius: "0.375rem",
1262
+ background: isActive ? "var(--ds-card, #ffffff)" : "transparent",
1263
+ border: "none",
1264
+ cursor: "pointer",
1265
+ color: isActive || isHovered ? "var(--ds-text-primary, #0f172a)" : "var(--ds-text-secondary, #64748b)",
1266
+ boxShadow: isActive ? "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)" : "none",
1267
+ transition: "color 0.15s, background-color 0.15s, box-shadow 0.15s",
1268
+ whiteSpace: "nowrap"
1269
+ },
1270
+ children: [
1271
+ tab.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { display: "flex", alignItems: "center" }, children: tab.icon }),
1272
+ tab.label
1273
+ ]
1274
+ },
1275
+ tab.value
1276
+ );
1277
+ }) }),
1278
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { role: "tabpanel", style: {
1279
+ paddingTop: "1rem",
1280
+ fontSize: "0.875rem",
1281
+ color: "var(--ds-text-secondary, #64748b)"
1282
+ }, children: activeTab == null ? void 0 : activeTab.content })
908
1283
  ] });
909
1284
  };
910
- var Tabs_default2 = Tabs;
911
-
912
- // src/components/Textarea/Textarea.module.css
913
- var Textarea_default = {};
1285
+ var Tabs_default = Tabs;
914
1286
 
915
1287
  // src/components/Textarea/Textarea.tsx
916
1288
  var import_jsx_runtime24 = require("react/jsx-runtime");
1289
+ var textareaCSS = `
1290
+ [data-ds-textarea]::placeholder { color: var(--ds-text-secondary, #64748b); }
1291
+ [data-ds-textarea]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }
1292
+ [data-ds-textarea]:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--ds-muted, #f1f5f9); }
1293
+ [data-ds-textarea][data-error="true"] { border-color: var(--ds-danger, #ef4444); }
1294
+ [data-ds-textarea][data-error="true"]:focus { border-color: var(--ds-danger, #ef4444); box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15); }
1295
+ `;
917
1296
  var Textarea = (_a) => {
918
- var _b = _a, { error, className } = _b, props = __objRest(_b, ["error", "className"]);
919
- const classes = [
920
- Textarea_default.textarea,
921
- error ? Textarea_default.error : "",
922
- className != null ? className : ""
923
- ].filter(Boolean).join(" ");
924
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("textarea", __spreadValues({ className: classes }, props));
925
- };
926
- var Textarea_default2 = Textarea;
927
-
928
- // src/components/Tooltip/Tooltip.module.css
929
- var Tooltip_default = {};
1297
+ var _b = _a, { error, style } = _b, props = __objRest(_b, ["error", "style"]);
1298
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [
1299
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("style", { href: "ds-textarea", precedence: "low", children: textareaCSS }),
1300
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1301
+ "textarea",
1302
+ __spreadValues({
1303
+ "data-ds-textarea": "",
1304
+ "data-error": error ? "true" : void 0,
1305
+ style: __spreadValues({
1306
+ width: "100%",
1307
+ padding: "0.5rem 0.75rem",
1308
+ border: `1px solid ${error ? "var(--ds-danger, #ef4444)" : "var(--ds-border, #e2e8f0)"}`,
1309
+ borderRadius: "0.375rem",
1310
+ fontSize: "0.875rem",
1311
+ backgroundColor: "var(--ds-card, #fff)",
1312
+ color: "var(--ds-text-primary, #0f172a)",
1313
+ fontFamily: "inherit",
1314
+ resize: "vertical",
1315
+ transition: "border-color 0.15s, box-shadow 0.15s",
1316
+ minHeight: "6rem",
1317
+ boxSizing: "border-box"
1318
+ }, style)
1319
+ }, props)
1320
+ )
1321
+ ] });
1322
+ };
1323
+ var Textarea_default = Textarea;
930
1324
 
931
1325
  // src/components/Tooltip/Tooltip.tsx
1326
+ var import_react14 = require("react");
932
1327
  var import_jsx_runtime25 = require("react/jsx-runtime");
933
- var Tooltip = ({ content, children, position = "top" }) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: Tooltip_default.wrapper, children: [
934
- children,
935
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${Tooltip_default.tooltip} ${Tooltip_default[position]}`, role: "tooltip", children: content })
936
- ] });
937
- var Tooltip_default2 = Tooltip;
1328
+ var positionStyle = {
1329
+ top: { bottom: "calc(100% + 8px)", left: "50%", transform: "translateX(-50%)" },
1330
+ bottom: { top: "calc(100% + 8px)", left: "50%", transform: "translateX(-50%)" },
1331
+ left: { right: "calc(100% + 8px)", top: "50%", transform: "translateY(-50%)" },
1332
+ right: { left: "calc(100% + 8px)", top: "50%", transform: "translateY(-50%)" }
1333
+ };
1334
+ var tooltipCSS = `
1335
+ [data-ds-tt]::before {
1336
+ content: '';
1337
+ position: absolute;
1338
+ border: 5px solid transparent;
1339
+ }
1340
+ [data-ds-tt="top"]::before { top: 100%; left: 50%; transform: translateX(-50%); border-top-color: var(--ds-tooltip-bg, #0f172a); }
1341
+ [data-ds-tt="bottom"]::before { bottom: 100%; left: 50%; transform: translateX(-50%); border-bottom-color: var(--ds-tooltip-bg, #0f172a); }
1342
+ [data-ds-tt="left"]::before { left: 100%; top: 50%; transform: translateY(-50%); border-left-color: var(--ds-tooltip-bg, #0f172a); }
1343
+ [data-ds-tt="right"]::before { right: 100%; top: 50%; transform: translateY(-50%); border-right-color: var(--ds-tooltip-bg, #0f172a); }
1344
+ `;
1345
+ var Tooltip = ({ content, children, position = "top" }) => {
1346
+ const [visible, setVisible] = (0, import_react14.useState)(false);
1347
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1348
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("style", { href: "ds-tooltip", precedence: "low", children: tooltipCSS }),
1349
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1350
+ "span",
1351
+ {
1352
+ style: { position: "relative", display: "inline-flex" },
1353
+ onMouseEnter: () => setVisible(true),
1354
+ onMouseLeave: () => setVisible(false),
1355
+ onFocus: () => setVisible(true),
1356
+ onBlur: () => setVisible(false),
1357
+ children: [
1358
+ children,
1359
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1360
+ "span",
1361
+ {
1362
+ role: "tooltip",
1363
+ "data-ds-tt": position,
1364
+ style: __spreadValues({
1365
+ position: "absolute",
1366
+ zIndex: 50,
1367
+ padding: "0.375rem 0.625rem",
1368
+ backgroundColor: "var(--ds-tooltip-bg, #0f172a)",
1369
+ color: "var(--ds-tooltip-text, #ffffff)",
1370
+ fontSize: "0.75rem",
1371
+ lineHeight: 1.4,
1372
+ borderRadius: "0.375rem",
1373
+ whiteSpace: "nowrap",
1374
+ pointerEvents: "none",
1375
+ opacity: visible ? 1 : 0,
1376
+ transition: "opacity 0.15s"
1377
+ }, positionStyle[position]),
1378
+ children: content
1379
+ }
1380
+ )
1381
+ ]
1382
+ }
1383
+ )
1384
+ ] });
1385
+ };
1386
+ var Tooltip_default = Tooltip;
938
1387
  // Annotate the CommonJS export names for ESM import in node:
939
1388
  0 && (module.exports = {
940
1389
  Accordion,