@moderneinc/design-system-components 6.0.1-next.d0f7d0 → 6.1.0-alpha.034d53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { semanticColors, spacing, typography, borderRadius, shadows, colors, semanticColorsDark, semanticTypography } from '@moderneinc/design-system-tokens';
3
3
  import Box from '@mui/material/Box';
4
- import { styled, alpha } from '@mui/material/styles';
4
+ import { styled, useTheme, alpha } from '@mui/material/styles';
5
5
  import Chip, { chipClasses } from '@mui/material/Chip';
6
6
  import MuiAvatar from '@mui/material/Avatar';
7
7
  import SvgIcon from '@mui/material/SvgIcon';
@@ -9,7 +9,7 @@ import Alert, { alertClasses } from '@mui/material/Alert';
9
9
  import ButtonBase, { buttonBaseClasses } from '@mui/material/ButtonBase';
10
10
  import { BadgeInfo, WifiOff, TriangleAlert, CircleAlert, CircleCheckBig, X, ChevronRight, Square, SquareCheck, SquareMinus, Search, ChevronDown, Plus, Trash2, ArrowUp, ArrowDown, ChevronsUpDown, Columns3, ListFilter, HelpCircle, CalendarDays, Minus, ChevronLeft, AlertCircle, ChevronUp } from 'lucide-react';
11
11
  import IconButton, { iconButtonClasses } from '@mui/material/IconButton';
12
- import React, { useState, useRef, useCallback, useMemo, useEffect, createContext, useContext, useLayoutEffect, Children, isValidElement, cloneElement, forwardRef } from 'react';
12
+ import React, { useState, useRef, useCallback, useMemo, forwardRef, useEffect, createContext, useContext, useLayoutEffect, Children, isValidElement, cloneElement } from 'react';
13
13
  import Breadcrumbs, { breadcrumbsClasses } from '@mui/material/Breadcrumbs';
14
14
  import Link from '@mui/material/Link';
15
15
  import CircularProgress from '@mui/material/CircularProgress';
@@ -24,9 +24,11 @@ import Divider from '@mui/material/Divider';
24
24
  import InputAdornment, { inputAdornmentClasses } from '@mui/material/InputAdornment';
25
25
  import InputBase, { inputBaseClasses } from '@mui/material/InputBase';
26
26
  import TextField from '@mui/material/TextField';
27
+ import FormControl from '@mui/material/FormControl';
27
28
  import { formLabelClasses } from '@mui/material/FormLabel';
28
- import InputLabel, { inputLabelClasses } from '@mui/material/InputLabel';
29
+ import MuiInputLabel, { inputLabelClasses } from '@mui/material/InputLabel';
29
30
  import MuiSelect, { selectClasses } from '@mui/material/Select';
31
+ import { mergeSlotProps, useForkRef } from '@mui/material/utils';
30
32
  import MenuItem, { menuItemClasses } from '@mui/material/MenuItem';
31
33
  import Tooltip, { tooltipClasses } from '@mui/material/Tooltip';
32
34
  import { dayCalendarClasses } from '@mui/x-date-pickers/DateCalendar';
@@ -41,7 +43,6 @@ import { startOfDay, endOfDay, subDays, startOfMonth, subMonths, endOfMonth, sta
41
43
  import LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress';
42
44
  import Paper, { paperClasses } from '@mui/material/Paper';
43
45
  import Stack from '@mui/material/Stack';
44
- import FormControl from '@mui/material/FormControl';
45
46
  import FormHelperText, { formHelperTextClasses } from '@mui/material/FormHelperText';
46
47
  import ListItemButton, { listItemButtonClasses } from '@mui/material/ListItemButton';
47
48
  import ListItemIcon, { listItemIconClasses } from '@mui/material/ListItemIcon';
@@ -80,29 +81,35 @@ import { RichTreeViewPro } from '@mui/x-tree-view-pro/RichTreeViewPro';
80
81
  const MUI_INTERNAL_PROPS = ['ownerState', 'theme', 'sx', 'as'];
81
82
  const isMuiInternalProp = (prop) => MUI_INTERNAL_PROPS.includes(prop);
82
83
 
84
+ // semanticColors.status.<name> feeds `palette` below, read with
85
+ // .light/.dark/.transparent, so the phase-2 token restructure's codemod
86
+ // (driven from literal TOKEN_MAP paths) cannot reach either — fixed by hand,
87
+ // mirroring ModStatusCell/Dot. See
88
+ // docs/superpowers/plans/2026-08-05-semantic-restructure.md
89
+ // "Dynamic access — the codemod cannot see these".
83
90
  const STATUS_COLOR_CLASSES = [
84
- [chipClasses.colorDefault, semanticColors.status.neutral],
85
- [chipClasses.colorError, semanticColors.status.error],
86
- [chipClasses.colorWarning, semanticColors.status.warning],
87
- [chipClasses.colorSuccess, semanticColors.status.success],
88
- [chipClasses.colorInfo, semanticColors.status.info],
91
+ [chipClasses.colorDefault, semanticColors.color.status.neutral],
92
+ [chipClasses.colorError, semanticColors.color.status.error],
93
+ [chipClasses.colorWarning, semanticColors.color.status.warning],
94
+ [chipClasses.colorSuccess, semanticColors.color.status.success],
95
+ [chipClasses.colorInfo, semanticColors.color.status.info],
89
96
  ];
90
97
  const outlinedColorOverrides = {
91
98
  backgroundColor: 'transparent',
92
- color: semanticColors.typography.bodySecondary,
93
- border: `1px solid ${semanticColors.border.secondary}`,
99
+ color: semanticColors.color.text.secondary,
100
+ border: `1px solid ${semanticColors.color.border.primary}`,
94
101
  [`& .${chipClasses.icon}, & .${chipClasses.deleteIcon}`]: {
95
- color: semanticColors.typography.bodySecondary,
102
+ color: semanticColors.color.text.secondary,
96
103
  },
97
104
  };
98
105
  const filledColorRules = Object.fromEntries(STATUS_COLOR_CLASSES.map(([className, palette]) => [
99
106
  `&.${className}`,
100
107
  {
101
- backgroundColor: palette.light,
102
- color: palette.dark,
103
- border: `1px solid ${palette.transparent}`,
108
+ backgroundColor: palette.bg,
109
+ color: palette.fg,
110
+ border: `1px solid ${palette.tint}`,
104
111
  [`& .${chipClasses.icon}, & .${chipClasses.deleteIcon}`]: {
105
- color: palette.dark,
112
+ color: palette.fg,
106
113
  },
107
114
  },
108
115
  ]));
@@ -176,7 +183,7 @@ const avatarIndexFromSeed = (seed) => seed ? ((djb2Hash(seed) % 7) + 1) : undefi
176
183
  * Produces a double-ring effect: a white inner gap (via outline-offset) and a colored outer ring.
177
184
  */
178
185
  const focusRingStyles = {
179
- outline: `2px solid ${semanticColors.border.focus}`,
186
+ outline: `2px solid ${semanticColors.color.border.focus}`,
180
187
  outlineOffset: '2px',
181
188
  };
182
189
 
@@ -184,9 +191,14 @@ const sizeConfig$1 = {
184
191
  small: { size: spacing.spacing_2_1_2, fontSize: typography.fontSize.xs },
185
192
  medium: { size: spacing.spacing_4, fontSize: typography.fontSize.xs },
186
193
  };
194
+ // semanticColors.avatar.initials[...] is a computed member access, so the
195
+ // phase-2 token restructure's codemod (driven from literal TOKEN_MAP paths)
196
+ // cannot reach it — fixed by hand, mirroring ModStatusCell/Dot. See
197
+ // docs/superpowers/plans/2026-08-05-semantic-restructure.md
198
+ // "Dynamic access — the codemod cannot see these".
187
199
  const indexedColors = (colorIndex) => ({
188
- color: semanticColors.avatar.initials[`text${colorIndex}`],
189
- backgroundColor: semanticColors.avatar.initials[`background${colorIndex}`],
200
+ color: semanticColors.avatar.initials[`fg${colorIndex}`],
201
+ backgroundColor: semanticColors.avatar.initials[`bg${colorIndex}`],
190
202
  borderColor: semanticColors.avatar.initials[`border${colorIndex}`],
191
203
  });
192
204
  const StyledAvatar = styled(MuiAvatar, {
@@ -201,13 +213,13 @@ const StyledAvatar = styled(MuiAvatar, {
201
213
  fontFamily: typography.fontFamily.body,
202
214
  fontWeight: typography.fontWeight.regular,
203
215
  lineHeight: 1,
204
- color: semanticColors.avatar.userDefaultText,
205
- backgroundColor: semanticColors.avatar.userDefaultBg,
206
- border: `1px solid ${semanticColors.border.primary}`,
216
+ color: semanticColors.avatar.user.fg,
217
+ backgroundColor: semanticColors.avatar.user.bg,
218
+ border: `1px solid ${semanticColors.color.border.primary}`,
207
219
  ...(avatarColorIndex && indexedColors(avatarColorIndex)),
208
220
  '&:focus-visible': {
209
221
  ...focusRingStyles,
210
- borderColor: semanticColors.border.focus,
222
+ borderColor: semanticColors.color.border.focus,
211
223
  },
212
224
  };
213
225
  });
@@ -322,7 +334,7 @@ const HeaderContainer = styled(Box)(({ size }) => {
322
334
  return {
323
335
  width: '34px',
324
336
  height: `${modRowHeights[size]}px`,
325
- borderBottom: `1px solid ${semanticColors.border.secondary}`,
337
+ borderBottom: `1px solid ${semanticColors.color.border.primary}`,
326
338
  boxSizing: 'border-box',
327
339
  display: 'flex',
328
340
  alignItems: 'center',
@@ -430,7 +442,7 @@ const ModActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
430
442
  if (scene === ActivityScene.BLANK) {
431
443
  return null;
432
444
  }
433
- const color = event !== 'none' ? ACTIVITY_COLORS[event] : semanticColors.border.secondary;
445
+ const color = event !== 'none' ? ACTIVITY_COLORS[event] : semanticColors.color.border.primary;
434
446
  // Use secondary color for paths if specified, otherwise use primary color
435
447
  const pathColor = secondaryEvent && secondaryEvent !== 'none' ? ACTIVITY_COLORS[secondaryEvent] : color;
436
448
  switch (scene) {
@@ -458,12 +470,18 @@ const ModActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
458
470
  ModActivityIndicatorCell.displayName = 'ModActivityIndicatorCell';
459
471
 
460
472
  const neutralSmallShadow = `${shadows.neutral.small.x}px ${shadows.neutral.small.y}px ${shadows.neutral.small.blur}px ${shadows.neutral.small.spread}px ${shadows.neutral.small.shadow}`;
473
+ // semanticColors.status[intent] is read dynamically below, so the phase-2
474
+ // token restructure's codemod (driven from literal TOKEN_MAP paths) cannot
475
+ // reach these group references or the .default/.dark/.light/.transparent
476
+ // reads on `palette` — fixed by hand, mirroring ModStatusCell/Dot. See
477
+ // docs/superpowers/plans/2026-08-05-semantic-restructure.md
478
+ // "Dynamic access — the codemod cannot see these".
461
479
  const intentColors$1 = {
462
- success: semanticColors.status.success,
463
- error: semanticColors.status.error,
464
- warning: semanticColors.status.warning,
465
- offline: semanticColors.status.neutral,
466
- info: semanticColors.status.info,
480
+ success: semanticColors.color.status.success,
481
+ error: semanticColors.color.status.error,
482
+ warning: semanticColors.color.status.warning,
483
+ offline: semanticColors.color.status.neutral,
484
+ info: semanticColors.color.status.info,
467
485
  };
468
486
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
469
487
  const StyledAlert$2 = styled(Alert, {
@@ -472,10 +490,10 @@ const StyledAlert$2 = styled(Alert, {
472
490
  const palette = intentColors$1[intent];
473
491
  const isFilled = alertType === 'filled';
474
492
  const isCompact = alertSize === 'compact';
475
- const iconColor = isFilled ? semanticColors.typography.tooltip.default : palette.default;
493
+ const iconColor = isFilled ? semanticColors.color.text.tooltip : palette.solid;
476
494
  const messageColor = isFilled
477
- ? semanticColors.typography.tooltip.default
478
- : semanticColors.typography.body;
495
+ ? semanticColors.color.text.tooltip
496
+ : semanticColors.color.text.primary;
479
497
  return {
480
498
  ...(isCompact
481
499
  ? { minHeight: spacing.spacing_5 }
@@ -492,9 +510,9 @@ const StyledAlert$2 = styled(Alert, {
492
510
  padding: hasChildren
493
511
  ? `${spacing.spacing_1_1_2}px ${spacing.spacing_2}px`
494
512
  : `0 ${spacing.spacing_2}px`,
495
- backgroundColor: isFilled ? palette.dark : palette.light,
496
- border: isFilled ? 'none' : `1px solid ${palette.transparent}`,
497
- color: isFilled ? semanticColors.typography.tooltip.default : semanticColors.typography.body,
513
+ backgroundColor: isFilled ? palette.fg : palette.bg,
514
+ border: isFilled ? 'none' : `1px solid ${palette.tint}`,
515
+ color: isFilled ? semanticColors.color.text.tooltip : semanticColors.color.text.primary,
498
516
  boxShadow: isFilled ? neutralSmallShadow : undefined,
499
517
  [`& .${alertClasses.icon}`]: {
500
518
  color: iconColor,
@@ -512,9 +530,7 @@ const StyledAlert$2 = styled(Alert, {
512
530
  '& span:last-child': {
513
531
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
514
532
  fontWeight: typography.fontWeight.medium,
515
- color: isFilled
516
- ? semanticColors.typography.tooltip.default
517
- : semanticColors.typography.bodySecondary,
533
+ color: isFilled ? semanticColors.color.text.tooltip : semanticColors.color.text.secondary,
518
534
  lineHeight: 1.4,
519
535
  },
520
536
  },
@@ -522,7 +538,7 @@ const StyledAlert$2 = styled(Alert, {
522
538
  padding: 0,
523
539
  marginRight: 0,
524
540
  ...(isFilled && {
525
- color: semanticColors.typography.tooltip.default,
541
+ color: semanticColors.color.text.tooltip,
526
542
  [`& .${buttonBaseClasses.root}`]: { color: 'inherit' },
527
543
  }),
528
544
  },
@@ -544,12 +560,18 @@ const ModAlert = ({ intent = 'success', type = 'outlined', size = 'default', tit
544
560
  };
545
561
  ModAlert.displayName = 'ModAlert';
546
562
 
563
+ // semanticColors.status[intent] is read dynamically below, so the phase-2
564
+ // token restructure's codemod (driven from literal TOKEN_MAP paths) cannot
565
+ // reach these group references or the .default/.dark/.light reads on
566
+ // `palette` — fixed by hand, mirroring ModStatusCell/Dot. See
567
+ // docs/superpowers/plans/2026-08-05-semantic-restructure.md
568
+ // "Dynamic access — the codemod cannot see these".
547
569
  const intentColors = {
548
- info: semanticColors.status.info,
549
- success: semanticColors.status.success,
550
- error: semanticColors.status.error,
551
- warning: semanticColors.status.warning,
552
- neutral: semanticColors.status.neutral,
570
+ info: semanticColors.color.status.info,
571
+ success: semanticColors.color.status.success,
572
+ error: semanticColors.color.status.error,
573
+ warning: semanticColors.color.status.warning,
574
+ neutral: semanticColors.color.status.neutral,
553
575
  };
554
576
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
555
577
  const StyledAlert$1 = styled(Alert, {
@@ -558,12 +580,12 @@ const StyledAlert$1 = styled(Alert, {
558
580
  const palette = intentColors[intent];
559
581
  const typeStyles = bannerType === 'filled'
560
582
  ? {
561
- backgroundColor: palette.dark,
562
- color: semanticColors.surfaces.white,
583
+ backgroundColor: palette.fg,
584
+ color: semanticColors.color.surface.raised,
563
585
  }
564
586
  : {
565
- backgroundColor: palette.light,
566
- color: semanticColors.typography.body,
587
+ backgroundColor: palette.bg,
588
+ color: semanticColors.color.text.primary,
567
589
  };
568
590
  return {
569
591
  width: '100%',
@@ -612,8 +634,8 @@ const LinkText = styled('span')(({ bannerType = 'outlined' }) => ({
612
634
  marginLeft: 'auto',
613
635
  fontWeight: typography.fontWeight.semiBold,
614
636
  color: bannerType === 'filled'
615
- ? semanticColors.typography.link.white
616
- : semanticColors.typography.link.primary,
637
+ ? semanticColors.color.text.linkOnBrand
638
+ : semanticColors.color.text.link,
617
639
  cursor: 'pointer',
618
640
  whiteSpace: 'nowrap',
619
641
  '&:hover': {
@@ -640,7 +662,7 @@ const ModBanner = ({ intent = 'info', type = 'outlined', message, messagePositio
640
662
  if (dismissed) {
641
663
  return null;
642
664
  }
643
- const closeIconColor = type === 'filled' ? semanticColors.surfaces.white : intentColors[intent].default;
665
+ const closeIconColor = type === 'filled' ? semanticColors.color.surface.raised : intentColors[intent].solid;
644
666
  return (jsx(StyledAlert$1, { ...props, intent: intent, bannerType: type, messagePosition: messagePosition, icon: messagePosition === 'left' ? icon || false : false, action: showClose ? (jsx(StyledIconButton, { size: "small", onClick: handleClose, closeIconColor: closeIconColor, children: jsx(X, { size: 16 }) })) : undefined, children: messagePosition === 'center' ? (jsxs(Fragment, { children: [icon, jsx("span", { children: message }), linkText && (jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) : (jsxs(Fragment, { children: [jsx("span", { children: message }), linkText && (jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) }));
645
667
  };
646
668
  ModBanner.displayName = 'ModBanner';
@@ -648,7 +670,7 @@ ModBanner.displayName = 'ModBanner';
648
670
  const StyledBreadcrumbs = styled(Breadcrumbs)(() => ({
649
671
  [`& .${breadcrumbsClasses.separator}`]: {
650
672
  margin: 0,
651
- color: semanticColors.icons.utility,
673
+ color: semanticColors.color.icon.utility,
652
674
  },
653
675
  [`& .${breadcrumbsClasses.ol}`]: {
654
676
  gap: spacing.spacing_1,
@@ -661,15 +683,15 @@ const StyledBreadcrumbLink = styled(Link, {
661
683
  fontWeight: typography.fontWeight.medium,
662
684
  lineHeight: 1,
663
685
  textDecoration: 'none',
664
- color: current ? semanticColors.typography.bodySecondary : semanticColors.typography.link.primary,
686
+ color: current ? semanticColors.color.text.secondary : semanticColors.color.text.link,
665
687
  cursor: current ? 'default' : 'pointer',
666
688
  borderRadius: borderRadius.xS,
667
689
  transition: 'color 0.2s ease-in-out',
668
690
  '&:hover': {
669
- color: current ? semanticColors.icons.hover : semanticColors.buttons.tertiary.hover,
691
+ color: current ? semanticColors.color.icon.hover : semanticColors.button.tertiary.fgHover,
670
692
  },
671
693
  '&:focus-visible': {
672
- outline: `2px solid ${semanticColors.border.focus}`,
694
+ outline: `2px solid ${semanticColors.color.border.focus}`,
673
695
  outlineOffset: 2,
674
696
  },
675
697
  }));
@@ -707,7 +729,7 @@ function ModBreadcrumbLink({ current = false, children, component, ...props }) {
707
729
  * ```
708
730
  */
709
731
  function ModBreadcrumbs({ children, className }) {
710
- return (jsx(StyledBreadcrumbs, { separator: jsx(ChevronRight, { size: 10.67, color: semanticColors.icons.utility }), className: className, "aria-label": "breadcrumb", children: children }));
732
+ return (jsx(StyledBreadcrumbs, { separator: jsx(ChevronRight, { size: 10.67, color: semanticColors.color.icon.utility }), className: className, "aria-label": "breadcrumb", children: children }));
711
733
  }
712
734
 
713
735
  // Props that should not be forwarded to ButtonBase (Button-specific props that ButtonBase doesn't support)
@@ -759,90 +781,90 @@ const StyledButtonBase$1 = styled(ButtonBase, {
759
781
  },
760
782
  // Focus visible for keyboard navigation
761
783
  [`&.${buttonBaseClasses.focusVisible}`]: {
762
- outline: `2px solid ${semanticColors.border.focus}`,
784
+ outline: `2px solid ${semanticColors.color.border.focus}`,
763
785
  outlineOffset: 2,
764
786
  },
765
787
  };
766
788
  // Variant-specific styles
767
789
  const variantStyles = {
768
790
  primary: {
769
- backgroundColor: semanticColors.buttons.primary.default,
770
- color: semanticColors.surfaces.white,
791
+ backgroundColor: semanticColors.button.primary.bg,
792
+ color: semanticColors.color.surface.raised,
771
793
  border: 'none',
772
794
  '&:hover': {
773
- backgroundColor: semanticColors.buttons.primary.hover,
795
+ backgroundColor: semanticColors.button.primary.bgHover,
774
796
  },
775
797
  '&:active': {
776
- backgroundColor: semanticColors.buttons.primary.pressed,
798
+ backgroundColor: semanticColors.button.primary.bgPressed,
777
799
  },
778
800
  ...(loading
779
801
  ? {}
780
802
  : {
781
803
  [`&.${buttonBaseClasses.disabled}`]: {
782
- backgroundColor: semanticColors.buttons.primary.disabled,
783
- color: semanticColors.typography.button.disabled,
804
+ backgroundColor: semanticColors.button.primary.bgDisabled,
805
+ color: semanticColors.button.fgDisabled,
784
806
  },
785
807
  }),
786
808
  },
787
809
  secondary: {
788
- backgroundColor: semanticColors.buttons.secondary.defaultBackground,
789
- color: semanticColors.buttons.secondary.default,
790
- border: `1px solid ${semanticColors.buttons.secondary.defaultBorder}`,
810
+ backgroundColor: semanticColors.button.secondary.bg,
811
+ color: semanticColors.button.secondary.fg,
812
+ border: `1px solid ${semanticColors.button.secondary.border}`,
791
813
  '&:hover': {
792
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
814
+ backgroundColor: semanticColors.button.secondary.bgHover,
793
815
  },
794
816
  '&:active': {
795
- backgroundColor: semanticColors.buttons.secondary.pressedBackground,
817
+ backgroundColor: semanticColors.button.secondary.bgPressed,
796
818
  },
797
819
  ...(loading
798
820
  ? {}
799
821
  : {
800
822
  [`&.${buttonBaseClasses.disabled}`]: {
801
- backgroundColor: semanticColors.buttons.secondary.disabledBackground,
802
- borderColor: semanticColors.border.secondary,
803
- color: semanticColors.typography.button.disabled,
823
+ backgroundColor: semanticColors.button.secondary.bgDisabled,
824
+ borderColor: semanticColors.color.border.primary,
825
+ color: semanticColors.button.fgDisabled,
804
826
  },
805
827
  }),
806
828
  },
807
829
  destructive: {
808
- backgroundColor: semanticColors.buttons.destructive,
809
- color: semanticColors.surfaces.white,
830
+ backgroundColor: semanticColors.button.destructive.bg,
831
+ color: semanticColors.color.surface.raised,
810
832
  border: 'none',
811
833
  '&:hover': {
812
- backgroundColor: semanticColors.status.error.dark,
834
+ backgroundColor: semanticColors.color.status.error.fg,
813
835
  },
814
836
  '&:active': {
815
- backgroundColor: semanticColors.status.error.dark,
837
+ backgroundColor: semanticColors.color.status.error.fg,
816
838
  filter: 'brightness(0.9)',
817
839
  },
818
840
  ...(loading
819
841
  ? {}
820
842
  : {
821
843
  [`&.${buttonBaseClasses.disabled}`]: {
822
- backgroundColor: semanticColors.buttons.primary.disabled,
823
- color: semanticColors.typography.button.disabled,
844
+ backgroundColor: semanticColors.button.primary.bgDisabled,
845
+ color: semanticColors.button.fgDisabled,
824
846
  },
825
847
  }),
826
848
  },
827
849
  tertiary: {
828
850
  backgroundColor: 'transparent',
829
- color: semanticColors.typography.input.default,
851
+ color: semanticColors.color.text.input,
830
852
  border: 'none',
831
853
  padding: 0,
832
854
  lineHeight: 1,
833
855
  '&:hover': {
834
856
  backgroundColor: 'transparent',
835
- color: semanticColors.buttons.tertiary.hover,
857
+ color: semanticColors.button.tertiary.fgHover,
836
858
  },
837
859
  '&:active': {
838
- color: semanticColors.buttons.tertiary.pressed,
860
+ color: semanticColors.button.tertiary.fgPressed,
839
861
  },
840
862
  ...(loading
841
863
  ? {}
842
864
  : {
843
865
  [`&.${buttonBaseClasses.disabled}`]: {
844
866
  backgroundColor: 'transparent',
845
- color: semanticColors.buttons.tertiary.disabled,
867
+ color: semanticColors.button.tertiary.fgDisabled,
846
868
  },
847
869
  }),
848
870
  },
@@ -857,10 +879,10 @@ const LoadingSpinner = styled(CircularProgress, {
857
879
  })(({ $variant }) => {
858
880
  // Use appropriate spinner color for each variant to ensure visibility
859
881
  const spinnerColors = {
860
- primary: semanticColors.surfaces.white,
861
- secondary: semanticColors.buttons.primary.default,
862
- destructive: semanticColors.surfaces.white,
863
- tertiary: semanticColors.buttons.tertiary.default,
882
+ primary: semanticColors.color.surface.raised,
883
+ secondary: semanticColors.button.primary.bg,
884
+ destructive: semanticColors.color.surface.raised,
885
+ tertiary: semanticColors.button.tertiary.fg,
864
886
  };
865
887
  return {
866
888
  color: spinnerColors[$variant],
@@ -878,7 +900,7 @@ const StyledButtonTab = styled(MuiToggleButton)(({ theme }) => ({
878
900
  fontFamily: typography.fontFamily.body,
879
901
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
880
902
  lineHeight: 1,
881
- color: semanticColors.typography.tab.inactive,
903
+ color: semanticColors.color.text.tabInactive,
882
904
  backgroundColor: 'transparent',
883
905
  border: 'none',
884
906
  padding: `${spacing.spacing_1}px ${spacing.spacing_1_1_2}px`,
@@ -888,15 +910,15 @@ const StyledButtonTab = styled(MuiToggleButton)(({ theme }) => ({
888
910
  duration: theme.transitions.duration.short,
889
911
  }),
890
912
  '&:hover': {
891
- color: semanticColors.typography.tab.active,
913
+ color: semanticColors.color.text.tabActive,
892
914
  },
893
915
  '&.Mui-focusVisible': {
894
- outline: `2px solid ${semanticColors.border.focus}`,
916
+ outline: `2px solid ${semanticColors.color.border.focus}`,
895
917
  outlineOffset: -2,
896
918
  borderRadius: borderRadius.xXS,
897
919
  },
898
920
  '&.Mui-disabled': {
899
- color: semanticColors.typography.button.disabled,
921
+ color: semanticColors.button.fgDisabled,
900
922
  cursor: 'default',
901
923
  pointerEvents: 'none',
902
924
  },
@@ -958,7 +980,7 @@ const StyledButtonTabGroup = styled(MuiToggleButtonGroup)(({ theme, size = 'medi
958
980
  };
959
981
  return {
960
982
  borderRadius: borderRadius.button,
961
- border: `1px solid ${semanticColors.border.primary}`,
983
+ border: `1px solid ${semanticColors.color.border.primary}`,
962
984
  overflow: 'hidden',
963
985
  // Style all grouped children
964
986
  [`& .${toggleButtonGroupClasses.grouped}`]: {
@@ -971,26 +993,26 @@ const StyledButtonTabGroup = styled(MuiToggleButtonGroup)(({ theme, size = 'medi
971
993
  lineHeight: 1,
972
994
  textTransform: 'none',
973
995
  border: 'none',
974
- borderRight: `1px solid ${semanticColors.border.primary}`,
996
+ borderRight: `1px solid ${semanticColors.color.border.primary}`,
975
997
  borderRadius: 0,
976
- color: semanticColors.typography.tab.inactive,
977
- backgroundColor: semanticColors.buttons.secondary.disabledBackground,
998
+ color: semanticColors.color.text.tabInactive,
999
+ backgroundColor: semanticColors.button.secondary.bgDisabled,
978
1000
  transition: theme.transitions.create(['background-color', 'color', 'border-color'], {
979
1001
  duration: theme.transitions.duration.short,
980
1002
  }),
981
1003
  // Selected state — double selector for specificity over MUI ToggleButton defaults
982
1004
  [`&.${toggleButtonClasses.selected}.${toggleButtonClasses.selected}`]: {
983
- backgroundColor: semanticColors.surfaces.white,
984
- color: semanticColors.buttons.tertiary.default,
1005
+ backgroundColor: semanticColors.color.surface.raised,
1006
+ color: semanticColors.button.tertiary.fg,
985
1007
  fontWeight: typography.fontWeight.semiBold,
986
1008
  },
987
1009
  // Hover state
988
1010
  [`&:hover, &.${toggleButtonClasses.selected}:hover`]: {
989
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
1011
+ backgroundColor: semanticColors.button.secondary.bgHover,
990
1012
  },
991
1013
  // Focus visible for keyboard navigation
992
1014
  '&.Mui-focusVisible': {
993
- outline: `2px solid ${semanticColors.border.focus}`,
1015
+ outline: `2px solid ${semanticColors.color.border.focus}`,
994
1016
  outlineOffset: -2,
995
1017
  zIndex: 1,
996
1018
  },
@@ -1007,8 +1029,8 @@ const StyledButtonTabGroup = styled(MuiToggleButtonGroup)(({ theme, size = 'medi
1007
1029
  },
1008
1030
  // Disabled state
1009
1031
  [`&.${toggleButtonClasses.disabled}`]: {
1010
- backgroundColor: semanticColors.buttons.secondary.disabledBackground,
1011
- color: semanticColors.typography.button.disabled,
1032
+ backgroundColor: semanticColors.button.secondary.bgDisabled,
1033
+ color: semanticColors.button.fgDisabled,
1012
1034
  cursor: 'not-allowed',
1013
1035
  pointerEvents: 'auto',
1014
1036
  },
@@ -1053,18 +1075,18 @@ const SmallStyledCard = styled(MuiCard, {
1053
1075
  display: 'flex',
1054
1076
  flexDirection: 'column',
1055
1077
  gap: spacing.spacing_2, // 16px
1056
- backgroundColor: semanticColors.surfaces.card,
1057
- border: `1px solid ${selected ? semanticColors.buttons.primary.default : semanticColors.border.primary}`,
1078
+ backgroundColor: semanticColors.color.surface.raised,
1079
+ border: `1px solid ${selected ? semanticColors.button.primary.bg : semanticColors.color.border.primary}`,
1058
1080
  borderRadius: borderRadius.card,
1059
1081
  boxShadow: selected ? activeShadow : 'none',
1060
1082
  transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
1061
1083
  cursor: 'pointer',
1062
1084
  '&:hover': {
1063
- borderColor: semanticColors.buttons.primary.default,
1085
+ borderColor: semanticColors.button.primary.bg,
1064
1086
  boxShadow: activeShadow,
1065
1087
  },
1066
1088
  '&:focus-visible': {
1067
- borderColor: semanticColors.buttons.primary.default,
1089
+ borderColor: semanticColors.button.primary.bg,
1068
1090
  ...focusRingStyles,
1069
1091
  },
1070
1092
  ...(disabled && {
@@ -1089,7 +1111,7 @@ const SmallRecipeCount = styled('p')(({ theme }) => ({
1089
1111
  fontSize: theme.typography.pxToRem(typography.fontSize.xxs), // 10px
1090
1112
  fontWeight: typography.fontWeight.semiBold, // 600
1091
1113
  lineHeight: 1.2,
1092
- color: semanticColors.typography.body,
1114
+ color: semanticColors.color.text.primary,
1093
1115
  whiteSpace: 'nowrap',
1094
1116
  }));
1095
1117
  const SmallCardContent = styled('div')(() => ({
@@ -1103,7 +1125,7 @@ const SmallTitle = styled('p')(({ theme }) => ({
1103
1125
  fontSize: theme.typography.pxToRem(typography.fontSize.h6), // 16px
1104
1126
  fontWeight: typography.fontWeight.semiBold, // 600
1105
1127
  lineHeight: 1.4,
1106
- color: semanticColors.typography.body,
1128
+ color: semanticColors.color.text.primary,
1107
1129
  width: '100%',
1108
1130
  }));
1109
1131
  const SmallDescription = styled('p')(({ theme }) => ({
@@ -1111,7 +1133,7 @@ const SmallDescription = styled('p')(({ theme }) => ({
1111
1133
  fontSize: theme.typography.pxToRem(typography.fontSize.xs), // 12px
1112
1134
  fontWeight: typography.fontWeight.regular, // 400
1113
1135
  lineHeight: 1.5,
1114
- color: semanticColors.typography.body,
1136
+ color: semanticColors.color.text.primary,
1115
1137
  width: '100%',
1116
1138
  display: '-webkit-box',
1117
1139
  WebkitLineClamp: 2,
@@ -1128,12 +1150,10 @@ const LargeStyledCard = styled(MuiCard, {
1128
1150
  // sourcing one side from `semanticColors` (which flips) and the other from a
1129
1151
  // primitive (which doesn't) puts light-mode text on a dark surface in dark
1130
1152
  // mode. `semanticColorsDark` is the literal-hex escape hatch for exactly this.
1131
- const activeBorderColor = isLight
1132
- ? semanticColors.buttons.primary.default
1133
- : colors.digitalGreen[300];
1153
+ const activeBorderColor = isLight ? semanticColors.button.primary.bg : colors.digitalGreen[300];
1134
1154
  const defaultBorderColor = isLight
1135
- ? semanticColors.border.primary
1136
- : semanticColorsDark.border.primary;
1155
+ ? semanticColors.color.border.primary
1156
+ : semanticColorsDark.color.border.primary;
1137
1157
  return {
1138
1158
  width: 340,
1139
1159
  height: 162,
@@ -1143,7 +1163,9 @@ const LargeStyledCard = styled(MuiCard, {
1143
1163
  alignItems: 'flex-start',
1144
1164
  padding: spacing.spacing_2,
1145
1165
  borderRadius: borderRadius.card,
1146
- backgroundColor: isLight ? semanticColors.surfaces.card : semanticColorsDark.surfaces.card,
1166
+ backgroundColor: isLight
1167
+ ? semanticColors.color.surface.raised
1168
+ : semanticColorsDark.color.surface.raised,
1147
1169
  border: `1px solid ${defaultBorderColor}`,
1148
1170
  boxShadow: 'none',
1149
1171
  overflow: 'hidden',
@@ -1198,7 +1220,9 @@ const LargeHeaderTitle = styled('span', {
1198
1220
  fontWeight: typography.fontWeight.semiBold,
1199
1221
  fontSize: typography.fontSize.h6,
1200
1222
  lineHeight: 1.4,
1201
- color: cardTheme === 'light' ? semanticColors.typography.body : semanticColorsDark.typography.body,
1223
+ color: cardTheme === 'light'
1224
+ ? semanticColors.color.text.primary
1225
+ : semanticColorsDark.color.text.primary,
1202
1226
  flexShrink: 0,
1203
1227
  }));
1204
1228
  const LargeDescription = styled('p', {
@@ -1208,7 +1232,9 @@ const LargeDescription = styled('p', {
1208
1232
  fontWeight: typography.fontWeight.regular,
1209
1233
  fontSize: typography.fontSize.xs,
1210
1234
  lineHeight: 1.5,
1211
- color: cardTheme === 'light' ? semanticColors.typography.body : semanticColorsDark.typography.body,
1235
+ color: cardTheme === 'light'
1236
+ ? semanticColors.color.text.primary
1237
+ : semanticColorsDark.color.text.primary,
1212
1238
  margin: 0,
1213
1239
  minWidth: '100%',
1214
1240
  wordWrap: 'break-word',
@@ -1257,7 +1283,7 @@ const Label$4 = styled('span')(({ theme, size = 'medium' }) => ({
1257
1283
  : typography.fontSize.default),
1258
1284
  fontWeight: typography.fontWeight.medium,
1259
1285
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1260
- color: semanticColors.typography.input.default,
1286
+ color: semanticColors.color.text.input,
1261
1287
  }));
1262
1288
  const HelperText$2 = styled('span')(({ theme, size = 'medium' }) => ({
1263
1289
  fontSize: theme.typography.pxToRem(size === 'xs'
@@ -1267,7 +1293,7 @@ const HelperText$2 = styled('span')(({ theme, size = 'medium' }) => ({
1267
1293
  : typography.fontSize.default),
1268
1294
  fontWeight: typography.fontWeight.regular,
1269
1295
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1270
- color: semanticColors.typography.bodySecondary,
1296
+ color: semanticColors.color.text.secondary,
1271
1297
  }));
1272
1298
  // xs focus-ring radius — no matching design token (box corner comes from the icon)
1273
1299
  const FIGMA_XS_BORDER_RADIUS = 1;
@@ -1295,7 +1321,7 @@ const StyledCheckbox = styled(Checkbox, {
1295
1321
  height: config.size,
1296
1322
  padding: 0,
1297
1323
  marginTop: size === 'xs' ? 3 : 2,
1298
- color: semanticColors.border.strong,
1324
+ color: semanticColors.color.border.strong,
1299
1325
  borderRadius: config.borderRadius,
1300
1326
  flexShrink: 0,
1301
1327
  // Suppress MUI's grey hover background
@@ -1321,11 +1347,11 @@ const StyledCheckbox = styled(Checkbox, {
1321
1347
  cursor: 'not-allowed',
1322
1348
  },
1323
1349
  [`&.${checkboxClasses.disabled}:not(.${checkboxClasses.checked}):not(.${checkboxClasses.indeterminate})`]: {
1324
- color: semanticColors.border.primary,
1350
+ color: semanticColors.color.border.primary,
1325
1351
  },
1326
1352
  // Focus visible for keyboard navigation
1327
1353
  '&.Mui-focusVisible': {
1328
- outline: `2px solid ${semanticColors.border.focus}`,
1354
+ outline: `2px solid ${semanticColors.color.border.focus}`,
1329
1355
  outlineOffset: 2,
1330
1356
  borderRadius: config.borderRadius,
1331
1357
  },
@@ -1452,20 +1478,20 @@ const StyledButtonBase = styled(ButtonBase, {
1452
1478
  cursor: 'text',
1453
1479
  // Focus visible for keyboard navigation
1454
1480
  [`&.${buttonBaseClasses.focusVisible}`]: {
1455
- outline: `2px solid ${semanticColors.border.focus}`,
1481
+ outline: `2px solid ${semanticColors.color.border.focus}`,
1456
1482
  outlineOffset: 2,
1457
1483
  },
1458
1484
  };
1459
1485
  // Variant-specific styles
1460
1486
  const variantStyles = {
1461
1487
  outlined: {
1462
- backgroundColor: semanticColors.code.background,
1463
- color: semanticColors.typography.code.primary,
1488
+ backgroundColor: semanticColors.code.bg,
1489
+ color: semanticColors.color.text.code,
1464
1490
  border: 'none',
1465
1491
  },
1466
1492
  filled: {
1467
- backgroundColor: semanticColors.surfaces.tooltip,
1468
- color: semanticColors.typography.tooltip.default,
1493
+ backgroundColor: semanticColors.color.surface.tooltip,
1494
+ color: semanticColors.color.text.tooltip,
1469
1495
  border: 'none',
1470
1496
  },
1471
1497
  };
@@ -1507,15 +1533,15 @@ ModCodeSnippet.displayName = 'ModCodeSnippet';
1507
1533
  * they carry this surface themselves.
1508
1534
  */
1509
1535
  const panelSurfaceStyles = {
1510
- backgroundColor: semanticColors.surfaces.white,
1536
+ backgroundColor: semanticColors.color.surface.raised,
1511
1537
  };
1512
1538
  const getDataGridHeaderStyles = () => {
1513
1539
  return {
1514
1540
  // Header cell container styles - from Figma: bg, border, padding
1515
1541
  // Height is set via density-specific selectors in DataGrid.tsx
1516
1542
  [`& .${gridClasses.columnHeader}`]: {
1517
- backgroundColor: semanticColors.surfaces.dataGrid.header,
1518
- borderBottom: `1px solid ${semanticColors.border.primary}`,
1543
+ backgroundColor: semanticColors.color.surface.dataGrid.header,
1544
+ borderBottom: `1px solid ${semanticColors.color.border.primary}`,
1519
1545
  paddingTop: `${spacing.spacing_1_1_2}px`,
1520
1546
  paddingBottom: `${spacing.spacing_1_1_2}px`,
1521
1547
  paddingLeft: `${spacing.spacing_2}px`,
@@ -1525,8 +1551,8 @@ const getDataGridHeaderStyles = () => {
1525
1551
  // Style the filler element to match header
1526
1552
  // Height is set via density-specific selectors in DataGrid.tsx
1527
1553
  [`& .${gridClasses.filler}`]: {
1528
- backgroundColor: semanticColors.surfaces.dataGrid.header,
1529
- borderBottom: `1px solid ${semanticColors.border.primary}`,
1554
+ backgroundColor: semanticColors.color.surface.dataGrid.header,
1555
+ borderBottom: `1px solid ${semanticColors.color.border.primary}`,
1530
1556
  boxSizing: 'border-box',
1531
1557
  },
1532
1558
  // Style the default MUI column header title text to match Figma
@@ -1535,14 +1561,14 @@ const getDataGridHeaderStyles = () => {
1535
1561
  fontSize: typography.fontSize.sm,
1536
1562
  fontWeight: typography.fontWeight.semiBold, // Always semiBold (600)
1537
1563
  lineHeight: 'normal',
1538
- color: semanticColors.typography.bodySecondary, // #6b7280 by default
1564
+ color: semanticColors.color.text.secondary, // #6b7280 by default
1539
1565
  transition: 'color 0.2s',
1540
1566
  textOverflow: 'clip',
1541
1567
  whiteSpace: 'break-spaces',
1542
1568
  },
1543
1569
  // Change text color on hover
1544
1570
  [`& .${gridClasses.columnHeader}:hover .${gridClasses.columnHeaderTitle}`]: {
1545
- color: semanticColors.icons.default, // #1f2937 on hover
1571
+ color: semanticColors.color.icon.default, // #1f2937 on hover
1546
1572
  },
1547
1573
  // Style the checkbox in header to match design system (16x16 from Figma)
1548
1574
  [`& .${gridClasses.columnHeaderCheckbox}`]: {
@@ -1576,7 +1602,7 @@ const getDataGridHeaderStyles = () => {
1576
1602
  '& svg': {
1577
1603
  width: 16,
1578
1604
  height: 16,
1579
- color: semanticColors.icons.utility,
1605
+ color: semanticColors.color.icon.utility,
1580
1606
  },
1581
1607
  },
1582
1608
  },
@@ -1584,16 +1610,16 @@ const getDataGridHeaderStyles = () => {
1584
1610
  };
1585
1611
  const getDataGridRowStyles = () => ({
1586
1612
  [`& .${gridClasses.row}`]: {
1587
- backgroundColor: semanticColors.surfaces.dataGrid.default,
1613
+ backgroundColor: semanticColors.color.surface.dataGrid.default,
1588
1614
  },
1589
1615
  [`& .${gridClasses.row}:hover`]: {
1590
- backgroundColor: semanticColors.surfaces.dataGrid.hover,
1616
+ backgroundColor: semanticColors.color.surface.dataGrid.hover,
1591
1617
  },
1592
1618
  [`& .${gridClasses.row}.Mui-selected`]: {
1593
- backgroundColor: semanticColors.surfaces.dataGrid.selected,
1619
+ backgroundColor: semanticColors.color.surface.dataGrid.selected,
1594
1620
  },
1595
1621
  [`& .${gridClasses.row}.Mui-selected:hover`]: {
1596
- backgroundColor: semanticColors.surfaces.dataGrid.selectedHover,
1622
+ backgroundColor: semanticColors.color.surface.dataGrid.selectedHover,
1597
1623
  },
1598
1624
  });
1599
1625
 
@@ -1622,8 +1648,8 @@ const StyledSearchField = styled(TextField)(({ theme }) => ({
1622
1648
  height: spacing.spacing_5,
1623
1649
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
1624
1650
  borderRadius: borderRadius.input,
1625
- backgroundColor: semanticColors.input.background,
1626
- border: `1px solid ${semanticColors.border.primary}`,
1651
+ backgroundColor: semanticColors.input.bg,
1652
+ border: `1px solid ${semanticColors.color.border.primary}`,
1627
1653
  paddingTop: spacing.spacing_1,
1628
1654
  paddingBottom: spacing.spacing_1,
1629
1655
  paddingLeft: spacing.spacing_1_1_2,
@@ -1634,22 +1660,22 @@ const StyledSearchField = styled(TextField)(({ theme }) => ({
1634
1660
  },
1635
1661
  [`& .${inputBaseClasses.input}`]: {
1636
1662
  padding: 0,
1637
- color: semanticColors.typography.input.default,
1663
+ color: semanticColors.color.text.input,
1638
1664
  '&::placeholder': {
1639
- color: semanticColors.typography.input.placeholder,
1665
+ color: semanticColors.color.text.inputPlaceholder,
1640
1666
  opacity: 1,
1641
1667
  },
1642
1668
  },
1643
1669
  '&:hover': {
1644
- backgroundColor: semanticColors.input.hoverBackground,
1670
+ backgroundColor: semanticColors.input.bgHover,
1645
1671
  },
1646
1672
  [`&.${inputBaseClasses.focused}`]: {
1647
- backgroundColor: semanticColors.input.background,
1648
- borderColor: semanticColors.buttons.primary.default,
1673
+ backgroundColor: semanticColors.input.bg,
1674
+ borderColor: semanticColors.button.primary.bg,
1649
1675
  },
1650
1676
  },
1651
1677
  [`& .${inputAdornmentClasses.root}`]: {
1652
- color: semanticColors.icons.placeholder,
1678
+ color: semanticColors.color.icon.placeholder,
1653
1679
  '& svg': {
1654
1680
  width: 20,
1655
1681
  height: 20,
@@ -1672,14 +1698,14 @@ const MenuItemContent$1 = styled('div')(() => ({
1672
1698
  borderRadius: MENU_ITEM_BORDER_RADIUS,
1673
1699
  width: '100%',
1674
1700
  '&:hover': {
1675
- backgroundColor: semanticColors.surfaces.listHover,
1701
+ backgroundColor: semanticColors.color.surface.rowHover,
1676
1702
  },
1677
1703
  }));
1678
1704
  const MenuItemLabel = styled('span')(({ theme, fontWeight = 500 }) => ({
1679
1705
  fontSize: theme.typography.pxToRem(16),
1680
1706
  fontWeight,
1681
1707
  lineHeight: 1.5,
1682
- color: semanticColors.typography.body,
1708
+ color: semanticColors.color.text.primary,
1683
1709
  whiteSpace: 'nowrap',
1684
1710
  }));
1685
1711
  const DividerContainer = styled('div')(() => ({
@@ -1687,7 +1713,7 @@ const DividerContainer = styled('div')(() => ({
1687
1713
  paddingBottom: spacing.spacing_1_2,
1688
1714
  }));
1689
1715
  const StyledDivider$1 = styled(Divider)(() => ({
1690
- borderColor: semanticColors.border.primary,
1716
+ borderColor: semanticColors.color.border.primary,
1691
1717
  }));
1692
1718
  const FooterRow = styled(Box)(() => ({
1693
1719
  display: 'flex',
@@ -1699,16 +1725,16 @@ const FooterRow = styled(Box)(() => ({
1699
1725
  const ResetButton = styled(Button)(({ theme }) => ({
1700
1726
  fontSize: theme.typography.pxToRem(16),
1701
1727
  fontWeight: typography.fontWeight.regular,
1702
- color: semanticColors.buttons.primary.default,
1728
+ color: semanticColors.button.primary.bg,
1703
1729
  textTransform: 'none',
1704
1730
  padding: spacing.spacing_1,
1705
1731
  minWidth: 'auto',
1706
1732
  '&:hover': {
1707
1733
  backgroundColor: 'transparent',
1708
- color: semanticColors.typography.bodySecondary,
1734
+ color: semanticColors.color.text.secondary,
1709
1735
  },
1710
1736
  '&:disabled': {
1711
- color: semanticColors.typography.button.disabled,
1737
+ color: semanticColors.button.fgDisabled,
1712
1738
  },
1713
1739
  }));
1714
1740
  const ModDataGridColumnsPanel = ({ showSearch = false,
@@ -1772,7 +1798,7 @@ const StyledMenuItem = styled(MenuItem)(({ theme }) => ({
1772
1798
  minHeight: spacing.spacing_5,
1773
1799
  gap: spacing.spacing_2,
1774
1800
  borderRadius: 0,
1775
- color: semanticColors.icons.default,
1801
+ color: semanticColors.color.icon.default,
1776
1802
  textDecoration: 'none',
1777
1803
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
1778
1804
  fontWeight: typography.fontWeight.regular,
@@ -1781,19 +1807,19 @@ const StyledMenuItem = styled(MenuItem)(({ theme }) => ({
1781
1807
  duration: theme.transitions.duration.shortest,
1782
1808
  }),
1783
1809
  '&:hover': {
1784
- backgroundColor: semanticColors.surfaces.listHover,
1810
+ backgroundColor: semanticColors.color.surface.rowHover,
1785
1811
  },
1786
1812
  [`&.${menuItemClasses.selected}`]: {
1787
- backgroundColor: semanticColors.surfaces.listHover,
1813
+ backgroundColor: semanticColors.color.surface.rowHover,
1788
1814
  '&:hover': {
1789
- backgroundColor: semanticColors.surfaces.listHover,
1815
+ backgroundColor: semanticColors.color.surface.rowHover,
1790
1816
  },
1791
1817
  },
1792
1818
  [`&.${menuItemClasses.disabled}`]: {
1793
1819
  opacity: 0.5,
1794
1820
  },
1795
1821
  [`&.${menuItemClasses.focusVisible}`]: {
1796
- backgroundColor: semanticColors.surfaces.listHover,
1822
+ backgroundColor: semanticColors.color.surface.rowHover,
1797
1823
  },
1798
1824
  }));
1799
1825
  const MenuItemContent = styled('div')({
@@ -1808,7 +1834,7 @@ const IconWrapper$1 = styled('span')(({ theme }) => ({
1808
1834
  justifyContent: 'center',
1809
1835
  flexShrink: 0,
1810
1836
  fontSize: theme.typography.pxToRem(typography.fontSize.h4),
1811
- color: semanticColors.icons.default,
1837
+ color: semanticColors.color.icon.default,
1812
1838
  }));
1813
1839
  const LabelContainer$3 = styled('div')({
1814
1840
  flex: 1,
@@ -1818,24 +1844,24 @@ const LabelContainer$3 = styled('div')({
1818
1844
  minWidth: 0,
1819
1845
  });
1820
1846
  const Label$3 = styled('span')({
1821
- color: semanticColors.icons.default,
1847
+ color: semanticColors.color.icon.default,
1822
1848
  flexShrink: 0,
1823
1849
  });
1824
1850
  const SecondaryLabel = styled('span')({
1825
- color: semanticColors.typography.bodySecondary,
1851
+ color: semanticColors.color.text.secondary,
1826
1852
  fontWeight: typography.fontWeight.regular,
1827
1853
  flexShrink: 0,
1828
1854
  });
1829
1855
  const Shortcut = styled('span')(({ theme }) => ({
1830
1856
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
1831
1857
  fontWeight: typography.fontWeight.medium,
1832
- color: semanticColors.typography.bodySecondary,
1858
+ color: semanticColors.color.text.secondary,
1833
1859
  marginLeft: 'auto',
1834
1860
  flexShrink: 0,
1835
- border: `1px solid ${semanticColors.border.secondary}`,
1861
+ border: `1px solid ${semanticColors.color.border.primary}`,
1836
1862
  borderRadius: borderRadius.xS,
1837
1863
  padding: `${spacing.spacing_1_4}px ${spacing.spacing_3_4}px`,
1838
- backgroundColor: semanticColors.surfaces.white,
1864
+ backgroundColor: semanticColors.color.surface.raised,
1839
1865
  }));
1840
1866
  /**
1841
1867
  * ModMenuItem - Menu item component based on MUI MenuItem
@@ -1880,22 +1906,22 @@ ModMenuItem.displayName = 'ModMenuItem';
1880
1906
  * Custom chevron icon for select
1881
1907
  * Must accept props from MUI Select to work correctly
1882
1908
  */
1883
- const ChevronDownIcon = (props) => (jsx(ChevronDown, { ...props, size: spacing.spacing_2_1_2, color: semanticColors.typography.input.default, style: { ...props.style } }));
1909
+ const ChevronDownIcon = (props) => (jsx(ChevronDown, { ...props, size: spacing.spacing_2_1_2, color: semanticColors.color.text.input, style: { ...props.style } }));
1884
1910
  /**
1885
1911
  * Styled Select component with design system styling
1886
1912
  */
1887
1913
  const StyledSelect = styled(MuiSelect)({
1888
1914
  minHeight: spacing.spacing_5,
1889
- backgroundColor: semanticColors.input.background,
1890
- border: `1px solid ${semanticColors.border.primary}`,
1915
+ backgroundColor: semanticColors.input.bg,
1916
+ border: `1px solid ${semanticColors.color.border.primary}`,
1891
1917
  borderRadius: `${borderRadius.input}px`,
1892
1918
  '&:hover': {
1893
- backgroundColor: semanticColors.input.hoverBackground,
1894
- borderColor: semanticColors.border.primary,
1919
+ backgroundColor: semanticColors.input.bgHover,
1920
+ borderColor: semanticColors.color.border.primary,
1895
1921
  },
1896
1922
  '&.Mui-focused': {
1897
- backgroundColor: semanticColors.input.background,
1898
- borderColor: semanticColors.buttons.primary.default,
1923
+ backgroundColor: semanticColors.input.bg,
1924
+ borderColor: semanticColors.button.primary.bg,
1899
1925
  },
1900
1926
  '&::before': {
1901
1927
  display: 'none',
@@ -1910,7 +1936,7 @@ const StyledSelect = styled(MuiSelect)({
1910
1936
  paddingRight: spacing.spacing_5,
1911
1937
  fontSize: typography.fontSize.sm,
1912
1938
  fontWeight: typography.fontWeight.regular,
1913
- color: semanticColors.typography.input.default,
1939
+ color: semanticColors.color.text.input,
1914
1940
  },
1915
1941
  [`& .${selectClasses.icon}`]: {
1916
1942
  right: spacing.spacing_1_1_2,
@@ -1932,37 +1958,34 @@ const StyledSelect = styled(MuiSelect)({
1932
1958
  * </ModSelect>
1933
1959
  * ```
1934
1960
  */
1935
- const ModSelect = (props) => {
1936
- const paperSlotProps = props.MenuProps?.slotProps?.paper;
1937
- const incomingPaperSx = typeof paperSlotProps === 'function' ? undefined : paperSlotProps?.sx;
1938
- return (jsx(StyledSelect, { ...props, IconComponent: ChevronDownIcon, variant: "standard", MenuProps: {
1939
- ...props.MenuProps,
1940
- slotProps: {
1941
- ...props.MenuProps?.slotProps,
1942
- paper: {
1943
- sx: {
1944
- backgroundColor: semanticColors.surfaces.white,
1945
- borderRadius: `${borderRadius.s}px`,
1946
- border: `1px solid ${semanticColors.border.primary}`,
1947
- boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
1948
- marginTop: 1,
1949
- ...incomingPaperSx,
1950
- },
1961
+ const ModSelect = (props) => (jsx(StyledSelect, { ...props, IconComponent: ChevronDownIcon, variant: "standard", MenuProps: {
1962
+ ...props.MenuProps,
1963
+ slotProps: {
1964
+ ...props.MenuProps?.slotProps,
1965
+ // Caller wins, caller `sx` last — and unlike a spread, handles `sx` arrays and the
1966
+ // callback form of `slotProps.paper`.
1967
+ paper: mergeSlotProps(props.MenuProps?.slotProps?.paper, {
1968
+ sx: {
1969
+ backgroundColor: semanticColors.color.surface.raised,
1970
+ borderRadius: `${borderRadius.s}px`,
1971
+ border: `1px solid ${semanticColors.color.border.primary}`,
1972
+ boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
1973
+ marginTop: 1,
1951
1974
  },
1952
- },
1953
- } }));
1954
- };
1975
+ }),
1976
+ },
1977
+ } }));
1955
1978
  ModSelect.displayName = 'ModSelect';
1956
1979
 
1957
1980
  /**
1958
1981
  * Icon components for DataGrid filter panel slots
1959
1982
  * These must be passed to the DataGrid's slots prop
1960
1983
  */
1961
- const ModDataGridFilterPanelAddIcon = () => (jsx(Plus, { size: spacing.spacing_2, color: semanticColors.buttons.tertiary.default }));
1984
+ const ModDataGridFilterPanelAddIcon = () => (jsx(Plus, { size: spacing.spacing_2, color: semanticColors.button.tertiary.fg }));
1962
1985
  ModDataGridFilterPanelAddIcon.displayName = 'ModDataGridFilterPanelAddIcon';
1963
- const ModDataGridFilterPanelDeleteIcon = () => (jsx(X, { size: spacing.spacing_2_1_2, color: semanticColors.icons.default }));
1986
+ const ModDataGridFilterPanelDeleteIcon = () => (jsx(X, { size: spacing.spacing_2_1_2, color: semanticColors.color.icon.default }));
1964
1987
  ModDataGridFilterPanelDeleteIcon.displayName = 'ModDataGridFilterPanelDeleteIcon';
1965
- const ModDataGridFilterPanelRemoveAllIcon = () => (jsx(Trash2, { size: spacing.spacing_2, color: semanticColors.buttons.tertiary.default }));
1988
+ const ModDataGridFilterPanelRemoveAllIcon = () => (jsx(Trash2, { size: spacing.spacing_2, color: semanticColors.button.tertiary.fg }));
1966
1989
  ModDataGridFilterPanelRemoveAllIcon.displayName = 'ModDataGridFilterPanelRemoveAllIcon';
1967
1990
  /**
1968
1991
  * Base styled GridFilterPanel with design system styling
@@ -2011,20 +2034,20 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2011
2034
  [`& .${gridClasses.filterForm} .${inputBaseClasses.root}`]: {
2012
2035
  position: 'relative',
2013
2036
  minHeight: spacing.spacing_5,
2014
- backgroundColor: semanticColors.input.background,
2015
- border: `1px solid ${semanticColors.border.primary}`,
2037
+ backgroundColor: semanticColors.input.bg,
2038
+ border: `1px solid ${semanticColors.color.border.primary}`,
2016
2039
  borderRadius: `${borderRadius.input}px`,
2017
2040
  fontSize: typography.fontSize.default,
2018
2041
  fontWeight: typography.fontWeight.regular,
2019
- color: semanticColors.typography.input.default,
2042
+ color: semanticColors.color.text.input,
2020
2043
  },
2021
2044
  [`& .${gridClasses.filterForm} .${inputBaseClasses.root}:hover`]: {
2022
- backgroundColor: semanticColors.input.hoverBackground,
2023
- borderColor: semanticColors.border.primary,
2045
+ backgroundColor: semanticColors.input.bgHover,
2046
+ borderColor: semanticColors.color.border.primary,
2024
2047
  },
2025
2048
  [`& .${gridClasses.filterForm} .${inputBaseClasses.root}.${inputBaseClasses.focused}`]: {
2026
- backgroundColor: semanticColors.input.background,
2027
- borderColor: semanticColors.border.primary,
2049
+ backgroundColor: semanticColors.input.bg,
2050
+ borderColor: semanticColors.color.border.primary,
2028
2051
  },
2029
2052
  [`& .${gridClasses.filterForm} .${inputBaseClasses.root}::before`]: {
2030
2053
  display: 'none',
@@ -2039,9 +2062,9 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2039
2062
  paddingRight: spacing.spacing_1_1_2,
2040
2063
  fontSize: typography.fontSize.default,
2041
2064
  fontWeight: typography.fontWeight.regular,
2042
- color: semanticColors.typography.input.default,
2065
+ color: semanticColors.color.text.input,
2043
2066
  '&::placeholder': {
2044
- color: semanticColors.typography.input.placeholder,
2067
+ color: semanticColors.color.text.inputPlaceholder,
2045
2068
  opacity: 1,
2046
2069
  },
2047
2070
  },
@@ -2056,7 +2079,7 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2056
2079
  [`& .${gridClasses.filterForm} .${formLabelClasses.root}`]: {
2057
2080
  fontSize: typography.fontSize.sm,
2058
2081
  fontWeight: typography.fontWeight.medium,
2059
- color: semanticColors.typography.input.label,
2082
+ color: semanticColors.color.text.inputLabel,
2060
2083
  marginBottom: spacing.spacing_1_2,
2061
2084
  position: 'static',
2062
2085
  transform: 'none',
@@ -2064,16 +2087,20 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2064
2087
  [`& .${gridClasses.filterForm} .${inputLabelClasses.root}`]: {
2065
2088
  fontSize: typography.fontSize.sm,
2066
2089
  fontWeight: typography.fontWeight.medium,
2067
- color: semanticColors.typography.input.label,
2090
+ color: semanticColors.color.text.inputLabel,
2068
2091
  marginBottom: spacing.spacing_1_2,
2069
2092
  position: 'static',
2070
2093
  transform: 'none',
2071
2094
  },
2072
2095
  [`& .${gridClasses.filterForm} .${formLabelClasses.root}.${formLabelClasses.focused}`]: {
2073
- color: semanticColors.typography.input.label,
2096
+ color: semanticColors.color.text.inputLabel,
2074
2097
  },
2075
2098
  [`& .${gridClasses.filterForm} .${inputLabelClasses.root}.${inputLabelClasses.focused}`]: {
2076
- color: semanticColors.typography.input.label,
2099
+ color: semanticColors.color.text.inputLabel,
2100
+ },
2101
+ // Reclaim the 16px MUI's standard Input reserves for a floating label; these sit statically.
2102
+ [`& .${gridClasses.filterForm} label + .${inputBaseClasses.root}`]: {
2103
+ marginTop: 0,
2077
2104
  },
2078
2105
  // Remove fieldset/legend
2079
2106
  '& fieldset': {
@@ -2097,13 +2124,13 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2097
2124
  minHeight: 'auto',
2098
2125
  height: 'auto',
2099
2126
  gap: spacing.spacing_1_2,
2100
- backgroundColor: semanticColors.buttons.secondary.defaultBackground,
2101
- color: semanticColors.typography.input.default,
2102
- border: `1px solid ${semanticColors.buttons.secondary.defaultBorder}`,
2127
+ backgroundColor: semanticColors.button.secondary.bg,
2128
+ color: semanticColors.color.text.input,
2129
+ border: `1px solid ${semanticColors.button.secondary.border}`,
2103
2130
  },
2104
2131
  [`& .${gridClasses.panelFooter} .${buttonClasses.root}:first-child:hover`]: {
2105
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
2106
- borderColor: semanticColors.buttons.secondary.defaultBorder,
2132
+ backgroundColor: semanticColors.button.secondary.bgHover,
2133
+ borderColor: semanticColors.button.secondary.border,
2107
2134
  },
2108
2135
  // Clear all button (second button) - styled to match ModButton link variant
2109
2136
  [`& .${gridClasses.panelFooter} .${buttonClasses.root}:nth-child(2)`]: {
@@ -2115,39 +2142,58 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2115
2142
  textTransform: 'none',
2116
2143
  minHeight: 'auto',
2117
2144
  backgroundColor: 'transparent',
2118
- color: semanticColors.buttons.tertiary.default,
2145
+ color: semanticColors.button.tertiary.fg,
2119
2146
  border: 'none',
2120
2147
  [`& .${buttonClasses.startIcon}`]: {
2121
2148
  display: 'none', // Hide the trash icon
2122
2149
  },
2123
2150
  '&:hover': {
2124
2151
  backgroundColor: 'transparent',
2125
- color: semanticColors.buttons.tertiary.hover,
2152
+ color: semanticColors.button.tertiary.fgHover,
2126
2153
  },
2127
2154
  },
2128
2155
  // Icon buttons (delete/trash icon)
2129
2156
  [`& .${gridClasses.filterForm} .${iconButtonClasses.root}`]: {
2130
2157
  width: spacing.spacing_5_1_2,
2131
2158
  height: spacing.spacing_5_1_2,
2132
- color: semanticColors.icons.default,
2159
+ color: semanticColors.color.icon.default,
2133
2160
  },
2134
2161
  [`& .${gridClasses.filterForm} .${iconButtonClasses.root}:hover`]: {
2135
- backgroundColor: semanticColors.input.hoverBackground,
2162
+ backgroundColor: semanticColors.input.bgHover,
2136
2163
  },
2137
2164
  });
2138
2165
  StyledGridFilterPanel.displayName = 'StyledGridFilterPanel';
2139
2166
  /**
2140
- * ModSelect, typed for the DataGrid `baseSelect` slot.
2141
- *
2142
- * The grid's own `SelectProps` shares MUI's prop names and semantics, but types
2143
- * `onChange` as a bare `ChangeEventHandler` and adds `aria-*`/`data-*` index
2144
- * signatures — structurally incompatible, behaviourally identical. Asserted
2145
- * once here rather than at every call site; #721 tracks replacing the assertion
2146
- * with a real adapter. Intersected rather than replaced so direct consumers keep
2147
- * `ModSelectProps` — casting to the slot type alone drops `variant`, `MenuProps`
2148
- * and the `SelectChangeEvent` signature.
2167
+ * ModDataGridSelect - ModSelect adapted to the DataGrid `baseSelect` slot contract.
2168
+ *
2169
+ * Kept structurally parallel to MUI's own `BaseSelect` (`@mui/x-data-grid/material`) so the two
2170
+ * can be diffed on upgrade.
2171
+ *
2172
+ * @example
2173
+ * ```tsx
2174
+ * <ModDataGrid rows={rows} columns={columns} slots={{ baseSelect: ModDataGridSelect }} />
2175
+ * ```
2149
2176
  */
2150
- const ModDataGridSelect = ModSelect;
2177
+ const ModDataGridSelect = forwardRef(function ModDataGridSelect({ id, label, labelId, disabled, fullWidth, size, style, slotProps, material, onChange, onClose, onKeyDown, ...rest }, ref) {
2178
+ const theme = useTheme();
2179
+ const hasLabel = label !== undefined;
2180
+ // The grid omits `size` in edit cells, where MUI's adapter falls back to the theme's TextField
2181
+ // default — without this the select renders medium beside small fields.
2182
+ const computedSize = size ?? theme.components?.MuiTextField?.defaultProps?.size;
2183
+ return (jsxs(FormControl
2184
+ // Bridges Ref<HTMLElement> to FormControl's Ref<HTMLDivElement>; neither direct form typechecks.
2185
+ , {
2186
+ // Bridges Ref<HTMLElement> to FormControl's Ref<HTMLDivElement>; neither direct form typechecks.
2187
+ ref: useForkRef(ref), disabled: disabled, fullWidth: fullWidth, size: computedSize, style: style, children: [hasLabel && (jsx(MuiInputLabel, { id: labelId, htmlFor: id, variant: "standard", shrink: true, children: label })), jsx(ModSelect, { ...rest, id: id, label: label, labelId: hasLabel ? labelId : undefined, size: computedSize, displayEmpty: true, inputProps: slotProps?.htmlInput,
2188
+ // The grid types this as a ChangeEventHandler; MUI emits a SelectChangeEvent. MUI's own
2189
+ // adapter forwards it unchanged, so the divergence is only in the type.
2190
+ onChange: onChange, MenuProps: {
2191
+ // Must stay absent when absent: MUI spreads MenuProps over its own `onClose: handleClose`,
2192
+ // so an explicit `undefined` stops Escape and backdrop click closing the menu.
2193
+ ...(onClose && { onClose }),
2194
+ slotProps: { paper: { onKeyDown } },
2195
+ }, ...material })] }));
2196
+ });
2151
2197
  /**
2152
2198
  * ModDataGridFilterPanel - MUI GridFilterPanel with design system styling and Lucide icons
2153
2199
  *
@@ -2189,13 +2235,13 @@ ModDataGridFilterPanel.displayName = 'ModDataGridFilterPanel';
2189
2235
  * Use these with DataGrid's slots API to replace default sort indicators.
2190
2236
  */
2191
2237
  function SortedDescendingIcon() {
2192
- return jsx(ArrowDown, { size: 16, color: semanticColors.icons.utility });
2238
+ return jsx(ArrowDown, { size: 16, color: semanticColors.color.icon.utility });
2193
2239
  }
2194
2240
  function SortedAscendingIcon() {
2195
- return jsx(ArrowUp, { size: 16, color: semanticColors.icons.utility });
2241
+ return jsx(ArrowUp, { size: 16, color: semanticColors.color.icon.utility });
2196
2242
  }
2197
2243
  function UnsortedIcon() {
2198
- return jsx(ChevronsUpDown, { size: 16, color: semanticColors.icons.utility });
2244
+ return jsx(ChevronsUpDown, { size: 16, color: semanticColors.color.icon.utility });
2199
2245
  }
2200
2246
 
2201
2247
  /**
@@ -2206,7 +2252,7 @@ function UnsortedIcon() {
2206
2252
  */
2207
2253
  const ModGridPanel = styled(GridPanel)({
2208
2254
  [`& .${gridPanelClasses.paper}`]: {
2209
- backgroundColor: semanticColors.surfaces.white,
2255
+ backgroundColor: semanticColors.color.surface.raised,
2210
2256
  },
2211
2257
  });
2212
2258
  /**
@@ -2282,27 +2328,27 @@ function ModDataGrid({ autoHeight = false, toolbar, slots, sx, density = 'standa
2282
2328
  // See: https://github.com/mui/mui-x/issues/20107
2283
2329
  // This must be set to prevent scroll shadow artifacts
2284
2330
  [`& .${gridClasses.main}`]: {
2285
- backgroundColor: semanticColors.surfaces.dataGrid.background,
2331
+ backgroundColor: semanticColors.color.surface.dataGrid.default,
2286
2332
  },
2287
2333
  // White background for empty/loading overlays
2288
2334
  [`& .${gridClasses.overlay}`]: {
2289
- backgroundColor: semanticColors.surfaces.dataGrid.background,
2335
+ backgroundColor: semanticColors.color.surface.dataGrid.default,
2290
2336
  },
2291
2337
  // The root keeps MUI's background.paper (#fff), which the note above
2292
2338
  // requires us to leave alone. Everything outside `main` therefore showed
2293
2339
  // white under [data-theme="dark"] — the footer, and the filler strips
2294
2340
  // beyond the last column and next to the scrollbar.
2295
2341
  [`& .${gridClasses.footerContainer}`]: {
2296
- backgroundColor: semanticColors.surfaces.dataGrid.background,
2342
+ backgroundColor: semanticColors.color.surface.dataGrid.default,
2297
2343
  },
2298
2344
  // `&&` doubles specificity: MUI paints the filler strips itself, so a
2299
2345
  // single-class rule loses to its own.
2300
2346
  [`&& .${gridClasses.filler}, && .${gridClasses.scrollbarFiller}`]: {
2301
- backgroundColor: semanticColors.surfaces.dataGrid.background,
2347
+ backgroundColor: semanticColors.color.surface.dataGrid.default,
2302
2348
  },
2303
2349
  ...getDataGridHeaderStyles(),
2304
2350
  ...getDataGridRowStyles(),
2305
- border: `1px solid ${semanticColors.border.secondary}`,
2351
+ border: `1px solid ${semanticColors.color.border.primary}`,
2306
2352
  // Target `& svg` (not `.MuiSvgIcon-root`) to match the lucide icons
2307
2353
  // ModCheckbox renders, mirroring the header rule below.
2308
2354
  // flexShrink: 0 stops the icon collapsing to 0 width when the checkbox
@@ -2357,7 +2403,7 @@ ModDataGrid.displayName = 'ModDataGrid';
2357
2403
  * ```
2358
2404
  */
2359
2405
  function ModDataGridColumnsButton() {
2360
- return (jsx(ColumnsPanelTrigger, { render: jsx(ToolbarButton, { render: jsxs(ModButton, { variant: "secondary", size: "small", children: [jsx(Columns3, { size: 16, color: semanticColors.buttons.primary.default }), "Columns"] }) }) }));
2406
+ return (jsx(ColumnsPanelTrigger, { render: jsx(ToolbarButton, { render: jsxs(ModButton, { variant: "secondary", size: "small", children: [jsx(Columns3, { size: 16, color: semanticColors.button.primary.bg }), "Columns"] }) }) }));
2361
2407
  }
2362
2408
  ModDataGridColumnsButton.displayName = 'ModDataGridColumnsButton';
2363
2409
 
@@ -2383,69 +2429,69 @@ const sizeStyles$1 = {
2383
2429
  };
2384
2430
  const outlinedColorStyles = {
2385
2431
  default: {
2386
- backgroundColor: semanticColors.status.neutral.light,
2387
- color: semanticColors.status.neutral.dark,
2388
- borderColor: semanticColors.status.neutral.transparent,
2432
+ backgroundColor: semanticColors.color.status.neutral.bg,
2433
+ color: semanticColors.color.status.neutral.fg,
2434
+ borderColor: semanticColors.color.status.neutral.tint,
2389
2435
  },
2390
2436
  error: {
2391
- backgroundColor: semanticColors.status.error.light,
2392
- color: semanticColors.status.error.dark,
2393
- borderColor: semanticColors.status.error.transparent,
2437
+ backgroundColor: semanticColors.color.status.error.bg,
2438
+ color: semanticColors.color.status.error.fg,
2439
+ borderColor: semanticColors.color.status.error.tint,
2394
2440
  },
2395
2441
  warning: {
2396
- backgroundColor: semanticColors.status.warning.light,
2397
- color: semanticColors.status.warning.dark,
2398
- borderColor: semanticColors.status.warning.transparent,
2442
+ backgroundColor: semanticColors.color.status.warning.bg,
2443
+ color: semanticColors.color.status.warning.fg,
2444
+ borderColor: semanticColors.color.status.warning.tint,
2399
2445
  },
2400
2446
  success: {
2401
- backgroundColor: semanticColors.status.success.light,
2402
- color: semanticColors.status.success.dark,
2403
- borderColor: semanticColors.status.success.transparent,
2447
+ backgroundColor: semanticColors.color.status.success.bg,
2448
+ color: semanticColors.color.status.success.fg,
2449
+ borderColor: semanticColors.color.status.success.tint,
2404
2450
  },
2405
2451
  info: {
2406
- backgroundColor: semanticColors.status.info.light,
2407
- color: semanticColors.status.info.dark,
2408
- borderColor: semanticColors.status.info.transparent,
2452
+ backgroundColor: semanticColors.color.status.info.bg,
2453
+ color: semanticColors.color.status.info.fg,
2454
+ borderColor: semanticColors.color.status.info.tint,
2409
2455
  },
2410
2456
  violet: {
2411
- backgroundColor: semanticColors.status.active.light,
2412
- color: semanticColors.status.active.dark,
2413
- borderColor: semanticColors.status.active.transparent,
2457
+ backgroundColor: semanticColors.color.status.active.bg,
2458
+ color: semanticColors.color.status.active.fg,
2459
+ borderColor: semanticColors.color.status.active.tint,
2414
2460
  },
2415
2461
  beta: {
2416
2462
  backgroundColor: 'transparent',
2417
- color: semanticColors.typography.bodySecondary,
2463
+ color: semanticColors.color.text.secondary,
2418
2464
  borderColor: 'transparent',
2419
2465
  },
2420
2466
  };
2421
2467
  const filledColorStyles = {
2422
2468
  default: {
2423
- backgroundColor: semanticColors.status.neutral.dark,
2424
- color: semanticColors.status.neutral.light,
2469
+ backgroundColor: semanticColors.color.status.neutral.fg,
2470
+ color: semanticColors.color.status.neutral.bg,
2425
2471
  },
2426
2472
  error: {
2427
- backgroundColor: semanticColors.status.error.dark,
2428
- color: semanticColors.status.error.light,
2473
+ backgroundColor: semanticColors.color.status.error.fg,
2474
+ color: semanticColors.color.status.error.bg,
2429
2475
  },
2430
2476
  warning: {
2431
- backgroundColor: semanticColors.status.warning.dark,
2432
- color: semanticColors.status.warning.light,
2477
+ backgroundColor: semanticColors.color.status.warning.fg,
2478
+ color: semanticColors.color.status.warning.bg,
2433
2479
  },
2434
2480
  success: {
2435
- backgroundColor: semanticColors.status.success.dark,
2436
- color: semanticColors.status.success.light,
2481
+ backgroundColor: semanticColors.color.status.success.fg,
2482
+ color: semanticColors.color.status.success.bg,
2437
2483
  },
2438
2484
  info: {
2439
- backgroundColor: semanticColors.status.info.dark,
2440
- color: semanticColors.status.info.light,
2485
+ backgroundColor: semanticColors.color.status.info.fg,
2486
+ color: semanticColors.color.status.info.bg,
2441
2487
  },
2442
2488
  violet: {
2443
- backgroundColor: semanticColors.status.active.dark,
2444
- color: semanticColors.status.active.light,
2489
+ backgroundColor: semanticColors.color.status.active.fg,
2490
+ color: semanticColors.color.status.active.bg,
2445
2491
  },
2446
2492
  beta: {
2447
2493
  backgroundColor: 'transparent',
2448
- color: semanticColors.typography.bodySecondary,
2494
+ color: semanticColors.color.text.secondary,
2449
2495
  },
2450
2496
  };
2451
2497
  const StyledChip$2 = styled(Chip, {
@@ -2499,7 +2545,7 @@ function ModDataGridFiltersButton() {
2499
2545
  const filterModel = useGridSelector(apiRef, gridFilterModelSelector);
2500
2546
  const activeFilters = filterModel.items.filter(item => item.value != null && item.value !== '');
2501
2547
  const filterCount = activeFilters.length;
2502
- return (jsx(FilterPanelTrigger, { render: jsx(ToolbarButton, { render: jsxs(ModButton, { variant: "secondary", size: "small", children: [jsx(ListFilter, { size: 16, color: semanticColors.buttons.primary.default }), "Filters", filterCount > 0 && (jsx(ModTag, { size: "medium", variant: "filled", intent: "info", label: String(filterCount) }))] }) }) }));
2548
+ return (jsx(FilterPanelTrigger, { render: jsx(ToolbarButton, { render: jsxs(ModButton, { variant: "secondary", size: "small", children: [jsx(ListFilter, { size: 16, color: semanticColors.button.primary.bg }), "Filters", filterCount > 0 && (jsx(ModTag, { size: "medium", variant: "filled", intent: "info", label: String(filterCount) }))] }) }) }));
2503
2549
  }
2504
2550
  ModDataGridFiltersButton.displayName = 'ModDataGridFiltersButton';
2505
2551
 
@@ -2534,14 +2580,14 @@ const LabelText$1 = styled('p')({
2534
2580
  fontSize: typography.fontSize.sm,
2535
2581
  fontWeight: typography.fontWeight.semiBold, // Always semiBold (600)
2536
2582
  lineHeight: 'normal',
2537
- color: semanticColors.typography.bodySecondary, // #6b7280 by default
2583
+ color: semanticColors.color.text.secondary, // #6b7280 by default
2538
2584
  whiteSpace: 'nowrap',
2539
2585
  margin: 0,
2540
2586
  padding: 0,
2541
2587
  transition: 'color 0.2s',
2542
2588
  // Hover state - changes to primary text color
2543
2589
  '&:hover': {
2544
- color: semanticColors.icons.default, // #1f2937 on hover
2590
+ color: semanticColors.color.icon.default, // #1f2937 on hover
2545
2591
  },
2546
2592
  });
2547
2593
  const IconWrapper = styled('div')({
@@ -2554,7 +2600,7 @@ const IconWrapper = styled('div')({
2554
2600
  '& svg': {
2555
2601
  width: 16,
2556
2602
  height: 16,
2557
- color: semanticColors.icons.utility,
2603
+ color: semanticColors.color.icon.utility,
2558
2604
  },
2559
2605
  });
2560
2606
  function ModDataGridHeaderLabel({ children, helpTooltip, className, }) {
@@ -2593,9 +2639,9 @@ const StyledNavButton = styled(IconButton, {
2593
2639
  };
2594
2640
  const sizeStyles = sizeConfig[size];
2595
2641
  const activeNavStyles = {
2596
- backgroundColor: semanticColors.icons.pressedBackground,
2642
+ backgroundColor: semanticColors.color.icon.bgPressed,
2597
2643
  borderColor: 'transparent',
2598
- color: semanticColors.buttons.primary.pressed,
2644
+ color: semanticColors.button.primary.bgPressed,
2599
2645
  };
2600
2646
  return {
2601
2647
  width: sizeStyles.width,
@@ -2606,25 +2652,25 @@ const StyledNavButton = styled(IconButton, {
2606
2652
  duration: theme.transitions.duration.short,
2607
2653
  }),
2608
2654
  '&:focus-visible': {
2609
- outline: `2px solid ${semanticColors.border.focus}`,
2655
+ outline: `2px solid ${semanticColors.color.border.focus}`,
2610
2656
  outlineOffset: 2,
2611
2657
  },
2612
2658
  // Nav styles
2613
- backgroundColor: semanticColors.surfaces.white,
2614
- color: semanticColors.icons.default,
2615
- border: `1px solid ${semanticColors.border.secondary}`,
2659
+ backgroundColor: semanticColors.color.surface.raised,
2660
+ color: semanticColors.color.icon.default,
2661
+ border: `1px solid ${semanticColors.color.border.primary}`,
2616
2662
  '&:hover': {
2617
- backgroundColor: semanticColors.input.hoverBackground,
2618
- borderColor: semanticColors.border.primary,
2619
- color: semanticColors.icons.default,
2663
+ backgroundColor: semanticColors.input.bgHover,
2664
+ borderColor: semanticColors.color.border.primary,
2665
+ color: semanticColors.color.icon.default,
2620
2666
  },
2621
2667
  '&:active': activeNavStyles,
2622
2668
  [`&.${iconButtonClasses.disabled}`]: {
2623
2669
  cursor: 'not-allowed',
2624
2670
  pointerEvents: 'auto',
2625
- backgroundColor: semanticColors.surfaces.white,
2626
- borderColor: semanticColors.border.secondary,
2627
- color: semanticColors.icons.disabled,
2671
+ backgroundColor: semanticColors.color.surface.raised,
2672
+ borderColor: semanticColors.color.border.primary,
2673
+ color: semanticColors.color.icon.disabled,
2628
2674
  opacity: 0.5,
2629
2675
  },
2630
2676
  ...(active ? activeNavStyles : {}),
@@ -2701,80 +2747,80 @@ const defaultRangeShortcuts = [
2701
2747
  // Styled DatePicker with design system tokens
2702
2748
  const StyledDatePicker = styled(DatePicker)(({ theme }) => ({
2703
2749
  [`& .${pickerPopperClasses.paper}`]: {
2704
- backgroundColor: semanticColors.surfaces.card,
2750
+ backgroundColor: semanticColors.color.surface.raised,
2705
2751
  boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
2706
2752
  borderRadius: `${borderRadius.s}px`,
2707
2753
  },
2708
2754
  [`& .${dayCalendarClasses.weekDayLabel}`]: {
2709
2755
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2710
2756
  fontWeight: typography.fontWeight.medium,
2711
- color: semanticColors.typography.bodySecondary,
2757
+ color: semanticColors.color.text.secondary,
2712
2758
  },
2713
2759
  [`& .${pickerDayClasses.root}`]: {
2714
2760
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2715
- color: semanticColors.typography.bodySecondary,
2761
+ color: semanticColors.color.text.secondary,
2716
2762
  borderRadius: borderRadius.l,
2717
2763
  '&:hover': {
2718
- backgroundColor: semanticColors.icons.hoverBackground,
2764
+ backgroundColor: semanticColors.color.icon.bgHover,
2719
2765
  },
2720
2766
  '&.Mui-selected': {
2721
- backgroundColor: semanticColors.icons.active,
2722
- color: semanticColors.surfaces.white,
2767
+ backgroundColor: semanticColors.color.icon.active,
2768
+ color: semanticColors.color.surface.raised,
2723
2769
  '&:hover': {
2724
- backgroundColor: semanticColors.icons.active,
2770
+ backgroundColor: semanticColors.color.icon.active,
2725
2771
  },
2726
2772
  },
2727
2773
  [`&.${pickerDayClasses.today}`]: {
2728
- border: `2px solid ${semanticColors.border.strong}`,
2774
+ border: `2px solid ${semanticColors.color.border.strong}`,
2729
2775
  backgroundColor: 'transparent',
2730
2776
  },
2731
2777
  },
2732
2778
  [`& .${pickersCalendarHeaderClasses.label}`]: {
2733
2779
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2734
2780
  fontWeight: typography.fontWeight.semiBold,
2735
- color: semanticColors.typography.body,
2781
+ color: semanticColors.color.text.primary,
2736
2782
  },
2737
2783
  }));
2738
2784
  // Styled DateRangePicker with design system tokens
2739
2785
  const StyledDateRangePicker = styled(DateRangePicker)(({ theme }) => ({
2740
2786
  [`& .${pickerPopperClasses.paper}`]: {
2741
- backgroundColor: semanticColors.surfaces.card,
2787
+ backgroundColor: semanticColors.color.surface.raised,
2742
2788
  boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
2743
2789
  borderRadius: `${borderRadius.s}px`,
2744
2790
  },
2745
2791
  [`& .${dayCalendarClasses.weekDayLabel}`]: {
2746
2792
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2747
2793
  fontWeight: typography.fontWeight.medium,
2748
- color: semanticColors.typography.bodySecondary,
2794
+ color: semanticColors.color.text.secondary,
2749
2795
  },
2750
2796
  [`& .${dateRangePickerDayClasses.root}`]: {
2751
2797
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2752
- color: semanticColors.typography.bodySecondary,
2798
+ color: semanticColors.color.text.secondary,
2753
2799
  borderRadius: borderRadius.l,
2754
2800
  '&:hover': {
2755
- backgroundColor: semanticColors.icons.hoverBackground,
2801
+ backgroundColor: semanticColors.color.icon.bgHover,
2756
2802
  },
2757
2803
  '&.Mui-selected': {
2758
- backgroundColor: semanticColors.icons.active,
2759
- color: semanticColors.surfaces.white,
2804
+ backgroundColor: semanticColors.color.icon.active,
2805
+ color: semanticColors.color.surface.raised,
2760
2806
  },
2761
2807
  },
2762
2808
  [`& .${dateRangePickerDayClasses.insideSelection}`]: {
2763
- backgroundColor: semanticColors.icons.hoverBackground,
2764
- color: semanticColors.typography.input.default,
2809
+ backgroundColor: semanticColors.color.icon.bgHover,
2810
+ color: semanticColors.color.text.input,
2765
2811
  },
2766
2812
  [`& .${dateRangePickerDayClasses.selectionStart}, & .${dateRangePickerDayClasses.selectionEnd}`]: {
2767
- backgroundColor: semanticColors.icons.active,
2813
+ backgroundColor: semanticColors.color.icon.active,
2768
2814
  },
2769
2815
  [`& .${pickersCalendarHeaderClasses.label}`]: {
2770
2816
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2771
2817
  fontWeight: typography.fontWeight.semiBold,
2772
- color: semanticColors.typography.body,
2818
+ color: semanticColors.color.text.primary,
2773
2819
  },
2774
2820
  }));
2775
- const ClearIcon = () => jsx(X, { size: 20, color: semanticColors.icons.placeholder });
2821
+ const ClearIcon = () => jsx(X, { size: 20, color: semanticColors.color.icon.placeholder });
2776
2822
  // Custom calendar icon component
2777
- const CalendarIcon = () => jsx(CalendarDays, { size: 20, color: semanticColors.icons.placeholder });
2823
+ const CalendarIcon = () => jsx(CalendarDays, { size: 20, color: semanticColors.color.icon.placeholder });
2778
2824
  // Shortcut styles to match Figma list item design (no borders, plain text)
2779
2825
  const shortcutChipStyles = {
2780
2826
  // Container (MuiList) styles
@@ -2783,7 +2829,7 @@ const shortcutChipStyles = {
2783
2829
  [`& .${chipClasses.root}`]: {
2784
2830
  fontSize: typography.fontSize.sm,
2785
2831
  fontWeight: typography.fontWeight.medium,
2786
- color: semanticColors.typography.input.default,
2832
+ color: semanticColors.color.text.input,
2787
2833
  backgroundColor: 'transparent',
2788
2834
  borderRadius: `${spacing.spacing_3_4}px`,
2789
2835
  border: 'none',
@@ -2796,7 +2842,7 @@ const shortcutChipStyles = {
2796
2842
  padding: 0,
2797
2843
  },
2798
2844
  '&:hover': {
2799
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
2845
+ backgroundColor: semanticColors.button.secondary.bgHover,
2800
2846
  },
2801
2847
  },
2802
2848
  };
@@ -2890,7 +2936,7 @@ const ModDatePicker = ({ type = 'single', open, label, value, rangeValue, onChan
2890
2936
  ModDatePicker.displayName = 'ModDatePicker';
2891
2937
 
2892
2938
  const StyledDivider = styled(Divider)(() => ({
2893
- borderColor: semanticColors.border.secondary,
2939
+ borderColor: semanticColors.color.border.primary,
2894
2940
  marginTop: spacing.spacing_1,
2895
2941
  marginBottom: spacing.spacing_1,
2896
2942
  }));
@@ -2931,7 +2977,11 @@ const StyledDot = styled('span', {
2931
2977
  shouldForwardProp: prop => prop !== 'ownerState',
2932
2978
  })(({ ownerState }) => {
2933
2979
  const size = sizeMap[ownerState.size];
2934
- const palette = semanticColors.status[ownerState.color];
2980
+ // Computed member access — the phase-2 restructure's codemod (driven from
2981
+ // literal TOKEN_MAP paths) cannot reach this. Fixed by hand. See
2982
+ // docs/superpowers/plans/2026-08-05-semantic-restructure.md
2983
+ // "Dynamic access — the codemod cannot see these".
2984
+ const palette = semanticColors.color.status[ownerState.color];
2935
2985
  return {
2936
2986
  display: 'inline-flex',
2937
2987
  alignItems: 'center',
@@ -2942,10 +2992,10 @@ const StyledDot = styled('span', {
2942
2992
  borderRadius: '50%',
2943
2993
  flexShrink: 0,
2944
2994
  boxSizing: 'border-box',
2945
- backgroundColor: palette.default,
2946
- color: semanticColors.typography.tooltip.default,
2995
+ backgroundColor: palette.solid,
2996
+ color: semanticColors.color.text.tooltip,
2947
2997
  ...(ownerState.variant === 'outline' && {
2948
- border: `3px solid ${palette.light}`,
2998
+ border: `3px solid ${palette.bg}`,
2949
2999
  }),
2950
3000
  '& > svg': {
2951
3001
  width: '70%',
@@ -2964,9 +3014,9 @@ ModDot.displayName = 'ModDot';
2964
3014
  const StyledRoot$1 = styled(Paper)({
2965
3015
  padding: spacing.spacing_2,
2966
3016
  borderRadius: borderRadius.s,
2967
- backgroundColor: semanticColors.surfaces.card,
2968
- color: semanticColors.typography.body,
2969
- border: `1px solid ${semanticColors.border.primary}`,
3017
+ backgroundColor: semanticColors.color.surface.raised,
3018
+ color: semanticColors.color.text.primary,
3019
+ border: `1px solid ${semanticColors.color.border.primary}`,
2970
3020
  boxShadow: `${shadows.neutral.regular.x}px ${shadows.neutral.regular.y}px ${shadows.neutral.regular.blur}px ${shadows.neutral.regular.spread}px ${shadows.neutral.regular.shadow}`,
2971
3021
  display: 'flex',
2972
3022
  flexDirection: 'column',
@@ -2977,14 +3027,14 @@ const Title = styled('p')(({ theme }) => ({
2977
3027
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
2978
3028
  fontWeight: typography.fontWeight.semiBold,
2979
3029
  lineHeight: 1.4,
2980
- color: semanticColors.typography.bodySecondary,
3030
+ color: semanticColors.color.text.secondary,
2981
3031
  }));
2982
3032
  const FileName = styled('p')(({ theme }) => ({
2983
3033
  margin: 0,
2984
3034
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
2985
3035
  fontWeight: typography.fontWeight.medium,
2986
3036
  lineHeight: 1.5,
2987
- color: semanticColors.typography.body,
3037
+ color: semanticColors.color.text.primary,
2988
3038
  overflow: 'hidden',
2989
3039
  textOverflow: 'ellipsis',
2990
3040
  whiteSpace: 'nowrap',
@@ -2995,16 +3045,16 @@ const ProgressLabel$1 = styled('p')(({ theme }) => ({
2995
3045
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
2996
3046
  fontWeight: typography.fontWeight.medium,
2997
3047
  lineHeight: 1.5,
2998
- color: semanticColors.typography.body,
3048
+ color: semanticColors.color.text.primary,
2999
3049
  flexShrink: 0,
3000
3050
  }));
3001
3051
  const StyledLinearProgress$1 = styled(LinearProgress)({
3002
3052
  width: '100%',
3003
3053
  height: spacing.spacing_1,
3004
3054
  borderRadius: borderRadius.s,
3005
- backgroundColor: semanticColors.border.secondary,
3055
+ backgroundColor: semanticColors.color.border.primary,
3006
3056
  [`& .${linearProgressClasses.bar}`]: {
3007
- backgroundColor: semanticColors.buttons.primary.default,
3057
+ backgroundColor: semanticColors.button.primary.bg,
3008
3058
  borderRadius: `${borderRadius.xS}px 0 0 ${borderRadius.xS}px`,
3009
3059
  },
3010
3060
  });
@@ -3012,7 +3062,7 @@ const ActionButton = styled(IconButton)({
3012
3062
  padding: 0,
3013
3063
  width: spacing.spacing_2,
3014
3064
  height: spacing.spacing_2,
3015
- color: semanticColors.icons.utility,
3065
+ color: semanticColors.color.icon.utility,
3016
3066
  '&:hover': {
3017
3067
  backgroundColor: 'transparent',
3018
3068
  },
@@ -3044,50 +3094,50 @@ const ModDownloadToast = ({ title, fileName, progress, showClose = true, showPau
3044
3094
  ModDownloadToast.displayName = 'ModDownloadToast';
3045
3095
 
3046
3096
  const buildFilledIcon = ({ displayName, fillColor, body, knockout }) => {
3047
- const Component = (props) => (jsxs(SvgIcon, { viewBox: "0 0 16 16", ...props, children: [jsx("g", { fill: fillColor, children: body }), jsx("g", { stroke: semanticColors.surfaces.white, strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", children: knockout })] }));
3097
+ const Component = (props) => (jsxs(SvgIcon, { viewBox: "0 0 16 16", ...props, children: [jsx("g", { fill: fillColor, children: body }), jsx("g", { stroke: semanticColors.color.surface.raised, strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", children: knockout })] }));
3048
3098
  Component.displayName = displayName;
3049
3099
  return Component;
3050
3100
  };
3051
3101
  const CIRCLE_BODY = (jsx("path", { d: "M8.00001 14.6666C11.6819 14.6666 14.6667 11.6818 14.6667 7.99992C14.6667 4.31802 11.6819 1.33325 8.00001 1.33325C4.31811 1.33325 1.33334 4.31802 1.33334 7.99992C1.33334 11.6818 4.31811 14.6666 8.00001 14.6666Z" }));
3052
3102
  const ModFilledSuccess = buildFilledIcon({
3053
3103
  displayName: 'ModFilledSuccess',
3054
- fillColor: semanticColors.status.success.default,
3104
+ fillColor: semanticColors.color.status.success.solid,
3055
3105
  body: CIRCLE_BODY,
3056
3106
  knockout: jsx("path", { d: "M6 8.00008L7.33333 9.33341L10 6.66675" }),
3057
3107
  });
3058
3108
  const ModFilledQueued = buildFilledIcon({
3059
3109
  displayName: 'ModFilledQueued',
3060
- fillColor: semanticColors.status.active.default,
3110
+ fillColor: semanticColors.color.status.active.solid,
3061
3111
  body: CIRCLE_BODY,
3062
3112
  knockout: jsx("path", { d: "M8 4V8L10.6667 9.33333" }),
3063
3113
  });
3064
3114
  const ModFilledInfo = buildFilledIcon({
3065
3115
  displayName: 'ModFilledInfo',
3066
- fillColor: semanticColors.status.info.default,
3116
+ fillColor: semanticColors.color.status.info.solid,
3067
3117
  body: CIRCLE_BODY,
3068
3118
  knockout: (jsxs(Fragment, { children: [jsx("path", { d: "M8 10.6667V8" }), jsx("path", { d: "M8 5.33325H8.00667" })] })),
3069
3119
  });
3070
3120
  const ModFilledWarning = buildFilledIcon({
3071
3121
  displayName: 'ModFilledWarning',
3072
- fillColor: semanticColors.status.warning.default,
3122
+ fillColor: semanticColors.color.status.warning.solid,
3073
3123
  body: (jsx("path", { d: "M14.4867 12L9.15335 2.66665C9.03706 2.46146 8.86842 2.29078 8.66463 2.17203C8.46084 2.05329 8.22921 1.99072 7.99335 1.99072C7.75749 1.99072 7.52585 2.05329 7.32206 2.17203C7.11828 2.29078 6.94964 2.46146 6.83335 2.66665L1.50001 12C1.38247 12.2036 1.32083 12.4346 1.32135 12.6697C1.32187 12.9047 1.38453 13.1355 1.50298 13.3385C1.62142 13.5416 1.79145 13.7097 1.99581 13.8259C2.20018 13.942 2.43162 14.0021 2.66668 14H13.3333C13.5673 13.9997 13.797 13.938 13.9995 13.8208C14.202 13.7037 14.3702 13.5354 14.487 13.3327C14.6039 13.1301 14.6654 12.9002 14.6653 12.6663C14.6653 12.4324 14.6036 12.2026 14.4867 12Z" })),
3074
3124
  knockout: (jsxs(Fragment, { children: [jsx("path", { d: "M8 6V8.66667" }), jsx("path", { d: "M8 11.3333H8.00667" })] })),
3075
3125
  });
3076
3126
  const ModFilledError = buildFilledIcon({
3077
3127
  displayName: 'ModFilledError',
3078
- fillColor: semanticColors.status.error.default,
3128
+ fillColor: semanticColors.color.status.error.solid,
3079
3129
  body: (jsx("path", { d: "M10.208 1.33325C10.5616 1.33333 10.9007 1.47385 11.1507 1.72392L14.276 4.84925C14.5261 5.09924 14.6666 5.43832 14.6667 5.79192V10.2079C14.6666 10.5615 14.5261 10.9006 14.276 11.1506L11.1507 14.2759C10.9007 14.526 10.5616 14.6665 10.208 14.6666H5.79201C5.43842 14.6665 5.09933 14.526 4.84934 14.2759L1.72401 11.1506C1.47394 10.9006 1.33342 10.5615 1.33334 10.2079V5.79192C1.33342 5.43832 1.47394 5.09924 1.72401 4.84925L4.84934 1.72392C5.09933 1.47385 5.43842 1.33333 5.79201 1.33325H10.208Z" })),
3080
3130
  knockout: (jsxs(Fragment, { children: [jsx("path", { d: "M8 5.33325V7.99992" }), jsx("path", { d: "M8 10.6667H8.00667" })] })),
3081
3131
  });
3082
3132
  const ModFilledNeutral = buildFilledIcon({
3083
3133
  displayName: 'ModFilledNeutral',
3084
- fillColor: semanticColors.status.neutral.default,
3134
+ fillColor: semanticColors.color.status.neutral.solid,
3085
3135
  body: CIRCLE_BODY,
3086
3136
  knockout: jsx("path", { d: "M5.33334 8H10.6667" }),
3087
3137
  });
3088
3138
  const ModFilledCanceled = buildFilledIcon({
3089
3139
  displayName: 'ModFilledCanceled',
3090
- fillColor: semanticColors.status.canceled.default,
3140
+ fillColor: semanticColors.color.status.canceled.solid,
3091
3141
  body: CIRCLE_BODY,
3092
3142
  knockout: (jsxs(Fragment, { children: [jsx("path", { d: "M10 6L6 10" }), jsx("path", { d: "M6 6L10 10" })] })),
3093
3143
  });
@@ -3097,17 +3147,17 @@ const StyledChip$1 = styled(Chip, {
3097
3147
  shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
3098
3148
  })(({ theme, selected }) => ({
3099
3149
  borderRadius: borderRadius.full,
3100
- border: `1px solid ${semanticColors.buttons.secondary.defaultBorder}`,
3150
+ border: `1px solid ${semanticColors.button.secondary.border}`,
3101
3151
  backgroundColor: selected
3102
- ? semanticColors.buttons.secondary.pressedBackground
3103
- : semanticColors.surfaces.white,
3152
+ ? semanticColors.button.secondary.bgPressed
3153
+ : semanticColors.color.surface.raised,
3104
3154
  minHeight: 40,
3105
3155
  padding: `${spacing.spacing_3_4}px ${spacing.spacing_1_1_2}px`,
3106
3156
  gap: spacing.spacing_1,
3107
3157
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
3108
3158
  fontWeight: typography.fontWeight.medium,
3109
3159
  lineHeight: 1,
3110
- color: semanticColors.typography.body,
3160
+ color: semanticColors.color.text.primary,
3111
3161
  [`& .${chipClasses.label}`]: {
3112
3162
  padding: 0,
3113
3163
  overflow: 'visible',
@@ -3115,23 +3165,23 @@ const StyledChip$1 = styled(Chip, {
3115
3165
  alignItems: 'center',
3116
3166
  },
3117
3167
  [`& .${chipClasses.deleteIcon}`]: {
3118
- color: semanticColors.icons.default,
3168
+ color: semanticColors.color.icon.default,
3119
3169
  width: 24,
3120
3170
  height: 24,
3121
3171
  margin: 0,
3122
3172
  flexShrink: 0,
3123
3173
  '&:hover': {
3124
- color: semanticColors.icons.default,
3174
+ color: semanticColors.color.icon.default,
3125
3175
  },
3126
3176
  },
3127
3177
  '&:hover': {
3128
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
3178
+ backgroundColor: semanticColors.button.secondary.bgHover,
3129
3179
  },
3130
3180
  [`&.${chipClasses.focusVisible}`]: {
3131
3181
  ...focusRingStyles,
3132
3182
  backgroundColor: selected
3133
- ? semanticColors.buttons.secondary.pressedBackground
3134
- : semanticColors.surfaces.white,
3183
+ ? semanticColors.button.secondary.bgPressed
3184
+ : semanticColors.color.surface.raised,
3135
3185
  },
3136
3186
  }));
3137
3187
  const LabelContent = styled('span')({
@@ -3150,13 +3200,13 @@ const HeaderLabel = styled('span')(({ theme }) => ({
3150
3200
  fontSize: theme.typography.pxToRem(typography.fontSize.xxs),
3151
3201
  fontWeight: typography.fontWeight.regular,
3152
3202
  lineHeight: '120%',
3153
- color: semanticColors.typography.bodySecondary,
3203
+ color: semanticColors.color.text.secondary,
3154
3204
  }));
3155
3205
  const SelectedLabel = styled('span')(({ theme }) => ({
3156
3206
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
3157
3207
  fontWeight: typography.fontWeight.medium,
3158
3208
  lineHeight: 1,
3159
- color: semanticColors.buttons.secondary.default,
3209
+ color: semanticColors.button.secondary.fg,
3160
3210
  }));
3161
3211
  const CountBadge = styled('span')(({ theme }) => ({
3162
3212
  display: 'inline-flex',
@@ -3166,8 +3216,8 @@ const CountBadge = styled('span')(({ theme }) => ({
3166
3216
  height: 16,
3167
3217
  padding: `0 ${spacing.spacing_1_2}px`,
3168
3218
  borderRadius: borderRadius.full,
3169
- backgroundColor: semanticColors.brand,
3170
- color: semanticColors.surfaces.white,
3219
+ backgroundColor: semanticColors.color.action.brand,
3220
+ color: semanticColors.color.surface.raised,
3171
3221
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
3172
3222
  fontWeight: typography.fontWeight.medium,
3173
3223
  lineHeight: 1,
@@ -3211,7 +3261,7 @@ const SpinnerWrapper = styled('div')({
3211
3261
  * @example
3212
3262
  * <ModLoadingSpinner size={32} color="#ff0000" />
3213
3263
  */
3214
- const ModLoadingSpinner = ({ size = 24, color = semanticColors.buttons.primary.default, }) => {
3264
+ const ModLoadingSpinner = ({ size = 24, color = semanticColors.button.primary.bg, }) => {
3215
3265
  return (jsx(SpinnerWrapper, { style: { width: size, height: size }, children: jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("title", { children: "Loading Spinner" }), jsx("g", { opacity: "0.2", children: jsx("circle", { cx: "12", cy: "12", r: "10", stroke: color, strokeWidth: "2.1" }) }), jsx("path", { d: "M12 2C6.477 2 2 6.477 2 12", stroke: color, strokeWidth: "2.1", strokeLinecap: "round" })] }) }));
3216
3266
  };
3217
3267
  ModLoadingSpinner.displayName = 'ModLoadingSpinner';
@@ -3219,8 +3269,8 @@ ModLoadingSpinner.displayName = 'ModLoadingSpinner';
3219
3269
  const StyledFooter = styled(Box, {
3220
3270
  shouldForwardProp: prop => prop !== 'showShadow',
3221
3271
  })(({ theme, showShadow = false }) => ({
3222
- backgroundColor: semanticColors.surfaces.white,
3223
- borderTop: `1px solid ${semanticColors.border.primary}`,
3272
+ backgroundColor: semanticColors.color.surface.raised,
3273
+ borderTop: `1px solid ${semanticColors.color.border.primary}`,
3224
3274
  display: 'flex',
3225
3275
  alignItems: 'center',
3226
3276
  justifyContent: 'center',
@@ -3248,7 +3298,7 @@ const ResultText = styled('p')(({ theme }) => ({
3248
3298
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
3249
3299
  fontWeight: typography.fontWeight.regular,
3250
3300
  lineHeight: 1.5,
3251
- color: semanticColors.typography.body, // typography/body: #232342
3301
+ color: semanticColors.color.text.primary, // typography/body: #232342
3252
3302
  margin: 0,
3253
3303
  whiteSpace: 'pre',
3254
3304
  }));
@@ -3257,7 +3307,7 @@ const LoadMoreButton = styled('button')(({ theme }) => ({
3257
3307
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
3258
3308
  fontWeight: typography.fontWeight.regular,
3259
3309
  lineHeight: 'normal',
3260
- color: semanticColors.typography.link.primary,
3310
+ color: semanticColors.color.text.link,
3261
3311
  background: 'none',
3262
3312
  border: 'none',
3263
3313
  padding: 0,
@@ -3267,7 +3317,7 @@ const LoadMoreButton = styled('button')(({ theme }) => ({
3267
3317
  textDecoration: 'underline',
3268
3318
  },
3269
3319
  '&:disabled': {
3270
- color: semanticColors.typography.button.disabled,
3320
+ color: semanticColors.button.fgDisabled,
3271
3321
  cursor: 'not-allowed',
3272
3322
  },
3273
3323
  }));
@@ -3276,7 +3326,7 @@ const SelectedText = styled('p')(({ theme }) => ({
3276
3326
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
3277
3327
  fontWeight: typography.fontWeight.regular,
3278
3328
  lineHeight: 1.5,
3279
- color: semanticColors.typography.body,
3329
+ color: semanticColors.color.text.primary,
3280
3330
  margin: 0,
3281
3331
  whiteSpace: 'pre',
3282
3332
  }));
@@ -3290,15 +3340,15 @@ const PaginationButton = styled(IconButton)(({ disabled }) => ({
3290
3340
  width: spacing.spacing_5_1_2,
3291
3341
  height: spacing.spacing_5_1_2,
3292
3342
  padding: spacing.spacing_1,
3293
- backgroundColor: semanticColors.surfaces.white,
3343
+ backgroundColor: semanticColors.color.surface.raised,
3294
3344
  borderRadius: borderRadius.full,
3295
3345
  '&:hover': {
3296
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
3346
+ backgroundColor: semanticColors.button.secondary.bgHover,
3297
3347
  },
3298
3348
  '& svg': {
3299
3349
  width: 24,
3300
3350
  height: 24,
3301
- color: disabled ? semanticColors.icons.disabled : semanticColors.icons.default,
3351
+ color: disabled ? semanticColors.color.icon.disabled : semanticColors.color.icon.default,
3302
3352
  },
3303
3353
  }));
3304
3354
  const PaginationText = styled('p')(({ theme }) => ({
@@ -3306,7 +3356,7 @@ const PaginationText = styled('p')(({ theme }) => ({
3306
3356
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
3307
3357
  fontWeight: typography.fontWeight.regular,
3308
3358
  lineHeight: 1.5,
3309
- color: semanticColors.typography.body, // typography/body: #232342
3359
+ color: semanticColors.color.text.primary, // typography/body: #232342
3310
3360
  margin: 0,
3311
3361
  whiteSpace: 'pre',
3312
3362
  }));
@@ -3565,31 +3615,31 @@ const StyledFormControl = styled(FormControl, {
3565
3615
  width: '100%',
3566
3616
  };
3567
3617
  });
3568
- const StyledInputLabel = styled(InputLabel, {
3618
+ const StyledInputLabel = styled(MuiInputLabel, {
3569
3619
  shouldForwardProp: prop => prop !== 'size' && prop !== 'infoIcon',
3570
3620
  })(({ theme }) => ({
3571
3621
  position: 'static',
3572
3622
  transform: 'none',
3573
3623
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
3574
3624
  fontWeight: typography.fontWeight.medium,
3575
- color: semanticColors.typography.input.label,
3625
+ color: semanticColors.color.text.inputLabel,
3576
3626
  display: 'flex',
3577
3627
  alignItems: 'center',
3578
3628
  gap: spacing.spacing_1_4,
3579
3629
  [`&.${inputLabelClasses.focused}`]: {
3580
- color: semanticColors.typography.input.label,
3630
+ color: semanticColors.color.text.inputLabel,
3581
3631
  },
3582
3632
  [`&.${inputLabelClasses.disabled}`]: {
3583
- color: semanticColors.typography.button.disabled,
3633
+ color: semanticColors.button.fgDisabled,
3584
3634
  },
3585
3635
  [`&.${inputLabelClasses.error}`]: {
3586
- color: semanticColors.typography.input.label,
3636
+ color: semanticColors.color.text.inputLabel,
3587
3637
  },
3588
3638
  }));
3589
3639
  const InfoIconWrapper = styled('span')({
3590
3640
  display: 'inline-flex',
3591
3641
  alignItems: 'center',
3592
- color: semanticColors.icons.placeholder,
3642
+ color: semanticColors.color.icon.placeholder,
3593
3643
  });
3594
3644
  const StyledInputBase = styled(InputBase, {
3595
3645
  shouldForwardProp: prop => prop !== 'size' && prop !== 'destructive',
@@ -3613,50 +3663,52 @@ const StyledInputBase = styled(InputBase, {
3613
3663
  height: multiline ? 'auto' : sizeStyles.height,
3614
3664
  fontSize: sizeStyles.fontSize,
3615
3665
  borderRadius: sizeStyles.borderRadius,
3616
- backgroundColor: semanticColors.input.background,
3617
- border: `1px solid ${destructive ? semanticColors.status.error.default : semanticColors.border.primary}`,
3666
+ backgroundColor: semanticColors.input.bg,
3667
+ border: `1px solid ${destructive ? semanticColors.color.status.error.solid : semanticColors.color.border.primary}`,
3618
3668
  transition: theme.transitions.create(['border-color', 'background-color'], {
3619
3669
  duration: theme.transitions.duration.short,
3620
3670
  }),
3621
3671
  [`& .${inputBaseClasses.input}`]: {
3622
3672
  padding: sizeStyles.padding,
3623
- color: semanticColors.typography.input.default,
3673
+ color: semanticColors.color.text.input,
3624
3674
  // Tabular figures, no tracking — see Badge.tsx.
3625
3675
  fontVariantNumeric: 'tabular-nums',
3626
3676
  '&::placeholder': {
3627
- color: semanticColors.typography.input.placeholder,
3677
+ color: semanticColors.color.text.inputPlaceholder,
3628
3678
  },
3629
3679
  },
3630
3680
  // Hover state
3631
3681
  '&:hover': {
3632
- backgroundColor: semanticColors.input.hoverBackground,
3682
+ backgroundColor: semanticColors.input.bgHover,
3633
3683
  borderColor: destructive
3634
- ? semanticColors.status.error.default
3635
- : semanticColors.border.primary,
3684
+ ? semanticColors.color.status.error.solid
3685
+ : semanticColors.color.border.primary,
3636
3686
  },
3637
3687
  // Focused state
3638
3688
  [`&.${inputBaseClasses.focused}`]: {
3639
- backgroundColor: semanticColors.input.background,
3689
+ backgroundColor: semanticColors.input.bg,
3640
3690
  borderColor: destructive
3641
- ? semanticColors.status.error.default
3642
- : semanticColors.buttons.primary.default,
3691
+ ? semanticColors.color.status.error.solid
3692
+ : semanticColors.button.primary.bg,
3643
3693
  },
3644
3694
  // Disabled state
3645
3695
  [`&.${inputBaseClasses.disabled}`]: {
3646
- backgroundColor: semanticColors.input.disabledBackground,
3647
- borderColor: semanticColors.border.primary,
3648
- color: semanticColors.typography.button.disabled,
3696
+ backgroundColor: semanticColors.input.bgDisabled,
3697
+ borderColor: semanticColors.color.border.primary,
3698
+ color: semanticColors.button.fgDisabled,
3649
3699
  [`& .${inputBaseClasses.input}`]: {
3650
- WebkitTextFillColor: semanticColors.typography.button.disabled,
3700
+ WebkitTextFillColor: semanticColors.button.fgDisabled,
3651
3701
  },
3652
3702
  },
3653
3703
  // Error state
3654
3704
  [`&.${inputBaseClasses.error}`]: {
3655
- borderColor: semanticColors.status.error.default,
3705
+ borderColor: semanticColors.color.status.error.solid,
3656
3706
  },
3657
3707
  // Adornment styling
3658
3708
  [`& .${inputAdornmentClasses.root}`]: {
3659
- color: destructive ? semanticColors.status.error.default : semanticColors.icons.placeholder,
3709
+ color: destructive
3710
+ ? semanticColors.color.status.error.solid
3711
+ : semanticColors.color.icon.placeholder,
3660
3712
  },
3661
3713
  };
3662
3714
  });
@@ -3668,12 +3720,12 @@ const StyledFormHelperText = styled(FormHelperText, {
3668
3720
  marginRight: 0,
3669
3721
  // Figma specifies 14px for helper text
3670
3722
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
3671
- color: semanticColors.typography.input.helper,
3723
+ color: semanticColors.color.text.inputHelper,
3672
3724
  [`&.${formHelperTextClasses.error}`]: {
3673
- color: semanticColors.status.error.default,
3725
+ color: semanticColors.color.status.error.solid,
3674
3726
  },
3675
3727
  [`&.${formHelperTextClasses.disabled}`]: {
3676
- color: semanticColors.typography.button.disabled,
3728
+ color: semanticColors.button.fgDisabled,
3677
3729
  },
3678
3730
  };
3679
3731
  });
@@ -3781,7 +3833,7 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3781
3833
  paddingBottom: config.paddingBottom,
3782
3834
  paddingLeft: config.paddingLeft,
3783
3835
  borderRadius: spacing.spacing_3_4, // 6px
3784
- backgroundColor: semanticColors.input.background,
3836
+ backgroundColor: semanticColors.input.bg,
3785
3837
  gap: config.gap,
3786
3838
  // Icon is always centered vertically per Figma design
3787
3839
  alignItems: 'center',
@@ -3793,7 +3845,7 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3793
3845
  minWidth: config.iconSize, // Override MUI's default 56px
3794
3846
  width: config.iconSize,
3795
3847
  height: config.iconSize,
3796
- color: semanticColors.icons.placeholder,
3848
+ color: semanticColors.color.icon.placeholder,
3797
3849
  transition: theme.transitions.create(['color'], {
3798
3850
  duration: theme.transitions.duration.short,
3799
3851
  }),
@@ -3810,9 +3862,7 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3810
3862
  : size === 'small' || size === 'medium'
3811
3863
  ? typography.fontWeight.regular
3812
3864
  : typography.fontWeight.medium,
3813
- color: isLink
3814
- ? semanticColors.typography.link.primary
3815
- : semanticColors.typography.navigation.default,
3865
+ color: isLink ? semanticColors.color.text.link : semanticColors.color.text.nav,
3816
3866
  overflow: 'hidden',
3817
3867
  textOverflow: 'ellipsis',
3818
3868
  whiteSpace: 'nowrap',
@@ -3832,14 +3882,14 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3832
3882
  : 12),
3833
3883
  lineHeight: 1.5,
3834
3884
  fontWeight: typography.fontWeight.regular,
3835
- color: semanticColors.typography.bodySecondary,
3885
+ color: semanticColors.color.text.secondary,
3836
3886
  },
3837
3887
  // Secondary text styling - wraps with word break
3838
3888
  '& .list-item-secondary': {
3839
3889
  fontSize: theme.typography.pxToRem('secondaryFontSize' in config ? config.secondaryFontSize : config.fontSize),
3840
3890
  lineHeight: size === 'large' ? 1.5 : 1.4,
3841
3891
  fontWeight: typography.fontWeight.regular,
3842
- color: semanticColors.typography.bodySecondary,
3892
+ color: semanticColors.color.text.secondary,
3843
3893
  wordBreak: 'break-word',
3844
3894
  whiteSpace: 'normal',
3845
3895
  ...(size === 'large' && {
@@ -3852,29 +3902,29 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3852
3902
  alignItems: 'center',
3853
3903
  flexShrink: 0,
3854
3904
  marginLeft: spacing.spacing_1,
3855
- color: semanticColors.icons.default,
3905
+ color: semanticColors.color.icon.default,
3856
3906
  },
3857
3907
  // Hover state
3858
3908
  '&:hover': {
3859
- backgroundColor: semanticColors.input.background,
3909
+ backgroundColor: semanticColors.input.bg,
3860
3910
  },
3861
3911
  // Selected/Active state
3862
3912
  // Font weights per Figma:
3863
3913
  // - Primary: small/medium/xxlarge use 500, large/xlarge use 600
3864
3914
  // - Secondary: large/xlarge use 500, xxlarge uses 400
3865
3915
  [`&.${listItemButtonClasses.selected}`]: {
3866
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
3916
+ backgroundColor: semanticColors.button.secondary.bgHover,
3867
3917
  '&:hover': {
3868
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
3918
+ backgroundColor: semanticColors.button.secondary.bgHover,
3869
3919
  },
3870
3920
  [`& .${listItemIconClasses.root}`]: {
3871
- color: semanticColors.icons.pressed,
3921
+ color: semanticColors.color.icon.pressed,
3872
3922
  },
3873
3923
  '& .list-item-primary': {
3874
3924
  fontWeight: size === 'large' || size === 'xlarge'
3875
3925
  ? typography.fontWeight.semiBold
3876
3926
  : typography.fontWeight.medium,
3877
- color: semanticColors.typography.navigation.default,
3927
+ color: semanticColors.color.text.nav,
3878
3928
  },
3879
3929
  '& .list-item-secondary': {
3880
3930
  fontWeight: size === 'large' || size === 'xlarge'
@@ -3884,22 +3934,22 @@ const StyledListItemButton$1 = styled(ListItemButton, {
3884
3934
  },
3885
3935
  // Disabled state
3886
3936
  [`&.${listItemButtonClasses.disabled}`]: {
3887
- backgroundColor: semanticColors.input.disabledBackground,
3937
+ backgroundColor: semanticColors.input.bgDisabled,
3888
3938
  opacity: 1,
3889
3939
  [`& .${listItemIconClasses.root}`]: {
3890
- color: semanticColors.icons.disabled,
3940
+ color: semanticColors.color.icon.disabled,
3891
3941
  },
3892
3942
  '& .list-item-primary': {
3893
- color: semanticColors.buttons.tertiary.disabled,
3943
+ color: semanticColors.button.tertiary.fgDisabled,
3894
3944
  },
3895
3945
  '& .list-item-secondary': {
3896
- color: semanticColors.buttons.tertiary.disabled,
3946
+ color: semanticColors.button.tertiary.fgDisabled,
3897
3947
  },
3898
3948
  '& .list-item-badge': {
3899
- color: semanticColors.buttons.tertiary.disabled,
3949
+ color: semanticColors.button.tertiary.fgDisabled,
3900
3950
  },
3901
3951
  '& .list-item-trailing': {
3902
- color: semanticColors.icons.disabled,
3952
+ color: semanticColors.color.icon.disabled,
3903
3953
  },
3904
3954
  },
3905
3955
  };
@@ -3954,28 +4004,28 @@ function navVariantStyles(theme) {
3954
4004
  paddingLeft: spacing.spacing_2,
3955
4005
  paddingRight: spacing.spacing_2,
3956
4006
  border: 'none',
3957
- color: semanticColors.typography.bodySecondary,
4007
+ color: semanticColors.color.text.secondary,
3958
4008
  backgroundColor: 'transparent',
3959
4009
  transition: theme.transitions.create(['background-color', 'color']),
3960
4010
  [`&.${listItemButtonClasses.selected}`]: {
3961
- backgroundColor: semanticColors.surfaces.activeHighlight,
3962
- color: semanticColors.typography.body,
4011
+ backgroundColor: semanticColors.color.surface.highlightActive,
4012
+ color: semanticColors.color.text.primary,
3963
4013
  '&:hover': {
3964
- backgroundColor: semanticColors.surfaces.activeHighlight,
4014
+ backgroundColor: semanticColors.color.surface.highlightActive,
3965
4015
  },
3966
4016
  },
3967
4017
  [`&:not(.${listItemButtonClasses.selected}):not(.${listItemButtonClasses.disabled})`]: {
3968
4018
  '&:hover': {
3969
- backgroundColor: semanticColors.surfaces.listHover,
3970
- color: semanticColors.typography.body,
4019
+ backgroundColor: semanticColors.color.surface.rowHover,
4020
+ color: semanticColors.color.text.primary,
3971
4021
  },
3972
4022
  },
3973
4023
  [`&.${listItemButtonClasses.focusVisible}`]: {
3974
- outline: `2px solid ${semanticColors.border.focus}`,
4024
+ outline: `2px solid ${semanticColors.color.border.focus}`,
3975
4025
  outlineOffset: -2,
3976
4026
  },
3977
4027
  [`&.${listItemButtonClasses.disabled}`]: {
3978
- color: semanticColors.typography.button.disabled,
4028
+ color: semanticColors.button.fgDisabled,
3979
4029
  opacity: 1,
3980
4030
  },
3981
4031
  };
@@ -3990,71 +4040,71 @@ function cardVariantStyles(theme) {
3990
4040
  paddingBottom: spacing.spacing_1,
3991
4041
  paddingLeft: spacing.spacing_3_4,
3992
4042
  paddingRight: spacing.spacing_3_4,
3993
- border: `1px solid ${semanticColors.border.primary}`,
3994
- backgroundColor: semanticColors.surfaces.white,
4043
+ border: `1px solid ${semanticColors.color.border.primary}`,
4044
+ backgroundColor: semanticColors.color.surface.raised,
3995
4045
  transition: theme.transitions.create(['border', 'background-color']),
3996
4046
  // Active (selected) state
3997
4047
  [`&.${listItemButtonClasses.selected}`]: {
3998
- border: `2px solid ${semanticColors.buttons.primary.default}`,
3999
- backgroundColor: semanticColors.surfaces.white,
4048
+ border: `2px solid ${semanticColors.button.primary.bg}`,
4049
+ backgroundColor: semanticColors.color.surface.raised,
4000
4050
  '&:hover': {
4001
- backgroundColor: semanticColors.surfaces.white,
4051
+ backgroundColor: semanticColors.color.surface.raised,
4002
4052
  },
4003
4053
  // Icon color in selected state
4004
4054
  [`& .${listItemIconClasses.root}`]: {
4005
- color: semanticColors.icons.default,
4055
+ color: semanticColors.color.icon.default,
4006
4056
  },
4007
4057
  // Text colors in selected state
4008
4058
  [`& .${listItemTextClasses.primary}`]: {
4009
- color: semanticColors.typography.body,
4059
+ color: semanticColors.color.text.primary,
4010
4060
  },
4011
4061
  [`& .${listItemTextClasses.secondary}`]: {
4012
- color: semanticColors.typography.bodySecondary,
4062
+ color: semanticColors.color.text.secondary,
4013
4063
  },
4014
4064
  },
4015
4065
  // Deselected (default) state
4016
4066
  [`&:not(.${listItemButtonClasses.selected}):not(.${listItemButtonClasses.disabled})`]: {
4017
4067
  '&:hover': {
4018
- backgroundColor: semanticColors.surfaces.listHover,
4068
+ backgroundColor: semanticColors.color.surface.rowHover,
4019
4069
  },
4020
4070
  [`& .${listItemIconClasses.root}`]: {
4021
- color: semanticColors.icons.disabled,
4071
+ color: semanticColors.color.icon.disabled,
4022
4072
  },
4023
4073
  [`& .${listItemTextClasses.primary}`]: {
4024
- color: semanticColors.buttons.tertiary.disabled,
4074
+ color: semanticColors.button.tertiary.fgDisabled,
4025
4075
  },
4026
4076
  [`& .${listItemTextClasses.secondary}`]: {
4027
- color: semanticColors.typography.button.disabled,
4077
+ color: semanticColors.button.fgDisabled,
4028
4078
  },
4029
4079
  },
4030
4080
  // Focus state
4031
4081
  [`&.${listItemButtonClasses.focusVisible}`]: {
4032
- outline: `2px solid ${semanticColors.buttons.primary.default}`,
4082
+ outline: `2px solid ${semanticColors.button.primary.bg}`,
4033
4083
  outlineOffset: 2,
4034
- border: `2px solid ${semanticColors.buttons.primary.default}`,
4035
- backgroundColor: semanticColors.surfaces.white,
4084
+ border: `2px solid ${semanticColors.button.primary.bg}`,
4085
+ backgroundColor: semanticColors.color.surface.raised,
4036
4086
  [`& .${listItemIconClasses.root}`]: {
4037
- color: semanticColors.icons.default,
4087
+ color: semanticColors.color.icon.default,
4038
4088
  },
4039
4089
  [`& .${listItemTextClasses.primary}`]: {
4040
- color: semanticColors.typography.body,
4090
+ color: semanticColors.color.text.primary,
4041
4091
  },
4042
4092
  [`& .${listItemTextClasses.secondary}`]: {
4043
- color: semanticColors.typography.bodySecondary,
4093
+ color: semanticColors.color.text.secondary,
4044
4094
  },
4045
4095
  },
4046
4096
  // Disabled state
4047
4097
  [`&.${listItemButtonClasses.disabled}`]: {
4048
- backgroundColor: semanticColors.surface.sunken,
4098
+ backgroundColor: semanticColors.color.surface.sunken,
4049
4099
  opacity: 1, // Override MUI default opacity
4050
4100
  [`& .${listItemIconClasses.root}`]: {
4051
- color: semanticColors.icons.disabled,
4101
+ color: semanticColors.color.icon.disabled,
4052
4102
  },
4053
4103
  [`& .${listItemTextClasses.primary}`]: {
4054
- color: semanticColors.typography.button.disabled,
4104
+ color: semanticColors.button.fgDisabled,
4055
4105
  },
4056
4106
  [`& .${listItemTextClasses.secondary}`]: {
4057
- color: semanticColors.typography.button.disabled,
4107
+ color: semanticColors.button.fgDisabled,
4058
4108
  },
4059
4109
  },
4060
4110
  };
@@ -4099,9 +4149,9 @@ ModListItemButton.displayName = 'ModListItemButton';
4099
4149
 
4100
4150
  const StyledMenu = styled(Menu)(() => ({
4101
4151
  [`& .${paperClasses.root}`]: {
4102
- backgroundColor: semanticColors.surfaces.white,
4152
+ backgroundColor: semanticColors.color.surface.raised,
4103
4153
  borderRadius: borderRadius.s,
4104
- border: `1px solid ${semanticColors.border.primary}`,
4154
+ border: `1px solid ${semanticColors.color.border.primary}`,
4105
4155
  boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
4106
4156
  marginTop: spacing.spacing_1,
4107
4157
  paddingTop: spacing.spacing_1,
@@ -4157,8 +4207,8 @@ const StyledCell$1 = styled('div', {
4157
4207
  paddingTop: spacing.spacing_1_2, // 4px — input-vertical
4158
4208
  paddingBottom: spacing.spacing_1_2,
4159
4209
  backgroundColor: disabled
4160
- ? semanticColors.surfaces.dataGrid.disabled
4161
- : semanticColors.surfaces.dataGrid.default,
4210
+ ? semanticColors.color.surface.dataGrid.disabled
4211
+ : semanticColors.color.surface.dataGrid.default,
4162
4212
  boxSizing: 'border-box',
4163
4213
  }));
4164
4214
  const LabelText = styled('span', {
@@ -4171,7 +4221,7 @@ const LabelText = styled('span', {
4171
4221
  fontSize: typography.fontSize.xs,
4172
4222
  fontWeight: typography.fontWeight.regular,
4173
4223
  lineHeight: 1.5,
4174
- color: disabled ? semanticColors.typography.bodySecondary : semanticColors.typography.body,
4224
+ color: disabled ? semanticColors.color.text.secondary : semanticColors.color.text.primary,
4175
4225
  }));
4176
4226
  /**
4177
4227
  * ModAvatarCell — DataGrid cell displaying a user avatar with optional label.
@@ -4189,9 +4239,9 @@ ModAvatarCell.displayName = 'ModAvatarCell';
4189
4239
  // ============================================================================
4190
4240
  const StyledDialog = styled(Dialog)({
4191
4241
  [`& .${dialogClasses.paper}`]: {
4192
- backgroundColor: semanticColors.surfaces.white,
4242
+ backgroundColor: semanticColors.color.surface.raised,
4193
4243
  borderRadius: borderRadius.card,
4194
- border: `1px solid ${semanticColors.border.primary}`,
4244
+ border: `1px solid ${semanticColors.color.border.primary}`,
4195
4245
  boxShadow: 'none',
4196
4246
  },
4197
4247
  [`& .${dialogClasses.container}`]: {
@@ -4251,7 +4301,7 @@ const ModalHeaderTitle = styled('h2')(({ theme }) => ({
4251
4301
  fontWeight: typography.fontWeight.medium,
4252
4302
  fontSize: theme.typography.pxToRem(typography.fontSize.h3),
4253
4303
  lineHeight: 1.4,
4254
- color: semanticColors.typography.navigation.default,
4304
+ color: semanticColors.color.text.nav,
4255
4305
  }));
4256
4306
  const modalHeaderTitleLinkStyles = {
4257
4307
  margin: 0,
@@ -4259,10 +4309,10 @@ const modalHeaderTitleLinkStyles = {
4259
4309
  fontWeight: typography.fontWeight.medium,
4260
4310
  fontSize: typography.fontSize.h3,
4261
4311
  lineHeight: 1.4,
4262
- color: semanticColors.typography.link.primary,
4312
+ color: semanticColors.color.text.link,
4263
4313
  textDecoration: 'none',
4264
4314
  '&:hover': {
4265
- color: semanticColors.buttons.tertiary.hover,
4315
+ color: semanticColors.button.tertiary.fgHover,
4266
4316
  textDecoration: 'underline',
4267
4317
  },
4268
4318
  };
@@ -4272,10 +4322,10 @@ const ModalHeaderSubtitle = styled('p')(({ theme }) => ({
4272
4322
  fontWeight: typography.fontWeight.regular,
4273
4323
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
4274
4324
  lineHeight: 1.4,
4275
- color: semanticColors.typography.bodySecondary,
4325
+ color: semanticColors.color.text.secondary,
4276
4326
  }));
4277
4327
  const StyledCloseButton = styled(IconButton)({
4278
- color: semanticColors.icons.utility,
4328
+ color: semanticColors.color.icon.utility,
4279
4329
  paddingTop: 0,
4280
4330
  paddingRight: 0,
4281
4331
  paddingBottom: 0,
@@ -4285,7 +4335,7 @@ const StyledCloseButton = styled(IconButton)({
4285
4335
  flexShrink: 0,
4286
4336
  '&:hover': {
4287
4337
  backgroundColor: 'transparent',
4288
- color: semanticColors.icons.utility,
4338
+ color: semanticColors.color.icon.utility,
4289
4339
  },
4290
4340
  });
4291
4341
  /**
@@ -4319,7 +4369,7 @@ const StyledDialogContent = styled(DialogContent)(({ theme }) => ({
4319
4369
  fontWeight: typography.fontWeight.regular,
4320
4370
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
4321
4371
  lineHeight: 1.5,
4322
- color: semanticColors.typography.navigation.default,
4372
+ color: semanticColors.color.text.nav,
4323
4373
  [`&.${dialogContentClasses.root}`]: {
4324
4374
  paddingTop: 0,
4325
4375
  paddingRight: spacing.spacing_4,
@@ -4374,7 +4424,7 @@ const CellRoot = styled('div', {
4374
4424
  justifyContent: 'center',
4375
4425
  width: '100%',
4376
4426
  height: '100%',
4377
- color: disabled ? semanticColors.icons.disabled : semanticColors.icons.default,
4427
+ color: disabled ? semanticColors.color.icon.disabled : semanticColors.color.icon.default,
4378
4428
  }));
4379
4429
  /**
4380
4430
  * ModIconCell — Icon cell for DataGrid. Renders an icon centered in the cell.
@@ -4397,8 +4447,8 @@ const CellWrapper = styled('div', {
4397
4447
  paddingLeft: spacing.spacing_1,
4398
4448
  paddingRight: spacing.spacing_1,
4399
4449
  backgroundColor: disabled
4400
- ? semanticColors.surfaces.dataGrid.disabled
4401
- : semanticColors.surfaces.dataGrid.default,
4450
+ ? semanticColors.color.surface.dataGrid.disabled
4451
+ : semanticColors.color.surface.dataGrid.default,
4402
4452
  '& img': {
4403
4453
  display: 'block',
4404
4454
  maxHeight: 32,
@@ -4436,13 +4486,13 @@ const StyledLinearProgress = styled(LinearProgress, {
4436
4486
  [`&.${linearProgressClasses.colorPrimary}`]: {
4437
4487
  backgroundColor: semanticColors.progress.track,
4438
4488
  [`& .${linearProgressClasses.bar}`]: {
4439
- backgroundColor: semanticColors.status.active.default,
4489
+ backgroundColor: semanticColors.color.status.active.solid,
4440
4490
  },
4441
4491
  },
4442
4492
  // Cancelled variant uses warning color
4443
4493
  '&[data-variant="cancelled"]': {
4444
4494
  [`& .${linearProgressClasses.bar}`]: {
4445
- backgroundColor: semanticColors.status.warning.default,
4495
+ backgroundColor: semanticColors.color.status.warning.solid,
4446
4496
  },
4447
4497
  },
4448
4498
  }));
@@ -4471,7 +4521,7 @@ const ProgressWrapper = styled('div')(({ labelPosition }) => ({
4471
4521
  const ProgressLabel = styled(Typography)(({ theme }) => ({
4472
4522
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
4473
4523
  fontWeight: typography.fontWeight.medium,
4474
- color: semanticColors.typography.body,
4524
+ color: semanticColors.color.text.primary,
4475
4525
  lineHeight: 1.4,
4476
4526
  whiteSpace: 'nowrap',
4477
4527
  flexShrink: 0,
@@ -4505,8 +4555,8 @@ const StyledCell = styled('div', {
4505
4555
  paddingLeft: spacing.spacing_1_1_2, // 12px input-horizontal
4506
4556
  paddingRight: spacing.spacing_1_1_2,
4507
4557
  backgroundColor: disabled
4508
- ? semanticColors.surfaces.dataGrid.disabled
4509
- : semanticColors.surfaces.dataGrid.default,
4558
+ ? semanticColors.color.surface.dataGrid.disabled
4559
+ : semanticColors.color.surface.dataGrid.default,
4510
4560
  boxSizing: 'border-box',
4511
4561
  }));
4512
4562
  /**
@@ -4518,10 +4568,14 @@ const ModProgressCell = ({ value = 0, disabled = false, empty = false, }) => {
4518
4568
  };
4519
4569
  ModProgressCell.displayName = 'ModProgressCell';
4520
4570
 
4571
+ // semanticColors.status[variant] is a computed member access, so the phase-2
4572
+ // token restructure's codemod (driven from literal TOKEN_MAP paths) cannot
4573
+ // reach it — fixed by hand. See docs/superpowers/plans/2026-08-05-semantic-restructure.md
4574
+ // "Dynamic access — the codemod cannot see these".
4521
4575
  const variantColors = (variant) => ({
4522
- bg: semanticColors.status[variant].light,
4523
- fg: semanticColors.status[variant].dark,
4524
- border: semanticColors.status[variant].transparent,
4576
+ bg: semanticColors.color.status[variant].bg,
4577
+ fg: semanticColors.color.status[variant].fg,
4578
+ border: semanticColors.color.status[variant].tint,
4525
4579
  });
4526
4580
  const StyledChip = styled('div', {
4527
4581
  shouldForwardProp: prop => prop !== 'disabled' && prop !== 'variant',
@@ -4536,9 +4590,9 @@ const StyledChip = styled('div', {
4536
4590
  paddingLeft: spacing.spacing_1_1_2,
4537
4591
  paddingRight: spacing.spacing_1_1_2,
4538
4592
  borderRadius: borderRadius.full,
4539
- border: `1px solid ${disabled ? semanticColors.border.secondary : colors.border}`,
4540
- backgroundColor: disabled ? semanticColors.surfaces.dataGrid.disabled : colors.bg,
4541
- color: disabled ? semanticColors.icons.disabled : colors.fg,
4593
+ border: `1px solid ${disabled ? semanticColors.color.border.primary : colors.border}`,
4594
+ backgroundColor: disabled ? semanticColors.color.surface.dataGrid.disabled : colors.bg,
4595
+ color: disabled ? semanticColors.color.icon.disabled : colors.fg,
4542
4596
  fontFamily: typography.fontFamily.body,
4543
4597
  fontSize: typography.fontSize.xs,
4544
4598
  fontWeight: typography.fontWeight.medium,
@@ -4563,7 +4617,7 @@ const TooltipErrorPre = styled('pre')({
4563
4617
  fontSize: typography.fontSize.sm,
4564
4618
  fontWeight: typography.fontWeight.regular,
4565
4619
  lineHeight: 1.5,
4566
- color: semanticColors.typography.tooltip.default,
4620
+ color: semanticColors.color.text.tooltip,
4567
4621
  whiteSpace: 'pre-wrap',
4568
4622
  wordBreak: 'break-all',
4569
4623
  maxHeight: 200,
@@ -4571,12 +4625,12 @@ const TooltipErrorPre = styled('pre')({
4571
4625
  });
4572
4626
  const StyledTooltip$1 = styled(Tooltip)({
4573
4627
  [`& .${tooltipClasses.tooltip}`]: {
4574
- backgroundColor: semanticColors.surfaces.tooltip,
4628
+ backgroundColor: semanticColors.color.surface.tooltip,
4575
4629
  maxWidth: 400,
4576
4630
  padding: `${spacing.spacing_1}px ${spacing.spacing_1_1_2}px`,
4577
4631
  },
4578
4632
  [`& .${tooltipClasses.arrow}`]: {
4579
- color: semanticColors.surfaces.tooltip,
4633
+ color: semanticColors.color.surface.tooltip,
4580
4634
  },
4581
4635
  });
4582
4636
  /**
@@ -4585,7 +4639,7 @@ const StyledTooltip$1 = styled(Tooltip)({
4585
4639
  const ModStatusCell = ({ icon, label, details, disabled = false, variant = 'success', empty = false, }) => {
4586
4640
  if (empty) {
4587
4641
  return (jsx(Box, { component: "span", sx: {
4588
- color: semanticColors.typography.body,
4642
+ color: semanticColors.color.text.primary,
4589
4643
  fontSize: typography.fontSize.sm,
4590
4644
  lineHeight: 1,
4591
4645
  }, children: '—' }));
@@ -4606,10 +4660,10 @@ const NavigationAvatarContainer = styled('div')({
4606
4660
  justifyContent: 'center',
4607
4661
  alignItems: 'center',
4608
4662
  borderRadius: '50%',
4609
- border: `1px solid ${semanticColors.border.secondary}`,
4610
- backgroundColor: semanticColors.buttons.secondary.defaultBackground,
4663
+ border: `1px solid ${semanticColors.color.border.primary}`,
4664
+ backgroundColor: semanticColors.button.secondary.bg,
4611
4665
  '&:focus-within': {
4612
- borderColor: semanticColors.border.focus,
4666
+ borderColor: semanticColors.color.border.focus,
4613
4667
  },
4614
4668
  });
4615
4669
  /**
@@ -4633,19 +4687,19 @@ const useModSideNav = () => useContext(ModSideNavContext);
4633
4687
  */
4634
4688
  const variantConfig = {
4635
4689
  light: {
4636
- backgroundColor: semanticColors.surfaces.tooltip, // #4b5563 - medium gray
4637
- color: semanticColors.typography.tooltip.default, // #ffffff - white
4690
+ backgroundColor: semanticColors.color.surface.tooltip, // #4b5563 - medium gray
4691
+ color: semanticColors.color.text.tooltip, // #ffffff - white
4638
4692
  },
4639
4693
  dark: {
4640
- backgroundColor: semanticColors.surfaces.white,
4641
- color: semanticColors.typography.body,
4694
+ backgroundColor: semanticColors.color.surface.raised,
4695
+ color: semanticColors.color.text.primary,
4642
4696
  },
4643
4697
  brand: {
4644
4698
  // snackbarBrand is one of the few tokens Figma fixes across both modes, so
4645
4699
  // its foreground must be fixed too. typography.tooltip.default flips
4646
4700
  // (#ffffff -> #232342), which would put dark navy on dark blue in dark mode.
4647
- backgroundColor: semanticColors.surfaces.snackbarBrand,
4648
- color: semanticColors.typography.linkWhite,
4701
+ backgroundColor: semanticColors.color.surface.snackbarBrand,
4702
+ color: semanticColors.color.text.linkOnDark,
4649
4703
  },
4650
4704
  };
4651
4705
  /**
@@ -4729,11 +4783,11 @@ const StyledRoot = styled(ButtonBase, {
4729
4783
  cursor: 'pointer',
4730
4784
  textDecoration: 'none',
4731
4785
  '&:hover .mod-nav-icon-padding': {
4732
- backgroundColor: semanticColors.accent.tint,
4733
- borderColor: semanticColors.accent.border,
4786
+ backgroundColor: semanticColors.color.action.tint,
4787
+ borderColor: semanticColors.color.action.border,
4734
4788
  },
4735
4789
  '&:hover .mod-nav-label': {
4736
- color: semanticColors.text.primary,
4790
+ color: semanticColors.color.text.primary,
4737
4791
  fontWeight: typography.fontWeight.semiBold,
4738
4792
  },
4739
4793
  [`& .${chipClasses.root}`]: {
@@ -4744,16 +4798,16 @@ const StyledRoot = styled(ButtonBase, {
4744
4798
  },
4745
4799
  ...(selected && {
4746
4800
  '& .mod-nav-icon-padding': {
4747
- backgroundColor: semanticColors.accent.tint,
4748
- borderColor: semanticColors.accent.border,
4749
- color: semanticColors.accent.deep,
4801
+ backgroundColor: semanticColors.color.action.tint,
4802
+ borderColor: semanticColors.color.action.border,
4803
+ color: semanticColors.color.action.navy,
4750
4804
  },
4751
4805
  '& .mod-nav-label': {
4752
- color: semanticColors.accent.deep,
4806
+ color: semanticColors.color.action.navy,
4753
4807
  fontWeight: typography.fontWeight.semiBold,
4754
4808
  },
4755
4809
  '&:hover .mod-nav-label': {
4756
- color: semanticColors.accent.deep,
4810
+ color: semanticColors.color.action.navy,
4757
4811
  },
4758
4812
  }),
4759
4813
  }));
@@ -4763,7 +4817,7 @@ const IconPadding = styled('span')({
4763
4817
  padding: spacing.spacing_1, // 8px
4764
4818
  borderRadius: borderRadius.xS, // 4px
4765
4819
  border: '1px solid transparent',
4766
- color: semanticColors.icons.default,
4820
+ color: semanticColors.color.icon.default,
4767
4821
  transition: 'background-color 150ms, border-color 150ms, color 150ms',
4768
4822
  });
4769
4823
  const navLabel = semanticTypography.navigationLabel.default;
@@ -4773,7 +4827,7 @@ const Label$2 = styled('span')(({ theme }) => ({
4773
4827
  fontSize: theme.typography.pxToRem(navLabel.fontSize),
4774
4828
  lineHeight: navLabel.lineHeight,
4775
4829
  textAlign: 'center',
4776
- color: semanticColors.text.primary,
4830
+ color: semanticColors.color.text.primary,
4777
4831
  width: '100%',
4778
4832
  transition: 'color 150ms',
4779
4833
  }));
@@ -4800,7 +4854,7 @@ const StickyHeader = styled(Box)(({ theme }) => ({
4800
4854
  position: 'sticky',
4801
4855
  top: 0,
4802
4856
  zIndex: theme.zIndex.appBar,
4803
- backgroundColor: semanticColors.surface.canvasContent,
4857
+ backgroundColor: semanticColors.color.surface.canvas,
4804
4858
  flexShrink: 0,
4805
4859
  }));
4806
4860
  /**
@@ -4809,14 +4863,14 @@ const StickyHeader = styled(Box)(({ theme }) => ({
4809
4863
  const PageTitle = styled(Typography)(() => ({
4810
4864
  ...semanticTypography.titles.pageHeader,
4811
4865
  lineHeight: 1.4,
4812
- color: semanticColors.typography.body,
4866
+ color: semanticColors.color.text.primary,
4813
4867
  }));
4814
4868
  /**
4815
4869
  * Subtitle typography
4816
4870
  */
4817
4871
  const Subtitle = styled(Typography)(() => ({
4818
4872
  fontSize: typography.fontSize.sm,
4819
- color: semanticColors.typography.bodySecondary,
4873
+ color: semanticColors.color.text.secondary,
4820
4874
  }));
4821
4875
  /**
4822
4876
  * ModPageContent - Page content surface from the Moderne Design System
@@ -4911,8 +4965,8 @@ function ModPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
4911
4965
  minHeight: '50vh',
4912
4966
  }, children: jsx(ModLoadingSpinner, {}) })) : (children);
4913
4967
  return (jsxs(Fragment, { children: [jsx(Box, { sx: {
4914
- backgroundColor: semanticColors.surface.canvasContent,
4915
- border: `1px solid ${semanticColors.border.primary}`,
4968
+ backgroundColor: semanticColors.color.surface.canvas,
4969
+ border: `1px solid ${semanticColors.color.border.primary}`,
4916
4970
  borderRadius: `${borderRadius.input}px`,
4917
4971
  height: '100%',
4918
4972
  display: 'flex',
@@ -4955,10 +5009,10 @@ function ModPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
4955
5009
  right: spacing.spacing_4,
4956
5010
  zIndex: 1000,
4957
5011
  }, children: jsx(Fab, { sx: {
4958
- backgroundColor: `color-mix(in srgb, ${semanticColors.buttons.primary.default} 12.5%, transparent)`,
4959
- color: semanticColors.buttons.primary.default,
5012
+ backgroundColor: `color-mix(in srgb, ${semanticColors.button.primary.bg} 12.5%, transparent)`,
5013
+ color: semanticColors.button.primary.bg,
4960
5014
  '&:hover': {
4961
- backgroundColor: `color-mix(in srgb, ${semanticColors.buttons.primary.default} 18.8%, transparent)`,
5015
+ backgroundColor: `color-mix(in srgb, ${semanticColors.button.primary.bg} 18.8%, transparent)`,
4962
5016
  },
4963
5017
  }, title: "Back to top", size: "small", onClick: handleScrollToTop, children: jsx(ChevronUp, { size: 20 }) }) }) }))] }));
4964
5018
  }
@@ -5015,8 +5069,8 @@ const StyledTextField = styled(TextField)(({ theme }) => ({
5015
5069
  height: spacing.spacing_5,
5016
5070
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
5017
5071
  borderRadius: borderRadius.input,
5018
- backgroundColor: semanticColors.input.background,
5019
- border: `1px solid ${semanticColors.border.primary}`,
5072
+ backgroundColor: semanticColors.input.bg,
5073
+ border: `1px solid ${semanticColors.color.border.primary}`,
5020
5074
  paddingTop: spacing.spacing_1,
5021
5075
  paddingBottom: spacing.spacing_1,
5022
5076
  paddingLeft: spacing.spacing_1_1_2,
@@ -5027,26 +5081,26 @@ const StyledTextField = styled(TextField)(({ theme }) => ({
5027
5081
  },
5028
5082
  [`& .${inputBaseClasses.input}`]: {
5029
5083
  padding: 0,
5030
- color: semanticColors.typography.input.default,
5084
+ color: semanticColors.color.text.input,
5031
5085
  '&::placeholder': {
5032
- color: semanticColors.typography.input.placeholder,
5086
+ color: semanticColors.color.text.inputPlaceholder,
5033
5087
  opacity: 1,
5034
5088
  },
5035
5089
  },
5036
5090
  '&:hover': {
5037
- backgroundColor: semanticColors.input.hoverBackground,
5091
+ backgroundColor: semanticColors.input.bgHover,
5038
5092
  },
5039
5093
  [`&.${inputBaseClasses.focused}`]: {
5040
- backgroundColor: semanticColors.input.background,
5041
- borderColor: semanticColors.buttons.primary.default,
5094
+ backgroundColor: semanticColors.input.bg,
5095
+ borderColor: semanticColors.button.primary.bg,
5042
5096
  },
5043
5097
  [`&.${inputBaseClasses.disabled}`]: {
5044
- backgroundColor: semanticColors.input.disabledBackground,
5045
- color: semanticColors.typography.button.disabled,
5098
+ backgroundColor: semanticColors.input.bgDisabled,
5099
+ color: semanticColors.button.fgDisabled,
5046
5100
  },
5047
5101
  },
5048
5102
  [`& .${inputAdornmentClasses.root}`]: {
5049
- color: semanticColors.icons.placeholder,
5103
+ color: semanticColors.color.icon.placeholder,
5050
5104
  '& svg': {
5051
5105
  width: 14,
5052
5106
  height: 14,
@@ -5056,10 +5110,10 @@ const StyledTextField = styled(TextField)(({ theme }) => ({
5056
5110
  marginRight: 0,
5057
5111
  },
5058
5112
  [`& .${iconButtonClasses.root}`]: {
5059
- color: semanticColors.icons.placeholder,
5113
+ color: semanticColors.color.icon.placeholder,
5060
5114
  '&:hover': {
5061
- backgroundColor: semanticColors.icons.hoverBackground,
5062
- color: semanticColors.icons.utility,
5115
+ backgroundColor: semanticColors.color.icon.bgHover,
5116
+ color: semanticColors.color.icon.utility,
5063
5117
  },
5064
5118
  '& svg': {
5065
5119
  width: 16,
@@ -5106,14 +5160,14 @@ ModQuickFilter.displayName = 'ModQuickFilter';
5106
5160
  const UncheckedIcon = ({ size, disabled }) => {
5107
5161
  const dimensions = size === 'small' ? 16 : 20;
5108
5162
  const radius = size === 'small' ? 8 : 10;
5109
- return (jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsx("title", { children: "Unchecked radio button" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, stroke: semanticColors.border.strong, strokeWidth: "1", fill: disabled ? semanticColors.buttons.primary.disabled : 'transparent' })] }));
5163
+ return (jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsx("title", { children: "Unchecked radio button" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, stroke: semanticColors.color.border.strong, strokeWidth: "1", fill: disabled ? semanticColors.button.primary.bgDisabled : 'transparent' })] }));
5110
5164
  };
5111
5165
  const CheckedIcon = ({ size, disabled }) => {
5112
5166
  const dimensions = size === 'small' ? 16 : 20;
5113
5167
  const radius = size === 'small' ? 8 : 10;
5114
5168
  const inset = size === 'small' ? 0.3125 : 0.3; // 31.25% or 30%
5115
5169
  const innerRadius = radius * (1 - 2 * inset);
5116
- return (jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsx("title", { children: "Checked radio button" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, fill: disabled ? semanticColors.buttons.primary.disabled : semanticColors.icons.active, stroke: disabled ? semanticColors.border.primary : semanticColors.icons.active, strokeWidth: "1" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: innerRadius, fill: disabled ? semanticColors.icons.disabled : semanticColors.surfaces.white })] }));
5170
+ return (jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsx("title", { children: "Checked radio button" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, fill: disabled ? semanticColors.button.primary.bgDisabled : semanticColors.color.icon.active, stroke: disabled ? semanticColors.color.border.primary : semanticColors.color.icon.active, strokeWidth: "1" }), jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: innerRadius, fill: disabled ? semanticColors.color.icon.disabled : semanticColors.color.surface.raised })] }));
5117
5171
  };
5118
5172
  const RadioContainer = styled('label')(({ disabled }) => ({
5119
5173
  display: 'inline-flex',
@@ -5139,13 +5193,13 @@ const Label$1 = styled('span')(({ theme, size = 'medium' }) => ({
5139
5193
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5140
5194
  fontWeight: typography.fontWeight.medium,
5141
5195
  lineHeight: size === 'small' ? 1.4 : 1.5,
5142
- color: semanticColors.typography.input.default,
5196
+ color: semanticColors.color.text.input,
5143
5197
  }));
5144
5198
  const HelperText$1 = styled('span')(({ theme, size = 'medium' }) => ({
5145
5199
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5146
5200
  fontWeight: typography.fontWeight.regular,
5147
5201
  lineHeight: size === 'small' ? 1.4 : 1.5,
5148
- color: semanticColors.typography.bodySecondary,
5202
+ color: semanticColors.color.text.secondary,
5149
5203
  }));
5150
5204
  const StyledRadio = styled(Radio, {
5151
5205
  shouldForwardProp: prop => prop !== 'size',
@@ -5158,9 +5212,9 @@ const StyledRadio = styled(Radio, {
5158
5212
  height: dimensions,
5159
5213
  flexShrink: 0,
5160
5214
  borderRadius: radius,
5161
- color: semanticColors.border.strong,
5215
+ color: semanticColors.color.border.strong,
5162
5216
  [`&.${radioClasses.checked}`]: {
5163
- color: semanticColors.icons.active,
5217
+ color: semanticColors.color.icon.active,
5164
5218
  },
5165
5219
  '&:hover': {
5166
5220
  backgroundColor: 'transparent',
@@ -5173,7 +5227,7 @@ const StyledRadio = styled(Radio, {
5173
5227
  // Focus state for keyboard navigation
5174
5228
  [`&.${buttonBaseClasses.focusVisible}`]: {
5175
5229
  // Unchecked focus state: white background
5176
- backgroundColor: semanticColors.surfaces.white,
5230
+ backgroundColor: semanticColors.color.surface.raised,
5177
5231
  // Checked focus state: keep the blue circle visible
5178
5232
  [`&.${radioClasses.checked}`]: {
5179
5233
  backgroundColor: 'transparent',
@@ -5181,9 +5235,9 @@ const StyledRadio = styled(Radio, {
5181
5235
  },
5182
5236
  // Disabled state — icons handle their own disabled colors
5183
5237
  [`&.${radioClasses.disabled}`]: {
5184
- color: semanticColors.border.primary,
5238
+ color: semanticColors.color.border.primary,
5185
5239
  [`&.${radioClasses.checked}`]: {
5186
- color: semanticColors.border.primary,
5240
+ color: semanticColors.color.border.primary,
5187
5241
  },
5188
5242
  },
5189
5243
  };
@@ -5277,15 +5331,15 @@ ModRipplingDot.displayName = 'ModRipplingDot';
5277
5331
 
5278
5332
  const StyledSearchChip = styled(InputBase)(({ theme }) => ({
5279
5333
  borderRadius: borderRadius.button,
5280
- border: `1px solid ${semanticColors.border.primary}`,
5281
- backgroundColor: semanticColors.surfaces.white,
5334
+ border: `1px solid ${semanticColors.color.border.primary}`,
5335
+ backgroundColor: semanticColors.color.surface.raised,
5282
5336
  height: 40,
5283
5337
  padding: `0 ${spacing.spacing_1_1_2}px`,
5284
5338
  gap: spacing.spacing_1_2,
5285
5339
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
5286
5340
  fontWeight: typography.fontWeight.medium,
5287
5341
  lineHeight: 1,
5288
- color: semanticColors.typography.input.default,
5342
+ color: semanticColors.color.text.input,
5289
5343
  cursor: 'text',
5290
5344
  boxSizing: 'border-box',
5291
5345
  transition: theme.transitions.create(['border-color', 'background-color'], {
@@ -5296,7 +5350,7 @@ const StyledSearchChip = styled(InputBase)(({ theme }) => ({
5296
5350
  height: 'auto',
5297
5351
  lineHeight: 1,
5298
5352
  '&::placeholder': {
5299
- color: semanticColors.typography.input.placeholder,
5353
+ color: semanticColors.color.text.inputPlaceholder,
5300
5354
  opacity: 1,
5301
5355
  },
5302
5356
  // Hide native browser clear button for type="search" (we provide our own)
@@ -5305,22 +5359,22 @@ const StyledSearchChip = styled(InputBase)(({ theme }) => ({
5305
5359
  },
5306
5360
  },
5307
5361
  '&:hover': {
5308
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
5309
- borderColor: semanticColors.accent.border,
5362
+ backgroundColor: semanticColors.button.secondary.bgHover,
5363
+ borderColor: semanticColors.color.action.border,
5310
5364
  },
5311
5365
  // After `&:hover` so a disabled chip takes no hover feedback -- MUI leaves pointer-events
5312
5366
  // live on the disabled root, so `&:hover` matches it too.
5313
5367
  [`&.${inputBaseClasses.disabled}`]: {
5314
- backgroundColor: semanticColors.surfaces.white,
5315
- borderColor: semanticColors.border.primary,
5368
+ backgroundColor: semanticColors.color.surface.raised,
5369
+ borderColor: semanticColors.color.border.primary,
5316
5370
  },
5317
5371
  // A tint hugging the border, not focusRingStyles' detached ring: even :focus-visible matches a
5318
5372
  // clicked text input, so this has to stay calm. Keep below `&:hover` -- equal specificity, so
5319
5373
  // source order is what keeps a hovered+focused chip white.
5320
5374
  [`&.${inputBaseClasses.focused}`]: {
5321
- backgroundColor: semanticColors.surfaces.white,
5322
- borderColor: semanticColors.border.focus,
5323
- outline: `3px solid ${semanticColors.accent.tint}`,
5375
+ backgroundColor: semanticColors.color.surface.raised,
5376
+ borderColor: semanticColors.color.border.focus,
5377
+ outline: `3px solid ${semanticColors.color.action.tint}`,
5324
5378
  },
5325
5379
  }));
5326
5380
  const ClearButton = styled(ButtonBase)({
@@ -5333,11 +5387,11 @@ const ClearButton = styled(ButtonBase)({
5333
5387
  border: 'none',
5334
5388
  backgroundColor: 'transparent',
5335
5389
  cursor: 'pointer',
5336
- color: semanticColors.icons.default,
5390
+ color: semanticColors.color.icon.default,
5337
5391
  flexShrink: 0,
5338
5392
  borderRadius: borderRadius.button,
5339
5393
  '&:hover': {
5340
- backgroundColor: semanticColors.buttons.secondary.hoverBackground,
5394
+ backgroundColor: semanticColors.button.secondary.bgHover,
5341
5395
  },
5342
5396
  });
5343
5397
  /**
@@ -5348,7 +5402,7 @@ const ClearButton = styled(ButtonBase)({
5348
5402
  */
5349
5403
  const ModSearchChip = ({ onClear, value, ...props }) => {
5350
5404
  const hasValue = Boolean(value && String(value).length > 0);
5351
- return (jsx(StyledSearchChip, { type: "search", value: value, startAdornment: jsx(Search, { size: 16, color: semanticColors.icons.placeholder, style: { flexShrink: 0 } }), endAdornment: hasValue && onClear ? (jsx(ClearButton, { type: "button", onClick: onClear, "aria-label": "Clear search", children: jsx(X, { size: 16 }) })) : undefined, ...props }));
5405
+ return (jsx(StyledSearchChip, { type: "search", value: value, startAdornment: jsx(Search, { size: 16, color: semanticColors.color.icon.placeholder, style: { flexShrink: 0 } }), endAdornment: hasValue && onClear ? (jsx(ClearButton, { type: "button", onClick: onClear, "aria-label": "Clear search", children: jsx(X, { size: 16 }) })) : undefined, ...props }));
5352
5406
  };
5353
5407
  ModSearchChip.displayName = 'ModSearchChip';
5354
5408
 
@@ -5382,7 +5436,7 @@ const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : us
5382
5436
  const EXPANDED_WIDTH = 98;
5383
5437
  const COLLAPSED_WIDTH = 68;
5384
5438
  // The fade overlay must end on the same color as the rail to blend cleanly.
5385
- const RAIL_BACKGROUND = semanticColors.surfaces.page;
5439
+ const RAIL_BACKGROUND = semanticColors.color.surface.page;
5386
5440
  // Unclipped positioning context so the edge handle can straddle the rail's
5387
5441
  // trailing edge (Root itself clips its overflow during the width transition).
5388
5442
  const Frame = styled('div', {
@@ -5493,12 +5547,12 @@ const Handle = styled(ButtonBase)(({ theme }) => ({
5493
5547
  height: spacing.spacing_5,
5494
5548
  borderRadius: borderRadius.s,
5495
5549
  backgroundColor: RAIL_BACKGROUND,
5496
- border: `1px solid ${semanticColors.border.secondary}`,
5497
- color: semanticColors.typography.bodySecondary,
5550
+ border: `1px solid ${semanticColors.color.border.primary}`,
5551
+ color: semanticColors.color.text.secondary,
5498
5552
  transition: theme.transitions.create(['color', 'border-color']),
5499
5553
  '&:hover': {
5500
- color: semanticColors.typography.body,
5501
- borderColor: semanticColors.border.primary,
5554
+ color: semanticColors.color.text.primary,
5555
+ borderColor: semanticColors.color.border.primary,
5502
5556
  },
5503
5557
  }));
5504
5558
  /**
@@ -5585,7 +5639,7 @@ const StyledSkeleton = styled(Skeleton, {
5585
5639
  transform: 'none',
5586
5640
  // Light theme colors
5587
5641
  ...(colorTheme === 'light' && {
5588
- backgroundColor: semanticColors.skeleton.background,
5642
+ backgroundColor: semanticColors.skeleton.bg,
5589
5643
  '&::after': {
5590
5644
  background: `linear-gradient(90deg, transparent, ${semanticColors.skeleton.wave}, transparent)`,
5591
5645
  },
@@ -5632,23 +5686,23 @@ const StyledTable = styled(MuiTable, {
5632
5686
  borderCollapse: 'separate',
5633
5687
  borderSpacing: 0,
5634
5688
  [`& .${tableCellClasses.head}`]: {
5635
- backgroundColor: semanticColors.surfaces.dataGrid.header,
5636
- color: semanticColors.typography.body,
5689
+ backgroundColor: semanticColors.color.surface.dataGrid.header,
5690
+ color: semanticColors.color.text.primary,
5637
5691
  fontFamily: typography.fontFamily.body,
5638
5692
  fontSize: theme.typography.pxToRem(sizeFontSize[tableSize]),
5639
5693
  fontWeight: typography.fontWeight.semiBold,
5640
5694
  lineHeight: 1.4,
5641
5695
  padding: sizePadding[tableSize],
5642
- borderBottom: `1px solid ${semanticColors.border.secondary}`,
5696
+ borderBottom: `1px solid ${semanticColors.color.border.primary}`,
5643
5697
  },
5644
5698
  [`& .${tableCellClasses.body}`]: {
5645
- color: semanticColors.typography.body,
5699
+ color: semanticColors.color.text.primary,
5646
5700
  fontFamily: typography.fontFamily.body,
5647
5701
  fontSize: theme.typography.pxToRem(sizeFontSize[tableSize]),
5648
5702
  fontWeight: typography.fontWeight.regular,
5649
5703
  lineHeight: 1.4,
5650
5704
  padding: sizePadding[tableSize],
5651
- borderBottom: `1px solid ${semanticColors.border.secondary}`,
5705
+ borderBottom: `1px solid ${semanticColors.color.border.primary}`,
5652
5706
  },
5653
5707
  // Drop the trailing row's bottom border so the container border (if
5654
5708
  // any) is the visual edge.
@@ -5660,10 +5714,10 @@ const StyledContainer = styled('div', {
5660
5714
  shouldForwardProp: prop => prop !== 'tableVariant',
5661
5715
  })(({ tableVariant = 'bordered' }) => tableVariant === 'bordered'
5662
5716
  ? {
5663
- border: `1px solid ${semanticColors.border.secondary}`,
5717
+ border: `1px solid ${semanticColors.color.border.primary}`,
5664
5718
  borderRadius: borderRadius.card,
5665
5719
  overflow: 'hidden',
5666
- backgroundColor: semanticColors.surfaces.white,
5720
+ backgroundColor: semanticColors.color.surface.raised,
5667
5721
  }
5668
5722
  : { backgroundColor: 'transparent' });
5669
5723
  /**
@@ -5691,7 +5745,7 @@ ModTable.displayName = 'ModTable';
5691
5745
  const StyledTabPanel = styled(Box, {
5692
5746
  shouldForwardProp: prop => prop !== 'tabPanelVariant',
5693
5747
  })(({ tabPanelVariant = 'default' }) => ({
5694
- backgroundColor: semanticColors.surfaces.white,
5748
+ backgroundColor: semanticColors.color.surface.raised,
5695
5749
  // default: 16px top padding for content-driven pages.
5696
5750
  // flush: zero padding so content sits directly against the tab bar's
5697
5751
  // bottom border (sidebars, panels, builders, canvases).
@@ -5729,7 +5783,7 @@ ModTabPanel.displayName = 'ModTabPanel';
5729
5783
  const ModTabs = styled(MuiTabs)(() => ({
5730
5784
  minHeight: spacing.spacing_5,
5731
5785
  [`& .${tabsClasses.indicator}`]: {
5732
- backgroundColor: semanticColors.buttons.navigation.activeBorder,
5786
+ backgroundColor: semanticColors.button.nav.borderActive,
5733
5787
  height: 2,
5734
5788
  },
5735
5789
  [`& .${tabsClasses.list}`]: {
@@ -5744,14 +5798,14 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
5744
5798
  fontWeight: typography.fontWeight.regular,
5745
5799
  fontSize: theme.typography.pxToRem(14),
5746
5800
  lineHeight: '1.5rem',
5747
- color: semanticColors.typography.tab.inactive,
5801
+ color: semanticColors.color.text.tabInactive,
5748
5802
  transition: 'none', // Remove animation
5749
5803
  [`&.${tabClasses.selected}`]: {
5750
- color: semanticColors.typography.tab.active,
5804
+ color: semanticColors.color.text.tabActive,
5751
5805
  fontWeight: typography.fontWeight.semiBold,
5752
5806
  },
5753
5807
  '&:hover': {
5754
- color: semanticColors.typography.tab.active,
5808
+ color: semanticColors.color.text.tabActive,
5755
5809
  [`&.${tabClasses.selected}::after`]: {
5756
5810
  content: '""',
5757
5811
  position: 'absolute',
@@ -5759,23 +5813,23 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
5759
5813
  left: 0,
5760
5814
  right: 0,
5761
5815
  height: 2,
5762
- backgroundColor: semanticColors.buttons.navigation.activeBorder,
5816
+ backgroundColor: semanticColors.button.nav.borderActive,
5763
5817
  },
5764
5818
  },
5765
5819
  [`&.${buttonBaseClasses.focusVisible}`]: {
5766
- color: semanticColors.typography.tab.active,
5767
- outline: `2px solid ${semanticColors.border.focus}`,
5820
+ color: semanticColors.color.text.tabActive,
5821
+ outline: `2px solid ${semanticColors.color.border.focus}`,
5768
5822
  outlineOffset: -2,
5769
5823
  },
5770
5824
  [`&.${tabClasses.disabled}`]: {
5771
- color: semanticColors.typography.button.disabled,
5825
+ color: semanticColors.button.fgDisabled,
5772
5826
  cursor: 'not-allowed',
5773
5827
  pointerEvents: 'auto',
5774
5828
  '&:hover': {
5775
5829
  backgroundColor: 'transparent',
5776
5830
  },
5777
5831
  [`&.${tabClasses.selected}`]: {
5778
- color: semanticColors.typography.button.disabled,
5832
+ color: semanticColors.button.fgDisabled,
5779
5833
  '&::after': {
5780
5834
  content: '""',
5781
5835
  position: 'absolute',
@@ -5783,7 +5837,7 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
5783
5837
  left: 0,
5784
5838
  right: 0,
5785
5839
  height: 2,
5786
- backgroundColor: semanticColors.buttons.tertiary.disabled,
5840
+ backgroundColor: semanticColors.button.tertiary.fgDisabled,
5787
5841
  },
5788
5842
  },
5789
5843
  },
@@ -5804,34 +5858,34 @@ ModTab.displayName = 'ModTab';
5804
5858
 
5805
5859
  const intentStyles = {
5806
5860
  neutral: {
5807
- background: semanticColors.status.neutral.light,
5808
- border: semanticColors.border.primary,
5809
- text: semanticColors.status.neutral.dark,
5810
- action: semanticColors.typography.link.default,
5861
+ background: semanticColors.color.status.neutral.bg,
5862
+ border: semanticColors.color.border.primary,
5863
+ text: semanticColors.color.status.neutral.fg,
5864
+ action: semanticColors.color.text.link,
5811
5865
  },
5812
5866
  info: {
5813
- background: semanticColors.toast.infoBg,
5814
- border: semanticColors.toast.infoBorder,
5815
- text: semanticColors.toast.infoText,
5816
- action: semanticColors.toast.infoText,
5867
+ background: semanticColors.toast.info.bg,
5868
+ border: semanticColors.toast.info.border,
5869
+ text: semanticColors.toast.info.fg,
5870
+ action: semanticColors.toast.info.fg,
5817
5871
  },
5818
5872
  success: {
5819
- background: semanticColors.toast.successBg,
5820
- border: semanticColors.toast.successBorder,
5821
- text: semanticColors.toast.successText,
5822
- action: semanticColors.toast.successText,
5873
+ background: semanticColors.toast.success.bg,
5874
+ border: semanticColors.toast.success.border,
5875
+ text: semanticColors.toast.success.fg,
5876
+ action: semanticColors.toast.success.fg,
5823
5877
  },
5824
5878
  error: {
5825
- background: semanticColors.toast.errorBg,
5826
- border: semanticColors.toast.errorBorder,
5827
- text: semanticColors.toast.errorText,
5828
- action: semanticColors.toast.errorText,
5879
+ background: semanticColors.toast.error.bg,
5880
+ border: semanticColors.toast.error.border,
5881
+ text: semanticColors.toast.error.fg,
5882
+ action: semanticColors.toast.error.fg,
5829
5883
  },
5830
5884
  warning: {
5831
- background: semanticColors.toast.warningBg,
5832
- border: semanticColors.toast.warningBorder,
5833
- text: semanticColors.toast.warningText,
5834
- action: semanticColors.toast.warningText,
5885
+ background: semanticColors.toast.warning.bg,
5886
+ border: semanticColors.toast.warning.border,
5887
+ text: semanticColors.toast.warning.fg,
5888
+ action: semanticColors.toast.warning.fg,
5835
5889
  },
5836
5890
  };
5837
5891
  const shadowRegular = shadows.neutral.regular;
@@ -5906,7 +5960,7 @@ const ToastButton = styled(Button, {
5906
5960
  * ModToast - Notification/Toast component based on MUI Alert
5907
5961
  */
5908
5962
  const ModToast = ({ intent = 'neutral', type: _type, title, message, showClose = false, actions, onClose, ...props }) => {
5909
- return (jsxs(StyledAlert, { ...props, intent: intent, action: showClose ? (jsx(IconButton, { size: "small", onClick: onClose, sx: { color: semanticColors.icons.utility }, children: jsx(X, { size: 16 }) })) : undefined, children: [jsxs(Stack, { sx: { gap: `${spacing.spacing_1}px`, width: '100%' }, children: [title && jsx(ToastTitle, { intent: intent, children: title }), message && jsx(ToastMessage, { intent: intent, children: message })] }), actions && jsx(ToastActions, { direction: "row", children: actions })] }));
5963
+ return (jsxs(StyledAlert, { ...props, intent: intent, action: showClose ? (jsx(IconButton, { size: "small", onClick: onClose, sx: { color: semanticColors.color.icon.utility }, children: jsx(X, { size: 16 }) })) : undefined, children: [jsxs(Stack, { sx: { gap: `${spacing.spacing_1}px`, width: '100%' }, children: [title && jsx(ToastTitle, { intent: intent, children: title }), message && jsx(ToastMessage, { intent: intent, children: message })] }), actions && jsx(ToastActions, { direction: "row", children: actions })] }));
5910
5964
  };
5911
5965
  /**
5912
5966
  * Helper component for creating toast action buttons with proper styling
@@ -5933,13 +5987,13 @@ const Label = styled('span')(({ theme, size = 'medium' }) => ({
5933
5987
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5934
5988
  fontWeight: typography.fontWeight.medium,
5935
5989
  lineHeight: size === 'small' ? 1.4 : 1.5,
5936
- color: semanticColors.typography.input.default,
5990
+ color: semanticColors.color.text.input,
5937
5991
  }));
5938
5992
  const HelperText = styled('span')(({ theme, size = 'medium' }) => ({
5939
5993
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5940
5994
  fontWeight: typography.fontWeight.regular,
5941
5995
  lineHeight: size === 'small' ? 1.4 : 1.5,
5942
- color: semanticColors.typography.bodySecondary,
5996
+ color: semanticColors.color.text.secondary,
5943
5997
  }));
5944
5998
  const StyledSwitch = styled(Switch, {
5945
5999
  shouldForwardProp: prop => prop !== 'size',
@@ -5972,23 +6026,23 @@ const StyledSwitch = styled(Switch, {
5972
6026
  // Root element
5973
6027
  [`& .${switchClasses.switchBase}`]: {
5974
6028
  padding: config.trackPadding,
5975
- color: semanticColors.surfaces.toggleKnob,
6029
+ color: semanticColors.control.knob,
5976
6030
  transition: theme.transitions.create(['transform'], {
5977
6031
  duration: theme.transitions.duration.shortest,
5978
6032
  }),
5979
6033
  // Focus visible for keyboard navigation
5980
6034
  '&.Mui-focusVisible': {
5981
6035
  [`& + .${switchClasses.track}`]: {
5982
- outline: `2px solid ${semanticColors.border.focus}`,
6036
+ outline: `2px solid ${semanticColors.color.border.focus}`,
5983
6037
  outlineOffset: 2,
5984
6038
  },
5985
6039
  },
5986
6040
  // Checked state
5987
6041
  [`&.${switchClasses.checked}`]: {
5988
6042
  transform: `translateX(${thumbTranslate}px)`,
5989
- color: semanticColors.surfaces.toggleKnob,
6043
+ color: semanticColors.control.knob,
5990
6044
  [`& + .${switchClasses.track}`]: {
5991
- backgroundColor: semanticColors.buttons.primary.default,
6045
+ backgroundColor: semanticColors.button.primary.bg,
5992
6046
  opacity: 1,
5993
6047
  border: 'none',
5994
6048
  },
@@ -5996,18 +6050,18 @@ const StyledSwitch = styled(Switch, {
5996
6050
  // Disabled state
5997
6051
  [`&.${switchClasses.disabled}`]: {
5998
6052
  // Thumb changes to disabled background color for both checked and unchecked
5999
- color: semanticColors.input.disabledBackground,
6053
+ color: semanticColors.input.bgDisabled,
6000
6054
  cursor: 'not-allowed',
6001
6055
  // Both checked and unchecked use the same grey track when disabled
6002
6056
  [`& + .${switchClasses.track}`]: {
6003
- backgroundColor: semanticColors.border.secondary,
6057
+ backgroundColor: semanticColors.color.border.primary,
6004
6058
  opacity: 1,
6005
6059
  border: 'none',
6006
6060
  },
6007
6061
  },
6008
6062
  // More specific selector for disabled+checked to override checked color
6009
6063
  [`&.${switchClasses.disabled}.${switchClasses.checked}`]: {
6010
- color: semanticColors.input.disabledBackground,
6064
+ color: semanticColors.input.bgDisabled,
6011
6065
  },
6012
6066
  },
6013
6067
  // Thumb
@@ -6024,12 +6078,12 @@ const StyledSwitch = styled(Switch, {
6024
6078
  width: config.width,
6025
6079
  height: config.height,
6026
6080
  borderRadius: config.height / 2,
6027
- backgroundColor: semanticColors.surface.sunken2,
6081
+ backgroundColor: semanticColors.color.surface.sunkenDeep,
6028
6082
  opacity: 1,
6029
6083
  // Off track carries a border; box-sizing keeps the 1px inside the
6030
6084
  // configured width/height. Checked/disabled states reset it below.
6031
6085
  boxSizing: 'border-box',
6032
- border: `1px solid ${semanticColors.border.strong}`,
6086
+ border: `1px solid ${semanticColors.color.border.strong}`,
6033
6087
  transition: theme.transitions.create(['background-color'], {
6034
6088
  duration: theme.transitions.duration.short,
6035
6089
  }),
@@ -6090,7 +6144,7 @@ const StyledToggleButton$1 = styled(MuiToggleButton, {
6090
6144
  fontSize: theme.typography.pxToRem(sizeStyles[toggleSize].fontSize),
6091
6145
  fontWeight: typography.fontWeight.regular,
6092
6146
  lineHeight: 1,
6093
- color: segmented ? semanticColors.typography.body : semanticColors.typography.bodySecondary,
6147
+ color: segmented ? semanticColors.color.text.primary : semanticColors.color.text.secondary,
6094
6148
  backgroundColor: 'transparent',
6095
6149
  border: 'none',
6096
6150
  // Segmented buttons are independent rounded pills on the group's track.
@@ -6100,22 +6154,22 @@ const StyledToggleButton$1 = styled(MuiToggleButton, {
6100
6154
  duration: theme.transitions.duration.short,
6101
6155
  }),
6102
6156
  '&:hover': {
6103
- backgroundColor: segmented ? 'transparent' : semanticColors.surfaces.tabActive,
6104
- color: semanticColors.typography.body,
6157
+ backgroundColor: segmented ? 'transparent' : semanticColors.color.surface.tabActive,
6158
+ color: semanticColors.color.text.primary,
6105
6159
  },
6106
6160
  '&.Mui-selected, &.Mui-selected:hover': {
6107
6161
  backgroundColor: segmented
6108
- ? semanticColors.surfaces.card
6109
- : semanticColors.surfaces.tabActive,
6110
- color: segmented ? semanticColors.accent.default : semanticColors.typography.body,
6162
+ ? semanticColors.color.surface.raised
6163
+ : semanticColors.color.surface.tabActive,
6164
+ color: segmented ? semanticColors.color.action.default : semanticColors.color.text.primary,
6111
6165
  fontWeight: typography.fontWeight.semiBold,
6112
6166
  },
6113
6167
  '&.Mui-focusVisible': {
6114
- outline: `2px solid ${semanticColors.border.focus}`,
6168
+ outline: `2px solid ${semanticColors.color.border.focus}`,
6115
6169
  outlineOffset: -2,
6116
6170
  },
6117
6171
  '&.Mui-disabled': {
6118
- color: semanticColors.typography.button.disabled,
6172
+ color: semanticColors.button.fgDisabled,
6119
6173
  cursor: 'default',
6120
6174
  pointerEvents: 'none',
6121
6175
  },
@@ -6139,7 +6193,7 @@ const StyledToggleButtonGroup$1 = styled(MuiToggleButtonGroup, {
6139
6193
  ...(segmented
6140
6194
  ? {
6141
6195
  // Sunken track holding raised pills (the Morpheus `.seg` control).
6142
- backgroundColor: semanticColors.surface.sunken2,
6196
+ backgroundColor: semanticColors.color.surface.sunkenDeep,
6143
6197
  borderRadius: borderRadius.input,
6144
6198
  border: 'none',
6145
6199
  padding: spacing.spacing_1_2,
@@ -6147,7 +6201,7 @@ const StyledToggleButtonGroup$1 = styled(MuiToggleButtonGroup, {
6147
6201
  }
6148
6202
  : {
6149
6203
  borderRadius: borderRadius.button,
6150
- border: `1px solid ${semanticColors.border.secondary}`,
6204
+ border: `1px solid ${semanticColors.color.border.primary}`,
6151
6205
  overflow: 'hidden',
6152
6206
  }),
6153
6207
  // Default fuses the children (square inner corners, no gap); segmented
@@ -6181,7 +6235,7 @@ const ModToggleButtonGroup = ({ size = 'medium', variant = 'default', children,
6181
6235
  ModToggleButtonGroup.displayName = 'ModToggleButtonGroup';
6182
6236
 
6183
6237
  const StyledToolbar = styled(Toolbar)(({ theme }) => ({
6184
- backgroundColor: semanticColors.surfaces.white,
6238
+ backgroundColor: semanticColors.color.surface.raised,
6185
6239
  minHeight: 'auto',
6186
6240
  justifyContent: 'space-between',
6187
6241
  // Apply padding directly to match Figma design (16px horizontal, 12px vertical)
@@ -6274,7 +6328,7 @@ const ItemIcon = styled('span')({
6274
6328
  width: 16,
6275
6329
  height: 16,
6276
6330
  flexShrink: 0,
6277
- color: semanticColors.icons.default,
6331
+ color: semanticColors.color.icon.default,
6278
6332
  '& svg': {
6279
6333
  width: 16,
6280
6334
  height: 16,
@@ -6292,13 +6346,13 @@ const ItemSecondaryLabel = styled('span')({
6292
6346
  fontSize: typography.fontSize.xs,
6293
6347
  fontWeight: typography.fontWeight.regular,
6294
6348
  fontFamily: typography.fontFamily.body,
6295
- color: semanticColors.typography.link.primary,
6349
+ color: semanticColors.color.text.link,
6296
6350
  });
6297
6351
  const ItemEndAction = styled('span')({
6298
6352
  display: 'inline-flex',
6299
6353
  alignItems: 'center',
6300
6354
  flexShrink: 0,
6301
- color: semanticColors.icons.utility,
6355
+ color: semanticColors.color.icon.utility,
6302
6356
  '& svg': {
6303
6357
  width: 16,
6304
6358
  height: 16,
@@ -6334,36 +6388,36 @@ const StyledTreeView = styled(RichTreeViewPro)({
6334
6388
  borderRadius: 0,
6335
6389
  },
6336
6390
  [`& .${treeItemClasses.content}:hover`]: {
6337
- backgroundColor: semanticColors.surfaces.listHover,
6391
+ backgroundColor: semanticColors.color.surface.rowHover,
6338
6392
  },
6339
6393
  [`& .${treeItemClasses.content}[data-focused]`]: {
6340
- boxShadow: `inset 0 0 0 2px ${semanticColors.border.focus}`,
6394
+ boxShadow: `inset 0 0 0 2px ${semanticColors.color.border.focus}`,
6341
6395
  backgroundColor: 'transparent',
6342
6396
  },
6343
6397
  [`& .${treeItemClasses.content}[data-selected]`]: {
6344
- backgroundColor: semanticColors.surfaces.listHover,
6398
+ backgroundColor: semanticColors.color.surface.rowHover,
6345
6399
  },
6346
6400
  [`& .${treeItemClasses.content}[data-selected][data-focused]`]: {
6347
- backgroundColor: semanticColors.surfaces.listHover,
6348
- boxShadow: `inset 0 0 0 2px ${semanticColors.border.focus}`,
6401
+ backgroundColor: semanticColors.color.surface.rowHover,
6402
+ boxShadow: `inset 0 0 0 2px ${semanticColors.color.border.focus}`,
6349
6403
  },
6350
6404
  [`& .${treeItemClasses.label}`]: {
6351
6405
  fontSize: typography.fontSize.xs,
6352
6406
  fontWeight: typography.fontWeight.regular,
6353
6407
  fontFamily: typography.fontFamily.body,
6354
- color: semanticColors.typography.body,
6408
+ color: semanticColors.color.text.primary,
6355
6409
  padding: 0,
6356
6410
  },
6357
6411
  [`& .${treeItemClasses.iconContainer}`]: {
6358
6412
  width: 16,
6359
- color: semanticColors.icons.default,
6413
+ color: semanticColors.color.icon.default,
6360
6414
  '& svg': {
6361
6415
  width: 16,
6362
6416
  height: 16,
6363
6417
  },
6364
6418
  },
6365
6419
  [`& .${treeItemClasses.groupTransition}`]: {
6366
- borderLeft: `1px solid ${semanticColors.border.primary}`,
6420
+ borderLeft: `1px solid ${semanticColors.color.border.primary}`,
6367
6421
  marginLeft: spacing.spacing_1_1_4,
6368
6422
  },
6369
6423
  });
@@ -6371,7 +6425,7 @@ const StyledTreeView = styled(RichTreeViewPro)({
6371
6425
  // Figma-exact border radius for toggle buttons — no matching design token
6372
6426
  const TOGGLE_BUTTON_BORDER_RADIUS = 14;
6373
6427
  const StyledToggleButtonGroup = styled(MuiToggleButtonGroup)(({ theme }) => ({
6374
- backgroundColor: semanticColors.surfaces.card,
6428
+ backgroundColor: semanticColors.color.surface.raised,
6375
6429
  padding: theme.spacing(0.625, 0.875),
6376
6430
  borderRadius: borderRadius.m,
6377
6431
  gap: 0,
@@ -6391,7 +6445,7 @@ const StyledToggleButtonGroup = styled(MuiToggleButtonGroup)(({ theme }) => ({
6391
6445
  const StyledToggleButton = styled(MuiToggleButton)(({ theme }) => ({
6392
6446
  padding: theme.spacing(0.625),
6393
6447
  minWidth: 'auto',
6394
- color: semanticColors.icons.default,
6448
+ color: semanticColors.color.icon.default,
6395
6449
  border: 'none',
6396
6450
  '& svg': {
6397
6451
  width: 20,
@@ -6401,10 +6455,10 @@ const StyledToggleButton = styled(MuiToggleButton)(({ theme }) => ({
6401
6455
  backgroundColor: 'transparent',
6402
6456
  },
6403
6457
  [`&.${toggleButtonClasses.selected}`]: {
6404
- backgroundColor: semanticColors.buttons.navigation.pressedBackground,
6405
- color: semanticColors.icons.active,
6458
+ backgroundColor: semanticColors.button.nav.bgPressed,
6459
+ color: semanticColors.color.icon.active,
6406
6460
  '&:hover': {
6407
- backgroundColor: semanticColors.buttons.navigation.pressedBackground,
6461
+ backgroundColor: semanticColors.button.nav.bgPressed,
6408
6462
  },
6409
6463
  },
6410
6464
  }));