diff --git a/app/frontend/public/containr.svg b/app/frontend/public/containr.svg index e872de2..256a12a 100644 --- a/app/frontend/public/containr.svg +++ b/app/frontend/public/containr.svg @@ -1,12 +1,12 @@ - - + + - + diff --git a/app/frontend/src/app/App.smoke.test.tsx b/app/frontend/src/app/App.smoke.test.tsx index 7c0a9db..2af983d 100644 --- a/app/frontend/src/app/App.smoke.test.tsx +++ b/app/frontend/src/app/App.smoke.test.tsx @@ -30,9 +30,9 @@ describe('App smoke routes', () => { it('renders projects page in demo mode', async () => { renderApp('/projects?demo=1'); - expect(await screen.findByRole('heading', { name: /^projects$/i })).toBeInTheDocument(); - expect(screen.getByText(/demo mode active/i)).toBeInTheDocument(); - expect(screen.getByText(/deploy, manage, and monitor containerized services/i)).toBeInTheDocument(); + expect(await screen.findByRole('heading', { name: /^projects\s*_?$/i })).toBeInTheDocument(); + expect(screen.getByText(/recent deployments/i)).toBeInTheDocument(); + expect(screen.getAllByText(/core-services/i).length).toBeGreaterThan(0); }); it('renders builds page in demo mode', async () => { diff --git a/app/frontend/src/app/layout/PlatformShell.tsx b/app/frontend/src/app/layout/PlatformShell.tsx index 40c4f60..e03ecd6 100644 --- a/app/frontend/src/app/layout/PlatformShell.tsx +++ b/app/frontend/src/app/layout/PlatformShell.tsx @@ -130,26 +130,18 @@ export function PlatformShell() {
- -
- -
- Containr + + containr -
- - +
+ {isDemoMode ? 'demo' : 'nominal'} + node local
-
+
+ + +
+ +
+ env:production
-
- {/* Main Content */} -
- {/* Toolbar */} -
-
- - setSearch(e.target.value)} - placeholder="Search projects by name or description..." - className="w-full h-11 pl-11 pr-4 rounded-[var(--radius-md)] border border-[var(--border-subtle)] bg-[var(--surface-card)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:border-[var(--accent-primary)] focus:ring-1 focus:ring-[var(--accent-primary)] transition-all" - /> -
- -
- - {/* Demo Mode Banner */} - {isDemoMode && ( -
-
- - Demo mode active — using sample data for preview + {/* Host stat row */} +
+
+
HOST.CPU
+
{cpuPct ?? '—'}%
+ {isDemoMode ? ( +
+ {[28, 44, 36, 58, 42, 66, 50, 34, 56, 40, 30, 20].map((h, i) => ( + + ))} +
+ ) : null} +
+ {isDemoMode || host ? ( + <>healthy · {host?.cpu.cores ?? 16} cores + ) : 'no telemetry'}
- )} +
+
HOST.MEM
+
{memPct ?? '—'}%
+
85 ? 'r' : 'y'} style={{ width: `${memPct ?? 0}%` }} />
+
{isDemoMode ? '9.8G / 13G' : host ? `${fmtGB(host.memory.used)} / ${fmtGB(host.memory.total)}` : 'no telemetry'}
+
+
+
HOST.DISK
+
{diskPct ?? '—'}%
+
+
{isDemoMode ? '338G of 465G · high' : host ? `${fmtGB(host.storage.used)} of ${fmtGB(host.storage.total)}` : 'no telemetry'}
+
+
+
DEPLOYS
+
{isDemoMode ? 18 : deployCount}
+
+
{isDemoMode ? '17 ok' : `${builds.filter((b) => (b.status ?? '').toLowerCase() !== 'failed').length} recent`}
+
+
+ + {/* Projects grid */} +

PROJECTS {filteredProjects.length} records

- {/* Loading State */} {!isDemoMode && projectsQuery.isLoading && ( -
+
{Array.from({ length: 6 }).map((_, i) => ( -
+
))}
)} - {/* Error State */} {!isDemoMode && projectsQuery.isError && (
-
+

Failed to load projects

@@ -307,34 +303,49 @@ export function ProjectsPage() {
)} - {/* Empty State */} - {((isDemoMode && filteredProjects.length === 0) || (!isDemoMode && !projectsQuery.isLoading && !projectsQuery.isError && filteredProjects.length === 0)) && ( + {filteredProjects.length === 0 && !projectsQuery.isLoading && !projectsQuery.isError ? (
-
+

No projects yet

-

+

Create your first project to start deploying services with visual topology management.

-
- )} + ) : null} - {/* Project Grid */} - {((isDemoMode && filteredProjects.length > 0) || (!isDemoMode && !projectsQuery.isLoading && !projectsQuery.isError && filteredProjects.length > 0)) && ( -
+ {filteredProjects.length > 0 && ( +
{filteredProjects.map((project) => ( ))}
)} + + {/* Deploy feed */} +

RECENT DEPLOYMENTS latest

+
+ + + + + + {feed.length === 0 ? ( + + ) : feed.map((d) => ( + + + + + + ))} + +
SERVICESTATUSWHEN
no deployments yet
{d.name}{d.project ? {d.project} : null}{d.status}{d.when}
+
{/* Create Modal */} @@ -349,18 +360,18 @@ export function ProjectsPage() {
-
-