틴트 · 셰이드 · 톤

Tint, shade, tone

순색에 흰색을 섞으면 틴트, 검정을 섞으면 셰이드, 회색을 섞으면 톤. 팔레트를 만드는 가장 기본적인 세 가지 방법입니다.

다른 이름: Color mixing색상 혼합
···
html
<div class="wrap">
  <div class="rowlabel">Tint <span class="muted">+ white</span></div>
  <div class="row" id="tintRow"></div>
  <div class="rowlabel">Tone <span class="muted">+ gray</span></div>
  <div class="row" id="toneRow"></div>
  <div class="rowlabel">Shade <span class="muted">+ black</span></div>
  <div class="row" id="shadeRow"></div>
</div>
css
.wrap{width:min(560px,94%);display:grid;gap:6px}
.rowlabel{font:700 clamp(10px,2.6vmin,12px)/1 ui-monospace,monospace;color:var(--muted);margin-top:8px}
.rowlabel .muted{font-weight:500;opacity:.7}
.row{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;height:clamp(26px,6.4vmin,40px)}
.row div{border-radius:8px;border:1px solid var(--line)}
js
const STEPS = [0, 25, 50, 75, 100];
let hue = 20;
const tintRow = document.getElementById('tintRow'), toneRow = document.getElementById('toneRow'), shadeRow = document.getElementById('shadeRow');
[tintRow, toneRow, shadeRow].forEach(row => row.innerHTML = STEPS.map(() => '<div></div>').join(''));

function render() {
  const base = 'hsl(' + hue + ', 72%, 50%)';
  for (let i = 0; i < STEPS.length; i++) {
    const p = STEPS[i];
    tintRow.children[i].style.background = 'color-mix(in srgb, ' + base + ' ' + (100 - p) + '%, white ' + p + '%)';
    toneRow.children[i].style.background = 'color-mix(in srgb, ' + base + ' ' + (100 - p) + '%, gray ' + p + '%)';
    shadeRow.children[i].style.background = 'color-mix(in srgb, ' + base + ' ' + (100 - p) + '%, black ' + p + '%)';
  }
}
(function tick() {
  hue = (hue + 0.2) % 360;
  render();
  requestAnimationFrame(tick);
})();

틴트(tint)는 순색 + 흰색이라 항상 밝고 채도가 낮아집니다. 셰이드(shade)는 순색 + 검정이라 어둡고 무거워집니다. 톤(tone)은 순색 + 회색이라 명도는 비슷한데 채도만 죽어서 "차분한" 느낌이 됩니다.

CSS color-mix()로 이 세 가지를 그대로 구현할 수 있습니다: color-mix(in srgb, red 70%, white 30%)처럼 비율을 직접 지정합니다. HSL로 흉내 낼 수도 있지만(명도만 올리면 틴트에 가까움) 정확히 같지는 않습니다 — 진짜 혼합은 흰색·검정·회색의 색 자체가 결과에 섞여 들어갑니다.

브랜드 색 하나로 hover·disabled·배경 등 전체 상태 팔레트를 만들 때 이 세 축을 기준으로 삼으면 일관성을 유지하기 쉽습니다.

언제 쓰나

디자인 토큰에서 brand-50부터 brand-900까지 같은 팔레트 스케일을 만들 때.