From 85db68636be98291e9027c5a0366452b9d7635d4 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 29 Apr 2026 17:32:41 -0700 Subject: [PATCH] ui(infrastructure): strip explainer prose from empty + detail panes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Empty Infrastructure tabs were a wall of teaching text — every empty category showed a dashed-border explainer button in the rail, the right pane carried multi-paragraph explainer prose for every category, and the LLM/Stripe/Storage/Secrets details all included instructional prose for things the user hasn't done yet. On a brand-new project the whole tab was 90% explainer. Removed (everywhere): - Per-category dashed empty-state buttons under each category header. Empty categories now show just the header + "0", which is enough — clicking the header still opens the details pane if the user wants it. - Right-pane Overview lead paragraph ("Infrastructure here is auto-discovered…"). - CategoryDetail lead paragraph (def.label + def.blurb) and the "Examples" chip row. - CategoryDetail "Nothing detected yet — set a matching env var…" info box. Replaced with a one-word "None yet." line. - LLM CategoryDetail BYOK explainer box. - DatabaseDetail "Expand this database in the left rail…" hint. - DatabaseDetail "Set on any app or service…" prose. Renamed the section "How apps connect" → "Connection env" and kept just the env-var snippet. - StorageDetail unprovisioned-state explainer paragraph + "you can also provision it now" info box. Replaced with a one-word "No bucket provisioned yet." empty. - StorageDetail "Vibn-bundled storage is GCS exposed via…" prose. Kept the env snippet under a renamed "Connection env" section. - ProviderDetail Stripe webhook hint box. - ProviderDetail bottom "Values aren't shown here…" note. - SecretsDetail "Values are never read on this surface…" note. Kept (functional, non-prose): - All KvRows and code snippets. - Stripe "Connect Stripe (coming soon)" CTA. - Storage "View workspace bucket" CTA. - Provider dashboard external-link buttons. - Edit / Rotate icon buttons on secrets (still disabled, tooltipped). Cleaned up the now-unused Info icon import. The category def's blurb / examples / dashboards fields stay in the source — they're still useful as tooltip / search seed material for a follow-up iteration that puts the teaching content somewhere less in-your-face (like a help drawer). Made-with: Cursor --- .../(home)/infrastructure/page.tsx | 115 ++---------------- 1 file changed, 10 insertions(+), 105 deletions(-) diff --git a/app/[workspace]/project/[projectId]/(home)/infrastructure/page.tsx b/app/[workspace]/project/[projectId]/(home)/infrastructure/page.tsx index 310fb01b..5d1f283a 100644 --- a/app/[workspace]/project/[projectId]/(home)/infrastructure/page.tsx +++ b/app/[workspace]/project/[projectId]/(home)/infrastructure/page.tsx @@ -5,7 +5,7 @@ import { useParams } from "next/navigation"; import { Loader2, AlertCircle, Database, KeyRound, CircleDot, ShieldCheck, Mail, CreditCard, Sparkles, HardDrive, - ExternalLink, Info, Pencil, RotateCw, + ExternalLink, Pencil, RotateCw, ChevronDown, ChevronRight, } from "lucide-react"; import { useAnatomy, type Anatomy } from "@/components/project/use-anatomy"; @@ -219,7 +219,7 @@ function CategoryRail({ return (
onSelect({ kind: "category", category: def.key })} /> - {present ? ( + {present && (
- ) : ( - )}
); @@ -251,11 +247,7 @@ function CategoryRail({ return (
onSelect({ kind: "category", category: def.key })} /> - {dbs.length === 0 ? ( - - ) : ( + {dbs.length > 0 && (
{dbs.map(db => { const open = expandedDbs.has(db.uuid); @@ -320,11 +312,7 @@ function CategoryRail({ return (
onSelect({ kind: "category", category: def.key })} /> - {items.length === 0 ? ( - - ) : ( + {items.length > 0 && (
{items.map(item => renderRailItem(def.key, item, selection, onSelect))}
@@ -447,13 +435,6 @@ function Overview({ return (
- - Infrastructure here is auto-discovered from your Coolify - project + the env vars across every app and service in it. Click any - tile on the left for live details. Click a category header (or its - empty hint) to learn what lives there. - -
); - } else if (def.key === "llm") { - actionRow = ( -
- - BYOK (Bring Your Own Key) lets you use your own model provider keys - instead of platform defaults — coming soon. Today, set keys via env vars - and they'll appear here. -
- ); } else if (def.key === "storage") { actionRow = (