azamat-ui-kit-cli 0.2.2 → 0.3.3

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 (103) hide show
  1. package/README.md +11 -0
  2. package/dist/index.cjs +452 -0
  3. package/package.json +2 -2
  4. package/vendor/src/components/actions/action-menu.tsx +21 -18
  5. package/vendor/src/components/calendar/calendar.tsx +153 -102
  6. package/vendor/src/components/calendar/date-picker.tsx +24 -14
  7. package/vendor/src/components/calendar/date-range-picker.tsx +137 -58
  8. package/vendor/src/components/charts/charts.tsx +32 -21
  9. package/vendor/src/components/command/command-palette.tsx +68 -57
  10. package/vendor/src/components/data-table/data-table-bulk-actions.tsx +23 -20
  11. package/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +21 -10
  12. package/vendor/src/components/data-table/data-table-pagination.tsx +6 -6
  13. package/vendor/src/components/data-table/data-table-toolbar.tsx +72 -44
  14. package/vendor/src/components/data-table/data-table.tsx +15 -11
  15. package/vendor/src/components/data-table/table-export-menu.tsx +1 -1
  16. package/vendor/src/components/data-table/table-import-button.tsx +1 -1
  17. package/vendor/src/components/display/data-state.tsx +20 -8
  18. package/vendor/src/components/display/index.ts +19 -15
  19. package/vendor/src/components/display/metric-card.tsx +35 -0
  20. package/vendor/src/components/display/progress-circle.tsx +24 -0
  21. package/vendor/src/components/display/smart-card.tsx +49 -27
  22. package/vendor/src/components/display/status-dot.tsx +45 -0
  23. package/vendor/src/components/display/user-card.tsx +30 -0
  24. package/vendor/src/components/feedback/alert.tsx +21 -11
  25. package/vendor/src/components/feedback/empty-state.tsx +2 -2
  26. package/vendor/src/components/feedback/loading-state.tsx +2 -2
  27. package/vendor/src/components/feedback/page-state.tsx +19 -15
  28. package/vendor/src/components/feedback/status-badge.tsx +43 -43
  29. package/vendor/src/components/form/form-app-input.tsx +147 -0
  30. package/vendor/src/components/form/form-date-input.tsx +16 -19
  31. package/vendor/src/components/form/form-field-shell.tsx +11 -8
  32. package/vendor/src/components/form/form-field-utils.ts +76 -0
  33. package/vendor/src/components/form/form-input.tsx +423 -44
  34. package/vendor/src/components/form/form-number-input.tsx +16 -15
  35. package/vendor/src/components/form/form-phone-input.tsx +15 -9
  36. package/vendor/src/components/form/form-search-input.tsx +16 -19
  37. package/vendor/src/components/form/form-select.tsx +4 -3
  38. package/vendor/src/components/form/public.ts +16 -14
  39. package/vendor/src/components/form/smart-form-shell.tsx +13 -12
  40. package/vendor/src/components/inputs/app-input.tsx +27 -0
  41. package/vendor/src/components/inputs/async-select.tsx +113 -84
  42. package/vendor/src/components/inputs/clearable-input.tsx +81 -61
  43. package/vendor/src/components/inputs/date-input.tsx +21 -17
  44. package/vendor/src/components/inputs/date-range-input.tsx +10 -10
  45. package/vendor/src/components/inputs/index.ts +1 -0
  46. package/vendor/src/components/inputs/input-decorator.tsx +101 -57
  47. package/vendor/src/components/inputs/masked-input.tsx +20 -20
  48. package/vendor/src/components/inputs/money-input.tsx +2 -2
  49. package/vendor/src/components/inputs/number-input.tsx +29 -19
  50. package/vendor/src/components/inputs/password-input.tsx +82 -45
  51. package/vendor/src/components/inputs/phone-input.tsx +24 -2
  52. package/vendor/src/components/inputs/quantity-input.tsx +2 -2
  53. package/vendor/src/components/inputs/search-input.tsx +54 -3
  54. package/vendor/src/components/inputs/simple-select.tsx +110 -22
  55. package/vendor/src/components/layout/app-shell.tsx +2 -2
  56. package/vendor/src/components/layout/index.ts +5 -4
  57. package/vendor/src/components/layout/page-header.tsx +79 -35
  58. package/vendor/src/components/layout/public.ts +12 -10
  59. package/vendor/src/components/layout/section-header.tsx +56 -0
  60. package/vendor/src/components/layout/stack.tsx +106 -0
  61. package/vendor/src/components/layout/stat-card.tsx +66 -29
  62. package/vendor/src/components/navigation/index.ts +1 -0
  63. package/vendor/src/components/navigation/nav-tabs.tsx +60 -0
  64. package/vendor/src/components/navigation/page-tabs.tsx +41 -26
  65. package/vendor/src/components/navigation/pagination.tsx +14 -10
  66. package/vendor/src/components/overlay/alert-dialog.tsx +65 -0
  67. package/vendor/src/components/overlay/drawer.tsx +71 -0
  68. package/vendor/src/components/overlay/index.ts +4 -2
  69. package/vendor/src/components/patterns/data-view.tsx +13 -8
  70. package/vendor/src/components/ui/badge.tsx +96 -52
  71. package/vendor/src/components/ui/button.tsx +99 -61
  72. package/vendor/src/components/ui/card.tsx +84 -25
  73. package/vendor/src/components/ui/checkbox.tsx +68 -68
  74. package/vendor/src/components/ui/command.tsx +32 -32
  75. package/vendor/src/components/ui/dialog.tsx +135 -138
  76. package/vendor/src/components/ui/dropdown-menu.tsx +21 -21
  77. package/vendor/src/components/ui/hover-card.tsx +49 -0
  78. package/vendor/src/components/ui/input-primitive.tsx +24 -0
  79. package/vendor/src/components/ui/input.tsx +191 -20
  80. package/vendor/src/components/ui/kbd.tsx +33 -0
  81. package/vendor/src/components/ui/popover.tsx +11 -11
  82. package/vendor/src/components/ui/radio-group.tsx +102 -0
  83. package/vendor/src/components/ui/right-click-menu.tsx +60 -0
  84. package/vendor/src/components/ui/scroll-box.tsx +27 -0
  85. package/vendor/src/components/ui/segmented-control.tsx +21 -17
  86. package/vendor/src/components/ui/select.tsx +187 -189
  87. package/vendor/src/components/ui/skeleton.tsx +2 -2
  88. package/vendor/src/components/ui/switch.tsx +60 -60
  89. package/vendor/src/components/ui/table.tsx +114 -114
  90. package/vendor/src/components/ui/tabs.tsx +2 -2
  91. package/vendor/src/components/ui/textarea.tsx +1 -1
  92. package/vendor/src/components/upload/file-dropzone.tsx +38 -0
  93. package/vendor/src/components/upload/file-upload.tsx +4 -4
  94. package/vendor/src/components/upload/image-upload.tsx +22 -19
  95. package/vendor/src/components/upload/index.ts +2 -0
  96. package/vendor/src/families/catalog.ts +1 -0
  97. package/vendor/src/families/docs-groups.ts +10 -1
  98. package/vendor/src/families/member-metadata.ts +24 -0
  99. package/vendor/src/families/member-snippets.ts +41 -2
  100. package/vendor/src/families/migration-map.ts +3 -0
  101. package/vendor/src/index.ts +23 -18
  102. package/vendor/templates/styles/globals.css +253 -0
  103. package/dist/index.js +0 -432
@@ -1,160 +1,157 @@
1
- import * as React from "react"
2
- import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
3
-
4
- import { cn } from "@/lib/utils"
5
- import { Button } from "@/components/ui/button"
6
- import { XIcon } from "lucide-react"
7
-
8
- function Dialog({ ...props }: DialogPrimitive.Root.Props) {
9
- return <DialogPrimitive.Root data-slot="dialog" {...props} />
10
- }
11
-
12
- function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
13
- return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
14
- }
15
-
16
- function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
17
- return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
18
- }
19
-
20
- function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
21
- return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
22
- }
23
-
24
- function DialogOverlay({
25
- className,
26
- ...props
27
- }: DialogPrimitive.Backdrop.Props) {
28
- return (
1
+ import * as React from "react"
2
+ import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
3
+
4
+ import { cn } from "@/lib/utils"
5
+ import { Button } from "@/components/ui/button"
6
+ import { XIcon } from "lucide-react"
7
+
8
+ function Dialog({ ...props }: DialogPrimitive.Root.Props) {
9
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
10
+ }
11
+
12
+ function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
13
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
14
+ }
15
+
16
+ function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
17
+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
18
+ }
19
+
20
+ function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
21
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
22
+ }
23
+
24
+ function DialogOverlay({
25
+ className,
26
+ ...props
27
+ }: DialogPrimitive.Backdrop.Props) {
28
+ return (
29
29
  <DialogPrimitive.Backdrop
30
30
  data-slot="dialog-overlay"
31
31
  className={cn(
32
- "fixed inset-0 isolate z-50 bg-[color-mix(in_oklch,var(--foreground),transparent_82%)] duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
32
+ "fixed inset-0 isolate z-50 bg-[color-mix(in_oklch,var(--foreground),transparent_80%)] duration-100 supports-backdrop-filter:backdrop-blur-md data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
33
33
  className
34
34
  )}
35
- {...props}
36
- />
37
- )
38
- }
39
-
40
- function DialogContent({
41
- className,
42
- children,
43
- showCloseButton = true,
44
- ...props
45
- }: DialogPrimitive.Popup.Props & {
46
- showCloseButton?: boolean
47
- }) {
48
- return (
49
- <DialogPortal>
50
- <DialogOverlay />
51
- <DialogPrimitive.Popup
35
+ {...props}
36
+ />
37
+ )
38
+ }
39
+
40
+ function DialogContent({
41
+ className,
42
+ children,
43
+ showCloseButton = true,
44
+ ...props
45
+ }: DialogPrimitive.Popup.Props & {
46
+ showCloseButton?: boolean
47
+ }) {
48
+ return (
49
+ <DialogPortal>
50
+ <DialogOverlay />
51
+ <DialogPrimitive.Popup
52
52
  data-slot="dialog-content"
53
53
  className={cn(
54
- "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 rounded-[var(--radius-3xl)] border border-border/80 bg-popover/98 p-6 text-sm text-popover-foreground shadow-[0_30px_100px_color-mix(in_oklch,var(--foreground),transparent_82%)] ring-1 ring-foreground/8 backdrop-blur duration-100 outline-none sm:max-w-lg data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
54
+ "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 rounded-[var(--radius-3xl)] border border-border/85 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--popover),white_10%),var(--popover))] p-6 text-sm text-popover-foreground shadow-[0_34px_110px_color-mix(in_oklch,var(--foreground),transparent_82%)] ring-1 ring-foreground/8 backdrop-blur duration-100 outline-none sm:max-w-lg data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
55
55
  className
56
56
  )}
57
- {...props}
58
- >
59
- {children}
60
- {showCloseButton && (
61
- <DialogPrimitive.Close
62
- data-slot="dialog-close"
63
- render={
64
- <Button
57
+ {...props}
58
+ >
59
+ {children}
60
+ {showCloseButton && (
61
+ <DialogPrimitive.Close
62
+ data-slot="dialog-close"
63
+ render={
64
+ <Button
65
65
  variant="ghost"
66
- className="absolute top-3 right-3 rounded-full"
66
+ className="absolute top-3 right-3 rounded-full border border-transparent hover:border-border/60"
67
67
  size="icon-sm"
68
68
  />
69
- }
70
- >
71
- <XIcon
72
- />
73
- <span className="sr-only">Close</span>
74
- </DialogPrimitive.Close>
75
- )}
76
- </DialogPrimitive.Popup>
77
- </DialogPortal>
78
- )
79
- }
80
-
81
- function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
82
- return (
83
- <div
69
+ }
70
+ >
71
+ <XIcon />
72
+ <span className="sr-only">Close</span>
73
+ </DialogPrimitive.Close>
74
+ )}
75
+ </DialogPrimitive.Popup>
76
+ </DialogPortal>
77
+ )
78
+ }
79
+
80
+ function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
81
+ return (
82
+ <div
84
83
  data-slot="dialog-header"
85
84
  className={cn("flex flex-col gap-2.5", className)}
86
- {...props}
87
- />
88
- )
89
- }
90
-
91
- function DialogFooter({
92
- className,
93
- showCloseButton = false,
94
- children,
95
- ...props
96
- }: React.ComponentProps<"div"> & {
97
- showCloseButton?: boolean
98
- }) {
99
- return (
100
- <div
101
- data-slot="dialog-footer"
102
- className={cn(
103
- "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
104
- "-mx-6 -mb-6 flex flex-col-reverse gap-2 rounded-b-[var(--radius-3xl)] border-t border-border/70 bg-muted/45 p-5 sm:flex-row sm:justify-end",
85
+ {...props}
86
+ />
87
+ )
88
+ }
89
+
90
+ function DialogFooter({
91
+ className,
92
+ showCloseButton = false,
93
+ children,
94
+ ...props
95
+ }: React.ComponentProps<"div"> & {
96
+ showCloseButton?: boolean
97
+ }) {
98
+ return (
99
+ <div
100
+ data-slot="dialog-footer"
101
+ className={cn(
102
+ "-mx-6 -mb-6 flex flex-col-reverse gap-2 rounded-b-[var(--radius-3xl)] border-t border-border/70 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--muted),transparent_30%),color-mix(in_oklch,var(--muted),transparent_12%))] p-5 sm:flex-row sm:justify-end",
105
103
  className
106
104
  )}
107
- {...props}
108
- >
109
- {children}
110
- {showCloseButton && (
111
- <DialogPrimitive.Close render={<Button variant="outline" />}>
112
- Close
113
- </DialogPrimitive.Close>
114
- )}
115
- </div>
116
- )
117
- }
118
-
119
- function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
120
- return (
121
- <DialogPrimitive.Title
122
- data-slot="dialog-title"
123
- className={cn(
124
- "font-heading text-base leading-none font-medium",
105
+ {...props}
106
+ >
107
+ {children}
108
+ {showCloseButton && (
109
+ <DialogPrimitive.Close render={<Button variant="outline" />}>
110
+ Close
111
+ </DialogPrimitive.Close>
112
+ )}
113
+ </div>
114
+ )
115
+ }
116
+
117
+ function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
118
+ return (
119
+ <DialogPrimitive.Title
120
+ data-slot="dialog-title"
121
+ className={cn(
125
122
  "font-heading text-xl leading-tight font-semibold tracking-tight",
126
123
  className
127
124
  )}
128
- {...props}
129
- />
130
- )
131
- }
132
-
133
- function DialogDescription({
134
- className,
135
- ...props
136
- }: DialogPrimitive.Description.Props) {
137
- return (
138
- <DialogPrimitive.Description
139
- data-slot="dialog-description"
140
- className={cn(
125
+ {...props}
126
+ />
127
+ )
128
+ }
129
+
130
+ function DialogDescription({
131
+ className,
132
+ ...props
133
+ }: DialogPrimitive.Description.Props) {
134
+ return (
135
+ <DialogPrimitive.Description
136
+ data-slot="dialog-description"
137
+ className={cn(
141
138
  "text-sm leading-6 text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
142
139
  className
143
140
  )}
144
- {...props}
145
- />
146
- )
147
- }
148
-
149
- export {
150
- Dialog,
151
- DialogClose,
152
- DialogContent,
153
- DialogDescription,
154
- DialogFooter,
155
- DialogHeader,
156
- DialogOverlay,
157
- DialogPortal,
158
- DialogTitle,
159
- DialogTrigger,
160
- }
141
+ {...props}
142
+ />
143
+ )
144
+ }
145
+
146
+ export {
147
+ Dialog,
148
+ DialogClose,
149
+ DialogContent,
150
+ DialogDescription,
151
+ DialogFooter,
152
+ DialogHeader,
153
+ DialogOverlay,
154
+ DialogPortal,
155
+ DialogTitle,
156
+ DialogTrigger,
157
+ }
@@ -39,7 +39,7 @@ function DropdownMenuContent({
39
39
  >
40
40
  <MenuPrimitive.Popup
41
41
  data-slot="dropdown-menu-content"
42
- className={cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-40 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--radius-2xl)] border border-border/75 bg-popover/98 p-1.5 text-popover-foreground shadow-[0_24px_70px_color-mix(in_oklch,var(--foreground),transparent_84%)] ring-1 ring-foreground/8 backdrop-blur duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className )}
42
+ className={cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--radius-2xl)] border border-border/80 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--popover),white_10%),var(--popover))] p-2 text-popover-foreground shadow-[0_24px_70px_color-mix(in_oklch,var(--foreground),transparent_84%)] ring-1 ring-foreground/8 backdrop-blur duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className)}
43
43
  {...props}
44
44
  />
45
45
  </MenuPrimitive.Positioner>
@@ -82,14 +82,14 @@ function DropdownMenuItem({
82
82
  }) {
83
83
  return (
84
84
  <MenuPrimitive.Item
85
- data-slot="dropdown-menu-item"
86
- data-inset={inset}
87
- data-variant={variant}
88
- className={cn(
89
- "group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-xl px-2.5 py-2 text-sm outline-hidden select-none transition-colors focus:bg-accent/80 focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
85
+ data-slot="dropdown-menu-item"
86
+ data-inset={inset}
87
+ data-variant={variant}
88
+ className={cn(
89
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-[min(var(--radius-xl),16px)] border border-transparent px-3 py-2.5 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] focus:border-border/80 focus:bg-accent/80 focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[highlighted]:border-border/65 data-[highlighted]:bg-accent/70 data-[highlighted]:text-foreground data-[highlighted]:shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
90
90
  className
91
91
  )}
92
- {...props}
92
+ {...props}
93
93
  />
94
94
  )
95
95
  }
@@ -108,13 +108,13 @@ function DropdownMenuSubTrigger({
108
108
  }) {
109
109
  return (
110
110
  <MenuPrimitive.SubmenuTrigger
111
- data-slot="dropdown-menu-sub-trigger"
112
- data-inset={inset}
113
- className={cn(
114
- "flex cursor-default items-center gap-2 rounded-xl px-2.5 py-2 text-sm outline-hidden select-none transition-colors focus:bg-accent/80 focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-popup-open:bg-accent/80 data-popup-open:text-accent-foreground data-open:bg-accent/80 data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
111
+ data-slot="dropdown-menu-sub-trigger"
112
+ data-inset={inset}
113
+ className={cn(
114
+ "flex cursor-default items-center gap-2 rounded-[min(var(--radius-xl),16px)] border border-transparent px-3 py-2.5 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] focus:border-border/80 focus:bg-accent/80 focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-popup-open:border-border/80 data-popup-open:bg-accent/80 data-popup-open:text-accent-foreground data-open:border-border/80 data-open:bg-accent/80 data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
115
115
  className
116
116
  )}
117
- {...props}
117
+ {...props}
118
118
  >
119
119
  {children}
120
120
  <ChevronRightIcon className="ml-auto" />
@@ -133,7 +133,7 @@ function DropdownMenuSubContent({
133
133
  return (
134
134
  <DropdownMenuContent
135
135
  data-slot="dropdown-menu-sub-content"
136
- className={cn("w-auto min-w-[112px] rounded-[var(--radius-2xl)] bg-popover/98 p-1.5 text-popover-foreground shadow-[0_22px_60px_color-mix(in_oklch,var(--foreground),transparent_84%)] ring-1 ring-foreground/8 backdrop-blur duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )}
136
+ className={cn("w-auto min-w-[128px] rounded-[var(--radius-2xl)] bg-[linear-gradient(180deg,color-mix(in_oklch,var(--popover),white_10%),var(--popover))] p-2 text-popover-foreground shadow-[0_22px_60px_color-mix(in_oklch,var(--foreground),transparent_84%)] ring-1 ring-foreground/8 backdrop-blur duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )}
137
137
  align={align}
138
138
  alignOffset={alignOffset}
139
139
  side={side}
@@ -154,10 +154,10 @@ function DropdownMenuCheckboxItem({
154
154
  }) {
155
155
  return (
156
156
  <MenuPrimitive.CheckboxItem
157
- data-slot="dropdown-menu-checkbox-item"
158
- data-inset={inset}
159
- className={cn(
160
- "relative flex cursor-default items-center gap-2 rounded-xl py-2 pr-9 pl-2.5 text-sm outline-hidden select-none transition-colors focus:bg-accent/80 focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
157
+ data-slot="dropdown-menu-checkbox-item"
158
+ data-inset={inset}
159
+ className={cn(
160
+ "relative flex cursor-default items-center gap-2 rounded-[min(var(--radius-xl),16px)] border border-transparent py-2.5 pr-9 pl-3 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] focus:border-border/80 focus:bg-accent/80 focus:text-accent-foreground focus:**:text-accent-foreground data-[highlighted]:border-border/65 data-[highlighted]:bg-accent/70 data-[highlighted]:text-foreground data-[highlighted]:shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
161
161
  className
162
162
  )}
163
163
  checked={checked}
@@ -196,10 +196,10 @@ function DropdownMenuRadioItem({
196
196
  }) {
197
197
  return (
198
198
  <MenuPrimitive.RadioItem
199
- data-slot="dropdown-menu-radio-item"
200
- data-inset={inset}
201
- className={cn(
202
- "relative flex cursor-default items-center gap-2 rounded-xl py-2 pr-9 pl-2.5 text-sm outline-hidden select-none transition-colors focus:bg-accent/80 focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
199
+ data-slot="dropdown-menu-radio-item"
200
+ data-inset={inset}
201
+ className={cn(
202
+ "relative flex cursor-default items-center gap-2 rounded-[min(var(--radius-xl),16px)] border border-transparent py-2.5 pr-9 pl-3 text-sm outline-hidden select-none transition-[background-color,border-color,color,box-shadow] focus:border-border/80 focus:bg-accent/80 focus:text-accent-foreground focus:**:text-accent-foreground data-[highlighted]:border-border/65 data-[highlighted]:bg-accent/70 data-[highlighted]:text-foreground data-[highlighted]:shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
203
203
  className
204
204
  )}
205
205
  {...props}
@@ -0,0 +1,49 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ export type HoverCardProps = React.ComponentProps<"div"> & {
6
+ trigger: React.ReactNode
7
+ content: React.ReactNode
8
+ side?: "top" | "right" | "bottom" | "left"
9
+ align?: "start" | "center" | "end"
10
+ contentClassName?: string
11
+ }
12
+
13
+ const sideClassName = {
14
+ top: "bottom-full left-1/2 mb-2 -translate-x-1/2",
15
+ right: "left-full top-1/2 ml-2 -translate-y-1/2",
16
+ bottom: "left-1/2 top-full mt-2 -translate-x-1/2",
17
+ left: "right-full top-1/2 mr-2 -translate-y-1/2",
18
+ }
19
+
20
+ function HoverCard({
21
+ trigger,
22
+ content,
23
+ side = "bottom",
24
+ contentClassName,
25
+ className,
26
+ children,
27
+ ...props
28
+ }: HoverCardProps) {
29
+ return (
30
+ <div data-slot="hover-card" className={cn("group/hover-card relative inline-flex", className)} {...props}>
31
+ <span data-slot="hover-card-trigger" className="inline-flex">
32
+ {trigger}
33
+ </span>
34
+ <div
35
+ data-slot="hover-card-content"
36
+ className={cn(
37
+ "pointer-events-none absolute z-50 min-w-56 rounded-[var(--radius-2xl)] border border-border/80 bg-popover p-4 text-sm text-popover-foreground opacity-0 shadow-xl ring-1 ring-foreground/8 transition group-hover/hover-card:pointer-events-auto group-hover/hover-card:opacity-100 group-focus-within/hover-card:pointer-events-auto group-focus-within/hover-card:opacity-100",
38
+ sideClassName[side],
39
+ contentClassName
40
+ )}
41
+ >
42
+ {content}
43
+ </div>
44
+ {children}
45
+ </div>
46
+ )
47
+ }
48
+
49
+ export { HoverCard }
@@ -0,0 +1,24 @@
1
+ import * as React from "react"
2
+ import { Input as BaseInputPrimitive } from "@base-ui/react/input"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ export type InputPrimitiveProps = React.ComponentProps<"input"> & {
7
+ type?: string
8
+ }
9
+
10
+ function InputPrimitive({ className, type, ...props }: InputPrimitiveProps) {
11
+ return (
12
+ <BaseInputPrimitive
13
+ type={type}
14
+ data-slot="input"
15
+ className={cn(
16
+ "h-10 w-full min-w-0 rounded-[min(var(--radius-xl),16px)] border border-input/90 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--background),white_14%),var(--background))] px-3.5 py-2 text-base text-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.18),0_1px_0_rgba(255,255,255,0.06)] transition-[background-color,border-color,box-shadow,color] outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground/92 hover:border-ring/30 hover:bg-background focus-visible:border-ring focus-visible:bg-background focus-visible:shadow-[0_0_0_1px_color-mix(in_oklch,var(--ring),transparent_45%),0_10px_24px_rgba(15,23,42,0.08)] focus-visible:ring-3 focus-visible:ring-ring/45 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/55 disabled:text-muted-foreground disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:border-white/12 dark:bg-[linear-gradient(180deg,rgba(255,255,255,0.08),rgba(255,255,255,0.05))] dark:hover:bg-white/8 dark:focus-visible:bg-white/8 dark:disabled:bg-white/8 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
17
+ className
18
+ )}
19
+ {...props}
20
+ />
21
+ )
22
+ }
23
+
24
+ export { InputPrimitive }