@underverse-ui/underverse 1.0.93 → 1.0.95

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.d.cts CHANGED
@@ -465,7 +465,7 @@ declare const ToastProvider: React__default.FC<ToastProviderProps>;
465
465
 
466
466
  type Side = "top" | "right" | "bottom" | "left";
467
467
  type TooltipPlacement = Side;
468
- interface TooltipProps {
468
+ declare const Tooltip: React$1.ForwardRefExoticComponent<Omit<React$1.HTMLAttributes<HTMLElement>, "children" | "content"> & {
469
469
  children: React$1.ReactElement;
470
470
  content: React$1.ReactNode;
471
471
  placement?: TooltipPlacement;
@@ -476,8 +476,9 @@ interface TooltipProps {
476
476
  className?: string;
477
477
  disabled?: boolean;
478
478
  variant?: "default" | "info" | "warning" | "error" | "success";
479
- }
480
- declare const Tooltip: React$1.FC<TooltipProps>;
479
+ /** When true, augment the child directly instead of adding a wrapper. Default: true */
480
+ asChild?: boolean;
481
+ } & React$1.RefAttributes<HTMLElement>>;
481
482
 
482
483
  type PopoverPlacement = "top" | "bottom" | "left" | "right" | "top-start" | "bottom-start" | "top-end" | "bottom-end";
483
484
  interface PopoverProps {
package/dist/index.d.ts CHANGED
@@ -465,7 +465,7 @@ declare const ToastProvider: React__default.FC<ToastProviderProps>;
465
465
 
466
466
  type Side = "top" | "right" | "bottom" | "left";
467
467
  type TooltipPlacement = Side;
468
- interface TooltipProps {
468
+ declare const Tooltip: React$1.ForwardRefExoticComponent<Omit<React$1.HTMLAttributes<HTMLElement>, "children" | "content"> & {
469
469
  children: React$1.ReactElement;
470
470
  content: React$1.ReactNode;
471
471
  placement?: TooltipPlacement;
@@ -476,8 +476,9 @@ interface TooltipProps {
476
476
  className?: string;
477
477
  disabled?: boolean;
478
478
  variant?: "default" | "info" | "warning" | "error" | "success";
479
- }
480
- declare const Tooltip: React$1.FC<TooltipProps>;
479
+ /** When true, augment the child directly instead of adding a wrapper. Default: true */
480
+ asChild?: boolean;
481
+ } & React$1.RefAttributes<HTMLElement>>;
481
482
 
482
483
  type PopoverPlacement = "top" | "bottom" | "left" | "right" | "top-start" | "bottom-start" | "top-end" | "bottom-end";
483
484
  interface PopoverProps {
package/dist/index.js CHANGED
@@ -481,13 +481,13 @@ var Card = React2.forwardRef(
481
481
  "h3",
482
482
  {
483
483
  className: cn(
484
- "min-w-0 text-base md:text-lg font-semibold leading-tight tracking-tight break-words [overflow-wrap:anywhere] transition-colors duration-200 max-md:text-sm",
484
+ "min-w-0 text-base md:text-lg font-semibold leading-tight tracking-tight wrap-anywhere transition-colors duration-200 max-md:text-sm",
485
485
  hoverable && "group-hover:text-primary"
486
486
  ),
487
487
  children: title
488
488
  }
489
489
  ),
490
- description && /* @__PURE__ */ jsx3("p", { className: "min-w-0 text-sm md:text-base text-muted-foreground leading-relaxed break-words [overflow-wrap:anywhere]", children: description })
490
+ description && /* @__PURE__ */ jsx3("p", { className: "min-w-0 text-sm md:text-base text-muted-foreground leading-relaxed wrap-anywhere", children: description })
491
491
  ] }),
492
492
  children && /* @__PURE__ */ jsx3("div", { className: cn("relative", defaultPaddingX, defaultPaddingY, contentClassName), children }),
493
493
  footer && /* @__PURE__ */ jsx3(
@@ -2745,6 +2745,26 @@ function useHydrated() {
2745
2745
  return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
2746
2746
  }
2747
2747
 
2748
+ // src/utils/react-compose.ts
2749
+ function chainEventHandlers(...handlers) {
2750
+ return (event) => {
2751
+ handlers.forEach((handler) => handler?.(event));
2752
+ };
2753
+ }
2754
+ function setRefValue(ref, value) {
2755
+ if (!ref) return;
2756
+ if (typeof ref === "function") {
2757
+ ref(value);
2758
+ return;
2759
+ }
2760
+ ref.current = value;
2761
+ }
2762
+ function mergeRefs(...refs) {
2763
+ return (value) => {
2764
+ refs.forEach((ref) => setRefValue(ref, value));
2765
+ };
2766
+ }
2767
+
2748
2768
  // src/components/Tooltip.tsx
2749
2769
  import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
2750
2770
  var variantStyles2 = {
@@ -2799,15 +2819,17 @@ function computeTooltipPosition(args) {
2799
2819
  top = clamp(top, padding, viewport.height - contentSize.height - padding);
2800
2820
  return { top, left, side };
2801
2821
  }
2802
- var Tooltip = ({
2822
+ var Tooltip = React9.forwardRef(({
2803
2823
  children,
2804
2824
  content,
2805
2825
  placement = "top",
2806
2826
  delay = { open: 200, close: 300 },
2807
2827
  className,
2808
2828
  disabled = false,
2809
- variant = "default"
2810
- }) => {
2829
+ variant = "default",
2830
+ asChild = true,
2831
+ ...triggerPassthroughProps
2832
+ }, forwardedRef) => {
2811
2833
  const [isOpen, setIsOpen] = React9.useState(false);
2812
2834
  const isMounted = useHydrated();
2813
2835
  const triggerRef = React9.useRef(null);
@@ -2922,40 +2944,57 @@ var Tooltip = ({
2922
2944
  if (panelRef.current) ro.observe(panelRef.current);
2923
2945
  return () => ro.disconnect();
2924
2946
  }, [isOpen, updatePosition]);
2947
+ const childProps = children.props;
2948
+ const childRef = childProps.ref;
2949
+ const passthroughRef = mergeRefs(forwardedRef, childRef, (node) => {
2950
+ triggerRef.current = node;
2951
+ });
2925
2952
  if (disabled || !content) {
2926
- return children;
2953
+ if (!asChild) return children;
2954
+ return React9.cloneElement(children, {
2955
+ ...triggerPassthroughProps,
2956
+ ref: passthroughRef
2957
+ });
2927
2958
  }
2959
+ const triggerProps = {
2960
+ ...triggerPassthroughProps,
2961
+ ref: passthroughRef,
2962
+ "data-underverse-tooltip-trigger": triggerSelector,
2963
+ onMouseEnter: chainEventHandlers(
2964
+ triggerPassthroughProps.onMouseEnter,
2965
+ childProps.onMouseEnter,
2966
+ (e) => {
2967
+ triggerRef.current = e.currentTarget;
2968
+ handleMouseEnter();
2969
+ }
2970
+ ),
2971
+ onMouseLeave: chainEventHandlers(
2972
+ triggerPassthroughProps.onMouseLeave,
2973
+ childProps.onMouseLeave,
2974
+ (e) => {
2975
+ triggerRef.current = e.currentTarget;
2976
+ handleMouseLeave();
2977
+ }
2978
+ ),
2979
+ onFocus: chainEventHandlers(
2980
+ triggerPassthroughProps.onFocus,
2981
+ childProps.onFocus,
2982
+ (e) => {
2983
+ triggerRef.current = e.currentTarget;
2984
+ handleFocus();
2985
+ }
2986
+ ),
2987
+ onBlur: chainEventHandlers(
2988
+ triggerPassthroughProps.onBlur,
2989
+ childProps.onBlur,
2990
+ (e) => {
2991
+ handleBlur();
2992
+ }
2993
+ )
2994
+ };
2995
+ const trigger = asChild ? React9.cloneElement(children, triggerProps) : /* @__PURE__ */ jsx10("span", { ...triggerProps, children });
2928
2996
  return /* @__PURE__ */ jsxs6(Fragment2, { children: [
2929
- (() => {
2930
- const TriggerComponent = children.type;
2931
- const triggerProps = children.props;
2932
- return /* @__PURE__ */ jsx10(
2933
- TriggerComponent,
2934
- {
2935
- ...triggerProps,
2936
- "data-underverse-tooltip-trigger": triggerSelector,
2937
- onMouseEnter: (e) => {
2938
- triggerRef.current = e.currentTarget;
2939
- handleMouseEnter();
2940
- if (typeof triggerProps.onMouseEnter === "function") triggerProps.onMouseEnter(e);
2941
- },
2942
- onMouseLeave: (e) => {
2943
- triggerRef.current = e.currentTarget;
2944
- handleMouseLeave();
2945
- if (typeof triggerProps.onMouseLeave === "function") triggerProps.onMouseLeave(e);
2946
- },
2947
- onFocus: (e) => {
2948
- triggerRef.current = e.currentTarget;
2949
- handleFocus();
2950
- if (typeof triggerProps.onFocus === "function") triggerProps.onFocus(e);
2951
- },
2952
- onBlur: (e) => {
2953
- handleBlur();
2954
- if (typeof triggerProps.onBlur === "function") triggerProps.onBlur(e);
2955
- }
2956
- }
2957
- );
2958
- })(),
2997
+ trigger,
2959
2998
  isMounted && isOpen && createPortal(
2960
2999
  /* @__PURE__ */ jsx10(
2961
3000
  "div",
@@ -2995,7 +3034,8 @@ var Tooltip = ({
2995
3034
  document.body
2996
3035
  )
2997
3036
  ] });
2998
- };
3037
+ });
3038
+ Tooltip.displayName = "Tooltip";
2999
3039
 
3000
3040
  // src/components/emoji-ui.tsx
3001
3041
  import { jsx as jsx11 } from "react/jsx-runtime";
@@ -3963,10 +4003,10 @@ var EmojiPicker = ({
3963
4003
  var EmojiPicker_default = EmojiPicker;
3964
4004
 
3965
4005
  // src/components/TagInput.tsx
3966
- import { forwardRef as forwardRef4, useState as useState7, useRef as useRef5, useId as useId3 } from "react";
4006
+ import { forwardRef as forwardRef5, useState as useState7, useRef as useRef5, useId as useId3 } from "react";
3967
4007
  import { X as X3, Search as Search3, Loader2 as Loader22 } from "lucide-react";
3968
4008
  import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
3969
- var TagInput = forwardRef4(
4009
+ var TagInput = forwardRef5(
3970
4010
  ({
3971
4011
  value = [],
3972
4012
  onChange,
@@ -5920,36 +5960,32 @@ var Popover = ({
5920
5960
  ) : null;
5921
5961
  return /* @__PURE__ */ jsxs15(Fragment4, { children: [
5922
5962
  (() => {
5923
- const TriggerComponent = trigger.type;
5924
5963
  const triggerProps = trigger.props;
5925
- return /* @__PURE__ */ jsx22(
5926
- TriggerComponent,
5927
- {
5928
- ...triggerProps,
5929
- "data-underverse-popover-trigger": triggerSelector,
5930
- onClick: (e) => {
5964
+ const childRef = triggerProps.ref;
5965
+ return React18.cloneElement(trigger, {
5966
+ ...triggerProps,
5967
+ ref: mergeRefs(childRef, (node) => {
5968
+ triggerRef.current = node;
5969
+ }),
5970
+ "data-underverse-popover-trigger": triggerSelector,
5971
+ onClick: chainEventHandlers(
5972
+ (e) => {
5931
5973
  triggerRef.current = e.currentTarget;
5932
5974
  e.preventDefault();
5933
5975
  e.stopPropagation();
5934
5976
  handleTriggerClick();
5935
- if (typeof triggerProps.onClick === "function") {
5936
- triggerProps.onClick(e);
5937
- }
5938
5977
  },
5939
- onFocus: (e) => {
5978
+ triggerProps.onClick
5979
+ ),
5980
+ onFocus: chainEventHandlers(
5981
+ (e) => {
5940
5982
  triggerRef.current = e.currentTarget;
5941
- if (typeof triggerProps.onFocus === "function") {
5942
- triggerProps.onFocus(e);
5943
- }
5944
5983
  },
5945
- "aria-expanded": isOpen,
5946
- "aria-haspopup": triggerProps["aria-haspopup"] ?? "dialog",
5947
- className: cn(
5948
- triggerProps.className,
5949
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
5950
- )
5951
- }
5952
- );
5984
+ triggerProps.onFocus
5985
+ ),
5986
+ "aria-expanded": isOpen,
5987
+ "aria-haspopup": triggerProps["aria-haspopup"] ?? "dialog"
5988
+ });
5953
5989
  })(),
5954
5990
  popoverContent
5955
5991
  ] });
@@ -6828,17 +6864,18 @@ var DropdownMenu = ({
6828
6864
  index
6829
6865
  );
6830
6866
  }) : children });
6831
- const TriggerComponent = trigger.type;
6832
6867
  const triggerProps = trigger.props;
6833
- const enhancedTrigger = /* @__PURE__ */ jsx28(
6834
- TriggerComponent,
6835
- {
6836
- ...triggerProps,
6837
- "aria-haspopup": "menu",
6838
- "aria-expanded": open,
6839
- onKeyDown: (e) => {
6840
- triggerRef.current = e.currentTarget;
6841
- if (disabled) return;
6868
+ const childRef = triggerProps.ref;
6869
+ const enhancedTrigger = React23.cloneElement(trigger, {
6870
+ ...triggerProps,
6871
+ ref: mergeRefs(childRef, (node) => {
6872
+ triggerRef.current = node;
6873
+ }),
6874
+ "aria-haspopup": "menu",
6875
+ "aria-expanded": open,
6876
+ onKeyDown: chainEventHandlers((e) => {
6877
+ triggerRef.current = e.currentTarget;
6878
+ if (!disabled) {
6842
6879
  if (e.key === "ArrowDown") {
6843
6880
  e.preventDefault();
6844
6881
  setOpen(true);
@@ -6854,22 +6891,12 @@ var DropdownMenu = ({
6854
6891
  e.preventDefault();
6855
6892
  setOpen(false);
6856
6893
  }
6857
- if (typeof triggerProps.onKeyDown === "function") {
6858
- triggerProps.onKeyDown(e);
6859
- }
6860
- },
6861
- onFocus: (e) => {
6862
- triggerRef.current = e.currentTarget;
6863
- if (typeof triggerProps.onFocus === "function") {
6864
- triggerProps.onFocus(e);
6865
- }
6866
- },
6867
- className: cn(
6868
- triggerProps.className,
6869
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
6870
- )
6871
- }
6872
- );
6894
+ }
6895
+ }, triggerProps.onKeyDown),
6896
+ onFocus: chainEventHandlers((e) => {
6897
+ triggerRef.current = e.currentTarget;
6898
+ }, triggerProps.onFocus)
6899
+ });
6873
6900
  return /* @__PURE__ */ jsx28(
6874
6901
  Popover,
6875
6902
  {
@@ -7801,7 +7828,7 @@ Section.displayName = "Section";
7801
7828
  var Section_default = Section;
7802
7829
 
7803
7830
  // src/components/ScrollArea.tsx
7804
- import { forwardRef as forwardRef6, useRef as useRef11 } from "react";
7831
+ import { forwardRef as forwardRef7, useRef as useRef11 } from "react";
7805
7832
  import { jsx as jsx32 } from "react/jsx-runtime";
7806
7833
  var variantClasses2 = {
7807
7834
  default: "bg-background",
@@ -7809,7 +7836,7 @@ var variantClasses2 = {
7809
7836
  primary: "bg-primary/5",
7810
7837
  accent: "bg-accent/10"
7811
7838
  };
7812
- var ScrollArea = forwardRef6(
7839
+ var ScrollArea = forwardRef7(
7813
7840
  ({
7814
7841
  className,
7815
7842
  contentClassName,
@@ -7836,9 +7863,9 @@ var ScrollArea = forwardRef6(
7836
7863
  ScrollArea.displayName = "ScrollArea";
7837
7864
 
7838
7865
  // src/components/OverlayScrollArea.tsx
7839
- import { forwardRef as forwardRef7, useRef as useRef12 } from "react";
7866
+ import { forwardRef as forwardRef8, useRef as useRef12 } from "react";
7840
7867
  import { jsx as jsx33 } from "react/jsx-runtime";
7841
- var OverlayScrollArea = forwardRef7(
7868
+ var OverlayScrollArea = forwardRef8(
7842
7869
  ({ className, viewportClassName, viewportProps, enabled = true, overflowHidden = true, overlayScrollbarOptions, children, ...props }, ref) => {
7843
7870
  const viewportRef = useRef12(null);
7844
7871
  useOverlayScrollbarTarget(viewportRef, {
@@ -17052,7 +17079,7 @@ function CategoryTreeSelect(props) {
17052
17079
  // View-only mode: just display the name with folder icon
17053
17080
  /* @__PURE__ */ jsxs39("div", { className: cn("flex min-w-0 items-center", TREE_NODE_GAP_CLASS), children: [
17054
17081
  category.icon ? /* @__PURE__ */ jsx49("div", { className: "h-4 w-4 shrink-0 flex items-center justify-center text-muted-foreground/60", children: category.icon }) : hasChildren ? /* @__PURE__ */ jsx49(FolderTree, { className: "h-4 w-4 shrink-0 text-muted-foreground/60" }) : /* @__PURE__ */ jsx49("div", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/40" }),
17055
- /* @__PURE__ */ jsx49("span", { className: "min-w-0 text-sm font-medium leading-snug break-words [overflow-wrap:anywhere]", children: category.name })
17082
+ /* @__PURE__ */ jsx49("span", { className: "min-w-0 text-sm font-medium leading-snug wrap-anywhere", children: category.name })
17056
17083
  ] })
17057
17084
  ) : (
17058
17085
  // Single/Multi select mode: icon + text + badge
@@ -17062,7 +17089,7 @@ function CategoryTreeSelect(props) {
17062
17089
  "span",
17063
17090
  {
17064
17091
  className: cn(
17065
- "min-w-0 flex-1 text-sm leading-snug break-words [overflow-wrap:anywhere] transition-all duration-200",
17092
+ "min-w-0 flex-1 text-sm leading-snug wrap-anywhere transition-all duration-200",
17066
17093
  isSelected ? "font-semibold text-primary" : "text-foreground/80",
17067
17094
  !isSelectable && "text-foreground"
17068
17095
  ),
@@ -22916,7 +22943,7 @@ import { common, createLowlight } from "lowlight";
22916
22943
  import { Extension } from "@tiptap/core";
22917
22944
  import Suggestion from "@tiptap/suggestion";
22918
22945
  import { ReactRenderer } from "@tiptap/react";
22919
- import React66, { forwardRef as forwardRef13, useEffect as useEffect31, useImperativeHandle, useRef as useRef26 } from "react";
22946
+ import React66, { forwardRef as forwardRef14, useEffect as useEffect31, useImperativeHandle, useRef as useRef26 } from "react";
22920
22947
  import {
22921
22948
  FileCode as FileCode2,
22922
22949
  Heading1,
@@ -23120,7 +23147,7 @@ function buildSlashCommandItems({
23120
23147
  }
23121
23148
  ].filter((item) => item.title.toLowerCase().includes(query.toLowerCase()));
23122
23149
  }
23123
- var SlashCommandList = forwardRef13((props, ref) => {
23150
+ var SlashCommandList = forwardRef14((props, ref) => {
23124
23151
  const [selectedIndex, setSelectedIndex] = useResettingIndex2(props.items);
23125
23152
  const listRef = useRef26(null);
23126
23153
  useEffect31(() => {
@@ -23361,7 +23388,7 @@ import { Extension as Extension3 } from "@tiptap/core";
23361
23388
  import Suggestion2 from "@tiptap/suggestion";
23362
23389
  import { ReactRenderer as ReactRenderer2 } from "@tiptap/react";
23363
23390
  import { PluginKey } from "@tiptap/pm/state";
23364
- import React67, { forwardRef as forwardRef14, useImperativeHandle as useImperativeHandle2 } from "react";
23391
+ import React67, { forwardRef as forwardRef15, useImperativeHandle as useImperativeHandle2 } from "react";
23365
23392
  import { Smile as Smile2 } from "lucide-react";
23366
23393
  import { jsx as jsx75, jsxs as jsxs63 } from "react/jsx-runtime";
23367
23394
  function useResettingIndex3(resetToken) {
@@ -23378,7 +23405,7 @@ function useResettingIndex3(resetToken) {
23378
23405
  }, [resetToken]);
23379
23406
  return [selectedIndex, setSelectedIndex];
23380
23407
  }
23381
- var EmojiList = forwardRef14((props, ref) => {
23408
+ var EmojiList = forwardRef15((props, ref) => {
23382
23409
  const t = useSmartTranslations("UEditor");
23383
23410
  const [selectedIndex, setSelectedIndex] = useResettingIndex3(props.items);
23384
23411
  const showingCountLabel = formatEmojiCountLabel(t("emojiSuggestion.showingCount"), 64, props.items.length);