@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.
- package/.turbo/turbo-build.log +47 -0
- package/README.md +13 -0
- package/dist/index.css +1 -1
- package/dist/index.js +34610 -24854
- package/dist/index.umd.cjs +53 -32
- package/dist/src/SchemaRenderer.d.ts +3 -0
- package/dist/src/{ui → custom}/button-group.d.ts +1 -1
- package/dist/src/custom/field.d.ts +19 -0
- package/dist/src/custom/index.d.ts +12 -0
- package/dist/src/custom/input-group.d.ts +14 -0
- package/dist/src/{ui → custom}/item.d.ts +1 -1
- package/dist/src/custom/native-select.d.ts +12 -0
- package/dist/src/custom/sort-builder.d.ts +22 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/renderers/data-display/table.d.ts +1 -1
- package/dist/src/renderers/layout/page.d.ts +1 -1
- package/dist/src/renderers/placeholders.d.ts +1 -1
- package/dist/src/ui/accordion.d.ts +4 -4
- package/dist/src/ui/alert-dialog.d.ts +17 -11
- package/dist/src/ui/alert.d.ts +4 -5
- package/dist/src/ui/aspect-ratio.d.ts +1 -1
- package/dist/src/ui/avatar.d.ts +3 -3
- package/dist/src/ui/badge.d.ts +3 -3
- package/dist/src/ui/breadcrumb.d.ts +16 -8
- package/dist/src/ui/calendar.d.ts +7 -7
- package/dist/src/ui/card.d.ts +7 -8
- package/dist/src/ui/carousel.d.ts +5 -6
- package/dist/src/ui/chart.d.ts +62 -0
- package/dist/src/ui/checkbox.d.ts +1 -1
- package/dist/src/ui/collapsible.d.ts +3 -3
- package/dist/src/ui/command.d.ts +78 -16
- package/dist/src/ui/context-menu.d.ts +14 -12
- package/dist/src/ui/dialog.d.ts +17 -13
- package/dist/src/ui/drawer.d.ts +19 -10
- package/dist/src/ui/dropdown-menu.d.ts +20 -18
- package/dist/src/ui/form.d.ts +6 -7
- package/dist/src/ui/hover-card.d.ts +3 -3
- package/dist/src/ui/index.d.ts +2 -8
- package/dist/src/ui/input-otp.d.ts +30 -7
- package/dist/src/ui/label.d.ts +2 -1
- package/dist/src/ui/menubar.d.ts +19 -17
- package/dist/src/ui/navigation-menu.d.ts +9 -11
- package/dist/src/ui/pagination.d.ts +25 -10
- package/dist/src/ui/popover.d.ts +4 -5
- package/dist/src/ui/progress.d.ts +1 -1
- package/dist/src/ui/radio-group.d.ts +2 -2
- package/dist/src/ui/resizable.d.ts +5 -8
- package/dist/src/ui/scroll-area.d.ts +2 -2
- package/dist/src/ui/select.d.ts +11 -13
- package/dist/src/ui/sheet.d.ts +23 -11
- package/dist/src/ui/sidebar.d.ts +27 -29
- package/dist/src/ui/skeleton.d.ts +1 -1
- package/dist/src/ui/slider.d.ts +1 -1
- package/dist/src/ui/sonner.d.ts +2 -1
- package/dist/src/ui/switch.d.ts +2 -2
- package/dist/src/ui/tabs.d.ts +1 -1
- package/dist/src/ui/textarea.d.ts +1 -1
- package/dist/src/ui/toast.d.ts +22 -0
- package/dist/src/ui/toggle-group.d.ts +8 -3
- package/dist/src/ui/toggle.d.ts +4 -1
- package/dist/src/ui/tooltip.d.ts +4 -4
- package/dist/src/ui/typography.d.ts +21 -0
- package/package.json +17 -7
- package/shadcn-components.json +52 -47
- package/src/SchemaRenderer.tsx +28 -0
- package/src/__tests__/PageRendererRegions.test.tsx +59 -0
- package/src/__tests__/Registry.test.ts +21 -0
- package/src/__tests__/basic-renderers.test.tsx +1 -1
- package/src/__tests__/complex-disclosure-renderers.test.tsx +3 -2
- package/src/__tests__/feedback-overlay-renderers.test.tsx +1 -1
- package/src/__tests__/form-renderers.test.tsx +1 -1
- package/src/__tests__/layout-data-renderers.test.tsx +1 -1
- package/src/{ui → custom}/button-group.tsx +1 -1
- package/src/{ui → custom}/combobox.tsx +3 -3
- package/src/{ui → custom}/date-picker.tsx +3 -3
- package/src/custom/field.tsx +81 -0
- package/src/{ui → custom}/filter-builder.tsx +3 -3
- package/src/custom/index.ts +12 -0
- package/src/custom/input-group.tsx +53 -0
- package/src/{ui → custom}/item.tsx +1 -1
- package/src/custom/native-select.tsx +33 -0
- package/src/custom/sort-builder.tsx +129 -0
- package/src/index.css +20 -1
- package/src/index.ts +1 -0
- package/src/renderers/basic/button-group.tsx +1 -0
- package/src/renderers/basic/div.tsx +12 -1
- package/src/renderers/basic/html.tsx +1 -0
- package/src/renderers/basic/icon.tsx +1 -0
- package/src/renderers/basic/image.tsx +1 -0
- package/src/renderers/basic/navigation-menu.tsx +1 -0
- package/src/renderers/basic/pagination.tsx +31 -4
- package/src/renderers/basic/separator.tsx +1 -0
- package/src/renderers/basic/span.tsx +12 -1
- package/src/renderers/basic/text.tsx +4 -2
- package/src/renderers/complex/carousel.tsx +1 -0
- package/src/renderers/complex/data-table.tsx +134 -95
- package/src/renderers/complex/filter-builder.tsx +2 -1
- package/src/renderers/complex/resizable.tsx +2 -1
- package/src/renderers/complex/scroll-area.tsx +25 -7
- package/src/renderers/complex/table.tsx +1 -0
- package/src/renderers/data-display/alert.tsx +1 -0
- package/src/renderers/data-display/avatar.tsx +1 -0
- package/src/renderers/data-display/badge.tsx +1 -0
- package/src/renderers/data-display/breadcrumb.tsx +1 -0
- package/src/renderers/data-display/kbd.tsx +1 -0
- package/src/renderers/data-display/list.tsx +21 -49
- package/src/renderers/data-display/statistic.tsx +21 -5
- package/src/renderers/data-display/table.tsx +21 -11
- package/src/renderers/data-display/tree-view.tsx +7 -1
- package/src/renderers/disclosure/accordion.tsx +1 -0
- package/src/renderers/disclosure/collapsible.tsx +1 -0
- package/src/renderers/disclosure/toggle-group.tsx +2 -0
- package/src/renderers/feedback/empty.tsx +1 -0
- package/src/renderers/feedback/loading.tsx +2 -1
- package/src/renderers/feedback/progress.tsx +1 -0
- package/src/renderers/feedback/skeleton.tsx +1 -0
- package/src/renderers/feedback/sonner.tsx +1 -0
- package/src/renderers/feedback/spinner.tsx +1 -0
- package/src/renderers/feedback/toast.tsx +1 -0
- package/src/renderers/feedback/toaster.tsx +1 -0
- package/src/renderers/form/button.tsx +35 -1
- package/src/renderers/form/calendar.tsx +1 -0
- package/src/renderers/form/checkbox.tsx +38 -16
- package/src/renderers/form/combobox.tsx +2 -1
- package/src/renderers/form/command.tsx +1 -0
- package/src/renderers/form/date-picker.tsx +1 -0
- package/src/renderers/form/file-upload.tsx +1 -0
- package/src/renderers/form/form.tsx +92 -15
- package/src/renderers/form/input-otp.tsx +1 -0
- package/src/renderers/form/input.tsx +3 -0
- package/src/renderers/form/label.tsx +1 -0
- package/src/renderers/form/radio-group.tsx +1 -0
- package/src/renderers/form/select.tsx +35 -15
- package/src/renderers/form/slider.tsx +1 -0
- package/src/renderers/form/switch.tsx +1 -0
- package/src/renderers/form/textarea.tsx +50 -27
- package/src/renderers/form/toggle.tsx +3 -45
- package/src/renderers/layout/aspect-ratio.tsx +2 -1
- package/src/renderers/layout/card.tsx +10 -2
- package/src/renderers/layout/container.tsx +1 -0
- package/src/renderers/layout/flex.tsx +1 -0
- package/src/renderers/layout/grid.tsx +23 -8
- package/src/renderers/layout/page.tsx +35 -23
- package/src/renderers/layout/semantic.tsx +1 -0
- package/src/renderers/layout/stack.tsx +2 -1
- package/src/renderers/layout/tabs.tsx +43 -17
- package/src/renderers/navigation/header-bar.tsx +1 -0
- package/src/renderers/navigation/sidebar.tsx +5 -0
- package/src/renderers/overlay/alert-dialog.tsx +1 -0
- package/src/renderers/overlay/context-menu.tsx +1 -0
- package/src/renderers/overlay/dialog.tsx +1 -0
- package/src/renderers/overlay/drawer.tsx +1 -0
- package/src/renderers/overlay/dropdown-menu.tsx +1 -0
- package/src/renderers/overlay/hover-card.tsx +1 -0
- package/src/renderers/overlay/menubar.tsx +1 -0
- package/src/renderers/overlay/popover.tsx +1 -0
- package/src/renderers/overlay/sheet.tsx +1 -0
- package/src/renderers/overlay/tooltip.tsx +1 -0
- package/src/renderers/placeholders.tsx +2 -2
- package/src/stories/CRMApp.stories.tsx +706 -0
- package/src/stories/Guide.mdx +55 -0
- package/src/stories/Introduction.mdx +34 -0
- package/src/stories/MockedData.stories.tsx +71 -0
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +1 -0
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +1 -0
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +1 -0
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +1 -0
- package/src/stories/assets/youtube.svg +1 -0
- package/src/stories/button.css +30 -0
- package/src/stories/header.css +32 -0
- package/src/stories/page.css +68 -0
- package/src/stories-json/accordion.stories.tsx +43 -0
- package/src/stories-json/aggrid.stories.tsx +103 -0
- package/src/stories-json/alert.stories.tsx +39 -0
- package/src/stories-json/aspect-ratio.stories.tsx +34 -0
- package/src/stories-json/avatar.stories.tsx +38 -0
- package/src/stories-json/badge.stories.tsx +53 -0
- package/src/stories-json/breadcrumb.stories.tsx +30 -0
- package/src/stories-json/button-group.stories.tsx +43 -0
- package/src/stories-json/button.stories.tsx +73 -0
- package/src/stories-json/calendar.stories.tsx +85 -0
- package/src/stories-json/card.stories.tsx +48 -0
- package/src/stories-json/carousel.stories.tsx +33 -0
- package/src/stories-json/charts.stories.tsx +195 -0
- package/src/stories-json/chatbot.stories.tsx +248 -0
- package/src/stories-json/code-editor.stories.tsx +92 -0
- package/src/stories-json/collapsible.stories.tsx +40 -0
- package/src/stories-json/controls.stories.tsx +36 -0
- package/src/stories-json/dashboard.stories.tsx +318 -0
- package/src/stories-json/data-table.stories.tsx +60 -0
- package/src/stories-json/data_display_extras.stories.tsx +102 -0
- package/src/stories-json/date-picker.stories.tsx +28 -0
- package/src/stories-json/detail-view.stories.tsx +258 -0
- package/src/stories-json/dialog.stories.tsx +43 -0
- package/src/stories-json/feedback_extras.stories.tsx +40 -0
- package/src/stories-json/feedback_others.stories.tsx +46 -0
- package/src/stories-json/form_advanced.stories.tsx +117 -0
- package/src/stories-json/form_extras.stories.tsx +123 -0
- package/src/stories-json/grid.stories.tsx +56 -0
- package/src/stories-json/icon.stories.tsx +36 -0
- package/src/stories-json/input.stories.tsx +52 -0
- package/src/stories-json/kanban.stories.tsx +295 -0
- package/src/stories-json/layout_extended.stories.tsx +76 -0
- package/src/stories-json/layout_flex.stories.tsx +107 -0
- package/src/stories-json/list-view.stories.tsx +97 -0
- package/src/stories-json/markdown.stories.tsx +129 -0
- package/src/stories-json/menus.stories.tsx +63 -0
- package/src/stories-json/metric-card.stories.tsx +143 -0
- package/src/stories-json/navigation-menu.stories.tsx +37 -0
- package/src/stories-json/object-aggrid.stories.tsx +252 -0
- package/src/stories-json/object-form.stories.tsx +130 -0
- package/src/stories-json/object-gantt.stories.tsx +114 -0
- package/src/stories-json/object-grid.stories.tsx +157 -0
- package/src/stories-json/object-map.stories.tsx +116 -0
- package/src/stories-json/object-view.stories.tsx +118 -0
- package/src/stories-json/overlay_extras.stories.tsx +113 -0
- package/src/stories-json/overlay_others.stories.tsx +76 -0
- package/src/stories-json/page.stories.tsx +55 -0
- package/src/stories-json/reports.stories.tsx +163 -0
- package/src/stories-json/resizable.stories.tsx +44 -0
- package/src/stories-json/select.stories.tsx +34 -0
- package/src/stories-json/separator.stories.tsx +41 -0
- package/src/stories-json/sidebar.stories.tsx +147 -0
- package/src/stories-json/statistic.stories.tsx +44 -0
- package/src/stories-json/tabs.stories.tsx +51 -0
- package/src/stories-json/timeline.stories.tsx +188 -0
- package/src/stories-json/typography.stories.tsx +45 -0
- package/src/ui/accordion.tsx +47 -53
- package/src/ui/alert-dialog.tsx +103 -117
- package/src/ui/alert.tsx +35 -36
- package/src/ui/aspect-ratio.tsx +1 -5
- package/src/ui/avatar.tsx +41 -42
- package/src/ui/badge.tsx +6 -15
- package/src/ui/breadcrumb.tsx +81 -75
- package/src/ui/button.tsx +10 -11
- package/src/ui/calendar.tsx +178 -51
- package/src/ui/card.tsx +51 -110
- package/src/ui/carousel.tsx +136 -113
- package/src/ui/chart.tsx +367 -0
- package/src/ui/checkbox.tsx +20 -22
- package/src/ui/collapsible.tsx +5 -25
- package/src/ui/command.tsx +106 -135
- package/src/ui/context-menu.tsx +69 -116
- package/src/ui/dialog.tsx +94 -113
- package/src/ui/drawer.tsx +82 -99
- package/src/ui/dropdown-menu.tsx +134 -188
- package/src/ui/form.tsx +51 -40
- package/src/ui/hover-card.tsx +18 -33
- package/src/ui/index.ts +2 -8
- package/src/ui/input-otp.tsx +42 -52
- package/src/ui/input.tsx +13 -15
- package/src/ui/label.tsx +17 -15
- package/src/ui/menubar.tsx +188 -206
- package/src/ui/navigation-menu.tsx +96 -136
- package/src/ui/pagination.tsx +86 -96
- package/src/ui/popover.tsx +24 -41
- package/src/ui/progress.tsx +21 -22
- package/src/ui/radio-group.tsx +19 -20
- package/src/ui/resizable.tsx +32 -42
- package/src/ui/scroll-area.tsx +38 -48
- package/src/ui/select.tsx +129 -157
- package/src/ui/separator.tsx +2 -2
- package/src/ui/sheet.tsx +110 -107
- package/src/ui/sidebar.tsx +442 -408
- package/src/ui/skeleton.tsx +6 -11
- package/src/ui/slider.tsx +19 -54
- package/src/ui/sonner.tsx +19 -1
- package/src/ui/switch.tsx +19 -21
- package/src/ui/tabs.tsx +6 -37
- package/src/ui/textarea.tsx +8 -4
- package/src/ui/toast.tsx +137 -0
- package/src/ui/toggle-group.tsx +28 -37
- package/src/ui/toggle.tsx +19 -19
- package/src/ui/tooltip.tsx +21 -52
- package/src/ui/typography.tsx +85 -0
- package/tsconfig.json +1 -1
- package/vite.config.ts +9 -1
- package/vitest.config.ts +5 -0
- package/ISSUES_FOUND.md +0 -128
- /package/dist/src/{ui → custom}/combobox.d.ts +0 -0
- /package/dist/src/{ui → custom}/date-picker.d.ts +0 -0
- /package/dist/src/{ui → custom}/empty.d.ts +0 -0
- /package/dist/src/{ui → custom}/filter-builder.d.ts +0 -0
- /package/dist/src/{ui → custom}/kbd.d.ts +0 -0
- /package/dist/src/{ui → custom}/spinner.d.ts +0 -0
- /package/src/{ui → custom}/empty.tsx +0 -0
- /package/src/{ui → custom}/kbd.tsx +0 -0
- /package/src/{ui → custom}/spinner.tsx +0 -0
package/src/ui/dropdown-menu.tsx
CHANGED
|
@@ -6,148 +6,145 @@
|
|
|
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 DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
|
|
11
|
-
import {
|
|
13
|
+
import { Check, ChevronRight, Circle } from "lucide-react"
|
|
12
14
|
|
|
13
15
|
import { cn } from "../lib/utils"
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
...props
|
|
17
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
|
|
18
|
-
return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
|
|
19
|
-
}
|
|
17
|
+
const DropdownMenu = DropdownMenuPrimitive.Root
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
...props
|
|
23
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
|
|
24
|
-
return (
|
|
25
|
-
<DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
|
|
26
|
-
)
|
|
27
|
-
}
|
|
19
|
+
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
|
|
28
20
|
|
|
29
|
-
|
|
30
|
-
...props
|
|
31
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
|
|
32
|
-
return (
|
|
33
|
-
<DropdownMenuPrimitive.Trigger
|
|
34
|
-
data-slot="dropdown-menu-trigger"
|
|
35
|
-
{...props}
|
|
36
|
-
/>
|
|
37
|
-
)
|
|
38
|
-
}
|
|
21
|
+
const DropdownMenuGroup = DropdownMenuPrimitive.Group
|
|
39
22
|
|
|
40
|
-
|
|
41
|
-
className,
|
|
42
|
-
sideOffset = 4,
|
|
43
|
-
...props
|
|
44
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
|
|
45
|
-
return (
|
|
46
|
-
<DropdownMenuPrimitive.Portal>
|
|
47
|
-
<DropdownMenuPrimitive.Content
|
|
48
|
-
data-slot="dropdown-menu-content"
|
|
49
|
-
sideOffset={sideOffset}
|
|
50
|
-
className={cn(
|
|
51
|
-
"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 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
|
|
52
|
-
className
|
|
53
|
-
)}
|
|
54
|
-
{...props}
|
|
55
|
-
/>
|
|
56
|
-
</DropdownMenuPrimitive.Portal>
|
|
57
|
-
)
|
|
58
|
-
}
|
|
23
|
+
const DropdownMenuPortal = DropdownMenuPrimitive.Portal
|
|
59
24
|
|
|
60
|
-
|
|
61
|
-
...props
|
|
62
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
|
|
63
|
-
return (
|
|
64
|
-
<DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
|
|
65
|
-
)
|
|
66
|
-
}
|
|
25
|
+
const DropdownMenuSub = DropdownMenuPrimitive.Sub
|
|
67
26
|
|
|
68
|
-
|
|
69
|
-
className,
|
|
70
|
-
inset,
|
|
71
|
-
variant = "default",
|
|
72
|
-
...props
|
|
73
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
|
|
74
|
-
inset?: boolean
|
|
75
|
-
variant?: "default" | "destructive"
|
|
76
|
-
}) {
|
|
77
|
-
return (
|
|
78
|
-
<DropdownMenuPrimitive.Item
|
|
79
|
-
data-slot="dropdown-menu-item"
|
|
80
|
-
data-inset={inset}
|
|
81
|
-
data-variant={variant}
|
|
82
|
-
className={cn(
|
|
83
|
-
"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",
|
|
84
|
-
className
|
|
85
|
-
)}
|
|
86
|
-
{...props}
|
|
87
|
-
/>
|
|
88
|
-
)
|
|
89
|
-
}
|
|
27
|
+
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
|
|
90
28
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
29
|
+
const DropdownMenuSubTrigger = React.forwardRef<
|
|
30
|
+
React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
|
|
31
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
|
|
32
|
+
inset?: boolean
|
|
33
|
+
}
|
|
34
|
+
>(({ className, inset, children, ...props }, ref) => (
|
|
35
|
+
<DropdownMenuPrimitive.SubTrigger
|
|
36
|
+
ref={ref}
|
|
37
|
+
className={cn(
|
|
38
|
+
"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
39
|
+
inset && "pl-8",
|
|
40
|
+
className
|
|
41
|
+
)}
|
|
42
|
+
{...props}
|
|
43
|
+
>
|
|
44
|
+
{children}
|
|
45
|
+
<ChevronRight className="ml-auto" />
|
|
46
|
+
</DropdownMenuPrimitive.SubTrigger>
|
|
47
|
+
))
|
|
48
|
+
DropdownMenuSubTrigger.displayName =
|
|
49
|
+
DropdownMenuPrimitive.SubTrigger.displayName
|
|
50
|
+
|
|
51
|
+
const DropdownMenuSubContent = React.forwardRef<
|
|
52
|
+
React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
|
|
53
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
|
|
54
|
+
>(({ className, ...props }, ref) => (
|
|
55
|
+
<DropdownMenuPrimitive.SubContent
|
|
56
|
+
ref={ref}
|
|
57
|
+
className={cn(
|
|
58
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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-dropdown-menu-content-transform-origin]",
|
|
59
|
+
className
|
|
60
|
+
)}
|
|
61
|
+
{...props}
|
|
62
|
+
/>
|
|
63
|
+
))
|
|
64
|
+
DropdownMenuSubContent.displayName =
|
|
65
|
+
DropdownMenuPrimitive.SubContent.displayName
|
|
66
|
+
|
|
67
|
+
const DropdownMenuContent = React.forwardRef<
|
|
68
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
|
|
69
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
|
|
70
|
+
>(({ className, sideOffset = 4, ...props }, ref) => (
|
|
71
|
+
<DropdownMenuPrimitive.Portal>
|
|
72
|
+
<DropdownMenuPrimitive.Content
|
|
73
|
+
ref={ref}
|
|
74
|
+
sideOffset={sideOffset}
|
|
100
75
|
className={cn(
|
|
101
|
-
"
|
|
76
|
+
"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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-dropdown-menu-content-transform-origin]",
|
|
102
77
|
className
|
|
103
78
|
)}
|
|
104
|
-
checked={checked}
|
|
105
|
-
{...props}
|
|
106
|
-
>
|
|
107
|
-
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
|
108
|
-
<DropdownMenuPrimitive.ItemIndicator>
|
|
109
|
-
<CheckIcon className="size-4" />
|
|
110
|
-
</DropdownMenuPrimitive.ItemIndicator>
|
|
111
|
-
</span>
|
|
112
|
-
{children}
|
|
113
|
-
</DropdownMenuPrimitive.CheckboxItem>
|
|
114
|
-
)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function DropdownMenuRadioGroup({
|
|
118
|
-
...props
|
|
119
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
|
|
120
|
-
return (
|
|
121
|
-
<DropdownMenuPrimitive.RadioGroup
|
|
122
|
-
data-slot="dropdown-menu-radio-group"
|
|
123
79
|
{...props}
|
|
124
80
|
/>
|
|
125
|
-
|
|
126
|
-
|
|
81
|
+
</DropdownMenuPrimitive.Portal>
|
|
82
|
+
))
|
|
83
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
|
|
127
84
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
85
|
+
const DropdownMenuItem = React.forwardRef<
|
|
86
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Item>,
|
|
87
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
|
|
88
|
+
inset?: boolean
|
|
89
|
+
}
|
|
90
|
+
>(({ className, inset, ...props }, ref) => (
|
|
91
|
+
<DropdownMenuPrimitive.Item
|
|
92
|
+
ref={ref}
|
|
93
|
+
className={cn(
|
|
94
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
95
|
+
inset && "pl-8",
|
|
96
|
+
className
|
|
97
|
+
)}
|
|
98
|
+
{...props}
|
|
99
|
+
/>
|
|
100
|
+
))
|
|
101
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
|
|
102
|
+
|
|
103
|
+
const DropdownMenuCheckboxItem = React.forwardRef<
|
|
104
|
+
React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
|
|
105
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
|
|
106
|
+
>(({ className, children, checked, ...props }, ref) => (
|
|
107
|
+
<DropdownMenuPrimitive.CheckboxItem
|
|
108
|
+
ref={ref}
|
|
109
|
+
className={cn(
|
|
110
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
111
|
+
className
|
|
112
|
+
)}
|
|
113
|
+
checked={checked}
|
|
114
|
+
{...props}
|
|
115
|
+
>
|
|
116
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
117
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
|
118
|
+
<Check className="h-4 w-4" />
|
|
119
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
|
120
|
+
</span>
|
|
121
|
+
{children}
|
|
122
|
+
</DropdownMenuPrimitive.CheckboxItem>
|
|
123
|
+
))
|
|
124
|
+
DropdownMenuCheckboxItem.displayName =
|
|
125
|
+
DropdownMenuPrimitive.CheckboxItem.displayName
|
|
126
|
+
|
|
127
|
+
const DropdownMenuRadioItem = React.forwardRef<
|
|
128
|
+
React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
|
|
129
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
|
|
130
|
+
>(({ className, children, ...props }, ref) => (
|
|
131
|
+
<DropdownMenuPrimitive.RadioItem
|
|
132
|
+
ref={ref}
|
|
133
|
+
className={cn(
|
|
134
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
135
|
+
className
|
|
136
|
+
)}
|
|
137
|
+
{...props}
|
|
138
|
+
>
|
|
139
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
140
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
|
141
|
+
<Circle className="h-2 w-2 fill-current" />
|
|
142
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
|
143
|
+
</span>
|
|
144
|
+
{children}
|
|
145
|
+
</DropdownMenuPrimitive.RadioItem>
|
|
146
|
+
))
|
|
147
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
|
|
151
148
|
|
|
152
149
|
const DropdownMenuLabel = React.forwardRef<
|
|
153
150
|
React.ElementRef<typeof DropdownMenuPrimitive.Label>,
|
|
@@ -157,10 +154,9 @@ const DropdownMenuLabel = React.forwardRef<
|
|
|
157
154
|
>(({ className, inset, ...props }, ref) => (
|
|
158
155
|
<DropdownMenuPrimitive.Label
|
|
159
156
|
ref={ref}
|
|
160
|
-
data-slot="dropdown-menu-label"
|
|
161
|
-
data-inset={inset}
|
|
162
157
|
className={cn(
|
|
163
|
-
"px-2 py-1.5 text-sm font-
|
|
158
|
+
"px-2 py-1.5 text-sm font-semibold",
|
|
159
|
+
inset && "pl-8",
|
|
164
160
|
className
|
|
165
161
|
)}
|
|
166
162
|
{...props}
|
|
@@ -174,89 +170,39 @@ const DropdownMenuSeparator = React.forwardRef<
|
|
|
174
170
|
>(({ className, ...props }, ref) => (
|
|
175
171
|
<DropdownMenuPrimitive.Separator
|
|
176
172
|
ref={ref}
|
|
177
|
-
|
|
178
|
-
className={cn("bg-border -mx-1 my-1 h-px", className)}
|
|
173
|
+
className={cn("-mx-1 my-1 h-px bg-muted", className)}
|
|
179
174
|
{...props}
|
|
180
175
|
/>
|
|
181
176
|
))
|
|
182
177
|
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
|
|
183
178
|
|
|
184
|
-
|
|
179
|
+
const DropdownMenuShortcut = ({
|
|
185
180
|
className,
|
|
186
181
|
...props
|
|
187
|
-
}: React.
|
|
182
|
+
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
188
183
|
return (
|
|
189
184
|
<span
|
|
190
|
-
|
|
191
|
-
className={cn(
|
|
192
|
-
"text-muted-foreground ml-auto text-xs tracking-widest",
|
|
193
|
-
className
|
|
194
|
-
)}
|
|
195
|
-
{...props}
|
|
196
|
-
/>
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
function DropdownMenuSub({
|
|
201
|
-
...props
|
|
202
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
|
|
203
|
-
return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function DropdownMenuSubTrigger({
|
|
207
|
-
className,
|
|
208
|
-
inset,
|
|
209
|
-
children,
|
|
210
|
-
...props
|
|
211
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
|
|
212
|
-
inset?: boolean
|
|
213
|
-
}) {
|
|
214
|
-
return (
|
|
215
|
-
<DropdownMenuPrimitive.SubTrigger
|
|
216
|
-
data-slot="dropdown-menu-sub-trigger"
|
|
217
|
-
data-inset={inset}
|
|
218
|
-
className={cn(
|
|
219
|
-
"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
220
|
-
className
|
|
221
|
-
)}
|
|
222
|
-
{...props}
|
|
223
|
-
>
|
|
224
|
-
{children}
|
|
225
|
-
<ChevronRightIcon className="ml-auto size-4" />
|
|
226
|
-
</DropdownMenuPrimitive.SubTrigger>
|
|
227
|
-
)
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function DropdownMenuSubContent({
|
|
231
|
-
className,
|
|
232
|
-
...props
|
|
233
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
|
|
234
|
-
return (
|
|
235
|
-
<DropdownMenuPrimitive.SubContent
|
|
236
|
-
data-slot="dropdown-menu-sub-content"
|
|
237
|
-
className={cn(
|
|
238
|
-
"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-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
|
|
239
|
-
className
|
|
240
|
-
)}
|
|
185
|
+
className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
|
|
241
186
|
{...props}
|
|
242
187
|
/>
|
|
243
188
|
)
|
|
244
189
|
}
|
|
190
|
+
DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
|
|
245
191
|
|
|
246
192
|
export {
|
|
247
193
|
DropdownMenu,
|
|
248
|
-
DropdownMenuPortal,
|
|
249
194
|
DropdownMenuTrigger,
|
|
250
195
|
DropdownMenuContent,
|
|
251
|
-
DropdownMenuGroup,
|
|
252
|
-
DropdownMenuLabel,
|
|
253
196
|
DropdownMenuItem,
|
|
254
197
|
DropdownMenuCheckboxItem,
|
|
255
|
-
DropdownMenuRadioGroup,
|
|
256
198
|
DropdownMenuRadioItem,
|
|
199
|
+
DropdownMenuLabel,
|
|
257
200
|
DropdownMenuSeparator,
|
|
258
201
|
DropdownMenuShortcut,
|
|
202
|
+
DropdownMenuGroup,
|
|
203
|
+
DropdownMenuPortal,
|
|
259
204
|
DropdownMenuSub,
|
|
260
|
-
DropdownMenuSubTrigger,
|
|
261
205
|
DropdownMenuSubContent,
|
|
206
|
+
DropdownMenuSubTrigger,
|
|
207
|
+
DropdownMenuRadioGroup,
|
|
262
208
|
}
|
package/src/ui/form.tsx
CHANGED
|
@@ -9,13 +9,12 @@
|
|
|
9
9
|
"use client"
|
|
10
10
|
|
|
11
11
|
import * as React from "react"
|
|
12
|
-
import
|
|
12
|
+
import * as LabelPrimitive from "@radix-ui/react-label"
|
|
13
13
|
import { Slot } from "@radix-ui/react-slot"
|
|
14
14
|
import {
|
|
15
15
|
Controller,
|
|
16
16
|
FormProvider,
|
|
17
17
|
useFormContext,
|
|
18
|
-
useFormState,
|
|
19
18
|
type ControllerProps,
|
|
20
19
|
type FieldPath,
|
|
21
20
|
type FieldValues,
|
|
@@ -28,18 +27,16 @@ const Form = FormProvider
|
|
|
28
27
|
|
|
29
28
|
type FormFieldContextValue<
|
|
30
29
|
TFieldValues extends FieldValues = FieldValues,
|
|
31
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues
|
|
30
|
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
32
31
|
> = {
|
|
33
32
|
name: TName
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
const FormFieldContext = React.createContext<FormFieldContextValue>(
|
|
37
|
-
{} as FormFieldContextValue
|
|
38
|
-
)
|
|
35
|
+
const FormFieldContext = React.createContext<FormFieldContextValue | null>(null)
|
|
39
36
|
|
|
40
37
|
const FormField = <
|
|
41
38
|
TFieldValues extends FieldValues = FieldValues,
|
|
42
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues
|
|
39
|
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
43
40
|
>({
|
|
44
41
|
...props
|
|
45
42
|
}: ControllerProps<TFieldValues, TName>) => {
|
|
@@ -53,14 +50,18 @@ const FormField = <
|
|
|
53
50
|
const useFormField = () => {
|
|
54
51
|
const fieldContext = React.useContext(FormFieldContext)
|
|
55
52
|
const itemContext = React.useContext(FormItemContext)
|
|
56
|
-
const { getFieldState } = useFormContext()
|
|
57
|
-
const formState = useFormState({ name: fieldContext.name })
|
|
58
|
-
const fieldState = getFieldState(fieldContext.name, formState)
|
|
53
|
+
const { getFieldState, formState } = useFormContext()
|
|
59
54
|
|
|
60
55
|
if (!fieldContext) {
|
|
61
56
|
throw new Error("useFormField should be used within <FormField>")
|
|
62
57
|
}
|
|
63
58
|
|
|
59
|
+
if (!itemContext) {
|
|
60
|
+
throw new Error("useFormField should be used within <FormItem>")
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const fieldState = getFieldState(fieldContext.name, formState)
|
|
64
|
+
|
|
64
65
|
const { id } = itemContext
|
|
65
66
|
|
|
66
67
|
return {
|
|
@@ -77,47 +78,48 @@ type FormItemContextValue = {
|
|
|
77
78
|
id: string
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
const FormItemContext = React.createContext<FormItemContextValue>(
|
|
81
|
-
{} as FormItemContextValue
|
|
82
|
-
)
|
|
81
|
+
const FormItemContext = React.createContext<FormItemContextValue | null>(null)
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
const FormItem = React.forwardRef<
|
|
84
|
+
HTMLDivElement,
|
|
85
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
86
|
+
>(({ className, ...props }, ref) => {
|
|
85
87
|
const id = React.useId()
|
|
86
88
|
|
|
87
89
|
return (
|
|
88
90
|
<FormItemContext.Provider value={{ id }}>
|
|
89
|
-
<div
|
|
90
|
-
data-slot="form-item"
|
|
91
|
-
className={cn("grid gap-2", className)}
|
|
92
|
-
{...props}
|
|
93
|
-
/>
|
|
91
|
+
<div ref={ref} className={cn("space-y-2", className)} {...props} />
|
|
94
92
|
</FormItemContext.Provider>
|
|
95
93
|
)
|
|
96
|
-
}
|
|
94
|
+
})
|
|
95
|
+
FormItem.displayName = "FormItem"
|
|
97
96
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
97
|
+
const FormLabel = React.forwardRef<
|
|
98
|
+
React.ElementRef<typeof LabelPrimitive.Root>,
|
|
99
|
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
|
|
100
|
+
>(({ className, ...props }, ref) => {
|
|
102
101
|
const { error, formItemId } = useFormField()
|
|
103
102
|
|
|
104
103
|
return (
|
|
105
104
|
<Label
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
className={cn("data-[error=true]:text-destructive", className)}
|
|
105
|
+
ref={ref}
|
|
106
|
+
className={cn(error && "text-destructive", className)}
|
|
109
107
|
htmlFor={formItemId}
|
|
110
108
|
{...props}
|
|
111
109
|
/>
|
|
112
110
|
)
|
|
113
|
-
}
|
|
111
|
+
})
|
|
112
|
+
FormLabel.displayName = "FormLabel"
|
|
114
113
|
|
|
115
|
-
|
|
114
|
+
const FormControl = React.forwardRef<
|
|
115
|
+
React.ElementRef<typeof Slot>,
|
|
116
|
+
React.ComponentPropsWithoutRef<typeof Slot>
|
|
117
|
+
>(({ ...props }, ref) => {
|
|
116
118
|
const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
|
|
117
119
|
|
|
118
120
|
return (
|
|
119
121
|
<Slot
|
|
120
|
-
|
|
122
|
+
ref={ref}
|
|
121
123
|
id={formItemId}
|
|
122
124
|
aria-describedby={
|
|
123
125
|
!error
|
|
@@ -128,24 +130,32 @@ function FormControl({ ...props }: React.ComponentProps<typeof Slot>) {
|
|
|
128
130
|
{...props}
|
|
129
131
|
/>
|
|
130
132
|
)
|
|
131
|
-
}
|
|
133
|
+
})
|
|
134
|
+
FormControl.displayName = "FormControl"
|
|
132
135
|
|
|
133
|
-
|
|
136
|
+
const FormDescription = React.forwardRef<
|
|
137
|
+
HTMLParagraphElement,
|
|
138
|
+
React.HTMLAttributes<HTMLParagraphElement>
|
|
139
|
+
>(({ className, ...props }, ref) => {
|
|
134
140
|
const { formDescriptionId } = useFormField()
|
|
135
141
|
|
|
136
142
|
return (
|
|
137
143
|
<p
|
|
138
|
-
|
|
144
|
+
ref={ref}
|
|
139
145
|
id={formDescriptionId}
|
|
140
|
-
className={cn("text-muted-foreground
|
|
146
|
+
className={cn("text-sm text-muted-foreground", className)}
|
|
141
147
|
{...props}
|
|
142
148
|
/>
|
|
143
149
|
)
|
|
144
|
-
}
|
|
150
|
+
})
|
|
151
|
+
FormDescription.displayName = "FormDescription"
|
|
145
152
|
|
|
146
|
-
|
|
153
|
+
const FormMessage = React.forwardRef<
|
|
154
|
+
HTMLParagraphElement,
|
|
155
|
+
React.HTMLAttributes<HTMLParagraphElement>
|
|
156
|
+
>(({ className, children, ...props }, ref) => {
|
|
147
157
|
const { error, formMessageId } = useFormField()
|
|
148
|
-
const body = error ? String(error?.message ?? "") :
|
|
158
|
+
const body = error ? String(error?.message ?? "") : children
|
|
149
159
|
|
|
150
160
|
if (!body) {
|
|
151
161
|
return null
|
|
@@ -153,15 +163,16 @@ function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
|
|
|
153
163
|
|
|
154
164
|
return (
|
|
155
165
|
<p
|
|
156
|
-
|
|
166
|
+
ref={ref}
|
|
157
167
|
id={formMessageId}
|
|
158
|
-
className={cn("text-
|
|
168
|
+
className={cn("text-sm font-medium text-destructive", className)}
|
|
159
169
|
{...props}
|
|
160
170
|
>
|
|
161
171
|
{body}
|
|
162
172
|
</p>
|
|
163
173
|
)
|
|
164
|
-
}
|
|
174
|
+
})
|
|
175
|
+
FormMessage.displayName = "FormMessage"
|
|
165
176
|
|
|
166
177
|
export {
|
|
167
178
|
useFormField,
|
package/src/ui/hover-card.tsx
CHANGED
|
@@ -13,40 +13,25 @@ import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
|
|
|
13
13
|
|
|
14
14
|
import { cn } from "../lib/utils"
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
...props
|
|
18
|
-
}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
|
|
19
|
-
return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />
|
|
20
|
-
}
|
|
16
|
+
const HoverCard = HoverCardPrimitive.Root
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
...props
|
|
24
|
-
}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {
|
|
25
|
-
return (
|
|
26
|
-
<HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
|
|
27
|
-
)
|
|
28
|
-
}
|
|
18
|
+
const HoverCardTrigger = HoverCardPrimitive.Trigger
|
|
29
19
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
{...props}
|
|
47
|
-
/>
|
|
48
|
-
</HoverCardPrimitive.Portal>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
20
|
+
const HoverCardContent = React.forwardRef<
|
|
21
|
+
React.ElementRef<typeof HoverCardPrimitive.Content>,
|
|
22
|
+
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
|
|
23
|
+
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
|
|
24
|
+
<HoverCardPrimitive.Content
|
|
25
|
+
ref={ref}
|
|
26
|
+
align={align}
|
|
27
|
+
sideOffset={sideOffset}
|
|
28
|
+
className={cn(
|
|
29
|
+
"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none 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-hover-card-content-transform-origin]",
|
|
30
|
+
className
|
|
31
|
+
)}
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
))
|
|
35
|
+
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
|
|
51
36
|
|
|
52
37
|
export { HoverCard, HoverCardTrigger, HoverCardContent }
|
package/src/ui/index.ts
CHANGED
|
@@ -13,28 +13,22 @@ export * from './aspect-ratio';
|
|
|
13
13
|
export * from './avatar';
|
|
14
14
|
export * from './badge';
|
|
15
15
|
export * from './breadcrumb';
|
|
16
|
-
export * from './button-group';
|
|
17
16
|
export * from './button';
|
|
18
17
|
export * from './calendar';
|
|
19
18
|
export * from './card';
|
|
20
19
|
export * from './carousel';
|
|
20
|
+
export * from './chart';
|
|
21
21
|
export * from './checkbox';
|
|
22
22
|
export * from './collapsible';
|
|
23
|
-
export * from './combobox';
|
|
24
23
|
export * from './command';
|
|
25
24
|
export * from './context-menu';
|
|
26
|
-
export * from './date-picker';
|
|
27
25
|
export * from './dialog';
|
|
28
26
|
export * from './drawer';
|
|
29
27
|
export * from './dropdown-menu';
|
|
30
|
-
export * from './empty';
|
|
31
|
-
export * from './filter-builder';
|
|
32
28
|
export * from './form';
|
|
33
29
|
export * from './hover-card';
|
|
34
30
|
export * from './input-otp';
|
|
35
31
|
export * from './input';
|
|
36
|
-
export * from './item';
|
|
37
|
-
export * from './kbd';
|
|
38
32
|
export * from './label';
|
|
39
33
|
export * from './menubar';
|
|
40
34
|
export * from './navigation-menu';
|
|
@@ -52,7 +46,6 @@ export * from './skeleton';
|
|
|
52
46
|
export * from './slider';
|
|
53
47
|
export * from './sonner';
|
|
54
48
|
export { Toaster } from './sonner';
|
|
55
|
-
export * from './spinner';
|
|
56
49
|
export * from './switch';
|
|
57
50
|
export * from './table';
|
|
58
51
|
export * from './tabs';
|
|
@@ -60,3 +53,4 @@ export * from './textarea';
|
|
|
60
53
|
export * from './toggle-group';
|
|
61
54
|
export * from './toggle';
|
|
62
55
|
export * from './tooltip';
|
|
56
|
+
export * from './typography';
|