그리드 줌 · 사진 줌/팬 · 영상 재생목록 추가

- 그리드 썸네일 줌: Ctrl+휠 + 툴바 슬라이더(110~420px), localStorage 유지
- 라이트박스 사진 줌/팬: 휠(커서 기준)·드래그·더블클릭·+/-/0 키,
  파일 이동 시 리셋, 확대율 배지
- 영상 재생목록: 종료 시 다음 항목 자동재생, 🔁 반복 토글

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
강 한
2026-07-17 05:46:48 +09:00
co-authored by Claude Opus 4.8
parent cb0207154d
commit dd9d6bfa0c
5 changed files with 188 additions and 10 deletions
+26
View File
@@ -139,6 +139,32 @@ const [sidebarVersion, setSidebarVersion] = createSignal(0);
export { sidebarVersion };
export const refreshSidebar = () => setSidebarVersion((v) => v + 1);
// ── 그리드 썸네일 크기(줌) ───────────────────────────────
export const GRID_ROW_MIN = 110;
export const GRID_ROW_MAX = 420;
const GRID_ROW_KEY = "archive.grid.rowHeight";
const initialRow = Number(localStorage.getItem(GRID_ROW_KEY) ?? "200");
const [gridRowHeight, setGridRowHeightRaw] = createSignal(
Number.isFinite(initialRow) ? Math.min(GRID_ROW_MAX, Math.max(GRID_ROW_MIN, initialRow)) : 200,
);
export { gridRowHeight };
export function setGridRowHeight(px: number): void {
const clamped = Math.min(GRID_ROW_MAX, Math.max(GRID_ROW_MIN, Math.round(px)));
setGridRowHeightRaw(clamped);
localStorage.setItem(GRID_ROW_KEY, String(clamped));
}
/** 상대 배율로 줌 (Ctrl+휠) */
export function zoomGrid(factor: number): void {
setGridRowHeight(gridRowHeight() * factor);
}
// ── 영상 재생목록 옵션 ───────────────────────────────────
const [repeatMode, setRepeatMode] = createSignal(false);
export { repeatMode };
export const toggleRepeat = () => setRepeatMode((r) => !r);
// ── 중복 검토 패널 ───────────────────────────────────────
const [dedupeOpen, setDedupeOpen] = createSignal(false);
export { dedupeOpen };