diff --git a/frontend/packages/swarm-ui/build.mjs b/frontend/packages/swarm-ui/build.mjs index 7c4874cf..4e680219 100644 --- a/frontend/packages/swarm-ui/build.mjs +++ b/frontend/packages/swarm-ui/build.mjs @@ -5,17 +5,10 @@ // dist/static/main.js served at /static/main.js (ESM bundle, // Preact + wouter-preact) // dist/static/main.js.map source map sibling -// dist/static/main.css every component's own `import -// './Foo.css'` (Shell.css, Panel.css, …), -// folded by esbuild into one companion -// output alongside main.js — no separate -// build step, this falls out of bundling -// main.tsx with `bundle: true` // dist/static/colors.css served at /static/colors.css // dist/static/theme.css served at /static/theme.css -// dist/static/swarm-ui.css served at /static/swarm-ui.css — just the -// shared base reset now (@import resolved -// from @hive/shared), NOT component styles +// dist/static/swarm-ui.css served at /static/swarm-ui.css (@import +// resolved from @hive/shared) // // Not yet wired into any Rust binary's `ServeDir` — swarm-controller // only serves `/health` today (see swarm-controller/README.md); this diff --git a/frontend/packages/swarm-ui/src/App.tsx b/frontend/packages/swarm-ui/src/App.tsx index 6909ef8c..5430dffb 100644 --- a/frontend/packages/swarm-ui/src/App.tsx +++ b/frontend/packages/swarm-ui/src/App.tsx @@ -1,34 +1,35 @@ -// Root shell component. Real route (`/`) is still a placeholder — the -// swarm's hive roster is the next piece of work to land into it — but -// it now mounts inside and uses the ui/ primitives, so that -// page lands as a content change, not a structural one. +// Root shell component. Empty start page for now — functionality +// (swarm roster, target-state view, whatever the swarm-controller +// epic eventually needs) is out of scope until auth against authelia +// is figured out. What's here IS in scope: a real router + deep-link +// shape that the per-hive dashboard's vanilla-JS + custom-element MPA +// doesn't have, so later work has a shell to land routes into instead +// of bolting routing on after the fact. import { Route, Switch } from 'wouter-preact'; -import { Shell } from './shell/Shell.js'; -import { Panel } from './ui/panel/Panel.js'; function Home() { return ( - -

hive roster lands here, sequenced after this shell.

-
+
+

swarm ui

+

nothing here yet — project-bootstrap placeholder.

+
); } function NotFound() { return ( - +
+

404

no route here.

- +
); } export function App() { return ( - - - - - - + + + + ); } diff --git a/frontend/packages/swarm-ui/src/css.d.ts b/frontend/packages/swarm-ui/src/css.d.ts deleted file mode 100644 index 8597bb2b..00000000 --- a/frontend/packages/swarm-ui/src/css.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Ambient module for `import './Foo.css'` side-effect imports (esbuild -// resolves these directly, see build.mjs; tsc otherwise has no idea what -// a `.css` specifier is and refuses the whole side-effect import). -declare module '*.css'; diff --git a/frontend/packages/swarm-ui/src/index.html b/frontend/packages/swarm-ui/src/index.html index 6766527b..9ed89442 100644 --- a/frontend/packages/swarm-ui/src/index.html +++ b/frontend/packages/swarm-ui/src/index.html @@ -7,7 +7,6 @@ -
diff --git a/frontend/packages/swarm-ui/src/shell/Shell.css b/frontend/packages/swarm-ui/src/shell/Shell.css deleted file mode 100644 index 4a6de52c..00000000 --- a/frontend/packages/swarm-ui/src/shell/Shell.css +++ /dev/null @@ -1,40 +0,0 @@ -/* — header bar + nav row + the content column every route - renders into. Colour vars come from ../theme.css (same base16 slots - the per-hive dashboard uses, so this reads as recognizably - hyperhive) — the layout itself is this package's own, not - @hive/shared's chrome.css. */ -.shell-header { - display: flex; - align-items: center; - gap: 1.5em; - padding: 0.75em 1.25em; - border-bottom: 1px solid var(--border); - background: var(--bg-elev); -} -.shell-brand { - font-weight: 600; - color: var(--purple); - letter-spacing: 0.02em; -} -.shell-nav { - display: flex; - gap: 1em; -} -.shell-nav-link { - color: var(--muted); - text-decoration: none; - padding: 0.25em 0; - border-bottom: 2px solid transparent; -} -.shell-nav-link:hover { - color: var(--fg); -} -.shell-nav-link-active { - color: var(--fg); - border-bottom-color: var(--purple); -} -.shell-body { - max-width: 60em; - margin: 0 auto; - padding: 1.5em 1.25em; -} diff --git a/frontend/packages/swarm-ui/src/shell/Shell.tsx b/frontend/packages/swarm-ui/src/shell/Shell.tsx deleted file mode 100644 index 9a25878e..00000000 --- a/frontend/packages/swarm-ui/src/shell/Shell.tsx +++ /dev/null @@ -1,44 +0,0 @@ -// — page chrome every swarm-ui route mounts inside: a header -// bar (swarm branding) plus a nav row linking the app's real routes. -// Preact-native styling — `./Shell.css` imported right here, not -// wired centrally, so the component and its styles travel together -// (esbuild folds every imported `.css` reachable from `main.tsx` into -// one `main.css` companion output, see build.mjs) — deliberately not -// @hive/shared's chrome.css page-header pattern, which is the per-hive -// MPA dashboard's visual language. This package is a clean field, not -// an inheritor of that look. -// -// Route list lives here, not prop-drilled from App — one small SPA -// has exactly one place that needs to know its own nav, and this is -// it. Grows additively as real routes land (a swarm-wide agent roster -// is next); no speculative entries. -import type { ComponentChildren } from 'preact'; -import { Link, useRoute } from 'wouter-preact'; -import './Shell.css'; - -const NAV_ITEMS: { href: string; label: string }[] = [{ href: '/', label: 'overview' }]; - -function NavLink({ href, label }: { href: string; label: string }) { - const [active] = useRoute(href); - return ( - - {label} - - ); -} - -export function Shell({ children }: { children: ComponentChildren }) { - return ( -
-
- hyperhive swarm - -
-
{children}
-
- ); -} diff --git a/frontend/packages/swarm-ui/src/swarm-ui.css b/frontend/packages/swarm-ui/src/swarm-ui.css index 5289a7a2..43134567 100644 --- a/frontend/packages/swarm-ui/src/swarm-ui.css +++ b/frontend/packages/swarm-ui/src/swarm-ui.css @@ -1,7 +1,12 @@ -/* Page-level base only — component styles are colocated with their - component (`./Shell.css` imported by shell/Shell.tsx, etc.) and - land in the `main.css` companion esbuild emits alongside `main.js` - (see build.mjs), not here. This file stays just the shared reset - every page needs regardless of which components a route happens to - use. */ @import "@hive/shared/base.css"; + +/* Bootstrap placeholder only — real layout comes with the first + route that actually needs one. */ +.swarm-ui-empty { + max-width: 40em; + margin: 4em auto; + padding: 0 1em; +} +.swarm-ui-empty h1 { + color: var(--purple); +} diff --git a/frontend/packages/swarm-ui/src/ui/panel/Panel.css b/frontend/packages/swarm-ui/src/ui/panel/Panel.css deleted file mode 100644 index 23a40980..00000000 --- a/frontend/packages/swarm-ui/src/ui/panel/Panel.css +++ /dev/null @@ -1,15 +0,0 @@ -.ui-panel { - border: 1px solid var(--border); - border-radius: 0.5em; - background: var(--bg-elev); -} -.ui-panel-title { - margin: 0; - padding: 0.75em 1em; - font-size: 1em; - font-weight: 600; - border-bottom: 1px solid var(--border); -} -.ui-panel-body { - padding: 1em; -} diff --git a/frontend/packages/swarm-ui/src/ui/panel/Panel.tsx b/frontend/packages/swarm-ui/src/ui/panel/Panel.tsx deleted file mode 100644 index de8f88db..00000000 --- a/frontend/packages/swarm-ui/src/ui/panel/Panel.tsx +++ /dev/null @@ -1,15 +0,0 @@ -// — the one generic container primitive every route needs: a -// bordered surface with an optional title, no other opinions. Not a -// card-with-actions/footer/whatever kit — those get added the first -// time a real page actually needs one, not speculatively ahead of it. -import type { ComponentChildren } from 'preact'; -import './Panel.css'; - -export function Panel({ title, children }: { title?: string; children: ComponentChildren }) { - return ( -
- {title ?

{title}

: null} -
{children}
-
- ); -} diff --git a/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.css b/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.css deleted file mode 100644 index c6908552..00000000 --- a/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.css +++ /dev/null @@ -1,21 +0,0 @@ -.ui-chip { - display: inline-block; - padding: 0.15em 0.6em; - border-radius: 1em; - font-size: 0.85em; - line-height: 1.4; - background: var(--purple-dim); - color: var(--fg); -} -.ui-chip-neutral { - color: var(--muted); -} -.ui-chip-positive { - color: var(--green); -} -.ui-chip-warning { - color: var(--amber); -} -.ui-chip-negative { - color: var(--red); -} diff --git a/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.tsx b/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.tsx deleted file mode 100644 index 354c9459..00000000 --- a/frontend/packages/swarm-ui/src/ui/status-chip/StatusChip.tsx +++ /dev/null @@ -1,13 +0,0 @@ -// — a small labelled state indicator. Generic over -// `tone` rather than a fixed status vocabulary (`online`/`offline`/…) -// because the first real caller (the hive roster) starts with a -// single static "configured" tone and grows real online/stale/offline -// states once a status rollup lands server-side — same component, -// richer data later, no rebuild. -import './StatusChip.css'; - -export type ChipTone = 'neutral' | 'positive' | 'warning' | 'negative'; - -export function StatusChip({ tone = 'neutral', label }: { tone?: ChipTone; label: string }) { - return {label}; -} diff --git a/frontend/packages/swarm-ui/src/ui/table/Table.css b/frontend/packages/swarm-ui/src/ui/table/Table.css deleted file mode 100644 index f990dae6..00000000 --- a/frontend/packages/swarm-ui/src/ui/table/Table.css +++ /dev/null @@ -1,18 +0,0 @@ -.ui-table { - width: 100%; - border-collapse: collapse; -} -.ui-table th { - text-align: left; - font-weight: 600; - color: var(--muted); - padding: 0.5em 0.75em; - border-bottom: 1px solid var(--border); -} -.ui-table td { - padding: 0.5em 0.75em; - border-bottom: 1px solid var(--border); -} -.ui-table tr:last-child td { - border-bottom: none; -} diff --git a/frontend/packages/swarm-ui/src/ui/table/Table.tsx b/frontend/packages/swarm-ui/src/ui/table/Table.tsx deleted file mode 100644 index 3e852063..00000000 --- a/frontend/packages/swarm-ui/src/ui/table/Table.tsx +++ /dev/null @@ -1,44 +0,0 @@ -// — a generic column-defined table, the shape the hive roster -// (name / domain / status chip, one row per hive) needs. Columns own -// their own cell rendering rather than this component knowing about -// any particular row shape, so it stays reusable for the swarm-wide -// agent roster later without a rewrite. -import type { ComponentChildren } from 'preact'; -import './Table.css'; - -export interface TableColumn { - key: string; - header: string; - render: (row: T) => ComponentChildren; -} - -export function Table({ - columns, - rows, - rowKey, -}: { - columns: TableColumn[]; - rows: T[]; - rowKey: (row: T) => string; -}) { - return ( -
- - - {columns.map((c) => ( - - ))} - - - - {rows.map((row) => ( - - {columns.map((c) => ( - - ))} - - ))} - -
{c.header}
{c.render(row)}
- ); -}