myoperator-mcp 0.2.356 → 0.2.357
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 +306 -106
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2574,14 +2574,22 @@ import {
|
|
|
2574
2574
|
type Strategy,
|
|
2575
2575
|
} from "@floating-ui/react-dom";
|
|
2576
2576
|
import { cva, type VariantProps } from "class-variance-authority";
|
|
2577
|
-
import { ChevronLeft, ChevronRight, Clock2, X } from "lucide-react";
|
|
2577
|
+
import { ChevronDown, ChevronLeft, ChevronRight, Clock2, X } from "lucide-react";
|
|
2578
2578
|
|
|
2579
2579
|
import { cn } from "@/lib/utils";
|
|
2580
2580
|
|
|
2581
2581
|
const DEFAULT_START_TIME = "10:30:00";
|
|
2582
2582
|
const DEFAULT_END_TIME = "12:30:00";
|
|
2583
|
+
const DEFAULT_MINUTE_STEP = 5;
|
|
2584
|
+
const DEFAULT_SECOND_STEP = 5;
|
|
2585
|
+
const TIME_COLUMN_MAX_HEIGHT = 168;
|
|
2583
2586
|
const DEFAULT_PLACEHOLDER = "--/--/---- --:-- --";
|
|
2584
2587
|
const POPOVER_WIDTH = 336;
|
|
2588
|
+
// The popover follows the trigger width but is clamped to a usable design range
|
|
2589
|
+
// so it neither stretches across a full-width desktop field nor overflows a
|
|
2590
|
+
// narrow mobile viewport.
|
|
2591
|
+
const MIN_POPOVER_WIDTH = 280;
|
|
2592
|
+
const MAX_POPOVER_WIDTH = 360;
|
|
2585
2593
|
const POPOVER_MARGIN = 8;
|
|
2586
2594
|
const POPOVER_GAP = 4;
|
|
2587
2595
|
const MAX_POPOVER_HEIGHT = 420;
|
|
@@ -2664,6 +2672,8 @@ export interface DateTimePickerProps
|
|
|
2664
2672
|
name?: string;
|
|
2665
2673
|
showEndTime?: boolean;
|
|
2666
2674
|
showSeconds?: boolean;
|
|
2675
|
+
minuteStep?: number;
|
|
2676
|
+
secondStep?: number;
|
|
2667
2677
|
showClear?: boolean;
|
|
2668
2678
|
closeOnSelect?: boolean;
|
|
2669
2679
|
startTimeLabel?: string;
|
|
@@ -3321,32 +3331,45 @@ function stepDateTimeInputValue(
|
|
|
3321
3331
|
};
|
|
3322
3332
|
}
|
|
3323
3333
|
|
|
3324
|
-
|
|
3325
|
-
const normalizedTime = parseTimePart(time) ?? DEFAULT_START_TIME;
|
|
3326
|
-
const [hour = "00", minute = "00", second = "00"] = normalizedTime.split(":");
|
|
3334
|
+
type Meridiem = "AM" | "PM";
|
|
3327
3335
|
|
|
3328
|
-
|
|
3336
|
+
function padTime(value: number) {
|
|
3337
|
+
return value.toString().padStart(2, "0");
|
|
3329
3338
|
}
|
|
3330
3339
|
|
|
3331
|
-
function
|
|
3332
|
-
|
|
3340
|
+
function buildTimeRange(max: number, step: number) {
|
|
3341
|
+
const safeStep = Math.max(1, Math.floor(step));
|
|
3342
|
+
const values: number[] = [];
|
|
3343
|
+
for (let value = 0; value <= max; value += safeStep) {
|
|
3344
|
+
values.push(value);
|
|
3345
|
+
}
|
|
3346
|
+
|
|
3347
|
+
return values;
|
|
3333
3348
|
}
|
|
3334
3349
|
|
|
3335
|
-
function
|
|
3336
|
-
|
|
3350
|
+
function decomposeTime(time: string) {
|
|
3351
|
+
const normalizedTime = parseTimePart(time) ?? DEFAULT_START_TIME;
|
|
3352
|
+
const [hour = "0", minute = "0", second = "0"] = normalizedTime.split(":");
|
|
3353
|
+
const hourNumber = Number(hour);
|
|
3337
3354
|
|
|
3338
|
-
|
|
3355
|
+
return {
|
|
3356
|
+
hour12: hourNumber % 12 || 12,
|
|
3357
|
+
minute: Number(minute),
|
|
3358
|
+
second: Number(second),
|
|
3359
|
+
meridiem: (hourNumber >= 12 ? "PM" : "AM") as Meridiem,
|
|
3360
|
+
};
|
|
3361
|
+
}
|
|
3339
3362
|
|
|
3340
|
-
|
|
3341
|
-
|
|
3342
|
-
|
|
3343
|
-
|
|
3363
|
+
function composeTime(
|
|
3364
|
+
hour12: number,
|
|
3365
|
+
minute: number,
|
|
3366
|
+
second: number,
|
|
3367
|
+
meridiem: Meridiem
|
|
3368
|
+
) {
|
|
3369
|
+
const normalizedHour12 = hour12 % 12;
|
|
3370
|
+
const hour = meridiem === "PM" ? normalizedHour12 + 12 : normalizedHour12;
|
|
3344
3371
|
|
|
3345
|
-
|
|
3346
|
-
showPicker.call(input);
|
|
3347
|
-
} catch {
|
|
3348
|
-
input.focus();
|
|
3349
|
-
}
|
|
3372
|
+
return \`\${padTime(hour)}:\${padTime(minute)}:\${padTime(second)}\`;
|
|
3350
3373
|
}
|
|
3351
3374
|
|
|
3352
3375
|
function parseTypedDateTime(value: string) {
|
|
@@ -3507,6 +3530,212 @@ function CalendarDropdown({
|
|
|
3507
3530
|
);
|
|
3508
3531
|
}
|
|
3509
3532
|
|
|
3533
|
+
interface TimeColumnOption {
|
|
3534
|
+
key: string;
|
|
3535
|
+
label: string;
|
|
3536
|
+
selected: boolean;
|
|
3537
|
+
}
|
|
3538
|
+
|
|
3539
|
+
function TimeColumn({
|
|
3540
|
+
header,
|
|
3541
|
+
ariaLabel,
|
|
3542
|
+
options,
|
|
3543
|
+
onSelect,
|
|
3544
|
+
}: {
|
|
3545
|
+
header: string;
|
|
3546
|
+
ariaLabel: string;
|
|
3547
|
+
options: TimeColumnOption[];
|
|
3548
|
+
onSelect: (key: string) => void;
|
|
3549
|
+
}) {
|
|
3550
|
+
const listRef = React.useRef<HTMLDivElement | null>(null);
|
|
3551
|
+
const selectedRef = React.useRef<HTMLButtonElement | null>(null);
|
|
3552
|
+
|
|
3553
|
+
React.useEffect(() => {
|
|
3554
|
+
const list = listRef.current;
|
|
3555
|
+
const selected = selectedRef.current;
|
|
3556
|
+
if (!list || !selected) return;
|
|
3557
|
+
|
|
3558
|
+
list.scrollTop =
|
|
3559
|
+
selected.offsetTop - list.clientHeight / 2 + selected.clientHeight / 2;
|
|
3560
|
+
}, []);
|
|
3561
|
+
|
|
3562
|
+
return (
|
|
3563
|
+
<div className="flex min-w-0 flex-col border-r border-solid border-semantic-border-layout last:border-r-0">
|
|
3564
|
+
<div className="border-b border-solid border-semantic-border-layout px-1 py-2 text-center text-[11px] font-semibold uppercase tracking-wide text-semantic-text-muted">
|
|
3565
|
+
{header}
|
|
3566
|
+
</div>
|
|
3567
|
+
<div
|
|
3568
|
+
ref={listRef}
|
|
3569
|
+
role="listbox"
|
|
3570
|
+
aria-label={ariaLabel}
|
|
3571
|
+
className="flex flex-col gap-0.5 overflow-y-auto p-1 [scrollbar-width:thin] [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-semantic-border-secondary [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar]:w-1.5"
|
|
3572
|
+
style={{ maxHeight: \`\${TIME_COLUMN_MAX_HEIGHT}px\` }}
|
|
3573
|
+
>
|
|
3574
|
+
{options.map((option) => (
|
|
3575
|
+
<button
|
|
3576
|
+
key={option.key}
|
|
3577
|
+
ref={option.selected ? selectedRef : undefined}
|
|
3578
|
+
type="button"
|
|
3579
|
+
role="option"
|
|
3580
|
+
aria-selected={option.selected}
|
|
3581
|
+
className={cn(
|
|
3582
|
+
"flex shrink-0 items-center justify-center rounded-md border border-solid px-2 py-1.5 text-sm transition-colors",
|
|
3583
|
+
option.selected
|
|
3584
|
+
? "border-semantic-info-border bg-semantic-info-surface font-semibold text-semantic-text-primary"
|
|
3585
|
+
: "border-transparent text-semantic-text-secondary hover:bg-semantic-bg-hover"
|
|
3586
|
+
)}
|
|
3587
|
+
onClick={() => onSelect(option.key)}
|
|
3588
|
+
>
|
|
3589
|
+
{option.label}
|
|
3590
|
+
</button>
|
|
3591
|
+
))}
|
|
3592
|
+
</div>
|
|
3593
|
+
</div>
|
|
3594
|
+
);
|
|
3595
|
+
}
|
|
3596
|
+
|
|
3597
|
+
function TimeField({
|
|
3598
|
+
id,
|
|
3599
|
+
label,
|
|
3600
|
+
value,
|
|
3601
|
+
showSeconds,
|
|
3602
|
+
minuteStep,
|
|
3603
|
+
secondStep,
|
|
3604
|
+
open,
|
|
3605
|
+
onOpenChange,
|
|
3606
|
+
onChange,
|
|
3607
|
+
}: {
|
|
3608
|
+
id: string;
|
|
3609
|
+
label: string;
|
|
3610
|
+
value: string;
|
|
3611
|
+
showSeconds: boolean;
|
|
3612
|
+
minuteStep: number;
|
|
3613
|
+
secondStep: number;
|
|
3614
|
+
open: boolean;
|
|
3615
|
+
onOpenChange: (open: boolean) => void;
|
|
3616
|
+
onChange: (time: string) => void;
|
|
3617
|
+
}) {
|
|
3618
|
+
const { hour12, minute, second, meridiem } = decomposeTime(value);
|
|
3619
|
+
// When seconds are hidden they are not editable, so normalize to :00 on any
|
|
3620
|
+
// change rather than carrying a stale seconds value forward.
|
|
3621
|
+
const effectiveSecond = showSeconds ? second : 0;
|
|
3622
|
+
const hourOptions = React.useMemo<TimeColumnOption[]>(
|
|
3623
|
+
() =>
|
|
3624
|
+
Array.from({ length: 12 }, (_, index) => index + 1).map((hour) => ({
|
|
3625
|
+
key: hour.toString(),
|
|
3626
|
+
label: padTime(hour),
|
|
3627
|
+
selected: hour === hour12,
|
|
3628
|
+
})),
|
|
3629
|
+
[hour12]
|
|
3630
|
+
);
|
|
3631
|
+
const minuteOptions = React.useMemo<TimeColumnOption[]>(
|
|
3632
|
+
() =>
|
|
3633
|
+
buildTimeRange(59, minuteStep).map((minuteValue) => ({
|
|
3634
|
+
key: minuteValue.toString(),
|
|
3635
|
+
label: padTime(minuteValue),
|
|
3636
|
+
selected: minuteValue === minute,
|
|
3637
|
+
})),
|
|
3638
|
+
[minute, minuteStep]
|
|
3639
|
+
);
|
|
3640
|
+
const secondOptions = React.useMemo<TimeColumnOption[]>(
|
|
3641
|
+
() =>
|
|
3642
|
+
buildTimeRange(59, secondStep).map((secondValue) => ({
|
|
3643
|
+
key: secondValue.toString(),
|
|
3644
|
+
label: padTime(secondValue),
|
|
3645
|
+
selected: secondValue === second,
|
|
3646
|
+
})),
|
|
3647
|
+
[second, secondStep]
|
|
3648
|
+
);
|
|
3649
|
+
const meridiemOptions: TimeColumnOption[] = [
|
|
3650
|
+
{ key: "AM", label: "AM", selected: meridiem === "AM" },
|
|
3651
|
+
{ key: "PM", label: "PM", selected: meridiem === "PM" },
|
|
3652
|
+
];
|
|
3653
|
+
|
|
3654
|
+
return (
|
|
3655
|
+
<div className="flex flex-col gap-1.5">
|
|
3656
|
+
<span
|
|
3657
|
+
id={\`\${id}-label\`}
|
|
3658
|
+
className="block text-sm font-semibold text-semantic-text-secondary"
|
|
3659
|
+
>
|
|
3660
|
+
{label}
|
|
3661
|
+
</span>
|
|
3662
|
+
<button
|
|
3663
|
+
id={id}
|
|
3664
|
+
type="button"
|
|
3665
|
+
aria-label={label}
|
|
3666
|
+
aria-haspopup="listbox"
|
|
3667
|
+
aria-expanded={open}
|
|
3668
|
+
className={cn(
|
|
3669
|
+
"flex h-[42px] w-full items-center gap-2 rounded-lg border border-solid border-semantic-border-input bg-semantic-bg-primary px-3 text-left text-base text-semantic-text-primary outline-none transition-colors hover:border-semantic-border-input-focus/50",
|
|
3670
|
+
open &&
|
|
3671
|
+
"border-semantic-border-input-focus/50 shadow-[0_0_0_1px_rgba(43,188,202,0.15)]"
|
|
3672
|
+
)}
|
|
3673
|
+
onClick={() => onOpenChange(!open)}
|
|
3674
|
+
>
|
|
3675
|
+
<Clock2
|
|
3676
|
+
className="size-4 shrink-0 text-semantic-text-muted"
|
|
3677
|
+
aria-hidden="true"
|
|
3678
|
+
/>
|
|
3679
|
+
<span className="m-0 min-w-0 flex-1 truncate">
|
|
3680
|
+
{formatTimeForDisplay(value, showSeconds)}
|
|
3681
|
+
</span>
|
|
3682
|
+
<ChevronDown
|
|
3683
|
+
className={cn(
|
|
3684
|
+
"size-4 shrink-0 text-semantic-text-muted transition-transform",
|
|
3685
|
+
open && "rotate-180"
|
|
3686
|
+
)}
|
|
3687
|
+
aria-hidden="true"
|
|
3688
|
+
/>
|
|
3689
|
+
</button>
|
|
3690
|
+
{open && (
|
|
3691
|
+
<div
|
|
3692
|
+
className={cn(
|
|
3693
|
+
"grid overflow-hidden rounded-lg border border-solid border-semantic-border-layout bg-semantic-bg-primary shadow-sm",
|
|
3694
|
+
showSeconds ? "grid-cols-4" : "grid-cols-3"
|
|
3695
|
+
)}
|
|
3696
|
+
>
|
|
3697
|
+
<TimeColumn
|
|
3698
|
+
header="Hours"
|
|
3699
|
+
ariaLabel={\`\${label} hours\`}
|
|
3700
|
+
options={hourOptions}
|
|
3701
|
+
onSelect={(key) =>
|
|
3702
|
+
onChange(composeTime(Number(key), minute, effectiveSecond, meridiem))
|
|
3703
|
+
}
|
|
3704
|
+
/>
|
|
3705
|
+
<TimeColumn
|
|
3706
|
+
header="Minutes"
|
|
3707
|
+
ariaLabel={\`\${label} minutes\`}
|
|
3708
|
+
options={minuteOptions}
|
|
3709
|
+
onSelect={(key) =>
|
|
3710
|
+
onChange(composeTime(hour12, Number(key), effectiveSecond, meridiem))
|
|
3711
|
+
}
|
|
3712
|
+
/>
|
|
3713
|
+
{showSeconds && (
|
|
3714
|
+
<TimeColumn
|
|
3715
|
+
header="Seconds"
|
|
3716
|
+
ariaLabel={\`\${label} seconds\`}
|
|
3717
|
+
options={secondOptions}
|
|
3718
|
+
onSelect={(key) =>
|
|
3719
|
+
onChange(composeTime(hour12, minute, Number(key), meridiem))
|
|
3720
|
+
}
|
|
3721
|
+
/>
|
|
3722
|
+
)}
|
|
3723
|
+
<TimeColumn
|
|
3724
|
+
header="AM/PM"
|
|
3725
|
+
ariaLabel={\`\${label} meridiem\`}
|
|
3726
|
+
options={meridiemOptions}
|
|
3727
|
+
onSelect={(key) =>
|
|
3728
|
+
onChange(
|
|
3729
|
+
composeTime(hour12, minute, effectiveSecond, key as Meridiem)
|
|
3730
|
+
)
|
|
3731
|
+
}
|
|
3732
|
+
/>
|
|
3733
|
+
</div>
|
|
3734
|
+
)}
|
|
3735
|
+
</div>
|
|
3736
|
+
);
|
|
3737
|
+
}
|
|
3738
|
+
|
|
3510
3739
|
const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
3511
3740
|
(
|
|
3512
3741
|
{
|
|
@@ -3523,6 +3752,8 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
3523
3752
|
name,
|
|
3524
3753
|
showEndTime = true,
|
|
3525
3754
|
showSeconds,
|
|
3755
|
+
minuteStep = DEFAULT_MINUTE_STEP,
|
|
3756
|
+
secondStep = DEFAULT_SECOND_STEP,
|
|
3526
3757
|
showClear = true,
|
|
3527
3758
|
closeOnSelect = false,
|
|
3528
3759
|
startTimeLabel = "Start Time",
|
|
@@ -3583,10 +3814,11 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
3583
3814
|
const rootRef = React.useRef<HTMLDivElement | null>(null);
|
|
3584
3815
|
const triggerRef = React.useRef<HTMLDivElement | null>(null);
|
|
3585
3816
|
const popoverRef = React.useRef<HTMLDivElement | null>(null);
|
|
3586
|
-
const startTimeInputRef = React.useRef<HTMLInputElement | null>(null);
|
|
3587
|
-
const endTimeInputRef = React.useRef<HTMLInputElement | null>(null);
|
|
3588
3817
|
const [openCalendarDropdown, setOpenCalendarDropdown] =
|
|
3589
3818
|
React.useState<CalendarDropdownKind | null>(null);
|
|
3819
|
+
const [openTimeField, setOpenTimeField] = React.useState<
|
|
3820
|
+
"start" | "end" | null
|
|
3821
|
+
>(null);
|
|
3590
3822
|
const usesContainerPortal = portalContainer !== undefined;
|
|
3591
3823
|
const floatingStrategy: Strategy = usesContainerPortal
|
|
3592
3824
|
? "absolute"
|
|
@@ -3598,18 +3830,23 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
3598
3830
|
shift({ padding: POPOVER_MARGIN }),
|
|
3599
3831
|
floatingSize({
|
|
3600
3832
|
padding: POPOVER_MARGIN,
|
|
3601
|
-
apply({ availableHeight, elements, rects }) {
|
|
3833
|
+
apply({ availableHeight, availableWidth, elements, rects }) {
|
|
3602
3834
|
const maxHeight = Math.max(
|
|
3603
3835
|
1,
|
|
3604
3836
|
Math.min(MAX_POPOVER_HEIGHT, availableHeight)
|
|
3605
3837
|
);
|
|
3838
|
+
const maxWidth = Math.min(MAX_POPOVER_WIDTH, availableWidth);
|
|
3839
|
+
const width = Math.max(
|
|
3840
|
+
1,
|
|
3841
|
+
Math.min(Math.max(rects.reference.width, MIN_POPOVER_WIDTH), maxWidth)
|
|
3842
|
+
);
|
|
3606
3843
|
elements.floating.style.setProperty(
|
|
3607
3844
|
POPOVER_SCROLL_HEIGHT_VAR,
|
|
3608
3845
|
\`\${maxHeight}px\`
|
|
3609
3846
|
);
|
|
3610
3847
|
elements.floating.style.setProperty(
|
|
3611
3848
|
POPOVER_WIDTH_VAR,
|
|
3612
|
-
\`\${
|
|
3849
|
+
\`\${width}px\`
|
|
3613
3850
|
);
|
|
3614
3851
|
},
|
|
3615
3852
|
}),
|
|
@@ -3655,6 +3892,7 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
3655
3892
|
(nextOpen: boolean) => {
|
|
3656
3893
|
if (!nextOpen) {
|
|
3657
3894
|
setOpenCalendarDropdown(null);
|
|
3895
|
+
setOpenTimeField(null);
|
|
3658
3896
|
}
|
|
3659
3897
|
|
|
3660
3898
|
if (!isOpenControlled) {
|
|
@@ -4014,7 +4252,9 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4014
4252
|
)}
|
|
4015
4253
|
style={{
|
|
4016
4254
|
...floatingStyles,
|
|
4017
|
-
width: \`var(\${POPOVER_WIDTH_VAR}, \${POPOVER_WIDTH}px
|
|
4255
|
+
width: \`var(\${POPOVER_WIDTH_VAR}, min(\${POPOVER_WIDTH}px, calc(100vw - \${
|
|
4256
|
+
POPOVER_MARGIN * 2
|
|
4257
|
+
}px)))\`,
|
|
4018
4258
|
maxHeight: \`var(\${POPOVER_SCROLL_HEIGHT_VAR}, min(\${MAX_POPOVER_HEIGHT}px, calc(100dvh - \${
|
|
4019
4259
|
POPOVER_MARGIN * 2
|
|
4020
4260
|
}px)))\`,
|
|
@@ -4117,7 +4357,7 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4117
4357
|
{weekDays.map((day) => (
|
|
4118
4358
|
<div
|
|
4119
4359
|
key={day}
|
|
4120
|
-
className="flex size-8 items-center justify-center text-xs font-semibold text-semantic-text-muted"
|
|
4360
|
+
className="mx-auto flex size-8 items-center justify-center text-xs font-semibold text-semantic-text-muted"
|
|
4121
4361
|
>
|
|
4122
4362
|
{day}
|
|
4123
4363
|
</div>
|
|
@@ -4151,6 +4391,9 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4151
4391
|
: isCurrentMonth
|
|
4152
4392
|
? "text-semantic-text-primary hover:bg-semantic-bg-hover"
|
|
4153
4393
|
: "text-semantic-text-muted hover:bg-semantic-bg-hover",
|
|
4394
|
+
isToday &&
|
|
4395
|
+
!isSelected &&
|
|
4396
|
+
"ring-1 ring-inset ring-semantic-border-secondary",
|
|
4154
4397
|
isDisabled &&
|
|
4155
4398
|
"opacity-40 cursor-not-allowed pointer-events-none"
|
|
4156
4399
|
)}
|
|
@@ -4164,9 +4407,6 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4164
4407
|
}}
|
|
4165
4408
|
>
|
|
4166
4409
|
{day.getDate()}
|
|
4167
|
-
{isToday && !isSelected && (
|
|
4168
|
-
<span className="absolute bottom-0.5 left-1/2 -translate-x-1/2 size-1 rounded-full bg-semantic-primary" />
|
|
4169
|
-
)}
|
|
4170
4410
|
</button>
|
|
4171
4411
|
);
|
|
4172
4412
|
})}
|
|
@@ -4182,87 +4422,45 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4182
4422
|
"border-t border-solid border-semantic-border-layout"
|
|
4183
4423
|
)}
|
|
4184
4424
|
>
|
|
4185
|
-
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
|
|
4189
|
-
|
|
4190
|
-
{
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
4204
|
-
|
|
4205
|
-
|
|
4206
|
-
|
|
4207
|
-
|
|
4208
|
-
|
|
4209
|
-
|
|
4425
|
+
<TimeField
|
|
4426
|
+
id={\`\${triggerId}-start-time\`}
|
|
4427
|
+
label={startTimeLabel}
|
|
4428
|
+
value={currentValue.startTime}
|
|
4429
|
+
showSeconds={resolvedShowSeconds}
|
|
4430
|
+
minuteStep={minuteStep}
|
|
4431
|
+
secondStep={secondStep}
|
|
4432
|
+
open={openTimeField === "start"}
|
|
4433
|
+
onOpenChange={(nextOpen) =>
|
|
4434
|
+
setOpenTimeField(nextOpen ? "start" : null)
|
|
4435
|
+
}
|
|
4436
|
+
onChange={(startTime) =>
|
|
4437
|
+
updateValue(
|
|
4438
|
+
{ ...currentValue, startTime },
|
|
4439
|
+
{ hasTimeValue: true }
|
|
4440
|
+
)
|
|
4441
|
+
}
|
|
4442
|
+
/>
|
|
4443
|
+
|
|
4444
|
+
{resolvedShowEndTime && (
|
|
4445
|
+
<TimeField
|
|
4446
|
+
id={\`\${triggerId}-end-time\`}
|
|
4447
|
+
label={endTimeLabel}
|
|
4448
|
+
value={currentValue.endTime}
|
|
4449
|
+
showSeconds={resolvedShowSeconds}
|
|
4450
|
+
minuteStep={minuteStep}
|
|
4451
|
+
secondStep={secondStep}
|
|
4452
|
+
open={openTimeField === "end"}
|
|
4453
|
+
onOpenChange={(nextOpen) =>
|
|
4454
|
+
setOpenTimeField(nextOpen ? "end" : null)
|
|
4455
|
+
}
|
|
4456
|
+
onChange={(endTime) =>
|
|
4210
4457
|
updateValue(
|
|
4211
|
-
{
|
|
4212
|
-
...currentValue,
|
|
4213
|
-
startTime: normalizeTimeInputValue(
|
|
4214
|
-
event.target.value,
|
|
4215
|
-
currentValue.startTime
|
|
4216
|
-
),
|
|
4217
|
-
},
|
|
4458
|
+
{ ...currentValue, endTime },
|
|
4218
4459
|
{ hasTimeValue: true }
|
|
4219
4460
|
)
|
|
4220
4461
|
}
|
|
4221
4462
|
/>
|
|
4222
|
-
|
|
4223
|
-
</div>
|
|
4224
|
-
|
|
4225
|
-
{resolvedShowEndTime && (
|
|
4226
|
-
<div className="flex flex-col gap-1.5">
|
|
4227
|
-
<label
|
|
4228
|
-
id={\`\${triggerId}-end-time-label\`}
|
|
4229
|
-
className="block text-sm font-semibold text-semantic-text-secondary"
|
|
4230
|
-
>
|
|
4231
|
-
{endTimeLabel}
|
|
4232
|
-
</label>
|
|
4233
|
-
<div className="relative">
|
|
4234
|
-
<Clock2
|
|
4235
|
-
className="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-semantic-text-muted"
|
|
4236
|
-
aria-hidden="true"
|
|
4237
|
-
/>
|
|
4238
|
-
<input
|
|
4239
|
-
ref={endTimeInputRef}
|
|
4240
|
-
id={\`\${triggerId}-end-time\`}
|
|
4241
|
-
aria-labelledby={\`\${triggerId}-end-time-label\`}
|
|
4242
|
-
type="time"
|
|
4243
|
-
step={resolvedShowSeconds ? "1" : "60"}
|
|
4244
|
-
value={formatTimeForTimeInput(
|
|
4245
|
-
currentValue.endTime,
|
|
4246
|
-
resolvedShowSeconds
|
|
4247
|
-
)}
|
|
4248
|
-
className="h-[42px] w-full rounded-md border border-solid border-semantic-border-input bg-semantic-bg-primary pl-9 pr-3 text-base text-semantic-text-primary outline-none transition-colors hover:border-semantic-border-input-focus/50 focus:border-semantic-border-input-focus/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]"
|
|
4249
|
-
onClick={() => openNativeTimePicker(endTimeInputRef.current)}
|
|
4250
|
-
onChange={(event) =>
|
|
4251
|
-
updateValue(
|
|
4252
|
-
{
|
|
4253
|
-
...currentValue,
|
|
4254
|
-
endTime: normalizeTimeInputValue(
|
|
4255
|
-
event.target.value,
|
|
4256
|
-
currentValue.endTime
|
|
4257
|
-
),
|
|
4258
|
-
},
|
|
4259
|
-
{ hasTimeValue: true }
|
|
4260
|
-
)
|
|
4261
|
-
}
|
|
4262
|
-
/>
|
|
4263
|
-
</div>
|
|
4264
|
-
</div>
|
|
4265
|
-
)}
|
|
4463
|
+
)}
|
|
4266
4464
|
</div>
|
|
4267
4465
|
)}
|
|
4268
4466
|
</div>,
|
|
@@ -4303,7 +4501,9 @@ const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>(
|
|
|
4303
4501
|
open &&
|
|
4304
4502
|
state !== "error" &&
|
|
4305
4503
|
"border-semantic-border-input-focus/50 shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
|
|
4306
|
-
!displayValue && "text-semantic-text-placeholder"
|
|
4504
|
+
!displayValue && "text-semantic-text-placeholder",
|
|
4505
|
+
disabled &&
|
|
4506
|
+
"cursor-not-allowed bg-semantic-bg-ui text-semantic-text-muted hover:border-semantic-border-input"
|
|
4307
4507
|
)}
|
|
4308
4508
|
>
|
|
4309
4509
|
<input
|
|
@@ -11372,7 +11572,7 @@ const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }
|
|
|
11372
11572
|
ref={ref}
|
|
11373
11573
|
sideOffset={sideOffset}
|
|
11374
11574
|
className={cn(
|
|
11375
|
-
"z-[9999] pointer-events-none data-[state=delayed-open]:pointer-events-auto data-[state=instant-open]:pointer-events-auto
|
|
11575
|
+
"z-[9999] pointer-events-none data-[state=delayed-open]:pointer-events-auto data-[state=instant-open]:pointer-events-auto rounded-md bg-semantic-primary px-3 py-1.5 text-xs text-semantic-text-inverted shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-w-xs whitespace-normal",
|
|
11376
11576
|
className
|
|
11377
11577
|
)}
|
|
11378
11578
|
{...props}
|
package/package.json
CHANGED