@inui/design-system 0.0.0-stage → 1.22.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 (312) hide show
  1. package/README.md +360 -2
  2. package/dist/components/ui/accordion.d.ts +44 -0
  3. package/dist/components/ui/accordion.d.ts.map +1 -0
  4. package/dist/components/ui/accordion.js +86 -0
  5. package/dist/components/ui/accordion.js.map +1 -0
  6. package/dist/components/ui/ai-avatar.d.ts +46 -0
  7. package/dist/components/ui/ai-avatar.d.ts.map +1 -0
  8. package/dist/components/ui/ai-avatar.js +43 -0
  9. package/dist/components/ui/ai-avatar.js.map +1 -0
  10. package/dist/components/ui/ai-label.d.ts +118 -0
  11. package/dist/components/ui/ai-label.d.ts.map +1 -0
  12. package/dist/components/ui/ai-label.js +184 -0
  13. package/dist/components/ui/ai-label.js.map +1 -0
  14. package/dist/components/ui/ai-sparkle.d.ts +91 -0
  15. package/dist/components/ui/ai-sparkle.d.ts.map +1 -0
  16. package/dist/components/ui/ai-sparkle.js +200 -0
  17. package/dist/components/ui/ai-sparkle.js.map +1 -0
  18. package/dist/components/ui/alert-dialog.d.ts +79 -0
  19. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  20. package/dist/components/ui/alert-dialog.js +147 -0
  21. package/dist/components/ui/alert-dialog.js.map +1 -0
  22. package/dist/components/ui/alert.d.ts +71 -0
  23. package/dist/components/ui/alert.d.ts.map +1 -0
  24. package/dist/components/ui/alert.js +108 -0
  25. package/dist/components/ui/alert.js.map +1 -0
  26. package/dist/components/ui/aspect-ratio.d.ts +30 -0
  27. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  28. package/dist/components/ui/aspect-ratio.js +40 -0
  29. package/dist/components/ui/aspect-ratio.js.map +1 -0
  30. package/dist/components/ui/attachment.d.ts +74 -0
  31. package/dist/components/ui/attachment.d.ts.map +1 -0
  32. package/dist/components/ui/attachment.js +142 -0
  33. package/dist/components/ui/attachment.js.map +1 -0
  34. package/dist/components/ui/avatar.d.ts +82 -0
  35. package/dist/components/ui/avatar.d.ts.map +1 -0
  36. package/dist/components/ui/avatar.js +123 -0
  37. package/dist/components/ui/avatar.js.map +1 -0
  38. package/dist/components/ui/badge.d.ts +130 -0
  39. package/dist/components/ui/badge.d.ts.map +1 -0
  40. package/dist/components/ui/badge.js +226 -0
  41. package/dist/components/ui/badge.js.map +1 -0
  42. package/dist/components/ui/breadcrumb.d.ts +43 -0
  43. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  44. package/dist/components/ui/breadcrumb.js +98 -0
  45. package/dist/components/ui/breadcrumb.js.map +1 -0
  46. package/dist/components/ui/browser-tabs.d.ts +218 -0
  47. package/dist/components/ui/browser-tabs.d.ts.map +1 -0
  48. package/dist/components/ui/browser-tabs.js +528 -0
  49. package/dist/components/ui/browser-tabs.js.map +1 -0
  50. package/dist/components/ui/bubble.d.ts +80 -0
  51. package/dist/components/ui/bubble.d.ts.map +1 -0
  52. package/dist/components/ui/bubble.js +235 -0
  53. package/dist/components/ui/bubble.js.map +1 -0
  54. package/dist/components/ui/button-group.d.ts +60 -0
  55. package/dist/components/ui/button-group.d.ts.map +1 -0
  56. package/dist/components/ui/button-group.js +89 -0
  57. package/dist/components/ui/button-group.js.map +1 -0
  58. package/dist/components/ui/button.d.ts +157 -0
  59. package/dist/components/ui/button.d.ts.map +1 -0
  60. package/dist/components/ui/button.js +144 -0
  61. package/dist/components/ui/button.js.map +1 -0
  62. package/dist/components/ui/calendar.d.ts +57 -0
  63. package/dist/components/ui/calendar.d.ts.map +1 -0
  64. package/dist/components/ui/calendar.js +163 -0
  65. package/dist/components/ui/calendar.js.map +1 -0
  66. package/dist/components/ui/card.d.ts +96 -0
  67. package/dist/components/ui/card.d.ts.map +1 -0
  68. package/dist/components/ui/card.js +131 -0
  69. package/dist/components/ui/card.js.map +1 -0
  70. package/dist/components/ui/carousel.d.ts +86 -0
  71. package/dist/components/ui/carousel.d.ts.map +1 -0
  72. package/dist/components/ui/carousel.js +207 -0
  73. package/dist/components/ui/carousel.js.map +1 -0
  74. package/dist/components/ui/checkbox.d.ts +54 -0
  75. package/dist/components/ui/checkbox.d.ts.map +1 -0
  76. package/dist/components/ui/checkbox.js +78 -0
  77. package/dist/components/ui/checkbox.js.map +1 -0
  78. package/dist/components/ui/collapsible.d.ts +45 -0
  79. package/dist/components/ui/collapsible.d.ts.map +1 -0
  80. package/dist/components/ui/collapsible.js +65 -0
  81. package/dist/components/ui/collapsible.js.map +1 -0
  82. package/dist/components/ui/combobox.d.ts +111 -0
  83. package/dist/components/ui/combobox.d.ts.map +1 -0
  84. package/dist/components/ui/combobox.js +264 -0
  85. package/dist/components/ui/combobox.js.map +1 -0
  86. package/dist/components/ui/command.d.ts +71 -0
  87. package/dist/components/ui/command.d.ts.map +1 -0
  88. package/dist/components/ui/command.js +133 -0
  89. package/dist/components/ui/command.js.map +1 -0
  90. package/dist/components/ui/context-menu.d.ts +70 -0
  91. package/dist/components/ui/context-menu.d.ts.map +1 -0
  92. package/dist/components/ui/context-menu.js +163 -0
  93. package/dist/components/ui/context-menu.js.map +1 -0
  94. package/dist/components/ui/count-badge.d.ts +40 -0
  95. package/dist/components/ui/count-badge.d.ts.map +1 -0
  96. package/dist/components/ui/count-badge.js +43 -0
  97. package/dist/components/ui/count-badge.js.map +1 -0
  98. package/dist/components/ui/data-table.d.ts +1026 -0
  99. package/dist/components/ui/data-table.d.ts.map +1 -0
  100. package/dist/components/ui/data-table.js +3423 -0
  101. package/dist/components/ui/data-table.js.map +1 -0
  102. package/dist/components/ui/dialog.d.ts +73 -0
  103. package/dist/components/ui/dialog.d.ts.map +1 -0
  104. package/dist/components/ui/dialog.js +145 -0
  105. package/dist/components/ui/dialog.js.map +1 -0
  106. package/dist/components/ui/direction.d.ts +35 -0
  107. package/dist/components/ui/direction.d.ts.map +1 -0
  108. package/dist/components/ui/direction.js +35 -0
  109. package/dist/components/ui/direction.js.map +1 -0
  110. package/dist/components/ui/drawer.d.ts +53 -0
  111. package/dist/components/ui/drawer.d.ts.map +1 -0
  112. package/dist/components/ui/drawer.js +115 -0
  113. package/dist/components/ui/drawer.js.map +1 -0
  114. package/dist/components/ui/dropdown-menu.d.ts +75 -0
  115. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  116. package/dist/components/ui/dropdown-menu.js +173 -0
  117. package/dist/components/ui/dropdown-menu.js.map +1 -0
  118. package/dist/components/ui/dropzone.d.ts +141 -0
  119. package/dist/components/ui/dropzone.d.ts.map +1 -0
  120. package/dist/components/ui/dropzone.js +257 -0
  121. package/dist/components/ui/dropzone.js.map +1 -0
  122. package/dist/components/ui/empty.d.ts +94 -0
  123. package/dist/components/ui/empty.d.ts.map +1 -0
  124. package/dist/components/ui/empty.js +149 -0
  125. package/dist/components/ui/empty.js.map +1 -0
  126. package/dist/components/ui/field.d.ts +122 -0
  127. package/dist/components/ui/field.d.ts.map +1 -0
  128. package/dist/components/ui/field.js +254 -0
  129. package/dist/components/ui/field.js.map +1 -0
  130. package/dist/components/ui/hover-card.d.ts +51 -0
  131. package/dist/components/ui/hover-card.d.ts.map +1 -0
  132. package/dist/components/ui/hover-card.js +101 -0
  133. package/dist/components/ui/hover-card.js.map +1 -0
  134. package/dist/components/ui/input-group.d.ts +62 -0
  135. package/dist/components/ui/input-group.d.ts.map +1 -0
  136. package/dist/components/ui/input-group.js +115 -0
  137. package/dist/components/ui/input-group.js.map +1 -0
  138. package/dist/components/ui/input-otp.d.ts +52 -0
  139. package/dist/components/ui/input-otp.d.ts.map +1 -0
  140. package/dist/components/ui/input-otp.js +89 -0
  141. package/dist/components/ui/input-otp.js.map +1 -0
  142. package/dist/components/ui/input.d.ts +47 -0
  143. package/dist/components/ui/input.d.ts.map +1 -0
  144. package/dist/components/ui/input.js +47 -0
  145. package/dist/components/ui/input.js.map +1 -0
  146. package/dist/components/ui/item.d.ts +74 -0
  147. package/dist/components/ui/item.d.ts.map +1 -0
  148. package/dist/components/ui/item.js +176 -0
  149. package/dist/components/ui/item.js.map +1 -0
  150. package/dist/components/ui/kbd.d.ts +41 -0
  151. package/dist/components/ui/kbd.d.ts.map +1 -0
  152. package/dist/components/ui/kbd.js +58 -0
  153. package/dist/components/ui/kbd.js.map +1 -0
  154. package/dist/components/ui/key-value-pair.d.ts +56 -0
  155. package/dist/components/ui/key-value-pair.d.ts.map +1 -0
  156. package/dist/components/ui/key-value-pair.js +110 -0
  157. package/dist/components/ui/key-value-pair.js.map +1 -0
  158. package/dist/components/ui/label.d.ts +83 -0
  159. package/dist/components/ui/label.d.ts.map +1 -0
  160. package/dist/components/ui/label.js +85 -0
  161. package/dist/components/ui/label.js.map +1 -0
  162. package/dist/components/ui/marker.d.ts +54 -0
  163. package/dist/components/ui/marker.d.ts.map +1 -0
  164. package/dist/components/ui/marker.js +79 -0
  165. package/dist/components/ui/marker.js.map +1 -0
  166. package/dist/components/ui/menubar.d.ts +72 -0
  167. package/dist/components/ui/menubar.d.ts.map +1 -0
  168. package/dist/components/ui/menubar.js +174 -0
  169. package/dist/components/ui/menubar.js.map +1 -0
  170. package/dist/components/ui/message-scroller.d.ts +53 -0
  171. package/dist/components/ui/message-scroller.d.ts.map +1 -0
  172. package/dist/components/ui/message-scroller.js +95 -0
  173. package/dist/components/ui/message-scroller.js.map +1 -0
  174. package/dist/components/ui/message.d.ts +63 -0
  175. package/dist/components/ui/message.d.ts.map +1 -0
  176. package/dist/components/ui/message.js +92 -0
  177. package/dist/components/ui/message.js.map +1 -0
  178. package/dist/components/ui/meta-list.d.ts +55 -0
  179. package/dist/components/ui/meta-list.d.ts.map +1 -0
  180. package/dist/components/ui/meta-list.js +75 -0
  181. package/dist/components/ui/meta-list.js.map +1 -0
  182. package/dist/components/ui/native-select.d.ts +51 -0
  183. package/dist/components/ui/native-select.d.ts.map +1 -0
  184. package/dist/components/ui/native-select.js +75 -0
  185. package/dist/components/ui/native-select.js.map +1 -0
  186. package/dist/components/ui/navigation-menu.d.ts +56 -0
  187. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  188. package/dist/components/ui/navigation-menu.js +116 -0
  189. package/dist/components/ui/navigation-menu.js.map +1 -0
  190. package/dist/components/ui/page-header.d.ts +223 -0
  191. package/dist/components/ui/page-header.d.ts.map +1 -0
  192. package/dist/components/ui/page-header.js +233 -0
  193. package/dist/components/ui/page-header.js.map +1 -0
  194. package/dist/components/ui/pagination.d.ts +68 -0
  195. package/dist/components/ui/pagination.d.ts.map +1 -0
  196. package/dist/components/ui/pagination.js +145 -0
  197. package/dist/components/ui/pagination.js.map +1 -0
  198. package/dist/components/ui/popover.d.ts +61 -0
  199. package/dist/components/ui/popover.d.ts.map +1 -0
  200. package/dist/components/ui/popover.js +144 -0
  201. package/dist/components/ui/popover.js.map +1 -0
  202. package/dist/components/ui/progress.d.ts +35 -0
  203. package/dist/components/ui/progress.d.ts.map +1 -0
  204. package/dist/components/ui/progress.js +46 -0
  205. package/dist/components/ui/progress.js.map +1 -0
  206. package/dist/components/ui/questionnaire.d.ts +92 -0
  207. package/dist/components/ui/questionnaire.d.ts.map +1 -0
  208. package/dist/components/ui/questionnaire.js +277 -0
  209. package/dist/components/ui/questionnaire.js.map +1 -0
  210. package/dist/components/ui/radio-group.d.ts +50 -0
  211. package/dist/components/ui/radio-group.d.ts.map +1 -0
  212. package/dist/components/ui/radio-group.js +65 -0
  213. package/dist/components/ui/radio-group.js.map +1 -0
  214. package/dist/components/ui/resizable.d.ts +44 -0
  215. package/dist/components/ui/resizable.d.ts.map +1 -0
  216. package/dist/components/ui/resizable.js +73 -0
  217. package/dist/components/ui/resizable.js.map +1 -0
  218. package/dist/components/ui/scroll-area.d.ts +55 -0
  219. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  220. package/dist/components/ui/scroll-area.js +72 -0
  221. package/dist/components/ui/scroll-area.js.map +1 -0
  222. package/dist/components/ui/select.d.ts +274 -0
  223. package/dist/components/ui/select.d.ts.map +1 -0
  224. package/dist/components/ui/select.js +609 -0
  225. package/dist/components/ui/select.js.map +1 -0
  226. package/dist/components/ui/separator.d.ts +31 -0
  227. package/dist/components/ui/separator.d.ts.map +1 -0
  228. package/dist/components/ui/separator.js +38 -0
  229. package/dist/components/ui/separator.js.map +1 -0
  230. package/dist/components/ui/sheet.d.ts +59 -0
  231. package/dist/components/ui/sheet.d.ts.map +1 -0
  232. package/dist/components/ui/sheet.js +128 -0
  233. package/dist/components/ui/sheet.js.map +1 -0
  234. package/dist/components/ui/sidebar.d.ts +166 -0
  235. package/dist/components/ui/sidebar.d.ts.map +1 -0
  236. package/dist/components/ui/sidebar.js +512 -0
  237. package/dist/components/ui/sidebar.js.map +1 -0
  238. package/dist/components/ui/skeleton.d.ts +35 -0
  239. package/dist/components/ui/skeleton.d.ts.map +1 -0
  240. package/dist/components/ui/skeleton.js +46 -0
  241. package/dist/components/ui/skeleton.js.map +1 -0
  242. package/dist/components/ui/slider.d.ts +39 -0
  243. package/dist/components/ui/slider.d.ts.map +1 -0
  244. package/dist/components/ui/slider.js +75 -0
  245. package/dist/components/ui/slider.js.map +1 -0
  246. package/dist/components/ui/sonner.d.ts +56 -0
  247. package/dist/components/ui/sonner.d.ts.map +1 -0
  248. package/dist/components/ui/sonner.js +96 -0
  249. package/dist/components/ui/sonner.js.map +1 -0
  250. package/dist/components/ui/spinner.d.ts +37 -0
  251. package/dist/components/ui/spinner.d.ts.map +1 -0
  252. package/dist/components/ui/spinner.js +51 -0
  253. package/dist/components/ui/spinner.js.map +1 -0
  254. package/dist/components/ui/stepper.d.ts +84 -0
  255. package/dist/components/ui/stepper.d.ts.map +1 -0
  256. package/dist/components/ui/stepper.js +145 -0
  257. package/dist/components/ui/stepper.js.map +1 -0
  258. package/dist/components/ui/switch.d.ts +36 -0
  259. package/dist/components/ui/switch.d.ts.map +1 -0
  260. package/dist/components/ui/switch.js +44 -0
  261. package/dist/components/ui/switch.js.map +1 -0
  262. package/dist/components/ui/table.d.ts +80 -0
  263. package/dist/components/ui/table.d.ts.map +1 -0
  264. package/dist/components/ui/table.js +130 -0
  265. package/dist/components/ui/table.js.map +1 -0
  266. package/dist/components/ui/tabs.d.ts +87 -0
  267. package/dist/components/ui/tabs.d.ts.map +1 -0
  268. package/dist/components/ui/tabs.js +128 -0
  269. package/dist/components/ui/tabs.js.map +1 -0
  270. package/dist/components/ui/textarea.d.ts +35 -0
  271. package/dist/components/ui/textarea.d.ts.map +1 -0
  272. package/dist/components/ui/textarea.js +38 -0
  273. package/dist/components/ui/textarea.js.map +1 -0
  274. package/dist/components/ui/time-picker.d.ts +58 -0
  275. package/dist/components/ui/time-picker.d.ts.map +1 -0
  276. package/dist/components/ui/time-picker.js +188 -0
  277. package/dist/components/ui/time-picker.js.map +1 -0
  278. package/dist/components/ui/toggle-group.d.ts +52 -0
  279. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  280. package/dist/components/ui/toggle-group.js +94 -0
  281. package/dist/components/ui/toggle-group.js.map +1 -0
  282. package/dist/components/ui/toggle.d.ts +50 -0
  283. package/dist/components/ui/toggle.d.ts.map +1 -0
  284. package/dist/components/ui/toggle.js +70 -0
  285. package/dist/components/ui/toggle.js.map +1 -0
  286. package/dist/components/ui/tooltip.d.ts +51 -0
  287. package/dist/components/ui/tooltip.d.ts.map +1 -0
  288. package/dist/components/ui/tooltip.js +78 -0
  289. package/dist/components/ui/tooltip.js.map +1 -0
  290. package/dist/hooks/use-dark-mode.d.ts +2 -0
  291. package/dist/hooks/use-dark-mode.d.ts.map +1 -0
  292. package/dist/hooks/use-dark-mode.js +36 -0
  293. package/dist/hooks/use-dark-mode.js.map +1 -0
  294. package/dist/hooks/use-mobile.d.ts +2 -0
  295. package/dist/hooks/use-mobile.d.ts.map +1 -0
  296. package/dist/hooks/use-mobile.js +20 -0
  297. package/dist/hooks/use-mobile.js.map +1 -0
  298. package/dist/index.d.ts +88 -0
  299. package/dist/index.d.ts.map +1 -0
  300. package/dist/index.js +77 -0
  301. package/dist/lib/scope.d.ts +64 -0
  302. package/dist/lib/scope.d.ts.map +1 -0
  303. package/dist/lib/scope.js +74 -0
  304. package/dist/lib/scope.js.map +1 -0
  305. package/dist/lib/utils.d.ts +3 -0
  306. package/dist/lib/utils.d.ts.map +1 -0
  307. package/dist/lib/utils.js +11 -0
  308. package/dist/lib/utils.js.map +1 -0
  309. package/dist/styles.css +2 -0
  310. package/dist/theme-tokens.css +537 -0
  311. package/dist/theme.css +417 -0
  312. package/package.json +103 -3
@@ -0,0 +1,46 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/components/ui/skeleton.tsx
4
+ /**
5
+ * Skeleton — pulsing placeholder block that mirrors the shape of content still loading.
6
+ *
7
+ * A single div with an `animate-pulse` background; no internal shape logic.
8
+ * All sizing/shape comes from
9
+ * utility classes passed via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`).
10
+ */
11
+ function Skeleton({ className, ...props }) {
12
+ return /* @__PURE__ */ jsx("div", {
13
+ "data-slot": "skeleton",
14
+ className: cn("animate-pulse rounded-md bg-muted", className),
15
+ ...props
16
+ });
17
+ }
18
+ /**
19
+ * WHEN TO USE
20
+ * - Initial data fetch for a region whose layout is already known — lists, cards, tables — so the placeholder mirrors the real content shape.
21
+ * - Composing multiple Skeletons together (e.g. an avatar circle plus two text lines) to approximate a specific card or row.
22
+ *
23
+ * NOT WHEN
24
+ * - Action-level feedback on a button or small control — use Spinner instead.
25
+ * - Loads short enough to flash (under ~300ms) — a flashing skeleton reads as a glitch, not loading.
26
+ * - The final layout isn't known yet — an inaccurate placeholder is worse than a generic spinner.
27
+ *
28
+ * KEY RULES
29
+ * - Skeleton has no default size — always pass explicit sizing via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`) to match the real content.
30
+ * - Shape should mirror the content it stands in for: circles for avatars, matching line-heights/widths for text.
31
+ *
32
+ * USAGE
33
+ * <Skeleton className="h-4 w-48" />
34
+ *
35
+ * <div className="flex items-center gap-4">
36
+ * <Skeleton className="size-12 rounded-full" />
37
+ * <div className="grid flex-1 gap-2">
38
+ * <Skeleton className="h-4 w-full" />
39
+ * <Skeleton className="h-4 w-3/5" />
40
+ * </div>
41
+ * </div>
42
+ */
43
+ //#endregion
44
+ export { Skeleton };
45
+
46
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../../src/components/ui/skeleton.tsx"],"sourcesContent":["/**\n * Skeleton — pulsing placeholder block that mirrors the shape of content still loading.\n *\n * A single div with an `animate-pulse` background; no internal shape logic.\n * All sizing/shape comes from\n * utility classes passed via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`).\n */\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n\n/**\n * WHEN TO USE\n * - Initial data fetch for a region whose layout is already known — lists, cards, tables — so the placeholder mirrors the real content shape.\n * - Composing multiple Skeletons together (e.g. an avatar circle plus two text lines) to approximate a specific card or row.\n *\n * NOT WHEN\n * - Action-level feedback on a button or small control — use Spinner instead.\n * - Loads short enough to flash (under ~300ms) — a flashing skeleton reads as a glitch, not loading.\n * - The final layout isn't known yet — an inaccurate placeholder is worse than a generic spinner.\n *\n * KEY RULES\n * - Skeleton has no default size — always pass explicit sizing via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`) to match the real content.\n * - Shape should mirror the content it stands in for: circles for avatars, matching line-heights/widths for text.\n *\n * USAGE\n * <Skeleton className=\"h-4 w-48\" />\n *\n * <div className=\"flex items-center gap-4\">\n * <Skeleton className=\"size-12 rounded-full\" />\n * <div className=\"grid flex-1 gap-2\">\n * <Skeleton className=\"h-4 w-full\" />\n * <Skeleton className=\"h-4 w-3/5\" />\n * </div>\n * </div>\n */\n"],"mappings":";;;;;;;;;;AAUA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qCAAqC,SAAS;EAC5D,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Slider — draggable thumb control for picking a value or span within bounds.
3
+ *
4
+ * Built on the Radix Slider primitive. Thumb count is derived from
5
+ * `value`/`defaultValue` length (one number = one thumb, two = a range).
6
+ */
7
+ import * as React from "react";
8
+ import { Slider as SliderPrimitive } from "radix-ui";
9
+ declare function Slider({ className, defaultValue, value, min, max, disabled, "aria-label": ariaLabel, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>): React.JSX.Element;
10
+ export { Slider };
11
+ /**
12
+ * WHEN TO USE
13
+ * - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).
14
+ * - `orientation="vertical"` for vertical layouts.
15
+ *
16
+ * NOT WHEN
17
+ * - Exact numeric entry matters — use Input type="number" instead.
18
+ * - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).
19
+ *
20
+ * KEY RULES
21
+ * - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.
22
+ * - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).
23
+ * - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.
24
+ * - `disabled` dims the whole control automatically — no separate disabled styling needed.
25
+ * - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only
26
+ * reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role="slider"`
27
+ * thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range
28
+ * slider's two thumbs get it suffixed "(min)"/"(max)" automatically).
29
+ *
30
+ * USAGE
31
+ * <Slider defaultValue={[50]} max={100} step={1} />
32
+ *
33
+ * // Range (two thumbs)
34
+ * <Slider defaultValue={[25, 75]} max={100} step={1} />
35
+ *
36
+ * // Vertical
37
+ * <Slider defaultValue={[50]} max={100} orientation="vertical" />
38
+ */
39
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/components/ui/slider.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAA;AAIpD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,GAAO,EACP,GAAS,EACT,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,qBAyDnD;AAED,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { cn } from "../../lib/utils.js";
3
+ import * as React from "react";
4
+ import { Slider as Slider$1 } from "radix-ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/ui/slider.tsx
7
+ /**
8
+ * Slider — draggable thumb control for picking a value or span within bounds.
9
+ *
10
+ * Built on the Radix Slider primitive. Thumb count is derived from
11
+ * `value`/`defaultValue` length (one number = one thumb, two = a range).
12
+ */
13
+ function Slider({ className, defaultValue, value, min = 0, max = 100, disabled, "aria-label": ariaLabel, ...props }) {
14
+ const _values = React.useMemo(() => Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max], [
15
+ value,
16
+ defaultValue,
17
+ min,
18
+ max
19
+ ]);
20
+ return /* @__PURE__ */ jsxs(Slider$1.Root, {
21
+ "data-slot": "slider",
22
+ defaultValue,
23
+ value,
24
+ min,
25
+ max,
26
+ disabled,
27
+ className: cn("relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", className),
28
+ ...props,
29
+ children: [/* @__PURE__ */ jsx(Slider$1.Track, {
30
+ "data-slot": "slider-track",
31
+ className: "relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1",
32
+ children: /* @__PURE__ */ jsx(Slider$1.Range, {
33
+ "data-slot": "slider-range",
34
+ className: "absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
35
+ })
36
+ }), Array.from({ length: _values.length }, (_, index) => /* @__PURE__ */ jsx(Slider$1.Thumb, {
37
+ "data-slot": "slider-thumb",
38
+ "aria-disabled": disabled || void 0,
39
+ "aria-label": _values.length > 1 ? `${ariaLabel ?? "Slider"} (${index === 0 ? "min" : "max"})` : ariaLabel ?? "Slider",
40
+ className: "relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50"
41
+ }, index))]
42
+ });
43
+ }
44
+ /**
45
+ * WHEN TO USE
46
+ * - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).
47
+ * - `orientation="vertical"` for vertical layouts.
48
+ *
49
+ * NOT WHEN
50
+ * - Exact numeric entry matters — use Input type="number" instead.
51
+ * - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).
52
+ *
53
+ * KEY RULES
54
+ * - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.
55
+ * - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).
56
+ * - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.
57
+ * - `disabled` dims the whole control automatically — no separate disabled styling needed.
58
+ * - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only
59
+ * reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role="slider"`
60
+ * thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range
61
+ * slider's two thumbs get it suffixed "(min)"/"(max)" automatically).
62
+ *
63
+ * USAGE
64
+ * <Slider defaultValue={[50]} max={100} step={1} />
65
+ *
66
+ * // Range (two thumbs)
67
+ * <Slider defaultValue={[25, 75]} max={100} step={1} />
68
+ *
69
+ * // Vertical
70
+ * <Slider defaultValue={[50]} max={100} orientation="vertical" />
71
+ */
72
+ //#endregion
73
+ export { Slider };
74
+
75
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/ui/slider.tsx"],"sourcesContent":["\"use client\"\n\n/**\n * Slider — draggable thumb control for picking a value or span within bounds.\n *\n * Built on the Radix Slider primitive. Thumb count is derived from\n * `value`/`defaultValue` length (one number = one thumb, two = a range).\n */\n\nimport * as React from \"react\"\nimport { Slider as SliderPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n disabled,\n \"aria-label\": ariaLabel,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n )\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n disabled={disabled}\n className={cn(\n \"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className=\"absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n // Radix only puts `aria-disabled` on the root track element, not\n // on the `role=\"slider\"` thumb itself — browse/virtual-cursor\n // screen-reader navigation reaches the thumb independent of tab\n // order, so it needs its own disabled state, not just a removed\n // `tabIndex`.\n aria-disabled={disabled || undefined}\n aria-label={\n // Falls back to a generic name when the consumer forgets one —\n // `role=\"slider\"` has no accessible name otherwise (4.1.2).\n // Prefer passing a real one describing what the value controls.\n _values.length > 1\n ? `${ariaLabel ?? \"Slider\"} (${index === 0 ? \"min\" : \"max\"})`\n : ariaLabel ?? \"Slider\"\n }\n className=\"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n\n/**\n * WHEN TO USE\n * - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).\n * - `orientation=\"vertical\"` for vertical layouts.\n *\n * NOT WHEN\n * - Exact numeric entry matters — use Input type=\"number\" instead.\n * - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).\n *\n * KEY RULES\n * - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.\n * - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).\n * - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.\n * - `disabled` dims the whole control automatically — no separate disabled styling needed.\n * - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only\n * reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role=\"slider\"`\n * thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range\n * slider's two thumbs get it suffixed \"(min)\"/\"(max)\" automatically).\n *\n * USAGE\n * <Slider defaultValue={[50]} max={100} step={1} />\n *\n * // Range (two thumbs)\n * <Slider defaultValue={[25, 75]} max={100} step={1} />\n *\n * // Vertical\n * <Slider defaultValue={[50]} max={100} orientation=\"vertical\" />\n */\n"],"mappings":";;;;;;;;;;;;AAcA,SAAS,OAAO,EACd,WACA,cACA,OACA,MAAM,GACN,MAAM,KACN,UACA,cAAc,WACd,GAAG,SACiD;CACpD,MAAM,UAAU,MAAM,cAElB,MAAM,QAAQ,KAAK,IACf,QACA,MAAM,QAAQ,YAAY,IACxB,eACA,CAAC,KAAK,GAAG,GACjB;EAAC;EAAO;EAAc;EAAK;CAAG,CAChC;CAEA,OACE,qBAAC,SAAgB,MAAjB;EACE,aAAU;EACI;EACP;EACF;EACA;EACK;EACV,WAAW,GACT,qOACA,SACF;EACA,GAAI;EAXN,UAAA,CAaE,oBAAC,SAAgB,OAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,SAAgB,OAAjB;IACE,aAAU;IACV,WAAU;GACX,CAAA;EACoB,CAAA,GACtB,MAAM,KAAK,EAAE,QAAQ,QAAQ,OAAO,IAAI,GAAG,UAC1C,oBAAC,SAAgB,OAAjB;GACE,aAAU;GAOV,iBAAe,YAAY,KAAA;GAC3B,cAIE,QAAQ,SAAS,IACb,GAAG,aAAa,SAAS,IAAI,UAAU,IAAI,QAAQ,MAAM,KACzD,aAAa;GAEnB,WAAU;EACX,GAhBM,KAgBN,CACF,CACmB;;AAE1B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Toaster — host that renders transient toast notifications fired from anywhere in the app.
3
+ *
4
+ * Pre-wires the `sonner` library's `<Toaster />` with themed icons AND
5
+ * colors for success/info/warning/error — `richColors` plus a status-token
6
+ * override so each type gets MMDS's own success/info/warning/destructive
7
+ * bg-light/border/text triad instead of sonner's hardcoded default hues.
8
+ * `loading` stays neutral (`--normal-*`), matching the icon-only treatment.
9
+ * Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on
10
+ * `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers
11
+ * aren't forced into a theme provider — pass `theme` explicitly to override.
12
+ */
13
+ import { type ToasterProps } from "sonner";
14
+ /**
15
+ * Theme is resolved from the `dark` class on `<html>` rather than from
16
+ * `next-themes`, so the design system doesn't drag
17
+ * a theme provider into every consumer. Pass `theme` explicitly to override —
18
+ * e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.
19
+ */
20
+ declare const Toaster: ({ ...props }: ToasterProps) => import("react").JSX.Element;
21
+ export { Toaster };
22
+ /**
23
+ * WHEN TO USE
24
+ * - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.
25
+ * - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.
26
+ * - A toast with an inline action (e.g. "Undo") via the `action` option.
27
+ *
28
+ * NOT WHEN
29
+ * - Information that must stay visible until resolved — use Alert instead.
30
+ * - Anything requiring the user to make a decision before continuing — use AlertDialog instead.
31
+ * - Form validation feedback — use Field + FieldError instead.
32
+ *
33
+ * KEY RULES
34
+ * - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from "sonner"`, not by importing this file's `Toaster` directly.
35
+ * - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.
36
+ * - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.
37
+ *
38
+ * USAGE
39
+ * <Toaster />
40
+ * <Button onClick={() => toast("Deployment started")}>Show toast</Button>
41
+ *
42
+ * <Button onClick={() => toast.success("Build succeeded")}>Success</Button>
43
+ * <Button onClick={() => toast.error("Build failed")}>Error</Button>
44
+ *
45
+ * <Button
46
+ * onClick={() =>
47
+ * toast("Component deleted", {
48
+ * description: "button.tsx was removed from the registry.",
49
+ * action: { label: "Undo", onClick: () => toast("Restored") },
50
+ * })
51
+ * }
52
+ * >
53
+ * Show toast with action
54
+ * </Button>
55
+ */
56
+ //# sourceMappingURL=sonner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sonner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAW7D;;;;;GAKG;AACH,QAAA,MAAM,OAAO,GAAI,cAAc,YAAY,gCAqD1C,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG"}
@@ -0,0 +1,96 @@
1
+ import { useIsDarkMode } from "../../hooks/use-dark-mode.js";
2
+ import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon } from "lucide-react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Toaster as Toaster$1 } from "sonner";
5
+ //#region src/components/ui/sonner.tsx
6
+ /**
7
+ * Toaster — host that renders transient toast notifications fired from anywhere in the app.
8
+ *
9
+ * Pre-wires the `sonner` library's `<Toaster />` with themed icons AND
10
+ * colors for success/info/warning/error — `richColors` plus a status-token
11
+ * override so each type gets MMDS's own success/info/warning/destructive
12
+ * bg-light/border/text triad instead of sonner's hardcoded default hues.
13
+ * `loading` stays neutral (`--normal-*`), matching the icon-only treatment.
14
+ * Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on
15
+ * `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers
16
+ * aren't forced into a theme provider — pass `theme` explicitly to override.
17
+ */
18
+ /**
19
+ * Theme is resolved from the `dark` class on `<html>` rather than from
20
+ * `next-themes`, so the design system doesn't drag
21
+ * a theme provider into every consumer. Pass `theme` explicitly to override —
22
+ * e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.
23
+ */
24
+ var Toaster = ({ ...props }) => {
25
+ const isDark = useIsDarkMode();
26
+ return /* @__PURE__ */ jsx(Toaster$1, {
27
+ theme: isDark ? "dark" : "light",
28
+ className: "toaster group",
29
+ richColors: true,
30
+ icons: {
31
+ success: /* @__PURE__ */ jsx(CircleCheckIcon, { className: "size-4" }),
32
+ info: /* @__PURE__ */ jsx(InfoIcon, { className: "size-4" }),
33
+ warning: /* @__PURE__ */ jsx(TriangleAlertIcon, { className: "size-4" }),
34
+ error: /* @__PURE__ */ jsx(OctagonXIcon, { className: "size-4" }),
35
+ loading: /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" })
36
+ },
37
+ style: {
38
+ "--normal-bg": "var(--popover)",
39
+ "--normal-text": "var(--popover-foreground)",
40
+ "--normal-border": "var(--border)",
41
+ "--border-radius": "var(--radius)",
42
+ "--success-bg": "var(--color-success-light)",
43
+ "--success-border": "var(--color-success)",
44
+ "--success-text": "var(--color-success-text)",
45
+ "--info-bg": "var(--color-info-light)",
46
+ "--info-border": "var(--color-info)",
47
+ "--info-text": "var(--color-info-text)",
48
+ "--warning-bg": "var(--color-warning-light)",
49
+ "--warning-border": "var(--color-warning)",
50
+ "--warning-text": "var(--color-warning-text)",
51
+ "--error-bg": "var(--color-destructive-light)",
52
+ "--error-border": "var(--color-destructive)",
53
+ "--error-text": "var(--color-destructive-text)"
54
+ },
55
+ toastOptions: { classNames: { toast: "cn-toast" } },
56
+ ...props
57
+ });
58
+ };
59
+ /**
60
+ * WHEN TO USE
61
+ * - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.
62
+ * - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.
63
+ * - A toast with an inline action (e.g. "Undo") via the `action` option.
64
+ *
65
+ * NOT WHEN
66
+ * - Information that must stay visible until resolved — use Alert instead.
67
+ * - Anything requiring the user to make a decision before continuing — use AlertDialog instead.
68
+ * - Form validation feedback — use Field + FieldError instead.
69
+ *
70
+ * KEY RULES
71
+ * - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from "sonner"`, not by importing this file's `Toaster` directly.
72
+ * - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.
73
+ * - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.
74
+ *
75
+ * USAGE
76
+ * <Toaster />
77
+ * <Button onClick={() => toast("Deployment started")}>Show toast</Button>
78
+ *
79
+ * <Button onClick={() => toast.success("Build succeeded")}>Success</Button>
80
+ * <Button onClick={() => toast.error("Build failed")}>Error</Button>
81
+ *
82
+ * <Button
83
+ * onClick={() =>
84
+ * toast("Component deleted", {
85
+ * description: "button.tsx was removed from the registry.",
86
+ * action: { label: "Undo", onClick: () => toast("Restored") },
87
+ * })
88
+ * }
89
+ * >
90
+ * Show toast with action
91
+ * </Button>
92
+ */
93
+ //#endregion
94
+ export { Toaster };
95
+
96
+ //# sourceMappingURL=sonner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.js","names":[],"sources":["../../../src/components/ui/sonner.tsx"],"sourcesContent":["/**\n * Toaster — host that renders transient toast notifications fired from anywhere in the app.\n *\n * Pre-wires the `sonner` library's `<Toaster />` with themed icons AND\n * colors for success/info/warning/error — `richColors` plus a status-token\n * override so each type gets MMDS's own success/info/warning/destructive\n * bg-light/border/text triad instead of sonner's hardcoded default hues.\n * `loading` stays neutral (`--normal-*`), matching the icon-only treatment.\n * Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on\n * `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers\n * aren't forced into a theme provider — pass `theme` explicitly to override.\n */\n\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\nimport {\n CircleCheckIcon,\n InfoIcon,\n TriangleAlertIcon,\n OctagonXIcon,\n Loader2Icon,\n} from \"lucide-react\"\n\nimport { useIsDarkMode } from \"@/hooks/use-dark-mode\"\n\n/**\n * Theme is resolved from the `dark` class on `<html>` rather than from\n * `next-themes`, so the design system doesn't drag\n * a theme provider into every consumer. Pass `theme` explicitly to override —\n * e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.\n */\nconst Toaster = ({ ...props }: ToasterProps) => {\n const isDark = useIsDarkMode()\n\n return (\n <Sonner\n theme={isDark ? \"dark\" : \"light\"}\n className=\"toaster group\"\n // Sonner only applies its per-type `--success-*`/`--error-*`/etc.\n // variables (below) when `richColors` is on — otherwise every type\n // falls back to `--normal-*` regardless of icon, and success/error/\n // warning/info toasts render visually identical.\n richColors\n icons={{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n // Same bg-light/border-base/text-text triad Badge's own\n // outline+colored-icon status convention uses — overrides\n // sonner's hardcoded default HSLs with MMDS's status tokens.\n \"--success-bg\": \"var(--color-success-light)\",\n \"--success-border\": \"var(--color-success)\",\n \"--success-text\": \"var(--color-success-text)\",\n \"--info-bg\": \"var(--color-info-light)\",\n \"--info-border\": \"var(--color-info)\",\n \"--info-text\": \"var(--color-info-text)\",\n \"--warning-bg\": \"var(--color-warning-light)\",\n \"--warning-border\": \"var(--color-warning)\",\n \"--warning-text\": \"var(--color-warning-text)\",\n // Sonner has no separate \"alert\" tier — its `error` type maps to\n // MMDS's `destructive` family (tokens.md: \"Errors, destructive\n // actions\"), the same mapping toast.error() implies semantically.\n \"--error-bg\": \"var(--color-destructive-light)\",\n \"--error-border\": \"var(--color-destructive)\",\n \"--error-text\": \"var(--color-destructive-text)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n\n/**\n * WHEN TO USE\n * - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.\n * - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.\n * - A toast with an inline action (e.g. \"Undo\") via the `action` option.\n *\n * NOT WHEN\n * - Information that must stay visible until resolved — use Alert instead.\n * - Anything requiring the user to make a decision before continuing — use AlertDialog instead.\n * - Form validation feedback — use Field + FieldError instead.\n *\n * KEY RULES\n * - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from \"sonner\"`, not by importing this file's `Toaster` directly.\n * - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.\n * - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.\n *\n * USAGE\n * <Toaster />\n * <Button onClick={() => toast(\"Deployment started\")}>Show toast</Button>\n *\n * <Button onClick={() => toast.success(\"Build succeeded\")}>Success</Button>\n * <Button onClick={() => toast.error(\"Build failed\")}>Error</Button>\n *\n * <Button\n * onClick={() =>\n * toast(\"Component deleted\", {\n * description: \"button.tsx was removed from the registry.\",\n * action: { label: \"Undo\", onClick: () => toast(\"Restored\") },\n * })\n * }\n * >\n * Show toast with action\n * </Button>\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAM,WAAW,EAAE,GAAG,YAA0B;CAC9C,MAAM,SAAS,cAAc;CAE7B,OACE,oBAAC,WAAD;EACE,OAAO,SAAS,SAAS;EACzB,WAAU;EAKV,YAAA;EACA,OAAO;GACL,SAAS,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA;GAC9C,MAAM,oBAAC,UAAD,EAAU,WAAU,SAAU,CAAA;GACpC,SAAS,oBAAC,mBAAD,EAAmB,WAAU,SAAU,CAAA;GAChD,OAAO,oBAAC,cAAD,EAAc,WAAU,SAAU,CAAA;GACzC,SAAS,oBAAC,aAAD,EAAa,WAAU,sBAAuB,CAAA;EACzD;EACA,OACE;GACE,eAAe;GACf,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GAInB,gBAAgB;GAChB,oBAAoB;GACpB,kBAAkB;GAClB,aAAa;GACb,iBAAiB;GACjB,eAAe;GACf,gBAAgB;GAChB,oBAAoB;GACpB,kBAAkB;GAIlB,cAAc;GACd,kBAAkB;GAClB,gBAAgB;EAClB;EAEF,cAAc,EACZ,YAAY,EACV,OAAO,WACT,EACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Spinner — small indeterminate loading indicator for inline/action-level feedback.
3
+ *
4
+ * A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no
5
+ * wrapper element.
6
+ */
7
+ declare function Spinner({ className, ...props }: React.ComponentProps<"svg">): import("react").JSX.Element;
8
+ export { Spinner };
9
+ /**
10
+ * WHEN TO USE
11
+ * - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.
12
+ * - Small inline load indicators where the surrounding layout is already stable.
13
+ *
14
+ * NOT WHEN
15
+ * - Loading a whole region with a known layout — use Skeleton instead.
16
+ * - Progress is measurable — use Progress instead.
17
+ *
18
+ * KEY RULES
19
+ * - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.
20
+ * - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.
21
+ * - Renders as a single `<svg>` with `role="status"` and `aria-label="Loading"` already applied — don't wrap it in another status/live-region element.
22
+ *
23
+ * USAGE
24
+ * <Spinner />
25
+ *
26
+ * <div className="flex items-center gap-4">
27
+ * <Spinner className="size-3" />
28
+ * <Spinner className="size-6" />
29
+ * <Spinner className="size-8" />
30
+ * </div>
31
+ *
32
+ * <Button disabled>
33
+ * <Spinner />
34
+ * Saving
35
+ * </Button>
36
+ */
37
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/spinner.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,iBAAS,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAUpE;AAED,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
@@ -0,0 +1,51 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { Loader2Icon } from "lucide-react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/ui/spinner.tsx
5
+ /**
6
+ * Spinner — small indeterminate loading indicator for inline/action-level feedback.
7
+ *
8
+ * A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no
9
+ * wrapper element.
10
+ */
11
+ function Spinner({ className, ...props }) {
12
+ return /* @__PURE__ */ jsx(Loader2Icon, {
13
+ "data-slot": "spinner",
14
+ role: "status",
15
+ "aria-label": "Loading",
16
+ className: cn("size-4 animate-spin", className),
17
+ ...props
18
+ });
19
+ }
20
+ /**
21
+ * WHEN TO USE
22
+ * - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.
23
+ * - Small inline load indicators where the surrounding layout is already stable.
24
+ *
25
+ * NOT WHEN
26
+ * - Loading a whole region with a known layout — use Skeleton instead.
27
+ * - Progress is measurable — use Progress instead.
28
+ *
29
+ * KEY RULES
30
+ * - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.
31
+ * - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.
32
+ * - Renders as a single `<svg>` with `role="status"` and `aria-label="Loading"` already applied — don't wrap it in another status/live-region element.
33
+ *
34
+ * USAGE
35
+ * <Spinner />
36
+ *
37
+ * <div className="flex items-center gap-4">
38
+ * <Spinner className="size-3" />
39
+ * <Spinner className="size-6" />
40
+ * <Spinner className="size-8" />
41
+ * </div>
42
+ *
43
+ * <Button disabled>
44
+ * <Spinner />
45
+ * Saving
46
+ * </Button>
47
+ */
48
+ //#endregion
49
+ export { Spinner };
50
+
51
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","names":[],"sources":["../../../src/components/ui/spinner.tsx"],"sourcesContent":["/**\n * Spinner — small indeterminate loading indicator for inline/action-level feedback.\n *\n * A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no\n * wrapper element.\n */\n\nimport { cn } from \"@/lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon\n data-slot=\"spinner\"\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\"size-4 animate-spin\", className)}\n {...props}\n />\n )\n}\n\nexport { Spinner }\n\n/**\n * WHEN TO USE\n * - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.\n * - Small inline load indicators where the surrounding layout is already stable.\n *\n * NOT WHEN\n * - Loading a whole region with a known layout — use Skeleton instead.\n * - Progress is measurable — use Progress instead.\n *\n * KEY RULES\n * - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.\n * - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.\n * - Renders as a single `<svg>` with `role=\"status\"` and `aria-label=\"Loading\"` already applied — don't wrap it in another status/live-region element.\n *\n * USAGE\n * <Spinner />\n *\n * <div className=\"flex items-center gap-4\">\n * <Spinner className=\"size-3\" />\n * <Spinner className=\"size-6\" />\n * <Spinner className=\"size-8\" />\n * </div>\n *\n * <Button disabled>\n * <Spinner />\n * Saving\n * </Button>\n */\n"],"mappings":";;;;;;;;;;AAUA,SAAS,QAAQ,EAAE,WAAW,GAAG,SAAsC;CACrE,OACE,oBAAC,aAAD;EACE,aAAU;EACV,MAAK;EACL,cAAW;EACX,WAAW,GAAG,uBAAuB,SAAS;EAC9C,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Stepper — a horizontal sequence of named steps with pending/done state.
3
+ *
4
+ * A thin composite over Tabs, not a new primitive: `StepperList`/
5
+ * `StepperTrigger`/`StepperContent` are Tabs' own List/Trigger/Content,
6
+ * restyled — the same Radix Tabs keyboard/roving-focus/panel behavior
7
+ * applies unchanged. `StepperTrigger` adds one thing Tabs doesn't have: a
8
+ * leading step-circle icon (empty for pending, checked for done), using the
9
+ * same `data-icon="inline-start"` slot convention as Tabs' own icon support
10
+ * (see Tabs' "With icons" story) — not a new icon prop shape.
11
+ */
12
+ import * as React from "react";
13
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from "../../components/ui/tabs";
14
+ declare function Stepper({ children, ...props }: React.ComponentProps<typeof Tabs>): React.JSX.Element;
15
+ declare function StepperList({ ...props }: React.ComponentProps<typeof TabsList>): React.JSX.Element;
16
+ declare function StepperTrigger({ status, className, children, ...props }: React.ComponentProps<typeof TabsTrigger> & {
17
+ /** "pending" (empty circle, default) | "done" (filled circle with a check) — independent of whether this step is the currently active one, which Tabs' own active styling already communicates. */
18
+ status?: "pending" | "done";
19
+ }): React.JSX.Element;
20
+ declare function StepperContent({ ...props }: React.ComponentProps<typeof TabsContent>): React.JSX.Element;
21
+ export { Stepper, StepperList, StepperTrigger, StepperContent };
22
+ /**
23
+ * WHEN TO USE
24
+ * - A short, ordered sequence of named steps the user moves through, where
25
+ * each step's completion state matters — account setup, a multi-part
26
+ * form's section nav, an order/shipment progress row.
27
+ *
28
+ * NOT WHEN
29
+ * - The steps are actually a full one-question-at-a-time form flow with its
30
+ * own Previous/Next/Submit navigation — use Questionnaire, which has that
31
+ * built in (its `QuestionnaireProgress` is a plain text label, not this).
32
+ * - The panels are unrelated views with no inherent order or completion
33
+ * state — use plain Tabs.
34
+ * - Showing hierarchical position, not sequence — use Breadcrumb.
35
+ *
36
+ * KEY RULES
37
+ * - It's Tabs underneath: same `value`/`defaultValue`/`onValueChange` on
38
+ * Stepper, same `variant`/`size` on StepperList, same `disabled` per
39
+ * trigger, same `orientation="vertical"` for a side-by-side layout.
40
+ * - `status` on StepperTrigger ("pending" default | "done") is independent
41
+ * of which step is currently active: a step can be active-and-pending
42
+ * (viewing unfinished work) or inactive-and-done (already completed, user
43
+ * has since moved on). A pending circle's outline is `border-current`, so
44
+ * it automatically tracks whatever color TabsTrigger's own hover/active
45
+ * rules put on the trigger's text — muted normally, primary when it's the
46
+ * active step, primary-hover on hover — the same currentColor mechanism a
47
+ * plain lucide icon in Tabs already gets for free, not extra state here.
48
+ * A "done" circle stays a fixed filled primary regardless of hover/active,
49
+ * since completion should read as stable, not reactive to the pointer.
50
+ * - Tracking which steps are "done" is the consumer's own state — Stepper
51
+ * doesn't infer completion from navigation; nothing marks a step done
52
+ * just because the user moved past it.
53
+ * - A step transitioning to `status="done"` is announced via a shared sr-only live region on
54
+ * Stepper itself (not just the trigger's own `, done` text) — the common "finish step N, focus
55
+ * moves to N+1, step N flips to done behind you" flow still reaches screen-reader users.
56
+ * - No connector line between circles — this is triggers-in-a-row, same
57
+ * visual weight as Tabs. Compose one in yourself (an absolutely
58
+ * positioned `border-t` between items) if a specific design calls for it.
59
+ *
60
+ * USAGE
61
+ * <Stepper defaultValue="account">
62
+ * <StepperList>
63
+ * <StepperTrigger value="account" status="done">Account</StepperTrigger>
64
+ * <StepperTrigger value="profile" status="pending">Profile</StepperTrigger>
65
+ * <StepperTrigger value="review" status="pending">Review</StepperTrigger>
66
+ * </StepperList>
67
+ * <StepperContent value="account">...</StepperContent>
68
+ * <StepperContent value="profile">...</StepperContent>
69
+ * <StepperContent value="review">...</StepperContent>
70
+ * </Stepper>
71
+ *
72
+ * // Vertical — StepperList stacks in a column, StepperContent sits beside
73
+ * // it, exactly like Tabs' own orientation="vertical" (no Stepper-specific
74
+ * // layout code involved).
75
+ * <Stepper defaultValue="account" orientation="vertical" className="flex-row gap-6">
76
+ * <StepperList className="flex-col">
77
+ * <StepperTrigger value="account" status="done">Account</StepperTrigger>
78
+ * <StepperTrigger value="profile" status="pending">Profile</StepperTrigger>
79
+ * </StepperList>
80
+ * <StepperContent value="account">...</StepperContent>
81
+ * <StepperContent value="profile">...</StepperContent>
82
+ * </Stepper>
83
+ */
84
+ //# sourceMappingURL=stepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.d.ts","sourceRoot":"","sources":["../../../src/components/ui/stepper.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAW/E,iBAAS,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,qBAYzE;AAED,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvE;AAED,iBAAS,cAAc,CAAC,EACtB,MAAkB,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,GAAG;IAC5C,mMAAmM;IACnM,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAC5B,qBAuCA;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,qBAE7E;AAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG"}