@multicomma/arkcn 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +78 -0
  2. package/bin/arkcn.mjs +78 -0
  3. package/cli/commands.mjs +251 -0
  4. package/cli/project.mjs +168 -0
  5. package/cli/registry.mjs +50 -0
  6. package/cli/ui.mjs +46 -0
  7. package/mcp/server.mjs +149 -0
  8. package/package.json +201 -0
  9. package/registry/base.css +680 -0
  10. package/registry/index.json +1833 -0
  11. package/registry/items/accordion.json +18 -0
  12. package/registry/items/activity-feed.json +18 -0
  13. package/registry/items/alert-dialog.json +18 -0
  14. package/registry/items/alert.json +17 -0
  15. package/registry/items/angle-slider.json +17 -0
  16. package/registry/items/app-shell.json +28 -0
  17. package/registry/items/aspect-ratio.json +13 -0
  18. package/registry/items/attachment.json +19 -0
  19. package/registry/items/avatar.json +17 -0
  20. package/registry/items/badge.json +18 -0
  21. package/registry/items/breadcrumb.json +18 -0
  22. package/registry/items/bubble.json +18 -0
  23. package/registry/items/button-group.json +19 -0
  24. package/registry/items/button.json +18 -0
  25. package/registry/items/calendar.json +19 -0
  26. package/registry/items/canvas.json +24 -0
  27. package/registry/items/card.json +15 -0
  28. package/registry/items/carousel.json +19 -0
  29. package/registry/items/cascader.json +23 -0
  30. package/registry/items/chart.json +17 -0
  31. package/registry/items/chat.json +23 -0
  32. package/registry/items/checkbox.json +18 -0
  33. package/registry/items/clipboard.json +19 -0
  34. package/registry/items/collapsible.json +15 -0
  35. package/registry/items/color-picker.json +19 -0
  36. package/registry/items/combobox.json +20 -0
  37. package/registry/items/command.json +21 -0
  38. package/registry/items/comment-thread.json +25 -0
  39. package/registry/items/context-menu.json +18 -0
  40. package/registry/items/controllable.json +14 -0
  41. package/registry/items/data-grid.json +24 -0
  42. package/registry/items/data-table-adapter.json +14 -0
  43. package/registry/items/data-table.json +32 -0
  44. package/registry/items/date-input.json +17 -0
  45. package/registry/items/dialog.json +19 -0
  46. package/registry/items/direction.json +13 -0
  47. package/registry/items/drag-preview.json +16 -0
  48. package/registry/items/drawer.json +18 -0
  49. package/registry/items/dropdown-menu.json +18 -0
  50. package/registry/items/editable.json +17 -0
  51. package/registry/items/empty.json +17 -0
  52. package/registry/items/field.json +19 -0
  53. package/registry/items/file-upload.json +19 -0
  54. package/registry/items/floating-panel.json +19 -0
  55. package/registry/items/floating-toolbar.json +16 -0
  56. package/registry/items/form.json +14 -0
  57. package/registry/items/format.json +15 -0
  58. package/registry/items/gantt.json +22 -0
  59. package/registry/items/history.json +14 -0
  60. package/registry/items/hotkeys.json +18 -0
  61. package/registry/items/hover-card.json +17 -0
  62. package/registry/items/image-cropper.json +17 -0
  63. package/registry/items/input-group.json +20 -0
  64. package/registry/items/input-otp.json +18 -0
  65. package/registry/items/input.json +15 -0
  66. package/registry/items/item.json +19 -0
  67. package/registry/items/json-tree-view.json +17 -0
  68. package/registry/items/kanban.json +26 -0
  69. package/registry/items/kbd.json +15 -0
  70. package/registry/items/label.json +15 -0
  71. package/registry/items/live-region.json +16 -0
  72. package/registry/items/marker.json +18 -0
  73. package/registry/items/marquee.json +17 -0
  74. package/registry/items/menubar.json +19 -0
  75. package/registry/items/message.json +15 -0
  76. package/registry/items/navigation-menu.json +19 -0
  77. package/registry/items/node-graph.json +22 -0
  78. package/registry/items/number-input.json +18 -0
  79. package/registry/items/pagination.json +18 -0
  80. package/registry/items/password-input.json +18 -0
  81. package/registry/items/popconfirm.json +20 -0
  82. package/registry/items/popover.json +18 -0
  83. package/registry/items/progress.json +17 -0
  84. package/registry/items/qr-code.json +17 -0
  85. package/registry/items/query-builder.json +23 -0
  86. package/registry/items/radio-group.json +17 -0
  87. package/registry/items/rating-group.json +18 -0
  88. package/registry/items/resizable.json +17 -0
  89. package/registry/items/rich-text-editor.json +37 -0
  90. package/registry/items/row-layout.json +15 -0
  91. package/registry/items/scheduler.json +23 -0
  92. package/registry/items/scroll-area.json +17 -0
  93. package/registry/items/segment-group.json +17 -0
  94. package/registry/items/select.json +19 -0
  95. package/registry/items/separator.json +15 -0
  96. package/registry/items/sheet.json +19 -0
  97. package/registry/items/sidebar.json +27 -0
  98. package/registry/items/signature-pad.json +19 -0
  99. package/registry/items/skeleton.json +15 -0
  100. package/registry/items/slider.json +17 -0
  101. package/registry/items/sonner.json +17 -0
  102. package/registry/items/spinner.json +17 -0
  103. package/registry/items/steps.json +19 -0
  104. package/registry/items/swap.json +17 -0
  105. package/registry/items/switch.json +17 -0
  106. package/registry/items/table.json +16 -0
  107. package/registry/items/tabs.json +18 -0
  108. package/registry/items/tags-input.json +18 -0
  109. package/registry/items/textarea.json +15 -0
  110. package/registry/items/time.json +14 -0
  111. package/registry/items/timer.json +18 -0
  112. package/registry/items/toc.json +17 -0
  113. package/registry/items/toggle-group.json +19 -0
  114. package/registry/items/toggle.json +18 -0
  115. package/registry/items/tooltip.json +17 -0
  116. package/registry/items/tour.json +19 -0
  117. package/registry/items/transfer-list.json +24 -0
  118. package/registry/items/tree-select.json +24 -0
  119. package/registry/items/tree-view.json +18 -0
  120. package/registry/items/use-mobile.json +13 -0
  121. package/registry/items/utils.json +17 -0
  122. package/registry/items/virtual-list.json +16 -0
  123. package/src/components/ui/accordion.tsx +111 -0
  124. package/src/components/ui/activity-feed.tsx +228 -0
  125. package/src/components/ui/alert-dialog.tsx +204 -0
  126. package/src/components/ui/alert.tsx +55 -0
  127. package/src/components/ui/angle-slider.tsx +117 -0
  128. package/src/components/ui/app-shell.tsx +985 -0
  129. package/src/components/ui/aspect-ratio.tsx +35 -0
  130. package/src/components/ui/attachment.tsx +193 -0
  131. package/src/components/ui/avatar.tsx +94 -0
  132. package/src/components/ui/badge.tsx +45 -0
  133. package/src/components/ui/breadcrumb.tsx +93 -0
  134. package/src/components/ui/bubble.tsx +119 -0
  135. package/src/components/ui/button-group.tsx +79 -0
  136. package/src/components/ui/button.tsx +65 -0
  137. package/src/components/ui/calendar.tsx +172 -0
  138. package/src/components/ui/canvas.tsx +723 -0
  139. package/src/components/ui/card.tsx +69 -0
  140. package/src/components/ui/carousel.tsx +228 -0
  141. package/src/components/ui/cascader.tsx +754 -0
  142. package/src/components/ui/chart.tsx +303 -0
  143. package/src/components/ui/chat.tsx +544 -0
  144. package/src/components/ui/checkbox.tsx +94 -0
  145. package/src/components/ui/clipboard.tsx +94 -0
  146. package/src/components/ui/collapsible.tsx +32 -0
  147. package/src/components/ui/color-picker.tsx +441 -0
  148. package/src/components/ui/combobox.tsx +400 -0
  149. package/src/components/ui/command.tsx +292 -0
  150. package/src/components/ui/comment-thread.tsx +923 -0
  151. package/src/components/ui/context-menu.tsx +331 -0
  152. package/src/components/ui/data-grid.tsx +1227 -0
  153. package/src/components/ui/data-table.tsx +993 -0
  154. package/src/components/ui/date-input.tsx +103 -0
  155. package/src/components/ui/dialog.tsx +159 -0
  156. package/src/components/ui/direction.tsx +32 -0
  157. package/src/components/ui/drawer.tsx +200 -0
  158. package/src/components/ui/dropdown-menu.tsx +329 -0
  159. package/src/components/ui/editable.tsx +90 -0
  160. package/src/components/ui/empty.tsx +86 -0
  161. package/src/components/ui/field.tsx +218 -0
  162. package/src/components/ui/file-upload.tsx +204 -0
  163. package/src/components/ui/floating-panel.tsx +199 -0
  164. package/src/components/ui/floating-toolbar.tsx +79 -0
  165. package/src/components/ui/format.tsx +22 -0
  166. package/src/components/ui/gantt.tsx +950 -0
  167. package/src/components/ui/hotkeys.tsx +340 -0
  168. package/src/components/ui/hover-card.tsx +83 -0
  169. package/src/components/ui/image-cropper.tsx +100 -0
  170. package/src/components/ui/input-group.tsx +133 -0
  171. package/src/components/ui/input-otp.tsx +82 -0
  172. package/src/components/ui/input.tsx +18 -0
  173. package/src/components/ui/item.tsx +174 -0
  174. package/src/components/ui/json-tree-view.tsx +37 -0
  175. package/src/components/ui/kanban.tsx +884 -0
  176. package/src/components/ui/kbd.tsx +20 -0
  177. package/src/components/ui/label.tsx +30 -0
  178. package/src/components/ui/live-region.tsx +54 -0
  179. package/src/components/ui/marker.tsx +66 -0
  180. package/src/components/ui/marquee.tsx +61 -0
  181. package/src/components/ui/menubar.tsx +456 -0
  182. package/src/components/ui/message.tsx +74 -0
  183. package/src/components/ui/navigation-menu.tsx +202 -0
  184. package/src/components/ui/node-graph.tsx +1723 -0
  185. package/src/components/ui/number-input.tsx +148 -0
  186. package/src/components/ui/pagination.tsx +88 -0
  187. package/src/components/ui/password-input.tsx +104 -0
  188. package/src/components/ui/popconfirm.tsx +149 -0
  189. package/src/components/ui/popover.tsx +126 -0
  190. package/src/components/ui/progress.tsx +114 -0
  191. package/src/components/ui/qr-code.tsx +51 -0
  192. package/src/components/ui/query-builder.tsx +938 -0
  193. package/src/components/ui/radio-group.tsx +108 -0
  194. package/src/components/ui/rating-group.tsx +91 -0
  195. package/src/components/ui/resizable.tsx +41 -0
  196. package/src/components/ui/rich-text-editor.tsx +845 -0
  197. package/src/components/ui/scheduler.tsx +1164 -0
  198. package/src/components/ui/scroll-area.tsx +82 -0
  199. package/src/components/ui/segment-group.tsx +95 -0
  200. package/src/components/ui/select.tsx +354 -0
  201. package/src/components/ui/separator.tsx +32 -0
  202. package/src/components/ui/sheet.tsx +130 -0
  203. package/src/components/ui/sidebar.tsx +665 -0
  204. package/src/components/ui/signature-pad.tsx +112 -0
  205. package/src/components/ui/skeleton.tsx +7 -0
  206. package/src/components/ui/slider.tsx +183 -0
  207. package/src/components/ui/sonner.tsx +37 -0
  208. package/src/components/ui/spinner.tsx +16 -0
  209. package/src/components/ui/steps.tsx +152 -0
  210. package/src/components/ui/swap.tsx +33 -0
  211. package/src/components/ui/switch.tsx +83 -0
  212. package/src/components/ui/table.tsx +72 -0
  213. package/src/components/ui/tabs.tsx +100 -0
  214. package/src/components/ui/tags-input.tsx +153 -0
  215. package/src/components/ui/textarea.tsx +17 -0
  216. package/src/components/ui/timer.tsx +67 -0
  217. package/src/components/ui/toc.tsx +64 -0
  218. package/src/components/ui/toggle-group.tsx +89 -0
  219. package/src/components/ui/toggle.tsx +46 -0
  220. package/src/components/ui/tooltip.tsx +113 -0
  221. package/src/components/ui/tour.tsx +168 -0
  222. package/src/components/ui/transfer-list.tsx +700 -0
  223. package/src/components/ui/tree-select.tsx +638 -0
  224. package/src/components/ui/tree-view.tsx +217 -0
  225. package/src/components/ui/virtual-list.tsx +343 -0
  226. package/src/hooks/use-mobile.ts +19 -0
  227. package/src/lib/controllable.ts +31 -0
  228. package/src/lib/data-table-adapter.ts +67 -0
  229. package/src/lib/drag-preview.ts +39 -0
  230. package/src/lib/form.ts +39 -0
  231. package/src/lib/history.ts +55 -0
  232. package/src/lib/row-layout.ts +81 -0
  233. package/src/lib/table.ts +483 -0
  234. package/src/lib/time.ts +37 -0
  235. package/src/lib/utils.ts +6 -0
  236. package/src/styles/arkcn.css +764 -0
  237. package/src/styles/index.css +3 -0
@@ -0,0 +1,112 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { SignaturePad as SignaturePadPrimitive } from "@ark-ui/react"
6
+ import { XIcon } from "lucide-react"
7
+
8
+ import { Button } from "@/components/ui/button"
9
+
10
+ function SignaturePad({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Root>) {
11
+ return (
12
+ <SignaturePadPrimitive.Root
13
+ data-slot="signature-pad"
14
+ className={cn("flex w-full flex-col gap-1.5", className)}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ function SignaturePadContext({ ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Context>) {
21
+ return <SignaturePadPrimitive.Context {...props} />
22
+ }
23
+
24
+ function SignaturePadLabel({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Label>) {
25
+ return (
26
+ <SignaturePadPrimitive.Label
27
+ data-slot="signature-pad-label"
28
+ className={cn("text-sm font-medium select-none", className)}
29
+ {...props}
30
+ />
31
+ )
32
+ }
33
+
34
+ function SignaturePadControl({
35
+ className,
36
+ children,
37
+ ...props
38
+ }: React.ComponentProps<typeof SignaturePadPrimitive.Control>) {
39
+ return (
40
+ <SignaturePadPrimitive.Control
41
+ data-slot="signature-pad-control"
42
+ className={cn(
43
+ "relative h-40 w-full touch-none overflow-hidden rounded-xl border border-input bg-transparent transition-colors has-focus-visible:border-ring has-focus-visible:ring-3 has-focus-visible:ring-ring/50 dark:bg-input/30 data-disabled:pointer-events-none data-disabled:opacity-50",
44
+ className
45
+ )}
46
+ {...props}
47
+ >
48
+ {children ?? (
49
+ <>
50
+ <SignaturePadSegment />
51
+ <SignaturePadGuide />
52
+ <SignaturePadClearTrigger />
53
+ </>
54
+ )}
55
+ </SignaturePadPrimitive.Control>
56
+ )
57
+ }
58
+
59
+ function SignaturePadSegment({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Segment>) {
60
+ return (
61
+ <SignaturePadPrimitive.Segment
62
+ data-slot="signature-pad-segment"
63
+ className={cn("fill-foreground", className)}
64
+ {...props}
65
+ />
66
+ )
67
+ }
68
+
69
+ function SignaturePadGuide({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Guide>) {
70
+ return (
71
+ <SignaturePadPrimitive.Guide
72
+ data-slot="signature-pad-guide"
73
+ className={cn("pointer-events-none absolute inset-x-4 bottom-8 border-b border-dashed border-border", className)}
74
+ {...props}
75
+ />
76
+ )
77
+ }
78
+
79
+ function SignaturePadClearTrigger({
80
+ className,
81
+ children,
82
+ ...props
83
+ }: React.ComponentProps<typeof SignaturePadPrimitive.ClearTrigger>) {
84
+ return (
85
+ <SignaturePadPrimitive.ClearTrigger
86
+ data-slot="signature-pad-clear-trigger"
87
+ className={cn("absolute top-2 right-2", className)}
88
+ asChild
89
+ {...props}
90
+ >
91
+ <Button variant="ghost" size="icon-sm">
92
+ {children ?? <XIcon />}
93
+ <span className="sr-only">Clear</span>
94
+ </Button>
95
+ </SignaturePadPrimitive.ClearTrigger>
96
+ )
97
+ }
98
+
99
+ function SignaturePadHiddenInput({ ...props }: React.ComponentProps<typeof SignaturePadPrimitive.HiddenInput>) {
100
+ return <SignaturePadPrimitive.HiddenInput {...props} />
101
+ }
102
+
103
+ export {
104
+ SignaturePad,
105
+ SignaturePadClearTrigger,
106
+ SignaturePadContext,
107
+ SignaturePadControl,
108
+ SignaturePadGuide,
109
+ SignaturePadHiddenInput,
110
+ SignaturePadLabel,
111
+ SignaturePadSegment,
112
+ }
@@ -0,0 +1,7 @@
1
+ import { cn } from "@/lib/utils"
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4
+ return <div data-slot="skeleton" className={cn("animate-pulse rounded-md bg-muted", className)} {...props} />
5
+ }
6
+
7
+ export { Skeleton }
@@ -0,0 +1,183 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Slider as SliderPrimitive } from "@ark-ui/react"
6
+
7
+ function Slider({
8
+ className,
9
+ children,
10
+ defaultValue,
11
+ value,
12
+ min = 0,
13
+ max = 100,
14
+ ...props
15
+ }: React.ComponentProps<typeof SliderPrimitive.Root>) {
16
+ const _values = React.useMemo(
17
+ () => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]),
18
+ [value, defaultValue, min, max]
19
+ )
20
+
21
+ return (
22
+ <SliderPrimitive.Root
23
+ data-slot="slider"
24
+ defaultValue={defaultValue}
25
+ value={value}
26
+ min={min}
27
+ max={max}
28
+ className={cn(
29
+ "relative flex w-full touch-none flex-col gap-2 select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto",
30
+ className
31
+ )}
32
+ {...props}
33
+ >
34
+ {children}
35
+ <SliderControl>
36
+ <SliderTrack>
37
+ <SliderRange />
38
+ </SliderTrack>
39
+ {Array.from({ length: _values.length }, (_, index) => (
40
+ <SliderThumb key={index} index={index}>
41
+ <SliderHiddenInput />
42
+ </SliderThumb>
43
+ ))}
44
+ </SliderControl>
45
+ </SliderPrimitive.Root>
46
+ )
47
+ }
48
+
49
+ function SliderRoot({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>) {
50
+ return (
51
+ <SliderPrimitive.Root
52
+ data-slot="slider"
53
+ className={cn(
54
+ "relative flex w-full touch-none flex-col gap-2 select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto",
55
+ className
56
+ )}
57
+ {...props}
58
+ />
59
+ )
60
+ }
61
+
62
+ function SliderContext({ ...props }: React.ComponentProps<typeof SliderPrimitive.Context>) {
63
+ return <SliderPrimitive.Context {...props} />
64
+ }
65
+
66
+ function SliderLabel({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Label>) {
67
+ return <SliderPrimitive.Label data-slot="slider-label" className={cn("text-sm font-medium", className)} {...props} />
68
+ }
69
+
70
+ function SliderValueText({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.ValueText>) {
71
+ return (
72
+ <SliderPrimitive.ValueText
73
+ data-slot="slider-value-text"
74
+ className={cn("text-sm text-muted-foreground", className)}
75
+ {...props}
76
+ />
77
+ )
78
+ }
79
+
80
+ function SliderControl({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Control>) {
81
+ return (
82
+ <SliderPrimitive.Control
83
+ data-slot="slider-control"
84
+ className={cn("relative flex items-center data-vertical:h-full data-vertical:flex-col", className)}
85
+ {...props}
86
+ />
87
+ )
88
+ }
89
+
90
+ function SliderTrack({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Track>) {
91
+ return (
92
+ <SliderPrimitive.Track
93
+ data-slot="slider-track"
94
+ className={cn(
95
+ "relative grow overflow-hidden rounded-full bg-muted data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1",
96
+ className
97
+ )}
98
+ {...props}
99
+ />
100
+ )
101
+ }
102
+
103
+ function SliderRange({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Range>) {
104
+ return (
105
+ <SliderPrimitive.Range
106
+ data-slot="slider-range"
107
+ className={cn("absolute bg-primary select-none data-horizontal:h-full data-vertical:w-full", className)}
108
+ {...props}
109
+ />
110
+ )
111
+ }
112
+
113
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
114
+ function SliderThumb({ className, ...props }: Omit<React.ComponentProps<typeof SliderPrimitive.Thumb>, "id">) {
115
+ return (
116
+ <SliderPrimitive.Thumb
117
+ data-slot="slider-thumb"
118
+ className={cn(
119
+ "relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden data-dragging:ring-3 data-disabled:pointer-events-none data-disabled:opacity-50",
120
+ className
121
+ )}
122
+ {...props}
123
+ />
124
+ )
125
+ }
126
+
127
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
128
+ function SliderHiddenInput({ ...props }: Omit<React.ComponentProps<typeof SliderPrimitive.HiddenInput>, "id">) {
129
+ return <SliderPrimitive.HiddenInput {...props} />
130
+ }
131
+
132
+ function SliderMarkerGroup({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.MarkerGroup>) {
133
+ return (
134
+ <SliderPrimitive.MarkerGroup
135
+ data-slot="slider-marker-group"
136
+ className={cn("relative h-4 text-xs text-muted-foreground", className)}
137
+ {...props}
138
+ />
139
+ )
140
+ }
141
+
142
+ function SliderMarker({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Marker>) {
143
+ return (
144
+ <SliderPrimitive.Marker
145
+ data-slot="slider-marker"
146
+ className={cn("absolute -translate-x-1/2", className)}
147
+ {...props}
148
+ />
149
+ )
150
+ }
151
+
152
+ /** Value bubble shown above a thumb while it is dragged. Place it inside `SliderThumb`. */
153
+ function SliderDraggingIndicator({
154
+ className,
155
+ ...props
156
+ }: React.ComponentProps<typeof SliderPrimitive.DraggingIndicator>) {
157
+ return (
158
+ <SliderPrimitive.DraggingIndicator
159
+ data-slot="slider-dragging-indicator"
160
+ className={cn(
161
+ "pointer-events-none absolute bottom-full left-1/2 mb-2 -translate-x-1/2 rounded-md bg-primary px-1.5 py-0.5 text-xs font-medium text-primary-foreground tabular-nums",
162
+ className
163
+ )}
164
+ {...props}
165
+ />
166
+ )
167
+ }
168
+
169
+ export {
170
+ Slider,
171
+ SliderContext,
172
+ SliderControl,
173
+ SliderHiddenInput,
174
+ SliderLabel,
175
+ SliderMarker,
176
+ SliderMarkerGroup,
177
+ SliderRange,
178
+ SliderRoot,
179
+ SliderThumb,
180
+ SliderTrack,
181
+ SliderValueText,
182
+ SliderDraggingIndicator,
183
+ }
@@ -0,0 +1,37 @@
1
+ import { useTheme } from "next-themes"
2
+ import { Toaster as Sonner, type ToasterProps } from "sonner"
3
+ import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
4
+
5
+ const Toaster = ({ ...props }: ToasterProps) => {
6
+ const { theme = "system" } = useTheme()
7
+
8
+ return (
9
+ <Sonner
10
+ theme={theme as ToasterProps["theme"]}
11
+ className="group"
12
+ icons={{
13
+ success: <CircleCheckIcon className="size-4" />,
14
+ info: <InfoIcon className="size-4" />,
15
+ warning: <TriangleAlertIcon className="size-4" />,
16
+ error: <OctagonXIcon className="size-4" />,
17
+ loading: <Loader2Icon className="size-4 animate-spin" />,
18
+ }}
19
+ style={
20
+ {
21
+ "--normal-bg": "var(--popover)",
22
+ "--normal-text": "var(--popover-foreground)",
23
+ "--normal-border": "var(--border)",
24
+ "--border-radius": "var(--radius)",
25
+ } as React.CSSProperties
26
+ }
27
+ toastOptions={{
28
+ classNames: {
29
+ toast: "cn-toast",
30
+ },
31
+ }}
32
+ {...props}
33
+ />
34
+ )
35
+ }
36
+
37
+ export { Toaster }
@@ -0,0 +1,16 @@
1
+ import { cn } from "@/lib/utils"
2
+ import { Loader2Icon } from "lucide-react"
3
+
4
+ function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
5
+ return (
6
+ <Loader2Icon
7
+ data-slot="spinner"
8
+ role="status"
9
+ aria-label="Loading"
10
+ className={cn("size-4 animate-spin", className)}
11
+ {...props}
12
+ />
13
+ )
14
+ }
15
+
16
+ export { Spinner }
@@ -0,0 +1,152 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Steps as StepsPrimitive } from "@ark-ui/react"
6
+ import { CheckIcon } from "lucide-react"
7
+
8
+ import { Button } from "@/components/ui/button"
9
+
10
+ function Steps({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Root>) {
11
+ return (
12
+ <StepsPrimitive.Root
13
+ data-slot="steps"
14
+ className={cn("flex w-full flex-col gap-4 data-vertical:flex-row", className)}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ function StepsContext({ ...props }: React.ComponentProps<typeof StepsPrimitive.Context>) {
21
+ return <StepsPrimitive.Context {...props} />
22
+ }
23
+
24
+ function StepsList({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.List>) {
25
+ return (
26
+ <StepsPrimitive.List
27
+ data-slot="steps-list"
28
+ className={cn("flex items-center gap-2 data-vertical:flex-col data-vertical:items-stretch", className)}
29
+ {...props}
30
+ />
31
+ )
32
+ }
33
+
34
+ function StepsItem({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Item>) {
35
+ return (
36
+ <StepsPrimitive.Item
37
+ data-slot="steps-item"
38
+ className={cn(
39
+ "group/steps-item flex flex-1 items-center gap-2 last:flex-none data-vertical:flex-col data-vertical:items-start",
40
+ className
41
+ )}
42
+ {...props}
43
+ />
44
+ )
45
+ }
46
+
47
+ function StepsItemContext({ ...props }: React.ComponentProps<typeof StepsPrimitive.ItemContext>) {
48
+ return <StepsPrimitive.ItemContext {...props} />
49
+ }
50
+
51
+ function StepsTrigger({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Trigger>) {
52
+ return (
53
+ <StepsPrimitive.Trigger
54
+ data-slot="steps-trigger"
55
+ className={cn(
56
+ "flex items-center gap-2 rounded-md text-left text-sm font-medium outline-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-incomplete:text-muted-foreground",
57
+ className
58
+ )}
59
+ {...props}
60
+ />
61
+ )
62
+ }
63
+
64
+ function StepsIndicator({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.Indicator>) {
65
+ return (
66
+ <StepsPrimitive.Indicator
67
+ data-slot="steps-indicator"
68
+ className={cn(
69
+ "flex size-7 shrink-0 items-center justify-center rounded-full border border-input text-xs font-medium tabular-nums transition-colors data-complete:border-primary data-complete:bg-primary data-complete:text-primary-foreground data-current:border-primary data-current:bg-primary data-current:text-primary-foreground [&_svg]:size-3.5",
70
+ className
71
+ )}
72
+ {...props}
73
+ >
74
+ {children ?? (
75
+ <StepsPrimitive.ItemContext>
76
+ {({ completed, index }) => (completed ? <CheckIcon /> : index + 1)}
77
+ </StepsPrimitive.ItemContext>
78
+ )}
79
+ </StepsPrimitive.Indicator>
80
+ )
81
+ }
82
+
83
+ function StepsSeparator({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Separator>) {
84
+ return (
85
+ <StepsPrimitive.Separator
86
+ data-slot="steps-separator"
87
+ className={cn(
88
+ "h-px flex-1 bg-border transition-colors data-complete:bg-primary data-vertical:ml-3.5 data-vertical:h-6 data-vertical:w-px data-vertical:flex-none",
89
+ className
90
+ )}
91
+ {...props}
92
+ />
93
+ )
94
+ }
95
+
96
+ function StepsContent({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Content>) {
97
+ return <StepsPrimitive.Content data-slot="steps-content" className={cn("text-sm", className)} {...props} />
98
+ }
99
+
100
+ function StepsCompletedContent({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.CompletedContent>) {
101
+ return (
102
+ <StepsPrimitive.CompletedContent
103
+ data-slot="steps-completed-content"
104
+ className={cn("text-sm", className)}
105
+ {...props}
106
+ />
107
+ )
108
+ }
109
+
110
+ function StepsProgress({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Progress>) {
111
+ return (
112
+ <StepsPrimitive.Progress
113
+ data-slot="steps-progress"
114
+ className={cn("h-1 w-full rounded-full bg-muted", className)}
115
+ {...props}
116
+ />
117
+ )
118
+ }
119
+
120
+ function StepsPrevTrigger({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.PrevTrigger>) {
121
+ return (
122
+ <StepsPrimitive.PrevTrigger data-slot="steps-prev-trigger" className={cn(className)} asChild {...props}>
123
+ <Button variant="outline" size="sm">
124
+ {children}
125
+ </Button>
126
+ </StepsPrimitive.PrevTrigger>
127
+ )
128
+ }
129
+
130
+ function StepsNextTrigger({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.NextTrigger>) {
131
+ return (
132
+ <StepsPrimitive.NextTrigger data-slot="steps-next-trigger" className={cn(className)} asChild {...props}>
133
+ <Button size="sm">{children}</Button>
134
+ </StepsPrimitive.NextTrigger>
135
+ )
136
+ }
137
+
138
+ export {
139
+ Steps,
140
+ StepsCompletedContent,
141
+ StepsContent,
142
+ StepsContext,
143
+ StepsIndicator,
144
+ StepsItem,
145
+ StepsItemContext,
146
+ StepsList,
147
+ StepsNextTrigger,
148
+ StepsPrevTrigger,
149
+ StepsProgress,
150
+ StepsSeparator,
151
+ StepsTrigger,
152
+ }
@@ -0,0 +1,33 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Swap as SwapPrimitive } from "@ark-ui/react"
6
+
7
+ function Swap({ className, ...props }: React.ComponentProps<typeof SwapPrimitive.Root>) {
8
+ return (
9
+ <SwapPrimitive.Root
10
+ data-slot="swap"
11
+ className={cn(
12
+ "relative inline-grid cursor-pointer place-items-center select-none *:col-start-1 *:row-start-1",
13
+ className
14
+ )}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ function SwapIndicator({ className, ...props }: React.ComponentProps<typeof SwapPrimitive.Indicator>) {
21
+ return (
22
+ <SwapPrimitive.Indicator
23
+ data-slot="swap-indicator"
24
+ className={cn(
25
+ "transition-[opacity,transform] duration-200 data-[state=closed]:scale-75 data-[state=closed]:opacity-0 data-[state=open]:scale-100 data-[state=open]:opacity-100",
26
+ className
27
+ )}
28
+ {...props}
29
+ />
30
+ )
31
+ }
32
+
33
+ export { Swap, SwapIndicator }
@@ -0,0 +1,83 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Switch as SwitchPrimitive } from "@ark-ui/react"
6
+
7
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
8
+ function Switch({
9
+ className,
10
+ size = "default",
11
+ children,
12
+ ...props
13
+ }: Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, "id"> & {
14
+ size?: "sm" | "default"
15
+ }) {
16
+ return (
17
+ <SwitchPrimitive.Root
18
+ data-slot="switch"
19
+ data-size={size}
20
+ className="group/switch peer inline-flex items-center gap-2"
21
+ {...props}
22
+ >
23
+ <SwitchControl className={className}>
24
+ <SwitchThumb />
25
+ </SwitchControl>
26
+ {children && <SwitchLabel>{children}</SwitchLabel>}
27
+ <SwitchHiddenInput />
28
+ </SwitchPrimitive.Root>
29
+ )
30
+ }
31
+
32
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
33
+ function SwitchRoot({ ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, "id">) {
34
+ return <SwitchPrimitive.Root data-slot="switch" {...props} />
35
+ }
36
+
37
+ function SwitchContext({ ...props }: React.ComponentProps<typeof SwitchPrimitive.Context>) {
38
+ return <SwitchPrimitive.Context {...props} />
39
+ }
40
+
41
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
42
+ function SwitchControl({ className, ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.Control>, "id">) {
43
+ return (
44
+ <SwitchPrimitive.Control
45
+ data-slot="switch-control"
46
+ className={cn(
47
+ "relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none group-has-focus-visible/field-label:border-transparent group-has-focus-visible/field-label:ring-0 group-data-[size=default]/switch:h-[18.4px] group-data-[size=default]/switch:w-8 group-data-[size=sm]/switch:h-3.5 group-data-[size=sm]/switch:w-6 after:absolute after:-inset-x-3 after:-inset-y-2 data-focus-visible:border-ring data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-invalid:border-destructive data-invalid:ring-3 data-invalid:ring-destructive/20 dark:data-invalid:border-destructive/50 dark:data-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
48
+ className
49
+ )}
50
+ {...props}
51
+ />
52
+ )
53
+ }
54
+
55
+ function SwitchThumb({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Thumb>) {
56
+ return (
57
+ <SwitchPrimitive.Thumb
58
+ data-slot="switch-thumb"
59
+ className={cn(
60
+ "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground",
61
+ className
62
+ )}
63
+ {...props}
64
+ />
65
+ )
66
+ }
67
+
68
+ function SwitchLabel({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Label>) {
69
+ return (
70
+ <SwitchPrimitive.Label
71
+ data-slot="switch-label"
72
+ className={cn("text-sm leading-none select-none data-disabled:opacity-50", className)}
73
+ {...props}
74
+ />
75
+ )
76
+ }
77
+
78
+ /** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
79
+ function SwitchHiddenInput({ ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.HiddenInput>, "id">) {
80
+ return <SwitchPrimitive.HiddenInput {...props} />
81
+ }
82
+
83
+ export { Switch, SwitchContext, SwitchControl, SwitchHiddenInput, SwitchLabel, SwitchRoot, SwitchThumb }