@lindle/linoardo 1.0.10 → 1.0.12

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.js CHANGED
@@ -1,7 +1,7 @@
1
- import * as React5 from 'react';
1
+ import * as React3 from 'react';
2
+ import { forwardRef, useCallback, useContext, useId, useState, useMemo, useEffect } from 'react';
2
3
  import { twMerge } from 'tailwind-merge';
3
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
- import { createPortal } from 'react-dom';
5
5
 
6
6
  // src/Containment/Button/index.tsx
7
7
 
@@ -130,7 +130,7 @@ var sizeClasses = {
130
130
  large: "px-6 py-3 text-lg",
131
131
  "x-large": "px-7 py-3.5 text-xl"
132
132
  };
133
- var Button = React5.forwardRef(
133
+ var Button = React3.forwardRef(
134
134
  ({
135
135
  variant = "solid",
136
136
  color = "primary",
@@ -301,7 +301,7 @@ var resolveIconClassName2 = (icon) => {
301
301
  const normalized = iconName.startsWith("mdi-") ? iconName : `mdi-${iconName}`;
302
302
  return Array.from(/* @__PURE__ */ new Set([...baseClasses, normalized])).join(" ");
303
303
  };
304
- var Chip = React5.forwardRef(
304
+ var Chip = forwardRef(
305
305
  ({
306
306
  variant = "solid",
307
307
  color = "primary",
@@ -333,7 +333,7 @@ var Chip = React5.forwardRef(
333
333
  const appendIconClassName = resolveIconClassName2(appendIcon);
334
334
  const closeIconClassName = resolveIconClassName2(closeIcon);
335
335
  const filterIconClassName = filter && selected ? resolveIconClassName2(filterIcon) : void 0;
336
- const handleClick = React5.useCallback(
336
+ const handleClick = useCallback(
337
337
  (event) => {
338
338
  if (disabled) {
339
339
  event.preventDefault();
@@ -344,7 +344,7 @@ var Chip = React5.forwardRef(
344
344
  },
345
345
  [disabled, onClick]
346
346
  );
347
- const handleKeyDown = React5.useCallback(
347
+ const handleKeyDown = useCallback(
348
348
  (event) => {
349
349
  onKeyDown?.(event);
350
350
  if (event.defaultPrevented || disabled || !interactive) {
@@ -357,7 +357,7 @@ var Chip = React5.forwardRef(
357
357
  },
358
358
  [disabled, interactive, onKeyDown]
359
359
  );
360
- const handleCloseClick = React5.useCallback(
360
+ const handleCloseClick = useCallback(
361
361
  (event) => {
362
362
  event.stopPropagation();
363
363
  if (disabled) {
@@ -368,7 +368,7 @@ var Chip = React5.forwardRef(
368
368
  },
369
369
  [disabled, onClose]
370
370
  );
371
- const handleCloseKeyDown = React5.useCallback((event) => {
371
+ const handleCloseKeyDown = useCallback((event) => {
372
372
  if (event.key === " " || event.key === "Enter") {
373
373
  event.stopPropagation();
374
374
  }
@@ -440,7 +440,7 @@ var accentClasses = {
440
440
  surface: { text: "text-gray-900", bg: "bg-gray-100", indicator: "bg-gray-900" },
441
441
  bw: { text: "text-gray-900", bg: "bg-gray-100", indicator: "bg-gray-900" }
442
442
  };
443
- var ListItem = React5.forwardRef((props, ref) => {
443
+ var ListItem = React3.forwardRef((props, ref) => {
444
444
  const {
445
445
  component,
446
446
  href,
@@ -557,13 +557,13 @@ var listRoundedClasses = {
557
557
  pill: "rounded-full"
558
558
  };
559
559
  var isListItemElement = (element) => {
560
- if (!React5.isValidElement(element)) {
560
+ if (!React3.isValidElement(element)) {
561
561
  return false;
562
562
  }
563
563
  const elementType = element.type;
564
564
  return element.type === Item_default || elementType.displayName === Item_default.displayName;
565
565
  };
566
- var List = React5.forwardRef((props, ref) => {
566
+ var List = React3.forwardRef((props, ref) => {
567
567
  const {
568
568
  variant = "solid",
569
569
  density = "default",
@@ -585,11 +585,11 @@ var List = React5.forwardRef((props, ref) => {
585
585
  const navClass = nav ? "py-1" : void 0;
586
586
  const accentColor = color;
587
587
  const enhanceChild = (child) => {
588
- if (!React5.isValidElement(child)) {
588
+ if (!React3.isValidElement(child)) {
589
589
  return child;
590
590
  }
591
591
  if (isListItemElement(child)) {
592
- return React5.cloneElement(child, {
592
+ return React3.cloneElement(child, {
593
593
  density: child.props.density ?? density,
594
594
  lines: child.props.lines ?? lines,
595
595
  nav: child.props.nav ?? nav,
@@ -599,14 +599,14 @@ var List = React5.forwardRef((props, ref) => {
599
599
  });
600
600
  }
601
601
  if (child.props && typeof child.props === "object" && "children" in child.props) {
602
- const nestedChildren = React5.Children.map(child.props.children, enhanceChild);
602
+ const nestedChildren = React3.Children.map(child.props.children, enhanceChild);
603
603
  if (nestedChildren !== child.props.children) {
604
- return React5.cloneElement(child, void 0, nestedChildren);
604
+ return React3.cloneElement(child, void 0, nestedChildren);
605
605
  }
606
606
  }
607
607
  return child;
608
608
  };
609
- const resolvedChildren = React5.Children.map(children, enhanceChild);
609
+ const resolvedChildren = React3.Children.map(children, enhanceChild);
610
610
  return /* @__PURE__ */ jsx(
611
611
  "div",
612
612
  {
@@ -620,8 +620,6 @@ var List = React5.forwardRef((props, ref) => {
620
620
  });
621
621
  List.displayName = "List";
622
622
  var List_default = List;
623
- var isBrowser = typeof window !== "undefined";
624
- var useIsomorphicLayoutEffect = isBrowser ? React5.useLayoutEffect : React5.useEffect;
625
623
  var placementClasses = {
626
624
  "bottom-start": "left-0 top-full origin-top-left",
627
625
  bottom: "left-1/2 top-full -translate-x-1/2 origin-top",
@@ -634,350 +632,75 @@ var offsetClasses = {
634
632
  top: "mb-2",
635
633
  bottom: "mt-2"
636
634
  };
637
- var menuBaseClasses = "absolute z-50 min-w-[10rem] rounded-xl border border-gray-200/80 bg-white/95 p-2 text-sm text-gray-700 shadow-lg shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur-md transition-all duration-150 data-[state=closed]:pointer-events-none data-[state=closed]:opacity-0 data-[state=closed]:scale-95 data-[state=open]:opacity-100 data-[state=open]:scale-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2";
635
+ var menuBaseClasses = "absolute z-50 min-w-[10rem] rounded-xl border border-gray-200/80 bg-white/95 p-2 text-sm text-gray-700 shadow-lg shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2";
638
636
  var overlayBaseClasses = "fixed inset-0 z-40 bg-gray-900/30 backdrop-blur-[1px]";
639
- var Menu = React5.forwardRef((props, ref) => {
637
+ var Menu = React3.forwardRef((props, ref) => {
640
638
  const {
641
639
  activator,
642
640
  children,
643
- open: openProp,
644
- defaultOpen = false,
645
- onOpenChange,
646
641
  placement = "bottom-start",
647
- openOnHover = false,
648
- closeOnContentClick = true,
642
+ open,
643
+ openOnHover = true,
644
+ openOnFocus = true,
649
645
  matchActivatorWidth = false,
650
646
  keepMounted = false,
651
- disabled = false,
652
647
  scrim = false,
653
648
  contentClassName,
654
649
  contentProps,
655
650
  overlayClassName,
656
651
  className,
657
- onMouseEnter: rootMouseEnter,
658
- onMouseLeave: rootMouseLeave,
659
652
  ...rest
660
653
  } = props;
661
- const baseId = React5.useId();
662
- const menuId = `${baseId}-menu`;
663
- const activatorId = `${baseId}-activator`;
664
- const isControlled = typeof openProp === "boolean";
665
- const [internalOpen, setInternalOpen] = React5.useState(defaultOpen);
666
- const open = isControlled ? Boolean(openProp) : internalOpen;
667
- const localRootRef = React5.useRef(null);
668
- const menuRef = React5.useRef(null);
669
- const activatorRef = React5.useRef(null);
670
- const closeTimeoutRef = React5.useRef(null);
671
- const mergedRootRef = React5.useCallback(
672
- (node) => {
673
- localRootRef.current = node;
674
- if (typeof ref === "function") {
675
- ref(node);
676
- } else if (ref) {
677
- ref.current = node;
678
- }
679
- },
680
- [ref]
681
- );
682
- const [activatorWidth, setActivatorWidth] = React5.useState();
683
- const updateActivatorWidth = React5.useCallback(() => {
684
- if (!matchActivatorWidth) {
685
- setActivatorWidth(void 0);
686
- return;
687
- }
688
- const node = activatorRef.current;
689
- if (!node) {
690
- return;
691
- }
692
- setActivatorWidth(node.getBoundingClientRect().width);
693
- }, [matchActivatorWidth]);
694
- useIsomorphicLayoutEffect(() => {
695
- if (!matchActivatorWidth) {
696
- return;
697
- }
698
- updateActivatorWidth();
699
- if (!activatorRef.current || typeof ResizeObserver === "undefined") {
700
- return;
701
- }
702
- const observer = new ResizeObserver(() => updateActivatorWidth());
703
- observer.observe(activatorRef.current);
704
- return () => observer.disconnect();
705
- }, [matchActivatorWidth, updateActivatorWidth]);
706
- const setOpen = React5.useCallback(
707
- (nextOpen) => {
708
- if (disabled || open === nextOpen) {
709
- return;
710
- }
711
- if (!isControlled) {
712
- setInternalOpen(nextOpen);
713
- }
714
- onOpenChange?.(nextOpen);
715
- },
716
- [disabled, isControlled, onOpenChange, open]
717
- );
718
- React5.useEffect(() => {
719
- if (!disabled || !open) {
720
- return;
721
- }
722
- if (!isControlled) {
723
- setInternalOpen(false);
724
- }
725
- onOpenChange?.(false);
726
- }, [disabled, open, isControlled, onOpenChange]);
727
- React5.useEffect(() => {
728
- if (!open) {
729
- return;
730
- }
731
- const handlePointerDown = (event) => {
732
- const target = event.target;
733
- if (!target) {
734
- return;
735
- }
736
- if (localRootRef.current?.contains(target)) {
737
- return;
738
- }
739
- setOpen(false);
740
- };
741
- const handleKeyDown = (event) => {
742
- if (event.key === "Escape") {
743
- event.stopPropagation();
744
- setOpen(false);
745
- activatorRef.current?.focus();
746
- }
747
- };
748
- document.addEventListener("pointerdown", handlePointerDown);
749
- document.addEventListener("keydown", handleKeyDown);
750
- return () => {
751
- document.removeEventListener("pointerdown", handlePointerDown);
752
- document.removeEventListener("keydown", handleKeyDown);
753
- };
754
- }, [open, setOpen]);
755
- React5.useEffect(() => {
756
- if (!open) {
757
- return;
758
- }
759
- const node = menuRef.current;
760
- if (!node) {
761
- return;
762
- }
763
- const id = window.requestAnimationFrame(() => {
764
- node.focus({ preventScroll: true });
765
- });
766
- return () => window.cancelAnimationFrame(id);
767
- }, [open]);
768
- const setActivatorNode = React5.useCallback(
769
- (node) => {
770
- activatorRef.current = node;
771
- if (node && matchActivatorWidth) {
772
- setActivatorWidth(node.getBoundingClientRect().width);
773
- }
774
- },
775
- [matchActivatorWidth]
776
- );
777
- const handleActivatorClick = React5.useCallback(
778
- (event) => {
779
- event.preventDefault();
780
- if (disabled) {
781
- return;
782
- }
783
- setOpen(!open);
784
- },
785
- [disabled, open, setOpen]
786
- );
787
- const handleActivatorKeyDown = React5.useCallback(
788
- (event) => {
789
- if (event.key === "Enter" || event.key === " ") {
790
- event.preventDefault();
791
- setOpen(!open);
792
- }
793
- if (event.key === "ArrowDown") {
794
- event.preventDefault();
795
- setOpen(true);
796
- }
797
- },
798
- [open, setOpen]
799
- );
800
- const clearCloseTimeout = React5.useCallback(() => {
801
- if (closeTimeoutRef.current !== null) {
802
- if (isBrowser) {
803
- window.clearTimeout(closeTimeoutRef.current);
804
- }
805
- closeTimeoutRef.current = null;
806
- }
807
- }, []);
808
- const scheduleClose = React5.useCallback(() => {
809
- if (!isBrowser) {
810
- setOpen(false);
811
- return;
654
+ const hasContent = children !== void 0 && children !== null;
655
+ const manual = typeof open === "boolean";
656
+ const visible = Boolean(open);
657
+ const shouldRenderContent = hasContent && (keepMounted || visible || !manual && (openOnHover || openOnFocus));
658
+ const verticalPlacement = placement.startsWith("top") ? "top" : "bottom";
659
+ const visibilityClasses = (() => {
660
+ if (manual) {
661
+ return visible ? "pointer-events-auto opacity-100 scale-100" : "pointer-events-none opacity-0 scale-95";
812
662
  }
813
- clearCloseTimeout();
814
- closeTimeoutRef.current = window.setTimeout(() => {
815
- setOpen(false);
816
- closeTimeoutRef.current = null;
817
- }, 150);
818
- }, [clearCloseTimeout, setOpen]);
819
- React5.useEffect(() => {
820
- return () => clearCloseTimeout();
821
- }, [clearCloseTimeout]);
822
- const isMovingWithinMenu = React5.useCallback(
823
- (event) => {
824
- const nextTarget = event.relatedTarget;
825
- if (!nextTarget || !localRootRef.current) {
826
- return false;
827
- }
828
- return localRootRef.current.contains(nextTarget);
829
- },
830
- [localRootRef]
831
- );
832
- const handleRootMouseEnter = React5.useCallback(
833
- (event) => {
834
- rootMouseEnter?.(event);
835
- if (event.defaultPrevented) {
836
- return;
837
- }
838
- if (openOnHover) {
839
- clearCloseTimeout();
840
- setOpen(true);
841
- }
842
- },
843
- [clearCloseTimeout, openOnHover, rootMouseEnter, setOpen]
844
- );
845
- const handleRootMouseLeave = React5.useCallback(
846
- (event) => {
847
- rootMouseLeave?.(event);
848
- if (event.defaultPrevented) {
849
- return;
850
- }
851
- if (openOnHover) {
852
- if (isMovingWithinMenu(event)) {
853
- return;
854
- }
855
- scheduleClose();
856
- }
857
- },
858
- [isMovingWithinMenu, openOnHover, rootMouseLeave, scheduleClose]
859
- );
860
- const handleActivatorMouseEnter = React5.useCallback(
861
- (_event) => {
862
- if (disabled) {
863
- return;
864
- }
865
- clearCloseTimeout();
866
- setOpen(true);
867
- },
868
- [clearCloseTimeout, disabled, setOpen]
869
- );
870
- const handleActivatorMouseLeave = React5.useCallback(
871
- (event) => {
872
- if (disabled || !openOnHover) {
873
- return;
874
- }
875
- if (isMovingWithinMenu(event)) {
876
- return;
877
- }
878
- scheduleClose();
879
- },
880
- [disabled, isMovingWithinMenu, openOnHover, scheduleClose]
881
- );
663
+ const base2 = "pointer-events-none opacity-0 scale-95";
664
+ const hover = openOnHover ? " group-hover/menu:pointer-events-auto group-hover/menu:opacity-100 group-hover/menu:scale-100" : "";
665
+ const focus = openOnFocus ? " group-focus-within/menu:pointer-events-auto group-focus-within/menu:opacity-100 group-focus-within/menu:scale-100" : "";
666
+ return `${base2}${hover}${focus}`;
667
+ })();
882
668
  const {
883
- className: contentClass,
669
+ className: contentExtraClassName,
884
670
  style: contentStyle,
885
- onClick: contentOnClick,
886
- onMouseEnter: contentOnMouseEnter,
887
- onMouseLeave: contentOnMouseLeave,
888
671
  role: contentRole,
889
672
  tabIndex: contentTabIndex,
890
- ["aria-labelledby"]: ariaLabelledBy,
891
673
  ...restContentProps
892
674
  } = contentProps ?? {};
893
- const shouldRenderContent = open || keepMounted;
894
- const verticalPlacement = placement.startsWith("top") ? "top" : "bottom";
895
- const activatorElement = activator({
896
- ref: setActivatorNode,
897
- id: activatorId,
898
- "aria-haspopup": "menu",
899
- "aria-expanded": open,
900
- "aria-controls": menuId,
901
- onClick: handleActivatorClick,
902
- onKeyDown: handleActivatorKeyDown,
903
- onMouseEnter: openOnHover ? handleActivatorMouseEnter : void 0,
904
- onMouseLeave: openOnHover ? handleActivatorMouseLeave : void 0,
905
- disabled,
906
- open
907
- });
675
+ const overlayNode = scrim && visible ? /* @__PURE__ */ jsx("div", { className: twMerge(overlayBaseClasses, overlayClassName), "aria-hidden": true }) : null;
908
676
  return /* @__PURE__ */ jsxs(Fragment, { children: [
909
- scrim && open ? /* @__PURE__ */ jsx(
910
- "div",
911
- {
912
- className: twMerge(overlayBaseClasses, overlayClassName),
913
- "aria-hidden": true,
914
- onClick: () => setOpen(false),
915
- onMouseDown: (event) => event.preventDefault()
916
- }
917
- ) : null,
677
+ overlayNode,
918
678
  /* @__PURE__ */ jsxs(
919
679
  "div",
920
680
  {
921
681
  ...rest,
922
- ref: mergedRootRef,
923
- className: twMerge("relative inline-flex min-w-0", className),
924
- "data-open": open || void 0,
925
- onMouseEnter: openOnHover ? handleRootMouseEnter : rootMouseEnter,
926
- onMouseLeave: openOnHover ? handleRootMouseLeave : rootMouseLeave,
682
+ ref,
683
+ className: twMerge("relative inline-flex min-w-0 group/menu", className),
684
+ "data-open": visible || void 0,
927
685
  children: [
928
- activatorElement,
686
+ /* @__PURE__ */ jsx("div", { className: "inline-flex w-full min-w-0", children: activator }),
929
687
  shouldRenderContent ? /* @__PURE__ */ jsx(
930
688
  "div",
931
689
  {
932
690
  ...restContentProps,
933
- ref: menuRef,
934
- id: menuId,
935
- role: contentRole ?? "menu",
936
- tabIndex: contentTabIndex ?? -1,
937
- "aria-labelledby": ariaLabelledBy ?? activatorId,
938
- "data-state": open ? "open" : "closed",
939
691
  className: twMerge(
940
692
  menuBaseClasses,
941
693
  placementClasses[placement],
942
694
  offsetClasses[verticalPlacement],
695
+ matchActivatorWidth ? "min-w-full" : void 0,
696
+ visibilityClasses,
943
697
  contentClassName,
944
- contentClass
698
+ contentExtraClassName
945
699
  ),
946
- style: {
947
- ...contentStyle,
948
- ...matchActivatorWidth && activatorWidth ? { minWidth: activatorWidth, width: activatorWidth } : void 0
949
- },
950
- onMouseEnter: (event) => {
951
- contentOnMouseEnter?.(event);
952
- if (event.defaultPrevented) {
953
- return;
954
- }
955
- if (openOnHover) {
956
- clearCloseTimeout();
957
- setOpen(true);
958
- }
959
- },
960
- onMouseLeave: (event) => {
961
- contentOnMouseLeave?.(event);
962
- if (event.defaultPrevented) {
963
- return;
964
- }
965
- if (openOnHover) {
966
- if (isMovingWithinMenu(event)) {
967
- return;
968
- }
969
- scheduleClose();
970
- }
971
- },
972
- onClick: (event) => {
973
- contentOnClick?.(event);
974
- if (event.defaultPrevented) {
975
- return;
976
- }
977
- if (closeOnContentClick) {
978
- setOpen(false);
979
- }
980
- },
700
+ "data-state": visible ? "open" : "closed",
701
+ role: contentRole ?? "menu",
702
+ tabIndex: contentTabIndex ?? -1,
703
+ style: contentStyle,
981
704
  children
982
705
  }
983
706
  ) : null
@@ -988,7 +711,7 @@ var Menu = React5.forwardRef((props, ref) => {
988
711
  });
989
712
  Menu.displayName = "Menu";
990
713
  var Menu_default = Menu;
991
- var ExpansionPanelContext = React5.createContext(null);
714
+ var ExpansionPanelContext = React3.createContext(null);
992
715
  var densityClasses2 = {
993
716
  comfortable: "py-5",
994
717
  default: "py-4",
@@ -1017,7 +740,7 @@ var accentClasses2 = {
1017
740
  surface: { text: "text-gray-900", bg: "bg-gray-100", border: "border-gray-200" },
1018
741
  bw: { text: "text-gray-900", bg: "bg-gray-100", border: "border-gray-200" }
1019
742
  };
1020
- var ExpansionPanelItem = React5.forwardRef((props, ref) => {
743
+ var ExpansionPanelItem = forwardRef((props, ref) => {
1021
744
  const {
1022
745
  value,
1023
746
  title,
@@ -1036,8 +759,8 @@ var ExpansionPanelItem = React5.forwardRef((props, ref) => {
1036
759
  color: colorOverride,
1037
760
  ...rest
1038
761
  } = props;
1039
- const context = React5.useContext(ExpansionPanelContext);
1040
- const generatedValue = React5.useId();
762
+ const context = useContext(ExpansionPanelContext);
763
+ const generatedValue = useId();
1041
764
  const panelValue = value ?? generatedValue;
1042
765
  const density = context?.density ?? "default";
1043
766
  const color = colorOverride ?? context?.color ?? "primary";
@@ -1045,9 +768,9 @@ var ExpansionPanelItem = React5.forwardRef((props, ref) => {
1045
768
  const variant = context?.variant ?? "elevated";
1046
769
  const rounded = context?.rounded ?? "lg";
1047
770
  const accent = accentClasses2[color] ?? accentClasses2.primary;
1048
- const headerId = React5.useId();
1049
- const contentId = React5.useId();
1050
- const [standaloneExpanded, setStandaloneExpanded] = React5.useState(false);
771
+ const headerId = useId();
772
+ const contentId = useId();
773
+ const [standaloneExpanded, setStandaloneExpanded] = useState(false);
1051
774
  const isExpanded = context ? context.expandedValues.includes(panelValue) : standaloneExpanded;
1052
775
  const handleToggle = () => {
1053
776
  if (disabled) {
@@ -1173,7 +896,7 @@ var normalizeValues = (value, allowMultiple) => {
1173
896
  return normalized.length ? [normalized[0]] : [];
1174
897
  };
1175
898
  var clampValues = (values, allowMultiple) => allowMultiple ? uniqueValues(values) : values.length ? [values[0]] : [];
1176
- var ExpansionPanel = React5.forwardRef((props, ref) => {
899
+ var ExpansionPanel = forwardRef((props, ref) => {
1177
900
  const {
1178
901
  variant = "elevated",
1179
902
  rounded = "lg",
@@ -1189,22 +912,22 @@ var ExpansionPanel = React5.forwardRef((props, ref) => {
1189
912
  ...rest
1190
913
  } = props;
1191
914
  const isControlled = value !== void 0;
1192
- const controlledValues = React5.useMemo(() => {
915
+ const controlledValues = useMemo(() => {
1193
916
  if (!isControlled) {
1194
917
  return void 0;
1195
918
  }
1196
919
  return normalizeValues(value, multiple);
1197
920
  }, [isControlled, value, multiple]);
1198
- const [internalValues, setInternalValues] = React5.useState(
921
+ const [internalValues, setInternalValues] = useState(
1199
922
  () => normalizeValues(defaultValue, multiple)
1200
923
  );
1201
924
  const expandedValues = controlledValues ?? internalValues;
1202
- React5.useEffect(() => {
925
+ useEffect(() => {
1203
926
  if (!isControlled) {
1204
927
  setInternalValues((prev) => clampValues(prev, multiple));
1205
928
  }
1206
929
  }, [multiple, isControlled]);
1207
- const handleValueChange = React5.useCallback(
930
+ const handleValueChange = useCallback(
1208
931
  (next) => {
1209
932
  if (!isControlled) {
1210
933
  setInternalValues(next);
@@ -1219,7 +942,7 @@ var ExpansionPanel = React5.forwardRef((props, ref) => {
1219
942
  },
1220
943
  [isControlled, multiple, onChange]
1221
944
  );
1222
- const toggle = React5.useCallback(
945
+ const toggle = useCallback(
1223
946
  (panelValue, disabled) => {
1224
947
  if (disabled) {
1225
948
  return;
@@ -1230,7 +953,7 @@ var ExpansionPanel = React5.forwardRef((props, ref) => {
1230
953
  },
1231
954
  [expandedValues, handleValueChange, multiple]
1232
955
  );
1233
- const providerValue = React5.useMemo(
956
+ const providerValue = useMemo(
1234
957
  () => ({ expandedValues, toggle, density, color, divider, rounded, variant }),
1235
958
  [expandedValues, toggle, density, color, divider, rounded, variant]
1236
959
  );
@@ -1249,8 +972,6 @@ var ExpansionPanel = React5.forwardRef((props, ref) => {
1249
972
  });
1250
973
  ExpansionPanel.displayName = "ExpansionPanel";
1251
974
  var ExpansionPanel_default = ExpansionPanel;
1252
- var isBrowser2 = typeof window !== "undefined";
1253
- var useIsomorphicLayoutEffect2 = isBrowser2 ? React5.useLayoutEffect : React5.useEffect;
1254
975
  var containerBaseClasses = "fixed inset-0 z-[70] flex items-center justify-center p-4 sm:p-8 data-[state=closed]:pointer-events-none";
1255
976
  var overlayBaseClasses2 = "absolute inset-0 bg-gray-900/55 backdrop-blur-[2px] transition-opacity duration-200 data-[state=closed]:opacity-0 data-[state=open]:opacity-100";
1256
977
  var panelWrapperClasses = "relative z-10 flex w-full max-h-[95vh] justify-center transition-transform transition-opacity duration-200 data-[state=closed]:translate-y-4 data-[state=closed]:opacity-0 data-[state=open]:translate-y-0 data-[state=open]:opacity-100";
@@ -1261,281 +982,87 @@ var resolveSizeValue = (value) => {
1261
982
  }
1262
983
  return typeof value === "number" ? `${value}px` : value;
1263
984
  };
1264
- var Dialog = React5.forwardRef((props, forwardedRef) => {
985
+ var Dialog = React3.forwardRef((props, forwardedRef) => {
1265
986
  const {
1266
987
  activator,
1267
988
  children,
1268
- open: openProp,
1269
- defaultOpen = false,
1270
- onOpenChange,
1271
- persistent = false,
1272
- closeOnEsc = true,
1273
- closeOnOutsideClick = true,
1274
- closeOnContentClick = false,
1275
- scrim = true,
989
+ open = false,
1276
990
  keepMounted = false,
991
+ scrim = true,
1277
992
  fullscreen = false,
1278
993
  maxWidth = "32rem",
1279
994
  width,
1280
995
  containerClassName,
1281
996
  overlayClassName,
1282
997
  overlayProps,
1283
- scrollLock = true,
1284
- disabled = false,
1285
998
  className,
1286
999
  style,
1287
- tabIndex: tabIndexProp,
1288
- role: roleProp,
1289
- id: idProp,
1000
+ role: roleProp = "dialog",
1001
+ tabIndex = -1,
1002
+ id,
1290
1003
  ["aria-modal"]: ariaModalProp,
1291
1004
  ...rest
1292
1005
  } = props;
1293
- const { onClick: panelOnClick, ...panelProps } = rest;
1294
- const {
1295
- className: overlayPropsClassName,
1296
- onPointerDown: overlayOnPointerDown,
1297
- ...overlayRestProps
1298
- } = overlayProps ?? {};
1299
- const baseId = React5.useId();
1300
- const panelId = idProp ?? `${baseId}-dialog`;
1301
- const activatorId = `${panelId}-activator`;
1302
- const role = roleProp ?? "dialog";
1303
- const resolvedTabIndex = tabIndexProp ?? -1;
1304
- const isControlled = typeof openProp === "boolean";
1305
- const [internalOpen, setInternalOpen] = React5.useState(defaultOpen);
1306
- const open = isControlled ? Boolean(openProp) : internalOpen;
1307
1006
  const state = open ? "open" : "closed";
1308
- const panelRef = React5.useRef(null);
1309
- const activatorRef = React5.useRef(null);
1310
- const previouslyFocusedElement = React5.useRef(null);
1311
- const [mounted, setMounted] = React5.useState(false);
1312
- useIsomorphicLayoutEffect2(() => {
1313
- setMounted(true);
1314
- }, []);
1315
- const setPanelRef = React5.useCallback(
1316
- (node) => {
1317
- panelRef.current = node;
1318
- if (typeof forwardedRef === "function") {
1319
- forwardedRef(node);
1320
- } else if (forwardedRef) {
1321
- forwardedRef.current = node;
1322
- }
1323
- },
1324
- [forwardedRef]
1325
- );
1326
- const setActivatorNode = React5.useCallback((node) => {
1327
- activatorRef.current = node;
1328
- }, []);
1329
- const updateOpen = React5.useCallback(
1330
- (nextOpen, options) => {
1331
- if (disabled && nextOpen) {
1332
- return;
1333
- }
1334
- if (!options?.force && !nextOpen && persistent) {
1335
- return;
1336
- }
1337
- if (!isControlled) {
1338
- setInternalOpen(nextOpen);
1339
- }
1340
- onOpenChange?.(nextOpen);
1341
- },
1342
- [disabled, isControlled, onOpenChange, persistent]
1343
- );
1344
- React5.useEffect(() => {
1345
- if (!disabled || !open) {
1346
- return;
1007
+ const shouldRenderDialog = keepMounted || open;
1008
+ const resolvedStyle = { ...style };
1009
+ if (fullscreen) {
1010
+ if (resolvedStyle.maxWidth === void 0) {
1011
+ resolvedStyle.maxWidth = "none";
1347
1012
  }
1348
- updateOpen(false, { force: true });
1349
- }, [disabled, open, updateOpen]);
1350
- React5.useEffect(() => {
1351
- if (!isBrowser2) {
1352
- return;
1353
- }
1354
- if (open) {
1355
- previouslyFocusedElement.current = document.activeElement;
1356
- const node = panelRef.current;
1357
- if (node) {
1358
- if (!node.hasAttribute("tabindex")) {
1359
- node.setAttribute("tabindex", resolvedTabIndex.toString());
1360
- }
1361
- requestAnimationFrame(() => node.focus({ preventScroll: true }));
1362
- }
1363
- return;
1013
+ if (resolvedStyle.width === void 0) {
1014
+ resolvedStyle.width = "100%";
1364
1015
  }
1365
- const previous = previouslyFocusedElement.current ?? activatorRef.current;
1366
- if (previous && typeof previous.focus === "function") {
1367
- previous.focus();
1016
+ if (resolvedStyle.height === void 0) {
1017
+ resolvedStyle.height = "100%";
1368
1018
  }
1369
- }, [open, resolvedTabIndex]);
1370
- React5.useEffect(() => {
1371
- if (!open || !closeOnEsc || persistent || !isBrowser2) {
1372
- return;
1019
+ if (resolvedStyle.maxHeight === void 0) {
1020
+ resolvedStyle.maxHeight = "100%";
1373
1021
  }
1374
- const handleKeyDown = (event) => {
1375
- if (event.key !== "Escape") {
1376
- return;
1377
- }
1378
- event.stopPropagation();
1379
- updateOpen(false);
1380
- };
1381
- document.addEventListener("keydown", handleKeyDown);
1382
- return () => document.removeEventListener("keydown", handleKeyDown);
1383
- }, [closeOnEsc, open, persistent, updateOpen]);
1384
- React5.useEffect(() => {
1385
- if (!scrollLock || !open || !isBrowser2) {
1386
- return;
1022
+ } else {
1023
+ if (resolvedStyle.maxWidth === void 0) {
1024
+ resolvedStyle.maxWidth = resolveSizeValue(maxWidth);
1387
1025
  }
1388
- const { body, documentElement } = document;
1389
- const previousOverflow = body.style.overflow;
1390
- const previousPaddingRight = body.style.paddingRight;
1391
- const scrollbarWidth = window.innerWidth - documentElement.clientWidth;
1392
- body.style.overflow = "hidden";
1393
- if (scrollbarWidth > 0) {
1394
- const computedPaddingRight = parseFloat(window.getComputedStyle(body).paddingRight) || 0;
1395
- body.style.paddingRight = `${computedPaddingRight + scrollbarWidth}px`;
1026
+ if (width !== void 0 && resolvedStyle.width === void 0) {
1027
+ resolvedStyle.width = resolveSizeValue(width);
1396
1028
  }
1397
- return () => {
1398
- body.style.overflow = previousOverflow;
1399
- body.style.paddingRight = previousPaddingRight;
1400
- };
1401
- }, [open, scrollLock]);
1402
- const handleOverlayPointerDown = React5.useCallback(
1403
- (event) => {
1404
- overlayOnPointerDown?.(event);
1405
- if (event.defaultPrevented) {
1406
- return;
1407
- }
1408
- if (!closeOnOutsideClick || event.button > 0) {
1409
- return;
1410
- }
1411
- updateOpen(false);
1412
- },
1413
- [closeOnOutsideClick, overlayOnPointerDown, updateOpen]
1414
- );
1415
- const handleContentClick = React5.useCallback(
1416
- (event) => {
1417
- panelOnClick?.(event);
1418
- if (event.defaultPrevented) {
1419
- return;
1420
- }
1421
- if (closeOnContentClick) {
1422
- updateOpen(false, { force: true });
1423
- }
1424
- },
1425
- [closeOnContentClick, panelOnClick, updateOpen]
1426
- );
1427
- const handleActivatorClick = React5.useCallback(
1428
- (event) => {
1429
- if (disabled) {
1430
- event.preventDefault();
1431
- event.stopPropagation();
1432
- return;
1433
- }
1434
- updateOpen(!open, { force: true });
1435
- },
1436
- [disabled, open, updateOpen]
1437
- );
1438
- const handleActivatorKeyDown = React5.useCallback(
1439
- (event) => {
1440
- if (event.key !== "Enter" && event.key !== " ") {
1441
- return;
1442
- }
1443
- event.preventDefault();
1444
- if (disabled) {
1445
- return;
1446
- }
1447
- updateOpen(!open, { force: true });
1448
- },
1449
- [disabled, open, updateOpen]
1450
- );
1451
- const shouldRenderOverlay = (scrim || closeOnOutsideClick) && isBrowser2;
1452
- const portalReady = mounted && isBrowser2 && (open || keepMounted);
1453
- const resolvedPanelStyle = React5.useMemo(() => {
1454
- const nextStyle = { ...style };
1455
- if (fullscreen) {
1456
- if (nextStyle.maxWidth === void 0) {
1457
- nextStyle.maxWidth = "none";
1458
- }
1459
- if (nextStyle.width === void 0) {
1460
- nextStyle.width = "100%";
1461
- }
1462
- if (nextStyle.height === void 0) {
1463
- nextStyle.height = "100%";
1464
- }
1465
- if (nextStyle.maxHeight === void 0) {
1466
- nextStyle.maxHeight = "100%";
1467
- }
1468
- } else {
1469
- if (nextStyle.maxWidth === void 0) {
1470
- nextStyle.maxWidth = resolveSizeValue(maxWidth);
1471
- }
1472
- if (width !== void 0 && nextStyle.width === void 0) {
1473
- nextStyle.width = resolveSizeValue(width);
1474
- }
1475
- }
1476
- return nextStyle;
1477
- }, [fullscreen, maxWidth, style, width]);
1478
- const ariaModal = ariaModalProp ?? (role === "dialog" || role === "alertdialog" ? true : void 0);
1479
- const overlayNode = shouldRenderOverlay && portalReady ? /* @__PURE__ */ jsx(
1029
+ }
1030
+ const ariaModal = ariaModalProp ?? (roleProp === "dialog" || roleProp === "alertdialog" ? true : void 0);
1031
+ const { className: overlayExtraClassName, ...restOverlayProps } = overlayProps ?? {};
1032
+ const overlayNode = shouldRenderDialog && scrim ? /* @__PURE__ */ jsx(
1480
1033
  "div",
1481
1034
  {
1482
- ...overlayRestProps,
1483
- className: twMerge(
1484
- overlayBaseClasses2,
1485
- scrim ? void 0 : "bg-transparent backdrop-blur-none",
1486
- overlayClassName,
1487
- overlayPropsClassName
1488
- ),
1035
+ ...restOverlayProps,
1036
+ className: twMerge(overlayBaseClasses2, overlayClassName, overlayExtraClassName),
1489
1037
  "data-state": state,
1490
- "aria-hidden": true,
1491
- onPointerDown: handleOverlayPointerDown
1038
+ "aria-hidden": true
1492
1039
  }
1493
1040
  ) : null;
1494
- const dialogNode = portalReady && document.body ? createPortal(
1495
- /* @__PURE__ */ jsxs("div", { className: twMerge(containerBaseClasses, containerClassName), "data-state": state, "aria-hidden": !open, children: [
1041
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1042
+ activator ? /* @__PURE__ */ jsx("div", { className: "inline-flex", children: activator }) : null,
1043
+ shouldRenderDialog ? /* @__PURE__ */ jsxs("div", { className: twMerge(containerBaseClasses, containerClassName), "data-state": state, "aria-hidden": !open, children: [
1496
1044
  overlayNode,
1497
1045
  /* @__PURE__ */ jsx("div", { className: twMerge(panelWrapperClasses, fullscreen ? "h-full items-stretch" : "mx-auto"), "data-state": state, children: /* @__PURE__ */ jsx(
1498
1046
  "div",
1499
1047
  {
1500
- ...panelProps,
1501
- ref: setPanelRef,
1502
- id: panelId,
1503
- role,
1504
- tabIndex: resolvedTabIndex,
1048
+ ...rest,
1049
+ ref: forwardedRef,
1050
+ id,
1051
+ role: roleProp,
1052
+ tabIndex,
1505
1053
  "aria-modal": ariaModal,
1506
- className: twMerge(
1507
- panelBaseClasses,
1508
- fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
1509
- className
1510
- ),
1511
- style: resolvedPanelStyle,
1054
+ className: twMerge(panelBaseClasses, fullscreen ? "h-full w-full max-w-none rounded-none" : void 0, className),
1055
+ style: resolvedStyle,
1512
1056
  "data-state": state,
1513
- onClick: handleContentClick,
1514
1057
  children
1515
1058
  }
1516
1059
  ) })
1517
- ] }),
1518
- document.body
1519
- ) : null;
1520
- const activatorNode = activator ? activator({
1521
- ref: setActivatorNode,
1522
- id: activatorId,
1523
- disabled,
1524
- open,
1525
- "aria-haspopup": "dialog",
1526
- "aria-expanded": open,
1527
- "aria-controls": panelId,
1528
- onClick: handleActivatorClick,
1529
- onKeyDown: handleActivatorKeyDown
1530
- }) : null;
1531
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1532
- activatorNode,
1533
- dialogNode
1060
+ ] }) : null
1534
1061
  ] });
1535
1062
  });
1536
1063
  Dialog.displayName = "Dialog";
1537
1064
  var Dialog_default = Dialog;
1538
- var tooltipBaseClasses = "absolute z-[60] max-w-xs rounded-lg border border-white/10 bg-gray-900 px-3 py-2 text-xs font-medium text-white shadow-lg shadow-black/30 ring-1 ring-black/40 transition-all duration-150 data-[state=closed]:pointer-events-none data-[state=closed]:scale-95 data-[state=closed]:opacity-0 data-[state=open]:opacity-100 data-[state=open]:scale-100";
1065
+ var tooltipBaseClasses = "absolute z-[60] max-w-xs rounded-lg border border-white/10 bg-gray-900 px-3 py-2 text-xs font-medium text-white shadow-lg shadow-black/30 ring-1 ring-black/40 transition-all duration-150";
1539
1066
  var wrapperBaseClasses = "relative inline-flex max-w-full align-middle";
1540
1067
  var arrowBaseClasses = "pointer-events-none absolute h-2 w-2 rotate-45 border border-white/10 bg-gray-900 shadow-lg shadow-black/20";
1541
1068
  var resolveSizeValue2 = (value) => {
@@ -1572,259 +1099,70 @@ var arrowPlacementClasses = {
1572
1099
  "right-start": "left-full top-4 -translate-x-1/2",
1573
1100
  "right-end": "left-full bottom-4 -translate-x-1/2"
1574
1101
  };
1575
- var ToolTip = React5.forwardRef((props, forwardedRef) => {
1102
+ var ToolTip = React3.forwardRef((props, forwardedRef) => {
1576
1103
  const {
1577
1104
  activator,
1578
1105
  children,
1579
- open: openProp,
1580
- defaultOpen = false,
1581
- onOpenChange,
1582
1106
  placement = "top",
1583
- openDelay = 120,
1584
- closeDelay = 100,
1585
- openOnHover = true,
1586
- openOnFocus = true,
1587
- openOnClick = false,
1588
- interactive = false,
1589
1107
  arrow = true,
1590
1108
  disabled = false,
1109
+ persistent = false,
1110
+ showOnHover = true,
1111
+ showOnFocus = true,
1112
+ interactive = false,
1591
1113
  keepMounted = false,
1592
1114
  maxWidth = "18rem",
1593
1115
  wrapperClassName,
1594
- closeOnContentClick = false,
1595
1116
  className,
1596
1117
  style,
1597
- id: idProp,
1118
+ id,
1598
1119
  ...rest
1599
1120
  } = props;
1600
- const { onPointerEnter: tooltipPointerEnter, onPointerLeave: tooltipPointerLeave, onClick: tooltipOnClick, ...tooltipProps } = rest;
1601
- const baseId = React5.useId();
1602
- const tooltipId = idProp ?? `${baseId}-tooltip`;
1603
- const isControlled = typeof openProp === "boolean";
1604
- const [internalOpen, setInternalOpen] = React5.useState(defaultOpen);
1605
- const open = isControlled ? Boolean(openProp) : internalOpen;
1606
- const state = open ? "open" : "closed";
1607
- const describedBy = open || keepMounted ? tooltipId : void 0;
1608
- const openTimeoutRef = React5.useRef(null);
1609
- const closeTimeoutRef = React5.useRef(null);
1610
- const clearOpenTimer = React5.useCallback(() => {
1611
- if (openTimeoutRef.current !== null) {
1612
- window.clearTimeout(openTimeoutRef.current);
1613
- openTimeoutRef.current = null;
1121
+ const hasRenderableContent = children !== void 0 && children !== null;
1122
+ const shouldEnableTriggers = !disabled && (persistent || showOnHover || showOnFocus);
1123
+ const shouldRenderTooltip = hasRenderableContent && (shouldEnableTriggers || keepMounted);
1124
+ const resolvedStyle = { ...style };
1125
+ if (resolvedStyle.maxWidth === void 0) {
1126
+ resolvedStyle.maxWidth = resolveSizeValue2(maxWidth);
1127
+ }
1128
+ const baseVisibility = persistent ? "opacity-100 scale-100" : "opacity-0 scale-95";
1129
+ const hoverClasses = !persistent && showOnHover ? " group-hover/tooltip:opacity-100 group-hover/tooltip:scale-100" : "";
1130
+ const focusClasses = !persistent && showOnFocus ? " group-focus-within/tooltip:opacity-100 group-focus-within/tooltip:scale-100" : "";
1131
+ const visibilityClasses = `${baseVisibility}${hoverClasses}${focusClasses}`;
1132
+ const pointerClasses = (() => {
1133
+ if (persistent) {
1134
+ return "pointer-events-auto";
1614
1135
  }
1615
- }, []);
1616
- const clearCloseTimer = React5.useCallback(() => {
1617
- if (closeTimeoutRef.current !== null) {
1618
- window.clearTimeout(closeTimeoutRef.current);
1619
- closeTimeoutRef.current = null;
1136
+ if (!interactive) {
1137
+ return "pointer-events-none";
1620
1138
  }
1621
- }, []);
1622
- const setOpen = React5.useCallback(
1623
- (nextOpen) => {
1624
- if (!isControlled) {
1625
- setInternalOpen(nextOpen);
1626
- }
1627
- onOpenChange?.(nextOpen);
1628
- },
1629
- [isControlled, onOpenChange]
1630
- );
1631
- const scheduleOpen = React5.useCallback(
1632
- (source) => {
1633
- if (disabled) {
1634
- return;
1635
- }
1636
- clearCloseTimer();
1637
- const delay = source === "click" ? 0 : openDelay;
1638
- if (delay <= 0) {
1639
- setOpen(true);
1640
- return;
1641
- }
1642
- openTimeoutRef.current = window.setTimeout(() => setOpen(true), delay);
1643
- },
1644
- [clearCloseTimer, disabled, openDelay, setOpen]
1645
- );
1646
- const scheduleClose = React5.useCallback(
1647
- (source) => {
1648
- clearOpenTimer();
1649
- const delay = source === "click" ? 0 : closeDelay;
1650
- if (delay <= 0) {
1651
- setOpen(false);
1652
- return;
1653
- }
1654
- closeTimeoutRef.current = window.setTimeout(() => setOpen(false), delay);
1655
- },
1656
- [clearOpenTimer, closeDelay, setOpen]
1657
- );
1658
- React5.useEffect(() => {
1659
- if (!disabled) {
1660
- return;
1139
+ const classes = ["pointer-events-none"];
1140
+ if (showOnHover) {
1141
+ classes.push("group-hover/tooltip:pointer-events-auto");
1661
1142
  }
1662
- clearOpenTimer();
1663
- clearCloseTimer();
1664
- if (open) {
1665
- setOpen(false);
1666
- }
1667
- }, [clearCloseTimer, clearOpenTimer, disabled, open, setOpen]);
1668
- React5.useEffect(
1669
- () => () => {
1670
- clearOpenTimer();
1671
- clearCloseTimer();
1672
- },
1673
- [clearCloseTimer, clearOpenTimer]
1674
- );
1675
- const handleActivatorPointerEnter = React5.useCallback(
1676
- (event) => {
1677
- if (event.pointerType === "touch") {
1678
- return;
1679
- }
1680
- if (openOnHover) {
1681
- scheduleOpen("hover");
1682
- }
1683
- },
1684
- [openOnHover, scheduleOpen]
1685
- );
1686
- const handleActivatorPointerLeave = React5.useCallback(
1687
- (event) => {
1688
- if (event.pointerType === "touch") {
1689
- return;
1690
- }
1691
- if (openOnHover) {
1692
- scheduleClose("hover");
1693
- }
1694
- },
1695
- [openOnHover, scheduleClose]
1696
- );
1697
- const handleActivatorFocus = React5.useCallback(
1698
- () => {
1699
- if (openOnFocus) {
1700
- scheduleOpen("focus");
1701
- }
1702
- },
1703
- [openOnFocus, scheduleOpen]
1704
- );
1705
- const handleActivatorBlur = React5.useCallback(
1706
- () => {
1707
- if (openOnFocus) {
1708
- scheduleClose("focus");
1709
- }
1710
- },
1711
- [openOnFocus, scheduleClose]
1712
- );
1713
- const handleActivatorClick = React5.useCallback(
1714
- (event) => {
1715
- if (!openOnClick) {
1716
- return;
1717
- }
1718
- event.preventDefault();
1719
- event.stopPropagation();
1720
- if (disabled) {
1721
- return;
1722
- }
1723
- if (open) {
1724
- scheduleClose("click");
1725
- } else {
1726
- scheduleOpen("click");
1727
- }
1728
- },
1729
- [disabled, open, openOnClick, scheduleClose, scheduleOpen]
1730
- );
1731
- const handleActivatorKeyDown = React5.useCallback(
1732
- (event) => {
1733
- if (!openOnClick) {
1734
- return;
1735
- }
1736
- if (event.key !== "Enter" && event.key !== " ") {
1737
- return;
1738
- }
1739
- event.preventDefault();
1740
- if (open) {
1741
- scheduleClose("click");
1742
- } else {
1743
- scheduleOpen("click");
1744
- }
1745
- },
1746
- [open, openOnClick, scheduleClose, scheduleOpen]
1747
- );
1748
- const handleTooltipPointerEnter = React5.useCallback(
1749
- (event) => {
1750
- tooltipPointerEnter?.(event);
1751
- if (event.defaultPrevented) {
1752
- return;
1753
- }
1754
- if (interactive) {
1755
- clearCloseTimer();
1756
- }
1757
- },
1758
- [clearCloseTimer, interactive, tooltipPointerEnter]
1759
- );
1760
- const handleTooltipPointerLeave = React5.useCallback(
1761
- (event) => {
1762
- tooltipPointerLeave?.(event);
1763
- if (event.defaultPrevented) {
1764
- return;
1765
- }
1766
- if (interactive) {
1767
- scheduleClose("hover");
1768
- }
1769
- },
1770
- [interactive, scheduleClose, tooltipPointerLeave]
1771
- );
1772
- const handleTooltipClick = React5.useCallback(
1773
- (event) => {
1774
- tooltipOnClick?.(event);
1775
- if (event.defaultPrevented) {
1776
- return;
1777
- }
1778
- if (closeOnContentClick) {
1779
- scheduleClose("click");
1780
- }
1781
- },
1782
- [closeOnContentClick, scheduleClose, tooltipOnClick]
1783
- );
1784
- const hasRenderableContent = children !== void 0 && children !== null;
1785
- const shouldRenderTooltip = hasRenderableContent && (open || keepMounted);
1786
- const pointerClass = interactive ? "pointer-events-auto" : "pointer-events-none";
1787
- const resolvedStyle = React5.useMemo(() => {
1788
- const nextStyle = { ...style };
1789
- if (nextStyle.maxWidth === void 0) {
1790
- nextStyle.maxWidth = resolveSizeValue2(maxWidth);
1143
+ if (showOnFocus) {
1144
+ classes.push("group-focus-within/tooltip:pointer-events-auto");
1791
1145
  }
1792
- return nextStyle;
1793
- }, [maxWidth, style]);
1794
- const activatorNode = activator({
1795
- id: `${tooltipId}-activator`,
1796
- open,
1797
- disabled,
1798
- "aria-describedby": describedBy,
1799
- onPointerEnter: handleActivatorPointerEnter,
1800
- onPointerLeave: handleActivatorPointerLeave,
1801
- onFocus: handleActivatorFocus,
1802
- onBlur: handleActivatorBlur,
1803
- onClick: openOnClick ? handleActivatorClick : void 0,
1804
- onKeyDown: openOnClick ? handleActivatorKeyDown : void 0
1805
- });
1806
- return /* @__PURE__ */ jsxs("span", { className: twMerge(wrapperBaseClasses, wrapperClassName), children: [
1807
- activatorNode,
1808
- shouldRenderTooltip && /* @__PURE__ */ jsxs(
1146
+ return classes.join(" ");
1147
+ })();
1148
+ return /* @__PURE__ */ jsxs("span", { className: twMerge(wrapperBaseClasses, "group/tooltip", wrapperClassName), "data-disabled": disabled || void 0, children: [
1149
+ /* @__PURE__ */ jsx("span", { className: "inline-flex max-w-full", children: activator }),
1150
+ shouldRenderTooltip ? /* @__PURE__ */ jsxs(
1809
1151
  "div",
1810
1152
  {
1811
- ...tooltipProps,
1153
+ ...rest,
1812
1154
  ref: forwardedRef,
1813
1155
  role: "tooltip",
1814
- id: tooltipId,
1815
- "aria-hidden": !open,
1816
- "data-state": state,
1817
- className: twMerge(tooltipBaseClasses, placementClasses2[placement], pointerClass, className),
1156
+ id,
1157
+ "aria-hidden": persistent || disabled ? void 0 : true,
1158
+ className: twMerge(tooltipBaseClasses, placementClasses2[placement], visibilityClasses, pointerClasses, className),
1818
1159
  style: resolvedStyle,
1819
- onPointerEnter: handleTooltipPointerEnter,
1820
- onPointerLeave: handleTooltipPointerLeave,
1821
- onClick: handleTooltipClick,
1822
1160
  children: [
1823
1161
  children,
1824
1162
  arrow && /* @__PURE__ */ jsx("span", { className: twMerge(arrowBaseClasses, arrowPlacementClasses[placement]), "aria-hidden": true, "data-arrow": true })
1825
1163
  ]
1826
1164
  }
1827
- )
1165
+ ) : null
1828
1166
  ] });
1829
1167
  });
1830
1168
  ToolTip.displayName = "ToolTip";