cms: dateibasiert + Editor im Decap/Sveltia-Look

- CMS liest/schreibt jetzt die echten content/**/*.md (gray-matter) statt DB:
  alle bestehenden Beiträge, Seiten und Rubriken erscheinen und sind editierbar.
  Supabase nur noch für Login.
- Admin neu: Collections-Sidebar (Beiträge/Seiten/Rubriken), an OPENBUREAU-Theme
  angeglichen (Newsreader-Serif, Creme, Terracotta, dunkle Topbar).
- Alle Frontmatter-Felder inkl. Farb-Dropdown mit Farbpunkten (Palette aus
  custom.css), Layout, Tags, summary, cover_image, external, toc, draft.
- Markdown-Toolbar: Fett/Kursiv/Unterstrichen/H2/H3/Link/Bild-Upload/Liste/Zitat/Code.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-31 11:51:49 +02:00
parent e7d820b83c
commit e2d986356c
12 changed files with 526 additions and 377 deletions
+18 -16
View File
@@ -28,13 +28,16 @@ docker compose
nicht — Bild-Uploads gehen auf Platte nach `static/images/`). Nachrüstbar durch
Kopieren der Service-Blöcke aus RAPPORT-SERVER.
## Quelle der Wahrheit (DB-backed)
## Quelle der Wahrheit: die `.md`-Dateien
Die `posts`-Tabelle in Supabase ist kanonisch. `content/*.md` ist ein
**generiertes Artefakt** — nicht von Hand editieren, wird beim Publish
überschrieben. Drafts liegen als `draft: true` in `content/` und werden vom
Live-Build automatisch ausgelassen; nur der Preview-Build (`--buildDrafts`)
zeigt sie.
Dateibasiert. Die echten `content/**/*.md` sind kanonisch — das CMS liest und
schreibt sie direkt (Frontmatter via gray-matter). Damit erscheinen **alle**
bestehenden Inhalte im Editor: Beiträge (`library/<rubrik>/…`), Seiten
(`manifest.md`, `colophon.md`) und Rubriken (`_index.md`).
Supabase wird **nur noch für den Login** (GoTrue) gebraucht — keine Posts in der
DB. Drafts liegen als `draft: true` in der Datei; der Live-Build lässt sie aus,
der Preview-Build (`--buildDrafts`) zeigt sie.
## Setup
@@ -78,16 +81,15 @@ Dann: Admin `…:8080/admin/` · Live `…:8080/` · Preview `…:8080/_preview/
Alle `/api/*` (ausser `/health`) verlangen `Authorization: Bearer <supabase-token>`.
| Methode | Pfad | Zweck |
|---------|---------------------|----------------------------------------|
| GET | `/api/health` | Healthcheck (offen) |
| GET | `/api/posts` | Alle Posts listen |
| GET | `/api/posts/:id` | Einen Post |
| POST | `/api/posts` | Post anlegen (Draft) |
| PUT | `/api/posts/:id` | Post aktualisieren |
| POST | `/api/preview/:id` | Draft als `draft:true` schreiben + Preview-Build |
| POST | `/api/publish/:id` | Live schreiben + Public-Build + (opt.) git commit |
| POST | `/api/upload` | Bild → `static/images/`, liefert `/images/<name>` |
| Methode | Pfad | Zweck |
|---------|-------------------------------|----------------------------------------|
| GET | `/api/health` | Healthcheck (offen) |
| GET | `/api/content` | Alle Einträge listen (Beiträge/Seiten/Rubriken) |
| GET | `/api/content/entry?path=…` | Einen Eintrag lesen (Frontmatter + Body) |
| PUT | `/api/content/entry` | Eintrag anlegen/speichern (`{path, frontmatter, body}`) |
| POST | `/api/preview` | Preview-Build (`--buildDrafts`), liefert `/_preview/…` |
| POST | `/api/publish` | Public-Build → live + (opt.) git commit |
| POST | `/api/upload` | Bild → `static/images/`, liefert `/images/<name>` |
## Stand