Context
Hosted views use plain-text loaders ("Loading namespaces…" in NamespacesSimplePage, apps/web/src/main.tsx:5938; "Loading directory…" in ShowcasePage, main.tsx:2110) and ad-hoc red error text, with no shared skeleton/empty/error components. Styling is a single ~184KB apps/web/src/styles.css (--cm-* tokens, no Tailwind/shadcn), and mobile/responsive has not been audited. FailureExplainer already exists (used at main.tsx:2115) but isn't a reusable card.
Goal / user story
As a user on any device, I see polished skeletons while loading, helpful empty states with a next-step CTA, and recoverable error cards with Retry — on a layout that works down to phone width — instead of raw text that shifts or dead-ends.
Acceptance criteria
Implementation notes
- Add components under
apps/web/src/components/ (e.g. Skeleton.tsx, EmptyState.tsx, ErrorCard.tsx) plus tokens in styles.css; replace the scattered subEmpty plain-text usages.
- Wire Retry handlers to existing refresh functions; keep the light-app / dark-graph brand split intact.
- Mobile: make
AppShell nav collapsible; pair with the constellation mobile work.
- Parts of this (EmptyState/ErrorCard extraction) are good-first-issue sized.
Sui Overflow angle
The Harbor bucket handshake (RESERVE→SIGN→FINALIZE plus the ~3s mirror_missing_grant window) and SEAL decrypt are inherently async with retry-able failures. This exact skeleton + structured-error system is what lets the demo show "creating on-chain bucket…" and graceful retry states instead of raw errors during the Sui-native storage flow.
Dependencies
Standalone and shippable. Enhances the routed namespace console issue and the onboarding-flow issue.
Part of the ContextMEM roadmap (#4) • Sui Overflow build.
Context
Hosted views use plain-text loaders ("Loading namespaces…" in
NamespacesSimplePage,apps/web/src/main.tsx:5938; "Loading directory…" inShowcasePage,main.tsx:2110) and ad-hoc red error text, with no shared skeleton/empty/error components. Styling is a single ~184KBapps/web/src/styles.css(--cm-*tokens, no Tailwind/shadcn), and mobile/responsive has not been audited.FailureExplaineralready exists (used atmain.tsx:2115) but isn't a reusable card.Goal / user story
As a user on any device, I see polished skeletons while loading, helpful empty states with a next-step CTA, and recoverable error cards with Retry — on a layout that works down to phone width — instead of raw text that shifts or dead-ends.
Acceptance criteria
<Skeleton>(tokenized shimmer using--cm-*) is applied to hosted extraction, facts/graph, chat "thinking", the namespaces list, and the share page.<EmptyState>component (icon + title + CTA) replaces inline strings like "No namespaces yet" (main.tsx:5938).<ErrorCard>with a Retry action replaces raw red error text (e.g.NamespacesAppPageerroratmain.tsx:5967,ShowcasePageatmain.tsx:2112);FailureExplaineris folded into it.NamespacesAppPage.refresh(),main.tsx:5969) without a full reload.appNavItems,main.tsx:1614), the Build console, and the constellation are usable at 360–768px with no horizontal scroll.--cm-*;namespace-memory.cssalready drifts — don't add to it).Implementation notes
apps/web/src/components/(e.g.Skeleton.tsx,EmptyState.tsx,ErrorCard.tsx) plus tokens instyles.css; replace the scatteredsubEmptyplain-text usages.AppShellnav collapsible; pair with the constellation mobile work.Sui Overflow angle
The Harbor bucket handshake (RESERVE→SIGN→FINALIZE plus the ~3s
mirror_missing_grantwindow) and SEAL decrypt are inherently async with retry-able failures. This exact skeleton + structured-error system is what lets the demo show "creating on-chain bucket…" and graceful retry states instead of raw errors during the Sui-native storage flow.Dependencies
Standalone and shippable. Enhances the routed namespace console issue and the onboarding-flow issue.
Part of the ContextMEM roadmap (#4) • Sui Overflow build.