@invergent/ui-sdk 0.0.0-stage → 2.19.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 (332) hide show
  1. package/README.md +62 -2
  2. package/dist/accordion.cjs +97 -0
  3. package/dist/accordion.cjs.map +1 -0
  4. package/dist/accordion.d.cts +10 -0
  5. package/dist/accordion.d.ts +10 -0
  6. package/dist/accordion.js +92 -0
  7. package/dist/accordion.js.map +1 -0
  8. package/dist/alert.cjs +82 -0
  9. package/dist/alert.cjs.map +1 -0
  10. package/dist/alert.d.cts +14 -0
  11. package/dist/alert.d.ts +14 -0
  12. package/dist/alert.js +77 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/avatar.cjs +110 -0
  15. package/dist/avatar.cjs.map +1 -0
  16. package/dist/avatar.d.cts +14 -0
  17. package/dist/avatar.d.ts +14 -0
  18. package/dist/avatar.js +103 -0
  19. package/dist/avatar.js.map +1 -0
  20. package/dist/badge.cjs +47 -0
  21. package/dist/badge.cjs.map +1 -0
  22. package/dist/badge.d.cts +13 -0
  23. package/dist/badge.d.ts +13 -0
  24. package/dist/badge.js +44 -0
  25. package/dist/badge.js.map +1 -0
  26. package/dist/brand-beam.cjs +2303 -0
  27. package/dist/brand-beam.cjs.map +1 -0
  28. package/dist/brand-beam.d.cts +36 -0
  29. package/dist/brand-beam.d.ts +36 -0
  30. package/dist/brand-beam.js +2301 -0
  31. package/dist/brand-beam.js.map +1 -0
  32. package/dist/button.cjs +17 -0
  33. package/dist/button.cjs.map +1 -0
  34. package/dist/button.d.cts +14 -0
  35. package/dist/button.d.ts +14 -0
  36. package/dist/button.js +4 -0
  37. package/dist/button.js.map +1 -0
  38. package/dist/card.cjs +109 -0
  39. package/dist/card.cjs.map +1 -0
  40. package/dist/card.d.cts +14 -0
  41. package/dist/card.d.ts +14 -0
  42. package/dist/card.js +101 -0
  43. package/dist/card.js.map +1 -0
  44. package/dist/chart.cjs +275 -0
  45. package/dist/chart.cjs.map +1 -0
  46. package/dist/chart.d.cts +47 -0
  47. package/dist/chart.d.ts +47 -0
  48. package/dist/chart.js +247 -0
  49. package/dist/chart.js.map +1 -0
  50. package/dist/checkbox.cjs +41 -0
  51. package/dist/checkbox.cjs.map +1 -0
  52. package/dist/checkbox.d.cts +7 -0
  53. package/dist/checkbox.d.ts +7 -0
  54. package/dist/checkbox.js +39 -0
  55. package/dist/checkbox.js.map +1 -0
  56. package/dist/chip.cjs +92 -0
  57. package/dist/chip.cjs.map +1 -0
  58. package/dist/chip.d.cts +33 -0
  59. package/dist/chip.d.ts +33 -0
  60. package/dist/chip.js +86 -0
  61. package/dist/chip.js.map +1 -0
  62. package/dist/choice-card.cjs +127 -0
  63. package/dist/choice-card.cjs.map +1 -0
  64. package/dist/choice-card.d.cts +20 -0
  65. package/dist/choice-card.d.ts +20 -0
  66. package/dist/choice-card.js +124 -0
  67. package/dist/choice-card.js.map +1 -0
  68. package/dist/chunk-2UHRDVPT.cjs +183 -0
  69. package/dist/chunk-2UHRDVPT.cjs.map +1 -0
  70. package/dist/chunk-5CRE35VX.js +20 -0
  71. package/dist/chunk-5CRE35VX.js.map +1 -0
  72. package/dist/chunk-6ARYCL4L.cjs +30 -0
  73. package/dist/chunk-6ARYCL4L.cjs.map +1 -0
  74. package/dist/chunk-6JCVTRUK.js +21 -0
  75. package/dist/chunk-6JCVTRUK.js.map +1 -0
  76. package/dist/chunk-6YHDDRIM.cjs +13 -0
  77. package/dist/chunk-6YHDDRIM.cjs.map +1 -0
  78. package/dist/chunk-A44JJ6NH.js +58 -0
  79. package/dist/chunk-A44JJ6NH.js.map +1 -0
  80. package/dist/chunk-CPAFEXKR.js +63 -0
  81. package/dist/chunk-CPAFEXKR.js.map +1 -0
  82. package/dist/chunk-CTIEUG5L.js +28 -0
  83. package/dist/chunk-CTIEUG5L.js.map +1 -0
  84. package/dist/chunk-DSDDDYG3.cjs +60 -0
  85. package/dist/chunk-DSDDDYG3.cjs.map +1 -0
  86. package/dist/chunk-IB7LTHEQ.js +55 -0
  87. package/dist/chunk-IB7LTHEQ.js.map +1 -0
  88. package/dist/chunk-ID7MWMJO.cjs +162 -0
  89. package/dist/chunk-ID7MWMJO.cjs.map +1 -0
  90. package/dist/chunk-IVMZANP7.cjs +67 -0
  91. package/dist/chunk-IVMZANP7.cjs.map +1 -0
  92. package/dist/chunk-L73QIINW.js +157 -0
  93. package/dist/chunk-L73QIINW.js.map +1 -0
  94. package/dist/chunk-LZGII7SX.js +11 -0
  95. package/dist/chunk-LZGII7SX.js.map +1 -0
  96. package/dist/chunk-M677T75H.js +24 -0
  97. package/dist/chunk-M677T75H.js.map +1 -0
  98. package/dist/chunk-OAVCB3MR.cjs +26 -0
  99. package/dist/chunk-OAVCB3MR.cjs.map +1 -0
  100. package/dist/chunk-RVX6SN4U.cjs +23 -0
  101. package/dist/chunk-RVX6SN4U.cjs.map +1 -0
  102. package/dist/chunk-T74Z3WTK.js +151 -0
  103. package/dist/chunk-T74Z3WTK.js.map +1 -0
  104. package/dist/chunk-UOUXW63J.cjs +22 -0
  105. package/dist/chunk-UOUXW63J.cjs.map +1 -0
  106. package/dist/chunk-VBICNC43.cjs +61 -0
  107. package/dist/chunk-VBICNC43.cjs.map +1 -0
  108. package/dist/collapsible-header.cjs +66 -0
  109. package/dist/collapsible-header.cjs.map +1 -0
  110. package/dist/collapsible-header.d.cts +15 -0
  111. package/dist/collapsible-header.d.ts +15 -0
  112. package/dist/collapsible-header.js +63 -0
  113. package/dist/collapsible-header.js.map +1 -0
  114. package/dist/collapsible.cjs +38 -0
  115. package/dist/collapsible.cjs.map +1 -0
  116. package/dist/collapsible.d.cts +8 -0
  117. package/dist/collapsible.d.ts +8 -0
  118. package/dist/collapsible.js +34 -0
  119. package/dist/collapsible.js.map +1 -0
  120. package/dist/color-picker.cjs +60 -0
  121. package/dist/color-picker.cjs.map +1 -0
  122. package/dist/color-picker.d.cts +12 -0
  123. package/dist/color-picker.d.ts +12 -0
  124. package/dist/color-picker.js +57 -0
  125. package/dist/color-picker.js.map +1 -0
  126. package/dist/confirm-dialog.cjs +72 -0
  127. package/dist/confirm-dialog.cjs.map +1 -0
  128. package/dist/confirm-dialog.d.cts +19 -0
  129. package/dist/confirm-dialog.d.ts +19 -0
  130. package/dist/confirm-dialog.js +70 -0
  131. package/dist/confirm-dialog.js.map +1 -0
  132. package/dist/control-styles.cjs +16 -0
  133. package/dist/control-styles.cjs.map +1 -0
  134. package/dist/control-styles.d.cts +7 -0
  135. package/dist/control-styles.d.ts +7 -0
  136. package/dist/control-styles.js +10 -0
  137. package/dist/control-styles.js.map +1 -0
  138. package/dist/dialog.cjs +50 -0
  139. package/dist/dialog.cjs.map +1 -0
  140. package/dist/dialog.d.cts +20 -0
  141. package/dist/dialog.d.ts +20 -0
  142. package/dist/dialog.js +5 -0
  143. package/dist/dialog.js.map +1 -0
  144. package/dist/dropdown-menu.cjs +265 -0
  145. package/dist/dropdown-menu.cjs.map +1 -0
  146. package/dist/dropdown-menu.d.cts +32 -0
  147. package/dist/dropdown-menu.d.ts +32 -0
  148. package/dist/dropdown-menu.js +249 -0
  149. package/dist/dropdown-menu.js.map +1 -0
  150. package/dist/empty-state.cjs +50 -0
  151. package/dist/empty-state.cjs.map +1 -0
  152. package/dist/empty-state.d.cts +23 -0
  153. package/dist/empty-state.d.ts +23 -0
  154. package/dist/empty-state.js +47 -0
  155. package/dist/empty-state.js.map +1 -0
  156. package/dist/field.cjs +221 -0
  157. package/dist/field.cjs.map +1 -0
  158. package/dist/field.d.cts +30 -0
  159. package/dist/field.d.ts +30 -0
  160. package/dist/field.js +210 -0
  161. package/dist/field.js.map +1 -0
  162. package/dist/input-group.cjs +148 -0
  163. package/dist/input-group.cjs.map +1 -0
  164. package/dist/input-group.d.cts +20 -0
  165. package/dist/input-group.d.ts +20 -0
  166. package/dist/input-group.js +141 -0
  167. package/dist/input-group.js.map +1 -0
  168. package/dist/input.cjs +13 -0
  169. package/dist/input.cjs.map +1 -0
  170. package/dist/input.d.cts +6 -0
  171. package/dist/input.d.ts +6 -0
  172. package/dist/input.js +4 -0
  173. package/dist/input.js.map +1 -0
  174. package/dist/label.cjs +13 -0
  175. package/dist/label.cjs.map +1 -0
  176. package/dist/label.d.cts +7 -0
  177. package/dist/label.d.ts +7 -0
  178. package/dist/label.js +4 -0
  179. package/dist/label.js.map +1 -0
  180. package/dist/lib/utils.cjs +12 -0
  181. package/dist/lib/utils.cjs.map +1 -0
  182. package/dist/lib/utils.d.cts +5 -0
  183. package/dist/lib/utils.d.ts +5 -0
  184. package/dist/lib/utils.js +3 -0
  185. package/dist/lib/utils.js.map +1 -0
  186. package/dist/list-row.cjs +188 -0
  187. package/dist/list-row.cjs.map +1 -0
  188. package/dist/list-row.d.cts +51 -0
  189. package/dist/list-row.d.ts +51 -0
  190. package/dist/list-row.js +164 -0
  191. package/dist/list-row.js.map +1 -0
  192. package/dist/pill-tabs.cjs +109 -0
  193. package/dist/pill-tabs.cjs.map +1 -0
  194. package/dist/pill-tabs.d.cts +24 -0
  195. package/dist/pill-tabs.d.ts +24 -0
  196. package/dist/pill-tabs.js +107 -0
  197. package/dist/pill-tabs.js.map +1 -0
  198. package/dist/popover.cjs +88 -0
  199. package/dist/popover.cjs.map +1 -0
  200. package/dist/popover.d.cts +13 -0
  201. package/dist/popover.d.ts +13 -0
  202. package/dist/popover.js +80 -0
  203. package/dist/popover.js.map +1 -0
  204. package/dist/progress-bar.cjs +28 -0
  205. package/dist/progress-bar.cjs.map +1 -0
  206. package/dist/progress-bar.d.cts +11 -0
  207. package/dist/progress-bar.d.ts +11 -0
  208. package/dist/progress-bar.js +26 -0
  209. package/dist/progress-bar.js.map +1 -0
  210. package/dist/scroll-area.cjs +63 -0
  211. package/dist/scroll-area.cjs.map +1 -0
  212. package/dist/scroll-area.d.cts +8 -0
  213. package/dist/scroll-area.d.ts +8 -0
  214. package/dist/scroll-area.js +60 -0
  215. package/dist/scroll-area.js.map +1 -0
  216. package/dist/section-label.cjs +30 -0
  217. package/dist/section-label.cjs.map +1 -0
  218. package/dist/section-label.d.cts +13 -0
  219. package/dist/section-label.d.ts +13 -0
  220. package/dist/section-label.js +28 -0
  221. package/dist/section-label.js.map +1 -0
  222. package/dist/segmented-control.cjs +75 -0
  223. package/dist/segmented-control.cjs.map +1 -0
  224. package/dist/segmented-control.d.cts +26 -0
  225. package/dist/segmented-control.d.ts +26 -0
  226. package/dist/segmented-control.js +53 -0
  227. package/dist/segmented-control.js.map +1 -0
  228. package/dist/select.cjs +193 -0
  229. package/dist/select.cjs.map +1 -0
  230. package/dist/select.d.cts +18 -0
  231. package/dist/select.d.ts +18 -0
  232. package/dist/select.js +182 -0
  233. package/dist/select.js.map +1 -0
  234. package/dist/separator.cjs +13 -0
  235. package/dist/separator.cjs.map +1 -0
  236. package/dist/separator.d.cts +7 -0
  237. package/dist/separator.d.ts +7 -0
  238. package/dist/separator.js +4 -0
  239. package/dist/separator.js.map +1 -0
  240. package/dist/sidebar.cjs +29 -0
  241. package/dist/sidebar.cjs.map +1 -0
  242. package/dist/sidebar.d.cts +58 -0
  243. package/dist/sidebar.d.ts +58 -0
  244. package/dist/sidebar.js +4 -0
  245. package/dist/sidebar.js.map +1 -0
  246. package/dist/skeleton.cjs +19 -0
  247. package/dist/skeleton.cjs.map +1 -0
  248. package/dist/skeleton.d.cts +5 -0
  249. package/dist/skeleton.d.ts +5 -0
  250. package/dist/skeleton.js +17 -0
  251. package/dist/skeleton.js.map +1 -0
  252. package/dist/sonner.cjs +40 -0
  253. package/dist/sonner.cjs.map +1 -0
  254. package/dist/sonner.d.cts +6 -0
  255. package/dist/sonner.d.ts +6 -0
  256. package/dist/sonner.js +38 -0
  257. package/dist/sonner.js.map +1 -0
  258. package/dist/sparkline.cjs +44 -0
  259. package/dist/sparkline.cjs.map +1 -0
  260. package/dist/sparkline.d.cts +12 -0
  261. package/dist/sparkline.d.ts +12 -0
  262. package/dist/sparkline.js +42 -0
  263. package/dist/sparkline.js.map +1 -0
  264. package/dist/spinner.cjs +13 -0
  265. package/dist/spinner.cjs.map +1 -0
  266. package/dist/spinner.d.cts +5 -0
  267. package/dist/spinner.d.ts +5 -0
  268. package/dist/spinner.js +11 -0
  269. package/dist/spinner.js.map +1 -0
  270. package/dist/stat-card.cjs +65 -0
  271. package/dist/stat-card.cjs.map +1 -0
  272. package/dist/stat-card.d.cts +22 -0
  273. package/dist/stat-card.d.ts +22 -0
  274. package/dist/stat-card.js +61 -0
  275. package/dist/stat-card.js.map +1 -0
  276. package/dist/status-dot.cjs +32 -0
  277. package/dist/status-dot.cjs.map +1 -0
  278. package/dist/status-dot.d.cts +11 -0
  279. package/dist/status-dot.d.ts +11 -0
  280. package/dist/status-dot.js +29 -0
  281. package/dist/status-dot.js.map +1 -0
  282. package/dist/switch.cjs +38 -0
  283. package/dist/switch.cjs.map +1 -0
  284. package/dist/switch.d.cts +9 -0
  285. package/dist/switch.d.ts +9 -0
  286. package/dist/switch.js +36 -0
  287. package/dist/switch.js.map +1 -0
  288. package/dist/table.cjs +118 -0
  289. package/dist/table.cjs.map +1 -0
  290. package/dist/table.d.cts +13 -0
  291. package/dist/table.d.ts +13 -0
  292. package/dist/table.js +109 -0
  293. package/dist/table.js.map +1 -0
  294. package/dist/tabs.cjs +124 -0
  295. package/dist/tabs.cjs.map +1 -0
  296. package/dist/tabs.d.cts +15 -0
  297. package/dist/tabs.d.ts +15 -0
  298. package/dist/tabs.js +118 -0
  299. package/dist/tabs.js.map +1 -0
  300. package/dist/text-link.cjs +51 -0
  301. package/dist/text-link.cjs.map +1 -0
  302. package/dist/text-link.d.cts +15 -0
  303. package/dist/text-link.d.ts +15 -0
  304. package/dist/text-link.js +48 -0
  305. package/dist/text-link.js.map +1 -0
  306. package/dist/textarea.cjs +13 -0
  307. package/dist/textarea.cjs.map +1 -0
  308. package/dist/textarea.d.cts +6 -0
  309. package/dist/textarea.d.ts +6 -0
  310. package/dist/textarea.js +4 -0
  311. package/dist/textarea.js.map +1 -0
  312. package/dist/theme.css +109 -0
  313. package/dist/toggle-group.cjs +155 -0
  314. package/dist/toggle-group.cjs.map +1 -0
  315. package/dist/toggle-group.d.cts +31 -0
  316. package/dist/toggle-group.d.ts +31 -0
  317. package/dist/toggle-group.js +130 -0
  318. package/dist/toggle-group.js.map +1 -0
  319. package/dist/toggle.cjs +21 -0
  320. package/dist/toggle.cjs.map +1 -0
  321. package/dist/toggle.d.cts +23 -0
  322. package/dist/toggle.d.ts +23 -0
  323. package/dist/toggle.js +4 -0
  324. package/dist/toggle.js.map +1 -0
  325. package/dist/tokens.css +77 -0
  326. package/dist/tooltip.cjs +25 -0
  327. package/dist/tooltip.cjs.map +1 -0
  328. package/dist/tooltip.d.cts +10 -0
  329. package/dist/tooltip.d.ts +10 -0
  330. package/dist/tooltip.js +4 -0
  331. package/dist/tooltip.js.map +1 -0
  332. package/package.json +60 -4
package/dist/chip.js ADDED
@@ -0,0 +1,86 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import { XIcon } from 'lucide-react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var TONE = {
7
+ ok: "bg-emerald-500/12 text-emerald-700 dark:text-emerald-300",
8
+ warn: "bg-amber-500/14 text-amber-700 dark:text-amber-300",
9
+ bad: "bg-red-500/12 text-red-700 dark:text-red-300",
10
+ muted: "bg-foreground/[0.06] text-muted-foreground"
11
+ };
12
+ var chipVariants = cva(
13
+ "inline-flex w-fit shrink-0 items-center gap-1 rounded-full font-medium whitespace-nowrap [&_svg]:pointer-events-none [&_svg]:shrink-0",
14
+ {
15
+ variants: {
16
+ tone: TONE,
17
+ size: {
18
+ sm: "px-2 py-0.5 text-[11.5px]",
19
+ default: "px-2 py-0.5 text-xs",
20
+ lg: "px-2.5 py-0.5 text-sm"
21
+ }
22
+ },
23
+ defaultVariants: { tone: "muted", size: "default" }
24
+ }
25
+ );
26
+ function Chip({
27
+ tone = "muted",
28
+ size = "default",
29
+ onRemove,
30
+ removeLabel = "Remove",
31
+ className,
32
+ children,
33
+ ...props
34
+ }) {
35
+ return /* @__PURE__ */ jsxs(
36
+ "span",
37
+ {
38
+ "data-slot": "chip",
39
+ "data-tone": tone,
40
+ className: cn(chipVariants({ tone, size }), onRemove && "pr-1", className),
41
+ ...props,
42
+ children: [
43
+ children,
44
+ onRemove && /* @__PURE__ */ jsx(
45
+ "button",
46
+ {
47
+ type: "button",
48
+ onMouseDown: (e) => e.preventDefault(),
49
+ onClick: onRemove,
50
+ "aria-label": removeLabel,
51
+ className: "relative inline-flex cursor-pointer items-center justify-center rounded-full border-none bg-transparent p-0.5 text-current opacity-60 transition-opacity outline-none after:absolute after:-inset-1.5 hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring/40",
52
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-2.5" })
53
+ }
54
+ )
55
+ ]
56
+ }
57
+ );
58
+ }
59
+ function TonePill({
60
+ tone,
61
+ className,
62
+ children
63
+ }) {
64
+ return /* @__PURE__ */ jsx(Chip, { tone, size: "sm", className, children });
65
+ }
66
+ function TagPill({
67
+ label,
68
+ onRemove,
69
+ size = "xs",
70
+ className
71
+ }) {
72
+ return /* @__PURE__ */ jsx(
73
+ Chip,
74
+ {
75
+ size: size === "xs" ? "default" : "lg",
76
+ onRemove,
77
+ removeLabel: `Remove tag ${label}`,
78
+ className: cn("font-normal", className),
79
+ children: label
80
+ }
81
+ );
82
+ }
83
+
84
+ export { Chip, TONE, TagPill, TonePill, chipVariants };
85
+ //# sourceMappingURL=chip.js.map
86
+ //# sourceMappingURL=chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chip.tsx"],"names":[],"mappings":";;;;;AAUO,IAAM,IAAA,GAA6B;AAAA,EACxC,EAAA,EAAI,0DAAA;AAAA,EACJ,IAAA,EAAM,oDAAA;AAAA,EACN,GAAA,EAAK,8CAAA;AAAA,EACL,KAAA,EAAO;AACT;AAIA,IAAM,YAAA,GAAe,GAAA;AAAA,EACnB,uIAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,2BAAA;AAAA,QACJ,OAAA,EAAS,qBAAA;AAAA,QACT,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA;AAAU;AAEtD;AAEA,SAAS,IAAA,CAAK;AAAA,EACZ,IAAA,GAAO,OAAA;AAAA,EACP,IAAA,GAAO,SAAA;AAAA,EACP,QAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAOG;AACD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA,CAAG,YAAA,CAAa,EAAE,IAAA,EAAM,MAAM,CAAA,EAAG,QAAA,IAAY,MAAA,EAAQ,SAAS,CAAA;AAAA,MACxE,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,QAAA,oBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YAGL,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,YACrC,OAAA,EAAS,QAAA;AAAA,YACT,YAAA,EAAY,WAAA;AAAA,YAEZ,SAAA,EAAU,mSAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AAC9B;AAAA;AAAA,GAEJ;AAEJ;AAGA,SAAS,QAAA,CAAS;AAAA,EAChB,IAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,2BACG,IAAA,EAAA,EAAK,IAAA,EAAY,IAAA,EAAK,IAAA,EAAK,WACzB,QAAA,EACH,CAAA;AAEJ;AAGA,SAAS,OAAA,CAAQ;AAAA,EACf,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAKG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MAClC,QAAA;AAAA,MACA,WAAA,EAAa,cAAc,KAAK,CAAA,CAAA;AAAA,MAChC,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,MAErC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ","file":"chip.js","sourcesContent":["import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\n\nexport type Tone = \"ok\" | \"warn\" | \"bad\" | \"muted\"\n\n// The Work console's status tones: a faint wash of the colour with text a\n// step darker in light mode and a step lighter in dark.\nexport const TONE: Record<Tone, string> = {\n ok: \"bg-emerald-500/12 text-emerald-700 dark:text-emerald-300\",\n warn: \"bg-amber-500/14 text-amber-700 dark:text-amber-300\",\n bad: \"bg-red-500/12 text-red-700 dark:text-red-300\",\n muted: \"bg-foreground/[0.06] text-muted-foreground\",\n}\n\n// One chip for statuses (TonePill), tags and removable values (TagPill):\n// round, medium weight, tinted by tone.\nconst chipVariants = cva(\n \"inline-flex w-fit shrink-0 items-center gap-1 rounded-full font-medium whitespace-nowrap [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n tone: TONE,\n size: {\n sm: \"px-2 py-0.5 text-[11.5px]\",\n default: \"px-2 py-0.5 text-xs\",\n lg: \"px-2.5 py-0.5 text-sm\",\n },\n },\n defaultVariants: { tone: \"muted\", size: \"default\" },\n }\n)\n\nfunction Chip({\n tone = \"muted\",\n size = \"default\",\n onRemove,\n removeLabel = \"Remove\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"span\"> & {\n tone?: Tone\n size?: \"sm\" | \"default\" | \"lg\"\n /** Shows an × that calls this. */\n onRemove?: () => void\n /** The ×'s accessible name. */\n removeLabel?: string\n}) {\n return (\n <span\n data-slot=\"chip\"\n data-tone={tone}\n className={cn(chipVariants({ tone, size }), onRemove && \"pr-1\", className)}\n {...props}\n >\n {children}\n {onRemove && (\n <button\n type=\"button\"\n // preventDefault on mousedown keeps the adjacent input focused so\n // removing a chip doesn't trigger its blur-to-commit handler.\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemove}\n aria-label={removeLabel}\n // The × is 10px; the overlay gives it a usable hit area.\n className=\"relative inline-flex cursor-pointer items-center justify-center rounded-full border-none bg-transparent p-0.5 text-current opacity-60 transition-opacity outline-none after:absolute after:-inset-1.5 hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n <XIcon className=\"size-2.5\" />\n </button>\n )}\n </span>\n )\n}\n\n/** A status chip (\"Active\", \"Paused\") in one of the tones. */\nfunction TonePill({\n tone,\n className,\n children,\n}: {\n tone?: Tone\n className?: string\n children: React.ReactNode\n}) {\n return (\n <Chip tone={tone} size=\"sm\" className={className}>\n {children}\n </Chip>\n )\n}\n\n/** A tag, removable when `onRemove` is given. */\nfunction TagPill({\n label,\n onRemove,\n size = \"xs\",\n className,\n}: {\n label: string\n onRemove?: () => void\n size?: \"xs\" | \"sm\"\n className?: string\n}) {\n return (\n <Chip\n size={size === \"xs\" ? \"default\" : \"lg\"}\n onRemove={onRemove}\n removeLabel={`Remove tag ${label}`}\n className={cn(\"font-normal\", className)}\n >\n {label}\n </Chip>\n )\n}\n\nexport { Chip, TonePill, TagPill, chipVariants }\n"]}
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var classVarianceAuthority = require('class-variance-authority');
5
+ var lucideReact = require('lucide-react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ var choiceCardVariants = classVarianceAuthority.cva(
9
+ "group/choice-card flex border text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-70",
10
+ {
11
+ variants: {
12
+ size: {
13
+ default: "flex-col gap-3 rounded-[12px] p-4",
14
+ sm: "flex-row items-start gap-3 rounded-[10px] p-3.5 sm:flex-col sm:gap-2"
15
+ },
16
+ selected: { true: "", false: "" }
17
+ },
18
+ compoundVariants: [
19
+ { size: "default", selected: true, className: "border-amber-500 bg-amber-500/[0.06]" },
20
+ {
21
+ size: "default",
22
+ selected: false,
23
+ className: "border-foreground/[0.08] bg-foreground/[0.02] hover:border-foreground/20 hover:bg-foreground/[0.04]"
24
+ },
25
+ {
26
+ size: "sm",
27
+ selected: true,
28
+ className: "border-amber-500/70 bg-amber-500/[0.08] ring-1 ring-amber-500/70"
29
+ },
30
+ {
31
+ size: "sm",
32
+ selected: false,
33
+ className: "border-foreground/[0.08] bg-foreground/[0.02] pointer-fine:hover:border-foreground/20"
34
+ }
35
+ ],
36
+ defaultVariants: { size: "default", selected: false }
37
+ }
38
+ );
39
+ function ChoiceCard({
40
+ title,
41
+ description,
42
+ meta,
43
+ icon,
44
+ selected,
45
+ size = "default",
46
+ className,
47
+ children,
48
+ ...props
49
+ }) {
50
+ if (size === "sm") {
51
+ return /* @__PURE__ */ jsxRuntime.jsxs(
52
+ "button",
53
+ {
54
+ type: "button",
55
+ "data-slot": "choice-card",
56
+ "data-size": size,
57
+ "aria-pressed": selected,
58
+ className: chunk6YHDDRIM_cjs.cn(choiceCardVariants({ size, selected }), className),
59
+ ...props,
60
+ children: [
61
+ icon && /* @__PURE__ */ jsxRuntime.jsx(
62
+ "span",
63
+ {
64
+ className: chunk6YHDDRIM_cjs.cn(
65
+ "flex size-7 shrink-0 items-center justify-center rounded-[7px] [&_svg:not([class*='size-'])]:size-4",
66
+ selected ? "bg-amber-500 text-black" : "bg-foreground/[0.07] text-muted-foreground"
67
+ ),
68
+ children: icon
69
+ }
70
+ ),
71
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col gap-1 sm:contents", children: [
72
+ /* @__PURE__ */ jsxRuntime.jsx(
73
+ "span",
74
+ {
75
+ className: chunk6YHDDRIM_cjs.cn(
76
+ "text-[14px] font-medium sm:text-[13px]",
77
+ selected ? "text-foreground" : "text-foreground/85"
78
+ ),
79
+ children: title
80
+ }
81
+ ),
82
+ description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12.5px] leading-[1.4] text-muted-foreground sm:text-[12px]", children: description }),
83
+ children
84
+ ] })
85
+ ]
86
+ }
87
+ );
88
+ }
89
+ return /* @__PURE__ */ jsxRuntime.jsxs(
90
+ "button",
91
+ {
92
+ type: "button",
93
+ "data-slot": "choice-card",
94
+ "data-size": size,
95
+ "aria-pressed": selected,
96
+ className: chunk6YHDDRIM_cjs.cn(choiceCardVariants({ size, selected }), className),
97
+ ...props,
98
+ children: [
99
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex w-full items-start gap-3", children: [
100
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-[9px] border border-foreground/10 bg-foreground/[0.04] text-[13px] font-semibold text-foreground [&_svg:not([class*='size-'])]:size-4", children: icon }),
101
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
102
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate text-[14px] font-semibold text-foreground", children: title }),
103
+ meta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 block truncate font-mono text-[11px] text-muted-foreground/70", children: meta })
104
+ ] }),
105
+ /* @__PURE__ */ jsxRuntime.jsx(
106
+ "span",
107
+ {
108
+ "aria-hidden": true,
109
+ className: chunk6YHDDRIM_cjs.cn(
110
+ "flex size-5 shrink-0 items-center justify-center rounded-full border transition-colors",
111
+ selected ? "border-amber-500 bg-amber-500 text-black" : "border-foreground/20 text-transparent"
112
+ ),
113
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "size-3", strokeWidth: 3 })
114
+ }
115
+ )
116
+ ] }),
117
+ description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "line-clamp-2 text-[12.5px] leading-relaxed text-muted-foreground", children: description }),
118
+ children
119
+ ]
120
+ }
121
+ );
122
+ }
123
+
124
+ exports.ChoiceCard = ChoiceCard;
125
+ exports.choiceCardVariants = choiceCardVariants;
126
+ //# sourceMappingURL=choice-card.cjs.map
127
+ //# sourceMappingURL=choice-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/choice-card.tsx"],"names":["cva","jsxs","cn","jsx","CheckIcon"],"mappings":"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","file":"choice-card.cjs","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\n\n// The Work console's selectable option cards.\n// default — the library pickers (skills, knowledge bases): a 12px card with\n// an icon tile, title, description and a round check; picked, it\n// takes an amber border and wash.\n// sm — the exclusive mode cards (pricing model): tighter, the icon\n// tile itself turns amber, the border gets an amber ring; on a\n// phone each lies as a row, from `sm` up as a column.\n// A toggle button (aria-pressed): pressing picks or unpicks it. For a set\n// where exactly one is picked, have onClick select it and leave it pressed.\nconst choiceCardVariants = cva(\n \"group/choice-card flex border text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-70\",\n {\n variants: {\n size: {\n default: \"flex-col gap-3 rounded-[12px] p-4\",\n sm: \"flex-row items-start gap-3 rounded-[10px] p-3.5 sm:flex-col sm:gap-2\",\n },\n selected: { true: \"\", false: \"\" },\n },\n compoundVariants: [\n { size: \"default\", selected: true, className: \"border-amber-500 bg-amber-500/[0.06]\" },\n {\n size: \"default\",\n selected: false,\n className:\n \"border-foreground/[0.08] bg-foreground/[0.02] hover:border-foreground/20 hover:bg-foreground/[0.04]\",\n },\n {\n size: \"sm\",\n selected: true,\n className: \"border-amber-500/70 bg-amber-500/[0.08] ring-1 ring-amber-500/70\",\n },\n {\n size: \"sm\",\n selected: false,\n className: \"border-foreground/[0.08] bg-foreground/[0.02] pointer-fine:hover:border-foreground/20\",\n },\n ],\n defaultVariants: { size: \"default\", selected: false },\n }\n)\n\nfunction ChoiceCard({\n title,\n description,\n meta,\n icon,\n selected,\n size = \"default\",\n className,\n children,\n ...props\n}: Omit<React.ComponentProps<\"button\">, \"title\"> & {\n title: React.ReactNode\n description?: React.ReactNode\n /** A line under the title (an id, a trigger), in mono. */\n meta?: React.ReactNode\n /** The tile's content: an icon, or an initial. */\n icon?: React.ReactNode\n selected: boolean\n size?: \"default\" | \"sm\"\n}) {\n if (size === \"sm\") {\n return (\n <button\n type=\"button\"\n data-slot=\"choice-card\"\n data-size={size}\n aria-pressed={selected}\n className={cn(choiceCardVariants({ size, selected }), className)}\n {...props}\n >\n {icon && (\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-[7px] [&_svg:not([class*='size-'])]:size-4\",\n selected\n ? \"bg-amber-500 text-black\"\n : \"bg-foreground/[0.07] text-muted-foreground\"\n )}\n >\n {icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-col gap-1 sm:contents\">\n <span\n className={cn(\n \"text-[14px] font-medium sm:text-[13px]\",\n selected ? \"text-foreground\" : \"text-foreground/85\"\n )}\n >\n {title}\n </span>\n {description && (\n <span className=\"text-[12.5px] leading-[1.4] text-muted-foreground sm:text-[12px]\">\n {description}\n </span>\n )}\n {children}\n </span>\n </button>\n )\n }\n\n return (\n <button\n type=\"button\"\n data-slot=\"choice-card\"\n data-size={size}\n aria-pressed={selected}\n className={cn(choiceCardVariants({ size, selected }), className)}\n {...props}\n >\n <span className=\"flex w-full items-start gap-3\">\n {icon && (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-[9px] border border-foreground/10 bg-foreground/[0.04] text-[13px] font-semibold text-foreground [&_svg:not([class*='size-'])]:size-4\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[14px] font-semibold text-foreground\">\n {title}\n </span>\n {meta && (\n <span className=\"mt-0.5 block truncate font-mono text-[11px] text-muted-foreground/70\">\n {meta}\n </span>\n )}\n </span>\n <span\n aria-hidden={true}\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-full border transition-colors\",\n selected\n ? \"border-amber-500 bg-amber-500 text-black\"\n : \"border-foreground/20 text-transparent\"\n )}\n >\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n </span>\n {description && (\n <span className=\"line-clamp-2 text-[12.5px] leading-relaxed text-muted-foreground\">\n {description}\n </span>\n )}\n {children}\n </button>\n )\n}\n\nexport { ChoiceCard, choiceCardVariants }\n"]}
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import * as React from 'react';
4
+
5
+ declare const choiceCardVariants: (props?: ({
6
+ size?: "default" | "sm" | null | undefined;
7
+ selected?: boolean | null | undefined;
8
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
9
+ declare function ChoiceCard({ title, description, meta, icon, selected, size, className, children, ...props }: Omit<React.ComponentProps<"button">, "title"> & {
10
+ title: React.ReactNode;
11
+ description?: React.ReactNode;
12
+ /** A line under the title (an id, a trigger), in mono. */
13
+ meta?: React.ReactNode;
14
+ /** The tile's content: an icon, or an initial. */
15
+ icon?: React.ReactNode;
16
+ selected: boolean;
17
+ size?: "default" | "sm";
18
+ }): react_jsx_runtime.JSX.Element;
19
+
20
+ export { ChoiceCard, choiceCardVariants };
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import * as React from 'react';
4
+
5
+ declare const choiceCardVariants: (props?: ({
6
+ size?: "default" | "sm" | null | undefined;
7
+ selected?: boolean | null | undefined;
8
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
9
+ declare function ChoiceCard({ title, description, meta, icon, selected, size, className, children, ...props }: Omit<React.ComponentProps<"button">, "title"> & {
10
+ title: React.ReactNode;
11
+ description?: React.ReactNode;
12
+ /** A line under the title (an id, a trigger), in mono. */
13
+ meta?: React.ReactNode;
14
+ /** The tile's content: an icon, or an initial. */
15
+ icon?: React.ReactNode;
16
+ selected: boolean;
17
+ size?: "default" | "sm";
18
+ }): react_jsx_runtime.JSX.Element;
19
+
20
+ export { ChoiceCard, choiceCardVariants };
@@ -0,0 +1,124 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import { CheckIcon } from 'lucide-react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var choiceCardVariants = cva(
7
+ "group/choice-card flex border text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-70",
8
+ {
9
+ variants: {
10
+ size: {
11
+ default: "flex-col gap-3 rounded-[12px] p-4",
12
+ sm: "flex-row items-start gap-3 rounded-[10px] p-3.5 sm:flex-col sm:gap-2"
13
+ },
14
+ selected: { true: "", false: "" }
15
+ },
16
+ compoundVariants: [
17
+ { size: "default", selected: true, className: "border-amber-500 bg-amber-500/[0.06]" },
18
+ {
19
+ size: "default",
20
+ selected: false,
21
+ className: "border-foreground/[0.08] bg-foreground/[0.02] hover:border-foreground/20 hover:bg-foreground/[0.04]"
22
+ },
23
+ {
24
+ size: "sm",
25
+ selected: true,
26
+ className: "border-amber-500/70 bg-amber-500/[0.08] ring-1 ring-amber-500/70"
27
+ },
28
+ {
29
+ size: "sm",
30
+ selected: false,
31
+ className: "border-foreground/[0.08] bg-foreground/[0.02] pointer-fine:hover:border-foreground/20"
32
+ }
33
+ ],
34
+ defaultVariants: { size: "default", selected: false }
35
+ }
36
+ );
37
+ function ChoiceCard({
38
+ title,
39
+ description,
40
+ meta,
41
+ icon,
42
+ selected,
43
+ size = "default",
44
+ className,
45
+ children,
46
+ ...props
47
+ }) {
48
+ if (size === "sm") {
49
+ return /* @__PURE__ */ jsxs(
50
+ "button",
51
+ {
52
+ type: "button",
53
+ "data-slot": "choice-card",
54
+ "data-size": size,
55
+ "aria-pressed": selected,
56
+ className: cn(choiceCardVariants({ size, selected }), className),
57
+ ...props,
58
+ children: [
59
+ icon && /* @__PURE__ */ jsx(
60
+ "span",
61
+ {
62
+ className: cn(
63
+ "flex size-7 shrink-0 items-center justify-center rounded-[7px] [&_svg:not([class*='size-'])]:size-4",
64
+ selected ? "bg-amber-500 text-black" : "bg-foreground/[0.07] text-muted-foreground"
65
+ ),
66
+ children: icon
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col gap-1 sm:contents", children: [
70
+ /* @__PURE__ */ jsx(
71
+ "span",
72
+ {
73
+ className: cn(
74
+ "text-[14px] font-medium sm:text-[13px]",
75
+ selected ? "text-foreground" : "text-foreground/85"
76
+ ),
77
+ children: title
78
+ }
79
+ ),
80
+ description && /* @__PURE__ */ jsx("span", { className: "text-[12.5px] leading-[1.4] text-muted-foreground sm:text-[12px]", children: description }),
81
+ children
82
+ ] })
83
+ ]
84
+ }
85
+ );
86
+ }
87
+ return /* @__PURE__ */ jsxs(
88
+ "button",
89
+ {
90
+ type: "button",
91
+ "data-slot": "choice-card",
92
+ "data-size": size,
93
+ "aria-pressed": selected,
94
+ className: cn(choiceCardVariants({ size, selected }), className),
95
+ ...props,
96
+ children: [
97
+ /* @__PURE__ */ jsxs("span", { className: "flex w-full items-start gap-3", children: [
98
+ icon && /* @__PURE__ */ jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-[9px] border border-foreground/10 bg-foreground/[0.04] text-[13px] font-semibold text-foreground [&_svg:not([class*='size-'])]:size-4", children: icon }),
99
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
100
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-[14px] font-semibold text-foreground", children: title }),
101
+ meta && /* @__PURE__ */ jsx("span", { className: "mt-0.5 block truncate font-mono text-[11px] text-muted-foreground/70", children: meta })
102
+ ] }),
103
+ /* @__PURE__ */ jsx(
104
+ "span",
105
+ {
106
+ "aria-hidden": true,
107
+ className: cn(
108
+ "flex size-5 shrink-0 items-center justify-center rounded-full border transition-colors",
109
+ selected ? "border-amber-500 bg-amber-500 text-black" : "border-foreground/20 text-transparent"
110
+ ),
111
+ children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3 })
112
+ }
113
+ )
114
+ ] }),
115
+ description && /* @__PURE__ */ jsx("span", { className: "line-clamp-2 text-[12.5px] leading-relaxed text-muted-foreground", children: description }),
116
+ children
117
+ ]
118
+ }
119
+ );
120
+ }
121
+
122
+ export { ChoiceCard, choiceCardVariants };
123
+ //# sourceMappingURL=choice-card.js.map
124
+ //# sourceMappingURL=choice-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/choice-card.tsx"],"names":[],"mappings":"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","file":"choice-card.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\n\n// The Work console's selectable option cards.\n// default — the library pickers (skills, knowledge bases): a 12px card with\n// an icon tile, title, description and a round check; picked, it\n// takes an amber border and wash.\n// sm — the exclusive mode cards (pricing model): tighter, the icon\n// tile itself turns amber, the border gets an amber ring; on a\n// phone each lies as a row, from `sm` up as a column.\n// A toggle button (aria-pressed): pressing picks or unpicks it. For a set\n// where exactly one is picked, have onClick select it and leave it pressed.\nconst choiceCardVariants = cva(\n \"group/choice-card flex border text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-70\",\n {\n variants: {\n size: {\n default: \"flex-col gap-3 rounded-[12px] p-4\",\n sm: \"flex-row items-start gap-3 rounded-[10px] p-3.5 sm:flex-col sm:gap-2\",\n },\n selected: { true: \"\", false: \"\" },\n },\n compoundVariants: [\n { size: \"default\", selected: true, className: \"border-amber-500 bg-amber-500/[0.06]\" },\n {\n size: \"default\",\n selected: false,\n className:\n \"border-foreground/[0.08] bg-foreground/[0.02] hover:border-foreground/20 hover:bg-foreground/[0.04]\",\n },\n {\n size: \"sm\",\n selected: true,\n className: \"border-amber-500/70 bg-amber-500/[0.08] ring-1 ring-amber-500/70\",\n },\n {\n size: \"sm\",\n selected: false,\n className: \"border-foreground/[0.08] bg-foreground/[0.02] pointer-fine:hover:border-foreground/20\",\n },\n ],\n defaultVariants: { size: \"default\", selected: false },\n }\n)\n\nfunction ChoiceCard({\n title,\n description,\n meta,\n icon,\n selected,\n size = \"default\",\n className,\n children,\n ...props\n}: Omit<React.ComponentProps<\"button\">, \"title\"> & {\n title: React.ReactNode\n description?: React.ReactNode\n /** A line under the title (an id, a trigger), in mono. */\n meta?: React.ReactNode\n /** The tile's content: an icon, or an initial. */\n icon?: React.ReactNode\n selected: boolean\n size?: \"default\" | \"sm\"\n}) {\n if (size === \"sm\") {\n return (\n <button\n type=\"button\"\n data-slot=\"choice-card\"\n data-size={size}\n aria-pressed={selected}\n className={cn(choiceCardVariants({ size, selected }), className)}\n {...props}\n >\n {icon && (\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-[7px] [&_svg:not([class*='size-'])]:size-4\",\n selected\n ? \"bg-amber-500 text-black\"\n : \"bg-foreground/[0.07] text-muted-foreground\"\n )}\n >\n {icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-col gap-1 sm:contents\">\n <span\n className={cn(\n \"text-[14px] font-medium sm:text-[13px]\",\n selected ? \"text-foreground\" : \"text-foreground/85\"\n )}\n >\n {title}\n </span>\n {description && (\n <span className=\"text-[12.5px] leading-[1.4] text-muted-foreground sm:text-[12px]\">\n {description}\n </span>\n )}\n {children}\n </span>\n </button>\n )\n }\n\n return (\n <button\n type=\"button\"\n data-slot=\"choice-card\"\n data-size={size}\n aria-pressed={selected}\n className={cn(choiceCardVariants({ size, selected }), className)}\n {...props}\n >\n <span className=\"flex w-full items-start gap-3\">\n {icon && (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-[9px] border border-foreground/10 bg-foreground/[0.04] text-[13px] font-semibold text-foreground [&_svg:not([class*='size-'])]:size-4\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[14px] font-semibold text-foreground\">\n {title}\n </span>\n {meta && (\n <span className=\"mt-0.5 block truncate font-mono text-[11px] text-muted-foreground/70\">\n {meta}\n </span>\n )}\n </span>\n <span\n aria-hidden={true}\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-full border transition-colors\",\n selected\n ? \"border-amber-500 bg-amber-500 text-black\"\n : \"border-foreground/20 text-transparent\"\n )}\n >\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n </span>\n {description && (\n <span className=\"line-clamp-2 text-[12.5px] leading-relaxed text-muted-foreground\">\n {description}\n </span>\n )}\n {children}\n </button>\n )\n}\n\nexport { ChoiceCard, choiceCardVariants }\n"]}
@@ -0,0 +1,183 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var React = require('react');
5
+ var radixUi = require('radix-ui');
6
+ var lucideReact = require('lucide-react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ var SidebarContext = React__namespace.createContext({ collapsed: false });
30
+ function useSidebar() {
31
+ return React__namespace.useContext(SidebarContext);
32
+ }
33
+ function Sidebar({
34
+ pinned: pinnedProp,
35
+ onPinnedChange,
36
+ className,
37
+ children,
38
+ ...props
39
+ }) {
40
+ const [ownPinned, setOwnPinned] = React__namespace.useState(true);
41
+ const pinned = pinnedProp ?? ownPinned;
42
+ const [hoverOpen, setHoverOpen] = React__namespace.useState(false);
43
+ const collapsed = !pinned && !hoverOpen;
44
+ const context = React__namespace.useMemo(() => ({ collapsed }), [collapsed]);
45
+ function togglePinned() {
46
+ if (pinned) setHoverOpen(false);
47
+ setOwnPinned(!pinned);
48
+ onPinnedChange?.(!pinned);
49
+ }
50
+ return /* @__PURE__ */ jsxRuntime.jsx(SidebarContext.Provider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsxs(
51
+ "aside",
52
+ {
53
+ "data-slot": "sidebar",
54
+ "data-collapsed": collapsed ? "" : void 0,
55
+ onMouseEnter: () => setHoverOpen(true),
56
+ onMouseLeave: () => setHoverOpen(false),
57
+ className: chunk6YHDDRIM_cjs.cn(
58
+ "hidden h-full w-[295px] shrink-0 flex-col overflow-hidden border-r border-line bg-surface transition-[width] duration-200 ease-out data-collapsed:w-[50px] md:flex",
59
+ className
60
+ ),
61
+ ...props,
62
+ children: [
63
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-1 flex-col", children }),
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ "button",
66
+ {
67
+ type: "button",
68
+ onClick: togglePinned,
69
+ "aria-label": pinned ? "Collapse sidebar" : "Expand sidebar",
70
+ className: "flex w-full shrink-0 cursor-pointer items-center justify-center border-t border-line py-2.5 text-faint transition-colors hover:text-foreground",
71
+ children: pinned ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4", strokeWidth: 1.75 }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4", strokeWidth: 1.75 })
72
+ }
73
+ )
74
+ ]
75
+ }
76
+ ) });
77
+ }
78
+ function SidebarBrand({
79
+ title,
80
+ subtitle,
81
+ imageSrc = "/login.svg",
82
+ link,
83
+ className,
84
+ children,
85
+ ...props
86
+ }) {
87
+ const { collapsed } = useSidebar();
88
+ const Comp = link ? radixUi.Slot.Root : "div";
89
+ return (
90
+ // With a cursor the brand and its children share one line; on touch the
91
+ // children get a row of their own.
92
+ /* @__PURE__ */ jsxRuntime.jsxs(
93
+ "div",
94
+ {
95
+ "data-slot": "sidebar-brand",
96
+ className: chunk6YHDDRIM_cjs.cn(
97
+ "flex shrink-0 flex-col gap-3 pt-5 pb-3 pointer-fine:flex-row pointer-fine:items-start pointer-fine:gap-2",
98
+ collapsed ? "px-1.5" : "px-4",
99
+ className
100
+ ),
101
+ ...props,
102
+ children: [
103
+ /* @__PURE__ */ jsxRuntime.jsxs(
104
+ Comp,
105
+ {
106
+ className: chunk6YHDDRIM_cjs.cn(
107
+ "flex min-w-0 items-center gap-2.5 text-foreground no-underline pointer-coarse:pe-12",
108
+ collapsed && "flex-1 justify-center gap-0"
109
+ ),
110
+ children: [
111
+ link && /* @__PURE__ */ jsxRuntime.jsx(radixUi.Slot.Slottable, { children: link }),
112
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: imageSrc, alt: title, className: "size-9 shrink-0 rounded-full" }),
113
+ !collapsed && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 whitespace-nowrap", children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[15px] leading-tight font-semibold", children: title }),
115
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground", children: subtitle })
116
+ ] })
117
+ ]
118
+ }
119
+ ),
120
+ children
121
+ ]
122
+ }
123
+ )
124
+ );
125
+ }
126
+ function SidebarUserBar({
127
+ avatar,
128
+ name,
129
+ className,
130
+ children,
131
+ ...props
132
+ }) {
133
+ const { collapsed } = useSidebar();
134
+ return /* @__PURE__ */ jsxRuntime.jsxs(
135
+ "div",
136
+ {
137
+ "data-slot": "sidebar-user-bar",
138
+ className: chunk6YHDDRIM_cjs.cn(
139
+ "flex shrink-0 items-center gap-2.5 border-t border-line pt-3 pb-1 pointer-coarse:gap-1.5 pointer-coarse:pt-2 pointer-coarse:pb-0",
140
+ // The left-weighted padding lines the avatar up with the rows above.
141
+ collapsed ? "justify-center gap-0 px-1.5" : "pl-2 pr-1.5",
142
+ className
143
+ ),
144
+ ...props,
145
+ children: [
146
+ avatar,
147
+ !collapsed && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
148
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] text-foreground pointer-coarse:text-[14px]", children: name }),
149
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children })
150
+ ] })
151
+ ]
152
+ }
153
+ );
154
+ }
155
+ function SidebarAction({
156
+ label,
157
+ asChild = false,
158
+ className,
159
+ ...props
160
+ }) {
161
+ const Comp = asChild ? radixUi.Slot.Root : "button";
162
+ return /* @__PURE__ */ jsxRuntime.jsx(
163
+ Comp,
164
+ {
165
+ "data-slot": "sidebar-action",
166
+ "aria-label": label,
167
+ ...asChild ? {} : { type: "button" },
168
+ className: chunk6YHDDRIM_cjs.cn(
169
+ "inline-flex cursor-pointer items-center justify-center rounded p-1 text-muted-foreground hover:bg-input hover:text-foreground pointer-coarse:size-11 pointer-coarse:rounded-xl pointer-coarse:p-0 pointer-coarse:active:bg-input [&_svg:not([class*='size-'])]:size-[18px]",
170
+ className
171
+ ),
172
+ ...props
173
+ }
174
+ );
175
+ }
176
+
177
+ exports.Sidebar = Sidebar;
178
+ exports.SidebarAction = SidebarAction;
179
+ exports.SidebarBrand = SidebarBrand;
180
+ exports.SidebarUserBar = SidebarUserBar;
181
+ exports.useSidebar = useSidebar;
182
+ //# sourceMappingURL=chunk-2UHRDVPT.cjs.map
183
+ //# sourceMappingURL=chunk-2UHRDVPT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sidebar.tsx"],"names":["React","jsx","jsxs","cn","ChevronLeft","ChevronRight","Slot","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAM,cAAA,GAAuBA,gBAAA,CAAA,aAAA,CAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAO/D,SAAS,UAAA,GAAa;AACpB,EAAA,OAAaA,4BAAW,cAAc,CAAA;AACxC;AAkBA,SAAS,OAAA,CAAQ;AAAA,EACf,MAAA,EAAQ,UAAA;AAAA,EACR,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,0BAAS,IAAI,CAAA;AACrD,EAAA,MAAM,SAAS,UAAA,IAAc,SAAA;AAC7B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,0BAAS,KAAK,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,IAAU,CAAC,SAAA;AAC9B,EAAA,MAAM,OAAA,GAAgBA,yBAAQ,OAAO,EAAE,WAAU,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AAEhE,EAAA,SAAS,YAAA,GAAe;AAGtB,IAAA,IAAI,MAAA,eAAqB,KAAK,CAAA;AAC9B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AACpB,IAAA,cAAA,GAAiB,CAAC,MAAM,CAAA;AAAA,EAC1B;AAEA,EAAA,uBACEC,cAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAO,OAAA,EAC9B,QAAA,kBAAAC,eAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,gBAAA,EAAgB,YAAY,EAAA,GAAK,MAAA;AAAA,MACjC,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,MACtC,SAAA,EAAWC,oBAAA;AAAA,QACT,oKAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAS,CAAA;AAAA,wBACxDA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,YAAA;AAAA,YACT,YAAA,EAAY,SAAS,kBAAA,GAAqB,gBAAA;AAAA,YAC1C,SAAA,EAAU,gJAAA;AAAA,YAET,QAAA,EAAA,MAAA,mBACCA,cAAA,CAACG,uBAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS,WAAA,EAAa,IAAA,EAAM,CAAA,mBAEnDH,cAAA,CAACI,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,aAAa,IAAA,EAAM;AAAA;AAAA;AAExD;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAeA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,YAAA;AAAA,EACX,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AACjC,EAAA,MAAM,IAAA,GAAO,IAAA,GAAOC,YAAA,CAAK,IAAA,GAAO,KAAA;AAEhC,EAAA;AAAA;AAAA;AAAA,oBAGEJ,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,eAAA;AAAA,QACV,SAAA,EAAWC,oBAAA;AAAA,UACT,0GAAA;AAAA,UACA,YAAY,QAAA,GAAW,MAAA;AAAA,UACvB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAIJ,QAAA,EAAA;AAAA,0BAAAD,eAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWC,oBAAA;AAAA,gBACT,qFAAA;AAAA,gBACA,SAAA,IAAa;AAAA,eACf;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA,oBAAQF,cAAA,CAACK,YAAA,CAAK,SAAA,EAAL,EAAgB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,+CAC9B,KAAA,EAAA,EAAI,GAAA,EAAK,UAAU,GAAA,EAAK,KAAA,EAAO,WAAU,8BAAA,EAA+B,CAAA;AAAA,gBACxE,CAAC,SAAA,oBACAJ,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,kCAAAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kBAC/D,QAAA,oBAAYA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAiC,QAAA,EAAA,QAAA,EAAS;AAAA,iBAAA,EACxE;AAAA;AAAA;AAAA,WAEJ;AAAA,UACC;AAAA;AAAA;AAAA;AACH;AAEJ;AAaA,SAAS,cAAA,CAAe;AAAA,EACtB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AAEjC,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAWC,oBAAA;AAAA,QACT,kIAAA;AAAA;AAAA,QAEA,YAAY,6BAAA,GAAgC,aAAA;AAAA,QAC5C;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,QACA,CAAC,6BACAD,eAAA,CAAAK,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAN,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,0BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAS;AAAA,SAAA,EACvD;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,IAAA,GAAO,OAAA,GAAUK,YAAA,CAAK,IAAA,GAAO,QAAA;AAEnC,EAAA,uBACEL,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACX,GAAI,OAAA,GAAU,EAAC,GAAI,EAAE,MAAM,QAAA,EAAkB;AAAA,MAC9C,SAAA,EAAWE,oBAAA;AAAA,QACT,4QAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-2UHRDVPT.cjs","sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\n\nconst SidebarContext = React.createContext({ collapsed: false })\n\n/**\n * Whether the enclosing rail is collapsed to its icons. Outside a `Sidebar`\n * (a phone drawer, a page) nothing is collapsed, so the same parts draw open\n * there.\n */\nfunction useSidebar() {\n return React.useContext(SidebarContext)\n}\n\ntype SidebarProps = Omit<\n React.ComponentProps<\"aside\">,\n \"onMouseEnter\" | \"onMouseLeave\"\n> & {\n /** Pinned, the sidebar stays open; unpinned, it is an icon rail that opens\n * while the pointer is over it. Kept here when not passed. */\n pinned?: boolean\n onPinnedChange?: (pinned: boolean) => void\n}\n\n/**\n * The ops console's desktop sidebar: 295px open, a 50px icon rail collapsed,\n * with the pin toggle along its bottom. Hidden below `md`, where navigation\n * belongs in a drawer: render the same parts there, outside a `Sidebar`.\n * `ListRow` and `SectionLabel` inside it shrink to their icon and rule.\n */\nfunction Sidebar({\n pinned: pinnedProp,\n onPinnedChange,\n className,\n children,\n ...props\n}: SidebarProps) {\n const [ownPinned, setOwnPinned] = React.useState(true)\n const pinned = pinnedProp ?? ownPinned\n const [hoverOpen, setHoverOpen] = React.useState(false)\n const collapsed = !pinned && !hoverOpen\n const context = React.useMemo(() => ({ collapsed }), [collapsed])\n\n function togglePinned() {\n // The toggle is under the pointer: unpinning closes the rail now rather\n // than leaving it hover-open until the pointer leaves.\n if (pinned) setHoverOpen(false)\n setOwnPinned(!pinned)\n onPinnedChange?.(!pinned)\n }\n\n return (\n <SidebarContext.Provider value={context}>\n <aside\n data-slot=\"sidebar\"\n data-collapsed={collapsed ? \"\" : undefined}\n onMouseEnter={() => setHoverOpen(true)}\n onMouseLeave={() => setHoverOpen(false)}\n className={cn(\n \"hidden h-full w-[295px] shrink-0 flex-col overflow-hidden border-r border-line bg-surface transition-[width] duration-200 ease-out data-collapsed:w-[50px] md:flex\",\n className\n )}\n {...props}\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">{children}</div>\n <button\n type=\"button\"\n onClick={togglePinned}\n aria-label={pinned ? \"Collapse sidebar\" : \"Expand sidebar\"}\n className=\"flex w-full shrink-0 cursor-pointer items-center justify-center border-t border-line py-2.5 text-faint transition-colors hover:text-foreground\"\n >\n {pinned ? (\n <ChevronLeft className=\"size-4\" strokeWidth={1.75} />\n ) : (\n <ChevronRight className=\"size-4\" strokeWidth={1.75} />\n )}\n </button>\n </aside>\n </SidebarContext.Provider>\n )\n}\n\ntype SidebarBrandProps = Omit<React.ComponentProps<\"div\">, \"title\"> & {\n title: string\n subtitle?: React.ReactNode\n imageSrc?: string\n /** What the mark and title link through (a router `Link`); they are placed\n * inside it. */\n link?: React.ReactElement\n}\n\n/**\n * The sidebar's brand strip: the mark, a title and a muted subtitle; in the\n * rail the mark alone, centred. Children (a mode switch) follow it.\n */\nfunction SidebarBrand({\n title,\n subtitle,\n imageSrc = \"/login.svg\",\n link,\n className,\n children,\n ...props\n}: SidebarBrandProps) {\n const { collapsed } = useSidebar()\n const Comp = link ? Slot.Root : \"div\"\n\n return (\n // With a cursor the brand and its children share one line; on touch the\n // children get a row of their own.\n <div\n data-slot=\"sidebar-brand\"\n className={cn(\n \"flex shrink-0 flex-col gap-3 pt-5 pb-3 pointer-fine:flex-row pointer-fine:items-start pointer-fine:gap-2\",\n collapsed ? \"px-1.5\" : \"px-4\",\n className\n )}\n {...props}\n >\n {/* A drawer's close button floats over the end of this line; the\n inset keeps the title clear of it. */}\n <Comp\n className={cn(\n \"flex min-w-0 items-center gap-2.5 text-foreground no-underline pointer-coarse:pe-12\",\n collapsed && \"flex-1 justify-center gap-0\"\n )}\n >\n {link && <Slot.Slottable>{link}</Slot.Slottable>}\n <img src={imageSrc} alt={title} className=\"size-9 shrink-0 rounded-full\" />\n {!collapsed && (\n <div className=\"min-w-0 whitespace-nowrap\">\n <div className=\"text-[15px] leading-tight font-semibold\">{title}</div>\n {subtitle && <div className=\"text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n )}\n </Comp>\n {children}\n </div>\n )\n}\n\ntype SidebarUserBarProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n avatar: React.ReactNode\n name: React.ReactNode\n /** The bar's `SidebarAction`s: theme, settings, sign out. */\n children?: React.ReactNode\n}\n\n/**\n * The sidebar's bottom bar: the user's avatar and name, then the global\n * controls. In the rail the avatar alone.\n */\nfunction SidebarUserBar({\n avatar,\n name,\n className,\n children,\n ...props\n}: SidebarUserBarProps) {\n const { collapsed } = useSidebar()\n\n return (\n <div\n data-slot=\"sidebar-user-bar\"\n className={cn(\n \"flex shrink-0 items-center gap-2.5 border-t border-line pt-3 pb-1 pointer-coarse:gap-1.5 pointer-coarse:pt-2 pointer-coarse:pb-0\",\n // The left-weighted padding lines the avatar up with the rows above.\n collapsed ? \"justify-center gap-0 px-1.5\" : \"pl-2 pr-1.5\",\n className\n )}\n {...props}\n >\n {avatar}\n {!collapsed && (\n <>\n <span className=\"min-w-0 flex-1 truncate text-[13px] text-foreground pointer-coarse:text-[14px]\">\n {name}\n </span>\n <div className=\"flex items-center gap-1.5\">{children}</div>\n </>\n )}\n </div>\n )\n}\n\n/**\n * An icon control in the user bar. 26px with a cursor, the 44px floor on\n * touch. A button, or a router link via `asChild`.\n */\nfunction SidebarAction({\n label,\n asChild = false,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & { label: string; asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-action\"\n aria-label={label}\n {...(asChild ? {} : { type: \"button\" as const })}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center rounded p-1 text-muted-foreground hover:bg-input hover:text-foreground pointer-coarse:size-11 pointer-coarse:rounded-xl pointer-coarse:p-0 pointer-coarse:active:bg-input [&_svg:not([class*='size-'])]:size-[18px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Sidebar, SidebarBrand, SidebarUserBar, SidebarAction, useSidebar }\n"]}