feat(editor): Editor-Oberfläche mit Upload, Vorschau und Download

Store, Upload-Prüfung/Dekodierung und Download-Dateiname mit Tests; drei Spalten
(Vorlagen mit Live-Miniatur, Vorschau mit Ziehen/Zoom, Optionen), einspaltig unter 900 px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 08:05:50 +00:00
1 parent 9a46342e0c
commit 30f4ddc0f4
13 files changed
+1703 -3

No files matched your search

+11 -3
View File
@@ -1,15 +1,23 @@
import '@fontsource-variable/nunito-sans';
import './styles.css';
import { startRouter, type RouteId } from './pages/router';
import { mountEditor } from './editor/editor-page';
import { createStore, initialEditorState } from './editor/state';
// Platzhalter, bis die Seiten aus den Folgeaufgaben (Editor, Karten, Passwort) angebunden sind.
const PLACEHOLDER_TITLES: Record<RouteId, string> = {
editor: 'Editor',
// Platzhalter, bis die Seiten aus den Folgeaufgaben (Karten, Passwort) angebunden sind.
const PLACEHOLDER_TITLES: Record<Exclude<RouteId, 'editor'>, string> = {
cards: 'Meine Karten',
reset: 'Passwort neu setzen',
};
// Der Editor-Zustand lebt außerhalb der Seiten und überlebt Seitenwechsel.
const editorStore = createStore(initialEditorState());
startRouter((route, root) => {
if (route === 'editor') {
// Speichern wird mit den Konten (spätere Aufgabe) angebunden; bis dahin passiert nichts.
return mountEditor(root, editorStore, { onSave: () => {} });
}
const heading = document.createElement('h1');
heading.textContent = PLACEHOLDER_TITLES[route];
root.replaceChildren(heading);