feat: Figma 디자인 토큰 531개를 @fox/styles로 이식
Figma 컬렉션 5개(primitive/theme/size/테마/반응형)·모드 7개를 옮겼다. 색상은 light/dark를 light-dark() 한 줄에 묶어 테마 드리프트를 구조적으로 막고, 반응형 크기는 모바일 우선으로 깔고 768px 이상에서 pc 값이 덮는다. Figma의 alias를 CSS에서도 var() 참조로 보존했다 — 색상 표현 542개 중 476개가 primitive/theme를 참조하므로 바닥층을 바꾸면 시맨틱까지 전파된다. 참조 대상이 없거나 값이 어긋나는 것만 리터럴로 떨어뜨렸다. 알파 색상은 rgb(R G B / A)로 낸다. hex는 알파를 담지 못해 그대로 두면 반투명이 불투명이 된다. 루트에 소속 없이 들어 있던 29개는 두 번째 theme 컬렉션(미제공)을 참조하며 chart-alt로 명명했다 — 이름은 임시다. Co-Authored-By: Claude Opus 5
@c619a3b9c3f30b4e4e7c143da43dced20bb1f5cc
+++ @fox/styles/_functions.scss
... | ... | @@ -0,0 +1,103 @@ |
| 1 | +// 토큰 접근 함수 — 디자인 시스템 규율을 **컴파일러가 강제**하는 지점. | |
| 2 | +// | |
| 3 | +// 화면 코드는 `color: #256EF4`나 `padding: 13px`를 쓸 수 없고, 반드시 | |
| 4 | +// `color: fox.color(font-neutral-strong)` / `padding: fox.padding(6)`로 토큰을 | |
| 5 | +// 지목해야 한다. 존재하지 않는 이름을 쓰면 `@error`로 **빌드가 실패**하고 사용 | |
| 6 | +// 가능한 토큰 목록이 함께 출력된다. | |
| 7 | +// | |
| 8 | +// 반환값은 CSS 커스텀 프로퍼티 참조(`var(--fox-*)`)다. 값이 아니라 참조를 돌려주므로 | |
| 9 | +// (1) 라이트/다크와 pc/모바일이 런타임에 전환되고 (2) 특정 영역만 토큰을 덮어쓰는 | |
| 10 | +// 스코프 오버라이드가 가능하며 (3) devtools에서 어떤 토큰인지 그대로 보인다. | |
| 11 | + | |
| 12 | +@use "sass:map"; | |
| 13 | +@use "tokens"; | |
| 14 | + | |
| 15 | +/// 토큰 이름을 검증하고 커스텀 프로퍼티 참조를 반환한다. | |
| 16 | +@function _token($group, $key, $registry, $var-name) { | |
| 17 | + @if not map.has-key($registry, $key) { | |
| 18 | + @error "[@fox] 알 수 없는 #{$group} 토큰: `#{$key}` — 사용 가능한 값: #{map.keys($registry)}"; | |
| 19 | + } | |
| 20 | + | |
| 21 | + @return var(--fox-#{$var-name}); | |
| 22 | +} | |
| 23 | + | |
| 24 | + | |
| 25 | +@function color($name) { | |
| 26 | + @return _token("color", $name, tokens.$color, "color-#{$name}"); | |
| 27 | +} | |
| 28 | + | |
| 29 | +@function primitive($name) { | |
| 30 | + @return _token("primitive", $name, tokens.$primitive, "primitive-#{$name}"); | |
| 31 | +} | |
| 32 | + | |
| 33 | +@function theme($name) { | |
| 34 | + @return _token("theme", $name, tokens.$theme, "theme-#{$name}"); | |
| 35 | +} | |
| 36 | + | |
| 37 | +@function number($name) { | |
| 38 | + @return _token("number", $name, tokens.$number, "number-#{$name}"); | |
| 39 | +} | |
| 40 | + | |
| 41 | +@function font-family($name) { | |
| 42 | + @return _token("font-family", "family-#{$name}", tokens.$font, "font-family-#{$name}"); | |
| 43 | +} | |
| 44 | + | |
| 45 | +@function font-weight($name) { | |
| 46 | + @return _token("font-weight", "weight-#{$name}", tokens.$font, "font-weight-#{$name}"); | |
| 47 | +} | |
| 48 | + | |
| 49 | +@function border($name) { | |
| 50 | + @return _token("border", "border-#{$name}", tokens.$size, "border-#{$name}"); | |
| 51 | +} | |
| 52 | + | |
| 53 | +@function padding($name) { | |
| 54 | + @return _token("padding", "padding-#{$name}", tokens.$size, "padding-#{$name}"); | |
| 55 | +} | |
| 56 | + | |
| 57 | +@function gap($name) { | |
| 58 | + @return _token("gap", "gap-#{$name}", tokens.$size, "gap-#{$name}"); | |
| 59 | +} | |
| 60 | + | |
| 61 | +@function radius($name) { | |
| 62 | + @return _token("radius", "radius-#{$name}", tokens.$size, "radius-#{$name}"); | |
| 63 | +} | |
| 64 | + | |
| 65 | +@function icon($name) { | |
| 66 | + @return _token("icon", "icon-#{$name}", tokens.$size, "icon-#{$name}"); | |
| 67 | +} | |
| 68 | + | |
| 69 | +@function shadow($name) { | |
| 70 | + @return _token("shadow", "shadow-#{$name}", tokens.$size, "shadow-#{$name}"); | |
| 71 | +} | |
| 72 | + | |
| 73 | +@function backdrop($name) { | |
| 74 | + @return _token("backdrop", "backdrop-#{$name}", tokens.$size, "backdrop-#{$name}"); | |
| 75 | +} | |
| 76 | + | |
| 77 | +@function font-size($name) { | |
| 78 | + @return _token("font-size", "font-size-#{$name}", tokens.$responsive, "font-size-#{$name}"); | |
| 79 | +} | |
| 80 | + | |
| 81 | +@function form($name) { | |
| 82 | + @return _token("form", "form-#{$name}", tokens.$responsive, "form-#{$name}"); | |
| 83 | +} | |
| 84 | + | |
| 85 | +@function grid($name) { | |
| 86 | + @return _token("grid", "grid-#{$name}", tokens.$responsive, "grid-#{$name}"); | |
| 87 | +} | |
| 88 | + | |
| 89 | +@function card($name) { | |
| 90 | + @return _token("card", "card-#{$name}", tokens.$responsive, "card-#{$name}"); | |
| 91 | +} | |
| 92 | + | |
| 93 | +@function modal($name) { | |
| 94 | + @return _token("modal", "modal-#{$name}", tokens.$responsive, "modal-#{$name}"); | |
| 95 | +} | |
| 96 | + | |
| 97 | +@function spacing($name) { | |
| 98 | + @return _token("spacing", "spacing-#{$name}", tokens.$responsive, "spacing-#{$name}"); | |
| 99 | +} | |
| 100 | + | |
| 101 | +@function section($name) { | |
| 102 | + @return _token("section", "section-#{$name}", tokens.$responsive, "section-#{$name}"); | |
| 103 | +} |
+++ @fox/styles/_mixins.scss
... | ... | @@ -0,0 +1,20 @@ |
| 1 | +// 믹스인 — 여러 선언이 항상 함께 가야 하는 패턴을 묶는다. | |
| 2 | + | |
| 3 | +@use "tokens"; | |
| 4 | + | |
| 5 | +/// PC 이상(>= 768px)에서 적용. 모바일 우선이므로 기본 스타일은 밖에 쓴다. | |
| 6 | +/// | |
| 7 | +/// ⚠️ 미디어 쿼리 조건부는 `var()`를 해석하지 못하므로 브레이크포인트만은 CSS 변수가 | |
| 8 | +/// 아닌 컴파일타임 값이다. 그래서 이 믹스인 경유가 강제된다. | |
| 9 | +@mixin pc { | |
| 10 | + @media (min-width: tokens.$breakpoint-pc) { | |
| 11 | + @content; | |
| 12 | + } | |
| 13 | +} | |
| 14 | + | |
| 15 | +/// PC 미만에서만 적용. `pc`와 경계가 겹치지 않도록 0.02px을 뺀다. | |
| 16 | +@mixin mobile { | |
| 17 | + @media (max-width: tokens.$breakpoint-pc - 0.02px) { | |
| 18 | + @content; | |
| 19 | + } | |
| 20 | +} |
+++ @fox/styles/_root.scss
... | ... | @@ -0,0 +1,71 @@ |
| 1 | +// 토큰 CSS 출력 — `tokens/`의 SCSS map을 `--fox-*` 커스텀 프로퍼티로 선언한다. | |
| 2 | +// | |
| 3 | +// **앱 전체에서 딱 한 번만 로드되어야 한다** (`index.scss` 경유). | |
| 4 | +// 컴포넌트의 `.module.scss`에서는 절대 `@use` 하지 않는다. | |
| 5 | +// | |
| 6 | +// map을 순회해 생성하므로 토큰을 추가할 때 이 파일은 손대지 않는다. | |
| 7 | + | |
| 8 | +@use "sass:map"; | |
| 9 | +@use "tokens"; | |
| 10 | + | |
| 11 | +:root { | |
| 12 | + // 기본은 OS 설정 추종. 아래 `[data-theme]` 규칙이 이 값만 덮어써 수동 선택을 | |
| 13 | + // 처리하므로, 색상 값 자체는 `tokens/_color.scss` 한 곳에만 존재한다. | |
| 14 | + color-scheme: light dark; | |
| 15 | + | |
| 16 | + @each $name, $value in tokens.$primitive { | |
| 17 | + --fox-primitive-#{$name}: #{$value}; | |
| 18 | + } | |
| 19 | + | |
| 20 | + @each $name, $value in tokens.$font { | |
| 21 | + --fox-font-#{$name}: #{$value}; | |
| 22 | + } | |
| 23 | + | |
| 24 | + @each $name, $value in tokens.$number { | |
| 25 | + --fox-number-#{$name}: #{$value}; | |
| 26 | + } | |
| 27 | + | |
| 28 | + @each $name, $value in tokens.$theme { | |
| 29 | + --fox-theme-#{$name}: #{$value}; | |
| 30 | + } | |
| 31 | + | |
| 32 | + // size / color / responsive 는 이름에 그룹이 이미 들어 있어 접두사가 `--fox-` 뿐이다. | |
| 33 | + @each $name, $value in tokens.$size { | |
| 34 | + --fox-#{$name}: #{$value}; | |
| 35 | + } | |
| 36 | + | |
| 37 | + @each $name, $value in tokens.$color { | |
| 38 | + --fox-color-#{$name}: #{$value}; | |
| 39 | + } | |
| 40 | + | |
| 41 | + // 모바일 우선 기본값. | |
| 42 | + @each $name, $value in tokens.$responsive { | |
| 43 | + --fox-#{$name}: #{$value}; | |
| 44 | + } | |
| 45 | +} | |
| 46 | + | |
| 47 | +// PC 모드 — 반응형 토큰만 덮어쓴다. 색상은 뷰포트와 무관하므로 여기 오지 않는다. | |
| 48 | +@media (min-width: tokens.$breakpoint-pc) { | |
| 49 | + :root { | |
| 50 | + @each $name, $value in tokens.$responsive-pc { | |
| 51 | + --fox-#{$name}: #{$value}; | |
| 52 | + } | |
| 53 | + } | |
| 54 | +} | |
| 55 | + | |
| 56 | +// 수동 테마 선택 — `color-scheme`만 고정하면 `light-dark()`가 해당 분기로 확정된다. | |
| 57 | +// 속성이 없거나 `"system"`이면 위 `:root`의 `light dark`가 유지되어 OS를 따른다. | |
| 58 | +:root[data-theme="light"] { | |
| 59 | + color-scheme: light; | |
| 60 | +} | |
| 61 | + | |
| 62 | +:root[data-theme="dark"] { | |
| 63 | + color-scheme: dark; | |
| 64 | +} | |
| 65 | + | |
| 66 | +// ⚠️ 1rem = 10px 규약의 근거. 브라우저 기본 글자 크기(16px)의 62.5%가 10px다. | |
| 67 | +// 모든 토큰의 rem 값이 이 선언을 전제로 계산돼 있다. | |
| 68 | +// 미디어 쿼리 안의 rem은 이 값의 영향을 받지 않는다(항상 브라우저 기본 크기 기준). | |
| 69 | +html { | |
| 70 | + font-size: 62.5%; | |
| 71 | +} |
+++ @fox/styles/abstracts.scss
... | ... | @@ -0,0 +1,17 @@ |
| 1 | +// 저작(authoring) 진입점 — 컴포넌트의 `.module.scss`가 `@use`하는 파일. | |
| 2 | +// | |
| 3 | +// @use "@fox/styles/abstracts" as fox; | |
| 4 | +// | |
| 5 | +// .button { | |
| 6 | +// padding: fox.padding(5) fox.padding(7); | |
| 7 | +// background: fox.color(button-primary-surface); | |
| 8 | +// border-radius: fox.radius(3); | |
| 9 | +// font-size: fox.font-size(label-md); | |
| 10 | +// } | |
| 11 | +// | |
| 12 | +// ⚠️ **이 파일은 CSS를 한 줄도 출력하지 않는다.** 함수·믹스인·map 정의만 있다. | |
| 13 | +// 실제 CSS 출력(토큰 선언)은 앱이 딱 한 번 import하는 `index.scss`가 전담한다. | |
| 14 | + | |
| 15 | +@forward "tokens"; | |
| 16 | +@forward "functions"; | |
| 17 | +@forward "mixins"; |
--- @fox/styles/index.scss
+++ @fox/styles/index.scss
... | ... | @@ -1,0 +1,10 @@ |
| 1 |
+// 글로벌 스타일 진입점 — **호스트 앱이 딱 한 번 import한다.** |
|
| 2 |
+// |
|
| 3 |
+// // app/globals.scss |
|
| 4 |
+// @use "@fox/styles"; |
|
| 5 |
+// |
|
| 6 |
+// 여기서만 CSS가 출력된다. 컴포넌트의 `.module.scss`는 이 파일이 아니라 |
|
| 7 |
+// `abstracts.scss`를 `@use`해야 한다 — 그쪽은 CSS 출력이 0이라 몇 번을 참조해도 |
|
| 8 |
+// 중복이 생기지 않는다. |
|
| 9 |
+ |
|
| 10 |
+@use "root"; |
+++ @fox/styles/tokens/_color.scss
... | ... | @@ -0,0 +1,283 @@ |
| 1 | +// ⚠️ 이 파일은 Figma Design Tokens export에서 **자동 생성**되었습니다. | |
| 2 | +// 원본: light.tokens.json / dark.tokens.json | |
| 3 | +// 손으로 고치지 말고 원본 JSON을 다시 export한 뒤 변환기를 재실행하세요. | |
| 4 | + | |
| 5 | +// 시맨틱 색상 — 라이트/다크 값을 `light-dark()` 한 줄에 함께 보유한다. | |
| 6 | +// 전환은 `_root.scss`의 `color-scheme`이 담당하므로 다크 전용 블록이 없고, | |
| 7 | +// 따라서 한쪽만 고쳐서 생기는 테마 불일치가 구조적으로 불가능하다. | |
| 8 | +// | |
| 9 | +// 값이 `var(--fox-primitive-*)` / `var(--fox-theme-*)`인 항목은 Figma의 alias를 | |
| 10 | +// 그대로 옮긴 것이다 — 바닥층을 바꾸면 여기까지 전파된다. | |
| 11 | +$color: ( | |
| 12 | + background-default: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-100)), | |
| 13 | + background-neutral: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-95)), | |
| 14 | + background-neutral-strong: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 15 | + background-primary: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 16 | + background-secondary: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 17 | + background-accent: light-dark(var(--fox-theme-accent-5), var(--fox-theme-accent-95)), | |
| 18 | + background-dim: light-dark(var(--fox-primitive-alpha-black50), var(--fox-primitive-alpha-black75)), | |
| 19 | + background-dim-inverse: light-dark(var(--fox-primitive-alpha-white50), var(--fox-primitive-alpha-black75)), | |
| 20 | + surface-neutral-default: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-95)), | |
| 21 | + surface-neutral-default-strong: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-90)), | |
| 22 | + surface-neutral-default-static: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-0)), | |
| 23 | + surface-neutral-default-inverse: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-10)), | |
| 24 | + surface-neutral-default-inverse-static: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-90)), | |
| 25 | + surface-neutral-gray: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-90)), | |
| 26 | + surface-neutral-gray-strong: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-80)), | |
| 27 | + surface-neutral-gray-stronger: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-70)), | |
| 28 | + surface-neutral-gray-inverse: light-dark(var(--fox-primitive-neutral-80), var(--fox-primitive-neutral-20)), | |
| 29 | + surface-neutral-gray-strong-inverse: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-30)), | |
| 30 | + surface-neutral-gray-stronger-inverse: light-dark(var(--fox-primitive-neutral-60), var(--fox-primitive-neutral-40)), | |
| 31 | + surface-neutral-disabled: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-70)), | |
| 32 | + surface-theme-primary: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 33 | + surface-theme-primary-inverse: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-40)), | |
| 34 | + surface-theme-secondary: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 35 | + surface-theme-secondary-inverse: light-dark(var(--fox-theme-secondary-60), var(--fox-theme-secondary-40)), | |
| 36 | + surface-theme-accent: light-dark(var(--fox-theme-accent-5), var(--fox-theme-accent-95)), | |
| 37 | + surface-theme-accent-inverse: light-dark(var(--fox-theme-accent-60), var(--fox-theme-accent-40)), | |
| 38 | + surface-system-danger: light-dark(var(--fox-primitive-danger-5), var(--fox-primitive-danger-95)), | |
| 39 | + surface-system-danger-inverse: light-dark(var(--fox-primitive-danger-60), var(--fox-primitive-danger-40)), | |
| 40 | + surface-system-warning: light-dark(var(--fox-primitive-warning-5), var(--fox-primitive-warning-95)), | |
| 41 | + surface-system-warning-inverse: light-dark(var(--fox-primitive-warning-60), var(--fox-primitive-warning-40)), | |
| 42 | + surface-system-success: light-dark(var(--fox-primitive-success-5), var(--fox-primitive-success-95)), | |
| 43 | + surface-system-success-inverse: light-dark(var(--fox-primitive-success-60), var(--fox-primitive-success-40)), | |
| 44 | + surface-system-information: light-dark(var(--fox-primitive-information-5), var(--fox-primitive-information-95)), | |
| 45 | + surface-system-information-inverse: light-dark(var(--fox-primitive-information-60), var(--fox-primitive-information-40)), | |
| 46 | + border-neutral-default: light-dark(var(--fox-primitive-neutral-30), var(--fox-primitive-neutral-70)), | |
| 47 | + border-neutral-subtle: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-80)), | |
| 48 | + border-neutral-subtler: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 49 | + border-neutral-strong: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-0)), | |
| 50 | + border-neutral-disabled: light-dark(var(--fox-primitive-neutral-30), var(--fox-primitive-neutral-70)), | |
| 51 | + border-neutral-overlay: light-dark(var(--fox-primitive-alpha-black10), var(--fox-primitive-alpha-white25)), | |
| 52 | + border-theme-primary: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 53 | + border-theme-primary-inverse: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-90)), | |
| 54 | + border-theme-secondary: light-dark(var(--fox-theme-secondary-60), var(--fox-theme-secondary-40)), | |
| 55 | + border-theme-secondary-inverse: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-90)), | |
| 56 | + border-theme-accent: light-dark(var(--fox-theme-accent-50), var(--fox-theme-accent-50)), | |
| 57 | + border-theme-accent-inverse: light-dark(var(--fox-theme-accent-10), var(--fox-theme-accent-90)), | |
| 58 | + border-system-danger: light-dark(var(--fox-primitive-danger-50), var(--fox-primitive-danger-50)), | |
| 59 | + border-system-danger-inverse: light-dark(var(--fox-primitive-danger-10), var(--fox-primitive-danger-90)), | |
| 60 | + border-system-warning: light-dark(var(--fox-primitive-warning-50), var(--fox-primitive-warning-50)), | |
| 61 | + border-system-warning-inverse: light-dark(var(--fox-primitive-warning-10), var(--fox-primitive-warning-90)), | |
| 62 | + border-system-success: light-dark(var(--fox-primitive-success-50), var(--fox-primitive-success-50)), | |
| 63 | + border-system-success-inverse: light-dark(var(--fox-primitive-success-10), var(--fox-primitive-success-90)), | |
| 64 | + border-system-information: light-dark(var(--fox-primitive-information-50), var(--fox-primitive-information-50)), | |
| 65 | + border-system-information-inverse: light-dark(var(--fox-primitive-information-10), var(--fox-primitive-information-90)), | |
| 66 | + font-neutral-strong: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-5)), | |
| 67 | + font-neutral-default: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-20)), | |
| 68 | + font-neutral-subtle: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-30)), | |
| 69 | + font-neutral-subtler: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-40)), | |
| 70 | + font-neutral-strong-inverse: light-dark(var(--fox-primitive-alpha-white100), var(--fox-primitive-neutral-95)), | |
| 71 | + font-neutral-default-inverse: light-dark(var(--fox-primitive-alpha-white75), var(--fox-primitive-neutral-90)), | |
| 72 | + font-neutral-subtle-inverse: light-dark(var(--fox-primitive-alpha-white50), var(--fox-primitive-neutral-80)), | |
| 73 | + font-neutral-subtler-inverse: light-dark(var(--fox-primitive-alpha-white25), var(--fox-primitive-neutral-70)), | |
| 74 | + font-neutral-static: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-90)), | |
| 75 | + font-neutral-static-inverse: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-0)), | |
| 76 | + font-neutral-disabled: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-60)), | |
| 77 | + font-neutral-disabled-strong: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-50)), | |
| 78 | + font-theme-primary: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-20)), | |
| 79 | + font-theme-primary-inverse: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-70)), | |
| 80 | + font-theme-secondary: light-dark(var(--fox-theme-secondary-60), var(--fox-theme-secondary-20)), | |
| 81 | + font-theme-secondary-inverse: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-70)), | |
| 82 | + font-theme-accent: light-dark(var(--fox-theme-accent-60), var(--fox-theme-accent-20)), | |
| 83 | + font-theme-accent-inverse: light-dark(var(--fox-theme-accent-10), var(--fox-theme-accent-70)), | |
| 84 | + font-system-danger: light-dark(var(--fox-primitive-danger-60), var(--fox-primitive-danger-20)), | |
| 85 | + font-system-danger-inverse: light-dark(var(--fox-primitive-danger-10), var(--fox-primitive-danger-70)), | |
| 86 | + font-system-warning: light-dark(var(--fox-primitive-warning-60), var(--fox-primitive-warning-20)), | |
| 87 | + font-system-warning-inverse: light-dark(var(--fox-primitive-warning-10), var(--fox-primitive-warning-70)), | |
| 88 | + font-system-success: light-dark(var(--fox-primitive-success-60), var(--fox-primitive-success-20)), | |
| 89 | + font-system-success-inverse: light-dark(var(--fox-primitive-success-10), var(--fox-primitive-success-70)), | |
| 90 | + font-system-information: light-dark(var(--fox-primitive-information-60), var(--fox-primitive-information-20)), | |
| 91 | + font-system-information-inverse: light-dark(var(--fox-primitive-information-10), var(--fox-primitive-information-70)), | |
| 92 | + icon-neutral-strong: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-5)), | |
| 93 | + icon-neutral-default: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-20)), | |
| 94 | + icon-neutral-subtle: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-30)), | |
| 95 | + icon-neutral-subtler: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-40)), | |
| 96 | + icon-neutral-fill: light-dark(var(--fox-primitive-alpha-black25), var(--fox-primitive-alpha-white25)), | |
| 97 | + icon-neutral-strong-inverse: light-dark(var(--fox-primitive-alpha-white100), var(--fox-primitive-neutral-95)), | |
| 98 | + icon-neutral-default-inverse: light-dark(var(--fox-primitive-alpha-white75), var(--fox-primitive-neutral-90)), | |
| 99 | + icon-neutral-subtle-inverse: light-dark(var(--fox-primitive-alpha-white50), var(--fox-primitive-neutral-80)), | |
| 100 | + icon-neutral-subtler-inverse: light-dark(var(--fox-primitive-alpha-white25), var(--fox-primitive-neutral-70)), | |
| 101 | + icon-neutral-fill-inverse: light-dark(var(--fox-primitive-alpha-white25), var(--fox-primitive-neutral-70)), | |
| 102 | + icon-neutral-static: light-dark(var(--fox-primitive-neutral-90), var(--fox-primitive-neutral-90)), | |
| 103 | + icon-neutral-static-inverse: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-0)), | |
| 104 | + icon-neutral-disabled: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-60)), | |
| 105 | + icon-neutral-disabled-strong: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-50)), | |
| 106 | + icon-theme-primary: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-20)), | |
| 107 | + icon-theme-primary-strong: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-30)), | |
| 108 | + icon-theme-primary-static: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 109 | + icon-theme-primary-inverse: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-70)), | |
| 110 | + icon-theme-secondary: light-dark(var(--fox-theme-secondary-60), var(--fox-theme-secondary-30)), | |
| 111 | + icon-theme-secondary-strong: light-dark(var(--fox-theme-secondary-70), var(--fox-theme-secondary-40)), | |
| 112 | + icon-theme-secondary-static: light-dark(var(--fox-theme-secondary-50), var(--fox-theme-secondary-50)), | |
| 113 | + icon-theme-secondary-inverse: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-70)), | |
| 114 | + icon-theme-accent: light-dark(var(--fox-theme-accent-50), var(--fox-theme-accent-20)), | |
| 115 | + icon-theme-accent-strong: light-dark(var(--fox-theme-accent-60), var(--fox-theme-accent-30)), | |
| 116 | + icon-theme-accent-static: light-dark(var(--fox-theme-accent-50), var(--fox-theme-accent-50)), | |
| 117 | + icon-theme-accent-inverse: light-dark(var(--fox-theme-accent-10), var(--fox-theme-accent-70)), | |
| 118 | + icon-system-danger: light-dark(var(--fox-primitive-danger-50), var(--fox-primitive-danger-20)), | |
| 119 | + icon-system-danger-strong: light-dark(var(--fox-primitive-danger-60), var(--fox-primitive-danger-30)), | |
| 120 | + icon-system-danger-inverse: light-dark(var(--fox-primitive-danger-10), var(--fox-primitive-danger-70)), | |
| 121 | + icon-system-warning: light-dark(var(--fox-primitive-warning-50), var(--fox-primitive-warning-20)), | |
| 122 | + icon-system-warning-strong: light-dark(var(--fox-primitive-warning-60), var(--fox-primitive-warning-30)), | |
| 123 | + icon-system-warning-inverse: light-dark(var(--fox-primitive-warning-10), var(--fox-primitive-warning-70)), | |
| 124 | + icon-system-success: light-dark(var(--fox-primitive-success-50), var(--fox-primitive-success-20)), | |
| 125 | + icon-system-success-strong: light-dark(var(--fox-primitive-success-60), var(--fox-primitive-success-30)), | |
| 126 | + icon-system-success-inverse: light-dark(var(--fox-primitive-success-10), var(--fox-primitive-success-70)), | |
| 127 | + icon-system-information: light-dark(var(--fox-primitive-information-50), var(--fox-primitive-information-20)), | |
| 128 | + icon-system-information-strong: light-dark(var(--fox-primitive-information-60), var(--fox-primitive-information-30)), | |
| 129 | + icon-system-information-inverse: light-dark(var(--fox-primitive-information-10), var(--fox-primitive-information-70)), | |
| 130 | + element-neutral-strong: light-dark(var(--fox-primitive-neutral-60), var(--fox-primitive-neutral-40)), | |
| 131 | + element-neutral-default: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-50)), | |
| 132 | + element-neutral-subtle: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 133 | + element-neutral-subtler: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-95)), | |
| 134 | + element-neutral-inverse: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-95)), | |
| 135 | + element-neutral-inverse-static: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-0)), | |
| 136 | + element-neutral-alpha: light-dark(rgb(0 0 0 / 0.25), rgb(0 0 0 / 0.5)), | |
| 137 | + element-neutral-alpha-inverse: light-dark(rgb(255 255 255 / 0.5), rgb(255 255 255 / 0.25)), | |
| 138 | + element-neutral-disabled: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-80)), | |
| 139 | + element-neutral-disabled-strong: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-60)), | |
| 140 | + element-theme-primary: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 141 | + element-theme-primary-strong: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-40)), | |
| 142 | + element-theme-primary-subtle: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-90)), | |
| 143 | + element-theme-primary-subtler: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 144 | + element-theme-secondary: light-dark(var(--fox-theme-secondary-70), var(--fox-theme-secondary-60)), | |
| 145 | + element-theme-secondary-strong: light-dark(var(--fox-theme-secondary-70), var(--fox-theme-secondary-60)), | |
| 146 | + element-theme-secondary-subtle: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-90)), | |
| 147 | + element-theme-secondary-subtler: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 148 | + element-theme-accent: light-dark(var(--fox-theme-accent-50), var(--fox-theme-accent-50)), | |
| 149 | + element-theme-accent-strong: light-dark(var(--fox-theme-accent-60), var(--fox-theme-accent-40)), | |
| 150 | + element-theme-accent-subtle: light-dark(var(--fox-theme-accent-10), var(--fox-theme-accent-90)), | |
| 151 | + element-theme-accent-subtler: light-dark(var(--fox-theme-accent-5), var(--fox-theme-accent-95)), | |
| 152 | + element-system-danger: light-dark(var(--fox-primitive-danger-50), var(--fox-primitive-danger-50)), | |
| 153 | + element-system-danger-strong: light-dark(var(--fox-primitive-danger-60), var(--fox-primitive-danger-40)), | |
| 154 | + element-system-danger-inverse: light-dark(var(--fox-primitive-danger-5), var(--fox-primitive-danger-95)), | |
| 155 | + element-system-warning: light-dark(var(--fox-primitive-warning-30), var(--fox-primitive-warning-30)), | |
| 156 | + element-system-warning-strong: light-dark(var(--fox-primitive-warning-50), var(--fox-primitive-warning-20)), | |
| 157 | + element-system-warning-inverse: light-dark(var(--fox-primitive-warning-5), var(--fox-primitive-warning-95)), | |
| 158 | + element-system-success: light-dark(var(--fox-primitive-success-50), var(--fox-primitive-success-50)), | |
| 159 | + element-system-success-strong: light-dark(var(--fox-primitive-success-60), var(--fox-primitive-success-40)), | |
| 160 | + element-system-success-inverse: light-dark(var(--fox-primitive-success-5), var(--fox-primitive-success-95)), | |
| 161 | + element-system-information: light-dark(var(--fox-primitive-information-50), var(--fox-primitive-information-50)), | |
| 162 | + element-system-information-strong: light-dark(var(--fox-primitive-information-60), var(--fox-primitive-information-40)), | |
| 163 | + element-system-information-inverse: light-dark(var(--fox-primitive-information-5), var(--fox-primitive-information-95)), | |
| 164 | + alpha-default100: light-dark(var(--fox-primitive-alpha-white100), var(--fox-primitive-alpha-black100)), | |
| 165 | + alpha-default75: light-dark(var(--fox-primitive-alpha-white75), var(--fox-primitive-alpha-black75)), | |
| 166 | + alpha-default50: light-dark(var(--fox-primitive-alpha-white50), var(--fox-primitive-alpha-black50)), | |
| 167 | + alpha-default25: light-dark(var(--fox-primitive-alpha-white25), var(--fox-primitive-alpha-black25)), | |
| 168 | + alpha-default10: light-dark(var(--fox-primitive-alpha-white10), var(--fox-primitive-alpha-black10)), | |
| 169 | + alpha-default0: light-dark(var(--fox-primitive-alpha-white0), var(--fox-primitive-alpha-black0)), | |
| 170 | + alpha-default-inverse100: light-dark(var(--fox-primitive-alpha-black100), var(--fox-primitive-alpha-white100)), | |
| 171 | + alpha-default-inverse75: light-dark(var(--fox-primitive-alpha-black75), var(--fox-primitive-alpha-white75)), | |
| 172 | + alpha-default-inverse50: light-dark(var(--fox-primitive-alpha-black50), var(--fox-primitive-alpha-white50)), | |
| 173 | + alpha-default-inverse25: light-dark(var(--fox-primitive-alpha-black25), var(--fox-primitive-alpha-white25)), | |
| 174 | + alpha-default-inverse10: light-dark(var(--fox-primitive-alpha-black10), var(--fox-primitive-alpha-white10)), | |
| 175 | + alpha-default-inverse0: light-dark(var(--fox-primitive-alpha-black0), var(--fox-primitive-alpha-white0)), | |
| 176 | + action-default: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-100)), | |
| 177 | + action-default-hover: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-95)), | |
| 178 | + action-default-pressed: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 179 | + action-default-selected: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 180 | + action-default-active: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-60)), | |
| 181 | + action-neutral: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-95)), | |
| 182 | + action-neutral-hover: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-90)), | |
| 183 | + action-neutral-pressed: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-80)), | |
| 184 | + action-neutral-selected: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-80)), | |
| 185 | + action-neutral-active: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-60)), | |
| 186 | + action-primary: light-dark(var(--fox-primitive-alpha-white0), var(--fox-primitive-alpha-black0)), | |
| 187 | + action-primary-hover: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 188 | + action-primary-pressed: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-90)), | |
| 189 | + action-primary-selected: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 190 | + action-primary-active: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 191 | + action-secondary: light-dark(var(--fox-primitive-alpha-white0), var(--fox-primitive-alpha-black0)), | |
| 192 | + action-secondary-hover: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 193 | + action-secondary-pressed: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-90)), | |
| 194 | + action-secondary-selected: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-90)), | |
| 195 | + action-secondary-active: light-dark(var(--fox-theme-secondary-70), var(--fox-theme-secondary-60)), | |
| 196 | + button-primary-surface: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 197 | + button-primary-surface-hover: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-60)), | |
| 198 | + button-primary-surface-pressed: light-dark(var(--fox-theme-primary-70), var(--fox-theme-primary-70)), | |
| 199 | + button-primary-border: light-dark(var(--fox-primitive-alpha-black0), var(--fox-primitive-alpha-black0)), | |
| 200 | + button-primary-font: light-dark(var(--fox-primitive-alpha-white100), var(--fox-primitive-alpha-white100)), | |
| 201 | + button-secondary-surface: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 202 | + button-secondary-surface-hover: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-90)), | |
| 203 | + button-secondary-surface-pressed: light-dark(var(--fox-theme-primary-20), var(--fox-theme-primary-80)), | |
| 204 | + button-secondary-border: light-dark(var(--fox-theme-primary-30), var(--fox-theme-primary-70)), | |
| 205 | + button-secondary-font: light-dark(var(--fox-theme-primary-60), var(--fox-theme-primary-30)), | |
| 206 | + button-default-surface: light-dark(var(--fox-primitive-alpha-white0), var(--fox-primitive-alpha-black0)), | |
| 207 | + button-default-surface-hover: light-dark(var(--fox-primitive-neutral-5), var(--fox-primitive-neutral-95)), | |
| 208 | + button-default-surface-pressed: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-80)), | |
| 209 | + button-default-border: light-dark(var(--fox-primitive-neutral-30), var(--fox-primitive-neutral-70)), | |
| 210 | + button-default-font: light-dark(var(--fox-primitive-neutral-70), var(--fox-primitive-neutral-20)), | |
| 211 | + button-text-surface: light-dark(var(--fox-primitive-alpha-white0), var(--fox-primitive-alpha-black0)), | |
| 212 | + button-text-surface-hover: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 213 | + button-text-surface-pressed: light-dark(var(--fox-theme-secondary-10), var(--fox-theme-secondary-90)), | |
| 214 | + button-text-visited: light-dark(#5917B8, #C49FF9), | |
| 215 | + button-disabled-surface: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-80)), | |
| 216 | + button-disabled-border: light-dark(var(--fox-primitive-neutral-30), var(--fox-primitive-neutral-70)), | |
| 217 | + button-disabled-font: light-dark(var(--fox-primitive-neutral-50), var(--fox-primitive-neutral-50)), | |
| 218 | + input-surface: light-dark(var(--fox-primitive-neutral-0), var(--fox-primitive-neutral-90)), | |
| 219 | + input-surface-disabled: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-95)), | |
| 220 | + input-border: light-dark(var(--fox-primitive-neutral-60), var(--fox-primitive-neutral-40)), | |
| 221 | + input-border-active: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-50)), | |
| 222 | + input-border-error: light-dark(var(--fox-primitive-danger-50), var(--fox-primitive-danger-50)), | |
| 223 | + input-border-success: light-dark(var(--fox-primitive-success-50), var(--fox-primitive-success-50)), | |
| 224 | + input-border-disabled: light-dark(var(--fox-primitive-neutral-30), var(--fox-primitive-neutral-70)), | |
| 225 | + chart-default-bar: light-dark(var(--fox-theme-primary-20), var(--fox-theme-primary-70)), | |
| 226 | + chart-default-surface: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-70)), | |
| 227 | + chart-default-line: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-70)), | |
| 228 | + chart-default-disabled: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-70)), | |
| 229 | + chart-level-1: light-dark(var(--fox-theme-primary-90), var(--fox-theme-primary-10)), | |
| 230 | + chart-level-2: light-dark(var(--fox-theme-primary-70), var(--fox-theme-primary-20)), | |
| 231 | + chart-level-3: light-dark(var(--fox-theme-primary-50), var(--fox-theme-primary-40)), | |
| 232 | + chart-level-4: light-dark(var(--fox-theme-primary-40), var(--fox-theme-primary-50)), | |
| 233 | + chart-level-5: light-dark(var(--fox-theme-primary-20), var(--fox-theme-primary-70)), | |
| 234 | + chart-level-6: light-dark(var(--fox-theme-primary-10), var(--fox-theme-primary-90)), | |
| 235 | + chart-level-7: light-dark(var(--fox-primitive-neutral-60), var(--fox-primitive-neutral-10)), | |
| 236 | + chart-level-8: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-20)), | |
| 237 | + chart-level-9: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-40)), | |
| 238 | + chart-level-10: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-60)), | |
| 239 | + chart-type-1-bar: light-dark(var(--fox-theme-primary-20), var(--fox-theme-primary-50)), | |
| 240 | + chart-type-1-line: light-dark(var(--fox-theme-primary-40), var(--fox-theme-primary-30)), | |
| 241 | + chart-type-1-surface: light-dark(var(--fox-theme-primary-5), var(--fox-theme-primary-95)), | |
| 242 | + chart-type-2-bar: light-dark(var(--fox-theme-accent-20), var(--fox-theme-accent-50)), | |
| 243 | + chart-type-2-line: light-dark(var(--fox-theme-accent-30), var(--fox-theme-accent-30)), | |
| 244 | + chart-type-2-surface: light-dark(var(--fox-theme-accent-5), var(--fox-theme-accent-95)), | |
| 245 | + chart-type-3-bar: light-dark(var(--fox-theme-secondary-20), var(--fox-theme-secondary-50)), | |
| 246 | + chart-type-3-line: light-dark(var(--fox-theme-secondary-30), var(--fox-theme-secondary-30)), | |
| 247 | + chart-type-3-surface: light-dark(var(--fox-theme-secondary-5), var(--fox-theme-secondary-95)), | |
| 248 | + chart-type-4-bar: light-dark(#FFDF94, #DEB451), | |
| 249 | + chart-type-4-line: light-dark(#FBC35A, #FBC35A), | |
| 250 | + chart-type-4-surface: light-dark(#FFF7E9, #2F2D28), | |
| 251 | + chart-type-5-bar: light-dark(#FF9F85, #D96645), | |
| 252 | + chart-type-5-line: light-dark(#FF7C57, #FF7C57), | |
| 253 | + chart-type-5-surface: light-dark(#FFECE7, #3F3330), | |
| 254 | + chart-alt-level-1: light-dark(#002D31, #D4F4F7), | |
| 255 | + chart-alt-level-2: light-dark(#005A62, #9EE7EE), | |
| 256 | + chart-alt-level-3: light-dark(#00828E, #1EBCCB), | |
| 257 | + chart-alt-level-4: light-dark(#1EBCCB, #00828E), | |
| 258 | + chart-alt-level-5: light-dark(#9EE7EE, #005A62), | |
| 259 | + chart-alt-level-6: light-dark(#D4F4F7, #002D31), | |
| 260 | + chart-alt-level-7: light-dark(var(--fox-primitive-neutral-60), var(--fox-primitive-neutral-10)), | |
| 261 | + chart-alt-level-8: light-dark(var(--fox-primitive-neutral-40), var(--fox-primitive-neutral-20)), | |
| 262 | + chart-alt-level-9: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-40)), | |
| 263 | + chart-alt-level-10: light-dark(var(--fox-primitive-neutral-10), var(--fox-primitive-neutral-60)), | |
| 264 | + chart-alt-default-bar: light-dark(#9EE7EE, #005A62), | |
| 265 | + chart-alt-default-surface: light-dark(#D4F4F7, #005A62), | |
| 266 | + chart-alt-default-line: light-dark(#00828E, #005A62), | |
| 267 | + chart-alt-default-disabled: light-dark(var(--fox-primitive-neutral-20), var(--fox-primitive-neutral-70)), | |
| 268 | + chart-alt-type-1-bar: light-dark(#9EE7EE, #00828E), | |
| 269 | + chart-alt-type-1-line: light-dark(#1EBCCB, #57D2DE), | |
| 270 | + chart-alt-type-1-surface: light-dark(#E9FAFC, #001A1C), | |
| 271 | + chart-alt-type-2-bar: light-dark(#CDE566, #5E8100), | |
| 272 | + chart-alt-type-2-line: light-dark(#A7CC00, #A7CC00), | |
| 273 | + chart-alt-type-2-surface: light-dark(#F2F9D9, #121900), | |
| 274 | + chart-alt-type-3-bar: light-dark(#97CBED, #00577D), | |
| 275 | + chart-alt-type-3-line: light-dark(#52A6D3, #52A6D3), | |
| 276 | + chart-alt-type-3-surface: light-dark(#E8F4FC, #00080C), | |
| 277 | + chart-alt-type-4-bar: light-dark(#FFDF94, #DEB451), | |
| 278 | + chart-alt-type-4-line: light-dark(#FBC35A, #FBC35A), | |
| 279 | + chart-alt-type-4-surface: light-dark(#FFF7E9, #2F2D28), | |
| 280 | + chart-alt-type-5-bar: light-dark(#FF9F85, #D96645), | |
| 281 | + chart-alt-type-5-line: light-dark(#FF7C57, #FF7C57), | |
| 282 | + chart-alt-type-5-surface: light-dark(#FFECE7, #3F3330) | |
| 283 | +); |
+++ @fox/styles/tokens/_index.scss
... | ... | @@ -0,0 +1,10 @@ |
| 1 | +// 토큰 map 모음 — **CSS를 한 줄도 출력하지 않는다.** | |
| 2 | +// 값 선언(이 폴더)과 CSS 출력(`../_root.scss`)을 분리해 두었기 때문에, 컴포넌트의 | |
| 3 | +// `.module.scss`가 몇 개든 `abstracts`를 `@use`해도 `:root` 블록이 중복 출력되지 않는다 | |
| 4 | +// (각 CSS Module은 별도 컴파일 단위라 CSS를 내보내는 모듈을 공유하면 파일마다 복제된다). | |
| 5 | + | |
| 6 | +@forward "primitive"; | |
| 7 | +@forward "theme"; | |
| 8 | +@forward "size"; | |
| 9 | +@forward "color"; | |
| 10 | +@forward "responsive"; |
+++ @fox/styles/tokens/_primitive.scss
... | ... | @@ -0,0 +1,112 @@ |
| 1 | +// ⚠️ 이 파일은 Figma Design Tokens export에서 **자동 생성**되었습니다. | |
| 2 | +// 원본: primitive.tokens.json | |
| 3 | +// 손으로 고치지 말고 원본 JSON을 다시 export한 뒤 변환기를 재실행하세요. | |
| 4 | + | |
| 5 | +// 원시 팔레트 — 화면에서 직접 쓰지 않는다. 시맨틱 토큰(`$color`)이 참조하는 바닥층이다. | |
| 6 | +$primitive: ( | |
| 7 | + neutral-0: #FFFFFF, | |
| 8 | + neutral-5: #F4F5F6, | |
| 9 | + neutral-10: #E6E8EA, | |
| 10 | + neutral-20: #CDD1D5, | |
| 11 | + neutral-30: #B1B8BE, | |
| 12 | + neutral-40: #8A949E, | |
| 13 | + neutral-50: #6D7882, | |
| 14 | + neutral-60: #58616A, | |
| 15 | + neutral-70: #464C53, | |
| 16 | + neutral-80: #33363D, | |
| 17 | + neutral-90: #1E2124, | |
| 18 | + neutral-95: #131416, | |
| 19 | + neutral-100: #000000, | |
| 20 | + danger-5: #FDEFEC, | |
| 21 | + danger-10: #FCDFD9, | |
| 22 | + danger-20: #F7AFA1, | |
| 23 | + danger-30: #F48771, | |
| 24 | + danger-40: #F05F42, | |
| 25 | + danger-50: #DE3412, | |
| 26 | + danger-60: #BD2C0F, | |
| 27 | + danger-70: #8A240F, | |
| 28 | + danger-80: #5C180A, | |
| 29 | + danger-90: #390D05, | |
| 30 | + danger-95: #260903, | |
| 31 | + warning-5: #FFF3DB, | |
| 32 | + warning-10: #FFE0A3, | |
| 33 | + warning-20: #FFC95C, | |
| 34 | + warning-30: #FFB114, | |
| 35 | + warning-40: #C78500, | |
| 36 | + warning-50: #9E6A00, | |
| 37 | + warning-60: #8A5C00, | |
| 38 | + warning-70: #614100, | |
| 39 | + warning-80: #422C00, | |
| 40 | + warning-90: #2E1F00, | |
| 41 | + warning-95: #241800, | |
| 42 | + success-5: #EAF6EC, | |
| 43 | + success-10: #D8EEDD, | |
| 44 | + success-20: #A9DAB4, | |
| 45 | + success-30: #7EC88E, | |
| 46 | + success-40: #3FA654, | |
| 47 | + success-50: #228738, | |
| 48 | + success-60: #267337, | |
| 49 | + success-70: #285D33, | |
| 50 | + success-80: #1F4727, | |
| 51 | + success-90: #122B18, | |
| 52 | + success-95: #0E2012, | |
| 53 | + information-5: #E7F4FE, | |
| 54 | + information-10: #D3EBFD, | |
| 55 | + information-20: #9ED2FA, | |
| 56 | + information-30: #5FB5F7, | |
| 57 | + information-40: #2098F3, | |
| 58 | + information-50: #0B78CB, | |
| 59 | + information-60: #096AB3, | |
| 60 | + information-70: #085691, | |
| 61 | + information-80: #053961, | |
| 62 | + information-90: #03253F, | |
| 63 | + information-95: #021A2C, | |
| 64 | + alpha-black100: #000000, | |
| 65 | + alpha-black75: rgb(0 0 0 / 0.75), | |
| 66 | + alpha-black50: rgb(0 0 0 / 0.5), | |
| 67 | + alpha-black25: rgb(0 0 0 / 0.25), | |
| 68 | + alpha-black10: rgb(0 0 0 / 0.1), | |
| 69 | + alpha-black0: rgb(0 0 0 / 0), | |
| 70 | + alpha-white100: #FFFFFF, | |
| 71 | + alpha-white75: rgb(255 255 255 / 0.75), | |
| 72 | + alpha-white50: rgb(255 255 255 / 0.5), | |
| 73 | + alpha-white25: rgb(255 255 255 / 0.25), | |
| 74 | + alpha-white10: rgb(255 255 255 / 0.1), | |
| 75 | + alpha-white0: rgb(255 255 255 / 0) | |
| 76 | +); | |
| 77 | + | |
| 78 | +// 서체 — family는 문자열, weight는 무단위 수치(길이가 아니므로 rem 변환 대상이 아니다). | |
| 79 | +$font: ( | |
| 80 | + family-title: Pretendard, | |
| 81 | + family-body: Pretendard, | |
| 82 | + weight-regular: 400, | |
| 83 | + weight-medium: 600, | |
| 84 | + weight-bold: 800 | |
| 85 | +); | |
| 86 | + | |
| 87 | +// 원시 수치 스케일 — size 컬렉션이 참조하는 값들. 1rem = 10px 기준으로 변환됨. | |
| 88 | +$number: ( | |
| 89 | + 0: 0, | |
| 90 | + 1: 0.1rem, | |
| 91 | + 2: 0.2rem, | |
| 92 | + 3: 0.4rem, | |
| 93 | + 4: 0.6rem, | |
| 94 | + 5: 0.8rem, | |
| 95 | + 6: 1rem, | |
| 96 | + 7: 1.2rem, | |
| 97 | + 8: 1.6rem, | |
| 98 | + 9: 2rem, | |
| 99 | + 10: 2.4rem, | |
| 100 | + 11: 2.8rem, | |
| 101 | + 12: 3.2rem, | |
| 102 | + 13: 3.6rem, | |
| 103 | + 14: 4rem, | |
| 104 | + 15: 4.4rem, | |
| 105 | + 16: 4.8rem, | |
| 106 | + 17: 5.6rem, | |
| 107 | + 18: 6.4rem, | |
| 108 | + 19: 7.2rem, | |
| 109 | + 20: 8rem, | |
| 110 | + 21: 9.6rem, | |
| 111 | + max: 100rem | |
| 112 | +); |
+++ @fox/styles/tokens/_responsive.scss
... | ... | @@ -0,0 +1,163 @@ |
| 1 | +// ⚠️ 이 파일은 Figma Design Tokens export에서 **자동 생성**되었습니다. | |
| 2 | +// 원본: mobile.tokens.json / pc.tokens.json | |
| 3 | +// 손으로 고치지 말고 원본 JSON을 다시 export한 뒤 변환기를 재실행하세요. | |
| 4 | + | |
| 5 | +// 뷰포트에 따라 달라지는 크기 토큰. 키는 두 모드가 완전히 동일하다. | |
| 6 | +// 모바일 우선 — `$responsive`가 기본값이고 `$responsive-pc`가 브레이크포인트 이상에서 덮는다. | |
| 7 | +$breakpoint-pc: 768px; | |
| 8 | + | |
| 9 | +$responsive: ( | |
| 10 | + font-size-display-lg: 4.4rem, | |
| 11 | + font-size-display-md: 3.2rem, | |
| 12 | + font-size-display-sm: 2.8rem, | |
| 13 | + font-size-heading-xlg: 2.8rem, | |
| 14 | + font-size-heading-lg: 2.4rem, | |
| 15 | + font-size-heading-md: 2rem, | |
| 16 | + font-size-heading-sm: 1.7rem, | |
| 17 | + font-size-heading-xsm: 1.5rem, | |
| 18 | + font-size-heading-2xsm: 1.3rem, | |
| 19 | + font-size-body-lg: 1.5rem, | |
| 20 | + font-size-body-md: 1.3rem, | |
| 21 | + font-size-body-sm: 1.2rem, | |
| 22 | + font-size-body-xsm: 1rem, | |
| 23 | + font-size-label-lg: 1.5rem, | |
| 24 | + font-size-label-md: 1.3rem, | |
| 25 | + font-size-label-sm: 1.2rem, | |
| 26 | + font-size-label-xsm: 1rem, | |
| 27 | + form-radius-xsm: 0.4rem, | |
| 28 | + form-radius-sm: 0.4rem, | |
| 29 | + form-radius-md: 0.8rem, | |
| 30 | + form-radius-lg: 1.2rem, | |
| 31 | + form-padding-lg: 2rem, | |
| 32 | + form-padding-md: 1.2rem, | |
| 33 | + form-padding-sm: 0.8rem, | |
| 34 | + form-padding-xsm: 0.4rem, | |
| 35 | + form-icon-lg: 2rem, | |
| 36 | + form-icon-md: 1.6rem, | |
| 37 | + form-icon-sm: 1.2rem, | |
| 38 | + form-icon-xsm: 1.2rem, | |
| 39 | + form-height-xsm: 2rem, | |
| 40 | + form-height-sm: 2.8rem, | |
| 41 | + form-height-md: 4rem, | |
| 42 | + form-height-lg: 4.8rem, | |
| 43 | + grid-wrap-full: 38rem, | |
| 44 | + grid-wrap-default: 34.8rem, | |
| 45 | + grid-wrap-sm: 32rem, | |
| 46 | + grid-wrap-xsm: 28rem, | |
| 47 | + grid-margin-full: 0, | |
| 48 | + grid-margin-default: 1.6rem, | |
| 49 | + grid-margin-sm: 3rem, | |
| 50 | + grid-margin-xsm: 5rem, | |
| 51 | + grid-gutter-sm: 0.8rem, | |
| 52 | + grid-gutter-md: 1.6rem, | |
| 53 | + grid-gutter-lg: 2rem, | |
| 54 | + grid-gutter-xlg: 2rem, | |
| 55 | + grid-gutter-2xlg: 4rem, | |
| 56 | + card-radius-xlg: 1.6rem, | |
| 57 | + card-radius-lg: 1.6rem, | |
| 58 | + card-radius-md: 1.2rem, | |
| 59 | + card-radius-sm: 0.8rem, | |
| 60 | + card-padding-xlg: 2.4rem, | |
| 61 | + card-padding-lg: 2rem, | |
| 62 | + card-padding-md: 1.6rem, | |
| 63 | + card-padding-sm: 1.2rem, | |
| 64 | + modal-width-full: 38rem, | |
| 65 | + modal-width-lg: 34.8rem, | |
| 66 | + modal-width-md: 34.8rem, | |
| 67 | + modal-width-sm: 34.8rem, | |
| 68 | + modal-padding-default: 2.4rem, | |
| 69 | + modal-btn-close: 5.6rem, | |
| 70 | + spacing-top-2xlg: 8rem, | |
| 71 | + spacing-top-xlg: 5.6rem, | |
| 72 | + spacing-top-lg: 3.2rem, | |
| 73 | + spacing-top-md: 2rem, | |
| 74 | + spacing-top-sm: 1.2rem, | |
| 75 | + spacing-top-none: 0, | |
| 76 | + spacing-bottom-xlg: 4.8rem, | |
| 77 | + spacing-bottom-lg: 2.8rem, | |
| 78 | + spacing-bottom-md: 2rem, | |
| 79 | + spacing-bottom-sm: 1.2rem, | |
| 80 | + spacing-bottom-none: 0, | |
| 81 | + section-spacing-lg: 8rem, | |
| 82 | + section-spacing-md: 4rem, | |
| 83 | + section-spacing-sm: 2.4rem, | |
| 84 | + section-spacing-xsm: 1.6rem | |
| 85 | +); | |
| 86 | + | |
| 87 | +$responsive-pc: ( | |
| 88 | + font-size-display-lg: 4rem, | |
| 89 | + font-size-display-md: 3.2rem, | |
| 90 | + font-size-display-sm: 2.6rem, | |
| 91 | + font-size-heading-xlg: 3.2rem, | |
| 92 | + font-size-heading-lg: 2.6rem, | |
| 93 | + font-size-heading-md: 2rem, | |
| 94 | + font-size-heading-sm: 1.7rem, | |
| 95 | + font-size-heading-xsm: 1.5rem, | |
| 96 | + font-size-heading-2xsm: 1.3rem, | |
| 97 | + font-size-body-lg: 1.7rem, | |
| 98 | + font-size-body-md: 1.5rem, | |
| 99 | + font-size-body-sm: 1.3rem, | |
| 100 | + font-size-body-xsm: 1.1rem, | |
| 101 | + font-size-label-lg: 1.7rem, | |
| 102 | + font-size-label-md: 1.5rem, | |
| 103 | + font-size-label-sm: 1.3rem, | |
| 104 | + font-size-label-xsm: 1.1rem, | |
| 105 | + form-radius-xsm: 0.4rem, | |
| 106 | + form-radius-sm: 0.4rem, | |
| 107 | + form-radius-md: 0.8rem, | |
| 108 | + form-radius-lg: 1.2rem, | |
| 109 | + form-padding-lg: 2rem, | |
| 110 | + form-padding-md: 1.2rem, | |
| 111 | + form-padding-sm: 0.8rem, | |
| 112 | + form-padding-xsm: 0.8rem, | |
| 113 | + form-icon-lg: 2.4rem, | |
| 114 | + form-icon-md: 2rem, | |
| 115 | + form-icon-sm: 1.6rem, | |
| 116 | + form-icon-xsm: 1.2rem, | |
| 117 | + form-height-xsm: 2.4rem, | |
| 118 | + form-height-sm: 2.8rem, | |
| 119 | + form-height-md: 4rem, | |
| 120 | + form-height-lg: 5.6rem, | |
| 121 | + grid-wrap-full: 192rem, | |
| 122 | + grid-wrap-default: 158.4rem, | |
| 123 | + grid-wrap-sm: 108rem, | |
| 124 | + grid-wrap-xsm: 80rem, | |
| 125 | + grid-margin-full: 0, | |
| 126 | + grid-margin-default: 4.8rem, | |
| 127 | + grid-margin-sm: 42rem, | |
| 128 | + grid-margin-xsm: 56rem, | |
| 129 | + grid-gutter-sm: 0.8rem, | |
| 130 | + grid-gutter-md: 1.6rem, | |
| 131 | + grid-gutter-lg: 2.4rem, | |
| 132 | + grid-gutter-xlg: 4rem, | |
| 133 | + grid-gutter-2xlg: 6.4rem, | |
| 134 | + card-radius-xlg: 2.4rem, | |
| 135 | + card-radius-lg: 2.4rem, | |
| 136 | + card-radius-md: 1.6rem, | |
| 137 | + card-radius-sm: 1.2rem, | |
| 138 | + card-padding-xlg: 4rem, | |
| 139 | + card-padding-lg: 3.2rem, | |
| 140 | + card-padding-md: 2.4rem, | |
| 141 | + card-padding-sm: 1.6rem, | |
| 142 | + modal-width-full: 192rem, | |
| 143 | + modal-width-lg: 76rem, | |
| 144 | + modal-width-md: 56rem, | |
| 145 | + modal-width-sm: 40rem, | |
| 146 | + modal-padding-default: 4rem, | |
| 147 | + modal-btn-close: 6.4rem, | |
| 148 | + spacing-top-2xlg: 8rem, | |
| 149 | + spacing-top-xlg: 6.4rem, | |
| 150 | + spacing-top-lg: 4rem, | |
| 151 | + spacing-top-md: 2.4rem, | |
| 152 | + spacing-top-sm: 1.6rem, | |
| 153 | + spacing-top-none: 0, | |
| 154 | + spacing-bottom-xlg: 3.6rem, | |
| 155 | + spacing-bottom-lg: 2.8rem, | |
| 156 | + spacing-bottom-md: 2rem, | |
| 157 | + spacing-bottom-sm: 1.2rem, | |
| 158 | + spacing-bottom-none: 0, | |
| 159 | + section-spacing-lg: 12rem, | |
| 160 | + section-spacing-md: 8rem, | |
| 161 | + section-spacing-sm: 4rem, | |
| 162 | + section-spacing-xsm: 2.4rem | |
| 163 | +); |
+++ @fox/styles/tokens/_size.scss
... | ... | @@ -0,0 +1,62 @@ |
| 1 | +// ⚠️ 이 파일은 Figma Design Tokens export에서 **자동 생성**되었습니다. | |
| 2 | +// 원본: size.tokens.json | |
| 3 | +// 손으로 고치지 말고 원본 JSON을 다시 export한 뒤 변환기를 재실행하세요. | |
| 4 | + | |
| 5 | +// 모드와 무관한 크기 스케일. 값은 1rem = 10px 기준 rem. | |
| 6 | +$size: ( | |
| 7 | + border-0: 0, | |
| 8 | + border-1: 0.1rem, | |
| 9 | + border-2: 0.2rem, | |
| 10 | + border-3: 0.4rem, | |
| 11 | + padding-1: 0.2rem, | |
| 12 | + padding-2: 0.4rem, | |
| 13 | + padding-3: 0.8rem, | |
| 14 | + padding-4: 1rem, | |
| 15 | + padding-5: 1.2rem, | |
| 16 | + padding-6: 1.6rem, | |
| 17 | + padding-7: 2rem, | |
| 18 | + padding-8: 2.4rem, | |
| 19 | + padding-9: 3.2rem, | |
| 20 | + padding-10: 4rem, | |
| 21 | + padding-11: 6.4rem, | |
| 22 | + gap-1: 0.2rem, | |
| 23 | + gap-2: 0.4rem, | |
| 24 | + gap-3: 0.8rem, | |
| 25 | + gap-4: 1.2rem, | |
| 26 | + gap-5: 1.6rem, | |
| 27 | + gap-6: 2rem, | |
| 28 | + gap-7: 2.4rem, | |
| 29 | + gap-8: 3.2rem, | |
| 30 | + gap-9: 4rem, | |
| 31 | + gap-10: 4.8rem, | |
| 32 | + gap-11: 6.4rem, | |
| 33 | + gap-12: 8rem, | |
| 34 | + radius-1: 0.2rem, | |
| 35 | + radius-2: 0.4rem, | |
| 36 | + radius-3: 0.8rem, | |
| 37 | + radius-4: 1.2rem, | |
| 38 | + radius-5: 1.6rem, | |
| 39 | + radius-6: 2.4rem, | |
| 40 | + radius-7: 4rem, | |
| 41 | + radius-max: 100rem, | |
| 42 | + icon-1: 0.8rem, | |
| 43 | + icon-2: 1.2rem, | |
| 44 | + icon-3: 1.6rem, | |
| 45 | + icon-4: 2rem, | |
| 46 | + icon-5: 2.4rem, | |
| 47 | + icon-6: 3.2rem, | |
| 48 | + icon-7: 4rem, | |
| 49 | + shadow-location1: 0.1rem, | |
| 50 | + shadow-location2: 0.2rem, | |
| 51 | + shadow-location3: 0.4rem, | |
| 52 | + shadow-location4: 0.8rem, | |
| 53 | + shadow-location5: 1.6rem, | |
| 54 | + shadow-blur1: 0.2rem, | |
| 55 | + shadow-blur2: 0.4rem, | |
| 56 | + shadow-blur3: 0.8rem, | |
| 57 | + shadow-blur4: 1.6rem, | |
| 58 | + shadow-blur5: 3.2rem, | |
| 59 | + backdrop-blur1: 1rem, | |
| 60 | + backdrop-blur2: 2.4rem, | |
| 61 | + backdrop-blur3: 4rem | |
| 62 | +); |
+++ @fox/styles/tokens/_theme.scss
... | ... | @@ -0,0 +1,40 @@ |
| 1 | +// ⚠️ 이 파일은 Figma Design Tokens export에서 **자동 생성**되었습니다. | |
| 2 | +// 원본: theme.tokens.json | |
| 3 | +// 손으로 고치지 말고 원본 JSON을 다시 export한 뒤 변환기를 재실행하세요. | |
| 4 | + | |
| 5 | +// 브랜드 램프 — primary / secondary / accent. | |
| 6 | +$theme: ( | |
| 7 | + primary-5: #ECF2FE, | |
| 8 | + primary-10: #D8E5FD, | |
| 9 | + primary-20: #B1CEFB, | |
| 10 | + primary-30: #86AFF9, | |
| 11 | + primary-40: #4C87F6, | |
| 12 | + primary-50: #256EF4, | |
| 13 | + primary-60: #0B50D0, | |
| 14 | + primary-70: #083891, | |
| 15 | + primary-80: #052561, | |
| 16 | + primary-90: #03163A, | |
| 17 | + primary-95: #020F27, | |
| 18 | + secondary-5: #EEF2F7, | |
| 19 | + secondary-10: #D6E0EB, | |
| 20 | + secondary-20: #BACBDE, | |
| 21 | + secondary-30: #90B0D5, | |
| 22 | + secondary-40: #6B96C7, | |
| 23 | + secondary-50: #346FB2, | |
| 24 | + secondary-60: #1C589C, | |
| 25 | + secondary-70: #063A74, | |
| 26 | + secondary-80: #052B57, | |
| 27 | + secondary-90: #031F3F, | |
| 28 | + secondary-95: #02162C, | |
| 29 | + accent-5: #FBEFF0, | |
| 30 | + accent-10: #F5D6D9, | |
| 31 | + accent-20: #EBADB2, | |
| 32 | + accent-30: #E0858C, | |
| 33 | + accent-40: #D65C66, | |
| 34 | + accent-50: #D63D4A, | |
| 35 | + accent-60: #AB2B36, | |
| 36 | + accent-70: #7A1F26, | |
| 37 | + accent-80: #521419, | |
| 38 | + accent-90: #310C0F, | |
| 39 | + accent-95: #21080A | |
| 40 | +); |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?