커맨드 팔레트

Command palette

단축키(주로 ⌘K)로 열어서 타이핑만으로 앱 안의 어떤 명령이든 검색해 실행하는 전역 검색창.

다른 이름: Quick switcherAction search⌘K menuSpotlight-style search
···
html
<div class="cpw">
  <div class="cprow"><span class="cpico">⌘K</span><input id="cpi" readonly placeholder="명령 검색…"></div>
  <ul class="cplist" id="cpl">
    <li>새 문서 만들기</li><li>파일 열기</li><li>테마 전환</li>
  </ul>
</div>
css
.cpw{width:min(230px,92%);background:var(--surface);border:1px solid var(--line);border-radius:12px;box-shadow:0 16px 34px rgba(0,0,0,.2);overflow:hidden}
.cprow{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line)}
.cpico{font-size:10px;font-weight:700;color:var(--muted);border:1px solid var(--line);border-radius:5px;padding:2px 5px}
#cpi{border:0;background:none;color:var(--fg);font-size:12px;flex:1;outline:none}
.cplist{list-style:none;margin:0;padding:5px}
.cplist li{padding:8px 10px;border-radius:7px;font-size:12px;color:var(--fg)}
.cplist li[hidden]{display:none}
.cplist li[data-hi]{background:var(--accent);color:#fff}
js
const input = document.getElementById('cpi'), items = [...document.querySelectorAll('.cplist li')];
const word = '새 문';
function filter(q) {
  let first = null;
  items.forEach((li) => {
    const match = !q || li.textContent.includes(q);
    li.hidden = !match; li.removeAttribute('data-hi');
    if (match && !first) first = li;
  });
  if (first) first.setAttribute('data-hi', '');
  return first;
}
filter('');
function loop() {
  input.value = ''; filter('');
  let i = 0;
  const type = setInterval(() => {
    i++; input.value = word.slice(0, i);
    const hit = filter(input.value);
    if (i >= word.length) {
      clearInterval(type);
      setTimeout(() => { if (hit) hit.style.transform = 'scale(.97)'; setTimeout(() => { items.forEach(li => li.style.transform = ''); setTimeout(loop, 1100); }, 260); }, 500);
    }
  }, 340);
}
loop();

모달(role="dialog")로 뜨고, 그 안에 콤보박스+리스트박스 패턴을 담습니다 — 입력에 aria-activedescendant로 현재 하이라이트된 명령을 가리키고, 방향키로 이동, Enter로 실행, Esc로 닫습니다. 대부분 퍼지 매칭(글자 순서만 맞으면 매칭)을 지원해 "새문서"만 쳐도 "새 문서 만들기"가 걸립니다.

콤보박스와의 차이는 범위입니다 — 콤보박스는 폼 안에서 값 하나를 고르는 좁은 컨트롤이지만, 커맨드 팔레트는 페이지 이동·설정 변경·명령 실행처럼 앱 전체를 가로지르는 전역 내비게이션이고 항상 모달로 뜹니다. 드롭다운 메뉴와도 "명령 목록에서 고른다"는 점은 같지만, 팔레트는 텍스트로 필터링하는 열린 목록이라는 점이 다릅니다.

전역 단축키(⌘K/Ctrl+K)가 브라우저나 OS의 기본 동작과 충돌하지 않는지 반드시 확인해야 합니다.