feat(view): project save/open, Ctrl+S, save status, IndexedDB auto-backup (plan B2–B5)

- 저장 (Ctrl+S) downloads <교량명>_교각설계.pzr.json; 프로젝트 열기 reads it
  back and regenerates every pier without the source workbook.
- Save status in the header: 저장 전 / 변경 있음 · 미저장 / 저장됨. The
  snapshot excludes the history so a save is not counted as a change.
- Auto-backup to IndexedDB 0.8 s after changes while unsaved; on start a banner
  offers recovery or discard. Storage failures are reported, not fatal.
- beforeunload warns while there are unsaved changes.
- B1 (default-vs-changed tracking) is not added yet: inputs are not editable
  until the 2단계 input cards exist.
- Not verified in a browser (no debuggable Chrome in this session).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-22 09:44:49 +09:00
1 parent 5ce6d0e2f1
commit f5303e4c2b
3 files changed
+205

No files matched your search

+9
View File
@@ -19,11 +19,20 @@
</nav>
<div class="actions">
<button id="open-import" class="btn" type="button">엑셀 불러오기</button>
<button id="open-project" class="btn" type="button">프로젝트 열기</button>
<button id="save-project" class="btn" type="button" disabled>저장 (Ctrl+S)</button>
<button id="regen" class="btn primary" type="button" disabled>선택 교각 형상 생성</button>
<input id="project-file" type="file" accept=".json" hidden />
<span id="save-status" class="muted">저장 전</span>
</div>
</header>
<p id="status" class="status-line" role="status" aria-live="polite">엑셀을 불러오면 교각 형상을 생성합니다.</p>
<div id="backup-banner" class="status-line" hidden>
<span id="backup-text"></span>
<button id="restore-backup" class="btn small" type="button">복구</button>
<button id="discard-backup" class="btn small" type="button">버리기</button>
</div>
<main class="grid">
<aside class="panel piers" aria-labelledby="pier-title">