docs: @fox 전반의 주석 축약
설명이 길거나 코드를 그대로 옮겨 적은 주석을 걷어내고, 코드만 봐서는 알 수 없는 이유(선언 원문을 쓰는 근거, next/image를 피하는 이유, :disabled 특이도, 토큰 아닌 값의 승인 근거)만 남긴다. Co-Authored-By: Claude Opus 5
@229df213c6fd9f068da1ebc0242261aa4e9c8aee
--- @fox/dev-test/component-registry.tsx
+++ @fox/dev-test/component-registry.tsx
... | ... | @@ -1,26 +1,16 @@ |
| 1 | 1 |
import type { ReactNode } from "react";
|
| 2 | 2 |
import { FoxButton } from "../core/components/fox-button";
|
| 3 | 3 |
|
| 4 |
-/** |
|
| 5 |
- * 컴포넌트 예제 하나. 사이드바의 "컴포넌트" 분류에 항목으로 뜬다. |
|
| 6 |
- */ |
|
| 7 | 4 |
export interface ComponentExample {
|
| 8 |
- /** 해시 링크와 React key에 쓰이는 식별자. kebab-case. */ |
|
| 5 |
+ /** 해시 링크에 쓰이는 kebab-case 식별자. */ |
|
| 9 | 6 |
id: string; |
| 10 |
- /** 사이드바에 표시할 이름. */ |
|
| 11 | 7 |
name: string; |
| 12 |
- /** 한 줄 설명 (선택). */ |
|
| 13 | 8 |
description?: string; |
| 14 |
- /** |
|
| 15 |
- * 이 컴포넌트가 가질 수 있는 상태들. variant·size·disabled처럼 **눈으로 비교해야 하는 |
|
| 16 |
- * 조합을 빠짐없이** 넣는다 — 예제가 곧 회귀 확인 수단이다. |
|
| 17 |
- */ |
|
| 9 |
+ /** 눈으로 비교해야 하는 조합을 빠짐없이 넣는다 — 예제가 곧 회귀 확인 수단이다. */ |
|
| 18 | 10 |
variants: { label: string; node: ReactNode }[];
|
| 19 | 11 |
} |
| 20 | 12 |
|
| 21 |
-// 예제용 아이콘 — 시안의 실제 아이콘이 아니라 자리 확인용 도형이다. |
|
| 22 |
-// `currentColor`로 그려야 버튼이 계열별로 색을 입힐 수 있다(슬롯이 `color`를 내려준다). |
|
| 23 |
-// 크기는 슬롯이 `form-icon-*` 토큰으로 정하므로 100%로 채우기만 한다. |
|
| 13 |
+// 자리 확인용 도형. `currentColor`로 그려야 계열별 색이 입혀진다. |
|
| 24 | 14 |
function DemoIcon() {
|
| 25 | 15 |
return ( |
| 26 | 16 |
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="2" aria-hidden="true"> |
... | ... | @@ -29,10 +19,7 @@ |
| 29 | 19 |
); |
| 30 | 20 |
} |
| 31 | 21 |
|
| 32 |
-/** |
|
| 33 |
- * 컴포넌트를 만들 때마다 여기에 한 항목씩 추가한다. 사이드바·본문은 이 배열만 보고 |
|
| 34 |
- * 그리므로 다른 파일을 고칠 필요가 없다. |
|
| 35 |
- */ |
|
| 22 |
+/** 컴포넌트를 만들 때마다 항목 하나를 추가한다 — 다른 파일은 고치지 않는다. */ |
|
| 36 | 23 |
export const COMPONENT_EXAMPLES: ComponentExample[] = [ |
| 37 | 24 |
{
|
| 38 | 25 |
id: "fox-button", |
--- @fox/dev-test/dev-test-page.tsx
+++ @fox/dev-test/dev-test-page.tsx
... | ... | @@ -10,9 +10,7 @@ |
| 10 | 10 |
import { useCssTokens } from "./use-css-tokens";
|
| 11 | 11 |
import styles from "./dev-test.module.scss"; |
| 12 | 12 |
|
| 13 |
-// 선택 상태는 URL 해시가 SSOT다 — 새로고침하거나 링크를 공유해도 보던 섹션이 유지되고, |
|
| 14 |
-// React state를 따로 두지 않으므로 둘이 어긋날 일이 없다. |
|
| 15 |
-// 형식: `#token:light` / `#component:button` |
|
| 13 |
+// 선택 상태는 URL 해시가 SSOT다. 형식: `#token:light` / `#component:fox-button` |
|
| 16 | 14 |
function subscribeHash(onChange: () => void): () => void {
|
| 17 | 15 |
window.addEventListener("hashchange", onChange);
|
| 18 | 16 |
return () => window.removeEventListener("hashchange", onChange);
|
... | ... | @@ -36,18 +34,13 @@ |
| 36 | 34 |
window.location.hash = `${kind}:${id}`;
|
| 37 | 35 |
} |
| 38 | 36 |
|
| 39 |
-/** 안내 항목의 식별자 — 등록된 컴포넌트 id와 겹치지 않게 별도로 둔다. */ |
|
| 40 | 37 |
const GUIDE_ID = "guide"; |
| 41 | 38 |
|
| 42 | 39 |
function isRegistered(id: string): boolean {
|
| 43 | 40 |
return COMPONENT_EXAMPLES.some((example) => example.id === id); |
| 44 | 41 |
} |
| 45 | 42 |
|
| 46 |
-/** |
|
| 47 |
- * 사이드바 분류는 원본 JSON 파일 구조를 그대로 따른다 — Mode(Light/Dark), |
|
| 48 |
- * Responsive(PC/Mobile), 그리고 단일 모드인 Size·Theme·Primitive. 이 화면의 목적이 |
|
| 49 |
- * Figma 변수 페이지와 1:1로 대조하는 것이라, 우리 CSS 그룹이 아니라 원본 구획이 기준이다. |
|
| 50 |
- */ |
|
| 43 |
+/** Figma 변수 페이지와 대조하는 화면이라 우리 CSS 그룹이 아닌 원본 구획을 따른다. */ |
|
| 51 | 44 |
function groupedSections(sections: CssSection[]) {
|
| 52 | 45 |
const groups: { category: string | null; sections: CssSection[] }[] = [];
|
| 53 | 46 |
|
... | ... | @@ -140,8 +133,7 @@ |
| 140 | 133 |
</li> |
| 141 | 134 |
))} |
| 142 | 135 |
|
| 143 |
- {/* 컴포넌트가 아니라 안내 항목이라 항상 목록 맨 아래에 두고 생김새를 달리한다.
|
|
| 144 |
- 등록된 컴포넌트가 없을 때도 사라지지 않아야 추가 방법을 찾을 수 있다. */} |
|
| 136 |
+ {/* 컴포넌트가 아니라 안내라 항상 맨 아래에 두고 생김새를 달리한다. */}
|
|
| 145 | 137 |
<li> |
| 146 | 138 |
<button |
| 147 | 139 |
type="button" |
--- @fox/dev-test/read-css-tokens.ts
+++ @fox/dev-test/read-css-tokens.ts
... | ... | @@ -25,10 +25,7 @@ |
| 25 | 25 |
return match ? match[1] : null; |
| 26 | 26 |
} |
| 27 | 27 |
|
| 28 |
-/** |
|
| 29 |
- * `var(--name, 내용)`에서 괄호 짝을 세어 `내용`만 잘라낸다. |
|
| 30 |
- * 내용 자체가 `var(--fox-…)`를 품고 있어 정규식으로는 안전하게 못 자른다. |
|
| 31 |
- */ |
|
| 28 |
+/** 내용에 `var(--fox-…)`가 중첩돼 정규식으로는 못 자르므로 괄호 짝을 센다. */ |
|
| 32 | 29 |
function extractFallback(text: string, marker: string): string | null {
|
| 33 | 30 |
const start = text.indexOf(marker); |
| 34 | 31 |
if (start < 0) {
|
... | ... | @@ -44,7 +41,7 @@ |
| 44 | 41 |
return text.slice(start + marker.length, i - 1).trim(); |
| 45 | 42 |
} |
| 46 | 43 |
|
| 47 |
-/** 최상위 콤마 하나로 두 조각을 나눈다(괄호 안의 콤마는 무시). */ |
|
| 44 |
+/** 괄호 안의 콤마는 무시하고 최상위 콤마로 나눈다. */ |
|
| 48 | 45 |
function splitTopLevel(text: string): [string, string] | null {
|
| 49 | 46 |
let depth = 0; |
| 50 | 47 |
for (let i = 0; i < text.length; i += 1) {
|
... | ... | @@ -59,11 +56,8 @@ |
| 59 | 56 |
} |
| 60 | 57 |
|
| 61 | 58 |
/** |
| 62 |
- * 라이트/다크 두 값을 분해한다. |
|
| 63 |
- * |
|
| 64 |
- * Lightning CSS가 `light-dark()`를 폴리필해 |
|
| 65 |
- * `var(--lightningcss-light, A) var(--lightningcss-dark, B)`로 내보내므로 그 형태를 먼저 보고, |
|
| 66 |
- * 폴리필이 없는 설정(브라우저 타깃을 좁힌 경우)을 대비해 원형도 함께 처리한다. |
|
| 59 |
+ * Lightning CSS가 `light-dark()`를 폴리필한 형태를 먼저 보고, 폴리필이 없는 설정을 |
|
| 60 |
+ * 대비해 원형도 처리한다. |
|
| 67 | 61 |
*/ |
| 68 | 62 |
function splitLightDark(declaration: string): { light: string; dark: string } | null {
|
| 69 | 63 |
const light = extractFallback(declaration, "var(--lightningcss-light,"); |
... | ... | @@ -144,14 +138,8 @@ |
| 144 | 138 |
const PRIMITIVE_PREFIX = /^(primitive|font-family|font-weight|number)-/; |
| 145 | 139 |
|
| 146 | 140 |
/** |
| 147 |
- * 컴파일된 CSS만 읽어 섹션을 구성한다. |
|
| 148 |
- * |
|
| 149 |
- * **매니페스트가 아니라 실제 스타일시트가 값의 출처다.** 토큰 SCSS를 고치면(원칙적으로 |
|
| 150 |
- * 자동 생성물이라 고치면 안 되지만) 이 화면에 즉시 반영되므로, 생성물과 화면이 어긋날 |
|
| 151 |
- * 여지가 없다. |
|
| 152 |
- * 선언 **원문**을 읽는 것이 요점이다 — 계산값을 읽으면 참조(`var(--fox-…)`)가 이미 |
|
| 153 |
- * 풀려 버리고, 현재 테마·뷰포트 한쪽 값만 보인다. 원문에는 light/dark와 PC/모바일이 |
|
| 154 |
- * 모두 남아 있어 현재 화면 상태와 무관하게 네 조합을 전부 볼 수 있다. |
|
| 141 |
+ * 컴파일된 스타일시트에서 섹션을 구성한다. 계산값이 아니라 **선언 원문**을 읽는 것이 |
|
| 142 |
+ * 요점 — 계산값은 참조가 이미 풀려 있고 현재 테마·뷰포트 한쪽만 보인다. |
|
| 155 | 143 |
*/ |
| 156 | 144 |
export function readCssSections(): CssSection[] {
|
| 157 | 145 |
const { base, pc } = readRaw();
|
... | ... | @@ -188,7 +176,7 @@ |
| 188 | 176 |
primitive.push(name); |
| 189 | 177 |
continue; |
| 190 | 178 |
} |
| 191 |
- // 분류에 없는 새 토큰도 버리지 않는다 — Size 뒤에 붙여 눈에 띄게 둔다. |
|
| 179 |
+ // 분류에 없는 새 토큰도 버리지 않는다. |
|
| 192 | 180 |
size.push(name); |
| 193 | 181 |
} |
| 194 | 182 |
|
--- @fox/dev-test/theme-switch.tsx
+++ @fox/dev-test/theme-switch.tsx
... | ... | @@ -15,11 +15,8 @@ |
| 15 | 15 |
]; |
| 16 | 16 |
|
| 17 | 17 |
/** |
| 18 |
- * `<html data-theme>` 자체가 SSOT이므로 React state를 두지 않고 DOM을 구독한다 — |
|
| 19 |
- * 서버/클라이언트 출력이 갈리지 않아 hydration 불일치 표면적이 0이다. |
|
| 20 |
- * |
|
| 21 |
- * 개발용 미리보기 컨트롤이라 **선택을 저장하지 않는다.** 저장 키는 호스트 앱이 소유하는 |
|
| 22 |
- * 값이라(앱마다 다르다) `@fox`가 알 필요가 없고, 알면 포터빌리티가 깨진다. |
|
| 18 |
+ * `<html data-theme>`가 SSOT라 React state를 두지 않는다. 저장 키는 호스트 앱이 |
|
| 19 |
+ * 소유하는 값이라 `@fox`가 알면 포터빌리티가 깨지므로 선택을 저장하지 않는다. |
|
| 23 | 20 |
*/ |
| 24 | 21 |
function subscribe(onChange: () => void): () => void {
|
| 25 | 22 |
const observer = new MutationObserver(onChange); |
--- @fox/dev-test/token-view.tsx
+++ @fox/dev-test/token-view.tsx
... | ... | @@ -5,14 +5,9 @@ |
| 5 | 5 |
import styles from "./dev-test.module.scss"; |
| 6 | 6 |
|
| 7 | 7 |
/** |
| 8 |
- * 미리보기 — 토큰 이름으로 무엇을 보여줄지 고른다. |
|
| 9 |
- * |
|
| 10 |
- * ⚠️ 값은 그 토큰의 CSS 변수가 아니라 **그 섹션의 선언 원문**을 넣는다. `var(--fox-그토큰)`을 |
|
| 11 |
- * 쓰면 PC 섹션을 좁은 창에서 볼 때 모바일 값이 그려지고 Light 섹션이 다크 테마에서 다크 색으로 |
|
| 12 |
- * 그려진다 — 이 화면은 각 모드가 정의한 값을 보여야 하므로 현재 테마·뷰포트에 흔들리면 안 된다. |
|
| 13 |
- * 원문이 참조(`var(--fox-primitive-…)`)인 경우는 그대로 넣어도 안전하다. 참조 대상인 |
|
| 14 |
- * primitive·theme는 모드와 무관한 단일 값이기 때문이다. |
|
| 15 |
- * 인라인 `style`을 쓰는 예외인 이유도 같다: 렌더할 토큰을 미리 알 수 없다. |
|
| 8 |
+ * ⚠️ 값으로 그 토큰의 CSS 변수가 아니라 **섹션의 선언 원문**을 넣는다. 변수를 쓰면 PC |
|
| 9 |
+ * 섹션이 좁은 창에서 모바일 값으로, Light 섹션이 다크 테마에서 다크 색으로 그려진다. |
|
| 10 |
+ * 렌더할 토큰을 미리 알 수 없어 인라인 `style`을 쓰는 예외 지점이기도 하다. |
|
| 16 | 11 |
*/ |
| 17 | 12 |
const PREVIEWS: { match: RegExp; render: (value: string) => ReactNode }[] = [
|
| 18 | 13 |
{
|
... | ... | @@ -38,7 +33,7 @@ |
| 38 | 33 |
render: (value) => <div className={styles.demoRadius} style={{ borderRadius: value }} />,
|
| 39 | 34 |
}, |
| 40 | 35 |
{
|
| 41 |
- // 브라우저가 자체적으로 그리는 컨트롤이라 별도 에셋 없이 크기만 확인할 수 있다. |
|
| 36 |
+ // 브라우저가 그리는 컨트롤이라 별도 에셋 없이 크기만 확인한다. |
|
| 42 | 37 |
match: /(^|-)icon(-|$)/, |
| 43 | 38 |
render: (value) => ( |
| 44 | 39 |
<input |
... | ... | @@ -67,9 +62,8 @@ |
| 67 | 62 |
match: /^backdrop-/, |
| 68 | 63 |
render: (value) => ( |
| 69 | 64 |
<div className={styles.demoBackdrop}>
|
| 70 |
- {/* eslint-disable-next-line @next/next/no-img-element -- @fox는 프레임워크에 의존하지
|
|
| 71 |
- 않아야 이식된다. next/image를 쓰면 이 폴더가 Next 전용이 되고 외부 호스트마다 |
|
| 72 |
- remotePatterns 설정도 필요해진다. */} |
|
| 65 |
+ {/* eslint-disable-next-line @next/next/no-img-element -- next/image를 쓰면 이
|
|
| 66 |
+ 폴더가 Next 전용이 된다. */} |
|
| 73 | 67 |
<img |
| 74 | 68 |
src="https://picsum.photos/seed/picsum/200/300" |
| 75 | 69 |
alt="" |
... | ... | @@ -117,16 +111,12 @@ |
| 117 | 111 |
return hit ? hit.render(token.declaration) : null; |
| 118 | 112 |
} |
| 119 | 113 |
|
| 120 |
-/** 색 토큰 판별 — 이 세 접두사만 색이다(font-·number-는 아니다). */ |
|
| 114 |
+/** 이 세 접두사만 색이다. */ |
|
| 121 | 115 |
function isColor(token: CssToken): boolean {
|
| 122 | 116 |
return /^(color|primitive|theme)-/.test(token.name); |
| 123 | 117 |
} |
| 124 | 118 |
|
| 125 |
-/** |
|
| 126 |
- * 칩 배경으로 선언 원문을 그대로 넣는다. 참조(`var(--fox-primitive-neutral-0)`)든 |
|
| 127 |
- * 리터럴이든 CSS가 알아서 해석하고, 참조 대상인 primitive·theme는 모드와 무관한 |
|
| 128 |
- * 값이라 Light 섹션은 라이트 색이, Dark 섹션은 다크 색이 정확히 그려진다. |
|
| 129 |
- */ |
|
| 119 |
+/** 참조든 리터럴이든 원문을 그대로 넣는다 — 참조 대상은 모드 무관 값이라 안전하다. */ |
|
| 130 | 120 |
function chipStyle(token: CssToken): CSSProperties {
|
| 131 | 121 |
return { background: token.declaration };
|
| 132 | 122 |
} |
--- @fox/dev-test/use-css-tokens.ts
+++ @fox/dev-test/use-css-tokens.ts
... | ... | @@ -1,12 +1,8 @@ |
| 1 | 1 |
import { useSyncExternalStore } from "react";
|
| 2 | 2 |
import { readCssSections, type CssSection } from "./read-css-tokens";
|
| 3 | 3 |
|
| 4 |
-// 스타일시트는 React 바깥의 외부 시스템이라 `useSyncExternalStore`가 맞는 도구다 |
|
| 5 |
-// (effect에서 setState 하면 렌더가 연쇄된다). |
|
| 6 |
-// |
|
| 7 |
-// 선언 **원문**을 읽으므로 결과가 현재 테마·뷰포트에 영향받지 않는다 — 한 번 읽어 |
|
| 8 |
-// 캐시하면 그만이다. `useSyncExternalStore`는 매 렌더마다 getSnapshot을 호출하므로 |
|
| 9 |
-// 매번 새 배열을 돌려주면 무한 루프가 된다. |
|
| 4 |
+// 선언 원문을 읽어 결과가 테마·뷰포트에 무관하므로 한 번만 읽어 캐시한다. |
|
| 5 |
+// getSnapshot이 매 렌더 호출되므로 매번 새 배열을 돌려주면 무한 루프가 된다. |
|
| 10 | 6 |
let cached: CssSection[] | null = null; |
| 11 | 7 |
|
| 12 | 8 |
function subscribe(): () => void {
|
... | ... | @@ -22,7 +18,7 @@ |
| 22 | 18 |
return null; |
| 23 | 19 |
} |
| 24 | 20 |
|
| 25 |
-/** 서버 렌더와 하이드레이션 첫 렌더에서는 `null`, 그 이후 CSS에서 읽은 섹션 목록. */ |
|
| 21 |
+/** 서버 렌더·하이드레이션 첫 렌더에서는 `null`. */ |
|
| 26 | 22 |
export function useCssTokens(): CssSection[] | null {
|
| 27 | 23 |
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); |
| 28 | 24 |
} |
--- @fox/styles/_functions.scss
+++ @fox/styles/_functions.scss
... | ... | @@ -1,13 +1,5 @@ |
| 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에서 어떤 토큰인지 그대로 보인다. |
|
| 1 |
+// 토큰 접근 함수. 없는 이름은 `@error`로 빌드를 실패시키고 사용 가능한 목록을 출력한다. |
|
| 2 |
+// 값이 아니라 `var(--fox-*)` 참조를 돌려주므로 라이트/다크·PC/모바일이 런타임에 전환된다. |
|
| 11 | 3 |
|
| 12 | 4 |
@use "sass:map"; |
| 13 | 5 |
@use "tokens"; |
--- @fox/styles/_mixins.scss
+++ @fox/styles/_mixins.scss
... | ... | @@ -1,18 +1,14 @@ |
| 1 |
-// 믹스인 — 여러 선언이 항상 함께 가야 하는 패턴을 묶는다. |
|
| 2 |
- |
|
| 3 | 1 |
@use "tokens"; |
| 4 | 2 |
|
| 5 |
-/// PC 이상(>= 768px)에서 적용. 모바일 우선이므로 기본 스타일은 밖에 쓴다. |
|
| 6 |
-/// |
|
| 7 |
-/// ⚠️ 미디어 쿼리 조건부는 `var()`를 해석하지 못하므로 브레이크포인트만은 CSS 변수가 |
|
| 8 |
-/// 아닌 컴파일타임 값이다. 그래서 이 믹스인 경유가 강제된다. |
|
| 3 |
+/// PC 이상(>= 768px). 미디어 쿼리 조건부는 `var()`를 해석하지 못해 브레이크포인트만 |
|
| 4 |
+/// 컴파일타임 값이고, 그래서 이 믹스인 경유가 강제된다. |
|
| 9 | 5 |
@mixin pc {
|
| 10 | 6 |
@media (min-width: tokens.$breakpoint-pc) {
|
| 11 | 7 |
@content; |
| 12 | 8 |
} |
| 13 | 9 |
} |
| 14 | 10 |
|
| 15 |
-/// PC 미만에서만 적용. `pc`와 경계가 겹치지 않도록 0.02px을 뺀다. |
|
| 11 |
+/// PC 미만. `pc`와 경계가 겹치지 않도록 0.02px을 뺀다. |
|
| 16 | 12 |
@mixin mobile {
|
| 17 | 13 |
@media (max-width: tokens.$breakpoint-pc - 0.02px) {
|
| 18 | 14 |
@content; |
--- @fox/styles/_root.scss
+++ @fox/styles/_root.scss
... | ... | @@ -1,16 +1,11 @@ |
| 1 |
-// 토큰 CSS 출력 — `tokens/`의 SCSS map을 `--fox-*` 커스텀 프로퍼티로 선언한다. |
|
| 2 |
-// |
|
| 3 |
-// **앱 전체에서 딱 한 번만 로드되어야 한다** (`index.scss` 경유). |
|
| 4 |
-// 컴포넌트의 `.module.scss`에서는 절대 `@use` 하지 않는다. |
|
| 5 |
-// |
|
| 6 |
-// map을 순회해 생성하므로 토큰을 추가할 때 이 파일은 손대지 않는다. |
|
| 1 |
+// 토큰 map을 `--fox-*` 커스텀 프로퍼티로 출력한다. **앱 전체에서 한 번만 로드한다.** |
|
| 2 |
+// map을 순회하므로 토큰을 추가할 때 이 파일은 손대지 않는다. |
|
| 7 | 3 |
|
| 8 | 4 |
@use "sass:map"; |
| 9 | 5 |
@use "tokens"; |
| 10 | 6 |
|
| 11 | 7 |
:root {
|
| 12 |
- // 기본은 OS 설정 추종. 아래 `[data-theme]` 규칙이 이 값만 덮어써 수동 선택을 |
|
| 13 |
- // 처리하므로, 색상 값 자체는 `tokens/_color.scss` 한 곳에만 존재한다. |
|
| 8 |
+ // 아래 `[data-theme]`가 이 값만 덮어써 수동 선택을 처리한다 — 색상 값은 한 곳에만 둔다. |
|
| 14 | 9 |
color-scheme: light dark; |
| 15 | 10 |
|
| 16 | 11 |
@each $name, $value in tokens.$primitive {
|
... | ... | @@ -63,9 +58,8 @@ |
| 63 | 58 |
color-scheme: dark; |
| 64 | 59 |
} |
| 65 | 60 |
|
| 66 |
-// ⚠️ 1rem = 10px 규약의 근거. 브라우저 기본 글자 크기(16px)의 62.5%가 10px다. |
|
| 67 |
-// 모든 토큰의 rem 값이 이 선언을 전제로 계산돼 있다. |
|
| 68 |
-// 미디어 쿼리 안의 rem은 이 값의 영향을 받지 않는다(항상 브라우저 기본 크기 기준). |
|
| 61 |
+// ⚠️ 1rem = 10px 규약의 근거. 모든 토큰의 rem 값이 이 선언을 전제로 한다. |
|
| 62 |
+// 미디어 쿼리 안의 rem은 영향을 받지 않는다(항상 브라우저 기본 크기 기준). |
|
| 69 | 63 |
html {
|
| 70 | 64 |
font-size: 62.5%; |
| 71 | 65 |
} |
--- @fox/styles/components.scss
+++ @fox/styles/components.scss
... | ... | @@ -1,14 +1,4 @@ |
| 1 |
-// 공용 컴포넌트 스타일 **묶음** 진입점 — 한 줄로 전부 가져올 때 쓴다. |
|
| 2 |
-// |
|
| 3 |
-// @use "@fox/styles/components"; |
|
| 4 |
-// |
|
| 5 |
-// 필요한 것만 쓰려면 개별 파티셜을 직접 가져온다(안 쓰는 컴포넌트 CSS가 번들에 안 실린다). |
|
| 6 |
-// |
|
| 7 |
-// @use "@fox/styles/fox-button"; |
|
| 8 |
-// |
|
| 9 |
-// 둘을 같이 써도 Sass가 모듈을 한 번만 로드하므로 CSS가 중복되지 않는다. |
|
| 10 |
-// |
|
| 11 |
-// ⚠️ 토큰(`@use "@fox/styles"`)은 별도다. 컴포넌트 스타일은 토큰 커스텀 프로퍼티를 |
|
| 12 |
-// 참조하므로, 이 파일만 가져오고 토큰 진입점을 빼면 값이 비어 렌더된다. |
|
| 1 |
+// 공용 컴포넌트 스타일 묶음. 필요한 것만 쓰려면 개별 파티셜(`@fox/styles/fox-button`)을 |
|
| 2 |
+// 직접 @use 한다. 둘을 같이 써도 Sass가 모듈을 한 번만 로드해 중복되지 않는다. |
|
| 13 | 3 |
|
| 14 | 4 |
@use "fox-button"; |
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?