feat(ui): Phase D.4/D.5 — keyboard nav + density toggle
D.4 useListKeyboardNav:
- 신규: frontend/src/lib/composables/useListKeyboardNav.svelte.ts
j/k/Arrow/Enter/Esc, isTypingTarget 가드 (input/textarea/select/
contenteditable 포커스 시 비활성)
- documents/+page.svelte: kbIndex $state, kbSelectedId $derived,
items 변경 시 clamp, URL 변경 시 0 리셋
- DocumentTable/DocumentCard: kbSelectedId prop → data-kb-selected
속성 + ring-accent-ring 시각 표시
- scrollSelectedIntoView: queueMicrotask + querySelector로 현재
커서를 뷰포트 내로 스크롤 (block: nearest)
D.5 Table density:
- DocumentTable: density prop (compact/comfortable), rowPaddingClass
($derived: py-1 | py-2.5), rowTextClass (text-[10px] | text-xs)
- documents/+page.svelte: tableDensity $state, toggleDensity 헬퍼,
localStorage.tableDensity persistent, 테이블 뷰에서만 토글 버튼
노출 (Rows2/Rows3 아이콘)
- 뷰 모드 버튼도 token 기반으로 리팩토링
검증:
- npm run build 통과
- npm run lint:tokens 231 → 229 (뷰 모드 버튼 token swap으로 -2)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>