// 앱 글로벌 스타일 — 디자인 시스템 로드 + **이 앱에만 해당하는** 최소 베이스. // // 색·타이포·간격 같은 디자인 값은 여기에 두지 않는다. 전부 `@fox/styles/tokens/`가 // 소유하며, 이 파일은 "@fox를 켜고, 이 앱의 셸 구조를 잡는다"까지만 한다. // 화면·컴포넌트 스타일은 각자의 `.module.scss`로 간다. @use "@fox/styles"; // 공용 컴포넌트 스타일. CSS Modules가 아니라 전역 BEM이라 여기서 한 번 불러온다 — // 그래야 React 밖(다른 프레임워크·순수 SCSS)에서도 같은 방식으로 쓸 수 있다. @use "@fox/styles/components"; // Pretendard — @fox 토큰이 패밀리명을 **리터럴 `Pretendard`로** 지정하므로(`font.family.*`), // 앱은 정확히 그 이름의 폰트를 공급해야 한다. `next/font/local`은 패밀리명을 // 해시(`__Pretendard_xxxx`)로 바꿔 그 리터럴과 영영 만나지 못해 쓸 수 없다 — 토큰은 Figma // export 자동 생성이라 이름을 코드 쪽에 맞추는 반대 방향도 불가능하다. // weight는 토큰이 쓰는 400·600·800에 더해, 어떤 CSS도 굵기를 지정하지 않는 자리(제목·`th`· // `strong` 등 UA 기본값)가 쓰는 700을 포함한다 — 없으면 700이 800으로 올라가 굵어진다. @font-face { font-family: "Pretendard"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/pretendard-regular.woff2") format("woff2"); } @font-face { font-family: "Pretendard"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/pretendard-semibold.woff2") format("woff2"); } @font-face { font-family: "Pretendard"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/pretendard-bold.woff2") format("woff2"); } @font-face { font-family: "Pretendard"; font-style: normal; font-weight: 800; font-display: swap; src: url("/fonts/pretendard-extrabold.woff2") format("woff2"); } // 앱 기본 서체 — @fox README가 정의한 호스트 앱 계약(`--app-font-sans`)의 실제 주입 지점이다. // 폰트 파일을 next/font가 아니라 위 `@font-face`가 공급하므로 변수도 여기서 정의한다. // 이 값과 @fox 토큰(`font.family.*`)이 지금은 둘 다 Pretendard라 화면 전체가 한 서체다. :root { --app-font-sans: "Pretendard"; } // 테두리·안쪽 여백을 폭에 포함해 센다. 시안이 그 기준으로 그려져 있고(Figma stroke는 안쪽), // 없으면 `inline-size: 100%`에 패딩이 더해져 자식이 부모보다 넓어진다 — 사이드바 항목 폭이 // 시안보다 15px 넓던 원인이 이것이었다. @fox 컴포넌트는 각자 선언하고 있어 영향이 없다. *, *::before, *::after { box-sizing: border-box; } // 폼 조작기는 CSS 명세상 `font`를 상속받지 않아, 아무도 지정하지 않으면 브라우저 기본값 // (macOS 크롬 기준 Arial 13.33px)이 이긴다. 그래서 제목·본문은 Pretendard인데 그 옆 버튼만 // 다른 서체로 나오는 일이 생긴다. 여기서 한 번 되돌린다. // // 타입 선택자(특이도 0,0,1)라 클래스로 서체·크기를 정한 곳은 그대로 이긴다 — @fox 컴포넌트도 // 앱의 module.scss도 영향받지 않고, 아무도 정하지 않은 자리만 앱 서체를 따라온다. button, input, select, textarea { font: inherit; } // 앱 셸 — 루트 레이아웃이 뷰포트 높이를 채우고 세로로 쌓이는 구조. // 푸터를 바닥에 붙이거나 본문 영역만 스크롤시키는 화면들이 이 전제에 기댄다. html, body { block-size: 100%; } body { display: flex; flex-direction: column; // 브라우저 기본 8px 마진 제거 — 헤더·사이드바가 뷰포트에 붙어야 한다. margin: 0; min-block-size: 100%; // @fox 밖 텍스트의 서체. 계약 변수를 거쳐 꽂으므로 서체를 갈 때는 위 `--app-font-sans` // 한 줄만 고치면 된다. @fox 컴포넌트는 이 값이 아니라 토큰(`Pretendard` 리터럴)을 쓰지만, // 지금은 둘이 같은 서체를 가리킨다. font-family: var(--app-font-sans, system-ui), system-ui, sans-serif; }