Add export method dialog, extract shared Dialog primitive

Add export dialog with download/clipboard options and optional
undo/redo history inclusion (default off). Extract shared Dialog
component to ui/dialog.tsx, consolidating open/close lifecycle,
backdrop click, and escape key handling from all 6 dialog components.
Update spec to reflect export method dialog and optional history.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-27 14:57:31 +01:00
parent 4969ed069b
commit 209df13c32
10 changed files with 218 additions and 193 deletions

View File

@@ -68,20 +68,24 @@ export function assembleExportBundle(
encounter: Encounter,
undoRedoState: UndoRedoState,
playerCharacters: readonly PlayerCharacter[],
includeHistory = true,
): ExportBundle {
return {
version: 1,
exportedAt: new Date().toISOString(),
encounter,
undoStack: undoRedoState.undoStack,
redoStack: undoRedoState.redoStack,
undoStack: includeHistory ? undoRedoState.undoStack : [],
redoStack: includeHistory ? undoRedoState.redoStack : [],
playerCharacters: [...playerCharacters],
};
}
export function bundleToJson(bundle: ExportBundle): string {
return JSON.stringify(bundle, null, 2);
}
export function triggerDownload(bundle: ExportBundle): void {
const json = JSON.stringify(bundle, null, 2);
const blob = new Blob([json], { type: "application/json" });
const blob = new Blob([bundleToJson(bundle)], { type: "application/json" });
const url = URL.createObjectURL(blob);
const date = new Date().toISOString().slice(0, 10);