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
+29
View File
@@ -0,0 +1,29 @@
import { Hono } from 'hono';
import { listEntries, readEntry, writeEntry, entryExists } from '../files.js';
// Dateibasiert: liest/schreibt die echten .md unter content/.
const content = new Hono();
// Liste aller Einträge (Beiträge, Seiten, Rubriken).
content.get('/', async (c) => {
try { return c.json(await listEntries()); }
catch (e) { return c.json({ error: String(e.message || e) }, 500); }
});
// Einen Eintrag lesen: /api/content/entry?path=library/software/stack.md
content.get('/entry', async (c) => {
try { return c.json(await readEntry(c.req.query('path'))); }
catch (e) { return c.json({ error: String(e.message || e) }, 400); }
});
// Anlegen oder überschreiben.
content.put('/entry', async (c) => {
const { path: rel, frontmatter, body } = await c.req.json();
try {
const created = !(await entryExists(rel));
const saved = await writeEntry(rel, frontmatter, body);
return c.json({ ok: true, path: saved, created });
} catch (e) { return c.json({ error: String(e.message || e) }, 400); }
});
export default content;