lichen.page.review from the reviewed point 0b92cb61 to stack eb5a1653, as one PR per subsystem (review set)

product: 14 Frontends: React dashboard, built-in, ui, hugo-cms, lichen-ts #61

targeting oct/13-site-core from oct/14-frontends
Closed opened by and assigned to notplants-bot.bsky.social
targeting oct/13-site-core from oct/14-frontends

superseded by the full set from 09-23, #17–#37

description: Review set for lichen.page.review, 0b92cb61 (reviewed) → eb5a1653 (stack). PR 14 of 16. 56 files, +3085/−847. One commit, 3de197b45a13, which sets these files to their content at eb5a1653. Targets #13 (oct/13-site-core). #15 stacks on this one. Tests and generated files are not in any PR; they are in main.

The frontends' source: the new React dashboard, a shared UI package, the built-in editor's changes, and lichen-ts.

  • frontends/dashboard/, the React dashboard (DASHBOARD-REACT). It replaces the Tera pages one for one: the sites list (create, delete behind a typed confirmation, live updates from the dashboard's event stream, the background auto-pull), the user's settings (atproto, deploy key, limits, compact all, the API token shown once), each site's settings page with every admin act (publishing target and DNS, standard.site, deploy key, git remote and sync, compact/force pull/force push/revert, sharing, collaborators and peers), and the sign-in pages, drawn on the server and hydrated in the browser. It reaches lichen only through lichen-ts/dashboard, and imports nothing from the built-in or hugo-cms.
  • frontends/ui/, the shared look (unit 2): ui.css, the typed confirmation, settings boxes and forms, the header, themes; modal.ts and ssrshims.ts moved here from the built-in. Each frontend's build copies ui.css beside its own CSS.
  • The built-in editor loses its settings page's admin acts (−541 in settings.tsx): where a dashboard keeps the site, the editor links to it (info.site.settings_url, info.dashboard_url), and the history rewrites and share password are done there (ADMIN-EDIT-HOST-SPLIT H1b, DASHBOARD-REACT U3g).
  • lichen-ts (FRONTENDS-THROUGH-LICHEN-TS): one Transport for every request, live document and socket, with defaults that send exactly what lichen-ts sent before; a new lichen-ts/dashboard module for the dashboard's /api routes; info.dashboard_url; a new unauthenticated error code. The built-in's last direct fetch and WebSocket calls (the paint and layout-editor captures among them) now go through it.

info: Plans: DASHBOARD-REACT-2026-10-07.md (units 2–4, U3g), notes DASHBOARD-REACT-U3-DESIGN-2026-10-17.md and -U4-DESIGN-2026-10-17.md; FRONTENDS-THROUGH-LICHEN-TS-2026-10-07.md (L1–L4; note FRONTENDS-THROUGH-LICHEN-TS-L1-DESIGN-2026-10-16.md); ADMIN-EDIT-HOST-SPLIT-2026-10-13.md (H1b).

Files

The dashboard (frontends/dashboard/):

  • src/main.tsx, src/route.ts, src/brand.ts — the app, its three pages, the desktop's branding.
  • src/sites.tsx, src/account.tsx, src/site-sections.tsx (739 lines) — the three pages. site-sections.tsx is the biggest review.
  • src/sign-in.tsx, src/no-script-sites.tsx, src/server.tsx — what the server draws in its render child.
  • index.html, app.css, tsconfig.json, scripts/build.sh (with --check), README.md.

Shared (frontends/ui/): ui.css, src/confirm.tsx, forms.tsx, header.tsx, theme.ts, modal.ts and ssrshims.ts (moved), tsconfig.json, README.md.

The built-in (frontends/builtin/):

  • app/src/settings.tsx (+32/−541), panels.tsx, origin.ts (new: is a URL on another origin) — the admin acts go to the dashboard.
  • app/src/app.tsx, editor.ts, files.ts, server.tsx; plugins/*/src/capture.ts, Stage.tsx, PaintView.tsx — through lichen-ts.
  • app/index.html, app/scripts/build.sh — link and copy ui.css; app/app.css (−48) and app/git.css (−76) lose the styles that moved to it.
  • DESIGN-10.md, README.md; frontends/no-javascript/README.md.

lichen-ts:

  • src/transport.ts (new), src/http.ts, src/site.ts, src/text.ts, src/map.ts, src/events.ts, src/media/index.ts, src/errors.ts, src/index.ts — the transport and its uses.
  • src/dashboard/index.ts (new), src/dashboard/README.md, package.json — lichen-ts/dashboard.
  • scripts/throwaway-lichen.mjs, lichen-pin — the test helper (a single site's settings are now in its state beside the site) and the lichen commit lichen-ts's tests run against.
  • README.md — "a frontend reaches lichen only through lichen-ts".

Moved in: the frontends' own READMEs (frontends/*/README.md, lichen-ts/README.md, lichen-ts/src/dashboard/README.md). The operator's proposal put READMEs in Docs; a component's README is read with its code, so they are here, and #16 keeps the top-level documents.

Lives elsewhere

  • Built bundles are not here. frontends/*/app.js, ssr/*.js, the plugin bundles, hugo-cms's app.js, the copied ui.css files and lichen-ts/dist/ are esbuild output, checked by each build.sh --check; they are in main.
  • The server side of the dashboard (pages, render child, custom dashboards): #12. The API it calls and its contract: #11.
  • Frontend and lichen-ts tests (frontends/*/tests/, lichen-ts/tests/, feature_inventory.json) are in main.
Commits 0