@craftzbay/ui 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +14 -8
  2. package/dist-lib/__tests__/helpers/color.d.ts +9 -0
  3. package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
  4. package/dist-lib/components/ui/Accordion.js +18 -7
  5. package/dist-lib/components/ui/Accordion.js.map +1 -1
  6. package/dist-lib/components/ui/Alert.d.ts +16 -0
  7. package/dist-lib/components/ui/Alert.js +47 -34
  8. package/dist-lib/components/ui/Alert.js.map +1 -1
  9. package/dist-lib/components/ui/Avatar.d.ts +1 -1
  10. package/dist-lib/components/ui/Avatar.js +45 -47
  11. package/dist-lib/components/ui/Avatar.js.map +1 -1
  12. package/dist-lib/components/ui/Badge.d.ts +3 -1
  13. package/dist-lib/components/ui/Badge.js +24 -15
  14. package/dist-lib/components/ui/Badge.js.map +1 -1
  15. package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
  16. package/dist-lib/components/ui/Breadcrumbs.js +46 -28
  17. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -1
  18. package/dist-lib/components/ui/Button.d.ts +5 -3
  19. package/dist-lib/components/ui/Button.js +59 -45
  20. package/dist-lib/components/ui/Button.js.map +1 -1
  21. package/dist-lib/components/ui/Calendar.d.ts +1 -1
  22. package/dist-lib/components/ui/Calendar.js +87 -59
  23. package/dist-lib/components/ui/Calendar.js.map +1 -1
  24. package/dist-lib/components/ui/Card.d.ts +2 -0
  25. package/dist-lib/components/ui/Card.js +48 -67
  26. package/dist-lib/components/ui/Card.js.map +1 -1
  27. package/dist-lib/components/ui/Carousel.d.ts +6 -6
  28. package/dist-lib/components/ui/Carousel.js +133 -102
  29. package/dist-lib/components/ui/Carousel.js.map +1 -1
  30. package/dist-lib/components/ui/Chart.d.ts +49 -10
  31. package/dist-lib/components/ui/Chart.js +415 -181
  32. package/dist-lib/components/ui/Chart.js.map +1 -1
  33. package/dist-lib/components/ui/Checkbox.js +42 -28
  34. package/dist-lib/components/ui/Checkbox.js.map +1 -1
  35. package/dist-lib/components/ui/Combobox.d.ts +2 -0
  36. package/dist-lib/components/ui/Combobox.js +142 -111
  37. package/dist-lib/components/ui/Combobox.js.map +1 -1
  38. package/dist-lib/components/ui/CommandPalette.d.ts +6 -3
  39. package/dist-lib/components/ui/CommandPalette.js +92 -87
  40. package/dist-lib/components/ui/CommandPalette.js.map +1 -1
  41. package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
  42. package/dist-lib/components/ui/ContextMenu.js +77 -62
  43. package/dist-lib/components/ui/ContextMenu.js.map +1 -1
  44. package/dist-lib/components/ui/DataGrid.d.ts +17 -4
  45. package/dist-lib/components/ui/DataGrid.js +65 -50
  46. package/dist-lib/components/ui/DataGrid.js.map +1 -1
  47. package/dist-lib/components/ui/DatePicker.js +118 -99
  48. package/dist-lib/components/ui/DatePicker.js.map +1 -1
  49. package/dist-lib/components/ui/DesignSystemProvider.d.ts +94 -40
  50. package/dist-lib/components/ui/DesignSystemProvider.js +111 -55
  51. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -1
  52. package/dist-lib/components/ui/Dialog.d.ts +18 -3
  53. package/dist-lib/components/ui/Dialog.js +105 -80
  54. package/dist-lib/components/ui/Dialog.js.map +1 -1
  55. package/dist-lib/components/ui/Drawer.d.ts +17 -2
  56. package/dist-lib/components/ui/Drawer.js +89 -55
  57. package/dist-lib/components/ui/Drawer.js.map +1 -1
  58. package/dist-lib/components/ui/DropdownMenu.js +14 -9
  59. package/dist-lib/components/ui/DropdownMenu.js.map +1 -1
  60. package/dist-lib/components/ui/EmptyState.d.ts +2 -0
  61. package/dist-lib/components/ui/EmptyState.js +30 -16
  62. package/dist-lib/components/ui/EmptyState.js.map +1 -1
  63. package/dist-lib/components/ui/ErrorState.d.ts +13 -2
  64. package/dist-lib/components/ui/ErrorState.js +44 -23
  65. package/dist-lib/components/ui/ErrorState.js.map +1 -1
  66. package/dist-lib/components/ui/FileUpload.js +59 -56
  67. package/dist-lib/components/ui/FileUpload.js.map +1 -1
  68. package/dist-lib/components/ui/Form.d.ts +15 -2
  69. package/dist-lib/components/ui/Form.js +97 -71
  70. package/dist-lib/components/ui/Form.js.map +1 -1
  71. package/dist-lib/components/ui/Icon.d.ts +1 -1
  72. package/dist-lib/components/ui/Icon.js +20 -14
  73. package/dist-lib/components/ui/Icon.js.map +1 -1
  74. package/dist-lib/components/ui/IconButton.d.ts +2 -2
  75. package/dist-lib/components/ui/IconButton.js +28 -20
  76. package/dist-lib/components/ui/IconButton.js.map +1 -1
  77. package/dist-lib/components/ui/Input.d.ts +3 -1
  78. package/dist-lib/components/ui/Input.js +92 -78
  79. package/dist-lib/components/ui/Input.js.map +1 -1
  80. package/dist-lib/components/ui/Kbd.js +1 -1
  81. package/dist-lib/components/ui/Kbd.js.map +1 -1
  82. package/dist-lib/components/ui/MultiSelect.js +121 -107
  83. package/dist-lib/components/ui/MultiSelect.js.map +1 -1
  84. package/dist-lib/components/ui/Pagination.js +67 -62
  85. package/dist-lib/components/ui/Pagination.js.map +1 -1
  86. package/dist-lib/components/ui/Popover.js +14 -14
  87. package/dist-lib/components/ui/Popover.js.map +1 -1
  88. package/dist-lib/components/ui/Progress.d.ts +3 -3
  89. package/dist-lib/components/ui/Progress.js +77 -72
  90. package/dist-lib/components/ui/Progress.js.map +1 -1
  91. package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
  92. package/dist-lib/components/ui/RadioGroup.js +69 -52
  93. package/dist-lib/components/ui/RadioGroup.js.map +1 -1
  94. package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
  95. package/dist-lib/components/ui/RelativeTime.js +31 -0
  96. package/dist-lib/components/ui/RelativeTime.js.map +1 -0
  97. package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
  98. package/dist-lib/components/ui/ScrollArea.js +43 -27
  99. package/dist-lib/components/ui/ScrollArea.js.map +1 -1
  100. package/dist-lib/components/ui/Select.d.ts +6 -1
  101. package/dist-lib/components/ui/Select.js +79 -71
  102. package/dist-lib/components/ui/Select.js.map +1 -1
  103. package/dist-lib/components/ui/Separator.js +1 -1
  104. package/dist-lib/components/ui/Separator.js.map +1 -1
  105. package/dist-lib/components/ui/Sheet.d.ts +9 -0
  106. package/dist-lib/components/ui/Sheet.js +69 -46
  107. package/dist-lib/components/ui/Sheet.js.map +1 -1
  108. package/dist-lib/components/ui/Sidebar.d.ts +12 -9
  109. package/dist-lib/components/ui/Sidebar.js +152 -109
  110. package/dist-lib/components/ui/Sidebar.js.map +1 -1
  111. package/dist-lib/components/ui/Skeleton.d.ts +13 -2
  112. package/dist-lib/components/ui/Skeleton.js +15 -14
  113. package/dist-lib/components/ui/Skeleton.js.map +1 -1
  114. package/dist-lib/components/ui/Slider.js +41 -29
  115. package/dist-lib/components/ui/Slider.js.map +1 -1
  116. package/dist-lib/components/ui/Snackbar.js +23 -22
  117. package/dist-lib/components/ui/Snackbar.js.map +1 -1
  118. package/dist-lib/components/ui/Spinner.js +18 -6
  119. package/dist-lib/components/ui/Spinner.js.map +1 -1
  120. package/dist-lib/components/ui/Stepper.d.ts +6 -0
  121. package/dist-lib/components/ui/Stepper.js +71 -48
  122. package/dist-lib/components/ui/Stepper.js.map +1 -1
  123. package/dist-lib/components/ui/Switch.js +46 -43
  124. package/dist-lib/components/ui/Switch.js.map +1 -1
  125. package/dist-lib/components/ui/Table.d.ts +33 -5
  126. package/dist-lib/components/ui/Table.js +141 -119
  127. package/dist-lib/components/ui/Table.js.map +1 -1
  128. package/dist-lib/components/ui/Tabs.js +50 -48
  129. package/dist-lib/components/ui/Tabs.js.map +1 -1
  130. package/dist-lib/components/ui/TagInput.js +45 -45
  131. package/dist-lib/components/ui/TagInput.js.map +1 -1
  132. package/dist-lib/components/ui/Textarea.js +65 -54
  133. package/dist-lib/components/ui/Textarea.js.map +1 -1
  134. package/dist-lib/components/ui/Timeline.js +39 -35
  135. package/dist-lib/components/ui/Timeline.js.map +1 -1
  136. package/dist-lib/components/ui/Toast.js +44 -57
  137. package/dist-lib/components/ui/Toast.js.map +1 -1
  138. package/dist-lib/components/ui/Tooltip.d.ts +4 -1
  139. package/dist-lib/components/ui/Tooltip.js +24 -22
  140. package/dist-lib/components/ui/Tooltip.js.map +1 -1
  141. package/dist-lib/components/ui/TopNav.d.ts +7 -3
  142. package/dist-lib/components/ui/TopNav.js +35 -25
  143. package/dist-lib/components/ui/TopNav.js.map +1 -1
  144. package/dist-lib/components/ui/Tree.d.ts +15 -10
  145. package/dist-lib/components/ui/Tree.js +82 -79
  146. package/dist-lib/components/ui/Tree.js.map +1 -1
  147. package/dist-lib/hooks/use-debounce.d.ts +19 -0
  148. package/dist-lib/hooks/use-debounce.js +36 -0
  149. package/dist-lib/hooks/use-debounce.js.map +1 -0
  150. package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
  151. package/dist-lib/hooks/use-delayed-loading.js +20 -0
  152. package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
  153. package/dist-lib/hooks/use-field-ids.d.ts +2 -1
  154. package/dist-lib/hooks/use-field-ids.js +9 -9
  155. package/dist-lib/hooks/use-field-ids.js.map +1 -1
  156. package/dist-lib/hooks/use-media-query.d.ts +3 -1
  157. package/dist-lib/hooks/use-media-query.js +16 -12
  158. package/dist-lib/hooks/use-media-query.js.map +1 -1
  159. package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
  160. package/dist-lib/hooks/use-modifier-key.js +19 -0
  161. package/dist-lib/hooks/use-modifier-key.js.map +1 -0
  162. package/dist-lib/hooks/use-toast.d.ts +7 -2
  163. package/dist-lib/hooks/use-toast.js +61 -30
  164. package/dist-lib/hooks/use-toast.js.map +1 -1
  165. package/dist-lib/icons/index.d.ts +9 -0
  166. package/dist-lib/icons/index.js +148 -130
  167. package/dist-lib/icons/index.js.map +1 -1
  168. package/dist-lib/illustrations/index.d.ts +1 -0
  169. package/dist-lib/illustrations/index.js +15 -6
  170. package/dist-lib/illustrations/index.js.map +1 -1
  171. package/dist-lib/index.d.ts +6 -0
  172. package/dist-lib/index.js +280 -260
  173. package/dist-lib/index.js.map +1 -1
  174. package/dist-lib/lib/format.d.ts +65 -0
  175. package/dist-lib/lib/format.js +95 -0
  176. package/dist-lib/lib/format.js.map +1 -0
  177. package/dist-lib/lib/return-focus.d.ts +11 -0
  178. package/dist-lib/lib/return-focus.js +12 -0
  179. package/dist-lib/lib/return-focus.js.map +1 -0
  180. package/dist-lib/lib/strings.d.ts +62 -1
  181. package/dist-lib/lib/strings.js +75 -19
  182. package/dist-lib/lib/strings.js.map +1 -1
  183. package/dist-lib/lib/strings.mn.js +50 -5
  184. package/dist-lib/lib/strings.mn.js.map +1 -1
  185. package/dist-lib/styles.css +1 -1
  186. package/dist-lib/theme.css +141 -78
  187. package/package.json +10 -3
@@ -1,76 +1,99 @@
1
1
  "use client";
2
- import { jsx as l, jsxs as n } from "react/jsx-runtime";
3
- import { forwardRef as p } from "react";
4
- import { Check as u } from "../../icons/index.js";
2
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
3
+ import { forwardRef as b } from "react";
4
+ import { Check as h } from "../../icons/index.js";
5
5
  import { cn as e } from "../../lib/utils.js";
6
- import { useStrings as g } from "../../hooks/use-strings.js";
7
- const b = p(function({ steps: o, current: c, orientation: t = "horizontal", className: d, ...i }, f) {
8
- const x = g();
9
- return /* @__PURE__ */ l(
6
+ import { useStrings as N } from "../../hooks/use-strings.js";
7
+ const z = b(function({
8
+ steps: i,
9
+ current: a,
10
+ orientation: t = "horizontal",
11
+ stateLabels: p,
12
+ className: d,
13
+ "aria-label": f,
14
+ ...x
15
+ }, u) {
16
+ const n = N(), g = p ?? {
17
+ complete: n.stepper.complete,
18
+ current: n.stepper.current,
19
+ upcoming: n.stepper.upcoming
20
+ };
21
+ return /* @__PURE__ */ s(
10
22
  "ol",
11
23
  {
12
- ref: f,
13
- "aria-label": i["aria-label"] ?? x.stepper.label,
24
+ ref: u,
25
+ "aria-label": f ?? n.stepper.label,
14
26
  className: e(
15
27
  t === "horizontal" ? "flex w-full items-center" : "flex flex-col gap-6",
16
28
  d
17
29
  ),
18
- ...i,
19
- children: o.map((s, r) => {
20
- const a = r < c ? "complete" : r === c ? "current" : "upcoming", m = r === o.length - 1;
21
- return /* @__PURE__ */ n(
30
+ ...x,
31
+ children: i.map((o, r) => {
32
+ const l = r < a ? "complete" : r === a ? "current" : "upcoming", m = r === i.length - 1;
33
+ return /* @__PURE__ */ c(
22
34
  "li",
23
35
  {
24
- "aria-current": a === "current" ? "step" : void 0,
36
+ "aria-current": l === "current" ? "step" : void 0,
25
37
  className: e(
26
38
  t === "horizontal" ? "flex flex-1 items-center gap-3 last:flex-initial" : "flex items-start gap-3"
27
39
  ),
28
40
  children: [
29
- /* @__PURE__ */ n("div", { className: e(t === "horizontal" ? "flex items-center gap-3" : "flex flex-col items-center"), children: [
30
- /* @__PURE__ */ l(
31
- "span",
32
- {
33
- "aria-hidden": !0,
34
- className: e(
35
- "inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors",
36
- a === "complete" && "bg-accent text-on-accent",
37
- a === "current" && "bg-card border-2 border-accent text-accent",
38
- a === "upcoming" && "bg-background-muted text-foreground-subtle border border-border"
41
+ /* @__PURE__ */ c(
42
+ "div",
43
+ {
44
+ className: e(
45
+ t === "horizontal" ? "flex items-center gap-3" : "flex flex-col items-center"
46
+ ),
47
+ children: [
48
+ /* @__PURE__ */ s(
49
+ "span",
50
+ {
51
+ "aria-hidden": !0,
52
+ className: e(
53
+ "inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors",
54
+ l === "complete" && "bg-accent text-on-accent",
55
+ l === "current" && "bg-card border-accent text-accent border-2",
56
+ l === "upcoming" && "bg-background-muted text-foreground-subtle border-border border"
57
+ ),
58
+ children: l === "complete" ? /* @__PURE__ */ s(h, { className: "size-4" }) : r + 1
59
+ }
39
60
  ),
40
- children: a === "complete" ? /* @__PURE__ */ l(u, { className: "size-4" }) : r + 1
41
- }
42
- ),
43
- t === "vertical" && !m && /* @__PURE__ */ l(
44
- "span",
45
- {
46
- className: e(
47
- "mt-1 w-px flex-1 min-h-6",
48
- r < c ? "bg-accent" : "bg-border"
61
+ t === "vertical" && !m && /* @__PURE__ */ s(
62
+ "span",
63
+ {
64
+ className: e(
65
+ "mt-1 min-h-6 w-px flex-1",
66
+ r < a ? "bg-accent" : "bg-border"
67
+ )
68
+ }
49
69
  )
50
- }
51
- )
52
- ] }),
53
- /* @__PURE__ */ n("div", { className: e("flex flex-col", t === "horizontal" && "min-w-0"), children: [
54
- /* @__PURE__ */ l(
70
+ ]
71
+ }
72
+ ),
73
+ /* @__PURE__ */ c("div", { className: e("flex flex-col", t === "horizontal" && "min-w-0"), children: [
74
+ /* @__PURE__ */ c(
55
75
  "span",
56
76
  {
57
77
  className: e(
58
78
  "text-sm font-medium",
59
- a === "upcoming" ? "text-foreground-subtle" : "text-foreground"
79
+ l === "upcoming" ? "text-foreground-subtle" : "text-foreground"
60
80
  ),
61
- children: s.title
81
+ children: [
82
+ o.title,
83
+ /* @__PURE__ */ c("span", { className: "sr-only", children: [
84
+ ", ",
85
+ g[l]
86
+ ] })
87
+ ]
62
88
  }
63
89
  ),
64
- t === "vertical" && s.description && /* @__PURE__ */ l("p", { className: "text-xs text-foreground-muted mt-0.5", children: s.description })
90
+ t === "vertical" && o.description && /* @__PURE__ */ s("p", { className: "text-foreground-muted mt-0.5 text-xs", children: o.description })
65
91
  ] }),
66
- t === "horizontal" && !m && /* @__PURE__ */ l(
92
+ t === "horizontal" && !m && /* @__PURE__ */ s(
67
93
  "span",
68
94
  {
69
95
  "aria-hidden": !0,
70
- className: e(
71
- "h-px flex-1 mx-2",
72
- r < c ? "bg-accent" : "bg-border"
73
- )
96
+ className: e("mx-2 h-px flex-1", r < a ? "bg-accent" : "bg-border")
74
97
  }
75
98
  )
76
99
  ]
@@ -81,8 +104,8 @@ const b = p(function({ steps: o, current: c, orientation: t = "horizontal", clas
81
104
  }
82
105
  );
83
106
  });
84
- b.displayName = "Stepper";
107
+ z.displayName = "Stepper";
85
108
  export {
86
- b as Stepper
109
+ z as Stepper
87
110
  };
88
111
  //# sourceMappingURL=Stepper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.js","sources":["../../../src/components/ui/Stepper.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { Check } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\nexport interface Step {\n /** Step heading. */\n title: ReactNode;\n /** Optional secondary description, only shown in vertical orientation. */\n description?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n /** Ordered list of steps. */\n steps: Step[];\n /** 0-indexed active step. Steps before it are marked complete. */\n current: number;\n /** Layout direction. */\n orientation?: 'horizontal' | 'vertical';\n}\n\n/**\n * Multi-step progress indicator. Use the horizontal variant in narrow flows\n * (top of an onboarding modal) and vertical for deeper context.\n *\n * @example Onboarding\n * <Stepper\n * current={step}\n * steps={[\n * { title: 'Workspace' },\n * { title: 'Invite team' },\n * { title: 'Connect data' },\n * { title: 'Done' },\n * ]}\n * />\n *\n * @do Keep titles 1–2 words. Save explanations for the page body.\n * @dont Use Stepper for free-form navigation. It implies a linear flow.\n */\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, current, orientation = 'horizontal', className, ...props },\n ref,\n) {\n const strings = useStrings();\n return (\n <ol\n ref={ref}\n aria-label={props['aria-label'] ?? strings.stepper.label}\n className={cn(\n orientation === 'horizontal' ? 'flex w-full items-center' : 'flex flex-col gap-6',\n className,\n )}\n {...props}\n >\n {steps.map((step, i) => {\n const state = i < current ? 'complete' : i === current ? 'current' : 'upcoming';\n const isLast = i === steps.length - 1;\n return (\n <li\n key={i}\n aria-current={state === 'current' ? 'step' : undefined}\n className={cn(\n orientation === 'horizontal'\n ? 'flex flex-1 items-center gap-3 last:flex-initial'\n : 'flex items-start gap-3',\n )}\n >\n <div className={cn(orientation === 'horizontal' ? 'flex items-center gap-3' : 'flex flex-col items-center')}>\n <span\n aria-hidden\n className={cn(\n 'inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors',\n state === 'complete' && 'bg-accent text-on-accent',\n state === 'current' && 'bg-card border-2 border-accent text-accent',\n state === 'upcoming' && 'bg-background-muted text-foreground-subtle border border-border',\n )}\n >\n {state === 'complete' ? <Check className=\"size-4\" /> : i + 1}\n </span>\n {orientation === 'vertical' && !isLast && (\n <span\n className={cn(\n 'mt-1 w-px flex-1 min-h-6',\n i < current ? 'bg-accent' : 'bg-border',\n )}\n />\n )}\n </div>\n <div className={cn('flex flex-col', orientation === 'horizontal' && 'min-w-0')}>\n <span\n className={cn(\n 'text-sm font-medium',\n state === 'upcoming' ? 'text-foreground-subtle' : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n {orientation === 'vertical' && step.description && (\n <p className=\"text-xs text-foreground-muted mt-0.5\">{step.description}</p>\n )}\n </div>\n {orientation === 'horizontal' && !isLast && (\n <span\n aria-hidden\n className={cn(\n 'h-px flex-1 mx-2',\n i < current ? 'bg-accent' : 'bg-border',\n )}\n />\n )}\n </li>\n );\n })}\n </ol>\n );\n});\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","forwardRef","steps","current","orientation","className","props","ref","strings","useStrings","jsx","cn","step","i","state","isLast","jsxs","Check"],"mappings":";;;;;;AAyCO,MAAMA,IAAUC,EAA2C,SAChE,EAAE,OAAAC,GAAO,SAAAC,GAAS,aAAAC,IAAc,cAAc,WAAAC,GAAW,GAAGC,EAAA,GAC5DC,GACA;AACA,QAAMC,IAAUC,EAAA;AAChB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAH;AAAA,MACA,cAAYD,EAAM,YAAY,KAAKE,EAAQ,QAAQ;AAAA,MACnD,WAAWG;AAAA,QACTP,MAAgB,eAAe,6BAA6B;AAAA,QAC5DC;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAAJ,EAAM,IAAI,CAACU,GAAMC,MAAM;AACtB,cAAMC,IAAQD,IAAIV,IAAU,aAAaU,MAAMV,IAAU,YAAY,YAC/DY,IAASF,MAAMX,EAAM,SAAS;AACpC,eACE,gBAAAc;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,gBAAcF,MAAU,YAAY,SAAS;AAAA,YAC7C,WAAWH;AAAA,cACTP,MAAgB,eACZ,qDACA;AAAA,YAAA;AAAA,YAGN,UAAA;AAAA,cAAA,gBAAAY,EAAC,SAAI,WAAWL,EAAGP,MAAgB,eAAe,4BAA4B,4BAA4B,GACxG,UAAA;AAAA,gBAAA,gBAAAM;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,eAAW;AAAA,oBACX,WAAWC;AAAA,sBACT;AAAA,sBACAG,MAAU,cAAc;AAAA,sBACxBA,MAAU,aAAa;AAAA,sBACvBA,MAAU,cAAc;AAAA,oBAAA;AAAA,oBAGzB,gBAAU,aAAa,gBAAAJ,EAACO,KAAM,WAAU,UAAS,IAAKJ,IAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE5DT,MAAgB,cAAc,CAACW,KAC9B,gBAAAL;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWC;AAAA,sBACT;AAAA,sBACAE,IAAIV,IAAU,cAAc;AAAA,oBAAA;AAAA,kBAC9B;AAAA,gBAAA;AAAA,cACF,GAEJ;AAAA,cACA,gBAAAa,EAAC,SAAI,WAAWL,EAAG,iBAAiBP,MAAgB,gBAAgB,SAAS,GAC3E,UAAA;AAAA,gBAAA,gBAAAM;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWC;AAAA,sBACT;AAAA,sBACAG,MAAU,aAAa,2BAA2B;AAAA,oBAAA;AAAA,oBAGnD,UAAAF,EAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEPR,MAAgB,cAAcQ,EAAK,iCACjC,KAAA,EAAE,WAAU,wCAAwC,UAAAA,EAAK,YAAA,CAAY;AAAA,cAAA,GAE1E;AAAA,cACCR,MAAgB,gBAAgB,CAACW,KAChC,gBAAAL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAW;AAAA,kBACX,WAAWC;AAAA,oBACT;AAAA,oBACAE,IAAIV,IAAU,cAAc;AAAA,kBAAA;AAAA,gBAC9B;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAjDGU;AAAA,QAAA;AAAA,MAqDX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;AACDb,EAAQ,cAAc;"}
1
+ {"version":3,"file":"Stepper.js","sources":["../../../src/components/ui/Stepper.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { Check } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\nexport interface Step {\n /** Step heading. */\n title: ReactNode;\n /** Optional secondary description, only shown in vertical orientation. */\n description?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n /** Ordered list of steps. */\n steps: Step[];\n /** 0-indexed active step. Steps before it are marked complete. */\n current: number;\n /** Layout direction. */\n orientation?: 'horizontal' | 'vertical';\n /** sr-only state words announced after each title (i18n). */\n stateLabels?: { complete: string; current: string; upcoming: string };\n}\n\n/**\n * Multi-step progress indicator. Use the horizontal variant in narrow flows\n * (top of an onboarding modal) and vertical for deeper context.\n *\n * @example Onboarding\n * <Stepper\n * current={step}\n * steps={[\n * { title: 'Workspace' },\n * { title: 'Invite team' },\n * { title: 'Connect data' },\n * { title: 'Done' },\n * ]}\n * />\n *\n * @do Keep titles 1–2 words. Save explanations for the page body.\n * @dont Use Stepper for free-form navigation. It implies a linear flow.\n */\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n {\n steps,\n current,\n orientation = 'horizontal',\n stateLabels: stateLabelsProp,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n) {\n const strings = useStrings();\n const stateLabels = stateLabelsProp ?? {\n complete: strings.stepper.complete,\n current: strings.stepper.current,\n upcoming: strings.stepper.upcoming,\n };\n return (\n <ol\n ref={ref}\n aria-label={ariaLabel ?? strings.stepper.label}\n className={cn(\n orientation === 'horizontal' ? 'flex w-full items-center' : 'flex flex-col gap-6',\n className,\n )}\n {...props}\n >\n {steps.map((step, i) => {\n const state = i < current ? 'complete' : i === current ? 'current' : 'upcoming';\n const isLast = i === steps.length - 1;\n return (\n <li\n key={i}\n aria-current={state === 'current' ? 'step' : undefined}\n className={cn(\n orientation === 'horizontal'\n ? 'flex flex-1 items-center gap-3 last:flex-initial'\n : 'flex items-start gap-3',\n )}\n >\n <div\n className={cn(\n orientation === 'horizontal'\n ? 'flex items-center gap-3'\n : 'flex flex-col items-center',\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors',\n state === 'complete' && 'bg-accent text-on-accent',\n state === 'current' && 'bg-card border-accent text-accent border-2',\n state === 'upcoming' &&\n 'bg-background-muted text-foreground-subtle border-border border',\n )}\n >\n {state === 'complete' ? <Check className=\"size-4\" /> : i + 1}\n </span>\n {orientation === 'vertical' && !isLast && (\n <span\n className={cn(\n 'mt-1 min-h-6 w-px flex-1',\n i < current ? 'bg-accent' : 'bg-border',\n )}\n />\n )}\n </div>\n <div className={cn('flex flex-col', orientation === 'horizontal' && 'min-w-0')}>\n <span\n className={cn(\n 'text-sm font-medium',\n state === 'upcoming' ? 'text-foreground-subtle' : 'text-foreground',\n )}\n >\n {step.title}\n <span className=\"sr-only\">, {stateLabels[state]}</span>\n </span>\n {orientation === 'vertical' && step.description && (\n <p className=\"text-foreground-muted mt-0.5 text-xs\">{step.description}</p>\n )}\n </div>\n {orientation === 'horizontal' && !isLast && (\n <span\n aria-hidden\n className={cn('mx-2 h-px flex-1', i < current ? 'bg-accent' : 'bg-border')}\n />\n )}\n </li>\n );\n })}\n </ol>\n );\n});\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","forwardRef","steps","current","orientation","stateLabelsProp","className","ariaLabel","props","ref","strings","useStrings","stateLabels","jsx","cn","step","i","state","isLast","jsxs","Check"],"mappings":";;;;;;AA2CO,MAAMA,IAAUC,EAA2C,SAChE;AAAA,EACE,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,aAAaC;AAAA,EACb,WAAAC;AAAA,EACA,cAAcC;AAAA,EACd,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAUC,EAAA,GACVC,IAAcP,KAAmB;AAAA,IACrC,UAAUK,EAAQ,QAAQ;AAAA,IAC1B,SAASA,EAAQ,QAAQ;AAAA,IACzB,UAAUA,EAAQ,QAAQ;AAAA,EAAA;AAE5B,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAJ;AAAA,MACA,cAAYF,KAAaG,EAAQ,QAAQ;AAAA,MACzC,WAAWI;AAAA,QACTV,MAAgB,eAAe,6BAA6B;AAAA,QAC5DE;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,MAEH,UAAAN,EAAM,IAAI,CAACa,GAAMC,MAAM;AACtB,cAAMC,IAAQD,IAAIb,IAAU,aAAaa,MAAMb,IAAU,YAAY,YAC/De,IAASF,MAAMd,EAAM,SAAS;AACpC,eACE,gBAAAiB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,gBAAcF,MAAU,YAAY,SAAS;AAAA,YAC7C,WAAWH;AAAA,cACTV,MAAgB,eACZ,qDACA;AAAA,YAAA;AAAA,YAGN,UAAA;AAAA,cAAA,gBAAAe;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWL;AAAA,oBACTV,MAAgB,eACZ,4BACA;AAAA,kBAAA;AAAA,kBAGN,UAAA;AAAA,oBAAA,gBAAAS;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,eAAW;AAAA,wBACX,WAAWC;AAAA,0BACT;AAAA,0BACAG,MAAU,cAAc;AAAA,0BACxBA,MAAU,aAAa;AAAA,0BACvBA,MAAU,cACR;AAAA,wBAAA;AAAA,wBAGH,gBAAU,aAAa,gBAAAJ,EAACO,KAAM,WAAU,UAAS,IAAKJ,IAAI;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAE5DZ,MAAgB,cAAc,CAACc,KAC9B,gBAAAL;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAWC;AAAA,0BACT;AAAA,0BACAE,IAAIb,IAAU,cAAc;AAAA,wBAAA;AAAA,sBAC9B;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGJ,gBAAAgB,EAAC,SAAI,WAAWL,EAAG,iBAAiBV,MAAgB,gBAAgB,SAAS,GAC3E,UAAA;AAAA,gBAAA,gBAAAe;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWL;AAAA,sBACT;AAAA,sBACAG,MAAU,aAAa,2BAA2B;AAAA,oBAAA;AAAA,oBAGnD,UAAA;AAAA,sBAAAF,EAAK;AAAA,sBACN,gBAAAI,EAAC,QAAA,EAAK,WAAU,WAAU,UAAA;AAAA,wBAAA;AAAA,wBAAGP,EAAYK,CAAK;AAAA,sBAAA,EAAA,CAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEjDb,MAAgB,cAAcW,EAAK,iCACjC,KAAA,EAAE,WAAU,wCAAwC,UAAAA,EAAK,YAAA,CAAY;AAAA,cAAA,GAE1E;AAAA,cACCX,MAAgB,gBAAgB,CAACc,KAChC,gBAAAL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAW;AAAA,kBACX,WAAWC,EAAG,oBAAoBE,IAAIb,IAAU,cAAc,WAAW;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC3E;AAAA,UAAA;AAAA,UAtDGa;AAAA,QAAA;AAAA,MA0DX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;AACDhB,EAAQ,cAAc;"}
@@ -1,77 +1,80 @@
1
1
  "use client";
2
- import { jsx as t, jsxs as l } from "react/jsx-runtime";
3
- import { forwardRef as p, useId as w } from "react";
2
+ import { jsx as e, jsxs as l } from "react/jsx-runtime";
3
+ import { forwardRef as k, useId as y } from "react";
4
4
  import * as f from "@radix-ui/react-switch";
5
- import { cn as e } from "../../lib/utils.js";
6
- const k = {
7
- sm: "h-4 w-7",
8
- md: "h-5 w-9"
9
- }, N = {
5
+ import { cn as t } from "../../lib/utils.js";
6
+ const N = {
7
+ sm: 'h-4 w-7 before:absolute before:-inset-x-1 before:-inset-y-1.5 before:content-[""]',
8
+ md: 'h-5 w-9 before:absolute before:-inset-x-1 before:-inset-y-1 before:content-[""]'
9
+ }, S = {
10
10
  sm: "size-3 data-[state=checked]:translate-x-3",
11
11
  md: "size-4 data-[state=checked]:translate-x-4"
12
- }, S = p(
12
+ }, I = k(
13
13
  function({
14
- className: m,
15
- label: r,
16
- description: s,
17
- labelPosition: o = "after",
18
- size: n = "md",
14
+ className: b,
15
+ label: a,
16
+ description: r,
17
+ labelPosition: s = "after",
18
+ size: i = "md",
19
19
  hideLabel: u,
20
- id: h,
21
- disabled: i,
22
- ...b
20
+ id: m,
21
+ disabled: n,
22
+ "aria-describedby": h,
23
+ ...v
23
24
  }, x) {
24
- const g = w(), a = h ?? g, c = s ? `${a}-desc` : void 0, v = /* @__PURE__ */ t(
25
+ const g = y(), o = m ?? g, c = r ? `${o}-desc` : void 0, p = [c, h].filter(Boolean).join(" ") || void 0, w = /* @__PURE__ */ e(
25
26
  f.Root,
26
27
  {
27
28
  ref: x,
28
- id: a,
29
- disabled: i,
30
- "aria-describedby": c,
31
- className: e(
32
- "peer inline-flex shrink-0 items-center rounded-full border-2 border-transparent",
29
+ id: o,
30
+ disabled: n,
31
+ "aria-describedby": p,
32
+ className: t(
33
+ "peer relative inline-flex shrink-0 items-center rounded-full border-2 border-transparent",
33
34
  "transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)]",
34
- "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
35
+ "focus-visible:ring-ring focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
35
36
  "disabled:cursor-not-allowed disabled:opacity-50",
36
37
  "data-[state=checked]:bg-accent data-[state=unchecked]:bg-switch-track-off",
37
- k[n]
38
+ "aria-invalid:ring-danger aria-invalid:ring-2",
39
+ N[i]
38
40
  ),
39
- ...b,
40
- children: /* @__PURE__ */ t(
41
+ ...v,
42
+ children: /* @__PURE__ */ e(
41
43
  f.Thumb,
42
44
  {
43
- className: e(
44
- "pointer-events-none block rounded-full bg-switch-thumb shadow-sm",
45
+ className: t(
46
+ "bg-switch-thumb pointer-events-none block rounded-full shadow-sm",
45
47
  "transition-transform duration-[var(--duration-base)] ease-[var(--ease-out)]",
46
48
  "translate-x-0",
47
- N[n]
49
+ S[i]
48
50
  )
49
51
  }
50
52
  )
51
53
  }
52
- ), d = r && /* @__PURE__ */ l("div", { className: e("flex flex-col gap-0.5 select-none", u && "sr-only"), children: [
53
- /* @__PURE__ */ t(
54
+ ), d = a && /* @__PURE__ */ l("div", { className: "flex flex-col gap-0.5 select-none", children: [
55
+ /* @__PURE__ */ e(
54
56
  "label",
55
57
  {
56
- htmlFor: a,
57
- className: e(
58
- "text-sm text-foreground",
59
- i && "opacity-50 cursor-not-allowed"
58
+ htmlFor: o,
59
+ className: t(
60
+ "text-foreground text-sm",
61
+ n && "cursor-not-allowed opacity-50",
62
+ u && "sr-only"
60
63
  ),
61
- children: r
64
+ children: a
62
65
  }
63
66
  ),
64
- s && /* @__PURE__ */ t("p", { id: c, className: "text-xs text-foreground-subtle", children: s })
67
+ r && /* @__PURE__ */ e("p", { id: c, className: "text-foreground-subtle text-xs", children: r })
65
68
  ] });
66
- return /* @__PURE__ */ l("div", { className: e("inline-flex items-center gap-2.5", m), children: [
67
- o === "before" && d,
68
- v,
69
- o === "after" && d
69
+ return /* @__PURE__ */ l("div", { className: t("inline-flex items-center gap-2.5", b), children: [
70
+ s === "before" && d,
71
+ w,
72
+ s === "after" && d
70
73
  ] });
71
74
  }
72
75
  );
73
- S.displayName = "Switch";
76
+ I.displayName = "Switch";
74
77
  export {
75
- S as Switch
78
+ I as Switch
76
79
  };
77
80
  //# sourceMappingURL=Switch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","sources":["../../../src/components/ui/Switch.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport { cn } from '@/lib/utils';\n\nexport interface SwitchProps\n extends Omit<ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, 'asChild'> {\n /** Inline label rendered to the right. */\n label?: ReactNode;\n /** Secondary description rendered below the label. */\n description?: ReactNode;\n /** Position the label before the switch instead of after. */\n labelPosition?: 'before' | 'after';\n /** Visual size. */\n size?: 'sm' | 'md';\n /** Hide the label visually while keeping it accessible. */\n hideLabel?: boolean;\n}\n\nconst trackSize = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n} as const;\nconst thumbSize = {\n sm: 'size-3 data-[state=checked]:translate-x-3',\n md: 'size-4 data-[state=checked]:translate-x-4',\n} as const;\n\n/**\n * Binary on/off toggle for instant-apply settings. Use Checkbox when the\n * choice is part of a form that needs explicit submission.\n *\n * @example Instant toggle\n * <Switch label=\"Email digest\" checked={on} onCheckedChange={setOn} />\n *\n * @example With description\n * <Switch label=\"Two-factor authentication\"\n * description=\"Required for admins on production accounts.\"\n * checked={tfa}\n * onCheckedChange={setTfa} />\n *\n * @do Use Switch when the change takes effect immediately. Pair with\n * a toast confirming the new state.\n * @dont Use Switch inside a form that requires submission — Checkbox\n * better matches that mental model.\n */\nexport const Switch = forwardRef<ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n function Switch(\n {\n className,\n label,\n description,\n labelPosition = 'after',\n size = 'md',\n hideLabel,\n id,\n disabled,\n ...props\n },\n ref,\n ) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n\n const control = (\n <SwitchPrimitive.Root\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={descId}\n className={cn(\n 'peer inline-flex shrink-0 items-center rounded-full border-2 border-transparent',\n 'transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-accent data-[state=unchecked]:bg-switch-track-off',\n trackSize[size],\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'pointer-events-none block rounded-full bg-switch-thumb shadow-sm',\n 'transition-transform duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'translate-x-0',\n thumbSize[size],\n )}\n />\n </SwitchPrimitive.Root>\n );\n\n const labelBlock = label && (\n <div className={cn('flex flex-col gap-0.5 select-none', hideLabel && 'sr-only')}>\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-sm text-foreground',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n {label}\n </label>\n {description && (\n <p id={descId} className=\"text-xs text-foreground-subtle\">\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div className={cn('inline-flex items-center gap-2.5', className)}>\n {labelPosition === 'before' && labelBlock}\n {control}\n {labelPosition === 'after' && labelBlock}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["trackSize","thumbSize","Switch","forwardRef","className","label","description","labelPosition","size","hideLabel","id","disabled","props","ref","autoId","useId","fieldId","descId","control","jsx","SwitchPrimitive","cn","labelBlock","jsxs"],"mappings":";;;;;AA0BA,MAAMA,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GACMC,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GAoBaC,IAASC;AAAA,EACpB,SACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI,GAChBG,IAASX,IAAc,GAAGU,CAAO,UAAU,QAE3CE,IACJ,gBAAAC;AAAA,MAACC,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAAP;AAAA,QACA,IAAIG;AAAA,QACJ,UAAAL;AAAA,QACA,oBAAkBM;AAAA,QAClB,WAAWI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACArB,EAAUQ,CAAI;AAAA,QAAA;AAAA,QAEf,GAAGI;AAAA,QAEJ,UAAA,gBAAAO;AAAA,UAACC,EAAgB;AAAA,UAAhB;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACApB,EAAUO,CAAI;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAIEc,IAAajB,KACjB,gBAAAkB,EAAC,OAAA,EAAI,WAAWF,EAAG,qCAAqCZ,KAAa,SAAS,GAC5E,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASH;AAAA,UACT,WAAWK;AAAA,YACT;AAAA,YACAV,KAAY;AAAA,UAAA;AAAA,UAGb,UAAAN;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFC,KACC,gBAAAa,EAAC,KAAA,EAAE,IAAIF,GAAQ,WAAU,kCACtB,UAAAX,EAAA,CACH;AAAA,IAAA,GAEJ;AAGF,6BACG,OAAA,EAAI,WAAWe,EAAG,oCAAoCjB,CAAS,GAC7D,UAAA;AAAA,MAAAG,MAAkB,YAAYe;AAAA,MAC9BJ;AAAA,MACAX,MAAkB,WAAWe;AAAA,IAAA,GAChC;AAAA,EAEJ;AACF;AAEApB,EAAO,cAAc;"}
1
+ {"version":3,"file":"Switch.js","sources":["../../../src/components/ui/Switch.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport { cn } from '@/lib/utils';\n\nexport interface SwitchProps extends Omit<\n ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>,\n 'asChild'\n> {\n /** Inline label rendered to the right. */\n label?: ReactNode;\n /** Secondary description rendered below the label. */\n description?: ReactNode;\n /** Position the label before the switch instead of after. */\n labelPosition?: 'before' | 'after';\n /** Visual size. */\n size?: 'sm' | 'md';\n /** Hide the label visually while keeping it accessible. */\n hideLabel?: boolean;\n}\n\n// Tracks are 28×16 (`sm`) / 36×20 (`md`) visually; the `before:` halo lifts\n// the hit area to ≥24px tall without changing the drawing (WCAG 2.5.8).\nconst trackSize = {\n sm: 'h-4 w-7 before:absolute before:-inset-x-1 before:-inset-y-1.5 before:content-[\"\"]',\n md: 'h-5 w-9 before:absolute before:-inset-x-1 before:-inset-y-1 before:content-[\"\"]',\n} as const;\nconst thumbSize = {\n sm: 'size-3 data-[state=checked]:translate-x-3',\n md: 'size-4 data-[state=checked]:translate-x-4',\n} as const;\n\n/**\n * Binary on/off toggle for instant-apply settings. Use Checkbox when the\n * choice is part of a form that needs explicit submission.\n *\n * @example Instant toggle\n * <Switch label=\"Email digest\" checked={on} onCheckedChange={setOn} />\n *\n * @example With description\n * <Switch label=\"Two-factor authentication\"\n * description=\"Required for admins on production accounts.\"\n * checked={tfa}\n * onCheckedChange={setTfa} />\n *\n * @do Use Switch when the change takes effect immediately. Pair with\n * a toast confirming the new state.\n * @dont Use Switch inside a form that requires submission — Checkbox\n * better matches that mental model.\n */\nexport const Switch = forwardRef<ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n function Switch(\n {\n className,\n label,\n description,\n labelPosition = 'after',\n size = 'md',\n hideLabel,\n id,\n disabled,\n 'aria-describedby': ariaDescribedby,\n ...props\n },\n ref,\n ) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n const describedBy = [descId, ariaDescribedby].filter(Boolean).join(' ') || undefined;\n\n const control = (\n <SwitchPrimitive.Root\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={describedBy}\n className={cn(\n 'peer relative inline-flex shrink-0 items-center rounded-full border-2 border-transparent',\n 'transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'focus-visible:ring-ring focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-accent data-[state=unchecked]:bg-switch-track-off',\n 'aria-invalid:ring-danger aria-invalid:ring-2',\n trackSize[size],\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'bg-switch-thumb pointer-events-none block rounded-full shadow-sm',\n 'transition-transform duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'translate-x-0',\n thumbSize[size],\n )}\n />\n </SwitchPrimitive.Root>\n );\n\n const labelBlock = label && (\n <div className=\"flex flex-col gap-0.5 select-none\">\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-foreground text-sm',\n disabled && 'cursor-not-allowed opacity-50',\n hideLabel && 'sr-only',\n )}\n >\n {label}\n </label>\n {description && (\n <p id={descId} className=\"text-foreground-subtle text-xs\">\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div className={cn('inline-flex items-center gap-2.5', className)}>\n {labelPosition === 'before' && labelBlock}\n {control}\n {labelPosition === 'after' && labelBlock}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["trackSize","thumbSize","Switch","forwardRef","className","label","description","labelPosition","size","hideLabel","id","disabled","ariaDescribedby","props","ref","autoId","useId","fieldId","descId","describedBy","control","jsx","SwitchPrimitive","cn","labelBlock","jsxs"],"mappings":";;;;;AA8BA,MAAMA,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GACMC,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GAoBaC,IAASC;AAAA,EACpB,SACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,oBAAoBC;AAAA,IACpB,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAASC,EAAA,GACTC,IAAUP,KAAMK,GAChBG,IAASZ,IAAc,GAAGW,CAAO,UAAU,QAC3CE,IAAc,CAACD,GAAQN,CAAe,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,QAErEQ,IACJ,gBAAAC;AAAA,MAACC,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAAR;AAAA,QACA,IAAIG;AAAA,QACJ,UAAAN;AAAA,QACA,oBAAkBQ;AAAA,QAClB,WAAWI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAvB,EAAUQ,CAAI;AAAA,QAAA;AAAA,QAEf,GAAGK;AAAA,QAEJ,UAAA,gBAAAQ;AAAA,UAACC,EAAgB;AAAA,UAAhB;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACAtB,EAAUO,CAAI;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAIEgB,IAAanB,KACjB,gBAAAoB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASJ;AAAA,UACT,WAAWM;AAAA,YACT;AAAA,YACAZ,KAAY;AAAA,YACZF,KAAa;AAAA,UAAA;AAAA,UAGd,UAAAJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFC,KACC,gBAAAe,EAAC,KAAA,EAAE,IAAIH,GAAQ,WAAU,kCACtB,UAAAZ,EAAA,CACH;AAAA,IAAA,GAEJ;AAGF,6BACG,OAAA,EAAI,WAAWiB,EAAG,oCAAoCnB,CAAS,GAC7D,UAAA;AAAA,MAAAG,MAAkB,YAAYiB;AAAA,MAC9BJ;AAAA,MACAb,MAAkB,WAAWiB;AAAA,IAAA,GAChC;AAAA,EAEJ;AACF;AAEAtB,EAAO,cAAc;"}
@@ -1,12 +1,36 @@
1
- import { HTMLAttributes, ThHTMLAttributes, TdHTMLAttributes } from 'react';
2
- export declare const Table: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableElement> & import('react').RefAttributes<HTMLTableElement>>;
1
+ import { CSSProperties, HTMLAttributes, ThHTMLAttributes, TdHTMLAttributes } from 'react';
2
+ export interface TableProps extends HTMLAttributes<HTMLTableElement> {
3
+ /** Class for the scroll wrapper (border, radius, height). */
4
+ containerClassName?: string;
5
+ /**
6
+ * Max height of the scroll wrapper. Required for the sticky header to
7
+ * work — `<thead>` sticks to the nearest scroll container, so a wrapper
8
+ * with no height cap never scrolls. e.g. `maxHeight="24rem"`.
9
+ */
10
+ maxHeight?: CSSProperties['maxHeight'];
11
+ /**
12
+ * Accessible name of the scroll wrapper (it is a focusable `group` so
13
+ * keyboard users can scroll wide / capped tables). Defaults to
14
+ * `strings.table.scrollRegion`; pass the table's own title when you have one.
15
+ */
16
+ scrollLabel?: string;
17
+ }
18
+ export declare const Table: import('react').ForwardRefExoticComponent<TableProps & import('react').RefAttributes<HTMLTableElement>>;
3
19
  export declare const TableHeader: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableSectionElement> & import('react').RefAttributes<HTMLTableSectionElement>>;
4
20
  export declare const TableBody: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableSectionElement> & import('react').RefAttributes<HTMLTableSectionElement>>;
5
21
  export declare const TableFooter: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableSectionElement> & import('react').RefAttributes<HTMLTableSectionElement>>;
6
22
  export declare const TableRow: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableRowElement> & {
23
+ /**
24
+ * Visual selected state (`data-state="selected"`). `aria-selected` is only
25
+ * valid on rows of an ARIA grid, so it is emitted only when the row
26
+ * carries `role="row"` (i.e. you opted into `role="grid"` on the table).
27
+ */
7
28
  selected?: boolean;
8
29
  } & import('react').RefAttributes<HTMLTableRowElement>>;
9
- export interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {
30
+ export type TableCellAlign = 'left' | 'center' | 'right';
31
+ export interface TableHeadProps extends Omit<ThHTMLAttributes<HTMLTableCellElement>, 'align'> {
32
+ /** Horizontal alignment; `right` also applies tabular figures. */
33
+ align?: TableCellAlign;
10
34
  /**
11
35
  * Render the header label in small caps (`uppercase tracking-wide`).
12
36
  * Off by default — mixed case reads better for long / Cyrillic labels.
@@ -15,9 +39,13 @@ export interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {
15
39
  uppercase?: boolean;
16
40
  }
17
41
  export declare const TableHead: import('react').ForwardRefExoticComponent<TableHeadProps & import('react').RefAttributes<HTMLTableCellElement>>;
18
- export declare const TableCell: import('react').ForwardRefExoticComponent<TdHTMLAttributes<HTMLTableCellElement> & import('react').RefAttributes<HTMLTableCellElement>>;
42
+ export interface TableCellProps extends Omit<TdHTMLAttributes<HTMLTableCellElement>, 'align'> {
43
+ /** Horizontal alignment; `right` also applies tabular figures for numbers. */
44
+ align?: TableCellAlign;
45
+ }
46
+ export declare const TableCell: import('react').ForwardRefExoticComponent<TableCellProps & import('react').RefAttributes<HTMLTableCellElement>>;
19
47
  export declare const TableCaption: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableCaptionElement> & import('react').RefAttributes<HTMLTableCaptionElement>>;
20
- export interface TableSortHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {
48
+ export interface TableSortHeaderProps extends TableHeadProps {
21
49
  /** Stable column key used in `currentSort.key`. */
22
50
  sortKey: string;
23
51
  /** Currently sorted column + direction (or null). */