@baseplate-dev/react-generators 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/constants/react-packages.d.ts +1 -1
  2. package/dist/constants/react-packages.js +1 -1
  3. package/dist/constants/react-packages.js.map +1 -1
  4. package/dist/generators/admin/_providers/admin-crud-action-container.d.ts +18 -0
  5. package/dist/generators/admin/_providers/admin-crud-action-container.d.ts.map +1 -0
  6. package/dist/generators/admin/_providers/admin-crud-action-container.js +3 -0
  7. package/dist/generators/admin/_providers/admin-crud-action-container.js.map +1 -0
  8. package/dist/generators/admin/_providers/index.d.ts +1 -0
  9. package/dist/generators/admin/_providers/index.d.ts.map +1 -1
  10. package/dist/generators/admin/_providers/index.js +1 -0
  11. package/dist/generators/admin/_providers/index.js.map +1 -1
  12. package/dist/generators/admin/admin-bull-board/admin-bull-board.generator.d.ts +88 -3
  13. package/dist/generators/admin/admin-bull-board/admin-bull-board.generator.d.ts.map +1 -1
  14. package/dist/generators/admin/admin-bull-board/generated/index.d.ts +176 -6
  15. package/dist/generators/admin/admin-bull-board/generated/index.d.ts.map +1 -1
  16. package/dist/generators/admin/admin-bull-board/generated/template-renderers.d.ts +88 -3
  17. package/dist/generators/admin/admin-bull-board/generated/template-renderers.d.ts.map +1 -1
  18. package/dist/generators/admin/admin-bull-board/generated/typed-templates.d.ts +88 -3
  19. package/dist/generators/admin/admin-bull-board/generated/typed-templates.d.ts.map +1 -1
  20. package/dist/generators/admin/admin-components/admin-components.generator.d.ts +88 -3
  21. package/dist/generators/admin/admin-components/admin-components.generator.d.ts.map +1 -1
  22. package/dist/generators/admin/admin-components/generated/index.d.ts +440 -15
  23. package/dist/generators/admin/admin-components/generated/index.d.ts.map +1 -1
  24. package/dist/generators/admin/admin-components/generated/template-renderers.d.ts +88 -3
  25. package/dist/generators/admin/admin-components/generated/template-renderers.d.ts.map +1 -1
  26. package/dist/generators/admin/admin-components/generated/typed-templates.d.ts +704 -24
  27. package/dist/generators/admin/admin-components/generated/typed-templates.d.ts.map +1 -1
  28. package/dist/generators/admin/admin-crud-delete-action/admin-crud-delete-action.generator.d.ts +228 -0
  29. package/dist/generators/admin/admin-crud-delete-action/admin-crud-delete-action.generator.d.ts.map +1 -0
  30. package/dist/generators/admin/admin-crud-delete-action/admin-crud-delete-action.generator.js +99 -0
  31. package/dist/generators/admin/admin-crud-delete-action/admin-crud-delete-action.generator.js.map +1 -0
  32. package/dist/generators/admin/admin-crud-delete-action/index.d.ts +2 -0
  33. package/dist/generators/admin/admin-crud-delete-action/index.d.ts.map +1 -0
  34. package/dist/generators/admin/admin-crud-delete-action/index.js +2 -0
  35. package/dist/generators/admin/admin-crud-delete-action/index.js.map +1 -0
  36. package/dist/generators/admin/admin-crud-edit/admin-crud-edit.generator.d.ts +311 -9
  37. package/dist/generators/admin/admin-crud-edit/admin-crud-edit.generator.d.ts.map +1 -1
  38. package/dist/generators/admin/admin-crud-edit/admin-crud-edit.generator.js +27 -27
  39. package/dist/generators/admin/admin-crud-edit/admin-crud-edit.generator.js.map +1 -1
  40. package/dist/generators/admin/admin-crud-edit/generated/index.d.ts +196 -10
  41. package/dist/generators/admin/admin-crud-edit/generated/index.d.ts.map +1 -1
  42. package/dist/generators/admin/admin-crud-edit/generated/template-renderers.d.ts +91 -3
  43. package/dist/generators/admin/admin-crud-edit/generated/template-renderers.d.ts.map +1 -1
  44. package/dist/generators/admin/admin-crud-edit/generated/template-renderers.js +6 -0
  45. package/dist/generators/admin/admin-crud-edit/generated/template-renderers.js.map +1 -1
  46. package/dist/generators/admin/admin-crud-edit/generated/typed-templates.d.ts +108 -7
  47. package/dist/generators/admin/admin-crud-edit/generated/typed-templates.d.ts.map +1 -1
  48. package/dist/generators/admin/admin-crud-edit/generated/typed-templates.js +17 -4
  49. package/dist/generators/admin/admin-crud-edit/generated/typed-templates.js.map +1 -1
  50. package/dist/generators/admin/admin-crud-edit/templates/create.tsx +3 -0
  51. package/dist/generators/admin/admin-crud-edit/templates/edit-form.tsx +17 -5
  52. package/dist/generators/admin/admin-crud-edit/templates/edit.tsx +12 -5
  53. package/dist/generators/admin/admin-crud-edit/templates/route.tsx +9 -0
  54. package/dist/generators/admin/admin-crud-edit-action/admin-crud-edit-action.generator.d.ts +221 -0
  55. package/dist/generators/admin/admin-crud-edit-action/admin-crud-edit-action.generator.d.ts.map +1 -0
  56. package/dist/generators/admin/admin-crud-edit-action/admin-crud-edit-action.generator.js +67 -0
  57. package/dist/generators/admin/admin-crud-edit-action/admin-crud-edit-action.generator.js.map +1 -0
  58. package/dist/generators/admin/admin-crud-edit-action/index.d.ts +2 -0
  59. package/dist/generators/admin/admin-crud-edit-action/index.d.ts.map +1 -0
  60. package/dist/generators/admin/admin-crud-edit-action/index.js +2 -0
  61. package/dist/generators/admin/admin-crud-edit-action/index.js.map +1 -0
  62. package/dist/generators/admin/admin-crud-embedded-form/admin-crud-embedded-form.generator.d.ts +88 -3
  63. package/dist/generators/admin/admin-crud-embedded-form/admin-crud-embedded-form.generator.d.ts.map +1 -1
  64. package/dist/generators/admin/admin-crud-embedded-form/generated/index.d.ts +176 -6
  65. package/dist/generators/admin/admin-crud-embedded-form/generated/index.d.ts.map +1 -1
  66. package/dist/generators/admin/admin-crud-embedded-form/generated/template-renderers.d.ts +88 -3
  67. package/dist/generators/admin/admin-crud-embedded-form/generated/template-renderers.d.ts.map +1 -1
  68. package/dist/generators/admin/admin-crud-embedded-form/generated/typed-templates.d.ts +88 -3
  69. package/dist/generators/admin/admin-crud-embedded-form/generated/typed-templates.d.ts.map +1 -1
  70. package/dist/generators/admin/admin-crud-enum-input/admin-crud-enum-input.generator.d.ts +88 -3
  71. package/dist/generators/admin/admin-crud-enum-input/admin-crud-enum-input.generator.d.ts.map +1 -1
  72. package/dist/generators/admin/admin-crud-foreign-column/admin-crud-foreign-column.generator.d.ts +20 -0
  73. package/dist/generators/admin/admin-crud-foreign-column/admin-crud-foreign-column.generator.d.ts.map +1 -0
  74. package/dist/generators/admin/admin-crud-foreign-column/admin-crud-foreign-column.generator.js +67 -0
  75. package/dist/generators/admin/admin-crud-foreign-column/admin-crud-foreign-column.generator.js.map +1 -0
  76. package/dist/generators/admin/admin-crud-foreign-column/index.d.ts +2 -0
  77. package/dist/generators/admin/admin-crud-foreign-column/index.d.ts.map +1 -0
  78. package/dist/generators/admin/admin-crud-foreign-column/index.js +2 -0
  79. package/dist/generators/admin/admin-crud-foreign-column/index.js.map +1 -0
  80. package/dist/generators/admin/admin-crud-foreign-input/admin-crud-foreign-input.generator.d.ts +88 -3
  81. package/dist/generators/admin/admin-crud-foreign-input/admin-crud-foreign-input.generator.d.ts.map +1 -1
  82. package/dist/generators/admin/admin-crud-list/admin-crud-list.generator.d.ts +306 -8
  83. package/dist/generators/admin/admin-crud-list/admin-crud-list.generator.d.ts.map +1 -1
  84. package/dist/generators/admin/admin-crud-list/admin-crud-list.generator.js +65 -22
  85. package/dist/generators/admin/admin-crud-list/admin-crud-list.generator.js.map +1 -1
  86. package/dist/generators/admin/admin-crud-list/generated/index.d.ts +273 -27
  87. package/dist/generators/admin/admin-crud-list/generated/index.d.ts.map +1 -1
  88. package/dist/generators/admin/admin-crud-list/generated/template-renderers.d.ts +88 -8
  89. package/dist/generators/admin/admin-crud-list/generated/template-renderers.d.ts.map +1 -1
  90. package/dist/generators/admin/admin-crud-list/generated/template-renderers.js +1 -4
  91. package/dist/generators/admin/admin-crud-list/generated/template-renderers.js.map +1 -1
  92. package/dist/generators/admin/admin-crud-list/generated/typed-templates.d.ts +185 -19
  93. package/dist/generators/admin/admin-crud-list/generated/typed-templates.d.ts.map +1 -1
  94. package/dist/generators/admin/admin-crud-list/generated/typed-templates.js +7 -12
  95. package/dist/generators/admin/admin-crud-list/generated/typed-templates.js.map +1 -1
  96. package/dist/generators/admin/admin-crud-list/templates/index.tsx +7 -21
  97. package/dist/generators/admin/admin-crud-list/templates/table.tsx +53 -0
  98. package/dist/generators/admin/admin-crud-password-input/admin-crud-password-input.generator.d.ts +88 -3
  99. package/dist/generators/admin/admin-crud-password-input/admin-crud-password-input.generator.d.ts.map +1 -1
  100. package/dist/generators/admin/admin-crud-text-column/admin-crud-text-column.generator.d.ts +11 -0
  101. package/dist/generators/admin/admin-crud-text-column/admin-crud-text-column.generator.d.ts.map +1 -0
  102. package/dist/generators/admin/admin-crud-text-column/admin-crud-text-column.generator.js +35 -0
  103. package/dist/generators/admin/admin-crud-text-column/admin-crud-text-column.generator.js.map +1 -0
  104. package/dist/generators/admin/admin-crud-text-column/index.d.ts +2 -0
  105. package/dist/generators/admin/admin-crud-text-column/index.d.ts.map +1 -0
  106. package/dist/generators/admin/admin-crud-text-column/index.js +2 -0
  107. package/dist/generators/admin/admin-crud-text-column/index.js.map +1 -0
  108. package/dist/generators/admin/admin-crud-text-input/admin-crud-text-input.generator.d.ts +88 -3
  109. package/dist/generators/admin/admin-crud-text-input/admin-crud-text-input.generator.d.ts.map +1 -1
  110. package/dist/generators/admin/admin-home/admin-home.generator.d.ts +88 -3
  111. package/dist/generators/admin/admin-home/admin-home.generator.d.ts.map +1 -1
  112. package/dist/generators/admin/admin-home/generated/index.d.ts +176 -6
  113. package/dist/generators/admin/admin-home/generated/index.d.ts.map +1 -1
  114. package/dist/generators/admin/admin-home/generated/template-renderers.d.ts +88 -3
  115. package/dist/generators/admin/admin-home/generated/template-renderers.d.ts.map +1 -1
  116. package/dist/generators/admin/admin-home/generated/typed-templates.d.ts +88 -3
  117. package/dist/generators/admin/admin-home/generated/typed-templates.d.ts.map +1 -1
  118. package/dist/generators/admin/admin-home/templates/routes/index.tsx +0 -1
  119. package/dist/generators/admin/admin-layout/admin-layout.generator.d.ts +176 -6
  120. package/dist/generators/admin/admin-layout/admin-layout.generator.d.ts.map +1 -1
  121. package/dist/generators/admin/admin-layout/admin-layout.generator.js +14 -9
  122. package/dist/generators/admin/admin-layout/admin-layout.generator.js.map +1 -1
  123. package/dist/generators/admin/admin-layout/generated/index.d.ts +746 -145
  124. package/dist/generators/admin/admin-layout/generated/index.d.ts.map +1 -1
  125. package/dist/generators/admin/admin-layout/generated/template-paths.d.ts +2 -0
  126. package/dist/generators/admin/admin-layout/generated/template-paths.d.ts.map +1 -1
  127. package/dist/generators/admin/admin-layout/generated/template-paths.js +2 -0
  128. package/dist/generators/admin/admin-layout/generated/template-paths.js.map +1 -1
  129. package/dist/generators/admin/admin-layout/generated/template-renderers.d.ts +92 -7
  130. package/dist/generators/admin/admin-layout/generated/template-renderers.d.ts.map +1 -1
  131. package/dist/generators/admin/admin-layout/generated/template-renderers.js +10 -9
  132. package/dist/generators/admin/admin-layout/generated/template-renderers.js.map +1 -1
  133. package/dist/generators/admin/admin-layout/generated/typed-templates.d.ts +1179 -5
  134. package/dist/generators/admin/admin-layout/generated/typed-templates.d.ts.map +1 -1
  135. package/dist/generators/admin/admin-layout/generated/typed-templates.js +42 -13
  136. package/dist/generators/admin/admin-layout/generated/typed-templates.js.map +1 -1
  137. package/dist/generators/admin/admin-layout/templates/components/layouts/admin-layout.tsx +21 -34
  138. package/dist/generators/admin/admin-layout/templates/components/layouts/app-breadcrumbs.tsx +53 -0
  139. package/dist/generators/admin/admin-layout/templates/components/layouts/app-sidebar.tsx +50 -0
  140. package/dist/generators/admin/admin-layout/templates/routes/route.tsx +3 -0
  141. package/dist/generators/admin/index.d.ts +4 -3
  142. package/dist/generators/admin/index.d.ts.map +1 -1
  143. package/dist/generators/admin/index.js +4 -3
  144. package/dist/generators/admin/index.js.map +1 -1
  145. package/dist/generators/auth/auth-errors/auth-errors.generator.d.ts +88 -3
  146. package/dist/generators/auth/auth-errors/auth-errors.generator.d.ts.map +1 -1
  147. package/dist/generators/core/react-components/generated/index.d.ts +137 -4
  148. package/dist/generators/core/react-components/generated/index.d.ts.map +1 -1
  149. package/dist/generators/core/react-components/generated/template-paths.d.ts +12 -1
  150. package/dist/generators/core/react-components/generated/template-paths.d.ts.map +1 -1
  151. package/dist/generators/core/react-components/generated/template-paths.js +12 -1
  152. package/dist/generators/core/react-components/generated/template-paths.js.map +1 -1
  153. package/dist/generators/core/react-components/generated/ts-import-providers.d.ts +264 -9
  154. package/dist/generators/core/react-components/generated/ts-import-providers.d.ts.map +1 -1
  155. package/dist/generators/core/react-components/generated/ts-import-providers.js +168 -6
  156. package/dist/generators/core/react-components/generated/ts-import-providers.js.map +1 -1
  157. package/dist/generators/core/react-components/generated/typed-templates.d.ts +98 -2
  158. package/dist/generators/core/react-components/generated/typed-templates.d.ts.map +1 -1
  159. package/dist/generators/core/react-components/generated/typed-templates.js +257 -7
  160. package/dist/generators/core/react-components/generated/typed-templates.js.map +1 -1
  161. package/dist/generators/core/react-components/react-components.generator.d.ts +176 -6
  162. package/dist/generators/core/react-components/react-components.generator.d.ts.map +1 -1
  163. package/dist/generators/core/react-components/templates/components/ui/badge.tsx +77 -0
  164. package/dist/generators/core/react-components/templates/components/ui/breadcrumb.tsx +122 -0
  165. package/dist/generators/core/react-components/templates/components/ui/command.tsx +186 -0
  166. package/dist/generators/core/react-components/templates/components/ui/dropdown.tsx +284 -0
  167. package/dist/generators/core/react-components/templates/components/ui/multi-combobox-field.tsx +135 -0
  168. package/dist/generators/core/react-components/templates/components/ui/multi-combobox.tsx +333 -0
  169. package/dist/generators/core/react-components/templates/components/ui/separator.tsx +35 -0
  170. package/dist/generators/core/react-components/templates/components/ui/sheet.tsx +155 -0
  171. package/dist/generators/core/react-components/templates/components/ui/sidebar.tsx +778 -0
  172. package/dist/generators/core/react-components/templates/components/ui/skeleton.tsx +23 -0
  173. package/dist/generators/core/react-components/templates/components/ui/tooltip.tsx +63 -0
  174. package/dist/generators/core/react-components/templates/src/hooks/use-mobile.ts +32 -0
  175. package/dist/generators/core/react-error-boundary/generated/index.d.ts +176 -6
  176. package/dist/generators/core/react-error-boundary/generated/index.d.ts.map +1 -1
  177. package/dist/generators/core/react-error-boundary/generated/template-renderers.d.ts +88 -3
  178. package/dist/generators/core/react-error-boundary/generated/template-renderers.d.ts.map +1 -1
  179. package/dist/generators/core/react-error-boundary/generated/typed-templates.d.ts +88 -3
  180. package/dist/generators/core/react-error-boundary/generated/typed-templates.d.ts.map +1 -1
  181. package/dist/generators/core/react-error-boundary/react-error-boundary.generator.d.ts +88 -3
  182. package/dist/generators/core/react-error-boundary/react-error-boundary.generator.d.ts.map +1 -1
  183. package/dist/generators/core/react-router/generated/index.d.ts +176 -6
  184. package/dist/generators/core/react-router/generated/index.d.ts.map +1 -1
  185. package/dist/generators/core/react-router/generated/template-renderers.d.ts +88 -3
  186. package/dist/generators/core/react-router/generated/template-renderers.d.ts.map +1 -1
  187. package/dist/generators/core/react-router/generated/typed-templates.d.ts +88 -3
  188. package/dist/generators/core/react-router/generated/typed-templates.d.ts.map +1 -1
  189. package/dist/generators/core/react-router/react-router.generator.d.ts +88 -3
  190. package/dist/generators/core/react-router/react-router.generator.d.ts.map +1 -1
  191. package/dist/generators/core/react-router/templates/src/app/router.tsx +7 -1
  192. package/package.json +5 -5
  193. package/dist/generators/admin/admin-crud-column/admin-crud-column.generator.d.ts +0 -12
  194. package/dist/generators/admin/admin-crud-column/admin-crud-column.generator.d.ts.map +0 -1
  195. package/dist/generators/admin/admin-crud-column/admin-crud-column.generator.js +0 -52
  196. package/dist/generators/admin/admin-crud-column/admin-crud-column.generator.js.map +0 -1
  197. package/dist/generators/admin/admin-crud-column/index.d.ts +0 -2
  198. package/dist/generators/admin/admin-crud-column/index.d.ts.map +0 -1
  199. package/dist/generators/admin/admin-crud-column/index.js +0 -2
  200. package/dist/generators/admin/admin-crud-column/index.js.map +0 -1
  201. package/dist/generators/admin/admin-crud-foreign-display/admin-crud-foreign-display.generator.d.ts +0 -17
  202. package/dist/generators/admin/admin-crud-foreign-display/admin-crud-foreign-display.generator.d.ts.map +0 -1
  203. package/dist/generators/admin/admin-crud-foreign-display/admin-crud-foreign-display.generator.js +0 -60
  204. package/dist/generators/admin/admin-crud-foreign-display/admin-crud-foreign-display.generator.js.map +0 -1
  205. package/dist/generators/admin/admin-crud-foreign-display/index.d.ts +0 -2
  206. package/dist/generators/admin/admin-crud-foreign-display/index.d.ts.map +0 -1
  207. package/dist/generators/admin/admin-crud-foreign-display/index.js +0 -2
  208. package/dist/generators/admin/admin-crud-foreign-display/index.js.map +0 -1
  209. package/dist/generators/admin/admin-crud-list/templates/Table.tsx +0 -91
  210. package/dist/generators/admin/admin-crud-text-display/admin-crud-text-display.generator.d.ts +0 -8
  211. package/dist/generators/admin/admin-crud-text-display/admin-crud-text-display.generator.d.ts.map +0 -1
  212. package/dist/generators/admin/admin-crud-text-display/admin-crud-text-display.generator.js +0 -28
  213. package/dist/generators/admin/admin-crud-text-display/admin-crud-text-display.generator.js.map +0 -1
  214. package/dist/generators/admin/admin-crud-text-display/index.d.ts +0 -2
  215. package/dist/generators/admin/admin-crud-text-display/index.d.ts.map +0 -1
  216. package/dist/generators/admin/admin-crud-text-display/index.js +0 -2
  217. package/dist/generators/admin/admin-crud-text-display/index.js.map +0 -1
  218. package/dist/generators/core/react-components/templates/components/ui/sidebar-layout.tsx +0 -70
@@ -0,0 +1,333 @@
1
+ // @ts-nocheck
2
+
3
+ 'use client';
4
+
5
+ import { Badge } from '$badge';
6
+ import { cn } from '$cn';
7
+ import {
8
+ Command,
9
+ CommandEmpty,
10
+ CommandGroup,
11
+ CommandInput,
12
+ CommandItem,
13
+ CommandList,
14
+ } from '$command';
15
+ import { useControlledState } from '$hooksUseControlledState';
16
+ import {
17
+ Popover,
18
+ PopoverAnchor,
19
+ PopoverContent,
20
+ PopoverTrigger,
21
+ } from '$popover';
22
+ import { inputVariants } from '$stylesInput';
23
+ import { selectContentVariants, selectItemVariants } from '$stylesSelect';
24
+ import React, { useId, useMemo, useState } from 'react';
25
+ import { MdCheck, MdClose, MdUnfoldMore } from 'react-icons/md';
26
+
27
+ interface MultiComboboxContextValue {
28
+ selectedValues: MultiComboboxOption[];
29
+ onSelect: (
30
+ value: string,
31
+ label: string | undefined,
32
+ selected: boolean,
33
+ ) => void;
34
+ disabled?: boolean;
35
+ isOpen: boolean;
36
+ setIsOpen: (open: boolean) => void;
37
+ inputId: string;
38
+ filterId: string;
39
+ searchQuery: string;
40
+ setSearchQuery: (query: string) => void;
41
+ }
42
+
43
+ const MultiComboboxContext =
44
+ React.createContext<MultiComboboxContextValue | null>(null);
45
+
46
+ interface MultiComboboxOption {
47
+ label?: string;
48
+ value: string;
49
+ }
50
+
51
+ interface MultiComboboxProps {
52
+ children?: React.ReactNode;
53
+ value?: MultiComboboxOption[];
54
+ onChange?: (value: MultiComboboxOption[]) => void;
55
+ disabled?: boolean;
56
+ }
57
+
58
+ function MultiCombobox({
59
+ children,
60
+ value,
61
+ onChange,
62
+ disabled,
63
+ }: MultiComboboxProps): React.ReactElement {
64
+ const [selectedValues, setSelectedValues] = useControlledState(
65
+ value,
66
+ onChange,
67
+ [],
68
+ );
69
+ const [searchQuery, setSearchQuery] = useState('');
70
+ const [isOpen, setIsOpen] = useState(false);
71
+ const inputId = useId();
72
+ const filterId = useId();
73
+ const contextValue: MultiComboboxContextValue = useMemo(
74
+ () => ({
75
+ selectedValues,
76
+ onSelect: (value, label, selected) => {
77
+ setSearchQuery('');
78
+ if (selected) {
79
+ setSelectedValues([...selectedValues, { label, value }]);
80
+ } else {
81
+ setSelectedValues(selectedValues.filter((v) => v.value !== value));
82
+ }
83
+ },
84
+ disabled,
85
+ isOpen,
86
+ setIsOpen: (open) => {
87
+ setSearchQuery('');
88
+ setIsOpen(open);
89
+ },
90
+ inputId,
91
+ filterId,
92
+ searchQuery,
93
+ setSearchQuery,
94
+ }),
95
+ [
96
+ selectedValues,
97
+ setSelectedValues,
98
+ disabled,
99
+ isOpen,
100
+ inputId,
101
+ filterId,
102
+ searchQuery,
103
+ setSearchQuery,
104
+ ],
105
+ );
106
+
107
+ return (
108
+ <MultiComboboxContext.Provider value={contextValue}>
109
+ <Popover open={isOpen} onOpenChange={setIsOpen}>
110
+ {children}
111
+ </Popover>
112
+ </MultiComboboxContext.Provider>
113
+ );
114
+ }
115
+
116
+ export function useMultiComboboxContext(): MultiComboboxContextValue {
117
+ const value = React.useContext(MultiComboboxContext);
118
+
119
+ if (!value) {
120
+ throw new Error(
121
+ `useMultiComboboxContext must be used inside a MultiComboboxContext provider`,
122
+ );
123
+ }
124
+
125
+ return value;
126
+ }
127
+
128
+ interface MultiComboboxInputProps {
129
+ className?: string;
130
+ placeholder?: string;
131
+ }
132
+
133
+ function MultiComboboxInput({
134
+ className,
135
+ placeholder,
136
+ }: MultiComboboxInputProps): React.ReactElement {
137
+ const {
138
+ selectedValues,
139
+ onSelect,
140
+ disabled,
141
+ setIsOpen,
142
+ isOpen,
143
+ inputId,
144
+ filterId,
145
+ } = useMultiComboboxContext();
146
+
147
+ const handleClick = (): void => {
148
+ if (disabled) return;
149
+ setIsOpen(!isOpen);
150
+ };
151
+
152
+ return (
153
+ <PopoverAnchor asChild>
154
+ <div
155
+ className={cn(
156
+ inputVariants({
157
+ height: 'flexible',
158
+ }),
159
+ 'flex items-center gap-2',
160
+ disabled && 'opacity-50',
161
+ className,
162
+ )}
163
+ onClick={handleClick}
164
+ onKeyDown={(e) => {
165
+ if (e.key === 'Enter') {
166
+ handleClick();
167
+ }
168
+ }}
169
+ role="button"
170
+ tabIndex={0}
171
+ data-cmdk-input-id={inputId}
172
+ >
173
+ <div className="flex flex-1 flex-wrap items-center gap-1">
174
+ {selectedValues.length === 0 && (
175
+ <div className="text-muted-foreground">{placeholder}</div>
176
+ )}
177
+ {selectedValues.length > 0 && (
178
+ <>
179
+ {selectedValues.map((option) => (
180
+ <Badge
181
+ variant="secondary"
182
+ key={option.value}
183
+ className="flex items-center gap-1 rounded-xs px-1 font-normal"
184
+ >
185
+ <div>{option.label}</div>
186
+ <button
187
+ className="-mr-1 rounded-full p-0.5 hover:bg-secondary-hover"
188
+ onKeyDown={(e) => {
189
+ if (e.key === 'Enter') {
190
+ onSelect(option.value, option.label, false);
191
+ e.stopPropagation();
192
+ }
193
+ }}
194
+ onClick={(e) => {
195
+ onSelect(option.value, option.label, false);
196
+ if (isOpen) {
197
+ document
198
+ .querySelector<HTMLInputElement>(
199
+ `[data-cmdk-filter-id="${filterId}"]`,
200
+ )
201
+ ?.focus();
202
+ }
203
+ e.stopPropagation();
204
+ }}
205
+ >
206
+ <MdClose />
207
+ </button>
208
+ </Badge>
209
+ ))}
210
+ </>
211
+ )}
212
+ </div>
213
+ <PopoverTrigger>
214
+ <MdUnfoldMore className="size-4" />
215
+ </PopoverTrigger>
216
+ </div>
217
+ </PopoverAnchor>
218
+ );
219
+ }
220
+
221
+ interface MultiComboboxContentProps extends React.ComponentPropsWithRef<'div'> {
222
+ children?: React.ReactNode;
223
+ className?: string;
224
+ maxHeight?: string;
225
+ style?: React.CSSProperties;
226
+ }
227
+
228
+ function MultiComboboxContent({
229
+ children,
230
+ className,
231
+ maxHeight = '320px',
232
+ style,
233
+ ...rest
234
+ }: MultiComboboxContentProps): React.ReactElement {
235
+ const { inputId, filterId, searchQuery, setSearchQuery } =
236
+ useMultiComboboxContext();
237
+
238
+ return (
239
+ <PopoverContent
240
+ align="start"
241
+ width="none"
242
+ padding="none"
243
+ sideOffset={0}
244
+ className={cn(selectContentVariants({ popper: 'active' }), className)}
245
+ style={
246
+ {
247
+ '--max-popover-height': maxHeight,
248
+ width: 'var(--radix-popover-trigger-width)',
249
+ ...style,
250
+ } as Record<string, string>
251
+ }
252
+ onInteractOutside={(e) => {
253
+ if (
254
+ e.target &&
255
+ e.target instanceof Element &&
256
+ e.target.closest(`[data-cmdk-input-id="${inputId}"]`)
257
+ ) {
258
+ e.preventDefault();
259
+ }
260
+ }}
261
+ {...rest}
262
+ data-combobox-content=""
263
+ >
264
+ <Command>
265
+ <CommandInput
266
+ data-cmdk-filter-id={filterId}
267
+ value={searchQuery}
268
+ onValueChange={setSearchQuery}
269
+ />
270
+ <CommandList>{children}</CommandList>
271
+ </Command>
272
+ </PopoverContent>
273
+ );
274
+ }
275
+
276
+ function MultiComboboxEmpty({
277
+ className,
278
+ ...props
279
+ }: React.ComponentPropsWithRef<'div'>): React.ReactElement {
280
+ return <CommandEmpty className={cn('p-2 text-sm', className)} {...props} />;
281
+ }
282
+
283
+ const MultiComboboxGroup = CommandGroup;
284
+
285
+ interface MultiComboboxItemProps
286
+ extends Omit<React.ComponentPropsWithRef<'div'>, 'onSelect'> {
287
+ disabled?: boolean;
288
+ value: string;
289
+ label?: string;
290
+ }
291
+
292
+ function MultiComboboxItem({
293
+ value,
294
+ className,
295
+ label,
296
+ children,
297
+ ...rest
298
+ }: MultiComboboxItemProps): React.ReactElement {
299
+ const { selectedValues, onSelect } = useMultiComboboxContext();
300
+ const isSelected = selectedValues.some((v) => v.value === value);
301
+ const itemRef = React.useRef<HTMLDivElement>(null);
302
+
303
+ return (
304
+ <CommandItem
305
+ onSelect={() => {
306
+ const itemLabel = label ?? itemRef.current?.textContent ?? undefined;
307
+ onSelect(value, itemLabel, !isSelected);
308
+ }}
309
+ className={cn(selectItemVariants(), className)}
310
+ {...rest}
311
+ ref={itemRef}
312
+ >
313
+ <div
314
+ className={cn(
315
+ 'mr-2 flex h-4 w-4 items-center justify-center rounded-xs border',
316
+ isSelected ? 'opacity-100' : '[&_svg]:invisible',
317
+ )}
318
+ >
319
+ <MdCheck className={'size-4'} />
320
+ </div>
321
+ {children}
322
+ </CommandItem>
323
+ );
324
+ }
325
+
326
+ export {
327
+ MultiCombobox,
328
+ MultiComboboxContent,
329
+ MultiComboboxEmpty,
330
+ MultiComboboxGroup,
331
+ MultiComboboxInput,
332
+ MultiComboboxItem,
333
+ };
@@ -0,0 +1,35 @@
1
+ // @ts-nocheck
2
+
3
+ 'use client';
4
+
5
+ import type * as React from 'react';
6
+
7
+ import { cn } from '$cn';
8
+ import { Separator as SeparatorPrimitive } from 'radix-ui';
9
+
10
+ /**
11
+ * Visually or semantically separates content.
12
+ *
13
+ * https://ui.shadcn.com/docs/components/separator
14
+ */
15
+ function Separator({
16
+ className,
17
+ orientation = 'horizontal',
18
+ decorative = true,
19
+ ...props
20
+ }: React.ComponentProps<typeof SeparatorPrimitive.Root>): React.ReactElement {
21
+ return (
22
+ <SeparatorPrimitive.Root
23
+ data-slot="separator-root"
24
+ decorative={decorative}
25
+ orientation={orientation}
26
+ className={cn(
27
+ 'shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',
28
+ className,
29
+ )}
30
+ {...props}
31
+ />
32
+ );
33
+ }
34
+
35
+ export { Separator };
@@ -0,0 +1,155 @@
1
+ // @ts-nocheck
2
+
3
+ 'use client';
4
+
5
+ import type * as React from 'react';
6
+ import type { ReactElement } from 'react';
7
+
8
+ import { cn } from '$cn';
9
+ import { Dialog as SheetPrimitive } from 'radix-ui';
10
+ import { MdClose } from 'react-icons/md';
11
+
12
+ /**
13
+ * React component that overlays a sheet on top of the current page.
14
+ *
15
+ * https://ui.shadcn.com/docs/components/sheet
16
+ */
17
+ function Sheet({
18
+ ...props
19
+ }: React.ComponentProps<typeof SheetPrimitive.Root>): ReactElement {
20
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />;
21
+ }
22
+
23
+ function SheetTrigger({
24
+ ...props
25
+ }: React.ComponentProps<typeof SheetPrimitive.Trigger>): ReactElement {
26
+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />;
27
+ }
28
+
29
+ function SheetClose({
30
+ ...props
31
+ }: React.ComponentProps<typeof SheetPrimitive.Close>): ReactElement {
32
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
33
+ }
34
+
35
+ function SheetPortal({
36
+ ...props
37
+ }: React.ComponentProps<typeof SheetPrimitive.Portal>): ReactElement {
38
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />;
39
+ }
40
+
41
+ function SheetOverlay({
42
+ className,
43
+ ...props
44
+ }: React.ComponentProps<typeof SheetPrimitive.Overlay>): ReactElement {
45
+ return (
46
+ <SheetPrimitive.Overlay
47
+ data-slot="sheet-overlay"
48
+ className={cn(
49
+ 'fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',
50
+ className,
51
+ )}
52
+ {...props}
53
+ />
54
+ );
55
+ }
56
+
57
+ function SheetContent({
58
+ className,
59
+ children,
60
+ side = 'right',
61
+ ...props
62
+ }: React.ComponentProps<typeof SheetPrimitive.Content> & {
63
+ side?: 'top' | 'right' | 'bottom' | 'left';
64
+ }): ReactElement {
65
+ return (
66
+ <SheetPortal>
67
+ <SheetOverlay />
68
+ <SheetPrimitive.Content
69
+ data-slot="sheet-content"
70
+ className={cn(
71
+ 'fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500',
72
+ side === 'right' &&
73
+ 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
74
+ side === 'left' &&
75
+ 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
76
+ side === 'top' &&
77
+ 'inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
78
+ side === 'bottom' &&
79
+ 'inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
80
+ className,
81
+ )}
82
+ {...props}
83
+ >
84
+ {children}
85
+ <SheetPrimitive.Close className="absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary">
86
+ <MdClose className="size-4" />
87
+ <span className="sr-only">Close</span>
88
+ </SheetPrimitive.Close>
89
+ </SheetPrimitive.Content>
90
+ </SheetPortal>
91
+ );
92
+ }
93
+
94
+ function SheetHeader({
95
+ className,
96
+ ...props
97
+ }: React.ComponentProps<'div'>): ReactElement {
98
+ return (
99
+ <div
100
+ data-slot="sheet-header"
101
+ className={cn('flex flex-col gap-1.5 p-4', className)}
102
+ {...props}
103
+ />
104
+ );
105
+ }
106
+
107
+ function SheetFooter({
108
+ className,
109
+ ...props
110
+ }: React.ComponentProps<'div'>): ReactElement {
111
+ return (
112
+ <div
113
+ data-slot="sheet-footer"
114
+ className={cn('mt-auto flex flex-col gap-2 p-4', className)}
115
+ {...props}
116
+ />
117
+ );
118
+ }
119
+
120
+ function SheetTitle({
121
+ className,
122
+ ...props
123
+ }: React.ComponentProps<typeof SheetPrimitive.Title>): ReactElement {
124
+ return (
125
+ <SheetPrimitive.Title
126
+ data-slot="sheet-title"
127
+ className={cn('font-semibold text-foreground', className)}
128
+ {...props}
129
+ />
130
+ );
131
+ }
132
+
133
+ function SheetDescription({
134
+ className,
135
+ ...props
136
+ }: React.ComponentProps<typeof SheetPrimitive.Description>): ReactElement {
137
+ return (
138
+ <SheetPrimitive.Description
139
+ data-slot="sheet-description"
140
+ className={cn('text-sm text-muted-foreground', className)}
141
+ {...props}
142
+ />
143
+ );
144
+ }
145
+
146
+ export {
147
+ Sheet,
148
+ SheetClose,
149
+ SheetContent,
150
+ SheetDescription,
151
+ SheetFooter,
152
+ SheetHeader,
153
+ SheetTitle,
154
+ SheetTrigger,
155
+ };