@mlw-packages/react-components 1.10.20 → 1.10.22

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.
package/dist/index.mjs CHANGED
@@ -5,7 +5,7 @@ import { Slot } from '@radix-ui/react-slot';
5
5
  import { cva } from 'class-variance-authority';
6
6
  import { clsx } from 'clsx';
7
7
  import { twMerge } from 'tailwind-merge';
8
- import { XIcon, CircleNotchIcon, MagnifyingGlassIcon, CaretUpIcon, CaretDownIcon, CheckIcon, CaretRightIcon, CircleIcon, CloudArrowUpIcon, MinusIcon, CaretUpDownIcon, PencilSimpleIcon, ArrowsLeftRightIcon, FloppyDiskIcon, PlusIcon, TrashIcon, SidebarSimpleIcon, ArrowElbowDownRightIcon, ArrowBendUpLeftIcon, CommandIcon, FilePdfIcon, FileDocIcon, FileXlsIcon, FilePptIcon, FileCsvIcon, FileTextIcon, FileImageIcon, FileVideoIcon, FileAudioIcon, FileZipIcon, FileIcon, DotsSixVerticalIcon, CopyIcon, InfoIcon, WarningIcon, XCircleIcon, CheckCircleIcon, SunIcon, MoonIcon, CaretLeftIcon, DownloadSimpleIcon, UploadSimpleIcon, ArrowClockwiseIcon, ArrowLeftIcon, GearIcon, BellIcon, DotsThreeIcon, FunnelIcon, HeartIcon, StarIcon, EyeIcon, EyeSlashIcon, LockIcon, LockOpenIcon, FolderIcon, ArrowRightIcon as ArrowRightIcon$1, ArrowsOutIcon, DownloadIcon, CalendarBlankIcon, CalendarIcon, MapPinIcon, CalendarDotsIcon, ClockIcon, AlignLeftIcon, CaretLeft, CaretRight, ArrowDownIcon, ClockUserIcon, EyeSlash, Eye, ArrowUpRightIcon, ArrowDownRightIcon, FunnelSimpleIcon, PencilIcon, ClockCounterClockwiseIcon, FileArchiveIcon, TerminalIcon, CodeIcon, CalendarDotIcon as CalendarDotIcon$1, DesktopIcon } from '@phosphor-icons/react';
8
+ import { XIcon, CircleNotchIcon, MagnifyingGlassIcon, CaretUpIcon, CaretDownIcon, CheckIcon, CaretRightIcon, CircleIcon, CloudArrowUpIcon, MinusIcon, CaretUpDownIcon, PencilSimpleIcon, ArrowsLeftRightIcon, FloppyDiskIcon, PlusIcon, TrashIcon, SidebarSimpleIcon, CommandIcon, ArrowElbowDownRightIcon, ArrowBendUpLeftIcon, FilePdfIcon, FileDocIcon, FileXlsIcon, FilePptIcon, FileCsvIcon, FileTextIcon, FileImageIcon, FileVideoIcon, FileAudioIcon, FileZipIcon, FileIcon, DotsSixVerticalIcon, CopyIcon, InfoIcon, WarningIcon, XCircleIcon, CheckCircleIcon, CaretLeftIcon, DownloadSimpleIcon, UploadSimpleIcon, ArrowClockwiseIcon, ArrowLeftIcon, GearIcon, BellIcon, DotsThreeIcon, FunnelIcon, HeartIcon, StarIcon, EyeIcon, EyeSlashIcon, LockIcon, LockOpenIcon, FolderIcon, ArrowRightIcon as ArrowRightIcon$1, ArrowsOutIcon, DownloadIcon, CalendarBlankIcon, CalendarIcon, MapPinIcon, CalendarDotsIcon, SunIcon, ClockIcon, AlignLeftIcon, CaretLeft, CaretRight, ArrowDownIcon, ClockUserIcon, EyeSlash, Eye, ArrowUpRightIcon, ArrowDownRightIcon, FunnelSimpleIcon, PencilIcon, ClockCounterClockwiseIcon, FileArchiveIcon, TerminalIcon, CodeIcon, CalendarDotIcon as CalendarDotIcon$1, MoonIcon, DesktopIcon } from '@phosphor-icons/react';
9
9
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
10
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
11
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -40,7 +40,7 @@ import { ptBR } from 'date-fns/locale';
40
40
  import { useSensors, useSensor, MouseSensor, TouchSensor, PointerSensor, DndContext, DragOverlay, useDroppable, useDraggable } from '@dnd-kit/core';
41
41
  import { CSS } from '@dnd-kit/utilities';
42
42
  import { RadioGroup, RadioGroupItem } from '@radix-ui/react-radio-group';
43
- import { ResponsiveContainer, ComposedChart, XAxis, YAxis, Bar, Line, Area, CartesianGrid, Tooltip, Legend, LabelList, Rectangle } from 'recharts';
43
+ import { ResponsiveContainer, ComposedChart, XAxis, YAxis, Bar, Line, Area, CartesianGrid, Tooltip, Legend, LabelList, Rectangle, PieChart, Pie, Cell, Sector } from 'recharts';
44
44
  import useEmblaCarousel from 'embla-carousel-react';
45
45
  import { useVirtualizer } from '@tanstack/react-virtual';
46
46
 
@@ -3443,58 +3443,100 @@ var ThemeIcon = ({ theme }) => {
3443
3443
  }
3444
3444
  ) });
3445
3445
  };
3446
+ function resolveOrigin(origin, buttonRef, cursorPos) {
3447
+ if (origin === "cursor" && cursorPos) {
3448
+ return cursorPos;
3449
+ }
3450
+ if (!buttonRef.current) {
3451
+ return { x: window.innerWidth / 2, y: window.innerHeight / 2 };
3452
+ }
3453
+ const rect = buttonRef.current.getBoundingClientRect();
3454
+ switch (origin) {
3455
+ case "top-left":
3456
+ return { x: rect.left, y: rect.top };
3457
+ case "top-right":
3458
+ return { x: rect.right, y: rect.top };
3459
+ case "center":
3460
+ default:
3461
+ return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
3462
+ }
3463
+ }
3446
3464
  function ModeToggleBase({
3447
3465
  themes = ["light", "dark", "system"],
3448
3466
  className,
3449
3467
  directToggle = false,
3450
- variant = "ghost"
3468
+ variant = "ghost",
3469
+ showLabel = false,
3470
+ tooltip = false,
3471
+ animationOrigin = "center",
3472
+ transitionDuration = 400,
3473
+ storageKey,
3474
+ defaultTheme,
3475
+ onThemeChange
3451
3476
  }) {
3452
3477
  const [mounted, setMounted] = useState(false);
3478
+ const [isTransitioning, setIsTransitioning] = useState(false);
3479
+ const cursorPos = useRef(null);
3453
3480
  const { setTheme, theme: currentTheme } = useTheme();
3454
3481
  const buttonRef = useRef(null);
3455
3482
  useEffect(() => {
3483
+ if (storageKey && defaultTheme) {
3484
+ const stored = localStorage.getItem(storageKey);
3485
+ if (!stored) setTheme(defaultTheme);
3486
+ } else if (defaultTheme && !localStorage.getItem("theme")) {
3487
+ setTheme(defaultTheme);
3488
+ }
3456
3489
  setMounted(true);
3457
- }, []);
3490
+ }, [defaultTheme, setTheme, storageKey]);
3458
3491
  const isDark = mounted && (currentTheme?.includes("dark") || currentTheme === "system" && typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches);
3492
+ const activeTheme = mounted ? currentTheme : defaultTheme;
3493
+ const tooltipText = tooltip === true ? themeLabels[activeTheme] ?? "Toggle theme" : typeof tooltip === "string" ? tooltip : null;
3459
3494
  const toggleTheme = async (newTheme) => {
3495
+ if (isTransitioning) return;
3460
3496
  if (!buttonRef.current) {
3461
3497
  setTheme(newTheme);
3498
+ onThemeChange?.(newTheme);
3462
3499
  return;
3463
3500
  }
3464
3501
  const supportsViewTransition = typeof document !== "undefined" && "startViewTransition" in document && typeof document.startViewTransition === "function";
3465
3502
  if (!supportsViewTransition) {
3466
3503
  setTheme(newTheme);
3504
+ onThemeChange?.(newTheme);
3467
3505
  return;
3468
3506
  }
3469
3507
  try {
3470
- const rect = buttonRef.current.getBoundingClientRect();
3471
- const x = rect.left + rect.width / 2;
3472
- const y = rect.top + rect.height / 2;
3508
+ setIsTransitioning(true);
3509
+ const { x, y } = resolveOrigin(
3510
+ animationOrigin,
3511
+ buttonRef,
3512
+ cursorPos.current
3513
+ );
3473
3514
  const endRadius = Math.hypot(
3474
3515
  Math.max(x, window.innerWidth - x),
3475
3516
  Math.max(y, window.innerHeight - y)
3476
3517
  );
3477
3518
  const transition = document.startViewTransition(async () => {
3478
3519
  setTheme(newTheme);
3520
+ onThemeChange?.(newTheme);
3479
3521
  });
3480
3522
  await transition.ready;
3481
- document.documentElement.animate(
3523
+ const animation = document.documentElement.animate(
3482
3524
  [
3483
- {
3484
- clipPath: `circle(0px at ${x}px ${y}px)`
3485
- },
3486
- {
3487
- clipPath: `circle(${Math.ceil(endRadius)}px at ${x}px ${y}px)`
3488
- }
3525
+ { clipPath: `circle(0px at ${x}px ${y}px)` },
3526
+ { clipPath: `circle(${Math.ceil(endRadius)}px at ${x}px ${y}px)` }
3489
3527
  ],
3490
3528
  {
3491
- duration: 400,
3529
+ duration: transitionDuration,
3492
3530
  easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3493
3531
  pseudoElement: "::view-transition-new(root)"
3494
3532
  }
3495
3533
  );
3534
+ animation.onfinish = () => setIsTransitioning(false);
3535
+ animation.oncancel = () => setIsTransitioning(false);
3496
3536
  } catch {
3497
3537
  setTheme(newTheme);
3538
+ onThemeChange?.(newTheme);
3539
+ setIsTransitioning(false);
3498
3540
  }
3499
3541
  };
3500
3542
  const handleDirectToggle = () => {
@@ -3502,67 +3544,72 @@ function ModeToggleBase({
3502
3544
  const nextIndex = (currentIndex + 1) % themes.length;
3503
3545
  toggleTheme(themes[nextIndex]);
3504
3546
  };
3505
- if (directToggle) {
3506
- return /* @__PURE__ */ jsxs(
3507
- ButtonBase,
3547
+ const handleMouseMove = (e) => {
3548
+ cursorPos.current = { x: e.clientX, y: e.clientY };
3549
+ };
3550
+ const buttonContent = /* @__PURE__ */ jsxs(Fragment, { children: [
3551
+ /* @__PURE__ */ jsx(
3552
+ SunIcon,
3508
3553
  {
3509
- ref: buttonRef,
3510
- variant,
3511
- size: "icon",
3512
- className: cn("relative overflow-hidden group", className),
3513
- onClick: handleDirectToggle,
3514
- children: [
3515
- /* @__PURE__ */ jsxs(Fragment, { children: [
3516
- /* @__PURE__ */ jsx(
3517
- SunIcon,
3518
- {
3519
- className: `h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-90 scale-0 opacity-0" : "rotate-0 scale-100 opacity-100 group-hover:rotate-12"}`
3520
- }
3521
- ),
3522
- /* @__PURE__ */ jsx(
3523
- MoonIcon,
3524
- {
3525
- className: `absolute h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-0 scale-100 opacity-100 group-hover:-rotate-12" : "rotate-90 scale-0 opacity-0"}`
3526
- }
3527
- )
3528
- ] }),
3529
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle theme" })
3530
- ]
3554
+ className: `h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-90 scale-0 opacity-0" : "rotate-0 scale-100 opacity-100 group-hover:rotate-12"}`
3531
3555
  }
3556
+ ),
3557
+ /* @__PURE__ */ jsx(
3558
+ MoonIcon,
3559
+ {
3560
+ className: `absolute h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-0 scale-100 opacity-100 group-hover:-rotate-12" : "rotate-90 scale-0 opacity-0"}`
3561
+ }
3562
+ ),
3563
+ showLabel && mounted && /* @__PURE__ */ jsx("span", { className: "ml-5 text-sm font-medium", children: themeLabels[activeTheme] }),
3564
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle theme" })
3565
+ ] });
3566
+ const wrapWithTooltip = (node) => {
3567
+ if (!tooltipText) return node;
3568
+ return /* @__PURE__ */ jsx(TooltipProviderBase, { children: /* @__PURE__ */ jsxs(TooltipBase, { children: [
3569
+ /* @__PURE__ */ jsx(TooltipTriggerBase, { asChild: true, children: node }),
3570
+ /* @__PURE__ */ jsx(TooltipContentBase, { children: tooltipText })
3571
+ ] }) });
3572
+ };
3573
+ if (directToggle) {
3574
+ return wrapWithTooltip(
3575
+ /* @__PURE__ */ jsx(
3576
+ ButtonBase,
3577
+ {
3578
+ ref: buttonRef,
3579
+ variant,
3580
+ size: showLabel ? "default" : "icon",
3581
+ className: cn("relative overflow-hidden group", className),
3582
+ onClick: handleDirectToggle,
3583
+ onMouseMove: handleMouseMove,
3584
+ onKeyDown: (e) => {
3585
+ if (e.repeat && (e.key === "Enter" || e.key === " ")) {
3586
+ e.preventDefault();
3587
+ }
3588
+ },
3589
+ children: buttonContent
3590
+ }
3591
+ )
3532
3592
  );
3533
3593
  }
3534
3594
  return /* @__PURE__ */ jsxs(DropDownMenuBase, { children: [
3535
- /* @__PURE__ */ jsx(DropDownMenuTriggerBase, { asChild: true, children: /* @__PURE__ */ jsxs(
3536
- ButtonBase,
3537
- {
3538
- ref: buttonRef,
3539
- variant,
3540
- size: "icon",
3541
- className: cn("relative overflow-hidden group", className),
3542
- children: [
3543
- /* @__PURE__ */ jsxs(Fragment, { children: [
3544
- /* @__PURE__ */ jsx(
3545
- SunIcon,
3546
- {
3547
- className: `h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-90 scale-0 opacity-0" : "rotate-0 scale-100 opacity-100 group-hover:rotate-12"}`
3548
- }
3549
- ),
3550
- /* @__PURE__ */ jsx(
3551
- MoonIcon,
3552
- {
3553
- className: `absolute h-[1.2rem] w-[1.2rem] transition-all duration-500 ${isDark ? "rotate-0 scale-100 opacity-100 group-hover:-rotate-12" : "rotate-90 scale-0 opacity-0"}`
3554
- }
3555
- )
3556
- ] }),
3557
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle theme" })
3558
- ]
3559
- }
3595
+ /* @__PURE__ */ jsx(DropDownMenuTriggerBase, { asChild: true, children: wrapWithTooltip(
3596
+ /* @__PURE__ */ jsx(
3597
+ ButtonBase,
3598
+ {
3599
+ ref: buttonRef,
3600
+ variant,
3601
+ size: showLabel ? "default" : "icon",
3602
+ className: cn("relative overflow-hidden group", className),
3603
+ onMouseMove: handleMouseMove,
3604
+ children: buttonContent
3605
+ }
3606
+ )
3560
3607
  ) }),
3561
3608
  /* @__PURE__ */ jsx(
3562
3609
  DropDownMenuContentBase,
3563
3610
  {
3564
3611
  align: "end",
3565
- className: "border-border bg-popover text-popover-foreground min-w-[140px] ",
3612
+ className: "border-border bg-popover text-popover-foreground min-w-[140px]",
3566
3613
  children: themes.map((theme) => {
3567
3614
  const isActive = currentTheme === theme;
3568
3615
  return /* @__PURE__ */ jsxs(
@@ -9627,7 +9674,8 @@ function DayViewAgenda({
9627
9674
  events,
9628
9675
  onEventSelect,
9629
9676
  showUndatedEvents,
9630
- noTime = false
9677
+ noTime = false,
9678
+ onEventCreate
9631
9679
  }) {
9632
9680
  const hours = useMemo(() => {
9633
9681
  const dayStart = startOfDay(currentDate);
@@ -9877,6 +9925,7 @@ function DayViewAgenda({
9877
9925
  const startTime = new Date(currentDate);
9878
9926
  startTime.setHours(hourValue);
9879
9927
  startTime.setMinutes(quarter * 15);
9928
+ if (onEventCreate) onEventCreate(startTime);
9880
9929
  },
9881
9930
  time: quarterHourTime
9882
9931
  },
@@ -10139,7 +10188,8 @@ function EventAgenda({
10139
10188
  onlyMonth,
10140
10189
  onlyWeek,
10141
10190
  onlyAgenda,
10142
- onlyYear
10191
+ onlyYear,
10192
+ allowCellClick = false
10143
10193
  }) {
10144
10194
  const lockedView = onlyDay ? "day" : onlyMonth ? "month" : onlyWeek ? "week" : onlyAgenda ? "agenda" : onlyYear ? "year" : void 0;
10145
10195
  const [currentDate, setCurrentDate] = useState(
@@ -10302,7 +10352,13 @@ function EventAgenda({
10302
10352
  currentDate,
10303
10353
  events,
10304
10354
  onEventSelect: handleEventSelect,
10305
- noTime
10355
+ noTime,
10356
+ onEventCreate: allowCellClick ? (d) => onEventUpdate?.({
10357
+ start: d,
10358
+ end: d,
10359
+ title: "Novo Evento",
10360
+ id: crypto.randomUUID()
10361
+ }) : void 0
10306
10362
  }
10307
10363
  ),
10308
10364
  activeView === "week" && /* @__PURE__ */ jsx(
@@ -10311,7 +10367,13 @@ function EventAgenda({
10311
10367
  currentDate,
10312
10368
  events,
10313
10369
  onEventSelect: handleEventSelect,
10314
- noTime
10370
+ noTime,
10371
+ onEventCreate: allowCellClick ? (d) => onEventUpdate?.({
10372
+ start: d,
10373
+ end: d,
10374
+ title: "Novo Evento",
10375
+ id: crypto.randomUUID()
10376
+ }) : void 0
10315
10377
  }
10316
10378
  ),
10317
10379
  activeView === "day" && /* @__PURE__ */ jsx(
@@ -10320,7 +10382,13 @@ function EventAgenda({
10320
10382
  currentDate,
10321
10383
  events,
10322
10384
  onEventSelect: handleEventSelect,
10323
- noTime
10385
+ noTime,
10386
+ onEventCreate: allowCellClick ? (d) => onEventUpdate?.({
10387
+ start: d,
10388
+ end: d,
10389
+ title: "Novo Evento",
10390
+ id: crypto.randomUUID()
10391
+ }) : void 0
10324
10392
  }
10325
10393
  ),
10326
10394
  activeView === "agenda" && /* @__PURE__ */ jsx(
@@ -10329,7 +10397,13 @@ function EventAgenda({
10329
10397
  currentDate,
10330
10398
  events,
10331
10399
  onEventSelect: handleEventSelect,
10332
- noTime
10400
+ noTime,
10401
+ onEventCreate: allowCellClick ? (d) => onEventUpdate?.({
10402
+ start: d,
10403
+ end: d,
10404
+ title: "Novo Evento",
10405
+ id: crypto.randomUUID()
10406
+ }) : void 0
10333
10407
  }
10334
10408
  ),
10335
10409
  activeView === "year" && /* @__PURE__ */ jsx(
@@ -10592,7 +10666,8 @@ function MonthViewAgenda({
10592
10666
  events,
10593
10667
  onEventSelect,
10594
10668
  showUndatedEvents,
10595
- noTime = false
10669
+ noTime = false,
10670
+ onEventCreate
10596
10671
  }) {
10597
10672
  const days = useMemo(() => {
10598
10673
  const monthStart = startOfMonth(currentDate);
@@ -10735,6 +10810,7 @@ function MonthViewAgenda({
10735
10810
  onClick: () => {
10736
10811
  const t = new Date(day);
10737
10812
  t.setHours(DefaultStartHourAgenda, 0, 0);
10813
+ if (onEventCreate) onEventCreate(t);
10738
10814
  },
10739
10815
  children: [
10740
10816
  /* @__PURE__ */ jsx(
@@ -16073,7 +16149,8 @@ var DraggableTooltipComponent = ({
16073
16149
  highlightedSeries,
16074
16150
  toggleHighlight,
16075
16151
  finalColors,
16076
- valueFormatter
16152
+ valueFormatter,
16153
+ seriesTypeMap
16077
16154
  ]
16078
16155
  ),
16079
16156
  /* @__PURE__ */ jsx("div", { className: "mt-3 pt-2 border-t", children: /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground flex items-center gap-1", children: [
@@ -16367,74 +16444,106 @@ var SystemTooltip = ({
16367
16444
  const [localPos, setLocalPos] = useState(position);
16368
16445
  const [dragging, setDragging] = useState(false);
16369
16446
  const offsetRef = useRef({ x: 0, y: 0 });
16370
- const lastMouse = useRef({ x: 0, y: 0 });
16371
- useEffect(() => setLocalPos(position), [position]);
16447
+ const lastPos = useRef({ x: 0, y: 0 });
16448
+ const tooltipRef = useRef(null);
16449
+ const currentPosRef = useRef(position);
16450
+ useEffect(() => {
16451
+ currentPosRef.current = position;
16452
+ setLocalPos(position);
16453
+ }, [position]);
16372
16454
  useEffect(() => {
16373
16455
  let rafId = null;
16374
- const handleMouseMove = (e) => {
16375
- if (!dragging) return;
16376
- lastMouse.current = { x: e.clientX, y: e.clientY };
16456
+ const applyMove = (clientX, clientY) => {
16457
+ lastPos.current = { x: clientX, y: clientY };
16377
16458
  if (rafId) cancelAnimationFrame(rafId);
16378
16459
  rafId = requestAnimationFrame(() => {
16379
- const newLeft = lastMouse.current.x - offsetRef.current.x;
16380
- const newTop = lastMouse.current.y - offsetRef.current.y;
16381
- const rawPosition = {
16382
- top: Math.max(0, Math.min(newTop, window.innerHeight - 200)),
16383
- left: Math.max(0, Math.min(newLeft, window.innerWidth - 320))
16460
+ const p = {
16461
+ top: Math.max(
16462
+ 0,
16463
+ Math.min(
16464
+ lastPos.current.y - offsetRef.current.y,
16465
+ window.innerHeight - 200
16466
+ )
16467
+ ),
16468
+ left: Math.max(
16469
+ 0,
16470
+ Math.min(
16471
+ lastPos.current.x - offsetRef.current.x,
16472
+ window.innerWidth - 320
16473
+ )
16474
+ )
16384
16475
  };
16385
- setLocalPos(rawPosition);
16386
- if (onPositionChange) onPositionChange(id, rawPosition);
16476
+ currentPosRef.current = p;
16477
+ if (tooltipRef.current) {
16478
+ tooltipRef.current.style.top = `${p.top}px`;
16479
+ tooltipRef.current.style.left = `${p.left}px`;
16480
+ }
16481
+ onPositionChange?.(id, p);
16387
16482
  });
16388
16483
  };
16389
- const handleMouseUp = () => {
16390
- if (dragging) {
16391
- setDragging(false);
16392
- if (rafId) cancelAnimationFrame(rafId);
16393
- }
16484
+ const stopDrag = () => {
16485
+ if (!dragging) return;
16486
+ setDragging(false);
16487
+ setLocalPos(currentPosRef.current);
16488
+ if (rafId) cancelAnimationFrame(rafId);
16489
+ };
16490
+ const handleMouseMove = (e) => {
16491
+ if (dragging) applyMove(e.clientX, e.clientY);
16492
+ };
16493
+ const handleTouchMove = (e) => {
16494
+ if (!dragging || !e.touches[0]) return;
16495
+ applyMove(e.touches[0].clientX, e.touches[0].clientY);
16394
16496
  };
16395
16497
  if (dragging) {
16396
16498
  document.addEventListener("mousemove", handleMouseMove, {
16397
16499
  passive: true
16398
16500
  });
16399
- document.addEventListener("mouseup", handleMouseUp);
16501
+ document.addEventListener("mouseup", stopDrag);
16502
+ document.addEventListener("touchmove", handleTouchMove, {
16503
+ passive: true
16504
+ });
16505
+ document.addEventListener("touchend", stopDrag);
16506
+ document.addEventListener("touchcancel", stopDrag);
16400
16507
  document.body.style.cursor = "grabbing";
16401
16508
  document.body.style.userSelect = "none";
16402
16509
  }
16403
16510
  return () => {
16404
16511
  if (rafId) cancelAnimationFrame(rafId);
16405
16512
  document.removeEventListener("mousemove", handleMouseMove);
16406
- document.removeEventListener("mouseup", handleMouseUp);
16513
+ document.removeEventListener("mouseup", stopDrag);
16514
+ document.removeEventListener("touchmove", handleTouchMove);
16515
+ document.removeEventListener("touchend", stopDrag);
16516
+ document.removeEventListener("touchcancel", stopDrag);
16407
16517
  document.body.style.cursor = "";
16408
16518
  document.body.style.userSelect = "";
16409
16519
  };
16410
16520
  }, [dragging, id, onPositionChange]);
16411
- const handleMouseDownLocal = useCallback(
16412
- (e) => {
16413
- e.preventDefault();
16414
- e.stopPropagation();
16415
- const rect = e.currentTarget.closest(".fixed")?.getBoundingClientRect();
16521
+ const startDrag = useCallback(
16522
+ (clientX, clientY, e) => {
16523
+ const rect = tooltipRef.current?.getBoundingClientRect();
16416
16524
  if (!rect) return;
16417
- offsetRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
16525
+ offsetRef.current = { x: clientX - rect.left, y: clientY - rect.top };
16418
16526
  setDragging(true);
16419
16527
  onMouseDown?.(id, e);
16420
16528
  },
16421
16529
  [id, onMouseDown]
16422
16530
  );
16531
+ const handleMouseDownLocal = useCallback(
16532
+ (e) => {
16533
+ e.preventDefault();
16534
+ e.stopPropagation();
16535
+ startDrag(e.clientX, e.clientY, e);
16536
+ },
16537
+ [startDrag]
16538
+ );
16423
16539
  const handleTouchStartLocal = useCallback(
16424
16540
  (e) => {
16425
16541
  e.stopPropagation();
16426
16542
  const touch = e.touches[0];
16427
16543
  if (!touch) return;
16428
- const rect = e.currentTarget.closest(".fixed")?.getBoundingClientRect();
16429
- if (!rect) return;
16430
- offsetRef.current = {
16431
- x: touch.clientX - rect.left,
16432
- y: touch.clientY - rect.top
16433
- };
16434
- setDragging(true);
16435
- onMouseDown?.(id, e);
16544
+ startDrag(touch.clientX, touch.clientY, e);
16436
16545
  },
16437
- [id, onMouseDown]
16546
+ [startDrag]
16438
16547
  );
16439
16548
  const handleConnClick = useCallback(
16440
16549
  (e, conn) => {
@@ -16482,15 +16591,13 @@ var SystemTooltip = ({
16482
16591
  return /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsxs(
16483
16592
  motion.div,
16484
16593
  {
16594
+ ref: tooltipRef,
16485
16595
  className: "fixed bg-card/95 backdrop-blur-md border border-border/50 rounded-xl shadow-2xl z-[10000] w-80 overflow-hidden",
16486
16596
  variants: tooltipVariants2,
16487
16597
  initial: "hidden",
16488
16598
  animate: "visible",
16489
16599
  exit: "exit",
16490
- style: {
16491
- top: localPos.top,
16492
- left: localPos.left
16493
- },
16600
+ style: { top: localPos.top, left: localPos.left },
16494
16601
  onClick: (e) => e.stopPropagation(),
16495
16602
  children: [
16496
16603
  /* @__PURE__ */ jsxs(
@@ -16505,7 +16612,7 @@ var SystemTooltip = ({
16505
16612
  },
16506
16613
  children: [
16507
16614
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3", children: [
16508
- /* @__PURE__ */ jsx("div", { className: "rounded", children: /* @__PURE__ */ jsx(DotsSixVerticalIcon, { size: 16, className: "text-primary" }) }),
16615
+ /* @__PURE__ */ jsx(DotsSixVerticalIcon, { size: 16, className: "text-primary" }),
16509
16616
  /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: title })
16510
16617
  ] }),
16511
16618
  /* @__PURE__ */ jsx(
@@ -16531,22 +16638,19 @@ var SystemTooltip = ({
16531
16638
  ] }) }),
16532
16639
  /* @__PURE__ */ jsxs("div", { className: "px-3 pb-4 space-y-4 max-h-[300px] overflow-y-auto [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-muted-foreground/20 [&::-webkit-scrollbar-thumb]:rounded-full hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/40 transition-colors", children: [
16533
16640
  /* @__PURE__ */ jsx(SeparatorBase, { className: "w-full" }),
16534
- isLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
16535
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
16536
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1", children: [
16537
- /* @__PURE__ */ jsx(SkeletonBase, { className: "w-1.5 h-1.5 rounded-full" }),
16538
- /* @__PURE__ */ jsx(SkeletonBase, { className: "h-3 w-16" })
16539
- ] }),
16540
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(SkeletonBase, { className: "h-10 w-full rounded-lg" }, i)) })
16641
+ isLoading ? /* @__PURE__ */ jsx(Fragment, { children: [1, 2].map((g) => /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
16642
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1", children: [
16643
+ /* @__PURE__ */ jsx(SkeletonBase, { className: "w-1.5 h-1.5 rounded-full" }),
16644
+ /* @__PURE__ */ jsx(SkeletonBase, { className: "h-3 w-16" })
16541
16645
  ] }),
16542
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
16543
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1", children: [
16544
- /* @__PURE__ */ jsx(SkeletonBase, { className: "w-1.5 h-1.5 rounded-full" }),
16545
- /* @__PURE__ */ jsx(SkeletonBase, { className: "h-3 w-16" })
16546
- ] }),
16547
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: [1, 2].map((i) => /* @__PURE__ */ jsx(SkeletonBase, { className: "h-10 w-full rounded-lg" }, i)) })
16548
- ] })
16549
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
16646
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(
16647
+ SkeletonBase,
16648
+ {
16649
+ className: "h-10 w-full rounded-lg"
16650
+ },
16651
+ i
16652
+ )) })
16653
+ ] }, g)) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
16550
16654
  entries.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
16551
16655
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1", children: [
16552
16656
  /* @__PURE__ */ jsx("div", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500" }),
@@ -16561,7 +16665,7 @@ var SystemTooltip = ({
16561
16665
  ] }),
16562
16666
  /* @__PURE__ */ jsx("div", { className: "space-y-1", children: renderConnections(exits, "blue") })
16563
16667
  ] }),
16564
- data.connections.length === 0 && !isLoading && /* @__PURE__ */ jsx("div", { className: "flex flex-col items-center justify-center p-6 text-center", children: /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Nenhuma conex\xE3o encontrada" }) })
16668
+ data.connections.length === 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col items-center justify-center p-6 text-center", children: /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Nenhuma conex\xE3o encontrada" }) })
16565
16669
  ] })
16566
16670
  ] })
16567
16671
  ]
@@ -19944,6 +20048,308 @@ function processNeo4jData(integrations, targetSystemName) {
19944
20048
  connections
19945
20049
  };
19946
20050
  }
20051
+ var AnimatedNumber = ({ value }) => {
20052
+ const [displayed, setDisplayed] = React32__default.useState(value);
20053
+ const prevRef = React32__default.useRef(value);
20054
+ React32__default.useEffect(() => {
20055
+ const start = prevRef.current;
20056
+ const end = value;
20057
+ if (start === end) return;
20058
+ const duration = 420;
20059
+ const startTime = performance.now();
20060
+ const tick = (now) => {
20061
+ const elapsed = now - startTime;
20062
+ const progress = Math.min(elapsed / duration, 1);
20063
+ const eased = progress === 1 ? 1 : 1 - Math.pow(2, -10 * progress);
20064
+ setDisplayed(Math.round(start + (end - start) * eased));
20065
+ if (progress < 1) requestAnimationFrame(tick);
20066
+ else prevRef.current = end;
20067
+ };
20068
+ requestAnimationFrame(tick);
20069
+ }, [value]);
20070
+ return /* @__PURE__ */ jsx(Fragment, { children: displayed });
20071
+ };
20072
+ var Callout = ({
20073
+ sx,
20074
+ sy,
20075
+ mx,
20076
+ my,
20077
+ ex,
20078
+ ey,
20079
+ fill,
20080
+ name,
20081
+ value,
20082
+ percent,
20083
+ isRight
20084
+ }) => /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsxs(
20085
+ motion.g,
20086
+ {
20087
+ initial: { opacity: 0 },
20088
+ animate: { opacity: 1 },
20089
+ exit: { opacity: 0 },
20090
+ transition: { duration: 0.18 },
20091
+ className: "z-9999",
20092
+ children: [
20093
+ /* @__PURE__ */ jsx(
20094
+ motion.path,
20095
+ {
20096
+ d: `M${sx},${sy}L${mx},${my}L${ex},${ey}`,
20097
+ stroke: fill,
20098
+ fill: "none",
20099
+ strokeWidth: 1.5,
20100
+ strokeLinecap: "round",
20101
+ initial: { pathLength: 0, opacity: 0 },
20102
+ animate: { pathLength: 1, opacity: 1 },
20103
+ exit: { pathLength: 0, opacity: 0 },
20104
+ transition: { duration: 0.32, ease: "easeInOut" }
20105
+ }
20106
+ ),
20107
+ /* @__PURE__ */ jsx(
20108
+ motion.circle,
20109
+ {
20110
+ cx: ex,
20111
+ cy: ey,
20112
+ r: 3,
20113
+ fill,
20114
+ initial: { scale: 0, opacity: 0 },
20115
+ animate: { scale: 1, opacity: 1 },
20116
+ exit: { scale: 0, opacity: 0 }
20117
+ }
20118
+ ),
20119
+ /* @__PURE__ */ jsx(
20120
+ "foreignObject",
20121
+ {
20122
+ x: isRight ? ex + 10 : ex - 90,
20123
+ y: ey - 24,
20124
+ width: 90,
20125
+ height: 48,
20126
+ style: { overflow: "visible" },
20127
+ children: /* @__PURE__ */ jsxs(
20128
+ motion.div,
20129
+ {
20130
+ initial: {
20131
+ opacity: 0,
20132
+ x: isRight ? -14 : 14,
20133
+ scale: 0.88,
20134
+ filter: "blur(4px)"
20135
+ },
20136
+ animate: { opacity: 1, x: 0, scale: 1, filter: "blur(0px)" },
20137
+ exit: {
20138
+ opacity: 0,
20139
+ x: isRight ? -8 : 8,
20140
+ scale: 0.92,
20141
+ filter: "blur(3px)"
20142
+ },
20143
+ transition: {
20144
+ type: "spring",
20145
+ stiffness: 460,
20146
+ damping: 26,
20147
+ mass: 0.8
20148
+ },
20149
+ style: { pointerEvents: "none" },
20150
+ children: [
20151
+ /* @__PURE__ */ jsxs(
20152
+ motion.div,
20153
+ {
20154
+ style: {
20155
+ fontSize: 15,
20156
+ fontWeight: 800,
20157
+ color: "#333",
20158
+ lineHeight: 1
20159
+ },
20160
+ initial: { y: 6, opacity: 0 },
20161
+ animate: { y: 0, opacity: 1 },
20162
+ exit: { y: -4, opacity: 0 },
20163
+ transition: {
20164
+ delay: 0.06,
20165
+ type: "spring",
20166
+ stiffness: 400,
20167
+ damping: 22
20168
+ },
20169
+ children: [
20170
+ "PV ",
20171
+ /* @__PURE__ */ jsx(AnimatedNumber, { value })
20172
+ ]
20173
+ }
20174
+ ),
20175
+ /* @__PURE__ */ jsxs(
20176
+ motion.div,
20177
+ {
20178
+ style: { fontSize: 11, color: "#999", marginTop: 5 },
20179
+ initial: { y: 6, opacity: 0 },
20180
+ animate: { y: 0, opacity: 1 },
20181
+ exit: { y: -4, opacity: 0 },
20182
+ transition: {
20183
+ delay: 0.12,
20184
+ type: "spring",
20185
+ stiffness: 400,
20186
+ damping: 22
20187
+ },
20188
+ children: [
20189
+ "Rate ",
20190
+ (percent * 100).toFixed(2),
20191
+ "%"
20192
+ ]
20193
+ }
20194
+ )
20195
+ ]
20196
+ },
20197
+ name
20198
+ )
20199
+ }
20200
+ )
20201
+ ]
20202
+ },
20203
+ name
20204
+ ) });
20205
+ var renderActiveShape = (props) => {
20206
+ const RADIAN = Math.PI / 180;
20207
+ const {
20208
+ cx,
20209
+ cy,
20210
+ midAngle,
20211
+ innerRadius,
20212
+ outerRadius,
20213
+ startAngle,
20214
+ endAngle,
20215
+ fill,
20216
+ payload,
20217
+ percent,
20218
+ value
20219
+ } = props;
20220
+ const sin = Math.sin(-RADIAN * (midAngle ?? 0));
20221
+ const cos = Math.cos(-RADIAN * (midAngle ?? 0));
20222
+ const sx = (cx ?? 0) + ((outerRadius ?? 0) + 10) * cos;
20223
+ const sy = (cy ?? 0) + ((outerRadius ?? 0) + 10) * sin;
20224
+ const mx = (cx ?? 0) + ((outerRadius ?? 0) + 30) * cos;
20225
+ const my = (cy ?? 0) + ((outerRadius ?? 0) + 30) * sin;
20226
+ const ex = mx + (cos >= 0 ? 1 : -1) * 22;
20227
+ const ey = my;
20228
+ return /* @__PURE__ */ jsxs("g", { children: [
20229
+ /* @__PURE__ */ jsx("text", { x: cx, y: cy, dy: 8, textAnchor: "middle", fill, children: payload?.name }),
20230
+ /* @__PURE__ */ jsx(
20231
+ Sector,
20232
+ {
20233
+ cx,
20234
+ cy,
20235
+ innerRadius,
20236
+ outerRadius,
20237
+ startAngle,
20238
+ endAngle,
20239
+ fill
20240
+ }
20241
+ ),
20242
+ /* @__PURE__ */ jsx(
20243
+ Sector,
20244
+ {
20245
+ cx,
20246
+ cy,
20247
+ startAngle,
20248
+ endAngle,
20249
+ innerRadius: (outerRadius ?? 0) + 6,
20250
+ outerRadius: (outerRadius ?? 0) + 10,
20251
+ fill
20252
+ }
20253
+ ),
20254
+ /* @__PURE__ */ jsx(
20255
+ Callout,
20256
+ {
20257
+ sx,
20258
+ sy,
20259
+ mx,
20260
+ my,
20261
+ ex,
20262
+ ey,
20263
+ fill: fill ?? "#8884d8",
20264
+ name: payload?.name,
20265
+ value,
20266
+ percent: percent ?? 0,
20267
+ isRight: cos >= 0
20268
+ }
20269
+ )
20270
+ ] });
20271
+ };
20272
+ var PieChartComponent = ({
20273
+ data,
20274
+ width = 400,
20275
+ height = 300,
20276
+ innerRadius = 60,
20277
+ outerRadius = 80,
20278
+ showLegend = true,
20279
+ showTooltip = true,
20280
+ title,
20281
+ titlePosition = "left",
20282
+ className
20283
+ }) => {
20284
+ const [activeIndex, setActiveIndex] = useState(0);
20285
+ const finalColors = Object.fromEntries(
20286
+ data.map((d) => [d.name, d.color || "#8884d8"])
20287
+ );
20288
+ return /* @__PURE__ */ jsxs(
20289
+ "div",
20290
+ {
20291
+ className: cn(
20292
+ "w-full overflow-hidden min-w-0 rounded-lg border-border bg-card",
20293
+ className
20294
+ ),
20295
+ tabIndex: -1,
20296
+ children: [
20297
+ title && /* @__PURE__ */ jsx(
20298
+ ChartHeader,
20299
+ {
20300
+ title,
20301
+ titlePosition,
20302
+ HORIZONTAL_PADDING_CLASS: "px-6",
20303
+ data,
20304
+ allKeys: data.map((d) => d.name),
20305
+ processedData: data,
20306
+ finalColors,
20307
+ mapperConfig: Object.fromEntries(
20308
+ data.map((d) => [
20309
+ d.name,
20310
+ { label: d.name, color: d.color || "#8884d8" }
20311
+ ])
20312
+ )
20313
+ }
20314
+ ),
20315
+ /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height, children: /* @__PURE__ */ jsxs(
20316
+ PieChart,
20317
+ {
20318
+ width: typeof width === "number" ? width : 400,
20319
+ height,
20320
+ margin: { top: 20, right: 80, bottom: 20, left: 80 },
20321
+ children: [
20322
+ /* @__PURE__ */ jsx(
20323
+ Pie,
20324
+ {
20325
+ activeIndex,
20326
+ activeShape: renderActiveShape,
20327
+ data,
20328
+ dataKey: "value",
20329
+ nameKey: "name",
20330
+ cx: "50%",
20331
+ cy: "50%",
20332
+ innerRadius,
20333
+ outerRadius,
20334
+ fill: "#8884d8",
20335
+ onMouseEnter: (_, index) => setActiveIndex(index),
20336
+ onMouseLeave: () => setActiveIndex(void 0),
20337
+ onClick: (e) => {
20338
+ if (e && e.target && typeof e.target.blur === "function") e.target.blur();
20339
+ },
20340
+ children: data.map((entry, index) => /* @__PURE__ */ jsx(Cell, { fill: entry.color || "#8884d8" }, `cell-${index}`))
20341
+ }
20342
+ ),
20343
+ showLegend && /* @__PURE__ */ jsx(Legend, {}),
20344
+ showTooltip && /* @__PURE__ */ jsx(Tooltip, { content: () => null })
20345
+ ]
20346
+ }
20347
+ ) })
20348
+ ]
20349
+ }
20350
+ );
20351
+ };
20352
+ var PieChart_default = PieChartComponent;
19947
20353
  function NumericInput({
19948
20354
  value,
19949
20355
  onChange,
@@ -20938,12 +21344,23 @@ function CarouselBase({
20938
21344
  setDownloadSuccess(false);
20939
21345
  const currentItem = items[index];
20940
21346
  try {
20941
- const response = await fetch(currentItem.url);
21347
+ const response = await fetch(currentItem.url, { mode: "cors" });
21348
+ if (!response.ok) throw new Error("Erro ao baixar imagem");
20942
21349
  const blob = await response.blob();
20943
21350
  const url = window.URL.createObjectURL(blob);
20944
21351
  const link = document.createElement("a");
20945
21352
  link.href = url;
20946
- link.download = currentItem.title || "image";
21353
+ let ext = "";
21354
+ try {
21355
+ const urlObj = new URL(currentItem.url, window.location.href);
21356
+ const path = urlObj.pathname;
21357
+ ext = path.substring(path.lastIndexOf("."));
21358
+ if (!ext || ext.length > 6) ext = "";
21359
+ } catch {
21360
+ }
21361
+ let filename = currentItem.title || "image";
21362
+ if (ext && !filename.endsWith(ext)) filename += ext;
21363
+ link.download = filename;
20947
21364
  document.body.appendChild(link);
20948
21365
  link.click();
20949
21366
  document.body.removeChild(link);
@@ -20952,6 +21369,9 @@ function CarouselBase({
20952
21369
  setDownloadSuccess(true);
20953
21370
  setTimeout(() => setDownloadSuccess(false), 2e3);
20954
21371
  } catch (error) {
21372
+ alert(
21373
+ "Erro ao baixar imagem. Verifique a URL ou permiss\xF5es do servidor."
21374
+ );
20955
21375
  console.error("Error downloading image:", error);
20956
21376
  setIsDownloading(false);
20957
21377
  }
@@ -20993,8 +21413,13 @@ function CarouselBase({
20993
21413
  {
20994
21414
  src: item.url,
20995
21415
  alt: item.title,
20996
- className: cn("w-full h-full select-none"),
20997
- imageClassName,
21416
+ className: cn(
21417
+ "w-full h-full select-none object-contain"
21418
+ ),
21419
+ imageClassName: cn(
21420
+ "object-contain w-full h-full",
21421
+ imageClassName
21422
+ ),
20998
21423
  borderRadius: 8,
20999
21424
  maxZoom: 3
21000
21425
  }
@@ -21808,6 +22233,22 @@ function GroupLabel({ group }) {
21808
22233
  /* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold text-muted-foreground uppercase tracking-widest", children: group.label })
21809
22234
  ] });
21810
22235
  }
22236
+ function HighlightText({ text, query }) {
22237
+ if (!query || !query.trim()) return /* @__PURE__ */ jsx(Fragment, { children: text });
22238
+ const terms = query.split(/[, ]+/).map((t) => t.trim()).filter((t) => t.length > 0);
22239
+ if (terms.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: text });
22240
+ const escapedTerms = terms.map(
22241
+ (t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
22242
+ );
22243
+ const regex = new RegExp(`(${escapedTerms.join("|")})`, "gi");
22244
+ const parts = text.split(regex);
22245
+ return /* @__PURE__ */ jsx(Fragment, { children: parts.map((part, i) => {
22246
+ const isMatch = terms.some(
22247
+ (t) => t.toLowerCase() === part.toLowerCase()
22248
+ );
22249
+ return isMatch ? /* @__PURE__ */ jsx("span", { className: "text-primary font-semibold", children: part }, i) : /* @__PURE__ */ jsx("span", { children: part }, i);
22250
+ }) });
22251
+ }
21811
22252
  function mapBadgeVariantToColor(variant) {
21812
22253
  if (!variant) return void 0;
21813
22254
  switch (variant) {
@@ -21834,44 +22275,61 @@ function mapBadgeVariantToColor(variant) {
21834
22275
  function CommandItemRow({
21835
22276
  item,
21836
22277
  isActive,
22278
+ isSelected,
22279
+ multiSelect,
21837
22280
  onSelect,
21838
- onHover
22281
+ onToggleSelection,
22282
+ onHover,
22283
+ searchQuery
21839
22284
  }) {
21840
22285
  return /* @__PURE__ */ jsxs(
21841
22286
  motion.button,
21842
22287
  {
21843
22288
  layout: true,
21844
- onClick: onSelect,
22289
+ onClick: (e) => {
22290
+ if (multiSelect && onToggleSelection && (e.ctrlKey || e.metaKey || e.shiftKey)) {
22291
+ onToggleSelection(e);
22292
+ } else {
22293
+ onSelect(e);
22294
+ }
22295
+ },
21845
22296
  onMouseEnter: onHover,
21846
22297
  className: `
21847
- w-full flex items-center gap-1 px-2 py-1 rounded-md text-left cursor-pointer
22298
+ w-full flex items-center gap-1 px-2 py-1 rounded-md text-left cursor-pointer
21848
22299
  transition-colors duration-75 group relative
21849
- ${isActive ? "text-accent-foreground hover:bg-accent" : "hover:bg-accent hover:text-accent-foreground"}
22300
+ ${isActive ? "text-accent-foreground bg-accent" : "hover:bg-accent hover:text-accent-foreground"}
21850
22301
  `,
21851
22302
  children: [
21852
22303
  item.icon && /* @__PURE__ */ jsx(
21853
22304
  "span",
21854
22305
  {
21855
22306
  className: `relative flex-shrink-0 w-8 h-8 flex items-center justify-center rounded-md text-base
21856
- ${isActive ? "bg-primary/20 text-primary" : "bg-muted text-muted-foreground group-hover:text-foreground"}`,
22307
+ ${isSelected ? "bg-primary text-primary-foreground" : isActive ? "bg-primary/20 text-primary" : "bg-muted text-muted-foreground group-hover:text-foreground"}`,
21857
22308
  children: item.icon
21858
22309
  }
21859
22310
  ),
21860
22311
  /* @__PURE__ */ jsxs("div", { className: "relative flex-1 min-w-0 px-1", children: [
21861
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [
22312
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [
21862
22313
  /* @__PURE__ */ jsx(
21863
22314
  "span",
21864
22315
  {
21865
22316
  className: `text-sm font-medium truncate ${isActive ? "text-foreground" : "text-foreground/80"}`,
21866
- children: item.label
22317
+ children: /* @__PURE__ */ jsx(HighlightText, { text: item.label, query: searchQuery })
21867
22318
  }
21868
22319
  ),
21869
22320
  item.badge && /* @__PURE__ */ jsx(Badge, { color: mapBadgeVariantToColor(item.badgeVariant), children: item.badge.toUpperCase() })
21870
22321
  ] }),
21871
- item.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground truncate", children: item.description })
22322
+ item.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground truncate", children: /* @__PURE__ */ jsx(HighlightText, { text: item.description, query: searchQuery }) })
21872
22323
  ] }),
21873
22324
  item.shortcut && /* @__PURE__ */ jsx("div", { className: "relative hidden sm:flex items-center gap-1 flex-shrink-0", children: item.shortcut.map((k, i) => /* @__PURE__ */ jsx(Kbd, { children: k }, i)) }),
21874
- isActive && /* @__PURE__ */ jsx(
22325
+ isSelected && /* @__PURE__ */ jsx(
22326
+ motion.div,
22327
+ {
22328
+ layoutId: `selected-indicator-${item.id}`,
22329
+ className: "absolute left-0 top-1/2 -translate-y-1/2 w-1 h-2/3 bg-primary rounded-r-md"
22330
+ }
22331
+ ),
22332
+ isActive && !isSelected && /* @__PURE__ */ jsx(
21875
22333
  CaretRightIcon,
21876
22334
  {
21877
22335
  className: "relative w-4 h-4 text-primary flex-shrink-0",
@@ -21891,22 +22349,40 @@ function useCommandPalette({
21891
22349
  recentItems = [],
21892
22350
  onRecentItemsChange,
21893
22351
  maxRecentItems = 5,
21894
- multiSearch = false
22352
+ multiSearch = false,
22353
+ multiSelect = false,
22354
+ onSelectMultiple
21895
22355
  }) {
21896
22356
  const [query, setQuery] = React32.useState("");
21897
22357
  const [activeIndex, setActiveIndex] = React32.useState(0);
21898
22358
  const [page, setPage] = React32.useState(0);
22359
+ const [selectedItemIds, setSelectedItemIds] = React32.useState(
22360
+ /* @__PURE__ */ new Set()
22361
+ );
22362
+ const toggleSelection = React32.useCallback((id) => {
22363
+ setSelectedItemIds((prev) => {
22364
+ const next = new Set(prev);
22365
+ if (next.has(id)) next.delete(id);
22366
+ else next.add(id);
22367
+ return next;
22368
+ });
22369
+ }, []);
22370
+ const clearSelection = React32.useCallback(
22371
+ () => setSelectedItemIds(/* @__PURE__ */ new Set()),
22372
+ []
22373
+ );
21899
22374
  const baseGroups = React32.useMemo(
21900
22375
  () => normaliseGroups(items, groups),
21901
22376
  [items, groups]
21902
22377
  );
21903
- React32.useEffect(() => {
22378
+ useEffect(() => {
21904
22379
  if (open) {
21905
22380
  setQuery("");
21906
22381
  setActiveIndex(0);
21907
22382
  setPage(0);
22383
+ clearSelection();
21908
22384
  }
21909
- }, [open]);
22385
+ }, [open, clearSelection]);
21910
22386
  const searchTerms = React32.useMemo(() => {
21911
22387
  const parts = query.split(",");
21912
22388
  if (parts.length <= 1 && !multiSearch) return [];
@@ -21969,12 +22445,35 @@ function useCommandPalette({
21969
22445
  () => displayedGroups.flatMap((g) => g.items),
21970
22446
  [displayedGroups]
21971
22447
  );
22448
+ const selectedItems = useMemo(
22449
+ () => allFlatItems.filter((i) => selectedItemIds.has(i.id)),
22450
+ [allFlatItems, selectedItemIds]
22451
+ );
21972
22452
  const pageItemCount = flatItems.length;
21973
22453
  useEffect(() => {
21974
22454
  setActiveIndex((i) => Math.min(i, Math.max(pageItemCount - 1, 0)));
21975
22455
  }, [pageItemCount]);
21976
- function handleSelect(item) {
22456
+ function executeBulkAction() {
22457
+ if (!onSelectMultiple || selectedItems.length === 0) return;
22458
+ onSelectMultiple(selectedItems);
22459
+ onOpenChange?.(false);
22460
+ }
22461
+ function handleSelect(item, event) {
21977
22462
  if (!item) return;
22463
+ if (multiSelect) {
22464
+ if (event && ("ctrlKey" in event || "metaKey" in event || "shiftKey" in event) && (event.ctrlKey || event.metaKey || event.shiftKey)) {
22465
+ toggleSelection(item.id);
22466
+ return;
22467
+ }
22468
+ if (selectedItems.length > 0) {
22469
+ const itemsToSubmit = selectedItemIds.has(item.id) ? selectedItems : [...selectedItems, item];
22470
+ if (onSelectMultiple) {
22471
+ onSelectMultiple(itemsToSubmit);
22472
+ }
22473
+ onOpenChange?.(false);
22474
+ return;
22475
+ }
22476
+ }
21978
22477
  item.onSelect();
21979
22478
  onOpenChange?.(false);
21980
22479
  if (onRecentItemsChange) {
@@ -22007,12 +22506,26 @@ function useCommandPalette({
22007
22506
  }
22008
22507
  } else if (e.key === "Enter") {
22009
22508
  e.preventDefault();
22010
- handleSelect(flatItems[activeIndex]);
22509
+ if (multiSelect && (e.ctrlKey || e.metaKey)) {
22510
+ executeBulkAction();
22511
+ return;
22512
+ }
22513
+ handleSelect(flatItems[activeIndex], e);
22011
22514
  }
22012
22515
  };
22013
22516
  document.addEventListener("keydown", handler);
22014
22517
  return () => document.removeEventListener("keydown", handler);
22015
- }, [open, flatItems, activeIndex, pageItemCount, page, totalPages]);
22518
+ }, [
22519
+ open,
22520
+ flatItems,
22521
+ activeIndex,
22522
+ pageItemCount,
22523
+ page,
22524
+ totalPages,
22525
+ executeBulkAction,
22526
+ handleSelect,
22527
+ multiSelect
22528
+ ]);
22016
22529
  return {
22017
22530
  query,
22018
22531
  setQuery,
@@ -22028,6 +22541,10 @@ function useCommandPalette({
22028
22541
  totalItems,
22029
22542
  totalPages,
22030
22543
  handleSelect,
22544
+ selectedItemIds,
22545
+ toggleSelection,
22546
+ selectedItems,
22547
+ executeBulkAction,
22031
22548
  isEmpty: totalItems === 0 && query.trim().length > 0,
22032
22549
  showList: query.trim() !== "" || recentItems.length > 0
22033
22550
  };
@@ -22087,8 +22604,12 @@ var VirtualResultList = memo(
22087
22604
  displayedGroups,
22088
22605
  flatItems,
22089
22606
  activeIndex,
22607
+ multiSelect,
22608
+ selectedItemIds,
22090
22609
  onHover,
22091
- onSelect
22610
+ onSelect,
22611
+ onToggleSelection,
22612
+ searchQuery
22092
22613
  }) => {
22093
22614
  const rows = useMemo(() => {
22094
22615
  const acc = [];
@@ -22126,7 +22647,7 @@ var VirtualResultList = memo(
22126
22647
  ref: listRef,
22127
22648
  className: "overflow-y-auto overscroll-contain px-2 py-1 [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-muted-foreground/30 [&::-webkit-scrollbar-thumb]:rounded-full hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/50 transition-colors",
22128
22649
  style: { maxHeight: `min(${LIST_MAX_HEIGHT}px, 60vh)` },
22129
- children: /* @__PURE__ */ jsx("div", { style: { height: totalSize, position: "relative" }, children: virtualItems.map((vItem) => {
22650
+ children: /* @__PURE__ */ jsx("div", { style: { height: totalSize, position: "relative", width: "100%" }, children: virtualItems.map((vItem) => {
22130
22651
  const row = rows[vItem.index];
22131
22652
  return /* @__PURE__ */ jsx(
22132
22653
  "div",
@@ -22135,17 +22656,22 @@ var VirtualResultList = memo(
22135
22656
  ref: virtualizer.measureElement,
22136
22657
  style: {
22137
22658
  position: "absolute",
22138
- top: vItem.start,
22659
+ top: 0,
22139
22660
  left: 0,
22140
- right: 0
22661
+ width: "100%",
22662
+ transform: `translateY(${vItem.start}px)`
22141
22663
  },
22142
22664
  children: row.kind === "label" ? /* @__PURE__ */ jsx(GroupLabel, { group: row.group }) : /* @__PURE__ */ jsx("div", { "data-active": row.globalIdx === activeIndex, children: /* @__PURE__ */ jsx(
22143
22665
  CommandItemRow,
22144
22666
  {
22145
22667
  item: row.item,
22146
22668
  isActive: row.globalIdx === activeIndex,
22669
+ isSelected: selectedItemIds.has(row.item.id),
22670
+ multiSelect,
22147
22671
  onHover: () => onHover(row.globalIdx),
22148
- onSelect: () => onSelect(row.item)
22672
+ onSelect: (e) => onSelect(row.item, e),
22673
+ onToggleSelection: (e) => onToggleSelection(row.item.id, e),
22674
+ searchQuery
22149
22675
  }
22150
22676
  ) })
22151
22677
  },
@@ -22157,30 +22683,55 @@ var VirtualResultList = memo(
22157
22683
  }
22158
22684
  );
22159
22685
  VirtualResultList.displayName = "VirtualResultList";
22160
- var FooterBar = memo(({ footer, totalItems }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-t border-border bg-muted/30", children: [
22161
- footer ?? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-[11px] text-muted-foreground", children: [
22162
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22163
- /* @__PURE__ */ jsx(ArrowElbowDownRightIcon, { className: "w-3 h-3" }),
22164
- "Selecionar"
22165
- ] }),
22166
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22167
- /* @__PURE__ */ jsx("span", { className: "font-mono", children: "\u2191\u2193" }),
22168
- "Navegar"
22169
- ] }),
22170
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22171
- /* @__PURE__ */ jsx(ArrowBendUpLeftIcon, { className: "w-3 h-3" }),
22172
- "Fechar"
22173
- ] })
22174
- ] }),
22175
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-[11px] text-muted-foreground", children: [
22176
- /* @__PURE__ */ jsx(CommandIcon, { className: "w-3 h-3" }),
22177
- /* @__PURE__ */ jsxs("span", { children: [
22178
- totalItems,
22179
- " resultado",
22180
- totalItems !== 1 ? "s" : ""
22686
+ var FooterBar = memo(
22687
+ ({
22688
+ footer,
22689
+ totalItems,
22690
+ selectedCount = 0,
22691
+ executeBulkAction
22692
+ }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-t border-border bg-muted/30", children: [
22693
+ footer ?? /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4 text-[11px] text-muted-foreground", children: selectedCount > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
22694
+ /* @__PURE__ */ jsxs(
22695
+ "button",
22696
+ {
22697
+ onClick: executeBulkAction,
22698
+ className: "flex items-center gap-1.5 text-primary hover:text-primary/80 transition-colors font-medium cursor-pointer",
22699
+ children: [
22700
+ /* @__PURE__ */ jsx(CommandIcon, { className: "w-3 h-3" }),
22701
+ " Confirmar (",
22702
+ selectedCount,
22703
+ ")"
22704
+ ]
22705
+ }
22706
+ ),
22707
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22708
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] px-1 bg-muted rounded border", children: "Ctrl+Enter" }),
22709
+ "Finalizar sele\xE7\xE3o"
22710
+ ] })
22711
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
22712
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22713
+ /* @__PURE__ */ jsx(ArrowElbowDownRightIcon, { className: "w-3 h-3" }),
22714
+ "Selecionar"
22715
+ ] }),
22716
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22717
+ /* @__PURE__ */ jsx("span", { className: "font-mono", children: "\u2191\u2193" }),
22718
+ "Navegar"
22719
+ ] }),
22720
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
22721
+ /* @__PURE__ */ jsx(ArrowBendUpLeftIcon, { className: "w-3 h-3" }),
22722
+ "Fechar"
22723
+ ] })
22724
+ ] }) }),
22725
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-[11px] text-muted-foreground", children: [
22726
+ /* @__PURE__ */ jsx(CommandIcon, { className: "w-3 h-3" }),
22727
+ /* @__PURE__ */ jsxs("span", { children: [
22728
+ totalItems,
22729
+ " resultado",
22730
+ totalItems !== 1 ? "s" : ""
22731
+ ] })
22181
22732
  ] })
22182
22733
  ] })
22183
- ] }));
22734
+ );
22184
22735
  FooterBar.displayName = "FooterBar";
22185
22736
  function CommandPalette(props) {
22186
22737
  const {
@@ -22190,6 +22741,7 @@ function CommandPalette(props) {
22190
22741
  footer,
22191
22742
  debounceDelay = 300,
22192
22743
  multiSearch = false,
22744
+ multiSelect = false,
22193
22745
  emptyMessage = "Nenhum resultado encontrado.",
22194
22746
  shortcut = { key: "k", ctrl: true }
22195
22747
  } = props;
@@ -22206,13 +22758,16 @@ function CommandPalette(props) {
22206
22758
  flatItems,
22207
22759
  totalItems,
22208
22760
  handleSelect,
22761
+ selectedItemIds,
22762
+ toggleSelection,
22763
+ executeBulkAction,
22209
22764
  isEmpty,
22210
22765
  showList
22211
22766
  } = useCommandPalette({
22212
22767
  ...props,
22213
- open: isMobile ? true : props.open
22768
+ open: props.open
22214
22769
  });
22215
- useKeyboardShortcut(shortcut.key, () => onOpenChange(!open), {
22770
+ useKeyboardShortcut(shortcut.key, () => onOpenChange?.(!open), {
22216
22771
  ctrl: shortcut.ctrl,
22217
22772
  meta: shortcut.meta,
22218
22773
  shift: shortcut.shift,
@@ -22221,7 +22776,7 @@ function CommandPalette(props) {
22221
22776
  useEffect(() => {
22222
22777
  if (!open) return;
22223
22778
  const handleEscape = (e) => {
22224
- if (e.key === "Escape") onOpenChange(false);
22779
+ if (e.key === "Escape") onOpenChange?.(false);
22225
22780
  };
22226
22781
  document.addEventListener("keydown", handleEscape);
22227
22782
  return () => document.removeEventListener("keydown", handleEscape);
@@ -22248,11 +22803,11 @@ function CommandPalette(props) {
22248
22803
  (val) => {
22249
22804
  setQuery(val);
22250
22805
  setActiveIndex(0);
22251
- if (!open && val.trim() !== "") onOpenChange(true);
22806
+ if (!open && val.trim() !== "") onOpenChange?.(true);
22252
22807
  },
22253
22808
  [setQuery, setActiveIndex, open, onOpenChange]
22254
22809
  );
22255
- const handleClose = useCallback(() => onOpenChange(false), [onOpenChange]);
22810
+ const handleClose = useCallback(() => onOpenChange?.(false), [onOpenChange]);
22256
22811
  const handleClearQuery = useCallback(() => setQuery(""), [setQuery]);
22257
22812
  const searchPlaceholder = multiSearch ? "Buscar\u2026 (separe termos por v\xEDrgula)" : placeholder;
22258
22813
  const sharedListProps = {
@@ -22262,49 +22817,65 @@ function CommandPalette(props) {
22262
22817
  displayedGroups,
22263
22818
  flatItems,
22264
22819
  activeIndex,
22820
+ multiSelect,
22821
+ selectedItemIds,
22265
22822
  onHover: setActiveIndex,
22266
- onSelect: handleSelect
22823
+ onSelect: handleSelect,
22824
+ onToggleSelection: toggleSelection,
22825
+ searchQuery: query
22267
22826
  };
22268
22827
  if (isMobile) {
22269
- return /* @__PURE__ */ jsxs(Fragment, { children: [
22270
- /* @__PURE__ */ jsx("div", { className: "fixed top-0 left-0 right-0 z-[100] px-3 py-2 bg-background", children: /* @__PURE__ */ jsx(
22271
- DebouncedInput,
22828
+ return /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsxs(Fragment, { children: [
22829
+ /* @__PURE__ */ jsxs(
22830
+ motion.div,
22272
22831
  {
22273
- ref: inputRef,
22274
- value: query,
22275
- debounce: debounceDelay,
22276
- onChange: handleQueryChangeMobile,
22277
- placeholder: searchPlaceholder
22832
+ initial: { opacity: 0, y: -20 },
22833
+ animate: { opacity: 1, y: 0 },
22834
+ exit: { opacity: 0, y: -20 },
22835
+ className: "fixed top-0 left-0 right-0 z-[100] px-4 py-3 bg-background border-b border-border shadow-sm flex items-center gap-3",
22836
+ children: [
22837
+ /* @__PURE__ */ jsx(MagnifyingGlassIcon, { className: "w-5 h-5 text-muted-foreground" }),
22838
+ /* @__PURE__ */ jsx(
22839
+ DebouncedInput,
22840
+ {
22841
+ ref: inputRef,
22842
+ value: query,
22843
+ debounce: debounceDelay,
22844
+ onChange: handleQueryChangeMobile,
22845
+ placeholder: searchPlaceholder,
22846
+ className: "flex-1 bg-transparent border-none shadow-none focus-visible:ring-0 p-0 text-base"
22847
+ }
22848
+ ),
22849
+ query && /* @__PURE__ */ jsx(ButtonBase, { variant: "ghost", size: "icon", onClick: handleClearQuery, className: "h-8 w-8", children: /* @__PURE__ */ jsx(XIcon, { className: "w-4 h-4" }) })
22850
+ ]
22278
22851
  }
22279
- ) }),
22280
- /* @__PURE__ */ jsx(AnimatePresence, { children: showList && /* @__PURE__ */ jsxs(Fragment, { children: [
22281
- /* @__PURE__ */ jsx(
22282
- motion.div,
22283
- {
22284
- initial: { opacity: 0 },
22285
- animate: { opacity: 1 },
22286
- exit: { opacity: 0 },
22287
- transition: ANIMATION.overlay,
22288
- className: "fixed inset-0 z-[98] bg-background/60 backdrop-blur-[2px]",
22289
- onClick: handleClose
22290
- }
22291
- ),
22292
- /* @__PURE__ */ jsxs(
22293
- motion.div,
22294
- {
22295
- initial: { opacity: 0, y: -6 },
22296
- animate: { opacity: 1, y: 0 },
22297
- exit: { opacity: 0, y: -6 },
22298
- transition: ANIMATION.mobilePanel,
22299
- className: "fixed left-3 right-3 z-[99] bg-popover border border-border rounded-lg shadow-2xl shadow-black/20 dark:shadow-black/50 overflow-hidden top-14",
22300
- children: [
22301
- /* @__PURE__ */ jsx(SearchBadges, { terms: searchTerms }),
22302
- /* @__PURE__ */ jsx(VirtualResultList, { ...sharedListProps })
22303
- ]
22304
- }
22305
- )
22306
- ] }) })
22307
- ] });
22852
+ ),
22853
+ /* @__PURE__ */ jsx(
22854
+ motion.div,
22855
+ {
22856
+ initial: { opacity: 0 },
22857
+ animate: { opacity: 1 },
22858
+ exit: { opacity: 0 },
22859
+ transition: ANIMATION.overlay,
22860
+ className: "fixed inset-0 z-[98] bg-background/80 backdrop-blur-md",
22861
+ onClick: handleClose
22862
+ }
22863
+ ),
22864
+ showList && /* @__PURE__ */ jsxs(
22865
+ motion.div,
22866
+ {
22867
+ initial: { opacity: 0, y: 10 },
22868
+ animate: { opacity: 1, y: 0 },
22869
+ exit: { opacity: 0, y: 10 },
22870
+ transition: ANIMATION.mobilePanel,
22871
+ className: "fixed inset-x-0 bottom-0 top-[60px] z-[99] bg-background overflow-hidden flex flex-col",
22872
+ children: [
22873
+ /* @__PURE__ */ jsx(SearchBadges, { terms: searchTerms }),
22874
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsx(VirtualResultList, { ...sharedListProps }) })
22875
+ ]
22876
+ }
22877
+ )
22878
+ ] }) });
22308
22879
  }
22309
22880
  return /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsxs(Fragment, { children: [
22310
22881
  /* @__PURE__ */ jsx(
@@ -22313,8 +22884,7 @@ function CommandPalette(props) {
22313
22884
  initial: { opacity: 0 },
22314
22885
  animate: { opacity: 1 },
22315
22886
  exit: { opacity: 0 },
22316
- transition: ANIMATION.overlay,
22317
- className: "fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm",
22887
+ className: "fixed inset-0 z-[99] bg-black/40 backdrop-blur-sm",
22318
22888
  onClick: handleClose
22319
22889
  }
22320
22890
  ),
@@ -22325,17 +22895,11 @@ function CommandPalette(props) {
22325
22895
  animate: { opacity: 1, scale: 1, y: 0 },
22326
22896
  exit: { opacity: 0, scale: 0.96, y: -8 },
22327
22897
  transition: ANIMATION.panel,
22328
- className: "fixed z-[100] top-12 -translate-x-1/2 -translate-y-1/2 w-full max-w-xl rounded-xl border border-border overflow-hidden shadow-2xl shadow-black/20 dark:shadow-black/60 bg-popover/95 backdrop-blur-xl",
22898
+ className: "fixed z-[100] top-4 -translate-x-1/2 w-full max-w-xl rounded-xl border border-border overflow-hidden shadow-2xl shadow-black/20 dark:shadow-black/60 bg-popover/95 backdrop-blur-xl",
22329
22899
  style: { maxHeight: "min(600px, 80vh)" },
22330
22900
  children: [
22331
22901
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-2 border-b border-border", children: [
22332
- /* @__PURE__ */ jsx(
22333
- MagnifyingGlassIcon,
22334
- {
22335
- className: "w-4 h-4 text-muted-foreground flex-shrink-0",
22336
- weight: "bold"
22337
- }
22338
- ),
22902
+ /* @__PURE__ */ jsx(MagnifyingGlassIcon, { className: "w-4 h-4 text-muted-foreground flex-shrink-0", weight: "bold" }),
22339
22903
  /* @__PURE__ */ jsx(
22340
22904
  DebouncedInput,
22341
22905
  {
@@ -22360,11 +22924,19 @@ function CommandPalette(props) {
22360
22924
  ] }),
22361
22925
  /* @__PURE__ */ jsx(SearchBadges, { terms: searchTerms }),
22362
22926
  showList && /* @__PURE__ */ jsx(VirtualResultList, { ...sharedListProps }),
22363
- /* @__PURE__ */ jsx(FooterBar, { footer, totalItems })
22927
+ /* @__PURE__ */ jsx(
22928
+ FooterBar,
22929
+ {
22930
+ footer,
22931
+ totalItems,
22932
+ selectedCount: selectedItemIds.size,
22933
+ executeBulkAction
22934
+ }
22935
+ )
22364
22936
  ]
22365
22937
  }
22366
22938
  )
22367
22939
  ] }) });
22368
22940
  }
22369
22941
 
22370
- export { AddButton, Agenda, AgendaDaysToShow, AgendaDaysToShowAgenda, AgendaView, AlertDialogActionBase, AlertDialogBase, AlertDialogCancelBase, AlertDialogContentBase, AlertDialogDescriptionBase, AlertDialogFooterBase, AlertDialogHeaderBase, AlertDialogOverlayBase, AlertDialogPortalBase, AlertDialogTitleBase, AlertDialogTriggerBase, AvatarBase, AvatarCombobox, AvatarFallbackBase, AvatarImageBase, BackButton, Badge, BreadcrumbBase, BreadcrumbEllipsisBase, BreadcrumbItemBase, BreadcrumbLinkBase, BreadcrumbListBase, BreadcrumbPageBase, BreadcrumbSeparatorBase, Brush_default as Brush, ButtonBase, ButtonGroupBase, CENTER_INDEX, CalendarBase, CalendarDndProvider, CalendarDndProviderAgenda, CardBase, CardContentBase, CardDescriptionBase, CardFooterBase, CardHeaderBase, CardTitleBase, CarouselBase, ChangeButton, Chart_default as Chart, ChartControls, ChartHeader, ChartTotalLegend_default as ChartTotalLegend, CheckButton, CheckboxBase, CheckboxTree, CircularProgress, CloseAllButton_default as CloseAllButton, CloseButton, CodeBlock, CollapsibleBase, CollapsibleContentBase, CollapsibleTriggerBase, Combobox, CommandBase, CommandDebouncedInputBase, CommandDialogBase, CommandEmptyBase, CommandGroupBase, CommandInputBase, CommandItemBase, CommandItemRow, CommandListBase, CommandPalette, CommandSeparatorBase, CommandShortcutBase, ContextMenuBase, ContextMenuCheckboxItemBase, ContextMenuContentBase, ContextMenuGroupBase, ContextMenuItemBase, ContextMenuLabelBase, ContextMenuPortalBase, ContextMenuRadioGroupBase, ContextMenuRadioItemBase, ContextMenuSeparatorBase, ContextMenuShortcutBase, ContextMenuSubBase, ContextMenuSubContentBase, ContextMenuSubTriggerBase, ContextMenuTriggerBase, ControlledCombobox, CopyButton, DateTimePicker, DayView, DayViewAgenda, DebouncedInput, DefaultEndHour, DefaultEndHourAgenda, DefaultStartHour, DefaultStartHourAgenda, DestructiveDialog, DialogBase, DialogCloseBase, DialogContentBase, DialogDescriptionBase, DialogFooterBase, DialogHeaderBase, DialogOverlayBase, DialogPortalBase, DialogTitleBase, DialogTriggerBase, DownloadButton, DraggableEvent2 as DraggableEvent, DraggableTooltip_default as DraggableTooltip, DrawerBase, DrawerCloseBase, DrawerContentBase, DrawerDescriptionBase, DrawerFooterBase, DrawerHeaderBase, DrawerOverlayBase, DrawerPortalBase, DrawerTitleBase, DrawerTriggerBase, DropDownMenuBase, DropDownMenuCheckboxItemBase, DropDownMenuContentBase, DropDownMenuGroupBase, DropDownMenuItemBase, DropDownMenuLabelBase, DropDownMenuPortalBase, DropDownMenuRadioGroupBase, DropDownMenuRadioItemBase, DropDownMenuSeparatorBase, DropDownMenuShortcutBase, DropDownMenuSubBase, DropDownMenuSubContentBase, DropDownMenuSubTriggerBase, DropDownMenuTriggerBase, DroppableCell, DroppableCellAgenda, EditButton, EndHour, EndHourAgenda, ErrorMessage_default as ErrorMessage, EventAgenda, EventCalendar, EventDetailModalAgenda, EventDialog, EventGap, EventGapAgenda, EventHeight, EventHeightAgenda, EventItem, EventItemAgenda, EventsPopup, FavoriteButton, FileAccept, FileUploader, FilterButton, GroupLabel, HideButton, Highlights_default as Highlights, HorizontalChart_default as HorizontalChart, HorizontalLegend_default as HorizontalLegend, HoverCardBase, HoverCardContentBase, HoverCardTriggerBase, ITEM_HEIGHT, InputBase, InputOTPBase, InputOTPGroupBase, InputOTPSeparatorBase, InputOTPSlotBase, IntegrationModal_default as IntegrationModal, Kbd, KbdGroup, LabelBase_default as LabelBase, Leaderboard, LikeButton, LoadingBase, LockButton, ModalBase, ModalCloseBase, ModalContentBase, ModalDescriptionBase, ModalFooterBase, ModalHeaderBase, ModalOverlayBase, ModalPortalBase, ModalTitleBase, ModalTriggerBase, ModeToggleBase, MonthView, MonthViewAgenda, MoreButton, MultiCombobox, MultiDayOverlay, MultiSelect, MultiSelectBase, MultiSelectContentBase, MultiSelectGroupBase, MultiSelectItemBase, MultiSelectSeparatorBase, MultiSelectTriggerBase, MultiSelectValueBase, NavigationMenuBase, NavigationMenuContentBase, NavigationMenuIndicatorBase, NavigationMenuItemBase, NavigationMenuLinkBase, NavigationMenuListBase, NavigationMenuTriggerBase, NavigationMenuViewportBase, NoData_default as NoData, NotificationButton, NumericInput, PeriodsDropdown_default as PeriodsDropdown, PopoverAnchorBase, PopoverBase, PopoverContentBase, PopoverTriggerBase, ProgressBase, ProgressCirclesBase, ProgressPanelsBase, ProgressSegmentsBase, RadialMenu, RangePicker, RefreshButton, SaveButton, ScrollAreaBase, ScrollBarBase, SearchButton, Select, SelectBase, SelectContentBase, SelectEmpty, SelectGroupBase, SelectItemBase, SelectLabelBase, SelectScrollDownButtonBase, SelectScrollUpButtonBase, SelectSeparatorBase, SelectTriggerBase, SelectValueBase, SeparatorBase, SettingsButton, SheetBase, SheetCloseBase, SheetContentBase, SheetDescriptionBase, SheetFooterBase, SheetHeaderBase, SheetOverlayBase, SheetPortalBase, SheetTitleBase, SheetTriggerBase, ShowOnly_default as ShowOnly, SidebarBase, SidebarContentBase, SidebarFooterBase, SidebarGroupActionBase, SidebarGroupBase, SidebarGroupContentBase, SidebarGroupLabelBase, SidebarHeaderBase, SidebarInputBase, SidebarInsetBase, SidebarMenuActionBase, SidebarMenuBadgeBase, SidebarMenuBase, SidebarMenuButtonBase, SidebarMenuItemBase, SidebarMenuSkeletonBase, SidebarMenuSubBase, SidebarMenuSubButtonBase, SidebarMenuSubItemBase, SidebarProviderBase, SidebarRailBase, SidebarSeparatorBase, SidebarTriggerBase, SkeletonBase, SlideBase, StartHour, StartHourAgenda, StatusIndicator, SwitchBase, SystemTooltip_default as SystemTooltip, TableBase, TableBodyBase, TableCaptionBase, TableCellBase, TableFooterBase, TableHeadBase, TableHeaderBase, TableRowBase, TabsBase, TabsContentBase, TabsListBase, TabsTriggerBase, TextAreaBase, ThemeProviderBase, TimePicker, TimePickerInput, TimeSeries_default as TimeSeries, Toaster, TooltipBase, TooltipContentBase, TooltipProviderBase, TooltipSimple_default as TooltipSimple, TooltipTriggerBase, TooltipWithTotal_default as TooltipWithTotal, UndatedEvents, UniversalTooltipRenderer, UnlockButton, UploadButton, UseSideBarBase, VISIBLE_ITEMS, ViewButton, VisibilityButton, WeekCellsHeight, WeekCellsHeightAgenda, WeekView, WeekViewAgenda, YearViewAgenda, adaptDataForTooltip, addHoursToDate, addHoursToDateAgenda, addMinutesToDateAgenda, badgeVariants, buttonVariantsBase, compactTick, computeChartWidth, computeNiceMax, computeYAxisTickWidth, convert12HourTo24Hour, createGroup, createItem, createValueFormatter, createYTickFormatter, detectDataFields, detectXAxis, display12HourValue, filterAndScore, formatDurationAgenda, formatDurationAgendaDays, formatFieldName, formatLinePercentage, generateAdditionalColors, generateColorMap, getAgendaEventsForDay, getAgendaEventsForDayAgenda, getAllEventsForDay, getAllEventsForDayAgenda, getArrowByType, getAutoColorAgenda, getBorderRadiusClasses, getBorderRadiusClassesAgenda, getDateByType, getEventColorClasses, getEventColorClassesAgenda, getEventEndDate, getEventStartDate, getEventsForDay, getEventsForDayAgenda, getItems, getMaxDataValue, getMinDataValue, getSpanningEventsForDay, getSpanningEventsForDayAgenda, getValid12Hour, getValidArrow12Hour, getValidArrowHour, getValidArrowMinuteOrSecond, getValidArrowNumber, getValidHour, getValidMinuteOrSecond, getValidNumber, isMultiDayEvent, isMultiDayEventAgenda, isValid12Hour, isValidHour, isValidMinuteOrSecond, niceCeil, normaliseGroups, normalizeAttendDate, normalizeStr, processIntegrationData, processNeo4jData, renderInsideBarLabel, pillLabelRenderer_default as renderPillLabel, resolveChartMargins, resolveContainerPaddingLeft, scoreMatch, set12Hours, setDateByType, setHours, setMinutes, setSeconds, sortEvents, sortEventsAgenda, startOfLocalDay, toast, unionGroups, useBiaxial, useCalendarDnd, useCalendarDndAgenda, useChartClick, useChartDimensions, useChartHighlights, useChartLayout, useChartMinMax, useChartTooltips, useCommandPalette, useCurrentTimeIndicator, useCurrentTimeIndicatorAgenda, useDrag, useEventVisibility, useEventVisibilityAgenda, useIsMobile, useIsTruncated, useOpenTooltipForPeriod, useProcessedData, useRecents, useSeriesOpacity, useTheme, useTimeSeriesRange, visualForItem };
22942
+ export { AddButton, Agenda, AgendaDaysToShow, AgendaDaysToShowAgenda, AgendaView, AlertDialogActionBase, AlertDialogBase, AlertDialogCancelBase, AlertDialogContentBase, AlertDialogDescriptionBase, AlertDialogFooterBase, AlertDialogHeaderBase, AlertDialogOverlayBase, AlertDialogPortalBase, AlertDialogTitleBase, AlertDialogTriggerBase, AvatarBase, AvatarCombobox, AvatarFallbackBase, AvatarImageBase, BackButton, Badge, BreadcrumbBase, BreadcrumbEllipsisBase, BreadcrumbItemBase, BreadcrumbLinkBase, BreadcrumbListBase, BreadcrumbPageBase, BreadcrumbSeparatorBase, Brush_default as Brush, ButtonBase, ButtonGroupBase, CENTER_INDEX, CalendarBase, CalendarDndProvider, CalendarDndProviderAgenda, CardBase, CardContentBase, CardDescriptionBase, CardFooterBase, CardHeaderBase, CardTitleBase, CarouselBase, ChangeButton, Chart_default as Chart, ChartControls, ChartHeader, ChartTotalLegend_default as ChartTotalLegend, CheckButton, CheckboxBase, CheckboxTree, CircularProgress, CloseAllButton_default as CloseAllButton, CloseButton, CodeBlock, CollapsibleBase, CollapsibleContentBase, CollapsibleTriggerBase, Combobox, CommandBase, CommandDebouncedInputBase, CommandDialogBase, CommandEmptyBase, CommandGroupBase, CommandInputBase, CommandItemBase, CommandItemRow, CommandListBase, CommandPalette, CommandSeparatorBase, CommandShortcutBase, ContextMenuBase, ContextMenuCheckboxItemBase, ContextMenuContentBase, ContextMenuGroupBase, ContextMenuItemBase, ContextMenuLabelBase, ContextMenuPortalBase, ContextMenuRadioGroupBase, ContextMenuRadioItemBase, ContextMenuSeparatorBase, ContextMenuShortcutBase, ContextMenuSubBase, ContextMenuSubContentBase, ContextMenuSubTriggerBase, ContextMenuTriggerBase, ControlledCombobox, CopyButton, DateTimePicker, DayView, DayViewAgenda, DebouncedInput, DefaultEndHour, DefaultEndHourAgenda, DefaultStartHour, DefaultStartHourAgenda, DestructiveDialog, DialogBase, DialogCloseBase, DialogContentBase, DialogDescriptionBase, DialogFooterBase, DialogHeaderBase, DialogOverlayBase, DialogPortalBase, DialogTitleBase, DialogTriggerBase, DownloadButton, DraggableEvent2 as DraggableEvent, DraggableTooltip_default as DraggableTooltip, DrawerBase, DrawerCloseBase, DrawerContentBase, DrawerDescriptionBase, DrawerFooterBase, DrawerHeaderBase, DrawerOverlayBase, DrawerPortalBase, DrawerTitleBase, DrawerTriggerBase, DropDownMenuBase, DropDownMenuCheckboxItemBase, DropDownMenuContentBase, DropDownMenuGroupBase, DropDownMenuItemBase, DropDownMenuLabelBase, DropDownMenuPortalBase, DropDownMenuRadioGroupBase, DropDownMenuRadioItemBase, DropDownMenuSeparatorBase, DropDownMenuShortcutBase, DropDownMenuSubBase, DropDownMenuSubContentBase, DropDownMenuSubTriggerBase, DropDownMenuTriggerBase, DroppableCell, DroppableCellAgenda, EditButton, EndHour, EndHourAgenda, ErrorMessage_default as ErrorMessage, EventAgenda, EventCalendar, EventDetailModalAgenda, EventDialog, EventGap, EventGapAgenda, EventHeight, EventHeightAgenda, EventItem, EventItemAgenda, EventsPopup, FavoriteButton, FileAccept, FileUploader, FilterButton, GroupLabel, HideButton, Highlights_default as Highlights, HorizontalChart_default as HorizontalChart, HorizontalLegend_default as HorizontalLegend, HoverCardBase, HoverCardContentBase, HoverCardTriggerBase, ITEM_HEIGHT, InputBase, InputOTPBase, InputOTPGroupBase, InputOTPSeparatorBase, InputOTPSlotBase, IntegrationModal_default as IntegrationModal, Kbd, KbdGroup, LabelBase_default as LabelBase, Leaderboard, LikeButton, LoadingBase, LockButton, ModalBase, ModalCloseBase, ModalContentBase, ModalDescriptionBase, ModalFooterBase, ModalHeaderBase, ModalOverlayBase, ModalPortalBase, ModalTitleBase, ModalTriggerBase, ModeToggleBase, MonthView, MonthViewAgenda, MoreButton, MultiCombobox, MultiDayOverlay, MultiSelect, MultiSelectBase, MultiSelectContentBase, MultiSelectGroupBase, MultiSelectItemBase, MultiSelectSeparatorBase, MultiSelectTriggerBase, MultiSelectValueBase, NavigationMenuBase, NavigationMenuContentBase, NavigationMenuIndicatorBase, NavigationMenuItemBase, NavigationMenuLinkBase, NavigationMenuListBase, NavigationMenuTriggerBase, NavigationMenuViewportBase, NoData_default as NoData, NotificationButton, NumericInput, PeriodsDropdown_default as PeriodsDropdown, PieChart_default as PieChartComponent, PopoverAnchorBase, PopoverBase, PopoverContentBase, PopoverTriggerBase, ProgressBase, ProgressCirclesBase, ProgressPanelsBase, ProgressSegmentsBase, RadialMenu, RangePicker, RefreshButton, SaveButton, ScrollAreaBase, ScrollBarBase, SearchButton, Select, SelectBase, SelectContentBase, SelectEmpty, SelectGroupBase, SelectItemBase, SelectLabelBase, SelectScrollDownButtonBase, SelectScrollUpButtonBase, SelectSeparatorBase, SelectTriggerBase, SelectValueBase, SeparatorBase, SettingsButton, SheetBase, SheetCloseBase, SheetContentBase, SheetDescriptionBase, SheetFooterBase, SheetHeaderBase, SheetOverlayBase, SheetPortalBase, SheetTitleBase, SheetTriggerBase, ShowOnly_default as ShowOnly, SidebarBase, SidebarContentBase, SidebarFooterBase, SidebarGroupActionBase, SidebarGroupBase, SidebarGroupContentBase, SidebarGroupLabelBase, SidebarHeaderBase, SidebarInputBase, SidebarInsetBase, SidebarMenuActionBase, SidebarMenuBadgeBase, SidebarMenuBase, SidebarMenuButtonBase, SidebarMenuItemBase, SidebarMenuSkeletonBase, SidebarMenuSubBase, SidebarMenuSubButtonBase, SidebarMenuSubItemBase, SidebarProviderBase, SidebarRailBase, SidebarSeparatorBase, SidebarTriggerBase, SkeletonBase, SlideBase, StartHour, StartHourAgenda, StatusIndicator, SwitchBase, SystemTooltip_default as SystemTooltip, TableBase, TableBodyBase, TableCaptionBase, TableCellBase, TableFooterBase, TableHeadBase, TableHeaderBase, TableRowBase, TabsBase, TabsContentBase, TabsListBase, TabsTriggerBase, TextAreaBase, ThemeProviderBase, TimePicker, TimePickerInput, TimeSeries_default as TimeSeries, Toaster, TooltipBase, TooltipContentBase, TooltipProviderBase, TooltipSimple_default as TooltipSimple, TooltipTriggerBase, TooltipWithTotal_default as TooltipWithTotal, UndatedEvents, UniversalTooltipRenderer, UnlockButton, UploadButton, UseSideBarBase, VISIBLE_ITEMS, ViewButton, VisibilityButton, WeekCellsHeight, WeekCellsHeightAgenda, WeekView, WeekViewAgenda, YearViewAgenda, adaptDataForTooltip, addHoursToDate, addHoursToDateAgenda, addMinutesToDateAgenda, badgeVariants, buttonVariantsBase, compactTick, computeChartWidth, computeNiceMax, computeYAxisTickWidth, convert12HourTo24Hour, createGroup, createItem, createValueFormatter, createYTickFormatter, detectDataFields, detectXAxis, display12HourValue, filterAndScore, formatDurationAgenda, formatDurationAgendaDays, formatFieldName, formatLinePercentage, generateAdditionalColors, generateColorMap, getAgendaEventsForDay, getAgendaEventsForDayAgenda, getAllEventsForDay, getAllEventsForDayAgenda, getArrowByType, getAutoColorAgenda, getBorderRadiusClasses, getBorderRadiusClassesAgenda, getDateByType, getEventColorClasses, getEventColorClassesAgenda, getEventEndDate, getEventStartDate, getEventsForDay, getEventsForDayAgenda, getItems, getMaxDataValue, getMinDataValue, getSpanningEventsForDay, getSpanningEventsForDayAgenda, getValid12Hour, getValidArrow12Hour, getValidArrowHour, getValidArrowMinuteOrSecond, getValidArrowNumber, getValidHour, getValidMinuteOrSecond, getValidNumber, isMultiDayEvent, isMultiDayEventAgenda, isValid12Hour, isValidHour, isValidMinuteOrSecond, niceCeil, normaliseGroups, normalizeAttendDate, normalizeStr, processIntegrationData, processNeo4jData, renderInsideBarLabel, pillLabelRenderer_default as renderPillLabel, resolveChartMargins, resolveContainerPaddingLeft, scoreMatch, set12Hours, setDateByType, setHours, setMinutes, setSeconds, sortEvents, sortEventsAgenda, startOfLocalDay, toast, unionGroups, useBiaxial, useCalendarDnd, useCalendarDndAgenda, useChartClick, useChartDimensions, useChartHighlights, useChartLayout, useChartMinMax, useChartTooltips, useCommandPalette, useCurrentTimeIndicator, useCurrentTimeIndicatorAgenda, useDrag, useEventVisibility, useEventVisibilityAgenda, useIsMobile, useIsTruncated, useOpenTooltipForPeriod, useProcessedData, useRecents, useSeriesOpacity, useTheme, useTimeSeriesRange, visualForItem };