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.
Files changed (2) hide show
  1. package/dist/index.js +306 -106
  2. 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
- function formatTimeForTimeInput(time: string, showSeconds: boolean) {
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
- return showSeconds ? \`\${hour}:\${minute}:\${second}\` : \`\${hour}:\${minute}\`;
3336
+ function padTime(value: number) {
3337
+ return value.toString().padStart(2, "0");
3329
3338
  }
3330
3339
 
3331
- function normalizeTimeInputValue(time: string, fallbackTime: string) {
3332
- return parseTimePart(time) ?? parseTimePart(fallbackTime) ?? DEFAULT_START_TIME;
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 openNativeTimePicker(input: HTMLInputElement | null) {
3336
- if (!input) return;
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
- input.focus();
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
- const showPicker = (
3341
- input as HTMLInputElement & { showPicker?: () => void }
3342
- ).showPicker;
3343
- if (!showPicker) return;
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
- try {
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
- \`\${rects.reference.width}px\`
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
- <div className="flex flex-col gap-1.5">
4186
- <label
4187
- id={\`\${triggerId}-start-time-label\`}
4188
- className="block text-sm font-semibold text-semantic-text-secondary"
4189
- >
4190
- {startTimeLabel}
4191
- </label>
4192
- <div className="relative">
4193
- <Clock2
4194
- className="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-semantic-text-muted"
4195
- aria-hidden="true"
4196
- />
4197
- <input
4198
- ref={startTimeInputRef}
4199
- id={\`\${triggerId}-start-time\`}
4200
- aria-labelledby={\`\${triggerId}-start-time-label\`}
4201
- type="time"
4202
- step={resolvedShowSeconds ? "1" : "60"}
4203
- value={formatTimeForTimeInput(
4204
- currentValue.startTime,
4205
- resolvedShowSeconds
4206
- )}
4207
- 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)]"
4208
- onClick={() => openNativeTimePicker(startTimeInputRef.current)}
4209
- onChange={(event) =>
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
- </div>
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 overflow-hidden 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",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myoperator-mcp",
3
- "version": "0.2.356",
3
+ "version": "0.2.357",
4
4
  "description": "MCP server for myOperator UI components - enables AI assistants to access component metadata, examples, and design tokens",
5
5
  "type": "module",
6
6
  "bin": "./dist/index.js",