@object-ui/components 0.3.1 → 0.5.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 (299) hide show
  1. package/.turbo/turbo-build.log +47 -0
  2. package/README.md +13 -0
  3. package/dist/index.css +1 -1
  4. package/dist/index.js +34610 -24854
  5. package/dist/index.umd.cjs +53 -32
  6. package/dist/src/SchemaRenderer.d.ts +3 -0
  7. package/dist/src/{ui → custom}/button-group.d.ts +1 -1
  8. package/dist/src/custom/field.d.ts +19 -0
  9. package/dist/src/custom/index.d.ts +12 -0
  10. package/dist/src/custom/input-group.d.ts +14 -0
  11. package/dist/src/{ui → custom}/item.d.ts +1 -1
  12. package/dist/src/custom/native-select.d.ts +12 -0
  13. package/dist/src/custom/sort-builder.d.ts +22 -0
  14. package/dist/src/index.d.ts +1 -0
  15. package/dist/src/renderers/data-display/table.d.ts +1 -1
  16. package/dist/src/renderers/layout/page.d.ts +1 -1
  17. package/dist/src/renderers/placeholders.d.ts +1 -1
  18. package/dist/src/ui/accordion.d.ts +4 -4
  19. package/dist/src/ui/alert-dialog.d.ts +17 -11
  20. package/dist/src/ui/alert.d.ts +4 -5
  21. package/dist/src/ui/aspect-ratio.d.ts +1 -1
  22. package/dist/src/ui/avatar.d.ts +3 -3
  23. package/dist/src/ui/badge.d.ts +3 -3
  24. package/dist/src/ui/breadcrumb.d.ts +16 -8
  25. package/dist/src/ui/calendar.d.ts +7 -7
  26. package/dist/src/ui/card.d.ts +7 -8
  27. package/dist/src/ui/carousel.d.ts +5 -6
  28. package/dist/src/ui/chart.d.ts +62 -0
  29. package/dist/src/ui/checkbox.d.ts +1 -1
  30. package/dist/src/ui/collapsible.d.ts +3 -3
  31. package/dist/src/ui/command.d.ts +78 -16
  32. package/dist/src/ui/context-menu.d.ts +14 -12
  33. package/dist/src/ui/dialog.d.ts +17 -13
  34. package/dist/src/ui/drawer.d.ts +19 -10
  35. package/dist/src/ui/dropdown-menu.d.ts +20 -18
  36. package/dist/src/ui/form.d.ts +6 -7
  37. package/dist/src/ui/hover-card.d.ts +3 -3
  38. package/dist/src/ui/index.d.ts +2 -8
  39. package/dist/src/ui/input-otp.d.ts +30 -7
  40. package/dist/src/ui/label.d.ts +2 -1
  41. package/dist/src/ui/menubar.d.ts +19 -17
  42. package/dist/src/ui/navigation-menu.d.ts +9 -11
  43. package/dist/src/ui/pagination.d.ts +25 -10
  44. package/dist/src/ui/popover.d.ts +4 -5
  45. package/dist/src/ui/progress.d.ts +1 -1
  46. package/dist/src/ui/radio-group.d.ts +2 -2
  47. package/dist/src/ui/resizable.d.ts +5 -8
  48. package/dist/src/ui/scroll-area.d.ts +2 -2
  49. package/dist/src/ui/select.d.ts +11 -13
  50. package/dist/src/ui/sheet.d.ts +23 -11
  51. package/dist/src/ui/sidebar.d.ts +27 -29
  52. package/dist/src/ui/skeleton.d.ts +1 -1
  53. package/dist/src/ui/slider.d.ts +1 -1
  54. package/dist/src/ui/sonner.d.ts +2 -1
  55. package/dist/src/ui/switch.d.ts +2 -2
  56. package/dist/src/ui/tabs.d.ts +1 -1
  57. package/dist/src/ui/textarea.d.ts +1 -1
  58. package/dist/src/ui/toast.d.ts +22 -0
  59. package/dist/src/ui/toggle-group.d.ts +8 -3
  60. package/dist/src/ui/toggle.d.ts +4 -1
  61. package/dist/src/ui/tooltip.d.ts +4 -4
  62. package/dist/src/ui/typography.d.ts +21 -0
  63. package/package.json +17 -7
  64. package/shadcn-components.json +52 -47
  65. package/src/SchemaRenderer.tsx +28 -0
  66. package/src/__tests__/PageRendererRegions.test.tsx +59 -0
  67. package/src/__tests__/Registry.test.ts +21 -0
  68. package/src/__tests__/basic-renderers.test.tsx +1 -1
  69. package/src/__tests__/complex-disclosure-renderers.test.tsx +3 -2
  70. package/src/__tests__/feedback-overlay-renderers.test.tsx +1 -1
  71. package/src/__tests__/form-renderers.test.tsx +1 -1
  72. package/src/__tests__/layout-data-renderers.test.tsx +1 -1
  73. package/src/{ui → custom}/button-group.tsx +1 -1
  74. package/src/{ui → custom}/combobox.tsx +3 -3
  75. package/src/{ui → custom}/date-picker.tsx +3 -3
  76. package/src/custom/field.tsx +81 -0
  77. package/src/{ui → custom}/filter-builder.tsx +3 -3
  78. package/src/custom/index.ts +12 -0
  79. package/src/custom/input-group.tsx +53 -0
  80. package/src/{ui → custom}/item.tsx +1 -1
  81. package/src/custom/native-select.tsx +33 -0
  82. package/src/custom/sort-builder.tsx +129 -0
  83. package/src/index.css +20 -1
  84. package/src/index.ts +1 -0
  85. package/src/renderers/basic/button-group.tsx +1 -0
  86. package/src/renderers/basic/div.tsx +12 -1
  87. package/src/renderers/basic/html.tsx +1 -0
  88. package/src/renderers/basic/icon.tsx +1 -0
  89. package/src/renderers/basic/image.tsx +1 -0
  90. package/src/renderers/basic/navigation-menu.tsx +1 -0
  91. package/src/renderers/basic/pagination.tsx +31 -4
  92. package/src/renderers/basic/separator.tsx +1 -0
  93. package/src/renderers/basic/span.tsx +12 -1
  94. package/src/renderers/basic/text.tsx +4 -2
  95. package/src/renderers/complex/carousel.tsx +1 -0
  96. package/src/renderers/complex/data-table.tsx +134 -95
  97. package/src/renderers/complex/filter-builder.tsx +2 -1
  98. package/src/renderers/complex/resizable.tsx +2 -1
  99. package/src/renderers/complex/scroll-area.tsx +25 -7
  100. package/src/renderers/complex/table.tsx +1 -0
  101. package/src/renderers/data-display/alert.tsx +1 -0
  102. package/src/renderers/data-display/avatar.tsx +1 -0
  103. package/src/renderers/data-display/badge.tsx +1 -0
  104. package/src/renderers/data-display/breadcrumb.tsx +1 -0
  105. package/src/renderers/data-display/kbd.tsx +1 -0
  106. package/src/renderers/data-display/list.tsx +21 -49
  107. package/src/renderers/data-display/statistic.tsx +21 -5
  108. package/src/renderers/data-display/table.tsx +21 -11
  109. package/src/renderers/data-display/tree-view.tsx +7 -1
  110. package/src/renderers/disclosure/accordion.tsx +1 -0
  111. package/src/renderers/disclosure/collapsible.tsx +1 -0
  112. package/src/renderers/disclosure/toggle-group.tsx +2 -0
  113. package/src/renderers/feedback/empty.tsx +1 -0
  114. package/src/renderers/feedback/loading.tsx +2 -1
  115. package/src/renderers/feedback/progress.tsx +1 -0
  116. package/src/renderers/feedback/skeleton.tsx +1 -0
  117. package/src/renderers/feedback/sonner.tsx +1 -0
  118. package/src/renderers/feedback/spinner.tsx +1 -0
  119. package/src/renderers/feedback/toast.tsx +1 -0
  120. package/src/renderers/feedback/toaster.tsx +1 -0
  121. package/src/renderers/form/button.tsx +35 -1
  122. package/src/renderers/form/calendar.tsx +1 -0
  123. package/src/renderers/form/checkbox.tsx +38 -16
  124. package/src/renderers/form/combobox.tsx +2 -1
  125. package/src/renderers/form/command.tsx +1 -0
  126. package/src/renderers/form/date-picker.tsx +1 -0
  127. package/src/renderers/form/file-upload.tsx +1 -0
  128. package/src/renderers/form/form.tsx +92 -15
  129. package/src/renderers/form/input-otp.tsx +1 -0
  130. package/src/renderers/form/input.tsx +3 -0
  131. package/src/renderers/form/label.tsx +1 -0
  132. package/src/renderers/form/radio-group.tsx +1 -0
  133. package/src/renderers/form/select.tsx +35 -15
  134. package/src/renderers/form/slider.tsx +1 -0
  135. package/src/renderers/form/switch.tsx +1 -0
  136. package/src/renderers/form/textarea.tsx +50 -27
  137. package/src/renderers/form/toggle.tsx +3 -45
  138. package/src/renderers/layout/aspect-ratio.tsx +2 -1
  139. package/src/renderers/layout/card.tsx +10 -2
  140. package/src/renderers/layout/container.tsx +1 -0
  141. package/src/renderers/layout/flex.tsx +1 -0
  142. package/src/renderers/layout/grid.tsx +23 -8
  143. package/src/renderers/layout/page.tsx +35 -23
  144. package/src/renderers/layout/semantic.tsx +1 -0
  145. package/src/renderers/layout/stack.tsx +2 -1
  146. package/src/renderers/layout/tabs.tsx +43 -17
  147. package/src/renderers/navigation/header-bar.tsx +1 -0
  148. package/src/renderers/navigation/sidebar.tsx +5 -0
  149. package/src/renderers/overlay/alert-dialog.tsx +1 -0
  150. package/src/renderers/overlay/context-menu.tsx +1 -0
  151. package/src/renderers/overlay/dialog.tsx +1 -0
  152. package/src/renderers/overlay/drawer.tsx +1 -0
  153. package/src/renderers/overlay/dropdown-menu.tsx +1 -0
  154. package/src/renderers/overlay/hover-card.tsx +1 -0
  155. package/src/renderers/overlay/menubar.tsx +1 -0
  156. package/src/renderers/overlay/popover.tsx +1 -0
  157. package/src/renderers/overlay/sheet.tsx +1 -0
  158. package/src/renderers/overlay/tooltip.tsx +1 -0
  159. package/src/renderers/placeholders.tsx +2 -2
  160. package/src/stories/CRMApp.stories.tsx +706 -0
  161. package/src/stories/Guide.mdx +55 -0
  162. package/src/stories/Introduction.mdx +34 -0
  163. package/src/stories/MockedData.stories.tsx +71 -0
  164. package/src/stories/assets/accessibility.png +0 -0
  165. package/src/stories/assets/accessibility.svg +1 -0
  166. package/src/stories/assets/addon-library.png +0 -0
  167. package/src/stories/assets/assets.png +0 -0
  168. package/src/stories/assets/avif-test-image.avif +0 -0
  169. package/src/stories/assets/context.png +0 -0
  170. package/src/stories/assets/discord.svg +1 -0
  171. package/src/stories/assets/docs.png +0 -0
  172. package/src/stories/assets/figma-plugin.png +0 -0
  173. package/src/stories/assets/github.svg +1 -0
  174. package/src/stories/assets/share.png +0 -0
  175. package/src/stories/assets/styling.png +0 -0
  176. package/src/stories/assets/testing.png +0 -0
  177. package/src/stories/assets/theming.png +0 -0
  178. package/src/stories/assets/tutorials.svg +1 -0
  179. package/src/stories/assets/youtube.svg +1 -0
  180. package/src/stories/button.css +30 -0
  181. package/src/stories/header.css +32 -0
  182. package/src/stories/page.css +68 -0
  183. package/src/stories-json/accordion.stories.tsx +43 -0
  184. package/src/stories-json/aggrid.stories.tsx +103 -0
  185. package/src/stories-json/alert.stories.tsx +39 -0
  186. package/src/stories-json/aspect-ratio.stories.tsx +34 -0
  187. package/src/stories-json/avatar.stories.tsx +38 -0
  188. package/src/stories-json/badge.stories.tsx +53 -0
  189. package/src/stories-json/breadcrumb.stories.tsx +30 -0
  190. package/src/stories-json/button-group.stories.tsx +43 -0
  191. package/src/stories-json/button.stories.tsx +73 -0
  192. package/src/stories-json/calendar.stories.tsx +85 -0
  193. package/src/stories-json/card.stories.tsx +48 -0
  194. package/src/stories-json/carousel.stories.tsx +33 -0
  195. package/src/stories-json/charts.stories.tsx +195 -0
  196. package/src/stories-json/chatbot.stories.tsx +248 -0
  197. package/src/stories-json/code-editor.stories.tsx +92 -0
  198. package/src/stories-json/collapsible.stories.tsx +40 -0
  199. package/src/stories-json/controls.stories.tsx +36 -0
  200. package/src/stories-json/dashboard.stories.tsx +318 -0
  201. package/src/stories-json/data-table.stories.tsx +60 -0
  202. package/src/stories-json/data_display_extras.stories.tsx +102 -0
  203. package/src/stories-json/date-picker.stories.tsx +28 -0
  204. package/src/stories-json/detail-view.stories.tsx +258 -0
  205. package/src/stories-json/dialog.stories.tsx +43 -0
  206. package/src/stories-json/feedback_extras.stories.tsx +40 -0
  207. package/src/stories-json/feedback_others.stories.tsx +46 -0
  208. package/src/stories-json/form_advanced.stories.tsx +117 -0
  209. package/src/stories-json/form_extras.stories.tsx +123 -0
  210. package/src/stories-json/grid.stories.tsx +56 -0
  211. package/src/stories-json/icon.stories.tsx +36 -0
  212. package/src/stories-json/input.stories.tsx +52 -0
  213. package/src/stories-json/kanban.stories.tsx +295 -0
  214. package/src/stories-json/layout_extended.stories.tsx +76 -0
  215. package/src/stories-json/layout_flex.stories.tsx +107 -0
  216. package/src/stories-json/list-view.stories.tsx +97 -0
  217. package/src/stories-json/markdown.stories.tsx +129 -0
  218. package/src/stories-json/menus.stories.tsx +63 -0
  219. package/src/stories-json/metric-card.stories.tsx +143 -0
  220. package/src/stories-json/navigation-menu.stories.tsx +37 -0
  221. package/src/stories-json/object-aggrid.stories.tsx +252 -0
  222. package/src/stories-json/object-form.stories.tsx +130 -0
  223. package/src/stories-json/object-gantt.stories.tsx +114 -0
  224. package/src/stories-json/object-grid.stories.tsx +157 -0
  225. package/src/stories-json/object-map.stories.tsx +116 -0
  226. package/src/stories-json/object-view.stories.tsx +118 -0
  227. package/src/stories-json/overlay_extras.stories.tsx +113 -0
  228. package/src/stories-json/overlay_others.stories.tsx +76 -0
  229. package/src/stories-json/page.stories.tsx +55 -0
  230. package/src/stories-json/reports.stories.tsx +163 -0
  231. package/src/stories-json/resizable.stories.tsx +44 -0
  232. package/src/stories-json/select.stories.tsx +34 -0
  233. package/src/stories-json/separator.stories.tsx +41 -0
  234. package/src/stories-json/sidebar.stories.tsx +147 -0
  235. package/src/stories-json/statistic.stories.tsx +44 -0
  236. package/src/stories-json/tabs.stories.tsx +51 -0
  237. package/src/stories-json/timeline.stories.tsx +188 -0
  238. package/src/stories-json/typography.stories.tsx +45 -0
  239. package/src/ui/accordion.tsx +47 -53
  240. package/src/ui/alert-dialog.tsx +103 -117
  241. package/src/ui/alert.tsx +35 -36
  242. package/src/ui/aspect-ratio.tsx +1 -5
  243. package/src/ui/avatar.tsx +41 -42
  244. package/src/ui/badge.tsx +6 -15
  245. package/src/ui/breadcrumb.tsx +81 -75
  246. package/src/ui/button.tsx +10 -11
  247. package/src/ui/calendar.tsx +178 -51
  248. package/src/ui/card.tsx +51 -110
  249. package/src/ui/carousel.tsx +136 -113
  250. package/src/ui/chart.tsx +367 -0
  251. package/src/ui/checkbox.tsx +20 -22
  252. package/src/ui/collapsible.tsx +5 -25
  253. package/src/ui/command.tsx +106 -135
  254. package/src/ui/context-menu.tsx +69 -116
  255. package/src/ui/dialog.tsx +94 -113
  256. package/src/ui/drawer.tsx +82 -99
  257. package/src/ui/dropdown-menu.tsx +134 -188
  258. package/src/ui/form.tsx +51 -40
  259. package/src/ui/hover-card.tsx +18 -33
  260. package/src/ui/index.ts +2 -8
  261. package/src/ui/input-otp.tsx +42 -52
  262. package/src/ui/input.tsx +13 -15
  263. package/src/ui/label.tsx +17 -15
  264. package/src/ui/menubar.tsx +188 -206
  265. package/src/ui/navigation-menu.tsx +96 -136
  266. package/src/ui/pagination.tsx +86 -96
  267. package/src/ui/popover.tsx +24 -41
  268. package/src/ui/progress.tsx +21 -22
  269. package/src/ui/radio-group.tsx +19 -20
  270. package/src/ui/resizable.tsx +32 -42
  271. package/src/ui/scroll-area.tsx +38 -48
  272. package/src/ui/select.tsx +129 -157
  273. package/src/ui/separator.tsx +2 -2
  274. package/src/ui/sheet.tsx +110 -107
  275. package/src/ui/sidebar.tsx +442 -408
  276. package/src/ui/skeleton.tsx +6 -11
  277. package/src/ui/slider.tsx +19 -54
  278. package/src/ui/sonner.tsx +19 -1
  279. package/src/ui/switch.tsx +19 -21
  280. package/src/ui/tabs.tsx +6 -37
  281. package/src/ui/textarea.tsx +8 -4
  282. package/src/ui/toast.tsx +137 -0
  283. package/src/ui/toggle-group.tsx +28 -37
  284. package/src/ui/toggle.tsx +19 -19
  285. package/src/ui/tooltip.tsx +21 -52
  286. package/src/ui/typography.tsx +85 -0
  287. package/tsconfig.json +1 -1
  288. package/vite.config.ts +9 -1
  289. package/vitest.config.ts +5 -0
  290. package/ISSUES_FOUND.md +0 -128
  291. /package/dist/src/{ui → custom}/combobox.d.ts +0 -0
  292. /package/dist/src/{ui → custom}/date-picker.d.ts +0 -0
  293. /package/dist/src/{ui → custom}/empty.d.ts +0 -0
  294. /package/dist/src/{ui → custom}/filter-builder.d.ts +0 -0
  295. /package/dist/src/{ui → custom}/kbd.d.ts +0 -0
  296. /package/dist/src/{ui → custom}/spinner.d.ts +0 -0
  297. /package/src/{ui → custom}/empty.tsx +0 -0
  298. /package/src/{ui → custom}/kbd.tsx +0 -0
  299. /package/src/{ui → custom}/spinner.tsx +0 -0
@@ -10,56 +10,47 @@
10
10
 
11
11
  import * as React from "react"
12
12
  import { OTPInput, OTPInputContext } from "input-otp"
13
- import { Minus } from "lucide-react"
13
+ import { Dot } from "lucide-react"
14
14
 
15
15
  import { cn } from "../lib/utils"
16
16
 
17
- function InputOTP({
18
- className,
19
- containerClassName,
20
- ...props
21
- }: React.ComponentProps<typeof OTPInput> & {
22
- containerClassName?: string
23
- }) {
24
- return (
25
- <OTPInput
26
- data-slot="input-otp"
27
- containerClassName={cn(
28
- "flex items-center gap-2 has-disabled:opacity-50",
29
- containerClassName
30
- )}
31
- className={cn("disabled:cursor-not-allowed", className)}
32
- {...props}
33
- />
34
- )
35
- }
17
+ const InputOTP = React.forwardRef<
18
+ React.ElementRef<typeof OTPInput>,
19
+ React.ComponentPropsWithoutRef<typeof OTPInput>
20
+ >(({ className, containerClassName, ...props }, ref) => (
21
+ <OTPInput
22
+ ref={ref}
23
+ containerClassName={cn(
24
+ "flex items-center gap-2 has-[:disabled]:opacity-50",
25
+ containerClassName
26
+ )}
27
+ className={cn("disabled:cursor-not-allowed", className)}
28
+ {...props}
29
+ />
30
+ ))
31
+ InputOTP.displayName = "InputOTP"
36
32
 
37
- function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {
38
- return (
39
- <div
40
- data-slot="input-otp-group"
41
- className={cn("flex items-center", className)}
42
- {...props}
43
- />
44
- )
45
- }
33
+ const InputOTPGroup = React.forwardRef<
34
+ React.ElementRef<"div">,
35
+ React.ComponentPropsWithoutRef<"div">
36
+ >(({ className, ...props }, ref) => (
37
+ <div ref={ref} className={cn("flex items-center", className)} {...props} />
38
+ ))
39
+ InputOTPGroup.displayName = "InputOTPGroup"
46
40
 
47
- function InputOTPSlot({
48
- index,
49
- className,
50
- ...props
51
- }: React.ComponentProps<"div"> & {
52
- index: number
53
- }) {
41
+ const InputOTPSlot = React.forwardRef<
42
+ React.ElementRef<"div">,
43
+ React.ComponentPropsWithoutRef<"div"> & { index: number }
44
+ >(({ index, className, ...props }, ref) => {
54
45
  const inputOTPContext = React.useContext(OTPInputContext)
55
- const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}
46
+ const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]
56
47
 
57
48
  return (
58
49
  <div
59
- data-slot="input-otp-slot"
60
- data-active={isActive}
50
+ ref={ref}
61
51
  className={cn(
62
- "relative flex h-9 w-9 items-center justify-center border-y border-r border-input text-sm shadow-xs transition-all first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px] data-[active=true]:ring-ring/50 data-[active=true]:border-ring outline-none",
52
+ "relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
53
+ isActive && "z-10 ring-2 ring-ring ring-offset-background",
63
54
  className
64
55
  )}
65
56
  {...props}
@@ -72,18 +63,17 @@ function InputOTPSlot({
72
63
  )}
73
64
  </div>
74
65
  )
75
- }
66
+ })
67
+ InputOTPSlot.displayName = "InputOTPSlot"
76
68
 
77
- function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
78
- return (
79
- <div
80
- data-slot="input-otp-separator"
81
- role="separator"
82
- {...props}
83
- >
84
- <Minus className="text-muted-foreground/50" />
85
- </div>
86
- )
87
- }
69
+ const InputOTPSeparator = React.forwardRef<
70
+ React.ElementRef<"div">,
71
+ React.ComponentPropsWithoutRef<"div">
72
+ >(({ ...props }, ref) => (
73
+ <div ref={ref} role="separator" {...props}>
74
+ <Dot />
75
+ </div>
76
+ ))
77
+ InputOTPSeparator.displayName = "InputOTPSeparator"
88
78
 
89
79
  export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }
package/src/ui/input.tsx CHANGED
@@ -12,21 +12,19 @@ import { cn } from "../lib/utils"
12
12
 
13
13
  const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
14
14
  ({ className, type, ...props }, ref) => {
15
- return (
16
- <input
17
- type={type}
18
- data-slot="input"
19
- className={cn(
20
- "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
21
- "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
22
- "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
23
- className
24
- )}
25
- ref={ref}
26
- {...props}
27
- />
28
- )
29
- })
15
+ return (
16
+ <input
17
+ type={type}
18
+ className={cn(
19
+ "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
20
+ className
21
+ )}
22
+ ref={ref}
23
+ {...props}
24
+ />
25
+ )
26
+ }
27
+ )
30
28
  Input.displayName = "Input"
31
29
 
32
30
  export { Input }
package/src/ui/label.tsx CHANGED
@@ -10,23 +10,25 @@
10
10
 
11
11
  import * as React from "react"
12
12
  import * as LabelPrimitive from "@radix-ui/react-label"
13
+ import { cva, type VariantProps } from "class-variance-authority"
13
14
 
14
15
  import { cn } from "../lib/utils"
15
16
 
16
- function Label({
17
- className,
18
- ...props
19
- }: React.ComponentProps<typeof LabelPrimitive.Root>) {
20
- return (
21
- <LabelPrimitive.Root
22
- data-slot="label"
23
- className={cn(
24
- "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
25
- className
26
- )}
27
- {...props}
28
- />
29
- )
30
- }
17
+ const labelVariants = cva(
18
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
19
+ )
20
+
21
+ const Label = React.forwardRef<
22
+ React.ElementRef<typeof LabelPrimitive.Root>,
23
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
24
+ VariantProps<typeof labelVariants>
25
+ >(({ className, ...props }, ref) => (
26
+ <LabelPrimitive.Root
27
+ ref={ref}
28
+ className={cn(labelVariants(), className)}
29
+ {...props}
30
+ />
31
+ ))
32
+ Label.displayName = LabelPrimitive.Root.displayName
31
33
 
32
34
  export { Label }
@@ -6,277 +6,259 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
 
9
+ "use client"
10
+
9
11
  import * as React from "react"
10
12
  import * as MenubarPrimitive from "@radix-ui/react-menubar"
11
- import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
13
+ import { Check, ChevronRight, Circle } from "lucide-react"
12
14
 
13
15
  import { cn } from "../lib/utils"
14
16
 
15
- function Menubar({
16
- className,
17
- ...props
18
- }: React.ComponentProps<typeof MenubarPrimitive.Root>) {
19
- return (
20
- <MenubarPrimitive.Root
21
- data-slot="menubar"
22
- className={cn(
23
- "bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",
24
- className
25
- )}
26
- {...props}
27
- />
28
- )
29
- }
30
-
31
17
  function MenubarMenu({
32
18
  ...props
33
19
  }: React.ComponentProps<typeof MenubarPrimitive.Menu>) {
34
- return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />
20
+ return <MenubarPrimitive.Menu {...props} />
35
21
  }
36
22
 
37
23
  function MenubarGroup({
38
24
  ...props
39
25
  }: React.ComponentProps<typeof MenubarPrimitive.Group>) {
40
- return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />
26
+ return <MenubarPrimitive.Group {...props} />
41
27
  }
42
28
 
43
29
  function MenubarPortal({
44
30
  ...props
45
31
  }: React.ComponentProps<typeof MenubarPrimitive.Portal>) {
46
- return <MenubarPrimitive.Portal data-slot="menubar-portal" {...props} />
32
+ return <MenubarPrimitive.Portal {...props} />
47
33
  }
48
34
 
49
35
  function MenubarRadioGroup({
50
36
  ...props
51
37
  }: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {
52
- return (
53
- <MenubarPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />
54
- )
38
+ return <MenubarPrimitive.RadioGroup {...props} />
55
39
  }
56
40
 
57
- function MenubarTrigger({
58
- className,
41
+ function MenubarSub({
59
42
  ...props
60
- }: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {
61
- return (
62
- <MenubarPrimitive.Trigger
63
- data-slot="menubar-trigger"
64
- className={cn(
65
- "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",
66
- className
67
- )}
68
- {...props}
69
- />
70
- )
43
+ }: React.ComponentProps<typeof MenubarPrimitive.Sub>) {
44
+ return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />
71
45
  }
72
46
 
73
- function MenubarContent({
74
- className,
75
- align = "start",
76
- alignOffset = -4,
77
- sideOffset = 8,
78
- ...props
79
- }: React.ComponentProps<typeof MenubarPrimitive.Content>) {
80
- return (
81
- <MenubarPortal>
47
+ const Menubar = React.forwardRef<
48
+ React.ElementRef<typeof MenubarPrimitive.Root>,
49
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>
50
+ >(({ className, ...props }, ref) => (
51
+ <MenubarPrimitive.Root
52
+ ref={ref}
53
+ className={cn(
54
+ "flex h-10 items-center space-x-1 rounded-md border bg-background p-1",
55
+ className
56
+ )}
57
+ {...props}
58
+ />
59
+ ))
60
+ Menubar.displayName = MenubarPrimitive.Root.displayName
61
+
62
+ const MenubarTrigger = React.forwardRef<
63
+ React.ElementRef<typeof MenubarPrimitive.Trigger>,
64
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>
65
+ >(({ className, ...props }, ref) => (
66
+ <MenubarPrimitive.Trigger
67
+ ref={ref}
68
+ className={cn(
69
+ "flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
70
+ className
71
+ )}
72
+ {...props}
73
+ />
74
+ ))
75
+ MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName
76
+
77
+ const MenubarSubTrigger = React.forwardRef<
78
+ React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
79
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {
80
+ inset?: boolean
81
+ }
82
+ >(({ className, inset, children, ...props }, ref) => (
83
+ <MenubarPrimitive.SubTrigger
84
+ ref={ref}
85
+ className={cn(
86
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
87
+ inset && "pl-8",
88
+ className
89
+ )}
90
+ {...props}
91
+ >
92
+ {children}
93
+ <ChevronRight className="ml-auto h-4 w-4" />
94
+ </MenubarPrimitive.SubTrigger>
95
+ ))
96
+ MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName
97
+
98
+ const MenubarSubContent = React.forwardRef<
99
+ React.ElementRef<typeof MenubarPrimitive.SubContent>,
100
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>
101
+ >(({ className, ...props }, ref) => (
102
+ <MenubarPrimitive.SubContent
103
+ ref={ref}
104
+ className={cn(
105
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 origin-[--radix-menubar-content-transform-origin]",
106
+ className
107
+ )}
108
+ {...props}
109
+ />
110
+ ))
111
+ MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName
112
+
113
+ const MenubarContent = React.forwardRef<
114
+ React.ElementRef<typeof MenubarPrimitive.Content>,
115
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>
116
+ >(
117
+ (
118
+ { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
119
+ ref
120
+ ) => (
121
+ <MenubarPrimitive.Portal>
82
122
  <MenubarPrimitive.Content
83
- data-slot="menubar-content"
123
+ ref={ref}
84
124
  align={align}
85
125
  alignOffset={alignOffset}
86
126
  sideOffset={sideOffset}
87
127
  className={cn(
88
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-md",
128
+ "z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 origin-[--radix-menubar-content-transform-origin]",
89
129
  className
90
130
  )}
91
131
  {...props}
92
132
  />
93
- </MenubarPortal>
133
+ </MenubarPrimitive.Portal>
94
134
  )
95
- }
135
+ )
136
+ MenubarContent.displayName = MenubarPrimitive.Content.displayName
96
137
 
97
- function MenubarItem({
98
- className,
99
- inset,
100
- variant = "default",
101
- ...props
102
- }: React.ComponentProps<typeof MenubarPrimitive.Item> & {
103
- inset?: boolean
104
- variant?: "default" | "destructive"
105
- }) {
106
- return (
107
- <MenubarPrimitive.Item
108
- data-slot="menubar-item"
109
- data-inset={inset}
110
- data-variant={variant}
111
- className={cn(
112
- "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
113
- className
114
- )}
115
- {...props}
116
- />
117
- )
118
- }
138
+ const MenubarItem = React.forwardRef<
139
+ React.ElementRef<typeof MenubarPrimitive.Item>,
140
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {
141
+ inset?: boolean
142
+ }
143
+ >(({ className, inset, ...props }, ref) => (
144
+ <MenubarPrimitive.Item
145
+ ref={ref}
146
+ className={cn(
147
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
148
+ inset && "pl-8",
149
+ className
150
+ )}
151
+ {...props}
152
+ />
153
+ ))
154
+ MenubarItem.displayName = MenubarPrimitive.Item.displayName
119
155
 
120
- function MenubarCheckboxItem({
121
- className,
122
- children,
123
- checked,
124
- ...props
125
- }: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {
126
- return (
127
- <MenubarPrimitive.CheckboxItem
128
- data-slot="menubar-checkbox-item"
129
- className={cn(
130
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
131
- className
132
- )}
133
- checked={checked}
134
- {...props}
135
- >
136
- <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
137
- <MenubarPrimitive.ItemIndicator>
138
- <CheckIcon className="size-4" />
139
- </MenubarPrimitive.ItemIndicator>
140
- </span>
141
- {children}
142
- </MenubarPrimitive.CheckboxItem>
143
- )
144
- }
156
+ const MenubarCheckboxItem = React.forwardRef<
157
+ React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
158
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>
159
+ >(({ className, children, checked, ...props }, ref) => (
160
+ <MenubarPrimitive.CheckboxItem
161
+ ref={ref}
162
+ className={cn(
163
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
164
+ className
165
+ )}
166
+ checked={checked}
167
+ {...props}
168
+ >
169
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
170
+ <MenubarPrimitive.ItemIndicator>
171
+ <Check className="h-4 w-4" />
172
+ </MenubarPrimitive.ItemIndicator>
173
+ </span>
174
+ {children}
175
+ </MenubarPrimitive.CheckboxItem>
176
+ ))
177
+ MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName
145
178
 
146
- function MenubarRadioItem({
147
- className,
148
- children,
149
- ...props
150
- }: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {
151
- return (
152
- <MenubarPrimitive.RadioItem
153
- data-slot="menubar-radio-item"
154
- className={cn(
155
- "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
156
- className
157
- )}
158
- {...props}
159
- >
160
- <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
161
- <MenubarPrimitive.ItemIndicator>
162
- <CircleIcon className="size-2 fill-current" />
163
- </MenubarPrimitive.ItemIndicator>
164
- </span>
165
- {children}
166
- </MenubarPrimitive.RadioItem>
167
- )
168
- }
179
+ const MenubarRadioItem = React.forwardRef<
180
+ React.ElementRef<typeof MenubarPrimitive.RadioItem>,
181
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>
182
+ >(({ className, children, ...props }, ref) => (
183
+ <MenubarPrimitive.RadioItem
184
+ ref={ref}
185
+ className={cn(
186
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
187
+ className
188
+ )}
189
+ {...props}
190
+ >
191
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
192
+ <MenubarPrimitive.ItemIndicator>
193
+ <Circle className="h-2 w-2 fill-current" />
194
+ </MenubarPrimitive.ItemIndicator>
195
+ </span>
196
+ {children}
197
+ </MenubarPrimitive.RadioItem>
198
+ ))
199
+ MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName
169
200
 
170
- function MenubarLabel({
171
- className,
172
- inset,
173
- ...props
174
- }: React.ComponentProps<typeof MenubarPrimitive.Label> & {
175
- inset?: boolean
176
- }) {
177
- return (
178
- <MenubarPrimitive.Label
179
- data-slot="menubar-label"
180
- data-inset={inset}
181
- className={cn(
182
- "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
183
- className
184
- )}
185
- {...props}
186
- />
187
- )
188
- }
201
+ const MenubarLabel = React.forwardRef<
202
+ React.ElementRef<typeof MenubarPrimitive.Label>,
203
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {
204
+ inset?: boolean
205
+ }
206
+ >(({ className, inset, ...props }, ref) => (
207
+ <MenubarPrimitive.Label
208
+ ref={ref}
209
+ className={cn(
210
+ "px-2 py-1.5 text-sm font-semibold",
211
+ inset && "pl-8",
212
+ className
213
+ )}
214
+ {...props}
215
+ />
216
+ ))
217
+ MenubarLabel.displayName = MenubarPrimitive.Label.displayName
189
218
 
190
- function MenubarSeparator({
191
- className,
192
- ...props
193
- }: React.ComponentProps<typeof MenubarPrimitive.Separator>) {
194
- return (
195
- <MenubarPrimitive.Separator
196
- data-slot="menubar-separator"
197
- className={cn("bg-border -mx-1 my-1 h-px", className)}
198
- {...props}
199
- />
200
- )
201
- }
219
+ const MenubarSeparator = React.forwardRef<
220
+ React.ElementRef<typeof MenubarPrimitive.Separator>,
221
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>
222
+ >(({ className, ...props }, ref) => (
223
+ <MenubarPrimitive.Separator
224
+ ref={ref}
225
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
226
+ {...props}
227
+ />
228
+ ))
229
+ MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName
202
230
 
203
- function MenubarShortcut({
231
+ const MenubarShortcut = ({
204
232
  className,
205
233
  ...props
206
- }: React.ComponentProps<"span">) {
234
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
207
235
  return (
208
236
  <span
209
- data-slot="menubar-shortcut"
210
- className={cn(
211
- "text-muted-foreground ml-auto text-xs tracking-widest",
212
- className
213
- )}
214
- {...props}
215
- />
216
- )
217
- }
218
-
219
- function MenubarSub({
220
- ...props
221
- }: React.ComponentProps<typeof MenubarPrimitive.Sub>) {
222
- return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />
223
- }
224
-
225
- function MenubarSubTrigger({
226
- className,
227
- inset,
228
- children,
229
- ...props
230
- }: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {
231
- inset?: boolean
232
- }) {
233
- return (
234
- <MenubarPrimitive.SubTrigger
235
- data-slot="menubar-sub-trigger"
236
- data-inset={inset}
237
237
  className={cn(
238
- "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8",
239
- className
240
- )}
241
- {...props}
242
- >
243
- {children}
244
- <ChevronRightIcon className="ml-auto h-4 w-4" />
245
- </MenubarPrimitive.SubTrigger>
246
- )
247
- }
248
-
249
- function MenubarSubContent({
250
- className,
251
- ...props
252
- }: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {
253
- return (
254
- <MenubarPrimitive.SubContent
255
- data-slot="menubar-sub-content"
256
- className={cn(
257
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
238
+ "ml-auto text-xs tracking-widest text-muted-foreground",
258
239
  className
259
240
  )}
260
241
  {...props}
261
242
  />
262
243
  )
263
244
  }
245
+ MenubarShortcut.displayname = "MenubarShortcut"
264
246
 
265
247
  export {
266
248
  Menubar,
267
- MenubarPortal,
268
249
  MenubarMenu,
269
250
  MenubarTrigger,
270
251
  MenubarContent,
271
- MenubarGroup,
252
+ MenubarItem,
272
253
  MenubarSeparator,
273
254
  MenubarLabel,
274
- MenubarItem,
275
- MenubarShortcut,
276
255
  MenubarCheckboxItem,
277
256
  MenubarRadioGroup,
278
257
  MenubarRadioItem,
279
- MenubarSub,
280
- MenubarSubTrigger,
258
+ MenubarPortal,
281
259
  MenubarSubContent,
260
+ MenubarSubTrigger,
261
+ MenubarGroup,
262
+ MenubarSub,
263
+ MenubarShortcut,
282
264
  }