Chakra UI의 시맨틱 토큰 ⚛

Chakra UI v1.8.0은 시맨틱 토큰이라는 새로운 기능을 도입했습니다.
시맨틱 토큰을 사용하면 일반 디자인 토큰에 매핑되는 Chakra 소품에서 특정 이름을 가진 토큰을 사용할 수 있습니다. 예를 들어 "green.500"색상에 매핑되는 "성공"이라는 색상 시맨틱 토큰을 만들 수 있습니다.

const theme = extendTheme({
  semanticTokens: {
    colors: {
      success: "green.500"
    }
  }
});


이제 "성공"토큰을 Chakra 구성 요소에서 "green.500"에 대한 "별칭"으로 사용할 수 있습니다.

<Button bg="success">Accept</Button>


이는 우리에게 다음과 같은 결과를 줄 것입니다.

<Button bg="green.500">Accept</Button>


시맨틱 값



또 다른 멋진 기능은 현재 테마를 기반으로 다른 값으로 매핑하는 것입니다. 예를 들어 시맨틱 토큰 "error"를 밝은 테마에서는 "red.600"으로, 어두운 테마에서는 "red.300"으로 매핑할 수 있습니다.

const theme = extendTheme({
  semanticTokens: {
    colors: {
      error: {
        default: "red.600",
        _dark: "red.300"
      }
    }
  }
});


이것은 정말 유용하며 현재와 같이 useColorModeValue의 사용을 줄일 수 있습니다.

<Button bg={useColorModeValue('red.600', 'red.300')}>Retry</Button>


"오류"시맨틱 토큰을 간단히 사용할 수 있습니다.

<Button bg="error">Retry</Button>


가능한 시맨틱 토큰 필드



색상에 대한 시맨틱 토큰을 생성할 뿐만 아니라 Chakra UI의 모든 스케일(글꼴 크기, 테두리, 반지름, 크기 등)에 대한 시맨틱 토큰을 생성할 수도 있습니다. 전체 목록herehere을 참조하십시오.

다음 예에서는 그림자 및 반지름에 대한 시맨틱 토큰을 만듭니다.

const theme = extendTheme({
  semanticTokens: {
    shadows: {
      card: {
        default: "md",
        _dark: "none"
      }
    },
    radii: {
      card: "lg"
    }
  }
});


이제 새 토큰을 다음과 같이 사용할 수 있습니다.

<Box boxShadow="card" borderRadius="card">Card Content</Box>


다음은 이러한 시맨틱 토큰을 시연하는 Lazar Nikolov(Chakra UI 핵심 팀원)의 codesandbox 데모입니다.



다음 단계로 나아가기



위에서 배운 모든 것을 사용하여 차크라의 기본 색상과 유사한 변형(50-900)이 있는 시맨틱 토큰 기반 디자인 시스템을 만들 수 있습니다.
사용 가능한 색조(50-900)에 대한 배열을 만드는 것으로 시작합니다.

const availableColorTints = [
  '50',
  '100',
  '200',
  '300',
  '400',
  '500',
  '600',
  '700',
  '800',
  '900',
];


이제 시맨틱 토큰 -> 차크라 테마 색상의 맵을 생성해 보겠습니다.

const tokenToColorMap = {
  primary: 'blue',
  accent: 'teal',
  success: 'green',
  warning: 'orange',
  error: 'red',
  neutral: 'gray',
};


이제 tints 배열과 토큰 맵을 사용하여 테마의 색상 개체를 빌드하고 useColorModeValue 호출을 방지하는 데 도움이 되는 어둡고 밝은 테마에 대한 간단한 색상 반전 논리를 포함할 것입니다.
(primary.300은 어두운 테마의 경우 blue.300이 되고 밝은 테마의 경우 blue.600이 됩니다. 내 경험상 동일한 색상으로 두는 것보다 더 나은 결과를 제공합니다.)

const colors = Object.entries(tokenToColorMap).reduce((acc, [token, color]) => {
  availableColorTints.forEach((tint, index) => {
    acc[`${token}.${tint}`] = {
      default: `${color}.${availableColorTints[availableColorTints.length - 1 - index]}`,
      _dark: `${color}.${tint}`,
    };
  });
  return acc;
}, {});


이렇게 하면 런타임에 다음 색상 개체가 생성됩니다.

{
  primary.50: {
    default: "blue.900",
    _dark: "blue.50"
  },
  primary.100: {
    default: "blue.800",
    _dark: "blue.100"
  },
  primary.200: {
    default: "blue.700",
    _dark: "blue.200"
  },
  primary.300: {
    default: "blue.600",
    _dark: "blue.300"
  },
  primary.400: {
    default: "blue.500",
    _dark: "blue.400"
  },
  primary.500: {
    default: "blue.400",
    _dark: "blue.500"
  },
  primary.600: {
    default: "blue.300",
    _dark: "blue.600"
  },
  primary.700: {
    default: "blue.200",
    _dark: "blue.700"
  },
  primary.800: {
    default: "blue.100",
    _dark: "blue.800"
  },
  primary.900: {
    default: "blue.50",
    _dark: "blue.900"
  },
  accent.50: {
    default: "teal.900",
    _dark: "teal.50"
  },
  // etc.
}


이제 우리는 구성 요소에서 멋진 새 시맨틱 토큰을 사용할 수 있습니다.

<Button bg="primary.300" color="neutral.300">Ok</Button>
<Button bg="accent.400" color="neutral.400">Cancel</Button>
<Box bg="error.300" borderColor="error.400">Something went wrong</Box>


테마 파일 및 사용법의 전체 예는 my personal website's github page 에서 볼 수 있습니다.

요약



시맨틱 토큰이 무엇인지, 이점은 무엇인지, Chakra UI의 내장 토큰을 기반으로 하는 디자인 시스템을 구축할 때 이를 어떻게 활용할 수 있는지에 대해 논의했습니다.

읽어 주셔서 감사합니다! 🚀


시맨틱 토큰에 대한 자세한 내용은 Chakra UI's docs을 참조하십시오.

좋은 웹페이지 즐겨찾기