@efiche/design 0.1.6 → 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" },
@@ -290,14 +363,6 @@ var sizeStyles = {
290
363
  md: { padding: "0.5rem 1rem", fontSize: "0.875rem" },
291
364
  lg: { padding: "0.75rem 1.5rem", fontSize: "1rem" }
292
365
  };
293
- function injectSpinKeyframe() {
294
- if (typeof document === "undefined") return;
295
- if (document.getElementById("ds-spin-keyframe")) return;
296
- const style = document.createElement("style");
297
- style.id = "ds-spin-keyframe";
298
- style.textContent = "@keyframes ds-spin { to { transform: rotate(360deg); } }";
299
- document.head.appendChild(style);
300
- }
301
366
  var Button = (_a) => {
302
367
  var _b = _a, {
303
368
  text,
@@ -336,10 +401,7 @@ var Button = (_a) => {
336
401
  "size",
337
402
  "style"
338
403
  ]);
339
- const [hovered, setHovered] = (0, import_react3.useState)(false);
340
- (0, import_react3.useEffect)(() => {
341
- injectSpinKeyframe();
342
- }, []);
404
+ const [hovered, setHovered] = (0, import_react4.useState)(false);
343
405
  const resolvedVariant = variant != null ? variant : danger ? "danger" : warning ? "warning" : info ? "info" : success ? "success" : ghost ? "ghost" : outline ? "outline" : "solid";
344
406
  const resolvedSize = size != null ? size : small ? "sm" : large ? "lg" : "md";
345
407
  const isDisabled = disabled || loading;
@@ -357,68 +419,86 @@ var Button = (_a) => {
357
419
  opacity: isDisabled ? 0.5 : 1,
358
420
  pointerEvents: loading ? "none" : void 0
359
421
  }, variantStyles[resolvedVariant]), sizeStyles[resolvedSize]), hovered && !isDisabled ? variantHoverStyles[resolvedVariant] : {}), styleProp);
360
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
361
- "button",
362
- __spreadProps(__spreadValues({
363
- disabled: isDisabled,
364
- style: computedStyle,
365
- onMouseEnter: () => setHovered(true),
366
- onMouseLeave: () => setHovered(false)
367
- }, props), {
368
- children: [
369
- loading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
370
- import_lucide_react4.LoaderCircle,
371
- {
372
- "aria-hidden": true,
373
- style: { width: "1em", height: "1em", animation: "ds-spin 0.75s linear infinite" }
374
- }
375
- ) : null,
376
- showIcon && iconPosition === "left" ? icon : null,
377
- content,
378
- showIcon && iconPosition === "right" ? icon : null
379
- ]
380
- })
381
- );
422
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
423
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("style", { href: "ds-spin", precedence: "low", children: `@keyframes ds-spin { to { transform: rotate(360deg); } }` }),
424
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
425
+ "button",
426
+ __spreadProps(__spreadValues({
427
+ disabled: isDisabled,
428
+ style: computedStyle,
429
+ onMouseEnter: () => setHovered(true),
430
+ onMouseLeave: () => setHovered(false)
431
+ }, props), {
432
+ children: [
433
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
434
+ import_lucide_react4.LoaderCircle,
435
+ {
436
+ "aria-hidden": true,
437
+ style: { width: "1em", height: "1em", animation: "ds-spin 0.75s linear infinite" }
438
+ }
439
+ ) : null,
440
+ showIcon && iconPosition === "left" ? icon : null,
441
+ content,
442
+ showIcon && iconPosition === "right" ? icon : null
443
+ ]
444
+ })
445
+ )
446
+ ] });
382
447
  };
383
448
  var Button_default = Button;
384
449
 
385
- // src/components/Card/Card.module.css
386
- var Card_default = {};
387
-
388
450
  // src/components/Card/Card.tsx
389
451
  var import_jsx_runtime8 = require("react/jsx-runtime");
390
452
  var Card = (_a) => {
391
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
392
- 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));
393
459
  };
394
460
  var CardHeader = (_a) => {
395
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
396
- 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));
397
468
  };
398
469
  var CardTitle = (_a) => {
399
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
400
- 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));
401
478
  };
402
479
  var CardDescription = (_a) => {
403
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
404
- 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));
405
486
  };
406
487
  var CardContent = (_a) => {
407
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
408
- 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));
409
490
  };
410
491
  var CardFooter = (_a) => {
411
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
412
- 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));
413
498
  };
414
499
 
415
500
  // src/components/Checkbox/Checkbox.tsx
416
- var import_react4 = require("react");
417
-
418
- // src/components/Checkbox/Checkbox.module.css
419
- var Checkbox_default = {};
420
-
421
- // src/components/Checkbox/Checkbox.tsx
501
+ var import_react5 = require("react");
422
502
  var import_jsx_runtime9 = require("react/jsx-runtime");
423
503
  var Checkbox = ({
424
504
  label,
@@ -428,7 +508,7 @@ var Checkbox = ({
428
508
  id,
429
509
  onChange
430
510
  }) => {
431
- const [internal, setInternal] = (0, import_react4.useState)(defaultChecked);
511
+ const [internal, setInternal] = (0, import_react5.useState)(defaultChecked);
432
512
  const isChecked = checked !== void 0 ? checked : internal;
433
513
  const handleChange = () => {
434
514
  if (disabled) return;
@@ -436,7 +516,14 @@ var Checkbox = ({
436
516
  setInternal(next);
437
517
  onChange == null ? void 0 : onChange(next);
438
518
  };
439
- 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: [
440
527
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
441
528
  "input",
442
529
  {
@@ -445,26 +532,33 @@ var Checkbox = ({
445
532
  checked: isChecked,
446
533
  disabled,
447
534
  onChange: handleChange,
448
- className: Checkbox_default.input
535
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
449
536
  }
450
537
  ),
451
- /* @__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" }) }) }),
452
- 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 })
453
551
  ] });
454
552
  };
455
- var Checkbox_default2 = Checkbox;
553
+ var Checkbox_default = Checkbox;
456
554
 
457
555
  // src/components/CopyButton/CopyButton.tsx
458
556
  var import_lucide_react5 = require("lucide-react");
459
- var import_react5 = require("react");
460
-
461
- // src/components/CopyButton/CopyButton.module.css
462
- var CopyButton_default = {};
463
-
464
- // src/components/CopyButton/CopyButton.tsx
557
+ var import_react6 = require("react");
465
558
  var import_jsx_runtime10 = require("react/jsx-runtime");
466
559
  var CopyButton = ({ text }) => {
467
- 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);
468
562
  const handleCopy = () => {
469
563
  navigator.clipboard.writeText(text);
470
564
  setCopied(true);
@@ -473,40 +567,51 @@ var CopyButton = ({ text }) => {
473
567
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
474
568
  "button",
475
569
  {
476
- className: CopyButton_default.copyButton,
477
570
  onClick: handleCopy,
571
+ onMouseEnter: () => setHovered(true),
572
+ onMouseLeave: () => setHovered(false),
478
573
  "aria-label": copied ? "Copied" : `Copy ${text}`,
479
- 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" } })
480
587
  }
481
588
  );
482
589
  };
483
- var CopyButton_default2 = CopyButton;
590
+ var CopyButton_default = CopyButton;
484
591
 
485
592
  // src/components/FileUpload/FileUpload.tsx
486
593
  var import_lucide_react6 = require("lucide-react");
487
- var import_react6 = require("react");
488
-
489
- // src/components/FileUpload/FileUpload.module.css
490
- var FileUpload_default = {};
491
-
492
- // src/components/FileUpload/FileUpload.tsx
594
+ var import_react7 = require("react");
493
595
  var import_jsx_runtime11 = require("react/jsx-runtime");
494
596
  var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
495
- const [isDragging, setIsDragging] = (0, import_react6.useState)(false);
496
- const [fileNames, setFileNames] = (0, import_react6.useState)([]);
497
- 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);
498
601
  const handleFiles = (list) => {
499
602
  setFileNames(Array.from(list).map((f) => f.name));
500
603
  onFileSelect == null ? void 0 : onFileSelect(list);
501
604
  };
605
+ const isActive = isDragging || isHovered;
502
606
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
503
607
  "div",
504
608
  {
505
- className: `${FileUpload_default.zone} ${isDragging ? FileUpload_default.dragging : ""} ${disabled ? FileUpload_default.disabled : ""}`,
506
609
  onClick: () => {
507
610
  var _a;
508
611
  return !disabled && ((_a = inputRef.current) == null ? void 0 : _a.click());
509
612
  },
613
+ onMouseEnter: () => !disabled && setIsHovered(true),
614
+ onMouseLeave: () => setIsHovered(false),
510
615
  onDragOver: (e) => {
511
616
  e.preventDefault();
512
617
  setIsDragging(true);
@@ -517,6 +622,20 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
517
622
  setIsDragging(false);
518
623
  if (!disabled && e.dataTransfer.files.length) handleFiles(e.dataTransfer.files);
519
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
+ },
520
639
  children: [
521
640
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
522
641
  "input",
@@ -526,12 +645,12 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
526
645
  accept,
527
646
  multiple,
528
647
  disabled,
529
- className: FileUpload_default.input,
648
+ style: { display: "none" },
530
649
  onChange: (e) => e.target.files && handleFiles(e.target.files)
531
650
  }
532
651
  ),
533
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Upload, { size: 32, className: FileUpload_default.icon }),
534
- 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: [
535
654
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "Click to upload" }),
536
655
  " or drag and drop"
537
656
  ] })
@@ -539,65 +658,91 @@ var FileUpload = ({ accept, multiple, disabled, onFileSelect }) => {
539
658
  }
540
659
  );
541
660
  };
542
- var FileUpload_default2 = FileUpload;
543
-
544
- // src/components/Input/Input.module.css
545
- var Input_default = {};
661
+ var FileUpload_default = FileUpload;
546
662
 
547
663
  // src/components/Input/Input.tsx
548
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
+ `;
549
672
  var Input = (_a) => {
550
- var _b = _a, {
551
- error,
552
- success,
553
- leftIcon,
554
- rightIcon,
555
- className
556
- } = _b, props = __objRest(_b, [
557
- "error",
558
- "success",
559
- "leftIcon",
560
- "rightIcon",
561
- "className"
562
- ]);
563
- const wrapperClasses = [
564
- Input_default.wrapper,
565
- error ? Input_default.error : "",
566
- success ? Input_default.success : "",
567
- leftIcon ? Input_default.hasLeft : "",
568
- rightIcon ? Input_default.hasRight : "",
569
- className != null ? className : ""
570
- ].filter(Boolean).join(" ");
571
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: wrapperClasses, children: [
572
- leftIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: Input_default.leftIcon, children: leftIcon }),
573
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("input", __spreadValues({ className: Input_default.input }, props)),
574
- 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
+ ] })
575
717
  ] });
576
718
  };
577
- var Input_default2 = Input;
578
-
579
- // src/components/Label/Label.module.css
580
- var Label_default = {};
719
+ var Input_default = Input;
581
720
 
582
721
  // src/components/Label/Label.tsx
583
722
  var import_jsx_runtime13 = require("react/jsx-runtime");
584
723
  var Label = (_a) => {
585
- var _b = _a, { children, required, className } = _b, props = __objRest(_b, ["children", "required", "className"]);
586
- 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: [
587
732
  children,
588
- 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: "*" })
589
734
  ] }));
590
735
  };
591
- var Label_default2 = Label;
736
+ var Label_default = Label;
592
737
 
593
738
  // src/components/PasswordInput/PasswordInput.tsx
594
739
  var import_lucide_react7 = require("lucide-react");
595
- var import_react7 = require("react");
740
+ var import_react8 = require("react");
596
741
  var import_jsx_runtime14 = require("react/jsx-runtime");
597
742
  var PasswordInput = (props) => {
598
- const [visible, setVisible] = (0, import_react7.useState)(false);
743
+ const [visible, setVisible] = (0, import_react8.useState)(false);
599
744
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
600
- Input_default2,
745
+ Input_default,
601
746
  __spreadProps(__spreadValues({}, props), {
602
747
  type: visible ? "text" : "password",
603
748
  rightIcon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
@@ -615,9 +760,6 @@ var PasswordInput = (props) => {
615
760
  };
616
761
  var PasswordInput_default = PasswordInput;
617
762
 
618
- // src/components/Progress/Progress.module.css
619
- var Progress_default = {};
620
-
621
763
  // src/components/Progress/Progress.tsx
622
764
  var import_jsx_runtime15 = require("react/jsx-runtime");
623
765
  var Progress = ({ value = 0 }) => {
@@ -625,24 +767,31 @@ var Progress = ({ value = 0 }) => {
625
767
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
626
768
  "div",
627
769
  {
628
- className: Progress_default.track,
629
770
  role: "progressbar",
630
771
  "aria-valuenow": pct,
631
772
  "aria-valuemin": 0,
632
773
  "aria-valuemax": 100,
633
- 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
+ } })
634
788
  }
635
789
  );
636
790
  };
637
- var Progress_default2 = Progress;
638
-
639
- // src/components/RadioGroup/RadioGroup.tsx
640
- var import_react8 = require("react");
641
-
642
- // src/components/RadioGroup/RadioGroup.module.css
643
- var RadioGroup_default = {};
791
+ var Progress_default = Progress;
644
792
 
645
793
  // src/components/RadioGroup/RadioGroup.tsx
794
+ var import_react9 = require("react");
646
795
  var import_jsx_runtime16 = require("react/jsx-runtime");
647
796
  var RadioGroup = ({
648
797
  options,
@@ -652,48 +801,65 @@ var RadioGroup = ({
652
801
  disabled,
653
802
  onChange
654
803
  }) => {
655
- const [internal, setInternal] = (0, import_react8.useState)(defaultValue);
804
+ const [internal, setInternal] = (0, import_react9.useState)(defaultValue);
656
805
  const selected = value !== void 0 ? value : internal;
657
806
  const handleChange = (val) => {
658
807
  if (disabled) return;
659
808
  setInternal(val);
660
809
  onChange == null ? void 0 : onChange(val);
661
810
  };
662
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: RadioGroup_default.group, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
663
- "label",
664
- {
665
- className: `${RadioGroup_default.item} ${disabled ? RadioGroup_default.disabled : ""}`,
666
- children: [
667
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
668
- "input",
669
- {
670
- type: "radio",
671
- name,
672
- value: option.value,
673
- checked: selected === option.value,
674
- disabled,
675
- onChange: () => handleChange(option.value),
676
- className: RadioGroup_default.input
677
- }
678
- ),
679
- /* @__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 }) }),
680
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: RadioGroup_default.label, children: option.label })
681
- ]
682
- },
683
- option.value
684
- )) });
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
+ }) });
685
853
  };
686
- var RadioGroup_default2 = RadioGroup;
854
+ var RadioGroup_default = RadioGroup;
687
855
 
688
856
  // src/components/Select/Select.tsx
689
857
  var import_lucide_react8 = require("lucide-react");
690
- var import_react9 = require("react");
691
-
692
- // src/components/Select/Select.module.css
693
- var Select_default = {};
694
-
695
- // src/components/Select/Select.tsx
858
+ var import_react10 = require("react");
696
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
+ `;
697
863
  var Select = ({
698
864
  options,
699
865
  value,
@@ -703,9 +869,10 @@ var Select = ({
703
869
  onChange
704
870
  }) => {
705
871
  var _a;
706
- const [internal, setInternal] = (0, import_react9.useState)(defaultValue);
707
- const [open, setOpen] = (0, import_react9.useState)(false);
708
- 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);
709
876
  const selected = value !== void 0 ? value : internal;
710
877
  const selectedLabel = (_a = options.find((o) => o.value === selected)) == null ? void 0 : _a.label;
711
878
  const handleSelect = (val) => {
@@ -713,66 +880,175 @@ var Select = ({
713
880
  setOpen(false);
714
881
  onChange == null ? void 0 : onChange(val);
715
882
  };
716
- (0, import_react9.useEffect)(() => {
883
+ (0, import_react10.useEffect)(() => {
717
884
  const handleOutside = (e) => {
718
885
  if (ref.current && !ref.current.contains(e.target)) setOpen(false);
719
886
  };
720
887
  document.addEventListener("mousedown", handleOutside);
721
888
  return () => document.removeEventListener("mousedown", handleOutside);
722
889
  }, []);
723
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { ref, className: `${Select_default.wrapper} ${disabled ? Select_default.disabled : ""}`, children: [
724
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
725
- "button",
726
- {
727
- type: "button",
728
- className: `${Select_default.trigger} ${open ? Select_default.open : ""}`,
729
- onClick: () => !disabled && setOpen((o) => !o),
730
- disabled,
731
- children: [
732
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: selectedLabel ? Select_default.value : Select_default.placeholder, children: selectedLabel != null ? selectedLabel : placeholder }),
733
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.ChevronDown, { size: 16, className: `${Select_default.chevron} ${open ? Select_default.chevronOpen : ""}` })
734
- ]
735
- }
736
- ),
737
- open && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: Select_default.dropdown, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
738
- "div",
739
- {
740
- className: `${Select_default.option} ${selected === option.value ? Select_default.selected : ""}`,
741
- onClick: () => handleSelect(option.value),
742
- children: [
743
- 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 }),
744
- option.label
745
- ]
746
- },
747
- option.value
748
- )) })
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
+ ] })
749
981
  ] });
750
982
  };
751
- var Select_default2 = Select;
752
-
753
- // src/components/Skeleton/Skeleton.module.css
754
- var Skeleton_default = {};
983
+ var Select_default = Select;
755
984
 
756
985
  // src/components/Skeleton/Skeleton.tsx
757
986
  var import_jsx_runtime18 = require("react/jsx-runtime");
758
- var Skeleton = ({ height = "1rem", width = "100%", circle = false }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
759
- "div",
760
- {
761
- className: `${Skeleton_default.skeleton} ${circle ? Skeleton_default.circle : ""}`,
762
- style: { height, width },
763
- "aria-hidden": "true"
764
- }
765
- );
766
- var Skeleton_default2 = Skeleton;
767
-
768
- // src/components/Slider/Slider.tsx
769
- var import_react10 = require("react");
770
-
771
- // src/components/Slider/Slider.module.css
772
- 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;
773
1007
 
774
1008
  // src/components/Slider/Slider.tsx
1009
+ var import_react11 = require("react");
775
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
+ `;
776
1052
  var Slider = ({
777
1053
  value,
778
1054
  defaultValue = 50,
@@ -782,7 +1058,7 @@ var Slider = ({
782
1058
  disabled,
783
1059
  onChange
784
1060
  }) => {
785
- const [internal, setInternal] = (0, import_react10.useState)(defaultValue);
1061
+ const [internal, setInternal] = (0, import_react11.useState)(defaultValue);
786
1062
  const current = value !== void 0 ? value : internal;
787
1063
  const fill = `${(current - min) / (max - min) * 100}%`;
788
1064
  const handleChange = (e) => {
@@ -790,42 +1066,49 @@ var Slider = ({
790
1066
  setInternal(val);
791
1067
  onChange == null ? void 0 : onChange(val);
792
1068
  };
793
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: `${Slider_default.wrapper} ${disabled ? Slider_default.disabled : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
794
- "input",
795
- {
796
- type: "range",
797
- min,
798
- max,
799
- step,
800
- value: current,
801
- disabled,
802
- onChange: handleChange,
803
- className: Slider_default.range,
804
- style: { "--fill": fill }
805
- }
806
- ) });
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
+ ] });
807
1090
  };
808
- var Slider_default2 = Slider;
1091
+ var Slider_default = Slider;
809
1092
 
810
1093
  // src/components/Spinner/Spinner.tsx
811
1094
  var import_lucide_react9 = require("lucide-react");
812
-
813
- // src/components/Spinner/Spinner.module.css
814
- var Spinner_default = {};
815
-
816
- // src/components/Spinner/Spinner.tsx
817
1095
  var import_jsx_runtime20 = require("react/jsx-runtime");
818
1096
  var sizePx = { sm: 16, md: 24, lg: 32 };
819
- var Spinner = ({ size = "md" }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react9.Loader2, { size: sizePx[size], className: Spinner_default.spinner, "aria-label": "Loading" });
820
- var Spinner_default2 = Spinner;
821
-
822
- // src/components/Switch/Switch.tsx
823
- var import_react11 = require("react");
824
-
825
- // src/components/Switch/Switch.module.css
826
- 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;
827
1109
 
828
1110
  // src/components/Switch/Switch.tsx
1111
+ var import_react12 = require("react");
829
1112
  var import_jsx_runtime21 = require("react/jsx-runtime");
830
1113
  var Switch = ({
831
1114
  label,
@@ -835,7 +1118,7 @@ var Switch = ({
835
1118
  id,
836
1119
  onChange
837
1120
  }) => {
838
- const [internal, setInternal] = (0, import_react11.useState)(defaultChecked);
1121
+ const [internal, setInternal] = (0, import_react12.useState)(defaultChecked);
839
1122
  const isOn = checked !== void 0 ? checked : internal;
840
1123
  const handleToggle = () => {
841
1124
  if (disabled) return;
@@ -843,7 +1126,14 @@ var Switch = ({
843
1126
  setInternal(next);
844
1127
  onChange == null ? void 0 : onChange(next);
845
1128
  };
846
- 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: [
847
1137
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
848
1138
  "input",
849
1139
  {
@@ -852,97 +1142,248 @@ var Switch = ({
852
1142
  checked: isOn,
853
1143
  disabled,
854
1144
  onChange: handleToggle,
855
- className: Switch_default.input
1145
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
856
1146
  }
857
1147
  ),
858
- /* @__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 : ""}` }) }),
859
- 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 })
860
1169
  ] });
861
1170
  };
862
- var Switch_default2 = Switch;
863
-
864
- // src/components/Table/Table.module.css
865
- var Table_default = {};
1171
+ var Switch_default = Switch;
866
1172
 
867
1173
  // src/components/Table/Table.tsx
868
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
+ `;
869
1178
  var Table = (_a) => {
870
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
871
- 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
+ ] });
872
1193
  };
873
1194
  var TableHead = (props) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("thead", __spreadValues({}, props));
874
1195
  var TableBody = (props) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("tbody", __spreadValues({}, props));
875
1196
  var TableRow = (_a) => {
876
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
877
- 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));
878
1199
  };
879
1200
  var TableHeader = (_a) => {
880
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
881
- 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));
882
1211
  };
883
1212
  var TableCell = (_a) => {
884
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
885
- 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
+ );
886
1226
  };
887
1227
 
888
1228
  // src/components/Tabs/Tabs.tsx
889
- var import_react12 = require("react");
890
-
891
- // src/components/Tabs/Tabs.module.css
892
- var Tabs_default = {};
893
-
894
- // src/components/Tabs/Tabs.tsx
1229
+ var import_react13 = require("react");
895
1230
  var import_jsx_runtime23 = require("react/jsx-runtime");
896
1231
  var Tabs = ({ tabs, defaultValue }) => {
897
1232
  var _a, _b;
898
- 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);
899
1235
  const activeTab = tabs.find((t) => t.value === active);
900
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: Tabs_default.root, children: [
901
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: Tabs_default.list, role: "tablist", children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
902
- "button",
903
- {
904
- role: "tab",
905
- "aria-selected": active === tab.value,
906
- className: `${Tabs_default.trigger} ${active === tab.value ? Tabs_default.active : ""}`,
907
- onClick: () => setActive(tab.value),
908
- children: [
909
- tab.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: Tabs_default["trigger-icon"], children: tab.icon }),
910
- tab.label
911
- ]
912
- },
913
- tab.value
914
- )) }),
915
- /* @__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 })
916
1283
  ] });
917
1284
  };
918
- var Tabs_default2 = Tabs;
919
-
920
- // src/components/Textarea/Textarea.module.css
921
- var Textarea_default = {};
1285
+ var Tabs_default = Tabs;
922
1286
 
923
1287
  // src/components/Textarea/Textarea.tsx
924
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
+ `;
925
1296
  var Textarea = (_a) => {
926
- var _b = _a, { error, className } = _b, props = __objRest(_b, ["error", "className"]);
927
- const classes = [
928
- Textarea_default.textarea,
929
- error ? Textarea_default.error : "",
930
- className != null ? className : ""
931
- ].filter(Boolean).join(" ");
932
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("textarea", __spreadValues({ className: classes }, props));
933
- };
934
- var Textarea_default2 = Textarea;
935
-
936
- // src/components/Tooltip/Tooltip.module.css
937
- 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;
938
1324
 
939
1325
  // src/components/Tooltip/Tooltip.tsx
1326
+ var import_react14 = require("react");
940
1327
  var import_jsx_runtime25 = require("react/jsx-runtime");
941
- var Tooltip = ({ content, children, position = "top" }) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: Tooltip_default.wrapper, children: [
942
- children,
943
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `${Tooltip_default.tooltip} ${Tooltip_default[position]}`, role: "tooltip", children: content })
944
- ] });
945
- 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;
946
1387
  // Annotate the CommonJS export names for ESM import in node:
947
1388
  0 && (module.exports = {
948
1389
  Accordion,