Rework the site structure tree's drag-and-drop to match Sortable's native
model instead of mid-drag drop zones:
- Drop the dashed empty-list drop zones that appeared on drag start
(flicker, space reservation, and mis-targeted drops: the last item's
child zone sat exactly where 'end of parent list' was).
- Every non-empty list (and the root) ends with a non-draggable ➕ footer
row (vuedraggable #footer slot): click to start a new page at that
level, and while dragging it is the 'end of this list' drop target.
It renders last even mid-drag via flex order, since Sortable appends
end-of-list previews after it in the DOM.
- Dropping ON the lower part of a row makes the page that row's first
child: the child list's container invisibly overlaps its own row's
bottom (negative margin + equal padding, no layout effect) and becomes
hit-testable only while dragging. A row's exposed top strip remains
the 'sibling before' target. Leaf rows work too, creating a sublist.
- Indentation is structural (each nested list margin-indents itself), so
a dragged row previews its whole subtree at the target list's depth.
Rows get a little vertical padding to widen the drop zones.
Pagerite
A single-user CMS/blog. FastAPI serves HTML rendered in Python with html5tagger, content is persisted in a kanta database and rendered on the fly per request. Vue is used only for interactive bits (the editing tools), not for the public pages.
Running
uv run pagerite # serves the built frontend
uv run scripts/devserver.py # dev mode with auto reloads (no build needed)
The database lives in pagerite.kanta in the working directory
(PAGERITE_DB overrides). On startup, demo pages from pagerite/seed.py
are added only if missing.
Editing
Click the 🖊️ pen on any page: the article pen opens the page editor (Markdown with live server-rendered preview over a WebSocket), the banner pen opens the site editor (site brand, banner HTML, and the page structure tree). Everything saves immediately — no save buttons.
See docs/design-principles.md for the design and AGENTS.md for the
development conventions.