@uisatin/ui 0.2.0 → 0.4.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 (359) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +10 -1
  3. package/{chunk-P4O6TGDR.js → chunk-3VVO5MY5.js} +28 -26
  4. package/chunk-47DDBME3.js +87 -0
  5. package/{chunk-SHDFUXYV.js → chunk-5663JVE5.js} +16 -18
  6. package/chunk-67CBFB6Y.js +99 -0
  7. package/chunk-6DWLTGRQ.js +130 -0
  8. package/chunk-6GNMUJQ4.js +45 -0
  9. package/chunk-6JTSZAGO.js +177 -0
  10. package/chunk-6RLSRMB5.js +14 -0
  11. package/chunk-6Y6CY2DP.js +55 -0
  12. package/{chunk-O7F3CIDV.js → chunk-7NV53EL5.js} +10 -12
  13. package/{chunk-BNZVTLHV.js → chunk-7SVMERPH.js} +25 -21
  14. package/chunk-A52HUWVM.js +24 -0
  15. package/chunk-AKEZCWNW.js +29 -0
  16. package/{chunk-SH6NG6VN.js → chunk-APRVUOD6.js} +6 -8
  17. package/{chunk-QUF2IPOZ.js → chunk-C435UD7V.js} +14 -15
  18. package/{chunk-B2K45IUR.js → chunk-C6WRJ7DG.js} +5 -7
  19. package/{chunk-PF3YBUKT.js → chunk-CQFAMWZI.js} +16 -15
  20. package/chunk-DAKVTPYZ.js +86 -0
  21. package/{chunk-VAGIAREV.js → chunk-DMZW4LGU.js} +29 -26
  22. package/chunk-EBZHGRM5.js +46 -0
  23. package/chunk-EHEXE2UV.js +44 -0
  24. package/{chunk-72OCFAPT.js → chunk-EQAFDIPE.js} +26 -23
  25. package/{chunk-LLHTVIM3.js → chunk-EXKSKYG3.js} +7 -9
  26. package/chunk-FB6DG3LR.js +35 -0
  27. package/chunk-GH2DEOGO.js +67 -0
  28. package/{chunk-YG7JOOLJ.js → chunk-GKDMCY2S.js} +5 -7
  29. package/chunk-GTFUAA6H.js +42 -0
  30. package/{chunk-TX3H3QMA.js → chunk-HI6QIG55.js} +71 -70
  31. package/{chunk-6QMSWITQ.js → chunk-HZV7EXGU.js} +24 -26
  32. package/{chunk-A5XEM3GF.js → chunk-IKJIR6VL.js} +34 -36
  33. package/{chunk-DO3TBNSC.js → chunk-INJWE2LD.js} +15 -17
  34. package/chunk-J5UQPROI.js +56 -0
  35. package/{chunk-6YXUBP27.js → chunk-JCR5TWTF.js} +72 -67
  36. package/chunk-JKOBDLP3.js +25 -0
  37. package/chunk-JR3VVDV6.js +37 -0
  38. package/chunk-JYGCZWET.js +112 -0
  39. package/{chunk-UGRSWP6U.js → chunk-K5G5OEV5.js} +10 -12
  40. package/{chunk-B6V4VSGH.js → chunk-KDU7AT2T.js} +14 -15
  41. package/chunk-KITXKIYW.js +104 -0
  42. package/{chunk-NN6PKJWS.js → chunk-KQNA22D3.js} +7 -9
  43. package/{chunk-YPNKBE5X.js → chunk-L5PPN42A.js} +14 -9
  44. package/chunk-LAOE6Y57.js +95 -0
  45. package/chunk-LI5VYDLN.js +195 -0
  46. package/{chunk-7TXHCRAG.js → chunk-LKSFTNPF.js} +8 -10
  47. package/chunk-LLW3X4ZJ.js +39 -0
  48. package/{chunk-RTJ76X5U.js → chunk-LWRB4DED.js} +2 -4
  49. package/{chunk-NSRTTYQ4.js → chunk-M7RILZVW.js} +42 -35
  50. package/{chunk-LW3TRU5W.js → chunk-MOGWOUCN.js} +28 -16
  51. package/chunk-NCIRJ5V2.js +108 -0
  52. package/chunk-NQL6SIIB.js +168 -0
  53. package/chunk-NTSU44FY.js +81 -0
  54. package/{chunk-3DINAQLL.js → chunk-P36KBUYD.js} +33 -29
  55. package/chunk-P6RHT2VM.js +147 -0
  56. package/{chunk-CL2II6BX.js → chunk-PD2KD5OR.js} +11 -13
  57. package/{chunk-XL75JRUA.js → chunk-PP46SY7M.js} +42 -22
  58. package/{chunk-L6NCCSIP.js → chunk-PTK4QAOQ.js} +36 -29
  59. package/{chunk-HL42K2NH.js → chunk-Q7KVC5B4.js} +17 -17
  60. package/{chunk-H4NU7NPO.js → chunk-R3DTMBDT.js} +62 -61
  61. package/{chunk-KNUWZNFV.js → chunk-R4KPFBMK.js} +4 -6
  62. package/chunk-R5TQ3HNB.js +71 -0
  63. package/chunk-RFSPJECL.js +84 -0
  64. package/chunk-RPL6FRVX.js +88 -0
  65. package/{chunk-AN2RNJLR.js → chunk-STYOBAC7.js} +16 -16
  66. package/{chunk-X3PQANZO.js → chunk-SVUWR3HD.js} +47 -46
  67. package/chunk-T7P3OEBP.js +128 -0
  68. package/{chunk-QS4N4MNP.js → chunk-TB3ZRV3Y.js} +18 -20
  69. package/{chunk-MYEZXZZC.js → chunk-TOY6YPTG.js} +23 -25
  70. package/{chunk-XILQ7GXE.js → chunk-U6X6ODDJ.js} +11 -13
  71. package/{chunk-XZNHT6MO.js → chunk-UAJ6M34K.js} +115 -61
  72. package/chunk-W2EH6RY5.js +42 -0
  73. package/{chunk-FDKIX4DC.js → chunk-W2QQQWNE.js} +7 -9
  74. package/{chunk-LZMKSFCF.js → chunk-WALANB3V.js} +10 -12
  75. package/chunk-WCUR44O6.js +88 -0
  76. package/{chunk-BNTPPZCK.js → chunk-WJYJMX5S.js} +37 -39
  77. package/chunk-WZSLDYUU.js +131 -0
  78. package/{chunk-J3NSDRVH.js → chunk-XETMIETJ.js} +0 -2
  79. package/chunk-XU6JJDMZ.js +117 -0
  80. package/{chunk-BKZBWPUH.js → chunk-XWPH7C2W.js} +9 -11
  81. package/{chunk-GICKPMJU.js → chunk-YXWXSRXG.js} +31 -31
  82. package/{chunk-2HKBZFIK.js → chunk-YY236ZSJ.js} +31 -31
  83. package/{chunk-YX5VNRJX.js → chunk-YYFAZQ25.js} +0 -2
  84. package/{chunk-Y5AYU7PK.js → chunk-ZHFIWDGF.js} +0 -2
  85. package/components/accordion.js +2 -4
  86. package/components/action-button.d.ts +37 -0
  87. package/components/action-button.js +5 -0
  88. package/components/agent-loading.d.ts +2 -0
  89. package/components/agent-loading.js +2 -4
  90. package/components/agent-picker.js +5 -5
  91. package/components/agent-suggestion.js +5 -6
  92. package/components/alert.d.ts +37 -0
  93. package/components/alert.js +5 -0
  94. package/components/announcement-bar.js +7 -7
  95. package/components/attachment.js +5 -5
  96. package/components/avatar.js +4 -6
  97. package/components/badge.js +2 -4
  98. package/components/banner-mesh.js +1 -3
  99. package/components/banner.js +6 -6
  100. package/components/bar-chart.js +10 -11
  101. package/components/breadcrumb.js +5 -6
  102. package/components/button-group.d.ts +26 -0
  103. package/components/button-group.js +5 -0
  104. package/components/button.d.ts +13 -1
  105. package/components/button.js +4 -4
  106. package/components/card.js +5 -5
  107. package/components/channel-chart.js +10 -11
  108. package/components/chart.js +9 -10
  109. package/components/checkbox.js +2 -4
  110. package/components/chip.js +2 -4
  111. package/components/citations.d.ts +6 -4
  112. package/components/citations.js +4 -5
  113. package/components/code-block.js +5 -5
  114. package/components/combobox.d.ts +12 -3
  115. package/components/combobox.js +10 -10
  116. package/components/command-menu.d.ts +6 -2
  117. package/components/command-menu.js +5 -6
  118. package/components/context-menu.d.ts +12 -5
  119. package/components/context-menu.js +5 -6
  120. package/components/cookie-consent.js +5 -5
  121. package/components/date-picker.d.ts +26 -14
  122. package/components/date-picker.js +9 -9
  123. package/components/decision-card.js +7 -7
  124. package/components/dialog.d.ts +6 -8
  125. package/components/dialog.js +6 -5
  126. package/components/donut-chart.js +10 -11
  127. package/components/dot.js +2 -4
  128. package/components/dropdown.d.ts +6 -1
  129. package/components/dropdown.js +4 -5
  130. package/components/empty-state.js +2 -4
  131. package/components/field-group.d.ts +27 -0
  132. package/components/field-group.js +3 -0
  133. package/components/file-upload.js +7 -7
  134. package/components/floating.js +1 -3
  135. package/components/form-field.d.ts +38 -1
  136. package/components/form-field.js +2 -4
  137. package/components/form.d.ts +47 -0
  138. package/components/form.js +3 -0
  139. package/components/hover-card.d.ts +5 -2
  140. package/components/hover-card.js +2 -4
  141. package/components/input-group.d.ts +21 -0
  142. package/components/input-group.js +6 -0
  143. package/components/input-otp.d.ts +4 -2
  144. package/components/input-otp.js +7 -8
  145. package/components/input.d.ts +5 -1
  146. package/components/input.js +3 -5
  147. package/components/kbd.js +2 -4
  148. package/components/labels.d.ts +86 -0
  149. package/components/labels.js +1 -0
  150. package/components/line-chart.js +11 -12
  151. package/components/link.d.ts +20 -0
  152. package/components/link.js +3 -0
  153. package/components/list.d.ts +46 -0
  154. package/components/list.js +2 -0
  155. package/components/message-actions.js +5 -5
  156. package/components/message.js +8 -8
  157. package/components/number-input.d.ts +4 -2
  158. package/components/number-input.js +7 -8
  159. package/components/pagination.js +6 -6
  160. package/components/password-input.d.ts +16 -0
  161. package/components/password-input.js +7 -0
  162. package/components/popover.d.ts +11 -5
  163. package/components/popover.js +3 -4
  164. package/components/progress.js +2 -4
  165. package/components/prompt-bar.js +6 -6
  166. package/components/radio.js +2 -4
  167. package/components/search-bar.js +3 -5
  168. package/components/segmented-control.d.ts +4 -2
  169. package/components/segmented-control.js +3 -5
  170. package/components/select.d.ts +11 -2
  171. package/components/select.js +6 -7
  172. package/components/selectable-card.d.ts +37 -0
  173. package/components/selectable-card.js +2 -0
  174. package/components/selectable-checkbox.d.ts +14 -0
  175. package/components/selectable-checkbox.js +4 -0
  176. package/components/selectable-radio.d.ts +16 -0
  177. package/components/selectable-radio.js +3 -0
  178. package/components/separator.d.ts +18 -0
  179. package/components/separator.js +2 -0
  180. package/components/sheet.d.ts +4 -2
  181. package/components/sheet.js +7 -6
  182. package/components/sidebar.js +2 -4
  183. package/components/skeleton.js +2 -4
  184. package/components/slider.d.ts +6 -2
  185. package/components/slider.js +7 -8
  186. package/components/sliding-indicator.js +1 -3
  187. package/components/spinner.d.ts +18 -0
  188. package/components/spinner.js +3 -0
  189. package/components/split-button.d.ts +24 -0
  190. package/components/split-button.js +8 -0
  191. package/components/streaming-text.js +2 -4
  192. package/components/switch.js +2 -4
  193. package/components/table.d.ts +16 -5
  194. package/components/table.js +4 -5
  195. package/components/tabs.d.ts +4 -2
  196. package/components/tabs.js +3 -5
  197. package/components/textarea.js +3 -5
  198. package/components/thinking.js +3 -5
  199. package/components/toast.js +5 -5
  200. package/components/toggle.js +2 -4
  201. package/components/tooltip.d.ts +5 -2
  202. package/components/tooltip.js +3 -5
  203. package/index.d.ts +17 -2
  204. package/index.js +82 -231
  205. package/lib/utils.d.ts +8 -1
  206. package/lib/utils.js +1 -3
  207. package/package.json +11 -1
  208. package/styles.css +1 -1
  209. package/theme/create-theme.d.ts +6 -2
  210. package/theme/index.js +1 -0
  211. package/chunk-2HKBZFIK.js.map +0 -1
  212. package/chunk-3DINAQLL.js.map +0 -1
  213. package/chunk-3ERGAHKA.js +0 -179
  214. package/chunk-3ERGAHKA.js.map +0 -1
  215. package/chunk-6C7CGJX2.js +0 -86
  216. package/chunk-6C7CGJX2.js.map +0 -1
  217. package/chunk-6QMSWITQ.js.map +0 -1
  218. package/chunk-6YXUBP27.js.map +0 -1
  219. package/chunk-72OCFAPT.js.map +0 -1
  220. package/chunk-7TXHCRAG.js.map +0 -1
  221. package/chunk-A5XEM3GF.js.map +0 -1
  222. package/chunk-AN2RNJLR.js.map +0 -1
  223. package/chunk-B2K45IUR.js.map +0 -1
  224. package/chunk-B6V4VSGH.js.map +0 -1
  225. package/chunk-BKZBWPUH.js.map +0 -1
  226. package/chunk-BNTPPZCK.js.map +0 -1
  227. package/chunk-BNZVTLHV.js.map +0 -1
  228. package/chunk-CL2II6BX.js.map +0 -1
  229. package/chunk-D7RZNTFC.js +0 -95
  230. package/chunk-D7RZNTFC.js.map +0 -1
  231. package/chunk-DETGJAIC.js +0 -147
  232. package/chunk-DETGJAIC.js.map +0 -1
  233. package/chunk-DO3TBNSC.js.map +0 -1
  234. package/chunk-ESC5JCVQ.js +0 -90
  235. package/chunk-ESC5JCVQ.js.map +0 -1
  236. package/chunk-FDKIX4DC.js.map +0 -1
  237. package/chunk-GICKPMJU.js.map +0 -1
  238. package/chunk-GQA24FYG.js +0 -57
  239. package/chunk-GQA24FYG.js.map +0 -1
  240. package/chunk-H4NU7NPO.js.map +0 -1
  241. package/chunk-H63FYCMY.js +0 -11
  242. package/chunk-H63FYCMY.js.map +0 -1
  243. package/chunk-HL42K2NH.js.map +0 -1
  244. package/chunk-HNQUX43Z.js +0 -109
  245. package/chunk-HNQUX43Z.js.map +0 -1
  246. package/chunk-HRKPV66B.js +0 -32
  247. package/chunk-HRKPV66B.js.map +0 -1
  248. package/chunk-J3NSDRVH.js.map +0 -1
  249. package/chunk-JPNWHWAQ.js +0 -151
  250. package/chunk-JPNWHWAQ.js.map +0 -1
  251. package/chunk-KNUWZNFV.js.map +0 -1
  252. package/chunk-L6NCCSIP.js.map +0 -1
  253. package/chunk-LLHTVIM3.js.map +0 -1
  254. package/chunk-LW3TRU5W.js.map +0 -1
  255. package/chunk-LZMKSFCF.js.map +0 -1
  256. package/chunk-MR3JDI7E.js +0 -122
  257. package/chunk-MR3JDI7E.js.map +0 -1
  258. package/chunk-MYEZXZZC.js.map +0 -1
  259. package/chunk-NN6PKJWS.js.map +0 -1
  260. package/chunk-NSRTTYQ4.js.map +0 -1
  261. package/chunk-O7F3CIDV.js.map +0 -1
  262. package/chunk-P4O6TGDR.js.map +0 -1
  263. package/chunk-PF3YBUKT.js.map +0 -1
  264. package/chunk-PVOLDO4G.js +0 -47
  265. package/chunk-PVOLDO4G.js.map +0 -1
  266. package/chunk-QS4N4MNP.js.map +0 -1
  267. package/chunk-QUF2IPOZ.js.map +0 -1
  268. package/chunk-RTJ76X5U.js.map +0 -1
  269. package/chunk-SH6NG6VN.js.map +0 -1
  270. package/chunk-SHDFUXYV.js.map +0 -1
  271. package/chunk-TKO44NDI.js +0 -84
  272. package/chunk-TKO44NDI.js.map +0 -1
  273. package/chunk-TX3H3QMA.js.map +0 -1
  274. package/chunk-UBNHSZSE.js +0 -88
  275. package/chunk-UBNHSZSE.js.map +0 -1
  276. package/chunk-UC3ZJWOD.js +0 -73
  277. package/chunk-UC3ZJWOD.js.map +0 -1
  278. package/chunk-UGRSWP6U.js.map +0 -1
  279. package/chunk-VAGIAREV.js.map +0 -1
  280. package/chunk-WTMZT3IT.js +0 -105
  281. package/chunk-WTMZT3IT.js.map +0 -1
  282. package/chunk-WX6BP5ZP.js +0 -39
  283. package/chunk-WX6BP5ZP.js.map +0 -1
  284. package/chunk-X3PQANZO.js.map +0 -1
  285. package/chunk-XILQ7GXE.js.map +0 -1
  286. package/chunk-XL75JRUA.js.map +0 -1
  287. package/chunk-XZNHT6MO.js.map +0 -1
  288. package/chunk-Y5AYU7PK.js.map +0 -1
  289. package/chunk-YG7JOOLJ.js.map +0 -1
  290. package/chunk-YPJYW624.js +0 -195
  291. package/chunk-YPJYW624.js.map +0 -1
  292. package/chunk-YPNKBE5X.js.map +0 -1
  293. package/chunk-YX5VNRJX.js.map +0 -1
  294. package/components/accordion.js.map +0 -1
  295. package/components/agent-loading.js.map +0 -1
  296. package/components/agent-picker.js.map +0 -1
  297. package/components/agent-suggestion.js.map +0 -1
  298. package/components/announcement-bar.js.map +0 -1
  299. package/components/attachment.js.map +0 -1
  300. package/components/avatar.js.map +0 -1
  301. package/components/badge.js.map +0 -1
  302. package/components/banner-mesh.js.map +0 -1
  303. package/components/banner.js.map +0 -1
  304. package/components/bar-chart.js.map +0 -1
  305. package/components/breadcrumb.js.map +0 -1
  306. package/components/button.js.map +0 -1
  307. package/components/card.js.map +0 -1
  308. package/components/channel-chart.js.map +0 -1
  309. package/components/chart.js.map +0 -1
  310. package/components/checkbox.js.map +0 -1
  311. package/components/chip.js.map +0 -1
  312. package/components/citations.js.map +0 -1
  313. package/components/code-block.js.map +0 -1
  314. package/components/combobox.js.map +0 -1
  315. package/components/command-menu.js.map +0 -1
  316. package/components/context-menu.js.map +0 -1
  317. package/components/cookie-consent.js.map +0 -1
  318. package/components/date-picker.js.map +0 -1
  319. package/components/decision-card.js.map +0 -1
  320. package/components/dialog.js.map +0 -1
  321. package/components/donut-chart.js.map +0 -1
  322. package/components/dot.js.map +0 -1
  323. package/components/dropdown.js.map +0 -1
  324. package/components/empty-state.js.map +0 -1
  325. package/components/file-upload.js.map +0 -1
  326. package/components/floating.js.map +0 -1
  327. package/components/form-field.js.map +0 -1
  328. package/components/hover-card.js.map +0 -1
  329. package/components/input-otp.js.map +0 -1
  330. package/components/input.js.map +0 -1
  331. package/components/kbd.js.map +0 -1
  332. package/components/line-chart.js.map +0 -1
  333. package/components/message-actions.js.map +0 -1
  334. package/components/message.js.map +0 -1
  335. package/components/number-input.js.map +0 -1
  336. package/components/pagination.js.map +0 -1
  337. package/components/popover.js.map +0 -1
  338. package/components/progress.js.map +0 -1
  339. package/components/prompt-bar.js.map +0 -1
  340. package/components/radio.js.map +0 -1
  341. package/components/search-bar.js.map +0 -1
  342. package/components/segmented-control.js.map +0 -1
  343. package/components/select.js.map +0 -1
  344. package/components/sheet.js.map +0 -1
  345. package/components/sidebar.js.map +0 -1
  346. package/components/skeleton.js.map +0 -1
  347. package/components/slider.js.map +0 -1
  348. package/components/sliding-indicator.js.map +0 -1
  349. package/components/streaming-text.js.map +0 -1
  350. package/components/switch.js.map +0 -1
  351. package/components/table.js.map +0 -1
  352. package/components/tabs.js.map +0 -1
  353. package/components/textarea.js.map +0 -1
  354. package/components/thinking.js.map +0 -1
  355. package/components/toast.js.map +0 -1
  356. package/components/toggle.js.map +0 -1
  357. package/components/tooltip.js.map +0 -1
  358. package/index.js.map +0 -1
  359. package/lib/utils.js.map +0 -1
package/chunk-UBNHSZSE.js DELETED
@@ -1,88 +0,0 @@
1
- import { cn } from './chunk-H63FYCMY.js';
2
- import * as React from 'react';
3
- import { jsx, jsxs } from 'react/jsx-runtime';
4
-
5
- var FormFieldContext = React.createContext(null);
6
- function useFormField() {
7
- return React.useContext(FormFieldContext);
8
- }
9
- function FormField({
10
- label,
11
- description,
12
- error,
13
- layout = "vertical",
14
- disabled = false,
15
- required = false,
16
- htmlFor,
17
- className,
18
- children,
19
- ...props
20
- }) {
21
- const autoId = React.useId();
22
- const id = htmlFor ?? autoId;
23
- const invalid = Boolean(error);
24
- const messageId = invalid ? `${id}-error` : description ? `${id}-description` : void 0;
25
- const context = React.useMemo(
26
- () => ({ id, describedBy: messageId, invalid, disabled, required }),
27
- [id, messageId, invalid, disabled, required]
28
- );
29
- return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: context, children: /* @__PURE__ */ jsxs(
30
- "div",
31
- {
32
- "data-slot": "form-field",
33
- "data-layout": layout,
34
- "data-invalid": invalid || void 0,
35
- "data-disabled": disabled || void 0,
36
- className: cn("flex w-full items-start", layout === "vertical" ? "flex-col gap-2" : "gap-6", className),
37
- ...props,
38
- children: [
39
- /* @__PURE__ */ jsxs(
40
- "label",
41
- {
42
- htmlFor: id,
43
- className: cn(
44
- "flex items-start gap-0.5 text-sm leading-[18px] font-medium text-text-default",
45
- layout === "horizontal" && "w-40 shrink-0",
46
- disabled && "opacity-50"
47
- ),
48
- children: [
49
- label,
50
- required && // The required mark from Figma (the `sparkle 2` glyph in _label), 6px, in the label colour.
51
- /* @__PURE__ */ jsx("svg", { width: "6", height: "6", viewBox: "0 0 6 6", fill: "currentColor", "aria-hidden": true, className: "shrink-0", children: /* @__PURE__ */ jsx("path", { d: "M3.63636 2.18023L5.55372 1.41279L6 2.75581L4.04959 3.43605L5.27273 5.14535L4.18182 6L2.95868 4.20349L1.80165 6L0.694215 5.14535L1.91736 3.43605L0 2.75581L0.446281 1.41279L2.31405 2.18023V0H3.63636V2.18023Z" }) })
52
- ]
53
- }
54
- ),
55
- /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0 flex-1 flex-col gap-1.5", children: [
56
- children,
57
- invalid ? /* @__PURE__ */ jsxs("p", { id: messageId, className: "flex items-start gap-1.5 text-sm text-action-destructive-bg", children: [
58
- /* @__PURE__ */ jsxs(
59
- "svg",
60
- {
61
- width: "14",
62
- height: "14",
63
- viewBox: "0 0 14 14",
64
- fill: "none",
65
- stroke: "currentColor",
66
- strokeWidth: "1.09375",
67
- strokeLinecap: "round",
68
- strokeLinejoin: "round",
69
- "aria-hidden": true,
70
- className: "mt-[2.75px] shrink-0",
71
- children: [
72
- /* @__PURE__ */ jsx("path", { d: "M7 4.67613V7.25806" }),
73
- /* @__PURE__ */ jsx("path", { d: "M7 9.32422L7.0059 9.31766" }),
74
- /* @__PURE__ */ jsx("path", { d: "M6.99995 12.1638C9.85184 12.1638 12.1638 9.85184 12.1638 6.99995C12.1638 4.14803 9.85184 1.83609 6.99995 1.83609C4.14803 1.83609 1.83609 4.14803 1.83609 6.99995C1.83609 9.85184 4.14803 12.1638 6.99995 12.1638Z" })
75
- ]
76
- }
77
- ),
78
- /* @__PURE__ */ jsx("span", { children: error })
79
- ] }) : description && /* @__PURE__ */ jsx("p", { id: messageId, className: cn("text-sm text-text-muted", disabled && "opacity-50"), children: description })
80
- ] })
81
- ]
82
- }
83
- ) });
84
- }
85
-
86
- export { FormField, useFormField };
87
- //# sourceMappingURL=chunk-UBNHSZSE.js.map
88
- //# sourceMappingURL=chunk-UBNHSZSE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form-field.tsx"],"names":[],"mappings":"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","file":"chunk-UBNHSZSE.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Form field, 1:1 with the uiKit `FormField` set (3649:17775): a label, a control slot, then a\n * description or, when `error` is set, an error message in its place. Vertical puts the label\n * 8px above the control; horizontal puts it in a 160px column, 24px to the left. Description\n * and error sit 6px under the control. Disabled dims the label and description to 50% and\n * disables the control.\n *\n * The control is wired through context: Input and Textarea pick up the field's id (so the\n * label points at them), `aria-describedby` (description or error), `aria-invalid` and\n * `disabled`. Any other control can read the same values with `useFormField()`.\n */\nexport interface FormFieldContextValue {\n id: string\n describedBy?: string\n invalid: boolean\n disabled: boolean\n required: boolean\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\n/** The id, describedby, invalid, disabled and required of the surrounding FormField, if any. */\nexport function useFormField() {\n return React.useContext(FormFieldContext)\n}\n\nexport interface FormFieldProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n label: React.ReactNode\n description?: React.ReactNode\n /** An error message. It replaces the description and marks the control invalid. */\n error?: React.ReactNode\n layout?: 'vertical' | 'horizontal'\n disabled?: boolean\n /** Shows the required mark after the label and sets `required` on the control. */\n required?: boolean\n /** The id given to the control. Generated when left out. */\n htmlFor?: string\n children: React.ReactNode\n}\n\nexport function FormField({\n label,\n description,\n error,\n layout = 'vertical',\n disabled = false,\n required = false,\n htmlFor,\n className,\n children,\n ...props\n}: FormFieldProps) {\n const autoId = React.useId()\n const id = htmlFor ?? autoId\n const invalid = Boolean(error)\n const messageId = invalid ? `${id}-error` : description ? `${id}-description` : undefined\n\n const context = React.useMemo<FormFieldContextValue>(\n () => ({ id, describedBy: messageId, invalid, disabled, required }),\n [id, messageId, invalid, disabled, required],\n )\n\n return (\n <FormFieldContext.Provider value={context}>\n <div\n data-slot=\"form-field\"\n data-layout={layout}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={cn('flex w-full items-start', layout === 'vertical' ? 'flex-col gap-2' : 'gap-6', className)}\n {...props}\n >\n <label\n htmlFor={id}\n className={cn(\n 'flex items-start gap-0.5 text-sm leading-[18px] font-medium text-text-default',\n layout === 'horizontal' && 'w-40 shrink-0',\n disabled && 'opacity-50',\n )}\n >\n {label}\n {required && (\n // The required mark from Figma (the `sparkle 2` glyph in _label), 6px, in the label colour.\n <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"currentColor\" aria-hidden className=\"shrink-0\">\n <path d=\"M3.63636 2.18023L5.55372 1.41279L6 2.75581L4.04959 3.43605L5.27273 5.14535L4.18182 6L2.95868 4.20349L1.80165 6L0.694215 5.14535L1.91736 3.43605L0 2.75581L0.446281 1.41279L2.31405 2.18023V0H3.63636V2.18023Z\" />\n </svg>\n )}\n </label>\n <div className=\"flex w-full min-w-0 flex-1 flex-col gap-1.5\">\n {children}\n {invalid ? (\n <p id={messageId} className=\"flex items-start gap-1.5 text-sm text-action-destructive-bg\">\n {/* Figma's 14px warning circle at 1.09px. */}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.09375\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"mt-[2.75px] shrink-0\"\n >\n <path d=\"M7 4.67613V7.25806\" />\n <path d=\"M7 9.32422L7.0059 9.31766\" />\n <path d=\"M6.99995 12.1638C9.85184 12.1638 12.1638 9.85184 12.1638 6.99995C12.1638 4.14803 9.85184 1.83609 6.99995 1.83609C4.14803 1.83609 1.83609 4.14803 1.83609 6.99995C1.83609 9.85184 4.14803 12.1638 6.99995 12.1638Z\" />\n </svg>\n <span>{error}</span>\n </p>\n ) : (\n description && (\n <p id={messageId} className={cn('text-sm text-text-muted', disabled && 'opacity-50')}>\n {description}\n </p>\n )\n )}\n </div>\n </div>\n </FormFieldContext.Provider>\n )\n}\n"]}
package/chunk-UC3ZJWOD.js DELETED
@@ -1,73 +0,0 @@
1
- import { cn } from './chunk-H63FYCMY.js';
2
- import 'react';
3
- import { Toggle as Toggle$1 } from 'radix-ui';
4
- import { cva } from 'class-variance-authority';
5
- import { jsxs } from 'react/jsx-runtime';
6
-
7
- var toggleVariants = cva(
8
- [
9
- "inline-flex shrink-0 items-center justify-center gap-2 border font-medium whitespace-nowrap select-none text-text-muted",
10
- "transition-[background-color,border-color,color,box-shadow,border-radius] duration-(--duration-fast) ease-(--ease-out)",
11
- "focus-visible:outline-none disabled:pointer-events-none disabled:text-text-subtle",
12
- "satin-hover:text-text-default satin-focus:text-text-default data-[state=on]:text-text-default",
13
- // Figma icons are 1.25px at 16; on Iconoir's 24 grid that is 1.875.
14
- "[&_svg]:pointer-events-none [&_svg]:size-icon-size [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
15
- ],
16
- {
17
- variants: {
18
- variant: {
19
- outline: [
20
- "rounded-lg border-border-default bg-bg-popover",
21
- "satin-hover:border-border-strong satin-hover:bg-bg-muted",
22
- "satin-focus:border-action-primary-bg satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
23
- "data-[state=on]:border-border-strong data-[state=on]:bg-action-secondary-bg-pressed",
24
- "data-[state=on]:satin-hover:border-border-strong data-[state=on]:satin-hover:bg-action-secondary-bg-pressed",
25
- "data-[state=on]:satin-focus:border-action-primary-bg data-[state=on]:satin-focus:bg-action-secondary-bg-pressed",
26
- "disabled:border-border-default disabled:bg-bg-muted",
27
- "disabled:data-[state=on]:border-border-default disabled:data-[state=on]:bg-action-secondary-bg-pressed"
28
- ],
29
- ghost: [
30
- "rounded-md border-transparent bg-transparent",
31
- "satin-hover:rounded-lg satin-hover:bg-bg-muted",
32
- // Figma's ghost focus is the primary border alone (its ring is 0px); pressed + focus has the ring.
33
- "satin-focus:rounded-lg satin-focus:border-action-primary-bg satin-focus:[box-shadow:none]",
34
- "data-[state=on]:rounded-lg data-[state=on]:bg-action-secondary-bg-pressed",
35
- "data-[state=on]:satin-hover:bg-action-secondary-bg-pressed",
36
- "data-[state=on]:satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
37
- "disabled:rounded-md disabled:data-[state=on]:rounded-md"
38
- ]
39
- },
40
- size: {
41
- md: "h-control-height-lg px-2.5 text-base",
42
- sm: "h-control-height px-2.5 text-sm leading-[18px]"
43
- },
44
- iconOnly: {
45
- true: "px-0",
46
- false: ""
47
- }
48
- },
49
- compoundVariants: [
50
- { iconOnly: true, size: "md", className: "w-control-height-lg" },
51
- { iconOnly: true, size: "sm", className: "w-control-height" }
52
- ],
53
- defaultVariants: { variant: "outline", size: "md", iconOnly: false }
54
- }
55
- );
56
- function Toggle({ className, variant, size, iconOnly, icon, children, ...props }) {
57
- return /* @__PURE__ */ jsxs(
58
- Toggle$1.Root,
59
- {
60
- "data-slot": "toggle",
61
- className: cn(toggleVariants({ variant, size, iconOnly }), className),
62
- ...props,
63
- children: [
64
- icon,
65
- !iconOnly && children
66
- ]
67
- }
68
- );
69
- }
70
-
71
- export { Toggle, toggleVariants };
72
- //# sourceMappingURL=chunk-UC3ZJWOD.js.map
73
- //# sourceMappingURL=chunk-UC3ZJWOD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/toggle.tsx"],"names":["TogglePrimitive"],"mappings":";;;;;;AAqBA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB;AAAA,IACE,yHAAA;AAAA,IACA,wHAAA;AAAA,IACA,mFAAA;AAAA,IACA,+FAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA,UACP,gDAAA;AAAA,UACA,0DAAA;AAAA,UACA,4HAAA;AAAA,UACA,qFAAA;AAAA,UACA,6GAAA;AAAA,UACA,iHAAA;AAAA,UACA,qDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,8CAAA;AAAA,UACA,gDAAA;AAAA;AAAA,UAEA,2FAAA;AAAA,UACA,2EAAA;AAAA,UACA,4DAAA;AAAA,UACA,6EAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,sCAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAW,qBAAA,EAAsB;AAAA,MAC/D,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAW,kBAAA;AAAmB,KAC9D;AAAA,IACA,iBAAiB,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA;AAAM;AAEvE;AAWO,SAAS,MAAA,CAAO,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAgB;AACpG,EAAA,uBACE,IAAA;AAAA,IAACA,QAAA,CAAgB,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAAA,MACnE,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,CAAC,QAAA,IAAY;AAAA;AAAA;AAAA,GAChB;AAEJ","file":"chunk-UC3ZJWOD.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\n/**\n * Toggle, 1:1 with the uiKit `Toggle` set (852:21771): a button that stays pressed. Two\n * variants, outline (bg/popover, border/default, radius-lg) and ghost (no fill, radius-md),\n * two sizes, md 32 (14/21) and sm 28 (13/18), 10px side padding, a 16px icon 8px from the\n * label, and a square icon-only form.\n *\n * At rest the label and icon are text/muted. Hover: bg/muted (outline adds border/strong).\n * Focus: an action/primary border, plus the 2px focus ring on outline. Pressed:\n * action/secondary/bg-pressed (outline with border/strong), text/default; pressed + focus\n * adds the ring on both. Disabled: text/subtle, outline on bg/muted. Ghost rounds to radius-lg\n * whenever it is hovered, focused or pressed, as in Figma.\n *\n * States use satin-hover / satin-focus (or data-force), pressed is Radix's data-state=\"on\".\n */\nconst toggleVariants = cva(\n [\n 'inline-flex shrink-0 items-center justify-center gap-2 border font-medium whitespace-nowrap select-none text-text-muted',\n 'transition-[background-color,border-color,color,box-shadow,border-radius] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:outline-none disabled:pointer-events-none disabled:text-text-subtle',\n 'satin-hover:text-text-default satin-focus:text-text-default data-[state=on]:text-text-default',\n // Figma icons are 1.25px at 16; on Iconoir's 24 grid that is 1.875.\n '[&_svg]:pointer-events-none [&_svg]:size-icon-size [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n variant: {\n outline: [\n 'rounded-lg border-border-default bg-bg-popover',\n 'satin-hover:border-border-strong satin-hover:bg-bg-muted',\n 'satin-focus:border-action-primary-bg satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'data-[state=on]:border-border-strong data-[state=on]:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-hover:border-border-strong data-[state=on]:satin-hover:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-focus:border-action-primary-bg data-[state=on]:satin-focus:bg-action-secondary-bg-pressed',\n 'disabled:border-border-default disabled:bg-bg-muted',\n 'disabled:data-[state=on]:border-border-default disabled:data-[state=on]:bg-action-secondary-bg-pressed',\n ],\n ghost: [\n 'rounded-md border-transparent bg-transparent',\n 'satin-hover:rounded-lg satin-hover:bg-bg-muted',\n // Figma's ghost focus is the primary border alone (its ring is 0px); pressed + focus has the ring.\n 'satin-focus:rounded-lg satin-focus:border-action-primary-bg satin-focus:[box-shadow:none]',\n 'data-[state=on]:rounded-lg data-[state=on]:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-hover:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'disabled:rounded-md disabled:data-[state=on]:rounded-md',\n ],\n },\n size: {\n md: 'h-control-height-lg px-2.5 text-base',\n sm: 'h-control-height px-2.5 text-sm leading-[18px]',\n },\n iconOnly: {\n true: 'px-0',\n false: '',\n },\n },\n compoundVariants: [\n { iconOnly: true, size: 'md', className: 'w-control-height-lg' },\n { iconOnly: true, size: 'sm', className: 'w-control-height' },\n ],\n defaultVariants: { variant: 'outline', size: 'md', iconOnly: false },\n },\n)\n\nexport interface ToggleProps\n extends React.ComponentProps<typeof TogglePrimitive.Root>,\n VariantProps<typeof toggleVariants> {\n /** A 16px icon before the label, or the only content when `iconOnly` (then pass an aria-label). */\n icon?: React.ReactNode\n /** Show a state without interacting, for state sheets. */\n 'data-force'?: 'hover' | 'focus'\n}\n\nexport function Toggle({ className, variant, size, iconOnly, icon, children, ...props }: ToggleProps) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, iconOnly }), className)}\n {...props}\n >\n {icon}\n {!iconOnly && children}\n </TogglePrimitive.Root>\n )\n}\n\nexport { toggleVariants }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/search-bar.tsx"],"names":["SearchBar"],"mappings":";;;;;;AA0BO,IAAM,YAAkB,KAAA,CAAA,UAAA,CAA6C,SAASA,UAAAA,CACnF,EAAE,WAAW,IAAA,EAAM,MAAA,GAAS,QAAA,EAAU,gBAAA,EAAkB,WAAW,WAAA,GAAc,WAAA,EAAa,WAAW,GAAG,KAAA,IAC5G,SAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAc,aAAyB,IAAI,CAAA;AACjD,EAAM,KAAA,CAAA,mBAAA,CAAoB,SAAA,EAAW,MAAM,KAAA,CAAM,OAA2B,CAAA;AAE5E,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,KAAY,EAAE,GAAA,CAAI,WAAA,OAAkB,GAAA,EAAK;AAC3D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AACrB,QAAA,KAAA,CAAM,SAAS,MAAA,EAAO;AAAA,MACxB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wHAAA;AAAA,QACA,oIAAA;AAAA,QACA,4BAAA;AAAA,QACA,yHAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,sDAAA,EAAuD,CAAA;AAAA,wBACrF,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,KAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,WAAA;AAAA,YACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,cAAc,KAAA,EAAO;AAC/C,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,MAAM,MAAM,MAAA,CAAO,wBAAA,CAAyB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA,EAAG,GAAA;AAClF,gBAAA,GAAA,EAAK,IAAA,CAAK,CAAA,CAAE,aAAA,EAAe,EAAE,CAAA;AAC7B,gBAAA,CAAA,CAAE,aAAA,CAAc,cAAc,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,cACrE;AACA,cAAA,SAAA,GAAY,CAAC,CAAA;AAAA,YACf,CAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,uHAAA;AAAA,cACA,mDAAA;AAAA,cACA;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA,SACN;AAAA,QACC,4BACC,IAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,oCAAA,EAC1B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,0BACN,GAAA,CAAC,OAAI,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC","file":"chunk-UGRSWP6U.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Search } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Kbd } from './kbd'\n\n/**\n * SearchBar, 1:1 with the uiKit `searchBar` (3233:18871): a 32px field for the sidebar that\n * fills its container. A 16px search icon in text/muted, 13px text (placeholder text/subtle),\n * 8px padding and gaps, radius-lg, border/default on bg/card with the xs shadow; hover takes\n * border/strong, focus border/focus with the 2px focus ring. The ⌘K keys (Kbd sm) can be hidden\n * with `shortcut={false}`.\n *\n * With `shortcut`, ⌘K or Ctrl+K anywhere on the page focuses it; Escape clears it.\n */\nexport interface SearchBarProps extends Omit<React.ComponentProps<'input'>, 'size'> {\n /** Show the ⌘K keycaps and listen for the shortcut. */\n shortcut?: boolean\n /** Listen for ⌘K / Ctrl+K. Defaults to `shortcut`; turn it off when something else owns the\n * shortcut (a Command menu this bar opens) but the keycaps should still show. */\n hotkey?: boolean\n /** Classes for the outer field; `className` styles the input. */\n wrapperClassName?: string\n}\n\nexport const SearchBar = React.forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { shortcut = true, hotkey = shortcut, wrapperClassName, className, placeholder = 'Search...', onKeyDown, ...props },\n forwarded,\n) {\n const inner = React.useRef<HTMLInputElement>(null)\n React.useImperativeHandle(forwarded, () => inner.current as HTMLInputElement)\n\n React.useEffect(() => {\n if (!hotkey) return\n const onKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault()\n inner.current?.focus()\n inner.current?.select()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [hotkey])\n\n return (\n <label\n data-slot=\"search-bar\"\n className={cn(\n 'flex h-control-height-lg w-full cursor-text items-center gap-2 rounded-lg border border-border-default bg-bg-card px-2',\n '[box-shadow:0_1px_1px_0_var(--effect-shadow-xs)] transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'hover:border-border-strong',\n 'has-[input:focus-visible]:border-border-focus has-[input:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n wrapperClassName,\n )}\n >\n <Search aria-hidden className=\"size-4 shrink-0 text-text-muted [stroke-width:1.875]\" />\n <input\n ref={inner}\n type=\"search\"\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && e.currentTarget.value) {\n e.preventDefault()\n const set = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n set?.call(e.currentTarget, '')\n e.currentTarget.dispatchEvent(new Event('input', { bubbles: true }))\n }\n onKeyDown?.(e)\n }}\n className={cn(\n 'min-w-0 flex-1 bg-transparent text-sm text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0',\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n {shortcut && (\n <span aria-hidden className=\"flex shrink-0 items-center gap-0.5\">\n <Kbd>⌘</Kbd>\n <Kbd>K</Kbd>\n </span>\n )}\n </label>\n )\n})\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/agent-picker.tsx"],"names":[],"mappings":"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","file":"chunk-VAGIAREV.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { DropdownMenu } from 'radix-ui'\nimport { Check, NavArrowDown, Plus } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport type { BadgeTone } from './badge'\n\n/**\n * AgentPicker, from the uiKit Agent picker docs view (3890:47473): a rounded Button with the\n * current agent's avatar, name and a chevron, opening a menu of agents. Menu rows are 1:1\n * with `DropdownMenu/Item` (653:19165): 8px side padding, radius-lg, medium 13/13 label and a\n * 13px text/muted description 4px under it (`layout=stacked`, 20px avatar), or the label alone\n * (`layout=inline`, 16px avatar) when `showDescription` is off. Hover and the selected row\n * fill bg/selected; the selected row also shows a check in status/green, so selection never\n * relies on colour alone. The menu is bg/popover, a border/subtle hairline, radius-xl, 4px\n * padding, 255 wide, with the shadcn sm shadow.\n *\n * Built on Radix DropdownMenu (radio group semantics, arrow keys, typeahead, Escape).\n * The avatar is a small local one on the Badge hue pairs, so this file has no dependency\n * on a separate Avatar component.\n */\n\nexport type Agent = {\n id: string\n name: string\n /** One line on what the agent does. */\n description?: string\n /** Two letters for the avatar; taken from the name when left out. */\n initials?: string\n /** Avatar hue, same pairs as Badge. */\n tone?: BadgeTone\n /** Initials on the tone, or the flappy bird painted in it. */\n avatar?: 'initials' | 'flappy'\n}\n\nexport interface AgentPickerProps {\n agents: Agent[]\n /** The selected agent's id. */\n value?: string\n defaultValue?: string\n onValueChange?: (id: string) => void\n /** Show the one-line description under each name. Turn it off once agents are familiar. */\n showDescription?: boolean\n /** Secondary under the composer, Tertiary inside dense toolbars. */\n variant?: 'secondary' | 'tertiary'\n /** md is the 28px trigger, xs the 24px one. */\n size?: 'md' | 'xs'\n /** Adds a \"New agent\" action under the list. */\n onCreate?: () => void\n /** Label for the create action. */\n createLabel?: string\n /** Shown on the trigger when nothing is selected. */\n placeholder?: string\n /** Controlled open state, e.g. to show the menu open on a docs stage. */\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Render the menu in place instead of in a portal. */\n disablePortal?: boolean\n className?: string\n}\n\nexport function AgentPicker({\n agents,\n value: valueProp,\n defaultValue,\n onValueChange,\n showDescription = true,\n variant = 'secondary',\n size = 'md',\n onCreate,\n createLabel = 'New agent',\n placeholder = 'Choose an agent',\n open,\n defaultOpen,\n onOpenChange,\n disablePortal = false,\n className,\n}: AgentPickerProps) {\n const [inner, setInner] = React.useState(defaultValue ?? agents[0]?.id)\n const value = valueProp ?? inner\n const current = agents.find((a) => a.id === value)\n\n const select = (id: string) => {\n setInner(id)\n onValueChange?.(id)\n }\n\n const content = (\n <AgentMenu\n agents={agents}\n value={value}\n onValueChange={select}\n showDescription={showDescription}\n onCreate={onCreate}\n createLabel={createLabel}\n />\n )\n\n return (\n <DropdownMenu.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button\n variant={variant}\n size={size}\n shape=\"rounded\"\n className={cn('data-[state=open]:bg-action-secondary-bg-hover', className)}\n >\n {current && <AgentAvatar agent={current} size={16} />}\n <span className=\"truncate\">\n {current && <span className=\"sr-only\">Agent: </span>}\n {current ? current.name : placeholder}\n </span>\n <NavArrowDown aria-hidden data-chevron />\n </Button>\n </DropdownMenu.Trigger>\n {disablePortal ? content : <DropdownMenu.Portal>{content}</DropdownMenu.Portal>}\n </DropdownMenu.Root>\n )\n}\n\nfunction AgentMenu({\n agents,\n value,\n onValueChange,\n showDescription,\n onCreate,\n createLabel,\n}: {\n agents: Agent[]\n value?: string\n onValueChange: (id: string) => void\n showDescription: boolean\n onCreate?: () => void\n createLabel: string\n}) {\n return (\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={8}\n className={cn(\n 'z-50 flex w-[255px] max-w-[520px] flex-col gap-1 rounded-xl border border-border-subtle bg-bg-popover p-1 outline-none',\n '[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n 'data-[state=open]:[animation:satin-enter_var(--duration-fast)_var(--ease-out)]',\n )}\n >\n <DropdownMenu.RadioGroup value={value} onValueChange={onValueChange} className=\"flex flex-col\">\n {agents.map((agent) => (\n <AgentMenuItem key={agent.id} agent={agent} showDescription={showDescription} />\n ))}\n </DropdownMenu.RadioGroup>\n {onCreate && (\n <DropdownMenu.Item\n onSelect={onCreate}\n className={cn(\n 'flex h-control-height-xs items-center gap-1 self-start rounded-md px-2 text-sm font-medium text-text-default outline-none select-none',\n 'transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n '[&_svg]:size-icon-size-sm [&_svg]:text-text-muted [&_svg]:[stroke-width:1.875]',\n 'data-highlighted:bg-bg-hover',\n )}\n >\n <Plus aria-hidden />\n {createLabel}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n )\n}\n\nexport interface AgentMenuItemProps\n extends Omit<React.ComponentProps<typeof DropdownMenu.RadioItem>, 'value' | 'children'> {\n agent: Agent\n showDescription?: boolean\n 'data-force'?: 'hover'\n}\n\n/** One row of the menu, `DropdownMenu/Item` (653:19165). Must sit inside the picker's radio group. */\nexport function AgentMenuItem({ agent, showDescription = true, className, ...props }: AgentMenuItemProps) {\n const stacked = showDescription && !!agent.description\n return (\n <DropdownMenu.RadioItem\n value={agent.id}\n className={cn(agentRowClass, className)}\n {...props}\n >\n <AgentAvatar agent={agent} size={stacked ? 20 : 16} />\n <AgentRowText agent={agent} stacked={stacked} />\n <DropdownMenu.ItemIndicator className=\"flex shrink-0\">\n <Check aria-hidden className=\"size-icon-size text-status-green-fg [stroke-width:1.875]\" />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n )\n}\n\nconst agentRowClass = cn(\n 'flex min-h-8 w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left outline-none select-none',\n 'transition-[background-color] duration-(--duration-fast) ease-(--ease-out)',\n 'data-highlighted:bg-bg-selected data-[force=hover]:bg-bg-selected data-[state=checked]:bg-bg-selected',\n)\n\nfunction AgentRowText({ agent, stacked }: { agent: Agent; stacked: boolean }) {\n return (\n <span className=\"flex min-w-0 flex-1 flex-col justify-center gap-1\">\n <span className=\"text-sm leading-[13px] font-medium text-text-default\">{agent.name}</span>\n {stacked && <span className=\"text-sm font-normal text-text-muted\">{agent.description}</span>}\n </span>\n )\n}\n\n/**\n * A static menu row for state sheets and docs (no menu around it): the same look as a menu\n * item, with `state` forced to default, hover or selected.\n */\nexport function AgentPickerRow({\n agent,\n state = 'default',\n showDescription = true,\n className,\n}: {\n agent: Agent\n state?: 'default' | 'hover' | 'selected'\n showDescription?: boolean\n className?: string\n}) {\n const stacked = showDescription && !!agent.description\n return (\n <div\n data-force={state === 'hover' ? 'hover' : undefined}\n data-state={state === 'selected' ? 'checked' : undefined}\n className={cn(agentRowClass, className)}\n >\n <AgentAvatar agent={agent} size={stacked ? 20 : 16} />\n <AgentRowText agent={agent} stacked={stacked} />\n {state === 'selected' && (\n <Check aria-hidden className=\"size-icon-size shrink-0 text-status-green-fg [stroke-width:1.875]\" />\n )}\n </div>\n )\n}\n\n/**\n * Initials on a Badge hue pair, round. 16px uses semibold 7/8, 20px semibold 9/10, as on\n * the uiKit Avatar (992:20199). These sizes have no type token, so they stay raw.\n * `avatar=\"flappy\"` draws the flappy bird instead, in the agent's tone.\n */\nexport function AgentAvatar({ agent, size = 16 }: { agent: Agent; size?: 16 | 20 }) {\n if (agent.avatar === 'flappy') return <FlappyAvatar tone={agent.tone ?? 'brand'} size={size} />\n const initials = agent.initials ?? toInitials(agent.name)\n return (\n <span\n aria-hidden\n data-tone={agent.tone ?? 'brand'}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-full bg-tone-bg font-semibold tracking-normal text-tone-fg',\n size === 16 ? 'size-4 text-[7px] leading-2' : 'size-5 text-[9px] leading-[10px]',\n )}\n >\n {initials}\n </span>\n )\n}\n\n/**\n * The flappy bird (uiKit flappyAgent, 1215:69019) as a 17 × 12 pixel grid: 0 outline, 1 body,\n * 2 eye and wing, 3 beak, 4 belly. Body and belly take the tone's hue at a fixed, bright\n * lightness (0.8 and 0.68 in OKLCH, chroma up a third), so each agent gets its own bird on the\n * Badge hues and it stays as vivid as the original yellow one in both themes.\n */\nconst FLAPPY_GRID = [\n '......000000.....',\n '....001111020....',\n '...01111102220...',\n '.00001111022020..',\n '022220111022020..',\n '022222011102220..',\n '0122210111100000.',\n '.0111011110333330',\n '..00044440300000.',\n '....044444033330.',\n '.....00444400000.',\n '.......0000......',\n]\nconst FLAPPY_FILL = [\n '#000',\n 'oklch(from var(--tone-fg) 0.8 calc(c * 1.33) h)',\n '#fff',\n '#ff5722',\n 'oklch(from var(--tone-fg) 0.68 calc(c * 1.33) h)',\n]\n\nfunction FlappyAvatar({ tone, size }: { tone: BadgeTone; size: 16 | 20 }) {\n return (\n <svg\n aria-hidden\n data-tone={tone}\n width={size}\n height={size}\n viewBox=\"0 -2.5 17 17\"\n shapeRendering=\"crispEdges\"\n className=\"shrink-0\"\n >\n {FLAPPY_GRID.flatMap((row, y) =>\n [...row].map((c, x) => (c === '.' ? null : <rect key={`${x}-${y}`} x={x} y={y} width={1} height={1} fill={FLAPPY_FILL[+c]} />)),\n )}\n </svg>\n )\n}\n\nfunction toInitials(name: string) {\n const words = name.trim().split(/\\s+/)\n const letters = words.length > 1 ? words[0][0] + words[1][0] : name.slice(0, 2)\n return letters.toUpperCase()\n}\n"]}
package/chunk-WTMZT3IT.js DELETED
@@ -1,105 +0,0 @@
1
- import { useSlidingIndicator } from './chunk-J3NSDRVH.js';
2
- import { cn } from './chunk-H63FYCMY.js';
3
- import * as React from 'react';
4
- import { ToggleGroup } from 'radix-ui';
5
- import { cva } from 'class-variance-authority';
6
- import { jsxs, jsx } from 'react/jsx-runtime';
7
-
8
- var track = cva("relative isolate inline-flex items-center gap-0.5 bg-bg-muted p-1", {
9
- variants: {
10
- shape: { default: "rounded-lg", rounded: "rounded-pill" },
11
- border: { true: "border border-border-subtle", false: "" },
12
- fullWidth: { true: "flex w-full", false: "" }
13
- }
14
- });
15
- var segment = cva(
16
- [
17
- "relative z-10 inline-flex items-center justify-center font-medium whitespace-nowrap text-text-muted select-none",
18
- "transition-[color,background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
19
- "satin-hover:text-text-default data-[state=on]:text-text-default",
20
- "satin-pressed:bg-component-segmented-pressed satin-pressed:text-text-default",
21
- "focus-visible:outline-none satin-focus:text-text-default satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
22
- "disabled:pointer-events-none disabled:text-text-subtle",
23
- "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
24
- ],
25
- {
26
- variants: {
27
- size: {
28
- xs: "h-control-height-xs gap-1 px-2.5 text-sm [&_svg]:size-icon-size-sm",
29
- md: "h-control-height gap-1.5 px-3 text-sm [&_svg]:size-icon-size",
30
- lg: "h-control-height-lg gap-1.5 px-4 text-base [&_svg]:size-icon-size"
31
- },
32
- shape: { default: "rounded-sm", rounded: "rounded-pill" },
33
- fullWidth: { true: "flex-1", false: "" }
34
- }
35
- }
36
- );
37
- function SegmentedControl({
38
- items,
39
- value: valueProp,
40
- defaultValue,
41
- onValueChange,
42
- size = "md",
43
- shape = "default",
44
- border = false,
45
- fullWidth = false,
46
- className,
47
- ...aria
48
- }) {
49
- const [inner, setInner] = React.useState(defaultValue ?? items[0]?.value ?? "");
50
- const value = valueProp ?? inner;
51
- const trackRef = React.useRef(null);
52
- const pill = useSlidingIndicator(trackRef, '[data-state="on"]', `${value}|${size}|${fullWidth}|${items.length}`);
53
- return /* @__PURE__ */ jsxs(
54
- ToggleGroup.Root,
55
- {
56
- ref: trackRef,
57
- type: "single",
58
- value,
59
- onValueChange: (next) => {
60
- if (!next) return;
61
- setInner(next);
62
- onValueChange?.(next);
63
- },
64
- "data-slot": "segmented-control",
65
- className: cn(track({ shape, border, fullWidth }), className),
66
- ...aria,
67
- children: [
68
- /* @__PURE__ */ jsx(
69
- "span",
70
- {
71
- ref: pill.ref,
72
- "aria-hidden": true,
73
- className: cn(
74
- "pointer-events-none absolute top-1 bottom-1 left-0 z-0 bg-component-segmented-selected opacity-0 [box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]",
75
- shape === "rounded" ? "rounded-pill" : "rounded-sm"
76
- )
77
- }
78
- ),
79
- items.map((item) => /* @__PURE__ */ jsxs(
80
- ToggleGroup.Item,
81
- {
82
- value: item.value,
83
- disabled: item.disabled,
84
- className: cn(
85
- segment({ size, shape, fullWidth }),
86
- // Unselected focus: bg/muted under the ring. Selected focus keeps the pill's fill.
87
- "data-[state=off]:satin-focus:bg-bg-muted",
88
- // Before the pill is measured (server render), the selected segment paints its own fill.
89
- !pill.ready && "data-[state=on]:bg-component-segmented-selected data-[state=on]:[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]"
90
- ),
91
- children: [
92
- item.icon,
93
- item.label
94
- ]
95
- },
96
- item.value
97
- ))
98
- ]
99
- }
100
- );
101
- }
102
-
103
- export { SegmentedControl };
104
- //# sourceMappingURL=chunk-WTMZT3IT.js.map
105
- //# sourceMappingURL=chunk-WTMZT3IT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/segmented-control.tsx"],"names":[],"mappings":"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","file":"chunk-WTMZT3IT.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ToggleGroup } from 'radix-ui'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\nimport { useSlidingIndicator } from './sliding-indicator'\n\n/**\n * SegmentedControl, from the uiKit `segmented control` page: 2–5 segments that switch\n * views or filters in place. One segment is always selected; the selected pill slides under\n * the labels to the new segment, as in Tabs and Pagination (sliding-indicator.tsx: 300 ms,\n * the leading edge first): a white card with Shadow/sm in Light. Arrow keys move between segments.\n * Values 1:1 with the uiKit `_segmentedControl/item` (3080:20278) and `SegmentedControl` (3080:21247) sets.\n */\ntype Size = 'xs' | 'md' | 'lg'\ntype Shape = 'default' | 'rounded'\n\nexport interface SegmentedControlItem {\n value: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SegmentedControlProps {\n items: SegmentedControlItem[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n size?: Size\n shape?: Shape\n /** A 1px border-subtle outline around the track. */\n border?: boolean\n fullWidth?: boolean\n /** Required when the segments have no visible text of their own. */\n 'aria-label'?: string\n className?: string\n}\n\nconst track = cva('relative isolate inline-flex items-center gap-0.5 bg-bg-muted p-1', {\n variants: {\n shape: { default: 'rounded-lg', rounded: 'rounded-pill' },\n border: { true: 'border border-border-subtle', false: '' },\n fullWidth: { true: 'flex w-full', false: '' },\n },\n})\n\nconst segment = cva(\n [\n 'relative z-10 inline-flex items-center justify-center font-medium whitespace-nowrap text-text-muted select-none',\n 'transition-[color,background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'satin-hover:text-text-default data-[state=on]:text-text-default',\n 'satin-pressed:bg-component-segmented-pressed satin-pressed:text-text-default',\n 'focus-visible:outline-none satin-focus:text-text-default satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'disabled:pointer-events-none disabled:text-text-subtle',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n size: {\n xs: 'h-control-height-xs gap-1 px-2.5 text-sm [&_svg]:size-icon-size-sm',\n md: 'h-control-height gap-1.5 px-3 text-sm [&_svg]:size-icon-size',\n lg: 'h-control-height-lg gap-1.5 px-4 text-base [&_svg]:size-icon-size',\n },\n shape: { default: 'rounded-sm', rounded: 'rounded-pill' },\n fullWidth: { true: 'flex-1', false: '' },\n },\n },\n)\n\nexport function SegmentedControl({\n items,\n value: valueProp,\n defaultValue,\n onValueChange,\n size = 'md',\n shape = 'default',\n border = false,\n fullWidth = false,\n className,\n ...aria\n}: SegmentedControlProps) {\n const [inner, setInner] = React.useState(defaultValue ?? items[0]?.value ?? '')\n const value = valueProp ?? inner\n const trackRef = React.useRef<HTMLDivElement>(null)\n // The pill slides under the selected segment (sliding-indicator.tsx).\n const pill = useSlidingIndicator(trackRef, '[data-state=\"on\"]', `${value}|${size}|${fullWidth}|${items.length}`)\n\n return (\n <ToggleGroup.Root\n ref={trackRef}\n type=\"single\"\n value={value}\n onValueChange={(next) => {\n // A segmented control never ends up with nothing selected.\n if (!next) return\n setInner(next)\n onValueChange?.(next)\n }}\n data-slot=\"segmented-control\"\n className={cn(track({ shape, border, fullWidth }), className)}\n {...aria}\n >\n <span\n ref={pill.ref}\n aria-hidden\n className={cn(\n 'pointer-events-none absolute top-1 bottom-1 left-0 z-0 bg-component-segmented-selected opacity-0 [box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n shape === 'rounded' ? 'rounded-pill' : 'rounded-sm',\n )}\n />\n {items.map((item) => (\n <ToggleGroup.Item\n key={item.value}\n value={item.value}\n disabled={item.disabled}\n className={cn(\n segment({ size, shape, fullWidth }),\n // Unselected focus: bg/muted under the ring. Selected focus keeps the pill's fill.\n 'data-[state=off]:satin-focus:bg-bg-muted',\n // Before the pill is measured (server render), the selected segment paints its own fill.\n !pill.ready && 'data-[state=on]:bg-component-segmented-selected data-[state=on]:[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n )}\n >\n {item.icon}\n {item.label}\n </ToggleGroup.Item>\n ))}\n </ToggleGroup.Root>\n )\n}\n"]}
package/chunk-WX6BP5ZP.js DELETED
@@ -1,39 +0,0 @@
1
- import { cn } from './chunk-H63FYCMY.js';
2
- import 'react';
3
- import { cva } from 'class-variance-authority';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var emptyStateVariants = cva(
7
- "flex w-[350px] max-w-[560px] min-w-[min(320px,100%)] flex-col items-center gap-4 rounded-2xl px-4 pt-4 pb-5 text-center",
8
- {
9
- variants: {
10
- border: {
11
- ghost: "",
12
- dashed: "border border-dashed border-border-default",
13
- outline: "border border-border-default"
14
- }
15
- },
16
- defaultVariants: { border: "ghost" }
17
- }
18
- );
19
- function EmptyState({ className, border, title, description, icon, actions, ...props }) {
20
- return /* @__PURE__ */ jsxs("div", { "data-slot": "empty-state", className: cn(emptyStateVariants({ border }), className), ...props, children: [
21
- icon && /* @__PURE__ */ jsx(
22
- "div",
23
- {
24
- "aria-hidden": true,
25
- className: "flex shrink-0 items-center justify-center rounded-lg bg-bg-muted p-2.5 text-text-default [&_svg]:size-4 [&_svg]:[stroke-width:1.875]",
26
- children: icon
27
- }
28
- ),
29
- /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-center gap-2", children: [
30
- /* @__PURE__ */ jsx("p", { className: "w-full text-lg font-medium text-text-default", children: title }),
31
- description && /* @__PURE__ */ jsx("p", { className: "w-full text-body-lg text-text-muted", children: description })
32
- ] }),
33
- actions && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-start justify-center gap-2", children: actions })
34
- ] });
35
- }
36
-
37
- export { EmptyState, emptyStateVariants };
38
- //# sourceMappingURL=chunk-WX6BP5ZP.js.map
39
- //# sourceMappingURL=chunk-WX6BP5ZP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/empty-state.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,kBAAA,GAAqB,GAAA;AAAA,EACzB,yHAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,4CAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,MAAA,EAAQ,OAAA;AAAQ;AAEvC;AAaO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,aAAa,IAAA,EAAM,OAAA,EAAS,GAAG,KAAA,EAAM,EAAoB;AAC9G,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,aAAA,EAAc,WAAW,EAAA,CAAG,kBAAA,CAAmB,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EACxF,QAAA,EAAA;AAAA,IAAA,IAAA,oBACC,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAU,sIAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAClE,WAAA,oBAAe,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAuC,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAClF,CAAA;AAAA,IACC,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAmD,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACxF,CAAA;AAEJ","file":"chunk-WX6BP5ZP.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\n/**\n * EmptyState, 1:1 with the uiKit `EmptyState` set (852:51897) and its `_buttonGroup`\n * (852:51922): a centred column 350 wide (320–560), padding 16 / 16 / 20, 16 apart, radius-2xl.\n *\n * - icon: a 16px glyph in text/default on a bg/muted tile, 10 padding, radius-lg (36 square).\n * - title in text/lg medium (16/24), description in Body/lg (14/21) text/muted, 8 apart, centred.\n * - actions: a row of Buttons 8 apart: Primary + Secondary, Secondary alone, or a Tertiary\n * \"Learn more\" with a trailing arrow. Pass them as `<Button>` elements.\n * - border: ghost (none), dashed or outline, both 1px border/default.\n */\nconst emptyStateVariants = cva(\n 'flex w-[350px] max-w-[560px] min-w-[min(320px,100%)] flex-col items-center gap-4 rounded-2xl px-4 pt-4 pb-5 text-center',\n {\n variants: {\n border: {\n ghost: '',\n dashed: 'border border-dashed border-border-default',\n outline: 'border border-border-default',\n },\n },\n defaultVariants: { border: 'ghost' },\n },\n)\n\nexport interface EmptyStateProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof emptyStateVariants> {\n title: React.ReactNode\n description?: React.ReactNode\n /** A 16px icon, e.g. from iconoir-react. */\n icon?: React.ReactNode\n /** One or two Buttons. */\n actions?: React.ReactNode\n}\n\nexport function EmptyState({ className, border, title, description, icon, actions, ...props }: EmptyStateProps) {\n return (\n <div data-slot=\"empty-state\" className={cn(emptyStateVariants({ border }), className)} {...props}>\n {icon && (\n <div\n aria-hidden\n className=\"flex shrink-0 items-center justify-center rounded-lg bg-bg-muted p-2.5 text-text-default [&_svg]:size-4 [&_svg]:[stroke-width:1.875]\"\n >\n {icon}\n </div>\n )}\n <div className=\"flex w-full flex-col items-center gap-2\">\n <p className=\"w-full text-lg font-medium text-text-default\">{title}</p>\n {description && <p className=\"w-full text-body-lg text-text-muted\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-wrap items-start justify-center gap-2\">{actions}</div>}\n </div>\n )\n}\n\nexport { emptyStateVariants }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/table.tsx"],"names":[],"mappings":";;;;;AA8DA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAkC;AAC9D,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAA,KAAc,UAAU,YAAY,CAAA;AAAA,MAE9E,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,gFAAA;AAAA,UACF,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,SAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAIA,IAAM,SAAA,GAAY;AAAA,EAChB,KAAA,EAAO;AAAA,IACL,iMAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV,MAAA,EAAQ;AAAA,IACN,iIAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV,IAAA,EAAM;AAAA,IACJ,kMAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV,IAAA,EAAM;AAAA,IACJ,0HAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG;AACZ,CAAA;AAGA,IAAM,QAAA,GACJ,4OAAA;AAEF,SAAS,OAAA,CAAQ,GAAY,CAAA,EAAY;AACvC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,QAAA,SAAiB,CAAA,GAAI,CAAA;AAC/D,EAAA,OAAO,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAW,EAAE,OAAA,EAAS,MAAM,CAAA;AACpF;AAEO,SAAS,KAAA,CAA2B;AAAA,EACzC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,EAAU,YAAA;AAAA,EACV,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAe,WAAW,CAAA;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,KAAA,CAAA,QAAA,CAAmB,EAAE,CAAA;AACrE,EAAA,MAAM,WAAW,YAAA,IAAgB,aAAA;AACjC,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAkB;AACrC,IAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,gBAAA,CAAiB,GAAG,CAAA;AACpD,IAAA,gBAAA,GAAmB,GAAG,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,IAAA,MAAM,OACJ,IAAA,EAAM,GAAA,KAAQ,GAAA,GAAM,EAAE,KAAK,SAAA,EAAW,KAAA,EAAM,GAAI,IAAA,CAAK,cAAc,KAAA,GAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,QAAO,GAAI,IAAA;AAC1G,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,YAAA,GAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAmB,cAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,IAAA,IAAQ,UAAA,EAAY,OAAO,IAAA;AAChC,IAAA,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,GAAG,CAAA,EAAG,EAAE,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,SAAA,KAAc,MAAA,GAAS,CAAA,CAAE,SAAQ,GAAI,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,UAAU,CAAC,CAAA;AAE3B,EAAA,MAAM,SAAS,QAAA,KAAa,QAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAChF,EAAA,MAAM,YAAA,GAAe,CAAC,WAAA,IAAe,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAG7E,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,EAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAkB,MAAA,GAAS,GAAG,CAAA,CAAE,KAAA,IAAS,GAAG,CAAA,EAAA,CAAA,GAAO,CAAA,EAAA,CAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,UAAW,GAAG,CAAA,CAAA,CAAA;AACxG,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,GAAA,CAAA,EAAM,UAAA,GAAa,EAAA,GAAK,CAAC,CAAA,GAAI,MAAA;AAGlG,EAAA,MAAM,QAAA,GAAiB,aAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAU,KAAA,CAAA,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,CAAA;AACxE,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,EAAA,EAAI;AACpB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,WAAA,GAAc,EAAA,CAAG,WAAA;AACjC,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,WAAA,GAAc,EAAA,CAAG,WAAA;AAChC,MAAA,MAAA,CAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,GAAM,IAAI,EAAA,CAAG,UAAA,GAAa,EAAA,CAAG,WAAA,GAAc,GAAG,KAAA,EAAO,EAAA,CAAG,UAAA,IAAc,GAAA,GAAM,GAAG,CAAA;AAAA,IACxG,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AACvD,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AACvC,MAAA,EAAA,CAAG,UAAA,EAAW;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAC,CAAA;AAG1B,EAAA,MAAM,cAAc,CAAC,EAAA,KAAgB,SAAS,EAAA,CAAG,cAAA,EAAgB,EAAE,CAAA,GAAI,EAAA;AACvE,EAAA,MAAM,aAAA,GAAgB,aAAa,QAAA,GAAW,QAAA;AAE9C,EAAA,MAAM,eAAe,CAAC,KAAA,EAAe,KAAA,KACnC,KAAA,KAAU,IAAI,SAAA,CAAU,IAAA,GAAO,KAAA,KAAU,CAAA,GAAI,UAAU,KAAA,GAAQ,KAAA,KAAU,QAAQ,CAAA,GAAI,SAAA,CAAU,OAAO,SAAA,CAAU,MAAA;AAClH,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,IAAU,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA;AAErD,EAAA,MAAM,KAAA,mBACJ,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAU,+DAAA;AAAA,MAEV,KAAA,EAAO,UAAA,GAAa,EAAE,KAAA,EAAO,YAAY,QAAA,EAAU,MAAA,EAAO,GAAI,EAAE,UAAU,OAAA,CAAQ,MAAA,GAAS,GAAA,IAAO,UAAA,GAAa,KAAK,CAAA,CAAA,EAAG;AAAA,MAEvH,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,UAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,UAAA,wBAAe,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,IAAG,EAAG,CAAA;AAAA,UACzC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,yBACX,KAAA,EAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,SAAS,CAAC,CAAA,EAAE,EAAA,EAAnC,CAAA,CAAE,GAAoC,CACjD;AAAA,SAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAG,WAAU,2BAAA,EACX,QAAA,EAAA;AAAA,UAAA,UAAA,oBACC,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,WAAA,CAAY,kCAAkC,CAAC,CAAA;AAAA,cAErH,QAAA,kBAAA,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,iBAAA;AAAA,kBACX,OAAA,EAAS,WAAA,GAAc,IAAA,GAAO,YAAA,GAAe,eAAA,GAAkB,KAAA;AAAA,kBAC/D,eAAA,EAAiB,CAAC,CAAA,KAAM,WAAA,CAAY,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,CAAA;AAAA,kBAC3E,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,WACF;AAAA,UAED,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,YAAA,MAAM,SAAS,IAAA,EAAM,GAAA,KAAQ,CAAA,CAAE,GAAA,GAAM,KAAK,SAAA,GAAY,MAAA;AACtD,YAAA,MAAM,UAAA,GACJ,2JAAA;AACF,YAAA,uBACE,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,KAAA,EAAM,KAAA;AAAA,gBACN,WAAA,EAAW,EAAE,QAAA,GAAY,MAAA,KAAW,QAAQ,WAAA,GAAc,MAAA,KAAW,MAAA,GAAS,YAAA,GAAe,MAAA,GAAU,MAAA;AAAA,gBACvG,SAAA,EAAW,EAAA;AAAA,kBACT,2FAAA;AAAA,kBACA,CAAA,CAAE,UAAU,OAAA,IAAW,YAAA;AAAA,kBACvB,MAAM,CAAA,IAAK,WAAA,CAAY,EAAA,CAAG,aAAA,EAAe,2BAA2B,CAAC;AAAA,iBACvE;AAAA,gBAEC,YAAE,QAAA,mBACD,IAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA;AAAA,oBAC9B,SAAA,EAAW,EAAA;AAAA,sBACT,UAAA;AAAA,sBACA,2FAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,CAAA,CAAE,MAAA,EAAO,CAAA;AAAA,sBACpC,MAAA,oBAAU,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAW,MAAA,EAAQ;AAAA;AAAA;AAAA,oCAG1C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,UAAA,EAAa,YAAE,MAAA,EAAO;AAAA,eAAA;AAAA,cAvBpC,CAAA,CAAE;AAAA,aAyBT;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH,CAAA,EACF,CAAA;AAAA,4BACC,OAAA,EAAA,EACE,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AAC1B,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC3C,UAAA,MAAM,KAAA,GAAQ,KAAA,IAAS,CAAA,GAAI,CAAA,KAAM,IAAI,0BAAA,GAA6B,YAAA;AAClE,UAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAgB,YAAA,EAAY,UAAA,GAAa,UAAA,GAAa,MAAA,EAAW,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA,EACzG,QAAA,EAAA;AAAA,YAAA,UAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,0BAA0B,YAAA,CAAa,CAAA,EAAG,SAAS,CAAA,EAAG,YAAY,EAAA,CAAG,QAAA,EAAU,KAAK,CAAC,CAAC,CAAA,EACtG,QAAA,kBAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAY,CAAA,WAAA,EAAc,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,gBAC/B,OAAA,EAAS,UAAA;AAAA,gBACT,iBAAiB,CAAC,CAAA,KAChB,YAAY,CAAA,KAAM,IAAA,GAAO,CAAC,GAAG,QAAA,EAAU,IAAI,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,CAAC,OAAO,EAAA,KAAO,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,gBAEzF,SAAA,EAAU;AAAA;AAAA,aACZ,EACF,CAAA;AAAA,YAED,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,cAAA,MAAM,OAAA,GAAU,EAAE,IAAA,GAAO,CAAA,CAAE,KAAK,GAAG,CAAA,GAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AACjD,cAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,KAAY,QAAA,IAAY,OAAO,OAAA,KAAY,QAAA;AAChE,cAAA,uBACE,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,EAAA;AAAA,oBACT,mHAAA;AAAA,oBACA,CAAA,CAAE,UAAU,OAAA,IAAW,YAAA;AAAA,oBACvB,YAAA,CAAa,CAAA,IAAK,UAAA,GAAa,CAAA,GAAI,IAAI,SAAS,CAAA;AAAA,oBAChD,MAAM,CAAA,IAAK,WAAA,CAAY,EAAA,CAAG,aAAA,EAAe,KAAK,CAAC;AAAA,mBACjD;AAAA,kBAEC,kCACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,mBAAQ,CAAA,mBAE1C,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,iDAAA,EAAmD,CAAA,CAAE,UAAU,OAAA,IAAW,aAAa,GACvG,QAAA,EAAA,OAAA,EACH;AAAA,iBAAA;AAAA,gBAbG,CAAA,CAAE;AAAA,eAeT;AAAA,YAEJ,CAAC;AAAA,WAAA,EAAA,EAnCM,IAAI,EAoCb,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAGF,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4EAAA,EAA8E,SAAS,CAAA;AAAA,MACpG,GAAG,KAAA;AAAA,MAEH,mCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,CAAA;AAAA,cACV,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAA,GAAuB,yBAAA;AAAA,cACnD,SAAA,EAAU,iGAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,EAAA;AAAA,gBACT,iGAAA;AAAA,gBACA,iEAAA;AAAA,gBACA,IAAI,KAAA,IAAS;AAAA;AACf;AAAA;AACF,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,SAAI,aAAA,EAAW,IAAA,EAAC,WAAU,kBAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yDAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAI,IAAA,GAAO,GAAG,CAAA,CAAA,CAAA,EAAK,SAAA,EAAW,cAAe,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,IAAA,GAAQ,GAAG,CAAA,EAAA,CAAA;AAAK;AAAA,WAErG,CAAA,EACF;AAAA,OAAA,EACF,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAwC,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,GAEjE;AAEJ","file":"chunk-X3PQANZO.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { Checkbox } from './checkbox'\n\n/**\n * Table, 1:1 with the uiKit `Table` set (3411:21610) and its parts: table/header (3410:17835),\n * table/row (3410:18040), table/cell (3409:17760), table/headerCell (3409:17734) and\n * table/checkboxCell (3409:17703). A real `<table>`.\n *\n * - Frame: bg/card, 1px border-subtle, radius-xl, clipped.\n * - Header row: component/table-header fill, 1px border-subtle under it. Header cells pad\n * 4 / 8 / 4 / 4 around a label button (8px sides, 3px top and bottom, radius-md, medium\n * 13/18, text-muted); hover tints the button bg-hover. Sortable headers cycle\n * none → asc → desc with a 14px arrow 10px after the label, and set aria-sort.\n * - Cells: 12 left, 10 right, 8 top and bottom, at least 40 high, regular 13/19.5, clipped\n * with an ellipsis. Chips and other nodes sit in a row 4px apart.\n * - Checkbox column: 8px left padding, no right padding; the header box selects all.\n * - zebra: every second row on component/table-zebra.\n * - Row hover lifts the row: bg-hover, 1px border-strong edge, radius-xl, shadow sm.\n * - overflow=\"fit\": columns are proportional (`width` is an fr weight). overflow=\"scroll\":\n * columns keep their pixel `width`, the first column stays in place, a 64px fade marks\n * the clipped edge and a 6px scrollbar (bg-muted track, border-strong thumb) sits below.\n *\n * The row edge is drawn with inset shadows on the cells, since table rows can't take a\n * border radius. `data-force=\"hover\"` on a `<tr>` shows the hover state.\n */\n\nexport type Sort = { key: string; direction: 'asc' | 'desc' } | null\n\nexport type Row = { id: string } & Record<string, unknown>\n\nexport interface Column<R extends Row = Row> {\n key: string\n header: React.ReactNode\n /** fr weight with overflow=\"fit\" (default 1), pixels with overflow=\"scroll\" (default 160). */\n width?: number\n sortable?: boolean\n /** Renders the cell; defaults to the row's value at `key`. */\n cell?: (row: R) => React.ReactNode\n align?: 'left' | 'right'\n}\n\nexport interface TableProps<R extends Row = Row> extends Omit<React.ComponentProps<'div'>, 'children'> {\n columns: Column<R>[]\n rows: R[]\n selectable?: boolean\n zebra?: boolean\n overflow?: 'fit' | 'scroll'\n /** Called with the new sort; rows are sorted by value unless `manualSort` is set. */\n onSortChange?: (sort: Sort) => void\n defaultSort?: Sort\n /** Leave rows in the order given (sort them yourself in onSortChange). */\n manualSort?: boolean\n selected?: string[]\n onSelectedChange?: (ids: string[]) => void\n /** Accessible name of the table. */\n label?: string\n}\n\n/** The Figma sort arrow, 14 at 1.09. Pointing down for descending. */\nfunction SortIcon({ direction }: { direction: 'asc' | 'desc' }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden\n className={cn('shrink-0 text-text-muted', direction === 'desc' && 'rotate-180')}\n >\n <path\n d=\"M7.00025 11.4515L7.00025 2.54852M11.2044 6.7527L7.00025 2.54852L2.79608 6.7527\"\n stroke=\"currentColor\"\n strokeWidth=\"1.09375\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\n// Hover styles for the cells of a hovered (or data-force=\"hover\") row. Written out in full so\n// Tailwind sees every class.\nconst cellHover = {\n first: [\n 'group-hover/row:rounded-l-xl group-hover/row:bg-bg-hover group-hover/row:[box-shadow:inset_1px_0_0_var(--border-strong),inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n 'group-data-[force=hover]/row:rounded-l-xl group-data-[force=hover]/row:bg-bg-hover group-data-[force=hover]/row:[box-shadow:inset_1px_0_0_var(--border-strong),inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n ].join(' '),\n middle: [\n 'group-hover/row:bg-bg-hover group-hover/row:[box-shadow:inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n 'group-data-[force=hover]/row:bg-bg-hover group-data-[force=hover]/row:[box-shadow:inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n ].join(' '),\n last: [\n 'group-hover/row:rounded-r-xl group-hover/row:bg-bg-hover group-hover/row:[box-shadow:inset_-1px_0_0_var(--border-strong),inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n 'group-data-[force=hover]/row:rounded-r-xl group-data-[force=hover]/row:bg-bg-hover group-data-[force=hover]/row:[box-shadow:inset_-1px_0_0_var(--border-strong),inset_0_1px_0_var(--border-strong),inset_0_-1px_0_var(--border-strong)]',\n ].join(' '),\n only: [\n 'group-hover/row:rounded-xl group-hover/row:bg-bg-hover group-hover/row:[box-shadow:inset_0_0_0_1px_var(--border-strong)]',\n 'group-data-[force=hover]/row:rounded-xl group-data-[force=hover]/row:bg-bg-hover group-data-[force=hover]/row:[box-shadow:inset_0_0_0_1px_var(--border-strong)]',\n ].join(' '),\n}\n\n// Shadow sm under a hovered row (Figma: 0 1 1 and 0 1 1.5 in effect/shadow-sm).\nconst rowHover =\n 'hover:[filter:drop-shadow(0_1px_1px_var(--effect-shadow-sm))_drop-shadow(0_1px_1.5px_var(--effect-shadow-sm))] data-[force=hover]:[filter:drop-shadow(0_1px_1px_var(--effect-shadow-sm))_drop-shadow(0_1px_1.5px_var(--effect-shadow-sm))]'\n\nfunction compare(a: unknown, b: unknown) {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true })\n}\n\nexport function Table<R extends Row = Row>({\n columns,\n rows,\n selectable = false,\n zebra = false,\n overflow = 'fit',\n onSortChange,\n defaultSort = null,\n manualSort = false,\n selected: selectedProp,\n onSelectedChange,\n label,\n className,\n ...props\n}: TableProps<R>) {\n const [sort, setSort] = React.useState<Sort>(defaultSort)\n const [selectedState, setSelectedState] = React.useState<string[]>([])\n const selected = selectedProp ?? selectedState\n const setSelected = (ids: string[]) => {\n if (selectedProp === undefined) setSelectedState(ids)\n onSelectedChange?.(ids)\n }\n\n const cycleSort = (key: string) => {\n const next: Sort =\n sort?.key !== key ? { key, direction: 'asc' } : sort.direction === 'asc' ? { key, direction: 'desc' } : null\n setSort(next)\n onSortChange?.(next)\n }\n\n const sortedRows = React.useMemo(() => {\n if (!sort || manualSort) return rows\n const s = [...rows].sort((a, b) => compare(a[sort.key], b[sort.key]))\n return sort.direction === 'desc' ? s.reverse() : s\n }, [rows, sort, manualSort])\n\n const scroll = overflow === 'scroll'\n const allSelected = rows.length > 0 && rows.every((r) => selected.includes(r.id))\n const someSelected = !allSelected && rows.some((r) => selected.includes(r.id))\n\n // Column widths: fr weights as percentages, or fixed pixels when scrolling.\n const totalFr = columns.reduce((n, c) => n + (c.width ?? 1), 0)\n const colWidth = (c: Column<R>) => (scroll ? `${c.width ?? 160}px` : `${((c.width ?? 1) / totalFr) * 100}%`)\n const tableWidth = scroll ? columns.reduce((n, c) => n + (c.width ?? 160), selectable ? 24 : 0) : undefined\n\n // The custom scrollbar and the edge fade follow the viewport's scroll position.\n const viewport = React.useRef<HTMLDivElement>(null)\n const [bar, setBar] = React.useState({ size: 1, offset: 0, atEnd: true })\n React.useEffect(() => {\n const el = viewport.current\n if (!scroll || !el) return\n const update = () => {\n const size = el.clientWidth / el.scrollWidth\n const max = el.scrollWidth - el.clientWidth\n setBar({ size, offset: max > 0 ? el.scrollLeft / el.scrollWidth : 0, atEnd: el.scrollLeft >= max - 1 })\n }\n update()\n el.addEventListener('scroll', update, { passive: true })\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => {\n el.removeEventListener('scroll', update)\n ro.disconnect()\n }\n }, [scroll, columns, rows])\n\n // The leading column(s) stay put while the rest scroll.\n const stickyFirst = (bg: string) => (scroll ? cn('sticky z-[1]', bg) : '')\n const firstDataLeft = selectable ? 'left-6' : 'left-0'\n\n const cellPosition = (index: number, count: number) =>\n count === 1 ? cellHover.only : index === 0 ? cellHover.first : index === count - 1 ? cellHover.last : cellHover.middle\n const cellCount = columns.length + (selectable ? 1 : 0)\n\n const table = (\n <table\n aria-label={label}\n className=\"w-full table-fixed border-separate border-spacing-0 text-left\"\n // With overflow=\"fit\" the columns keep at least 120px each, so a phone scrolls instead of crushing them.\n style={tableWidth ? { width: tableWidth, minWidth: '100%' } : { minWidth: columns.length * 120 + (selectable ? 24 : 0) }}\n >\n <colgroup>\n {selectable && <col style={{ width: 24 }} />}\n {columns.map((c) => (\n <col key={c.key} style={{ width: colWidth(c) }} />\n ))}\n </colgroup>\n <thead>\n <tr className=\"bg-component-table-header\">\n {selectable && (\n <th\n scope=\"col\"\n className={cn('border-b border-border-subtle py-2 pl-2 align-middle', stickyFirst('left-0 bg-component-table-header'))}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n onCheckedChange={(v) => setSelected(v === true ? rows.map((r) => r.id) : [])}\n className=\"align-middle\"\n />\n </th>\n )}\n {columns.map((c, i) => {\n const active = sort?.key === c.key ? sort.direction : undefined\n const labelClass =\n 'inline-flex max-w-full items-center gap-2.5 overflow-hidden rounded-md px-2 py-[3px] text-sm leading-[18px] font-medium whitespace-nowrap text-text-muted'\n return (\n <th\n key={c.key}\n scope=\"col\"\n aria-sort={c.sortable ? (active === 'asc' ? 'ascending' : active === 'desc' ? 'descending' : 'none') : undefined}\n className={cn(\n 'h-8 overflow-hidden border-b border-border-subtle py-1 pr-2 pl-1 align-middle font-medium',\n c.align === 'right' && 'text-right',\n i === 0 && stickyFirst(cn(firstDataLeft, 'bg-component-table-header')),\n )}\n >\n {c.sortable ? (\n <button\n type=\"button\"\n onClick={() => cycleSort(c.key)}\n className={cn(\n labelClass,\n 'transition-colors duration-(--duration-fast) ease-(--ease-out) focus-visible:outline-none',\n 'satin-hover:bg-bg-hover satin-focus:bg-bg-hover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n )}\n >\n <span className=\"truncate\">{c.header}</span>\n {active && <SortIcon direction={active} />}\n </button>\n ) : (\n <span className={labelClass}>{c.header}</span>\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {sortedRows.map((row, r) => {\n const isSelected = selected.includes(row.id)\n const rowBg = zebra && r % 2 === 1 ? 'bg-component-table-zebra' : 'bg-bg-card'\n return (\n <tr key={row.id} data-state={isSelected ? 'selected' : undefined} className={cn('group/row', rowBg, rowHover)}>\n {selectable && (\n <td className={cn('py-2 pl-2 align-middle', cellPosition(0, cellCount), stickyFirst(cn('left-0', rowBg)))}>\n <Checkbox\n aria-label={`Select row ${r + 1}`}\n checked={isSelected}\n onCheckedChange={(v) =>\n setSelected(v === true ? [...selected, row.id] : selected.filter((id) => id !== row.id))\n }\n className=\"align-middle\"\n />\n </td>\n )}\n {columns.map((c, i) => {\n const content = c.cell ? c.cell(row) : (row[c.key] as React.ReactNode)\n const plain = typeof content === 'string' || typeof content === 'number'\n return (\n <td\n key={c.key}\n className={cn(\n 'h-10 overflow-hidden py-2 pr-2.5 pl-3 align-middle text-body leading-(--text-body--line-height) text-text-default',\n c.align === 'right' && 'text-right',\n cellPosition(i + (selectable ? 1 : 0), cellCount),\n i === 0 && stickyFirst(cn(firstDataLeft, rowBg)),\n )}\n >\n {plain ? (\n <span className=\"block truncate\">{content}</span>\n ) : (\n <div className={cn('flex min-w-0 items-center gap-1 overflow-hidden', c.align === 'right' && 'justify-end')}>\n {content}\n </div>\n )}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n\n return (\n <div\n data-slot=\"table\"\n className={cn('relative overflow-hidden rounded-xl border border-border-subtle bg-bg-card', className)}\n {...props}\n >\n {scroll ? (\n <>\n <div className=\"relative\">\n <div\n ref={viewport}\n tabIndex={0}\n role=\"region\"\n aria-label={label ? `${label}, scrolls sideways` : 'Table, scrolls sideways'}\n className=\"overflow-x-auto [scrollbar-width:none] focus-visible:outline-none [&::-webkit-scrollbar]:hidden\"\n >\n {table}\n </div>\n <div\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-y-0 right-0 w-16 bg-linear-to-r from-bg-card-fade to-bg-card',\n 'transition-opacity duration-(--duration-fast) ease-(--ease-out)',\n bar.atEnd && 'opacity-0',\n )}\n />\n </div>\n <div aria-hidden className=\"px-3 pt-1.5 pb-1\">\n <div className=\"relative h-1.5 overflow-hidden rounded-full bg-bg-muted\">\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-border-strong\"\n style={{ width: `${bar.size * 100}%`, transform: `translateX(${(bar.offset / bar.size) * 100}%)` }}\n />\n </div>\n </div>\n </>\n ) : (\n <div className=\"overflow-x-auto overscroll-x-contain\">{table}</div>\n )}\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/card.tsx"],"names":[],"mappings":";;;;;;;AAoBA,IAAM,YAAA,GAAe,GAAA;AAAA,EACnB,+GAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,qCAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAAK;AAElC;AAYO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,GAAa,OAAA;AAAA,EACb,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,UAAgB,KAAA,CAAA,KAAA,EAAM;AAC5B,EAAA,MAAM,SAAA,GAAY,KAAA,IAAS,IAAA,IAAQ,WAAA,IAAe,IAAA;AAClD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,KAAA,IAAS,IAAA,GAAO,OAAA,GAAU,MAAA;AAAA,MAChC,iBAAA,EAAiB,KAAA,IAAS,IAAA,GAAO,OAAA,GAAU,MAAA;AAAA,MAC3C,WAAW,EAAA,CAAG,YAAA,CAAa,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAC9C,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,SAAA,oBACC,IAAA,CAAC,SAAI,WAAA,EAAU,aAAA,EAAc,WAAW,EAAA,CAAG,uDAAA,EAAyD,OAAA,IAAW,OAAO,CAAA,EACnH,QAAA,EAAA;AAAA,UAAA,KAAA,IAAS,wBACR,GAAA,CAAC,KAAA,EAAA,EAAI,IAAI,OAAA,EAAS,SAAA,EAAU,0EACzB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UAED,eAAe,IAAA,oBAAQ,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAA6B,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EAChF,CAAA;AAAA,QAED,QAAA,IAAY,wBACX,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,WAAA,EAAY,SAAA,EAAU,sCAClC,QAAA,EACH,CAAA;AAAA,QAED,MAAA,IAAU,wBACT,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,aAAA,EAAc,SAAA,EAAU,0CACpC,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,QAED,OAAA,oBACC,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,UAAA;AAAA,YACR,QAAA,EAAQ,IAAA;AAAA,YACR,YAAA,EAAY,UAAA;AAAA,YACZ,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,gCAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,aAAA,EAAW,IAAA,EAAC;AAAA;AAAA;AACrB;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-XILQ7GXE.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Xmark } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\n/**\n * Card, 1:1 with the uiKit `Card` set (1122:20156): bg/card, 1px border/default, radius-2xl (16),\n * no shadow, 405 wide by default. Three stacked sections with no gap between them:\n *\n * - header: title in Label/lg (14/14 medium), description in text/sm muted, 2px apart.\n * Padding 16 / 16 / 0 on md, 12 / 12 / 0 on sm (no bottom padding: the body's top padding\n * is the space under it).\n * - body (children): 16 padding on md, 12 on sm, children 8 apart.\n * - footer: same padding as the body; its items sit in a row, 8 apart.\n *\n * `onClose` adds a tertiary 28px icon button 7px from the top-right corner.\n */\nconst cardVariants = cva(\n 'relative flex w-[405px] max-w-full flex-col overflow-clip rounded-2xl border border-border-default bg-bg-card',\n {\n variants: {\n size: {\n md: '[--card-pad:calc(var(--spacing)*4)]',\n sm: '[--card-pad:calc(var(--spacing)*3)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\nexport interface CardProps extends Omit<React.ComponentProps<'div'>, 'title'>, VariantProps<typeof cardVariants> {\n title?: React.ReactNode\n description?: React.ReactNode\n footer?: React.ReactNode\n /** Shows the close button. */\n onClose?: () => void\n /** Accessible name of the close button. */\n closeLabel?: string\n}\n\nexport function Card({\n className,\n size,\n title,\n description,\n footer,\n onClose,\n closeLabel = 'Close',\n children,\n ...props\n}: CardProps) {\n const titleId = React.useId()\n const hasHeader = title != null || description != null\n return (\n <div\n data-slot=\"card\"\n role={title != null ? 'group' : undefined}\n aria-labelledby={title != null ? titleId : undefined}\n className={cn(cardVariants({ size }), className)}\n {...props}\n >\n {hasHeader && (\n <div data-slot=\"card-header\" className={cn('flex flex-col gap-0.5 px-(--card-pad) pt-(--card-pad)', onClose && 'pr-10')}>\n {title != null && (\n <div id={titleId} className=\"text-base leading-[14px] font-medium tracking-normal text-text-default\">\n {title}\n </div>\n )}\n {description != null && <p className=\"text-body text-text-muted\">{description}</p>}\n </div>\n )}\n {children != null && (\n <div data-slot=\"card-body\" className=\"flex flex-col gap-2 p-(--card-pad)\">\n {children}\n </div>\n )}\n {footer != null && (\n <div data-slot=\"card-footer\" className=\"flex items-center gap-2 p-(--card-pad)\">\n {footer}\n </div>\n )}\n {onClose && (\n <Button\n variant=\"tertiary\"\n iconOnly\n aria-label={closeLabel}\n onClick={onClose}\n className=\"absolute top-[7px] right-[7px]\"\n >\n <Xmark aria-hidden />\n </Button>\n )}\n </div>\n )\n}\n\nexport { cardVariants }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/input-otp.tsx"],"names":[],"mappings":"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","file":"chunk-XL75JRUA.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { CheckCircle } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { FieldChrome, useFieldChrome } from './select'\n\n/**\n * InputOTP, 1:1 with the uiKit design (🆕 input otp & number): a one-time code as 36×36 cells,\n * 8px apart, in groups (3 + 3 by default) split by an 8px border/strong dash. Each cell wears the\n * field skin (bg/field, border/default, radius-lg, shadow xs); the cell the next digit goes into\n * gets the focus border and ring and a blinking caret while the field has focus. A digit is\n * text/base medium. With an error every cell turns action/destructive and the message replaces the\n * hint under the cells; label, hint and error sit like Input's. With `success` (the code checked\n * out) every cell's border turns status/green/fg and the message, in the same colour, leads with a\n * 16px check.\n *\n * The message never moves the cells: it is as wide as the cells (it wraps rather than widening\n * the field, which would shift a centred field sideways) and keeps a 20px line even while empty,\n * so swapping hint → \"Checking…\" → success or error leaves the code where it is.\n *\n * The field is as wide as its cells, so it centres wherever it is placed. Focus shows only on\n * the active cell: the real input carries no ring of its own.\n *\n * One real <input> lies over the cells (transparent text and caret), so typing, deleting, paste\n * and the browser's SMS autofill (`autocomplete=\"one-time-code\"`) all work as in any field, and\n * screen readers hear one text box. Only digits by default (`pattern`); `onComplete` fires when\n * every cell is filled.\n */\nexport interface InputOTPProps {\n /** How many characters. */\n length?: number\n /** Cells per group; groups are split by a dash. 0 for one group. */\n groupSize?: number\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n /** Every cell is filled. */\n onComplete?: (value: string) => void\n /** Which characters are allowed. Digits by default. */\n pattern?: RegExp\n label?: React.ReactNode\n hint?: React.ReactNode\n /** An error message (replaces the hint), or `true` to mark the cells invalid without one. */\n error?: React.ReactNode | boolean\n /** The code checked out: a message under the cells (replaces the hint), or `true` for green cells alone. Ignored while there is an error. */\n success?: React.ReactNode | boolean\n disabled?: boolean\n autoFocus?: boolean\n id?: string\n name?: string\n 'aria-label'?: string\n className?: string\n}\n\nexport function InputOTP({\n length = 6,\n groupSize = 3,\n value: valueProp,\n defaultValue = '',\n onValueChange,\n onComplete,\n pattern = /^\\d$/,\n label,\n hint,\n error,\n success,\n disabled,\n autoFocus,\n id,\n name,\n className,\n ...props\n}: InputOTPProps) {\n // The message under the cells is drawn here, so the chrome only gets whether there is an error.\n const chrome = useFieldChrome({ id, disabled, error: error ? true : undefined })\n const isError = typeof error === 'string' || React.isValidElement(error)\n const isSuccess = !chrome.invalid && Boolean(success)\n const successMessage = isSuccess && success !== true ? (success as React.ReactNode) : null\n const message = isError ? (error as React.ReactNode) : successMessage ?? (chrome.invalid ? null : hint)\n const messageId = message ? `${chrome.controlId}-message` : undefined\n const describedBy = [chrome.describedBy, messageId].filter(Boolean).join(' ') || undefined\n const [inner, setInner] = React.useState(defaultValue)\n const value = (valueProp ?? inner).slice(0, length)\n const [focused, setFocused] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const set = (raw: string) => {\n const next = [...raw].filter((c) => pattern.test(c)).join('').slice(0, length)\n if (valueProp == null) setInner(next)\n onValueChange?.(next)\n if (next.length === length && next !== value) onComplete?.(next)\n }\n\n const active = Math.min(value.length, length - 1)\n const cells = Array.from({ length }, (_, i) => i)\n\n return (\n <FieldChrome label={label} chrome={chrome} className={cn('w-fit', className)}>\n <div\n data-slot=\"input-otp\"\n data-disabled={chrome.disabled || undefined}\n className={cn('relative flex w-fit items-center gap-2', chrome.disabled && 'opacity-50')}\n >\n {cells.map((i) => {\n const isActive = focused && i === active\n return (\n <React.Fragment key={i}>\n {groupSize > 0 && i > 0 && i % groupSize === 0 && (\n <span aria-hidden className=\"h-px w-2 shrink-0 bg-border-strong\" />\n )}\n <span\n aria-hidden\n data-active={isActive || undefined}\n className={cn(\n 'relative grid size-9 shrink-0 place-items-center rounded-lg border bg-bg-field text-base leading-[21px] font-medium text-text-default',\n '[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n 'transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n chrome.invalid ? 'border-action-destructive-bg' : isSuccess ? 'border-status-green-fg' : 'border-border-default',\n isActive &&\n (chrome.invalid\n ? '[box-shadow:0_0_0_2px_var(--action-destructive-glow)]'\n : isSuccess\n ? '[box-shadow:0_0_0_2px_var(--status-green-border)]'\n : 'border-border-focus [box-shadow:0_0_0_2px_var(--action-focus-ring)]'),\n )}\n >\n {value[i] ?? ''}\n {isActive && value.length < length && (\n <span className=\"absolute h-[18px] w-px animate-[satin-caret_1s_steps(1)_infinite] bg-text-default\" />\n )}\n </span>\n </React.Fragment>\n )\n })}\n <input\n ref={inputRef}\n id={chrome.controlId}\n name={name}\n value={value}\n onChange={(e) => set(e.target.value)}\n onFocus={(e) => {\n setFocused(true)\n // Always type at the end: the cells show where.\n const end = e.currentTarget.value.length\n requestAnimationFrame(() => inputRef.current?.setSelectionRange(end, end))\n }}\n onBlur={() => setFocused(false)}\n onSelect={(e) => {\n const end = e.currentTarget.value.length\n if (e.currentTarget.selectionStart !== end) e.currentTarget.setSelectionRange(end, end)\n }}\n maxLength={length}\n inputMode={pattern.test('5') && !pattern.test('a') ? 'numeric' : 'text'}\n autoComplete=\"one-time-code\"\n autoFocus={autoFocus}\n disabled={chrome.disabled}\n aria-invalid={chrome.invalid || undefined}\n aria-describedby={describedBy}\n aria-label={props['aria-label']}\n spellCheck={false}\n className=\"absolute inset-0 w-full cursor-text bg-transparent text-transparent caret-transparent outline-none selection:bg-transparent focus-visible:outline-none focus-visible:ring-0 focus-visible:[box-shadow:none] disabled:cursor-not-allowed\"\n />\n </div>\n {/* 0 wide and min-w-full: as wide as the cells, never wider; min-h-5 holds the line while empty. */}\n <p\n id={messageId}\n aria-live=\"polite\"\n className={cn(\n 'flex min-h-5 w-0 min-w-full items-start gap-1.5 text-sm leading-5',\n isError ? 'text-action-destructive-bg' : successMessage ? 'text-status-green-fg' : 'text-text-muted',\n )}\n >\n {successMessage && <CheckCircle aria-hidden className=\"mt-0.5 size-4 shrink-0 [stroke-width:1.875]\" />}\n {message}\n </p>\n </FieldChrome>\n )\n}\n"]}