시맨틱 컬러

Semantic colors

색 자체(blue-500)가 아니라 색의 역할(success, danger)로 이름 붙인 토큰. 브랜드 컬러가 바뀌어도 "성공은 초록"이라는 의미는 그대로 유지됩니다.

다른 이름: Semantic tokens의미 색상
···
html
<div class="wrap">
  <div class="toast" id="toast">
    <span class="dot" id="dot"></span>
    <div class="txt"><b id="title">Success</b><span id="desc">저장되었습니다.</span></div>
    <code id="tok">--color-success</code>
  </div>
  <div class="navdots" id="navdots"></div>
</div>
css
.wrap{width:min(440px,92%);display:grid;justify-items:center}
.toast{width:100%;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:12px;padding:clamp(10px,2.8vmin,16px);border-radius:12px;border:2px solid var(--line);background:var(--surface);box-shadow:0 10px 26px rgba(0,0,0,.12);transition:border-color .4s;cursor:pointer}
.dot{width:14px;height:14px;border-radius:50%;flex:none}
.txt{display:grid;gap:2px;min-width:0}
.txt b{font:700 clamp(11px,2.8vmin,13px)/1.2 system-ui}
.txt span{font:500 clamp(10px,2.6vmin,12px)/1.3 system-ui;color:var(--muted)}
code{font:600 clamp(8px,2.2vmin,10px)/1 ui-monospace,monospace;color:var(--muted);white-space:nowrap}
.navdots{display:flex;gap:6px;justify-content:center;margin-top:12px}
.navdots i{width:6px;height:6px;border-radius:50%;background:var(--line)}
.navdots i.on{background:var(--fg)}
js
const STATES = [
  { title: 'Info', ko: '새 버전이 있습니다.', color: '#2563eb', token: '--color-info' },
  { title: 'Success', ko: '저장되었습니다.', color: '#16a34a', token: '--color-success' },
  { title: 'Warning', ko: '용량이 얼마 안 남았습니다.', color: '#d97706', token: '--color-warning' },
  { title: 'Danger', ko: '삭제하면 되돌릴 수 없습니다.', color: '#dc2626', token: '--color-danger' },
];
let idx = 0;
const toast = document.getElementById('toast'), dot = document.getElementById('dot'), title = document.getElementById('title'), desc = document.getElementById('desc'), tok = document.getElementById('tok');
const navdots = document.getElementById('navdots');
navdots.innerHTML = STATES.map(() => '<i></i>').join('');

function render() {
  const s = STATES[idx];
  dot.style.background = s.color;
  toast.style.borderColor = s.color;
  title.textContent = s.title;
  title.style.color = s.color;
  desc.textContent = s.ko;
  tok.textContent = s.token;
  [].forEach.call(navdots.children, (el, i) => el.classList.toggle('on', i === idx));
}
render();
toast.addEventListener('click', () => { idx = (idx + 1) % STATES.length; render(); });
setInterval(() => { idx = (idx + 1) % STATES.length; render(); }, 2200);

--color-success처럼 이름에 의미를 담아두면, 코드는 "이 버튼은 성공 상태다"라고만 말하면 되고 실제 색값은 디자인 토큰 레이어에서 한 곳만 바꾸면 됩니다. 다크모드 전환, 리브랜딩, 접근성 대비 개선이 전부 이 레이어에서 끝납니다.

관례적으로 초록(success)·주황/노랑(warning)·빨강(danger)·파랑(info) 네 가지가 가장 널리 쓰입니다. 문화권·색각 이상을 감안해서 색만으로 구분하지 말고 아이콘·텍스트를 항상 같이 배치하세요.

토큰 이름과 실제 색이 어긋나면(예: --color-danger를 파란색으로 지정) 팀 전체의 직관이 깨지니, 이름이 의미하는 색의 "상식"에서 벗어나지 않는 게 중요합니다.

언제 쓰나

토스트, 배지, 폼 검증 메시지처럼 상태를 색으로 표현하는 모든 컴포넌트의 기본값으로 씁니다.