토널 팔레트 (50~950 램프)

Tonal palette (50–950 ramp)

한 색상을 50부터 950까지 숫자 단계로 나눈 명도 램프. Tailwind·Material 같은 디자인 시스템 토큰의 표준 형태입니다.

다른 이름: Color rampDesign token scale토큰 스케일
···
html
<div class="wrap">
  <div class="ramp" id="ramp"></div>
  <div class="readout" id="readout">oklch(60% 0.16 250)</div>
</div>
css
.wrap{width:min(560px,94%);display:grid;gap:10px}
.ramp{display:grid;grid-template-columns:repeat(11,1fr);gap:3px}
.ramp div{display:grid;gap:2px;justify-items:center}
.ramp i{display:block;width:100%;aspect-ratio:1;border-radius:5px;border:1px solid var(--line)}
.ramp b{font:700 clamp(6px,1.5vmin,8px)/1 ui-monospace,monospace;color:var(--muted)}
.readout{text-align:center;font:700 clamp(9px,2.4vmin,11px)/1 ui-monospace,monospace;color:var(--fg)}
js
var STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
var LIGHT = [97, 94, 87, 79, 70, 60, 50, 42, 34, 24, 15];
var CMAX = 0.16;
function chromaFor(i) {
  var t = i / (STEPS.length - 1);
  var taper = Math.sin(t * Math.PI);
  return +(CMAX * (0.3 + 0.7 * taper)).toFixed(3);
}
var ramp = document.getElementById('ramp'), readout = document.getElementById('readout');
ramp.innerHTML = STEPS.map(function (s, i) { return '<div><i id="c' + i + '"></i><b>' + s + '</b></div>'; }).join('');
var cells = STEPS.map(function (_, i) { return document.getElementById('c' + i); });
var hue = 250;
function render() {
  STEPS.forEach(function (s, i) {
    var c = chromaFor(i);
    var str = 'oklch(' + LIGHT[i] + '% ' + c + ' ' + Math.round(hue) + ')';
    cells[i].style.background = str;
    if (s === 500) readout.textContent = str;
  });
}
render();
setInterval(function () { hue = (hue + 40) % 360; render(); }, 2600);

토널 팔레트는 색상(H)과 크로마(C)는 거의 고정한 채 명도(L)만 11단계(50, 100, 200, …, 900, 950)로 나눕니다. 숫자가 작을수록 밝고(50 = 거의 흰색), 클수록 어둡습니다(950 = 거의 검정) — 이 방향은 Tailwind CSS의 관례를 따른 것입니다.

명도만 바꾸는데도 "쨍한 정도"가 흔들리지 않으려면 OKLCH의 크로마(C) 축을 씁니다. HSL 채도로 같은 시도를 하면 어두운 단계(900대)에서 색이 급격히 탁해 보이는데, OKLCH는 명도와 크로마가 독립적이라 이 문제가 줄어듭니다.

아래 데모는 oklch(L% C H)를 매 단계마다 계산해서 실제로 그립니다. 극단 단계(50, 950)에서는 크로마를 살짝 낮춰야 자연스럽습니다 — 아주 밝거나 아주 어두운 색은 물리적으로 크로마를 크게 가질 수 없기 때문입니다.

언제 쓰나

디자인 토큰에서 brand-50~brand-950처럼 하나의 브랜드 색을 여러 명도 단계로 뽑아야 할 때 씁니다.