@emara/ui 1.1.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 (218) hide show
  1. package/components/ui/.gitkeep +0 -0
  2. package/components/ui/accordion.stories.tsx +231 -0
  3. package/components/ui/accordion.tsx +250 -0
  4. package/components/ui/app-shell.stories.tsx +270 -0
  5. package/components/ui/app-shell.tsx +491 -0
  6. package/components/ui/avatar.stories.tsx +174 -0
  7. package/components/ui/avatar.tsx +257 -0
  8. package/components/ui/badge.stories.tsx +127 -0
  9. package/components/ui/badge.tsx +146 -0
  10. package/components/ui/breadcrumb.stories.tsx +92 -0
  11. package/components/ui/breadcrumb.tsx +302 -0
  12. package/components/ui/button.stories.tsx +186 -0
  13. package/components/ui/button.tsx +128 -0
  14. package/components/ui/card.stories.tsx +279 -0
  15. package/components/ui/card.tsx +250 -0
  16. package/components/ui/checkbox.stories.tsx +93 -0
  17. package/components/ui/checkbox.tsx +131 -0
  18. package/components/ui/combobox.stories.tsx +489 -0
  19. package/components/ui/combobox.tsx +874 -0
  20. package/components/ui/context-menu.stories.tsx +202 -0
  21. package/components/ui/context-menu.tsx +309 -0
  22. package/components/ui/data-table.stories.tsx +227 -0
  23. package/components/ui/data-table.tsx +539 -0
  24. package/components/ui/date-picker.stories.tsx +225 -0
  25. package/components/ui/date-picker.tsx +597 -0
  26. package/components/ui/dialog.stories.tsx +193 -0
  27. package/components/ui/dialog.tsx +262 -0
  28. package/components/ui/divider.stories.tsx +84 -0
  29. package/components/ui/divider.tsx +135 -0
  30. package/components/ui/drawer.stories.tsx +218 -0
  31. package/components/ui/drawer.tsx +329 -0
  32. package/components/ui/dropdown-menu.stories.tsx +270 -0
  33. package/components/ui/dropdown-menu.tsx +353 -0
  34. package/components/ui/empty-state.stories.tsx +121 -0
  35. package/components/ui/empty-state.tsx +289 -0
  36. package/components/ui/field-group.stories.tsx +201 -0
  37. package/components/ui/field-group.tsx +276 -0
  38. package/components/ui/form.stories.tsx +219 -0
  39. package/components/ui/form.tsx +542 -0
  40. package/components/ui/input.stories.tsx +154 -0
  41. package/components/ui/input.tsx +208 -0
  42. package/components/ui/label.stories.tsx +84 -0
  43. package/components/ui/label.tsx +98 -0
  44. package/components/ui/page-header.stories.tsx +136 -0
  45. package/components/ui/page-header.tsx +315 -0
  46. package/components/ui/pagination.stories.tsx +136 -0
  47. package/components/ui/pagination.tsx +427 -0
  48. package/components/ui/popover.stories.tsx +212 -0
  49. package/components/ui/popover.tsx +167 -0
  50. package/components/ui/radio-group.stories.tsx +96 -0
  51. package/components/ui/radio-group.tsx +250 -0
  52. package/components/ui/select.stories.tsx +203 -0
  53. package/components/ui/select.tsx +318 -0
  54. package/components/ui/sidebar.stories.tsx +186 -0
  55. package/components/ui/sidebar.tsx +623 -0
  56. package/components/ui/skeleton.stories.tsx +131 -0
  57. package/components/ui/skeleton.tsx +311 -0
  58. package/components/ui/switch.stories.tsx +74 -0
  59. package/components/ui/switch.tsx +186 -0
  60. package/components/ui/table.stories.tsx +107 -0
  61. package/components/ui/table.tsx +285 -0
  62. package/components/ui/tabs.stories.tsx +222 -0
  63. package/components/ui/tabs.tsx +287 -0
  64. package/components/ui/textarea.stories.tsx +96 -0
  65. package/components/ui/textarea.tsx +182 -0
  66. package/components/ui/toast.stories.tsx +169 -0
  67. package/components/ui/toast.tsx +250 -0
  68. package/components/ui/tooltip.stories.tsx +146 -0
  69. package/components/ui/tooltip.tsx +156 -0
  70. package/components/ui/top-bar.stories.tsx +182 -0
  71. package/components/ui/top-bar.tsx +155 -0
  72. package/dist/components/ui/accordion.d.ts +45 -0
  73. package/dist/components/ui/accordion.d.ts.map +1 -0
  74. package/dist/components/ui/accordion.js +99 -0
  75. package/dist/components/ui/accordion.js.map +1 -0
  76. package/dist/components/ui/app-shell.d.ts +70 -0
  77. package/dist/components/ui/app-shell.d.ts.map +1 -0
  78. package/dist/components/ui/app-shell.js +199 -0
  79. package/dist/components/ui/app-shell.js.map +1 -0
  80. package/dist/components/ui/avatar.d.ts +41 -0
  81. package/dist/components/ui/avatar.d.ts.map +1 -0
  82. package/dist/components/ui/avatar.js +104 -0
  83. package/dist/components/ui/avatar.js.map +1 -0
  84. package/dist/components/ui/badge.d.ts +27 -0
  85. package/dist/components/ui/badge.d.ts.map +1 -0
  86. package/dist/components/ui/badge.js +65 -0
  87. package/dist/components/ui/badge.js.map +1 -0
  88. package/dist/components/ui/breadcrumb.d.ts +35 -0
  89. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  90. package/dist/components/ui/breadcrumb.js +88 -0
  91. package/dist/components/ui/breadcrumb.js.map +1 -0
  92. package/dist/components/ui/button.d.ts +26 -0
  93. package/dist/components/ui/button.d.ts.map +1 -0
  94. package/dist/components/ui/button.js +73 -0
  95. package/dist/components/ui/button.js.map +1 -0
  96. package/dist/components/ui/card.d.ts +52 -0
  97. package/dist/components/ui/card.d.ts.map +1 -0
  98. package/dist/components/ui/card.js +96 -0
  99. package/dist/components/ui/card.js.map +1 -0
  100. package/dist/components/ui/checkbox.d.ts +18 -0
  101. package/dist/components/ui/checkbox.d.ts.map +1 -0
  102. package/dist/components/ui/checkbox.js +59 -0
  103. package/dist/components/ui/checkbox.js.map +1 -0
  104. package/dist/components/ui/combobox.d.ts +194 -0
  105. package/dist/components/ui/combobox.d.ts.map +1 -0
  106. package/dist/components/ui/combobox.js +361 -0
  107. package/dist/components/ui/combobox.js.map +1 -0
  108. package/dist/components/ui/context-menu.d.ts +46 -0
  109. package/dist/components/ui/context-menu.d.ts.map +1 -0
  110. package/dist/components/ui/context-menu.js +95 -0
  111. package/dist/components/ui/context-menu.js.map +1 -0
  112. package/dist/components/ui/data-table.d.ts +53 -0
  113. package/dist/components/ui/data-table.d.ts.map +1 -0
  114. package/dist/components/ui/data-table.js +163 -0
  115. package/dist/components/ui/data-table.js.map +1 -0
  116. package/dist/components/ui/date-picker.d.ts +103 -0
  117. package/dist/components/ui/date-picker.d.ts.map +1 -0
  118. package/dist/components/ui/date-picker.js +306 -0
  119. package/dist/components/ui/date-picker.js.map +1 -0
  120. package/dist/components/ui/dialog.d.ts +40 -0
  121. package/dist/components/ui/dialog.d.ts.map +1 -0
  122. package/dist/components/ui/dialog.js +110 -0
  123. package/dist/components/ui/dialog.js.map +1 -0
  124. package/dist/components/ui/divider.d.ts +30 -0
  125. package/dist/components/ui/divider.d.ts.map +1 -0
  126. package/dist/components/ui/divider.js +62 -0
  127. package/dist/components/ui/divider.js.map +1 -0
  128. package/dist/components/ui/drawer.d.ts +56 -0
  129. package/dist/components/ui/drawer.d.ts.map +1 -0
  130. package/dist/components/ui/drawer.js +147 -0
  131. package/dist/components/ui/drawer.js.map +1 -0
  132. package/dist/components/ui/dropdown-menu.d.ts +63 -0
  133. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  134. package/dist/components/ui/dropdown-menu.js +116 -0
  135. package/dist/components/ui/dropdown-menu.js.map +1 -0
  136. package/dist/components/ui/empty-state.d.ts +43 -0
  137. package/dist/components/ui/empty-state.d.ts.map +1 -0
  138. package/dist/components/ui/empty-state.js +128 -0
  139. package/dist/components/ui/empty-state.js.map +1 -0
  140. package/dist/components/ui/field-group.d.ts +38 -0
  141. package/dist/components/ui/field-group.d.ts.map +1 -0
  142. package/dist/components/ui/field-group.js +107 -0
  143. package/dist/components/ui/field-group.js.map +1 -0
  144. package/dist/components/ui/form.d.ts +67 -0
  145. package/dist/components/ui/form.d.ts.map +1 -0
  146. package/dist/components/ui/form.js +286 -0
  147. package/dist/components/ui/form.js.map +1 -0
  148. package/dist/components/ui/input.d.ts +36 -0
  149. package/dist/components/ui/input.d.ts.map +1 -0
  150. package/dist/components/ui/input.js +99 -0
  151. package/dist/components/ui/input.js.map +1 -0
  152. package/dist/components/ui/label.d.ts +37 -0
  153. package/dist/components/ui/label.d.ts.map +1 -0
  154. package/dist/components/ui/label.js +34 -0
  155. package/dist/components/ui/label.js.map +1 -0
  156. package/dist/components/ui/page-header.d.ts +65 -0
  157. package/dist/components/ui/page-header.d.ts.map +1 -0
  158. package/dist/components/ui/page-header.js +140 -0
  159. package/dist/components/ui/page-header.js.map +1 -0
  160. package/dist/components/ui/pagination.d.ts +67 -0
  161. package/dist/components/ui/pagination.d.ts.map +1 -0
  162. package/dist/components/ui/pagination.js +109 -0
  163. package/dist/components/ui/pagination.js.map +1 -0
  164. package/dist/components/ui/popover.d.ts +28 -0
  165. package/dist/components/ui/popover.d.ts.map +1 -0
  166. package/dist/components/ui/popover.js +85 -0
  167. package/dist/components/ui/popover.js.map +1 -0
  168. package/dist/components/ui/radio-group.d.ts +35 -0
  169. package/dist/components/ui/radio-group.d.ts.map +1 -0
  170. package/dist/components/ui/radio-group.js +103 -0
  171. package/dist/components/ui/radio-group.js.map +1 -0
  172. package/dist/components/ui/select.d.ts +42 -0
  173. package/dist/components/ui/select.d.ts.map +1 -0
  174. package/dist/components/ui/select.js +86 -0
  175. package/dist/components/ui/select.js.map +1 -0
  176. package/dist/components/ui/sidebar.d.ts +59 -0
  177. package/dist/components/ui/sidebar.d.ts.map +1 -0
  178. package/dist/components/ui/sidebar.js +189 -0
  179. package/dist/components/ui/sidebar.js.map +1 -0
  180. package/dist/components/ui/skeleton.d.ts +77 -0
  181. package/dist/components/ui/skeleton.d.ts.map +1 -0
  182. package/dist/components/ui/skeleton.js +115 -0
  183. package/dist/components/ui/skeleton.js.map +1 -0
  184. package/dist/components/ui/switch.d.ts +26 -0
  185. package/dist/components/ui/switch.d.ts.map +1 -0
  186. package/dist/components/ui/switch.js +84 -0
  187. package/dist/components/ui/switch.js.map +1 -0
  188. package/dist/components/ui/table.d.ts +52 -0
  189. package/dist/components/ui/table.d.ts.map +1 -0
  190. package/dist/components/ui/table.js +109 -0
  191. package/dist/components/ui/table.js.map +1 -0
  192. package/dist/components/ui/tabs.d.ts +42 -0
  193. package/dist/components/ui/tabs.d.ts.map +1 -0
  194. package/dist/components/ui/tabs.js +163 -0
  195. package/dist/components/ui/tabs.js.map +1 -0
  196. package/dist/components/ui/textarea.d.ts +26 -0
  197. package/dist/components/ui/textarea.d.ts.map +1 -0
  198. package/dist/components/ui/textarea.js +96 -0
  199. package/dist/components/ui/textarea.js.map +1 -0
  200. package/dist/components/ui/toast.d.ts +77 -0
  201. package/dist/components/ui/toast.d.ts.map +1 -0
  202. package/dist/components/ui/toast.js +141 -0
  203. package/dist/components/ui/toast.js.map +1 -0
  204. package/dist/components/ui/tooltip.d.ts +31 -0
  205. package/dist/components/ui/tooltip.d.ts.map +1 -0
  206. package/dist/components/ui/tooltip.js +71 -0
  207. package/dist/components/ui/tooltip.js.map +1 -0
  208. package/dist/components/ui/top-bar.d.ts +30 -0
  209. package/dist/components/ui/top-bar.d.ts.map +1 -0
  210. package/dist/components/ui/top-bar.js +64 -0
  211. package/dist/components/ui/top-bar.js.map +1 -0
  212. package/dist/lib/utils.d.ts +3 -0
  213. package/dist/lib/utils.d.ts.map +1 -0
  214. package/dist/lib/utils.js +6 -0
  215. package/dist/lib/utils.js.map +1 -0
  216. package/lib/utils.ts +6 -0
  217. package/package.json +112 -0
  218. package/styles/globals.css +685 -0
@@ -0,0 +1,194 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ import { Command as CommandPrimitive } from "cmdk";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ /**
5
+ * Shape of options returned by `loadOptions`. Consumers can extend with extra
6
+ * fields — only `value` is required.
7
+ */
8
+ export type ComboboxOption = {
9
+ value: string;
10
+ label?: React.ReactNode;
11
+ description?: React.ReactNode;
12
+ icon?: React.ReactNode;
13
+ keywords?: string[];
14
+ disabled?: boolean;
15
+ };
16
+ type ComboboxRootCommonProps = {
17
+ open?: boolean;
18
+ defaultOpen?: boolean;
19
+ onOpenChange?: (open: boolean) => void;
20
+ disabled?: boolean;
21
+ required?: boolean;
22
+ name?: string;
23
+ invalid?: boolean;
24
+ loading?: boolean;
25
+ /** Allow creating a new option from the current search query. When set,
26
+ * a "+ Create '{query}'" row is appended below filtered items. The
27
+ * consumer is expected to add the new option to their data source +
28
+ * selection state in `onCreate`. */
29
+ creatable?: boolean;
30
+ /** Fired when the user picks the "+ Create" row. Receives the current
31
+ * search string; the component does not modify selection state itself
32
+ * in response — that's the consumer's responsibility. */
33
+ onCreate?: (query: string) => void;
34
+ /**
35
+ * Async option fetcher. When provided, the component intercepts the
36
+ * search input: it debounces ~200ms, calls `loadOptions(query)`, and
37
+ * renders the returned options as items automatically (no need to
38
+ * write `<ComboboxItem>` children). Stale responses are dropped via
39
+ * a request-id guard so out-of-order fetches don't flicker the UI.
40
+ * While a fetch is in flight, `loading` is `true` and cmdk's internal
41
+ * filter is disabled.
42
+ */
43
+ loadOptions?: (query: string) => Promise<ComboboxOption[]>;
44
+ /** Debounce window for `loadOptions` in milliseconds. Default 200ms. */
45
+ loadOptionsDebounceMs?: number;
46
+ /**
47
+ * Auto-grouping for `loadOptions`-rendered items. When provided, the
48
+ * loaded options are partitioned by the function's return value and
49
+ * each group is rendered inside a `<ComboboxGroup heading>`. Groups
50
+ * preserve insertion order — sort your options array if you want a
51
+ * different order. No effect when `loadOptions` is not wired.
52
+ */
53
+ groupBy?: (option: ComboboxOption) => string;
54
+ children: React.ReactNode;
55
+ };
56
+ type ComboboxSingleProps = ComboboxRootCommonProps & {
57
+ multiple?: false;
58
+ value?: string;
59
+ defaultValue?: string;
60
+ onValueChange?: (value: string) => void;
61
+ };
62
+ type ComboboxMultipleProps = ComboboxRootCommonProps & {
63
+ multiple: true;
64
+ value?: string[];
65
+ defaultValue?: string[];
66
+ onValueChange?: (values: string[]) => void;
67
+ /** Cap on number of items that can be selected at once. Once reached,
68
+ * additional items are disabled (can still deselect existing ones). */
69
+ maxSelected?: number;
70
+ };
71
+ type ComboboxRootProps = ComboboxSingleProps | ComboboxMultipleProps;
72
+ declare const Combobox: (props: ComboboxRootProps) => import("react/jsx-runtime").JSX.Element;
73
+ declare const triggerVariants: (props?: ({
74
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | null | undefined;
75
+ invalid?: boolean | null | undefined;
76
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
77
+ type ComboboxTriggerProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children"> & VariantProps<typeof triggerVariants> & {
78
+ placeholder?: string;
79
+ clearable?: boolean;
80
+ onClear?: () => void;
81
+ /** Map a value to a display label. Used for pill text in multiple mode,
82
+ * and as the trigger label in single mode when no `children` is given. */
83
+ getOptionLabel?: (value: string) => React.ReactNode;
84
+ /** Multi-mode only: max pills to render in the trigger before collapsing
85
+ * the remainder into a "+N more" badge. Defaults to 3. */
86
+ maxVisiblePills?: number;
87
+ /**
88
+ * Single mode: what to render when the Combobox has a value. Consumers
89
+ * compute this from their own options array (matching shadcn's recipe).
90
+ * Ignored in multiple mode — pills are rendered instead.
91
+ */
92
+ children?: React.ReactNode;
93
+ };
94
+ declare const ComboboxTrigger: import("react").ForwardRefExoticComponent<Omit<import("react").ButtonHTMLAttributes<HTMLButtonElement>, "children" | "type"> & VariantProps<(props?: ({
95
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | null | undefined;
96
+ invalid?: boolean | null | undefined;
97
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
98
+ placeholder?: string;
99
+ clearable?: boolean;
100
+ onClear?: () => void;
101
+ /** Map a value to a display label. Used for pill text in multiple mode,
102
+ * and as the trigger label in single mode when no `children` is given. */
103
+ getOptionLabel?: (value: string) => React.ReactNode;
104
+ /** Multi-mode only: max pills to render in the trigger before collapsing
105
+ * the remainder into a "+N more" badge. Defaults to 3. */
106
+ maxVisiblePills?: number;
107
+ /**
108
+ * Single mode: what to render when the Combobox has a value. Consumers
109
+ * compute this from their own options array (matching shadcn's recipe).
110
+ * Ignored in multiple mode — pills are rendered instead.
111
+ */
112
+ children?: React.ReactNode;
113
+ } & import("react").RefAttributes<HTMLButtonElement>>;
114
+ type ComboboxContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
115
+ emptyMessage?: React.ReactNode;
116
+ };
117
+ declare const ComboboxContent: import("react").ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
118
+ emptyMessage?: React.ReactNode;
119
+ } & import("react").RefAttributes<HTMLDivElement>>;
120
+ declare const ComboboxInput: import("react").ForwardRefExoticComponent<Omit<Omit<Pick<Pick<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "key" | keyof import("react").InputHTMLAttributes<HTMLInputElement>> & {
121
+ ref?: React.Ref<HTMLInputElement>;
122
+ } & {
123
+ asChild?: boolean;
124
+ }, "key" | "asChild" | keyof import("react").InputHTMLAttributes<HTMLInputElement>>, "value" | "onChange" | "type"> & {
125
+ value?: string;
126
+ onValueChange?: (search: string) => void;
127
+ } & import("react").RefAttributes<HTMLInputElement>, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
128
+ declare const ComboboxEmpty: import("react").ForwardRefExoticComponent<Omit<{
129
+ children?: React.ReactNode;
130
+ } & Pick<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
131
+ ref?: React.Ref<HTMLDivElement>;
132
+ } & {
133
+ asChild?: boolean;
134
+ }, "key" | keyof import("react").HTMLAttributes<HTMLDivElement> | "asChild"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
135
+ declare const ComboboxList: import("react").ForwardRefExoticComponent<Omit<{
136
+ children?: React.ReactNode;
137
+ } & Pick<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
138
+ ref?: React.Ref<HTMLDivElement>;
139
+ } & {
140
+ asChild?: boolean;
141
+ }, "key" | keyof import("react").HTMLAttributes<HTMLDivElement> | "asChild"> & {
142
+ label?: string;
143
+ } & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
144
+ declare const ComboboxGroup: import("react").ForwardRefExoticComponent<Omit<{
145
+ children?: React.ReactNode;
146
+ } & Omit<Pick<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
147
+ ref?: React.Ref<HTMLDivElement>;
148
+ } & {
149
+ asChild?: boolean;
150
+ }, "key" | keyof import("react").HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "heading"> & {
151
+ heading?: React.ReactNode;
152
+ value?: string;
153
+ forceMount?: boolean;
154
+ } & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
155
+ type ComboboxItemProps = Omit<React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>, "onSelect" | "value"> & {
156
+ value: string;
157
+ description?: React.ReactNode;
158
+ icon?: React.ReactNode;
159
+ /** Extra search terms the item matches against, in addition to `value`
160
+ * and rendered children. Example: a "New York" item with
161
+ * `keywords={["nyc", "ny"]}` will match either abbreviation. */
162
+ keywords?: string[];
163
+ };
164
+ declare const ComboboxItem: import("react").ForwardRefExoticComponent<Omit<Omit<{
165
+ children?: React.ReactNode;
166
+ } & Omit<Pick<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
167
+ ref?: React.Ref<HTMLDivElement>;
168
+ } & {
169
+ asChild?: boolean;
170
+ }, "key" | keyof import("react").HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "onSelect" | "disabled"> & {
171
+ disabled?: boolean;
172
+ onSelect?: (value: string) => void;
173
+ value?: string;
174
+ keywords?: string[];
175
+ forceMount?: boolean;
176
+ } & import("react").RefAttributes<HTMLDivElement>, "ref">, "value" | "onSelect"> & {
177
+ value: string;
178
+ description?: React.ReactNode;
179
+ icon?: React.ReactNode;
180
+ /** Extra search terms the item matches against, in addition to `value`
181
+ * and rendered children. Example: a "New York" item with
182
+ * `keywords={["nyc", "ny"]}` will match either abbreviation. */
183
+ keywords?: string[];
184
+ } & import("react").RefAttributes<HTMLDivElement>>;
185
+ declare const ComboboxSeparator: import("react").ForwardRefExoticComponent<Omit<Pick<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
186
+ ref?: React.Ref<HTMLDivElement>;
187
+ } & {
188
+ asChild?: boolean;
189
+ }, "key" | keyof import("react").HTMLAttributes<HTMLDivElement> | "asChild"> & {
190
+ alwaysRender?: boolean;
191
+ } & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
192
+ export { Combobox, ComboboxTrigger, ComboboxContent, ComboboxInput, ComboboxList, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, };
193
+ export type { ComboboxRootProps, ComboboxTriggerProps, ComboboxContentProps, ComboboxItemProps };
194
+ //# sourceMappingURL=combobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../components/ui/combobox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,361 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useRef, useState, } from "react";
4
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
5
+ import { RiArrowDownSLine, RiCheckLine, RiCloseLine, RiLoader2Line, RiSearchLine, } from "@remixicon/react";
6
+ import { Command as CommandPrimitive, useCommandState } from "cmdk";
7
+ import { cva } from "class-variance-authority";
8
+ import { cn } from "@/lib/utils";
9
+ const ComboboxContext = createContext(null);
10
+ function useCombobox() {
11
+ const ctx = useContext(ComboboxContext);
12
+ if (!ctx)
13
+ throw new Error("Combobox sub-component must be used inside <Combobox>.");
14
+ return ctx;
15
+ }
16
+ const Combobox = function Combobox(props) {
17
+ const { open: openProp, defaultOpen = false, onOpenChange, disabled = false, invalid = false, loading = false, creatable = false, onCreate, loadOptions, loadOptionsDebounceMs = 200, groupBy, children, } = props;
18
+ const multiple = props.multiple === true;
19
+ const isOpenControlled = openProp !== undefined;
20
+ const [openInternal, setOpenInternal] = useState(defaultOpen);
21
+ const open = isOpenControlled ? openProp : openInternal;
22
+ const setOpen = useCallback((next) => {
23
+ if (!isOpenControlled)
24
+ setOpenInternal(next);
25
+ onOpenChange?.(next);
26
+ }, [isOpenControlled, onOpenChange]);
27
+ // ---- Single-mode value state ----
28
+ const singleValueProp = !multiple ? props.value : undefined;
29
+ const singleDefault = !multiple ? (props.defaultValue ?? "") : "";
30
+ const isSingleControlled = singleValueProp !== undefined;
31
+ const [singleInternal, setSingleInternal] = useState(singleDefault);
32
+ const singleValue = isSingleControlled ? (singleValueProp ?? "") : singleInternal;
33
+ const setSingleValue = useCallback((next) => {
34
+ if (!isSingleControlled)
35
+ setSingleInternal(next);
36
+ if (!multiple)
37
+ props.onValueChange?.(next);
38
+ },
39
+ // We deliberately do not depend on `props` (would re-create every render).
40
+ // Single-mode handlers don't change identity across renders in practice.
41
+ // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ [isSingleControlled, multiple]);
43
+ // ---- Multi-mode value state ----
44
+ const multiValueProp = multiple ? props.value : undefined;
45
+ const multiDefault = multiple ? (props.defaultValue ?? []) : [];
46
+ const isMultiControlled = multiValueProp !== undefined;
47
+ const [multiInternal, setMultiInternal] = useState(multiDefault);
48
+ const multiValues = isMultiControlled ? (multiValueProp ?? []) : multiInternal;
49
+ const setValues = useCallback((next) => {
50
+ if (!isMultiControlled)
51
+ setMultiInternal(next);
52
+ if (multiple)
53
+ props.onValueChange?.(next);
54
+ },
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ [isMultiControlled, multiple]);
57
+ const toggleValue = useCallback((v) => {
58
+ const current = isMultiControlled ? (multiValueProp ?? []) : multiInternal;
59
+ const next = current.includes(v) ? current.filter((x) => x !== v) : [...current, v];
60
+ setValues(next);
61
+ }, [isMultiControlled, multiValueProp, multiInternal, setValues]);
62
+ const [search, setSearch] = useState("");
63
+ const contentId = useId();
64
+ // ---- Async options state (loadOptions) ----
65
+ const [loadedOptions, setLoadedOptions] = useState([]);
66
+ const [loadingInternal, setLoadingInternal] = useState(false);
67
+ const requestIdRef = useRef(0);
68
+ useEffect(() => {
69
+ if (!loadOptions)
70
+ return;
71
+ const myRequestId = ++requestIdRef.current;
72
+ setLoadingInternal(true);
73
+ const timeoutId = window.setTimeout(() => {
74
+ Promise.resolve(loadOptions(search))
75
+ .then((opts) => {
76
+ // Drop stale response — a newer request has been issued.
77
+ if (myRequestId !== requestIdRef.current)
78
+ return;
79
+ setLoadedOptions(opts);
80
+ })
81
+ .catch(() => {
82
+ // Swallow — consumer's fetcher is responsible for surfacing errors.
83
+ if (myRequestId !== requestIdRef.current)
84
+ return;
85
+ setLoadedOptions([]);
86
+ })
87
+ .finally(() => {
88
+ if (myRequestId === requestIdRef.current)
89
+ setLoadingInternal(false);
90
+ });
91
+ }, loadOptionsDebounceMs);
92
+ return () => window.clearTimeout(timeoutId);
93
+ }, [search, loadOptions, loadOptionsDebounceMs]);
94
+ const effectiveLoading = loading || (Boolean(loadOptions) && loadingInternal);
95
+ const ctx = useMemo(() => {
96
+ const base = {
97
+ open,
98
+ setOpen,
99
+ search,
100
+ setSearch,
101
+ disabled,
102
+ invalid,
103
+ loading: effectiveLoading,
104
+ contentId,
105
+ creatable,
106
+ onCreate,
107
+ loadedOptions,
108
+ hasLoadOptions: Boolean(loadOptions),
109
+ groupBy,
110
+ };
111
+ if (multiple) {
112
+ return {
113
+ ...base,
114
+ mode: "multiple",
115
+ values: multiValues,
116
+ toggleValue,
117
+ setValues,
118
+ maxSelected: props.maxSelected,
119
+ };
120
+ }
121
+ return { ...base, mode: "single", value: singleValue, setValue: setSingleValue };
122
+ // eslint-disable-next-line react-hooks/exhaustive-deps
123
+ }, [
124
+ multiple,
125
+ open,
126
+ setOpen,
127
+ search,
128
+ disabled,
129
+ invalid,
130
+ effectiveLoading,
131
+ contentId,
132
+ creatable,
133
+ onCreate,
134
+ loadOptions,
135
+ loadedOptions,
136
+ groupBy,
137
+ singleValue,
138
+ setSingleValue,
139
+ multiValues,
140
+ toggleValue,
141
+ setValues,
142
+ ]);
143
+ return (_jsx(ComboboxContext.Provider, { value: ctx, children: _jsx(PopoverPrimitive.Root, { open: open, onOpenChange: setOpen, children: children }) }));
144
+ };
145
+ // ----------------------------------------------------------------------------
146
+ // ComboboxTrigger
147
+ // ----------------------------------------------------------------------------
148
+ const triggerVariants = cva([
149
+ "flex items-center justify-between w-full gap-2",
150
+ "rounded-md border border-input bg-background text-foreground",
151
+ "transition-colors",
152
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
153
+ "disabled:cursor-not-allowed disabled:opacity-50",
154
+ "[&>span:first-child]:line-clamp-1 [&>span:first-child]:text-start",
155
+ ].join(" "), {
156
+ variants: {
157
+ size: {
158
+ xs: "h-7 ps-2.5 pe-2 text-xs",
159
+ sm: "h-8 ps-3 pe-2 text-xs",
160
+ md: "h-9 ps-3 pe-2 text-sm",
161
+ lg: "h-10 ps-3.5 pe-2.5 text-base",
162
+ xl: "h-12 ps-4 pe-3 text-base",
163
+ },
164
+ invalid: {
165
+ true: "border-destructive focus-visible:ring-destructive",
166
+ false: "",
167
+ },
168
+ },
169
+ defaultVariants: { size: "md", invalid: false },
170
+ });
171
+ const ComboboxTrigger = forwardRef(function ComboboxTrigger({ className, size, invalid: invalidProp, placeholder, clearable = false, onClear, getOptionLabel, maxVisiblePills = 3, children, ...props }, ref) {
172
+ const ctx = useCombobox();
173
+ const invalid = invalidProp ?? ctx.invalid;
174
+ const isMulti = ctx.mode === "multiple";
175
+ const hasSelection = isMulti ? ctx.values.length > 0 : Boolean(ctx.value);
176
+ const showClear = clearable && !ctx.disabled && !ctx.loading && hasSelection;
177
+ // ---- Multi-mode pill rendering ----
178
+ const visiblePills = isMulti ? ctx.values.slice(0, maxVisiblePills) : [];
179
+ const overflowCount = isMulti ? Math.max(0, ctx.values.length - maxVisiblePills) : 0;
180
+ const labelFor = (v) => (getOptionLabel ? getOptionLabel(v) : v);
181
+ // ---- Single-mode display fallback ----
182
+ const singleDisplay = !isMulti && ctx.value
183
+ ? (children ?? (getOptionLabel ? getOptionLabel(ctx.value) : ctx.value))
184
+ : (placeholder ?? "Select…");
185
+ // WAI-ARIA accessible name fallback.
186
+ const consumerLabelled = props["aria-label"] !== undefined || props["aria-labelledby"] !== undefined;
187
+ const ariaLabelFallback = consumerLabelled
188
+ ? undefined
189
+ : isMulti
190
+ ? hasSelection
191
+ ? `${ctx.values.length} selected`
192
+ : (placeholder ?? "Select…")
193
+ : typeof singleDisplay === "string"
194
+ ? singleDisplay
195
+ : (placeholder ?? "Select…");
196
+ const handleClear = (e) => {
197
+ e.preventDefault();
198
+ e.stopPropagation();
199
+ if (ctx.mode === "multiple")
200
+ ctx.setValues([]);
201
+ else
202
+ ctx.setValue("");
203
+ onClear?.();
204
+ };
205
+ return (_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs("button", { ref: ref, type: "button", role: "combobox", "aria-expanded": ctx.open, "aria-controls": ctx.open ? ctx.contentId : undefined, "aria-invalid": invalid || undefined, "aria-label": ariaLabelFallback, disabled: ctx.disabled, className: cn(triggerVariants({ size, invalid }),
206
+ // In multi mode the trigger may grow to fit pills; relax height.
207
+ isMulti && hasSelection && "h-auto min-h-9 flex-wrap py-1", className), ...props, children: [isMulti ? (_jsx("span", { className: "flex flex-1 flex-wrap items-center gap-1", children: !hasSelection ? (_jsx("span", { className: "text-muted-foreground", children: placeholder ?? "Select…" })) : (_jsxs(_Fragment, { children: [visiblePills.map((v) => (_jsxs("span", { className: "bg-secondary text-secondary-foreground inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs", children: [_jsx("span", { children: labelFor(v) }), !ctx.disabled ? (_jsx("button", { type: "button", "aria-label": `Remove ${typeof labelFor(v) === "string" ? labelFor(v) : v}`, onClick: (e) => {
208
+ e.preventDefault();
209
+ e.stopPropagation();
210
+ if (ctx.mode === "multiple")
211
+ ctx.toggleValue(v);
212
+ }, className: "focus-visible:ring-ring hover:text-foreground inline-flex items-center justify-center rounded-sm focus-visible:ring-2 focus-visible:outline-none", children: _jsx(RiCloseLine, { className: "size-3" }) })) : null] }, v))), overflowCount > 0 ? (_jsxs("span", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-xs", children: ["+", overflowCount, " more"] })) : null] })) })) : (_jsx("span", { className: cn(!hasSelection && "text-muted-foreground"), children: singleDisplay })), _jsxs("span", { className: "text-muted-foreground ms-auto inline-flex shrink-0 items-center gap-1 [&_svg]:size-4 [&_svg]:shrink-0", children: [showClear ? (_jsx("button", { type: "button", "aria-label": "Clear", onClick: handleClear, className: cn("inline-flex items-center justify-center rounded p-0.5", "hover:text-foreground", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none"), children: _jsx(RiCloseLine, {}) })) : null, ctx.loading ? _jsx(RiLoader2Line, { className: "size-4 animate-spin" }) : _jsx(RiArrowDownSLine, {})] })] }) }));
213
+ });
214
+ ComboboxTrigger.displayName = "ComboboxTrigger";
215
+ // ----------------------------------------------------------------------------
216
+ // ComboboxContent — Popover content hosting the cmdk Command palette.
217
+ // ----------------------------------------------------------------------------
218
+ /**
219
+ * Screen-reader-only result counter. Mounted inside the Command tree so
220
+ * `useCommandState` can read cmdk's filtered count. Only renders while the
221
+ * user is actively searching — otherwise it would announce on every open.
222
+ * Spec: docs/emara-ui-phase-2-components.md §5 Accessibility ("Live region
223
+ * announces result count").
224
+ */
225
+ /**
226
+ * Renders options fetched by `loadOptions` as ComboboxItems automatically.
227
+ * Mounted inside ComboboxContent only when the root has loadOptions wired.
228
+ * Consumers can still mix static items via a ComboboxList sibling — those
229
+ * are rendered alongside (with cmdk filtering disabled while loading so
230
+ * the async items never get hidden by the search input).
231
+ */
232
+ function ComboboxAsyncOptions() {
233
+ const ctx = useCombobox();
234
+ if (!ctx.hasLoadOptions)
235
+ return null;
236
+ const renderItem = (opt) => (_jsx(ComboboxItem, { value: opt.value, ...(opt.description !== undefined && { description: opt.description }), ...(opt.icon !== undefined && { icon: opt.icon }), ...(opt.keywords !== undefined && { keywords: opt.keywords }), ...(opt.disabled !== undefined && { disabled: opt.disabled }), children: opt.label ?? opt.value }, opt.value));
237
+ if (!ctx.groupBy) {
238
+ return (_jsx(CommandPrimitive.List, { className: "max-h-64 overflow-y-auto p-1", children: ctx.loadedOptions.map(renderItem) }));
239
+ }
240
+ // Partition into groups preserving first-seen insertion order.
241
+ const groups = new Map();
242
+ for (const opt of ctx.loadedOptions) {
243
+ const key = ctx.groupBy(opt);
244
+ const arr = groups.get(key);
245
+ if (arr)
246
+ arr.push(opt);
247
+ else
248
+ groups.set(key, [opt]);
249
+ }
250
+ return (_jsx(CommandPrimitive.List, { className: "max-h-64 overflow-y-auto p-1", children: Array.from(groups.entries()).map(([heading, opts]) => (_jsx(ComboboxGroup, { heading: heading, children: opts.map(renderItem) }, heading))) }));
251
+ }
252
+ function ComboboxResultCount() {
253
+ const count = useCommandState((s) => s.filtered.count) ?? 0;
254
+ const search = useCommandState((s) => s.search) ?? "";
255
+ if (!search)
256
+ return null;
257
+ const label = count === 0 ? "No results" : count === 1 ? "1 result" : `${count} results`;
258
+ return (_jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: "sr-only", children: label }));
259
+ }
260
+ /**
261
+ * Renders a "+ Create '{search}'" row when the consumer has set `creatable`
262
+ * on the root. The row's cmdk `value` is the search string itself so it
263
+ * always survives cmdk's filter while the user is typing.
264
+ *
265
+ * On select: calls the consumer's `onCreate(search)` and clears the search.
266
+ * In single mode, the popover closes (matching ComboboxItem). In multi
267
+ * mode it stays open so the user can keep adding.
268
+ *
269
+ * The component does not mutate selection state itself — adding the new
270
+ * option to the data source AND the value array is the consumer's job
271
+ * inside `onCreate`. See Storybook for the canonical pattern.
272
+ */
273
+ function ComboboxCreatable() {
274
+ const ctx = useCombobox();
275
+ const search = useCommandState((s) => s.search) ?? "";
276
+ if (!ctx.creatable || !search.trim())
277
+ return null;
278
+ return (_jsxs(CommandPrimitive.Item
279
+ // Use a sentinel value prefixed to avoid clashes with consumer options.
280
+ , {
281
+ // Use a sentinel value prefixed to avoid clashes with consumer options.
282
+ value: `__create__::${search}`,
283
+ // Always match — searches change as user types but cmdk filters by
284
+ // value vs. search. Forcing this item to match the current search is
285
+ // the cleanest way to keep it visible.
286
+ keywords: [search], onSelect: () => {
287
+ ctx.onCreate?.(search);
288
+ ctx.setSearch("");
289
+ if (ctx.mode === "single")
290
+ ctx.setOpen(false);
291
+ }, className: cn("relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none select-none", "transition-colors", "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground", "border-border/60 mt-1 border-t pt-2"), children: [_jsx("span", { "aria-hidden": "true", className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center", children: "+" }), _jsxs("span", { children: ["Create ", _jsxs("span", { className: "font-medium", children: ["\"", search, "\""] })] })] }));
292
+ }
293
+ const ComboboxContent = forwardRef(function ComboboxContent({ className, align = "start", sideOffset = 4, emptyMessage, children, ...props }, ref) {
294
+ const ctx = useCombobox();
295
+ return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { ref: ref, id: ctx.contentId, align: align, sideOffset: sideOffset, className: cn("border-border bg-popover text-popover-foreground z-popover w-(--radix-popover-trigger-width) overflow-hidden rounded-md border shadow-md outline-none", "data-[state=open]:animate-[scale-in_var(--duration-fast)_var(--ease-out)]", "data-[state=closed]:animate-[scale-out_var(--duration-fast)_var(--ease-in)]", className), ...props, children: _jsxs(CommandPrimitive, { shouldFilter: !ctx.loading && !ctx.hasLoadOptions, children: [children, _jsx(ComboboxAsyncOptions, {}), emptyMessage !== undefined ? (_jsx(CommandPrimitive.Empty, { className: "text-muted-foreground px-3 py-6 text-center text-sm", children: emptyMessage })) : null, _jsx(ComboboxCreatable, {}), _jsx(ComboboxResultCount, {})] }) }) }));
296
+ });
297
+ ComboboxContent.displayName = "ComboboxContent";
298
+ // ----------------------------------------------------------------------------
299
+ // ComboboxInput — cmdk's input, wired to the root's search state.
300
+ // ----------------------------------------------------------------------------
301
+ const ComboboxInput = forwardRef(function ComboboxInput({ className, placeholder = "Search…", ...props }, ref) {
302
+ const ctx = useCombobox();
303
+ return (_jsxs("div", { className: "border-border flex items-center gap-2 border-b ps-3 pe-2", children: [_jsx(RiSearchLine, { className: "text-muted-foreground size-4 shrink-0", "aria-hidden": "true" }), _jsx(CommandPrimitive.Input, { ref: ref, value: ctx.search, onValueChange: ctx.setSearch, placeholder: placeholder, dir: "auto", className: cn("text-foreground placeholder:text-muted-foreground h-9 flex-1 bg-transparent text-sm outline-none", "disabled:cursor-not-allowed disabled:opacity-50", className), ...props })] }));
304
+ });
305
+ ComboboxInput.displayName = "ComboboxInput";
306
+ // ----------------------------------------------------------------------------
307
+ // ComboboxEmpty
308
+ // ----------------------------------------------------------------------------
309
+ const ComboboxEmpty = forwardRef(function ComboboxEmpty({ className, ...props }, ref) {
310
+ return (_jsx(CommandPrimitive.Empty, { ref: ref, className: cn("text-muted-foreground px-3 py-6 text-center text-sm", className), ...props }));
311
+ });
312
+ ComboboxEmpty.displayName = "ComboboxEmpty";
313
+ // ----------------------------------------------------------------------------
314
+ // ComboboxList — the scrollable list region. Required by cmdk.
315
+ // ----------------------------------------------------------------------------
316
+ const ComboboxList = forwardRef(function ComboboxList({ className, ...props }, ref) {
317
+ return (_jsx(CommandPrimitive.List, { ref: ref, className: cn("max-h-64 overflow-y-auto p-1", className), ...props }));
318
+ });
319
+ ComboboxList.displayName = "ComboboxList";
320
+ // ----------------------------------------------------------------------------
321
+ // ComboboxGroup / ComboboxLabel
322
+ // ----------------------------------------------------------------------------
323
+ const ComboboxGroup = forwardRef(function ComboboxGroup({ className, ...props }, ref) {
324
+ return (_jsx(CommandPrimitive.Group, { ref: ref, className: cn("text-foreground overflow-hidden", "[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group-heading]]:uppercase", className), ...props }));
325
+ });
326
+ ComboboxGroup.displayName = "ComboboxGroup";
327
+ const ComboboxItem = forwardRef(function ComboboxItem({ className, value, description, icon, disabled, children, ...props }, ref) {
328
+ const ctx = useCombobox();
329
+ const selected = ctx.mode === "multiple" ? ctx.values.includes(value) : ctx.value === value;
330
+ // Multi mode: when at maxSelected, items not already selected are gated.
331
+ const blockedByMax = ctx.mode === "multiple" &&
332
+ ctx.maxSelected !== undefined &&
333
+ !selected &&
334
+ ctx.values.length >= ctx.maxSelected;
335
+ const effectiveDisabled = disabled || blockedByMax;
336
+ return (_jsxs(CommandPrimitive.Item, { ref: ref, value: value, disabled: effectiveDisabled, onSelect: () => {
337
+ if (effectiveDisabled)
338
+ return;
339
+ if (ctx.mode === "multiple") {
340
+ ctx.toggleValue(value);
341
+ // Keep popover open + clear search after a successful toggle so
342
+ // the user can pick another option immediately.
343
+ ctx.setSearch("");
344
+ }
345
+ else {
346
+ ctx.setValue(value);
347
+ ctx.setSearch("");
348
+ ctx.setOpen(false);
349
+ }
350
+ }, className: cn("relative flex w-full cursor-pointer items-start gap-2 rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none select-none", "transition-colors", "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground", "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50", className), "aria-selected": selected || undefined, ...props, children: [_jsx("span", { className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center", children: selected ? _jsx(RiCheckLine, { className: "size-4" }) : null }), _jsxs("span", { className: "flex flex-1 flex-col gap-0.5 leading-none", children: [_jsxs("span", { className: "inline-flex items-center gap-2", children: [icon ? (_jsx("span", { "aria-hidden": "true", className: "text-muted-foreground inline-flex shrink-0 [&_svg]:size-4 [&_svg]:shrink-0", children: icon })) : null, _jsx("span", { children: children ?? value })] }), description ? (_jsx("span", { className: "text-muted-foreground text-xs", children: description })) : null] })] }));
351
+ });
352
+ ComboboxItem.displayName = "ComboboxItem";
353
+ // ----------------------------------------------------------------------------
354
+ // ComboboxSeparator
355
+ // ----------------------------------------------------------------------------
356
+ const ComboboxSeparator = forwardRef(function ComboboxSeparator({ className, ...props }, ref) {
357
+ return (_jsx(CommandPrimitive.Separator, { ref: ref, className: cn("bg-border -mx-1 my-1 h-px", className), ...props }));
358
+ });
359
+ ComboboxSeparator.displayName = "ComboboxSeparator";
360
+ export { Combobox, ComboboxTrigger, ComboboxContent, ComboboxInput, ComboboxList, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, };
361
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../../components/ui/combobox.tsx"],"names":[],"mappings":"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"}