@egose/shadcn-theme 0.1.6 → 0.1.8

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 (94) hide show
  1. package/chunk-ELSPE6GB.mjs +43 -0
  2. package/chunk-ELSPE6GB.mjs.map +1 -0
  3. package/{chunk-3ZN766EW.js → chunk-G6WKPZTL.js} +3 -3
  4. package/{chunk-3ZN766EW.js.map → chunk-G6WKPZTL.js.map} +1 -1
  5. package/{chunk-AJLAS62X.js → chunk-LAIO3QZX.js} +4 -4
  6. package/{chunk-AJLAS62X.js.map → chunk-LAIO3QZX.js.map} +1 -1
  7. package/{chunk-MJT6B7OJ.js → chunk-LPDYWZN6.js} +3 -3
  8. package/{chunk-MJT6B7OJ.js.map → chunk-LPDYWZN6.js.map} +1 -1
  9. package/chunk-NCJI2DCV.mjs +130 -0
  10. package/chunk-NCJI2DCV.mjs.map +1 -0
  11. package/chunk-P6L4JTWO.js +44 -0
  12. package/chunk-P6L4JTWO.js.map +1 -0
  13. package/{chunk-432PQWGO.mjs → chunk-RJVQU443.mjs} +2 -2
  14. package/{components/ui/extension/multi-select.mjs → chunk-RNKMPQDZ.mjs} +66 -64
  15. package/chunk-RNKMPQDZ.mjs.map +1 -0
  16. package/chunk-RSFL2TUC.mjs +82 -0
  17. package/chunk-RSFL2TUC.mjs.map +1 -0
  18. package/chunk-S6HQ25BZ.js +83 -0
  19. package/chunk-S6HQ25BZ.js.map +1 -0
  20. package/chunk-WK4MG4VT.js +131 -0
  21. package/chunk-WK4MG4VT.js.map +1 -0
  22. package/{components/ui/extension/multi-select.js → chunk-WXEEDLLR.js} +78 -76
  23. package/chunk-WXEEDLLR.js.map +1 -0
  24. package/{chunk-HKZRXGJ7.mjs → chunk-YDRPNCWF.mjs} +4 -4
  25. package/{chunk-ZMMYQNQV.mjs → chunk-ZFBUIBJH.mjs} +2 -2
  26. package/components/form/hook-multi-select.d.mts +14 -0
  27. package/components/form/hook-multi-select.d.ts +14 -0
  28. package/components/form/hook-multi-select.js +76 -0
  29. package/components/form/hook-multi-select.js.map +1 -0
  30. package/components/form/hook-multi-select.mjs +75 -0
  31. package/components/form/hook-multi-select.mjs.map +1 -0
  32. package/components/form/hook-searchable-select.js +5 -5
  33. package/components/form/hook-searchable-select.mjs +4 -4
  34. package/components/form/hook-tag-picker.d.mts +12 -0
  35. package/components/form/hook-tag-picker.d.ts +12 -0
  36. package/components/form/hook-tag-picker.js +66 -0
  37. package/components/form/hook-tag-picker.js.map +1 -0
  38. package/components/form/hook-tag-picker.mjs +65 -0
  39. package/components/form/hook-tag-picker.mjs.map +1 -0
  40. package/components/form/multi-select.d.mts +25 -1
  41. package/components/form/multi-select.d.ts +25 -1
  42. package/components/form/multi-select.js +20 -1
  43. package/components/form/multi-select.js.map +1 -1
  44. package/components/form/multi-select.mjs +19 -0
  45. package/components/form/searchable-select.js +5 -5
  46. package/components/form/searchable-select.mjs +4 -4
  47. package/components/form/tag-picker.d.mts +21 -0
  48. package/components/form/tag-picker.d.ts +21 -0
  49. package/components/form/tag-picker.js +14 -0
  50. package/components/form/tag-picker.js.map +1 -0
  51. package/components/form/tag-picker.mjs +13 -0
  52. package/components/form/tag-picker.mjs.map +1 -0
  53. package/components/ui/combobox.js +5 -5
  54. package/components/ui/combobox.mjs +2 -2
  55. package/components/ui/command.js +4 -4
  56. package/components/ui/command.mjs +3 -3
  57. package/components/ui/input-group.js +3 -3
  58. package/components/ui/input-group.mjs +2 -2
  59. package/components/ui/multi-select.d.mts +54 -0
  60. package/components/ui/multi-select.d.ts +54 -0
  61. package/components/ui/multi-select.js +29 -0
  62. package/components/ui/multi-select.js.map +1 -0
  63. package/components/ui/multi-select.mjs +28 -0
  64. package/components/ui/multi-select.mjs.map +1 -0
  65. package/components/ui/tag-picker.d.mts +14 -0
  66. package/components/ui/tag-picker.d.ts +14 -0
  67. package/components/ui/tag-picker.js +12 -0
  68. package/components/ui/tag-picker.js.map +1 -0
  69. package/components/ui/tag-picker.mjs +11 -0
  70. package/components/ui/tag-picker.mjs.map +1 -0
  71. package/components/widgets/dialog-manager/index.js +1 -1
  72. package/components/widgets/dialog-manager/index.js.map +1 -1
  73. package/components/widgets/dialog-manager/index.mjs +1 -1
  74. package/layouts/sidebar1/app-sidebar.js +2 -2
  75. package/layouts/sidebar1/app-sidebar.mjs +2 -2
  76. package/layouts/sidebar1/context-switcher.js +1 -1
  77. package/layouts/sidebar1/context-switcher.mjs +1 -1
  78. package/layouts/sidebar1/index.js +3 -3
  79. package/layouts/sidebar1/index.js.map +1 -1
  80. package/layouts/sidebar1/index.mjs +3 -3
  81. package/layouts/sidebar1/nav-menus.js +1 -1
  82. package/layouts/sidebar1/nav-menus.mjs +1 -1
  83. package/layouts/sidebar1/nav-user.js +2 -2
  84. package/layouts/sidebar1/nav-user.mjs +2 -2
  85. package/layouts/simple/index.js +2 -2
  86. package/layouts/simple/index.mjs +3 -3
  87. package/package.json +1 -1
  88. package/components/ui/extension/multi-select.d.mts +0 -53
  89. package/components/ui/extension/multi-select.d.ts +0 -53
  90. package/components/ui/extension/multi-select.js.map +0 -1
  91. package/components/ui/extension/multi-select.mjs.map +0 -1
  92. /package/{chunk-432PQWGO.mjs.map → chunk-RJVQU443.mjs.map} +0 -0
  93. /package/{chunk-HKZRXGJ7.mjs.map → chunk-YDRPNCWF.mjs.map} +0 -0
  94. /package/{chunk-ZMMYQNQV.mjs.map → chunk-ZFBUIBJH.mjs.map} +0 -0
@@ -1,32 +1,26 @@
1
- "use client";
2
- import {
3
- Badge
4
- } from "../../../chunk-WIISPZZE.mjs";
5
1
  import {
6
2
  Command,
7
3
  CommandEmpty,
8
4
  CommandItem,
9
5
  CommandList
10
- } from "../../../chunk-ZMMYQNQV.mjs";
11
- import "../../../chunk-HKZRXGJ7.mjs";
12
- import "../../../chunk-OPNHC6JN.mjs";
13
- import "../../../chunk-QF6PFV6M.mjs";
14
- import "../../../chunk-YQENFZOY.mjs";
15
- import "../../../chunk-7BYWDRRI.mjs";
16
- import "../../../chunk-3GHC4JQU.mjs";
6
+ } from "./chunk-ZFBUIBJH.mjs";
7
+ import {
8
+ Badge
9
+ } from "./chunk-WIISPZZE.mjs";
17
10
  import {
18
11
  cn
19
- } from "../../../chunk-KGUUDFJE.mjs";
12
+ } from "./chunk-KGUUDFJE.mjs";
20
13
  import {
21
14
  __objRest,
22
15
  __spreadProps,
23
16
  __spreadValues
24
- } from "../../../chunk-YOSPWY5K.mjs";
17
+ } from "./chunk-YOSPWY5K.mjs";
25
18
 
26
- // components/ui/extension/multi-select.tsx
27
- import { IconX, IconCheck } from "@tabler/icons-react";
19
+ // components/ui/multi-select.tsx
20
+ import * as React from "react";
21
+ import { IconCheck, IconX } from "@tabler/icons-react";
28
22
  import { Command as CommandPrimitive } from "cmdk";
29
- import React, { createContext, forwardRef, useCallback, useContext, useState } from "react";
23
+ import { createContext, forwardRef, useCallback, useContext, useState } from "react";
30
24
  var MultiSelectContext = createContext(null);
31
25
  var useMultiSelect = () => {
32
26
  const context = useContext(MultiSelectContext);
@@ -50,14 +44,16 @@ var MultiSelector = (_a) => {
50
44
  loop = false,
51
45
  className,
52
46
  children,
53
- dir
47
+ dir,
48
+ disabled = false
54
49
  } = _b, props = __objRest(_b, [
55
50
  "values",
56
51
  "onValuesChange",
57
52
  "loop",
58
53
  "className",
59
54
  "children",
60
- "dir"
55
+ "dir",
56
+ "disabled"
61
57
  ]);
62
58
  const [inputValue, setInputValue] = useState("");
63
59
  const [open, setOpen] = useState(false);
@@ -65,20 +61,21 @@ var MultiSelector = (_a) => {
65
61
  const inputRef = React.useRef(null);
66
62
  const onValueChangeHandler = useCallback(
67
63
  (val) => {
68
- const element = searchForValue(value, val);
69
- if (element !== -1) {
70
- onValueChange(value.filter((_, index) => index !== element));
64
+ if (disabled) return;
65
+ const exists = value.some((currentValue) => currentValue.value === val.value);
66
+ if (exists) {
67
+ onValueChange(value.filter((currentValue) => currentValue.value !== val.value));
71
68
  } else {
72
69
  onValueChange([...value, val]);
73
70
  }
74
71
  },
75
- // eslint-disable-next-line react-hooks/exhaustive-deps
76
- [value]
72
+ [disabled, onValueChange, value]
77
73
  );
78
74
  const handleKeyDown = useCallback(
79
75
  (e) => {
80
76
  var _a2, _b2;
81
77
  e.stopPropagation();
78
+ if (disabled) return;
82
79
  const target = inputRef.current;
83
80
  if (!target) return;
84
81
  const selectionStart = (_a2 = target.selectionStart) != null ? _a2 : 0;
@@ -104,10 +101,8 @@ var MultiSelector = (_a) => {
104
101
  if (value.length > 0 && (activeIndex !== -1 || loop)) {
105
102
  moveNext();
106
103
  }
107
- } else {
108
- if (value.length > 0 && target.selectionStart === 0) {
109
- movePrev();
110
- }
104
+ } else if (value.length > 0 && target.selectionStart === 0) {
105
+ movePrev();
111
106
  }
112
107
  break;
113
108
  case "ArrowRight":
@@ -115,10 +110,8 @@ var MultiSelector = (_a) => {
115
110
  if (value.length > 0 && target.selectionStart === 0) {
116
111
  movePrev();
117
112
  }
118
- } else {
119
- if (value.length > 0 && (activeIndex !== -1 || loop)) {
120
- moveNext();
121
- }
113
+ } else if (value.length > 0 && (activeIndex !== -1 || loop)) {
114
+ moveNext();
122
115
  }
123
116
  break;
124
117
  case "Backspace":
@@ -127,10 +120,8 @@ var MultiSelector = (_a) => {
127
120
  if (activeIndex !== -1 && activeIndex < value.length) {
128
121
  onValueChangeHandler(value[activeIndex]);
129
122
  moveCurrent();
130
- } else {
131
- if (target.selectionStart === 0) {
132
- onValueChangeHandler(value[value.length - 1]);
133
- }
123
+ } else if (target.selectionStart === 0) {
124
+ onValueChangeHandler(value[value.length - 1]);
134
125
  }
135
126
  }
136
127
  break;
@@ -147,7 +138,7 @@ var MultiSelector = (_a) => {
147
138
  break;
148
139
  }
149
140
  },
150
- [value, activeIndex, loop]
141
+ [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value]
151
142
  );
152
143
  return /* @__PURE__ */ React.createElement(
153
144
  MultiSelectContext.Provider,
@@ -161,14 +152,15 @@ var MultiSelector = (_a) => {
161
152
  setInputValue,
162
153
  activeIndex,
163
154
  setActiveIndex,
164
- ref: inputRef
155
+ ref: inputRef,
156
+ disabled
165
157
  }
166
158
  },
167
159
  /* @__PURE__ */ React.createElement(
168
160
  Command,
169
161
  __spreadValues({
170
162
  onKeyDown: handleKeyDown,
171
- className: cn("overflow-visible bg-transparent flex flex-col space-y-2", className),
163
+ className: cn("flex flex-col overflow-visible bg-transparent", className),
172
164
  dir
173
165
  }, props),
174
166
  children
@@ -178,7 +170,7 @@ var MultiSelector = (_a) => {
178
170
  var MultiSelectorTrigger = forwardRef(
179
171
  (_a, ref) => {
180
172
  var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
181
- const { value, onValueChange, activeIndex } = useMultiSelect();
173
+ const { value, onValueChange, activeIndex, disabled } = useMultiSelect();
182
174
  const mousePreventDefault = useCallback((e) => {
183
175
  e.preventDefault();
184
176
  e.stopPropagation();
@@ -188,10 +180,9 @@ var MultiSelectorTrigger = forwardRef(
188
180
  __spreadValues({
189
181
  ref,
190
182
  className: cn(
191
- "flex flex-wrap gap-1 px-2 py-2 ring-1 ring-muted rounded-lg bg-background border rounded-sm",
192
- {
193
- "ring-1 focus-within:ring-ring": activeIndex === -1
194
- },
183
+ "flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1",
184
+ activeIndex === -1 && "focus-within:ring-1 focus-within:ring-ring",
185
+ disabled && "cursor-not-allowed opacity-60",
195
186
  className
196
187
  )
197
188
  }, props),
@@ -200,8 +191,8 @@ var MultiSelectorTrigger = forwardRef(
200
191
  {
201
192
  key: item.value,
202
193
  className: cn(
203
- "px-1.5 rounded-md flex items-center gap-1",
204
- activeIndex === index && "ring-2 ring-muted-foreground "
194
+ "flex items-center gap-1 rounded-md px-1.5",
195
+ activeIndex === index && "ring-2 ring-muted-foreground"
205
196
  ),
206
197
  variant: "secondary"
207
198
  },
@@ -209,14 +200,19 @@ var MultiSelectorTrigger = forwardRef(
209
200
  /* @__PURE__ */ React.createElement(
210
201
  "button",
211
202
  {
212
- "aria-label": `Remove ${item} option`,
213
- "aria-roledescription": "button to remove option",
203
+ "aria-label": `Remove ${item.label} option`,
214
204
  type: "button",
205
+ disabled,
215
206
  onMouseDown: mousePreventDefault,
216
- onClick: () => onValueChange(item)
207
+ onClick: (event) => {
208
+ event.preventDefault();
209
+ event.stopPropagation();
210
+ onValueChange(item);
211
+ },
212
+ className: "inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed"
217
213
  },
218
214
  /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Remove ", item.label, " option"),
219
- /* @__PURE__ */ React.createElement(IconX, { className: "h-4 w-4 hover:stroke-destructive" })
215
+ /* @__PURE__ */ React.createElement(IconX, { className: "h-3.5 w-3.5" })
220
216
  )
221
217
  )),
222
218
  children
@@ -225,14 +221,15 @@ var MultiSelectorTrigger = forwardRef(
225
221
  );
226
222
  MultiSelectorTrigger.displayName = "MultiSelectorTrigger";
227
223
  var MultiSelectorInput = forwardRef((_a, ref) => {
228
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
229
- const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef } = useMultiSelect();
224
+ var _b = _a, { className, disabled: disabledProp } = _b, props = __objRest(_b, ["className", "disabled"]);
225
+ const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();
230
226
  return /* @__PURE__ */ React.createElement(
231
227
  CommandPrimitive.Input,
232
228
  __spreadProps(__spreadValues({}, props), {
233
229
  tabIndex: 0,
234
230
  ref: inputRef,
235
231
  value: inputValue,
232
+ disabled: disabled || disabledProp,
236
233
  onValueChange: activeIndex === -1 ? setInputValue : void 0,
237
234
  onBlur: () => {
238
235
  setInputValue("");
@@ -241,7 +238,7 @@ var MultiSelectorInput = forwardRef((_a, ref) => {
241
238
  onFocus: () => setOpen(true),
242
239
  onClick: () => setActiveIndex(-1),
243
240
  className: cn(
244
- "p-0 bg-transparent border-none outline-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground flex-1 text-sm",
241
+ "flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0",
245
242
  className,
246
243
  activeIndex !== -1 && "caret-transparent"
247
244
  )
@@ -251,7 +248,8 @@ var MultiSelectorInput = forwardRef((_a, ref) => {
251
248
  MultiSelectorInput.displayName = "MultiSelectorInput";
252
249
  var MultiSelectorContent = forwardRef(({ children }, ref) => {
253
250
  const { open } = useMultiSelect();
254
- return /* @__PURE__ */ React.createElement("div", { ref, className: "relative" }, open ? children : null);
251
+ if (!open) return null;
252
+ return /* @__PURE__ */ React.createElement("div", { ref, className: "relative" }, children);
255
253
  });
256
254
  MultiSelectorContent.displayName = "MultiSelectorContent";
257
255
  var MultiSelectorList = forwardRef(({ className, children }, ref) => {
@@ -260,7 +258,7 @@ var MultiSelectorList = forwardRef(({ className, children }, ref) => {
260
258
  {
261
259
  ref,
262
260
  className: cn(
263
- "p-2 flex flex-col gap-2 rounded-md scrollbar-thin scrollbar-track-transparent transition-colors scrollbar-thumb-muted-foreground dark:scrollbar-thumb-muted scrollbar-thumb-rounded-lg w-full absolute bg-background shadow-md z-100 border border-muted top-0",
261
+ "absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted",
264
262
  className
265
263
  )
266
264
  },
@@ -270,22 +268,25 @@ var MultiSelectorList = forwardRef(({ className, children }, ref) => {
270
268
  });
271
269
  MultiSelectorList.displayName = "MultiSelectorList";
272
270
  var MultiSelectorItem = forwardRef((_a, ref) => {
273
- var _b = _a, { className, value, label, children } = _b, props = __objRest(_b, ["className", "value", "label", "children"]);
274
- const { value: Options, onValueChange, setInputValue } = useMultiSelect();
271
+ var _b = _a, { className, value, label, children, disabled: disabledProp } = _b, props = __objRest(_b, ["className", "value", "label", "children", "disabled"]);
272
+ const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();
275
273
  const mousePreventDefault = useCallback((e) => {
276
274
  e.preventDefault();
277
275
  e.stopPropagation();
278
276
  }, []);
279
- const isIncluded = searchForValue(Options, {
277
+ const isIncluded = searchForValue(options, {
280
278
  value,
281
279
  label
282
280
  }) !== -1;
281
+ const isDisabled = disabled || disabledProp;
283
282
  return /* @__PURE__ */ React.createElement(
284
283
  CommandItem,
285
284
  __spreadProps(__spreadValues({
286
285
  ref
287
286
  }, props), {
287
+ disabled: isDisabled,
288
288
  onSelect: () => {
289
+ if (isDisabled) return;
289
290
  onValueChange({
290
291
  value,
291
292
  label
@@ -293,10 +294,10 @@ var MultiSelectorItem = forwardRef((_a, ref) => {
293
294
  setInputValue("");
294
295
  },
295
296
  className: cn(
296
- "rounded-md cursor-pointer px-2 py-1 transition-colors flex justify-between",
297
+ "flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors",
297
298
  className,
298
- isIncluded && "opacity-50 cursor-default",
299
- props.disabled && "opacity-50 cursor-not-allowed"
299
+ isIncluded && "cursor-default opacity-50",
300
+ isDisabled && "cursor-not-allowed opacity-50"
300
301
  ),
301
302
  onMouseDown: mousePreventDefault
302
303
  }),
@@ -305,12 +306,13 @@ var MultiSelectorItem = forwardRef((_a, ref) => {
305
306
  );
306
307
  });
307
308
  MultiSelectorItem.displayName = "MultiSelectorItem";
309
+
308
310
  export {
309
311
  MultiSelector,
310
- MultiSelectorContent,
312
+ MultiSelectorTrigger,
311
313
  MultiSelectorInput,
312
- MultiSelectorItem,
314
+ MultiSelectorContent,
313
315
  MultiSelectorList,
314
- MultiSelectorTrigger
316
+ MultiSelectorItem
315
317
  };
316
- //# sourceMappingURL=multi-select.mjs.map
318
+ //# sourceMappingURL=chunk-RNKMPQDZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/ui/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport * as React from 'react';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { type KeyboardEvent, createContext, forwardRef, useCallback, useContext, useState } from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Badge } from './badge';\nimport { Command, CommandEmpty, CommandItem, CommandList } from './command';\n\nexport type MultiSelectValue = {\n value: string;\n label: string;\n};\n\ninterface MultiSelectorProps extends React.ComponentPropsWithoutRef<typeof CommandPrimitive> {\n values: MultiSelectValue[];\n onValuesChange: (value: MultiSelectValue[]) => void;\n loop?: boolean;\n className?: string;\n children?: React.ReactNode;\n dir?: 'ltr' | 'rtl';\n disabled?: boolean;\n}\n\ninterface MultiSelectContextProps {\n value: MultiSelectValue[];\n onValueChange: (value: MultiSelectValue) => void;\n open: boolean;\n setOpen: (value: boolean) => void;\n inputValue: string;\n setInputValue: React.Dispatch<React.SetStateAction<string>>;\n activeIndex: number;\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n ref: React.RefObject<HTMLInputElement | null>;\n disabled: boolean;\n}\n\nconst MultiSelectContext = createContext<MultiSelectContextProps | null>(null);\n\nconst useMultiSelect = () => {\n const context = useContext(MultiSelectContext);\n if (!context) {\n throw new Error('useMultiSelect must be used within MultiSelectProvider');\n }\n return context;\n};\n\nfunction searchForValue(source: MultiSelectValue[], value: MultiSelectValue) {\n for (let i = 0; i < source.length; i++) {\n if (source[i].value === value.value) {\n return i;\n }\n }\n return -1;\n}\n\nconst MultiSelector = ({\n values: value,\n onValuesChange: onValueChange,\n loop = false,\n className,\n children,\n dir,\n disabled = false,\n ...props\n}: MultiSelectorProps) => {\n const [inputValue, setInputValue] = useState('');\n const [open, setOpen] = useState<boolean>(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const onValueChangeHandler = useCallback(\n (val: MultiSelectValue) => {\n if (disabled) return;\n\n const exists = value.some((currentValue) => currentValue.value === val.value);\n if (exists) {\n onValueChange(value.filter((currentValue) => currentValue.value !== val.value));\n } else {\n onValueChange([...value, val]);\n }\n },\n [disabled, onValueChange, value],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n if (disabled) return;\n\n const target = inputRef.current;\n\n if (!target) return;\n\n const selectionStart = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n\n if (selectionStart !== selectionEnd) {\n return;\n }\n\n const moveNext = () => {\n const nextIndex = activeIndex + 1;\n setActiveIndex(nextIndex > value.length - 1 ? (loop ? 0 : -1) : nextIndex);\n };\n\n const movePrev = () => {\n const prevIndex = activeIndex - 1;\n setActiveIndex(prevIndex < 0 ? value.length - 1 : prevIndex);\n };\n\n const moveCurrent = () => {\n const newIndex = activeIndex - 1 <= 0 ? (value.length - 1 === 0 ? -1 : 0) : activeIndex - 1;\n setActiveIndex(newIndex);\n };\n\n switch (e.key) {\n case 'ArrowLeft':\n if (dir === 'rtl') {\n if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n } else if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n break;\n\n case 'ArrowRight':\n if (dir === 'rtl') {\n if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n } else if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n break;\n\n case 'Backspace':\n case 'Delete':\n if (value.length > 0) {\n if (activeIndex !== -1 && activeIndex < value.length) {\n onValueChangeHandler(value[activeIndex]);\n moveCurrent();\n } else if (target.selectionStart === 0) {\n onValueChangeHandler(value[value.length - 1]);\n }\n }\n break;\n\n case 'Enter':\n setOpen(true);\n break;\n\n case 'Escape':\n if (activeIndex !== -1) {\n setActiveIndex(-1);\n } else if (open) {\n setInputValue('');\n setOpen(false);\n }\n break;\n }\n },\n [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value],\n );\n\n return (\n <MultiSelectContext.Provider\n value={{\n value,\n onValueChange: onValueChangeHandler,\n open,\n setOpen,\n inputValue,\n setInputValue,\n activeIndex,\n setActiveIndex,\n ref: inputRef,\n disabled,\n }}\n >\n <Command\n onKeyDown={handleKeyDown}\n className={cn('flex flex-col overflow-visible bg-transparent', className)}\n dir={dir}\n {...props}\n >\n {children}\n </Command>\n </MultiSelectContext.Provider>\n );\n};\n\nconst MultiSelectorTrigger = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { value, onValueChange, activeIndex, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1',\n activeIndex === -1 && 'focus-within:ring-1 focus-within:ring-ring',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n {...props}\n >\n {value.map((item, index) => (\n <Badge\n key={item.value}\n className={cn(\n 'flex items-center gap-1 rounded-md px-1.5',\n activeIndex === index && 'ring-2 ring-muted-foreground',\n )}\n variant=\"secondary\"\n >\n <span className=\"text-xs\">{item.label}</span>\n <button\n aria-label={`Remove ${item.label} option`}\n type=\"button\"\n disabled={disabled}\n onMouseDown={mousePreventDefault}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n\n onValueChange(item);\n }}\n className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed\"\n >\n <span className=\"sr-only\">Remove {item.label} option</span>\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </Badge>\n ))}\n {children}\n </div>\n );\n },\n);\n\nMultiSelectorTrigger.displayName = 'MultiSelectorTrigger';\n\nconst MultiSelectorInput = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, disabled: disabledProp, ...props }, ref) => {\n const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();\n\n return (\n <CommandPrimitive.Input\n {...props}\n tabIndex={0}\n ref={inputRef}\n value={inputValue}\n disabled={disabled || disabledProp}\n onValueChange={activeIndex === -1 ? setInputValue : undefined}\n onBlur={() => {\n setInputValue('');\n setOpen(false);\n }}\n onFocus={() => setOpen(true)}\n onClick={() => setActiveIndex(-1)}\n className={cn(\n 'flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0',\n className,\n activeIndex !== -1 && 'caret-transparent',\n )}\n />\n );\n});\n\nMultiSelectorInput.displayName = 'MultiSelectorInput';\n\nconst MultiSelectorContent = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ children }, ref) => {\n const { open } = useMultiSelect();\n\n if (!open) return null;\n\n return (\n <div ref={ref} className=\"relative\">\n {children}\n </div>\n );\n});\n\nMultiSelectorContent.displayName = 'MultiSelectorContent';\n\nconst MultiSelectorList = forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, children }, ref) => {\n return (\n <CommandList\n ref={ref}\n className={cn(\n 'absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted',\n className,\n )}\n >\n {children}\n <CommandEmpty>\n <span className=\"text-muted-foreground\">No results found</span>\n </CommandEmpty>\n </CommandList>\n );\n});\n\nMultiSelectorList.displayName = 'MultiSelectorList';\n\nconst MultiSelectorItem = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n { value: string; label: string } & React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, value, label, children, disabled: disabledProp, ...props }, ref) => {\n const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const isIncluded =\n searchForValue(options, {\n value,\n label,\n }) !== -1;\n\n const isDisabled = disabled || disabledProp;\n\n return (\n <CommandItem\n ref={ref}\n {...props}\n disabled={isDisabled}\n onSelect={() => {\n if (isDisabled) return;\n\n onValueChange({\n value,\n label,\n });\n setInputValue('');\n }}\n className={cn(\n 'flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors',\n className,\n isIncluded && 'cursor-default opacity-50',\n isDisabled && 'cursor-not-allowed opacity-50',\n )}\n onMouseDown={mousePreventDefault}\n >\n {children}\n {isIncluded && <IconCheck className=\"h-4 w-4\" />}\n </CommandItem>\n );\n});\n\nMultiSelectorItem.displayName = 'MultiSelectorItem';\n\nexport {\n MultiSelector,\n MultiSelectorTrigger,\n MultiSelectorInput,\n MultiSelectorContent,\n MultiSelectorList,\n MultiSelectorItem,\n};\n"],"mappings":"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","names":["_a","_b"]}
@@ -0,0 +1,82 @@
1
+ import {
2
+ MultiSelector,
3
+ MultiSelectorInput,
4
+ MultiSelectorItem,
5
+ MultiSelectorList,
6
+ MultiSelectorTrigger
7
+ } from "./chunk-RNKMPQDZ.mjs";
8
+ import {
9
+ Popover,
10
+ PopoverContent,
11
+ PopoverTrigger
12
+ } from "./chunk-CSL3CTEN.mjs";
13
+ import {
14
+ Label
15
+ } from "./chunk-MM5OJOOR.mjs";
16
+ import {
17
+ cn
18
+ } from "./chunk-KGUUDFJE.mjs";
19
+
20
+ // components/form/multi-select.tsx
21
+ import _isString from "lodash-es/isString";
22
+ import _kebabCase from "lodash-es/kebabCase";
23
+ import React from "react";
24
+ function FormMultiSelect({
25
+ id,
26
+ name,
27
+ label,
28
+ placeholder = "Select options...",
29
+ data,
30
+ value = [],
31
+ onChange,
32
+ classNames,
33
+ required,
34
+ disabled,
35
+ loop = false
36
+ }) {
37
+ const options = React.useMemo(() => {
38
+ if (!data || data.length === 0) return [];
39
+ if (_isString(data[0])) {
40
+ return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
41
+ }
42
+ return data;
43
+ }, [data]);
44
+ const selectedValues = React.useMemo(() => {
45
+ return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
46
+ }, [options, value]);
47
+ const handleValueChange = (newValues) => {
48
+ onChange(newValues.map((currentValue) => currentValue.value));
49
+ };
50
+ if (!id) id = _kebabCase(name);
51
+ return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ React.createElement(Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ React.createElement(
52
+ MultiSelector,
53
+ {
54
+ values: selectedValues,
55
+ onValuesChange: handleValueChange,
56
+ loop,
57
+ disabled,
58
+ className: "p-0"
59
+ },
60
+ /* @__PURE__ */ React.createElement(Popover, null, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(MultiSelectorTrigger, { className: cn("cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ React.createElement(
61
+ MultiSelectorInput,
62
+ {
63
+ id,
64
+ disabled,
65
+ placeholder: selectedValues.length === 0 ? placeholder : "",
66
+ className: classNames == null ? void 0 : classNames.input
67
+ }
68
+ ))), /* @__PURE__ */ React.createElement(
69
+ PopoverContent,
70
+ {
71
+ align: "start",
72
+ className: cn("w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
73
+ },
74
+ /* @__PURE__ */ React.createElement(MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ React.createElement(MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ React.createElement("span", null, option.label))))
75
+ ))
76
+ ));
77
+ }
78
+
79
+ export {
80
+ FormMultiSelect
81
+ };
82
+ //# sourceMappingURL=chunk-RSFL2TUC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/form/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport _isString from 'lodash-es/isString';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport React from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport {\n MultiSelector,\n MultiSelectorInput,\n MultiSelectorItem,\n MultiSelectorList,\n MultiSelectorTrigger,\n type MultiSelectValue,\n} from '../ui/multi-select';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\n\nexport interface FormMultiSelectProps {\n id?: string;\n name: string;\n label?: string;\n placeholder?: string;\n data: MultiSelectValue[] | string[];\n value: string[];\n onChange: (values: string[]) => void;\n classNames?: {\n wrapper?: string;\n label?: string;\n trigger?: string;\n input?: string;\n content?: string;\n };\n required?: boolean;\n disabled?: boolean;\n loop?: boolean;\n}\n\nexport function FormMultiSelect({\n id,\n name,\n label,\n placeholder = 'Select options...',\n data,\n value = [],\n onChange,\n classNames,\n required,\n disabled,\n loop = false,\n}: FormMultiSelectProps) {\n const options: MultiSelectValue[] = React.useMemo(() => {\n if (!data || data.length === 0) return [];\n if (_isString(data[0])) {\n return (data as string[]).map((currentValue) => ({ label: currentValue, value: currentValue }));\n }\n return data as MultiSelectValue[];\n }, [data]);\n\n const selectedValues = React.useMemo(() => {\n return value\n .map((currentValue) => options.find((option) => option.value === currentValue))\n .filter((option): option is MultiSelectValue => !!option);\n }, [options, value]);\n\n const handleValueChange = (newValues: MultiSelectValue[]) => {\n onChange(newValues.map((currentValue) => currentValue.value));\n };\n\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('flex flex-col gap-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <MultiSelector\n values={selectedValues}\n onValuesChange={handleValueChange}\n loop={loop}\n disabled={disabled}\n className=\"p-0\"\n >\n <Popover>\n <PopoverTrigger asChild>\n <MultiSelectorTrigger className={cn('cursor-pointer', classNames?.trigger)}>\n <MultiSelectorInput\n id={id}\n disabled={disabled}\n placeholder={selectedValues.length === 0 ? placeholder : ''}\n className={classNames?.input}\n />\n </MultiSelectorTrigger>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <MultiSelectorList className=\"static relative border-none shadow-none\">\n {options.map((option) => (\n <MultiSelectorItem key={option.value} value={option.value} label={option.label}>\n <span>{option.label}</span>\n </MultiSelectorItem>\n ))}\n </MultiSelectorList>\n </PopoverContent>\n </Popover>\n </MultiSelector>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,WAAW;AAkCX,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAyB;AACvB,QAAM,UAA8B,MAAM,QAAQ,MAAM;AACtD,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AACxC,QAAI,UAAU,KAAK,CAAC,CAAC,GAAG;AACtB,aAAQ,KAAkB,IAAI,CAAC,kBAAkB,EAAE,OAAO,cAAc,OAAO,aAAa,EAAE;AAAA,IAChG;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACzC,WAAO,MACJ,IAAI,CAAC,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,CAAC,EAC7E,OAAO,CAAC,WAAuC,CAAC,CAAC,MAAM;AAAA,EAC5D,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,oBAAoB,CAAC,cAAkC;AAC3D,aAAS,UAAU,IAAI,CAAC,iBAAiB,aAAa,KAAK,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,SACE,oCAAC,SAAI,WAAW,GAAG,uBAAuB,yCAAY,OAAO,KAC1D,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAU;AAAA;AAAA,IAEV,oCAAC,eACC,oCAAC,kBAAe,SAAO,QACrB,oCAAC,wBAAqB,WAAW,GAAG,kBAAkB,yCAAY,OAAO,KACvE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa,eAAe,WAAW,IAAI,cAAc;AAAA,QACzD,WAAW,yCAAY;AAAA;AAAA,IACzB,CACF,CACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAW,GAAG,8CAA8C,yCAAY,OAAO;AAAA;AAAA,MAE/E,oCAAC,qBAAkB,WAAU,6CAC1B,QAAQ,IAAI,CAAC,WACZ,oCAAC,qBAAkB,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,SACvE,oCAAC,cAAM,OAAO,KAAM,CACtB,CACD,CACH;AAAA,IACF,CACF;AAAA,EACF,CACF;AAEJ;","names":[]}
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3
+
4
+
5
+
6
+
7
+
8
+ var _chunkWXEEDLLRjs = require('./chunk-WXEEDLLR.js');
9
+
10
+
11
+
12
+
13
+ var _chunkQHCOMBHIjs = require('./chunk-QHCOMBHI.js');
14
+
15
+
16
+ var _chunkCKGMFUU2js = require('./chunk-CKGMFUU2.js');
17
+
18
+
19
+ var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
20
+
21
+ // components/form/multi-select.tsx
22
+ var _isString2 = require('lodash-es/isString'); var _isString3 = _interopRequireDefault(_isString2);
23
+ var _kebabCase2 = require('lodash-es/kebabCase'); var _kebabCase3 = _interopRequireDefault(_kebabCase2);
24
+ var _react = require('react'); var _react2 = _interopRequireDefault(_react);
25
+ function FormMultiSelect({
26
+ id,
27
+ name,
28
+ label,
29
+ placeholder = "Select options...",
30
+ data,
31
+ value = [],
32
+ onChange,
33
+ classNames,
34
+ required,
35
+ disabled,
36
+ loop = false
37
+ }) {
38
+ const options = _react2.default.useMemo(() => {
39
+ if (!data || data.length === 0) return [];
40
+ if (_isString3.default.call(void 0, data[0])) {
41
+ return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
42
+ }
43
+ return data;
44
+ }, [data]);
45
+ const selectedValues = _react2.default.useMemo(() => {
46
+ return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
47
+ }, [options, value]);
48
+ const handleValueChange = (newValues) => {
49
+ onChange(newValues.map((currentValue) => currentValue.value));
50
+ };
51
+ if (!id) id = _kebabCase3.default.call(void 0, name);
52
+ return /* @__PURE__ */ _react2.default.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ _react2.default.createElement(_chunkCKGMFUU2js.Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ _react2.default.createElement(
53
+ _chunkWXEEDLLRjs.MultiSelector,
54
+ {
55
+ values: selectedValues,
56
+ onValuesChange: handleValueChange,
57
+ loop,
58
+ disabled,
59
+ className: "p-0"
60
+ },
61
+ /* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.Popover, null, /* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.PopoverTrigger, { asChild: true }, /* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorTrigger, { className: _chunkPSPAJNNBjs.cn.call(void 0, "cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ _react2.default.createElement(
62
+ _chunkWXEEDLLRjs.MultiSelectorInput,
63
+ {
64
+ id,
65
+ disabled,
66
+ placeholder: selectedValues.length === 0 ? placeholder : "",
67
+ className: classNames == null ? void 0 : classNames.input
68
+ }
69
+ ))), /* @__PURE__ */ _react2.default.createElement(
70
+ _chunkQHCOMBHIjs.PopoverContent,
71
+ {
72
+ align: "start",
73
+ className: _chunkPSPAJNNBjs.cn.call(void 0, "w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
74
+ },
75
+ /* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ _react2.default.createElement("span", null, option.label))))
76
+ ))
77
+ ));
78
+ }
79
+
80
+
81
+
82
+ exports.FormMultiSelect = FormMultiSelect;
83
+ //# sourceMappingURL=chunk-S6HQ25BZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-S6HQ25BZ.js","../components/form/multi-select.tsx"],"names":[],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-S6HQ25BZ.js","sourcesContent":[null,"\"use client\";\nimport _isString from 'lodash-es/isString';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport React from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport {\n MultiSelector,\n MultiSelectorInput,\n MultiSelectorItem,\n MultiSelectorList,\n MultiSelectorTrigger,\n type MultiSelectValue,\n} from '../ui/multi-select';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\n\nexport interface FormMultiSelectProps {\n id?: string;\n name: string;\n label?: string;\n placeholder?: string;\n data: MultiSelectValue[] | string[];\n value: string[];\n onChange: (values: string[]) => void;\n classNames?: {\n wrapper?: string;\n label?: string;\n trigger?: string;\n input?: string;\n content?: string;\n };\n required?: boolean;\n disabled?: boolean;\n loop?: boolean;\n}\n\nexport function FormMultiSelect({\n id,\n name,\n label,\n placeholder = 'Select options...',\n data,\n value = [],\n onChange,\n classNames,\n required,\n disabled,\n loop = false,\n}: FormMultiSelectProps) {\n const options: MultiSelectValue[] = React.useMemo(() => {\n if (!data || data.length === 0) return [];\n if (_isString(data[0])) {\n return (data as string[]).map((currentValue) => ({ label: currentValue, value: currentValue }));\n }\n return data as MultiSelectValue[];\n }, [data]);\n\n const selectedValues = React.useMemo(() => {\n return value\n .map((currentValue) => options.find((option) => option.value === currentValue))\n .filter((option): option is MultiSelectValue => !!option);\n }, [options, value]);\n\n const handleValueChange = (newValues: MultiSelectValue[]) => {\n onChange(newValues.map((currentValue) => currentValue.value));\n };\n\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('flex flex-col gap-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <MultiSelector\n values={selectedValues}\n onValuesChange={handleValueChange}\n loop={loop}\n disabled={disabled}\n className=\"p-0\"\n >\n <Popover>\n <PopoverTrigger asChild>\n <MultiSelectorTrigger className={cn('cursor-pointer', classNames?.trigger)}>\n <MultiSelectorInput\n id={id}\n disabled={disabled}\n placeholder={selectedValues.length === 0 ? placeholder : ''}\n className={classNames?.input}\n />\n </MultiSelectorTrigger>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <MultiSelectorList className=\"static relative border-none shadow-none\">\n {options.map((option) => (\n <MultiSelectorItem key={option.value} value={option.value} label={option.label}>\n <span>{option.label}</span>\n </MultiSelectorItem>\n ))}\n </MultiSelectorList>\n </PopoverContent>\n </Popover>\n </MultiSelector>\n </div>\n );\n}\n"]}