myoperator-ui 0.0.121 → 0.0.123

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 +225 -672
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -292,20 +292,20 @@ import { Loader2 } from "lucide-react";
292
292
  import { cn } from "../../lib/utils";
293
293
 
294
294
  const buttonVariants = cva(
295
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#343E55] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
295
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-semantic-primary focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
296
296
  {
297
297
  variants: {
298
298
  variant: {
299
- default: "bg-[#343E55] text-white hover:bg-[#2F384D]",
300
- primary: "bg-[#343E55] text-white hover:bg-[#2F384D]",
301
- destructive: "bg-[#F04438] text-white hover:bg-[#D92D20]",
299
+ default: "bg-semantic-primary text-semantic-text-inverted hover:bg-semantic-primary-hover",
300
+ primary: "bg-semantic-primary text-semantic-text-inverted hover:bg-semantic-primary-hover",
301
+ destructive: "bg-semantic-error-primary text-semantic-text-inverted hover:bg-semantic-error-hover",
302
302
  outline:
303
- "border border-[#343E55] bg-transparent text-[#343E55] hover:bg-[#EBECEE]",
304
- secondary: "bg-[#EBECEE] text-[#343E55] hover:bg-[#D5D7DA]",
305
- ghost: "text-[#717680] hover:bg-[#F5F5F5] hover:text-[#181D27]",
306
- link: "text-[#343E55] underline-offset-4 hover:underline",
303
+ "border border-semantic-border-primary bg-transparent text-semantic-text-secondary hover:bg-semantic-primary-surface",
304
+ secondary: "bg-semantic-primary-surface text-semantic-text-secondary hover:bg-semantic-bg-hover",
305
+ ghost: "text-semantic-text-muted hover:bg-semantic-bg-ui hover:text-semantic-text-primary",
306
+ link: "text-semantic-text-secondary underline-offset-4 hover:underline",
307
307
  dashed:
308
- "border border-dashed border-[#D5D7DA] bg-transparent text-[#717680] hover:border-[#343E55] hover:text-[#343E55] hover:bg-[#FAFAFA]",
308
+ "border border-dashed border-semantic-bg-hover bg-transparent text-semantic-text-muted hover:border-semantic-border-primary hover:text-semantic-text-secondary hover:bg-[var(--color-neutral-50)]",
309
309
  },
310
310
  size: {
311
311
  default: "min-w-20 py-2.5 px-4 [&_svg]:size-4",
@@ -426,15 +426,15 @@ const badgeVariants = cva(
426
426
  variants: {
427
427
  variant: {
428
428
  // Status-based variants (existing)
429
- active: "bg-[#ECFDF3] text-[#17B26A]",
430
- failed: "bg-[#FEF3F2] text-[#F04438]",
431
- disabled: "bg-[#F5F5F5] text-[#717680]",
432
- default: "bg-[#F5F5F5] text-[#181D27]",
433
- primary: "bg-[#F5F5F5] text-[#181D27]",
429
+ active: "bg-semantic-success-surface text-semantic-success-primary",
430
+ failed: "bg-semantic-error-surface text-semantic-error-primary",
431
+ disabled: "bg-semantic-bg-ui text-semantic-text-muted",
432
+ default: "bg-semantic-bg-ui text-semantic-text-primary",
433
+ primary: "bg-semantic-bg-ui text-semantic-text-primary",
434
434
  // shadcn-style variants (new)
435
- secondary: "bg-[#F5F5F5] text-[#181D27]",
436
- outline: "border border-[#E9EAEB] bg-transparent text-[#181D27]",
437
- destructive: "bg-[#FEF3F2] text-[#F04438]",
435
+ secondary: "bg-semantic-bg-ui text-semantic-text-primary",
436
+ outline: "border border-semantic-border-layout bg-transparent text-semantic-text-primary",
437
+ destructive: "bg-semantic-error-surface text-semantic-error-primary",
438
438
  },
439
439
  size: {
440
440
  default: "px-3 py-1",
@@ -610,14 +610,14 @@ const mapClassName: { [key in Key]: string } = {
610
610
  * Maps color variants to Tailwind text color classes
611
611
  */
612
612
  const mapColorClassName: { [key in Color]: string } = {
613
- primary: "text-[#181D27]",
614
- secondary: "text-[#343E55]",
615
- muted: "text-[#717680]",
616
- placeholder: "text-[#A2A6B1]",
617
- link: "text-[#4275D6]",
618
- inverted: "text-white",
619
- error: "text-[#F04438]",
620
- success: "text-[#17B26A]",
613
+ primary: "text-semantic-text-primary",
614
+ secondary: "text-semantic-text-secondary",
615
+ muted: "text-semantic-text-muted",
616
+ placeholder: "text-semantic-text-placeholder",
617
+ link: "text-semantic-text-link",
618
+ inverted: "text-semantic-text-inverted",
619
+ error: "text-semantic-error-primary",
620
+ success: "text-semantic-success-primary",
621
621
  };
622
622
 
623
623
  /**
@@ -748,14 +748,14 @@ import { cn } from "../../lib/utils";
748
748
  * Input variants for different visual states
749
749
  */
750
750
  const inputVariants = cva(
751
- "h-10 w-full rounded bg-white px-4 py-2.5 text-sm text-[#181D27] transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[#181D27] placeholder:text-[#A2A6B1] disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[#FAFAFA]",
751
+ "h-10 w-full rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
752
752
  {
753
753
  variants: {
754
754
  state: {
755
755
  default:
756
- "border border-[#E9EAEB] focus:outline-none focus:border-[#2BBCCA]/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
756
+ "border border-semantic-border-input focus:outline-none focus:border-semantic-border-input-focus/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
757
757
  error:
758
- "border border-[#F04438]/40 focus:outline-none focus:border-[#F04438]/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
758
+ "border border-semantic-error-primary/40 focus:outline-none focus:border-semantic-error-primary/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
759
759
  },
760
760
  },
761
761
  defaultVariants: {
@@ -822,14 +822,14 @@ import { cn } from "../../lib/utils";
822
822
  * SelectTrigger variants matching TextField styling
823
823
  */
824
824
  const selectTriggerVariants = cva(
825
- "flex h-10 w-full items-center justify-between rounded bg-white px-4 py-2.5 text-sm text-[#181D27] transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[#FAFAFA] [&>span]:line-clamp-1",
825
+ "flex h-10 w-full items-center justify-between rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)] [&>span]:line-clamp-1",
826
826
  {
827
827
  variants: {
828
828
  state: {
829
829
  default:
830
- "border border-[#E9EAEB] focus:outline-none focus:border-[#2BBCCA]/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
830
+ "border border-semantic-border-input focus:outline-none focus:border-semantic-border-input-focus/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
831
831
  error:
832
- "border border-[#F04438]/40 focus:outline-none focus:border-[#F04438]/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
832
+ "border border-semantic-error-primary/40 focus:outline-none focus:border-semantic-error-primary/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
833
833
  },
834
834
  },
835
835
  defaultVariants: {
@@ -860,7 +860,7 @@ const SelectTrigger = React.forwardRef<
860
860
  >
861
861
  {children}
862
862
  <SelectPrimitive.Icon asChild>
863
- <ChevronDown className="size-4 text-[#717680] opacity-70" />
863
+ <ChevronDown className="size-4 text-semantic-text-muted opacity-70" />
864
864
  </SelectPrimitive.Icon>
865
865
  </SelectPrimitive.Trigger>
866
866
  ));
@@ -878,7 +878,7 @@ const SelectScrollUpButton = React.forwardRef<
878
878
  )}
879
879
  {...props}
880
880
  >
881
- <ChevronUp className="size-4 text-[#717680]" />
881
+ <ChevronUp className="size-4 text-semantic-text-muted" />
882
882
  </SelectPrimitive.ScrollUpButton>
883
883
  ));
884
884
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
@@ -895,7 +895,7 @@ const SelectScrollDownButton = React.forwardRef<
895
895
  )}
896
896
  {...props}
897
897
  >
898
- <ChevronDown className="size-4 text-[#717680]" />
898
+ <ChevronDown className="size-4 text-semantic-text-muted" />
899
899
  </SelectPrimitive.ScrollDownButton>
900
900
  ));
901
901
  SelectScrollDownButton.displayName =
@@ -909,7 +909,7 @@ const SelectContent = React.forwardRef<
909
909
  <SelectPrimitive.Content
910
910
  ref={ref}
911
911
  className={cn(
912
- "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded bg-white border border-[#E9EAEB] shadow-md",
912
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded bg-semantic-bg-primary border border-semantic-border-layout shadow-md",
913
913
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
914
914
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
915
915
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -944,7 +944,7 @@ const SelectLabel = React.forwardRef<
944
944
  >(({ className, ...props }, ref) => (
945
945
  <SelectPrimitive.Label
946
946
  ref={ref}
947
- className={cn("px-4 py-1.5 text-xs font-medium text-[#717680]", className)}
947
+ className={cn("px-4 py-1.5 text-xs font-medium text-semantic-text-muted", className)}
948
948
  {...props}
949
949
  />
950
950
  ));
@@ -957,8 +957,8 @@ const SelectItem = React.forwardRef<
957
957
  <SelectPrimitive.Item
958
958
  ref={ref}
959
959
  className={cn(
960
- "relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-[#181D27] outline-none",
961
- "hover:bg-[#F5F5F5] focus:bg-[#F5F5F5]",
960
+ "relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-semantic-text-primary outline-none",
961
+ "hover:bg-semantic-bg-ui focus:bg-semantic-bg-ui",
962
962
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
963
963
  className
964
964
  )}
@@ -966,7 +966,7 @@ const SelectItem = React.forwardRef<
966
966
  >
967
967
  <span className="absolute right-2 flex size-4 items-center justify-center">
968
968
  <SelectPrimitive.ItemIndicator>
969
- <Check className="size-4 text-[#2BBCCA]" />
969
+ <Check className="size-4 text-semantic-brand" />
970
970
  </SelectPrimitive.ItemIndicator>
971
971
  </span>
972
972
  <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
@@ -980,7 +980,7 @@ const SelectSeparator = React.forwardRef<
980
980
  >(({ className, ...props }, ref) => (
981
981
  <SelectPrimitive.Separator
982
982
  ref={ref}
983
- className={cn("-mx-1 my-1 h-px bg-[#E9EAEB]", className)}
983
+ className={cn("-mx-1 my-1 h-px bg-semantic-border-layout", className)}
984
984
  {...props}
985
985
  />
986
986
  ));
@@ -1027,7 +1027,7 @@ import { cn } from "../../lib/utils";
1027
1027
  * Checkbox box variants (the outer container)
1028
1028
  */
1029
1029
  const checkboxVariants = cva(
1030
- "peer inline-flex items-center justify-center shrink-0 rounded border-2 transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#343E55] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-[#343E55] data-[state=checked]:border-[#343E55] data-[state=checked]:text-white data-[state=indeterminate]:bg-[#343E55] data-[state=indeterminate]:border-[#343E55] data-[state=indeterminate]:text-white data-[state=unchecked]:bg-white data-[state=unchecked]:border-[#E9EAEB] data-[state=unchecked]:hover:border-[#A4A7AE]",
1030
+ "peer inline-flex items-center justify-center shrink-0 rounded border-2 transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-semantic-primary focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-semantic-primary data-[state=checked]:border-semantic-primary data-[state=checked]:text-semantic-text-inverted data-[state=indeterminate]:bg-semantic-primary data-[state=indeterminate]:border-semantic-primary data-[state=indeterminate]:text-semantic-text-inverted data-[state=unchecked]:bg-semantic-bg-primary data-[state=unchecked]:border-semantic-border-input data-[state=unchecked]:hover:border-[var(--color-neutral-400)]",
1031
1031
  {
1032
1032
  variants: {
1033
1033
  size: {
@@ -1159,7 +1159,7 @@ const Checkbox = React.forwardRef<
1159
1159
  htmlFor={id}
1160
1160
  className={cn(
1161
1161
  labelSizeVariants({ size }),
1162
- "text-[#181D27] cursor-pointer",
1162
+ "text-semantic-text-primary cursor-pointer",
1163
1163
  disabled && "opacity-50 cursor-not-allowed",
1164
1164
  labelClassName
1165
1165
  )}
@@ -1173,7 +1173,7 @@ const Checkbox = React.forwardRef<
1173
1173
  htmlFor={id}
1174
1174
  className={cn(
1175
1175
  labelSizeVariants({ size }),
1176
- "text-[#181D27] cursor-pointer",
1176
+ "text-semantic-text-primary cursor-pointer",
1177
1177
  disabled && "opacity-50 cursor-not-allowed",
1178
1178
  labelClassName
1179
1179
  )}
@@ -1197,7 +1197,7 @@ const Checkbox = React.forwardRef<
1197
1197
  <span
1198
1198
  className={cn(
1199
1199
  labelSizeVariants({ size }),
1200
- "text-[#181D27]",
1200
+ "text-semantic-text-primary",
1201
1201
  disabled && "opacity-50",
1202
1202
  labelClassName
1203
1203
  )}
@@ -1210,7 +1210,7 @@ const Checkbox = React.forwardRef<
1210
1210
  <span
1211
1211
  className={cn(
1212
1212
  labelSizeVariants({ size }),
1213
- "text-[#181D27]",
1213
+ "text-semantic-text-primary",
1214
1214
  disabled && "opacity-50",
1215
1215
  labelClassName
1216
1216
  )}
@@ -1254,7 +1254,7 @@ import { cn } from "../../lib/utils";
1254
1254
  * Switch track variants (the outer container)
1255
1255
  */
1256
1256
  const switchVariants = cva(
1257
- "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#343E55] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-[#343E55] data-[state=unchecked]:bg-[#E9EAEB]",
1257
+ "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-semantic-primary focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-semantic-primary data-[state=unchecked]:bg-semantic-bg-grey",
1258
1258
  {
1259
1259
  variants: {
1260
1260
  size: {
@@ -1358,7 +1358,7 @@ const Switch = React.forwardRef<
1358
1358
  <span
1359
1359
  className={cn(
1360
1360
  labelSizeVariants({ size }),
1361
- "text-[#181D27]",
1361
+ "text-semantic-text-primary",
1362
1362
  disabled && "opacity-50"
1363
1363
  )}
1364
1364
  >
@@ -1370,7 +1370,7 @@ const Switch = React.forwardRef<
1370
1370
  <span
1371
1371
  className={cn(
1372
1372
  labelSizeVariants({ size }),
1373
- "text-[#181D27]",
1373
+ "text-semantic-text-primary",
1374
1374
  disabled && "opacity-50"
1375
1375
  )}
1376
1376
  >
@@ -1413,17 +1413,17 @@ import { cn } from "../../lib/utils";
1413
1413
  * TextField container variants for when icons/prefix/suffix are present
1414
1414
  */
1415
1415
  const textFieldContainerVariants = cva(
1416
- "relative flex items-center rounded bg-white transition-all",
1416
+ "relative flex items-center rounded bg-semantic-bg-primary transition-all",
1417
1417
  {
1418
1418
  variants: {
1419
1419
  state: {
1420
1420
  default:
1421
- "border border-[#E9EAEB] focus-within:border-[#2BBCCA]/50 focus-within:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1421
+ "border border-semantic-border-input focus-within:border-semantic-border-input-focus/50 focus-within:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1422
1422
  error:
1423
- "border border-[#F04438]/40 focus-within:border-[#F04438]/60 focus-within:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1423
+ "border border-semantic-error-primary/40 focus-within:border-semantic-error-primary/60 focus-within:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1424
1424
  },
1425
1425
  disabled: {
1426
- true: "cursor-not-allowed opacity-50 bg-[#FAFAFA]",
1426
+ true: "cursor-not-allowed opacity-50 bg-[var(--color-neutral-50)]",
1427
1427
  false: "",
1428
1428
  },
1429
1429
  },
@@ -1438,14 +1438,14 @@ const textFieldContainerVariants = cva(
1438
1438
  * TextField input variants (standalone without container)
1439
1439
  */
1440
1440
  const textFieldInputVariants = cva(
1441
- "h-10 w-full rounded bg-white px-4 py-2.5 text-sm text-[#181D27] transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[#181D27] placeholder:text-[#A2A6B1] disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[#FAFAFA]",
1441
+ "h-10 w-full rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
1442
1442
  {
1443
1443
  variants: {
1444
1444
  state: {
1445
1445
  default:
1446
- "border border-[#E9EAEB] focus:outline-none focus:border-[#2BBCCA]/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1446
+ "border border-semantic-border-input focus:outline-none focus:border-semantic-border-input-focus/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1447
1447
  error:
1448
- "border border-[#F04438]/40 focus:outline-none focus:border-[#F04438]/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1448
+ "border border-semantic-error-primary/40 focus:outline-none focus:border-semantic-error-primary/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1449
1449
  },
1450
1450
  },
1451
1451
  defaultVariants: {
@@ -1566,7 +1566,7 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
1566
1566
  id={inputId}
1567
1567
  className={cn(
1568
1568
  hasAddons
1569
- ? "flex-1 bg-transparent border-0 outline-none focus:ring-0 px-0 h-full text-sm text-[#181D27] placeholder:text-[#A2A6B1] disabled:cursor-not-allowed"
1569
+ ? "flex-1 bg-transparent border-0 outline-none focus:ring-0 px-0 h-full text-sm text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed"
1570
1570
  : textFieldInputVariants({ state: derivedState, className })
1571
1571
  )}
1572
1572
  disabled={disabled || loading}
@@ -1586,10 +1586,10 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
1586
1586
  {label && (
1587
1587
  <label
1588
1588
  htmlFor={inputId}
1589
- className={cn("text-sm font-medium text-[#181D27]", labelClassName)}
1589
+ className={cn("text-sm font-medium text-semantic-text-primary", labelClassName)}
1590
1590
  >
1591
1591
  {label}
1592
- {required && <span className="text-[#F04438] ml-0.5">*</span>}
1592
+ {required && <span className="text-semantic-error-primary ml-0.5">*</span>}
1593
1593
  </label>
1594
1594
  )}
1595
1595
 
@@ -1606,26 +1606,26 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
1606
1606
  )}
1607
1607
  >
1608
1608
  {prefix && (
1609
- <span className="text-sm text-[#717680] mr-2 select-none">
1609
+ <span className="text-sm text-semantic-text-muted mr-2 select-none">
1610
1610
  {prefix}
1611
1611
  </span>
1612
1612
  )}
1613
1613
  {leftIcon && (
1614
- <span className="mr-2 text-[#717680] [&_svg]:size-4 flex-shrink-0">
1614
+ <span className="mr-2 text-semantic-text-muted [&_svg]:size-4 flex-shrink-0">
1615
1615
  {leftIcon}
1616
1616
  </span>
1617
1617
  )}
1618
1618
  {inputElement}
1619
1619
  {loading && (
1620
- <Loader2 className="animate-spin size-4 text-[#717680] ml-2 flex-shrink-0" />
1620
+ <Loader2 className="animate-spin size-4 text-semantic-text-muted ml-2 flex-shrink-0" />
1621
1621
  )}
1622
1622
  {!loading && rightIcon && (
1623
- <span className="ml-2 text-[#717680] [&_svg]:size-4 flex-shrink-0">
1623
+ <span className="ml-2 text-semantic-text-muted [&_svg]:size-4 flex-shrink-0">
1624
1624
  {rightIcon}
1625
1625
  </span>
1626
1626
  )}
1627
1627
  {suffix && (
1628
- <span className="text-sm text-[#717680] ml-2 select-none">
1628
+ <span className="text-sm text-semantic-text-muted ml-2 select-none">
1629
1629
  {suffix}
1630
1630
  </span>
1631
1631
  )}
@@ -1638,11 +1638,11 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
1638
1638
  {(error || helperText || (showCount && maxLength)) && (
1639
1639
  <div className="flex justify-between items-start gap-2">
1640
1640
  {error ? (
1641
- <span id={errorId} className="text-xs text-[#F04438]">
1641
+ <span id={errorId} className="text-xs text-semantic-error-primary">
1642
1642
  {error}
1643
1643
  </span>
1644
1644
  ) : helperText ? (
1645
- <span id={helperId} className="text-xs text-[#717680]">
1645
+ <span id={helperId} className="text-xs text-semantic-text-muted">
1646
1646
  {helperText}
1647
1647
  </span>
1648
1648
  ) : (
@@ -1652,7 +1652,7 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
1652
1652
  <span
1653
1653
  className={cn(
1654
1654
  "text-xs",
1655
- charCount > maxLength ? "text-[#F04438]" : "text-[#717680]"
1655
+ charCount > maxLength ? "text-semantic-error-primary" : "text-semantic-text-muted"
1656
1656
  )}
1657
1657
  >
1658
1658
  {charCount}/{maxLength}
@@ -1849,10 +1849,10 @@ const SelectField = React.forwardRef<HTMLButtonElement, SelectFieldProps>(
1849
1849
  {label && (
1850
1850
  <label
1851
1851
  htmlFor={selectId}
1852
- className={cn("text-sm font-medium text-[#181D27]", labelClassName)}
1852
+ className={cn("text-sm font-medium text-semantic-text-primary", labelClassName)}
1853
1853
  >
1854
1854
  {label}
1855
- {required && <span className="text-[#F04438] ml-0.5">*</span>}
1855
+ {required && <span className="text-semantic-error-primary ml-0.5">*</span>}
1856
1856
  </label>
1857
1857
  )}
1858
1858
 
@@ -1875,7 +1875,7 @@ const SelectField = React.forwardRef<HTMLButtonElement, SelectFieldProps>(
1875
1875
  >
1876
1876
  <SelectValue placeholder={placeholder} />
1877
1877
  {loading && (
1878
- <Loader2 className="absolute right-8 size-4 animate-spin text-[#717680]" />
1878
+ <Loader2 className="absolute right-8 size-4 animate-spin text-semantic-text-muted" />
1879
1879
  )}
1880
1880
  </SelectTrigger>
1881
1881
  <SelectContent>
@@ -1887,7 +1887,7 @@ const SelectField = React.forwardRef<HTMLButtonElement, SelectFieldProps>(
1887
1887
  placeholder={searchPlaceholder}
1888
1888
  value={searchQuery}
1889
1889
  onChange={handleSearchChange}
1890
- className="w-full h-8 px-3 text-sm border border-[#E9EAEB] rounded bg-white placeholder:text-[#A2A6B1] focus:outline-none focus:border-[#2BBCCA]/50"
1890
+ className="w-full h-8 px-3 text-sm border border-semantic-border-input rounded bg-semantic-bg-primary placeholder:text-semantic-text-placeholder focus:outline-none focus:border-semantic-border-input-focus/50"
1891
1891
  // Prevent closing dropdown when clicking input
1892
1892
  onClick={(e) => e.stopPropagation()}
1893
1893
  onKeyDown={(e) => e.stopPropagation()}
@@ -1930,7 +1930,7 @@ const SelectField = React.forwardRef<HTMLButtonElement, SelectFieldProps>(
1930
1930
  searchQuery &&
1931
1931
  groupedOptions.ungrouped.length === 0 &&
1932
1932
  Object.keys(groupedOptions.groups).length === 0 && (
1933
- <div className="py-6 text-center text-sm text-[#717680]">
1933
+ <div className="py-6 text-center text-sm text-semantic-text-muted">
1934
1934
  No results found
1935
1935
  </div>
1936
1936
  )}
@@ -1941,11 +1941,11 @@ const SelectField = React.forwardRef<HTMLButtonElement, SelectFieldProps>(
1941
1941
  {(error || helperText) && (
1942
1942
  <div className="flex justify-between items-start gap-2">
1943
1943
  {error ? (
1944
- <span id={errorId} className="text-xs text-[#F04438]">
1944
+ <span id={errorId} className="text-xs text-semantic-error-primary">
1945
1945
  {error}
1946
1946
  </span>
1947
1947
  ) : helperText ? (
1948
- <span id={helperId} className="text-xs text-[#717680]">
1948
+ <span id={helperId} className="text-xs text-semantic-text-muted">
1949
1949
  {helperText}
1950
1950
  </span>
1951
1951
  ) : null}
@@ -1984,14 +1984,14 @@ import { cn } from "../../lib/utils";
1984
1984
  * MultiSelect trigger variants matching TextField styling
1985
1985
  */
1986
1986
  const multiSelectTriggerVariants = cva(
1987
- "flex min-h-10 w-full items-center justify-between rounded bg-white px-4 py-2 text-sm text-[#181D27] transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[#FAFAFA]",
1987
+ "flex min-h-10 w-full items-center justify-between rounded bg-semantic-bg-primary px-4 py-2 text-sm text-semantic-text-primary transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
1988
1988
  {
1989
1989
  variants: {
1990
1990
  state: {
1991
1991
  default:
1992
- "border border-[#E9EAEB] focus:outline-none focus:border-[#2BBCCA]/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1992
+ "border border-semantic-border-input focus:outline-none focus:border-semantic-border-input-focus/50 focus:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
1993
1993
  error:
1994
- "border border-[#F04438]/40 focus:outline-none focus:border-[#F04438]/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1994
+ "border border-semantic-error-primary/40 focus:outline-none focus:border-semantic-error-primary/60 focus:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
1995
1995
  },
1996
1996
  },
1997
1997
  defaultVariants: {
@@ -2209,10 +2209,10 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2209
2209
  {label && (
2210
2210
  <label
2211
2211
  htmlFor={selectId}
2212
- className={cn("text-sm font-medium text-[#181D27]", labelClassName)}
2212
+ className={cn("text-sm font-medium text-semantic-text-primary", labelClassName)}
2213
2213
  >
2214
2214
  {label}
2215
- {required && <span className="text-[#F04438] ml-0.5">*</span>}
2215
+ {required && <span className="text-semantic-error-primary ml-0.5">*</span>}
2216
2216
  </label>
2217
2217
  )}
2218
2218
 
@@ -2237,12 +2237,12 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2237
2237
  >
2238
2238
  <div className="flex-1 flex flex-wrap gap-1">
2239
2239
  {selectedValues.length === 0 ? (
2240
- <span className="text-[#A2A6B1]">{placeholder}</span>
2240
+ <span className="text-semantic-text-placeholder">{placeholder}</span>
2241
2241
  ) : (
2242
2242
  selectedLabels.map((label, index) => (
2243
2243
  <span
2244
2244
  key={selectedValues[index]}
2245
- className="inline-flex items-center gap-1 bg-[#F5F5F5] text-[#181D27] text-xs px-2 py-0.5 rounded"
2245
+ className="inline-flex items-center gap-1 bg-semantic-bg-ui text-semantic-text-primary text-xs px-2 py-0.5 rounded"
2246
2246
  >
2247
2247
  {label}
2248
2248
  <span
@@ -2258,7 +2258,7 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2258
2258
  );
2259
2259
  }
2260
2260
  }}
2261
- className="cursor-pointer hover:text-[#F04438] focus:outline-none"
2261
+ className="cursor-pointer hover:text-semantic-error-primary focus:outline-none"
2262
2262
  aria-label={\`Remove \${label}\`}
2263
2263
  >
2264
2264
  <X className="size-3" />
@@ -2279,18 +2279,18 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2279
2279
  clearAll(e as unknown as React.MouseEvent);
2280
2280
  }
2281
2281
  }}
2282
- className="p-0.5 cursor-pointer hover:text-[#F04438] focus:outline-none"
2282
+ className="p-0.5 cursor-pointer hover:text-semantic-error-primary focus:outline-none"
2283
2283
  aria-label="Clear all"
2284
2284
  >
2285
- <X className="size-4 text-[#717680]" />
2285
+ <X className="size-4 text-semantic-text-muted" />
2286
2286
  </span>
2287
2287
  )}
2288
2288
  {loading ? (
2289
- <Loader2 className="size-4 animate-spin text-[#717680]" />
2289
+ <Loader2 className="size-4 animate-spin text-semantic-text-muted" />
2290
2290
  ) : (
2291
2291
  <ChevronDown
2292
2292
  className={cn(
2293
- "size-4 text-[#717680] transition-transform",
2293
+ "size-4 text-semantic-text-muted transition-transform",
2294
2294
  isOpen && "rotate-180"
2295
2295
  )}
2296
2296
  />
@@ -2302,7 +2302,7 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2302
2302
  {isOpen && (
2303
2303
  <div
2304
2304
  className={cn(
2305
- "absolute z-50 mt-1 w-full rounded bg-white border border-[#E9EAEB] shadow-md",
2305
+ "absolute z-50 mt-1 w-full rounded bg-semantic-bg-primary border border-semantic-border-layout shadow-md",
2306
2306
  "top-full"
2307
2307
  )}
2308
2308
  role="listbox"
@@ -2310,13 +2310,13 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2310
2310
  >
2311
2311
  {/* Search input */}
2312
2312
  {searchable && (
2313
- <div className="p-2 border-b border-[#E9EAEB]">
2313
+ <div className="p-2 border-b border-semantic-border-layout">
2314
2314
  <input
2315
2315
  type="text"
2316
2316
  placeholder={searchPlaceholder}
2317
2317
  value={searchQuery}
2318
2318
  onChange={(e) => setSearchQuery(e.target.value)}
2319
- className="w-full h-8 px-3 text-sm border border-[#E9EAEB] rounded bg-white placeholder:text-[#A2A6B1] focus:outline-none focus:border-[#2BBCCA]/50"
2319
+ className="w-full h-8 px-3 text-sm border border-semantic-border-input rounded bg-semantic-bg-primary placeholder:text-semantic-text-placeholder focus:outline-none focus:border-semantic-border-input-focus/50"
2320
2320
  onClick={(e) => e.stopPropagation()}
2321
2321
  />
2322
2322
  </div>
@@ -2325,7 +2325,7 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2325
2325
  {/* Options */}
2326
2326
  <div className="max-h-60 overflow-auto p-1">
2327
2327
  {filteredOptions.length === 0 ? (
2328
- <div className="py-6 text-center text-sm text-[#717680]">
2328
+ <div className="py-6 text-center text-sm text-semantic-text-muted">
2329
2329
  No results found
2330
2330
  </div>
2331
2331
  ) : (
@@ -2347,15 +2347,15 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2347
2347
  disabled={isDisabled}
2348
2348
  onClick={() => !isDisabled && toggleOption(option.value)}
2349
2349
  className={cn(
2350
- "relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-[#181D27] outline-none",
2351
- "hover:bg-[#F5F5F5] focus:bg-[#F5F5F5]",
2352
- isSelected && "bg-[#F5F5F5]",
2350
+ "relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-semantic-text-primary outline-none",
2351
+ "hover:bg-semantic-bg-ui focus:bg-semantic-bg-ui",
2352
+ isSelected && "bg-semantic-bg-ui",
2353
2353
  isDisabled && "pointer-events-none opacity-50"
2354
2354
  )}
2355
2355
  >
2356
2356
  <span className="absolute right-2 flex size-4 items-center justify-center">
2357
2357
  {isSelected && (
2358
- <Check className="size-4 text-[#2BBCCA]" />
2358
+ <Check className="size-4 text-semantic-brand" />
2359
2359
  )}
2360
2360
  </span>
2361
2361
  {option.label}
@@ -2367,7 +2367,7 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2367
2367
 
2368
2368
  {/* Footer with count */}
2369
2369
  {maxSelections && (
2370
- <div className="p-2 border-t border-[#E9EAEB] text-xs text-[#717680]">
2370
+ <div className="p-2 border-t border-semantic-border-layout text-xs text-semantic-text-muted">
2371
2371
  {selectedValues.length} / {maxSelections} selected
2372
2372
  </div>
2373
2373
  )}
@@ -2384,11 +2384,11 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
2384
2384
  {(error || helperText) && (
2385
2385
  <div className="flex justify-between items-start gap-2">
2386
2386
  {error ? (
2387
- <span id={errorId} className="text-xs text-[#F04438]">
2387
+ <span id={errorId} className="text-xs text-semantic-error-primary">
2388
2388
  {error}
2389
2389
  </span>
2390
2390
  ) : helperText ? (
2391
- <span id={helperId} className="text-xs text-[#717680]">
2391
+ <span id={helperId} className="text-xs text-semantic-text-muted">
2392
2392
  {helperText}
2393
2393
  </span>
2394
2394
  ) : null}
@@ -2473,7 +2473,7 @@ const Table = React.forwardRef<HTMLTableElement, TableProps>(
2473
2473
  <div
2474
2474
  className={cn(
2475
2475
  "relative w-full overflow-auto",
2476
- !withoutBorder && "rounded-lg border border-[#E9EAEB]"
2476
+ !withoutBorder && "rounded-lg border border-semantic-border-layout"
2477
2477
  )}
2478
2478
  >
2479
2479
  <table
@@ -2492,7 +2492,7 @@ const TableHeader = React.forwardRef<
2492
2492
  >(({ className, ...props }, ref) => (
2493
2493
  <thead
2494
2494
  ref={ref}
2495
- className={cn("bg-[#FAFAFA] [&_tr]:border-b", className)}
2495
+ className={cn("bg-[var(--color-neutral-50)] [&_tr]:border-b", className)}
2496
2496
  {...props}
2497
2497
  />
2498
2498
  ));
@@ -2517,7 +2517,7 @@ const TableFooter = React.forwardRef<
2517
2517
  <tfoot
2518
2518
  ref={ref}
2519
2519
  className={cn(
2520
- "border-t bg-[#FAFAFA] font-medium [&>tr]:last:border-b-0",
2520
+ "border-t bg-[var(--color-neutral-50)] font-medium [&>tr]:last:border-b-0",
2521
2521
  className
2522
2522
  )}
2523
2523
  {...props}
@@ -2535,10 +2535,10 @@ const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(
2535
2535
  <tr
2536
2536
  ref={ref}
2537
2537
  className={cn(
2538
- "border-b border-[#E9EAEB] transition-colors",
2538
+ "border-b border-semantic-border-layout transition-colors",
2539
2539
  highlighted
2540
- ? "bg-[#ECF1FB]"
2541
- : "hover:bg-[#FAFAFA]/50 data-[state=selected]:bg-[#F5F5F5]",
2540
+ ? "bg-semantic-info-surface"
2541
+ : "hover:bg-[var(--color-neutral-50)]/50 data-[state=selected]:bg-semantic-bg-ui",
2542
2542
  className
2543
2543
  )}
2544
2544
  {...props}
@@ -2564,8 +2564,8 @@ const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(
2564
2564
  <th
2565
2565
  ref={ref}
2566
2566
  className={cn(
2567
- "h-12 px-4 text-left align-middle font-medium text-[#717680] text-sm [&:has([role=checkbox])]:pr-0",
2568
- sticky && "sticky left-0 bg-[#FAFAFA] z-10",
2567
+ "h-12 px-4 text-left align-middle font-medium text-semantic-text-muted text-sm [&:has([role=checkbox])]:pr-0",
2568
+ sticky && "sticky left-0 bg-[var(--color-neutral-50)] z-10",
2569
2569
  sortDirection && "cursor-pointer select-none",
2570
2570
  className
2571
2571
  )}
@@ -2574,12 +2574,12 @@ const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(
2574
2574
  <div className="flex items-center gap-1">
2575
2575
  {children}
2576
2576
  {sortDirection && (
2577
- <span className="text-[#A4A7AE]">
2577
+ <span className="text-[var(--color-neutral-400)]">
2578
2578
  {sortDirection === "asc" ? "\u2191" : "\u2193"}
2579
2579
  </span>
2580
2580
  )}
2581
2581
  {infoTooltip && (
2582
- <span className="text-[#A4A7AE] cursor-help" title={infoTooltip}>
2582
+ <span className="text-[var(--color-neutral-400)] cursor-help" title={infoTooltip}>
2583
2583
  \u24D8
2584
2584
  </span>
2585
2585
  )}
@@ -2599,8 +2599,8 @@ const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(
2599
2599
  <td
2600
2600
  ref={ref}
2601
2601
  className={cn(
2602
- "px-4 align-middle text-[#181D27] [&:has([role=checkbox])]:pr-0",
2603
- sticky && "sticky left-0 bg-white z-10",
2602
+ "px-4 align-middle text-semantic-text-primary [&:has([role=checkbox])]:pr-0",
2603
+ sticky && "sticky left-0 bg-semantic-bg-primary z-10",
2604
2604
  className
2605
2605
  )}
2606
2606
  {...props}
@@ -2615,7 +2615,7 @@ const TableCaption = React.forwardRef<
2615
2615
  >(({ className, ...props }, ref) => (
2616
2616
  <caption
2617
2617
  ref={ref}
2618
- className={cn("mt-4 text-sm text-[#717680]", className)}
2618
+ className={cn("mt-4 text-sm text-semantic-text-muted", className)}
2619
2619
  {...props}
2620
2620
  />
2621
2621
  ));
@@ -2638,7 +2638,7 @@ const TableSkeleton = ({ rows = 5, columns = 5 }: TableSkeletonProps) => (
2638
2638
  {Array.from({ length: columns }).map((_, colIndex) => (
2639
2639
  <TableCell key={colIndex}>
2640
2640
  <div
2641
- className="h-4 bg-[#E9EAEB] rounded animate-pulse"
2641
+ className="h-4 bg-semantic-bg-grey rounded animate-pulse"
2642
2642
  style={{
2643
2643
  width: colIndex === 1 ? "80%" : colIndex === 2 ? "30%" : "60%",
2644
2644
  }}
@@ -2663,7 +2663,7 @@ export interface TableEmptyProps {
2663
2663
 
2664
2664
  const TableEmpty = ({ colSpan, children }: TableEmptyProps) => (
2665
2665
  <TableRow>
2666
- <TableCell colSpan={colSpan} className="text-center py-8 text-[#717680]">
2666
+ <TableCell colSpan={colSpan} className="text-center py-8 text-semantic-text-muted">
2667
2667
  {children || "No data available"}
2668
2668
  </TableCell>
2669
2669
  </TableRow>
@@ -2956,7 +2956,7 @@ const DropdownMenuSubTrigger = React.forwardRef<
2956
2956
  <DropdownMenuPrimitive.SubTrigger
2957
2957
  ref={ref}
2958
2958
  className={cn(
2959
- "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-[#F5F5F5] data-[state=open]:bg-[#F5F5F5]",
2959
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-semantic-bg-ui data-[state=open]:bg-semantic-bg-ui",
2960
2960
  inset && "pl-8",
2961
2961
  className
2962
2962
  )}
@@ -2976,7 +2976,7 @@ const DropdownMenuSubContent = React.forwardRef<
2976
2976
  <DropdownMenuPrimitive.SubContent
2977
2977
  ref={ref}
2978
2978
  className={cn(
2979
- "z-50 min-w-[8rem] overflow-hidden rounded-md border border-[#E9EAEB] bg-white p-1 text-[#181D27] shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
2979
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border border-semantic-border-layout bg-semantic-bg-primary p-1 text-semantic-text-primary shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
2980
2980
  className
2981
2981
  )}
2982
2982
  {...props}
@@ -2994,7 +2994,7 @@ const DropdownMenuContent = React.forwardRef<
2994
2994
  ref={ref}
2995
2995
  sideOffset={sideOffset}
2996
2996
  className={cn(
2997
- "z-50 min-w-[8rem] overflow-hidden rounded-md border border-[#E9EAEB] bg-white p-1 text-[#181D27] shadow-md",
2997
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border border-semantic-border-layout bg-semantic-bg-primary p-1 text-semantic-text-primary shadow-md",
2998
2998
  "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
2999
2999
  className
3000
3000
  )}
@@ -3013,7 +3013,7 @@ const DropdownMenuItem = React.forwardRef<
3013
3013
  <DropdownMenuPrimitive.Item
3014
3014
  ref={ref}
3015
3015
  className={cn(
3016
- "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-[#F5F5F5] focus:text-[#181D27] data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3016
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-semantic-bg-ui focus:text-semantic-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3017
3017
  inset && "pl-8",
3018
3018
  className
3019
3019
  )}
@@ -3029,7 +3029,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
3029
3029
  <DropdownMenuPrimitive.CheckboxItem
3030
3030
  ref={ref}
3031
3031
  className={cn(
3032
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-[#F5F5F5] focus:text-[#181D27] data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3032
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-semantic-bg-ui focus:text-semantic-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3033
3033
  className
3034
3034
  )}
3035
3035
  checked={checked}
@@ -3053,7 +3053,7 @@ const DropdownMenuRadioItem = React.forwardRef<
3053
3053
  <DropdownMenuPrimitive.RadioItem
3054
3054
  ref={ref}
3055
3055
  className={cn(
3056
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-[#F5F5F5] focus:text-[#181D27] data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3056
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-semantic-bg-ui focus:text-semantic-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3057
3057
  className
3058
3058
  )}
3059
3059
  {...props}
@@ -3092,7 +3092,7 @@ const DropdownMenuSeparator = React.forwardRef<
3092
3092
  >(({ className, ...props }, ref) => (
3093
3093
  <DropdownMenuPrimitive.Separator
3094
3094
  ref={ref}
3095
- className={cn("-mx-1 my-1 h-px bg-[#E9EAEB]", className)}
3095
+ className={cn("-mx-1 my-1 h-px bg-semantic-border-layout", className)}
3096
3096
  {...props}
3097
3097
  />
3098
3098
  ));
@@ -3163,7 +3163,7 @@ const TooltipContent = React.forwardRef<
3163
3163
  ref={ref}
3164
3164
  sideOffset={sideOffset}
3165
3165
  className={cn(
3166
- "z-50 overflow-hidden rounded-md bg-[#343E55] px-3 py-1.5 text-xs text-white 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",
3166
+ "z-50 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",
3167
3167
  className
3168
3168
  )}
3169
3169
  {...props}
@@ -3178,7 +3178,7 @@ const TooltipArrow = React.forwardRef<
3178
3178
  >(({ className, ...props }, ref) => (
3179
3179
  <TooltipPrimitive.Arrow
3180
3180
  ref={ref}
3181
- className={cn("fill-[#343E55]", className)}
3181
+ className={cn("fill-semantic-primary", className)}
3182
3182
  {...props}
3183
3183
  />
3184
3184
  ));
@@ -3552,14 +3552,14 @@ import { cn } from "../../lib/utils";
3552
3552
  const tagVariants = cva("inline-flex items-center rounded text-sm", {
3553
3553
  variants: {
3554
3554
  variant: {
3555
- default: "bg-[#F5F5F5] text-[#181D27]",
3556
- primary: "bg-[#F5F5F5] text-[#181D27]",
3557
- accent: "bg-[#EBECEE] text-[#343E55]",
3558
- secondary: "bg-[#E9EAEB] text-[#414651]",
3559
- success: "bg-[#ECFDF3] text-[#17B26A]",
3560
- warning: "bg-[#FFFAEB] text-[#F79009]",
3561
- error: "bg-[#FEF3F2] text-[#F04438]",
3562
- destructive: "bg-[#FEF3F2] text-[#F04438]",
3555
+ default: "bg-semantic-bg-ui text-semantic-text-primary",
3556
+ primary: "bg-semantic-bg-ui text-semantic-text-primary",
3557
+ accent: "bg-semantic-primary-surface text-semantic-text-secondary",
3558
+ secondary: "bg-semantic-bg-grey text-[var(--color-neutral-700)]",
3559
+ success: "bg-semantic-success-surface text-semantic-success-primary",
3560
+ warning: "bg-semantic-warning-surface text-semantic-warning-primary",
3561
+ error: "bg-semantic-error-surface text-semantic-error-primary",
3562
+ destructive: "bg-semantic-error-surface text-semantic-error-primary",
3563
3563
  },
3564
3564
  size: {
3565
3565
  default: "px-2 py-1",
@@ -3702,16 +3702,16 @@ import { cn } from "../../lib/utils";
3702
3702
  * Colors are hardcoded for Bootstrap compatibility.
3703
3703
  */
3704
3704
  const alertVariants = cva(
3705
- "relative w-full rounded border p-4 text-sm text-[#181D27] [&>svg~*]:pl-8 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4",
3705
+ "relative w-full rounded border p-4 text-sm text-semantic-text-primary [&>svg~*]:pl-8 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4",
3706
3706
  {
3707
3707
  variants: {
3708
3708
  variant: {
3709
- default: "bg-[#F5F5F5] border-[#E9EAEB] [&>svg]:text-[#181D27]",
3710
- success: "bg-[#ECFDF3] border-[#17B26A]/20 [&>svg]:text-[#17B26A]",
3711
- error: "bg-[#FEF3F2] border-[#F04438]/20 [&>svg]:text-[#F04438]",
3712
- destructive: "bg-[#FEF3F2] border-[#F04438]/20 [&>svg]:text-[#F04438]",
3713
- warning: "bg-[#FFFAEB] border-[#F79009]/20 [&>svg]:text-[#F79009]",
3714
- info: "bg-[#EBF5FF] border-[#4275D6]/20 [&>svg]:text-[#4275D6]",
3709
+ default: "bg-semantic-bg-ui border-semantic-border-layout [&>svg]:text-semantic-text-primary",
3710
+ success: "bg-semantic-success-surface border-semantic-success-border [&>svg]:text-semantic-success-primary",
3711
+ error: "bg-semantic-error-surface border-semantic-error-border [&>svg]:text-semantic-error-primary",
3712
+ destructive: "bg-semantic-error-surface border-semantic-error-border [&>svg]:text-semantic-error-primary",
3713
+ warning: "bg-semantic-warning-surface border-semantic-warning-border [&>svg]:text-semantic-warning-primary",
3714
+ info: "bg-semantic-info-surface border-semantic-info-border [&>svg]:text-semantic-info-primary",
3715
3715
  },
3716
3716
  },
3717
3717
  defaultVariants: {
@@ -3843,12 +3843,12 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
3843
3843
  onClick={handleClose}
3844
3844
  className={cn(
3845
3845
  "rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2",
3846
- variant === "default" && "focus:ring-[#181D27]",
3847
- variant === "success" && "focus:ring-[#17B26A]",
3846
+ variant === "default" && "focus:ring-semantic-text-primary",
3847
+ variant === "success" && "focus:ring-semantic-success-primary",
3848
3848
  (variant === "error" || variant === "destructive") &&
3849
- "focus:ring-[#F04438]",
3850
- variant === "warning" && "focus:ring-[#F79009]",
3851
- variant === "info" && "focus:ring-[#4275D6]"
3849
+ "focus:ring-semantic-error-primary",
3850
+ variant === "warning" && "focus:ring-semantic-warning-primary",
3851
+ variant === "info" && "focus:ring-semantic-info-primary"
3852
3852
  )}
3853
3853
  aria-label="Close alert"
3854
3854
  >
@@ -3937,11 +3937,11 @@ const toastVariants = cva(
3937
3937
  {
3938
3938
  variants: {
3939
3939
  variant: {
3940
- default: "border-[#E9EAEB] bg-white text-[#181D27]",
3941
- success: "border-[#17B26A]/20 bg-[#ECFDF3] text-[#067647]",
3942
- error: "border-[#F04438]/20 bg-[#FEF3F2] text-[#B42318]",
3943
- warning: "border-[#F79009]/20 bg-[#FFFAEB] text-[#B54708]",
3944
- info: "border-[#4275D6]/20 bg-[#EBF5FF] text-[#1849A9]",
3940
+ default: "border-semantic-border-layout bg-semantic-bg-primary text-semantic-text-primary",
3941
+ success: "border-semantic-success-border bg-semantic-success-surface text-semantic-success-hover",
3942
+ error: "border-semantic-error-border bg-semantic-error-surface text-semantic-error-hover",
3943
+ warning: "border-semantic-warning-border bg-semantic-warning-surface text-semantic-warning-hover",
3944
+ info: "border-semantic-info-border bg-semantic-info-surface text-semantic-info-hover",
3945
3945
  },
3946
3946
  },
3947
3947
  defaultVariants: {
@@ -3972,11 +3972,11 @@ const ToastAction = React.forwardRef<
3972
3972
  <ToastPrimitives.Action
3973
3973
  ref={ref}
3974
3974
  className={cn(
3975
- "inline-flex h-8 shrink-0 items-center justify-center rounded border border-[#E9EAEB] bg-transparent px-3 text-sm font-medium transition-colors hover:bg-[#F5F5F5] focus:outline-none focus:ring-2 focus:ring-[#4275D6] focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
3976
- "group-[.success]:border-[#17B26A]/30 group-[.success]:hover:border-[#17B26A]/50 group-[.success]:hover:bg-[#17B26A]/10",
3977
- "group-[.error]:border-[#F04438]/30 group-[.error]:hover:border-[#F04438]/50 group-[.error]:hover:bg-[#F04438]/10",
3978
- "group-[.warning]:border-[#F79009]/30 group-[.warning]:hover:border-[#F79009]/50 group-[.warning]:hover:bg-[#F79009]/10",
3979
- "group-[.info]:border-[#4275D6]/30 group-[.info]:hover:border-[#4275D6]/50 group-[.info]:hover:bg-[#4275D6]/10",
3975
+ "inline-flex h-8 shrink-0 items-center justify-center rounded border border-semantic-border-layout bg-transparent px-3 text-sm font-medium transition-colors hover:bg-semantic-bg-ui focus:outline-none focus:ring-2 focus:ring-semantic-info-primary focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
3976
+ "group-[.success]:border-semantic-success-primary/30 group-[.success]:hover:border-semantic-success-primary/50 group-[.success]:hover:bg-semantic-success-primary/10",
3977
+ "group-[.error]:border-semantic-error-primary/30 group-[.error]:hover:border-semantic-error-primary/50 group-[.error]:hover:bg-semantic-error-primary/10",
3978
+ "group-[.warning]:border-semantic-warning-primary/30 group-[.warning]:hover:border-semantic-warning-primary/50 group-[.warning]:hover:bg-semantic-warning-primary/10",
3979
+ "group-[.info]:border-semantic-info-primary/30 group-[.info]:hover:border-semantic-info-primary/50 group-[.info]:hover:bg-semantic-info-primary/10",
3980
3980
  className
3981
3981
  )}
3982
3982
  {...props}
@@ -3991,11 +3991,11 @@ const ToastClose = React.forwardRef<
3991
3991
  <ToastPrimitives.Close
3992
3992
  ref={ref}
3993
3993
  className={cn(
3994
- "absolute right-2 top-2 rounded-md p-1 text-[#717680] opacity-0 transition-opacity hover:text-[#181D27] focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100",
3995
- "group-[.success]:text-[#067647] group-[.success]:hover:text-[#067647]",
3996
- "group-[.error]:text-[#B42318] group-[.error]:hover:text-[#B42318]",
3997
- "group-[.warning]:text-[#B54708] group-[.warning]:hover:text-[#B54708]",
3998
- "group-[.info]:text-[#1849A9] group-[.info]:hover:text-[#1849A9]",
3994
+ "absolute right-2 top-2 rounded-md p-1 text-semantic-text-muted opacity-0 transition-opacity hover:text-semantic-text-primary focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100",
3995
+ "group-[.success]:text-semantic-success-hover group-[.success]:hover:text-semantic-success-hover",
3996
+ "group-[.error]:text-semantic-error-hover group-[.error]:hover:text-semantic-error-hover",
3997
+ "group-[.warning]:text-semantic-warning-hover group-[.warning]:hover:text-semantic-warning-hover",
3998
+ "group-[.info]:text-semantic-info-hover group-[.info]:hover:text-semantic-info-hover",
3999
3999
  className
4000
4000
  )}
4001
4001
  toast-close=""
@@ -4289,10 +4289,10 @@ function Toaster() {
4289
4289
  <Icon
4290
4290
  className={cn(
4291
4291
  "h-5 w-5 shrink-0",
4292
- variant === "success" && "text-[#17B26A]",
4293
- variant === "error" && "text-[#F04438]",
4294
- variant === "warning" && "text-[#F79009]",
4295
- variant === "info" && "text-[#4275D6]"
4292
+ variant === "success" && "text-semantic-success-primary",
4293
+ variant === "error" && "text-semantic-error-primary",
4294
+ variant === "warning" && "text-semantic-warning-primary",
4295
+ variant === "info" && "text-semantic-info-primary"
4296
4296
  )}
4297
4297
  />
4298
4298
  )}
@@ -4404,7 +4404,7 @@ const accordionVariants = cva("w-full", {
4404
4404
  variants: {
4405
4405
  variant: {
4406
4406
  default: "",
4407
- bordered: "border border-[#E9EAEB] rounded-lg divide-y divide-[#E9EAEB]",
4407
+ bordered: "border border-semantic-border-layout rounded-lg divide-y divide-semantic-border-layout",
4408
4408
  },
4409
4409
  },
4410
4410
  defaultVariants: {
@@ -4431,12 +4431,12 @@ const accordionItemVariants = cva("", {
4431
4431
  * Accordion trigger variants
4432
4432
  */
4433
4433
  const accordionTriggerVariants = cva(
4434
- "flex w-full items-center justify-between text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#343E55] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
4434
+ "flex w-full items-center justify-between text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-semantic-primary focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
4435
4435
  {
4436
4436
  variants: {
4437
4437
  variant: {
4438
4438
  default: "py-3",
4439
- bordered: "p-4 hover:bg-[#FAFAFA]",
4439
+ bordered: "p-4 hover:bg-[var(--color-neutral-50)]",
4440
4440
  },
4441
4441
  },
4442
4442
  defaultVariants: {
@@ -4674,7 +4674,7 @@ const AccordionTrigger = React.forwardRef<
4674
4674
  {showChevron && (
4675
4675
  <ChevronDown
4676
4676
  className={cn(
4677
- "h-4 w-4 shrink-0 text-[#717680] transition-transform duration-300",
4677
+ "h-4 w-4 shrink-0 text-semantic-text-muted transition-transform duration-300",
4678
4678
  isOpen && "rotate-180"
4679
4679
  )}
4680
4680
  />
@@ -4761,7 +4761,7 @@ import { Button } from "./button";
4761
4761
  * PageHeader variants for layout styles.
4762
4762
  */
4763
4763
  const pageHeaderVariants = cva(
4764
- "flex flex-col sm:flex-row sm:items-center w-full bg-white",
4764
+ "flex flex-col sm:flex-row sm:items-center w-full bg-semantic-bg-primary",
4765
4765
  {
4766
4766
  variants: {},
4767
4767
  defaultVariants: {},
@@ -4852,7 +4852,7 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
4852
4852
  <button
4853
4853
  type="button"
4854
4854
  onClick={onBackClick}
4855
- className="flex items-center justify-center w-10 h-10 rounded hover:bg-[#F5F5F5] transition-colors text-[#181D27]"
4855
+ className="flex items-center justify-center w-10 h-10 rounded hover:bg-semantic-bg-ui transition-colors text-semantic-text-primary"
4856
4856
  aria-label="Go back"
4857
4857
  >
4858
4858
  <ArrowLeft className="w-5 h-5" />
@@ -4861,7 +4861,7 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
4861
4861
  }
4862
4862
  if (icon) {
4863
4863
  return (
4864
- <div className="flex items-center justify-center w-10 h-10 [&_svg]:w-6 [&_svg]:h-6 text-[#717680]">
4864
+ <div className="flex items-center justify-center w-10 h-10 [&_svg]:w-6 [&_svg]:h-6 text-semantic-text-muted">
4865
4865
  {icon}
4866
4866
  </div>
4867
4867
  );
@@ -4993,10 +4993,10 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
4993
4993
  <div
4994
4994
  ref={ref}
4995
4995
  className={cn(
4996
- "flex w-full bg-white px-4",
4996
+ "flex w-full bg-semantic-bg-primary px-4",
4997
4997
  layoutClasses[layout],
4998
4998
  heightClasses[layout],
4999
- showBorder && "border-b border-[#E9EAEB]",
4999
+ showBorder && "border-b border-semantic-border-layout",
5000
5000
  className
5001
5001
  )}
5002
5002
  {...props}
@@ -5011,17 +5011,17 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
5011
5011
  {/* Content Section: Title + Description */}
5012
5012
  <div className="flex-1 min-w-0">
5013
5013
  <div className="flex items-center gap-2">
5014
- <h1 className="m-0 text-base font-semibold text-[#181D27] truncate">
5014
+ <h1 className="m-0 text-base font-semibold text-semantic-text-primary truncate">
5015
5015
  {title}
5016
5016
  </h1>
5017
5017
  {infoIcon && (
5018
- <span className="flex-shrink-0 [&_svg]:w-4 [&_svg]:h-4 text-[#717680]">
5018
+ <span className="flex-shrink-0 [&_svg]:w-4 [&_svg]:h-4 text-semantic-text-muted">
5019
5019
  {infoIcon}
5020
5020
  </span>
5021
5021
  )}
5022
5022
  </div>
5023
5023
  {description && (
5024
- <p className="m-0 text-sm text-[#181D27] font-normal mt-1 line-clamp-2">
5024
+ <p className="m-0 text-sm text-semantic-text-primary font-normal mt-1 line-clamp-2">
5025
5025
  {description}
5026
5026
  </p>
5027
5027
  )}
@@ -6201,30 +6201,10 @@ import path3 from "path";
6201
6201
  import prompts2 from "prompts";
6202
6202
  import ora2 from "ora";
6203
6203
  import { execSync } from "child_process";
6204
- var CSS_VARIABLES_V4 = `@import "tailwindcss";
6205
-
6206
- @theme {
6207
- --color-background: hsl(0 0% 100%);
6208
- --color-foreground: hsl(222.2 84% 4.9%);
6209
- --color-card: hsl(0 0% 100%);
6210
- --color-card-foreground: hsl(222.2 84% 4.9%);
6211
- --color-popover: hsl(0 0% 100%);
6212
- --color-popover-foreground: hsl(222.2 84% 4.9%);
6213
- --color-primary: hsl(222.2 47.4% 11.2%);
6214
- --color-primary-foreground: hsl(210 40% 98%);
6215
- --color-secondary: hsl(210 40% 96.1%);
6216
- --color-secondary-foreground: hsl(222.2 47.4% 11.2%);
6217
- --color-muted: hsl(210 40% 96.1%);
6218
- --color-muted-foreground: hsl(215.4 16.3% 46.9%);
6219
- --color-accent: hsl(210 40% 96.1%);
6220
- --color-accent-foreground: hsl(222.2 47.4% 11.2%);
6221
- --color-destructive: hsl(0 84.2% 60.2%);
6222
- --color-destructive-foreground: hsl(210 40% 98%);
6223
- --color-border: hsl(214.3 31.8% 91.4%);
6224
- --color-input: hsl(214.3 31.8% 91.4%);
6225
- --color-ring: hsl(222.2 84% 4.9%);
6226
- --radius: 0.5rem;
6227
- }
6204
+ var MYOPERATOR_THEME_CSS = `/* myOperator UI Theme - Design System Variables
6205
+ * Auto-generated by myoperator-ui CLI
6206
+ * Do not edit directly - run 'npx myoperator-ui init' to update
6207
+ */
6228
6208
 
6229
6209
  :root {
6230
6210
  /* =========================================================================
@@ -6459,253 +6439,46 @@ var CSS_VARIABLES_V4 = `@import "tailwindcss";
6459
6439
  --ring: 213 27% 84%;
6460
6440
  }
6461
6441
  `;
6442
+ var CSS_VARIABLES_V4 = `@import "tailwindcss";
6443
+ @import "./lib/myoperator-ui-theme.css";
6444
+
6445
+ @theme {
6446
+ --color-background: hsl(0 0% 100%);
6447
+ --color-foreground: hsl(222.2 84% 4.9%);
6448
+ --color-card: hsl(0 0% 100%);
6449
+ --color-card-foreground: hsl(222.2 84% 4.9%);
6450
+ --color-popover: hsl(0 0% 100%);
6451
+ --color-popover-foreground: hsl(222.2 84% 4.9%);
6452
+ --color-primary: hsl(222.2 47.4% 11.2%);
6453
+ --color-primary-foreground: hsl(210 40% 98%);
6454
+ --color-secondary: hsl(210 40% 96.1%);
6455
+ --color-secondary-foreground: hsl(222.2 47.4% 11.2%);
6456
+ --color-muted: hsl(210 40% 96.1%);
6457
+ --color-muted-foreground: hsl(215.4 16.3% 46.9%);
6458
+ --color-accent: hsl(210 40% 96.1%);
6459
+ --color-accent-foreground: hsl(222.2 47.4% 11.2%);
6460
+ --color-destructive: hsl(0 84.2% 60.2%);
6461
+ --color-destructive-foreground: hsl(210 40% 98%);
6462
+ --color-border: hsl(214.3 31.8% 91.4%);
6463
+ --color-input: hsl(214.3 31.8% 91.4%);
6464
+ --color-ring: hsl(222.2 84% 4.9%);
6465
+ --radius: 0.5rem;
6466
+ }
6467
+ `;
6462
6468
  var CSS_VARIABLES_V4_BOOTSTRAP = `/* myOperator UI - Tailwind CSS for Bootstrap projects */
6463
6469
  /* Selective imports to avoid Preflight conflicts with Bootstrap */
6464
6470
  @layer theme, base, components, utilities;
6465
6471
  @import "tailwindcss/theme.css" layer(theme);
6466
6472
  @import "tailwindcss/utilities.css" layer(utilities);
6473
+ @import "./lib/myoperator-ui-theme.css";
6467
6474
 
6468
6475
  /* Tell Tailwind to scan component files for utility classes */
6469
6476
  @source "./components/**/*.{js,ts,jsx,tsx}";
6470
6477
  @source "./lib/**/*.{js,ts,jsx,tsx}";
6471
-
6472
- :root {
6473
- /* =========================================================================
6474
- PRIMITIVE COLORS - CSS Custom Properties
6475
- ========================================================================= */
6476
-
6477
- /* Base */
6478
- --color-white: #FFFFFF;
6479
- --color-black: #000000;
6480
-
6481
- /* Neutral (Gray) */
6482
- --color-neutral-25: #FDFDFD;
6483
- --color-neutral-50: #FAFAFA;
6484
- --color-neutral-100: #F5F5F5;
6485
- --color-neutral-200: #E9EAEB;
6486
- --color-neutral-300: #D5D7DA;
6487
- --color-neutral-400: #A4A7AE;
6488
- --color-neutral-500: #717680;
6489
- --color-neutral-600: #535862;
6490
- --color-neutral-700: #414651;
6491
- --color-neutral-800: #252B37;
6492
- --color-neutral-900: #181D27;
6493
- --color-neutral-950: #0A0D12;
6494
-
6495
- /* Primary (Blue Gray) */
6496
- --color-primary-25: #F9FAFB;
6497
- --color-primary-50: #EBECEE;
6498
- --color-primary-100: #C0C3CA;
6499
- --color-primary-200: #A2A6B1;
6500
- --color-primary-300: #777E8D;
6501
- --color-primary-400: #5D6577;
6502
- --color-primary-500: #343E55;
6503
- --color-primary-600: #2F384D;
6504
- --color-primary-700: #252C3C;
6505
- --color-primary-800: #1D222F;
6506
- --color-primary-900: #161A24;
6507
- --color-primary-950: #0C0F12;
6508
-
6509
- /* Secondary (Turquoise) */
6510
- --color-secondary-25: #F6FCFD;
6511
- --color-secondary-50: #EAF8FA;
6512
- --color-secondary-100: #BDEAEF;
6513
- --color-secondary-200: #9DE0E7;
6514
- --color-secondary-300: #71D2DB;
6515
- --color-secondary-400: #55C9D5;
6516
- --color-secondary-500: #2BBCCA;
6517
- --color-secondary-600: #27ABB8;
6518
- --color-secondary-700: #1F858F;
6519
- --color-secondary-800: #18676F;
6520
- --color-secondary-900: #124F55;
6521
- --color-secondary-950: #0F3D3D;
6522
-
6523
- /* Error (Red) */
6524
- --color-error-25: #FFFBFA;
6525
- --color-error-50: #FEF3F2;
6526
- --color-error-100: #FEE4E2;
6527
- --color-error-200: #FECDCA;
6528
- --color-error-300: #FDA29B;
6529
- --color-error-400: #F97066;
6530
- --color-error-500: #F04438;
6531
- --color-error-600: #D92D20;
6532
- --color-error-700: #B42318;
6533
- --color-error-800: #912018;
6534
- --color-error-900: #7A271A;
6535
- --color-error-950: #55160C;
6536
-
6537
- /* Warning (Amber) */
6538
- --color-warning-25: #FFFCF5;
6539
- --color-warning-50: #FFFAEB;
6540
- --color-warning-100: #FEF0C7;
6541
- --color-warning-200: #FEDF89;
6542
- --color-warning-300: #FEC84B;
6543
- --color-warning-400: #FDB022;
6544
- --color-warning-500: #F79009;
6545
- --color-warning-600: #DC6803;
6546
- --color-warning-700: #B54708;
6547
- --color-warning-800: #93370D;
6548
- --color-warning-900: #7A2E0E;
6549
- --color-warning-950: #4E1D09;
6550
-
6551
- /* Success (Green) */
6552
- --color-success-25: #F6FEF9;
6553
- --color-success-50: #ECFDF3;
6554
- --color-success-100: #DCFAE6;
6555
- --color-success-200: #ABEFC6;
6556
- --color-success-300: #75E0A7;
6557
- --color-success-400: #47CD89;
6558
- --color-success-500: #17B26A;
6559
- --color-success-600: #079455;
6560
- --color-success-700: #067647;
6561
- --color-success-800: #085D3A;
6562
- --color-success-900: #074D31;
6563
- --color-success-950: #053321;
6564
-
6565
- /* Info (Blue) */
6566
- --color-info-25: #F6F8FD;
6567
- --color-info-50: #ECF1FB;
6568
- --color-info-100: #C4D4F2;
6569
- --color-info-200: #A8C0EC;
6570
- --color-info-300: #80A3E4;
6571
- --color-info-400: #6891DE;
6572
- --color-info-500: #4275D6;
6573
- --color-info-600: #3C6AC3;
6574
- --color-info-700: #2F5398;
6575
- --color-info-800: #244076;
6576
- --color-info-900: #1C315A;
6577
- --color-info-950: #182A44;
6578
-
6579
- /* =========================================================================
6580
- SEMANTIC COLORS - Purpose-driven tokens
6581
- ========================================================================= */
6582
-
6583
- /* Primary UI Colors */
6584
- --semantic-primary: var(--color-primary-500);
6585
- --semantic-primary-hover: var(--color-primary-600);
6586
- --semantic-primary-selected: var(--color-primary-300);
6587
- --semantic-primary-selected-hover: var(--color-primary-400);
6588
- --semantic-primary-highlighted: var(--color-primary-700);
6589
- --semantic-primary-surface: var(--color-primary-50);
6590
-
6591
- /* Brand Colors */
6592
- --semantic-brand: var(--color-secondary-500);
6593
- --semantic-brand-hover: var(--color-secondary-700);
6594
- --semantic-brand-selected: var(--color-secondary-300);
6595
- --semantic-brand-selected-hover: var(--color-secondary-600);
6596
- --semantic-brand-highlighted: var(--color-secondary-600);
6597
- --semantic-brand-surface: var(--color-secondary-50);
6598
-
6599
- /* Background Colors */
6600
- --semantic-bg-primary: var(--color-white);
6601
- --semantic-bg-secondary: var(--color-primary-950);
6602
- --semantic-bg-ui: var(--color-neutral-100);
6603
- --semantic-bg-grey: var(--color-neutral-200);
6604
- --semantic-bg-grey-hover: var(--color-neutral-400);
6605
- --semantic-bg-inverted: var(--color-black);
6606
- --semantic-bg-hover: var(--color-neutral-300);
6607
-
6608
- /* Text Colors */
6609
- --semantic-text-primary: var(--color-neutral-900);
6610
- --semantic-text-secondary: var(--color-primary-500);
6611
- --semantic-text-placeholder: var(--color-primary-200);
6612
- --semantic-text-link: var(--color-info-500);
6613
- --semantic-text-inverted: var(--color-white);
6614
- --semantic-text-muted: var(--color-neutral-500);
6615
-
6616
- /* Border Colors */
6617
- --semantic-border-primary: var(--color-primary-500);
6618
- --semantic-border-secondary: var(--color-primary-300);
6619
- --semantic-border-accent: var(--color-secondary-600);
6620
- --semantic-border-layout: var(--color-neutral-200);
6621
- --semantic-border-input: var(--color-neutral-200);
6622
- --semantic-border-input-focus: var(--color-secondary-500);
6623
-
6624
- /* Disabled State */
6625
- --semantic-disabled-primary: var(--color-primary-200);
6626
- --semantic-disabled-secondary: var(--color-primary-50);
6627
- --semantic-disabled-text: var(--color-neutral-500);
6628
- --semantic-disabled-border: var(--color-neutral-300);
6629
-
6630
- /* Error State */
6631
- --semantic-error-primary: var(--color-error-500);
6632
- --semantic-error-surface: var(--color-error-50);
6633
- --semantic-error-text: var(--color-error-700);
6634
- --semantic-error-border: var(--color-error-300);
6635
- --semantic-error-hover: var(--color-error-600);
6636
-
6637
- /* Warning State */
6638
- --semantic-warning-primary: var(--color-warning-500);
6639
- --semantic-warning-surface: var(--color-warning-50);
6640
- --semantic-warning-text: var(--color-warning-700);
6641
- --semantic-warning-border: var(--color-warning-300);
6642
- --semantic-warning-hover: var(--color-warning-600);
6643
-
6644
- /* Success State */
6645
- --semantic-success-primary: var(--color-success-500);
6646
- --semantic-success-surface: var(--color-success-50);
6647
- --semantic-success-text: var(--color-success-700);
6648
- --semantic-success-border: var(--color-success-300);
6649
- --semantic-success-hover: var(--color-success-600);
6650
-
6651
- /* Info State */
6652
- --semantic-info-primary: var(--color-info-500);
6653
- --semantic-info-surface: var(--color-info-50);
6654
- --semantic-info-text: var(--color-info-700);
6655
- --semantic-info-border: var(--color-info-200);
6656
- --semantic-info-hover: var(--color-info-600);
6657
-
6658
- /* =========================================================================
6659
- LEGACY SHADCN VARIABLES (for compatibility)
6660
- ========================================================================= */
6661
- --background: 0 0% 100%;
6662
- --foreground: 220 20% 12%;
6663
- --card: 0 0% 100%;
6664
- --card-foreground: 220 20% 12%;
6665
- --popover: 0 0% 100%;
6666
- --popover-foreground: 220 20% 12%;
6667
- --primary: 222 26% 27%;
6668
- --primary-foreground: 210 40% 98%;
6669
- --secondary: 183 64% 46%;
6670
- --secondary-foreground: 0 0% 100%;
6671
- --muted: 210 40% 96.1%;
6672
- --muted-foreground: 220 9% 46%;
6673
- --accent: 183 64% 46%;
6674
- --accent-foreground: 0 0% 100%;
6675
- --destructive: 4 89% 58%;
6676
- --destructive-foreground: 0 0% 100%;
6677
- --border: 220 13% 91%;
6678
- --input: 220 13% 91%;
6679
- --ring: 222 26% 27%;
6680
- --radius: 0.5rem;
6681
- }
6682
-
6683
- .dark {
6684
- --background: 222 47% 5%;
6685
- --foreground: 210 40% 98%;
6686
- --card: 222 47% 5%;
6687
- --card-foreground: 210 40% 98%;
6688
- --popover: 222 47% 5%;
6689
- --popover-foreground: 210 40% 98%;
6690
- --primary: 210 40% 98%;
6691
- --primary-foreground: 222 47% 11%;
6692
- --secondary: 217 33% 17.5%;
6693
- --secondary-foreground: 210 40% 98%;
6694
- --muted: 217 33% 17.5%;
6695
- --muted-foreground: 215 20% 65%;
6696
- --accent: 217 33% 17.5%;
6697
- --accent-foreground: 210 40% 98%;
6698
- --destructive: 0 63% 31%;
6699
- --destructive-foreground: 210 40% 98%;
6700
- --border: 217 33% 17.5%;
6701
- --input: 217 33% 17.5%;
6702
- --ring: 213 27% 84%;
6703
- }
6704
-
6705
- /* End myOperator UI imports */
6706
-
6707
6478
  `;
6708
- var CSS_VARIABLES_V3 = `@tailwind base;
6479
+ var CSS_VARIABLES_V3 = `@import "./lib/myoperator-ui-theme.css";
6480
+
6481
+ @tailwind base;
6709
6482
  @tailwind components;
6710
6483
  @tailwind utilities;
6711
6484
 
@@ -6719,242 +6492,6 @@ var CSS_VARIABLES_V3 = `@tailwind base;
6719
6492
  box-shadow: none;
6720
6493
  }
6721
6494
  }
6722
-
6723
- @layer base {
6724
- :root {
6725
- /* =========================================================================
6726
- PRIMITIVE COLORS - CSS Custom Properties
6727
- ========================================================================= */
6728
-
6729
- /* Base */
6730
- --color-white: #FFFFFF;
6731
- --color-black: #000000;
6732
-
6733
- /* Neutral (Gray) */
6734
- --color-neutral-25: #FDFDFD;
6735
- --color-neutral-50: #FAFAFA;
6736
- --color-neutral-100: #F5F5F5;
6737
- --color-neutral-200: #E9EAEB;
6738
- --color-neutral-300: #D5D7DA;
6739
- --color-neutral-400: #A4A7AE;
6740
- --color-neutral-500: #717680;
6741
- --color-neutral-600: #535862;
6742
- --color-neutral-700: #414651;
6743
- --color-neutral-800: #252B37;
6744
- --color-neutral-900: #181D27;
6745
- --color-neutral-950: #0A0D12;
6746
-
6747
- /* Primary (Blue Gray) */
6748
- --color-primary-25: #F9FAFB;
6749
- --color-primary-50: #EBECEE;
6750
- --color-primary-100: #C0C3CA;
6751
- --color-primary-200: #A2A6B1;
6752
- --color-primary-300: #777E8D;
6753
- --color-primary-400: #5D6577;
6754
- --color-primary-500: #343E55;
6755
- --color-primary-600: #2F384D;
6756
- --color-primary-700: #252C3C;
6757
- --color-primary-800: #1D222F;
6758
- --color-primary-900: #161A24;
6759
- --color-primary-950: #0C0F12;
6760
-
6761
- /* Secondary (Turquoise) */
6762
- --color-secondary-25: #F6FCFD;
6763
- --color-secondary-50: #EAF8FA;
6764
- --color-secondary-100: #BDEAEF;
6765
- --color-secondary-200: #9DE0E7;
6766
- --color-secondary-300: #71D2DB;
6767
- --color-secondary-400: #55C9D5;
6768
- --color-secondary-500: #2BBCCA;
6769
- --color-secondary-600: #27ABB8;
6770
- --color-secondary-700: #1F858F;
6771
- --color-secondary-800: #18676F;
6772
- --color-secondary-900: #124F55;
6773
- --color-secondary-950: #0F3D3D;
6774
-
6775
- /* Error (Red) */
6776
- --color-error-25: #FFFBFA;
6777
- --color-error-50: #FEF3F2;
6778
- --color-error-100: #FEE4E2;
6779
- --color-error-200: #FECDCA;
6780
- --color-error-300: #FDA29B;
6781
- --color-error-400: #F97066;
6782
- --color-error-500: #F04438;
6783
- --color-error-600: #D92D20;
6784
- --color-error-700: #B42318;
6785
- --color-error-800: #912018;
6786
- --color-error-900: #7A271A;
6787
- --color-error-950: #55160C;
6788
-
6789
- /* Warning (Amber) */
6790
- --color-warning-25: #FFFCF5;
6791
- --color-warning-50: #FFFAEB;
6792
- --color-warning-100: #FEF0C7;
6793
- --color-warning-200: #FEDF89;
6794
- --color-warning-300: #FEC84B;
6795
- --color-warning-400: #FDB022;
6796
- --color-warning-500: #F79009;
6797
- --color-warning-600: #DC6803;
6798
- --color-warning-700: #B54708;
6799
- --color-warning-800: #93370D;
6800
- --color-warning-900: #7A2E0E;
6801
- --color-warning-950: #4E1D09;
6802
-
6803
- /* Success (Green) */
6804
- --color-success-25: #F6FEF9;
6805
- --color-success-50: #ECFDF3;
6806
- --color-success-100: #DCFAE6;
6807
- --color-success-200: #ABEFC6;
6808
- --color-success-300: #75E0A7;
6809
- --color-success-400: #47CD89;
6810
- --color-success-500: #17B26A;
6811
- --color-success-600: #079455;
6812
- --color-success-700: #067647;
6813
- --color-success-800: #085D3A;
6814
- --color-success-900: #074D31;
6815
- --color-success-950: #053321;
6816
-
6817
- /* Info (Blue) */
6818
- --color-info-25: #F6F8FD;
6819
- --color-info-50: #ECF1FB;
6820
- --color-info-100: #C4D4F2;
6821
- --color-info-200: #A8C0EC;
6822
- --color-info-300: #80A3E4;
6823
- --color-info-400: #6891DE;
6824
- --color-info-500: #4275D6;
6825
- --color-info-600: #3C6AC3;
6826
- --color-info-700: #2F5398;
6827
- --color-info-800: #244076;
6828
- --color-info-900: #1C315A;
6829
- --color-info-950: #182A44;
6830
-
6831
- /* =========================================================================
6832
- SEMANTIC COLORS - Purpose-driven tokens
6833
- ========================================================================= */
6834
-
6835
- /* Primary UI Colors */
6836
- --semantic-primary: var(--color-primary-500);
6837
- --semantic-primary-hover: var(--color-primary-600);
6838
- --semantic-primary-selected: var(--color-primary-300);
6839
- --semantic-primary-selected-hover: var(--color-primary-400);
6840
- --semantic-primary-highlighted: var(--color-primary-700);
6841
- --semantic-primary-surface: var(--color-primary-50);
6842
-
6843
- /* Brand Colors */
6844
- --semantic-brand: var(--color-secondary-500);
6845
- --semantic-brand-hover: var(--color-secondary-700);
6846
- --semantic-brand-selected: var(--color-secondary-300);
6847
- --semantic-brand-selected-hover: var(--color-secondary-600);
6848
- --semantic-brand-highlighted: var(--color-secondary-600);
6849
- --semantic-brand-surface: var(--color-secondary-50);
6850
-
6851
- /* Background Colors */
6852
- --semantic-bg-primary: var(--color-white);
6853
- --semantic-bg-secondary: var(--color-primary-950);
6854
- --semantic-bg-ui: var(--color-neutral-100);
6855
- --semantic-bg-grey: var(--color-neutral-200);
6856
- --semantic-bg-grey-hover: var(--color-neutral-400);
6857
- --semantic-bg-inverted: var(--color-black);
6858
- --semantic-bg-hover: var(--color-neutral-300);
6859
-
6860
- /* Text Colors */
6861
- --semantic-text-primary: var(--color-neutral-900);
6862
- --semantic-text-secondary: var(--color-primary-500);
6863
- --semantic-text-placeholder: var(--color-primary-200);
6864
- --semantic-text-link: var(--color-info-500);
6865
- --semantic-text-inverted: var(--color-white);
6866
- --semantic-text-muted: var(--color-neutral-500);
6867
-
6868
- /* Border Colors */
6869
- --semantic-border-primary: var(--color-primary-500);
6870
- --semantic-border-secondary: var(--color-primary-300);
6871
- --semantic-border-accent: var(--color-secondary-600);
6872
- --semantic-border-layout: var(--color-neutral-200);
6873
- --semantic-border-input: var(--color-neutral-200);
6874
- --semantic-border-input-focus: var(--color-secondary-500);
6875
-
6876
- /* Disabled State */
6877
- --semantic-disabled-primary: var(--color-primary-200);
6878
- --semantic-disabled-secondary: var(--color-primary-50);
6879
- --semantic-disabled-text: var(--color-neutral-500);
6880
- --semantic-disabled-border: var(--color-neutral-300);
6881
-
6882
- /* Error State */
6883
- --semantic-error-primary: var(--color-error-500);
6884
- --semantic-error-surface: var(--color-error-50);
6885
- --semantic-error-text: var(--color-error-700);
6886
- --semantic-error-border: var(--color-error-300);
6887
- --semantic-error-hover: var(--color-error-600);
6888
-
6889
- /* Warning State */
6890
- --semantic-warning-primary: var(--color-warning-500);
6891
- --semantic-warning-surface: var(--color-warning-50);
6892
- --semantic-warning-text: var(--color-warning-700);
6893
- --semantic-warning-border: var(--color-warning-300);
6894
- --semantic-warning-hover: var(--color-warning-600);
6895
-
6896
- /* Success State */
6897
- --semantic-success-primary: var(--color-success-500);
6898
- --semantic-success-surface: var(--color-success-50);
6899
- --semantic-success-text: var(--color-success-700);
6900
- --semantic-success-border: var(--color-success-300);
6901
- --semantic-success-hover: var(--color-success-600);
6902
-
6903
- /* Info State */
6904
- --semantic-info-primary: var(--color-info-500);
6905
- --semantic-info-surface: var(--color-info-50);
6906
- --semantic-info-text: var(--color-info-700);
6907
- --semantic-info-border: var(--color-info-200);
6908
- --semantic-info-hover: var(--color-info-600);
6909
-
6910
- /* =========================================================================
6911
- LEGACY SHADCN VARIABLES (for compatibility)
6912
- ========================================================================= */
6913
- --background: 0 0% 100%;
6914
- --foreground: 220 20% 12%;
6915
- --card: 0 0% 100%;
6916
- --card-foreground: 220 20% 12%;
6917
- --popover: 0 0% 100%;
6918
- --popover-foreground: 220 20% 12%;
6919
- --primary: 222 26% 27%;
6920
- --primary-foreground: 210 40% 98%;
6921
- --secondary: 183 64% 46%;
6922
- --secondary-foreground: 0 0% 100%;
6923
- --muted: 210 40% 96.1%;
6924
- --muted-foreground: 220 9% 46%;
6925
- --accent: 183 64% 46%;
6926
- --accent-foreground: 0 0% 100%;
6927
- --destructive: 4 89% 58%;
6928
- --destructive-foreground: 0 0% 100%;
6929
- --border: 220 13% 91%;
6930
- --input: 220 13% 91%;
6931
- --ring: 222 26% 27%;
6932
- --radius: 0.5rem;
6933
- }
6934
-
6935
- .dark {
6936
- --background: 222 47% 5%;
6937
- --foreground: 210 40% 98%;
6938
- --card: 222 47% 5%;
6939
- --card-foreground: 210 40% 98%;
6940
- --popover: 222 47% 5%;
6941
- --popover-foreground: 210 40% 98%;
6942
- --primary: 210 40% 98%;
6943
- --primary-foreground: 222 47% 11%;
6944
- --secondary: 217 33% 17.5%;
6945
- --secondary-foreground: 210 40% 98%;
6946
- --muted: 217 33% 17.5%;
6947
- --muted-foreground: 215 20% 65%;
6948
- --accent: 217 33% 17.5%;
6949
- --accent-foreground: 210 40% 98%;
6950
- --destructive: 0 63% 31%;
6951
- --destructive-foreground: 210 40% 98%;
6952
- --border: 217 33% 17.5%;
6953
- --input: 217 33% 17.5%;
6954
- --ring: 213 27% 84%;
6955
- }
6956
- }
6957
-
6958
6495
  `;
6959
6496
  var getTailwindConfig = (prefix = "tw-", hasBootstrap = false) => `/** @type {import('tailwindcss').Config} */
6960
6497
  export default {
@@ -7312,6 +6849,19 @@ export function cn(...inputs: ClassValue[]) {
7312
6849
  }
7313
6850
  const componentsFullPath = path3.join(cwd, componentsPath);
7314
6851
  await fs3.ensureDir(componentsFullPath);
6852
+ const themeFilePath = path3.join(cwd, "src/lib/myoperator-ui-theme.css");
6853
+ let themeCreated = false;
6854
+ if (!await fs3.pathExists(themeFilePath)) {
6855
+ await fs3.ensureDir(path3.dirname(themeFilePath));
6856
+ await fs3.writeFile(themeFilePath, MYOPERATOR_THEME_CSS);
6857
+ themeCreated = true;
6858
+ } else {
6859
+ const existingTheme = await fs3.readFile(themeFilePath, "utf-8");
6860
+ if (!existingTheme.includes("--semantic-text-primary")) {
6861
+ await fs3.writeFile(themeFilePath, MYOPERATOR_THEME_CSS);
6862
+ themeCreated = true;
6863
+ }
6864
+ }
7315
6865
  const globalCssPath = path3.join(cwd, globalCss);
7316
6866
  let cssContent;
7317
6867
  if (tailwindVersion === "v4") {
@@ -7326,13 +6876,13 @@ export function cn(...inputs: ClassValue[]) {
7326
6876
  cssUpdated = true;
7327
6877
  } else {
7328
6878
  const existingCss = await fs3.readFile(globalCssPath, "utf-8");
7329
- const hasSemanticVariables = existingCss.includes("--semantic-text-primary");
7330
- if (!hasSemanticVariables) {
6879
+ const hasThemeImport = existingCss.includes("myoperator-ui-theme.css");
6880
+ if (!hasThemeImport) {
7331
6881
  spinner.stop();
7332
6882
  const result = await prompts2({
7333
6883
  type: "confirm",
7334
6884
  name: "updateCss",
7335
- message: `${globalCss} is missing semantic CSS variables. Update with full variable set?`,
6885
+ message: `${globalCss} is missing myOperator UI theme import. Update?`,
7336
6886
  initial: true
7337
6887
  });
7338
6888
  spinner.start("Initializing project...");
@@ -7453,8 +7003,11 @@ export function cn(...inputs: ClassValue[]) {
7453
7003
  console.log(chalk2.green(` \u2713 ${utilsPath} already has cn() function`));
7454
7004
  }
7455
7005
  console.log(chalk2.green(` \u2713 Created ${componentsPath}`));
7006
+ if (themeCreated) {
7007
+ console.log(chalk2.green(` \u2713 Created src/lib/myoperator-ui-theme.css (CSS variables)`));
7008
+ }
7456
7009
  if (cssUpdated) {
7457
- console.log(chalk2.green(` \u2713 Updated ${globalCss} with CSS variables`));
7010
+ console.log(chalk2.green(` \u2713 Updated ${globalCss} with theme import`));
7458
7011
  }
7459
7012
  if (tailwindUpdated) {
7460
7013
  console.log(chalk2.green(` \u2713 Updated ${tailwindConfig} with theme colors`));