@uisatin/ui 0.1.1 → 0.3.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 (311) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +20 -3
  3. package/chunk-3DHJXU45.js +147 -0
  4. package/{chunk-6YXUBP27.js → chunk-5725MFGQ.js} +72 -67
  5. package/{chunk-BKZBWPUH.js → chunk-57QEOCDZ.js} +9 -11
  6. package/{chunk-RTJ76X5U.js → chunk-5KTBSMQU.js} +2 -4
  7. package/{chunk-B2K45IUR.js → chunk-5XTUFBZI.js} +5 -7
  8. package/{chunk-LW3TRU5W.js → chunk-674SRBZK.js} +28 -16
  9. package/{chunk-XZNHT6MO.js → chunk-6VKV36OK.js} +115 -61
  10. package/{chunk-GICKPMJU.js → chunk-73Z7NMQQ.js} +31 -31
  11. package/chunk-7Q76HLRQ.js +128 -0
  12. package/{chunk-JPNWHWAQ.js → chunk-AIMQNLPY.js} +38 -35
  13. package/chunk-BN7FDKCJ.js +164 -0
  14. package/{chunk-3DINAQLL.js → chunk-BR2B4OIT.js} +33 -29
  15. package/{chunk-2HKBZFIK.js → chunk-CGOH5IYX.js} +31 -31
  16. package/chunk-CVNRZ2YV.js +112 -0
  17. package/{chunk-QUF2IPOZ.js → chunk-DPYIBFQD.js} +12 -14
  18. package/chunk-EF5GT4OG.js +87 -0
  19. package/chunk-FAJ3OVL4.js +37 -0
  20. package/{chunk-L6NCCSIP.js → chunk-FB5HTCO2.js} +36 -29
  21. package/chunk-GI2SMFZL.js +55 -0
  22. package/{chunk-B6V4VSGH.js → chunk-GMETYACH.js} +14 -15
  23. package/chunk-HK6WINL6.js +95 -0
  24. package/{chunk-HL42K2NH.js → chunk-IKO3GQFE.js} +17 -17
  25. package/{chunk-DO3TBNSC.js → chunk-ISYKZCPJ.js} +15 -17
  26. package/{chunk-YG7JOOLJ.js → chunk-J7RMFN54.js} +5 -7
  27. package/{chunk-SHDFUXYV.js → chunk-JBKBRAC4.js} +16 -18
  28. package/{chunk-LZMKSFCF.js → chunk-JCXI7VQL.js} +10 -12
  29. package/{chunk-NN6PKJWS.js → chunk-JYOZUQNU.js} +7 -9
  30. package/{chunk-LLHTVIM3.js → chunk-LB37KTJH.js} +7 -9
  31. package/{chunk-NSRTTYQ4.js → chunk-LB7Z6BSK.js} +42 -35
  32. package/{chunk-BNZVTLHV.js → chunk-LFGUJHFF.js} +25 -21
  33. package/{chunk-7TXHCRAG.js → chunk-M2HEVFQ3.js} +8 -10
  34. package/{chunk-SH6NG6VN.js → chunk-NH3EHMIL.js} +6 -8
  35. package/chunk-NL574STL.js +88 -0
  36. package/chunk-NQL6SIIB.js +168 -0
  37. package/chunk-O46O6LFQ.js +25 -0
  38. package/{chunk-YPNKBE5X.js → chunk-OURZQM27.js} +5 -7
  39. package/{chunk-XL75JRUA.js → chunk-OVKPPXK5.js} +42 -22
  40. package/chunk-PD6YPFYN.js +42 -0
  41. package/{chunk-XILQ7GXE.js → chunk-PHNR6ZQ7.js} +11 -13
  42. package/{chunk-BNTPPZCK.js → chunk-PUWSL5XW.js} +37 -39
  43. package/{chunk-A5XEM3GF.js → chunk-RHQHDYTE.js} +34 -36
  44. package/chunk-S7QHBVPX.js +45 -0
  45. package/{chunk-TX3H3QMA.js → chunk-SAYNV7B3.js} +71 -70
  46. package/{chunk-6QMSWITQ.js → chunk-SDOTDMYG.js} +24 -26
  47. package/{chunk-UGRSWP6U.js → chunk-SPGUZMCC.js} +10 -12
  48. package/chunk-SSOFFQ5T.js +74 -0
  49. package/{chunk-AN2RNJLR.js → chunk-SZJIVBOD.js} +16 -16
  50. package/chunk-T6L32XXH.js +107 -0
  51. package/{chunk-QS4N4MNP.js → chunk-TT2N5752.js} +18 -20
  52. package/{chunk-72OCFAPT.js → chunk-UCCNXGLG.js} +22 -21
  53. package/{chunk-KNUWZNFV.js → chunk-UGIVCXGN.js} +4 -6
  54. package/{chunk-H4NU7NPO.js → chunk-UUCVRIVP.js} +62 -61
  55. package/{chunk-P4O6TGDR.js → chunk-UZ4DXU6W.js} +28 -26
  56. package/{chunk-UBNHSZSE.js → chunk-VUOAPWTF.js} +10 -12
  57. package/{chunk-VAGIAREV.js → chunk-W472DBMT.js} +29 -26
  58. package/{chunk-X3PQANZO.js → chunk-W4RDTP6W.js} +47 -46
  59. package/{chunk-CL2II6BX.js → chunk-WLQD5BN2.js} +11 -13
  60. package/{chunk-FDKIX4DC.js → chunk-X2GNMNZQ.js} +7 -9
  61. package/{chunk-PF3YBUKT.js → chunk-X66KTATQ.js} +16 -15
  62. package/{chunk-J3NSDRVH.js → chunk-XETMIETJ.js} +0 -2
  63. package/chunk-XH56JGYC.js +71 -0
  64. package/{chunk-O7F3CIDV.js → chunk-XUOSJMEJ.js} +10 -12
  65. package/chunk-YJK4MGSI.js +86 -0
  66. package/{chunk-YX5VNRJX.js → chunk-YYFAZQ25.js} +0 -2
  67. package/chunk-Z7S2KQZS.js +177 -0
  68. package/chunk-ZBZ3ZQRB.js +195 -0
  69. package/{chunk-Y5AYU7PK.js → chunk-ZHFIWDGF.js} +0 -2
  70. package/components/accordion.js +2 -4
  71. package/components/agent-loading.d.ts +2 -0
  72. package/components/agent-loading.js +2 -4
  73. package/components/agent-picker.js +4 -5
  74. package/components/agent-suggestion.js +5 -6
  75. package/components/announcement-bar.js +6 -7
  76. package/components/attachment.js +4 -5
  77. package/components/avatar.d.ts +16 -0
  78. package/components/avatar.js +4 -6
  79. package/components/badge.js +2 -4
  80. package/components/banner-mesh.js +1 -3
  81. package/components/banner.js +4 -6
  82. package/components/bar-chart.js +10 -11
  83. package/components/breadcrumb.js +5 -6
  84. package/components/button.js +2 -4
  85. package/components/card.js +3 -5
  86. package/components/channel-chart.js +10 -11
  87. package/components/chart.js +9 -10
  88. package/components/checkbox.js +2 -4
  89. package/components/chip.js +2 -4
  90. package/components/citations.d.ts +6 -4
  91. package/components/citations.js +4 -5
  92. package/components/code-block.js +3 -5
  93. package/components/combobox.d.ts +12 -3
  94. package/components/combobox.js +9 -10
  95. package/components/command-menu.d.ts +6 -2
  96. package/components/command-menu.js +5 -6
  97. package/components/context-menu.d.ts +12 -5
  98. package/components/context-menu.js +5 -6
  99. package/components/cookie-consent.js +3 -5
  100. package/components/date-picker.d.ts +26 -14
  101. package/components/date-picker.js +8 -9
  102. package/components/decision-card.js +6 -7
  103. package/components/dialog.d.ts +5 -2
  104. package/components/dialog.js +4 -5
  105. package/components/donut-chart.js +10 -11
  106. package/components/dot.js +2 -4
  107. package/components/dropdown.d.ts +6 -1
  108. package/components/dropdown.js +4 -5
  109. package/components/empty-state.js +2 -4
  110. package/components/file-upload.js +6 -7
  111. package/components/floating.js +1 -3
  112. package/components/form-field.js +2 -4
  113. package/components/hover-card.d.ts +5 -2
  114. package/components/hover-card.js +2 -4
  115. package/components/input-otp.d.ts +4 -2
  116. package/components/input-otp.js +7 -8
  117. package/components/input.js +3 -5
  118. package/components/kbd.js +2 -4
  119. package/components/labels.d.ts +79 -0
  120. package/components/labels.js +1 -0
  121. package/components/line-chart.js +11 -12
  122. package/components/message-actions.js +4 -5
  123. package/components/message.js +7 -8
  124. package/components/number-input.d.ts +4 -2
  125. package/components/number-input.js +7 -8
  126. package/components/pagination.js +4 -6
  127. package/components/popover.d.ts +11 -5
  128. package/components/popover.js +3 -4
  129. package/components/progress.js +2 -4
  130. package/components/prompt-bar.js +5 -6
  131. package/components/radio.js +2 -4
  132. package/components/search-bar.js +3 -5
  133. package/components/segmented-control.d.ts +4 -2
  134. package/components/segmented-control.js +3 -5
  135. package/components/select.d.ts +10 -2
  136. package/components/select.js +6 -7
  137. package/components/sheet.d.ts +4 -2
  138. package/components/sheet.js +5 -6
  139. package/components/sidebar.js +2 -4
  140. package/components/skeleton.js +2 -4
  141. package/components/slider.d.ts +6 -2
  142. package/components/slider.js +7 -8
  143. package/components/sliding-indicator.js +1 -3
  144. package/components/streaming-text.js +2 -4
  145. package/components/switch.js +2 -4
  146. package/components/table.d.ts +16 -5
  147. package/components/table.js +4 -5
  148. package/components/tabs.d.ts +4 -2
  149. package/components/tabs.js +3 -5
  150. package/components/textarea.js +3 -5
  151. package/components/thinking.js +3 -5
  152. package/components/toast.js +4 -5
  153. package/components/toggle.js +2 -4
  154. package/components/tooltip.d.ts +5 -2
  155. package/components/tooltip.js +3 -5
  156. package/index.d.ts +1 -0
  157. package/index.js +67 -231
  158. package/lib/utils.d.ts +8 -1
  159. package/lib/utils.js +1 -3
  160. package/package.json +22 -1
  161. package/styles.css +1 -1
  162. package/theme/create-theme.d.ts +6 -2
  163. package/theme/index.js +1 -0
  164. package/chunk-2HKBZFIK.js.map +0 -1
  165. package/chunk-3DINAQLL.js.map +0 -1
  166. package/chunk-3ERGAHKA.js +0 -179
  167. package/chunk-3ERGAHKA.js.map +0 -1
  168. package/chunk-6C7CGJX2.js +0 -86
  169. package/chunk-6C7CGJX2.js.map +0 -1
  170. package/chunk-6QMSWITQ.js.map +0 -1
  171. package/chunk-6YXUBP27.js.map +0 -1
  172. package/chunk-72OCFAPT.js.map +0 -1
  173. package/chunk-7TXHCRAG.js.map +0 -1
  174. package/chunk-A5XEM3GF.js.map +0 -1
  175. package/chunk-AN2RNJLR.js.map +0 -1
  176. package/chunk-B2K45IUR.js.map +0 -1
  177. package/chunk-B6V4VSGH.js.map +0 -1
  178. package/chunk-BKZBWPUH.js.map +0 -1
  179. package/chunk-BNTPPZCK.js.map +0 -1
  180. package/chunk-BNZVTLHV.js.map +0 -1
  181. package/chunk-CL2II6BX.js.map +0 -1
  182. package/chunk-D7RZNTFC.js +0 -95
  183. package/chunk-D7RZNTFC.js.map +0 -1
  184. package/chunk-DETGJAIC.js +0 -147
  185. package/chunk-DETGJAIC.js.map +0 -1
  186. package/chunk-DO3TBNSC.js.map +0 -1
  187. package/chunk-ESC5JCVQ.js +0 -90
  188. package/chunk-ESC5JCVQ.js.map +0 -1
  189. package/chunk-FDKIX4DC.js.map +0 -1
  190. package/chunk-GICKPMJU.js.map +0 -1
  191. package/chunk-GQA24FYG.js +0 -57
  192. package/chunk-GQA24FYG.js.map +0 -1
  193. package/chunk-H4NU7NPO.js.map +0 -1
  194. package/chunk-H63FYCMY.js +0 -11
  195. package/chunk-H63FYCMY.js.map +0 -1
  196. package/chunk-HL42K2NH.js.map +0 -1
  197. package/chunk-HNQUX43Z.js +0 -109
  198. package/chunk-HNQUX43Z.js.map +0 -1
  199. package/chunk-HRKPV66B.js +0 -32
  200. package/chunk-HRKPV66B.js.map +0 -1
  201. package/chunk-J3NSDRVH.js.map +0 -1
  202. package/chunk-JPNWHWAQ.js.map +0 -1
  203. package/chunk-KNUWZNFV.js.map +0 -1
  204. package/chunk-L6NCCSIP.js.map +0 -1
  205. package/chunk-LLHTVIM3.js.map +0 -1
  206. package/chunk-LW3TRU5W.js.map +0 -1
  207. package/chunk-LZMKSFCF.js.map +0 -1
  208. package/chunk-MR3JDI7E.js +0 -122
  209. package/chunk-MR3JDI7E.js.map +0 -1
  210. package/chunk-NN6PKJWS.js.map +0 -1
  211. package/chunk-NSRTTYQ4.js.map +0 -1
  212. package/chunk-O7F3CIDV.js.map +0 -1
  213. package/chunk-P4O6TGDR.js.map +0 -1
  214. package/chunk-PF3YBUKT.js.map +0 -1
  215. package/chunk-PVOLDO4G.js +0 -47
  216. package/chunk-PVOLDO4G.js.map +0 -1
  217. package/chunk-QS4N4MNP.js.map +0 -1
  218. package/chunk-QUF2IPOZ.js.map +0 -1
  219. package/chunk-RTJ76X5U.js.map +0 -1
  220. package/chunk-SH6NG6VN.js.map +0 -1
  221. package/chunk-SHDFUXYV.js.map +0 -1
  222. package/chunk-TKO44NDI.js +0 -84
  223. package/chunk-TKO44NDI.js.map +0 -1
  224. package/chunk-TVLGZGYN.js +0 -59
  225. package/chunk-TVLGZGYN.js.map +0 -1
  226. package/chunk-TX3H3QMA.js.map +0 -1
  227. package/chunk-UBNHSZSE.js.map +0 -1
  228. package/chunk-UC3ZJWOD.js +0 -73
  229. package/chunk-UC3ZJWOD.js.map +0 -1
  230. package/chunk-UGRSWP6U.js.map +0 -1
  231. package/chunk-VAGIAREV.js.map +0 -1
  232. package/chunk-WTMZT3IT.js +0 -105
  233. package/chunk-WTMZT3IT.js.map +0 -1
  234. package/chunk-WX6BP5ZP.js +0 -39
  235. package/chunk-WX6BP5ZP.js.map +0 -1
  236. package/chunk-X3PQANZO.js.map +0 -1
  237. package/chunk-XILQ7GXE.js.map +0 -1
  238. package/chunk-XL75JRUA.js.map +0 -1
  239. package/chunk-XZNHT6MO.js.map +0 -1
  240. package/chunk-Y5AYU7PK.js.map +0 -1
  241. package/chunk-YG7JOOLJ.js.map +0 -1
  242. package/chunk-YPJYW624.js +0 -195
  243. package/chunk-YPJYW624.js.map +0 -1
  244. package/chunk-YPNKBE5X.js.map +0 -1
  245. package/chunk-YX5VNRJX.js.map +0 -1
  246. package/components/accordion.js.map +0 -1
  247. package/components/agent-loading.js.map +0 -1
  248. package/components/agent-picker.js.map +0 -1
  249. package/components/agent-suggestion.js.map +0 -1
  250. package/components/announcement-bar.js.map +0 -1
  251. package/components/attachment.js.map +0 -1
  252. package/components/avatar.js.map +0 -1
  253. package/components/badge.js.map +0 -1
  254. package/components/banner-mesh.js.map +0 -1
  255. package/components/banner.js.map +0 -1
  256. package/components/bar-chart.js.map +0 -1
  257. package/components/breadcrumb.js.map +0 -1
  258. package/components/button.js.map +0 -1
  259. package/components/card.js.map +0 -1
  260. package/components/channel-chart.js.map +0 -1
  261. package/components/chart.js.map +0 -1
  262. package/components/checkbox.js.map +0 -1
  263. package/components/chip.js.map +0 -1
  264. package/components/citations.js.map +0 -1
  265. package/components/code-block.js.map +0 -1
  266. package/components/combobox.js.map +0 -1
  267. package/components/command-menu.js.map +0 -1
  268. package/components/context-menu.js.map +0 -1
  269. package/components/cookie-consent.js.map +0 -1
  270. package/components/date-picker.js.map +0 -1
  271. package/components/decision-card.js.map +0 -1
  272. package/components/dialog.js.map +0 -1
  273. package/components/donut-chart.js.map +0 -1
  274. package/components/dot.js.map +0 -1
  275. package/components/dropdown.js.map +0 -1
  276. package/components/empty-state.js.map +0 -1
  277. package/components/file-upload.js.map +0 -1
  278. package/components/floating.js.map +0 -1
  279. package/components/form-field.js.map +0 -1
  280. package/components/hover-card.js.map +0 -1
  281. package/components/input-otp.js.map +0 -1
  282. package/components/input.js.map +0 -1
  283. package/components/kbd.js.map +0 -1
  284. package/components/line-chart.js.map +0 -1
  285. package/components/message-actions.js.map +0 -1
  286. package/components/message.js.map +0 -1
  287. package/components/number-input.js.map +0 -1
  288. package/components/pagination.js.map +0 -1
  289. package/components/popover.js.map +0 -1
  290. package/components/progress.js.map +0 -1
  291. package/components/prompt-bar.js.map +0 -1
  292. package/components/radio.js.map +0 -1
  293. package/components/search-bar.js.map +0 -1
  294. package/components/segmented-control.js.map +0 -1
  295. package/components/select.js.map +0 -1
  296. package/components/sheet.js.map +0 -1
  297. package/components/sidebar.js.map +0 -1
  298. package/components/skeleton.js.map +0 -1
  299. package/components/slider.js.map +0 -1
  300. package/components/sliding-indicator.js.map +0 -1
  301. package/components/streaming-text.js.map +0 -1
  302. package/components/switch.js.map +0 -1
  303. package/components/table.js.map +0 -1
  304. package/components/tabs.js.map +0 -1
  305. package/components/textarea.js.map +0 -1
  306. package/components/thinking.js.map +0 -1
  307. package/components/toast.js.map +0 -1
  308. package/components/toggle.js.map +0 -1
  309. package/components/tooltip.js.map +0 -1
  310. package/index.js.map +0 -1
  311. package/lib/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/select.tsx"],"names":["SelectPrimitive"],"mappings":"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","file":"chunk-72OCFAPT.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Select as SelectPrimitive } from 'radix-ui'\nimport { cn } from '../lib/utils'\nimport { MenuItemContent, menuGroupClass, menuGroupLabelClass, menuItemClass, menuSurfaceClass, type MenuItemContentProps } from './dropdown'\nimport { useFormField } from './form-field'\n\n/**\n * Select, 1:1 with the uiKit `Select` set (4022:3531): the field around it is Input's (a 13px\n * medium label 8px above, a 13px hint or error under it), the trigger is Input's skin with the\n * value and a 16px chevron (sm 28, md 32, lg 36; 12px in, 8px gaps), an optional 16px leading\n * icon (by default the picked option's own icon, when the options have icons). Placeholder is text/muted, a value text/default. While the list is open the trigger\n * keeps the focus border and ring.\n *\n * The list is the Dropdown menu: the same surface, rows, groups and options, so every option\n * takes what a `DropdownMenuItem` takes (icon, description, stacked or inline layout, 20px\n * icons, a shortcut) and the current one is marked with the check. It opens 4px under the\n * trigger, at least as wide.\n *\n * Built on the Radix Select: arrow keys, typeahead, Home/End, Escape, a native form value\n * (`name`), and focus back on the trigger. Inside a FormField, leave out `label`, `hint` and\n * `error`.\n */\nexport interface SelectOption extends Omit<MenuItemContentProps, 'label' | 'selected' | 'renderLabel' | 'layout' | 'iconSize'> {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface SelectGroup {\n label?: React.ReactNode\n options: SelectOption[]\n}\n\nexport interface SelectProps {\n /** Options, or titled groups of options. */\n options: SelectOption[] | SelectGroup[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n placeholder?: string\n label?: React.ReactNode\n hint?: React.ReactNode\n /** An error message (replaces the hint), or `true` to mark the field invalid without one. */\n error?: React.ReactNode | boolean\n size?: 'sm' | 'md' | 'lg'\n /** A 16px icon before the value. Left out, the picked option's own icon shows there. */\n leadingIcon?: React.ReactNode\n /** Row layout of every option: description under the label, or after it. */\n layout?: MenuItemContentProps['layout']\n /** Option icon size; 20 suits stacked two-line options. */\n iconSize?: MenuItemContentProps['iconSize']\n disabled?: boolean\n required?: boolean\n /** Form field name, for a native form submit. */\n name?: string\n id?: string\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Portal target. Defaults to `document.body`. */\n container?: HTMLElement | null\n 'aria-label'?: string\n /** Classes for the outer wrapper (label + field + hint). `className` styles the trigger. */\n wrapperClassName?: string\n className?: string\n /** Show a state without interacting, for state sheets. */\n 'data-force'?: 'hover' | 'focus'\n}\n\nexport const isOptionGroups = <T,>(o: T[] | { options: T[] }[]): o is { options: T[] }[] =>\n o.length > 0 && typeof o[0] === 'object' && o[0] !== null && 'options' in o[0]\n\n/** Ids and state for a field with a label, a hint or an error, inside or outside a FormField. */\nexport function useFieldChrome({\n id,\n disabled,\n error,\n hint,\n}: {\n id?: string\n disabled?: boolean\n error?: React.ReactNode | boolean\n hint?: React.ReactNode\n}) {\n const field = useFormField()\n const autoId = React.useId()\n const controlId = id ?? field?.id ?? autoId\n const isError = typeof error === 'string' || React.isValidElement(error)\n const message = isError ? (error as React.ReactNode) : hint\n const messageId = message ? `${controlId}-hint` : undefined\n return {\n controlId,\n disabled: disabled ?? field?.disabled ?? false,\n invalid: Boolean(error) || (field?.invalid ?? false),\n required: field?.required,\n describedBy: [field?.describedBy, messageId].filter(Boolean).join(' ') || undefined,\n message,\n messageId,\n isError,\n }\n}\n\n/** Label 8px above the control, hint or error 8px under it: Input's field, for Select and Combobox. */\nexport function FieldChrome({\n label,\n action,\n chrome,\n className,\n children,\n}: {\n label?: React.ReactNode\n /** On the label's line, at the field's right edge: the smallest button, e.g. Clear. */\n action?: React.ReactNode\n chrome: ReturnType<typeof useFieldChrome>\n className?: string\n children: React.ReactNode\n}) {\n return (\n <div className={cn('grid w-full gap-2', className)}>\n {label && (\n // The row keeps the label's 18px whatever the action, so the field never moves.\n <div className=\"flex h-[18px] items-center justify-between gap-2\">\n <label htmlFor={chrome.controlId} className=\"text-sm leading-[18px] font-medium text-text-default\">\n {label}\n </label>\n {action && <div className=\"-my-[3px] flex shrink-0 items-center\">{action}</div>}\n </div>\n )}\n {children}\n {chrome.message && (\n <p id={chrome.messageId} className={cn('text-sm', chrome.isError ? 'text-action-destructive-bg' : 'text-text-muted')}>\n {chrome.message}\n </p>\n )}\n </div>\n )\n}\n\n/** The trigger's chevron, 16px in the icon colour. */\nexport function SelectChevron({ className }: { className?: string }) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden className={cn('satin-field-icon text-text-muted', className)}>\n <path d=\"M4 6L8 10L12 6\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function Select({\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder = 'Select…',\n label,\n hint,\n error,\n size = 'md',\n leadingIcon,\n layout = 'inline',\n iconSize = 16,\n disabled,\n required,\n name,\n id,\n open,\n defaultOpen,\n onOpenChange,\n container,\n wrapperClassName,\n className,\n 'data-force': force,\n ...props\n}: SelectProps) {\n const chrome = useFieldChrome({ id, disabled, error, hint })\n\n // Figma's `filled` and the check: track the value, controlled or not.\n const [uncontrolled, setUncontrolled] = React.useState(defaultValue)\n const current = value ?? uncontrolled\n const groups: SelectGroup[] = isOptionGroups(options) ? (options as SelectGroup[]) : [{ options: options as SelectOption[] }]\n const lead = leadingIcon ?? groups.flatMap((g) => g.options).find((o) => o.value === current)?.icon\n\n return (\n <FieldChrome label={label} chrome={chrome} className={wrapperClassName}>\n <SelectPrimitive.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={(v) => {\n if (value == null) setUncontrolled(v)\n onValueChange?.(v)\n }}\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n disabled={chrome.disabled}\n required={required ?? chrome.required}\n name={name}\n >\n <SelectPrimitive.Trigger\n id={chrome.controlId}\n data-slot=\"select-trigger\"\n data-size={size}\n data-filled={current ? true : undefined}\n data-invalid={chrome.invalid || undefined}\n data-disabled={chrome.disabled || undefined}\n data-force={force}\n aria-invalid={chrome.invalid || undefined}\n aria-describedby={chrome.describedBy}\n aria-label={props['aria-label']}\n className={cn('satin-field satin-select', className)}\n >\n {lead && (\n <span className=\"satin-field-icon\" aria-hidden>\n {lead}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate text-text-default\">\n <SelectPrimitive.Value placeholder={<span className=\"text-text-muted\">{placeholder}</span>} />\n </span>\n <SelectPrimitive.Icon asChild>\n <SelectChevron />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Content\n data-slot=\"select-menu\"\n position=\"popper\"\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n className={cn(\n 'pointer-events-auto z-50 max-w-[520px] min-w-(--radix-select-trigger-width) overflow-hidden',\n 'max-h-(--radix-select-content-available-height)',\n menuSurfaceClass,\n 'origin-(--radix-select-content-transform-origin) outline-none',\n 'data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n )}\n >\n <SelectPrimitive.Viewport className=\"flex flex-col gap-1 p-1\">\n {groups.map((g, gi) => {\n const rows = g.options.map((o) => (\n <SelectPrimitive.Item\n key={o.value}\n value={o.value}\n disabled={o.disabled}\n textValue={o.label}\n data-slot=\"select-item\"\n className={cn(menuItemClass, 'data-[state=checked]:bg-bg-selected')}\n >\n <MenuItemContent\n label={o.label}\n description={o.description}\n icon={o.icon}\n iconSize={iconSize}\n layout={layout}\n shortcut={o.shortcut}\n selected={o.value === current}\n renderLabel={(l) => <SelectPrimitive.ItemText>{l}</SelectPrimitive.ItemText>}\n />\n </SelectPrimitive.Item>\n ))\n return groups.length > 1 || g.label ? (\n <SelectPrimitive.Group key={gi} className={menuGroupClass}>\n {g.label && <SelectPrimitive.Label className={menuGroupLabelClass}>{g.label}</SelectPrimitive.Label>}\n {rows}\n </SelectPrimitive.Group>\n ) : (\n <React.Fragment key={gi}>{rows}</React.Fragment>\n )\n })}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n </FieldChrome>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/progress.tsx"],"names":[],"mappings":";;;;AA4BA,IAAM,OAAA,GAAU,CAAC,KAAA,EAAe,GAAA,KAAgB,CAAA,EAAG,KAAK,KAAA,CAAO,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA,CAAA,CAAA;AAE3E,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,WAAA,GAAc,OAAA;AAAA,EACd,SAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,UAAgB,KAAA,CAAA,KAAA,EAAM;AAC5B,EAAA,MAAM,QAAQ,KAAA,IAAS,IAAA;AACvB,EAAA,MAAM,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,GAAI,MAAA;AAE3C,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,UAAA,EAAW,WAAA,EAAW,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA,EAAI,GAAG,KAAA,EACnG,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAU,SAAA,IAAa,KAAA,qBACvB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2DAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,mBACC,GAAA,CAAC,UAAK,EAAA,EAAI,OAAA,EAAS,WAAU,gDAAA,EAC1B,QAAA,EAAA,KAAA,EACH,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,MAEP,SAAA,IAAa,yBACZ,GAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAC,SAAA,EAAU,yCACzB,QAAA,EAAA,IAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEF,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,aAAA;AAAA,QACL,iBAAA,EAAiB,QAAQ,OAAA,GAAU,MAAA;AAAA,QACnC,YAAA,EAAY,QAAQ,MAAA,GAAY,SAAA;AAAA,QAChC,eAAA,EAAe,CAAA;AAAA,QACf,eAAA,EAAe,GAAA;AAAA,QACf,eAAA,EAAe,QAAQ,CAAA,GAAI,MAAA;AAAA,QAC3B,gBAAA,EAAgB,IAAA;AAAA,QAChB,WAAW,EAAA,CAAG,0DAAA,EAA4D,IAAA,KAAS,IAAA,GAAO,QAAQ,KAAK,CAAA;AAAA,QAEtG,QAAA,EAAA,KAAA,mBACC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,4FAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,GAAI,CAAA,GAAI,GAAA,GAAO,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA,SACxC,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2IAAA,EAA4I;AAAA;AAAA;AAE/J,GAAA,EACF,CAAA;AAEJ","file":"chunk-7TXHCRAG.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Progress, 1:1 with the uiKit `Progress` set (4025:3851): a bg/muted track, 4px (sm) or 8px\n * (md), fully rounded, with the done part in action/primary/bg. Above it, optionally, a label\n * row 8px up: the label (13px medium, text/default) on the left and the percentage (13px,\n * text/muted) on the right.\n *\n * Leave `value` out while the amount is unknown: a third of the track then slides across.\n * The bar moves to a new value over 300 ms on ease-out.\n *\n * A `progressbar` with aria-valuenow (and the label as its name) when there is a value.\n */\nexport interface ProgressProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n /** 0 to `max`; left out, the bar is indeterminate. */\n value?: number | null\n max?: number\n label?: React.ReactNode\n /** The percentage at the right of the label row. */\n showValue?: boolean\n size?: 'sm' | 'md'\n /** How the value reads on the right and to screen readers. Defaults to a whole percentage. */\n formatValue?: (value: number, max: number) => string\n}\n\nconst percent = (value: number, max: number) => `${Math.round((value / max) * 100)}%`\n\nexport function Progress({\n value,\n max = 100,\n label,\n showValue = true,\n size = 'sm',\n formatValue = percent,\n className,\n 'aria-label': ariaLabel,\n ...props\n}: ProgressProps) {\n const labelId = React.useId()\n const known = value != null\n const v = known ? Math.min(max, Math.max(0, value)) : 0\n const text = known ? formatValue(v, max) : undefined\n\n return (\n <div data-slot=\"progress\" data-size={size} className={cn('flex w-full flex-col gap-2', className)} {...props}>\n {(label || (showValue && known)) && (\n <div className=\"flex items-center justify-between gap-3 text-sm leading-5\">\n {label ? (\n <span id={labelId} className=\"min-w-0 truncate font-medium text-text-default\">\n {label}\n </span>\n ) : (\n <span />\n )}\n {showValue && known && (\n <span aria-hidden className=\"shrink-0 text-text-muted tabular-nums\">\n {text}\n </span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={known ? v : undefined}\n aria-valuetext={text}\n className={cn('relative w-full overflow-hidden rounded-full bg-bg-muted', size === 'md' ? 'h-2' : 'h-1')}\n >\n {known ? (\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-[width] duration-300 ease-(--ease-out)\"\n style={{ width: `${(v / max) * 100}%` }}\n />\n ) : (\n <div className=\"absolute inset-y-0 left-0 w-1/3 rounded-full bg-action-primary-bg animate-[satin-progress-indeterminate_1.4s_var(--ease-in-out)_infinite]\" />\n )}\n </div>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/code-block.tsx"],"names":[],"mappings":"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","file":"chunk-A5XEM3GF.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Check, Copy } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\n/**\n * CodeBlock, 1:1 with the uiKit `CodeBlock` set (3179:20414) and its `CodeLine` rows\n * (3124:20131): a card-surface block, 1px border-default, radius-2xl, 12px bottom padding.\n * The header holds the file icon, the filename (medium 13/18), diff stats in a diff, and a\n * tertiary xs Copy button that reads \"Copied\" with a check for 1.5 s. Lines are Geist Mono\n * 13/19.5, 24 high, 16px side padding, a 20px right-aligned number column 16px from the\n * code (8px, plus an 8px sign column, in a diff).\n *\n * Line types: highlighted (code/line-highlight fill), added (status green bg, green number\n * and +), removed (status red bg, red number and −).\n *\n * `code` is plain text. In `view=\"diff\"` each line starts with \"+\", \"-\" or a space, like a\n * unified diff. Highlighting is a small JS/TS tokenizer: keyword, string, function, parameter\n * and variable, in the `code/*` colours.\n *\n * The `code/*` variables exist only in Figma so far, not in theme.css, so each colour is\n * `var(--code-…, <Figma light value>)` with the Figma dark value under `dark:`. Once the\n * theme defines them, the variables take over.\n */\n\ntype LineKind = 'default' | 'highlighted' | 'added' | 'removed' | 'context'\ntype TokenKind = 'plain' | 'keyword' | 'string' | 'function' | 'parameter' | 'variable' | 'comment'\n\nconst tokenClass: Record<TokenKind, string> = {\n plain: 'text-[var(--code-plain,#18181b)] dark:text-[var(--code-plain,#fafafa)]',\n keyword: 'text-[var(--code-keyword,#dc2626)] dark:text-[var(--code-keyword,#f87171)]',\n string: 'text-[var(--code-string,#0369a1)] dark:text-[var(--code-string,#7dd3fc)]',\n function: 'text-[var(--code-function,#8b5cf6)] dark:text-[var(--code-function,#a78bfa)]',\n parameter: 'text-[var(--code-parameter,#b45309)] dark:text-[var(--code-parameter,#fcd34d)]',\n variable: 'text-[var(--code-variable,#0284c7)] dark:text-[var(--code-variable,#38bdf8)]',\n // No comment colour in Figma: comments take the line-number grey.\n comment: 'text-[var(--code-line-number,#a1a1aa)] dark:text-[var(--code-line-number,#71717a)]',\n}\n\nconst lineNumberClass = 'text-[var(--code-line-number,#a1a1aa)] dark:text-[var(--code-line-number,#71717a)]'\nconst highlightClass = 'bg-[var(--code-line-highlight,rgba(0,0,0,0.05))] dark:bg-[var(--code-line-highlight,rgba(255,255,255,0.06))]'\n\nconst KEYWORDS = new Set([\n 'import', 'from', 'export', 'default', 'async', 'await', 'function', 'return', 'const', 'let', 'var',\n 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'new', 'class', 'extends',\n 'try', 'catch', 'finally', 'throw', 'typeof', 'instanceof', 'in', 'of', 'type', 'interface', 'as',\n 'true', 'false', 'null', 'undefined', 'this', 'yield', 'void', 'delete', 'static', 'public', 'private',\n])\n\ntype Token = { text: string; kind: TokenKind }\n\n/** A deliberately small tokenizer for JS/TS-like code, one line at a time. */\nfunction tokenize(line: string): Token[] {\n const out: Token[] = []\n const re = /(\\/\\/.*$)|(\"(?:[^\"\\\\]|\\\\.)*\"?|'(?:[^'\\\\]|\\\\.)*'?|`(?:[^`\\\\]|\\\\.)*`?)|([A-Za-z_$][\\w$]*)|(=>|===|!==|==|=)|(\\s+)|(.)/g\n let declaring = false // after const / let / var, until \"=\"\n let params = false // inside a function's parameter list\n let depth = 0\n let afterFunction = false\n let m: RegExpExecArray | null\n while ((m = re.exec(line))) {\n const [text, comment, str, ident, op, space] = m\n if (comment) out.push({ text, kind: 'comment' })\n else if (str) out.push({ text, kind: 'string' })\n else if (space) out.push({ text, kind: 'plain' })\n else if (op) {\n if (op === '=') declaring = false\n out.push({ text, kind: 'keyword' })\n } else if (ident) {\n const rest = line.slice(re.lastIndex)\n if (KEYWORDS.has(ident)) {\n if (ident === 'const' || ident === 'let' || ident === 'var') declaring = true\n if (ident === 'function') afterFunction = true\n out.push({ text, kind: 'keyword' })\n } else if (params && /^\\s*[:,)=?]/.test(rest)) out.push({ text, kind: 'parameter' })\n else if (/^\\s*\\(/.test(rest) || /^[A-Z]/.test(ident)) {\n // Calls and PascalCase names (types, components) take the function colour, as in Figma.\n if (afterFunction) params = true\n afterFunction = false\n out.push({ text, kind: 'function' })\n } else if (declaring) out.push({ text, kind: 'variable' })\n else out.push({ text, kind: 'plain' })\n } else {\n if (params && text === '(') depth++\n if (params && text === ')' && --depth <= 0) params = false\n out.push({ text, kind: 'plain' })\n }\n }\n // Merge neighbours of the same kind so the DOM stays small.\n return out.reduce<Token[]>((acc, t) => {\n const last = acc[acc.length - 1]\n if (last && last.kind === t.kind) last.text += t.text\n else acc.push({ ...t })\n return acc\n }, [])\n}\n\ntype Line = { kind: LineKind; number: number; text: string }\n\nfunction parse(code: string, view: 'code' | 'diff', highlightLines: number[]): Line[] {\n const raw = code.replace(/\\n$/, '').split('\\n')\n if (view === 'code') {\n return raw.map((text, i) => ({\n text,\n number: i + 1,\n kind: highlightLines.includes(i + 1) ? 'highlighted' : 'default',\n }))\n }\n // Diff: a removed line shows the number the next line will take; added and context count up.\n let n = 1\n return raw.map((line) => {\n const sign = line[0]\n const text = line.slice(1)\n if (sign === '-') return { text, number: n, kind: 'removed' as const }\n if (sign === '+') return { text, number: n++, kind: 'added' as const }\n return { text: sign === ' ' ? text : line, number: n++, kind: 'context' as const }\n })\n}\n\n/** The file icon from Figma (fileCode, 16 at 1.25). */\nfunction FileCodeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden className=\"shrink-0 text-text-muted\">\n <path\n d=\"M13.333 5.333L9.333 1.333H4C3.264 1.333 2.667 1.93 2.667 2.667V13.333C2.667 14.07 3.264 14.667 4 14.667H12C12.736 14.667 13.333 14.07 13.333 13.333V5.333ZM9.333 1.333V5.333H13.333M6.667 8.333L5.333 9.667L6.667 11M9.333 8.333L10.667 9.667L9.333 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport interface CodeBlockProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n code: string\n filename?: string\n view?: 'code' | 'diff'\n showHeader?: boolean\n showActions?: boolean\n /** 1-based line numbers to mark (code view). */\n highlightLines?: number[]\n /** Turn syntax colours off for plain output such as logs. */\n highlight?: boolean\n}\n\nexport function CodeBlock({\n code,\n filename,\n view = 'code',\n showHeader = true,\n showActions = true,\n highlightLines = [],\n highlight = true,\n className,\n ...props\n}: CodeBlockProps) {\n const lines = React.useMemo(() => parse(code, view, highlightLines), [code, view, highlightLines])\n const [copied, setCopied] = React.useState(false)\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n React.useEffect(() => () => clearTimeout(timer.current), [])\n\n const added = lines.filter((l) => l.kind === 'added').length\n const removed = lines.filter((l) => l.kind === 'removed').length\n\n const copy = async () => {\n // A diff copies the new version of the file.\n const text = lines.filter((l) => l.kind !== 'removed').map((l) => l.text).join('\\n')\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), 1500)\n } catch {\n setCopied(false)\n }\n }\n\n const diff = view === 'diff'\n\n return (\n <div\n data-slot=\"code-block\"\n data-view={view}\n className={cn(\n 'flex flex-col overflow-hidden rounded-2xl border border-border-default bg-bg-card pb-3',\n className,\n )}\n {...props}\n >\n {showHeader && (\n <div className=\"flex items-center gap-2 pt-2 pr-2 pb-1 pl-4\">\n <FileCodeIcon />\n <span className=\"min-w-0 flex-1 truncate text-sm leading-[18px] font-medium text-text-default\">{filename}</span>\n {diff && (\n <span className=\"flex shrink-0 items-center gap-1.5 font-mono text-sm leading-(--text-sm--line-height) tracking-normal\">\n <span className=\"text-status-green-fg\">+{added}</span>\n <span className=\"text-status-red-fg\">−{removed}</span>\n </span>\n )}\n {showActions && (\n <Button variant=\"tertiary\" size=\"xs\" onClick={copy} className=\"text-text-default\">\n {copied ? <Check /> : <Copy />}\n <span aria-live=\"polite\">{copied ? 'Copied' : 'Copy'}</span>\n </Button>\n )}\n </div>\n )}\n {/* Long lines scroll sideways, so the code is a focusable region keyboard users can scroll. */}\n <pre\n tabIndex={0}\n role=\"region\"\n aria-label={filename ? `${filename} code` : 'Code'}\n className={cn(\n 'outline-none focus-visible:[box-shadow:inset_0_0_0_2px_var(--action-focus-ring)]',\n 'overflow-x-auto font-mono text-sm leading-(--text-sm--line-height) font-normal tracking-normal',\n // Without the header the code sits in the middle: 12px above, as below.\n showHeader ? 'pt-1' : 'pt-3',\n tokenClass.plain,\n )}\n >\n <code className=\"block w-max min-w-full\">\n {lines.map((line, i) => (\n <span\n key={i}\n data-line={line.kind}\n className={cn(\n 'flex h-6 items-center px-4',\n diff ? 'gap-2' : 'gap-4',\n line.kind === 'highlighted' && highlightClass,\n line.kind === 'added' && 'bg-status-green-bg',\n line.kind === 'removed' && 'bg-status-red-bg',\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'w-5 shrink-0 text-right select-none',\n line.kind === 'added' ? 'text-status-green-fg' : line.kind === 'removed' ? 'text-status-red-fg' : lineNumberClass,\n )}\n >\n {line.number}\n </span>\n {diff && (\n <span\n className={cn(\n 'w-2 shrink-0 text-center select-none',\n line.kind === 'added' ? 'text-status-green-fg' : line.kind === 'removed' ? 'text-status-red-fg' : lineNumberClass,\n )}\n >\n {line.kind === 'added' ? '+' : line.kind === 'removed' ? '−' : ' '}\n {/* Screen readers hear the change, not the glyph. */}\n {line.kind === 'added' && <span className=\"sr-only\"> added</span>}\n {line.kind === 'removed' && <span className=\"sr-only\"> removed</span>}\n </span>\n )}\n <span className=\"whitespace-pre\">\n {line.text === ''\n ? '​'\n : highlight\n ? tokenize(line.text).map((t, j) => (\n <span key={j} className={t.kind === 'plain' ? undefined : tokenClass[t.kind]}>\n {t.text}\n </span>\n ))\n : line.text}\n </span>\n </span>\n ))}\n </code>\n </pre>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/message-actions.tsx"],"names":[],"mappings":"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","file":"chunk-AN2RNJLR.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Clock, Copy, DoubleCheck, Link, ThumbsDown, ThumbsUp } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\n/**\n * MessageActions, 1:1 with uiKit `_chat/answerActions` (901:20164): the row under an assistant\n * reply. Delivery status (16px icon in a 24px box) and time in text/muted medium 13, then like,\n * dislike and copy as 24px tertiary icon buttons 2px apart, then Share (tertiary xs with a\n * label). Groups sit 8px apart with 1 × 12 border/default dividers between them.\n *\n * Feedback: a clicked thumb stays pressed (border/input fill, icon text/subtle) until the other\n * one is clicked or it is clicked again; `feedback` sets it, `onFeedback` reports it.\n * The status and time show only when there is a `timestamp`.\n */\nexport type MessageFeedback = 'like' | 'dislike' | null\n\nexport interface MessageActionsProps extends React.ComponentProps<'div'> {\n /** \"20 minutes ago\". Leave it out to drop the status and time. */\n timestamp?: string\n status?: 'sending' | 'delivered'\n /** The pressed thumb. Pass it with onFeedback to control it, or once to start from it. */\n feedback?: MessageFeedback\n showShare?: boolean\n onFeedback?: (value: MessageFeedback) => void\n onCopy?: () => void\n onShare?: () => void\n}\n\nconst divider = <span aria-hidden className=\"h-3 w-px shrink-0 rounded-full bg-border-default\" />\n\nexport function MessageActions({\n timestamp,\n status = 'delivered',\n feedback: feedbackProp = null,\n showShare = true,\n onFeedback,\n onCopy,\n onShare,\n className,\n ...props\n}: MessageActionsProps) {\n const [feedback, setFeedback] = React.useState<MessageFeedback>(feedbackProp)\n React.useEffect(() => setFeedback(feedbackProp), [feedbackProp])\n\n const toggle = (value: 'like' | 'dislike') => {\n const next = feedback === value ? null : value\n setFeedback(next)\n onFeedback?.(next)\n }\n\n const thumb = 'aria-pressed:bg-border-input aria-pressed:[&_svg]:text-text-subtle'\n\n return (\n <div data-slot=\"message-actions\" className={cn('flex items-center gap-2', className)} {...props}>\n {timestamp && (\n <>\n <span className=\"flex items-center gap-0.5\">\n <span className=\"flex size-6 items-center justify-center text-text-muted\">\n {status === 'sending' ? (\n <Clock aria-hidden className=\"size-icon-size [stroke-width:1.875]\" />\n ) : (\n <DoubleCheck aria-hidden className=\"size-icon-size [stroke-width:1.875]\" />\n )}\n <span className=\"sr-only\">{status === 'sending' ? 'Sending' : 'Delivered'}</span>\n </span>\n <span className=\"text-sm font-medium whitespace-nowrap text-text-muted\">{timestamp}</span>\n </span>\n {divider}\n </>\n )}\n <span className=\"flex items-center gap-0.5\">\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n iconOnly\n aria-label=\"Good response\"\n aria-pressed={feedback === 'like'}\n onClick={() => toggle('like')}\n className={thumb}\n >\n <ThumbsUp />\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n iconOnly\n aria-label=\"Bad response\"\n aria-pressed={feedback === 'dislike'}\n onClick={() => toggle('dislike')}\n className={thumb}\n >\n <ThumbsDown />\n </Button>\n <Button variant=\"tertiary\" size=\"xs\" iconOnly aria-label=\"Copy\" onClick={onCopy}>\n <Copy />\n </Button>\n </span>\n {showShare && (\n <>\n {divider}\n <Button variant=\"tertiary\" size=\"xs\" onClick={onShare}>\n <Link />\n Share\n </Button>\n </>\n )}\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/dot.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,WAAA,GAAc,GAAA;AAAA,EAClB,2BAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAExC;AAQO,SAAS,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,GAAO,WAAW,OAAA,EAAS,KAAA,EAAO,GAAG,KAAA,EAAM,EAAa;AACvF,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,MACtB,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAa,QAAQ,MAAA,GAAY,IAAA;AAAA,MACjC,SAAA,EAAW,EAAA,CAAG,yDAAA,EAA2D,SAAS,CAAA;AAAA,MACjF,GAAG,KAAA;AAAA,MAEJ,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAY,EAAE,OAAA,EAAS,CAAA,EAAG;AAAA;AAAA,GAC7C;AAEJ","file":"chunk-B2K45IUR.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\nexport type DotTone = 'fuchsia' | 'sky' | 'plum' | 'green'\n\n/**\n * Dot, 1:1 with the uiKit `Dot` set (369:6759, page dotIndicator): a 16px box with an 8px\n * indicator in the middle, in the tone's `tone/fg` colour. Solid is a filled circle; outline\n * is the same 8px circle drawn with a 1px stroke inside it, nothing in the middle.\n *\n * With a `label` the dot is an image with that name; without one it is decorative and hidden\n * from assistive tech (pair it with visible text, as the docs ask).\n */\nconst dotVariants = cva(\n 'block size-2 rounded-full',\n {\n variants: {\n variant: {\n solid: 'bg-tone-fg',\n outline: 'border border-tone-fg',\n },\n },\n defaultVariants: { variant: 'solid' },\n },\n)\n\nexport interface DotProps extends Omit<React.ComponentProps<'span'>, 'children'>, VariantProps<typeof dotVariants> {\n tone?: DotTone\n /** Accessible name, e.g. \"Running\". Leave it out when visible text already says it. */\n label?: string\n}\n\nexport function Dot({ className, tone = 'fuchsia', variant, label, ...props }: DotProps) {\n return (\n <span\n data-slot=\"dot\"\n data-tone={tone}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn('inline-flex size-4 shrink-0 items-center justify-center', className)}\n {...props}\n >\n <span className={dotVariants({ variant })} />\n </span>\n )\n}\n\nexport { dotVariants }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/tooltip.tsx"],"names":["TooltipPrimitive"],"mappings":";;;;;;AAyCO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmG;AACjG,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,2IAAA;AAAA,QACA,0IAAA;AAAA,QACA,KAAA,KAAU,YAAY,cAAA,GAAiB,YAAA;AAAA,QACvC,WAAW,QAAA,GAAW,QAAA;AAAA,QACtB;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACZ,4BAAY,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,QAAA,EAAU,MAAK,SAAA,EAAU;AAAA;AAAA;AAAA,GACxD;AAEJ;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,GAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,QAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AAEf,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,WAAW,CAAA;AACpD,EAAA,MAAM,OAAO,QAAA,IAAY,KAAA;AACzB,EAAA,MAAM,KAAA,GAAc,aAAsC,MAAS,CAAA;AACnE,EAAM,KAAA,CAAA,SAAA,CAAU,MAAM,MAAM,YAAA,CAAa,MAAM,OAAO,CAAA,EAAG,EAAE,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAkB;AAChC,IAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,IAAI,CAAC,QAAQ,UAAA,GAAa,CAAA,QAAS,OAAA,GAAU,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,SACpE,KAAA,EAAM;AAAA,EACb,CAAA;AACA,EAAA,uBACE,GAAA,CAACA,SAAA,CAAiB,QAAA,EAAjB,EAA0B,aAAA,EAAe,KAAA,EACxC,QAAA,kBAAA,IAAA,CAACA,SAAA,CAAiB,IAAA,EAAjB,EAAsB,IAAA,EAAY,YAAA,EAAc,MAAA,EAC/C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAACA,SAAA,CAAiB,OAAA,EAAjB,EAAyB,OAAA,EAAO,MAAE,QAAA,EAAS,CAAA;AAAA,oBAC5C,GAAA,CAACA,SAAA,CAAiB,MAAA,EAAjB,EAAwB,SAAA,EACvB,QAAA,kBAAA,GAAA;AAAA,MAACA,SAAA,CAAiB,OAAA;AAAA,MAAjB;AAAA,QACC,IAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,gBAAA,EAAkB,CAAA;AAAA,QAClB,SAAA,EAAW,EAAA;AAAA,UACT,kFAAA;AAAA,UACA,oBAAA;AAAA,UACA,mFAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,QAAA,EAAoB,OAAc,SAAA,EAAsB;AAAA;AAAA,KACvF,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-B6V4VSGH.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Tooltip as TooltipPrimitive } from 'radix-ui'\nimport { cn } from '../lib/utils'\nimport { KbdGroup } from './kbd'\n\n/**\n * Tooltip, 1:1 with the uiKit `tooltip/shortcut` set (3306:17555): an inverse pill\n * (text/default fill, bg/canvas text, medium 13/19.5) with the action name and optional\n * keys: a KbdGroup of sm keys in the inverse tone, so they read on the dark pill in Light and\n * the light one in Dark. Padding 4 / 6 / 4 / 10, 8px between\n * label and keys. Shape default is radius-lg; rounded is a pill. Shadow md (0 8 12 shadow-md, 0 1 1.5 shadow-ambient) and the\n * 1px top highlight. Without a shortcut the right padding matches the left (10).\n *\n * Built on the Radix tooltip: it opens on hover after `delay` and at once on keyboard focus,\n * waits `closeDelay` after the pointer leaves before closing, closes on Escape, and links itself to the trigger with aria-describedby. It sits 8px from\n * the trigger and fades in from 4px towards it (`@starting-style`, ease-out, 150 ms).\n */\n\nexport interface TooltipProps {\n /** The action, in one or two words. */\n label: React.ReactNode\n /** Keys that run the action, e.g. \"⌘K\" or \"⌃⇧V\". */\n shortcut?: string\n shape?: 'default' | 'rounded'\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Hover delay in ms before it opens. */\n delay?: number\n /** How long it stays after the pointer leaves, in ms, so a quick slip off the trigger doesn't flicker it. */\n closeDelay?: number\n /** The trigger. It must be focusable (a button, a link). */\n children: React.ReactNode\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Portal target. Defaults to `document.body`. */\n container?: HTMLElement | null\n className?: string\n}\n\nexport function TooltipBubble({\n label,\n shortcut,\n shape = 'default',\n className,\n ...props\n}: Pick<TooltipProps, 'label' | 'shortcut' | 'shape' | 'className'> & React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"tooltip\"\n className={cn(\n 'flex items-center gap-2 bg-text-default py-1 pl-2.5 text-sm leading-(--text-sm--line-height) font-medium whitespace-nowrap text-bg-canvas',\n '[box-shadow:0_8px_12px_0_var(--effect-shadow-md),0_1px_1.5px_0_var(--effect-shadow-ambient),inset_0_1px_0_0_var(--effect-highlight-top)]',\n shape === 'rounded' ? 'rounded-pill' : 'rounded-lg',\n shortcut ? 'pr-1.5' : 'pr-2.5',\n className,\n )}\n {...props}\n >\n <span>{label}</span>\n {shortcut && <KbdGroup keys={shortcut} tone=\"inverse\" />}\n </div>\n )\n}\n\nexport function Tooltip({\n label,\n shortcut,\n shape = 'default',\n side = 'top',\n delay = 300,\n closeDelay = 0,\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n container,\n className,\n}: TooltipProps) {\n // Open state lives here so closing can wait `closeDelay`; opening again cancels the wait.\n const [inner, setInner] = React.useState(defaultOpen)\n const open = openProp ?? inner\n const timer = React.useRef<ReturnType<typeof setTimeout>>(undefined)\n React.useEffect(() => () => clearTimeout(timer.current), [])\n const change = (next: boolean) => {\n clearTimeout(timer.current)\n const apply = () => {\n setInner(next)\n onOpenChange?.(next)\n }\n if (!next && closeDelay > 0) timer.current = setTimeout(apply, closeDelay)\n else apply()\n }\n return (\n <TooltipPrimitive.Provider delayDuration={delay}>\n <TooltipPrimitive.Root open={open} onOpenChange={change}>\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Content\n side={side}\n sideOffset={8}\n collisionPadding={8}\n className={cn(\n 'z-50 transition-[opacity,translate] duration-(--duration-fast) ease-(--ease-out)',\n 'starting:opacity-0',\n 'data-[side=top]:starting:translate-y-1 data-[side=bottom]:starting:-translate-y-1',\n 'data-[side=left]:starting:translate-x-1 data-[side=right]:starting:-translate-x-1',\n )}\n >\n <TooltipBubble label={label} shortcut={shortcut} shape={shape} className={className} />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/kbd.tsx"],"names":[],"mappings":"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","file":"chunk-BKZBWPUH.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Kbd, 1:1 with the uiKit `Kbd` set (4021:3415): one keyboard key. sm is 18px high with 4px\n * sides, md 20px with 6px; a single character or glyph makes it an exact square, radius-sm, a 0.75px border/default edge on\n * component/kbd/bg (bg/card in Light, bg/muted in Dark), the 11px medium Keycap glyph in\n * text/muted. Put keys of one shortcut 2px apart, or pass `keys` and let `KbdGroup` do it.\n *\n * `tone=\"inverse\"` is for keys on an inverse surface (a tooltip): a darker key on the dark pill\n * in Light, a lighter one on the light pill in Dark.\n */\nexport interface KbdProps extends React.ComponentProps<'kbd'> {\n size?: 'sm' | 'md'\n tone?: 'default' | 'inverse'\n}\n\n/** One character or one glyph icon: the key is a square. */\nconst isSingle = (children: React.ReactNode) =>\n typeof children === 'string' ? [...children.trim()].length === 1 : React.isValidElement(children)\n\nexport function Kbd({ size = 'sm', tone = 'default', className, children, ...props }: KbdProps) {\n const square = isSingle(children)\n return (\n <kbd\n data-slot=\"kbd\"\n data-square={square || undefined}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-sm border-[0.75px] font-sans text-2xs leading-none font-medium tracking-normal whitespace-nowrap',\n size === 'sm' ? 'h-[18px] min-w-[18px]' : 'h-5 min-w-5',\n // A single key is exactly square with nothing on the sides, so the glyph sits in the middle.\n square ? (size === 'sm' ? 'w-[18px] px-0' : 'w-5 px-0') : size === 'sm' ? 'px-1' : 'px-1.5',\n tone === 'default'\n ? 'border-border-default bg-component-kbd-bg text-text-muted'\n : 'border-action-inverse-border bg-action-inverse-bg-hover text-bg-canvas/72 dark:border-action-inverse-bg-pressed dark:bg-text-default',\n // Glyph icons (arrows, return) take the key's colour at 10px.\n '[&>svg]:size-2.5 [&>svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n )\n}\n\n/**\n * Splits a shortcut into keys: modifier glyphs one by one, the rest as one key (\"Esc\", \"K\").\n * Spaces or \"+\" split it explicitly (\"Ctrl + K\").\n */\nexport function keysOf(shortcut: string) {\n if (/[\\s+]/.test(shortcut.trim())) return shortcut.split(/[\\s+]+/).filter(Boolean)\n const keys: string[] = []\n let rest = ''\n for (const ch of shortcut) {\n if ('⌘⌃⇧⌥'.includes(ch)) keys.push(ch)\n else rest += ch\n }\n if (rest.trim()) keys.push(rest.trim())\n return keys\n}\n\nexport interface KbdGroupProps extends Omit<React.ComponentProps<'span'>, 'children'> {\n /** A shortcut such as \"⌘K\" or \"⌃⇧V\", split into keys, or the keys themselves. */\n keys: string | React.ReactNode[]\n size?: KbdProps['size']\n tone?: KbdProps['tone']\n}\n\n/** The keys of one shortcut, 2px apart. */\nexport function KbdGroup({ keys, size, tone, className, ...props }: KbdGroupProps) {\n const list = typeof keys === 'string' ? keysOf(keys) : keys\n return (\n <span data-slot=\"kbd-group\" className={cn('inline-flex shrink-0 items-center gap-0.5', className)} {...props}>\n {list.map((k, i) => (\n <Kbd key={i} size={size} tone={tone}>\n {k}\n </Kbd>\n ))}\n </span>\n )\n}\n\n/* ---------- glyphs for keys that have no character ---------- */\n\nconst glyph = { viewBox: '0 0 10 10', fill: 'none', stroke: 'currentColor', strokeWidth: 0.75, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true } as const\n\nexport const KbdArrowUp = () => (\n <svg {...glyph}>\n <path d=\"M5.00018 8.17963L5.00018 1.82037M8.00316 4.82335L5.00018 1.82037L1.9972 4.82335\" />\n </svg>\n)\nexport const KbdArrowDown = () => (\n <svg {...glyph}>\n <path d=\"M4.99982 1.82037L4.99982 8.17963M1.99684 5.17665L4.99982 8.17963L8.0028 5.17665\" />\n </svg>\n)\nexport const KbdReturn = () => (\n <svg {...glyph}>\n <path d=\"M4.27083 8.02083L2.8125 6.5625L4.27083 5.10417\" />\n <path d=\"M2.8125 6.5625H5.3125C6.23296 6.5625 6.97917 5.81629 6.97917 4.89583V1.97917\" />\n </svg>\n)\n\nexport interface KbdHintProps extends Omit<React.ComponentProps<'span'>, 'children'> {\n keys: React.ReactNode[]\n label: React.ReactNode\n}\n\n/** A key hint for a menu footer: keys, then what they do in 12px text/muted, 6px apart. */\nexport function KbdHint({ keys, label, className, ...props }: KbdHintProps) {\n return (\n <span data-slot=\"kbd-hint\" className={cn('flex items-center gap-1.5', className)} {...props}>\n <KbdGroup keys={keys} />\n <span className=\"text-xs leading-4 tracking-normal whitespace-nowrap text-text-muted\">{label}</span>\n </span>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/sidebar.tsx"],"names":[],"mappings":"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","file":"chunk-BNTPPZCK.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Collapsible, Slot, Tooltip } from 'radix-ui'\nimport { NavArrowRight } from 'iconoir-react'\nimport { cn } from '../lib/utils'\n\n/**\n * Sidebar, 1:1 with the uiKit sidebar sets: `sidebar/navigation` (0:3358), `sidebar/groupHeader`\n * (3468:18403) and `sidebar/subItem` (3468:18360).\n *\n * - `SidebarItem` is a 32px link row: 14px icon, medium 13/16 label in text/muted, radius-lg,\n * 8px padding. Hover fills bg/muted; the current page fills border/input and turns the label\n * and icon text/default. `count` adds a red 16px counter; `iconOnly` is the 32 × 32 rail with\n * the label in a tooltip.\n * - `SidebarGroup` is a collapsible group: the header row (12px padding, icon, label in\n * text/default, a plain count, chevron right → down) and its `SidebarSubItem`s.\n * - `SidebarSubItem` is a regular 13px row whose text starts in line with the group label\n * (34px in). Hover bg/muted, active bg/selected, disabled 50%.\n * - `SidebarSubGroup` is a sub-item that holds sub-items of its own (Chart → Bar chart,\n * Channel chart): the same row with a chevron on the right, folding open and shut like the\n * group (satin-expand, the chevron turning right → down). Its sub-items start 12px further\n * in (46px). It opens on its own when one of them is the current page, and its label turns\n * text/default while it holds the current page.\n *\n * Rows sit 2px apart. Focus draws the 1px border/focus outline Figma shows on the focus\n * variants, inset so the row doesn't move. Every state also answers to `data-force`.\n */\n\nconst rowFocus =\n 'outline-none satin-focus:[box-shadow:inset_0_0_0_1px_var(--border-focus)]'\n\nexport interface SidebarProps extends React.ComponentProps<'nav'> {}\n\n/** The navigation landmark. Name it with `aria-label` when a page has more than one nav. */\nexport function Sidebar({ className, ...props }: SidebarProps) {\n return <nav data-slot=\"sidebar\" className={cn('flex flex-col gap-0.5', className)} {...props} />\n}\n\nexport interface SidebarItemProps extends Omit<React.ComponentProps<'a'>, 'children'> {\n label: string\n icon?: React.ReactNode\n /** The current page. Sets `aria-current=\"page\"`. */\n active?: boolean\n /** Unread or pending work. Hidden at 0. */\n count?: number\n /** The collapsed rail: icon only, label in a tooltip. */\n iconOnly?: boolean\n disabled?: boolean\n /** Render your router's link instead of `<a>`. */\n asChild?: boolean\n children?: React.ReactNode\n}\n\nexport function SidebarItem({\n className,\n label,\n icon,\n active = false,\n count,\n iconOnly = false,\n disabled = false,\n asChild = false,\n href,\n children,\n ...props\n}: SidebarItemProps) {\n const Comp = asChild ? Slot.Root : 'a'\n const showCount = typeof count === 'number' && count > 0\n\n const row = (\n <Comp\n data-slot=\"sidebar-item\"\n data-active={active || undefined}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n aria-label={iconOnly ? (showCount ? `${label}, ${count}` : label) : undefined}\n href={disabled ? undefined : href}\n tabIndex={disabled ? -1 : undefined}\n className={cn(\n 'flex h-8 shrink-0 items-center gap-2 rounded-lg px-2 text-sm leading-4 font-medium tracking-normal text-text-muted no-underline select-none',\n 'transition-[background-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n '[&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n 'not-data-active:satin-hover:bg-bg-muted',\n rowFocus,\n 'data-active:bg-border-input data-active:text-text-default',\n 'aria-disabled:pointer-events-none aria-disabled:opacity-50',\n iconOnly && 'relative size-8 justify-center px-0',\n className,\n )}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {icon}\n {!iconOnly && <span className=\"min-w-0 flex-1 truncate\">{label}</span>}\n {showCount && !iconOnly && <SidebarCount count={count} />}\n {showCount && iconOnly && (\n <span aria-hidden className=\"absolute top-1 right-1 size-1.5 rounded-full bg-action-destructive-bg\" />\n )}\n </>\n )}\n </Comp>\n )\n\n if (!iconOnly) return row\n return (\n <Tooltip.Provider delayDuration={300}>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>{row}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"right\"\n sideOffset={6}\n collisionPadding={8}\n className=\"z-50 rounded-md bg-action-inverse-bg px-2 py-1 text-xs font-medium text-text-on-inverse [box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]\"\n >\n {label}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n )\n}\n\n/** The red counter from sidebar/navigation: 16 high, 18 wide at least, radius-xs. */\nfunction SidebarCount({ count }: { count: number }) {\n return (\n // 11/12 has no type token in the kit; Figma uses it raw for this counter.\n <span className=\"inline-flex h-4 min-w-[18px] shrink-0 items-center justify-center rounded-xs bg-action-destructive-bg px-1 text-[11px] leading-3 font-medium tracking-normal text-text-on-solid tabular-nums\">\n {count > 99 ? '99+' : count}\n </span>\n )\n}\n\nexport interface SidebarGroupProps\n extends Omit<React.ComponentProps<typeof Collapsible.Root>, 'children'> {\n label: string\n icon?: React.ReactNode\n /** How many items the group holds. */\n count?: number\n children?: React.ReactNode\n /** Forwarded to the header button, e.g. `data-force=\"hover\"` on a state sheet. */\n triggerProps?: React.ComponentProps<'button'> & { 'data-force'?: string }\n}\n\nexport function SidebarGroup({\n className,\n label,\n icon,\n count,\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n children,\n triggerProps,\n ...props\n}: SidebarGroupProps) {\n // The group keeps its own open state and region, not Radix's Content: Content measures itself\n // with transitions switched off on every toggle, which would cut the fold (satin-expand).\n const [uncontrolled, setUncontrolled] = React.useState(defaultOpen)\n const open = openProp ?? uncontrolled\n const regionId = React.useId()\n return (\n <Collapsible.Root\n data-slot=\"sidebar-group\"\n open={open}\n onOpenChange={(next) => {\n if (openProp == null) setUncontrolled(next)\n onOpenChange?.(next)\n }}\n className={cn('group/sidebar-group flex flex-col gap-0.5', className)}\n {...props}\n >\n <Collapsible.Trigger\n aria-controls={regionId}\n {...triggerProps}\n className={cn(\n 'flex h-8 w-full shrink-0 items-center gap-2 rounded-lg px-3 text-left text-text-muted',\n 'transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n '[&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n 'not-data-active:satin-hover:bg-bg-muted',\n rowFocus,\n triggerProps?.className,\n )}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate text-sm leading-4 font-medium tracking-normal text-text-default\">\n {label}\n </span>\n {typeof count === 'number' && (\n <span className=\"shrink-0 px-1.5 py-0.5 text-sm leading-4 font-medium tracking-normal text-tone-fg tabular-nums\">\n {count}\n </span>\n )}\n <NavArrowRight\n aria-hidden\n className=\"transition-transform duration-(--duration-base) ease-(--ease-out) group-data-[state=open]/sidebar-group:rotate-90 motion-reduce:transition-none\"\n />\n </Collapsible.Trigger>\n {/* Always mounted so it can fold away: grows downwards from under the header (motion.css). */}\n <div id={regionId} data-state={open ? 'open' : 'closed'} className=\"satin-expand\">\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n </Collapsible.Root>\n )\n}\n\nexport interface SidebarSubItemProps extends Omit<React.ComponentProps<'a'>, 'children'> {\n label: string\n active?: boolean\n disabled?: boolean\n asChild?: boolean\n children?: React.ReactNode\n}\n\nexport function SidebarSubItem({\n className,\n label,\n active = false,\n disabled = false,\n asChild = false,\n href,\n children,\n ...props\n}: SidebarSubItemProps) {\n const Comp = asChild ? Slot.Root : 'a'\n return (\n <Comp\n data-slot=\"sidebar-sub-item\"\n data-active={active || undefined}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n href={disabled ? undefined : href}\n tabIndex={disabled ? -1 : undefined}\n className={cn(\n 'flex h-8 shrink-0 items-center rounded-lg pr-3 pl-[34px] text-sm font-normal text-text-muted no-underline select-none',\n 'transition-[background-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'not-data-active:satin-hover:bg-bg-muted not-data-active:satin-hover:text-text-default',\n rowFocus,\n 'data-active:bg-bg-selected data-active:text-text-default',\n 'aria-disabled:pointer-events-none aria-disabled:opacity-50',\n className,\n )}\n {...props}\n >\n {asChild ? children : <span className=\"min-w-0 flex-1 truncate\">{label}</span>}\n </Comp>\n )\n}\n\nexport interface SidebarSubGroupProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n label: string\n /** Its `SidebarSubItem`s; they sit 12px further in. */\n children?: React.ReactNode\n /** One of its sub-items is the current page: opens it by default and marks the label. */\n active?: boolean\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function SidebarSubGroup({\n className,\n label,\n children,\n active = false,\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}: SidebarSubGroupProps) {\n const [uncontrolled, setUncontrolled] = React.useState(defaultOpen ?? active)\n const open = openProp ?? uncontrolled\n const regionId = React.useId()\n return (\n <div data-slot=\"sidebar-sub-group\" data-state={open ? 'open' : 'closed'} className={cn('group/sub-group flex flex-col gap-0.5', className)} {...props}>\n <button\n type=\"button\"\n aria-expanded={open}\n aria-controls={regionId}\n data-active={active || undefined}\n onClick={() => {\n if (openProp == null) setUncontrolled(!open)\n onOpenChange?.(!open)\n }}\n className={cn(\n 'flex h-8 w-full shrink-0 items-center gap-2 rounded-lg pr-3 pl-[34px] text-left text-sm font-normal text-text-muted select-none',\n 'transition-[background-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'satin-hover:bg-bg-muted satin-hover:text-text-default data-active:text-text-default',\n '[&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n rowFocus,\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <NavArrowRight\n aria-hidden\n className=\"text-text-muted transition-transform duration-(--duration-base) ease-(--ease-out) group-data-[state=open]/sub-group:rotate-90 motion-reduce:transition-none\"\n />\n </button>\n <div id={regionId} data-state={open ? 'open' : 'closed'} className=\"satin-expand\">\n <div className=\"flex flex-col gap-0.5 [&>[data-slot=sidebar-sub-item]]:pl-[46px]\">{children}</div>\n </div>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/popover.tsx"],"names":["PopoverPrimitive"],"mappings":"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","file":"chunk-BNZVTLHV.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Popover as PopoverPrimitive } from 'radix-ui'\nimport { cn } from '../lib/utils'\n\n/**\n * Popover, 1:1 with the uiKit `Popover` component (613:18781): a 320px popover surface,\n * radius-xl, border/default, the shadcn `lg` shadow, 10px padding all round. A 13px medium\n * title (18px line) over a 13px muted description, 2px apart; a 16px close glyph in text/subtle\n * 10px from the top-right corner; an optional body slot 16px below the header. It opens 8px below its trigger, aligned to the trigger's start.\n *\n * Built on the Radix Popover. `children` is the trigger (rendered with `asChild`, so pass a\n * Button); `body` fills the body slot. Pass `container` to portal it into the docs stage.\n */\nexport interface PopoverProps {\n title: React.ReactNode\n description?: React.ReactNode\n /** The trigger. Rendered with `asChild`. */\n children?: React.ReactNode\n /** Figma's body slot: actions or a small form. Keep it to one task. */\n body?: React.ReactNode\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n /** Show the close glyph in the corner. */\n closeButton?: boolean\n /** Portal target. Defaults to `document.body`. */\n container?: HTMLElement | null\n /** Called when focus moves into the popover on open; `preventDefault()` keeps it where it was. */\n onOpenAutoFocus?: (event: Event) => void\n /** A press or focus outside the popover; `preventDefault()` keeps it open. */\n onInteractOutside?: (event: Event) => void\n className?: string\n}\n\nconst panelClass = cn(\n 'relative flex w-[320px] max-w-[calc(100vw-16px)] flex-col overflow-clip pb-2.5',\n 'rounded-xl border border-border-default bg-bg-popover',\n '[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]',\n)\nconst closeClass = cn(\n 'absolute top-2.5 right-2.5 grid size-4 place-items-center rounded-sm text-text-subtle',\n 'transition-colors duration-(--duration-fast) ease-(--ease-out)',\n 'satin-hover:text-text-default focus-visible:outline-none satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n)\nconst closeIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M4.50551 11.4951L8.0006 8M8.0006 8L11.4957 4.50491M8.0006 8L4.50551 4.50491M8.0006 8L11.4957 11.4951\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n/** Title, description and body: what both the floating Popover and PopoverPanel show. */\nfunction PanelBody({ titleId, title, description, body, closeButton }: { titleId: string } & Pick<PopoverProps, 'title' | 'description' | 'body' | 'closeButton'>) {\n return (\n <>\n <div className=\"flex flex-col gap-0.5 px-2.5 pt-2.5 text-sm\">\n <p id={titleId} className={cn('leading-[18px] font-medium text-text-default', closeButton && 'pr-6')}>{title}</p>\n {description ? <p className=\"text-text-muted\">{description}</p> : null}\n </div>\n {body ? <div className=\"flex flex-col gap-4 px-2.5 pt-4\">{body}</div> : null}\n </>\n )\n}\n\nexport function Popover({\n title,\n description,\n children,\n body,\n open,\n defaultOpen,\n onOpenChange,\n side = 'bottom',\n align = 'start',\n sideOffset = 8,\n closeButton = true,\n container,\n onOpenAutoFocus,\n onInteractOutside,\n className,\n}: PopoverProps) {\n const titleId = React.useId()\n return (\n <PopoverPrimitive.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n {children && <PopoverPrimitive.Trigger asChild>{children}</PopoverPrimitive.Trigger>}\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"popover\"\n aria-labelledby={titleId}\n side={side}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={8}\n onOpenAutoFocus={onOpenAutoFocus}\n onInteractOutside={onInteractOutside}\n className={cn(\n panelClass,\n 'pointer-events-auto z-50 origin-(--radix-popover-content-transform-origin) focus-visible:outline-none',\n 'data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n className,\n )}\n >\n {/* Radix Popover has no Title part; the content is labelled by the heading. */}\n <PanelBody titleId={titleId} title={title} description={description} body={body} closeButton={closeButton} />\n {closeButton && (\n <PopoverPrimitive.Close aria-label=\"Close\" className={closeClass}>\n {closeIcon}\n </PopoverPrimitive.Close>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n}\n\n/**\n * The popover's panel on its own, in place: no trigger, no positioning. For docs, previews\n * and layers you anchor yourself. The close button calls `onClose`.\n */\nexport function PopoverPanel({\n title,\n description,\n body,\n closeButton = true,\n onClose,\n className,\n}: Pick<PopoverProps, 'title' | 'description' | 'body' | 'closeButton' | 'className'> & { onClose?: () => void }) {\n const titleId = React.useId()\n return (\n <div role=\"dialog\" aria-labelledby={titleId} data-slot=\"popover\" className={cn(panelClass, className)}>\n <PanelBody titleId={titleId} title={title} description={description} body={body} closeButton={closeButton} />\n {closeButton && (\n <button type=\"button\" aria-label=\"Close\" onClick={onClose} className={closeClass}>\n {closeIcon}\n </button>\n )}\n </div>\n )\n}\n\n/** Wrap a body button in this to make it close the popover: `<PopoverClose asChild><Button…/></PopoverClose>`. */\nexport const PopoverClose = PopoverPrimitive.Close\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/donut-chart.tsx"],"names":[],"mappings":";;;;AAuBA,IAAM,IAAA,GAAO,GAAA;AACb,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,CAAA,GAAA,CAAK,OAAO,MAAA,IAAU,CAAA;AAC5B,IAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AACxB,IAAM,GAAA,GAAM,CAAA;AAEZ,IAAM,cAAc,CAAC,CAAA,KAAc,CAAA,YAAA,EAAgB,CAAA,GAAI,IAAK,CAAC,CAAA,CAAA,CAAA;AAEtD,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,WAAA,GAAc,aAAA,EAAe,WAAW,WAAA,GAAc,OAAA,EAAS,GAAG,KAAA,EAAM,EAAmB;AAC3H,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,MAAA,GAAA,CAAU,WAAW,IAAA,IAAQ,OAAA,GAAU,KAAK,MAAA,GAAS,OAAA,GAAU,SAAS,SAAA,IAAa,IAAA;AAC3F,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AAClE,EAAA,MAAM,QAAQ,CAAC,CAAA,KAAc,KAAK,KAAA,CAAO,CAAA,GAAI,MAAO,GAAG,CAAA;AAEvD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC9B,IAAA,MAAM,MAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,KAAK,IAAI,GAAA,GAAO,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,EAAE,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,GAAG,CAAA,EAAE;AAC5D,IAAA,MAAA,IAAU,GAAA;AACV,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAW,GAAG,KAAA,EACb,QAAA,kBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,2EAAA;AAAA,MACV,cAAA,EAAgB,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MAErC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EAAyB,OAAO,EAAE,KAAA,EAAO,MAAK,EAC3D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAS,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,eAAW,IAAA,EAAC,SAAA,EAAU,oBACnF,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,CAAA,EAAG,KAAA,EAAO,GAAA,EAAI,qBACzB,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAI,IAAA,GAAO,CAAA;AAAA,cACX,IAAI,IAAA,GAAO,CAAA;AAAA,cACX,CAAA,EAAG,CAAA;AAAA,cACH,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAQ,YAAY,CAAC,CAAA;AAAA,cACrB,WAAA,EAAa,MAAA;AAAA,cACb,eAAA,EAAiB,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,CAAA;AAAA,cAClC,kBAAkB,CAAC,KAAA;AAAA,cACnB,cAAA,EAAgB,MAAM,UAAA,CAAW,CAAC,CAAA;AAAA,cAClC,SAAA,EAAU,iEAAA;AAAA,cACV,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,KAAW,QAAQ,MAAA,KAAW,CAAA,GAAI,OAAO,CAAA;AAAE,aAAA;AAAA,YAXxD,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,WAahB,CAAA,EACH,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,QAAA,EAAS,WAAU,4FAAA,EAChC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uFAAA,EACb,QAAA,EAAA,WAAA,CAAY,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,GAAQ,GAAG,CAAA,EACxD,CAAA;AAAA,gCACC,MAAA,EAAA,EAAK,SAAA,EAAU,4DACb,QAAA,EAAA,MAAA,IAAU,IAAA,GAAO,GAAG,IAAA,CAAK,MAAM,EAAE,KAAK,CAAA,MAAA,EAAM,MAAM,IAAA,CAAK,MAAM,EAAE,KAAK,CAAC,MAAM,WAAA,EAC9E;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+IAAA;AAAA,YACV,cAAY,KAAA,CAAM,KAAA;AAAA,YAEjB,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACZ,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,QAAA,EAAU,CAAA;AAAA,gBACV,cAAA,EAAgB,MAAM,UAAA,CAAW,CAAC,CAAA;AAAA,gBAClC,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,CAAA;AAAA,gBAC3B,MAAA,EAAQ,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,gBAC7B,YAAA,EAAY,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,WAAA,CAAY,CAAA,CAAE,KAAK,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,gBAClE,SAAA,EAAU,iGAAA;AAAA,gBAEV,QAAA,kBAAA,GAAA;AAAA,kBAAC,eAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,OAAA;AAAA,oBACR,SAAA,EAAU,aAAA;AAAA,oBACV,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,oBACpB,OAAO,CAAA,CAAE,KAAA;AAAA,oBACT,QAAQ,MAAA,KAAW,CAAA;AAAA,oBACnB,MAAA,EAAQ,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW;AAAA;AAAA;AACxC,eAAA;AAAA,cAfK,CAAA,CAAE;AAAA,aAiBV;AAAA;AAAA;AACH;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"chunk-CL2II6BX.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ChartCard, ChartLegendPill, defaultFormat, type ChartCardBaseProps } from './chart'\n\n/**\n * Donut chart, 1:1 with the uiKit `chart/donutCard` (4067:7096), in the shared ChartCard\n * (chart.tsx).\n *\n * A 184px ring (20px thick) of chart/1–5 segments starting at 12 o'clock, a 2px gap between\n * them, with the sum in the middle (text/xl semibold) over `centerLabel` in text/muted. The sum\n * lives in the ring, so the card's summary shows only the range. Under the ring a legend of\n * plain pills (swatch and label, the value is in the ring on hover) in two columns, 16 × 8 apart.\n * From 560px the legend moves to the right of the ring as one column.\n *\n * Hover a segment or its pill (or set `highlight`): the other segments fade to 15%, the other\n * pills' content to 45% (the hovered one fills bg/hover), and the middle shows the hovered value over \"Label · 20%\".\n */\nexport interface DonutCardProps extends Omit<ChartCardBaseProps, 'total' | 'change'> {\n /** Under the sum in the middle. */\n centerLabel?: string\n}\n\nconst SIZE = 184\nconst STROKE = 20\nconst R = (SIZE - STROKE) / 2\nconst C = 2 * Math.PI * R\nconst GAP = 2\n\nconst seriesColor = (i: number) => `var(--chart-${(i % 5) + 1})`\n\nexport function DonutCard({ data, formatValue = defaultFormat, highlight, centerLabel = 'Total', ...props }: DonutCardProps) {\n const [hovered, setHovered] = React.useState<number | null>(null)\n const active = (hovered != null && hovered < data.length ? hovered : null) ?? highlight ?? null\n const sum = data.reduce((s, d) => s + Math.max(0, d.value), 0) || 1\n const share = (v: number) => Math.round((v / sum) * 100)\n\n let offset = 0\n const arcs = data.map((d, i) => {\n const len = (Math.max(0, d.value) / sum) * C\n const arc = { i, start: offset, len: Math.max(0, len - GAP) }\n offset += len\n return arc\n })\n\n return (\n <ChartCard {...props}>\n <div\n className=\"flex flex-col items-center gap-4 @min-[560px]:flex-row @min-[560px]:gap-8\"\n onPointerLeave={() => setHovered(null)}\n >\n <div className=\"relative shrink-0 py-2\" style={{ width: SIZE }}>\n <svg width={SIZE} height={SIZE} viewBox={`0 0 ${SIZE} ${SIZE}`} aria-hidden className=\"block -rotate-90\">\n {arcs.map(({ i, start, len }) => (\n <circle\n key={data[i].label}\n cx={SIZE / 2}\n cy={SIZE / 2}\n r={R}\n fill=\"none\"\n stroke={seriesColor(i)}\n strokeWidth={STROKE}\n strokeDasharray={`${len} ${C - len}`}\n strokeDashoffset={-start}\n onPointerEnter={() => setHovered(i)}\n className=\"transition-opacity duration-(--duration-fast) ease-(--ease-out)\"\n style={{ opacity: active !== null && active !== i ? 0.15 : 1 }}\n />\n ))}\n </svg>\n <div aria-live=\"polite\" className=\"pointer-events-none absolute inset-0 flex flex-col items-center justify-center text-center\">\n <span className=\"text-xl leading-(--text-xl--line-height) font-semibold text-text-default tabular-nums\">\n {formatValue(active != null ? data[active].value : sum)}\n </span>\n <span className=\"text-sm leading-(--text-sm--line-height) text-text-muted\">\n {active != null ? `${data[active].label} · ${share(data[active].value)}%` : centerLabel}\n </span>\n </div>\n </div>\n <ul\n className=\"grid w-full grid-cols-2 gap-x-4 gap-y-2 px-2 @min-[560px]:flex @min-[560px]:flex-1 @min-[560px]:flex-col @min-[560px]:gap-1 @min-[560px]:px-0\"\n aria-label={props.title}\n >\n {data.map((d, i) => (\n <li\n key={d.label}\n tabIndex={0}\n onPointerEnter={() => setHovered(i)}\n onFocus={() => setHovered(i)}\n onBlur={() => setHovered(null)}\n aria-label={`${d.label}: ${formatValue(d.value)}, ${share(d.value)}%`}\n className=\"min-w-0 rounded-pill outline-none focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]\"\n >\n <ChartLegendPill\n variant=\"plain\"\n className=\"flex w-full\"\n color={seriesColor(i)}\n label={d.label}\n active={active === i}\n dimmed={active !== null && active !== i}\n />\n </li>\n ))}\n </ul>\n </div>\n </ChartCard>\n )\n}\n"]}
package/chunk-D7RZNTFC.js DELETED
@@ -1,95 +0,0 @@
1
- import { bannerMesh } from './chunk-YX5VNRJX.js';
2
- import { Button } from './chunk-HNQUX43Z.js';
3
- import { cn } from './chunk-H63FYCMY.js';
4
- import 'react';
5
- import { ArrowRight, Xmark } from 'iconoir-react';
6
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
7
-
8
- function AnnouncementBar({
9
- action,
10
- onDismiss,
11
- dismissLabel = "Dismiss announcement",
12
- sticky,
13
- tone = "primary",
14
- background = "plain",
15
- shimmer = false,
16
- children,
17
- className,
18
- ...props
19
- }) {
20
- const toneClass = {
21
- primary: "bg-action-primary-bg text-action-primary-fg",
22
- inverse: "bg-action-inverse-bg text-text-on-inverse",
23
- default: "bg-bg-card text-text-default [box-shadow:inset_0_1px_0_var(--border-subtle),inset_0_-1px_0_var(--border-subtle)]"
24
- }[tone];
25
- const closeClass = {
26
- primary: "text-action-primary-fg opacity-70 hover:bg-action-primary-bg-hover hover:opacity-100",
27
- inverse: "text-text-on-inverse opacity-70 hover:bg-action-inverse-bg-hover hover:opacity-100",
28
- default: "text-text-muted hover:bg-bg-hover hover:text-text-default"
29
- }[tone];
30
- const label = action && /* @__PURE__ */ jsxs(Fragment, { children: [
31
- action.label,
32
- /* @__PURE__ */ jsx(ArrowRight, { "aria-hidden": true })
33
- ] });
34
- return /* @__PURE__ */ jsxs(
35
- "div",
36
- {
37
- role: "region",
38
- "aria-label": "Announcement",
39
- "data-slot": "announcement-bar",
40
- "data-tone": tone,
41
- className: cn(
42
- "relative isolate flex min-h-11 w-full items-center justify-center px-12 py-2 text-base",
43
- toneClass,
44
- shimmer && "satin-sheen",
45
- sticky === "top" && "sticky top-0 z-40",
46
- sticky === "bottom" && "sticky bottom-0 z-40",
47
- className
48
- ),
49
- ...props,
50
- children: [
51
- background === "mesh" && tone === "default" && /* @__PURE__ */ jsx(
52
- "img",
53
- {
54
- src: bannerMesh.horizontal.one.light,
55
- alt: "",
56
- "aria-hidden": true,
57
- className: "pointer-events-none absolute inset-0 -z-10 size-full max-w-none object-cover mix-blend-multiply"
58
- }
59
- ),
60
- background === "mesh" && /* @__PURE__ */ jsx(
61
- "img",
62
- {
63
- src: bannerMesh.horizontal.one.dark,
64
- alt: "",
65
- "aria-hidden": true,
66
- className: "pointer-events-none absolute inset-0 -z-10 size-full max-w-none object-cover mix-blend-screen"
67
- }
68
- ),
69
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-x-3 gap-y-1 text-center", children: [
70
- /* @__PURE__ */ jsx("p", { className: "m-0", children }),
71
- action && (action.href ? /* @__PURE__ */ jsx(Button, { asChild: true, variant: "secondary", size: "xs", className: "shrink-0 no-underline", children: /* @__PURE__ */ jsx("a", { href: action.href, onClick: action.onClick, children: label }) }) : /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "xs", className: "shrink-0", onClick: action.onClick, children: label }))
72
- ] }),
73
- onDismiss && /* @__PURE__ */ jsx(
74
- "button",
75
- {
76
- type: "button",
77
- "aria-label": dismissLabel,
78
- onClick: onDismiss,
79
- className: cn(
80
- "absolute top-1/2 right-3 grid size-7 -translate-y-1/2 place-items-center rounded-md outline-none",
81
- closeClass,
82
- "transition-[opacity,background-color] duration-(--duration-fast) ease-(--ease-out)",
83
- "focus-visible:opacity-100 focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
84
- ),
85
- children: /* @__PURE__ */ jsx(Xmark, { "aria-hidden": true, className: "size-4 [stroke-width:1.875]" })
86
- }
87
- )
88
- ]
89
- }
90
- );
91
- }
92
-
93
- export { AnnouncementBar };
94
- //# sourceMappingURL=chunk-D7RZNTFC.js.map
95
- //# sourceMappingURL=chunk-D7RZNTFC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/announcement-bar.tsx"],"names":[],"mappings":"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","file":"chunk-D7RZNTFC.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ArrowRight, Xmark } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { bannerMesh } from './banner'\n\n/**\n * AnnouncementBar: one line of news across the top (or bottom) edge of the page, with a button\n * to read more and an optional close.\n *\n * `tone` sets the fill: primary (action/primary/bg, the default), inverse (action/inverse/bg) or\n * default (bg/card between two border/subtle rules). The bar is 44 high, the message centred in Body/lg with\n * the action after it, 12px apart: a secondary xs Button with a 14px arrow. The close button,\n * when `onDismiss` is passed, sits 12px from the right edge: a 28px square, the 16px cross at\n * 70% that turns full on hover over action/primary/bg-hover.\n *\n * `background=\"mesh\"` adds the Banner's glow over the primary; `shimmer` sends a soft band of\n * light across now and then.\n *\n * `sticky` keeps it on the top or bottom edge of its scroll container as the page scrolls.\n * Long messages wrap; the close keeps its corner.\n */\nexport interface AnnouncementBarProps extends React.ComponentProps<'div'> {\n /** The button after the message; with `href` it renders as a link. */\n action?: { label: React.ReactNode; href?: string; onClick?: () => void }\n onDismiss?: () => void\n dismissLabel?: string\n /** Sticks to the top or bottom edge of its scroll container. */\n sticky?: 'top' | 'bottom'\n /**\n * `primary`: action/primary/bg (the default). `inverse`: action/inverse/bg, near-black in light\n * and near-white in dark. `default`: bg/card with border/subtle rules above and below, like a Banner.\n */\n tone?: 'primary' | 'inverse' | 'default'\n /** `mesh` lays the Banner's glow over the bar: lighter on primary and inverse, coloured on default. */\n background?: 'plain' | 'mesh'\n /** Now and then a soft band of light crosses the bar (off under reduced motion). */\n shimmer?: boolean\n}\n\nexport function AnnouncementBar({\n action,\n onDismiss,\n dismissLabel = 'Dismiss announcement',\n sticky,\n tone = 'primary',\n background = 'plain',\n shimmer = false,\n children,\n className,\n ...props\n}: AnnouncementBarProps) {\n const toneClass = {\n primary: 'bg-action-primary-bg text-action-primary-fg',\n inverse: 'bg-action-inverse-bg text-text-on-inverse',\n default: 'bg-bg-card text-text-default [box-shadow:inset_0_1px_0_var(--border-subtle),inset_0_-1px_0_var(--border-subtle)]',\n }[tone]\n const closeClass = {\n primary: 'text-action-primary-fg opacity-70 hover:bg-action-primary-bg-hover hover:opacity-100',\n inverse: 'text-text-on-inverse opacity-70 hover:bg-action-inverse-bg-hover hover:opacity-100',\n default: 'text-text-muted hover:bg-bg-hover hover:text-text-default',\n }[tone]\n const label = action && (\n <>\n {action.label}\n <ArrowRight aria-hidden />\n </>\n )\n\n return (\n <div\n role=\"region\"\n aria-label=\"Announcement\"\n data-slot=\"announcement-bar\"\n data-tone={tone}\n className={cn(\n 'relative isolate flex min-h-11 w-full items-center justify-center px-12 py-2 text-base',\n toneClass,\n shimmer && 'satin-sheen',\n sticky === 'top' && 'sticky top-0 z-40',\n sticky === 'bottom' && 'sticky bottom-0 z-40',\n className,\n )}\n {...props}\n >\n {background === 'mesh' && tone === 'default' && (\n <img\n src={bannerMesh.horizontal.one.light}\n alt=\"\"\n aria-hidden\n className=\"pointer-events-none absolute inset-0 -z-10 size-full max-w-none object-cover mix-blend-multiply\"\n />\n )}\n {background === 'mesh' && (\n <img\n src={bannerMesh.horizontal.one.dark}\n alt=\"\"\n aria-hidden\n className=\"pointer-events-none absolute inset-0 -z-10 size-full max-w-none object-cover mix-blend-screen\"\n />\n )}\n <div className=\"flex flex-wrap items-center justify-center gap-x-3 gap-y-1 text-center\">\n <p className=\"m-0\">{children}</p>\n {action &&\n (action.href ? (\n <Button asChild variant=\"secondary\" size=\"xs\" className=\"shrink-0 no-underline\">\n <a href={action.href} onClick={action.onClick}>\n {label}\n </a>\n </Button>\n ) : (\n <Button variant=\"secondary\" size=\"xs\" className=\"shrink-0\" onClick={action.onClick}>\n {label}\n </Button>\n ))}\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n className={cn(\n 'absolute top-1/2 right-3 grid size-7 -translate-y-1/2 place-items-center rounded-md outline-none',\n closeClass,\n 'transition-[opacity,background-color] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:opacity-100 focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n )}\n >\n <Xmark aria-hidden className=\"size-4 [stroke-width:1.875]\" />\n </button>\n )}\n </div>\n )\n}\n"]}
package/chunk-DETGJAIC.js DELETED
@@ -1,147 +0,0 @@
1
- import { useSlidingIndicator } from './chunk-J3NSDRVH.js';
2
- import { cn } from './chunk-H63FYCMY.js';
3
- import * as React from 'react';
4
- import { Tabs as Tabs$1 } from 'radix-ui';
5
- import { cva } from 'class-variance-authority';
6
- import { jsxs, jsx } from 'react/jsx-runtime';
7
-
8
- var list = cva("relative flex", {
9
- variants: {
10
- variant: {
11
- // The rule is an inset shadow, so the 2px indicator can sit on top of it (as in Figma).
12
- underline: "items-end gap-8 [box-shadow:inset_0_-1px_0_var(--border-default)]",
13
- pill: "items-center gap-1"
14
- }
15
- }
16
- });
17
- var trigger = cva(
18
- [
19
- "group/tab relative flex shrink-0 items-center font-medium whitespace-nowrap text-text-muted select-none",
20
- "transition-[color,background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
21
- "focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50",
22
- "satin-hover:text-text-default satin-focus:text-text-default data-[state=active]:text-text-default",
23
- "[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
24
- ],
25
- {
26
- variants: {
27
- variant: {
28
- underline: "",
29
- pill: [
30
- "rounded-pill",
31
- "data-[state=inactive]:satin-hover:bg-bg-muted",
32
- "satin-focus:[box-shadow:0_0_0_1px_var(--border-focus)]"
33
- ]
34
- },
35
- size: {
36
- md: "text-base",
37
- sm: "text-sm"
38
- }
39
- },
40
- compoundVariants: [
41
- { variant: "underline", size: "md", className: "h-control-height-xl" },
42
- { variant: "underline", size: "sm", className: "h-control-height-lg" },
43
- { variant: "pill", size: "md", className: "h-control-height-lg px-3" },
44
- { variant: "pill", size: "sm", className: "h-control-height px-2.5" }
45
- ]
46
- }
47
- );
48
- function normalize(item) {
49
- return typeof item === "string" ? { value: item, label: item } : item;
50
- }
51
- function Tabs({
52
- items,
53
- value,
54
- defaultValue,
55
- onValueChange,
56
- variant = "underline",
57
- size = "md",
58
- disabled = false,
59
- children,
60
- className,
61
- ...props
62
- }) {
63
- const tabs = items.map(normalize);
64
- const listRef = React.useRef(null);
65
- const [current, setCurrent] = React.useState(value ?? defaultValue ?? tabs[0]?.value);
66
- const selected = value ?? current;
67
- const indicator = useSlidingIndicator(listRef, '[role="tab"][data-state="active"]', `${selected}|${variant}|${size}|${tabs.length}`);
68
- return /* @__PURE__ */ jsxs(
69
- Tabs$1.Root,
70
- {
71
- "data-slot": "tabs",
72
- value,
73
- defaultValue: defaultValue ?? (value === void 0 ? tabs[0]?.value : void 0),
74
- onValueChange: (v) => {
75
- setCurrent(v);
76
- onValueChange?.(v);
77
- },
78
- className: cn("flex flex-col", className),
79
- children: [
80
- /* @__PURE__ */ jsxs(Tabs$1.List, { ref: listRef, "aria-label": props["aria-label"], className: list({ variant }), children: [
81
- /* @__PURE__ */ jsx(
82
- "span",
83
- {
84
- ref: indicator.ref,
85
- "aria-hidden": true,
86
- className: cn(
87
- "pointer-events-none absolute left-0 opacity-0",
88
- variant === "underline" ? "bottom-0 z-10 h-0.5 rounded-full bg-action-primary-bg" : "top-1/2 z-0 -translate-y-1/2 rounded-pill bg-bg-selected",
89
- variant === "pill" && (size === "md" ? "h-control-height-lg" : "h-control-height")
90
- )
91
- }
92
- ),
93
- tabs.map((tab) => /* @__PURE__ */ jsxs(
94
- Tabs$1.Trigger,
95
- {
96
- value: tab.value,
97
- disabled: disabled || tab.disabled,
98
- ...children == null && { "aria-controls": void 0 },
99
- className: cn(
100
- trigger({ variant, size }),
101
- variant === "pill" && "z-10",
102
- // Before the indicator is placed (server render), the selected tab paints its own.
103
- !indicator.ready && variant === "pill" && "data-[state=active]:bg-bg-selected"
104
- ),
105
- children: [
106
- /* @__PURE__ */ jsxs(
107
- "span",
108
- {
109
- className: cn(
110
- "flex items-center gap-1.5 rounded-sm",
111
- variant === "underline" && "group-focus-visible/tab:[box-shadow:inset_0_0_0_1.5px_var(--border-focus)] group-data-[force=focus]/tab:[box-shadow:inset_0_0_0_1.5px_var(--border-focus)]"
112
- ),
113
- children: [
114
- tab.icon,
115
- tab.label
116
- ]
117
- }
118
- ),
119
- variant === "underline" && /* @__PURE__ */ jsx(
120
- "span",
121
- {
122
- "aria-hidden": true,
123
- className: cn(
124
- "absolute inset-x-0 bottom-0 h-0.5 rounded-full bg-transparent",
125
- "transition-colors duration-(--duration-fast) ease-(--ease-out)",
126
- "group-data-[state=inactive]/tab:group-hover/tab:bg-border-strong group-data-[state=inactive]/tab:group-data-[force=hover]/tab:bg-border-strong",
127
- !indicator.ready && "group-data-[state=active]/tab:bg-action-primary-bg"
128
- )
129
- }
130
- )
131
- ]
132
- },
133
- tab.value
134
- ))
135
- ] }),
136
- children
137
- ]
138
- }
139
- );
140
- }
141
- function TabsContent({ className, ...props }) {
142
- return /* @__PURE__ */ jsx(Tabs$1.Content, { "data-slot": "tabs-content", className: cn("rounded-md focus-visible:shadow-border-focus focus-visible:outline-none", className), ...props });
143
- }
144
-
145
- export { Tabs, TabsContent };
146
- //# sourceMappingURL=chunk-DETGJAIC.js.map
147
- //# sourceMappingURL=chunk-DETGJAIC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/tabs.tsx"],"names":["TabsPrimitive"],"mappings":"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","file":"chunk-DETGJAIC.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Tabs as TabsPrimitive } from 'radix-ui'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\nimport { useSlidingIndicator } from './sliding-indicator'\n\n/**\n * Tabs, 1:1 with the uiKit `Tabs` (3635:18677) and `tabs/item` (3635:18591) sets.\n *\n * Underline: tabs 32px apart on a 1px border/default rule; md is 36px high with a 14px label,\n * sm 32px with 13px. The selected tab has a 2px action/primary indicator sitting on the rule;\n * hover shows it in border/strong. Focus draws a 1.5px border/focus ring around the label.\n *\n * Pill: tabs 4px apart, radius-full; md 32px high with 12px sides, sm 28px with 10px. Hover\n * fills bg/muted, selected bg/selected, focus a 1px border/focus ring.\n *\n * The selected tab's indicator (the underline's 2px bar, the pill's bg/selected) is one element\n * that slides from tab to tab under the labels, as in the Segmented control and Pagination\n * (sliding-indicator.tsx): 300 ms, the leading edge first.\n *\n * Labels are text/muted, text/default on hover, focus and selected; disabled is 50%. Optional\n * 16px leading icon, 6px from the label. Built on the Radix Tabs (arrow keys move between tabs).\n * States answer to `data-force=\"hover\" | \"focus\"` for state sheets.\n */\nexport type TabItem =\n | string\n | {\n value: string\n label: React.ReactNode\n /** 16px leading icon. */\n icon?: React.ReactNode\n disabled?: boolean\n }\n\nexport interface TabsProps {\n items: TabItem[]\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n variant?: 'underline' | 'pill'\n size?: 'md' | 'sm'\n /** Disable every tab. */\n disabled?: boolean\n /** Accessible name for the tab list. */\n 'aria-label'?: string\n /** `TabsContent` panels, one per item value. */\n children?: React.ReactNode\n className?: string\n}\n\nconst list = cva('relative flex', {\n variants: {\n variant: {\n // The rule is an inset shadow, so the 2px indicator can sit on top of it (as in Figma).\n underline: 'items-end gap-8 [box-shadow:inset_0_-1px_0_var(--border-default)]',\n pill: 'items-center gap-1',\n },\n },\n})\n\nconst trigger = cva(\n [\n 'group/tab relative flex shrink-0 items-center font-medium whitespace-nowrap text-text-muted select-none',\n 'transition-[color,background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50',\n 'satin-hover:text-text-default satin-focus:text-text-default data-[state=active]:text-text-default',\n '[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n variant: {\n underline: '',\n pill: [\n 'rounded-pill',\n 'data-[state=inactive]:satin-hover:bg-bg-muted',\n 'satin-focus:[box-shadow:0_0_0_1px_var(--border-focus)]',\n ],\n },\n size: {\n md: 'text-base',\n sm: 'text-sm',\n },\n },\n compoundVariants: [\n { variant: 'underline', size: 'md', className: 'h-control-height-xl' },\n { variant: 'underline', size: 'sm', className: 'h-control-height-lg' },\n { variant: 'pill', size: 'md', className: 'h-control-height-lg px-3' },\n { variant: 'pill', size: 'sm', className: 'h-control-height px-2.5' },\n ],\n },\n)\n\nfunction normalize(item: TabItem) {\n return typeof item === 'string' ? { value: item, label: item as React.ReactNode } : item\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n size = 'md',\n disabled = false,\n children,\n className,\n ...props\n}: TabsProps) {\n const tabs = items.map(normalize)\n const listRef = React.useRef<HTMLDivElement>(null)\n // Uncontrolled tabs: follow the selection here too, so the indicator knows when to move.\n const [current, setCurrent] = React.useState(value ?? defaultValue ?? tabs[0]?.value)\n const selected = value ?? current\n const indicator = useSlidingIndicator(listRef, '[role=\"tab\"][data-state=\"active\"]', `${selected}|${variant}|${size}|${tabs.length}`)\n\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n value={value}\n defaultValue={defaultValue ?? (value === undefined ? tabs[0]?.value : undefined)}\n onValueChange={(v) => {\n setCurrent(v)\n onValueChange?.(v)\n }}\n className={cn('flex flex-col', className)}\n >\n <TabsPrimitive.List ref={listRef} aria-label={props['aria-label']} className={list({ variant })}>\n <span\n ref={indicator.ref}\n aria-hidden\n className={cn(\n 'pointer-events-none absolute left-0 opacity-0',\n variant === 'underline' ? 'bottom-0 z-10 h-0.5 rounded-full bg-action-primary-bg' : 'top-1/2 z-0 -translate-y-1/2 rounded-pill bg-bg-selected',\n variant === 'pill' && (size === 'md' ? 'h-control-height-lg' : 'h-control-height'),\n )}\n />\n {tabs.map((tab) => (\n <TabsPrimitive.Trigger\n key={tab.value}\n value={tab.value}\n disabled={disabled || tab.disabled}\n // Without TabsContent there is no panel to point at.\n {...(children == null && { 'aria-controls': undefined })}\n className={cn(\n trigger({ variant, size }),\n variant === 'pill' && 'z-10',\n // Before the indicator is placed (server render), the selected tab paints its own.\n !indicator.ready && variant === 'pill' && 'data-[state=active]:bg-bg-selected',\n )}\n >\n <span\n className={cn(\n 'flex items-center gap-1.5 rounded-sm',\n variant === 'underline' &&\n 'group-focus-visible/tab:[box-shadow:inset_0_0_0_1.5px_var(--border-focus)] group-data-[force=focus]/tab:[box-shadow:inset_0_0_0_1.5px_var(--border-focus)]',\n )}\n >\n {tab.icon}\n {tab.label}\n </span>\n {variant === 'underline' && (\n <span\n aria-hidden\n className={cn(\n 'absolute inset-x-0 bottom-0 h-0.5 rounded-full bg-transparent',\n 'transition-colors duration-(--duration-fast) ease-(--ease-out)',\n 'group-data-[state=inactive]/tab:group-hover/tab:bg-border-strong group-data-[state=inactive]/tab:group-data-[force=hover]/tab:bg-border-strong',\n !indicator.ready && 'group-data-[state=active]/tab:bg-action-primary-bg',\n )}\n />\n )}\n </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n {children}\n </TabsPrimitive.Root>\n )\n}\n\n/** The panel for one tab value. */\nexport function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('rounded-md focus-visible:shadow-border-focus focus-visible:outline-none', className)} {...props} />\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/bar-chart.tsx"],"names":[],"mappings":"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","file":"chunk-DO3TBNSC.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { ChartCard, ChartLegendRow, ChartTooltip, defaultFormat, type ChartCardBaseProps } from './chart'\n\n/**\n * Bar chart, 1:1 with the uiKit `chart/barCard` (3607:18253) and its `chart/barColumn`\n * (3602:17543), in the shared card frame (chart.tsx).\n *\n * BarCard: a 206px plot, 32px axis gutter, 4 dashed border-subtle gridlines at nice ticks,\n * axis labels regular 12/18 text-muted, columns 8px apart with a 180px track, bars radius-md\n * in chart/3 and day labels medium 13 text-muted 6px below. Hover (or `highlight`) keeps the\n * hovered bar, outlines it 2px out in chart/3, shows its value above and bolds its day; the\n * other bars dim to a 30% tint of chart/3 on bg/card, so they follow the bar, not the brand.\n * The KPI above defaults to the sum, in full (formatValue is for the axis); an optional legend row can sit under the plot.\n *\n * When the data changes (a new period, say) the bars regrow from the baseline in 250 ms on\n * ease-out, revealed by clip-path so their rounded tops stay whole, and the day labels and the\n * axis fade in on the new scale. Not on the first paint; under reduced motion, or with\n * `reducedMotion`, the bars swap at once.\n */\nexport function niceMax(max: number) {\n if (max <= 0) return 4\n const raw = max / 4\n const pow = 10 ** Math.floor(Math.log10(raw))\n const step = [1, 1.5, 2, 2.5, 3, 5, 7.5, 10].map((m) => m * pow).find((s) => s >= raw) ?? 10 * pow\n return step * 4\n}\n\n\nexport interface BarCardProps extends ChartCardBaseProps {\n /** The legend row under the plot. */\n legend?: { label: string; value?: string; note?: string }\n /** Unit after the value in the tooltip (\"covers\"). */\n unit?: string\n /** Swap the bars without motion when the data changes, as under prefers-reduced-motion. */\n reducedMotion?: boolean\n}\n\nconst TRACK = 180\n\nexport function BarCard({\n data,\n formatValue = defaultFormat,\n highlight,\n legend,\n unit,\n reducedMotion,\n total,\n ...props\n}: BarCardProps) {\n const [hovered, setHovered] = React.useState<number | null>(null)\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null)\n const active = (hovered != null && hovered < data.length ? hovered : null) ?? highlight ?? null\n // Counts real changes to the data (not a new array with the same values), so the bars\n // remount and regrow; zero until the first change.\n const signature = data.map((d) => `${d.label}:${d.value}`).join('|')\n const [redraw, setRedraw] = React.useState({ signature, n: 0 })\n if (redraw.signature !== signature) setRedraw({ signature, n: redraw.n + 1 })\n const regrow = redraw.n > 0 && !reducedMotion\n const max = niceMax(Math.max(0, ...data.map((d) => d.value)))\n const ticks = [4, 3, 2, 1, 0].map((i) => (max / 4) * i)\n const sum = data.reduce((n, d) => n + d.value, 0)\n\n return (\n <ChartCard total={total ?? defaultFormat(sum)} {...props}>\n <div className=\"pt-2\">\n <div className=\"relative flex h-[206px] items-end gap-2 pl-8\" onPointerLeave={() => setHovered(null)}>\n {/* Gridlines at each tick but zero, dashed border-subtle. */}\n {ticks.slice(0, 4).map((_, i) => (\n <span\n key={i}\n aria-hidden\n className=\"absolute right-0 left-8 h-px border-t border-dashed border-border-subtle\"\n style={{ top: (TRACK / 4) * i }}\n />\n ))}\n {ticks.map((t, i) => (\n <span\n key={`${redraw.n}-${i}`}\n aria-hidden\n className={cn(\n 'absolute left-6 w-6 -translate-x-full text-right text-xs leading-[18px] text-text-muted',\n regrow && 'satin-bar-fade',\n )}\n style={{ top: (TRACK / 4) * i - 9 }}\n >\n {formatValue(t)}\n </span>\n ))}\n <ul key={redraw.n} className=\"contents\" aria-label={props.title}>\n {data.map((d, i) => {\n const isActive = active === i\n const dimmed = active !== null && !isActive\n const height = (d.value / max) * TRACK\n return (\n <li\n key={d.label}\n tabIndex={0}\n aria-label={`${d.tooltipLabel ?? d.label}: ${formatValue(d.value)}${unit ? ` ${unit}` : ''}`}\n onPointerEnter={() => setHovered(i)}\n onFocus={() => setHovered(i)}\n onBlur={() => setHovered(null)}\n className=\"relative flex min-w-0 flex-1 flex-col items-center gap-1.5 rounded-md focus-visible:outline-none\"\n >\n <div className=\"relative flex w-full flex-col items-center justify-end gap-1.5\" style={{ height: TRACK }}>\n {isActive && (\n <>\n {/* The tooltip floats 4px above the value. */}\n <ChartTooltip\n anchor={anchor}\n label={d.tooltipLabel ?? d.label}\n value={`${formatValue(d.value)}${unit ? ` ${unit}` : ''}`}\n />\n <span ref={setAnchor} className=\"text-sm leading-(--text-sm--line-height) font-medium text-text-default\">\n {formatValue(d.value)}\n </span>\n </>\n )}\n <span\n aria-hidden\n className={cn(\n 'w-full rounded-md transition-[background-color,outline-color] duration-(--duration-fast) ease-(--ease-out)',\n // Dimmed bars stay a tint of chart/3 on the card, so the brand colour never reaches them.\n dimmed ? 'bg-[color-mix(in_oklab,var(--chart-3)_30%,var(--bg-card))]' : 'bg-chart-3',\n isActive && 'outline outline-offset-2 outline-chart-3',\n regrow && 'satin-bar-regrow',\n )}\n style={{ height }}\n />\n </div>\n <span\n className={cn(\n 'text-sm leading-(--text-sm--line-height) font-medium whitespace-nowrap',\n isActive ? 'text-text-default' : 'text-text-muted',\n regrow && 'satin-bar-fade',\n )}\n >\n {d.label}\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n {legend && (\n <ChartLegendRow\n color=\"var(--chart-3)\"\n label={legend.label}\n value={legend.value ?? formatValue(sum)}\n note={legend.note}\n />\n )}\n </ChartCard>\n )\n}\n"]}