Skip to content

Add skeleton loading states and center full-pane empty states - #522

Merged
juliarvalenti merged 2 commits into
mainfrom
claude/loading-empty-states-3tsdrh
Aug 14, 2026
Merged

Add skeleton loading states and center full-pane empty states#522
juliarvalenti merged 2 commits into
mainfrom
claude/loading-empty-states-3tsdrh

Conversation

@juliarvalenti

Copy link
Copy Markdown
Contributor

Summary

Adds a consistent loading treatment across the frontend and fixes the empty-state alignment inconsistency between the Channel and Negotiate tabs.

The command center had no loading state at all (a blank page, or a flash of "No rooms yet", until the first fetch resolved), and several panels used bare "loading…" / "Loading…" strings. Full-pane empty states were also inconsistent: Channel rendered its empty state at the top of the scroll area while Negotiate centered it vertically.

Changes

  • New shared Skeleton primitive (mycelium-frontend/src/components/ui/skeleton.tsx): a pulsing block on the surface token, composed into row/card shapes at each call site.
  • Command center: renders a grid of room-card skeletons (monogram, title lines, stat lines) while rooms load, instead of nothing.
  • Channel tab (event-stream.tsx): new historyLoaded flag; shows chat-row skeletons while message history loads, so "No messages yet" can no longer flash before the fetch resolves.
  • Episodes rail: "loading…" text replaced with episode-row skeletons.
  • Memory panel: new loaded flag with tree-row skeletons, so "No memories yet" no longer flashes on first load.
  • Members panel: member-row skeletons while the roster loads (previously blank).
  • Episode detail drawer: "Loading chain…" text replaced with metadata-grid skeletons.
  • SLIM view: "Loading…" text replaced with stat-line skeletons.
  • Empty-state alignment: Channel, Negotiate, and L9 empty states all center vertically now via EmptyState className="h-full" (the component already justifies center); Negotiate's ad-hoc wrapper div removed. Rail/list empty states intentionally stay in flow. Convention documented on EmptyState.

Testing

  • Frontend type check passes (pnpm lint / tsc --noEmit)
  • Frontend unit tests pass (pnpm test, 12/12)
  • Production build passes (pnpm build)

Backend checkboxes from the template are N/A — this PR touches only mycelium-frontend.

Related Issues

None.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DHE2rKVQJvz7AE4qvWBZYQ


Generated by Claude Code

claude and others added 2 commits August 14, 2026 20:46
The command center, channel feed, episodes rail, memory panel, and
members panel either rendered nothing or a bare "loading…" string while
their first fetch was in flight, and the channel tab could flash "No
messages yet" before history arrived. Add a shared Skeleton primitive
(ui/skeleton.tsx) and give each surface a placeholder shaped like its
loaded layout.

Also make full-pane empty states consistent: Channel sat at the top of
its scroll area while Negotiate centered vertically. All three full-pane
states (Channel, Negotiate, L9) now center via EmptyState h-full;
rail/list empty states stay in flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DHE2rKVQJvz7AE4qvWBZYQ
Seed the sidebar's room list from a module-level cache so navigation
remounts paint the last-known rooms instantly instead of flashing the
count to 0 while the refetch is in flight.

Top-align full-pane empty states (Channel, Negotiate, L9) so the copy
doesn't jump vertically when switching between panes of differing height.
@juliarvalenti
juliarvalenti merged commit b43edc6 into main Aug 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants