Skip to content

커스터마이징

@newtil/* 패키지는 모두 3단계 우선순위를 따릅니다. 원하는 스타일을 만들 때 이 순서로 시도하세요.

1. 타입 클래스      (기본 컴포넌트 사용)
       ↓ 부족하면
2. 옵션 클래스      (variant 조합)
       ↓ 옵션도 안 맞으면
3. CSS 변수 오버라이드  (최후의 수단)

1단계 — 타입

각 컴포넌트의 기본 모양 또는 서로 배타적인 종류입니다. 한 번에 하나만 적용하세요.

html
<!-- 기본 -->
<table class="n-table">…</table>

<!-- 타입 변경 -->
<table class="n-table table:striped">…</table>
<table class="n-table table:bordered">…</table>
<table class="n-table table:minimal">…</table>

대부분의 경우 1단계에서 충분합니다. 기본 타입은 가장 자주 쓰는 모양으로 설계되었습니다.

2단계 — 옵션

타입 위에 조합해서 얹는 수정자입니다. 여러 개를 함께 사용할 수 있습니다.

html
<!-- 타입 + 옵션 조합 -->
<table class="n-table table:striped table-hover:row">…</table>

<table class="n-table table:bordered table-shape:rounded table-density:compact">…</table>

옵션 네이밍 규칙:

형식예시
{컴포넌트}-{속성}:{값}table-shape:rounded, table-density:compact
셀/항목 옵션 (스코프 지역)cell:numeric, cell:center

옵션이 없어서 원하는 모양이 안 나오면 — 이는 옵션을 추가할 신호입니다. 변수 오버라이드로 우회하지 마세요.

3단계 — CSS 변수

타입·옵션 조합으로 해결 안 되는 1회성 특수 케이스에만 사용합니다. 변수는 @newtil/design-tokens의 semantic 토큰을 재정의하는 형태입니다.

html
<!-- 특정 블록 영역에만 primary 색을 브랜드 색으로 강제 -->
<div style="--color-primary: #ff6b35;">
  <table class="n-table">…</table>
</div>

전역 테마 변경이 목적이라면 --color-primary, --color-secondary 등을 :root에서 재정의합니다:

css
:root {
  --color-primary: #4f46e5;
  --color-primary-hover: #4338ca;
  --color-primary-active: #3730a3;
}

왜 이 순서인가?

  • 타입: 기본값이 실전에 맞지 않으면 → 라이브러리 설계가 잘못됨
  • 옵션: 자주 쓰는 변형을 미리 정의 → 사용자가 매번 변수를 만지지 않아도 됨
  • 변수: "이 한 곳만" 다를 때 → 전체 일관성을 유지하면서 예외 처리

변수 오버라이드가 많다는 것은 → 옵션이 부족하다는 신호입니다. 이때는 라이브러리에 옵션을 추가하는 것이 옳습니다.

다크모드

토큰이 다크모드를 이미 처리하므로 별도 작업 불필요합니다. 예외 케이스에서 변수를 오버라이드할 때도 다크모드를 고려해야 합니다:

css
.my-override {
  --color-surface-2: #f5f5f5;
}

@media (prefers-color-scheme: dark) {
  .my-override {
    --color-surface-2: #2a2a2a;
  }
}

네이밍 규칙 요약

패턴예시
n-{컴포넌트}기본 클래스n-table, n-prose
{컴포넌트}:{타입}타입 (배타)table:striped, prose:sm
{컴포넌트}-{속성}:{값}옵션 (조합)table-hover:row, table-density:compact
{요소}:{값}요소 스코프 옵션cell:numeric, cell:center

@newtil/materials와 동일한 규칙을 사용합니다. 한 번 익히면 두 패키지 모두에 적용됩니다.