@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
@@ -12,99 +12,105 @@ import { ChevronRight, MoreHorizontal } from "lucide-react"
12
12
 
13
13
  import { cn } from "../lib/utils"
14
14
 
15
- function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
16
- return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />
17
- }
15
+ const Breadcrumb = React.forwardRef<
16
+ HTMLElement,
17
+ React.ComponentPropsWithoutRef<"nav"> & {
18
+ separator?: React.ReactNode
19
+ }
20
+ >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />)
21
+ Breadcrumb.displayName = "Breadcrumb"
18
22
 
19
- function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
20
- return (
21
- <ol
22
- data-slot="breadcrumb-list"
23
- className={cn(
24
- "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
25
- className
26
- )}
27
- {...props}
28
- />
29
- )
30
- }
23
+ const BreadcrumbList = React.forwardRef<
24
+ HTMLOListElement,
25
+ React.ComponentPropsWithoutRef<"ol">
26
+ >(({ className, ...props }, ref) => (
27
+ <ol
28
+ ref={ref}
29
+ className={cn(
30
+ "flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5",
31
+ className
32
+ )}
33
+ {...props}
34
+ />
35
+ ))
36
+ BreadcrumbList.displayName = "BreadcrumbList"
31
37
 
32
- function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
33
- return (
34
- <li
35
- data-slot="breadcrumb-item"
36
- className={cn("inline-flex items-center gap-1.5", className)}
37
- {...props}
38
- />
39
- )
40
- }
38
+ const BreadcrumbItem = React.forwardRef<
39
+ HTMLLIElement,
40
+ React.ComponentPropsWithoutRef<"li">
41
+ >(({ className, ...props }, ref) => (
42
+ <li
43
+ ref={ref}
44
+ className={cn("inline-flex items-center gap-1.5", className)}
45
+ {...props}
46
+ />
47
+ ))
48
+ BreadcrumbItem.displayName = "BreadcrumbItem"
41
49
 
42
- function BreadcrumbLink({
43
- asChild,
44
- className,
45
- ...props
46
- }: React.ComponentProps<"a"> & {
47
- asChild?: boolean
48
- }) {
50
+ const BreadcrumbLink = React.forwardRef<
51
+ HTMLAnchorElement,
52
+ React.ComponentPropsWithoutRef<"a"> & {
53
+ asChild?: boolean
54
+ }
55
+ >(({ asChild, className, ...props }, ref) => {
49
56
  const Comp = asChild ? Slot : "a"
50
57
 
51
58
  return (
52
59
  <Comp
53
- data-slot="breadcrumb-link"
54
- className={cn("hover:text-foreground transition-colors", className)}
60
+ ref={ref}
61
+ className={cn("transition-colors hover:text-foreground", className)}
55
62
  {...props}
56
63
  />
57
64
  )
58
- }
65
+ })
66
+ BreadcrumbLink.displayName = "BreadcrumbLink"
59
67
 
60
- function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
61
- return (
62
- <span
63
- data-slot="breadcrumb-page"
64
- role="link"
65
- aria-disabled="true"
66
- aria-current="page"
67
- className={cn("text-foreground font-normal", className)}
68
- {...props}
69
- />
70
- )
71
- }
68
+ const BreadcrumbPage = React.forwardRef<
69
+ HTMLSpanElement,
70
+ React.ComponentPropsWithoutRef<"span">
71
+ >(({ className, ...props }, ref) => (
72
+ <span
73
+ ref={ref}
74
+ role="link"
75
+ aria-disabled="true"
76
+ aria-current="page"
77
+ className={cn("font-normal text-foreground", className)}
78
+ {...props}
79
+ />
80
+ ))
81
+ BreadcrumbPage.displayName = "BreadcrumbPage"
72
82
 
73
- function BreadcrumbSeparator({
83
+ const BreadcrumbSeparator = ({
74
84
  children,
75
85
  className,
76
86
  ...props
77
- }: React.ComponentProps<"li">) {
78
- return (
79
- <li
80
- data-slot="breadcrumb-separator"
81
- role="presentation"
82
- aria-hidden="true"
83
- className={cn("[&>svg]:size-3.5", className)}
84
- {...props}
85
- >
86
- {children ?? <ChevronRight />}
87
- </li>
88
- )
89
- }
87
+ }: React.ComponentProps<"li">) => (
88
+ <li
89
+ role="presentation"
90
+ aria-hidden="true"
91
+ className={cn("[&>svg]:w-3.5 [&>svg]:h-3.5", className)}
92
+ {...props}
93
+ >
94
+ {children ?? <ChevronRight />}
95
+ </li>
96
+ )
97
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
90
98
 
91
- function BreadcrumbEllipsis({
99
+ const BreadcrumbEllipsis = ({
92
100
  className,
93
101
  ...props
94
- }: React.ComponentProps<"span">) {
95
- return (
96
- <span
97
- data-slot="breadcrumb-ellipsis"
98
- role="presentation"
99
- aria-hidden="true"
100
- className={cn("flex size-9 items-center justify-center", className)}
101
- {...props}
102
- >
103
- <MoreHorizontal className="size-4" />
104
- <span className="sr-only">More</span>
105
- </span>
106
- )
107
- }
102
+ }: React.ComponentProps<"span">) => (
103
+ <span
104
+ role="presentation"
105
+ aria-hidden="true"
106
+ className={cn("flex h-9 w-9 items-center justify-center", className)}
107
+ {...props}
108
+ >
109
+ <MoreHorizontal className="h-4 w-4" />
110
+ <span className="sr-only">More</span>
111
+ </span>
112
+ )
113
+ BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
108
114
 
109
115
  export {
110
116
  Breadcrumb,
package/src/ui/button.tsx CHANGED
@@ -13,28 +13,27 @@ import { cva, type VariantProps } from "class-variance-authority"
13
13
  import { cn } from "../lib/utils"
14
14
 
15
15
  const buttonVariants = cva(
16
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
16
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
17
17
  {
18
18
  variants: {
19
19
  variant: {
20
- default:
21
- "bg-primary text-primary-foreground shadow hover:bg-primary/90",
20
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
22
21
  destructive:
23
- "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
22
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90",
24
23
  outline:
25
- "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
24
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
26
25
  secondary:
27
- "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
26
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
28
27
  ghost: "hover:bg-accent hover:text-accent-foreground",
29
28
  link: "text-primary underline-offset-4 hover:underline",
30
29
  },
31
30
  size: {
32
- default: "h-9 px-4 py-2",
33
- sm: "h-8 rounded-md px-3 text-xs",
34
- lg: "h-10 rounded-md px-8",
35
- icon: "h-9 w-9",
31
+ default: "h-10 px-4 py-2",
32
+ sm: "h-9 rounded-md px-3",
33
+ lg: "h-11 rounded-md px-8",
34
+ icon: "h-10 w-10",
36
35
  "icon-sm": "h-8 w-8",
37
- "icon-lg": "h-10 w-10",
36
+ "icon-lg": "h-12 w-12",
38
37
  },
39
38
  },
40
39
  defaultVariants: {
@@ -9,86 +9,213 @@
9
9
  "use client"
10
10
 
11
11
  import * as React from "react"
12
- import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from "lucide-react"
13
- import { DayPicker, getDefaultClassNames } from "react-day-picker"
12
+ import {
13
+ ChevronDownIcon,
14
+ ChevronLeftIcon,
15
+ ChevronRightIcon,
16
+ } from "lucide-react"
17
+ import { DayButton, DayPicker, getDefaultClassNames } from "react-day-picker"
14
18
 
15
19
  import { cn } from "../lib/utils"
16
- import { buttonVariants } from "../ui/button"
17
-
18
- export type CalendarProps = React.ComponentProps<typeof DayPicker>
20
+ import { Button, buttonVariants } from "./button"
19
21
 
20
22
  function Calendar({
21
23
  className,
22
24
  classNames,
23
25
  showOutsideDays = true,
26
+ captionLayout = "label",
27
+ buttonVariant = "ghost",
28
+ formatters,
29
+ components,
24
30
  ...props
25
- }: CalendarProps) {
31
+ }: React.ComponentProps<typeof DayPicker> & {
32
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"]
33
+ }) {
26
34
  const defaultClassNames = getDefaultClassNames()
27
35
 
28
36
  return (
29
37
  <DayPicker
30
38
  showOutsideDays={showOutsideDays}
31
- className={cn("p-3", className)}
39
+ className={cn(
40
+ "bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
41
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
42
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
43
+ className
44
+ )}
45
+ captionLayout={captionLayout}
46
+ formatters={{
47
+ formatMonthDropdown: (date) =>
48
+ date.toLocaleString("default", { month: "short" }),
49
+ ...formatters,
50
+ }}
32
51
  classNames={{
33
- root: cn("w-fit relative", defaultClassNames.root),
34
- months: cn("flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0", defaultClassNames.months),
35
- month: cn("space-y-4", defaultClassNames.month),
36
- month_caption: "flex justify-center pt-1 relative items-center",
37
- caption_label: "text-sm font-medium",
38
- nav: "space-x-1 flex items-center absolute right-1", // Adjust as needed
39
-
40
- // Navigation Buttons
52
+ root: cn("w-fit", defaultClassNames.root),
53
+ months: cn(
54
+ "relative flex flex-col gap-4 md:flex-row",
55
+ defaultClassNames.months
56
+ ),
57
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
58
+ nav: cn(
59
+ "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
60
+ defaultClassNames.nav
61
+ ),
41
62
  button_previous: cn(
42
- buttonVariants({ variant: "outline" }),
43
- "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute left-1 top-1 z-10"
63
+ buttonVariants({ variant: buttonVariant }),
64
+ "h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",
65
+ defaultClassNames.button_previous
44
66
  ),
45
67
  button_next: cn(
46
- buttonVariants({ variant: "outline" }),
47
- "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute right-1 top-1 z-10"
48
- ),
49
-
50
- // Grid
51
- month_grid: "w-full border-collapse space-y-1",
52
- weekdays: "flex",
53
- weekday: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
54
-
55
- week: "flex w-full mt-2",
56
-
57
- // Day Cell (td)
58
- day: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
59
-
60
- // Day Button
61
- day_button: cn(
62
- buttonVariants({ variant: "ghost" }),
63
- "h-9 w-9 p-0 font-normal aria-selected:opacity-100"
64
- ),
65
-
66
- // States
67
- range_end: "day-range-end",
68
- selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
69
- today: "bg-accent text-accent-foreground",
70
- outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
71
- disabled: "text-muted-foreground opacity-50",
72
- range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
73
- hidden: "invisible",
74
-
68
+ buttonVariants({ variant: buttonVariant }),
69
+ "h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50",
70
+ defaultClassNames.button_next
71
+ ),
72
+ month_caption: cn(
73
+ "flex h-[--cell-size] w-full items-center justify-center px-[--cell-size]",
74
+ defaultClassNames.month_caption
75
+ ),
76
+ dropdowns: cn(
77
+ "flex h-[--cell-size] w-full items-center justify-center gap-1.5 text-sm font-medium",
78
+ defaultClassNames.dropdowns
79
+ ),
80
+ dropdown_root: cn(
81
+ "has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border",
82
+ defaultClassNames.dropdown_root
83
+ ),
84
+ dropdown: cn(
85
+ "bg-popover absolute inset-0 opacity-0",
86
+ defaultClassNames.dropdown
87
+ ),
88
+ caption_label: cn(
89
+ "select-none font-medium",
90
+ captionLayout === "label"
91
+ ? "text-sm"
92
+ : "[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5",
93
+ defaultClassNames.caption_label
94
+ ),
95
+ table: "w-full border-collapse",
96
+ weekdays: cn("flex", defaultClassNames.weekdays),
97
+ weekday: cn(
98
+ "text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal",
99
+ defaultClassNames.weekday
100
+ ),
101
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
102
+ week_number_header: cn(
103
+ "w-[--cell-size] select-none",
104
+ defaultClassNames.week_number_header
105
+ ),
106
+ week_number: cn(
107
+ "text-muted-foreground select-none text-[0.8rem]",
108
+ defaultClassNames.week_number
109
+ ),
110
+ day: cn(
111
+ "group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md",
112
+ defaultClassNames.day
113
+ ),
114
+ range_start: cn(
115
+ "bg-accent rounded-l-md",
116
+ defaultClassNames.range_start
117
+ ),
118
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
119
+ range_end: cn("bg-accent rounded-r-md", defaultClassNames.range_end),
120
+ today: cn(
121
+ "bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",
122
+ defaultClassNames.today
123
+ ),
124
+ outside: cn(
125
+ "text-muted-foreground aria-selected:text-muted-foreground",
126
+ defaultClassNames.outside
127
+ ),
128
+ disabled: cn(
129
+ "text-muted-foreground opacity-50",
130
+ defaultClassNames.disabled
131
+ ),
132
+ hidden: cn("invisible", defaultClassNames.hidden),
75
133
  ...classNames,
76
134
  }}
77
135
  components={{
136
+ Root: ({ className, rootRef, ...props }) => {
137
+ return (
138
+ <div
139
+ data-slot="calendar"
140
+ ref={rootRef}
141
+ className={cn(className)}
142
+ {...props}
143
+ />
144
+ )
145
+ },
78
146
  Chevron: ({ className, orientation, ...props }) => {
79
147
  if (orientation === "left") {
80
- return <ChevronLeftIcon className={cn("h-4 w-4", className)} {...props} />
148
+ return (
149
+ <ChevronLeftIcon className={cn("size-4", className)} {...props} />
150
+ )
81
151
  }
152
+
82
153
  if (orientation === "right") {
83
- return <ChevronRightIcon className={cn("h-4 w-4", className)} {...props} />
154
+ return (
155
+ <ChevronRightIcon
156
+ className={cn("size-4", className)}
157
+ {...props}
158
+ />
159
+ )
84
160
  }
85
- return <ChevronDownIcon className={cn("h-4 w-4", className)} {...props} />
161
+
162
+ return (
163
+ <ChevronDownIcon className={cn("size-4", className)} {...props} />
164
+ )
86
165
  },
166
+ DayButton: CalendarDayButton,
167
+ WeekNumber: ({ children, ...props }) => {
168
+ return (
169
+ <td {...props}>
170
+ <div className="flex size-[--cell-size] items-center justify-center text-center">
171
+ {children}
172
+ </div>
173
+ </td>
174
+ )
175
+ },
176
+ ...components,
87
177
  }}
88
178
  {...props}
89
179
  />
90
180
  )
91
181
  }
92
- Calendar.displayName = "Calendar"
93
182
 
94
- export { Calendar }
183
+ function CalendarDayButton({
184
+ className,
185
+ day,
186
+ modifiers,
187
+ ...props
188
+ }: React.ComponentProps<typeof DayButton>) {
189
+ const defaultClassNames = getDefaultClassNames()
190
+
191
+ const ref = React.useRef<HTMLButtonElement>(null)
192
+ React.useEffect(() => {
193
+ if (modifiers.focused) ref.current?.focus()
194
+ }, [modifiers.focused])
195
+
196
+ return (
197
+ <Button
198
+ ref={ref}
199
+ variant="ghost"
200
+ size="icon"
201
+ data-day={day.date.toLocaleDateString()}
202
+ data-selected-single={
203
+ modifiers.selected &&
204
+ !modifiers.range_start &&
205
+ !modifiers.range_end &&
206
+ !modifiers.range_middle
207
+ }
208
+ data-range-start={modifiers.range_start}
209
+ data-range-end={modifiers.range_end}
210
+ data-range-middle={modifiers.range_middle}
211
+ className={cn(
212
+ "data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 font-normal leading-none data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] [&>span]:text-xs [&>span]:opacity-70",
213
+ defaultClassNames.day,
214
+ className
215
+ )}
216
+ {...props}
217
+ />
218
+ )
219
+ }
220
+
221
+ export { Calendar, CalendarDayButton }