'use client' import { useCallback, useEffect, useState } from 'react' import { Panel } from '@/components/cluster/Panel' import { DEFAULT_KINDS, WAVES, apps, appsInWave, resourceKinds, type App } from '@/lib/clusterMock' const TOTAL_RESOURCES = apps.reduce((n, a) => n + a.resources, 0) /** Resource count as discrete cells, capped so a 68-resource app stays readable. */ function CountBar({ n }: { n: number }) { const cells = Math.min(n, 24) return (
{Array.from({ length: cells }, (_, i) => ( ))} {n > 24 && +{n - 24}}
) } function AppCard({ app, state, active, onSelect, }: { app: App state: 'idle' | 'syncing' | 'done' active: boolean onSelect: () => void }) { const degraded = app.health === 'degraded' const drifted = app.sync === 'outofsync' const border = active ? 'border-lamp' : state === 'syncing' ? 'border-lamp/70' : degraded ? 'border-rose/50' : drifted ? 'border-lamp/40' : 'border-wire' return ( ) } export default function DeliveryPage() { const [selected, setSelected] = useState('prometheus') const [front, setFront] = useState(null) const replay = useCallback(() => setFront(0), []) useEffect(() => { if (front === null) return if (front > 8) { const done = setTimeout(() => setFront(null), 700) return () => clearTimeout(done) } const next = setTimeout(() => setFront((w) => (w === null ? null : w + 1)), 520) return () => clearTimeout(next) }, [front]) const selectedApp = apps.find((a) => a.name === selected) ?? null const kinds = selectedApp ? (resourceKinds[selectedApp.name] ?? DEFAULT_KINDS) : [] return (

Surface E — Delivery

Nothing starts until the thing it needs is already running.

{apps.length} applications, {TOTAL_RESOURCES} resources, applied in nine ordered waves. Certificates before issuers, issuers before ingress, storage before the databases that sit on it. The order is the design.

{WAVES.map((wave) => { const inWave = appsInWave(wave) const state = front === null ? 'idle' : front === wave ? 'syncing' : front > wave ? 'done' : 'idle' return (
{wave} {inWave.length || '—'}
{inWave.length === 0 ? (

unused — waves are sparse by design, not sequential

) : (
{inWave.map((app) => ( setSelected(app.name)} /> ))}
)}
) })}
{selectedApp ? (
sync
{selectedApp.sync}
health
{selectedApp.health}

Resources by kind

    {kinds.map((k) => (
  • {k.kind} {k.count} {!k.named && ( count only )}
  • ))}

Secrets appear as counts. Names, source repositories, and condition messages are never sent to the browser.

) : (

Select an application to inspect its resources.

)}
) }