sparkdesign 0.4.6 → 0.4.7

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 (252) 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.tsx +76 -0
  8. package/cli/registry/basic/aspect-ratio.tsx +8 -0
  9. package/cli/registry/basic/breadcrumb.tsx +117 -0
  10. package/cli/registry/basic/button-group.tsx +79 -0
  11. package/cli/registry/basic/button.tsx +1 -1
  12. package/cli/registry/basic/calendar.tsx +221 -0
  13. package/cli/registry/basic/card.tsx +103 -0
  14. package/cli/registry/basic/carousel.tsx +241 -0
  15. package/cli/registry/basic/chart.tsx +372 -0
  16. package/cli/registry/basic/checkbox.tsx +42 -0
  17. package/cli/registry/basic/collapsible-card.tsx +2 -2
  18. package/cli/registry/basic/combobox.tsx +75 -0
  19. package/cli/registry/basic/command.tsx +184 -0
  20. package/cli/registry/basic/context-menu.tsx +239 -0
  21. package/cli/registry/basic/data-table.tsx +73 -0
  22. package/cli/registry/basic/date-picker.tsx +13 -0
  23. package/cli/registry/basic/dialog.tsx +169 -0
  24. package/cli/registry/basic/direction.tsx +25 -0
  25. package/cli/registry/basic/drawer.tsx +164 -0
  26. package/cli/registry/basic/dropdown-menu.tsx +0 -4
  27. package/cli/registry/basic/empty.tsx +104 -0
  28. package/cli/registry/basic/field.tsx +248 -0
  29. package/cli/registry/basic/hover-card.tsx +58 -0
  30. package/cli/registry/basic/input-group.tsx +168 -0
  31. package/cli/registry/basic/input-otp.tsx +75 -0
  32. package/cli/registry/basic/input.tsx +27 -0
  33. package/cli/registry/basic/item.tsx +204 -0
  34. package/cli/registry/basic/label.tsx +24 -0
  35. package/cli/registry/basic/menubar.tsx +274 -0
  36. package/cli/registry/basic/native-select.tsx +62 -0
  37. package/cli/registry/basic/navigation-menu.tsx +168 -0
  38. package/cli/registry/basic/popover.tsx +59 -0
  39. package/cli/registry/basic/scroll-area.tsx +58 -0
  40. package/cli/registry/basic/select.tsx +2 -1
  41. package/cli/registry/basic/separator.tsx +26 -0
  42. package/cli/registry/basic/sheet.tsx +18 -0
  43. package/cli/registry/basic/textarea.tsx +25 -0
  44. package/cli/registry/basic/toggle.tsx +1 -1
  45. package/cli/registry/basic/typography.tsx +1 -1
  46. package/cli/registry/chat/chat-input/chat-input-textarea.tsx +1 -1
  47. package/cli/registry/chat/chat-input/compound.tsx +4 -3
  48. package/cli/registry/chat/chat-input/context.tsx +4 -1
  49. package/cli/registry/chat/code-block-part.tsx +1 -1
  50. package/cli/registry/chat/conversation-anchor-nav.tsx +349 -0
  51. package/cli/registry/chat/file-attachment.tsx +2 -1
  52. package/cli/registry/chat/file-review-part.tsx +21 -21
  53. package/cli/registry/chat/markdown.tsx +2 -2
  54. package/cli/registry/chat/queue-indicator.tsx +1 -0
  55. package/cli/registry/chat/streaming-markdown-block.tsx +12 -8
  56. package/cli/registry/chat/tool-invocation-card.tsx +4 -1
  57. package/cli/registry/lib/file-icon-maps.ts +22 -22
  58. package/cli/registry/meta.json +518 -0
  59. package/cli/registry/tokens/ontology.json +404 -0
  60. package/cli/registry/tokens/scale/presets/compact.css +16 -5
  61. package/cli/registry/tokens/scale/presets/dense.css +13 -2
  62. package/cli/registry/tokens/scale/presets/sharp.css +18 -6
  63. package/cli/registry/tokens/scale/presets/soft.css +23 -1
  64. package/dist/registry/basic/alert.d.ts +24 -0
  65. package/dist/registry/basic/aspect-ratio.d.ts +16 -0
  66. package/dist/registry/basic/breadcrumb.d.ts +24 -0
  67. package/dist/registry/basic/button-group.d.ts +26 -0
  68. package/dist/registry/basic/button.d.ts +1 -1
  69. package/dist/registry/basic/calendar.d.ts +22 -0
  70. package/dist/registry/basic/card.d.ts +27 -0
  71. package/dist/registry/basic/carousel.d.ts +19 -0
  72. package/dist/registry/basic/chart.d.ts +55 -0
  73. package/dist/registry/basic/checkbox.d.ts +21 -0
  74. package/dist/registry/basic/combobox.d.ts +26 -0
  75. package/dist/registry/basic/command.d.ts +18 -0
  76. package/dist/registry/basic/context-menu.d.ts +44 -0
  77. package/dist/registry/basic/data-table.d.ts +26 -0
  78. package/dist/registry/basic/date-picker.d.ts +18 -0
  79. package/dist/registry/basic/dialog.d.ts +39 -0
  80. package/dist/registry/basic/direction.d.ts +19 -0
  81. package/dist/registry/basic/drawer.d.ts +37 -0
  82. package/dist/registry/basic/empty.d.ts +22 -0
  83. package/dist/registry/basic/field.d.ts +24 -0
  84. package/dist/registry/basic/hover-card.d.ts +22 -0
  85. package/dist/registry/basic/input-group.d.ts +27 -0
  86. package/dist/registry/basic/input-otp.d.ts +22 -0
  87. package/dist/registry/basic/input.d.ts +15 -0
  88. package/dist/registry/basic/item.d.ts +34 -0
  89. package/dist/registry/basic/label.d.ts +16 -0
  90. package/dist/registry/basic/menubar.d.ts +37 -0
  91. package/dist/registry/basic/native-select.d.ts +18 -0
  92. package/dist/registry/basic/navigation-menu.d.ts +25 -0
  93. package/dist/registry/basic/popover.d.ts +23 -0
  94. package/dist/registry/basic/scroll-area.d.ts +5 -0
  95. package/dist/registry/basic/separator.d.ts +16 -0
  96. package/dist/registry/basic/sheet.d.ts +13 -0
  97. package/dist/registry/basic/textarea.d.ts +15 -0
  98. package/dist/registry/basic/toggle.d.ts +1 -1
  99. package/dist/registry/chat/chat-input/context.d.ts +3 -1
  100. package/dist/registry/chat/conversation-anchor-nav.d.ts +72 -0
  101. package/dist/registry/chat/tool-invocation-card.d.ts +2 -0
  102. package/dist/scale/presets/compact.css +16 -5
  103. package/dist/scale/presets/dense.css +13 -2
  104. package/dist/scale/presets/sharp.css +18 -6
  105. package/dist/scale/presets/soft.css +23 -1
  106. package/dist/spark-design.cjs.js +40 -36
  107. package/dist/spark-design.es.js +8647 -8657
  108. package/dist/sparkdesign.css +1 -1
  109. package/dist/src/components/basic/Alert/index.d.ts +13 -0
  110. package/dist/src/components/basic/AspectRatio/index.d.ts +13 -0
  111. package/dist/src/components/basic/Breadcrumb/index.d.ts +12 -0
  112. package/dist/src/components/basic/ButtonGroup/index.d.ts +13 -0
  113. package/dist/src/components/basic/Calendar/index.d.ts +13 -0
  114. package/dist/src/components/basic/Card/index.d.ts +13 -0
  115. package/dist/src/components/basic/Carousel/index.d.ts +12 -0
  116. package/dist/src/components/basic/Chart/index.d.ts +13 -0
  117. package/dist/src/components/basic/Checkbox/index.d.ts +13 -0
  118. package/dist/src/components/basic/Combobox/index.d.ts +13 -0
  119. package/dist/src/components/basic/Command/index.d.ts +12 -0
  120. package/dist/src/components/basic/ContextMenu/index.d.ts +19 -0
  121. package/dist/src/components/basic/DataTable/index.d.ts +13 -0
  122. package/dist/src/components/basic/DatePicker/index.d.ts +13 -0
  123. package/dist/src/components/basic/Dialog/index.d.ts +16 -0
  124. package/dist/src/components/basic/Direction/index.d.ts +13 -0
  125. package/dist/src/components/basic/Drawer/index.d.ts +16 -0
  126. package/dist/src/components/basic/Empty/index.d.ts +12 -0
  127. package/dist/src/components/basic/Field/index.d.ts +12 -0
  128. package/dist/src/components/basic/HoverCard/index.d.ts +16 -0
  129. package/dist/src/components/basic/Input/index.d.ts +13 -0
  130. package/dist/src/components/basic/InputGroup/index.d.ts +12 -0
  131. package/dist/src/components/basic/InputOTP/index.d.ts +12 -0
  132. package/dist/src/components/basic/Item/index.d.ts +12 -0
  133. package/dist/src/components/basic/Label/index.d.ts +13 -0
  134. package/dist/src/components/basic/Menubar/index.d.ts +12 -0
  135. package/dist/src/components/basic/NativeSelect/index.d.ts +12 -0
  136. package/dist/src/components/basic/NavigationMenu/index.d.ts +12 -0
  137. package/dist/src/components/basic/Popover/index.d.ts +16 -0
  138. package/dist/src/components/basic/ScrollArea/index.d.ts +12 -0
  139. package/dist/src/components/basic/Separator/index.d.ts +13 -0
  140. package/dist/src/components/basic/Sheet/index.d.ts +13 -0
  141. package/dist/src/components/basic/Textarea/index.d.ts +13 -0
  142. package/dist/src/components/chat/ConversationAnchorNav/index.d.ts +13 -0
  143. package/dist/src/components/chat/StreamingMarkdownBlock/index.d.ts +13 -0
  144. package/dist/src/components/index.d.ts +57 -0
  145. package/dist/tokens/AGENTS.md +1 -0
  146. package/dist/tokens/scale/presets/compact.css +16 -5
  147. package/dist/tokens/scale/presets/dense.css +13 -2
  148. package/dist/tokens/scale/presets/sharp.css +18 -6
  149. package/dist/tokens/scale/presets/soft.css +23 -1
  150. package/docs/agent/component-selection.md +60 -0
  151. package/docs/agent/token-ontology.md +37 -0
  152. package/package.json +31 -5
  153. package/registry/agent-manifest.json +794 -0
  154. package/registry/tokens/ontology.json +404 -0
  155. package/dist/_basePickBy-DnQN8w3y.js +0 -151
  156. package/dist/_basePickBy-a-kPMlkg.cjs +0 -1
  157. package/dist/_baseUniq-B-N2NQ50.js +0 -614
  158. package/dist/_baseUniq-Cc_zbSif.cjs +0 -1
  159. package/dist/arc-BQBhijZ6.js +0 -83
  160. package/dist/arc-mWQt0Yph.cjs +0 -1
  161. package/dist/architectureDiagram-VXUJARFQ-BMZEucno.cjs +0 -36
  162. package/dist/architectureDiagram-VXUJARFQ-DTdjD3Bp.js +0 -4661
  163. package/dist/blockDiagram-VD42YOAC-CzHn0yob.js +0 -2256
  164. package/dist/blockDiagram-VD42YOAC-DDxdHAlz.cjs +0 -122
  165. package/dist/c4Diagram-YG6GDRKO-4Gz0I4gj.cjs +0 -10
  166. package/dist/c4Diagram-YG6GDRKO-BIy--yVN.js +0 -1580
  167. package/dist/channel-BQn0o8bs.js +0 -5
  168. package/dist/channel-DaN7XniJ.cjs +0 -1
  169. package/dist/chunk-4BX2VUAB-BlQFTQqz.cjs +0 -1
  170. package/dist/chunk-4BX2VUAB-Czitj3Kc.js +0 -8
  171. package/dist/chunk-55IACEB6-DXacNZbO.js +0 -8
  172. package/dist/chunk-55IACEB6-DnDxpye9.cjs +0 -1
  173. package/dist/chunk-B4BG7PRW-CBdN0q_V.js +0 -1375
  174. package/dist/chunk-B4BG7PRW-DbGvUkGO.cjs +0 -165
  175. package/dist/chunk-DI55MBZ5-D1YJMs6x.cjs +0 -220
  176. package/dist/chunk-DI55MBZ5-NCQTvayw.js +0 -1370
  177. package/dist/chunk-FMBD7UC4-CsGMbrtr.js +0 -19
  178. package/dist/chunk-FMBD7UC4-Di7cUUh5.cjs +0 -15
  179. package/dist/chunk-QN33PNHL-0j5LC8Lm.cjs +0 -1
  180. package/dist/chunk-QN33PNHL-3GERZBRm.js +0 -19
  181. package/dist/chunk-QZHKN3VN-AVEY9ImQ.js +0 -15
  182. package/dist/chunk-QZHKN3VN-s8Z0a8mc.cjs +0 -1
  183. package/dist/chunk-TZMSLE5B-CAf87HPt.cjs +0 -1
  184. package/dist/chunk-TZMSLE5B-sbiflal0.js +0 -64
  185. package/dist/classDiagram-2ON5EDUG-Ct9JLIN2.cjs +0 -1
  186. package/dist/classDiagram-2ON5EDUG-Dzfrft3a.js +0 -16
  187. package/dist/classDiagram-v2-WZHVMYZB-Ct9JLIN2.cjs +0 -1
  188. package/dist/classDiagram-v2-WZHVMYZB-Dzfrft3a.js +0 -16
  189. package/dist/clone-Cde_NQ8V.js +0 -8
  190. package/dist/clone-DCNjWuM2.cjs +0 -1
  191. package/dist/cose-bilkent-S5V4N54A-0uLijMro.cjs +0 -1
  192. package/dist/cose-bilkent-S5V4N54A-Bb08N431.js +0 -2608
  193. package/dist/cytoscape.esm-CNUX3VTg.cjs +0 -321
  194. package/dist/cytoscape.esm-Cvf3sx9F.js +0 -18704
  195. package/dist/dagre-6UL2VRFP-CY_Wz5Zd.js +0 -444
  196. package/dist/dagre-6UL2VRFP-Dxe7_qZc.cjs +0 -4
  197. package/dist/defaultLocale-BgPVtth8.js +0 -171
  198. package/dist/defaultLocale-C4wbwF1n.cjs +0 -1
  199. package/dist/diagram-PSM6KHXK-D2bdb7MT.js +0 -531
  200. package/dist/diagram-PSM6KHXK-YF69SUjY.cjs +0 -24
  201. package/dist/diagram-QEK2KX5R-BpUSoh0-.js +0 -217
  202. package/dist/diagram-QEK2KX5R-DZPGteon.cjs +0 -43
  203. package/dist/diagram-S2PKOQOG-ht-zdvFG.cjs +0 -24
  204. package/dist/diagram-S2PKOQOG-zFeLJ50Z.js +0 -142
  205. package/dist/erDiagram-Q2GNP2WA-B38iJ6ts.js +0 -841
  206. package/dist/erDiagram-Q2GNP2WA-RgS80DDU.cjs +0 -60
  207. package/dist/flowDiagram-NV44I4VS-BHilOs2p.cjs +0 -162
  208. package/dist/flowDiagram-NV44I4VS-BrBJcoce.js +0 -1620
  209. package/dist/ganttDiagram-JELNMOA3-pZiJeFio.cjs +0 -267
  210. package/dist/ganttDiagram-JELNMOA3-tw6FhkWJ.js +0 -2670
  211. package/dist/gitGraphDiagram-V2S2FVAM-BWn5uIK5.js +0 -699
  212. package/dist/gitGraphDiagram-V2S2FVAM-DKKeG-9R.cjs +0 -65
  213. package/dist/graph-DIbblrZP.cjs +0 -1
  214. package/dist/graph-DPcK91G3.js +0 -247
  215. package/dist/infoDiagram-HS3SLOUP-B8gwwhct.cjs +0 -2
  216. package/dist/infoDiagram-HS3SLOUP-D47PNcP_.js +0 -24
  217. package/dist/init-CHZsXQcr.cjs +0 -1
  218. package/dist/init-DjUOC4st.js +0 -16
  219. package/dist/journeyDiagram-XKPGCS4Q-BG3cfhyU.js +0 -834
  220. package/dist/journeyDiagram-XKPGCS4Q-D8DVLJof.cjs +0 -139
  221. package/dist/kanban-definition-3W4ZIXB7-4OCnEouP.cjs +0 -89
  222. package/dist/kanban-definition-3W4ZIXB7-CWi_ssF9.js +0 -719
  223. package/dist/layout-Byuh8f-J.cjs +0 -1
  224. package/dist/layout-CdLdvj1j.js +0 -1335
  225. package/dist/linear-C2Q_PI9B.js +0 -259
  226. package/dist/linear-C69aPBW1.cjs +0 -1
  227. package/dist/mermaid.core-DBwAx_jp.cjs +0 -249
  228. package/dist/mermaid.core-gFR0XUlD.js +0 -15300
  229. package/dist/mindmap-definition-VGOIOE7T-8P7obVV4.cjs +0 -68
  230. package/dist/mindmap-definition-VGOIOE7T-DnOa7WJ9.js +0 -784
  231. package/dist/ordinal-B6-f3MAq.js +0 -61
  232. package/dist/ordinal-CagbB1m8.cjs +0 -1
  233. package/dist/pieDiagram-ADFJNKIX-5NAlvhMo.js +0 -161
  234. package/dist/pieDiagram-ADFJNKIX-CQBG4yR9.cjs +0 -30
  235. package/dist/quadrantDiagram-AYHSOK5B-Oe4y7RZ0.cjs +0 -7
  236. package/dist/quadrantDiagram-AYHSOK5B-rh2DPEP1.js +0 -1022
  237. package/dist/requirementDiagram-UZGBJVZJ-DcWaCuXr.js +0 -850
  238. package/dist/requirementDiagram-UZGBJVZJ-gfdlrFiq.cjs +0 -64
  239. package/dist/sankeyDiagram-TZEHDZUN-CQIKFwD0.js +0 -810
  240. package/dist/sankeyDiagram-TZEHDZUN-DvPtzQvC.cjs +0 -10
  241. package/dist/sequenceDiagram-WL72ISMW-BNrsMagL.cjs +0 -145
  242. package/dist/sequenceDiagram-WL72ISMW-iCX3ckKx.js +0 -2511
  243. package/dist/stateDiagram-FKZM4ZOC-DBvJ_eeL.cjs +0 -1
  244. package/dist/stateDiagram-FKZM4ZOC-ZVsJlaHJ.js +0 -263
  245. package/dist/stateDiagram-v2-4FDKWEC3-CB_nTHcE.js +0 -16
  246. package/dist/stateDiagram-v2-4FDKWEC3-Xkx17v6T.cjs +0 -1
  247. package/dist/timeline-definition-IT6M3QCI-BmGkYQiz.cjs +0 -61
  248. package/dist/timeline-definition-IT6M3QCI-Ck8zTt6w.js +0 -795
  249. package/dist/treemap-GDKQZRPO-B9sfERx8.js +0 -17922
  250. package/dist/treemap-GDKQZRPO-BVfJRs0Z.cjs +0 -160
  251. package/dist/xychartDiagram-PRI3JC2R-By_S8NzN.js +0 -1340
  252. package/dist/xychartDiagram-PRI3JC2R-CNfDrGxM.cjs +0 -7
@@ -0,0 +1,169 @@
1
+ import * as React from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog'
4
+ import { cva, type VariantProps } from 'class-variance-authority'
5
+ import { cn } from '@/lib/utils'
6
+ import { CloseLine } from './icons-inline'
7
+ import { getThemeFromDocument } from './theme-from-document'
8
+
9
+ const Dialog = DialogPrimitive.Root
10
+ const DialogTrigger = DialogPrimitive.Trigger
11
+ const DialogPortal = DialogPrimitive.Portal
12
+ const DialogClose = DialogPrimitive.Close
13
+
14
+ const DialogOverlay = React.forwardRef<
15
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
16
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
17
+ >(({ className, ...props }, ref) => (
18
+ <DialogPrimitive.Overlay ref={ref} asChild {...props}>
19
+ <motion.div
20
+ className={cn('fixed inset-0 z-50 bg-bg-mask/60', className)}
21
+ initial={{ opacity: 0 }}
22
+ animate={{ opacity: 1 }}
23
+ exit={{ opacity: 0 }}
24
+ transition={{ duration: 0.15 }}
25
+ />
26
+ </DialogPrimitive.Overlay>
27
+ ))
28
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
29
+
30
+ const contentVariants = cva(
31
+ 'font-sans fixed left-1/2 top-1/2 z-50 w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-border bg-bg-base text-text shadow-lg p-6 outline-none',
32
+ {
33
+ variants: {
34
+ size: {
35
+ sm: 'max-w-sm',
36
+ default: 'max-w-lg',
37
+ lg: 'max-w-2xl',
38
+ xl: 'max-w-4xl',
39
+ },
40
+ },
41
+ defaultVariants: { size: 'default' },
42
+ },
43
+ )
44
+
45
+ export interface DialogContentProps
46
+ extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,
47
+ VariantProps<typeof contentVariants> {
48
+ size?: 'sm' | 'default' | 'lg' | 'xl'
49
+ /** Hide the built-in top-right close button. */
50
+ hideCloseButton?: boolean
51
+ /** When provided (e.g. from ThemeStyleProvider), used for portal wrapper */
52
+ dataStyle?: string
53
+ dataTheme?: string
54
+ }
55
+
56
+ const DialogContent = React.forwardRef<
57
+ React.ElementRef<typeof DialogPrimitive.Content>,
58
+ DialogContentProps
59
+ >(
60
+ (
61
+ {
62
+ className,
63
+ children,
64
+ size = 'default',
65
+ hideCloseButton = false,
66
+ dataStyle,
67
+ dataTheme,
68
+ ...props
69
+ },
70
+ ref,
71
+ ) => {
72
+ const fromDoc = getThemeFromDocument()
73
+ const dataProps =
74
+ dataStyle !== undefined
75
+ ? { 'data-style': dataStyle, 'data-theme': dataTheme ?? fromDoc['data-theme'] ?? '' }
76
+ : fromDoc
77
+ return (
78
+ <DialogPortal>
79
+ <div style={{ display: 'contents' }} {...dataProps}>
80
+ <DialogOverlay />
81
+ <DialogPrimitive.Content ref={ref} asChild {...props}>
82
+ <motion.div
83
+ className={cn(contentVariants({ size }), className)}
84
+ initial={{ opacity: 0, y: 8 }}
85
+ animate={{ opacity: 1, y: 0 }}
86
+ exit={{ opacity: 0, y: 8 }}
87
+ transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}
88
+ >
89
+ {children}
90
+ {!hideCloseButton && (
91
+ <DialogPrimitive.Close
92
+ className={cn(
93
+ 'absolute right-4 top-4 inline-flex size-7 items-center justify-center rounded-md text-text-tertiary opacity-70 transition-colors',
94
+ 'hover:bg-fill-secondary hover:text-text hover:opacity-100',
95
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-border',
96
+ 'disabled:pointer-events-none',
97
+ )}
98
+ >
99
+ <CloseLine className="size-4" />
100
+ <span className="sr-only">Close</span>
101
+ </DialogPrimitive.Close>
102
+ )}
103
+ </motion.div>
104
+ </DialogPrimitive.Content>
105
+ </div>
106
+ </DialogPortal>
107
+ )
108
+ },
109
+ )
110
+ DialogContent.displayName = DialogPrimitive.Content.displayName
111
+
112
+ const DialogHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
113
+ ({ className, ...props }, ref) => (
114
+ <div ref={ref} className={cn('flex flex-col gap-2 text-left', className)} {...props} />
115
+ ),
116
+ )
117
+ DialogHeader.displayName = 'DialogHeader'
118
+
119
+ const DialogFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
120
+ ({ className, ...props }, ref) => (
121
+ <div
122
+ ref={ref}
123
+ className={cn('mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}
124
+ {...props}
125
+ />
126
+ ),
127
+ )
128
+ DialogFooter.displayName = 'DialogFooter'
129
+
130
+ const DialogTitle = React.forwardRef<
131
+ React.ElementRef<typeof DialogPrimitive.Title>,
132
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
133
+ >(({ className, ...props }, ref) => (
134
+ <DialogPrimitive.Title
135
+ ref={ref}
136
+ className={cn('font-sans text-base font-medium leading-6 text-text', className)}
137
+ {...props}
138
+ />
139
+ ))
140
+ DialogTitle.displayName = DialogPrimitive.Title.displayName
141
+
142
+ const DialogDescription = React.forwardRef<
143
+ React.ElementRef<typeof DialogPrimitive.Description>,
144
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
145
+ >(({ className, ...props }, ref) => (
146
+ <DialogPrimitive.Description
147
+ ref={ref}
148
+ className={cn('text-sm leading-6 text-text-tertiary', className)}
149
+ {...props}
150
+ />
151
+ ))
152
+ DialogDescription.displayName = DialogPrimitive.Description.displayName
153
+
154
+ export type DialogHeaderProps = React.HTMLAttributes<HTMLDivElement>
155
+ export type DialogFooterProps = React.HTMLAttributes<HTMLDivElement>
156
+
157
+ export {
158
+ Dialog,
159
+ DialogTrigger,
160
+ DialogPortal,
161
+ DialogOverlay,
162
+ DialogClose,
163
+ DialogContent,
164
+ DialogHeader,
165
+ DialogFooter,
166
+ DialogTitle,
167
+ DialogDescription,
168
+ contentVariants as dialogContentVariants,
169
+ }
@@ -0,0 +1,25 @@
1
+ import * as React from 'react'
2
+
3
+ export type Direction = 'ltr' | 'rtl'
4
+
5
+ const DirectionContext = React.createContext<Direction>('ltr')
6
+
7
+ export interface DirectionProviderProps extends React.HTMLAttributes<HTMLDivElement> {
8
+ dir?: Direction
9
+ }
10
+
11
+ function DirectionProvider({ dir = 'ltr', children, ...props }: DirectionProviderProps) {
12
+ return (
13
+ <DirectionContext.Provider value={dir}>
14
+ <div dir={dir} {...props}>
15
+ {children}
16
+ </div>
17
+ </DirectionContext.Provider>
18
+ )
19
+ }
20
+
21
+ function useDirection() {
22
+ return React.useContext(DirectionContext)
23
+ }
24
+
25
+ export { DirectionProvider, useDirection }
@@ -0,0 +1,164 @@
1
+ import * as React from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog'
4
+ import { cva, type VariantProps } from 'class-variance-authority'
5
+ import { cn } from '@/lib/utils'
6
+ import { CloseLine } from './icons-inline'
7
+ import { getThemeFromDocument } from './theme-from-document'
8
+
9
+ const Drawer = DialogPrimitive.Root
10
+ const DrawerTrigger = DialogPrimitive.Trigger
11
+ const DrawerClose = DialogPrimitive.Close
12
+ const DrawerPortal = DialogPrimitive.Portal
13
+
14
+ const DrawerOverlay = React.forwardRef<
15
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
16
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
17
+ >(({ className, ...props }, ref) => (
18
+ <DialogPrimitive.Overlay ref={ref} asChild {...props}>
19
+ <motion.div
20
+ className={cn('fixed inset-0 z-50 bg-bg-mask/60', className)}
21
+ initial={{ opacity: 0 }}
22
+ animate={{ opacity: 1 }}
23
+ exit={{ opacity: 0 }}
24
+ transition={{ duration: 0.15 }}
25
+ />
26
+ </DialogPrimitive.Overlay>
27
+ ))
28
+ DrawerOverlay.displayName = DialogPrimitive.Overlay.displayName
29
+
30
+ const drawerVariants = cva(
31
+ 'fixed z-50 gap-4 bg-bg-base text-text shadow-lg border-border p-6 outline-none flex flex-col',
32
+ {
33
+ variants: {
34
+ side: {
35
+ top: 'inset-x-0 top-0 border-b',
36
+ bottom: 'inset-x-0 bottom-0 border-t',
37
+ left: 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',
38
+ right: 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',
39
+ },
40
+ },
41
+ defaultVariants: { side: 'right' },
42
+ },
43
+ )
44
+
45
+ const sideOffsetMap = {
46
+ top: { initial: { y: '-100%' }, animate: { y: 0 }, exit: { y: '-100%' } },
47
+ bottom: { initial: { y: '100%' }, animate: { y: 0 }, exit: { y: '100%' } },
48
+ left: { initial: { x: '-100%' }, animate: { x: 0 }, exit: { x: '-100%' } },
49
+ right: { initial: { x: '100%' }, animate: { x: 0 }, exit: { x: '100%' } },
50
+ } as const
51
+
52
+ export interface DrawerContentProps
53
+ extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,
54
+ VariantProps<typeof drawerVariants> {
55
+ side?: 'top' | 'right' | 'bottom' | 'left'
56
+ showCloseButton?: boolean
57
+ /** When provided (e.g. from ThemeStyleProvider), used for portal wrapper */
58
+ dataStyle?: string
59
+ dataTheme?: string
60
+ }
61
+
62
+ const DrawerContent = React.forwardRef<
63
+ React.ElementRef<typeof DialogPrimitive.Content>,
64
+ DrawerContentProps
65
+ >(
66
+ (
67
+ { side = 'right', className, children, showCloseButton = true, dataStyle, dataTheme, ...props },
68
+ ref,
69
+ ) => {
70
+ const fromDoc = getThemeFromDocument()
71
+ const dataProps =
72
+ dataStyle !== undefined
73
+ ? { 'data-style': dataStyle, 'data-theme': dataTheme ?? fromDoc['data-theme'] ?? '' }
74
+ : fromDoc
75
+ const motionProps = sideOffsetMap[side]
76
+ return (
77
+ <DrawerPortal>
78
+ <div style={{ display: 'contents' }} {...dataProps}>
79
+ <DrawerOverlay />
80
+ <DialogPrimitive.Content ref={ref} asChild {...props}>
81
+ <motion.div
82
+ className={cn(drawerVariants({ side }), className)}
83
+ initial={motionProps.initial}
84
+ animate={motionProps.animate}
85
+ exit={motionProps.exit}
86
+ transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}
87
+ >
88
+ {children}
89
+ {showCloseButton && (
90
+ <DialogPrimitive.Close
91
+ className={cn(
92
+ 'absolute right-4 top-4 inline-flex size-7 items-center justify-center rounded-md text-text-tertiary opacity-70 transition-colors',
93
+ 'hover:bg-fill-secondary hover:text-text hover:opacity-100',
94
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-border',
95
+ 'disabled:pointer-events-none',
96
+ )}
97
+ >
98
+ <CloseLine className="size-4" />
99
+ <span className="sr-only">Close</span>
100
+ </DialogPrimitive.Close>
101
+ )}
102
+ </motion.div>
103
+ </DialogPrimitive.Content>
104
+ </div>
105
+ </DrawerPortal>
106
+ )
107
+ },
108
+ )
109
+ DrawerContent.displayName = DialogPrimitive.Content.displayName
110
+
111
+ const DrawerHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
112
+ ({ className, ...props }, ref) => (
113
+ <div ref={ref} className={cn('flex flex-col gap-1.5', className)} {...props} />
114
+ ),
115
+ )
116
+ DrawerHeader.displayName = 'DrawerHeader'
117
+
118
+ const DrawerFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
119
+ ({ className, ...props }, ref) => (
120
+ <div ref={ref} className={cn('mt-auto flex flex-col gap-2', className)} {...props} />
121
+ ),
122
+ )
123
+ DrawerFooter.displayName = 'DrawerFooter'
124
+
125
+ const DrawerTitle = React.forwardRef<
126
+ React.ElementRef<typeof DialogPrimitive.Title>,
127
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
128
+ >(({ className, ...props }, ref) => (
129
+ <DialogPrimitive.Title
130
+ ref={ref}
131
+ className={cn('text-base font-medium leading-6 text-text', className)}
132
+ {...props}
133
+ />
134
+ ))
135
+ DrawerTitle.displayName = DialogPrimitive.Title.displayName
136
+
137
+ const DrawerDescription = React.forwardRef<
138
+ React.ElementRef<typeof DialogPrimitive.Description>,
139
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
140
+ >(({ className, ...props }, ref) => (
141
+ <DialogPrimitive.Description
142
+ ref={ref}
143
+ className={cn('text-sm leading-6 text-text-tertiary', className)}
144
+ {...props}
145
+ />
146
+ ))
147
+ DrawerDescription.displayName = DialogPrimitive.Description.displayName
148
+
149
+ export type DrawerHeaderProps = React.HTMLAttributes<HTMLDivElement>
150
+ export type DrawerFooterProps = React.HTMLAttributes<HTMLDivElement>
151
+
152
+ export {
153
+ Drawer,
154
+ DrawerTrigger,
155
+ DrawerClose,
156
+ DrawerPortal,
157
+ DrawerOverlay,
158
+ DrawerContent,
159
+ DrawerHeader,
160
+ DrawerFooter,
161
+ DrawerTitle,
162
+ DrawerDescription,
163
+ drawerVariants,
164
+ }
@@ -6,10 +6,6 @@ import { cn } from '@/lib/utils'
6
6
  import { ArrowRightLine, CheckLine } from './icons-inline'
7
7
  import { getThemeFromDocument } from './theme-from-document'
8
8
 
9
- /** 取消 outline/ring,避免与全局 *:focus-visible 冲突产生偶现 focus 环 */
10
- const FOCUS_RESET =
11
- 'outline-none focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:!outline-none focus-visible:!ring-0 focus-visible:outline-offset-0 focus-visible:!outline-offset-0 focus-visible:ring-offset-0 focus-visible:!ring-offset-0'
12
-
13
9
  const DropdownMenu = DropdownMenuPrimitive.Root
14
10
  const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
15
11
  const DropdownMenuGroup = DropdownMenuPrimitive.Group
@@ -0,0 +1,104 @@
1
+ import { cva, type VariantProps } from "class-variance-authority"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ function Empty({ className, ...props }: React.ComponentProps<"div">) {
6
+ return (
7
+ <div
8
+ data-slot="empty"
9
+ className={cn(
10
+ "flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12",
11
+ className
12
+ )}
13
+ {...props}
14
+ />
15
+ )
16
+ }
17
+
18
+ function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) {
19
+ return (
20
+ <div
21
+ data-slot="empty-header"
22
+ className={cn(
23
+ "flex max-w-sm flex-col items-center gap-2 text-center",
24
+ className
25
+ )}
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ const emptyMediaVariants = cva(
32
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
33
+ {
34
+ variants: {
35
+ variant: {
36
+ default: "bg-transparent",
37
+ icon: "flex size-10 shrink-0 items-center justify-center rounded-lg bg-fill-tertiary text-text [&_svg:not([class*='size-'])]:size-6",
38
+ },
39
+ },
40
+ defaultVariants: {
41
+ variant: "default",
42
+ },
43
+ }
44
+ )
45
+
46
+ function EmptyMedia({
47
+ className,
48
+ variant = "default",
49
+ ...props
50
+ }: React.ComponentProps<"div"> & VariantProps<typeof emptyMediaVariants>) {
51
+ return (
52
+ <div
53
+ data-slot="empty-icon"
54
+ data-variant={variant}
55
+ className={cn(emptyMediaVariants({ variant, className }))}
56
+ {...props}
57
+ />
58
+ )
59
+ }
60
+
61
+ function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
62
+ return (
63
+ <div
64
+ data-slot="empty-title"
65
+ className={cn("text-lg font-medium tracking-tight", className)}
66
+ {...props}
67
+ />
68
+ )
69
+ }
70
+
71
+ function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) {
72
+ return (
73
+ <div
74
+ data-slot="empty-description"
75
+ className={cn(
76
+ "text-sm/relaxed text-text-tertiary [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ function EmptyContent({ className, ...props }: React.ComponentProps<"div">) {
85
+ return (
86
+ <div
87
+ data-slot="empty-content"
88
+ className={cn(
89
+ "flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance",
90
+ className
91
+ )}
92
+ {...props}
93
+ />
94
+ )
95
+ }
96
+
97
+ export {
98
+ Empty,
99
+ EmptyHeader,
100
+ EmptyTitle,
101
+ EmptyDescription,
102
+ EmptyContent,
103
+ EmptyMedia,
104
+ }