@uisatin/ui 0.0.0-stage → 0.1.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 (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -2
  3. package/chunk-2HKBZFIK.js +339 -0
  4. package/chunk-2HKBZFIK.js.map +1 -0
  5. package/chunk-2YEWSJD7.js +95 -0
  6. package/chunk-2YEWSJD7.js.map +1 -0
  7. package/chunk-3DINAQLL.js +153 -0
  8. package/chunk-3DINAQLL.js.map +1 -0
  9. package/chunk-3ERGAHKA.js +179 -0
  10. package/chunk-3ERGAHKA.js.map +1 -0
  11. package/chunk-6C7CGJX2.js +86 -0
  12. package/chunk-6C7CGJX2.js.map +1 -0
  13. package/chunk-6YXUBP27.js +474 -0
  14. package/chunk-6YXUBP27.js.map +1 -0
  15. package/chunk-72OCFAPT.js +175 -0
  16. package/chunk-72OCFAPT.js.map +1 -0
  17. package/chunk-7TXHCRAG.js +51 -0
  18. package/chunk-7TXHCRAG.js.map +1 -0
  19. package/chunk-A5XEM3GF.js +260 -0
  20. package/chunk-A5XEM3GF.js.map +1 -0
  21. package/chunk-AN2RNJLR.js +79 -0
  22. package/chunk-AN2RNJLR.js.map +1 -0
  23. package/chunk-B2K45IUR.js +36 -0
  24. package/chunk-B2K45IUR.js.map +1 -0
  25. package/chunk-B6V4VSGH.js +82 -0
  26. package/chunk-B6V4VSGH.js.map +1 -0
  27. package/chunk-BKZBWPUH.js +59 -0
  28. package/chunk-BKZBWPUH.js.map +1 -0
  29. package/chunk-BNTPPZCK.js +220 -0
  30. package/chunk-BNTPPZCK.js.map +1 -0
  31. package/chunk-BNZVTLHV.js +98 -0
  32. package/chunk-BNZVTLHV.js.map +1 -0
  33. package/chunk-CL2II6BX.js +89 -0
  34. package/chunk-CL2II6BX.js.map +1 -0
  35. package/chunk-DETGJAIC.js +147 -0
  36. package/chunk-DETGJAIC.js.map +1 -0
  37. package/chunk-DO3TBNSC.js +130 -0
  38. package/chunk-DO3TBNSC.js.map +1 -0
  39. package/chunk-ESC5JCVQ.js +90 -0
  40. package/chunk-ESC5JCVQ.js.map +1 -0
  41. package/chunk-FDKIX4DC.js +55 -0
  42. package/chunk-FDKIX4DC.js.map +1 -0
  43. package/chunk-GICKPMJU.js +239 -0
  44. package/chunk-GICKPMJU.js.map +1 -0
  45. package/chunk-GQA24FYG.js +57 -0
  46. package/chunk-GQA24FYG.js.map +1 -0
  47. package/chunk-H4NU7NPO.js +264 -0
  48. package/chunk-H4NU7NPO.js.map +1 -0
  49. package/chunk-H63FYCMY.js +11 -0
  50. package/chunk-H63FYCMY.js.map +1 -0
  51. package/chunk-HL42K2NH.js +76 -0
  52. package/chunk-HL42K2NH.js.map +1 -0
  53. package/chunk-HNQUX43Z.js +109 -0
  54. package/chunk-HNQUX43Z.js.map +1 -0
  55. package/chunk-HRKPV66B.js +32 -0
  56. package/chunk-HRKPV66B.js.map +1 -0
  57. package/chunk-J3NSDRVH.js +83 -0
  58. package/chunk-J3NSDRVH.js.map +1 -0
  59. package/chunk-JPNWHWAQ.js +151 -0
  60. package/chunk-JPNWHWAQ.js.map +1 -0
  61. package/chunk-KNUWZNFV.js +240 -0
  62. package/chunk-KNUWZNFV.js.map +1 -0
  63. package/chunk-L6NCCSIP.js +213 -0
  64. package/chunk-L6NCCSIP.js.map +1 -0
  65. package/chunk-LLHTVIM3.js +50 -0
  66. package/chunk-LLHTVIM3.js.map +1 -0
  67. package/chunk-LW3TRU5W.js +131 -0
  68. package/chunk-LW3TRU5W.js.map +1 -0
  69. package/chunk-LZMKSFCF.js +79 -0
  70. package/chunk-LZMKSFCF.js.map +1 -0
  71. package/chunk-MR3JDI7E.js +122 -0
  72. package/chunk-MR3JDI7E.js.map +1 -0
  73. package/chunk-NN6PKJWS.js +44 -0
  74. package/chunk-NN6PKJWS.js.map +1 -0
  75. package/chunk-NSRTTYQ4.js +252 -0
  76. package/chunk-NSRTTYQ4.js.map +1 -0
  77. package/chunk-O7F3CIDV.js +45 -0
  78. package/chunk-O7F3CIDV.js.map +1 -0
  79. package/chunk-P4O6TGDR.js +166 -0
  80. package/chunk-P4O6TGDR.js.map +1 -0
  81. package/chunk-PF3YBUKT.js +81 -0
  82. package/chunk-PF3YBUKT.js.map +1 -0
  83. package/chunk-PVOLDO4G.js +47 -0
  84. package/chunk-PVOLDO4G.js.map +1 -0
  85. package/chunk-QS4N4MNP.js +215 -0
  86. package/chunk-QS4N4MNP.js.map +1 -0
  87. package/chunk-QUF2IPOZ.js +98 -0
  88. package/chunk-QUF2IPOZ.js.map +1 -0
  89. package/chunk-RTJ76X5U.js +126 -0
  90. package/chunk-RTJ76X5U.js.map +1 -0
  91. package/chunk-SH6NG6VN.js +40 -0
  92. package/chunk-SH6NG6VN.js.map +1 -0
  93. package/chunk-SHDFUXYV.js +195 -0
  94. package/chunk-SHDFUXYV.js.map +1 -0
  95. package/chunk-TKO44NDI.js +84 -0
  96. package/chunk-TKO44NDI.js.map +1 -0
  97. package/chunk-TOMSU4S4.js +149 -0
  98. package/chunk-TOMSU4S4.js.map +1 -0
  99. package/chunk-TVLGZGYN.js +59 -0
  100. package/chunk-TVLGZGYN.js.map +1 -0
  101. package/chunk-TX3H3QMA.js +520 -0
  102. package/chunk-TX3H3QMA.js.map +1 -0
  103. package/chunk-UBNHSZSE.js +88 -0
  104. package/chunk-UBNHSZSE.js.map +1 -0
  105. package/chunk-UC3ZJWOD.js +73 -0
  106. package/chunk-UC3ZJWOD.js.map +1 -0
  107. package/chunk-UGRSWP6U.js +69 -0
  108. package/chunk-UGRSWP6U.js.map +1 -0
  109. package/chunk-VAGIAREV.js +214 -0
  110. package/chunk-VAGIAREV.js.map +1 -0
  111. package/chunk-WTMZT3IT.js +105 -0
  112. package/chunk-WTMZT3IT.js.map +1 -0
  113. package/chunk-WX6BP5ZP.js +39 -0
  114. package/chunk-WX6BP5ZP.js.map +1 -0
  115. package/chunk-X3PQANZO.js +255 -0
  116. package/chunk-X3PQANZO.js.map +1 -0
  117. package/chunk-XILQ7GXE.js +66 -0
  118. package/chunk-XILQ7GXE.js.map +1 -0
  119. package/chunk-XL75JRUA.js +130 -0
  120. package/chunk-XL75JRUA.js.map +1 -0
  121. package/chunk-XZNHT6MO.js +348 -0
  122. package/chunk-XZNHT6MO.js.map +1 -0
  123. package/chunk-Y5AYU7PK.js +44 -0
  124. package/chunk-Y5AYU7PK.js.map +1 -0
  125. package/chunk-YG7JOOLJ.js +28 -0
  126. package/chunk-YG7JOOLJ.js.map +1 -0
  127. package/chunk-YPJYW624.js +195 -0
  128. package/chunk-YPJYW624.js.map +1 -0
  129. package/chunk-YPNKBE5X.js +104 -0
  130. package/chunk-YPNKBE5X.js.map +1 -0
  131. package/components/accordion.d.ts +27 -0
  132. package/components/accordion.js +4 -0
  133. package/components/accordion.js.map +1 -0
  134. package/components/agent-loading.d.ts +65 -0
  135. package/components/agent-loading.js +4 -0
  136. package/components/agent-loading.js.map +1 -0
  137. package/components/agent-picker.d.ts +82 -0
  138. package/components/agent-picker.js +5 -0
  139. package/components/agent-picker.js.map +1 -0
  140. package/components/agent-suggestion.d.ts +69 -0
  141. package/components/agent-suggestion.js +6 -0
  142. package/components/agent-suggestion.js.map +1 -0
  143. package/components/announcement-bar.d.ts +39 -0
  144. package/components/announcement-bar.js +6 -0
  145. package/components/announcement-bar.js.map +1 -0
  146. package/components/attachment.d.ts +73 -0
  147. package/components/attachment.js +5 -0
  148. package/components/attachment.js.map +1 -0
  149. package/components/avatar.d.ts +34 -0
  150. package/components/avatar.js +6 -0
  151. package/components/avatar.js.map +1 -0
  152. package/components/badge.d.ts +19 -0
  153. package/components/badge.js +4 -0
  154. package/components/badge.js.map +1 -0
  155. package/components/banner.d.ts +54 -0
  156. package/components/banner.js +5 -0
  157. package/components/banner.js.map +1 -0
  158. package/components/bar-chart.d.ts +32 -0
  159. package/components/bar-chart.js +11 -0
  160. package/components/bar-chart.js.map +1 -0
  161. package/components/breadcrumb.d.ts +32 -0
  162. package/components/breadcrumb.js +6 -0
  163. package/components/breadcrumb.js.map +1 -0
  164. package/components/button.d.ts +32 -0
  165. package/components/button.js +4 -0
  166. package/components/button.js.map +1 -0
  167. package/components/card.d.ts +28 -0
  168. package/components/card.js +5 -0
  169. package/components/card.js.map +1 -0
  170. package/components/channel-chart.d.ts +14 -0
  171. package/components/channel-chart.js +11 -0
  172. package/components/channel-chart.js.map +1 -0
  173. package/components/chart.d.ts +88 -0
  174. package/components/chart.js +10 -0
  175. package/components/chart.js.map +1 -0
  176. package/components/checkbox.d.ts +17 -0
  177. package/components/checkbox.js +4 -0
  178. package/components/checkbox.js.map +1 -0
  179. package/components/chip.d.ts +54 -0
  180. package/components/chip.js +4 -0
  181. package/components/chip.js.map +1 -0
  182. package/components/citations.d.ts +37 -0
  183. package/components/citations.js +5 -0
  184. package/components/citations.js.map +1 -0
  185. package/components/code-block.d.ts +13 -0
  186. package/components/code-block.js +5 -0
  187. package/components/code-block.js.map +1 -0
  188. package/components/combobox.d.ts +58 -0
  189. package/components/combobox.js +10 -0
  190. package/components/combobox.js.map +1 -0
  191. package/components/command-menu.d.ts +54 -0
  192. package/components/command-menu.js +6 -0
  193. package/components/command-menu.js.map +1 -0
  194. package/components/context-menu.d.ts +46 -0
  195. package/components/context-menu.js +6 -0
  196. package/components/context-menu.js.map +1 -0
  197. package/components/cookie-consent.d.ts +26 -0
  198. package/components/cookie-consent.js +5 -0
  199. package/components/cookie-consent.js.map +1 -0
  200. package/components/date-picker.d.ts +112 -0
  201. package/components/date-picker.js +9 -0
  202. package/components/date-picker.js.map +1 -0
  203. package/components/decision-card.d.ts +65 -0
  204. package/components/decision-card.js +7 -0
  205. package/components/decision-card.js.map +1 -0
  206. package/components/dialog.d.ts +68 -0
  207. package/components/dialog.js +5 -0
  208. package/components/dialog.js.map +1 -0
  209. package/components/donut-chart.d.ts +20 -0
  210. package/components/donut-chart.js +11 -0
  211. package/components/donut-chart.js.map +1 -0
  212. package/components/dot.d.ts +21 -0
  213. package/components/dot.js +4 -0
  214. package/components/dot.js.map +1 -0
  215. package/components/dropdown.d.ts +74 -0
  216. package/components/dropdown.js +5 -0
  217. package/components/dropdown.js.map +1 -0
  218. package/components/empty-state.d.ts +25 -0
  219. package/components/empty-state.js +4 -0
  220. package/components/empty-state.js.map +1 -0
  221. package/components/file-upload.d.ts +78 -0
  222. package/components/file-upload.js +7 -0
  223. package/components/file-upload.js.map +1 -0
  224. package/components/floating.d.ts +30 -0
  225. package/components/floating.js +3 -0
  226. package/components/floating.js.map +1 -0
  227. package/components/form-field.d.ts +35 -0
  228. package/components/form-field.js +4 -0
  229. package/components/form-field.js.map +1 -0
  230. package/components/hover-card.d.ts +30 -0
  231. package/components/hover-card.js +4 -0
  232. package/components/hover-card.js.map +1 -0
  233. package/components/input-otp.d.ts +49 -0
  234. package/components/input-otp.js +8 -0
  235. package/components/input-otp.js.map +1 -0
  236. package/components/input.d.ts +28 -0
  237. package/components/input.js +5 -0
  238. package/components/input.js.map +1 -0
  239. package/components/kbd.d.ts +37 -0
  240. package/components/kbd.js +4 -0
  241. package/components/kbd.js.map +1 -0
  242. package/components/line-chart.d.ts +29 -0
  243. package/components/line-chart.js +12 -0
  244. package/components/line-chart.js.map +1 -0
  245. package/components/message-actions.d.ts +24 -0
  246. package/components/message-actions.js +5 -0
  247. package/components/message-actions.js.map +1 -0
  248. package/components/message.d.ts +40 -0
  249. package/components/message.js +8 -0
  250. package/components/message.js.map +1 -0
  251. package/components/number-input.d.ts +33 -0
  252. package/components/number-input.js +8 -0
  253. package/components/number-input.js.map +1 -0
  254. package/components/pagination.d.ts +45 -0
  255. package/components/pagination.js +6 -0
  256. package/components/pagination.js.map +1 -0
  257. package/components/popover.d.ts +44 -0
  258. package/components/popover.js +4 -0
  259. package/components/popover.js.map +1 -0
  260. package/components/progress.d.ts +24 -0
  261. package/components/progress.js +4 -0
  262. package/components/progress.js.map +1 -0
  263. package/components/prompt-bar.d.ts +63 -0
  264. package/components/prompt-bar.js +6 -0
  265. package/components/prompt-bar.js.map +1 -0
  266. package/components/radio.d.ts +27 -0
  267. package/components/radio.js +4 -0
  268. package/components/radio.js.map +1 -0
  269. package/components/search-bar.d.ts +20 -0
  270. package/components/search-bar.js +5 -0
  271. package/components/search-bar.js.map +1 -0
  272. package/components/segmented-control.d.ts +32 -0
  273. package/components/segmented-control.js +5 -0
  274. package/components/segmented-control.js.map +1 -0
  275. package/components/select.d.ts +97 -0
  276. package/components/select.js +7 -0
  277. package/components/select.js.map +1 -0
  278. package/components/sheet.d.ts +37 -0
  279. package/components/sheet.js +6 -0
  280. package/components/sheet.js.map +1 -0
  281. package/components/sidebar.d.ts +52 -0
  282. package/components/sidebar.js +4 -0
  283. package/components/sidebar.js.map +1 -0
  284. package/components/skeleton.d.ts +18 -0
  285. package/components/skeleton.js +4 -0
  286. package/components/skeleton.js.map +1 -0
  287. package/components/slider.d.ts +57 -0
  288. package/components/slider.js +8 -0
  289. package/components/slider.js.map +1 -0
  290. package/components/sliding-indicator.d.ts +23 -0
  291. package/components/sliding-indicator.js +3 -0
  292. package/components/sliding-indicator.js.map +1 -0
  293. package/components/streaming-text.d.ts +33 -0
  294. package/components/streaming-text.js +4 -0
  295. package/components/streaming-text.js.map +1 -0
  296. package/components/switch.d.ts +15 -0
  297. package/components/switch.js +4 -0
  298. package/components/switch.js.map +1 -0
  299. package/components/table.d.ts +57 -0
  300. package/components/table.js +5 -0
  301. package/components/table.js.map +1 -0
  302. package/components/tabs.d.ts +45 -0
  303. package/components/tabs.js +5 -0
  304. package/components/tabs.js.map +1 -0
  305. package/components/textarea.d.ts +30 -0
  306. package/components/textarea.js +5 -0
  307. package/components/textarea.js.map +1 -0
  308. package/components/thinking.d.ts +64 -0
  309. package/components/thinking.js +5 -0
  310. package/components/thinking.js.map +1 -0
  311. package/components/toast.d.ts +71 -0
  312. package/components/toast.js +5 -0
  313. package/components/toast.js.map +1 -0
  314. package/components/toggle.d.ts +30 -0
  315. package/components/toggle.js +4 -0
  316. package/components/toggle.js.map +1 -0
  317. package/components/tooltip.d.ts +35 -0
  318. package/components/tooltip.js +5 -0
  319. package/components/tooltip.js.map +1 -0
  320. package/index.d.ts +64 -0
  321. package/index.js +230 -0
  322. package/index.js.map +1 -0
  323. package/lib/utils.d.ts +3 -0
  324. package/lib/utils.js +3 -0
  325. package/lib/utils.js.map +1 -0
  326. package/package.json +54 -4
  327. package/styles.css +2 -0
  328. package/theme/create-theme.d.ts +44 -0
  329. package/theme/index.d.ts +1 -0
@@ -0,0 +1,264 @@
1
+ import { Button } from './chunk-HNQUX43Z.js';
2
+ import { cn } from './chunk-H63FYCMY.js';
3
+ import 'react';
4
+ import { HoverCard } from 'radix-ui';
5
+ import { Xmark, ArrowUpRight, NavArrowUp, NavArrowDown } from 'iconoir-react';
6
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
+
8
+ function Attachment({
9
+ className,
10
+ name,
11
+ meta,
12
+ icon,
13
+ size = "lg",
14
+ shape = "default",
15
+ onRemove,
16
+ onOpen,
17
+ preview,
18
+ ...props
19
+ }) {
20
+ const fileIcon = icon ?? /* @__PURE__ */ jsx(FileIcon, { type: "pdf" });
21
+ const lg = size === "lg";
22
+ const rounded = shape === "rounded";
23
+ const chip = /* @__PURE__ */ jsxs(
24
+ "div",
25
+ {
26
+ "data-slot": "attachment",
27
+ className: cn(
28
+ "group/attachment relative inline-flex max-w-full shrink-0 items-center border border-border-default bg-bg-popover",
29
+ "[box-shadow:0_1px_1px_0_var(--effect-shadow-xs)]",
30
+ "transition-[background-color,border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
31
+ lg ? "gap-2.5 px-2" : "h-control-height gap-1.5 pl-2",
32
+ !lg && (onRemove ? "pr-0.5" : "pr-2.5"),
33
+ lg && (rounded ? "rounded-pill py-1" : "rounded-xl py-1.5"),
34
+ !lg && (rounded ? "rounded-pill" : "rounded-md"),
35
+ // Hover (satin-pressed, declared later, wins while pressed)
36
+ "satin-hover:border-border-strong",
37
+ !lg && "satin-hover:bg-bg-canvas",
38
+ // Pressed
39
+ "satin-pressed:border-border-strong satin-pressed:bg-bg-muted",
40
+ // Focus
41
+ "has-[[data-attachment-main]:focus-visible]:border-border-default has-[[data-attachment-main]:focus-visible]:bg-bg-popover",
42
+ "has-[[data-attachment-main]:focus-visible]:[box-shadow:0_1px_2px_0_var(--effect-shadow-xs),0_0_0_2px_var(--action-focus-ring)]",
43
+ "data-[force=focus]:border-border-default data-[force=focus]:bg-bg-popover",
44
+ "data-[force=focus]:[box-shadow:0_1px_2px_0_var(--effect-shadow-xs),0_0_0_2px_var(--action-focus-ring)]",
45
+ className
46
+ ),
47
+ ...props,
48
+ children: [
49
+ /* @__PURE__ */ jsx(
50
+ "button",
51
+ {
52
+ type: "button",
53
+ "data-attachment-main": "",
54
+ onClick: onOpen,
55
+ className: cn(
56
+ "flex min-w-0 items-center text-left outline-none",
57
+ // The whole chip is the click target; the remove button sits above it.
58
+ "after:absolute after:inset-0 after:rounded-[inherit]",
59
+ lg ? "gap-2.5" : "gap-1.5"
60
+ ),
61
+ children: lg ? /* @__PURE__ */ jsxs(Fragment, { children: [
62
+ /* @__PURE__ */ jsx(
63
+ "span",
64
+ {
65
+ className: cn(
66
+ "flex size-8 shrink-0 items-center justify-center bg-bg-muted [&_svg]:size-icon-size",
67
+ rounded ? "rounded-xl" : "rounded-md",
68
+ "group-active/attachment:bg-bg-card group-data-[force=pressed]/attachment:bg-bg-card"
69
+ ),
70
+ children: fileIcon
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
74
+ /* @__PURE__ */ jsx("span", { "data-attachment-name": "", className: "max-w-[200px] truncate text-sm font-medium text-text-default", children: name }),
75
+ meta && /* @__PURE__ */ jsx("span", { className: "sr-only", children: ", " }),
76
+ meta && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-text-muted", children: meta })
77
+ ] })
78
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
79
+ /* @__PURE__ */ jsx("span", { className: "flex shrink-0 [&_svg]:size-icon-size", children: fileIcon }),
80
+ /* @__PURE__ */ jsx("span", { "data-attachment-name": "", className: "max-w-[200px] truncate text-sm font-medium text-text-default", children: name }),
81
+ meta && /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
82
+ ", ",
83
+ meta
84
+ ] })
85
+ ] })
86
+ }
87
+ ),
88
+ onRemove && /* @__PURE__ */ jsx(
89
+ Button,
90
+ {
91
+ variant: "tertiary",
92
+ size: "xs",
93
+ shape: "rounded",
94
+ iconOnly: true,
95
+ "aria-label": `Remove ${name}`,
96
+ onClick: onRemove,
97
+ className: "relative z-10",
98
+ children: /* @__PURE__ */ jsx(Xmark, { "aria-hidden": true })
99
+ }
100
+ )
101
+ ]
102
+ }
103
+ );
104
+ if (!preview) return chip;
105
+ return /* @__PURE__ */ jsxs(HoverCard.Root, { openDelay: 300, closeDelay: 100, children: [
106
+ /* @__PURE__ */ jsx(HoverCard.Trigger, { asChild: true, children: chip }),
107
+ /* @__PURE__ */ jsx(HoverCard.Portal, { children: /* @__PURE__ */ jsx(
108
+ HoverCard.Content,
109
+ {
110
+ side: "top",
111
+ align: "start",
112
+ sideOffset: 8,
113
+ className: "z-50 outline-none data-[state=open]:[animation:satin-enter_var(--duration-fast)_var(--ease-out)]",
114
+ children: preview
115
+ }
116
+ ) })
117
+ ] });
118
+ }
119
+ function AttachmentGroup({ className, ...props }) {
120
+ return /* @__PURE__ */ jsx(
121
+ "div",
122
+ {
123
+ "data-slot": "attachment-group",
124
+ className: cn("flex max-w-[576px] flex-wrap items-start gap-1 [&>*]:shrink-0", className),
125
+ ...props
126
+ }
127
+ );
128
+ }
129
+ function AttachmentPreview({
130
+ className,
131
+ name,
132
+ icon,
133
+ children,
134
+ navigation,
135
+ onOpen,
136
+ openLabel = "Open",
137
+ ...props
138
+ }) {
139
+ return /* @__PURE__ */ jsxs(
140
+ "div",
141
+ {
142
+ "data-slot": "attachment-preview",
143
+ className: cn(
144
+ "flex w-[296px] flex-col overflow-clip rounded-xl border border-border-default bg-bg-popover",
145
+ "[box-shadow:0_4px_6px_-1px_var(--effect-shadow-sm),0_2px_4px_-2px_var(--effect-shadow-sm)]",
146
+ className
147
+ ),
148
+ ...props,
149
+ children: [
150
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 [&_svg]:size-icon-size", children: [
151
+ /* @__PURE__ */ jsx("span", { className: "flex shrink-0", children: icon ?? /* @__PURE__ */ jsx(FileIcon, { type: "pdf" }) }),
152
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium text-text-default", children: name })
153
+ ] }),
154
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
155
+ /* @__PURE__ */ jsx(
156
+ "div",
157
+ {
158
+ tabIndex: 0,
159
+ "aria-label": `Preview of ${name}`,
160
+ className: cn(
161
+ "h-[176px] overflow-x-clip overflow-y-auto pr-4 pl-3 outline-none",
162
+ "[scrollbar-color:var(--border-strong)_transparent] [scrollbar-width:thin]",
163
+ "focus-visible:[box-shadow:inset_0_0_0_2px_var(--action-focus-ring)]"
164
+ ),
165
+ children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 pt-2 pb-3", children })
166
+ }
167
+ ),
168
+ /* @__PURE__ */ jsx(
169
+ "div",
170
+ {
171
+ "aria-hidden": true,
172
+ className: "pointer-events-none absolute right-2.5 bottom-0 left-0 h-8 bg-linear-to-b from-transparent to-bg-popover"
173
+ }
174
+ )
175
+ ] }),
176
+ /* @__PURE__ */ jsx("div", { className: "h-px bg-border-subtle" }),
177
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-1.5", children: [
178
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 items-center gap-1", children: navigation }),
179
+ /* @__PURE__ */ jsxs(Button, { variant: "tertiary", size: "xs", onClick: onOpen, children: [
180
+ openLabel,
181
+ /* @__PURE__ */ jsx(ArrowUpRight, { "aria-hidden": true })
182
+ ] })
183
+ ] })
184
+ ]
185
+ }
186
+ );
187
+ }
188
+ function AttachmentPreviewPager({
189
+ page,
190
+ total,
191
+ onPrevious,
192
+ onNext
193
+ }) {
194
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
195
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "xs", shape: "rounded", iconOnly: true, "aria-label": "Previous section", disabled: page <= 1, onClick: onPrevious, children: /* @__PURE__ */ jsx(NavArrowUp, { "aria-hidden": true }) }),
196
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "xs", shape: "rounded", iconOnly: true, "aria-label": "Next section", disabled: page >= total, onClick: onNext, children: /* @__PURE__ */ jsx(NavArrowDown, { "aria-hidden": true }) }),
197
+ /* @__PURE__ */ jsxs("span", { className: "text-xs whitespace-nowrap text-text-muted", "aria-live": "polite", children: [
198
+ "Page ",
199
+ page,
200
+ " of ",
201
+ total
202
+ ] })
203
+ ] });
204
+ }
205
+ function AttachmentPreviewSheets({
206
+ sheets,
207
+ value,
208
+ onValueChange
209
+ }) {
210
+ return /* @__PURE__ */ jsx("div", { role: "tablist", "aria-label": "Sheets", className: "flex items-center gap-1", children: sheets.map((sheet) => {
211
+ const selected = sheet === value;
212
+ return /* @__PURE__ */ jsx(
213
+ "button",
214
+ {
215
+ type: "button",
216
+ role: "tab",
217
+ "aria-selected": selected,
218
+ onClick: () => onValueChange?.(sheet),
219
+ className: cn(
220
+ "rounded-sm px-2 py-0.5 text-xs whitespace-nowrap outline-none",
221
+ "transition-[background-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
222
+ "focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
223
+ selected ? "bg-bg-muted text-text-default" : "text-text-muted hover:text-text-default"
224
+ ),
225
+ children: sheet
226
+ },
227
+ sheet
228
+ );
229
+ }) });
230
+ }
231
+ function FileIcon({ type, className }) {
232
+ const page = type === "pdf" ? "var(--color-red-500)" : "var(--color-green-700)";
233
+ const fold = type === "pdf" ? "var(--color-red-300)" : "var(--color-green-300)";
234
+ return /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, className: cn("size-icon-size shrink-0", className), children: [
235
+ /* @__PURE__ */ jsx(
236
+ "path",
237
+ {
238
+ d: "M2.66673 3.33327C2.66673 2.22873 3.56218 1.33327 4.66673 1.33327H5.72127C5.86673 1.33327 6.00339 1.36788 6.13127 1.43709L13.1416 5.22945C13.2695 5.29867 13.3335 5.406 13.3335 5.55145V12.6665C13.3335 13.7711 12.438 14.6665 11.3335 14.6665H4.66673C3.56218 14.6665 2.66673 13.7711 2.66673 12.6665V3.33327Z",
239
+ fill: page
240
+ }
241
+ ),
242
+ /* @__PURE__ */ jsx(
243
+ "path",
244
+ {
245
+ d: "M5.93945 1.33327L13.3335 5.33327L10.8985 6.92509C10.2898 7.32303 9.78648 7.21764 9.38855 6.60891L5.93945 1.33327Z",
246
+ fill: fold
247
+ }
248
+ ),
249
+ type === "pdf" ? /* @__PURE__ */ jsxs("g", { fill: "var(--color-white)", children: [
250
+ /* @__PURE__ */ jsx("path", { d: "M4.62457 12.9938V10.3491H5.66796C5.86855 10.3491 6.03943 10.3874 6.18062 10.4641C6.3218 10.5398 6.42941 10.6453 6.50345 10.7804C6.57835 10.9147 6.61579 11.0697 6.61579 11.2453C6.61579 11.4209 6.57792 11.5759 6.50216 11.7102C6.4264 11.8445 6.31664 11.9491 6.17287 12.024C6.02996 12.0989 5.85693 12.1363 5.65376 12.1363H4.98873V11.6882H5.56337C5.67098 11.6882 5.75965 11.6697 5.82938 11.6327C5.89997 11.5948 5.95248 11.5428 5.98692 11.4765C6.02222 11.4093 6.03986 11.3323 6.03986 11.2453C6.03986 11.1575 6.02222 11.0809 5.98692 11.0155C5.95248 10.9492 5.89997 10.898 5.82938 10.8618C5.75879 10.8248 5.66925 10.8063 5.56078 10.8063H5.18372V12.9938H4.62457Z" }),
251
+ /* @__PURE__ */ jsx("path", { d: "M7.91648 12.9938H6.97898V10.3491H7.92423C8.19024 10.3491 8.41923 10.4021 8.61121 10.508C8.80319 10.613 8.95083 10.7641 9.05413 10.9612C9.1583 11.1584 9.21038 11.3943 9.21038 11.6689C9.21038 11.9444 9.1583 12.1811 9.05413 12.3791C8.95083 12.5771 8.80233 12.729 8.60863 12.8349C8.41579 12.9408 8.18507 12.9938 7.91648 12.9938ZM7.53812 12.5147H7.89323C8.05852 12.5147 8.19756 12.4854 8.31033 12.4269C8.42397 12.3675 8.5092 12.2758 8.56601 12.1518C8.62369 12.027 8.65253 11.866 8.65253 11.6689C8.65253 11.4735 8.62369 11.3138 8.56601 11.1898C8.5092 11.0658 8.4244 10.9746 8.31162 10.916C8.19885 10.8575 8.05981 10.8282 7.89453 10.8282H7.53812V12.5147Z" }),
252
+ /* @__PURE__ */ jsx("path", { d: "M9.62457 12.9938V10.3491H11.3756V10.8101H10.1837V11.4403H11.2594V11.9013H10.1837V12.9938H9.62457Z" })
253
+ ] }) : /* @__PURE__ */ jsxs("g", { fill: "var(--color-white)", children: [
254
+ /* @__PURE__ */ jsx("path", { d: "M4.54258 10.5469L4.99589 11.3131H5.01346L5.46897 10.5469H6.00571L5.31969 11.6709L6.02107 12.7949H5.47446L5.01346 12.0276H4.99589L4.53489 12.7949H3.99047L4.69405 11.6709L4.00364 10.5469H4.54258Z" }),
255
+ /* @__PURE__ */ jsx("path", { d: "M6.30646 12.7949V10.5469H6.78173V12.403H7.74544V12.7949H6.30646Z" }),
256
+ /* @__PURE__ */ jsx("path", { d: "M9.27965 11.1934C9.27086 11.1049 9.23318 11.0361 9.16659 10.9871C9.1 10.9381 9.00963 10.9135 8.89548 10.9135C8.81791 10.9135 8.75242 10.9245 8.699 10.9465C8.64559 10.9677 8.60461 10.9973 8.57607 11.0354C8.54826 11.0734 8.53436 11.1166 8.53436 11.1649C8.5329 11.2051 8.54131 11.2403 8.5596 11.2703C8.57863 11.3003 8.60461 11.3263 8.63754 11.3482C8.67046 11.3694 8.70852 11.3881 8.75169 11.4042C8.79486 11.4196 8.84096 11.4327 8.88999 11.4437L9.09195 11.492C9.19001 11.5139 9.28001 11.5432 9.36197 11.5798C9.44392 11.6164 9.5149 11.6614 9.57491 11.7148C9.63491 11.7682 9.68138 11.8312 9.71431 11.9036C9.74797 11.976 9.76516 12.0591 9.76589 12.1528C9.76516 12.2903 9.73004 12.4096 9.66052 12.5106C9.59174 12.6108 9.49222 12.6888 9.36197 12.7444C9.23245 12.7993 9.07622 12.8267 8.89328 12.8267C8.71181 12.8267 8.55375 12.7989 8.41911 12.7433C8.2852 12.6877 8.18056 12.6054 8.10519 12.4963C8.03055 12.3866 7.9914 12.2508 7.98774 12.0891H8.44765C8.45277 12.1645 8.47436 12.2274 8.51241 12.2779C8.55119 12.3277 8.60278 12.3653 8.66717 12.3909C8.7323 12.4158 8.80584 12.4283 8.88779 12.4283C8.96829 12.4283 9.03817 12.4166 9.09744 12.3931C9.15744 12.3697 9.20391 12.3372 9.23684 12.2955C9.26977 12.2537 9.28623 12.2058 9.28623 12.1517C9.28623 12.1012 9.27123 12.0587 9.24123 12.0243C9.21196 11.9899 9.16879 11.9607 9.11171 11.9365C9.05536 11.9124 8.98621 11.8904 8.90426 11.8707L8.65949 11.8092C8.46997 11.7631 8.32032 11.691 8.21056 11.593C8.1008 11.4949 8.04628 11.3628 8.04701 11.1967C8.04628 11.0606 8.0825 10.9417 8.15568 10.84C8.22959 10.7383 8.33093 10.6589 8.45972 10.6018C8.58851 10.5447 8.73486 10.5162 8.89877 10.5162C9.06561 10.5162 9.21123 10.5447 9.33562 10.6018C9.46075 10.6589 9.55808 10.7383 9.62759 10.84C9.69711 10.9417 9.73296 11.0595 9.73516 11.1934H9.27965Z" }),
257
+ /* @__PURE__ */ jsx("path", { d: "M10.5312 10.5469L10.9845 11.3131H11.0021L11.4576 10.5469H11.9943L11.3083 11.6709L12.0097 12.7949H11.4631L11.0021 12.0276H10.9845L10.5235 12.7949H9.97911L10.6827 11.6709L9.99228 10.5469H10.5312Z" })
258
+ ] })
259
+ ] });
260
+ }
261
+
262
+ export { Attachment, AttachmentGroup, AttachmentPreview, AttachmentPreviewPager, AttachmentPreviewSheets, FileIcon };
263
+ //# sourceMappingURL=chunk-H4NU7NPO.js.map
264
+ //# sourceMappingURL=chunk-H4NU7NPO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/attachment.tsx"],"names":[],"mappings":"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","file":"chunk-H4NU7NPO.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { HoverCard } from 'radix-ui'\nimport { ArrowUpRight, NavArrowDown, NavArrowUp, Xmark } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\n/**\n * Attachment, 1:1 with the uiKit `Attachment` set (3141:20409), plus `AttachmentGroup`\n * (3144:21146) and `AttachmentPreview` (3142:20419).\n *\n * - size `sm`: a 28px chip — 16px file icon, medium 13 name (max 200, truncated), remove button.\n * Radius-md, or full when `shape=\"rounded\"`.\n * - size `lg`: a 32px icon tile (bg/muted) + name + 12px text/muted meta line. Radius-xl with 6px\n * vertical padding (52 high), or full with 4px (48 high).\n * - States: default bg/popover, border/default, 0 1 1 shadow-xs. Hover border/strong (sm also\n * turns bg/canvas). Pressed bg/muted, border/strong, and the lg tile turns bg/card. Focus keeps\n * border/default and adds the 2px focus ring. All answer to `data-force` as well.\n * - The remove button is the DS Button (tertiary, xs, icon only, rounded), as in Figma.\n * - The whole chip opens the file (`onOpen`); `preview` shows an AttachmentPreview above it on hover.\n */\n\nexport interface AttachmentProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n name: string\n /** Type and size, e.g. \"PDF · 2.4 MB\". Shown on `lg` only. */\n meta?: string\n /** File type icon. Defaults to the PDF icon. */\n icon?: React.ReactNode\n size?: 'sm' | 'lg'\n /** Rounded inside the composer and chat, Default inside cards and tables. */\n shape?: 'default' | 'rounded'\n /** Shows the remove button. Leave it out once the message is sent. */\n onRemove?: () => void\n onOpen?: () => void\n /** Content for the hover preview, usually an `<AttachmentPreview>`. */\n preview?: React.ReactNode\n 'data-force'?: 'hover' | 'pressed' | 'focus'\n}\n\nexport function Attachment({\n className,\n name,\n meta,\n icon,\n size = 'lg',\n shape = 'default',\n onRemove,\n onOpen,\n preview,\n ...props\n}: AttachmentProps) {\n const fileIcon = icon ?? <FileIcon type=\"pdf\" />\n const lg = size === 'lg'\n const rounded = shape === 'rounded'\n\n const chip = (\n <div\n data-slot=\"attachment\"\n className={cn(\n 'group/attachment relative inline-flex max-w-full shrink-0 items-center border border-border-default bg-bg-popover',\n '[box-shadow:0_1px_1px_0_var(--effect-shadow-xs)]',\n 'transition-[background-color,border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n lg ? 'gap-2.5 px-2' : 'h-control-height gap-1.5 pl-2',\n !lg && (onRemove ? 'pr-0.5' : 'pr-2.5'),\n lg && (rounded ? 'rounded-pill py-1' : 'rounded-xl py-1.5'),\n !lg && (rounded ? 'rounded-pill' : 'rounded-md'),\n // Hover (satin-pressed, declared later, wins while pressed)\n 'satin-hover:border-border-strong',\n !lg && 'satin-hover:bg-bg-canvas',\n // Pressed\n 'satin-pressed:border-border-strong satin-pressed:bg-bg-muted',\n // Focus\n 'has-[[data-attachment-main]:focus-visible]:border-border-default has-[[data-attachment-main]:focus-visible]:bg-bg-popover',\n 'has-[[data-attachment-main]:focus-visible]:[box-shadow:0_1px_2px_0_var(--effect-shadow-xs),0_0_0_2px_var(--action-focus-ring)]',\n 'data-[force=focus]:border-border-default data-[force=focus]:bg-bg-popover',\n 'data-[force=focus]:[box-shadow:0_1px_2px_0_var(--effect-shadow-xs),0_0_0_2px_var(--action-focus-ring)]',\n className,\n )}\n {...props}\n >\n <button\n type=\"button\"\n data-attachment-main=\"\"\n onClick={onOpen}\n className={cn(\n 'flex min-w-0 items-center text-left outline-none',\n // The whole chip is the click target; the remove button sits above it.\n 'after:absolute after:inset-0 after:rounded-[inherit]',\n lg ? 'gap-2.5' : 'gap-1.5',\n )}\n >\n {lg ? (\n <>\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center bg-bg-muted [&_svg]:size-icon-size',\n rounded ? 'rounded-xl' : 'rounded-md',\n 'group-active/attachment:bg-bg-card group-data-[force=pressed]/attachment:bg-bg-card',\n )}\n >\n {fileIcon}\n </span>\n <span className=\"flex min-w-0 flex-col\">\n <span data-attachment-name=\"\" className=\"max-w-[200px] truncate text-sm font-medium text-text-default\">{name}</span>\n {meta && <span className=\"sr-only\">, </span>}\n {meta && <span className=\"truncate text-xs text-text-muted\">{meta}</span>}\n </span>\n </>\n ) : (\n <>\n <span className=\"flex shrink-0 [&_svg]:size-icon-size\">{fileIcon}</span>\n <span data-attachment-name=\"\" className=\"max-w-[200px] truncate text-sm font-medium text-text-default\">{name}</span>\n {meta && <span className=\"sr-only\">, {meta}</span>}\n </>\n )}\n </button>\n {onRemove && (\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n shape=\"rounded\"\n iconOnly\n aria-label={`Remove ${name}`}\n onClick={onRemove}\n className=\"relative z-10\"\n >\n <Xmark aria-hidden />\n </Button>\n )}\n </div>\n )\n\n if (!preview) return chip\n return (\n <HoverCard.Root openDelay={300} closeDelay={100}>\n <HoverCard.Trigger asChild>{chip}</HoverCard.Trigger>\n <HoverCard.Portal>\n <HoverCard.Content\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className=\"z-50 outline-none data-[state=open]:[animation:satin-enter_var(--duration-fast)_var(--ease-out)]\"\n >\n {preview}\n </HoverCard.Content>\n </HoverCard.Portal>\n </HoverCard.Root>\n )\n}\n\nexport interface AttachmentGroupProps extends React.ComponentProps<'div'> {}\n\n/** AttachmentGroup (3144:21146): files wrap onto new rows at 576px, 4px apart. */\nexport function AttachmentGroup({ className, ...props }: AttachmentGroupProps) {\n return (\n <div\n data-slot=\"attachment-group\"\n className={cn('flex max-w-[576px] flex-wrap items-start gap-1 [&>*]:shrink-0', className)}\n {...props}\n />\n )\n}\n\nexport interface AttachmentPreviewProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n name: string\n icon?: React.ReactNode\n /** The first page or the first rows. Scrolls inside a fixed 176px viewport. */\n children?: React.ReactNode\n /** Left side of the footer: an `AttachmentPreviewPager` or `AttachmentPreviewSheets`. */\n navigation?: React.ReactNode\n onOpen?: () => void\n openLabel?: string\n}\n\n/**\n * AttachmentPreview (3142:20419): 296 wide, bg/popover, border/default, radius-xl, shadcn md\n * shadow. A header with the file, a 176px scrolling viewport with a fade at the bottom, a\n * border/subtle divider and a footer that moves between pages or sheets and opens the file.\n */\nexport function AttachmentPreview({\n className,\n name,\n icon,\n children,\n navigation,\n onOpen,\n openLabel = 'Open',\n ...props\n}: AttachmentPreviewProps) {\n return (\n <div\n data-slot=\"attachment-preview\"\n className={cn(\n 'flex w-[296px] flex-col overflow-clip rounded-xl border border-border-default bg-bg-popover',\n '[box-shadow:0_4px_6px_-1px_var(--effect-shadow-sm),0_2px_4px_-2px_var(--effect-shadow-sm)]',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2 px-3 py-2 [&_svg]:size-icon-size\">\n <span className=\"flex shrink-0\">{icon ?? <FileIcon type=\"pdf\" />}</span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-text-default\">{name}</span>\n </div>\n <div className=\"relative\">\n <div\n tabIndex={0}\n aria-label={`Preview of ${name}`}\n className={cn(\n 'h-[176px] overflow-x-clip overflow-y-auto pr-4 pl-3 outline-none',\n '[scrollbar-color:var(--border-strong)_transparent] [scrollbar-width:thin]',\n 'focus-visible:[box-shadow:inset_0_0_0_2px_var(--action-focus-ring)]',\n )}\n >\n <div className=\"flex flex-col gap-2 pt-2 pb-3\">{children}</div>\n </div>\n <div\n aria-hidden\n className=\"pointer-events-none absolute right-2.5 bottom-0 left-0 h-8 bg-linear-to-b from-transparent to-bg-popover\"\n />\n </div>\n <div className=\"h-px bg-border-subtle\" />\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <div className=\"flex min-w-0 flex-1 items-center gap-1\">{navigation}</div>\n <Button variant=\"tertiary\" size=\"xs\" onClick={onOpen}>\n {openLabel}\n <ArrowUpRight aria-hidden />\n </Button>\n </div>\n </div>\n )\n}\n\n/** Document footer: previous / next section and \"Page 1 of 3\". */\nexport function AttachmentPreviewPager({\n page,\n total,\n onPrevious,\n onNext,\n}: {\n page: number\n total: number\n onPrevious?: () => void\n onNext?: () => void\n}) {\n return (\n <>\n <Button variant=\"tertiary\" size=\"xs\" shape=\"rounded\" iconOnly aria-label=\"Previous section\" disabled={page <= 1} onClick={onPrevious}>\n <NavArrowUp aria-hidden />\n </Button>\n <Button variant=\"tertiary\" size=\"xs\" shape=\"rounded\" iconOnly aria-label=\"Next section\" disabled={page >= total} onClick={onNext}>\n <NavArrowDown aria-hidden />\n </Button>\n <span className=\"text-xs whitespace-nowrap text-text-muted\" aria-live=\"polite\">\n Page {page} of {total}\n </span>\n </>\n )\n}\n\n/** Spreadsheet footer: one tab per sheet; the current one is filled bg/muted. */\nexport function AttachmentPreviewSheets({\n sheets,\n value,\n onValueChange,\n}: {\n sheets: string[]\n value: string\n onValueChange?: (sheet: string) => void\n}) {\n return (\n <div role=\"tablist\" aria-label=\"Sheets\" className=\"flex items-center gap-1\">\n {sheets.map((sheet) => {\n const selected = sheet === value\n return (\n <button\n key={sheet}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => onValueChange?.(sheet)}\n className={cn(\n 'rounded-sm px-2 py-0.5 text-xs whitespace-nowrap outline-none',\n 'transition-[background-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n selected ? 'bg-bg-muted text-text-default' : 'text-text-muted hover:text-text-default',\n )}\n >\n {sheet}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * File type icons from uiKit `icon` (filePdf 3138:39947, fileXlsx 3138:39967). They keep their\n * own colours (library primitives), so they don't follow currentColor.\n */\nexport function FileIcon({ type, className }: { type: 'pdf' | 'xlsx'; className?: string }) {\n const page = type === 'pdf' ? 'var(--color-red-500)' : 'var(--color-green-700)'\n const fold = type === 'pdf' ? 'var(--color-red-300)' : 'var(--color-green-300)'\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden className={cn('size-icon-size shrink-0', className)}>\n <path\n d=\"M2.66673 3.33327C2.66673 2.22873 3.56218 1.33327 4.66673 1.33327H5.72127C5.86673 1.33327 6.00339 1.36788 6.13127 1.43709L13.1416 5.22945C13.2695 5.29867 13.3335 5.406 13.3335 5.55145V12.6665C13.3335 13.7711 12.438 14.6665 11.3335 14.6665H4.66673C3.56218 14.6665 2.66673 13.7711 2.66673 12.6665V3.33327Z\"\n fill={page}\n />\n <path\n d=\"M5.93945 1.33327L13.3335 5.33327L10.8985 6.92509C10.2898 7.32303 9.78648 7.21764 9.38855 6.60891L5.93945 1.33327Z\"\n fill={fold}\n />\n {type === 'pdf' ? (\n <g fill=\"var(--color-white)\">\n <path d=\"M4.62457 12.9938V10.3491H5.66796C5.86855 10.3491 6.03943 10.3874 6.18062 10.4641C6.3218 10.5398 6.42941 10.6453 6.50345 10.7804C6.57835 10.9147 6.61579 11.0697 6.61579 11.2453C6.61579 11.4209 6.57792 11.5759 6.50216 11.7102C6.4264 11.8445 6.31664 11.9491 6.17287 12.024C6.02996 12.0989 5.85693 12.1363 5.65376 12.1363H4.98873V11.6882H5.56337C5.67098 11.6882 5.75965 11.6697 5.82938 11.6327C5.89997 11.5948 5.95248 11.5428 5.98692 11.4765C6.02222 11.4093 6.03986 11.3323 6.03986 11.2453C6.03986 11.1575 6.02222 11.0809 5.98692 11.0155C5.95248 10.9492 5.89997 10.898 5.82938 10.8618C5.75879 10.8248 5.66925 10.8063 5.56078 10.8063H5.18372V12.9938H4.62457Z\" />\n <path d=\"M7.91648 12.9938H6.97898V10.3491H7.92423C8.19024 10.3491 8.41923 10.4021 8.61121 10.508C8.80319 10.613 8.95083 10.7641 9.05413 10.9612C9.1583 11.1584 9.21038 11.3943 9.21038 11.6689C9.21038 11.9444 9.1583 12.1811 9.05413 12.3791C8.95083 12.5771 8.80233 12.729 8.60863 12.8349C8.41579 12.9408 8.18507 12.9938 7.91648 12.9938ZM7.53812 12.5147H7.89323C8.05852 12.5147 8.19756 12.4854 8.31033 12.4269C8.42397 12.3675 8.5092 12.2758 8.56601 12.1518C8.62369 12.027 8.65253 11.866 8.65253 11.6689C8.65253 11.4735 8.62369 11.3138 8.56601 11.1898C8.5092 11.0658 8.4244 10.9746 8.31162 10.916C8.19885 10.8575 8.05981 10.8282 7.89453 10.8282H7.53812V12.5147Z\" />\n <path d=\"M9.62457 12.9938V10.3491H11.3756V10.8101H10.1837V11.4403H11.2594V11.9013H10.1837V12.9938H9.62457Z\" />\n </g>\n ) : (\n <g fill=\"var(--color-white)\">\n <path d=\"M4.54258 10.5469L4.99589 11.3131H5.01346L5.46897 10.5469H6.00571L5.31969 11.6709L6.02107 12.7949H5.47446L5.01346 12.0276H4.99589L4.53489 12.7949H3.99047L4.69405 11.6709L4.00364 10.5469H4.54258Z\" />\n <path d=\"M6.30646 12.7949V10.5469H6.78173V12.403H7.74544V12.7949H6.30646Z\" />\n <path d=\"M9.27965 11.1934C9.27086 11.1049 9.23318 11.0361 9.16659 10.9871C9.1 10.9381 9.00963 10.9135 8.89548 10.9135C8.81791 10.9135 8.75242 10.9245 8.699 10.9465C8.64559 10.9677 8.60461 10.9973 8.57607 11.0354C8.54826 11.0734 8.53436 11.1166 8.53436 11.1649C8.5329 11.2051 8.54131 11.2403 8.5596 11.2703C8.57863 11.3003 8.60461 11.3263 8.63754 11.3482C8.67046 11.3694 8.70852 11.3881 8.75169 11.4042C8.79486 11.4196 8.84096 11.4327 8.88999 11.4437L9.09195 11.492C9.19001 11.5139 9.28001 11.5432 9.36197 11.5798C9.44392 11.6164 9.5149 11.6614 9.57491 11.7148C9.63491 11.7682 9.68138 11.8312 9.71431 11.9036C9.74797 11.976 9.76516 12.0591 9.76589 12.1528C9.76516 12.2903 9.73004 12.4096 9.66052 12.5106C9.59174 12.6108 9.49222 12.6888 9.36197 12.7444C9.23245 12.7993 9.07622 12.8267 8.89328 12.8267C8.71181 12.8267 8.55375 12.7989 8.41911 12.7433C8.2852 12.6877 8.18056 12.6054 8.10519 12.4963C8.03055 12.3866 7.9914 12.2508 7.98774 12.0891H8.44765C8.45277 12.1645 8.47436 12.2274 8.51241 12.2779C8.55119 12.3277 8.60278 12.3653 8.66717 12.3909C8.7323 12.4158 8.80584 12.4283 8.88779 12.4283C8.96829 12.4283 9.03817 12.4166 9.09744 12.3931C9.15744 12.3697 9.20391 12.3372 9.23684 12.2955C9.26977 12.2537 9.28623 12.2058 9.28623 12.1517C9.28623 12.1012 9.27123 12.0587 9.24123 12.0243C9.21196 11.9899 9.16879 11.9607 9.11171 11.9365C9.05536 11.9124 8.98621 11.8904 8.90426 11.8707L8.65949 11.8092C8.46997 11.7631 8.32032 11.691 8.21056 11.593C8.1008 11.4949 8.04628 11.3628 8.04701 11.1967C8.04628 11.0606 8.0825 10.9417 8.15568 10.84C8.22959 10.7383 8.33093 10.6589 8.45972 10.6018C8.58851 10.5447 8.73486 10.5162 8.89877 10.5162C9.06561 10.5162 9.21123 10.5447 9.33562 10.6018C9.46075 10.6589 9.55808 10.7383 9.62759 10.84C9.69711 10.9417 9.73296 11.0595 9.73516 11.1934H9.27965Z\" />\n <path d=\"M10.5312 10.5469L10.9845 11.3131H11.0021L11.4576 10.5469H11.9943L11.3083 11.6709L12.0097 12.7949H11.4631L11.0021 12.0276H10.9845L10.5235 12.7949H9.97911L10.6827 11.6709L9.99228 10.5469H10.5312Z\" />\n </g>\n )}\n </svg>\n )\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/lib/utils.ts
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(inputs));
7
+ }
8
+
9
+ export { cn };
10
+ //# sourceMappingURL=chunk-H63FYCMY.js.map
11
+ //# sourceMappingURL=chunk-H63FYCMY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-H63FYCMY.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/** Joins class names and lets the later Tailwind class win, like shadcn's `cn`. */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"]}
@@ -0,0 +1,76 @@
1
+ import { DropdownMenu, DropdownMenuItem } from './chunk-3DINAQLL.js';
2
+ import { cn } from './chunk-H63FYCMY.js';
3
+ import * as React from 'react';
4
+ import { MoreHoriz, NavArrowRight } from 'iconoir-react';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+
7
+ var itemClass = cn(
8
+ "inline-flex h-6 items-center gap-2 rounded-md px-1 text-sm leading-5 whitespace-nowrap text-text-muted",
9
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]",
10
+ "transition-colors duration-(--duration-fast) ease-(--ease-out) outline-none focus-visible:shadow-border-focus"
11
+ );
12
+ var linkClass = "cursor-pointer hover:text-text-default";
13
+ function Separator() {
14
+ return /* @__PURE__ */ jsx("li", { role: "presentation", "aria-hidden": true, className: "flex text-text-subtle [&_svg]:size-3.5 [&_svg]:[stroke-width:1.875]", children: /* @__PURE__ */ jsx(NavArrowRight, {}) });
15
+ }
16
+ function Breadcrumb({ items, maxItems, className, "aria-label": ariaLabel = "Breadcrumb", ...props }) {
17
+ const fold = maxItems != null && maxItems >= 2 && items.length > maxItems;
18
+ const head = fold ? items.slice(0, 1) : items;
19
+ const hidden = fold ? items.slice(1, items.length - (maxItems - 1)) : [];
20
+ const tail = fold ? items.slice(items.length - (maxItems - 1)) : [];
21
+ const last = items.length - 1;
22
+ const crumb = (item, index) => {
23
+ const current = index === last;
24
+ const content = item.icon ? /* @__PURE__ */ jsxs(Fragment, { children: [
25
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "grid size-3.5 shrink-0 place-items-center", children: item.icon }),
26
+ /* @__PURE__ */ jsx("span", { className: item.hideLabel ? "sr-only" : void 0, children: item.label })
27
+ ] }) : item.label;
28
+ const el = current ? /* @__PURE__ */ jsx("span", { "aria-current": "page", className: cn(itemClass, "font-medium text-text-default"), children: content }) : item.href ? /* @__PURE__ */ jsx("a", { href: item.href, onClick: item.onSelect, className: cn(itemClass, linkClass), children: content }) : item.onSelect ? /* @__PURE__ */ jsx("button", { type: "button", onClick: item.onSelect, className: cn(itemClass, linkClass), children: content }) : /* @__PURE__ */ jsx("span", { className: itemClass, children: content });
29
+ return /* @__PURE__ */ jsx("li", { className: "flex", children: el });
30
+ };
31
+ return /* @__PURE__ */ jsx("nav", { "data-slot": "breadcrumb", "aria-label": ariaLabel, className, ...props, children: /* @__PURE__ */ jsxs("ol", { className: "flex flex-wrap items-center gap-1", children: [
32
+ head.map((item, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
33
+ i > 0 && /* @__PURE__ */ jsx(Separator, {}),
34
+ crumb(item, i)
35
+ ] }, `h${i}`)),
36
+ fold && /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ /* @__PURE__ */ jsx(Separator, {}),
38
+ /* @__PURE__ */ jsx("li", { className: "flex", children: /* @__PURE__ */ jsx(
39
+ DropdownMenu,
40
+ {
41
+ "aria-label": "Hidden pages",
42
+ align: "start",
43
+ trigger: /* @__PURE__ */ jsx(
44
+ "button",
45
+ {
46
+ type: "button",
47
+ "aria-label": `Show ${hidden.length} more`,
48
+ className: cn(itemClass, linkClass, "w-6 justify-center px-0 hover:bg-bg-hover [&_svg]:size-4"),
49
+ children: /* @__PURE__ */ jsx(MoreHoriz, { "aria-hidden": true })
50
+ }
51
+ ),
52
+ children: hidden.map((item, i) => /* @__PURE__ */ jsx(
53
+ DropdownMenuItem,
54
+ {
55
+ label: item.label,
56
+ icon: item.icon,
57
+ onSelect: () => {
58
+ item.onSelect?.();
59
+ if (item.href) window.location.assign(item.href);
60
+ }
61
+ },
62
+ i
63
+ ))
64
+ }
65
+ ) }),
66
+ tail.map((item, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
67
+ /* @__PURE__ */ jsx(Separator, {}),
68
+ crumb(item, items.length - tail.length + i)
69
+ ] }, `t${i}`))
70
+ ] })
71
+ ] }) });
72
+ }
73
+
74
+ export { Breadcrumb };
75
+ //# sourceMappingURL=chunk-HL42K2NH.js.map
76
+ //# sourceMappingURL=chunk-HL42K2NH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/breadcrumb.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-HL42K2NH.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { MoreHoriz, NavArrowRight } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { DropdownMenu, DropdownMenuItem } from './dropdown'\n\n/**\n * Breadcrumb, 1:1 with the uiKit `Breadcrumb` set (4025:3711): the path to the current page,\n * items 4px apart with a 14px chevron (text/subtle) between them. An item is 13px text/muted\n * in 2px × 4px of padding, radius 6; it turns text/default on hover. The last item is the\n * current page: text/default, medium, not a link.\n *\n * An item can lead with a 14px `icon`, 8px before its label and centred on it; usually the first one (Home, the\n * workspace). With `hideLabel` only the icon shows, and the label names it for screen readers.\n *\n * With more items than `maxItems`, the middle ones fold into a \"…\" button (24px) that lists\n * them in a Dropdown; the first item and the last `maxItems - 1` stay.\n *\n * A `nav` named \"Breadcrumb\" around an ordered list; the current page has aria-current=\"page\".\n */\nexport interface BreadcrumbItem {\n label: string\n /** A 14px icon before the label, usually on the first item. */\n icon?: React.ReactNode\n /** Show only the icon; the label still names the item for screen readers. */\n hideLabel?: boolean\n /** Where it goes. Left out (or on the current page) it is plain text, or a button with `onSelect`. */\n href?: string\n onSelect?: () => void\n}\n\nexport interface BreadcrumbProps extends Omit<React.ComponentProps<'nav'>, 'children'> {\n /** From the top level down; the last one is the current page. */\n items: BreadcrumbItem[]\n /** Fold the middle into \"…\" when there are more items than this. */\n maxItems?: number\n}\n\nconst itemClass = cn(\n 'inline-flex h-6 items-center gap-2 rounded-md px-1 text-sm leading-5 whitespace-nowrap text-text-muted',\n '[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n 'transition-colors duration-(--duration-fast) ease-(--ease-out) outline-none focus-visible:shadow-border-focus',\n)\nconst linkClass = 'cursor-pointer hover:text-text-default'\n\nfunction Separator() {\n return (\n <li role=\"presentation\" aria-hidden className=\"flex text-text-subtle [&_svg]:size-3.5 [&_svg]:[stroke-width:1.875]\">\n <NavArrowRight />\n </li>\n )\n}\n\nexport function Breadcrumb({ items, maxItems, className, 'aria-label': ariaLabel = 'Breadcrumb', ...props }: BreadcrumbProps) {\n const fold = maxItems != null && maxItems >= 2 && items.length > maxItems\n const head = fold ? items.slice(0, 1) : items\n const hidden = fold ? items.slice(1, items.length - (maxItems - 1)) : []\n const tail = fold ? items.slice(items.length - (maxItems - 1)) : []\n const last = items.length - 1\n\n const crumb = (item: BreadcrumbItem, index: number) => {\n const current = index === last\n const content = item.icon ? (\n <>\n <span aria-hidden className=\"grid size-3.5 shrink-0 place-items-center\">\n {item.icon}\n </span>\n <span className={item.hideLabel ? 'sr-only' : undefined}>{item.label}</span>\n </>\n ) : (\n item.label\n )\n const el = current ? (\n <span aria-current=\"page\" className={cn(itemClass, 'font-medium text-text-default')}>\n {content}\n </span>\n ) : item.href ? (\n <a href={item.href} onClick={item.onSelect} className={cn(itemClass, linkClass)}>\n {content}\n </a>\n ) : item.onSelect ? (\n <button type=\"button\" onClick={item.onSelect} className={cn(itemClass, linkClass)}>\n {content}\n </button>\n ) : (\n <span className={itemClass}>{content}</span>\n )\n return <li className=\"flex\">{el}</li>\n }\n\n return (\n <nav data-slot=\"breadcrumb\" aria-label={ariaLabel} className={className} {...props}>\n <ol className=\"flex flex-wrap items-center gap-1\">\n {head.map((item, i) => (\n <React.Fragment key={`h${i}`}>\n {i > 0 && <Separator />}\n {crumb(item, i)}\n </React.Fragment>\n ))}\n {fold && (\n <>\n <Separator />\n <li className=\"flex\">\n <DropdownMenu\n aria-label=\"Hidden pages\"\n align=\"start\"\n trigger={\n <button\n type=\"button\"\n aria-label={`Show ${hidden.length} more`}\n className={cn(itemClass, linkClass, 'w-6 justify-center px-0 hover:bg-bg-hover [&_svg]:size-4')}\n >\n <MoreHoriz aria-hidden />\n </button>\n }\n >\n {hidden.map((item, i) => (\n <DropdownMenuItem\n key={i}\n label={item.label}\n icon={item.icon}\n onSelect={() => {\n item.onSelect?.()\n if (item.href) window.location.assign(item.href)\n }}\n />\n ))}\n </DropdownMenu>\n </li>\n {tail.map((item, i) => (\n <React.Fragment key={`t${i}`}>\n <Separator />\n {crumb(item, items.length - tail.length + i)}\n </React.Fragment>\n ))}\n </>\n )}\n </ol>\n </nav>\n )\n}\n"]}
@@ -0,0 +1,109 @@
1
+ import { cn } from './chunk-H63FYCMY.js';
2
+ import 'react';
3
+ import { Slot } from 'radix-ui';
4
+ import { cva } from 'class-variance-authority';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var buttonVariants = cva(
8
+ [
9
+ "inline-flex shrink-0 items-center justify-center overflow-clip font-medium whitespace-nowrap select-none",
10
+ "transition-[background-color,border-color,color,box-shadow,transform] duration-(--duration-fast) ease-(--ease-out)",
11
+ // A menu or popover trigger snaps back to full size the moment it opens (no scale, no
12
+ // transform transition), so the menu measures the button's real edge and never jumps.
13
+ "not-aria-expanded:active:scale-[0.97] aria-expanded:[transition-property:background-color,border-color,color,box-shadow]",
14
+ "disabled:pointer-events-none disabled:opacity-50",
15
+ "focus-visible:outline-none [&_svg]:pointer-events-none [&_svg]:shrink-0",
16
+ // Figma icons are 1.25px at 16 and 1.09px at 14; on Iconoir's 24 grid both are 1.875.
17
+ "[&_svg]:[stroke-width:1.875]"
18
+ ],
19
+ {
20
+ variants: {
21
+ variant: {
22
+ primary: [
23
+ "border border-action-primary-border bg-action-primary-bg text-action-primary-fg",
24
+ "[box-shadow:0_0_0_1px_var(--action-primary-bg),0_3px_6px_0_var(--action-primary-shadow)]",
25
+ "satin-hover:bg-action-primary-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-primary-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]",
26
+ "satin-focus:[box-shadow:0_0_0_1px_var(--action-primary-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]",
27
+ "satin-pressed:bg-action-primary-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-primary-bg-pressed)]",
28
+ "[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-primary-bg-pressed),0_0_0_2px_var(--action-focus-ring)]"
29
+ ],
30
+ destructive: [
31
+ "border border-action-destructive-border bg-action-destructive-bg text-text-on-solid",
32
+ "[box-shadow:0_0_0_1px_var(--action-destructive-bg),0_3px_6px_0_var(--action-primary-shadow)]",
33
+ "satin-hover:bg-action-destructive-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-destructive-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]",
34
+ "satin-focus:[box-shadow:0_0_0_1px_var(--action-destructive-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]",
35
+ "satin-pressed:bg-action-destructive-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-destructive-bg-pressed)]",
36
+ "[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-destructive-bg-pressed),0_0_0_2px_var(--action-focus-ring)]"
37
+ ],
38
+ inverse: [
39
+ "border border-action-inverse-border bg-action-inverse-bg text-text-on-inverse",
40
+ "[box-shadow:0_0_0_1px_var(--action-inverse-bg),0_3px_6px_0_var(--action-primary-shadow)]",
41
+ "satin-hover:bg-action-inverse-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-inverse-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]",
42
+ "satin-focus:[box-shadow:0_0_0_1px_var(--action-inverse-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]",
43
+ "satin-pressed:bg-action-inverse-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-inverse-bg-pressed)]",
44
+ "[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-inverse-bg-pressed),0_0_0_2px_var(--action-focus-ring)]"
45
+ ],
46
+ // The outline is a 1px ring outside the box, like the filled variants' ring, so all of
47
+ // them read the same height; the border underneath takes the fill.
48
+ secondary: [
49
+ "border border-transparent bg-bg-popover text-text-default [&_svg]:text-text-muted",
50
+ "[box-shadow:0_0_0_1px_var(--border-default),0_1px_2px_1px_var(--effect-shadow-xs)]",
51
+ "disabled:[box-shadow:0_0_0_1px_var(--border-strong)]",
52
+ "satin-hover:bg-action-secondary-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--border-strong),0_1px_2px_1px_var(--effect-shadow-xs)]",
53
+ "satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_1px_var(--border-strong),0_0_0_2px_var(--action-focus-ring)]",
54
+ "satin-pressed:bg-action-secondary-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--border-strong)]",
55
+ "[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--border-strong),0_0_0_2px_var(--action-focus-ring)]"
56
+ ],
57
+ tertiary: [
58
+ "bg-transparent text-text-default [&_svg]:text-text-muted",
59
+ "satin-hover:bg-bg-hover",
60
+ "satin-focus:bg-bg-hover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
61
+ "satin-pressed:bg-border-input",
62
+ "[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
63
+ ]
64
+ },
65
+ size: {
66
+ xs: "h-control-height-xs gap-1 px-2 text-sm [&_svg]:size-icon-size-sm",
67
+ md: "h-control-height gap-1.5 px-2.5 text-sm [&_svg]:size-icon-size",
68
+ lg: "h-control-height-lg gap-1.5 px-3 text-sm [&_svg]:size-icon-size",
69
+ xl: "h-control-height-xl gap-2 px-3 text-base [&_svg]:size-icon-size"
70
+ },
71
+ shape: {
72
+ default: "",
73
+ rounded: "rounded-pill"
74
+ },
75
+ iconOnly: {
76
+ true: "px-0",
77
+ false: ""
78
+ }
79
+ },
80
+ compoundVariants: [
81
+ // Default shape: the radius grows with the size (8 / 10 / 10 / 12).
82
+ { shape: "default", size: "xs", className: "rounded-md" },
83
+ { shape: "default", size: "md", className: "rounded-lg" },
84
+ { shape: "default", size: "lg", className: "rounded-lg" },
85
+ { shape: "default", size: "xl", className: "rounded-xl" },
86
+ { iconOnly: true, size: "xs", className: "w-control-height-xs" },
87
+ { iconOnly: true, size: "md", className: "w-control-height" },
88
+ { iconOnly: true, size: "lg", className: "w-control-height-lg" },
89
+ { iconOnly: true, size: "xl", className: "w-control-height-xl" }
90
+ ],
91
+ defaultVariants: { variant: "primary", size: "md", shape: "default", iconOnly: false }
92
+ }
93
+ );
94
+ function Button({ className, variant, size, shape, iconOnly, asChild = false, type, ...props }) {
95
+ const Comp = asChild ? Slot.Root : "button";
96
+ return /* @__PURE__ */ jsx(
97
+ Comp,
98
+ {
99
+ "data-slot": "button",
100
+ type: asChild ? void 0 : type ?? "button",
101
+ className: cn(buttonVariants({ variant, size, shape, iconOnly }), className),
102
+ ...props
103
+ }
104
+ );
105
+ }
106
+
107
+ export { Button, buttonVariants };
108
+ //# sourceMappingURL=chunk-HNQUX43Z.js.map
109
+ //# sourceMappingURL=chunk-HNQUX43Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/button.tsx"],"names":[],"mappings":"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","file":"chunk-HNQUX43Z.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from 'radix-ui'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\n/**\n * Button, 1:1 with the uiKit `button` component set (10:1838): five styles, four sizes\n * xs / md / lg / xl (24 / 28 / 32 / 36), Default or Rounded shape, and an icon-only form.\n *\n * Solid styles (primary, destructive, inverse) are a 1px border in the style's `border`\n * token, a 1px outer ring in the current background and a 0 3 6 drop shadow (gone when\n * pressed); no inner glow. Focus adds a 2px `action/focus-ring` spread; disabled\n * is the default look at 50% opacity. Icons take the label colour on solid styles and\n * text/muted on secondary and tertiary.\n *\n * Shadows are written as plain box-shadow, not Tailwind's shadow utilities: those compose\n * five custom properties, and a browser that drops one of them drops the whole shadow.\n *\n * States use the satin-hover / satin-focus / satin-pressed variants (styles/index.css):\n * the real pseudo-classes, or `data-force=\"hover\" | \"focus\" | \"pressed\"` for state sheets.\n * An open menu's trigger looks pressed, which hides the ring; with keyboard focus on it the\n * `[aria-haspopup][aria-expanded=true]:focus-visible` rules bring the ring back.\n */\nconst buttonVariants = cva(\n [\n 'inline-flex shrink-0 items-center justify-center overflow-clip font-medium whitespace-nowrap select-none',\n 'transition-[background-color,border-color,color,box-shadow,transform] duration-(--duration-fast) ease-(--ease-out)',\n // A menu or popover trigger snaps back to full size the moment it opens (no scale, no\n // transform transition), so the menu measures the button's real edge and never jumps.\n 'not-aria-expanded:active:scale-[0.97] aria-expanded:[transition-property:background-color,border-color,color,box-shadow]',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'focus-visible:outline-none [&_svg]:pointer-events-none [&_svg]:shrink-0',\n // Figma icons are 1.25px at 16 and 1.09px at 14; on Iconoir's 24 grid both are 1.875.\n '[&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'border border-action-primary-border bg-action-primary-bg text-action-primary-fg',\n '[box-shadow:0_0_0_1px_var(--action-primary-bg),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-hover:bg-action-primary-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-primary-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-focus:[box-shadow:0_0_0_1px_var(--action-primary-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-action-primary-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-primary-bg-pressed)]',\n '[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-primary-bg-pressed),0_0_0_2px_var(--action-focus-ring)]',\n ],\n destructive: [\n 'border border-action-destructive-border bg-action-destructive-bg text-text-on-solid',\n '[box-shadow:0_0_0_1px_var(--action-destructive-bg),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-hover:bg-action-destructive-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-destructive-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-focus:[box-shadow:0_0_0_1px_var(--action-destructive-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-action-destructive-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-destructive-bg-pressed)]',\n '[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-destructive-bg-pressed),0_0_0_2px_var(--action-focus-ring)]',\n ],\n inverse: [\n 'border border-action-inverse-border bg-action-inverse-bg text-text-on-inverse',\n '[box-shadow:0_0_0_1px_var(--action-inverse-bg),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-hover:bg-action-inverse-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--action-inverse-bg-hover),0_3px_6px_0_var(--action-primary-shadow)]',\n 'satin-focus:[box-shadow:0_0_0_1px_var(--action-inverse-bg),0_3px_6px_0_var(--action-primary-shadow),0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-action-inverse-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--action-inverse-bg-pressed)]',\n '[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--action-inverse-bg-pressed),0_0_0_2px_var(--action-focus-ring)]',\n ],\n // The outline is a 1px ring outside the box, like the filled variants' ring, so all of\n // them read the same height; the border underneath takes the fill.\n secondary: [\n 'border border-transparent bg-bg-popover text-text-default [&_svg]:text-text-muted',\n '[box-shadow:0_0_0_1px_var(--border-default),0_1px_2px_1px_var(--effect-shadow-xs)]',\n 'disabled:[box-shadow:0_0_0_1px_var(--border-strong)]',\n 'satin-hover:bg-action-secondary-bg-hover satin-hover:[box-shadow:0_0_0_1px_var(--border-strong),0_1px_2px_1px_var(--effect-shadow-xs)]',\n 'satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_1px_var(--border-strong),0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-action-secondary-bg-pressed satin-pressed:[box-shadow:0_0_0_1px_var(--border-strong)]',\n '[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_1px_var(--border-strong),0_0_0_2px_var(--action-focus-ring)]',\n ],\n tertiary: [\n 'bg-transparent text-text-default [&_svg]:text-text-muted',\n 'satin-hover:bg-bg-hover',\n 'satin-focus:bg-bg-hover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-border-input',\n '[&[aria-haspopup][aria-expanded=true]:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n ],\n },\n size: {\n xs: 'h-control-height-xs gap-1 px-2 text-sm [&_svg]:size-icon-size-sm',\n md: 'h-control-height gap-1.5 px-2.5 text-sm [&_svg]:size-icon-size',\n lg: 'h-control-height-lg gap-1.5 px-3 text-sm [&_svg]:size-icon-size',\n xl: 'h-control-height-xl gap-2 px-3 text-base [&_svg]:size-icon-size',\n },\n shape: {\n default: '',\n rounded: 'rounded-pill',\n },\n iconOnly: {\n true: 'px-0',\n false: '',\n },\n },\n compoundVariants: [\n // Default shape: the radius grows with the size (8 / 10 / 10 / 12).\n { shape: 'default', size: 'xs', className: 'rounded-md' },\n { shape: 'default', size: 'md', className: 'rounded-lg' },\n { shape: 'default', size: 'lg', className: 'rounded-lg' },\n { shape: 'default', size: 'xl', className: 'rounded-xl' },\n { iconOnly: true, size: 'xs', className: 'w-control-height-xs' },\n { iconOnly: true, size: 'md', className: 'w-control-height' },\n { iconOnly: true, size: 'lg', className: 'w-control-height-lg' },\n { iconOnly: true, size: 'xl', className: 'w-control-height-xl' },\n ],\n defaultVariants: { variant: 'primary', size: 'md', shape: 'default', iconOnly: false },\n },\n)\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>,\n VariantProps<typeof buttonVariants> {\n /** Render the child element (a link, say) with the button's styles instead of a `<button>`. */\n asChild?: boolean\n}\n\nexport function Button({ className, variant, size, shape, iconOnly, asChild = false, type, ...props }: ButtonProps) {\n const Comp = asChild ? Slot.Root : 'button'\n return (\n <Comp\n data-slot=\"button\"\n type={asChild ? undefined : (type ?? 'button')}\n className={cn(buttonVariants({ variant, size, shape, iconOnly }), className)}\n {...props}\n />\n )\n}\n\nexport { buttonVariants }\n"]}
@@ -0,0 +1,32 @@
1
+ import { cn } from './chunk-H63FYCMY.js';
2
+ import 'react';
3
+ import { HoverCard as HoverCard$1 } from 'radix-ui';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function HoverCard({
7
+ trigger,
8
+ children,
9
+ side = "bottom",
10
+ align = "start",
11
+ openDelay = 400,
12
+ closeDelay = 150,
13
+ open,
14
+ defaultOpen,
15
+ onOpenChange,
16
+ container,
17
+ className
18
+ }) {
19
+ return /* @__PURE__ */ jsxs(HoverCard$1.Root, { openDelay, closeDelay, open, defaultOpen, onOpenChange, children: [
20
+ /* @__PURE__ */ jsx(HoverCard$1.Trigger, { asChild: true, children: trigger }),
21
+ /* @__PURE__ */ jsx(HoverCard$1.Portal, { container, children: /* @__PURE__ */ jsx(HoverCard$1.Content, { side, align, sideOffset: 8, collisionPadding: 8, className: cn(hoverCardClass, className), children }) })
22
+ ] });
23
+ }
24
+ var hoverCardClass = cn(
25
+ "z-50 flex w-80 max-w-[calc(100vw-16px)] flex-col gap-3 rounded-xl border border-border-default bg-bg-popover p-4 outline-none",
26
+ "[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]",
27
+ "origin-(--radix-hover-card-content-transform-origin) data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]"
28
+ );
29
+
30
+ export { HoverCard, hoverCardClass };
31
+ //# sourceMappingURL=chunk-HRKPV66B.js.map
32
+ //# sourceMappingURL=chunk-HRKPV66B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/hover-card.tsx"],"names":["HoverCardPrimitive"],"mappings":";;;;;AAiCO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,KAAA,GAAQ,OAAA;AAAA,EACR,SAAA,GAAY,GAAA;AAAA,EACZ,UAAA,GAAa,GAAA;AAAA,EACb,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,uBACE,IAAA,CAACA,YAAmB,IAAA,EAAnB,EAAwB,WAAsB,UAAA,EAAwB,IAAA,EAAY,aAA0B,YAAA,EAC3G,QAAA,EAAA;AAAA,oBAAA,GAAA,CAACA,WAAA,CAAmB,OAAA,EAAnB,EAA2B,OAAA,EAAO,MAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBAC7C,GAAA,CAACA,YAAmB,MAAA,EAAnB,EAA0B,WACzB,QAAA,kBAAA,GAAA,CAACA,WAAA,CAAmB,SAAnB,EAA2B,IAAA,EAAY,OAAc,UAAA,EAAY,CAAA,EAAG,kBAAkB,CAAA,EAAG,SAAA,EAAW,GAAG,cAAA,EAAgB,SAAS,CAAA,EAC9H,QAAA,EACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,IAAM,cAAA,GAAiB,EAAA;AAAA,EAC5B,+HAAA;AAAA,EACA,8FAAA;AAAA,EACA;AACF","file":"chunk-HRKPV66B.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { HoverCard as HoverCardPrimitive } from 'radix-ui'\nimport { cn } from '../lib/utils'\n\n/**\n * HoverCard, 1:1 with the uiKit design (🆕 context menu & hover card): a preview of a person,\n * place or file over its link — the Popover surface (bg/popover, border/default, radius-xl, the\n * lg shadow), 320 wide, 16px in. It opens after the pointer rests 400 ms on the trigger (the\n * middle of NN/g's 0.3–0.5 s, so passing over a link doesn't flash it), stays while the pointer\n * moves into it, and closes 150 ms after it leaves both. Keyboard focus on the trigger opens it.\n *\n * Only for extra context the page works without: anything someone needs to act on belongs in a\n * Popover they open on purpose.\n */\nexport interface HoverCardProps {\n /** The link or name it previews. Rendered with `asChild`. */\n trigger: React.ReactNode\n children: React.ReactNode\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n /** ms the pointer rests before it opens. */\n openDelay?: number\n /** ms after the pointer leaves before it closes. */\n closeDelay?: number\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n container?: HTMLElement | null\n className?: string\n}\n\nexport function HoverCard({\n trigger,\n children,\n side = 'bottom',\n align = 'start',\n openDelay = 400,\n closeDelay = 150,\n open,\n defaultOpen,\n onOpenChange,\n container,\n className,\n}: HoverCardProps) {\n return (\n <HoverCardPrimitive.Root openDelay={openDelay} closeDelay={closeDelay} open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <HoverCardPrimitive.Trigger asChild>{trigger}</HoverCardPrimitive.Trigger>\n <HoverCardPrimitive.Portal container={container}>\n <HoverCardPrimitive.Content side={side} align={align} sideOffset={8} collisionPadding={8} className={cn(hoverCardClass, className)}>\n {children}\n </HoverCardPrimitive.Content>\n </HoverCardPrimitive.Portal>\n </HoverCardPrimitive.Root>\n )\n}\n\n/** The hover card's surface, for previews you place yourself. */\nexport const hoverCardClass = cn(\n 'z-50 flex w-80 max-w-[calc(100vw-16px)] flex-col gap-3 rounded-xl border border-border-default bg-bg-popover p-4 outline-none',\n '[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]',\n 'origin-(--radix-hover-card-content-transform-origin) data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n)\n"]}