Installation
색상, 간격, 타이포그래피 등 디자인 값을 어떤 환경에서도 동일하게 사용할 수 있는 토큰 패키지입니다.
Install
@7onic-ui/tokens
# npm
npm install @7onic-ui/tokens
# yarn
yarn add @7onic-ui/tokens
# pnpm
pnpm add @7onic-ui/tokensImport
CSS
CSS 변수만@import '@7onic-ui/tokens/css/all.css';개별 임포트
@import '@7onic-ui/tokens/css/variables.css';
@import '@7onic-ui/tokens/css/themes/light.css';
@import '@7onic-ui/tokens/css/themes/dark.css';<html class="dark">를 추가하면 시맨틱 색상이 자동으로 다크 테마로 전환됩니다.
Tailwind v4
설정 파일 불필요@import "tailwindcss";
@import '@7onic-ui/tokens/tailwind/v4.css';개별 임포트
@import "tailwindcss";
@import '@7onic-ui/tokens/css/variables.css';
@import '@7onic-ui/tokens/css/themes/light.css';
@import '@7onic-ui/tokens/css/themes/dark.css';
@import '@7onic-ui/tokens/tailwind/v4-theme.css';v4-theme.css가 없으면 bg-primary나 duration-fast 등의 클래스를 사용할 수 없습니다.
Tailwind v3
CSS + 프리셋@tailwind base;
@tailwind components;
@tailwind utilities;
@import '@7onic-ui/tokens/css/all.css';개별 임포트
@tailwind base;
@tailwind components;
@tailwind utilities;
@import '@7onic-ui/tokens/css/variables.css';
@import '@7onic-ui/tokens/css/themes/light.css';
@import '@7onic-ui/tokens/css/themes/dark.css';module.exports = {
presets: [
require('@7onic-ui/tokens/tailwind/v3-preset')
],
}프리셋은 theme.extend을 사용하므로 기존 Tailwind 클래스가 그대로 유지됩니다. ※ v3에서도 시맨틱 컬러의 opacity modifier(bg-primary/50 등)를 지원합니다. RGB 채널 변수를 사용해 알파값을 적용합니다.
JavaScript / TypeScript
정적 값import { colors, spacing, typography } from '@7onic-ui/tokens'ESM(.mjs)과 CJS(.js) 모두 지원합니다. TypeScript 타입 정의도 포함되어 있습니다.
Usage Reference
사용 가능한 토큰과 형식을 확인하세요.
Colors
--color-primarybg-primarycolors.primary[600]--color-secondarybg-secondarycolors.secondary[600]--color-successbg-successcolors.green[600]--color-warningbg-warningcolors.yellow[500]--color-errorbg-errorcolors.red[600]--color-background-mutedbg-background-mutedCSS only ※--color-texttext-foregroundCSS only ※--color-text-mutedtext-text-mutedCSS only ※--color-primary-texttext-primary-foregroundCSS only ※--color-borderborder-borderCSS only ※| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --color-primary | bg-primary | colors.primary[600] |
| --color-secondary | bg-secondary | colors.secondary[600] |
| --color-success | bg-success | colors.green[600] |
| --color-warning | bg-warning | colors.yellow[500] |
| --color-error | bg-error | colors.red[600] |
| --color-background-muted | bg-background-muted | CSS only ※ |
| --color-text | text-foreground | CSS only ※ |
| --color-text-muted | text-text-muted | CSS only ※ |
| --color-primary-text | text-primary-foreground | CSS only ※ |
| --color-border | border-border | CSS only ※ |
Typography
--font-size-2xs (11px)text-2xsfontSize["2xs"]--font-size-xs (12px)text-xsfontSize.xs--font-size-sm (13px)text-smfontSize.sm--font-size-md (14px)text-mdfontSize.md--font-size-base (16px)text-basefontSize.base--font-size-lg (18px)text-lgfontSize.lg--font-size-xl (20px)text-xlfontSize.xl--font-size-2xl (24px)text-2xlfontSize["2xl"]| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --font-size-2xs (11px) | text-2xs | fontSize["2xs"] |
| --font-size-xs (12px) | text-xs | fontSize.xs |
| --font-size-sm (13px) | text-sm | fontSize.sm |
| --font-size-md (14px) | text-md | fontSize.md |
| --font-size-base (16px) | text-base | fontSize.base |
| --font-size-lg (18px) | text-lg | fontSize.lg |
| --font-size-xl (20px) | text-xl | fontSize.xl |
| --font-size-2xl (24px) | text-2xl | fontSize["2xl"] |
Spacing
--spacing-1 (4px)p-1 m-1 gap-1spacing[1]--spacing-2 (8px)p-2 m-2 gap-2spacing[2]--spacing-4 (16px)p-4 m-4 gap-4spacing[4]--spacing-6 (24px)p-6 m-6 gap-6spacing[6]--spacing-8 (32px)p-8 m-8 gap-8spacing[8]| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --spacing-1 (4px) | p-1 m-1 gap-1 | spacing[1] |
| --spacing-2 (8px) | p-2 m-2 gap-2 | spacing[2] |
| --spacing-4 (16px) | p-4 m-4 gap-4 | spacing[4] |
| --spacing-6 (24px) | p-6 m-6 gap-6 | spacing[6] |
| --spacing-8 (32px) | p-8 m-8 gap-8 | spacing[8] |
Duration
--duration-fast (100ms)duration-fastduration.fast--duration-micro (150ms)duration-microduration.micro--duration-normal (200ms)duration-normalduration.normal--duration-slow (300ms)duration-slowduration.slow--duration-slower (400ms)duration-slowerduration.slower| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --duration-fast (100ms) | duration-fast | duration.fast |
| --duration-micro (150ms) | duration-micro | duration.micro |
| --duration-normal (200ms) | duration-normal | duration.normal |
| --duration-slow (300ms) | duration-slow | duration.slow |
| --duration-slower (400ms) | duration-slower | duration.slower |
Radius / Shadow / Z-Index
--radius-{sm|md|lg|...}rounded-{sm|md|lg|...}borderRadius.*--shadow-{xs|sm|md|lg|xl}shadow-{xs|sm|md|lg|xl}shadow.*--z-index-{modal|tooltip|...}z-{modal|tooltip|...}zIndex.*| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --radius-{sm|md|lg|...} | rounded-{sm|md|lg|...} | borderRadius.* |
| --shadow-{xs|sm|md|lg|xl} | shadow-{xs|sm|md|lg|xl} | shadow.* |
| --z-index-{modal|tooltip|...} | z-{modal|tooltip|...} | zIndex.* |
Custom Utilities
--icon-size-{xs|sm|md|lg|xl}icon-{xs|sm|md|lg|xl}iconSize.*--scale-{50|75|pressed}scale-{50|75|pressed}scale.*--opacity-{0~100}opacity-{0~100}opacity.*--easing-{ease|ease-in|...}ease-{in|out|in-out}easing.*--color-focus-ringfocus-ringCSS only ※@keyframes {name}animate-{name}CSS only ※| CSS Variable | Tailwind | JS / TS |
|---|---|---|
| --icon-size-{xs|sm|md|lg|xl} | icon-{xs|sm|md|lg|xl} | iconSize.* |
| --scale-{50|75|pressed} | scale-{50|75|pressed} | scale.* |
| --opacity-{0~100} | opacity-{0~100} | opacity.* |
| --easing-{ease|ease-in|...} | ease-{in|out|in-out} | easing.* |
| --color-focus-ring | focus-ring | CSS only ※ |
| @keyframes {name} | animate-{name} | CSS only ※ |
--spacing-4 등)는 고정값입니다. 시맨틱(--color-primary 등)은 라이트/다크 테마에 따라 전환됩니다.Package Contents
필요한 파일을 가져다 쓰세요. 모두 npx sync-tokens로 자동 생성됩니다.
@7onic-ui/tokens9개 배포 파일 + CLI + 소스
css/all.css추천css/variables.csscss/themes/light.csscss/themes/dark.csstailwind/v4.css추천tailwind/v3-preset.jstailwind/v4-theme.cssjs/index.jsCJSjs/index.mjsESMtypes/index.d.tsTypeScript 타입json/tokens.json플랫 JSONcli/sync.jsnpx sync-tokensllms.txtAI Integrationfigma-tokens.jsonSSOT유일한 편집 대상 파일
figma-tokens.json를 편집하고 npx sync-tokens를 실행하면 9개 파일이 모두 자동 재생성됩니다.
Token Sync
Figma에서 디자인 업데이트 → CLI 하나로 전체 파일에 반영
Figma
디자인 편집
JSON
익스포트
CLI
sync-tokens
Output
9개 파일
Figma
디자인 편집
JSON
토큰 익스포트
CLI
npx sync-tokens 실행
Output
9개 파일 자동 생성
$ npx sync-tokens
CLI Options
| Option | Description |
|---|---|
| --dry-run | 파일을 실제로 쓰지 않고 변경 사항을 미리 확인 |
| --force | 브레이킹 체인지 확인 프롬프트 건너뛰기 |
| --input <path> | figma-tokens.json 경로 (기본값: ./figma-tokens.json) |
| --output <dir> | 출력 디렉토리 (기본값: ./) |
Generated Files
CSS
variables.css
light.css
dark.css
Tailwind
v3-preset.js
v4-theme.css
JavaScript
index.js
index.mjs
Types + JSON
index.d.ts
tokens.json
Breaking Change Detection
기존 variables.css가 있으면 sync-tokens가 자동으로 변경 사항을 감지하고 diff를 표시합니다.
Diff 표시 — 추가, 변경, 삭제, 리네임을 색상으로 시각화
확인 프롬프트 — 브레이킹 체인지(삭제, 리네임)가 있을 경우 실행 전 확인 요청
하위 호환 alias — 리네임 감지 시 css/deprecated.css를 자동 생성해 기존 참조를 보호합니다.
--dry-run로 먼저 diff를 확인하거나, --force로 확인 프롬프트를 건너뛸 수 있습니다.
Tokens Studio 설정
Figma 커뮤니티에서 Tokens Studio 플러그인을 설치하세요
리포지토리의 figma-tokens.json을 플러그인에 가져오세요
GitHub 동기화를 설정하면 디자인과 코드 토큰이 자동 동기화됩니다 (선택사항)