ivt 0.6.6 → 0.6.7

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.
@@ -0,0 +1,107 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+
5
+ /**
6
+ * Variants for the multi-select component to handle different styles.
7
+ * Uses class-variance-authority (cva) to define different styles based on "variant" prop.
8
+ */
9
+ declare const multiSelectVariants: (props?: ({
10
+ variant?: "default" | "secondary" | "destructive" | "positive" | "warning" | "info" | "outline" | null | undefined;
11
+ subtle?: boolean | null | undefined;
12
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
13
+ interface Option {
14
+ /** The text to display for the option. */
15
+ label: string;
16
+ /** The unique value associated with the option. */
17
+ value: string;
18
+ /** Optional icon component to display alongside the option. */
19
+ icon?: React.ComponentType<{
20
+ className?: string;
21
+ }>;
22
+ }
23
+ /**
24
+ * Props for AutoCompleteMultiSelectIVT component
25
+ */
26
+ interface AutoCompleteMultiSelectProps extends VariantProps<typeof multiSelectVariants> {
27
+ /**
28
+ * An array of currently selected option objects.
29
+ * Each option object has a label, value, and an optional icon.
30
+ */
31
+ selectedOptions: Option[];
32
+ /**
33
+ * Callback function triggered when the selected values change.
34
+ * Receives an array of the new selected option objects.
35
+ */
36
+ onChange: (options: AutoCompleteMultiSelectProps["selectedOptions"]) => void;
37
+ /**
38
+ * Async function to fetch options based on search term.
39
+ * Returns a promise with an array of option objects.
40
+ */
41
+ fetchOptions: (term: string) => Promise<AutoCompleteMultiSelectProps["selectedOptions"]>;
42
+ /**
43
+ * Placeholder text to be displayed when no values are selected.
44
+ * Optional, defaults to "Select options".
45
+ */
46
+ placeholder?: string;
47
+ /**
48
+ * Placeholder text for the search input.
49
+ * Optional, defaults to "Buscar...".
50
+ */
51
+ searchPlaceholder?: string;
52
+ /**
53
+ * Message to be displayed when no results are found.
54
+ * Optional, defaults to "Nenhum item encontrado.".
55
+ */
56
+ messageEmpty?: string;
57
+ /**
58
+ * Animation duration in seconds for the visual effects (e.g., bouncing badges).
59
+ * Optional, defaults to 0 (no animation).
60
+ */
61
+ animation?: number;
62
+ /**
63
+ * Maximum number of items to display. Extra selected items will be summarized.
64
+ * Optional, defaults to 3.
65
+ */
66
+ maxCount?: number;
67
+ /**
68
+ * The modality of the popover. When set to true, interaction with outside elements
69
+ * will be disabled and only popover content will be visible to screen readers.
70
+ * Optional, defaults to false.
71
+ */
72
+ modalPopover?: boolean;
73
+ /**
74
+ * Additional class names to apply custom styles to the multi-select component.
75
+ * Optional, can be used to add custom styles.
76
+ */
77
+ className?: string;
78
+ /**
79
+ * Label for the component.
80
+ */
81
+ label?: string | React.ReactNode;
82
+ /**
83
+ * Description text displayed below the component.
84
+ */
85
+ description?: string;
86
+ /**
87
+ * Whether to use subtle variant styling.
88
+ */
89
+ subtle?: boolean;
90
+ /**
91
+ * Whether to focus on select actions.
92
+ * Optional, defaults to true.
93
+ */
94
+ focusOnSelect?: boolean;
95
+ /**
96
+ * Unique identifier for the component.
97
+ */
98
+ id?: string;
99
+ /**
100
+ * Callback function triggered when there's an error fetching options.
101
+ */
102
+ onError?: (error: unknown) => void;
103
+ }
104
+ declare const AutoCompleteMultiSelect: React.ForwardRefExoticComponent<AutoCompleteMultiSelectProps & React.RefAttributes<HTMLButtonElement>>;
105
+
106
+ export { AutoCompleteMultiSelect };
107
+ export type { Option };
@@ -0,0 +1,380 @@
1
+ import { cva } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ import { c } from '../chunks/index.module-dysOJ0dE.mjs';
4
+ import { c as cn } from '../chunks/utils-CwDmCEge.mjs';
5
+ import { X } from '../chunks/x-Dpaoz6yn.mjs';
6
+ import { C as ChevronsUpDown } from '../chunks/chevrons-up-down-2G_mHB5d.mjs';
7
+ import { C as Check } from '../chunks/check-DduIDKAH.mjs';
8
+ import { W as WandSparkles } from '../chunks/wand-sparkles-7XfX5Sd6.mjs';
9
+ import { L as Label } from '../chunks/label-BrO1sQ0r.mjs';
10
+ import { P as Popover, a as PopoverTrigger, b as PopoverContent } from '../chunks/popover-BW3SktUO.mjs';
11
+ import { B as Button } from '../chunks/button-C0ijXnnF.mjs';
12
+ import { B as Badge } from '../chunks/badge-Bq7g6DlG.mjs';
13
+ import { c as TooltipProvider, T as Tooltip, a as TooltipTrigger, b as TooltipContent } from '../chunks/tooltip-DF-75FfQ.mjs';
14
+ import { S as Separator } from '../chunks/separator-D7Q4xZTz.mjs';
15
+ import { C as Command, b as CommandInput, c as CommandList, d as CommandEmpty, e as CommandGroup, f as CommandItem, h as CommandSeparator } from '../chunks/command-CTTEi-Tw.mjs';
16
+ import '../chunks/bundle-mjs-DF1QM7yV.mjs';
17
+ import '../chunks/createLucideIcon-CyWof2Fq.mjs';
18
+ import '../chunks/index-L4pU8dCQ.mjs';
19
+ import 'react-dom';
20
+ import '@radix-ui/react-slot';
21
+ import 'react/jsx-runtime';
22
+ import '../chunks/index-D56BYstR.mjs';
23
+ import '../chunks/index-BI2MxMeC.mjs';
24
+ import '../chunks/index-vtBqBO3S.mjs';
25
+ import '../chunks/index-CKARIk9k.mjs';
26
+ import '../chunks/index-CQt6sjXa.mjs';
27
+ import '../chunks/index-Coakg78O.mjs';
28
+ import '../chunks/tslib.es6-Cuxw-1bu.mjs';
29
+ import '../chunks/index-BEh8ek6-.mjs';
30
+ import '../chunks/index-B0Kdhw0d.mjs';
31
+ import '../chunks/index-n9Y_kDgY.mjs';
32
+ import '../chunks/index-DAZztiKf.mjs';
33
+ import '../chunks/index-qUT5iV25.mjs';
34
+ import '../chunks/index-2anlJbdb.mjs';
35
+ import '../chunks/index-Ccz8nL5M.mjs';
36
+ import '../chunks/index-DZlAt5Up.mjs';
37
+ import '../chunks/index-sGgLIg5I.mjs';
38
+ import '../chunks/dialog-DsCgCf_e.mjs';
39
+
40
+ /**
41
+ * Variants for the multi-select component to handle different styles.
42
+ * Uses class-variance-authority (cva) to define different styles based on "variant" prop.
43
+ */ const multiSelectVariants = cva("m-1 transition ease-in-out delay-150 duration-300", {
44
+ variants: {
45
+ variant: {
46
+ default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
47
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
48
+ destructive: "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
49
+ positive: "border-transparent bg-positive text-positive-foreground shadow hover:bg-positive/80",
50
+ warning: "border-transparent bg-warning text-warning-foreground shadow hover:bg-warning/80",
51
+ info: "border-transparent bg-info text-info-foreground shadow hover:bg-info/80",
52
+ outline: "text-foreground bg-transparent hover:bg-transparent border"
53
+ },
54
+ subtle: {
55
+ true: "",
56
+ false: ""
57
+ }
58
+ },
59
+ defaultVariants: {
60
+ variant: "default"
61
+ }
62
+ });
63
+ const AutoCompleteMultiSelect = /*#__PURE__*/ React.forwardRef(({ selectedOptions, onChange, fetchOptions, variant, placeholder = "Select options", searchPlaceholder = "Buscar...", messageEmpty = "Nenhum resultado encontrado.", animation = 0, maxCount = 3, modalPopover = false, className, label, description, subtle = false, focusOnSelect = true, id, onError }, ref)=>{
64
+ const inputRef = React.useRef(null);
65
+ const lastClickedIndexRef = React.useRef(-1);
66
+ const isShiftPressedRef = React.useRef(false);
67
+ const generatedId = React.useId();
68
+ const inputId = id || generatedId;
69
+ // Estado interno para resposta imediata
70
+ const [internalSelected, setInternalSelected] = React.useState(selectedOptions);
71
+ const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);
72
+ const [isAnimating, setIsAnimating] = React.useState(false);
73
+ const [inputValue, setInputValue] = React.useState("");
74
+ const [options, setOptions] = React.useState([]);
75
+ const [loading, setLoading] = React.useState(false);
76
+ // Sincroniza estado interno quando selectedOptions muda (do pai)
77
+ React.useEffect(()=>{
78
+ setInternalSelected(selectedOptions);
79
+ }, [
80
+ selectedOptions
81
+ ]);
82
+ // Listener global para detectar Shift
83
+ React.useEffect(()=>{
84
+ const handleKeyDown = (e)=>{
85
+ if (e.key === "Shift") {
86
+ isShiftPressedRef.current = true;
87
+ }
88
+ };
89
+ const handleKeyUp = (e)=>{
90
+ if (e.key === "Shift") {
91
+ isShiftPressedRef.current = false;
92
+ }
93
+ };
94
+ window.addEventListener("keydown", handleKeyDown);
95
+ window.addEventListener("keyup", handleKeyUp);
96
+ return ()=>{
97
+ window.removeEventListener("keydown", handleKeyDown);
98
+ window.removeEventListener("keyup", handleKeyUp);
99
+ };
100
+ }, []);
101
+ // Busca assíncrona com debounce (do AutoComplete)
102
+ const debouncedFetch = c(async (term)=>{
103
+ if (!term.trim()) {
104
+ setOptions([]);
105
+ setLoading(false);
106
+ return;
107
+ }
108
+ setLoading(true);
109
+ try {
110
+ const result = await fetchOptions(term);
111
+ setOptions(result);
112
+ } catch (err) {
113
+ if (onError) {
114
+ onError(err);
115
+ }
116
+ setOptions([]);
117
+ } finally{
118
+ setLoading(false);
119
+ }
120
+ }, 500);
121
+ const handleInputChange = (value)=>{
122
+ setInputValue(value);
123
+ if (value.trim() === "") {
124
+ setOptions([]);
125
+ setLoading(false);
126
+ return;
127
+ }
128
+ setLoading(true);
129
+ debouncedFetch(value);
130
+ };
131
+ const handleInputKeyDown = (event)=>{
132
+ if (event.key === "Enter") {
133
+ setIsPopoverOpen(true);
134
+ }
135
+ };
136
+ const toggleOption = (option, index)=>{
137
+ // Normaliza para string para comparação
138
+ const optionValueStr = String(option.value);
139
+ const isSelected = internalSelected.find((o)=>String(o.value) === optionValueStr);
140
+ const newSelectedOptions = isSelected ? internalSelected.filter((value)=>String(value.value) !== optionValueStr) : [
141
+ ...internalSelected,
142
+ option
143
+ ];
144
+ // Atualiza estado interno IMEDIATAMENTE
145
+ setInternalSelected(newSelectedOptions);
146
+ // Notifica o pai
147
+ onChange(newSelectedOptions);
148
+ // Armazena o índice do último clique
149
+ lastClickedIndexRef.current = index;
150
+ };
151
+ const removeOption = (option)=>{
152
+ // Normaliza para string para comparação
153
+ const optionValueStr = String(option.value);
154
+ const newSelectedOptions = internalSelected.filter((value)=>String(value.value) !== optionValueStr);
155
+ setInternalSelected(newSelectedOptions);
156
+ onChange(newSelectedOptions);
157
+ };
158
+ const toggleInterval = (index)=>{
159
+ // Se não houver último clique registrado, apenas seleciona o item atual
160
+ if (lastClickedIndexRef.current === -1 || internalSelected.length < 1) {
161
+ toggleOption(options[index], index);
162
+ return;
163
+ }
164
+ const lastIndex = lastClickedIndexRef.current;
165
+ const start = Math.min(lastIndex, index);
166
+ const end = Math.max(lastIndex, index) + 1;
167
+ const rangeOptions = options.slice(start, end);
168
+ const rangeValuesStr = rangeOptions.map((o)=>String(o.value));
169
+ const areAllSelected = rangeValuesStr.every((v)=>internalSelected.some((opt)=>String(opt.value) === v));
170
+ if (areAllSelected) {
171
+ // Desselecionar todos os itens do intervalo
172
+ const newSelectedOptions = internalSelected.filter((v)=>!rangeValuesStr.includes(String(v.value)));
173
+ setInternalSelected(newSelectedOptions);
174
+ onChange(newSelectedOptions);
175
+ } else {
176
+ // Adicionar todos os itens do intervalo sem duplicados
177
+ const existingValuesStr = new Set(internalSelected.map((opt)=>String(opt.value)));
178
+ const newOptions = rangeOptions.filter((opt)=>!existingValuesStr.has(String(opt.value)));
179
+ const newSelectedOptions = [
180
+ ...internalSelected,
181
+ ...newOptions
182
+ ];
183
+ setInternalSelected(newSelectedOptions);
184
+ onChange(newSelectedOptions);
185
+ }
186
+ // Atualiza o último índice clicado
187
+ lastClickedIndexRef.current = index;
188
+ };
189
+ const handleClear = ()=>{
190
+ setInternalSelected([]);
191
+ onChange([]);
192
+ };
193
+ const handleTogglePopover = ()=>{
194
+ setIsPopoverOpen((prev)=>!prev);
195
+ };
196
+ const clearExtraOptions = ()=>{
197
+ const newSelectedOptions = internalSelected.slice(0, maxCount);
198
+ setInternalSelected(newSelectedOptions);
199
+ onChange(newSelectedOptions);
200
+ };
201
+ const toggleAll = ()=>{
202
+ if (internalSelected.length === options.length) {
203
+ handleClear();
204
+ } else {
205
+ setInternalSelected(options);
206
+ onChange(options);
207
+ }
208
+ };
209
+ const subtleStyles = (variant)=>{
210
+ if (variant === "default") {
211
+ return "border-transparent bg-accent text-primary hover:bg-accent/80";
212
+ }
213
+ if (variant === "destructive") {
214
+ return "border-transparent bg-destructive-foreground text-destructive hover:bg-destructive-foreground/80";
215
+ }
216
+ if (variant === "positive") {
217
+ return "border-transparent bg-positive-foreground text-positive hover:bg-positive-foreground/80";
218
+ }
219
+ if (variant === "warning") {
220
+ return "border-transparent bg-warning-foreground text-warning hover:bg-warning-foreground/80";
221
+ }
222
+ if (variant === "info") {
223
+ return "border-transparent bg-info-foreground text-info hover:bg-info-foreground/80";
224
+ }
225
+ return "";
226
+ };
227
+ const finalSubtleStyles = subtleStyles(variant);
228
+ return /*#__PURE__*/ React.createElement("div", {
229
+ className: "font-lato space-y-2"
230
+ }, label && /*#__PURE__*/ React.createElement(Label, {
231
+ htmlFor: inputId,
232
+ className: "text-foreground text-sm font-medium gap-0"
233
+ }, label), /*#__PURE__*/ React.createElement(Popover, {
234
+ open: isPopoverOpen,
235
+ onOpenChange: setIsPopoverOpen,
236
+ modal: modalPopover
237
+ }, /*#__PURE__*/ React.createElement(PopoverTrigger, {
238
+ asChild: true
239
+ }, /*#__PURE__*/ React.createElement(Button, {
240
+ id: inputId,
241
+ ref: ref,
242
+ onClick: handleTogglePopover,
243
+ variant: "outline",
244
+ "aria-expanded": isPopoverOpen,
245
+ className: cn("flex h-auto min-h-9 w-full items-center justify-between rounded-md border bg-inherit px-4 py-2 hover:bg-inherit [&_svg]:pointer-events-auto", className)
246
+ }, internalSelected.length > 0 ? /*#__PURE__*/ React.createElement("div", {
247
+ className: "flex w-full items-center justify-between"
248
+ }, /*#__PURE__*/ React.createElement("div", {
249
+ className: "flex flex-wrap items-center"
250
+ }, internalSelected.slice(0, maxCount).map((value)=>{
251
+ const option = value;
252
+ const IconComponent = option?.icon;
253
+ return /*#__PURE__*/ React.createElement(Badge, {
254
+ key: value.value,
255
+ className: cn("px-1", isAnimating ? "animate-bounce" : "", multiSelectVariants({
256
+ variant
257
+ }), subtle && finalSubtleStyles),
258
+ style: {
259
+ animationDuration: `${animation}s`
260
+ }
261
+ }, IconComponent && /*#__PURE__*/ React.createElement(IconComponent, {
262
+ className: "mr-2 h-4 w-4"
263
+ }), option?.label, /*#__PURE__*/ React.createElement(X, {
264
+ className: "ml-2 size-3 cursor-pointer",
265
+ onClick: (event)=>{
266
+ event.stopPropagation();
267
+ removeOption(value);
268
+ }
269
+ }));
270
+ }), internalSelected.length > maxCount && /*#__PURE__*/ React.createElement(Badge, {
271
+ className: cn("text-foreground border-foreground/1 bg-transparent px-1 hover:bg-transparent", isAnimating ? "animate-bounce" : "", multiSelectVariants({
272
+ variant
273
+ }), subtle && finalSubtleStyles),
274
+ style: {
275
+ animationDuration: `${animation}s`
276
+ }
277
+ }, `+ ${internalSelected.length - maxCount} itens`, /*#__PURE__*/ React.createElement(X, {
278
+ className: "ml-2 size-3 cursor-pointer",
279
+ onClick: (event)=>{
280
+ event.stopPropagation();
281
+ clearExtraOptions();
282
+ }
283
+ }))), /*#__PURE__*/ React.createElement("div", {
284
+ className: "flex items-center justify-between gap-1"
285
+ }, /*#__PURE__*/ React.createElement(TooltipProvider, null, /*#__PURE__*/ React.createElement(Tooltip, null, /*#__PURE__*/ React.createElement(TooltipTrigger, null, /*#__PURE__*/ React.createElement(X, {
286
+ className: "text-muted-foreground h-4 cursor-pointer",
287
+ onClick: (event)=>{
288
+ event.stopPropagation();
289
+ handleClear();
290
+ }
291
+ })), /*#__PURE__*/ React.createElement(TooltipContent, null, /*#__PURE__*/ React.createElement("span", {
292
+ className: "text-xs"
293
+ }, "Limpar tudo")))), /*#__PURE__*/ React.createElement(Separator, {
294
+ orientation: "vertical",
295
+ className: "flex h-full min-h-6"
296
+ }), /*#__PURE__*/ React.createElement(ChevronsUpDown, {
297
+ className: "text-muted-foreground h-4 cursor-pointer"
298
+ }))) : /*#__PURE__*/ React.createElement("div", {
299
+ className: "flex w-full items-center justify-between"
300
+ }, /*#__PURE__*/ React.createElement("span", {
301
+ className: "text-muted-foreground"
302
+ }, placeholder), /*#__PURE__*/ React.createElement(ChevronsUpDown, {
303
+ className: "text-muted-foreground h-4 cursor-pointer"
304
+ })))), /*#__PURE__*/ React.createElement(PopoverContent, {
305
+ className: "w-auto p-0",
306
+ align: "start",
307
+ onEscapeKeyDown: ()=>setIsPopoverOpen(false),
308
+ onOpenAutoFocus: (e)=>{
309
+ e.preventDefault();
310
+ // Foca no input sem causar scroll
311
+ inputRef.current?.focus({
312
+ preventScroll: true
313
+ });
314
+ }
315
+ }, /*#__PURE__*/ React.createElement(Command, {
316
+ shouldFilter: false
317
+ }, /*#__PURE__*/ React.createElement(CommandInput, {
318
+ ref: inputRef,
319
+ placeholder: searchPlaceholder,
320
+ value: inputValue,
321
+ onValueChange: handleInputChange,
322
+ onKeyDown: handleInputKeyDown
323
+ }), /*#__PURE__*/ React.createElement(CommandList, null, /*#__PURE__*/ React.createElement(CommandEmpty, null, loading ? "Carregando..." : inputValue.trim() === "" ? "Digite algo para buscar..." : messageEmpty), options.length > 0 && /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(CommandGroup, null, /*#__PURE__*/ React.createElement(CommandItem, {
324
+ key: "all",
325
+ onSelect: ()=>{
326
+ toggleAll();
327
+ if (focusOnSelect) {
328
+ inputRef.current?.focus({
329
+ preventScroll: true
330
+ });
331
+ }
332
+ },
333
+ className: "flex cursor-pointer items-center justify-between"
334
+ }, /*#__PURE__*/ React.createElement("span", null, "(Selecionar tudo)"), /*#__PURE__*/ React.createElement("div", {
335
+ className: cn(internalSelected.length === options.length ? "" : "opacity-50 [&_svg]:invisible")
336
+ }, /*#__PURE__*/ React.createElement(Check, {
337
+ className: "text-foreground h-4 w-4"
338
+ }))), options.map((option, index)=>{
339
+ // Comparação convertendo AMBOS para string
340
+ const optionValueStr = String(option.value);
341
+ const isSelected = internalSelected.some((opt)=>String(opt.value) === optionValueStr);
342
+ return /*#__PURE__*/ React.createElement(CommandItem, {
343
+ key: `${option.value}-${isSelected}`,
344
+ value: option.value,
345
+ onSelect: ()=>{
346
+ // Usa o ref que é atualizado pelos event listeners globais
347
+ const isShiftPressed = isShiftPressedRef.current;
348
+ if (isShiftPressed) {
349
+ toggleInterval(index);
350
+ } else {
351
+ toggleOption(option, index);
352
+ }
353
+ if (focusOnSelect) {
354
+ // Foca sem causar scroll
355
+ inputRef.current?.focus({
356
+ preventScroll: true
357
+ });
358
+ }
359
+ },
360
+ className: "flex cursor-pointer items-center justify-between"
361
+ }, /*#__PURE__*/ React.createElement("div", {
362
+ className: "flex items-center"
363
+ }, option.icon && /*#__PURE__*/ React.createElement(option.icon, {
364
+ className: "text-muted-foreground mr-2 h-4 w-4"
365
+ }), /*#__PURE__*/ React.createElement("span", null, option.label)), /*#__PURE__*/ React.createElement("div", {
366
+ className: cn(isSelected ? "" : "opacity-50 [&_svg]:invisible")
367
+ }, /*#__PURE__*/ React.createElement(Check, {
368
+ className: "text-foreground h-4 w-4"
369
+ })));
370
+ })), /*#__PURE__*/ React.createElement(CommandSeparator, null))))), animation > 0 && internalSelected.length > 0 && /*#__PURE__*/ React.createElement(WandSparkles, {
371
+ className: cn("text-foreground bg-background my-2 h-3 w-3 cursor-pointer", isAnimating ? "" : "text-muted-foreground"),
372
+ onClick: ()=>setIsAnimating(!isAnimating)
373
+ })), description && /*#__PURE__*/ React.createElement("p", {
374
+ className: "text-muted-foreground text-sm"
375
+ }, description));
376
+ });
377
+ AutoCompleteMultiSelect.displayName = "AutoCompleteMultiSelect";
378
+
379
+ export { AutoCompleteMultiSelect };
380
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/components/ui/auto-complete-multi-select/AutoCompleteMultiSelect.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { CheckIcon, ChevronsUpDown, WandSparkles, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { Badge, type BadgeVariants } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tCommand,\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandInput,\n\tCommandItem,\n\tCommandList,\n\tCommandSeparator,\n} from \"@/components/ui/command\";\nimport { Label } from \"@/components/ui/label\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Variants for the multi-select component to handle different styles.\n * Uses class-variance-authority (cva) to define different styles based on \"variant\" prop.\n */\nconst multiSelectVariants = cva(\"m-1 transition ease-in-out delay-150 duration-300\", {\n\tvariants: {\n\t\tvariant: {\n\t\t\tdefault: \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n\t\t\tsecondary: \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n\t\t\tdestructive:\n\t\t\t\t\"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n\t\t\tpositive:\n\t\t\t\t\"border-transparent bg-positive text-positive-foreground shadow hover:bg-positive/80\",\n\t\t\twarning: \"border-transparent bg-warning text-warning-foreground shadow hover:bg-warning/80\",\n\t\t\tinfo: \"border-transparent bg-info text-info-foreground shadow hover:bg-info/80\",\n\t\t\toutline: \"text-foreground bg-transparent hover:bg-transparent border\",\n\t\t},\n\t\tsubtle: {\n\t\t\ttrue: \"\",\n\t\t\tfalse: \"\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"default\",\n\t},\n});\n\nexport interface Option {\n\t/** The text to display for the option. */\n\tlabel: string;\n\t/** The unique value associated with the option. */\n\tvalue: string;\n\t/** Optional icon component to display alongside the option. */\n\ticon?: React.ComponentType<{ className?: string }>;\n}\n\n/**\n * Props for AutoCompleteMultiSelectIVT component\n */\ninterface AutoCompleteMultiSelectProps extends VariantProps<typeof multiSelectVariants> {\n\t/**\n\t * An array of currently selected option objects.\n\t * Each option object has a label, value, and an optional icon.\n\t */\n\tselectedOptions: Option[];\n\n\t/**\n\t * Callback function triggered when the selected values change.\n\t * Receives an array of the new selected option objects.\n\t */\n\tonChange: (options: AutoCompleteMultiSelectProps[\"selectedOptions\"]) => void;\n\n\t/**\n\t * Async function to fetch options based on search term.\n\t * Returns a promise with an array of option objects.\n\t */\n\tfetchOptions: (term: string) => Promise<AutoCompleteMultiSelectProps[\"selectedOptions\"]>;\n\n\t/**\n\t * Placeholder text to be displayed when no values are selected.\n\t * Optional, defaults to \"Select options\".\n\t */\n\tplaceholder?: string;\n\n\t/**\n\t * Placeholder text for the search input.\n\t * Optional, defaults to \"Buscar...\".\n\t */\n\tsearchPlaceholder?: string;\n\n\t/**\n\t * Message to be displayed when no results are found.\n\t * Optional, defaults to \"Nenhum item encontrado.\".\n\t */\n\tmessageEmpty?: string;\n\n\t/**\n\t * Animation duration in seconds for the visual effects (e.g., bouncing badges).\n\t * Optional, defaults to 0 (no animation).\n\t */\n\tanimation?: number;\n\n\t/**\n\t * Maximum number of items to display. Extra selected items will be summarized.\n\t * Optional, defaults to 3.\n\t */\n\tmaxCount?: number;\n\n\t/**\n\t * The modality of the popover. When set to true, interaction with outside elements\n\t * will be disabled and only popover content will be visible to screen readers.\n\t * Optional, defaults to false.\n\t */\n\tmodalPopover?: boolean;\n\n\t/**\n\t * Additional class names to apply custom styles to the multi-select component.\n\t * Optional, can be used to add custom styles.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Label for the component.\n\t */\n\tlabel?: string | React.ReactNode;\n\n\t/**\n\t * Description text displayed below the component.\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Whether to use subtle variant styling.\n\t */\n\tsubtle?: boolean;\n\n\t/**\n\t * Whether to focus on select actions.\n\t * Optional, defaults to true.\n\t */\n\tfocusOnSelect?: boolean;\n\n\t/**\n\t * Unique identifier for the component.\n\t */\n\tid?: string;\n\n\t/**\n\t * Callback function triggered when there's an error fetching options.\n\t */\n\tonError?: (error: unknown) => void;\n}\n\nexport const AutoCompleteMultiSelect = React.forwardRef<\n\tHTMLButtonElement,\n\tAutoCompleteMultiSelectProps\n>(\n\t(\n\t\t{\n\t\t\tselectedOptions,\n\t\t\tonChange,\n\t\t\tfetchOptions,\n\t\t\tvariant,\n\t\t\tplaceholder = \"Select options\",\n\t\t\tsearchPlaceholder = \"Buscar...\",\n\t\t\tmessageEmpty = \"Nenhum resultado encontrado.\",\n\t\t\tanimation = 0,\n\t\t\tmaxCount = 3,\n\t\t\tmodalPopover = false,\n\t\t\tclassName,\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tsubtle = false,\n\t\t\tfocusOnSelect = true,\n\t\t\tid,\n\t\t\tonError,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\t\tconst lastClickedIndexRef = React.useRef<number>(-1);\n\t\tconst isShiftPressedRef = React.useRef<boolean>(false);\n\t\tconst generatedId = React.useId();\n\t\tconst inputId = id || generatedId;\n\n\t\t// Estado interno para resposta imediata\n\t\tconst [internalSelected, setInternalSelected] =\n\t\t\tReact.useState<typeof selectedOptions>(selectedOptions);\n\t\tconst [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n\t\tconst [isAnimating, setIsAnimating] = React.useState(false);\n\t\tconst [inputValue, setInputValue] = React.useState(\"\");\n\t\tconst [options, setOptions] = React.useState<typeof selectedOptions>([]);\n\t\tconst [loading, setLoading] = React.useState(false);\n\n\t\t// Sincroniza estado interno quando selectedOptions muda (do pai)\n\t\tReact.useEffect(() => {\n\t\t\tsetInternalSelected(selectedOptions);\n\t\t}, [selectedOptions]);\n\n\t\t// Listener global para detectar Shift\n\t\tReact.useEffect(() => {\n\t\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\t\tif (e.key === \"Shift\") {\n\t\t\t\t\tisShiftPressedRef.current = true;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleKeyUp = (e: KeyboardEvent) => {\n\t\t\t\tif (e.key === \"Shift\") {\n\t\t\t\t\tisShiftPressedRef.current = false;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\t\twindow.addEventListener(\"keyup\", handleKeyUp);\n\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\t\twindow.removeEventListener(\"keyup\", handleKeyUp);\n\t\t\t};\n\t\t}, []);\n\n\t\t// Busca assíncrona com debounce (do AutoComplete)\n\t\tconst debouncedFetch = useDebouncedCallback(async (term: string) => {\n\t\t\tif (!term.trim()) {\n\t\t\t\tsetOptions([]);\n\t\t\t\tsetLoading(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetLoading(true);\n\t\t\ttry {\n\t\t\t\tconst result = await fetchOptions(term);\n\t\t\t\tsetOptions(result);\n\t\t\t} catch (err) {\n\t\t\t\tif (onError) {\n\t\t\t\t\tonError(err);\n\t\t\t\t}\n\t\t\t\tsetOptions([]);\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t}, 500);\n\n\t\tconst handleInputChange = (value: string) => {\n\t\t\tsetInputValue(value);\n\t\t\tif (value.trim() === \"\") {\n\t\t\t\tsetOptions([]);\n\t\t\t\tsetLoading(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetLoading(true);\n\t\t\tdebouncedFetch(value);\n\t\t};\n\n\t\tconst handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tsetIsPopoverOpen(true);\n\t\t\t}\n\t\t};\n\n\t\tconst toggleOption = (option: (typeof internalSelected)[number], index: number) => {\n\t\t\t// Normaliza para string para comparação\n\t\t\tconst optionValueStr = String(option.value);\n\t\t\tconst isSelected = internalSelected.find((o) => String(o.value) === optionValueStr);\n\t\t\tconst newSelectedOptions = isSelected\n\t\t\t\t? internalSelected.filter((value) => String(value.value) !== optionValueStr)\n\t\t\t\t: [...internalSelected, option];\n\n\t\t\t// Atualiza estado interno IMEDIATAMENTE\n\t\t\tsetInternalSelected(newSelectedOptions);\n\n\t\t\t// Notifica o pai\n\t\t\tonChange(newSelectedOptions);\n\n\t\t\t// Armazena o índice do último clique\n\t\t\tlastClickedIndexRef.current = index;\n\t\t};\n\n\t\tconst removeOption = (option: (typeof internalSelected)[number]) => {\n\t\t\t// Normaliza para string para comparação\n\t\t\tconst optionValueStr = String(option.value);\n\t\t\tconst newSelectedOptions = internalSelected.filter(\n\t\t\t\t(value) => String(value.value) !== optionValueStr,\n\t\t\t);\n\t\t\tsetInternalSelected(newSelectedOptions);\n\t\t\tonChange(newSelectedOptions);\n\t\t};\n\n\t\tconst toggleInterval = (index: number) => {\n\t\t\t// Se não houver último clique registrado, apenas seleciona o item atual\n\t\t\tif (lastClickedIndexRef.current === -1 || internalSelected.length < 1) {\n\t\t\t\ttoggleOption(options[index], index);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastIndex = lastClickedIndexRef.current;\n\t\t\tconst start = Math.min(lastIndex, index);\n\t\t\tconst end = Math.max(lastIndex, index) + 1;\n\t\t\tconst rangeOptions = options.slice(start, end);\n\t\t\tconst rangeValuesStr = rangeOptions.map((o) => String(o.value));\n\n\t\t\tconst areAllSelected = rangeValuesStr.every((v) =>\n\t\t\t\tinternalSelected.some((opt) => String(opt.value) === v),\n\t\t\t);\n\n\t\t\tif (areAllSelected) {\n\t\t\t\t// Desselecionar todos os itens do intervalo\n\t\t\t\tconst newSelectedOptions = internalSelected.filter(\n\t\t\t\t\t(v) => !rangeValuesStr.includes(String(v.value)),\n\t\t\t\t);\n\t\t\t\tsetInternalSelected(newSelectedOptions);\n\t\t\t\tonChange(newSelectedOptions);\n\t\t\t} else {\n\t\t\t\t// Adicionar todos os itens do intervalo sem duplicados\n\t\t\t\tconst existingValuesStr = new Set(internalSelected.map((opt) => String(opt.value)));\n\t\t\t\tconst newOptions = rangeOptions.filter((opt) => !existingValuesStr.has(String(opt.value)));\n\t\t\t\tconst newSelectedOptions = [...internalSelected, ...newOptions];\n\t\t\t\tsetInternalSelected(newSelectedOptions);\n\t\t\t\tonChange(newSelectedOptions);\n\t\t\t}\n\n\t\t\t// Atualiza o último índice clicado\n\t\t\tlastClickedIndexRef.current = index;\n\t\t};\n\n\t\tconst handleClear = () => {\n\t\t\tsetInternalSelected([]);\n\t\t\tonChange([]);\n\t\t};\n\n\t\tconst handleTogglePopover = () => {\n\t\t\tsetIsPopoverOpen((prev) => !prev);\n\t\t};\n\n\t\tconst clearExtraOptions = () => {\n\t\t\tconst newSelectedOptions = internalSelected.slice(0, maxCount);\n\t\t\tsetInternalSelected(newSelectedOptions);\n\t\t\tonChange(newSelectedOptions);\n\t\t};\n\n\t\tconst toggleAll = () => {\n\t\t\tif (internalSelected.length === options.length) {\n\t\t\t\thandleClear();\n\t\t\t} else {\n\t\t\t\tsetInternalSelected(options);\n\t\t\t\tonChange(options);\n\t\t\t}\n\t\t};\n\n\t\tconst subtleStyles = (variant: BadgeVariants) => {\n\t\t\tif (variant === \"default\") {\n\t\t\t\treturn \"border-transparent bg-accent text-primary hover:bg-accent/80\";\n\t\t\t}\n\t\t\tif (variant === \"destructive\") {\n\t\t\t\treturn \"border-transparent bg-destructive-foreground text-destructive hover:bg-destructive-foreground/80\";\n\t\t\t}\n\t\t\tif (variant === \"positive\") {\n\t\t\t\treturn \"border-transparent bg-positive-foreground text-positive hover:bg-positive-foreground/80\";\n\t\t\t}\n\t\t\tif (variant === \"warning\") {\n\t\t\t\treturn \"border-transparent bg-warning-foreground text-warning hover:bg-warning-foreground/80\";\n\t\t\t}\n\t\t\tif (variant === \"info\") {\n\t\t\t\treturn \"border-transparent bg-info-foreground text-info hover:bg-info-foreground/80\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t};\n\n\t\tconst finalSubtleStyles = subtleStyles(variant);\n\n\t\treturn (\n\t\t\t<div className=\"font-lato space-y-2\">\n\t\t\t\t{label && (\n\t\t\t\t\t<Label htmlFor={inputId} className=\"text-foreground text-sm font-medium gap-0\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Label>\n\t\t\t\t)}\n\t\t\t\t<Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen} modal={modalPopover}>\n\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tonClick={handleTogglePopover}\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\taria-expanded={isPopoverOpen}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex h-auto min-h-9 w-full items-center justify-between rounded-md border bg-inherit px-4 py-2 hover:bg-inherit [&_svg]:pointer-events-auto\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{internalSelected.length > 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"flex w-full items-center justify-between\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap items-center\">\n\t\t\t\t\t\t\t\t\t\t{internalSelected.slice(0, maxCount).map((value) => {\n\t\t\t\t\t\t\t\t\t\t\tconst option = value;\n\t\t\t\t\t\t\t\t\t\t\tconst IconComponent = option?.icon;\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={value.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"px-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisAnimating ? \"animate-bounce\" : \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmultiSelectVariants({ variant }),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubtle && finalSubtleStyles,\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ animationDuration: `${animation}s` }}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{IconComponent && <IconComponent className=\"mr-2 h-4 w-4\" />}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{option?.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<XIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-2 size-3 cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tremoveOption(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t{internalSelected.length > maxCount && (\n\t\t\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"text-foreground border-foreground/1 bg-transparent px-1 hover:bg-transparent\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tisAnimating ? \"animate-bounce\" : \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tmultiSelectVariants({ variant }),\n\t\t\t\t\t\t\t\t\t\t\t\t\tsubtle && finalSubtleStyles,\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ animationDuration: `${animation}s` }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{`+ ${internalSelected.length - maxCount} itens`}\n\t\t\t\t\t\t\t\t\t\t\t\t<XIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-2 size-3 cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclearExtraOptions();\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-1\">\n\t\t\t\t\t\t\t\t\t\t<TooltipProvider>\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<XIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground h-4 cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleClear();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs\">Limpar tudo</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t</TooltipProvider>\n\t\t\t\t\t\t\t\t\t\t<Separator orientation=\"vertical\" className=\"flex h-full min-h-6\" />\n\t\t\t\t\t\t\t\t\t\t<ChevronsUpDown className=\"text-muted-foreground h-4 cursor-pointer\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"flex w-full items-center justify-between\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{placeholder}</span>\n\t\t\t\t\t\t\t\t\t<ChevronsUpDown className=\"text-muted-foreground h-4 cursor-pointer\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\tclassName=\"w-auto p-0\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tonEscapeKeyDown={() => setIsPopoverOpen(false)}\n\t\t\t\t\t\tonOpenAutoFocus={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t// Foca no input sem causar scroll\n\t\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true });\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Command shouldFilter={false}>\n\t\t\t\t\t\t\t<CommandInput\n\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\t\tonValueChange={handleInputChange}\n\t\t\t\t\t\t\t\tonKeyDown={handleInputKeyDown}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<CommandList>\n\t\t\t\t\t\t\t\t<CommandEmpty>\n\t\t\t\t\t\t\t\t\t{loading\n\t\t\t\t\t\t\t\t\t\t? \"Carregando...\"\n\t\t\t\t\t\t\t\t\t\t: inputValue.trim() === \"\"\n\t\t\t\t\t\t\t\t\t\t\t? \"Digite algo para buscar...\"\n\t\t\t\t\t\t\t\t\t\t\t: messageEmpty}\n\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t\t{options.length > 0 && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<CommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t<CommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tkey=\"all\"\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleAll();\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (focusOnSelect) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true });\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center justify-between\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<span>(Selecionar tudo)</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinternalSelected.length === options.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"opacity-50 [&_svg]:invisible\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className=\"text-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</CommandItem>\n\t\t\t\t\t\t\t\t\t\t\t{options.map((option, index) => {\n\t\t\t\t\t\t\t\t\t\t\t\t// Comparação convertendo AMBOS para string\n\t\t\t\t\t\t\t\t\t\t\t\tconst optionValueStr = String(option.value);\n\t\t\t\t\t\t\t\t\t\t\t\tconst isSelected = internalSelected.some(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(opt) => String(opt.value) === optionValueStr,\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${option.value}-${isSelected}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Usa o ref que é atualizado pelos event listeners globais\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isShiftPressed = isShiftPressedRef.current;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (isShiftPressed) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleInterval(index);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleOption(option, index);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (focusOnSelect) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Foca sem causar scroll\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true });\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center justify-between\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option.icon className=\"text-muted-foreground mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{option.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={cn(isSelected ? \"\" : \"opacity-50 [&_svg]:invisible\")}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className=\"text-foreground h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t\t\t<CommandSeparator />\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</CommandList>\n\t\t\t\t\t\t</Command>\n\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t{animation > 0 && internalSelected.length > 0 && (\n\t\t\t\t\t\t<WandSparkles\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-foreground bg-background my-2 h-3 w-3 cursor-pointer\",\n\t\t\t\t\t\t\t\tisAnimating ? \"\" : \"text-muted-foreground\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => setIsAnimating(!isAnimating)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</Popover>\n\t\t\t\t{description && <p className=\"text-muted-foreground text-sm\">{description}</p>}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nAutoCompleteMultiSelect.displayName = \"AutoCompleteMultiSelect\";\n"],"names":["multiSelectVariants","cva","variants","variant","default","secondary","destructive","positive","warning","info","outline","subtle","true","false","defaultVariants","AutoCompleteMultiSelect","React","forwardRef","selectedOptions","onChange","fetchOptions","placeholder","searchPlaceholder","messageEmpty","animation","maxCount","modalPopover","className","label","description","focusOnSelect","id","onError","ref","inputRef","useRef","lastClickedIndexRef","isShiftPressedRef","generatedId","useId","inputId","internalSelected","setInternalSelected","useState","isPopoverOpen","setIsPopoverOpen","isAnimating","setIsAnimating","inputValue","setInputValue","options","setOptions","loading","setLoading","useEffect","handleKeyDown","e","key","current","handleKeyUp","window","addEventListener","removeEventListener","debouncedFetch","useDebouncedCallback","term","trim","result","err","handleInputChange","value","handleInputKeyDown","event","toggleOption","option","index","optionValueStr","String","isSelected","find","o","newSelectedOptions","filter","removeOption","toggleInterval","length","lastIndex","start","Math","min","end","max","rangeOptions","slice","rangeValuesStr","map","areAllSelected","every","v","some","opt","includes","existingValuesStr","Set","newOptions","has","handleClear","handleTogglePopover","prev","clearExtraOptions","toggleAll","subtleStyles","finalSubtleStyles","div","Label","htmlFor","Popover","open","onOpenChange","modal","PopoverTrigger","asChild","Button","onClick","aria-expanded","cn","IconComponent","icon","Badge","style","animationDuration","XIcon","stopPropagation","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","span","Separator","orientation","ChevronsUpDown","PopoverContent","align","onEscapeKeyDown","onOpenAutoFocus","preventDefault","focus","preventScroll","Command","shouldFilter","CommandInput","onValueChange","onKeyDown","CommandList","CommandEmpty","CommandGroup","CommandItem","onSelect","CheckIcon","isShiftPressed","CommandSeparator","WandSparkles","p","displayName"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import React__default, { useRef, useEffect, useMemo } from 'react';
1
+ import React__default from 'react';
2
+ import { c } from '../chunks/index.module-dysOJ0dE.mjs';
2
3
  import { c as cn } from '../chunks/utils-CwDmCEge.mjs';
3
4
  import { P as Popover, a as PopoverTrigger, b as PopoverContent } from '../chunks/popover-BW3SktUO.mjs';
4
5
  import { B as Button } from '../chunks/button-C0ijXnnF.mjs';
@@ -54,70 +55,6 @@ import '../chunks/index-CUXpXuiX.mjs';
54
55
  import '../chunks/index-DE-b60L0.mjs';
55
56
  import '../chunks/index-Dot3Y4xv.mjs';
56
57
 
57
- function c(e, u, c, i) {
58
- var a = this, o = useRef(null), f = useRef(0), l = useRef(0), v = useRef(null), m = useRef([]), d = useRef(), g = useRef(), p = useRef(e), w = useRef(true);
59
- p.current = e;
60
- var s = "undefined" != typeof window, x = !u && 0 !== u && s;
61
- if ("function" != typeof e) throw new TypeError("Expected a function");
62
- u = +u || 0;
63
- var h = !!(c = c || {}).leading, y = !("trailing" in c) || !!c.trailing, F = "maxWait" in c, A = "debounceOnServer" in c && !!c.debounceOnServer, D = F ? Math.max(+c.maxWait || 0, u) : null;
64
- useEffect(function() {
65
- return w.current = true, function() {
66
- w.current = false;
67
- };
68
- }, []);
69
- var T = useMemo(function() {
70
- var r = function(r) {
71
- var n = m.current, t = d.current;
72
- return m.current = d.current = null, f.current = r, l.current = l.current || r, g.current = p.current.apply(t, n);
73
- }, n = function(r, n) {
74
- x && cancelAnimationFrame(v.current), v.current = x ? requestAnimationFrame(r) : setTimeout(r, n);
75
- }, t = function(r) {
76
- if (!w.current) return false;
77
- var n = r - o.current;
78
- return !o.current || n >= u || n < 0 || F && r - f.current >= D;
79
- }, e = function(n) {
80
- return v.current = null, y && m.current ? r(n) : (m.current = d.current = null, g.current);
81
- }, c = function r() {
82
- var c = Date.now();
83
- if (h && l.current === f.current && T(), t(c)) return e(c);
84
- if (w.current) {
85
- var i = u - (c - o.current), a = F ? Math.min(i, D - (c - f.current)) : i;
86
- n(r, a);
87
- }
88
- }, T = function() {
89
- }, W = function() {
90
- if (s || A) {
91
- var e = Date.now(), i = t(e);
92
- if (m.current = [].slice.call(arguments), d.current = a, o.current = e, i) {
93
- if (!v.current && w.current) return f.current = o.current, n(c, u), h ? r(o.current) : g.current;
94
- if (F) return n(c, u), r(o.current);
95
- }
96
- return v.current || n(c, u), g.current;
97
- }
98
- };
99
- return W.cancel = function() {
100
- var r = v.current;
101
- r && (x ? cancelAnimationFrame(v.current) : clearTimeout(v.current)), f.current = 0, m.current = o.current = d.current = v.current = null;
102
- }, W.isPending = function() {
103
- return !!v.current;
104
- }, W.flush = function() {
105
- return v.current ? e(Date.now()) : g.current;
106
- }, W;
107
- }, [
108
- h,
109
- F,
110
- u,
111
- D,
112
- y,
113
- x,
114
- s,
115
- A,
116
- i
117
- ]);
118
- return T;
119
- }
120
-
121
58
  function AutoComplete({ value, onChange, placeholder, searchPlaceholder, open, onOpenChange, disabled, messageEmpty = "Nenhum item encontrado.", fetchOptions, getOptionLabel, getOptionKey, onSelect, className }) {
122
59
  const [options, setOptions] = React__default.useState([]);
123
60
  const [loading, setLoading] = React__default.useState(false);