@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/api-reference.json +1 -1
- package/dist/index.cjs +195 -66
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +201 -72
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
!
|
|
11484
|
-
|
|
11563
|
+
!hasCommittedValue && "text-muted-foreground",
|
|
11564
|
+
hasCommittedValue ? "text-foreground" : ""
|
|
11485
11565
|
),
|
|
11486
|
-
children:
|
|
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(
|
|
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
|
|
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(
|
|
11761
|
-
label,
|
|
11762
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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);
|