@arolariu/components 1.1.0 → 2.0.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 (325) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/components/ui/accordion.js +3 -3
  3. package/dist/components/ui/accordion.js.map +1 -1
  4. package/dist/components/ui/accordion_module.css.map +1 -1
  5. package/dist/components/ui/alert-dialog.js +8 -8
  6. package/dist/components/ui/alert-dialog.js.map +1 -1
  7. package/dist/components/ui/alert-dialog_module.css +1 -1
  8. package/dist/components/ui/alert-dialog_module.css.map +1 -1
  9. package/dist/components/ui/alert.js +4 -4
  10. package/dist/components/ui/alert.js.map +1 -1
  11. package/dist/components/ui/alert_module.css.map +1 -1
  12. package/dist/components/ui/aspect-ratio.js +2 -2
  13. package/dist/components/ui/aspect-ratio.js.map +1 -1
  14. package/dist/components/ui/aspect-ratio_module.css.map +1 -1
  15. package/dist/components/ui/async-boundary.js +2 -2
  16. package/dist/components/ui/async-boundary.js.map +1 -1
  17. package/dist/components/ui/avatar.js +4 -4
  18. package/dist/components/ui/avatar.js.map +1 -1
  19. package/dist/components/ui/avatar_module.css.map +1 -1
  20. package/dist/components/ui/background-beams.js +3 -3
  21. package/dist/components/ui/background-beams.js.map +1 -1
  22. package/dist/components/ui/background-beams_module.css.map +1 -1
  23. package/dist/components/ui/badge.js +2 -2
  24. package/dist/components/ui/badge.js.map +1 -1
  25. package/dist/components/ui/badge_module.css.map +1 -1
  26. package/dist/components/ui/breadcrumb.js +10 -10
  27. package/dist/components/ui/breadcrumb.js.map +1 -1
  28. package/dist/components/ui/breadcrumb_module.css.map +1 -1
  29. package/dist/components/ui/bubble-background.js +5 -5
  30. package/dist/components/ui/bubble-background.js.map +1 -1
  31. package/dist/components/ui/bubble-background_module.css.map +1 -1
  32. package/dist/components/ui/button-group.js +6 -6
  33. package/dist/components/ui/button-group.js.map +1 -1
  34. package/dist/components/ui/button-group_module.css.map +1 -1
  35. package/dist/components/ui/button.js +4 -4
  36. package/dist/components/ui/button.js.map +1 -1
  37. package/dist/components/ui/button_module.css.map +1 -1
  38. package/dist/components/ui/calendar.d.ts +2 -1
  39. package/dist/components/ui/calendar.d.ts.map +1 -1
  40. package/dist/components/ui/calendar.js +4 -4
  41. package/dist/components/ui/calendar.js.map +1 -1
  42. package/dist/components/ui/calendar_module.css.map +1 -1
  43. package/dist/components/ui/card-skeleton.js +2 -2
  44. package/dist/components/ui/card-skeleton.js.map +1 -1
  45. package/dist/components/ui/card-skeleton_module.css.map +1 -1
  46. package/dist/components/ui/card.js +8 -8
  47. package/dist/components/ui/card.js.map +1 -1
  48. package/dist/components/ui/card_module.css.map +1 -1
  49. package/dist/components/ui/carousel.js +16 -16
  50. package/dist/components/ui/carousel.js.map +1 -1
  51. package/dist/components/ui/carousel_module.css +1 -1
  52. package/dist/components/ui/carousel_module.css.map +1 -1
  53. package/dist/components/ui/chart.d.ts +6 -3
  54. package/dist/components/ui/chart.d.ts.map +1 -1
  55. package/dist/components/ui/chart.js +70 -136
  56. package/dist/components/ui/chart.js.map +1 -1
  57. package/dist/components/ui/chart_module.css.map +1 -1
  58. package/dist/components/ui/checkbox-group.js +2 -2
  59. package/dist/components/ui/checkbox-group.js.map +1 -1
  60. package/dist/components/ui/checkbox-group_module.css.map +1 -1
  61. package/dist/components/ui/checkbox.js +2 -2
  62. package/dist/components/ui/checkbox.js.map +1 -1
  63. package/dist/components/ui/checkbox_module.css.map +1 -1
  64. package/dist/components/ui/collapsible.js +4 -4
  65. package/dist/components/ui/collapsible.js.map +1 -1
  66. package/dist/components/ui/collapsible_module.css.map +1 -1
  67. package/dist/components/ui/combobox.js +13 -13
  68. package/dist/components/ui/combobox.js.map +1 -1
  69. package/dist/components/ui/combobox_module.css.map +1 -1
  70. package/dist/components/ui/command.js +40 -40
  71. package/dist/components/ui/command.js.map +1 -1
  72. package/dist/components/ui/command_module.css +1 -1
  73. package/dist/components/ui/command_module.css.map +1 -1
  74. package/dist/components/ui/context-menu.js +6 -6
  75. package/dist/components/ui/context-menu.js.map +1 -1
  76. package/dist/components/ui/context-menu_module.css.map +1 -1
  77. package/dist/components/ui/copy-button.js +6 -6
  78. package/dist/components/ui/copy-button.js.map +1 -1
  79. package/dist/components/ui/copy-button_module.css.map +1 -1
  80. package/dist/components/ui/counting-number.js +6 -6
  81. package/dist/components/ui/counting-number.js.map +1 -1
  82. package/dist/components/ui/counting-number_module.css.map +1 -1
  83. package/dist/components/ui/dialog.js +6 -6
  84. package/dist/components/ui/dialog.js.map +1 -1
  85. package/dist/components/ui/dialog_module.css +1 -1
  86. package/dist/components/ui/dialog_module.css.map +1 -1
  87. package/dist/components/ui/dot-background_module.css.map +1 -1
  88. package/dist/components/ui/drawer.js +5 -5
  89. package/dist/components/ui/drawer.js.map +1 -1
  90. package/dist/components/ui/drawer_module.css.map +1 -1
  91. package/dist/components/ui/dropdown-menu.js +6 -6
  92. package/dist/components/ui/dropdown-menu.js.map +1 -1
  93. package/dist/components/ui/dropdown-menu_module.css.map +1 -1
  94. package/dist/components/ui/dropdrawer.js +52 -52
  95. package/dist/components/ui/dropdrawer.js.map +1 -1
  96. package/dist/components/ui/dropdrawer_module.css.map +1 -1
  97. package/dist/components/ui/empty.js +7 -7
  98. package/dist/components/ui/empty.js.map +1 -1
  99. package/dist/components/ui/empty_module.css.map +1 -1
  100. package/dist/components/ui/error-boundary.js +2 -2
  101. package/dist/components/ui/error-boundary.js.map +1 -1
  102. package/dist/components/ui/error-boundary_module.css.map +1 -1
  103. package/dist/components/ui/field.js +12 -12
  104. package/dist/components/ui/field.js.map +1 -1
  105. package/dist/components/ui/field_module.css.map +1 -1
  106. package/dist/components/ui/fireworks-background.js +6 -6
  107. package/dist/components/ui/fireworks-background.js.map +1 -1
  108. package/dist/components/ui/fireworks-background_module.css.map +1 -1
  109. package/dist/components/ui/flip-button.js +5 -5
  110. package/dist/components/ui/flip-button.js.map +1 -1
  111. package/dist/components/ui/flip-button_module.css.map +1 -1
  112. package/dist/components/ui/focus-scope.js +6 -6
  113. package/dist/components/ui/focus-scope.js.map +1 -1
  114. package/dist/components/ui/focus-scope_module.css.map +1 -1
  115. package/dist/components/ui/form-skeleton.js +2 -2
  116. package/dist/components/ui/form-skeleton.js.map +1 -1
  117. package/dist/components/ui/form-skeleton_module.css.map +1 -1
  118. package/dist/components/ui/form.d.ts +3 -3
  119. package/dist/components/ui/form.d.ts.map +1 -1
  120. package/dist/components/ui/form.js +13 -13
  121. package/dist/components/ui/form.js.map +1 -1
  122. package/dist/components/ui/form_module.css.map +1 -1
  123. package/dist/components/ui/gradient-background.js +2 -2
  124. package/dist/components/ui/gradient-background.js.map +1 -1
  125. package/dist/components/ui/gradient-background_module.css.map +1 -1
  126. package/dist/components/ui/gradient-text.js +2 -2
  127. package/dist/components/ui/gradient-text.js.map +1 -1
  128. package/dist/components/ui/gradient-text_module.css.map +1 -1
  129. package/dist/components/ui/highlight-text.js +4 -4
  130. package/dist/components/ui/highlight-text.js.map +1 -1
  131. package/dist/components/ui/highlight-text_module.css.map +1 -1
  132. package/dist/components/ui/hole-background.js +21 -21
  133. package/dist/components/ui/hole-background.js.map +1 -1
  134. package/dist/components/ui/hole-background_module.css.map +1 -1
  135. package/dist/components/ui/hover-card.js +3 -3
  136. package/dist/components/ui/hover-card.js.map +1 -1
  137. package/dist/components/ui/hover-card_module.css.map +1 -1
  138. package/dist/components/ui/input-group.js +7 -7
  139. package/dist/components/ui/input-group.js.map +1 -1
  140. package/dist/components/ui/input-group_module.css.map +1 -1
  141. package/dist/components/ui/input-otp.d.ts +3 -3
  142. package/dist/components/ui/input-otp.d.ts.map +1 -1
  143. package/dist/components/ui/input-otp.js +6 -6
  144. package/dist/components/ui/input-otp.js.map +1 -1
  145. package/dist/components/ui/input-otp_module.css.map +1 -1
  146. package/dist/components/ui/input.js +2 -2
  147. package/dist/components/ui/input.js.map +1 -1
  148. package/dist/components/ui/input_module.css.map +1 -1
  149. package/dist/components/ui/item.js +13 -13
  150. package/dist/components/ui/item.js.map +1 -1
  151. package/dist/components/ui/item_module.css.map +1 -1
  152. package/dist/components/ui/kbd.js +3 -3
  153. package/dist/components/ui/kbd.js.map +1 -1
  154. package/dist/components/ui/kbd_module.css.map +1 -1
  155. package/dist/components/ui/label.js +2 -2
  156. package/dist/components/ui/label.js.map +1 -1
  157. package/dist/components/ui/label_module.css.map +1 -1
  158. package/dist/components/ui/list-skeleton.js +2 -2
  159. package/dist/components/ui/list-skeleton.js.map +1 -1
  160. package/dist/components/ui/list-skeleton_module.css.map +1 -1
  161. package/dist/components/ui/loading-overlay.js +2 -2
  162. package/dist/components/ui/loading-overlay.js.map +1 -1
  163. package/dist/components/ui/loading-overlay_module.css.map +1 -1
  164. package/dist/components/ui/menubar.js +4 -4
  165. package/dist/components/ui/menubar.js.map +1 -1
  166. package/dist/components/ui/menubar_module.css.map +1 -1
  167. package/dist/components/ui/meter.js +5 -5
  168. package/dist/components/ui/meter.js.map +1 -1
  169. package/dist/components/ui/meter_module.css.map +1 -1
  170. package/dist/components/ui/navigation-menu.js +5 -5
  171. package/dist/components/ui/navigation-menu.js.map +1 -1
  172. package/dist/components/ui/navigation-menu_module.css +1 -1
  173. package/dist/components/ui/navigation-menu_module.css.map +1 -1
  174. package/dist/components/ui/number-field.js +3 -3
  175. package/dist/components/ui/number-field.js.map +1 -1
  176. package/dist/components/ui/number-field_module.css.map +1 -1
  177. package/dist/components/ui/pagination.js +8 -8
  178. package/dist/components/ui/pagination.js.map +1 -1
  179. package/dist/components/ui/pagination_module.css.map +1 -1
  180. package/dist/components/ui/popover.js +5 -5
  181. package/dist/components/ui/popover.js.map +1 -1
  182. package/dist/components/ui/popover_module.css.map +1 -1
  183. package/dist/components/ui/progress.js +2 -2
  184. package/dist/components/ui/progress.js.map +1 -1
  185. package/dist/components/ui/progress_module.css.map +1 -1
  186. package/dist/components/ui/radio-group.js +3 -3
  187. package/dist/components/ui/radio-group.js.map +1 -1
  188. package/dist/components/ui/radio-group_module.css.map +1 -1
  189. package/dist/components/ui/resizable.d.ts +13 -29
  190. package/dist/components/ui/resizable.d.ts.map +1 -1
  191. package/dist/components/ui/resizable.js +8 -7
  192. package/dist/components/ui/resizable.js.map +1 -1
  193. package/dist/components/ui/resizable_module.css.map +1 -1
  194. package/dist/components/ui/ripple-button.js +9 -9
  195. package/dist/components/ui/ripple-button.js.map +1 -1
  196. package/dist/components/ui/ripple-button_module.css.map +1 -1
  197. package/dist/components/ui/scratcher_module.css.map +1 -1
  198. package/dist/components/ui/scroll-area.js +2 -2
  199. package/dist/components/ui/scroll-area.js.map +1 -1
  200. package/dist/components/ui/scroll-area_module.css.map +1 -1
  201. package/dist/components/ui/select.js +4 -4
  202. package/dist/components/ui/select.js.map +1 -1
  203. package/dist/components/ui/select_module.css.map +1 -1
  204. package/dist/components/ui/separator.js +2 -2
  205. package/dist/components/ui/separator.js.map +1 -1
  206. package/dist/components/ui/separator_module.css.map +1 -1
  207. package/dist/components/ui/sheet.js +6 -6
  208. package/dist/components/ui/sheet.js.map +1 -1
  209. package/dist/components/ui/sheet_module.css.map +1 -1
  210. package/dist/components/ui/sidebar.js +36 -36
  211. package/dist/components/ui/sidebar.js.map +1 -1
  212. package/dist/components/ui/sidebar_module.css.map +1 -1
  213. package/dist/components/ui/skeleton.js +2 -2
  214. package/dist/components/ui/skeleton.js.map +1 -1
  215. package/dist/components/ui/skeleton_module.css.map +1 -1
  216. package/dist/components/ui/slider.js +2 -2
  217. package/dist/components/ui/slider.js.map +1 -1
  218. package/dist/components/ui/slider_module.css.map +1 -1
  219. package/dist/components/ui/spinner.js +2 -2
  220. package/dist/components/ui/spinner.js.map +1 -1
  221. package/dist/components/ui/spinner_module.css.map +1 -1
  222. package/dist/components/ui/stepper.js +2 -2
  223. package/dist/components/ui/stepper.js.map +1 -1
  224. package/dist/components/ui/stepper_module.css.map +1 -1
  225. package/dist/components/ui/switch.js +2 -2
  226. package/dist/components/ui/switch.js.map +1 -1
  227. package/dist/components/ui/switch_module.css.map +1 -1
  228. package/dist/components/ui/table-skeleton.js +2 -2
  229. package/dist/components/ui/table-skeleton.js.map +1 -1
  230. package/dist/components/ui/table-skeleton_module.css.map +1 -1
  231. package/dist/components/ui/table.js +9 -9
  232. package/dist/components/ui/table.js.map +1 -1
  233. package/dist/components/ui/table_module.css.map +1 -1
  234. package/dist/components/ui/tabs.js +3 -3
  235. package/dist/components/ui/tabs.js.map +1 -1
  236. package/dist/components/ui/tabs_module.css.map +1 -1
  237. package/dist/components/ui/textarea.js +2 -2
  238. package/dist/components/ui/textarea.js.map +1 -1
  239. package/dist/components/ui/textarea_module.css.map +1 -1
  240. package/dist/components/ui/timeline.js +5 -5
  241. package/dist/components/ui/timeline.js.map +1 -1
  242. package/dist/components/ui/timeline_module.css.map +1 -1
  243. package/dist/components/ui/{sonner.d.ts → toast.d.ts} +10 -2
  244. package/dist/components/ui/toast.d.ts.map +1 -0
  245. package/dist/components/ui/{sonner.js → toast.js} +40 -40
  246. package/dist/components/ui/toast.js.map +1 -0
  247. package/dist/components/ui/toast.module.js +34 -0
  248. package/dist/components/ui/toast.module.js.map +1 -0
  249. package/dist/components/ui/{sonner_module.css → toast_module.css} +35 -35
  250. package/dist/components/ui/toast_module.css.map +1 -0
  251. package/dist/components/ui/toggle-group.js +5 -5
  252. package/dist/components/ui/toggle-group.js.map +1 -1
  253. package/dist/components/ui/toggle-group_module.css.map +1 -1
  254. package/dist/components/ui/toggle.js +2 -2
  255. package/dist/components/ui/toggle.js.map +1 -1
  256. package/dist/components/ui/toggle_module.css.map +1 -1
  257. package/dist/components/ui/toolbar.js +6 -6
  258. package/dist/components/ui/toolbar.js.map +1 -1
  259. package/dist/components/ui/toolbar_module.css.map +1 -1
  260. package/dist/components/ui/tooltip.js +4 -4
  261. package/dist/components/ui/tooltip.js.map +1 -1
  262. package/dist/components/ui/tooltip_module.css.map +1 -1
  263. package/dist/components/ui/typewriter.js +4 -4
  264. package/dist/components/ui/typewriter.js.map +1 -1
  265. package/dist/components/ui/typewriter_module.css.map +1 -1
  266. package/dist/components/ui/visually-hidden.js +2 -2
  267. package/dist/components/ui/visually-hidden.js.map +1 -1
  268. package/dist/components/ui/visually-hidden_module.css.map +1 -1
  269. package/dist/hooks/useAnnounce.js +5 -5
  270. package/dist/hooks/useAnnounce.js.map +1 -1
  271. package/dist/hooks/useClipboard.js +6 -6
  272. package/dist/hooks/useClipboard.js.map +1 -1
  273. package/dist/hooks/useControllableState.js +3 -3
  274. package/dist/hooks/useControllableState.js.map +1 -1
  275. package/dist/hooks/useDebounce.js +3 -3
  276. package/dist/hooks/useDebounce.js.map +1 -1
  277. package/dist/hooks/useEventCallback.js +4 -4
  278. package/dist/hooks/useEventCallback.js.map +1 -1
  279. package/dist/hooks/useFocusManager.js +6 -6
  280. package/dist/hooks/useFocusManager.js.map +1 -1
  281. package/dist/hooks/useFocusVisible.js +5 -5
  282. package/dist/hooks/useFocusVisible.js.map +1 -1
  283. package/dist/hooks/useId.js +4 -4
  284. package/dist/hooks/useId.js.map +1 -1
  285. package/dist/hooks/useIntersectionObserver.js +3 -3
  286. package/dist/hooks/useIntersectionObserver.js.map +1 -1
  287. package/dist/hooks/useInterval.js +4 -4
  288. package/dist/hooks/useInterval.js.map +1 -1
  289. package/dist/hooks/useLocalStorage.js +4 -4
  290. package/dist/hooks/useLocalStorage.js.map +1 -1
  291. package/dist/hooks/useMediaQuery.js +3 -3
  292. package/dist/hooks/useMediaQuery.js.map +1 -1
  293. package/dist/hooks/useMergedRefs.js +2 -2
  294. package/dist/hooks/useMergedRefs.js.map +1 -1
  295. package/dist/hooks/useOnClickOutside.js +2 -2
  296. package/dist/hooks/useOnClickOutside.js.map +1 -1
  297. package/dist/hooks/usePrevious.js +3 -3
  298. package/dist/hooks/usePrevious.js.map +1 -1
  299. package/dist/hooks/useThrottle.js +7 -7
  300. package/dist/hooks/useThrottle.js.map +1 -1
  301. package/dist/hooks/useTimeout.js +4 -4
  302. package/dist/hooks/useTimeout.js.map +1 -1
  303. package/dist/index.css.map +1 -1
  304. package/dist/index.d.ts +3 -3
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +1 -1
  307. package/dist/motion/Collapse.js +2 -2
  308. package/dist/motion/Collapse.js.map +1 -1
  309. package/dist/motion/Collapse_module.css.map +1 -1
  310. package/package.json +7 -8
  311. package/src/components/ui/calendar.tsx +2 -1
  312. package/src/components/ui/chart.tsx +2 -2
  313. package/src/components/ui/form.tsx +28 -3
  314. package/src/components/ui/input-otp.tsx +3 -3
  315. package/src/components/ui/resizable.tsx +15 -18
  316. package/src/components/ui/{sonner.module.css → toast.module.css} +1 -1
  317. package/src/components/ui/{sonner.tsx → toast.tsx} +2 -2
  318. package/src/index.ts +4 -4
  319. package/dist/components/ui/sonner.d.ts.map +0 -1
  320. package/dist/components/ui/sonner.js.map +0 -1
  321. package/dist/components/ui/sonner.module.js +0 -34
  322. package/dist/components/ui/sonner.module.js.map +0 -1
  323. package/dist/components/ui/sonner_module.css.map +0 -1
  324. package/dist/rslib-runtime.js +0 -39
  325. package/dist/rslib-runtime.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"components/ui/combobox.js","sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Check, ChevronsUpDown} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useControllableState} from \"@/hooks/useControllableState\";\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport {Button} from \"./button\";\r\nimport {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator} from \"./command\";\r\nimport {Popover, PopoverContent, PopoverTrigger} from \"./popover\";\r\n\r\nimport styles from \"./combobox.module.css\";\r\n\r\ninterface ComboboxContextValue {\r\n value: string;\r\n onValueChange: (value: string) => void;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n emptyMessage?: string;\r\n disabled?: boolean;\r\n itemLabels: Map<string, string>;\r\n registerItem: (value: string, label: string) => void;\r\n unregisterItem: (value: string) => void;\r\n}\r\n\r\nconst ComboboxContext = React.createContext<ComboboxContextValue | null>(null);\r\n\r\nfunction useComboboxContext(componentName: string): ComboboxContextValue {\r\n const context = React.useContext(ComboboxContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Combobox.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\ninterface ComboboxProps {\r\n /**\r\n * The controlled selected value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * The default value when uncontrolled.\r\n * @default \"\"\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Callback fired when the selected value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether the popover is controlled open state.\r\n * @default undefined\r\n */\r\n open?: boolean;\r\n /**\r\n * Whether the popover is open by default (uncontrolled).\r\n * @default false\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback fired when the open state changes.\r\n * @default undefined\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Placeholder text shown when no value is selected.\r\n * @default \"Select an item...\"\r\n */\r\n placeholder?: string;\r\n /**\r\n * Placeholder text shown in the search input.\r\n * @default \"Search...\"\r\n */\r\n searchPlaceholder?: string;\r\n /**\r\n * Message shown when no items match the search.\r\n * @default \"No items found.\"\r\n */\r\n emptyMessage?: string;\r\n /**\r\n * Whether the combobox is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Additional CSS classes merged with the combobox styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Combobox content and items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxTriggerProps {\r\n /**\r\n * Additional CSS classes merged with the trigger styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Trigger content. If not provided, shows selected item label or placeholder.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxContentProps {\r\n /**\r\n * Additional CSS classes merged with the content styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content children (typically ComboboxItem components).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxItemProps {\r\n /**\r\n * The value associated with this item.\r\n */\r\n value: string;\r\n /**\r\n * Additional CSS classes merged with the item styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Item content (label).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback fired when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Additional search keywords for filtering.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n}\r\n\r\ninterface ComboboxEmptyProps {\r\n /**\r\n * Additional CSS classes merged with the empty state styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content shown when no items match. Defaults to context emptyMessage.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxGroupProps {\r\n /**\r\n * Group heading text.\r\n * @default undefined\r\n */\r\n heading?: string;\r\n /**\r\n * Additional CSS classes merged with the group styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Group items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxSeparatorProps {\r\n /**\r\n * Additional CSS classes merged with the separator styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A searchable select component combining Command, Popover, and Button.\r\n *\r\n * @remarks\r\n * - Composes Command (search), Popover (positioning), and Button (trigger)\r\n * - Supports both controlled and uncontrolled modes\r\n * - Provides keyboard navigation and filtering\r\n * - Built with Base UI primitives and CSS Modules\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <Combobox value={value} onValueChange={setValue}>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * <ComboboxItem value=\"banana\">Banana</ComboboxItem>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n *\r\n * @example With groups\r\n * ```tsx\r\n * <Combobox>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * <ComboboxSeparator />\r\n * <ComboboxGroup heading=\"Vegetables\">\r\n * <ComboboxItem value=\"carrot\">Carrot</ComboboxItem>\r\n * </ComboboxGroup>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n */\r\nfunction Combobox(props: Readonly<Combobox.Props>): React.ReactElement {\r\n const {\r\n value: controlledValue,\r\n defaultValue = \"\",\r\n onValueChange,\r\n open: controlledOpen,\r\n defaultOpen = false,\r\n onOpenChange,\r\n placeholder = \"Select an item...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyMessage = \"No items found.\",\r\n disabled = false,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const [value, setValue] = useControllableState({\r\n controlled: controlledValue,\r\n defaultValue,\r\n onChange: onValueChange,\r\n });\r\n\r\n const [open, setOpen] = useControllableState({\r\n controlled: controlledOpen,\r\n defaultValue: defaultOpen,\r\n onChange: onOpenChange,\r\n });\r\n\r\n const itemLabelsRef = React.useRef(new Map<string, string>());\r\n\r\n const registerItem = React.useCallback((itemValue: string, label: string) => {\r\n itemLabelsRef.current.set(itemValue, label);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemValue: string) => {\r\n itemLabelsRef.current.delete(itemValue);\r\n }, []);\r\n\r\n const contextValue = React.useMemo<ComboboxContextValue>(\r\n () => ({\r\n value,\r\n onValueChange: setValue,\r\n open,\r\n setOpen,\r\n placeholder,\r\n searchPlaceholder,\r\n emptyMessage,\r\n disabled,\r\n itemLabels: itemLabelsRef.current,\r\n registerItem,\r\n unregisterItem,\r\n }),\r\n [value, setValue, open, setOpen, placeholder, searchPlaceholder, emptyMessage, disabled, registerItem, unregisterItem],\r\n );\r\n\r\n return (\r\n <ComboboxContext.Provider value={contextValue}>\r\n <Popover\r\n open={open}\r\n onOpenChange={setOpen}>\r\n <div className={cn(styles.combobox, className)}>{children}</div>\r\n </Popover>\r\n </ComboboxContext.Provider>\r\n );\r\n}\r\nCombobox.displayName = \"Combobox\";\r\n\r\n/**\r\n * Button that opens and closes the combobox popover.\r\n *\r\n * @remarks\r\n * - Renders as a Button with trigger behavior\r\n * - Shows selected item label or placeholder\r\n * - Supports custom children or auto-display\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxTrigger />\r\n * ```\r\n *\r\n * @example Custom content\r\n * ```tsx\r\n * <ComboboxTrigger>\r\n * {selectedLabel || \"Choose...\"}\r\n * </ComboboxTrigger>\r\n * ```\r\n */\r\nconst ComboboxTrigger = React.forwardRef<HTMLButtonElement, ComboboxTrigger.Props>(\r\n (props: Readonly<ComboboxTrigger.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {open, setOpen, value, placeholder, disabled, itemLabels} = useComboboxContext(\"ComboboxTrigger\");\r\n\r\n // Force re-render when value changes to update the selected label\r\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\r\n\r\n React.useEffect(() => {\r\n forceUpdate();\r\n }, [value]);\r\n\r\n const selectedLabel = itemLabels.get(value) || \"\";\r\n\r\n return (\r\n <PopoverTrigger asChild>\r\n <Button\r\n ref={ref}\r\n variant='outline'\r\n role='combobox'\r\n aria-expanded={open}\r\n disabled={disabled}\r\n className={cn(styles.trigger, className)}\r\n onClick={() => setOpen(!open)}>\r\n {children ?? (\r\n <>\r\n <span className={cn(styles.triggerValue, !selectedLabel && styles.triggerPlaceholder)}>{selectedLabel || placeholder}</span>\r\n <ChevronsUpDown className={styles.triggerIcon} />\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n );\r\n },\r\n);\r\nComboboxTrigger.displayName = \"ComboboxTrigger\";\r\n\r\n/**\r\n * The popover content containing the searchable command list.\r\n *\r\n * @remarks\r\n * - Wraps Command with Popover positioning\r\n * - Includes search input and items list\r\n * - Automatically closes on item selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"item1\">Item 1</ComboboxItem>\r\n * </ComboboxContent>\r\n * ```\r\n */\r\nconst ComboboxContent = React.forwardRef<HTMLDivElement, ComboboxContent.Props>(\r\n (props: Readonly<ComboboxContent.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {searchPlaceholder} = useComboboxContext(\"ComboboxContent\");\r\n\r\n return (\r\n <PopoverContent\r\n ref={ref}\r\n className={cn(styles.content, className)}\r\n sideOffset={4}>\r\n <Command className={styles.command}>\r\n <CommandInput\r\n placeholder={searchPlaceholder}\r\n className={styles.commandInput}\r\n />\r\n <CommandList className={styles.commandList}>\r\n <ComboboxEmpty />\r\n {children}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n );\r\n },\r\n);\r\nComboboxContent.displayName = \"ComboboxContent\";\r\n\r\n/**\r\n * A selectable item within the combobox.\r\n *\r\n * @remarks\r\n * - Uses CommandItem internally\r\n * - Shows check icon when selected\r\n * - Closes popover on selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * ```\r\n *\r\n * @example With custom select handler\r\n * ```tsx\r\n * <ComboboxItem\r\n * value=\"apple\"\r\n * onSelect={(value) => console.log(\"Selected:\", value)}\r\n * >\r\n * Apple\r\n * </ComboboxItem>\r\n * ```\r\n */\r\nfunction ComboboxItem(props: Readonly<ComboboxItem.Props>): React.ReactElement {\r\n const {value: itemValue, className, children, disabled = false, onSelect, keywords = []} = props;\r\n const {value: selectedValue, onValueChange, setOpen, registerItem, unregisterItem} = useComboboxContext(\"ComboboxItem\");\r\n\r\n const isSelected = selectedValue === itemValue;\r\n const label = typeof children === \"string\" ? children : itemValue;\r\n\r\n // Register this item's label when mounted\r\n React.useEffect(() => {\r\n registerItem(itemValue, label);\r\n return () => {\r\n unregisterItem(itemValue);\r\n };\r\n }, [itemValue, label, registerItem, unregisterItem]);\r\n\r\n const handleSelect = React.useCallback(\r\n (currentValue: string) => {\r\n const newValue = currentValue === selectedValue ? \"\" : currentValue;\r\n onValueChange(newValue);\r\n setOpen(false);\r\n onSelect?.(newValue);\r\n },\r\n [selectedValue, onValueChange, setOpen, onSelect],\r\n );\r\n\r\n return (\r\n <CommandItem\r\n value={itemValue}\r\n disabled={disabled}\r\n onSelect={handleSelect}\r\n keywords={keywords}\r\n className={cn(styles.item, isSelected && styles.itemSelected, className)}>\r\n <Check className={cn(styles.itemCheck, isSelected && styles.itemCheckVisible)} />\r\n <span className={styles.itemLabel}>{children}</span>\r\n </CommandItem>\r\n );\r\n}\r\nComboboxItem.displayName = \"ComboboxItem\";\r\n\r\n/**\r\n * Message shown when search returns no results.\r\n *\r\n * @remarks\r\n * - Uses CommandEmpty internally\r\n * - Defaults to context emptyMessage\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxEmpty />\r\n * ```\r\n *\r\n * @example Custom message\r\n * ```tsx\r\n * <ComboboxEmpty>Nothing found</ComboboxEmpty>\r\n * ```\r\n */\r\nfunction ComboboxEmpty(props: Readonly<ComboboxEmpty.Props>): React.ReactElement {\r\n const {className, children} = props;\r\n const {emptyMessage} = useComboboxContext(\"ComboboxEmpty\");\r\n\r\n return <CommandEmpty className={cn(styles.empty, className)}>{children ?? emptyMessage}</CommandEmpty>;\r\n}\r\nComboboxEmpty.displayName = \"ComboboxEmpty\";\r\n\r\n/**\r\n * Groups related combobox items with an optional heading.\r\n *\r\n * @remarks\r\n * - Uses CommandGroup internally\r\n * - Supports visual grouping with headings\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * ```\r\n */\r\nfunction ComboboxGroup(props: Readonly<ComboboxGroup.Props>): React.ReactElement {\r\n const {heading, className, children} = props;\r\n\r\n return (\r\n <CommandGroup\r\n heading={heading}\r\n className={cn(styles.group, className)}>\r\n {children}\r\n </CommandGroup>\r\n );\r\n}\r\nComboboxGroup.displayName = \"ComboboxGroup\";\r\n\r\n/**\r\n * Visual separator between combobox groups.\r\n *\r\n * @remarks\r\n * - Uses CommandSeparator internally\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxSeparator />\r\n * ```\r\n */\r\nfunction ComboboxSeparator(props: Readonly<ComboboxSeparator.Props>): React.ReactElement {\r\n const {className} = props;\r\n\r\n return <CommandSeparator className={cn(styles.separator, className)} />;\r\n}\r\nComboboxSeparator.displayName = \"ComboboxSeparator\";\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace Combobox {\r\n export type Props = ComboboxProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxTrigger {\r\n export type Props = ComboboxTriggerProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxContent {\r\n export type Props = ComboboxContentProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxItem {\r\n export type Props = ComboboxItemProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxEmpty {\r\n export type Props = ComboboxEmptyProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxGroup {\r\n export type Props = ComboboxGroupProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxSeparator {\r\n export type Props = ComboboxSeparatorProps;\r\n}\r\n\r\nexport {Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger};\r\n"],"names":["ComboboxContext","React","useComboboxContext","componentName","context","Error","Combobox","props","controlledValue","defaultValue","onValueChange","controlledOpen","defaultOpen","onOpenChange","placeholder","searchPlaceholder","emptyMessage","disabled","className","children","value","setValue","useControllableState","open","setOpen","itemLabelsRef","Map","registerItem","itemValue","label","unregisterItem","contextValue","Popover","cn","styles","ComboboxTrigger","ref","itemLabels","forceUpdate","x","selectedLabel","PopoverTrigger","Button","ChevronsUpDown","ComboboxContent","PopoverContent","Command","CommandInput","CommandList","ComboboxEmpty","ComboboxItem","onSelect","keywords","selectedValue","isSelected","handleSelect","currentValue","newValue","CommandItem","Check","CommandEmpty","ComboboxGroup","heading","CommandGroup","ComboboxSeparator","CommandSeparator"],"mappings":"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"}
1
+ {"version":3,"file":"components/ui/combobox.js","sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Check, ChevronsUpDown} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useControllableState} from \"@/hooks/useControllableState\";\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport {Button} from \"./button\";\r\nimport {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator} from \"./command\";\r\nimport {Popover, PopoverContent, PopoverTrigger} from \"./popover\";\r\n\r\nimport styles from \"./combobox.module.css\";\r\n\r\ninterface ComboboxContextValue {\r\n value: string;\r\n onValueChange: (value: string) => void;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n emptyMessage?: string;\r\n disabled?: boolean;\r\n itemLabels: Map<string, string>;\r\n registerItem: (value: string, label: string) => void;\r\n unregisterItem: (value: string) => void;\r\n}\r\n\r\nconst ComboboxContext = React.createContext<ComboboxContextValue | null>(null);\r\n\r\nfunction useComboboxContext(componentName: string): ComboboxContextValue {\r\n const context = React.useContext(ComboboxContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Combobox.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\ninterface ComboboxProps {\r\n /**\r\n * The controlled selected value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * The default value when uncontrolled.\r\n * @default \"\"\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Callback fired when the selected value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether the popover is controlled open state.\r\n * @default undefined\r\n */\r\n open?: boolean;\r\n /**\r\n * Whether the popover is open by default (uncontrolled).\r\n * @default false\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback fired when the open state changes.\r\n * @default undefined\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Placeholder text shown when no value is selected.\r\n * @default \"Select an item...\"\r\n */\r\n placeholder?: string;\r\n /**\r\n * Placeholder text shown in the search input.\r\n * @default \"Search...\"\r\n */\r\n searchPlaceholder?: string;\r\n /**\r\n * Message shown when no items match the search.\r\n * @default \"No items found.\"\r\n */\r\n emptyMessage?: string;\r\n /**\r\n * Whether the combobox is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Additional CSS classes merged with the combobox styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Combobox content and items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxTriggerProps {\r\n /**\r\n * Additional CSS classes merged with the trigger styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Trigger content. If not provided, shows selected item label or placeholder.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxContentProps {\r\n /**\r\n * Additional CSS classes merged with the content styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content children (typically ComboboxItem components).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxItemProps {\r\n /**\r\n * The value associated with this item.\r\n */\r\n value: string;\r\n /**\r\n * Additional CSS classes merged with the item styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Item content (label).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback fired when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Additional search keywords for filtering.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n}\r\n\r\ninterface ComboboxEmptyProps {\r\n /**\r\n * Additional CSS classes merged with the empty state styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content shown when no items match. Defaults to context emptyMessage.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxGroupProps {\r\n /**\r\n * Group heading text.\r\n * @default undefined\r\n */\r\n heading?: string;\r\n /**\r\n * Additional CSS classes merged with the group styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Group items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxSeparatorProps {\r\n /**\r\n * Additional CSS classes merged with the separator styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A searchable select component combining Command, Popover, and Button.\r\n *\r\n * @remarks\r\n * - Composes Command (search), Popover (positioning), and Button (trigger)\r\n * - Supports both controlled and uncontrolled modes\r\n * - Provides keyboard navigation and filtering\r\n * - Built with Base UI primitives and CSS Modules\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <Combobox value={value} onValueChange={setValue}>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * <ComboboxItem value=\"banana\">Banana</ComboboxItem>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n *\r\n * @example With groups\r\n * ```tsx\r\n * <Combobox>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * <ComboboxSeparator />\r\n * <ComboboxGroup heading=\"Vegetables\">\r\n * <ComboboxItem value=\"carrot\">Carrot</ComboboxItem>\r\n * </ComboboxGroup>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n */\r\nfunction Combobox(props: Readonly<Combobox.Props>): React.ReactElement {\r\n const {\r\n value: controlledValue,\r\n defaultValue = \"\",\r\n onValueChange,\r\n open: controlledOpen,\r\n defaultOpen = false,\r\n onOpenChange,\r\n placeholder = \"Select an item...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyMessage = \"No items found.\",\r\n disabled = false,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const [value, setValue] = useControllableState({\r\n controlled: controlledValue,\r\n defaultValue,\r\n onChange: onValueChange,\r\n });\r\n\r\n const [open, setOpen] = useControllableState({\r\n controlled: controlledOpen,\r\n defaultValue: defaultOpen,\r\n onChange: onOpenChange,\r\n });\r\n\r\n const itemLabelsRef = React.useRef(new Map<string, string>());\r\n\r\n const registerItem = React.useCallback((itemValue: string, label: string) => {\r\n itemLabelsRef.current.set(itemValue, label);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemValue: string) => {\r\n itemLabelsRef.current.delete(itemValue);\r\n }, []);\r\n\r\n const contextValue = React.useMemo<ComboboxContextValue>(\r\n () => ({\r\n value,\r\n onValueChange: setValue,\r\n open,\r\n setOpen,\r\n placeholder,\r\n searchPlaceholder,\r\n emptyMessage,\r\n disabled,\r\n itemLabels: itemLabelsRef.current,\r\n registerItem,\r\n unregisterItem,\r\n }),\r\n [value, setValue, open, setOpen, placeholder, searchPlaceholder, emptyMessage, disabled, registerItem, unregisterItem],\r\n );\r\n\r\n return (\r\n <ComboboxContext.Provider value={contextValue}>\r\n <Popover\r\n open={open}\r\n onOpenChange={setOpen}>\r\n <div className={cn(styles.combobox, className)}>{children}</div>\r\n </Popover>\r\n </ComboboxContext.Provider>\r\n );\r\n}\r\nCombobox.displayName = \"Combobox\";\r\n\r\n/**\r\n * Button that opens and closes the combobox popover.\r\n *\r\n * @remarks\r\n * - Renders as a Button with trigger behavior\r\n * - Shows selected item label or placeholder\r\n * - Supports custom children or auto-display\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxTrigger />\r\n * ```\r\n *\r\n * @example Custom content\r\n * ```tsx\r\n * <ComboboxTrigger>\r\n * {selectedLabel || \"Choose...\"}\r\n * </ComboboxTrigger>\r\n * ```\r\n */\r\nconst ComboboxTrigger = React.forwardRef<HTMLButtonElement, ComboboxTrigger.Props>(\r\n (props: Readonly<ComboboxTrigger.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {open, setOpen, value, placeholder, disabled, itemLabels} = useComboboxContext(\"ComboboxTrigger\");\r\n\r\n // Force re-render when value changes to update the selected label\r\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\r\n\r\n React.useEffect(() => {\r\n forceUpdate();\r\n }, [value]);\r\n\r\n const selectedLabel = itemLabels.get(value) || \"\";\r\n\r\n return (\r\n <PopoverTrigger asChild>\r\n <Button\r\n ref={ref}\r\n variant='outline'\r\n role='combobox'\r\n aria-expanded={open}\r\n disabled={disabled}\r\n className={cn(styles.trigger, className)}\r\n onClick={() => setOpen(!open)}>\r\n {children ?? (\r\n <>\r\n <span className={cn(styles.triggerValue, !selectedLabel && styles.triggerPlaceholder)}>{selectedLabel || placeholder}</span>\r\n <ChevronsUpDown className={styles.triggerIcon} />\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n );\r\n },\r\n);\r\nComboboxTrigger.displayName = \"ComboboxTrigger\";\r\n\r\n/**\r\n * The popover content containing the searchable command list.\r\n *\r\n * @remarks\r\n * - Wraps Command with Popover positioning\r\n * - Includes search input and items list\r\n * - Automatically closes on item selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"item1\">Item 1</ComboboxItem>\r\n * </ComboboxContent>\r\n * ```\r\n */\r\nconst ComboboxContent = React.forwardRef<HTMLDivElement, ComboboxContent.Props>(\r\n (props: Readonly<ComboboxContent.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {searchPlaceholder} = useComboboxContext(\"ComboboxContent\");\r\n\r\n return (\r\n <PopoverContent\r\n ref={ref}\r\n className={cn(styles.content, className)}\r\n sideOffset={4}>\r\n <Command className={styles.command}>\r\n <CommandInput\r\n placeholder={searchPlaceholder}\r\n className={styles.commandInput}\r\n />\r\n <CommandList className={styles.commandList}>\r\n <ComboboxEmpty />\r\n {children}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n );\r\n },\r\n);\r\nComboboxContent.displayName = \"ComboboxContent\";\r\n\r\n/**\r\n * A selectable item within the combobox.\r\n *\r\n * @remarks\r\n * - Uses CommandItem internally\r\n * - Shows check icon when selected\r\n * - Closes popover on selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * ```\r\n *\r\n * @example With custom select handler\r\n * ```tsx\r\n * <ComboboxItem\r\n * value=\"apple\"\r\n * onSelect={(value) => console.log(\"Selected:\", value)}\r\n * >\r\n * Apple\r\n * </ComboboxItem>\r\n * ```\r\n */\r\nfunction ComboboxItem(props: Readonly<ComboboxItem.Props>): React.ReactElement {\r\n const {value: itemValue, className, children, disabled = false, onSelect, keywords = []} = props;\r\n const {value: selectedValue, onValueChange, setOpen, registerItem, unregisterItem} = useComboboxContext(\"ComboboxItem\");\r\n\r\n const isSelected = selectedValue === itemValue;\r\n const label = typeof children === \"string\" ? children : itemValue;\r\n\r\n // Register this item's label when mounted\r\n React.useEffect(() => {\r\n registerItem(itemValue, label);\r\n return () => {\r\n unregisterItem(itemValue);\r\n };\r\n }, [itemValue, label, registerItem, unregisterItem]);\r\n\r\n const handleSelect = React.useCallback(\r\n (currentValue: string) => {\r\n const newValue = currentValue === selectedValue ? \"\" : currentValue;\r\n onValueChange(newValue);\r\n setOpen(false);\r\n onSelect?.(newValue);\r\n },\r\n [selectedValue, onValueChange, setOpen, onSelect],\r\n );\r\n\r\n return (\r\n <CommandItem\r\n value={itemValue}\r\n disabled={disabled}\r\n onSelect={handleSelect}\r\n keywords={keywords}\r\n className={cn(styles.item, isSelected && styles.itemSelected, className)}>\r\n <Check className={cn(styles.itemCheck, isSelected && styles.itemCheckVisible)} />\r\n <span className={styles.itemLabel}>{children}</span>\r\n </CommandItem>\r\n );\r\n}\r\nComboboxItem.displayName = \"ComboboxItem\";\r\n\r\n/**\r\n * Message shown when search returns no results.\r\n *\r\n * @remarks\r\n * - Uses CommandEmpty internally\r\n * - Defaults to context emptyMessage\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxEmpty />\r\n * ```\r\n *\r\n * @example Custom message\r\n * ```tsx\r\n * <ComboboxEmpty>Nothing found</ComboboxEmpty>\r\n * ```\r\n */\r\nfunction ComboboxEmpty(props: Readonly<ComboboxEmpty.Props>): React.ReactElement {\r\n const {className, children} = props;\r\n const {emptyMessage} = useComboboxContext(\"ComboboxEmpty\");\r\n\r\n return <CommandEmpty className={cn(styles.empty, className)}>{children ?? emptyMessage}</CommandEmpty>;\r\n}\r\nComboboxEmpty.displayName = \"ComboboxEmpty\";\r\n\r\n/**\r\n * Groups related combobox items with an optional heading.\r\n *\r\n * @remarks\r\n * - Uses CommandGroup internally\r\n * - Supports visual grouping with headings\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * ```\r\n */\r\nfunction ComboboxGroup(props: Readonly<ComboboxGroup.Props>): React.ReactElement {\r\n const {heading, className, children} = props;\r\n\r\n return (\r\n <CommandGroup\r\n heading={heading}\r\n className={cn(styles.group, className)}>\r\n {children}\r\n </CommandGroup>\r\n );\r\n}\r\nComboboxGroup.displayName = \"ComboboxGroup\";\r\n\r\n/**\r\n * Visual separator between combobox groups.\r\n *\r\n * @remarks\r\n * - Uses CommandSeparator internally\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxSeparator />\r\n * ```\r\n */\r\nfunction ComboboxSeparator(props: Readonly<ComboboxSeparator.Props>): React.ReactElement {\r\n const {className} = props;\r\n\r\n return <CommandSeparator className={cn(styles.separator, className)} />;\r\n}\r\nComboboxSeparator.displayName = \"ComboboxSeparator\";\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace Combobox {\r\n export type Props = ComboboxProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxTrigger {\r\n export type Props = ComboboxTriggerProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxContent {\r\n export type Props = ComboboxContentProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxItem {\r\n export type Props = ComboboxItemProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxEmpty {\r\n export type Props = ComboboxEmptyProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxGroup {\r\n export type Props = ComboboxGroupProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxSeparator {\r\n export type Props = ComboboxSeparatorProps;\r\n}\r\n\r\nexport {Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger};\r\n"],"names":["ComboboxContext","React","useComboboxContext","componentName","context","Error","Combobox","props","controlledValue","defaultValue","onValueChange","controlledOpen","defaultOpen","onOpenChange","placeholder","searchPlaceholder","emptyMessage","disabled","className","children","value","setValue","useControllableState","open","setOpen","itemLabelsRef","Map","registerItem","itemValue","label","unregisterItem","contextValue","Popover","cn","styles","ComboboxTrigger","ref","itemLabels","forceUpdate","x","selectedLabel","PopoverTrigger","Button","ChevronsUpDown","ComboboxContent","PopoverContent","Command","CommandInput","CommandList","ComboboxEmpty","ComboboxItem","onSelect","keywords","selectedValue","isSelected","handleSelect","currentValue","newValue","CommandItem","Check","CommandEmpty","ComboboxGroup","heading","CommandGroup","ComboboxSeparator","CommandSeparator"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./home/runner/work/arolariu.ro/arolariu.ro/packages/components/src/components/ui/combobox.module.css","webpack://./src/components/ui/combobox.module.css"],"names":[],"mappings":"AADA;ECEE,iBAAiB;AACnB;;AAEA;EACE,8BAA8B;EAC9B,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,YAAY;EACZ,gCAAgC;EAChC,WAAW;EACX,cAAc;EACd,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,0BAA0B;EAC1B,UAAU;AACZ;;AAEA;EACE,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,8CAA8C;EAC9C,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,kCAAkC;EAClC,eAAe;EACf,mBAAmB;EACnB,wBAAwB;EACxB,gDAAgD;EAChD,gCAAgC;EAChC,aAAa;AACf;;AAEA;EACE,uCAAuC;AACzC;;AAEA;EACE,WAAW;EACX,oBAAoB;AACtB;;AAEA;EACE,uCAAuC;AACzC;;AAEA;EACE,UAAU;EACV,cAAc;EACd,WAAW;EACX,YAAY;EACZ,uBAAuB;AACzB;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,4BAA4B;EAC5B,iCAAiC;EACjC,gDAAgD;EAChD,kBAAkB;AACpB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,uCAAuC;EACvC,WAAW;EACX,6BAA6B;AAC/B;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,0CAA0C;AAC5C;;AAEA;EACE,uCAAuC;AACzC;;AAEA;EACE,uCAAuC;AACzC;;AAEA;EACE,4BAA4B;AAC9B;;AAEA;EACE,uCAAuC;AACzC;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF","sourcesContent":[".combobox{display:contents}.trigger{justify-content:space-between;min-width:200px;width:100%}.triggerValue{flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.triggerPlaceholder{color:var(--ac-neutral-500)}.triggerIcon{flex-shrink:0;height:1rem;margin-left:var(--ac-spacing-2);opacity:.5;width:1rem}.content{min-width:200px;padding:0;width:var(--anchor-width)}.command{border:none;box-shadow:none}.commandInput{border-bottom:1px solid var(--ac-neutral-200);border-radius:0}.commandList{max-height:300px;overflow-y:auto}.item{align-items:center;border-radius:var(--ac-radius-sm);cursor:pointer;display:flex;gap:var(--ac-spacing-2);padding:var(--ac-spacing-2) var(--ac-spacing-3);transition:background-color .2s}.item:hover{background-color:var(--ac-neutral-100)}.item[data-disabled]{opacity:.5;pointer-events:none}.itemSelected{background-color:var(--ac-neutral-100)}.itemCheck{flex-shrink:0;height:1rem;opacity:0;transition:opacity .2s;width:1rem}.itemCheckVisible{opacity:1}.itemLabel{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty{color:var(--ac-neutral-500);font-size:var(--ac-font-size-sm);padding:var(--ac-spacing-6) var(--ac-spacing-4);text-align:center}.group{padding:var(--ac-spacing-1) 0}.separator{background-color:var(--ac-neutral-200);height:1px;margin:var(--ac-spacing-1) 0}:global(.dark) .triggerPlaceholder{color:var(--ac-neutral-400)}:global(.dark) .commandInput{border-bottom-color:var(--ac-neutral-700)}:global(.dark) .item:hover{background-color:var(--ac-neutral-800)}:global(.dark) .itemSelected{background-color:var(--ac-neutral-800)}:global(.dark) .empty{color:var(--ac-neutral-400)}:global(.dark) .separator{background-color:var(--ac-neutral-700)}@media (max-width:640px){.content,.trigger{min-width:150px}}",".combobox {\n display: contents;\n}\n\n.trigger {\n justify-content: space-between;\n width: 100%;\n min-width: 200px;\n}\n\n.triggerValue {\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.triggerPlaceholder {\n color: var(--ac-neutral-500);\n}\n\n.triggerIcon {\n height: 1rem;\n margin-left: var(--ac-spacing-2);\n opacity: .5;\n flex-shrink: 0;\n width: 1rem;\n}\n\n.content {\n min-width: 200px;\n width: var(--anchor-width);\n padding: 0;\n}\n\n.command {\n box-shadow: none;\n border: none;\n}\n\n.commandInput {\n border-bottom: 1px solid var(--ac-neutral-200);\n border-radius: 0;\n}\n\n.commandList {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.item {\n border-radius: var(--ac-radius-sm);\n cursor: pointer;\n align-items: center;\n gap: var(--ac-spacing-2);\n padding: var(--ac-spacing-2) var(--ac-spacing-3);\n transition: background-color .2s;\n display: flex;\n}\n\n.item:hover {\n background-color: var(--ac-neutral-100);\n}\n\n.item[data-disabled] {\n opacity: .5;\n pointer-events: none;\n}\n\n.itemSelected {\n background-color: var(--ac-neutral-100);\n}\n\n.itemCheck {\n opacity: 0;\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n transition: opacity .2s;\n}\n\n.itemCheckVisible {\n opacity: 1;\n}\n\n.itemLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.empty {\n color: var(--ac-neutral-500);\n font-size: var(--ac-font-size-sm);\n padding: var(--ac-spacing-6) var(--ac-spacing-4);\n text-align: center;\n}\n\n.group {\n padding: var(--ac-spacing-1) 0;\n}\n\n.separator {\n background-color: var(--ac-neutral-200);\n height: 1px;\n margin: var(--ac-spacing-1) 0;\n}\n\n:global(.dark) .triggerPlaceholder {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .commandInput {\n border-bottom-color: var(--ac-neutral-700);\n}\n\n:global(.dark) .item:hover {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .itemSelected {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .empty {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .separator {\n background-color: var(--ac-neutral-700);\n}\n\n@media (width <= 640px) {\n .content, .trigger {\n min-width: 150px;\n }\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./../../node_modules/@rslib/core/node_modules/@rsbuild/core/compiled/css-loader/index.js??ruleSet[1].rules[1].oneOf[2].use[1]!builtin:lightningcss-loader??ruleSet[1].rules[1].oneOf[2].use[2]!/home/runner/work/arolariu.ro/arolariu.ro/node_modules/@rslib/core/node_modules/@rsbuild/core/compiled/postcss-loader/index.js??ruleSet[1].rules[1].oneOf[2].use[3]!/home/runner/work/arolariu.ro/arolariu.ro/packages/components/src/components/ui/combobox.module.css","webpack://./src/components/ui/combobox.module.css"],"names":[],"mappings":"AAAA;ECCE,iBAAiB;AACnB;;ADF2B;ECKzB,8BAA8B;EAC9B,WAAW;EACX,gBAAgB;AAClB;;ADR6F;ECW3F,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;ADhB4L;ECmB1L,4BAA4B;AAC9B;;ADpB4O;ECuB1O,YAAY;EACZ,gCAAgC;EAChC,WAAW;EACX,cAAc;EACd,WAAW;AACb;;AD5ByU;EC+BvU,gBAAgB;EAChB,0BAA0B;EAC1B,UAAU;AACZ;;ADlCsY;ECqCpY,gBAAgB;EAChB,YAAY;AACd;;ADvC2a;EC0Cza,8CAA8C;EAC9C,gBAAgB;AAClB;;AD5Cuf;EC+Crf,iBAAiB;EACjB,gBAAgB;AAClB;;ADjDqiB;ECoDniB,kCAAkC;EAClC,eAAe;EACf,mBAAmB;EACnB,wBAAwB;EACxB,gDAAgD;EAChD,gCAAgC;EAChC,aAAa;AACf;;AD3DouB;EC8DluB,uCAAuC;AACzC;;AD/DuxB;ECkErxB,WAAW;EACX,oBAAoB;AACtB;;ADpE20B;ECuEz0B,uCAAuC;AACzC;;ADxEg4B;EC2E93B,UAAU;EACV,cAAc;EACd,WAAW;EACX,YAAY;EACZ,uBAAuB;AACzB;;ADhFi9B;ECmF/8B,UAAU;AACZ;;ADpF6+B;ECuF3+B,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;AD3FyjC;EC8FvjC,4BAA4B;EAC5B,iCAAiC;EACjC,gDAAgD;EAChD,kBAAkB;AACpB;;ADlG+rC;ECqG7rC,8BAA8B;AAChC;;ADtGouC;ECyGluC,uCAAuC;EACvC,WAAW;EACX,6BAA6B;AAC/B;;AD5G8zC;EC+G5zC,4BAA4B;AAC9B;;ADhH63C;ECmH33C,0CAA0C;AAC5C;;ADpHo8C;ECuHl8C,uCAAuC;AACzC;;ADxHsgD;EC2HpgD,uCAAuC;AACzC;;AD5H0kD;EC+HxkD,4BAA4B;AAC9B;;ADhI4nD;ECmI1nD,uCAAuC;AACzC;;ADpI6rD;EAAyB;ICwIltD,gBAAgB;EAClB;AACF","sourcesContent":[".combobox{display:contents}.trigger{justify-content:space-between;min-width:200px;width:100%}.triggerValue{flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.triggerPlaceholder{color:var(--ac-neutral-500)}.triggerIcon{flex-shrink:0;height:1rem;margin-left:var(--ac-spacing-2);opacity:.5;width:1rem}.content{min-width:200px;padding:0;width:var(--anchor-width)}.command{border:none;box-shadow:none}.commandInput{border-bottom:1px solid var(--ac-neutral-200);border-radius:0}.commandList{max-height:300px;overflow-y:auto}.item{align-items:center;border-radius:var(--ac-radius-sm);cursor:pointer;display:flex;gap:var(--ac-spacing-2);padding:var(--ac-spacing-2) var(--ac-spacing-3);transition:background-color .2s}.item:hover{background-color:var(--ac-neutral-100)}.item[data-disabled]{opacity:.5;pointer-events:none}.itemSelected{background-color:var(--ac-neutral-100)}.itemCheck{flex-shrink:0;height:1rem;opacity:0;transition:opacity .2s;width:1rem}.itemCheckVisible{opacity:1}.itemLabel{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty{color:var(--ac-neutral-500);font-size:var(--ac-font-size-sm);padding:var(--ac-spacing-6) var(--ac-spacing-4);text-align:center}.group{padding:var(--ac-spacing-1) 0}.separator{background-color:var(--ac-neutral-200);height:1px;margin:var(--ac-spacing-1) 0}:global(.dark) .triggerPlaceholder{color:var(--ac-neutral-400)}:global(.dark) .commandInput{border-bottom-color:var(--ac-neutral-700)}:global(.dark) .item:hover{background-color:var(--ac-neutral-800)}:global(.dark) .itemSelected{background-color:var(--ac-neutral-800)}:global(.dark) .empty{color:var(--ac-neutral-400)}:global(.dark) .separator{background-color:var(--ac-neutral-700)}@media (max-width:640px){.content,.trigger{min-width:150px}}",".combobox {\n display: contents;\n}\n\n.trigger {\n justify-content: space-between;\n width: 100%;\n min-width: 200px;\n}\n\n.triggerValue {\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.triggerPlaceholder {\n color: var(--ac-neutral-500);\n}\n\n.triggerIcon {\n height: 1rem;\n margin-left: var(--ac-spacing-2);\n opacity: .5;\n flex-shrink: 0;\n width: 1rem;\n}\n\n.content {\n min-width: 200px;\n width: var(--anchor-width);\n padding: 0;\n}\n\n.command {\n box-shadow: none;\n border: none;\n}\n\n.commandInput {\n border-bottom: 1px solid var(--ac-neutral-200);\n border-radius: 0;\n}\n\n.commandList {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.item {\n border-radius: var(--ac-radius-sm);\n cursor: pointer;\n align-items: center;\n gap: var(--ac-spacing-2);\n padding: var(--ac-spacing-2) var(--ac-spacing-3);\n transition: background-color .2s;\n display: flex;\n}\n\n.item:hover {\n background-color: var(--ac-neutral-100);\n}\n\n.item[data-disabled] {\n opacity: .5;\n pointer-events: none;\n}\n\n.itemSelected {\n background-color: var(--ac-neutral-100);\n}\n\n.itemCheck {\n opacity: 0;\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n transition: opacity .2s;\n}\n\n.itemCheckVisible {\n opacity: 1;\n}\n\n.itemLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.empty {\n color: var(--ac-neutral-500);\n font-size: var(--ac-font-size-sm);\n padding: var(--ac-spacing-6) var(--ac-spacing-4);\n text-align: center;\n}\n\n.group {\n padding: var(--ac-spacing-1) 0;\n}\n\n.separator {\n background-color: var(--ac-neutral-200);\n height: 1px;\n margin: var(--ac-spacing-1) 0;\n}\n\n:global(.dark) .triggerPlaceholder {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .commandInput {\n border-bottom-color: var(--ac-neutral-700);\n}\n\n:global(.dark) .item:hover {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .itemSelected {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .empty {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .separator {\n background-color: var(--ac-neutral-700);\n}\n\n@media (width <= 640px) {\n .content, .trigger {\n min-width: 150px;\n }\n}\n"],"sourceRoot":""}
@@ -3,11 +3,11 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Dialog } from "@base-ui/react/dialog";
4
4
  import { Separator } from "@base-ui/react/separator";
5
5
  import { Search } from "lucide-react";
6
- import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
7
6
  import { cn } from "../../lib/utilities.js";
8
7
  import command_module from "./command.module.js";
9
- const CommandContext = /*#__PURE__*/ createContext(null);
10
- const CommandGroupContext = /*#__PURE__*/ createContext(null);
8
+ import * as __rspack_external_react from "react";
9
+ const CommandContext = /*#__PURE__*/ __rspack_external_react.createContext(null);
10
+ const CommandGroupContext = /*#__PURE__*/ __rspack_external_react.createContext(null);
11
11
  function assignRef(ref, value) {
12
12
  if ("function" == typeof ref) return void ref(value);
13
13
  if (ref) ref.current = value;
@@ -25,18 +25,18 @@ function defaultCommandFilter(value, search, keywords = []) {
25
25
  return normalizedValue.includes(normalizedSearch) ? 1 : 0;
26
26
  }
27
27
  function useCommandContext(componentName) {
28
- const context = useContext(CommandContext);
28
+ const context = __rspack_external_react.useContext(CommandContext);
29
29
  if (!context) throw new Error(`${componentName} must be used within Command.`);
30
30
  return context;
31
31
  }
32
- const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _defaultValue, disablePointerSelection = false, filter, label, loop = false, onKeyDown, onValueChange: _onValueChange, shouldFilter = true, value: _value, vimBindings: _vimBindings, ...props }, ref)=>{
33
- const [activeItemId, setActiveItemId] = useState(null);
34
- const [search, setSearch] = useState("");
35
- const itemOrderRef = useRef(0);
36
- const itemsRef = useRef(new Map());
37
- const [itemsVersion, setItemsVersion] = useState(0);
38
- const listId = useId();
39
- const registerItem = useCallback((item)=>{
32
+ const Command = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, defaultValue: _defaultValue, disablePointerSelection = false, filter, label, loop = false, onKeyDown, onValueChange: _onValueChange, shouldFilter = true, value: _value, vimBindings: _vimBindings, ...props }, ref)=>{
33
+ const [activeItemId, setActiveItemId] = __rspack_external_react.useState(null);
34
+ const [search, setSearch] = __rspack_external_react.useState("");
35
+ const itemOrderRef = __rspack_external_react.useRef(0);
36
+ const itemsRef = __rspack_external_react.useRef(new Map());
37
+ const [itemsVersion, setItemsVersion] = __rspack_external_react.useState(0);
38
+ const listId = __rspack_external_react.useId();
39
+ const registerItem = __rspack_external_react.useCallback((item)=>{
40
40
  const existingItem = itemsRef.current.get(item.id);
41
41
  const nextItem = {
42
42
  ...item,
@@ -47,17 +47,17 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
47
47
  itemsRef.current.set(item.id, nextItem);
48
48
  setItemsVersion((currentVersion)=>currentVersion + 1);
49
49
  }, []);
50
- const unregisterItem = useCallback((itemId)=>{
50
+ const unregisterItem = __rspack_external_react.useCallback((itemId)=>{
51
51
  if (!itemsRef.current.delete(itemId)) return;
52
52
  setItemsVersion((currentVersion)=>currentVersion + 1);
53
53
  }, []);
54
- const items = useMemo(()=>[
54
+ const items = __rspack_external_react.useMemo(()=>[
55
55
  ...itemsRef.current.values()
56
56
  ].toSorted((firstItem, secondItem)=>firstItem.order - secondItem.order), [
57
57
  itemsVersion
58
58
  ]);
59
59
  const isFiltering = shouldFilter && search.trim().length > 0;
60
- const isItemVisible = useCallback((itemId)=>{
60
+ const isItemVisible = __rspack_external_react.useCallback((itemId)=>{
61
61
  const item = itemsRef.current.get(itemId);
62
62
  if (!item) return false;
63
63
  if (item.forceMount || !shouldFilter || 0 === search.trim().length) return true;
@@ -69,21 +69,21 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
69
69
  search,
70
70
  shouldFilter
71
71
  ]);
72
- const visibleItems = useMemo(()=>items.filter((item)=>isItemVisible(item.id)), [
72
+ const visibleItems = __rspack_external_react.useMemo(()=>items.filter((item)=>isItemVisible(item.id)), [
73
73
  isItemVisible,
74
74
  items
75
75
  ]);
76
- const selectableItems = useMemo(()=>visibleItems.filter((item)=>!item.disabled), [
76
+ const selectableItems = __rspack_external_react.useMemo(()=>visibleItems.filter((item)=>!item.disabled), [
77
77
  visibleItems
78
78
  ]);
79
- useEffect(()=>{
79
+ __rspack_external_react.useEffect(()=>{
80
80
  if (0 === selectableItems.length) return void setActiveItemId(null);
81
81
  if (!activeItemId || !selectableItems.some((item)=>item.id === activeItemId)) setActiveItemId(selectableItems[0].id);
82
82
  }, [
83
83
  activeItemId,
84
84
  selectableItems
85
85
  ]);
86
- useEffect(()=>{
86
+ __rspack_external_react.useEffect(()=>{
87
87
  if (!activeItemId) return;
88
88
  itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({
89
89
  block: "nearest"
@@ -91,10 +91,10 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
91
91
  }, [
92
92
  activeItemId
93
93
  ]);
94
- const selectSpecificItem = useCallback((itemId)=>{
94
+ const selectSpecificItem = __rspack_external_react.useCallback((itemId)=>{
95
95
  setActiveItemId(itemId);
96
96
  }, []);
97
- const selectNextItem = useCallback(()=>{
97
+ const selectNextItem = __rspack_external_react.useCallback(()=>{
98
98
  if (0 === selectableItems.length) return;
99
99
  const currentIndex = selectableItems.findIndex((item)=>item.id === activeItemId);
100
100
  if (-1 === currentIndex) return void setActiveItemId(selectableItems[0].id);
@@ -106,7 +106,7 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
106
106
  loop,
107
107
  selectableItems
108
108
  ]);
109
- const selectPreviousItem = useCallback(()=>{
109
+ const selectPreviousItem = __rspack_external_react.useCallback(()=>{
110
110
  if (0 === selectableItems.length) return;
111
111
  const currentIndex = selectableItems.findIndex((item)=>item.id === activeItemId);
112
112
  if (-1 === currentIndex) return void setActiveItemId(selectableItems[0].id);
@@ -118,19 +118,19 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
118
118
  loop,
119
119
  selectableItems
120
120
  ]);
121
- const triggerActiveItem = useCallback(()=>{
121
+ const triggerActiveItem = __rspack_external_react.useCallback(()=>{
122
122
  if (!activeItemId) return;
123
123
  itemsRef.current.get(activeItemId)?.ref.current?.click();
124
124
  }, [
125
125
  activeItemId
126
126
  ]);
127
- const hasVisibleItemsInGroup = useCallback((groupId)=>visibleItems.some((item)=>item.groupId === groupId), [
127
+ const hasVisibleItemsInGroup = __rspack_external_react.useCallback((groupId)=>visibleItems.some((item)=>item.groupId === groupId), [
128
128
  visibleItems
129
129
  ]);
130
- const getVisibleItemCount = useCallback(()=>visibleItems.length, [
130
+ const getVisibleItemCount = __rspack_external_react.useCallback(()=>visibleItems.length, [
131
131
  visibleItems.length
132
132
  ]);
133
- const contextValue = useMemo(()=>({
133
+ const contextValue = __rspack_external_react.useMemo(()=>({
134
134
  activeItemId,
135
135
  disablePointerSelection,
136
136
  getVisibleItemCount,
@@ -238,11 +238,11 @@ function CommandDialog({ children, open, onOpenChange, title = "Command menu", .
238
238
  });
239
239
  }
240
240
  CommandDialog.displayName = "CommandDialog";
241
- const CommandInput = /*#__PURE__*/ forwardRef(({ className, onChange, onValueChange, value, ...props }, ref)=>{
241
+ const CommandInput = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, onChange, onValueChange, value, ...props }, ref)=>{
242
242
  const { activeItemId, listId, search, selectSpecificItem, setSearch } = useCommandContext("CommandInput");
243
243
  const isControlled = void 0 !== value;
244
244
  const inputValue = isControlled ? value : search;
245
- useEffect(()=>{
245
+ __rspack_external_react.useEffect(()=>{
246
246
  if (!isControlled) return;
247
247
  setSearch(value ?? "");
248
248
  }, [
@@ -279,7 +279,7 @@ const CommandInput = /*#__PURE__*/ forwardRef(({ className, onChange, onValueCha
279
279
  });
280
280
  });
281
281
  CommandInput.displayName = "CommandInput";
282
- const CommandList = /*#__PURE__*/ forwardRef(({ className, label, ...props }, ref)=>{
282
+ const CommandList = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, label, ...props }, ref)=>{
283
283
  const { listId } = useCommandContext("CommandList");
284
284
  return /*#__PURE__*/ jsx("div", {
285
285
  "aria-label": label,
@@ -291,7 +291,7 @@ const CommandList = /*#__PURE__*/ forwardRef(({ className, label, ...props }, re
291
291
  });
292
292
  });
293
293
  CommandList.displayName = "CommandList";
294
- const CommandEmpty = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>{
294
+ const CommandEmpty = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>{
295
295
  const { getVisibleItemCount } = useCommandContext("CommandEmpty");
296
296
  if (getVisibleItemCount() > 0) return null;
297
297
  return /*#__PURE__*/ jsx("div", {
@@ -302,8 +302,8 @@ const CommandEmpty = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>{
302
302
  });
303
303
  });
304
304
  CommandEmpty.displayName = "CommandEmpty";
305
- const CommandGroup = /*#__PURE__*/ forwardRef(({ children, className, forceMount = false, heading, value: _value, ...props }, ref)=>{
306
- const groupId = useId();
305
+ const CommandGroup = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, forceMount = false, heading, value: _value, ...props }, ref)=>{
306
+ const groupId = __rspack_external_react.useId();
307
307
  const { hasVisibleItemsInGroup, isFiltering } = useCommandContext("CommandGroup");
308
308
  if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) return null;
309
309
  return /*#__PURE__*/ jsx(CommandGroupContext.Provider, {
@@ -324,7 +324,7 @@ const CommandGroup = /*#__PURE__*/ forwardRef(({ children, className, forceMount
324
324
  });
325
325
  });
326
326
  CommandGroup.displayName = "CommandGroup";
327
- const CommandSeparator = /*#__PURE__*/ forwardRef(({ alwaysRender = false, className, orientation = "horizontal", ...props }, ref)=>{
327
+ const CommandSeparator = /*#__PURE__*/ __rspack_external_react.forwardRef(({ alwaysRender = false, className, orientation = "horizontal", ...props }, ref)=>{
328
328
  const { isFiltering } = useCommandContext("CommandSeparator");
329
329
  if (isFiltering && !alwaysRender) return null;
330
330
  return /*#__PURE__*/ jsx(Separator, {
@@ -335,15 +335,15 @@ const CommandSeparator = /*#__PURE__*/ forwardRef(({ alwaysRender = false, class
335
335
  });
336
336
  });
337
337
  CommandSeparator.displayName = "CommandSeparator";
338
- const CommandItem = /*#__PURE__*/ forwardRef(({ children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props }, ref)=>{
338
+ const CommandItem = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props }, ref)=>{
339
339
  const { activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem } = useCommandContext("CommandItem");
340
- const groupId = useContext(CommandGroupContext);
341
- const generatedId = useId();
342
- const itemRef = useRef(null);
343
- const keywordSignature = useMemo(()=>keywords.join("\u0000"), [
340
+ const groupId = __rspack_external_react.useContext(CommandGroupContext);
341
+ const generatedId = __rspack_external_react.useId();
342
+ const itemRef = __rspack_external_react.useRef(null);
343
+ const keywordSignature = __rspack_external_react.useMemo(()=>keywords.join("\u0000"), [
344
344
  keywords
345
345
  ]);
346
- useLayoutEffect(()=>{
346
+ __rspack_external_react.useLayoutEffect(()=>{
347
347
  const textValue = value ?? itemRef.current?.textContent?.trim() ?? "";
348
348
  registerItem({
349
349
  disabled,
@@ -366,7 +366,7 @@ const CommandItem = /*#__PURE__*/ forwardRef(({ children, className, disabled =
366
366
  registerItem,
367
367
  value
368
368
  ]);
369
- useEffect(()=>()=>{
369
+ __rspack_external_react.useEffect(()=>()=>{
370
370
  unregisterItem(generatedId);
371
371
  }, [
372
372
  generatedId,
@@ -1 +1 @@
1
- {"version":3,"file":"components/ui/command.js","sources":["../../../src/components/ui/command.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Dialog as BaseDialog} from \"@base-ui/react/dialog\";\r\nimport {Separator as BaseSeparator} from \"@base-ui/react/separator\";\r\nimport {Search} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport styles from \"./command.module.css\";\r\n\r\ntype CommandFilter = (value: string, search: string, keywords?: string[]) => number;\r\n\r\ninterface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command palette content.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label announced for the command region.\r\n * @default undefined\r\n */\r\n label?: string;\r\n /**\r\n * Whether items should be filtered automatically as the search value changes.\r\n * @default true\r\n */\r\n shouldFilter?: boolean;\r\n /**\r\n * Custom scoring function used to determine whether an item matches the current search value.\r\n * @default undefined\r\n */\r\n filter?: CommandFilter;\r\n /**\r\n * Deprecated uncontrolled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Deprecated controlled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Deprecated change callback retained for API compatibility.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether keyboard navigation should wrap from the last item to the first.\r\n * @default false\r\n */\r\n loop?: boolean;\r\n /**\r\n * Whether pointer hover should avoid changing the active item.\r\n * @default false\r\n */\r\n disablePointerSelection?: boolean;\r\n /**\r\n * Deprecated Vim keybinding toggle retained for API compatibility.\r\n * @default undefined\r\n */\r\n vimBindings?: boolean;\r\n}\r\n\r\ninterface CommandDialogProps extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialog.Root>, \"children\"> {\r\n /**\r\n * Command palette content rendered inside the dialog popup.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible dialog title announced to assistive technologies.\r\n * @default \"Command menu\"\r\n */\r\n title?: React.ReactNode;\r\n}\r\n\r\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"type\" | \"value\"> {\r\n /**\r\n * Controlled search value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Native input change handler invoked before the command-specific callback.\r\n * @default undefined\r\n */\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n /**\r\n * Callback fired when the command search value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (search: string) => void;\r\n}\r\n\r\ninterface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command items and groups.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label for the listbox container.\r\n * @default undefined\r\n */\r\n label?: string;\r\n}\r\n\r\ninterface CommandGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"value\"> {\r\n /**\r\n * Group contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Optional visual heading displayed above the group items.\r\n * @default undefined\r\n */\r\n heading?: React.ReactNode;\r\n /**\r\n * Optional stable value retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Whether the group should remain rendered even when it has no visible items.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandSeparatorProps extends React.ComponentPropsWithoutRef<typeof BaseSeparator> {\r\n /**\r\n * Whether the separator should remain visible while filtering is active.\r\n * @default false\r\n */\r\n alwaysRender?: boolean;\r\n}\r\n\r\ninterface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled and should be skipped by selection logic.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback invoked when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Optional value used for filtering and selection callbacks.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Additional search keywords included in the filter match set.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n /**\r\n * Whether the item should remain rendered even when filtered out.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandRegisteredItem {\r\n disabled: boolean;\r\n forceMount: boolean;\r\n groupId: string | null;\r\n id: string;\r\n keywords: string[];\r\n order: number;\r\n ref: React.RefObject<HTMLDivElement | null>;\r\n textValue: string;\r\n value?: string;\r\n}\r\n\r\ninterface CommandContextValue {\r\n activeItemId: string | null;\r\n disablePointerSelection: boolean;\r\n getVisibleItemCount: () => number;\r\n hasVisibleItemsInGroup: (groupId: string) => boolean;\r\n isFiltering: boolean;\r\n isItemVisible: (itemId: string) => boolean;\r\n listId: string;\r\n loop: boolean;\r\n registerItem: (item: Omit<CommandRegisteredItem, \"order\">) => void;\r\n search: string;\r\n setSearch: (value: string) => void;\r\n selectNextItem: () => void;\r\n selectPreviousItem: () => void;\r\n selectSpecificItem: (itemId: string | null) => void;\r\n shouldFilter: boolean;\r\n triggerActiveItem: () => void;\r\n unregisterItem: (itemId: string) => void;\r\n}\r\n\r\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\r\nconst CommandGroupContext = React.createContext<string | null>(null);\r\n\r\nfunction assignRef<TValue>(ref: React.ForwardedRef<TValue>, value: TValue): void {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n return;\r\n }\r\n\r\n if (ref) {\r\n ref.current = value;\r\n }\r\n}\r\n\r\nfunction normalizeCommandValue(value: string): string {\r\n return value.trim().toLowerCase();\r\n}\r\n\r\nfunction defaultCommandFilter(value: string, search: string, keywords: string[] = []): number {\r\n if (search.length === 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedSearch = normalizeCommandValue(search);\r\n const normalizedValue = normalizeCommandValue([value, ...keywords].join(\" \"));\r\n\r\n return normalizedValue.includes(normalizedSearch) ? 1 : 0;\r\n}\r\n\r\nfunction useCommandContext(componentName: string): CommandContextValue {\r\n const context = React.useContext(CommandContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Command.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Provides a lightweight, filterable command surface without depending on cmdk.\r\n *\r\n * @remarks\r\n * This wrapper preserves the existing compound-component API while replacing the\r\n * underlying implementation with a small context-driven registry. It supports\r\n * text filtering, arrow-key navigation, Enter-to-select, and pointer hover\r\n * selection for common command palette use cases.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Command label='Quick actions'>\r\n * <CommandInput placeholder='Search actions...' />\r\n * <CommandList>\r\n * <CommandItem onSelect={() => console.log(\"Open\")}>Open</CommandItem>\r\n * </CommandList>\r\n * </Command>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n defaultValue: _defaultValue,\r\n disablePointerSelection = false,\r\n filter,\r\n label,\r\n loop = false,\r\n onKeyDown,\r\n onValueChange: _onValueChange,\r\n shouldFilter = true,\r\n value: _value,\r\n vimBindings: _vimBindings,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [activeItemId, setActiveItemId] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const itemOrderRef = React.useRef(0);\r\n const itemsRef = React.useRef(new Map<string, CommandRegisteredItem>());\r\n const [itemsVersion, setItemsVersion] = React.useState(0);\r\n const listId = React.useId();\r\n\r\n const registerItem = React.useCallback((item: Omit<CommandRegisteredItem, \"order\">): void => {\r\n const existingItem = itemsRef.current.get(item.id);\r\n const nextItem: CommandRegisteredItem = {\r\n ...item,\r\n order: existingItem?.order ?? itemOrderRef.current++,\r\n };\r\n\r\n const hasChanged =\r\n !existingItem\r\n || existingItem.disabled !== nextItem.disabled\r\n || existingItem.forceMount !== nextItem.forceMount\r\n || existingItem.groupId !== nextItem.groupId\r\n || existingItem.keywords.join(\"\\u0000\") !== nextItem.keywords.join(\"\\u0000\")\r\n || existingItem.ref !== nextItem.ref\r\n || existingItem.textValue !== nextItem.textValue\r\n || existingItem.value !== nextItem.value;\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n itemsRef.current.set(item.id, nextItem);\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemId: string): void => {\r\n if (!itemsRef.current.delete(itemId)) {\r\n return;\r\n }\r\n\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const items = React.useMemo(() => {\r\n return [...itemsRef.current.values()].toSorted((firstItem, secondItem) => firstItem.order - secondItem.order);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsVersion is an intentional change counter\r\n }, [itemsVersion]);\r\n\r\n const isFiltering = shouldFilter && search.trim().length > 0;\r\n\r\n const isItemVisible = React.useCallback(\r\n (itemId: string): boolean => {\r\n const item = itemsRef.current.get(itemId);\r\n\r\n if (!item) {\r\n return false;\r\n }\r\n\r\n if (item.forceMount || !shouldFilter || search.trim().length === 0) {\r\n return true;\r\n }\r\n\r\n const itemValue = item.value ?? item.textValue;\r\n const itemFilter = filter ?? defaultCommandFilter;\r\n\r\n return itemFilter(itemValue, search, item.keywords) > 0;\r\n },\r\n [filter, search, shouldFilter],\r\n );\r\n\r\n const visibleItems = React.useMemo(() => items.filter((item) => isItemVisible(item.id)), [isItemVisible, items]);\r\n\r\n const selectableItems = React.useMemo(() => visibleItems.filter((item) => !item.disabled), [visibleItems]);\r\n\r\n React.useEffect(() => {\r\n if (selectableItems.length === 0) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(null);\r\n return;\r\n }\r\n\r\n if (!activeItemId || !selectableItems.some((item) => item.id === activeItemId)) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(selectableItems[0].id);\r\n }\r\n }, [activeItemId, selectableItems]);\r\n\r\n React.useEffect(() => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({\r\n block: \"nearest\",\r\n });\r\n }, [activeItemId]);\r\n\r\n const selectSpecificItem = React.useCallback((itemId: string | null): void => {\r\n setActiveItemId(itemId);\r\n }, []);\r\n\r\n const selectNextItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const nextIndex = currentIndex + 1;\r\n\r\n if (nextIndex >= selectableItems.length) {\r\n setActiveItemId(loop ? selectableItems[0].id : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[nextIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const selectPreviousItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const previousIndex = currentIndex - 1;\r\n\r\n if (previousIndex < 0) {\r\n setActiveItemId(loop ? (selectableItems.at(-1)?.id ?? selectableItems[0].id) : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[previousIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const triggerActiveItem = React.useCallback((): void => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.click();\r\n }, [activeItemId]);\r\n\r\n const hasVisibleItemsInGroup = React.useCallback(\r\n (groupId: string): boolean => visibleItems.some((item) => item.groupId === groupId),\r\n [visibleItems],\r\n );\r\n\r\n const getVisibleItemCount = React.useCallback((): number => visibleItems.length, [visibleItems.length]);\r\n\r\n const contextValue = React.useMemo<CommandContextValue>(\r\n () => ({\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n }),\r\n [\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n ],\r\n );\r\n\r\n return (\r\n <CommandContext.Provider value={contextValue}>\r\n <div\r\n ref={ref}\r\n aria-label={label}\r\n className={cn(styles.command, className)}\r\n role='toolbar'\r\n onKeyDown={(event) => {\r\n onKeyDown?.(event);\r\n\r\n if (event.defaultPrevented) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\": {\r\n event.preventDefault();\r\n selectNextItem();\r\n break;\r\n }\r\n\r\n case \"ArrowUp\": {\r\n event.preventDefault();\r\n selectPreviousItem();\r\n break;\r\n }\r\n\r\n case \"Home\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"End\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems.at(-1)?.id ?? selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"Enter\": {\r\n if (event.nativeEvent.isComposing) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n triggerActiveItem();\r\n break;\r\n }\r\n\r\n default: {\r\n break;\r\n }\r\n }\r\n }}\r\n {...props}>\r\n {children}\r\n </div>\r\n </CommandContext.Provider>\r\n );\r\n },\r\n);\r\nCommand.displayName = \"Command\";\r\n\r\n/**\r\n * Renders the command surface inside a modal dialog.\r\n *\r\n * @remarks\r\n * - Renders a Base UI dialog popup\r\n * - Built on Base UI Dialog primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandDialog open={open} onOpenChange={setOpen}>\r\n * <CommandInput placeholder='Search...' />\r\n * </CommandDialog>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nfunction CommandDialog({children, open, onOpenChange, title = \"Command menu\", ...props}: Readonly<CommandDialogProps>): React.JSX.Element {\r\n return (\r\n <BaseDialog.Root\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n {...props}>\r\n <BaseDialog.Portal>\r\n <BaseDialog.Backdrop className={styles.backdrop} />\r\n <BaseDialog.Popup className={styles.dialogPopup}>\r\n <BaseDialog.Title className={styles.srOnly}>{title}</BaseDialog.Title>\r\n <Command>{children}</Command>\r\n </BaseDialog.Popup>\r\n </BaseDialog.Portal>\r\n </BaseDialog.Root>\r\n );\r\n}\r\nCommandDialog.displayName = \"CommandDialog\";\r\n\r\n/**\r\n * Provides the searchable input surface for a command palette.\r\n *\r\n * @remarks\r\n * - Renders an `<input>` element inside a wrapper `<div>`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandInput placeholder='Search...' />\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/combobox_role | ARIA Combobox Role}\r\n */\r\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(({className, onChange, onValueChange, value, ...props}, ref) => {\r\n const {activeItemId, listId, search, selectSpecificItem, setSearch} = useCommandContext(\"CommandInput\");\r\n const isControlled = value !== undefined;\r\n const inputValue = isControlled ? value : search;\r\n\r\n React.useEffect(() => {\r\n if (!isControlled) {\r\n return;\r\n }\r\n\r\n setSearch(value ?? \"\");\r\n }, [isControlled, setSearch, value]);\r\n\r\n return (\r\n <div className={styles.inputWrapper}>\r\n <Search className={styles.searchIcon} />\r\n <input\r\n ref={ref}\r\n aria-activedescendant={activeItemId ?? undefined}\r\n aria-autocomplete='list'\r\n aria-controls={listId}\r\n aria-expanded='true'\r\n className={cn(styles.input, className)}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n\r\n const nextSearchValue = event.currentTarget.value;\r\n setSearch(nextSearchValue);\r\n onValueChange?.(nextSearchValue);\r\n selectSpecificItem(null);\r\n }}\r\n role='combobox'\r\n type='text'\r\n value={inputValue}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n});\r\nCommandInput.displayName = \"CommandInput\";\r\n\r\n/**\r\n * Renders the listbox container that hosts command items and groups.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"listbox\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandList>\r\n * <CommandItem>Settings</CommandItem>\r\n * </CommandList>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/listbox_role | ARIA Listbox Role}\r\n */\r\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(({className, label, ...props}, ref) => {\r\n const {listId} = useCommandContext(\"CommandList\");\r\n\r\n return (\r\n <div\r\n aria-label={label}\r\n ref={ref}\r\n className={cn(styles.list, className)}\r\n id={listId}\r\n role='listbox'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandList.displayName = \"CommandList\";\r\n\r\n/**\r\n * Renders a fallback empty-state message when no command items are visible.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"status\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandEmpty>No results found.</CommandEmpty>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/status_role | ARIA Status Role}\r\n */\r\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({className, ...props}, ref) => {\r\n const {getVisibleItemCount} = useCommandContext(\"CommandEmpty\");\r\n\r\n if (getVisibleItemCount() > 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(styles.empty, className)}\r\n role='status'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandEmpty.displayName = \"CommandEmpty\";\r\n\r\n/**\r\n * Groups related command items under an optional heading.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandGroup heading='Suggestions'>\r\n * <CommandItem>Profile</CommandItem>\r\n * </CommandGroup>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/group_role | ARIA Group Role}\r\n */\r\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\r\n ({children, className, forceMount = false, heading, value: _value, ...props}, ref) => {\r\n const groupId = React.useId();\r\n const {hasVisibleItemsInGroup, isFiltering} = useCommandContext(\"CommandGroup\");\r\n\r\n if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <CommandGroupContext.Provider value={groupId}>\r\n <div\r\n ref={ref}\r\n className={cn(styles.group, className)}\r\n data-command-group=''\r\n {...props}>\r\n {heading ? <div className={styles.groupHeading}>{heading}</div> : null}\r\n {children}\r\n </div>\r\n </CommandGroupContext.Provider>\r\n );\r\n },\r\n);\r\nCommandGroup.displayName = \"CommandGroup\";\r\n\r\n/**\r\n * Renders a separator between command groups or item sections.\r\n *\r\n * @remarks\r\n * - Renders the shared separator primitive\r\n * - Built on Base UI Separator\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/separator | Base UI Separator Docs}\r\n */\r\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\r\n ({alwaysRender = false, className, orientation = \"horizontal\", ...props}, ref) => {\r\n const {isFiltering} = useCommandContext(\"CommandSeparator\");\r\n\r\n if (isFiltering && !alwaysRender) {\r\n return null;\r\n }\r\n\r\n return (\r\n <BaseSeparator\r\n ref={ref}\r\n className={cn(styles.separator, className)}\r\n orientation={orientation}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\nCommandSeparator.displayName = \"CommandSeparator\";\r\n\r\n/**\r\n * Renders a selectable command option with filtering metadata and keyboard support.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"option\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandItem keywords={[\"preferences\"]}>Settings</CommandItem>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/option_role | ARIA Option Role}\r\n */\r\nconst CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\r\n ({children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props}, ref) => {\r\n const {activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem} =\r\n useCommandContext(\"CommandItem\");\r\n const groupId = React.useContext(CommandGroupContext);\r\n const generatedId = React.useId();\r\n const itemRef = React.useRef<HTMLDivElement | null>(null);\r\n const keywordSignature = React.useMemo(() => keywords.join(\"\\u0000\"), [keywords]);\r\n\r\n React.useLayoutEffect(() => {\r\n const textValue = value ?? itemRef.current?.textContent?.trim() ?? \"\";\r\n\r\n registerItem({\r\n disabled,\r\n forceMount,\r\n groupId,\r\n id: generatedId,\r\n keywords,\r\n ref: itemRef,\r\n textValue,\r\n value,\r\n });\r\n }, [children, disabled, forceMount, generatedId, groupId, keywordSignature, keywords, registerItem, value]);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n unregisterItem(generatedId);\r\n };\r\n }, [generatedId, unregisterItem]);\r\n\r\n const isVisible = forceMount || !isFiltering || isItemVisible(generatedId);\r\n\r\n if (!isVisible) {\r\n return null;\r\n }\r\n\r\n const isSelected = activeItemId === generatedId;\r\n\r\n return (\r\n <div\r\n {...props}\r\n ref={(node) => {\r\n itemRef.current = node;\r\n assignRef(ref, node);\r\n }}\r\n aria-disabled={disabled || undefined}\r\n aria-selected={isSelected}\r\n className={cn(styles.item, className)}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n data-selected={isSelected ? \"true\" : undefined}\r\n id={generatedId}\r\n onClick={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n onClick?.(event);\r\n }}\r\n onKeyDown={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n }\r\n }}\r\n onFocus={() => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n onMouseEnter={(event) => {\r\n onMouseEnter?.(event);\r\n\r\n if (disabled || disablePointerSelection) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n role='option'\r\n tabIndex={disabled ? -1 : 0}>\r\n {children}\r\n </div>\r\n );\r\n },\r\n);\r\nCommandItem.displayName = \"CommandItem\";\r\n\r\n/**\r\n * Renders auxiliary shortcut text aligned to the edge of a command item.\r\n *\r\n * @remarks\r\n * - Renders a `<span>` element\r\n * - Built as a lightweight presentational helper for command menus\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandShortcut>⌘K</CommandShortcut>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/span | HTML span element}\r\n */\r\nconst CommandShortcut = ({className, ...props}: Readonly<React.HTMLAttributes<HTMLSpanElement>>): React.JSX.Element => {\r\n return (\r\n <span\r\n className={cn(styles.shortcut, className)}\r\n {...props}\r\n />\r\n );\r\n};\r\nCommandShortcut.displayName = \"CommandShortcut\";\r\n\r\nexport {Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut};\r\n"],"names":["CommandContext","React","CommandGroupContext","assignRef","ref","value","normalizeCommandValue","defaultCommandFilter","search","keywords","normalizedSearch","normalizedValue","useCommandContext","componentName","context","Error","Command","children","className","_defaultValue","disablePointerSelection","filter","label","loop","onKeyDown","_onValueChange","shouldFilter","_value","_vimBindings","props","activeItemId","setActiveItemId","setSearch","itemOrderRef","itemsRef","Map","itemsVersion","setItemsVersion","listId","registerItem","item","existingItem","nextItem","hasChanged","currentVersion","unregisterItem","itemId","items","firstItem","secondItem","isFiltering","isItemVisible","itemValue","itemFilter","visibleItems","selectableItems","selectSpecificItem","selectNextItem","currentIndex","nextIndex","selectPreviousItem","previousIndex","triggerActiveItem","hasVisibleItemsInGroup","groupId","getVisibleItemCount","contextValue","cn","styles","event","CommandDialog","open","onOpenChange","title","BaseDialog","CommandInput","onChange","onValueChange","isControlled","undefined","inputValue","Search","nextSearchValue","CommandList","CommandEmpty","CommandGroup","forceMount","heading","CommandSeparator","alwaysRender","orientation","BaseSeparator","CommandItem","disabled","onClick","onMouseEnter","onSelect","generatedId","itemRef","keywordSignature","textValue","isVisible","isSelected","node","CommandShortcut"],"mappings":";;;;;;;;AA8MA,MAAMA,iBAAiB,WAAHA,GAAGC,cAAgD;AACvE,MAAMC,sBAAsB,WAAHA,GAAGD,cAAmC;AAE/D,SAASE,UAAkBC,GAA+B,EAAEC,KAAa;IACvE,IAAI,AAAe,cAAf,OAAOD,KAAoB,YAC7BA,IAAIC;IAIN,IAAID,KACFA,IAAI,OAAO,GAAGC;AAElB;AAEA,SAASC,sBAAsBD,KAAa;IAC1C,OAAOA,MAAM,IAAI,GAAG,WAAW;AACjC;AAEA,SAASE,qBAAqBF,KAAa,EAAEG,MAAc,EAAEC,WAAqB,EAAE;IAClF,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EACf,OAAO;IAGT,MAAME,mBAAmBJ,sBAAsBE;IAC/C,MAAMG,kBAAkBL,sBAAsB;QAACD;WAAUI;KAAS,CAAC,IAAI,CAAC;IAExE,OAAOE,gBAAgB,QAAQ,CAACD,oBAAoB,IAAI;AAC1D;AAEA,SAASE,kBAAkBC,aAAqB;IAC9C,MAAMC,UAAUb,WAAiBD;IAEjC,IAAI,CAACc,SACH,MAAM,IAAIC,MAAM,GAAGF,cAAc,6BAA6B,CAAC;IAGjE,OAAOC;AACT;AAuBA,MAAME,UAAU,WAAHA,GAAGf,WACd,CACE,EACEgB,QAAQ,EACRC,SAAS,EACT,cAAcC,aAAa,EAC3BC,0BAA0B,KAAK,EAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,KAAK,EACZC,SAAS,EACT,eAAeC,cAAc,EAC7BC,eAAe,IAAI,EACnB,OAAOC,MAAM,EACb,aAAaC,YAAY,EACzB,GAAGC,OACJ,EACDzB;IAEA,MAAM,CAAC0B,cAAcC,gBAAgB,GAAG9B,SAA8B;IACtE,MAAM,CAACO,QAAQwB,UAAU,GAAG/B,SAAe;IAC3C,MAAMgC,eAAehC,OAAa;IAClC,MAAMiC,WAAWjC,OAAa,IAAIkC;IAClC,MAAM,CAACC,cAAcC,gBAAgB,GAAGpC,SAAe;IACvD,MAAMqC,SAASrC;IAEf,MAAMsC,eAAetC,YAAkB,CAACuC;QACtC,MAAMC,eAAeP,SAAS,OAAO,CAAC,GAAG,CAACM,KAAK,EAAE;QACjD,MAAME,WAAkC;YACtC,GAAGF,IAAI;YACP,OAAOC,cAAc,SAASR,aAAa,OAAO;QACpD;QAEA,MAAMU,aACJ,CAACF,gBACEA,aAAa,QAAQ,KAAKC,SAAS,QAAQ,IAC3CD,aAAa,UAAU,KAAKC,SAAS,UAAU,IAC/CD,aAAa,OAAO,KAAKC,SAAS,OAAO,IACzCD,aAAa,QAAQ,CAAC,IAAI,CAAC,cAAcC,SAAS,QAAQ,CAAC,IAAI,CAAC,aAChED,aAAa,GAAG,KAAKC,SAAS,GAAG,IACjCD,aAAa,SAAS,KAAKC,SAAS,SAAS,IAC7CD,aAAa,KAAK,KAAKC,SAAS,KAAK;QAE1C,IAAI,CAACC,YACH;QAGFT,SAAS,OAAO,CAAC,GAAG,CAACM,KAAK,EAAE,EAAEE;QAC9BL,gBAAgB,CAACO,iBAAmBA,iBAAiB;IACvD,GAAG,EAAE;IAEL,MAAMC,iBAAiB5C,YAAkB,CAAC6C;QACxC,IAAI,CAACZ,SAAS,OAAO,CAAC,MAAM,CAACY,SAC3B;QAGFT,gBAAgB,CAACO,iBAAmBA,iBAAiB;IACvD,GAAG,EAAE;IAEL,MAAMG,QAAQ9C,QAAc,IACnB;eAAIiC,SAAS,OAAO,CAAC,MAAM;SAAG,CAAC,QAAQ,CAAC,CAACc,WAAWC,aAAeD,UAAU,KAAK,GAAGC,WAAW,KAAK,GAE3G;QAACb;KAAa;IAEjB,MAAMc,cAAcxB,gBAAgBlB,OAAO,IAAI,GAAG,MAAM,GAAG;IAE3D,MAAM2C,gBAAgBlD,YACpB,CAAC6C;QACC,MAAMN,OAAON,SAAS,OAAO,CAAC,GAAG,CAACY;QAElC,IAAI,CAACN,MACH,OAAO;QAGT,IAAIA,KAAK,UAAU,IAAI,CAACd,gBAAgBlB,AAAyB,MAAzBA,OAAO,IAAI,GAAG,MAAM,EAC1D,OAAO;QAGT,MAAM4C,YAAYZ,KAAK,KAAK,IAAIA,KAAK,SAAS;QAC9C,MAAMa,aAAahC,UAAUd;QAE7B,OAAO8C,WAAWD,WAAW5C,QAAQgC,KAAK,QAAQ,IAAI;IACxD,GACA;QAACnB;QAAQb;QAAQkB;KAAa;IAGhC,MAAM4B,eAAerD,QAAc,IAAM8C,MAAM,MAAM,CAAC,CAACP,OAASW,cAAcX,KAAK,EAAE,IAAI;QAACW;QAAeJ;KAAM;IAE/G,MAAMQ,kBAAkBtD,QAAc,IAAMqD,aAAa,MAAM,CAAC,CAACd,OAAS,CAACA,KAAK,QAAQ,GAAG;QAACc;KAAa;IAEzGrD,UAAgB;QACd,IAAIsD,AAA2B,MAA3BA,gBAAgB,MAAM,EAAQ,YAEhCxB,gBAAgB;QAIlB,IAAI,CAACD,gBAAgB,CAACyB,gBAAgB,IAAI,CAAC,CAACf,OAASA,KAAK,EAAE,KAAKV,eAE/DC,gBAAgBwB,eAAe,CAAC,EAAE,CAAC,EAAE;IAEzC,GAAG;QAACzB;QAAcyB;KAAgB;IAElCtD,UAAgB;QACd,IAAI,CAAC6B,cACH;QAGFI,SAAS,OAAO,CAAC,GAAG,CAACJ,eAAe,IAAI,SAAS,eAAe;YAC9D,OAAO;QACT;IACF,GAAG;QAACA;KAAa;IAEjB,MAAM0B,qBAAqBvD,YAAkB,CAAC6C;QAC5Cf,gBAAgBe;IAClB,GAAG,EAAE;IAEL,MAAMW,iBAAiBxD,YAAkB;QACvC,IAAIsD,AAA2B,MAA3BA,gBAAgB,MAAM,EACxB;QAGF,MAAMG,eAAeH,gBAAgB,SAAS,CAAC,CAACf,OAASA,KAAK,EAAE,KAAKV;QAErE,IAAI4B,AAAiB,OAAjBA,cAAqB,YACvB3B,gBAAgBwB,eAAe,CAAC,EAAE,CAAC,EAAE;QAIvC,MAAMI,YAAYD,eAAe;QAEjC,IAAIC,aAAaJ,gBAAgB,MAAM,EAAE,YACvCxB,gBAAgBR,OAAOgC,eAAe,CAAC,EAAE,CAAC,EAAE,GAAGA,eAAe,CAACG,aAAa,CAAC,EAAE;QAIjF3B,gBAAgBwB,eAAe,CAACI,UAAU,CAAC,EAAE;IAC/C,GAAG;QAAC7B;QAAcP;QAAMgC;KAAgB;IAExC,MAAMK,qBAAqB3D,YAAkB;QAC3C,IAAIsD,AAA2B,MAA3BA,gBAAgB,MAAM,EACxB;QAGF,MAAMG,eAAeH,gBAAgB,SAAS,CAAC,CAACf,OAASA,KAAK,EAAE,KAAKV;QAErE,IAAI4B,AAAiB,OAAjBA,cAAqB,YACvB3B,gBAAgBwB,eAAe,CAAC,EAAE,CAAC,EAAE;QAIvC,MAAMM,gBAAgBH,eAAe;QAErC,IAAIG,gBAAgB,GAAG,YACrB9B,gBAAgBR,OAAQgC,gBAAgB,EAAE,CAAC,KAAK,MAAMA,eAAe,CAAC,EAAE,CAAC,EAAE,GAAIA,eAAe,CAACG,aAAa,CAAC,EAAE;QAIjH3B,gBAAgBwB,eAAe,CAACM,cAAc,CAAC,EAAE;IACnD,GAAG;QAAC/B;QAAcP;QAAMgC;KAAgB;IAExC,MAAMO,oBAAoB7D,YAAkB;QAC1C,IAAI,CAAC6B,cACH;QAGFI,SAAS,OAAO,CAAC,GAAG,CAACJ,eAAe,IAAI,SAAS;IACnD,GAAG;QAACA;KAAa;IAEjB,MAAMiC,yBAAyB9D,YAC7B,CAAC+D,UAA6BV,aAAa,IAAI,CAAC,CAACd,OAASA,KAAK,OAAO,KAAKwB,UAC3E;QAACV;KAAa;IAGhB,MAAMW,sBAAsBhE,YAAkB,IAAcqD,aAAa,MAAM,EAAE;QAACA,aAAa,MAAM;KAAC;IAEtG,MAAMY,eAAejE,QACnB,IAAO;YACL6B;YACAV;YACA6C;YACAF;YACAb;YACAC;YACAb;YACAf;YACAgB;YACA/B;YACAwB;YACAyB;YACAG;YACAJ;YACA9B;YACAoC;YACAjB;QACF,IACA;QACEf;QACAV;QACA6C;QACAF;QACAb;QACAC;QACAb;QACAf;QACAgB;QACA/B;QACAwB;QACAyB;QACAG;QACAJ;QACA9B;QACAoC;QACAjB;KACD;IAGH,OAAO,WAAP,GACE,IAAC7C,eAAe,QAAQ;QAAC,OAAOkE;kBAC9B,kBAAC;YACC,KAAK9D;YACL,cAAYkB;YACZ,WAAW6C,GAAGC,eAAAA,OAAc,EAAElD;YAC9B,MAAK;YACL,WAAW,CAACmD;gBACV7C,YAAY6C;gBAEZ,IAAIA,MAAM,gBAAgB,EACxB;gBAGF,OAAQA,MAAM,GAAG;oBACf,KAAK;wBACHA,MAAM,cAAc;wBACpBZ;wBACA;oBAGF,KAAK;wBACHY,MAAM,cAAc;wBACpBT;wBACA;oBAGF,KAAK;wBACH,IAAIL,AAA2B,MAA3BA,gBAAgB,MAAM,EACxB;wBAGFc,MAAM,cAAc;wBACpBtC,gBAAgBwB,eAAe,CAAC,EAAE,CAAC,EAAE;wBACrC;oBAGF,KAAK;wBACH,IAAIA,AAA2B,MAA3BA,gBAAgB,MAAM,EACxB;wBAGFc,MAAM,cAAc;wBACpBtC,gBAAgBwB,gBAAgB,EAAE,CAAC,KAAK,MAAMA,eAAe,CAAC,EAAE,CAAC,EAAE;wBACnE;oBAGF,KAAK;wBACH,IAAIc,MAAM,WAAW,CAAC,WAAW,EAC/B;wBAGFA,MAAM,cAAc;wBACpBP;wBACA;oBAGF;wBACE;gBAEJ;YACF;YACC,GAAGjC,KAAK;sBACRZ;;;AAIT;AAEFD,QAAQ,WAAW,GAAG;AAkBtB,SAASsD,cAAc,EAACrD,QAAQ,EAAEsD,IAAI,EAAEC,YAAY,EAAEC,QAAQ,cAAc,EAAE,GAAG5C,OAAoC;IACnH,OAAO,WAAP,GACE,IAAC6C,OAAAA,IAAe;QACd,MAAMH;QACN,cAAcC;QACb,GAAG3C,KAAK;kBACT,mBAAC6C,OAAAA,MAAiB;;8BAChB,IAACA,OAAAA,QAAmB;oBAAC,WAAWN,eAAAA,QAAe;;8BAC/C,KAACM,OAAAA,KAAgB;oBAAC,WAAWN,eAAAA,WAAkB;;sCAC7C,IAACM,OAAAA,KAAgB;4BAAC,WAAWN,eAAAA,MAAa;sCAAGK;;sCAC7C,IAACzD,SAAOA;sCAAEC;;;;;;;AAKpB;AACAqD,cAAc,WAAW,GAAG;AAgB5B,MAAMK,eAAe,WAAHA,GAAG1E,WAAsD,CAAC,EAACiB,SAAS,EAAE0D,QAAQ,EAAEC,aAAa,EAAExE,KAAK,EAAE,GAAGwB,OAAM,EAAEzB;IACjI,MAAM,EAAC0B,YAAY,EAAEQ,MAAM,EAAE9B,MAAM,EAAEgD,kBAAkB,EAAExB,SAAS,EAAC,GAAGpB,kBAAkB;IACxF,MAAMkE,eAAezE,AAAU0E,WAAV1E;IACrB,MAAM2E,aAAaF,eAAezE,QAAQG;IAE1CP,UAAgB;QACd,IAAI,CAAC6E,cACH;QAGF9C,UAAU3B,SAAS;IACrB,GAAG;QAACyE;QAAc9C;QAAW3B;KAAM;IAEnC,OAAO,WAAP,GACE,KAAC;QAAI,WAAW+D,eAAAA,YAAmB;;0BACjC,IAACa,QAAMA;gBAAC,WAAWb,eAAAA,UAAiB;;0BACpC,IAAC;gBACC,KAAKhE;gBACL,yBAAuB0B,gBAAgBiD;gBACvC,qBAAkB;gBAClB,iBAAezC;gBACf,iBAAc;gBACd,WAAW6B,GAAGC,eAAAA,KAAY,EAAElD;gBAC5B,UAAU,CAACmD;oBACTO,WAAWP;oBAEX,MAAMa,kBAAkBb,MAAM,aAAa,CAAC,KAAK;oBACjDrC,UAAUkD;oBACVL,gBAAgBK;oBAChB1B,mBAAmB;gBACrB;gBACA,MAAK;gBACL,MAAK;gBACL,OAAOwB;gBACN,GAAGnD,KAAK;;;;AAIjB;AACA8C,aAAa,WAAW,GAAG;AAkB3B,MAAMQ,cAAc,WAAHA,GAAGlF,WAAmD,CAAC,EAACiB,SAAS,EAAEI,KAAK,EAAE,GAAGO,OAAM,EAAEzB;IACpG,MAAM,EAACkC,MAAM,EAAC,GAAG1B,kBAAkB;IAEnC,OAAO,WAAP,GACE,IAAC;QACC,cAAYU;QACZ,KAAKlB;QACL,WAAW+D,GAAGC,eAAAA,IAAW,EAAElD;QAC3B,IAAIoB;QACJ,MAAK;QACJ,GAAGT,KAAK;;AAGf;AACAsD,YAAY,WAAW,GAAG;AAgB1B,MAAMC,eAAe,WAAHA,GAAGnF,WAAuE,CAAC,EAACiB,SAAS,EAAE,GAAGW,OAAM,EAAEzB;IAClH,MAAM,EAAC6D,mBAAmB,EAAC,GAAGrD,kBAAkB;IAEhD,IAAIqD,wBAAwB,GAC1B,OAAO;IAGT,OAAO,WAAP,GACE,IAAC;QACC,KAAK7D;QACL,WAAW+D,GAAGC,eAAAA,KAAY,EAAElD;QAC5B,MAAK;QACJ,GAAGW,KAAK;;AAGf;AACAuD,aAAa,WAAW,GAAG;AAkB3B,MAAMC,eAAe,WAAHA,GAAGpF,WACnB,CAAC,EAACgB,QAAQ,EAAEC,SAAS,EAAEoE,aAAa,KAAK,EAAEC,OAAO,EAAE,OAAO5D,MAAM,EAAE,GAAGE,OAAM,EAAEzB;IAC5E,MAAM4D,UAAU/D;IAChB,MAAM,EAAC8D,sBAAsB,EAAEb,WAAW,EAAC,GAAGtC,kBAAkB;IAEhE,IAAI,CAAC0E,cAAcpC,eAAe,CAACa,uBAAuBC,UACxD,OAAO;IAGT,OAAO,WAAP,GACE,IAAC9D,oBAAoB,QAAQ;QAAC,OAAO8D;kBACnC,mBAAC;YACC,KAAK5D;YACL,WAAW+D,GAAGC,eAAAA,KAAY,EAAElD;YAC5B,sBAAmB;YAClB,GAAGW,KAAK;;gBACR0D,UAAU,WAAVA,GAAU,IAAC;oBAAI,WAAWnB,eAAAA,YAAmB;8BAAGmB;qBAAiB;gBACjEtE;;;;AAIT;AAEFoE,aAAa,WAAW,GAAG;AAgB3B,MAAMG,mBAAmB,WAAHA,GAAGvF,WACvB,CAAC,EAACwF,eAAe,KAAK,EAAEvE,SAAS,EAAEwE,cAAc,YAAY,EAAE,GAAG7D,OAAM,EAAEzB;IACxE,MAAM,EAAC8C,WAAW,EAAC,GAAGtC,kBAAkB;IAExC,IAAIsC,eAAe,CAACuC,cAClB,OAAO;IAGT,OAAO,WAAP,GACE,IAACE,WAAaA;QACZ,KAAKvF;QACL,WAAW+D,GAAGC,eAAAA,SAAgB,EAAElD;QAChC,aAAawE;QACZ,GAAG7D,KAAK;;AAGf;AAEF2D,iBAAiB,WAAW,GAAG;AAgB/B,MAAMI,cAAc,WAAHA,GAAG3F,WAClB,CAAC,EAACgB,QAAQ,EAAEC,SAAS,EAAE2E,WAAW,KAAK,EAAEP,aAAa,KAAK,EAAE7E,WAAW,EAAE,EAAEqF,OAAO,EAAEC,YAAY,EAAEC,QAAQ,EAAE3F,KAAK,EAAE,GAAGwB,OAAM,EAAEzB;IAC7H,MAAM,EAAC0B,YAAY,EAAEV,uBAAuB,EAAE8B,WAAW,EAAEC,aAAa,EAAEZ,YAAY,EAAEiB,kBAAkB,EAAEX,cAAc,EAAC,GACzHjC,kBAAkB;IACpB,MAAMoD,UAAU/D,WAAiBC;IACjC,MAAM+F,cAAchG;IACpB,MAAMiG,UAAUjG,OAAoC;IACpD,MAAMkG,mBAAmBlG,QAAc,IAAMQ,SAAS,IAAI,CAAC,WAAW;QAACA;KAAS;IAEhFR,gBAAsB;QACpB,MAAMmG,YAAY/F,SAAS6F,QAAQ,OAAO,EAAE,aAAa,UAAU;QAEnE3D,aAAa;YACXsD;YACAP;YACAtB;YACA,IAAIiC;YACJxF;YACA,KAAKyF;YACLE;YACA/F;QACF;IACF,GAAG;QAACY;QAAU4E;QAAUP;QAAYW;QAAajC;QAASmC;QAAkB1F;QAAU8B;QAAclC;KAAM;IAE1GJ,UAAgB,IACP;YACL4C,eAAeoD;QACjB,GACC;QAACA;QAAapD;KAAe;IAEhC,MAAMwD,YAAYf,cAAc,CAACpC,eAAeC,cAAc8C;IAE9D,IAAI,CAACI,WACH,OAAO;IAGT,MAAMC,aAAaxE,iBAAiBmE;IAEpC,OAAO,WAAP,GACE,IAAC;QACE,GAAGpE,KAAK;QACT,KAAK,CAAC0E;YACJL,QAAQ,OAAO,GAAGK;YAClBpG,UAAUC,KAAKmG;QACjB;QACA,iBAAeV,YAAYd;QAC3B,iBAAeuB;QACf,WAAWnC,GAAGC,eAAAA,IAAW,EAAElD;QAC3B,iBAAe2E,WAAW,SAASd;QACnC,iBAAeuB,aAAa,SAASvB;QACrC,IAAIkB;QACJ,SAAS,CAAC5B;YACR,IAAIwB,UAAU,YACZxB,MAAM,cAAc;YAItBb,mBAAmByC;YACnBD,WAAW3F,SAAS6F,QAAQ,OAAO,EAAE,aAAa,UAAU;YAC5DJ,UAAUzB;QACZ;QACA,WAAW,CAACA;YACV,IAAIwB,UAAU,YACZxB,MAAM,cAAc;YAItB,IAAIA,AAAc,YAAdA,MAAM,GAAG,IAAgBA,AAAc,QAAdA,MAAM,GAAG,EAAU;gBAC9CA,MAAM,cAAc;gBACpBb,mBAAmByC;gBACnBD,WAAW3F,SAAS6F,QAAQ,OAAO,EAAE,aAAa,UAAU;YAC9D;QACF;QACA,SAAS;YACP,IAAIL,UACF;YAGFrC,mBAAmByC;QACrB;QACA,cAAc,CAAC5B;YACb0B,eAAe1B;YAEf,IAAIwB,YAAYzE,yBACd;YAGFoC,mBAAmByC;QACrB;QACA,MAAK;QACL,UAAUJ,WAAW,KAAK;kBACzB5E;;AAGP;AAEF2E,YAAY,WAAW,GAAG;AAgB1B,MAAMY,kBAAkB,CAAC,EAACtF,SAAS,EAAE,GAAGW,OAAuD,GACtF,WAAP,GACE,IAAC;QACC,WAAWsC,GAAGC,eAAAA,QAAe,EAAElD;QAC9B,GAAGW,KAAK;;AAIf2E,gBAAgB,WAAW,GAAG"}
1
+ {"version":3,"file":"components/ui/command.js","sources":["../../../src/components/ui/command.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Dialog as BaseDialog} from \"@base-ui/react/dialog\";\r\nimport {Separator as BaseSeparator} from \"@base-ui/react/separator\";\r\nimport {Search} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport styles from \"./command.module.css\";\r\n\r\ntype CommandFilter = (value: string, search: string, keywords?: string[]) => number;\r\n\r\ninterface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command palette content.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label announced for the command region.\r\n * @default undefined\r\n */\r\n label?: string;\r\n /**\r\n * Whether items should be filtered automatically as the search value changes.\r\n * @default true\r\n */\r\n shouldFilter?: boolean;\r\n /**\r\n * Custom scoring function used to determine whether an item matches the current search value.\r\n * @default undefined\r\n */\r\n filter?: CommandFilter;\r\n /**\r\n * Deprecated uncontrolled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Deprecated controlled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Deprecated change callback retained for API compatibility.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether keyboard navigation should wrap from the last item to the first.\r\n * @default false\r\n */\r\n loop?: boolean;\r\n /**\r\n * Whether pointer hover should avoid changing the active item.\r\n * @default false\r\n */\r\n disablePointerSelection?: boolean;\r\n /**\r\n * Deprecated Vim keybinding toggle retained for API compatibility.\r\n * @default undefined\r\n */\r\n vimBindings?: boolean;\r\n}\r\n\r\ninterface CommandDialogProps extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialog.Root>, \"children\"> {\r\n /**\r\n * Command palette content rendered inside the dialog popup.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible dialog title announced to assistive technologies.\r\n * @default \"Command menu\"\r\n */\r\n title?: React.ReactNode;\r\n}\r\n\r\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"type\" | \"value\"> {\r\n /**\r\n * Controlled search value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Native input change handler invoked before the command-specific callback.\r\n * @default undefined\r\n */\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n /**\r\n * Callback fired when the command search value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (search: string) => void;\r\n}\r\n\r\ninterface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command items and groups.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label for the listbox container.\r\n * @default undefined\r\n */\r\n label?: string;\r\n}\r\n\r\ninterface CommandGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"value\"> {\r\n /**\r\n * Group contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Optional visual heading displayed above the group items.\r\n * @default undefined\r\n */\r\n heading?: React.ReactNode;\r\n /**\r\n * Optional stable value retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Whether the group should remain rendered even when it has no visible items.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandSeparatorProps extends React.ComponentPropsWithoutRef<typeof BaseSeparator> {\r\n /**\r\n * Whether the separator should remain visible while filtering is active.\r\n * @default false\r\n */\r\n alwaysRender?: boolean;\r\n}\r\n\r\ninterface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled and should be skipped by selection logic.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback invoked when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Optional value used for filtering and selection callbacks.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Additional search keywords included in the filter match set.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n /**\r\n * Whether the item should remain rendered even when filtered out.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandRegisteredItem {\r\n disabled: boolean;\r\n forceMount: boolean;\r\n groupId: string | null;\r\n id: string;\r\n keywords: string[];\r\n order: number;\r\n ref: React.RefObject<HTMLDivElement | null>;\r\n textValue: string;\r\n value?: string;\r\n}\r\n\r\ninterface CommandContextValue {\r\n activeItemId: string | null;\r\n disablePointerSelection: boolean;\r\n getVisibleItemCount: () => number;\r\n hasVisibleItemsInGroup: (groupId: string) => boolean;\r\n isFiltering: boolean;\r\n isItemVisible: (itemId: string) => boolean;\r\n listId: string;\r\n loop: boolean;\r\n registerItem: (item: Omit<CommandRegisteredItem, \"order\">) => void;\r\n search: string;\r\n setSearch: (value: string) => void;\r\n selectNextItem: () => void;\r\n selectPreviousItem: () => void;\r\n selectSpecificItem: (itemId: string | null) => void;\r\n shouldFilter: boolean;\r\n triggerActiveItem: () => void;\r\n unregisterItem: (itemId: string) => void;\r\n}\r\n\r\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\r\nconst CommandGroupContext = React.createContext<string | null>(null);\r\n\r\nfunction assignRef<TValue>(ref: React.ForwardedRef<TValue>, value: TValue): void {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n return;\r\n }\r\n\r\n if (ref) {\r\n ref.current = value;\r\n }\r\n}\r\n\r\nfunction normalizeCommandValue(value: string): string {\r\n return value.trim().toLowerCase();\r\n}\r\n\r\nfunction defaultCommandFilter(value: string, search: string, keywords: string[] = []): number {\r\n if (search.length === 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedSearch = normalizeCommandValue(search);\r\n const normalizedValue = normalizeCommandValue([value, ...keywords].join(\" \"));\r\n\r\n return normalizedValue.includes(normalizedSearch) ? 1 : 0;\r\n}\r\n\r\nfunction useCommandContext(componentName: string): CommandContextValue {\r\n const context = React.useContext(CommandContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Command.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Provides a lightweight, filterable command surface without depending on cmdk.\r\n *\r\n * @remarks\r\n * This wrapper preserves the existing compound-component API while replacing the\r\n * underlying implementation with a small context-driven registry. It supports\r\n * text filtering, arrow-key navigation, Enter-to-select, and pointer hover\r\n * selection for common command palette use cases.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Command label='Quick actions'>\r\n * <CommandInput placeholder='Search actions...' />\r\n * <CommandList>\r\n * <CommandItem onSelect={() => console.log(\"Open\")}>Open</CommandItem>\r\n * </CommandList>\r\n * </Command>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n defaultValue: _defaultValue,\r\n disablePointerSelection = false,\r\n filter,\r\n label,\r\n loop = false,\r\n onKeyDown,\r\n onValueChange: _onValueChange,\r\n shouldFilter = true,\r\n value: _value,\r\n vimBindings: _vimBindings,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [activeItemId, setActiveItemId] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const itemOrderRef = React.useRef(0);\r\n const itemsRef = React.useRef(new Map<string, CommandRegisteredItem>());\r\n const [itemsVersion, setItemsVersion] = React.useState(0);\r\n const listId = React.useId();\r\n\r\n const registerItem = React.useCallback((item: Omit<CommandRegisteredItem, \"order\">): void => {\r\n const existingItem = itemsRef.current.get(item.id);\r\n const nextItem: CommandRegisteredItem = {\r\n ...item,\r\n order: existingItem?.order ?? itemOrderRef.current++,\r\n };\r\n\r\n const hasChanged =\r\n !existingItem\r\n || existingItem.disabled !== nextItem.disabled\r\n || existingItem.forceMount !== nextItem.forceMount\r\n || existingItem.groupId !== nextItem.groupId\r\n || existingItem.keywords.join(\"\\u0000\") !== nextItem.keywords.join(\"\\u0000\")\r\n || existingItem.ref !== nextItem.ref\r\n || existingItem.textValue !== nextItem.textValue\r\n || existingItem.value !== nextItem.value;\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n itemsRef.current.set(item.id, nextItem);\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemId: string): void => {\r\n if (!itemsRef.current.delete(itemId)) {\r\n return;\r\n }\r\n\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const items = React.useMemo(() => {\r\n return [...itemsRef.current.values()].toSorted((firstItem, secondItem) => firstItem.order - secondItem.order);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsVersion is an intentional change counter\r\n }, [itemsVersion]);\r\n\r\n const isFiltering = shouldFilter && search.trim().length > 0;\r\n\r\n const isItemVisible = React.useCallback(\r\n (itemId: string): boolean => {\r\n const item = itemsRef.current.get(itemId);\r\n\r\n if (!item) {\r\n return false;\r\n }\r\n\r\n if (item.forceMount || !shouldFilter || search.trim().length === 0) {\r\n return true;\r\n }\r\n\r\n const itemValue = item.value ?? item.textValue;\r\n const itemFilter = filter ?? defaultCommandFilter;\r\n\r\n return itemFilter(itemValue, search, item.keywords) > 0;\r\n },\r\n [filter, search, shouldFilter],\r\n );\r\n\r\n const visibleItems = React.useMemo(() => items.filter((item) => isItemVisible(item.id)), [isItemVisible, items]);\r\n\r\n const selectableItems = React.useMemo(() => visibleItems.filter((item) => !item.disabled), [visibleItems]);\r\n\r\n React.useEffect(() => {\r\n if (selectableItems.length === 0) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(null);\r\n return;\r\n }\r\n\r\n if (!activeItemId || !selectableItems.some((item) => item.id === activeItemId)) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(selectableItems[0].id);\r\n }\r\n }, [activeItemId, selectableItems]);\r\n\r\n React.useEffect(() => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({\r\n block: \"nearest\",\r\n });\r\n }, [activeItemId]);\r\n\r\n const selectSpecificItem = React.useCallback((itemId: string | null): void => {\r\n setActiveItemId(itemId);\r\n }, []);\r\n\r\n const selectNextItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const nextIndex = currentIndex + 1;\r\n\r\n if (nextIndex >= selectableItems.length) {\r\n setActiveItemId(loop ? selectableItems[0].id : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[nextIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const selectPreviousItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const previousIndex = currentIndex - 1;\r\n\r\n if (previousIndex < 0) {\r\n setActiveItemId(loop ? (selectableItems.at(-1)?.id ?? selectableItems[0].id) : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[previousIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const triggerActiveItem = React.useCallback((): void => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.click();\r\n }, [activeItemId]);\r\n\r\n const hasVisibleItemsInGroup = React.useCallback(\r\n (groupId: string): boolean => visibleItems.some((item) => item.groupId === groupId),\r\n [visibleItems],\r\n );\r\n\r\n const getVisibleItemCount = React.useCallback((): number => visibleItems.length, [visibleItems.length]);\r\n\r\n const contextValue = React.useMemo<CommandContextValue>(\r\n () => ({\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n }),\r\n [\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n ],\r\n );\r\n\r\n return (\r\n <CommandContext.Provider value={contextValue}>\r\n <div\r\n ref={ref}\r\n aria-label={label}\r\n className={cn(styles.command, className)}\r\n role='toolbar'\r\n onKeyDown={(event) => {\r\n onKeyDown?.(event);\r\n\r\n if (event.defaultPrevented) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\": {\r\n event.preventDefault();\r\n selectNextItem();\r\n break;\r\n }\r\n\r\n case \"ArrowUp\": {\r\n event.preventDefault();\r\n selectPreviousItem();\r\n break;\r\n }\r\n\r\n case \"Home\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"End\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems.at(-1)?.id ?? selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"Enter\": {\r\n if (event.nativeEvent.isComposing) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n triggerActiveItem();\r\n break;\r\n }\r\n\r\n default: {\r\n break;\r\n }\r\n }\r\n }}\r\n {...props}>\r\n {children}\r\n </div>\r\n </CommandContext.Provider>\r\n );\r\n },\r\n);\r\nCommand.displayName = \"Command\";\r\n\r\n/**\r\n * Renders the command surface inside a modal dialog.\r\n *\r\n * @remarks\r\n * - Renders a Base UI dialog popup\r\n * - Built on Base UI Dialog primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandDialog open={open} onOpenChange={setOpen}>\r\n * <CommandInput placeholder='Search...' />\r\n * </CommandDialog>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nfunction CommandDialog({children, open, onOpenChange, title = \"Command menu\", ...props}: Readonly<CommandDialogProps>): React.JSX.Element {\r\n return (\r\n <BaseDialog.Root\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n {...props}>\r\n <BaseDialog.Portal>\r\n <BaseDialog.Backdrop className={styles.backdrop} />\r\n <BaseDialog.Popup className={styles.dialogPopup}>\r\n <BaseDialog.Title className={styles.srOnly}>{title}</BaseDialog.Title>\r\n <Command>{children}</Command>\r\n </BaseDialog.Popup>\r\n </BaseDialog.Portal>\r\n </BaseDialog.Root>\r\n );\r\n}\r\nCommandDialog.displayName = \"CommandDialog\";\r\n\r\n/**\r\n * Provides the searchable input surface for a command palette.\r\n *\r\n * @remarks\r\n * - Renders an `<input>` element inside a wrapper `<div>`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandInput placeholder='Search...' />\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/combobox_role | ARIA Combobox Role}\r\n */\r\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(({className, onChange, onValueChange, value, ...props}, ref) => {\r\n const {activeItemId, listId, search, selectSpecificItem, setSearch} = useCommandContext(\"CommandInput\");\r\n const isControlled = value !== undefined;\r\n const inputValue = isControlled ? value : search;\r\n\r\n React.useEffect(() => {\r\n if (!isControlled) {\r\n return;\r\n }\r\n\r\n setSearch(value ?? \"\");\r\n }, [isControlled, setSearch, value]);\r\n\r\n return (\r\n <div className={styles.inputWrapper}>\r\n <Search className={styles.searchIcon} />\r\n <input\r\n ref={ref}\r\n aria-activedescendant={activeItemId ?? undefined}\r\n aria-autocomplete='list'\r\n aria-controls={listId}\r\n aria-expanded='true'\r\n className={cn(styles.input, className)}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n\r\n const nextSearchValue = event.currentTarget.value;\r\n setSearch(nextSearchValue);\r\n onValueChange?.(nextSearchValue);\r\n selectSpecificItem(null);\r\n }}\r\n role='combobox'\r\n type='text'\r\n value={inputValue}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n});\r\nCommandInput.displayName = \"CommandInput\";\r\n\r\n/**\r\n * Renders the listbox container that hosts command items and groups.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"listbox\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandList>\r\n * <CommandItem>Settings</CommandItem>\r\n * </CommandList>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/listbox_role | ARIA Listbox Role}\r\n */\r\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(({className, label, ...props}, ref) => {\r\n const {listId} = useCommandContext(\"CommandList\");\r\n\r\n return (\r\n <div\r\n aria-label={label}\r\n ref={ref}\r\n className={cn(styles.list, className)}\r\n id={listId}\r\n role='listbox'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandList.displayName = \"CommandList\";\r\n\r\n/**\r\n * Renders a fallback empty-state message when no command items are visible.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"status\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandEmpty>No results found.</CommandEmpty>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/status_role | ARIA Status Role}\r\n */\r\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({className, ...props}, ref) => {\r\n const {getVisibleItemCount} = useCommandContext(\"CommandEmpty\");\r\n\r\n if (getVisibleItemCount() > 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(styles.empty, className)}\r\n role='status'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandEmpty.displayName = \"CommandEmpty\";\r\n\r\n/**\r\n * Groups related command items under an optional heading.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandGroup heading='Suggestions'>\r\n * <CommandItem>Profile</CommandItem>\r\n * </CommandGroup>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/group_role | ARIA Group Role}\r\n */\r\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\r\n ({children, className, forceMount = false, heading, value: _value, ...props}, ref) => {\r\n const groupId = React.useId();\r\n const {hasVisibleItemsInGroup, isFiltering} = useCommandContext(\"CommandGroup\");\r\n\r\n if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <CommandGroupContext.Provider value={groupId}>\r\n <div\r\n ref={ref}\r\n className={cn(styles.group, className)}\r\n data-command-group=''\r\n {...props}>\r\n {heading ? <div className={styles.groupHeading}>{heading}</div> : null}\r\n {children}\r\n </div>\r\n </CommandGroupContext.Provider>\r\n );\r\n },\r\n);\r\nCommandGroup.displayName = \"CommandGroup\";\r\n\r\n/**\r\n * Renders a separator between command groups or item sections.\r\n *\r\n * @remarks\r\n * - Renders the shared separator primitive\r\n * - Built on Base UI Separator\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/separator | Base UI Separator Docs}\r\n */\r\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\r\n ({alwaysRender = false, className, orientation = \"horizontal\", ...props}, ref) => {\r\n const {isFiltering} = useCommandContext(\"CommandSeparator\");\r\n\r\n if (isFiltering && !alwaysRender) {\r\n return null;\r\n }\r\n\r\n return (\r\n <BaseSeparator\r\n ref={ref}\r\n className={cn(styles.separator, className)}\r\n orientation={orientation}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\nCommandSeparator.displayName = \"CommandSeparator\";\r\n\r\n/**\r\n * Renders a selectable command option with filtering metadata and keyboard support.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"option\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandItem keywords={[\"preferences\"]}>Settings</CommandItem>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/option_role | ARIA Option Role}\r\n */\r\nconst CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\r\n ({children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props}, ref) => {\r\n const {activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem} =\r\n useCommandContext(\"CommandItem\");\r\n const groupId = React.useContext(CommandGroupContext);\r\n const generatedId = React.useId();\r\n const itemRef = React.useRef<HTMLDivElement | null>(null);\r\n const keywordSignature = React.useMemo(() => keywords.join(\"\\u0000\"), [keywords]);\r\n\r\n React.useLayoutEffect(() => {\r\n const textValue = value ?? itemRef.current?.textContent?.trim() ?? \"\";\r\n\r\n registerItem({\r\n disabled,\r\n forceMount,\r\n groupId,\r\n id: generatedId,\r\n keywords,\r\n ref: itemRef,\r\n textValue,\r\n value,\r\n });\r\n }, [children, disabled, forceMount, generatedId, groupId, keywordSignature, keywords, registerItem, value]);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n unregisterItem(generatedId);\r\n };\r\n }, [generatedId, unregisterItem]);\r\n\r\n const isVisible = forceMount || !isFiltering || isItemVisible(generatedId);\r\n\r\n if (!isVisible) {\r\n return null;\r\n }\r\n\r\n const isSelected = activeItemId === generatedId;\r\n\r\n return (\r\n <div\r\n {...props}\r\n ref={(node) => {\r\n itemRef.current = node;\r\n assignRef(ref, node);\r\n }}\r\n aria-disabled={disabled || undefined}\r\n aria-selected={isSelected}\r\n className={cn(styles.item, className)}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n data-selected={isSelected ? \"true\" : undefined}\r\n id={generatedId}\r\n onClick={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n onClick?.(event);\r\n }}\r\n onKeyDown={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n }\r\n }}\r\n onFocus={() => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n onMouseEnter={(event) => {\r\n onMouseEnter?.(event);\r\n\r\n if (disabled || disablePointerSelection) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n role='option'\r\n tabIndex={disabled ? -1 : 0}>\r\n {children}\r\n </div>\r\n );\r\n },\r\n);\r\nCommandItem.displayName = \"CommandItem\";\r\n\r\n/**\r\n * Renders auxiliary shortcut text aligned to the edge of a command item.\r\n *\r\n * @remarks\r\n * - Renders a `<span>` element\r\n * - Built as a lightweight presentational helper for command menus\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandShortcut>⌘K</CommandShortcut>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/span | HTML span element}\r\n */\r\nconst CommandShortcut = ({className, ...props}: Readonly<React.HTMLAttributes<HTMLSpanElement>>): React.JSX.Element => {\r\n return (\r\n <span\r\n className={cn(styles.shortcut, className)}\r\n {...props}\r\n />\r\n );\r\n};\r\nCommandShortcut.displayName = \"CommandShortcut\";\r\n\r\nexport {Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut};\r\n"],"names":["CommandContext","React","CommandGroupContext","assignRef","ref","value","normalizeCommandValue","defaultCommandFilter","search","keywords","normalizedSearch","normalizedValue","useCommandContext","componentName","context","Error","Command","children","className","_defaultValue","disablePointerSelection","filter","label","loop","onKeyDown","_onValueChange","shouldFilter","_value","_vimBindings","props","activeItemId","setActiveItemId","setSearch","itemOrderRef","itemsRef","Map","itemsVersion","setItemsVersion","listId","registerItem","item","existingItem","nextItem","hasChanged","currentVersion","unregisterItem","itemId","items","firstItem","secondItem","isFiltering","isItemVisible","itemValue","itemFilter","visibleItems","selectableItems","selectSpecificItem","selectNextItem","currentIndex","nextIndex","selectPreviousItem","previousIndex","triggerActiveItem","hasVisibleItemsInGroup","groupId","getVisibleItemCount","contextValue","cn","styles","event","CommandDialog","open","onOpenChange","title","BaseDialog","CommandInput","onChange","onValueChange","isControlled","undefined","inputValue","Search","nextSearchValue","CommandList","CommandEmpty","CommandGroup","forceMount","heading","CommandSeparator","alwaysRender","orientation","BaseSeparator","CommandItem","disabled","onClick","onMouseEnter","onSelect","generatedId","itemRef","keywordSignature","textValue","isVisible","isSelected","node","CommandShortcut"],"mappings":"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"}
@@ -62,7 +62,7 @@
62
62
 
63
63
  &[data-ending-style], &[data-starting-style] {
64
64
  opacity: 0;
65
- transform: translate(-50%, -50%)scale(.95);
65
+ transform: translate(-50%, -50%) scale(.95);
66
66
  }
67
67
  }
68
68