sparkdesign 0.4.6 → 0.4.8

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 (276) hide show
  1. package/AI_README.md +60 -0
  2. package/README.md +1 -1
  3. package/cli/dist/commands/add.js +1 -1
  4. package/cli/dist/commands/init.js +1 -1
  5. package/cli/registry/AGENTS.md +9 -2
  6. package/cli/registry/agent-manifest.json +794 -0
  7. package/cli/registry/basic/alert-dialog.tsx +3 -6
  8. package/cli/registry/basic/alert.tsx +76 -0
  9. package/cli/registry/basic/aspect-ratio.tsx +8 -0
  10. package/cli/registry/basic/breadcrumb.tsx +117 -0
  11. package/cli/registry/basic/button-group.tsx +79 -0
  12. package/cli/registry/basic/button.tsx +19 -6
  13. package/cli/registry/basic/calendar.tsx +221 -0
  14. package/cli/registry/basic/card.tsx +115 -0
  15. package/cli/registry/basic/carousel.tsx +241 -0
  16. package/cli/registry/basic/chart.tsx +372 -0
  17. package/cli/registry/basic/checkbox.tsx +42 -0
  18. package/cli/registry/basic/collapsible-card.tsx +4 -6
  19. package/cli/registry/basic/combobox.tsx +133 -0
  20. package/cli/registry/basic/command.tsx +184 -0
  21. package/cli/registry/basic/context-menu.tsx +238 -0
  22. package/cli/registry/basic/data-table.tsx +73 -0
  23. package/cli/registry/basic/date-picker.tsx +84 -0
  24. package/cli/registry/basic/dialog.tsx +164 -0
  25. package/cli/registry/basic/direction.tsx +25 -0
  26. package/cli/registry/basic/drawer.tsx +162 -0
  27. package/cli/registry/basic/dropdown-menu.tsx +2 -7
  28. package/cli/registry/basic/empty.tsx +104 -0
  29. package/cli/registry/basic/field.tsx +248 -0
  30. package/cli/registry/basic/hover-card.tsx +57 -0
  31. package/cli/registry/basic/icon-button.tsx +18 -11
  32. package/cli/registry/basic/input-group.tsx +168 -0
  33. package/cli/registry/basic/input-otp.tsx +75 -0
  34. package/cli/registry/basic/input.tsx +43 -0
  35. package/cli/registry/basic/item.tsx +204 -0
  36. package/cli/registry/basic/label.tsx +24 -0
  37. package/cli/registry/basic/menubar.tsx +274 -0
  38. package/cli/registry/basic/native-select.tsx +62 -0
  39. package/cli/registry/basic/navigation-menu.tsx +168 -0
  40. package/cli/registry/basic/popover.tsx +58 -0
  41. package/cli/registry/basic/scroll-area.tsx +58 -0
  42. package/cli/registry/basic/select.tsx +24 -3
  43. package/cli/registry/basic/separator.tsx +26 -0
  44. package/cli/registry/basic/sheet.tsx +18 -0
  45. package/cli/registry/basic/spinner.tsx +20 -5
  46. package/cli/registry/basic/textarea.tsx +43 -0
  47. package/cli/registry/basic/toggle.tsx +1 -1
  48. package/cli/registry/basic/tooltip.tsx +2 -1
  49. package/cli/registry/basic/typography.tsx +1 -1
  50. package/cli/registry/chat/chat-input/chat-input-textarea.tsx +1 -1
  51. package/cli/registry/chat/chat-input/compound.tsx +4 -3
  52. package/cli/registry/chat/chat-input/context.tsx +4 -1
  53. package/cli/registry/chat/code-block-part.tsx +1 -1
  54. package/cli/registry/chat/conversation-anchor-nav.tsx +349 -0
  55. package/cli/registry/chat/file-attachment.tsx +2 -1
  56. package/cli/registry/chat/file-review-part.tsx +21 -21
  57. package/cli/registry/chat/markdown.tsx +2 -2
  58. package/cli/registry/chat/queue-indicator.tsx +1 -0
  59. package/cli/registry/chat/streaming-markdown-block.tsx +12 -8
  60. package/cli/registry/chat/tool-invocation-card.tsx +4 -1
  61. package/cli/registry/lib/file-icon-maps.ts +22 -22
  62. package/cli/registry/meta.json +600 -15
  63. package/cli/registry/tokens/ontology.json +404 -0
  64. package/cli/registry/tokens/scale/presets/compact.css +16 -5
  65. package/cli/registry/tokens/scale/presets/dense.css +13 -2
  66. package/cli/registry/tokens/scale/presets/sharp.css +18 -6
  67. package/cli/registry/tokens/scale/presets/soft.css +23 -1
  68. package/dist/registry/basic/alert-dialog.d.ts +1 -1
  69. package/dist/registry/basic/alert.d.ts +24 -0
  70. package/dist/registry/basic/aspect-ratio.d.ts +16 -0
  71. package/dist/registry/basic/avatar.d.ts +1 -1
  72. package/dist/registry/basic/breadcrumb.d.ts +24 -0
  73. package/dist/registry/basic/button-group.d.ts +26 -0
  74. package/dist/registry/basic/button.d.ts +3 -1
  75. package/dist/registry/basic/calendar.d.ts +22 -0
  76. package/dist/registry/basic/card.d.ts +32 -0
  77. package/dist/registry/basic/carousel.d.ts +19 -0
  78. package/dist/registry/basic/chart.d.ts +55 -0
  79. package/dist/registry/basic/checkbox.d.ts +21 -0
  80. package/dist/registry/basic/combobox.d.ts +37 -0
  81. package/dist/registry/basic/command.d.ts +18 -0
  82. package/dist/registry/basic/context-menu.d.ts +44 -0
  83. package/dist/registry/basic/data-table.d.ts +26 -0
  84. package/dist/registry/basic/date-picker.d.ts +27 -0
  85. package/dist/registry/basic/dialog.d.ts +39 -0
  86. package/dist/registry/basic/direction.d.ts +19 -0
  87. package/dist/registry/basic/drawer.d.ts +37 -0
  88. package/dist/registry/basic/empty.d.ts +22 -0
  89. package/dist/registry/basic/field.d.ts +24 -0
  90. package/dist/registry/basic/hover-card.d.ts +22 -0
  91. package/dist/registry/basic/icon-button.d.ts +2 -1
  92. package/dist/registry/basic/input-group.d.ts +29 -0
  93. package/dist/registry/basic/input-otp.d.ts +22 -0
  94. package/dist/registry/basic/input.d.ts +20 -0
  95. package/dist/registry/basic/item.d.ts +34 -0
  96. package/dist/registry/basic/label.d.ts +16 -0
  97. package/dist/registry/basic/menubar.d.ts +37 -0
  98. package/dist/registry/basic/native-select.d.ts +18 -0
  99. package/dist/registry/basic/navigation-menu.d.ts +25 -0
  100. package/dist/registry/basic/popover.d.ts +23 -0
  101. package/dist/registry/basic/resizable.d.ts +48 -48
  102. package/dist/registry/basic/scroll-area.d.ts +5 -0
  103. package/dist/registry/basic/select.d.ts +7 -2
  104. package/dist/registry/basic/separator.d.ts +16 -0
  105. package/dist/registry/basic/sheet.d.ts +13 -0
  106. package/dist/registry/basic/spinner.d.ts +6 -2
  107. package/dist/registry/basic/tag.d.ts +1 -1
  108. package/dist/registry/basic/textarea.d.ts +21 -0
  109. package/dist/registry/chat/chat-input/context.d.ts +3 -1
  110. package/dist/registry/chat/conversation-anchor-nav.d.ts +72 -0
  111. package/dist/registry/chat/tool-invocation-card.d.ts +2 -0
  112. package/dist/scale/computed.css +11 -0
  113. package/dist/scale/config.css +11 -0
  114. package/dist/scale/presets/compact.css +23 -5
  115. package/dist/scale/presets/dense.css +20 -2
  116. package/dist/scale/presets/sharp.css +25 -6
  117. package/dist/scale/presets/soft.css +30 -1
  118. package/dist/spark-design.cjs.js +37 -33
  119. package/dist/spark-design.es.js +10324 -8950
  120. package/dist/sparkdesign.css +1 -1
  121. package/dist/src/components/basic/Alert/index.d.ts +13 -0
  122. package/dist/src/components/basic/AspectRatio/index.d.ts +13 -0
  123. package/dist/src/components/basic/Breadcrumb/index.d.ts +12 -0
  124. package/dist/src/components/basic/ButtonGroup/index.d.ts +13 -0
  125. package/dist/src/components/basic/Calendar/index.d.ts +13 -0
  126. package/dist/src/components/basic/Card/index.d.ts +13 -0
  127. package/dist/src/components/basic/Carousel/index.d.ts +12 -0
  128. package/dist/src/components/basic/Chart/index.d.ts +13 -0
  129. package/dist/src/components/basic/Checkbox/index.d.ts +13 -0
  130. package/dist/src/components/basic/Combobox/index.d.ts +13 -0
  131. package/dist/src/components/basic/Command/index.d.ts +12 -0
  132. package/dist/src/components/basic/ContextMenu/index.d.ts +19 -0
  133. package/dist/src/components/basic/DataTable/index.d.ts +13 -0
  134. package/dist/src/components/basic/DatePicker/index.d.ts +13 -0
  135. package/dist/src/components/basic/Dialog/index.d.ts +16 -0
  136. package/dist/src/components/basic/Direction/index.d.ts +13 -0
  137. package/dist/src/components/basic/Drawer/index.d.ts +16 -0
  138. package/dist/src/components/basic/Empty/index.d.ts +12 -0
  139. package/dist/src/components/basic/Field/index.d.ts +12 -0
  140. package/dist/src/components/basic/HoverCard/index.d.ts +16 -0
  141. package/dist/src/components/basic/Input/index.d.ts +13 -0
  142. package/dist/src/components/basic/InputGroup/index.d.ts +12 -0
  143. package/dist/src/components/basic/InputOTP/index.d.ts +12 -0
  144. package/dist/src/components/basic/Item/index.d.ts +12 -0
  145. package/dist/src/components/basic/Label/index.d.ts +13 -0
  146. package/dist/src/components/basic/Menubar/index.d.ts +12 -0
  147. package/dist/src/components/basic/NativeSelect/index.d.ts +12 -0
  148. package/dist/src/components/basic/NavigationMenu/index.d.ts +12 -0
  149. package/dist/src/components/basic/Popover/index.d.ts +16 -0
  150. package/dist/src/components/basic/ScrollArea/index.d.ts +12 -0
  151. package/dist/src/components/basic/Separator/index.d.ts +13 -0
  152. package/dist/src/components/basic/Sheet/index.d.ts +13 -0
  153. package/dist/src/components/basic/Textarea/index.d.ts +13 -0
  154. package/dist/src/components/chat/ConversationAnchorNav/index.d.ts +13 -0
  155. package/dist/src/components/chat/StreamingMarkdownBlock/index.d.ts +13 -0
  156. package/dist/src/components/index.d.ts +58 -1
  157. package/dist/src/lib/index.d.ts +1 -1
  158. package/dist/src/lib/motion.d.ts +79 -0
  159. package/dist/theme-base.css +22 -0
  160. package/dist/themes/dark-mint.css +6 -0
  161. package/dist/themes/dark-parchment.css +6 -0
  162. package/dist/themes/light-parchment.css +6 -0
  163. package/dist/tokens/AGENTS.md +1 -0
  164. package/dist/tokens/scale/computed.css +11 -0
  165. package/dist/tokens/scale/config.css +11 -0
  166. package/dist/tokens/scale/presets/compact.css +23 -5
  167. package/dist/tokens/scale/presets/dense.css +20 -2
  168. package/dist/tokens/scale/presets/sharp.css +25 -6
  169. package/dist/tokens/scale/presets/soft.css +30 -1
  170. package/dist/tokens/theme-base.css +22 -0
  171. package/dist/tokens/themes/dark-mint.css +6 -0
  172. package/dist/tokens/themes/dark-parchment.css +6 -0
  173. package/dist/tokens/themes/light-parchment.css +6 -0
  174. package/docs/agent/component-selection.md +60 -0
  175. package/docs/agent/token-ontology.md +37 -0
  176. package/package.json +31 -5
  177. package/registry/agent-manifest.json +794 -0
  178. package/registry/tokens/ontology.json +404 -0
  179. package/dist/_basePickBy-DnQN8w3y.js +0 -151
  180. package/dist/_basePickBy-a-kPMlkg.cjs +0 -1
  181. package/dist/_baseUniq-B-N2NQ50.js +0 -614
  182. package/dist/_baseUniq-Cc_zbSif.cjs +0 -1
  183. package/dist/arc-BQBhijZ6.js +0 -83
  184. package/dist/arc-mWQt0Yph.cjs +0 -1
  185. package/dist/architectureDiagram-VXUJARFQ-BMZEucno.cjs +0 -36
  186. package/dist/architectureDiagram-VXUJARFQ-DTdjD3Bp.js +0 -4661
  187. package/dist/blockDiagram-VD42YOAC-CzHn0yob.js +0 -2256
  188. package/dist/blockDiagram-VD42YOAC-DDxdHAlz.cjs +0 -122
  189. package/dist/c4Diagram-YG6GDRKO-4Gz0I4gj.cjs +0 -10
  190. package/dist/c4Diagram-YG6GDRKO-BIy--yVN.js +0 -1580
  191. package/dist/channel-BQn0o8bs.js +0 -5
  192. package/dist/channel-DaN7XniJ.cjs +0 -1
  193. package/dist/chunk-4BX2VUAB-BlQFTQqz.cjs +0 -1
  194. package/dist/chunk-4BX2VUAB-Czitj3Kc.js +0 -8
  195. package/dist/chunk-55IACEB6-DXacNZbO.js +0 -8
  196. package/dist/chunk-55IACEB6-DnDxpye9.cjs +0 -1
  197. package/dist/chunk-B4BG7PRW-CBdN0q_V.js +0 -1375
  198. package/dist/chunk-B4BG7PRW-DbGvUkGO.cjs +0 -165
  199. package/dist/chunk-DI55MBZ5-D1YJMs6x.cjs +0 -220
  200. package/dist/chunk-DI55MBZ5-NCQTvayw.js +0 -1370
  201. package/dist/chunk-FMBD7UC4-CsGMbrtr.js +0 -19
  202. package/dist/chunk-FMBD7UC4-Di7cUUh5.cjs +0 -15
  203. package/dist/chunk-QN33PNHL-0j5LC8Lm.cjs +0 -1
  204. package/dist/chunk-QN33PNHL-3GERZBRm.js +0 -19
  205. package/dist/chunk-QZHKN3VN-AVEY9ImQ.js +0 -15
  206. package/dist/chunk-QZHKN3VN-s8Z0a8mc.cjs +0 -1
  207. package/dist/chunk-TZMSLE5B-CAf87HPt.cjs +0 -1
  208. package/dist/chunk-TZMSLE5B-sbiflal0.js +0 -64
  209. package/dist/classDiagram-2ON5EDUG-Ct9JLIN2.cjs +0 -1
  210. package/dist/classDiagram-2ON5EDUG-Dzfrft3a.js +0 -16
  211. package/dist/classDiagram-v2-WZHVMYZB-Ct9JLIN2.cjs +0 -1
  212. package/dist/classDiagram-v2-WZHVMYZB-Dzfrft3a.js +0 -16
  213. package/dist/clone-Cde_NQ8V.js +0 -8
  214. package/dist/clone-DCNjWuM2.cjs +0 -1
  215. package/dist/cose-bilkent-S5V4N54A-0uLijMro.cjs +0 -1
  216. package/dist/cose-bilkent-S5V4N54A-Bb08N431.js +0 -2608
  217. package/dist/cytoscape.esm-CNUX3VTg.cjs +0 -321
  218. package/dist/cytoscape.esm-Cvf3sx9F.js +0 -18704
  219. package/dist/dagre-6UL2VRFP-CY_Wz5Zd.js +0 -444
  220. package/dist/dagre-6UL2VRFP-Dxe7_qZc.cjs +0 -4
  221. package/dist/defaultLocale-BgPVtth8.js +0 -171
  222. package/dist/defaultLocale-C4wbwF1n.cjs +0 -1
  223. package/dist/diagram-PSM6KHXK-D2bdb7MT.js +0 -531
  224. package/dist/diagram-PSM6KHXK-YF69SUjY.cjs +0 -24
  225. package/dist/diagram-QEK2KX5R-BpUSoh0-.js +0 -217
  226. package/dist/diagram-QEK2KX5R-DZPGteon.cjs +0 -43
  227. package/dist/diagram-S2PKOQOG-ht-zdvFG.cjs +0 -24
  228. package/dist/diagram-S2PKOQOG-zFeLJ50Z.js +0 -142
  229. package/dist/erDiagram-Q2GNP2WA-B38iJ6ts.js +0 -841
  230. package/dist/erDiagram-Q2GNP2WA-RgS80DDU.cjs +0 -60
  231. package/dist/flowDiagram-NV44I4VS-BHilOs2p.cjs +0 -162
  232. package/dist/flowDiagram-NV44I4VS-BrBJcoce.js +0 -1620
  233. package/dist/ganttDiagram-JELNMOA3-pZiJeFio.cjs +0 -267
  234. package/dist/ganttDiagram-JELNMOA3-tw6FhkWJ.js +0 -2670
  235. package/dist/gitGraphDiagram-V2S2FVAM-BWn5uIK5.js +0 -699
  236. package/dist/gitGraphDiagram-V2S2FVAM-DKKeG-9R.cjs +0 -65
  237. package/dist/graph-DIbblrZP.cjs +0 -1
  238. package/dist/graph-DPcK91G3.js +0 -247
  239. package/dist/infoDiagram-HS3SLOUP-B8gwwhct.cjs +0 -2
  240. package/dist/infoDiagram-HS3SLOUP-D47PNcP_.js +0 -24
  241. package/dist/init-CHZsXQcr.cjs +0 -1
  242. package/dist/init-DjUOC4st.js +0 -16
  243. package/dist/journeyDiagram-XKPGCS4Q-BG3cfhyU.js +0 -834
  244. package/dist/journeyDiagram-XKPGCS4Q-D8DVLJof.cjs +0 -139
  245. package/dist/kanban-definition-3W4ZIXB7-4OCnEouP.cjs +0 -89
  246. package/dist/kanban-definition-3W4ZIXB7-CWi_ssF9.js +0 -719
  247. package/dist/layout-Byuh8f-J.cjs +0 -1
  248. package/dist/layout-CdLdvj1j.js +0 -1335
  249. package/dist/linear-C2Q_PI9B.js +0 -259
  250. package/dist/linear-C69aPBW1.cjs +0 -1
  251. package/dist/mermaid.core-DBwAx_jp.cjs +0 -249
  252. package/dist/mermaid.core-gFR0XUlD.js +0 -15300
  253. package/dist/mindmap-definition-VGOIOE7T-8P7obVV4.cjs +0 -68
  254. package/dist/mindmap-definition-VGOIOE7T-DnOa7WJ9.js +0 -784
  255. package/dist/ordinal-B6-f3MAq.js +0 -61
  256. package/dist/ordinal-CagbB1m8.cjs +0 -1
  257. package/dist/pieDiagram-ADFJNKIX-5NAlvhMo.js +0 -161
  258. package/dist/pieDiagram-ADFJNKIX-CQBG4yR9.cjs +0 -30
  259. package/dist/quadrantDiagram-AYHSOK5B-Oe4y7RZ0.cjs +0 -7
  260. package/dist/quadrantDiagram-AYHSOK5B-rh2DPEP1.js +0 -1022
  261. package/dist/requirementDiagram-UZGBJVZJ-DcWaCuXr.js +0 -850
  262. package/dist/requirementDiagram-UZGBJVZJ-gfdlrFiq.cjs +0 -64
  263. package/dist/sankeyDiagram-TZEHDZUN-CQIKFwD0.js +0 -810
  264. package/dist/sankeyDiagram-TZEHDZUN-DvPtzQvC.cjs +0 -10
  265. package/dist/sequenceDiagram-WL72ISMW-BNrsMagL.cjs +0 -145
  266. package/dist/sequenceDiagram-WL72ISMW-iCX3ckKx.js +0 -2511
  267. package/dist/stateDiagram-FKZM4ZOC-DBvJ_eeL.cjs +0 -1
  268. package/dist/stateDiagram-FKZM4ZOC-ZVsJlaHJ.js +0 -263
  269. package/dist/stateDiagram-v2-4FDKWEC3-CB_nTHcE.js +0 -16
  270. package/dist/stateDiagram-v2-4FDKWEC3-Xkx17v6T.cjs +0 -1
  271. package/dist/timeline-definition-IT6M3QCI-BmGkYQiz.cjs +0 -61
  272. package/dist/timeline-definition-IT6M3QCI-Ck8zTt6w.js +0 -795
  273. package/dist/treemap-GDKQZRPO-B9sfERx8.js +0 -17922
  274. package/dist/treemap-GDKQZRPO-BVfJRs0Z.cjs +0 -160
  275. package/dist/xychartDiagram-PRI3JC2R-By_S8NzN.js +0 -1340
  276. package/dist/xychartDiagram-PRI3JC2R-CNfDrGxM.cjs +0 -7
@@ -3,6 +3,7 @@ import { motion } from 'framer-motion'
3
3
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'
4
4
  import { cva, type VariantProps } from 'class-variance-authority'
5
5
  import { cn } from '@/lib/utils'
6
+ import { MOTION_FADE, MOTION_SLIDE_UP } from '@/lib/motion'
6
7
  import { getThemeFromDocument } from './theme-from-document'
7
8
 
8
9
  const AlertDialog = AlertDialogPrimitive.Root
@@ -16,9 +17,7 @@ const AlertDialogOverlay = React.forwardRef<
16
17
  <AlertDialogPrimitive.Overlay ref={ref} asChild {...props}>
17
18
  <motion.div
18
19
  className={cn('fixed inset-0 z-50 bg-bg-mask/60', className)}
19
- initial={{ opacity: 0 }}
20
- animate={{ opacity: 1 }}
21
- transition={{ duration: 0.15 }}
20
+ {...MOTION_FADE}
22
21
  />
23
22
  </AlertDialogPrimitive.Overlay>
24
23
  ))
@@ -59,9 +58,7 @@ const AlertDialogContent = React.forwardRef<
59
58
  <AlertDialogPrimitive.Content ref={ref} asChild {...props}>
60
59
  <motion.div
61
60
  className={cn(contentVariants({ size }), className)}
62
- initial={{ opacity: 0, y: 8 }}
63
- animate={{ opacity: 1, y: 0 }}
64
- transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}
61
+ {...MOTION_SLIDE_UP}
65
62
  >
66
63
  {children}
67
64
  </motion.div>
@@ -0,0 +1,76 @@
1
+ import * as React from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+ import { cn } from '@/lib/utils'
4
+
5
+ const alertVariants = cva(
6
+ 'relative grid w-full items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm',
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default: 'border-border-tertiary bg-bg-container text-text [&>svg]:text-text-secondary',
11
+ info: 'border-primary-border bg-primary-bg text-text [&>svg]:text-primary',
12
+ success: 'border-success-border bg-success-bg text-text [&>svg]:text-success',
13
+ warning: 'border-warning-border bg-warning-bg text-text [&>svg]:text-warning',
14
+ destructive: 'border-error-border bg-error-bg text-text [&>svg]:text-error',
15
+ },
16
+ },
17
+ defaultVariants: { variant: 'default' },
18
+ },
19
+ )
20
+
21
+ export interface AlertProps
22
+ extends React.HTMLAttributes<HTMLDivElement>,
23
+ VariantProps<typeof alertVariants> {}
24
+
25
+ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
26
+ ({ className, variant, ...props }, ref) => (
27
+ <div
28
+ ref={ref}
29
+ role="alert"
30
+ className={cn(
31
+ alertVariants({ variant }),
32
+ 'has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-3',
33
+ '[&>svg]:size-4 [&>svg]:translate-y-0.5',
34
+ className,
35
+ )}
36
+ {...props}
37
+ />
38
+ ),
39
+ )
40
+ Alert.displayName = 'Alert'
41
+
42
+ const AlertTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
43
+ ({ className, ...props }, ref) => (
44
+ <div
45
+ ref={ref}
46
+ className={cn(
47
+ 'col-start-2 min-h-4 font-medium leading-5 tracking-tight text-text',
48
+ 'line-clamp-1',
49
+ className,
50
+ )}
51
+ {...props}
52
+ />
53
+ ),
54
+ )
55
+ AlertTitle.displayName = 'AlertTitle'
56
+
57
+ const AlertDescription = React.forwardRef<
58
+ HTMLDivElement,
59
+ React.HTMLAttributes<HTMLDivElement>
60
+ >(({ className, ...props }, ref) => (
61
+ <div
62
+ ref={ref}
63
+ className={cn(
64
+ 'col-start-2 grid justify-items-start gap-1 text-sm leading-6 text-text-secondary',
65
+ '[&_p]:leading-6',
66
+ className,
67
+ )}
68
+ {...props}
69
+ />
70
+ ))
71
+ AlertDescription.displayName = 'AlertDescription'
72
+
73
+ export type AlertTitleProps = React.HTMLAttributes<HTMLDivElement>
74
+ export type AlertDescriptionProps = React.HTMLAttributes<HTMLDivElement>
75
+
76
+ export { Alert, AlertTitle, AlertDescription, alertVariants }
@@ -0,0 +1,8 @@
1
+ import type * as React from 'react'
2
+ import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'
3
+
4
+ const AspectRatio = AspectRatioPrimitive.Root
5
+
6
+ export type AspectRatioProps = React.ComponentPropsWithoutRef<typeof AspectRatioPrimitive.Root>
7
+
8
+ export { AspectRatio }
@@ -0,0 +1,117 @@
1
+ import * as React from 'react'
2
+ import { cn } from '@/lib/utils'
3
+ import { MoreLine } from './icons-inline'
4
+
5
+ const Breadcrumb = React.forwardRef<
6
+ HTMLElement,
7
+ React.ComponentPropsWithoutRef<'nav'> & { separator?: React.ReactNode }
8
+ >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />)
9
+ Breadcrumb.displayName = 'Breadcrumb'
10
+
11
+ const BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(
12
+ ({ className, ...props }, ref) => (
13
+ <ol
14
+ ref={ref}
15
+ className={cn(
16
+ 'flex flex-wrap items-center gap-1.5 text-sm text-text-tertiary break-words sm:gap-2.5',
17
+ className,
18
+ )}
19
+ {...props}
20
+ />
21
+ ),
22
+ )
23
+ BreadcrumbList.displayName = 'BreadcrumbList'
24
+
25
+ const BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(
26
+ ({ className, ...props }, ref) => (
27
+ <li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />
28
+ ),
29
+ )
30
+ BreadcrumbItem.displayName = 'BreadcrumbItem'
31
+
32
+ const BreadcrumbLink = React.forwardRef<
33
+ HTMLAnchorElement,
34
+ React.ComponentPropsWithoutRef<'a'> & { asChild?: boolean }
35
+ >(({ className, asChild, ...props }, ref) => {
36
+ if (asChild) {
37
+ return (
38
+ <span
39
+ className={cn('transition-colors hover:text-text', className)}
40
+ {...(props as React.HTMLAttributes<HTMLSpanElement>)}
41
+ />
42
+ )
43
+ }
44
+ return (
45
+ <a
46
+ ref={ref}
47
+ className={cn('transition-colors hover:text-text', className)}
48
+ {...props}
49
+ />
50
+ )
51
+ })
52
+ BreadcrumbLink.displayName = 'BreadcrumbLink'
53
+
54
+ const BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>(
55
+ ({ className, ...props }, ref) => (
56
+ <span
57
+ ref={ref}
58
+ role="link"
59
+ aria-disabled="true"
60
+ aria-current="page"
61
+ className={cn('font-normal text-text', className)}
62
+ {...props}
63
+ />
64
+ ),
65
+ )
66
+ BreadcrumbPage.displayName = 'BreadcrumbPage'
67
+
68
+ const BreadcrumbSeparator: React.FC<React.ComponentPropsWithoutRef<'li'>> = ({
69
+ children,
70
+ className,
71
+ ...props
72
+ }) => (
73
+ <li
74
+ role="presentation"
75
+ aria-hidden="true"
76
+ className={cn('[&>svg]:size-3.5 text-text-tertiary', className)}
77
+ {...props}
78
+ >
79
+ {children ?? (
80
+ <svg
81
+ xmlns="http://www.w3.org/2000/svg"
82
+ viewBox="0 0 24 24"
83
+ fill="currentColor"
84
+ aria-hidden
85
+ >
86
+ <path d="M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6z" />
87
+ </svg>
88
+ )}
89
+ </li>
90
+ )
91
+ BreadcrumbSeparator.displayName = 'BreadcrumbSeparator'
92
+
93
+ const BreadcrumbEllipsis: React.FC<React.ComponentPropsWithoutRef<'span'>> = ({
94
+ className,
95
+ ...props
96
+ }) => (
97
+ <span
98
+ role="presentation"
99
+ aria-hidden="true"
100
+ className={cn('flex size-9 items-center justify-center', className)}
101
+ {...props}
102
+ >
103
+ <MoreLine className="size-4" />
104
+ <span className="sr-only">More</span>
105
+ </span>
106
+ )
107
+ BreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'
108
+
109
+ export {
110
+ Breadcrumb,
111
+ BreadcrumbList,
112
+ BreadcrumbItem,
113
+ BreadcrumbLink,
114
+ BreadcrumbPage,
115
+ BreadcrumbSeparator,
116
+ BreadcrumbEllipsis,
117
+ }
@@ -0,0 +1,79 @@
1
+ import * as React from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+ import { cn } from '@/lib/utils'
4
+
5
+ const buttonGroupVariants = cva(
6
+ // isolate + z-10 on focused child keeps focus ring from being clipped by siblings.
7
+ 'inline-flex isolate [&>*]:focus-visible:relative [&>*]:focus-visible:z-10',
8
+ {
9
+ variants: {
10
+ orientation: {
11
+ horizontal:
12
+ 'flex-row items-stretch [&>*:not(:first-child)]:-ml-px [&>*:not(:first-child)]:rounded-l-none [&>*:not(:last-child)]:rounded-r-none',
13
+ vertical:
14
+ 'flex-col [&>*:not(:first-child)]:-mt-px [&>*:not(:first-child)]:rounded-t-none [&>*:not(:last-child)]:rounded-b-none',
15
+ },
16
+ },
17
+ defaultVariants: {
18
+ orientation: 'horizontal',
19
+ },
20
+ },
21
+ )
22
+
23
+ export interface ButtonGroupProps
24
+ extends React.HTMLAttributes<HTMLDivElement>,
25
+ VariantProps<typeof buttonGroupVariants> {}
26
+
27
+ const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(
28
+ ({ className, orientation = 'horizontal', ...props }, ref) => (
29
+ <div
30
+ ref={ref}
31
+ role="group"
32
+ data-orientation={orientation ?? 'horizontal'}
33
+ className={cn(buttonGroupVariants({ orientation }), className)}
34
+ {...props}
35
+ />
36
+ ),
37
+ )
38
+ ButtonGroup.displayName = 'ButtonGroup'
39
+
40
+ export type ButtonGroupTextProps = React.HTMLAttributes<HTMLDivElement>
41
+
42
+ const ButtonGroupText = React.forwardRef<HTMLDivElement, ButtonGroupTextProps>(
43
+ ({ className, ...props }, ref) => (
44
+ <div
45
+ ref={ref}
46
+ className={cn(
47
+ 'inline-flex h-9 shrink-0 items-center gap-1.5 rounded bg-fill-secondary px-3 text-sm font-medium text-text select-none',
48
+ "[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
49
+ className,
50
+ )}
51
+ {...props}
52
+ />
53
+ ),
54
+ )
55
+ ButtonGroupText.displayName = 'ButtonGroupText'
56
+
57
+ export interface ButtonGroupSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
58
+ orientation?: 'horizontal' | 'vertical'
59
+ }
60
+
61
+ const ButtonGroupSeparator = React.forwardRef<HTMLDivElement, ButtonGroupSeparatorProps>(
62
+ ({ className, orientation = 'vertical', ...props }, ref) => (
63
+ <div
64
+ ref={ref}
65
+ role="separator"
66
+ aria-orientation={orientation}
67
+ data-orientation={orientation}
68
+ className={cn(
69
+ 'shrink-0 self-stretch bg-border-tertiary',
70
+ orientation === 'vertical' ? 'w-px' : 'h-px w-full',
71
+ className,
72
+ )}
73
+ {...props}
74
+ />
75
+ ),
76
+ )
77
+ ButtonGroupSeparator.displayName = 'ButtonGroupSeparator'
78
+
79
+ export { ButtonGroup, ButtonGroupText, ButtonGroupSeparator, buttonGroupVariants }
@@ -1,18 +1,22 @@
1
1
  import { forwardRef } from 'react'
2
2
  import type { ButtonHTMLAttributes, ReactNode } from 'react'
3
+ import { Slot } from 'radix-ui'
3
4
  import { cva, type VariantProps } from 'class-variance-authority'
4
5
  import { cn } from '@/lib/utils'
6
+ import { Spinner } from './spinner'
5
7
 
6
8
  const buttonVariants = cva(
7
- 'inline-flex items-center justify-center gap-1.5 font-medium transition-colors duration-200 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer',
9
+ 'inline-flex items-center justify-center gap-1.5 font-medium transition-[colors,transform] duration-200 active:scale-[0.98] focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer',
8
10
  {
9
11
  variants: {
10
12
  variant: {
11
13
  primary: 'bg-primary text-text-on-primary hover:bg-primary-hover',
12
14
  secondary: 'bg-bg-highlight text-text-on-primary hover:bg-bg-highlight-hover',
13
15
  tertiary: 'bg-fill-secondary text-text hover:bg-fill',
16
+ outline: 'border border-border-tertiary bg-bg-container text-text hover:bg-fill-secondary',
14
17
  ghost: 'bg-transparent text-text-secondary hover:bg-fill-secondary hover:text-text',
15
18
  text: 'bg-transparent text-text-secondary hover:text-text',
19
+ destructive: 'bg-error text-text-on-primary hover:bg-error-hover',
16
20
  },
17
21
  size: {
18
22
  sm: 'h-7 px-2 text-xs',
@@ -49,6 +53,8 @@ export interface ButtonProps
49
53
  textButton?: boolean
50
54
  prefixIcon?: ReactNode
51
55
  suffixIcon?: ReactNode
56
+ loading?: boolean
57
+ asChild?: boolean
52
58
  }
53
59
 
54
60
  const Button = forwardRef<HTMLButtonElement, ButtonProps>(
@@ -62,13 +68,17 @@ const Button = forwardRef<HTMLButtonElement, ButtonProps>(
62
68
  suffixIcon,
63
69
  rounded = 'square',
64
70
  disabled = false,
71
+ loading = false,
72
+ asChild = false,
65
73
  className,
66
74
  ...props
67
75
  },
68
76
  ref
69
77
  ) => {
78
+ const Comp = asChild ? Slot.Root : 'button'
79
+ const isDisabled = disabled || loading
70
80
  return (
71
- <button
81
+ <Comp
72
82
  ref={ref}
73
83
  className={buttonVariants({
74
84
  variant: textButton ? 'text' : variant,
@@ -77,21 +87,24 @@ const Button = forwardRef<HTMLButtonElement, ButtonProps>(
77
87
  textOnly: textButton,
78
88
  className,
79
89
  })}
80
- disabled={disabled}
90
+ disabled={isDisabled}
91
+ aria-busy={loading || undefined}
81
92
  {...props}
82
93
  >
83
- {prefixIcon && (
94
+ {loading ? (
95
+ <Spinner className="shrink-0" />
96
+ ) : prefixIcon ? (
84
97
  <span className="inline-flex shrink-0 items-center justify-center [&>*]:block [&>*]:leading-none">
85
98
  {prefixIcon}
86
99
  </span>
87
- )}
100
+ ) : null}
88
101
  {children}
89
102
  {suffixIcon && (
90
103
  <span className="inline-flex shrink-0 items-center justify-center [&>*]:block [&>*]:leading-none">
91
104
  {suffixIcon}
92
105
  </span>
93
106
  )}
94
- </button>
107
+ </Comp>
95
108
  )
96
109
  }
97
110
  )
@@ -0,0 +1,221 @@
1
+ import * as React from "react"
2
+ import {
3
+ ChevronDownIcon,
4
+ ChevronLeftIcon,
5
+ ChevronRightIcon,
6
+ } from "lucide-react"
7
+ import {
8
+ DayPicker,
9
+ getDefaultClassNames,
10
+ type DayButton,
11
+ } from "react-day-picker"
12
+
13
+ import { cn } from "@/lib/utils"
14
+ import { Button, buttonVariants } from "./button"
15
+
16
+ function Calendar({
17
+ className,
18
+ classNames,
19
+ showOutsideDays = true,
20
+ captionLayout = "label",
21
+ buttonVariant = "ghost",
22
+ formatters,
23
+ components,
24
+ ...props
25
+ }: React.ComponentProps<typeof DayPicker> & {
26
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"]
27
+ }) {
28
+ const defaultClassNames = getDefaultClassNames()
29
+
30
+ return (
31
+ <DayPicker
32
+ showOutsideDays={showOutsideDays}
33
+ className={cn(
34
+ "group/calendar bg-bg-base p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
35
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
36
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
37
+ className
38
+ )}
39
+ captionLayout={captionLayout}
40
+ formatters={{
41
+ formatMonthDropdown: (date) =>
42
+ date.toLocaleString("default", { month: "short" }),
43
+ ...formatters,
44
+ }}
45
+ classNames={{
46
+ root: cn("w-fit", defaultClassNames.root),
47
+ months: cn(
48
+ "relative flex flex-col gap-4 md:flex-row",
49
+ defaultClassNames.months
50
+ ),
51
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
52
+ nav: cn(
53
+ "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
54
+ defaultClassNames.nav
55
+ ),
56
+ button_previous: cn(
57
+ buttonVariants({ variant: buttonVariant }),
58
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
59
+ defaultClassNames.button_previous
60
+ ),
61
+ button_next: cn(
62
+ buttonVariants({ variant: buttonVariant }),
63
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
64
+ defaultClassNames.button_next
65
+ ),
66
+ month_caption: cn(
67
+ "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
68
+ defaultClassNames.month_caption
69
+ ),
70
+ dropdowns: cn(
71
+ "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium",
72
+ defaultClassNames.dropdowns
73
+ ),
74
+ dropdown_root: cn(
75
+ "relative rounded-md border border-border-tertiary shadow-sm has-focus:border-primary-border has-focus:ring-[3px] has-focus:ring-primary-border/50",
76
+ defaultClassNames.dropdown_root
77
+ ),
78
+ dropdown: cn(
79
+ "absolute inset-0 bg-bg-container opacity-0",
80
+ defaultClassNames.dropdown
81
+ ),
82
+ caption_label: cn(
83
+ "font-medium select-none",
84
+ captionLayout === "label"
85
+ ? "text-sm"
86
+ : "flex h-8 items-center gap-1 rounded-md pr-1 pl-2 text-sm [&>svg]:size-3.5 [&>svg]:text-text-tertiary",
87
+ defaultClassNames.caption_label
88
+ ),
89
+ table: "w-full border-collapse",
90
+ weekdays: cn("flex", defaultClassNames.weekdays),
91
+ weekday: cn(
92
+ "flex-1 rounded-md text-[0.8rem] font-normal text-text-tertiary select-none",
93
+ defaultClassNames.weekday
94
+ ),
95
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
96
+ week_number_header: cn(
97
+ "w-(--cell-size) select-none",
98
+ defaultClassNames.week_number_header
99
+ ),
100
+ week_number: cn(
101
+ "text-[0.8rem] text-text-tertiary select-none",
102
+ defaultClassNames.week_number
103
+ ),
104
+ day: cn(
105
+ "group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md",
106
+ props.showWeekNumber
107
+ ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-md"
108
+ : "[&:first-child[data-selected=true]_button]:rounded-l-md",
109
+ defaultClassNames.day
110
+ ),
111
+ range_start: cn(
112
+ "rounded-l-md bg-fill-secondary",
113
+ defaultClassNames.range_start
114
+ ),
115
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
116
+ range_end: cn("rounded-r-md bg-fill-secondary", defaultClassNames.range_end),
117
+ today: cn(
118
+ "rounded-md bg-fill-secondary text-text data-[selected=true]:rounded-none",
119
+ defaultClassNames.today
120
+ ),
121
+ outside: cn(
122
+ "text-text-tertiary aria-selected:text-text-tertiary",
123
+ defaultClassNames.outside
124
+ ),
125
+ disabled: cn(
126
+ "text-text-tertiary opacity-50",
127
+ defaultClassNames.disabled
128
+ ),
129
+ hidden: cn("invisible", defaultClassNames.hidden),
130
+ ...classNames,
131
+ }}
132
+ components={{
133
+ Root: ({ className, rootRef, ...props }) => {
134
+ return (
135
+ <div
136
+ data-slot="calendar"
137
+ ref={rootRef}
138
+ className={cn(className)}
139
+ {...props}
140
+ />
141
+ )
142
+ },
143
+ Chevron: ({ className, orientation, ...props }) => {
144
+ if (orientation === "left") {
145
+ return (
146
+ <ChevronLeftIcon className={cn("size-4", className)} {...props} />
147
+ )
148
+ }
149
+
150
+ if (orientation === "right") {
151
+ return (
152
+ <ChevronRightIcon
153
+ className={cn("size-4", className)}
154
+ {...props}
155
+ />
156
+ )
157
+ }
158
+
159
+ return (
160
+ <ChevronDownIcon className={cn("size-4", className)} {...props} />
161
+ )
162
+ },
163
+ DayButton: CalendarDayButton,
164
+ WeekNumber: ({ children, ...props }) => {
165
+ return (
166
+ <td {...props}>
167
+ <div className="flex size-(--cell-size) items-center justify-center text-center">
168
+ {children}
169
+ </div>
170
+ </td>
171
+ )
172
+ },
173
+ ...components,
174
+ }}
175
+ {...props}
176
+ />
177
+ )
178
+ }
179
+
180
+ export type CalendarProps = React.ComponentProps<typeof DayPicker> & {
181
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"]
182
+ }
183
+
184
+ function CalendarDayButton({
185
+ className,
186
+ day,
187
+ modifiers,
188
+ ...props
189
+ }: React.ComponentProps<typeof DayButton>) {
190
+ const defaultClassNames = getDefaultClassNames()
191
+
192
+ const ref = React.useRef<HTMLButtonElement>(null)
193
+ React.useEffect(() => {
194
+ if (modifiers.focused) ref.current?.focus()
195
+ }, [modifiers.focused])
196
+
197
+ return (
198
+ <button
199
+ ref={ref}
200
+ data-day={day.date.toLocaleDateString()}
201
+ data-selected-single={
202
+ modifiers.selected &&
203
+ !modifiers.range_start &&
204
+ !modifiers.range_end &&
205
+ !modifiers.range_middle
206
+ }
207
+ data-range-start={modifiers.range_start}
208
+ data-range-end={modifiers.range_end}
209
+ data-range-middle={modifiers.range_middle}
210
+ className={cn(
211
+ "inline-flex items-center justify-center transition-colors hover:bg-fill-secondary hover:text-text",
212
+ "flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 px-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-primary-border group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-primary-border/50 data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-text-on-primary data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-fill-secondary data-[range-middle=true]:text-text data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-text-on-primary data-[selected-single=true]:bg-primary data-[selected-single=true]:text-text-on-primary dark:hover:text-text [&>span]:text-xs [&>span]:opacity-70",
213
+ defaultClassNames.day,
214
+ className
215
+ )}
216
+ {...props}
217
+ />
218
+ )
219
+ }
220
+
221
+ export { Calendar, CalendarDayButton }