@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,329 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Menu as DropdownMenuPrimitive, Portal as PortalPrimitive } from "@ark-ui/react"
6
+ import { CheckIcon, ChevronRightIcon, ChevronDownIcon } from "lucide-react"
7
+
8
+ function DropdownMenu({
9
+ positioning,
10
+ lazyMount = true,
11
+ unmountOnExit = true,
12
+ ...props
13
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
14
+ return (
15
+ <DropdownMenuPrimitive.Root
16
+ positioning={{ placement: "bottom-start", gutter: 4, ...positioning }}
17
+ lazyMount={lazyMount}
18
+ unmountOnExit={unmountOnExit}
19
+ {...props}
20
+ />
21
+ )
22
+ }
23
+
24
+ function DropdownMenuPortal({ ...props }: React.ComponentProps<typeof PortalPrimitive>) {
25
+ return <PortalPrimitive {...props} />
26
+ }
27
+
28
+ function DropdownMenuContext({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Context>) {
29
+ return <DropdownMenuPrimitive.Context {...props} />
30
+ }
31
+
32
+ function DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
33
+ return <DropdownMenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />
34
+ }
35
+
36
+ function DropdownMenuPositioner({
37
+ className,
38
+ ...props
39
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Positioner>) {
40
+ return (
41
+ <DropdownMenuPrimitive.Positioner
42
+ data-slot="dropdown-menu-positioner"
43
+ className={cn("[--z-index:50]", className)}
44
+ {...props}
45
+ />
46
+ )
47
+ }
48
+
49
+ function DropdownMenuContent({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
50
+ return (
51
+ <DropdownMenuPortal>
52
+ <DropdownMenuPositioner>
53
+ <DropdownMenuPrimitive.Content
54
+ data-slot="dropdown-menu-content"
55
+ className={cn(
56
+ "z-50 max-h-(--available-height) w-(--reference-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
57
+ className
58
+ )}
59
+ {...props}
60
+ />
61
+ </DropdownMenuPositioner>
62
+ </DropdownMenuPortal>
63
+ )
64
+ }
65
+
66
+ function DropdownMenuArrow({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Arrow>) {
67
+ return (
68
+ <DropdownMenuPrimitive.Arrow
69
+ data-slot="dropdown-menu-arrow"
70
+ className={cn("[--arrow-background:var(--color-popover)] [--arrow-size:0.625rem]", className)}
71
+ {...props}
72
+ >
73
+ <DropdownMenuPrimitive.ArrowTip
74
+ data-slot="dropdown-menu-arrow-tip"
75
+ className="border-t border-l border-foreground/10"
76
+ />
77
+ </DropdownMenuPrimitive.Arrow>
78
+ )
79
+ }
80
+
81
+ function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.ItemGroup>) {
82
+ return <DropdownMenuPrimitive.ItemGroup data-slot="dropdown-menu-group" {...props} />
83
+ }
84
+
85
+ const itemClassName =
86
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:data-highlighted:bg-destructive/10 data-[variant=destructive]:data-highlighted:text-destructive dark:data-[variant=destructive]:data-highlighted:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive"
87
+
88
+ function DropdownMenuItem({
89
+ className,
90
+ inset,
91
+ variant = "default",
92
+ value,
93
+ ...props
94
+ }: Omit<React.ComponentProps<typeof DropdownMenuPrimitive.Item>, "value"> & {
95
+ value?: string
96
+ inset?: boolean
97
+ variant?: "default" | "destructive"
98
+ }) {
99
+ const id = React.useId()
100
+ return (
101
+ <DropdownMenuPrimitive.Item
102
+ data-slot="dropdown-menu-item"
103
+ data-inset={inset}
104
+ data-variant={variant}
105
+ value={value ?? id}
106
+ className={cn(itemClassName, className)}
107
+ {...props}
108
+ />
109
+ )
110
+ }
111
+
112
+ function DropdownMenuItemText({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.ItemText>) {
113
+ return <DropdownMenuPrimitive.ItemText data-slot="dropdown-menu-item-text" {...props} />
114
+ }
115
+
116
+ function DropdownMenuItemIndicator({
117
+ className,
118
+ ...props
119
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.ItemIndicator>) {
120
+ return (
121
+ <DropdownMenuPrimitive.ItemIndicator
122
+ data-slot="dropdown-menu-item-indicator"
123
+ className={cn("pointer-events-none absolute right-2 flex items-center justify-center", className)}
124
+ {...props}
125
+ />
126
+ )
127
+ }
128
+
129
+ const optionItemClassName =
130
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-highlighted:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
131
+
132
+ function DropdownMenuCheckboxItem({
133
+ className,
134
+ children,
135
+ checked = false,
136
+ inset,
137
+ value,
138
+ ...props
139
+ }: Omit<React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>, "checked" | "value"> & {
140
+ checked?: boolean
141
+ value?: string
142
+ inset?: boolean
143
+ }) {
144
+ const id = React.useId()
145
+ return (
146
+ <DropdownMenuPrimitive.CheckboxItem
147
+ data-slot="dropdown-menu-checkbox-item"
148
+ data-inset={inset}
149
+ className={cn(optionItemClassName, className)}
150
+ checked={checked}
151
+ value={value ?? id}
152
+ {...props}
153
+ >
154
+ <DropdownMenuItemIndicator data-slot="dropdown-menu-checkbox-item-indicator">
155
+ <CheckIcon />
156
+ </DropdownMenuItemIndicator>
157
+ {children}
158
+ </DropdownMenuPrimitive.CheckboxItem>
159
+ )
160
+ }
161
+
162
+ function DropdownMenuRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItemGroup>) {
163
+ return <DropdownMenuPrimitive.RadioItemGroup data-slot="dropdown-menu-radio-group" {...props} />
164
+ }
165
+
166
+ function DropdownMenuRadioItem({
167
+ className,
168
+ children,
169
+ inset,
170
+ ...props
171
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {
172
+ inset?: boolean
173
+ }) {
174
+ return (
175
+ <DropdownMenuPrimitive.RadioItem
176
+ data-slot="dropdown-menu-radio-item"
177
+ data-inset={inset}
178
+ className={cn(optionItemClassName, className)}
179
+ {...props}
180
+ >
181
+ <DropdownMenuItemIndicator data-slot="dropdown-menu-radio-item-indicator">
182
+ <CheckIcon />
183
+ </DropdownMenuItemIndicator>
184
+ {children}
185
+ </DropdownMenuPrimitive.RadioItem>
186
+ )
187
+ }
188
+
189
+ function DropdownMenuLabel({
190
+ className,
191
+ inset,
192
+ ...props
193
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.ItemGroupLabel> & {
194
+ inset?: boolean
195
+ }) {
196
+ return (
197
+ <DropdownMenuPrimitive.ItemGroupLabel
198
+ data-slot="dropdown-menu-label"
199
+ data-inset={inset}
200
+ className={cn("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", className)}
201
+ {...props}
202
+ />
203
+ )
204
+ }
205
+
206
+ function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
207
+ return (
208
+ <DropdownMenuPrimitive.Separator
209
+ data-slot="dropdown-menu-separator"
210
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
211
+ {...props}
212
+ />
213
+ )
214
+ }
215
+
216
+ function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) {
217
+ return (
218
+ <span
219
+ data-slot="dropdown-menu-shortcut"
220
+ className={cn(
221
+ "ml-auto text-xs tracking-widest text-muted-foreground group-data-highlighted/dropdown-menu-item:text-accent-foreground",
222
+ className
223
+ )}
224
+ {...props}
225
+ />
226
+ )
227
+ }
228
+
229
+ function DropdownMenuSub({
230
+ lazyMount = true,
231
+ unmountOnExit = true,
232
+ ...props
233
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
234
+ return <DropdownMenuPrimitive.Root lazyMount={lazyMount} unmountOnExit={unmountOnExit} {...props} />
235
+ }
236
+
237
+ function DropdownMenuSubTrigger({
238
+ className,
239
+ inset,
240
+ children,
241
+ ...props
242
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.TriggerItem> & {
243
+ inset?: boolean
244
+ }) {
245
+ return (
246
+ <DropdownMenuPrimitive.TriggerItem
247
+ data-slot="dropdown-menu-sub-trigger"
248
+ data-inset={inset}
249
+ className={cn(
250
+ "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
251
+ className
252
+ )}
253
+ {...props}
254
+ >
255
+ {children}
256
+ <ChevronRightIcon className="ml-auto" />
257
+ </DropdownMenuPrimitive.TriggerItem>
258
+ )
259
+ }
260
+
261
+ function DropdownMenuSubContent({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
262
+ return (
263
+ <DropdownMenuPortal>
264
+ <DropdownMenuPositioner>
265
+ <DropdownMenuPrimitive.Content
266
+ data-slot="dropdown-menu-sub-content"
267
+ className={cn(
268
+ "z-50 min-w-24 origin-(--transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
269
+ className
270
+ )}
271
+ {...props}
272
+ />
273
+ </DropdownMenuPositioner>
274
+ </DropdownMenuPortal>
275
+ )
276
+ }
277
+
278
+ /** Render-prop access to one item's state (`{ selected, highlighted, disabled, ... }`). */
279
+ function DropdownMenuItemContext({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.ItemContext>) {
280
+ return <DropdownMenuPrimitive.ItemContext {...props} />
281
+ }
282
+
283
+ /** Opens the menu from a right-click (context-menu style) instead of a click. */
284
+ function DropdownMenuContextTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.ContextTrigger>) {
285
+ return <DropdownMenuPrimitive.ContextTrigger data-slot="dropdown-menu-context-trigger" {...props} />
286
+ }
287
+
288
+ /** Open-state indicator for a trigger; rotates when open. */
289
+ function DropdownMenuIndicator({
290
+ className,
291
+ children,
292
+ ...props
293
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Indicator>) {
294
+ return (
295
+ <DropdownMenuPrimitive.Indicator
296
+ data-slot="dropdown-menu-indicator"
297
+ className={cn("inline-flex transition-transform data-[state=open]:rotate-180 [&_svg]:size-4", className)}
298
+ {...props}
299
+ >
300
+ {children ?? <ChevronDownIcon />}
301
+ </DropdownMenuPrimitive.Indicator>
302
+ )
303
+ }
304
+
305
+ export {
306
+ DropdownMenu,
307
+ DropdownMenuArrow,
308
+ DropdownMenuCheckboxItem,
309
+ DropdownMenuContent,
310
+ DropdownMenuContext,
311
+ DropdownMenuGroup,
312
+ DropdownMenuItem,
313
+ DropdownMenuItemIndicator,
314
+ DropdownMenuItemText,
315
+ DropdownMenuLabel,
316
+ DropdownMenuPortal,
317
+ DropdownMenuPositioner,
318
+ DropdownMenuRadioGroup,
319
+ DropdownMenuRadioItem,
320
+ DropdownMenuSeparator,
321
+ DropdownMenuShortcut,
322
+ DropdownMenuSub,
323
+ DropdownMenuSubContent,
324
+ DropdownMenuSubTrigger,
325
+ DropdownMenuTrigger,
326
+ DropdownMenuItemContext,
327
+ DropdownMenuContextTrigger,
328
+ DropdownMenuIndicator,
329
+ }
@@ -0,0 +1,90 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import { Editable as EditablePrimitive } from "@ark-ui/react"
6
+
7
+ function Editable({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Root>) {
8
+ return (
9
+ <EditablePrimitive.Root data-slot="editable" className={cn("flex w-full flex-col gap-1.5", className)} {...props} />
10
+ )
11
+ }
12
+
13
+ function EditableContext({ ...props }: React.ComponentProps<typeof EditablePrimitive.Context>) {
14
+ return <EditablePrimitive.Context {...props} />
15
+ }
16
+
17
+ function EditableLabel({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Label>) {
18
+ return (
19
+ <EditablePrimitive.Label
20
+ data-slot="editable-label"
21
+ className={cn("text-sm font-medium select-none", className)}
22
+ {...props}
23
+ />
24
+ )
25
+ }
26
+
27
+ function EditableArea({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Area>) {
28
+ return <EditablePrimitive.Area data-slot="editable-area" className={cn("relative w-full", className)} {...props} />
29
+ }
30
+
31
+ function EditablePreview({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Preview>) {
32
+ return (
33
+ <EditablePrimitive.Preview
34
+ data-slot="editable-preview"
35
+ className={cn(
36
+ "inline-flex h-8 w-full items-center rounded-lg px-2.5 text-sm transition-colors hover:bg-muted data-placeholder-shown:text-muted-foreground data-disabled:opacity-50",
37
+ className
38
+ )}
39
+ {...props}
40
+ />
41
+ )
42
+ }
43
+
44
+ function EditableInput({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Input>) {
45
+ return (
46
+ <EditablePrimitive.Input
47
+ data-slot="editable-input"
48
+ className={cn(
49
+ "h-8 w-full rounded-lg border border-input bg-transparent px-2.5 text-sm outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 data-invalid:border-destructive dark:bg-input/30",
50
+ className
51
+ )}
52
+ {...props}
53
+ />
54
+ )
55
+ }
56
+
57
+ function EditableControl({ className, ...props }: React.ComponentProps<typeof EditablePrimitive.Control>) {
58
+ return (
59
+ <EditablePrimitive.Control
60
+ data-slot="editable-control"
61
+ className={cn("flex items-center gap-1", className)}
62
+ {...props}
63
+ />
64
+ )
65
+ }
66
+
67
+ function EditableEditTrigger({ ...props }: React.ComponentProps<typeof EditablePrimitive.EditTrigger>) {
68
+ return <EditablePrimitive.EditTrigger data-slot="editable-edit-trigger" {...props} />
69
+ }
70
+
71
+ function EditableSubmitTrigger({ ...props }: React.ComponentProps<typeof EditablePrimitive.SubmitTrigger>) {
72
+ return <EditablePrimitive.SubmitTrigger data-slot="editable-submit-trigger" {...props} />
73
+ }
74
+
75
+ function EditableCancelTrigger({ ...props }: React.ComponentProps<typeof EditablePrimitive.CancelTrigger>) {
76
+ return <EditablePrimitive.CancelTrigger data-slot="editable-cancel-trigger" {...props} />
77
+ }
78
+
79
+ export {
80
+ Editable,
81
+ EditableArea,
82
+ EditableCancelTrigger,
83
+ EditableContext,
84
+ EditableControl,
85
+ EditableEditTrigger,
86
+ EditableInput,
87
+ EditableLabel,
88
+ EditablePreview,
89
+ EditableSubmitTrigger,
90
+ }
@@ -0,0 +1,86 @@
1
+ import { cva, type VariantProps } from "class-variance-authority"
2
+ import { cn } from "@/lib/utils"
3
+
4
+ function Empty({ className, ...props }: React.ComponentProps<"div">) {
5
+ return (
6
+ <div
7
+ data-slot="empty"
8
+ className={cn(
9
+ "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance",
10
+ className
11
+ )}
12
+ {...props}
13
+ />
14
+ )
15
+ }
16
+
17
+ function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) {
18
+ return (
19
+ <div data-slot="empty-header" className={cn("flex max-w-sm flex-col items-center gap-2", className)} {...props} />
20
+ )
21
+ }
22
+
23
+ const emptyMediaVariants = cva(
24
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
25
+ {
26
+ variants: {
27
+ variant: {
28
+ default: "bg-transparent",
29
+ icon: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4",
30
+ },
31
+ },
32
+ defaultVariants: {
33
+ variant: "default",
34
+ },
35
+ }
36
+ )
37
+
38
+ function EmptyMedia({
39
+ className,
40
+ variant = "default",
41
+ ...props
42
+ }: React.ComponentProps<"div"> & VariantProps<typeof emptyMediaVariants>) {
43
+ return (
44
+ <div
45
+ data-slot="empty-icon"
46
+ data-variant={variant}
47
+ className={cn(emptyMediaVariants({ variant, className }))}
48
+ {...props}
49
+ />
50
+ )
51
+ }
52
+
53
+ function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
54
+ return (
55
+ <div
56
+ data-slot="empty-title"
57
+ className={cn("font-heading text-sm font-medium tracking-tight", className)}
58
+ {...props}
59
+ />
60
+ )
61
+ }
62
+
63
+ function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) {
64
+ return (
65
+ <div
66
+ data-slot="empty-description"
67
+ className={cn(
68
+ "text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
69
+ className
70
+ )}
71
+ {...props}
72
+ />
73
+ )
74
+ }
75
+
76
+ function EmptyContent({ className, ...props }: React.ComponentProps<"div">) {
77
+ return (
78
+ <div
79
+ data-slot="empty-content"
80
+ className={cn("flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance", className)}
81
+ {...props}
82
+ />
83
+ )
84
+ }
85
+
86
+ export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia }