@enya-learning/nova 0.4.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 (275) hide show
  1. package/Readme.md +418 -0
  2. package/changelog.md +44 -0
  3. package/components.json +23 -0
  4. package/dist/chunks/button-npy7isi3nsvlhf86.js +81 -0
  5. package/dist/chunks/button-npy7isi3nsvlhf86.js.map +1 -0
  6. package/dist/chunks/rolldown-runtime-fifbipqm1abz4ydz.js +30 -0
  7. package/dist/chunks/utils-kyb5nny4y41y7hd8.js +10 -0
  8. package/dist/chunks/utils-kyb5nny4y41y7hd8.js.map +1 -0
  9. package/dist/chunks/vendor-base-ui-efqwzv4oinwg1f0d.js +16049 -0
  10. package/dist/chunks/vendor-base-ui-efqwzv4oinwg1f0d.js.map +1 -0
  11. package/dist/chunks/vendor-styling-eeiy57tyznmxsfky.js +1744 -0
  12. package/dist/chunks/vendor-styling-eeiy57tyznmxsfky.js.map +1 -0
  13. package/dist/components/button.js +6 -0
  14. package/dist/components/enya-logo.js +191 -0
  15. package/dist/components/enya-logo.js.map +1 -0
  16. package/dist/index.js +23499 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/src/components/accordion/accordion.d.ts +6 -0
  19. package/dist/src/components/accordion/index.d.ts +1 -0
  20. package/dist/src/components/alert/alert.d.ts +10 -0
  21. package/dist/src/components/alert/index.d.ts +1 -0
  22. package/dist/src/components/alert-dialog/alert-dialog.d.ts +18 -0
  23. package/dist/src/components/alert-dialog/index.d.ts +1 -0
  24. package/dist/src/components/aspect-ratio/aspect-ratio.d.ts +4 -0
  25. package/dist/src/components/aspect-ratio/index.d.ts +1 -0
  26. package/dist/src/components/avatar/avatar.d.ts +11 -0
  27. package/dist/src/components/avatar/index.d.ts +1 -0
  28. package/dist/src/components/badge/badge.d.ts +7 -0
  29. package/dist/src/components/badge/index.d.ts +1 -0
  30. package/dist/src/components/breadcrumb/breadcrumb.d.ts +10 -0
  31. package/dist/src/components/breadcrumb/index.d.ts +1 -0
  32. package/dist/src/components/button/button.d.ts +8 -0
  33. package/dist/src/components/button/index.d.ts +1 -0
  34. package/dist/src/components/button-group/button-group.d.ts +10 -0
  35. package/dist/src/components/button-group/index.d.ts +1 -0
  36. package/dist/src/components/calendar/calendar.d.ts +10 -0
  37. package/dist/src/components/calendar/index.d.ts +1 -0
  38. package/dist/src/components/card/card.d.ts +11 -0
  39. package/dist/src/components/card/index.d.ts +1 -0
  40. package/dist/src/components/carousel/carousel.d.ts +28 -0
  41. package/dist/src/components/carousel/index.d.ts +1 -0
  42. package/dist/src/components/chart/chart.d.ts +44 -0
  43. package/dist/src/components/chart/index.d.ts +1 -0
  44. package/dist/src/components/checkbox/checkbox.d.ts +3 -0
  45. package/dist/src/components/checkbox/index.d.ts +1 -0
  46. package/dist/src/components/collapsible/collapsible.d.ts +5 -0
  47. package/dist/src/components/collapsible/index.d.ts +1 -0
  48. package/dist/src/components/combobox/combobox.d.ts +24 -0
  49. package/dist/src/components/combobox/index.d.ts +1 -0
  50. package/dist/src/components/command/command.d.ts +19 -0
  51. package/dist/src/components/command/index.d.ts +1 -0
  52. package/dist/src/components/context-menu/context-menu.d.ts +29 -0
  53. package/dist/src/components/context-menu/index.d.ts +1 -0
  54. package/dist/src/components/dialog/dialog.d.ts +17 -0
  55. package/dist/src/components/dialog/index.d.ts +1 -0
  56. package/dist/src/components/direction/direction.d.ts +1 -0
  57. package/dist/src/components/direction/index.d.ts +1 -0
  58. package/dist/src/components/drawer/drawer.d.ts +13 -0
  59. package/dist/src/components/drawer/index.d.ts +1 -0
  60. package/dist/src/components/dropdown-menu/dropdown-menu.d.ts +29 -0
  61. package/dist/src/components/dropdown-menu/index.d.ts +1 -0
  62. package/dist/src/components/empty/empty.d.ts +11 -0
  63. package/dist/src/components/empty/index.d.ts +1 -0
  64. package/dist/src/components/enya-logo/enya-logo.d.ts +121 -0
  65. package/dist/src/components/enya-logo/index.d.ts +1 -0
  66. package/dist/src/components/field/field.d.ts +24 -0
  67. package/dist/src/components/field/index.d.ts +1 -0
  68. package/dist/src/components/hover-card/hover-card.d.ts +5 -0
  69. package/dist/src/components/hover-card/index.d.ts +1 -0
  70. package/dist/src/components/input/index.d.ts +1 -0
  71. package/dist/src/components/input/input.d.ts +3 -0
  72. package/dist/src/components/input-group/index.d.ts +1 -0
  73. package/dist/src/components/input-group/input-group.d.ts +18 -0
  74. package/dist/src/components/input-otp/index.d.ts +1 -0
  75. package/dist/src/components/input-otp/input-otp.d.ts +11 -0
  76. package/dist/src/components/item/index.d.ts +1 -0
  77. package/dist/src/components/item/item.d.ts +22 -0
  78. package/dist/src/components/kbd/index.d.ts +1 -0
  79. package/dist/src/components/kbd/kbd.d.ts +3 -0
  80. package/dist/src/components/label/index.d.ts +1 -0
  81. package/dist/src/components/label/label.d.ts +3 -0
  82. package/dist/src/components/menubar/index.d.ts +1 -0
  83. package/dist/src/components/menubar/menubar.d.ts +29 -0
  84. package/dist/src/components/native-select/index.d.ts +1 -0
  85. package/dist/src/components/native-select/native-select.d.ts +8 -0
  86. package/dist/src/components/navigation-menu/index.d.ts +1 -0
  87. package/dist/src/components/navigation-menu/navigation-menu.d.ts +11 -0
  88. package/dist/src/components/pagination/index.d.ts +1 -0
  89. package/dist/src/components/pagination/pagination.d.ts +17 -0
  90. package/dist/src/components/popover/index.d.ts +1 -0
  91. package/dist/src/components/popover/popover.d.ts +9 -0
  92. package/dist/src/components/progress/index.d.ts +1 -0
  93. package/dist/src/components/progress/progress.d.ts +7 -0
  94. package/dist/src/components/radio-group/index.d.ts +1 -0
  95. package/dist/src/components/radio-group/radio-group.d.ts +5 -0
  96. package/dist/src/components/resizable/index.d.ts +1 -0
  97. package/dist/src/components/resizable/resizable.d.ts +7 -0
  98. package/dist/src/components/scroll-area/index.d.ts +1 -0
  99. package/dist/src/components/scroll-area/scroll-area.d.ts +4 -0
  100. package/dist/src/components/select/index.d.ts +1 -0
  101. package/dist/src/components/select/select.d.ts +15 -0
  102. package/dist/src/components/separator/index.d.ts +1 -0
  103. package/dist/src/components/separator/separator.d.ts +3 -0
  104. package/dist/src/components/sheet/index.d.ts +1 -0
  105. package/dist/src/components/sheet/sheet.d.ts +14 -0
  106. package/dist/src/components/sidebar/index.d.ts +1 -0
  107. package/dist/src/components/sidebar/sidebar.d.ts +63 -0
  108. package/dist/src/components/skeleton/index.d.ts +1 -0
  109. package/dist/src/components/skeleton/skeleton.d.ts +2 -0
  110. package/dist/src/components/slider/index.d.ts +1 -0
  111. package/dist/src/components/slider/slider.d.ts +3 -0
  112. package/dist/src/components/sonner/index.d.ts +1 -0
  113. package/dist/src/components/sonner/sonner.d.ts +3 -0
  114. package/dist/src/components/spinner/index.d.ts +1 -0
  115. package/dist/src/components/spinner/spinner.d.ts +2 -0
  116. package/dist/src/components/switch/index.d.ts +1 -0
  117. package/dist/src/components/switch/switch.d.ts +5 -0
  118. package/dist/src/components/table/index.d.ts +1 -0
  119. package/dist/src/components/table/table.d.ts +10 -0
  120. package/dist/src/components/tabs/index.d.ts +1 -0
  121. package/dist/src/components/tabs/tabs.d.ts +10 -0
  122. package/dist/src/components/textarea/index.d.ts +1 -0
  123. package/dist/src/components/textarea/textarea.d.ts +3 -0
  124. package/dist/src/components/toggle/index.d.ts +1 -0
  125. package/dist/src/components/toggle/toggle.d.ts +8 -0
  126. package/dist/src/components/toggle-group/index.d.ts +1 -0
  127. package/dist/src/components/toggle-group/toggle-group.d.ts +10 -0
  128. package/dist/src/components/tooltip/index.d.ts +1 -0
  129. package/dist/src/components/tooltip/tooltip.d.ts +6 -0
  130. package/dist/src/hooks/use-mobile.d.ts +1 -0
  131. package/dist/src/index.d.ts +57 -0
  132. package/dist/src/lib/utils.d.ts +2 -0
  133. package/dist/src/utils/index.d.ts +1 -0
  134. package/dist/styles/nova-binding.css +290 -0
  135. package/dist/styles/nova.css +58 -0
  136. package/dist/styles/theme-nova.css +201 -0
  137. package/dist/styles/typography.css +215 -0
  138. package/dist/utils.js +5 -0
  139. package/eslint.config.js +30 -0
  140. package/package.json +94 -0
  141. package/plopfile.mjs +49 -0
  142. package/src/components/.gitkeep +0 -0
  143. package/src/components/accordion/accordion.mdx +83 -0
  144. package/src/components/accordion/accordion.tsx +81 -0
  145. package/src/components/accordion/index.ts +1 -0
  146. package/src/components/alert/alert.tsx +76 -0
  147. package/src/components/alert/index.ts +1 -0
  148. package/src/components/alert-dialog/alert-dialog.tsx +187 -0
  149. package/src/components/alert-dialog/index.ts +1 -0
  150. package/src/components/aspect-ratio/aspect-ratio.tsx +22 -0
  151. package/src/components/aspect-ratio/index.ts +1 -0
  152. package/src/components/avatar/avatar.tsx +107 -0
  153. package/src/components/avatar/index.ts +1 -0
  154. package/src/components/badge/badge.tsx +52 -0
  155. package/src/components/badge/index.ts +1 -0
  156. package/src/components/breadcrumb/breadcrumb.tsx +122 -0
  157. package/src/components/breadcrumb/index.ts +1 -0
  158. package/src/components/button/button.mdx +255 -0
  159. package/src/components/button/button.tsx +59 -0
  160. package/src/components/button/index.ts +1 -0
  161. package/src/components/button-group/button-group.tsx +87 -0
  162. package/src/components/button-group/index.ts +1 -0
  163. package/src/components/calendar/calendar.tsx +228 -0
  164. package/src/components/calendar/index.ts +1 -0
  165. package/src/components/card/card.tsx +100 -0
  166. package/src/components/card/index.ts +1 -0
  167. package/src/components/carousel/carousel.tsx +243 -0
  168. package/src/components/carousel/index.ts +1 -0
  169. package/src/components/chart/chart.tsx +371 -0
  170. package/src/components/chart/index.ts +1 -0
  171. package/src/components/checkbox/checkbox.tsx +28 -0
  172. package/src/components/checkbox/index.ts +1 -0
  173. package/src/components/collapsible/collapsible.tsx +19 -0
  174. package/src/components/collapsible/index.ts +1 -0
  175. package/src/components/combobox/combobox.tsx +298 -0
  176. package/src/components/combobox/index.ts +1 -0
  177. package/src/components/command/command.tsx +193 -0
  178. package/src/components/command/index.ts +1 -0
  179. package/src/components/context-menu/context-menu.tsx +272 -0
  180. package/src/components/context-menu/index.ts +1 -0
  181. package/src/components/dialog/dialog.tsx +157 -0
  182. package/src/components/dialog/index.ts +1 -0
  183. package/src/components/direction/direction.tsx +4 -0
  184. package/src/components/direction/index.ts +1 -0
  185. package/src/components/drawer/drawer.tsx +134 -0
  186. package/src/components/drawer/index.ts +1 -0
  187. package/src/components/dropdown-menu/dropdown-menu.tsx +270 -0
  188. package/src/components/dropdown-menu/index.ts +1 -0
  189. package/src/components/empty/empty.tsx +104 -0
  190. package/src/components/empty/index.ts +1 -0
  191. package/src/components/enya-logo/enya-logo.mdx +174 -0
  192. package/src/components/enya-logo/enya-logo.tsx +383 -0
  193. package/src/components/enya-logo/index.ts +1 -0
  194. package/src/components/field/field.tsx +236 -0
  195. package/src/components/field/index.ts +1 -0
  196. package/src/components/hover-card/hover-card.tsx +51 -0
  197. package/src/components/hover-card/index.ts +1 -0
  198. package/src/components/input/index.ts +1 -0
  199. package/src/components/input/input.tsx +20 -0
  200. package/src/components/input-group/index.ts +1 -0
  201. package/src/components/input-group/input-group.tsx +157 -0
  202. package/src/components/input-otp/index.ts +1 -0
  203. package/src/components/input-otp/input-otp.tsx +84 -0
  204. package/src/components/item/index.ts +1 -0
  205. package/src/components/item/item.tsx +201 -0
  206. package/src/components/kbd/index.ts +1 -0
  207. package/src/components/kbd/kbd.tsx +26 -0
  208. package/src/components/label/index.ts +1 -0
  209. package/src/components/label/label.tsx +20 -0
  210. package/src/components/menubar/index.ts +1 -0
  211. package/src/components/menubar/menubar.tsx +281 -0
  212. package/src/components/native-select/index.ts +1 -0
  213. package/src/components/native-select/native-select.tsx +65 -0
  214. package/src/components/navigation-menu/index.ts +1 -0
  215. package/src/components/navigation-menu/navigation-menu.tsx +171 -0
  216. package/src/components/pagination/index.ts +1 -0
  217. package/src/components/pagination/pagination.tsx +133 -0
  218. package/src/components/popover/index.ts +1 -0
  219. package/src/components/popover/popover.tsx +88 -0
  220. package/src/components/progress/index.ts +1 -0
  221. package/src/components/progress/progress.tsx +83 -0
  222. package/src/components/radio-group/index.ts +1 -0
  223. package/src/components/radio-group/radio-group.tsx +36 -0
  224. package/src/components/resizable/index.ts +1 -0
  225. package/src/components/resizable/resizable.tsx +50 -0
  226. package/src/components/scroll-area/index.ts +1 -0
  227. package/src/components/scroll-area/scroll-area.tsx +53 -0
  228. package/src/components/select/index.ts +1 -0
  229. package/src/components/select/select.tsx +205 -0
  230. package/src/components/separator/index.ts +1 -0
  231. package/src/components/separator/separator.tsx +23 -0
  232. package/src/components/sheet/index.ts +1 -0
  233. package/src/components/sheet/sheet.tsx +137 -0
  234. package/src/components/sidebar/index.ts +1 -0
  235. package/src/components/sidebar/sidebar.tsx +722 -0
  236. package/src/components/skeleton/index.ts +1 -0
  237. package/src/components/skeleton/skeleton.tsx +13 -0
  238. package/src/components/slider/index.ts +1 -0
  239. package/src/components/slider/slider.tsx +52 -0
  240. package/src/components/sonner/index.ts +1 -0
  241. package/src/components/sonner/sonner.tsx +45 -0
  242. package/src/components/spinner/index.ts +1 -0
  243. package/src/components/spinner/spinner.tsx +15 -0
  244. package/src/components/switch/index.ts +1 -0
  245. package/src/components/switch/switch.tsx +30 -0
  246. package/src/components/table/index.ts +1 -0
  247. package/src/components/table/table.tsx +116 -0
  248. package/src/components/tabs/index.ts +1 -0
  249. package/src/components/tabs/tabs.tsx +80 -0
  250. package/src/components/textarea/index.ts +1 -0
  251. package/src/components/textarea/textarea.tsx +18 -0
  252. package/src/components/toggle/index.ts +1 -0
  253. package/src/components/toggle/toggle.tsx +45 -0
  254. package/src/components/toggle-group/index.ts +1 -0
  255. package/src/components/toggle-group/toggle-group.tsx +87 -0
  256. package/src/components/tooltip/index.ts +1 -0
  257. package/src/components/tooltip/tooltip.tsx +64 -0
  258. package/src/eslint/index.js +13 -0
  259. package/src/eslint/no-primitive-colors.js +158 -0
  260. package/src/hooks/use-mobile.ts +21 -0
  261. package/src/index.ts +58 -0
  262. package/src/lib/.gitkeep +0 -0
  263. package/src/lib/utils.ts +6 -0
  264. package/src/styles/globals.css +77 -0
  265. package/src/styles/nova-binding.css +290 -0
  266. package/src/styles/nova.css +58 -0
  267. package/src/styles/theme-nova.css +201 -0
  268. package/src/styles/typography.css +215 -0
  269. package/src/utils/index.ts +1 -0
  270. package/templates/component/component.tsx.hbs +16 -0
  271. package/templates/component/index.ts.hbs +1 -0
  272. package/templates/component/stories.tsx.hbs +13 -0
  273. package/tsconfig.json +18 -0
  274. package/tsconfig.lint.json +14 -0
  275. package/vite.config.ts +101 -0
@@ -0,0 +1 @@
1
+ export * from "./chart"
@@ -0,0 +1,28 @@
1
+ "use client"
2
+
3
+ import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox"
4
+
5
+ import { cn } from "../../lib/utils"
6
+ import { CheckIcon } from "lucide-react"
7
+
8
+ function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
9
+ return (
10
+ <CheckboxPrimitive.Root
11
+ data-slot="checkbox"
12
+ className={cn(
13
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-[6px] border border-input transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
14
+ className
15
+ )}
16
+ {...props}
17
+ >
18
+ <CheckboxPrimitive.Indicator
19
+ data-slot="checkbox-indicator"
20
+ className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
21
+ >
22
+ <CheckIcon />
23
+ </CheckboxPrimitive.Indicator>
24
+ </CheckboxPrimitive.Root>
25
+ )
26
+ }
27
+
28
+ export { Checkbox }
@@ -0,0 +1 @@
1
+ export * from "./checkbox"
@@ -0,0 +1,19 @@
1
+ import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible"
2
+
3
+ function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
4
+ return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
5
+ }
6
+
7
+ function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {
8
+ return (
9
+ <CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />
10
+ )
11
+ }
12
+
13
+ function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {
14
+ return (
15
+ <CollapsiblePrimitive.Panel data-slot="collapsible-content" {...props} />
16
+ )
17
+ }
18
+
19
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent }
@@ -0,0 +1 @@
1
+ export * from "./collapsible"
@@ -0,0 +1,298 @@
1
+ import * as React from "react"
2
+ import { Combobox as ComboboxPrimitive } from "@base-ui/react"
3
+
4
+ import { cn } from "../../lib/utils"
5
+ import { Button } from "../button"
6
+ import {
7
+ InputGroup,
8
+ InputGroupAddon,
9
+ InputGroupButton,
10
+ InputGroupInput,
11
+ } from "../input-group"
12
+ import { ChevronDownIcon, XIcon, CheckIcon } from "lucide-react"
13
+
14
+ const Combobox = ComboboxPrimitive.Root
15
+
16
+ function ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {
17
+ return <ComboboxPrimitive.Value data-slot="combobox-value" {...props} />
18
+ }
19
+
20
+ function ComboboxTrigger({
21
+ className,
22
+ children,
23
+ ...props
24
+ }: ComboboxPrimitive.Trigger.Props) {
25
+ return (
26
+ <ComboboxPrimitive.Trigger
27
+ data-slot="combobox-trigger"
28
+ className={cn("[&_svg:not([class*='size-'])]:size-4", className)}
29
+ {...props}
30
+ >
31
+ {children}
32
+ <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" />
33
+ </ComboboxPrimitive.Trigger>
34
+ )
35
+ }
36
+
37
+ function ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {
38
+ return (
39
+ <ComboboxPrimitive.Clear
40
+ data-slot="combobox-clear"
41
+ render={<InputGroupButton variant="ghost" size="icon-xs" />}
42
+ className={cn(className)}
43
+ {...props}
44
+ >
45
+ <XIcon className="pointer-events-none" />
46
+ </ComboboxPrimitive.Clear>
47
+ )
48
+ }
49
+
50
+ function ComboboxInput({
51
+ className,
52
+ children,
53
+ disabled = false,
54
+ showTrigger = true,
55
+ showClear = false,
56
+ ...props
57
+ }: ComboboxPrimitive.Input.Props & {
58
+ showTrigger?: boolean
59
+ showClear?: boolean
60
+ }) {
61
+ return (
62
+ <InputGroup className={cn("w-auto", className)}>
63
+ <ComboboxPrimitive.Input
64
+ render={<InputGroupInput disabled={disabled} />}
65
+ {...props}
66
+ />
67
+ <InputGroupAddon align="inline-end">
68
+ {showTrigger && (
69
+ <InputGroupButton
70
+ size="icon-xs"
71
+ variant="ghost"
72
+ render={<ComboboxTrigger />}
73
+ data-slot="input-group-button"
74
+ className="group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent"
75
+ disabled={disabled}
76
+ />
77
+ )}
78
+ {showClear && <ComboboxClear disabled={disabled} />}
79
+ </InputGroupAddon>
80
+ {children}
81
+ </InputGroup>
82
+ )
83
+ }
84
+
85
+ function ComboboxContent({
86
+ className,
87
+ side = "bottom",
88
+ sideOffset = 6,
89
+ align = "start",
90
+ alignOffset = 0,
91
+ anchor,
92
+ ...props
93
+ }: ComboboxPrimitive.Popup.Props &
94
+ Pick<
95
+ ComboboxPrimitive.Positioner.Props,
96
+ "side" | "align" | "sideOffset" | "alignOffset" | "anchor"
97
+ >) {
98
+ return (
99
+ <ComboboxPrimitive.Portal>
100
+ <ComboboxPrimitive.Positioner
101
+ side={side}
102
+ sideOffset={sideOffset}
103
+ align={align}
104
+ alignOffset={alignOffset}
105
+ anchor={anchor}
106
+ className="isolate z-50"
107
+ >
108
+ <ComboboxPrimitive.Popup
109
+ data-slot="combobox-content"
110
+ data-chips={!!anchor}
111
+ className={cn(
112
+ "group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-2xl bg-popover text-popover-foreground shadow-2xl ring-1 ring-foreground/5 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-start-2 data-[side=inline-start]:slide-in-from-end-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-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-9 *:data-[slot=input-group]:border-none *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none 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",
113
+ className
114
+ )}
115
+ {...props}
116
+ />
117
+ </ComboboxPrimitive.Positioner>
118
+ </ComboboxPrimitive.Portal>
119
+ )
120
+ }
121
+
122
+ function ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {
123
+ return (
124
+ <ComboboxPrimitive.List
125
+ data-slot="combobox-list"
126
+ className={cn(
127
+ "no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0",
128
+ className
129
+ )}
130
+ {...props}
131
+ />
132
+ )
133
+ }
134
+
135
+ function ComboboxItem({
136
+ className,
137
+ children,
138
+ ...props
139
+ }: ComboboxPrimitive.Item.Props) {
140
+ return (
141
+ <ComboboxPrimitive.Item
142
+ data-slot="combobox-item"
143
+ className={cn(
144
+ "relative flex w-full cursor-default items-center gap-2.5 rounded-xl py-2 ps-3 pe-8 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
145
+ className
146
+ )}
147
+ {...props}
148
+ >
149
+ {children}
150
+ <ComboboxPrimitive.ItemIndicator
151
+ render={
152
+ <span className="pointer-events-none absolute end-2 flex size-4 items-center justify-center" />
153
+ }
154
+ >
155
+ <CheckIcon className="pointer-events-none" />
156
+ </ComboboxPrimitive.ItemIndicator>
157
+ </ComboboxPrimitive.Item>
158
+ )
159
+ }
160
+
161
+ function ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {
162
+ return (
163
+ <ComboboxPrimitive.Group
164
+ data-slot="combobox-group"
165
+ className={cn(className)}
166
+ {...props}
167
+ />
168
+ )
169
+ }
170
+
171
+ function ComboboxLabel({
172
+ className,
173
+ ...props
174
+ }: ComboboxPrimitive.GroupLabel.Props) {
175
+ return (
176
+ <ComboboxPrimitive.GroupLabel
177
+ data-slot="combobox-label"
178
+ className={cn("px-3.5 py-2.5 text-xs text-muted-foreground", className)}
179
+ {...props}
180
+ />
181
+ )
182
+ }
183
+
184
+ function ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {
185
+ return (
186
+ <ComboboxPrimitive.Collection data-slot="combobox-collection" {...props} />
187
+ )
188
+ }
189
+
190
+ function ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {
191
+ return (
192
+ <ComboboxPrimitive.Empty
193
+ data-slot="combobox-empty"
194
+ className={cn(
195
+ "hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex",
196
+ className
197
+ )}
198
+ {...props}
199
+ />
200
+ )
201
+ }
202
+
203
+ function ComboboxSeparator({
204
+ className,
205
+ ...props
206
+ }: ComboboxPrimitive.Separator.Props) {
207
+ return (
208
+ <ComboboxPrimitive.Separator
209
+ data-slot="combobox-separator"
210
+ className={cn("-mx-1 my-1 h-px bg-border/50", className)}
211
+ {...props}
212
+ />
213
+ )
214
+ }
215
+
216
+ function ComboboxChips({
217
+ className,
218
+ ...props
219
+ }: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &
220
+ ComboboxPrimitive.Chips.Props) {
221
+ return (
222
+ <ComboboxPrimitive.Chips
223
+ data-slot="combobox-chips"
224
+ className={cn(
225
+ "flex min-h-9 flex-wrap items-center gap-1.5 rounded-4xl border border-input bg-input/30 bg-clip-padding px-2.5 py-1.5 text-sm transition-colors focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40",
226
+ className
227
+ )}
228
+ {...props}
229
+ />
230
+ )
231
+ }
232
+
233
+ function ComboboxChip({
234
+ className,
235
+ children,
236
+ showRemove = true,
237
+ ...props
238
+ }: ComboboxPrimitive.Chip.Props & {
239
+ showRemove?: boolean
240
+ }) {
241
+ return (
242
+ <ComboboxPrimitive.Chip
243
+ data-slot="combobox-chip"
244
+ className={cn(
245
+ "flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-4xl bg-muted-foreground/10 px-2 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pe-0",
246
+ className
247
+ )}
248
+ {...props}
249
+ >
250
+ {children}
251
+ {showRemove && (
252
+ <ComboboxPrimitive.ChipRemove
253
+ render={<Button variant="ghost" size="icon-xs" />}
254
+ className="-ms-1 opacity-50 hover:opacity-100"
255
+ data-slot="combobox-chip-remove"
256
+ >
257
+ <XIcon className="pointer-events-none" />
258
+ </ComboboxPrimitive.ChipRemove>
259
+ )}
260
+ </ComboboxPrimitive.Chip>
261
+ )
262
+ }
263
+
264
+ function ComboboxChipsInput({
265
+ className,
266
+ ...props
267
+ }: ComboboxPrimitive.Input.Props) {
268
+ return (
269
+ <ComboboxPrimitive.Input
270
+ data-slot="combobox-chip-input"
271
+ className={cn("min-w-16 flex-1 outline-none", className)}
272
+ {...props}
273
+ />
274
+ )
275
+ }
276
+
277
+ function useComboboxAnchor() {
278
+ return React.useRef<HTMLDivElement | null>(null)
279
+ }
280
+
281
+ export {
282
+ Combobox,
283
+ ComboboxInput,
284
+ ComboboxContent,
285
+ ComboboxList,
286
+ ComboboxItem,
287
+ ComboboxGroup,
288
+ ComboboxLabel,
289
+ ComboboxCollection,
290
+ ComboboxEmpty,
291
+ ComboboxSeparator,
292
+ ComboboxChips,
293
+ ComboboxChip,
294
+ ComboboxChipsInput,
295
+ ComboboxTrigger,
296
+ ComboboxValue,
297
+ useComboboxAnchor,
298
+ }
@@ -0,0 +1 @@
1
+ export * from "./combobox"
@@ -0,0 +1,193 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Command as CommandPrimitive } from "cmdk"
5
+
6
+ import { cn } from "../../lib/utils"
7
+ import {
8
+ Dialog,
9
+ DialogContent,
10
+ DialogDescription,
11
+ DialogHeader,
12
+ DialogTitle,
13
+ } from "../dialog"
14
+ import { InputGroup, InputGroupAddon } from "../input-group"
15
+ import { SearchIcon, CheckIcon } from "lucide-react"
16
+
17
+ function Command({
18
+ className,
19
+ ...props
20
+ }: React.ComponentProps<typeof CommandPrimitive>) {
21
+ return (
22
+ <CommandPrimitive
23
+ data-slot="command"
24
+ className={cn(
25
+ "flex size-full flex-col overflow-hidden rounded-4xl bg-popover p-1 text-popover-foreground",
26
+ className
27
+ )}
28
+ {...props}
29
+ />
30
+ )
31
+ }
32
+
33
+ function CommandDialog({
34
+ title = "Command Palette",
35
+ description = "Search for a command to run...",
36
+ children,
37
+ className,
38
+ showCloseButton = false,
39
+ ...props
40
+ }: Omit<React.ComponentProps<typeof Dialog>, "children"> & {
41
+ title?: string
42
+ description?: string
43
+ className?: string
44
+ showCloseButton?: boolean
45
+ children: React.ReactNode
46
+ }) {
47
+ return (
48
+ <Dialog {...props}>
49
+ <DialogHeader className="sr-only">
50
+ <DialogTitle>{title}</DialogTitle>
51
+ <DialogDescription>{description}</DialogDescription>
52
+ </DialogHeader>
53
+ <DialogContent
54
+ className={cn(
55
+ "top-1/3 translate-y-0 overflow-hidden rounded-4xl! p-0",
56
+ className
57
+ )}
58
+ showCloseButton={showCloseButton}
59
+ >
60
+ {children}
61
+ </DialogContent>
62
+ </Dialog>
63
+ )
64
+ }
65
+
66
+ function CommandInput({
67
+ className,
68
+ ...props
69
+ }: React.ComponentProps<typeof CommandPrimitive.Input>) {
70
+ return (
71
+ <div data-slot="command-input-wrapper" className="p-1 pb-0">
72
+ <InputGroup className="h-9 bg-input/30">
73
+ <CommandPrimitive.Input
74
+ data-slot="command-input"
75
+ className={cn(
76
+ "w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ <InputGroupAddon>
82
+ <SearchIcon className="size-4 shrink-0 opacity-50" />
83
+ </InputGroupAddon>
84
+ </InputGroup>
85
+ </div>
86
+ )
87
+ }
88
+
89
+ function CommandList({
90
+ className,
91
+ ...props
92
+ }: React.ComponentProps<typeof CommandPrimitive.List>) {
93
+ return (
94
+ <CommandPrimitive.List
95
+ data-slot="command-list"
96
+ className={cn(
97
+ "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",
98
+ className
99
+ )}
100
+ {...props}
101
+ />
102
+ )
103
+ }
104
+
105
+ function CommandEmpty({
106
+ className,
107
+ ...props
108
+ }: React.ComponentProps<typeof CommandPrimitive.Empty>) {
109
+ return (
110
+ <CommandPrimitive.Empty
111
+ data-slot="command-empty"
112
+ className={cn("py-6 text-center text-sm", className)}
113
+ {...props}
114
+ />
115
+ )
116
+ }
117
+
118
+ function CommandGroup({
119
+ className,
120
+ ...props
121
+ }: React.ComponentProps<typeof CommandPrimitive.Group>) {
122
+ return (
123
+ <CommandPrimitive.Group
124
+ data-slot="command-group"
125
+ className={cn(
126
+ "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-3 **:[[cmdk-group-heading]]:py-2 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
127
+ className
128
+ )}
129
+ {...props}
130
+ />
131
+ )
132
+ }
133
+
134
+ function CommandSeparator({
135
+ className,
136
+ ...props
137
+ }: React.ComponentProps<typeof CommandPrimitive.Separator>) {
138
+ return (
139
+ <CommandPrimitive.Separator
140
+ data-slot="command-separator"
141
+ className={cn("my-1 h-px bg-border/50", className)}
142
+ {...props}
143
+ />
144
+ )
145
+ }
146
+
147
+ function CommandItem({
148
+ className,
149
+ children,
150
+ ...props
151
+ }: React.ComponentProps<typeof CommandPrimitive.Item>) {
152
+ return (
153
+ <CommandPrimitive.Item
154
+ data-slot="command-item"
155
+ className={cn(
156
+ "group/command-item relative flex cursor-default items-center gap-2 rounded-lg px-3 py-2 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-2xl data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",
157
+ className
158
+ )}
159
+ {...props}
160
+ >
161
+ {children}
162
+ <CheckIcon className="ms-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100" />
163
+ </CommandPrimitive.Item>
164
+ )
165
+ }
166
+
167
+ function CommandShortcut({
168
+ className,
169
+ ...props
170
+ }: React.ComponentProps<"span">) {
171
+ return (
172
+ <span
173
+ data-slot="command-shortcut"
174
+ className={cn(
175
+ "ms-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
176
+ className
177
+ )}
178
+ {...props}
179
+ />
180
+ )
181
+ }
182
+
183
+ export {
184
+ Command,
185
+ CommandDialog,
186
+ CommandInput,
187
+ CommandList,
188
+ CommandEmpty,
189
+ CommandGroup,
190
+ CommandItem,
191
+ CommandShortcut,
192
+ CommandSeparator,
193
+ }
@@ -0,0 +1 @@
1
+ export * from "./command"