Fleet operations panel. Every page is a thin .astro wrapper that renders ONE Solid island with
client:only="solid-js" inside AdminLayout (see index.astro:43-50). Subtrees: server/,
user/, software/, packages/, runner/, creator/, incident/, testing/, plus the
dashboard grid (index.astro). Islands live in each dir’s _components/.
src/layouts/AdminLayout.astro (redirects to /login if getUser is null).src/styles/admin.css (imported by AdminLayout, NOT app.css) +
src/components/AdminButton.tsx, StatusDot.tsx, Badge.tsx,
components/testing/testingShared.tsx.src/client/solid_api.ts (adminGet*); pages read checkAdmin/token cookie
via src/client/api.ts.admin.css, which re-declares brand tokens independently of
theme.css — a brand change here won’t match the public side unless mirrored. AdminButton is a
twin of the public Button (update both or neither).client:only — they never SSR; don’t rely on server-rendered admin markup.