@underverse-ui/underverse 1.0.92 → 1.0.94

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
@@ -476,6 +476,8 @@ interface TooltipProps {
476
476
  className?: string;
477
477
  disabled?: boolean;
478
478
  variant?: "default" | "info" | "warning" | "error" | "success";
479
+ /** When true, augment the child directly instead of adding a wrapper. Default: true */
480
+ asChild?: boolean;
479
481
  }
480
482
  declare const Tooltip: React$1.FC<TooltipProps>;
481
483
 
package/dist/index.d.ts CHANGED
@@ -476,6 +476,8 @@ interface TooltipProps {
476
476
  className?: string;
477
477
  disabled?: boolean;
478
478
  variant?: "default" | "info" | "warning" | "error" | "success";
479
+ /** When true, augment the child directly instead of adding a wrapper. Default: true */
480
+ asChild?: boolean;
479
481
  }
480
482
  declare const Tooltip: React$1.FC<TooltipProps>;
481
483
 
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(
@@ -2755,6 +2755,25 @@ var variantStyles2 = {
2755
2755
  success: "bg-success text-success-foreground border-success/20"
2756
2756
  };
2757
2757
  var clamp = (value, min, max) => Math.max(min, Math.min(max, value));
2758
+ function composeEventHandlers(theirHandler, ourHandler) {
2759
+ return (event) => {
2760
+ theirHandler?.(event);
2761
+ ourHandler(event);
2762
+ };
2763
+ }
2764
+ function setRefValue(ref, value) {
2765
+ if (!ref) return;
2766
+ if (typeof ref === "function") {
2767
+ ref(value);
2768
+ return;
2769
+ }
2770
+ ref.current = value;
2771
+ }
2772
+ function mergeRefs(...refs) {
2773
+ return (value) => {
2774
+ refs.forEach((ref) => setRefValue(ref, value));
2775
+ };
2776
+ }
2758
2777
  function getTransformOrigin(side) {
2759
2778
  switch (side) {
2760
2779
  case "top":
@@ -2806,7 +2825,8 @@ var Tooltip = ({
2806
2825
  delay = { open: 200, close: 300 },
2807
2826
  className,
2808
2827
  disabled = false,
2809
- variant = "default"
2828
+ variant = "default",
2829
+ asChild = true
2810
2830
  }) => {
2811
2831
  const [isOpen, setIsOpen] = React9.useState(false);
2812
2832
  const isMounted = useHydrated();
@@ -2925,37 +2945,32 @@ var Tooltip = ({
2925
2945
  if (disabled || !content) {
2926
2946
  return children;
2927
2947
  }
2948
+ const childProps = children.props;
2949
+ const childRef = children.ref ?? childProps.ref;
2950
+ const triggerProps = {
2951
+ ref: mergeRefs(childRef, (node) => {
2952
+ triggerRef.current = node;
2953
+ }),
2954
+ "data-underverse-tooltip-trigger": triggerSelector,
2955
+ onMouseEnter: composeEventHandlers(childProps.onMouseEnter, (e) => {
2956
+ triggerRef.current = e.currentTarget;
2957
+ handleMouseEnter();
2958
+ }),
2959
+ onMouseLeave: composeEventHandlers(childProps.onMouseLeave, (e) => {
2960
+ triggerRef.current = e.currentTarget;
2961
+ handleMouseLeave();
2962
+ }),
2963
+ onFocus: composeEventHandlers(childProps.onFocus, (e) => {
2964
+ triggerRef.current = e.currentTarget;
2965
+ handleFocus();
2966
+ }),
2967
+ onBlur: composeEventHandlers(childProps.onBlur, () => {
2968
+ handleBlur();
2969
+ })
2970
+ };
2971
+ const trigger = asChild ? React9.cloneElement(children, triggerProps) : /* @__PURE__ */ jsx10("span", { ...triggerProps, children });
2928
2972
  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
- })(),
2973
+ trigger,
2959
2974
  isMounted && isOpen && createPortal(
2960
2975
  /* @__PURE__ */ jsx10(
2961
2976
  "div",
@@ -9569,7 +9584,7 @@ function WheelColumn({
9569
9584
  ref: scrollRef,
9570
9585
  className: cn(
9571
9586
  "h-full overflow-y-auto overscroll-contain snap-y snap-mandatory",
9572
- "select-none cursor-grab active:cursor-grabbing",
9587
+ "select-none",
9573
9588
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-xl",
9574
9589
  "[scrollbar-width:none] [-ms-overflow-style:none]",
9575
9590
  "[&::-webkit-scrollbar]:hidden"
@@ -9580,15 +9595,7 @@ function WheelColumn({
9580
9595
  tabIndex: focused ? 0 : -1,
9581
9596
  onKeyDown: (e) => onKeyDown(e, column),
9582
9597
  onFocus: () => setFocusedColumn(column),
9583
- onScroll: () => {
9584
- if (draggingRef.current) return;
9585
- if (inertialRef.current) return;
9586
- handleScroll();
9587
- },
9588
- onPointerDown,
9589
- onPointerMove,
9590
- onPointerUp: (e) => endDrag(e.pointerId),
9591
- onPointerCancel: (e) => endDrag(e.pointerId),
9598
+ onScroll: handleScroll,
9592
9599
  children: /* @__PURE__ */ jsx35("div", { children: extendedItems.map((n, index) => {
9593
9600
  const dist = Math.abs(index - currentVirtual);
9594
9601
  const distForVisual = Math.min(dist, 2);
@@ -11051,7 +11058,7 @@ function WheelColumn2({
11051
11058
  ref: scrollRef,
11052
11059
  className: cn(
11053
11060
  "h-full overflow-y-auto overscroll-contain snap-y snap-mandatory",
11054
- "select-none cursor-grab active:cursor-grabbing",
11061
+ "select-none",
11055
11062
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-xl",
11056
11063
  "[scrollbar-width:none] [-ms-overflow-style:none]",
11057
11064
  "[&::-webkit-scrollbar]:hidden"
@@ -11062,15 +11069,7 @@ function WheelColumn2({
11062
11069
  tabIndex: focused ? 0 : -1,
11063
11070
  onKeyDown: (e) => onKeyDown(e, column),
11064
11071
  onFocus: () => setFocusedColumn(column),
11065
- onScroll: () => {
11066
- if (draggingRef.current) return;
11067
- if (inertialRef.current) return;
11068
- handleScroll();
11069
- },
11070
- onPointerDown,
11071
- onPointerMove,
11072
- onPointerUp: (e) => endDrag(e.pointerId),
11073
- onPointerCancel: (e) => endDrag(e.pointerId),
11072
+ onScroll: handleScroll,
11074
11073
  children: /* @__PURE__ */ jsx37("div", { children: extendedItems.map((n, index) => {
11075
11074
  const dist = Math.abs(index - currentVirtual);
11076
11075
  const distForVisual = Math.min(dist, 2);
@@ -11145,6 +11144,14 @@ function formatTime2({ h, m, s, p }, fmt, includeSeconds) {
11145
11144
  const base2 = `${pad(h)}:${pad(m)}`;
11146
11145
  return includeSeconds ? `${base2}:${pad(s)}` : base2;
11147
11146
  }
11147
+ function isCompleteTimeInput(input, fmt, includeSeconds) {
11148
+ const trimmed = input.trim().toUpperCase();
11149
+ if (!trimmed) return false;
11150
+ if (fmt === "12") {
11151
+ return includeSeconds ? /^\d{1,2}:\d{2}:\d{2}\s?(AM|PM)$/.test(trimmed) : /^\d{1,2}:\d{2}\s?(AM|PM)$/.test(trimmed);
11152
+ }
11153
+ return includeSeconds ? /^\d{1,2}:\d{2}:\d{2}$/.test(trimmed) : /^\d{1,2}:\d{2}$/.test(trimmed);
11154
+ }
11148
11155
  var PRESETS = {
11149
11156
  morning: { h: 9, m: 0, s: 0, icon: Coffee, label: "Morning", color: "from-amber-400 to-orange-400" },
11150
11157
  afternoon: { h: 14, m: 0, s: 0, icon: Sun, label: "Afternoon", color: "from-yellow-400 to-amber-400" },
@@ -11186,24 +11193,38 @@ function TimePicker({
11186
11193
  ...rest
11187
11194
  }) {
11188
11195
  const tv = useSmartTranslations("ValidationInput");
11196
+ const autoId = React31.useId();
11189
11197
  const isControlled = value !== void 0;
11190
11198
  const now = /* @__PURE__ */ new Date();
11191
11199
  const initial = parseTime(isControlled ? value : defaultValue, format, includeSeconds) || (format === "12" ? { h: now.getHours() % 12 || 12, m: now.getMinutes(), s: now.getSeconds(), p: now.getHours() >= 12 ? "PM" : "AM" } : { h: now.getHours(), m: now.getMinutes(), s: now.getSeconds() });
11192
11200
  const [open, setOpen] = React31.useState(false);
11193
11201
  const [parts, setParts] = React31.useState(initial);
11194
- const [manualInput, setManualInput] = React31.useState("");
11202
+ const [manualInput, setManualInput] = React31.useState(formatTime2(initial, format, includeSeconds));
11203
+ const [isDirectEditing, setIsDirectEditing] = React31.useState(false);
11195
11204
  const [focusedColumn, setFocusedColumn] = React31.useState(null);
11196
11205
  const [localRequiredError, setLocalRequiredError] = React31.useState();
11197
11206
  const [hasCommittedValue, setHasCommittedValue] = React31.useState(Boolean(isControlled ? value : defaultValue));
11198
11207
  const hourScrollRef = React31.useRef(null);
11199
11208
  const minuteScrollRef = React31.useRef(null);
11200
11209
  const secondScrollRef = React31.useRef(null);
11210
+ const periodRef = React31.useRef(null);
11211
+ const directEditInputRef = React31.useRef(null);
11212
+ const triggerId = `time-picker-trigger-${autoId}`;
11213
+ const labelId = label ? `time-picker-label-${autoId}` : void 0;
11201
11214
  React31.useEffect(() => {
11202
11215
  if (isControlled) {
11203
11216
  const parsed = parseTime(value, format, includeSeconds);
11204
11217
  if (parsed) setParts(parsed);
11205
11218
  }
11206
11219
  }, [value, isControlled, format, includeSeconds]);
11220
+ React31.useEffect(() => {
11221
+ setManualInput(formatTime2(parts, format, includeSeconds));
11222
+ }, [format, includeSeconds, parts]);
11223
+ React31.useEffect(() => {
11224
+ if (!isDirectEditing) return;
11225
+ directEditInputRef.current?.focus();
11226
+ directEditInputRef.current?.select();
11227
+ }, [isDirectEditing]);
11207
11228
  React31.useEffect(() => {
11208
11229
  if (isControlled) {
11209
11230
  setHasCommittedValue(Boolean(value));
@@ -11294,6 +11315,15 @@ function TimePicker({
11294
11315
  setLocalRequiredError(void 0);
11295
11316
  }
11296
11317
  }, [disabled, hasCommittedValue, required]);
11318
+ const focusColumn = React31.useCallback((column) => {
11319
+ if (!column) return;
11320
+ const target = column === "hour" ? hourScrollRef.current : column === "minute" ? minuteScrollRef.current : column === "second" ? secondScrollRef.current : periodRef.current;
11321
+ target?.focus({ preventScroll: true });
11322
+ }, []);
11323
+ React31.useEffect(() => {
11324
+ if (variant !== "inline" && !open) return;
11325
+ focusColumn(focusedColumn);
11326
+ }, [focusColumn, focusedColumn, open, variant]);
11297
11327
  const handleKeyDown2 = (e, column) => {
11298
11328
  if (!["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Home", "End", "PageUp", "PageDown"].includes(e.key)) return;
11299
11329
  e.preventDefault();
@@ -11337,6 +11367,7 @@ function TimePicker({
11337
11367
  }
11338
11368
  tryUpdate(newParts);
11339
11369
  };
11370
+ const display = formatTime2(parts, format, includeSeconds);
11340
11371
  const setNow = () => {
11341
11372
  const now2 = /* @__PURE__ */ new Date();
11342
11373
  const h = now2.getHours();
@@ -11362,6 +11393,7 @@ function TimePicker({
11362
11393
  };
11363
11394
  const handleManualInput = (input) => {
11364
11395
  setManualInput(input);
11396
+ if (!isCompleteTimeInput(input, format, includeSeconds)) return;
11365
11397
  const parsed = parseTime(input, format, includeSeconds);
11366
11398
  if (parsed) {
11367
11399
  const timeStr = formatTime2(parsed, format, includeSeconds);
@@ -11370,6 +11402,53 @@ function TimePicker({
11370
11402
  }
11371
11403
  }
11372
11404
  };
11405
+ const commitManualInput = React31.useCallback(
11406
+ (input) => {
11407
+ const trimmed = input.trim();
11408
+ if (!trimmed) {
11409
+ setManualInput(display);
11410
+ return false;
11411
+ }
11412
+ if (!isCompleteTimeInput(trimmed, format, includeSeconds)) {
11413
+ setManualInput(display);
11414
+ return false;
11415
+ }
11416
+ const parsed = parseTime(trimmed, format, includeSeconds);
11417
+ if (!parsed) {
11418
+ setManualInput(display);
11419
+ return false;
11420
+ }
11421
+ const timeStr = formatTime2(parsed, format, includeSeconds);
11422
+ if (!isTimeInRange(timeStr) || isTimeDisabled(timeStr)) {
11423
+ setManualInput(display);
11424
+ return false;
11425
+ }
11426
+ const updated = tryUpdate(parsed);
11427
+ if (!updated) {
11428
+ setManualInput(display);
11429
+ return false;
11430
+ }
11431
+ setManualInput(timeStr);
11432
+ return true;
11433
+ },
11434
+ [display, format, includeSeconds, isTimeDisabled, isTimeInRange, tryUpdate]
11435
+ );
11436
+ const startDirectEdit = React31.useCallback(() => {
11437
+ if (disabled) return;
11438
+ setManualInput(display);
11439
+ setIsDirectEditing(true);
11440
+ }, [disabled, display]);
11441
+ const stopDirectEdit = React31.useCallback(
11442
+ (mode) => {
11443
+ if (mode === "commit") {
11444
+ commitManualInput(manualInput);
11445
+ } else {
11446
+ setManualInput(display);
11447
+ }
11448
+ setIsDirectEditing(false);
11449
+ },
11450
+ [commitManualInput, display, manualInput]
11451
+ );
11373
11452
  const handleCustomPreset = (time) => {
11374
11453
  const parsed = parseTime(time, format, includeSeconds);
11375
11454
  if (parsed) {
@@ -11437,13 +11516,14 @@ function TimePicker({
11437
11516
  const shouldMatchTriggerWidth = matchTriggerWidth ?? variant !== "compact";
11438
11517
  const compactPanel = variant === "compact";
11439
11518
  const effectiveError = error ?? localRequiredError;
11440
- const display = formatTime2(parts, format, includeSeconds);
11441
11519
  const trigger = variant === "inline" ? null : /* @__PURE__ */ jsxs27(
11442
11520
  "button",
11443
11521
  {
11522
+ id: triggerId,
11444
11523
  type: "button",
11445
11524
  disabled,
11446
11525
  "aria-label": "Select time",
11526
+ "aria-labelledby": labelId,
11447
11527
  "aria-haspopup": "dialog",
11448
11528
  "aria-expanded": open,
11449
11529
  "aria-required": required,
@@ -11480,10 +11560,10 @@ function TimePicker({
11480
11560
  {
11481
11561
  className: cn(
11482
11562
  "truncate font-medium transition-colors duration-200",
11483
- !value && !defaultValue && "text-muted-foreground",
11484
- value || defaultValue ? "text-foreground" : ""
11563
+ !hasCommittedValue && "text-muted-foreground",
11564
+ hasCommittedValue ? "text-foreground" : ""
11485
11565
  ),
11486
- children: value || defaultValue ? display : placeholder
11566
+ children: hasCommittedValue ? display : placeholder
11487
11567
  }
11488
11568
  )
11489
11569
  ] }),
@@ -11503,13 +11583,51 @@ function TimePicker({
11503
11583
  tryUpdate(next);
11504
11584
  };
11505
11585
  const timePickerContent = /* @__PURE__ */ jsxs27("div", { className: cn(panelSz.stackGap, compactPanel && "space-y-2.5"), children: [
11506
- /* @__PURE__ */ jsx37("div", { className: cn("flex items-center justify-center py-1", compactPanel && "py-0.5"), children: /* @__PURE__ */ jsx37("span", { className: cn(panelSz.timeText, "font-bold tabular-nums tracking-wide text-foreground underline underline-offset-8 decoration-primary/60"), children: display }) }),
11586
+ /* @__PURE__ */ jsx37("div", { className: cn("flex items-center justify-center py-1", compactPanel && "py-0.5"), children: isDirectEditing ? /* @__PURE__ */ jsx37(
11587
+ "input",
11588
+ {
11589
+ ref: directEditInputRef,
11590
+ type: "text",
11591
+ value: manualInput,
11592
+ onChange: (e) => setManualInput(e.target.value),
11593
+ onBlur: () => stopDirectEdit("commit"),
11594
+ onKeyDown: (e) => {
11595
+ if (e.key === "Enter") {
11596
+ e.preventDefault();
11597
+ stopDirectEdit("commit");
11598
+ }
11599
+ if (e.key === "Escape") {
11600
+ e.preventDefault();
11601
+ stopDirectEdit("cancel");
11602
+ }
11603
+ },
11604
+ "aria-label": "Edit time value",
11605
+ className: cn(
11606
+ panelSz.timeText,
11607
+ "min-w-0 w-36 bg-transparent border-b border-primary/60 text-center font-bold tabular-nums tracking-wide text-foreground",
11608
+ "focus:outline-none focus:border-primary"
11609
+ )
11610
+ }
11611
+ ) : /* @__PURE__ */ jsx37(
11612
+ "button",
11613
+ {
11614
+ type: "button",
11615
+ onClick: startDirectEdit,
11616
+ className: cn(
11617
+ panelSz.timeText,
11618
+ "font-bold tabular-nums tracking-wide text-foreground underline underline-offset-8 decoration-primary/60",
11619
+ "rounded-md px-2 transition-colors hover:text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50"
11620
+ ),
11621
+ "aria-label": "Edit selected time",
11622
+ children: display
11623
+ }
11624
+ ) }),
11507
11625
  allowManualInput && /* @__PURE__ */ jsxs27("div", { className: "relative", children: [
11508
11626
  /* @__PURE__ */ jsx37(
11509
11627
  Input_default,
11510
11628
  {
11511
11629
  placeholder: format === "12" ? "02:30 PM" : "14:30",
11512
- value: manualInput || display,
11630
+ value: manualInput,
11513
11631
  onChange: (e) => handleManualInput(e.target.value),
11514
11632
  size: panelSz.inputSize,
11515
11633
  variant: "outlined",
@@ -11659,9 +11777,11 @@ function TimePicker({
11659
11777
  /* @__PURE__ */ jsx37(
11660
11778
  "div",
11661
11779
  {
11780
+ ref: periodRef,
11662
11781
  className: cn("flex flex-col p-1 rounded-xl bg-muted/30", panelSz.periodGap),
11663
11782
  role: "radiogroup",
11664
11783
  "aria-label": "Select AM or PM",
11784
+ "aria-labelledby": labelId,
11665
11785
  tabIndex: focusedColumn === "period" ? 0 : -1,
11666
11786
  onKeyDown: (e) => handleKeyDown2(e, "period"),
11667
11787
  onFocus: () => setFocusedColumn("period"),
@@ -11757,10 +11877,17 @@ function TimePicker({
11757
11877
  ] });
11758
11878
  if (variant === "inline") {
11759
11879
  return /* @__PURE__ */ jsxs27("div", { className: "w-fit max-w-full", ...rest, children: [
11760
- label && /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs27("label", { className: cn(sz.label, "font-semibold", disabled ? "text-muted-foreground" : "text-foreground", effectiveError && "text-destructive"), children: [
11761
- label,
11762
- required && /* @__PURE__ */ jsx37("span", { className: "text-destructive ml-1", children: "*" })
11763
- ] }) }),
11880
+ label && /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsxs27(
11881
+ "label",
11882
+ {
11883
+ id: labelId,
11884
+ className: cn(sz.label, "font-semibold", disabled ? "text-muted-foreground" : "text-foreground", effectiveError && "text-destructive"),
11885
+ children: [
11886
+ label,
11887
+ required && /* @__PURE__ */ jsx37("span", { className: "text-destructive ml-1", children: "*" })
11888
+ ]
11889
+ }
11890
+ ) }),
11764
11891
  /* @__PURE__ */ jsx37(
11765
11892
  "input",
11766
11893
  {
@@ -11797,6 +11924,8 @@ function TimePicker({
11797
11924
  label && /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ jsxs27(
11798
11925
  "label",
11799
11926
  {
11927
+ id: labelId,
11928
+ htmlFor: triggerId,
11800
11929
  className: cn(
11801
11930
  sz.label,
11802
11931
  "font-semibold",
@@ -15062,7 +15191,7 @@ function CalendarTimeline({
15062
15191
 
15063
15192
  // src/components/MultiCombobox.tsx
15064
15193
  import * as React39 from "react";
15065
- import { useId as useId7 } from "react";
15194
+ import { useId as useId8 } from "react";
15066
15195
  import { ChevronDown as ChevronDown4, Search as Search5, Check as Check6, SearchX as SearchX2, Loader2 as Loader24, X as X13, Sparkles as Sparkles3 } from "lucide-react";
15067
15196
  import { Fragment as Fragment13, jsx as jsx45, jsxs as jsxs35 } from "react/jsx-runtime";
15068
15197
  var MultiCombobox = ({
@@ -15200,7 +15329,7 @@ var MultiCombobox = ({
15200
15329
  outline: "border-2 border-input bg-transparent hover:border-primary",
15201
15330
  ghost: "border border-transparent bg-muted/50 hover:bg-muted"
15202
15331
  };
15203
- const autoId = useId7();
15332
+ const autoId = useId8();
15204
15333
  const resolvedId = id ? String(id) : `multicombobox-${autoId}`;
15205
15334
  const labelId = label ? `${resolvedId}-label` : void 0;
15206
15335
  const labelSize = size === "sm" ? "text-xs" : size === "lg" ? "text-base" : "text-sm";
@@ -16704,7 +16833,7 @@ function OverlayControls({
16704
16833
  }
16705
16834
 
16706
16835
  // src/components/CategoryTreeSelect.tsx
16707
- import { useEffect as useEffect25, useId as useId9, useMemo as useMemo19, useRef as useRef19, useState as useState31 } from "react";
16836
+ import { useEffect as useEffect25, useId as useId10, useMemo as useMemo19, useRef as useRef19, useState as useState31 } from "react";
16708
16837
  import { ChevronRight as ChevronRight6, ChevronDown as ChevronDown5, FolderTree, Layers, Search as Search6, SearchX as SearchX3, X as X14 } from "lucide-react";
16709
16838
  import { jsx as jsx49, jsxs as jsxs39 } from "react/jsx-runtime";
16710
16839
  var defaultLabels = {
@@ -16761,7 +16890,7 @@ function CategoryTreeSelect(props) {
16761
16890
  const searchInputRef = useRef19(null);
16762
16891
  const dropdownViewportRef = useRef19(null);
16763
16892
  useOverlayScrollbarTarget(dropdownViewportRef, { enabled: useOverlayScrollbar });
16764
- const autoId = useId9();
16893
+ const autoId = useId10();
16765
16894
  const resolvedId = id ? String(id) : `category-tree-select-${autoId}`;
16766
16895
  const labelId = label ? `${resolvedId}-label` : void 0;
16767
16896
  const effectiveError = error ?? localRequiredError;
@@ -16938,7 +17067,7 @@ function CategoryTreeSelect(props) {
16938
17067
  // View-only mode: just display the name with folder icon
16939
17068
  /* @__PURE__ */ jsxs39("div", { className: cn("flex min-w-0 items-center", TREE_NODE_GAP_CLASS), children: [
16940
17069
  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" }),
16941
- /* @__PURE__ */ jsx49("span", { className: "min-w-0 text-sm font-medium leading-snug break-words [overflow-wrap:anywhere]", children: category.name })
17070
+ /* @__PURE__ */ jsx49("span", { className: "min-w-0 text-sm font-medium leading-snug wrap-anywhere", children: category.name })
16942
17071
  ] })
16943
17072
  ) : (
16944
17073
  // Single/Multi select mode: icon + text + badge
@@ -16948,7 +17077,7 @@ function CategoryTreeSelect(props) {
16948
17077
  "span",
16949
17078
  {
16950
17079
  className: cn(
16951
- "min-w-0 flex-1 text-sm leading-snug break-words [overflow-wrap:anywhere] transition-all duration-200",
17080
+ "min-w-0 flex-1 text-sm leading-snug wrap-anywhere transition-all duration-200",
16952
17081
  isSelected ? "font-semibold text-primary" : "text-foreground/80",
16953
17082
  !isSelectable && "text-foreground"
16954
17083
  ),
@@ -20523,7 +20652,7 @@ var MusicPlayer = ({
20523
20652
  var MusicPlayer_default = MusicPlayer;
20524
20653
 
20525
20654
  // src/components/Grid.tsx
20526
- import React51, { useId as useId10 } from "react";
20655
+ import React51, { useId as useId11 } from "react";
20527
20656
  import { Fragment as Fragment20, jsx as jsx59, jsxs as jsxs49 } from "react/jsx-runtime";
20528
20657
  var BP_MIN = {
20529
20658
  sm: 640,
@@ -20588,7 +20717,7 @@ var GridRoot = React51.forwardRef(
20588
20717
  children,
20589
20718
  ...rest
20590
20719
  }, ref) => {
20591
- const id = useId10().replace(/[:]/g, "");
20720
+ const id = useId11().replace(/[:]/g, "");
20592
20721
  const baseClass = `uv-grid-${id}`;
20593
20722
  const baseCols = toTemplateCols(columns, minColumnWidth);
20594
20723
  const baseRows = toTemplateRows(rows);