Context
Part of epic #6504's chat track. This is the functional chat UI — message list, composer, streaming response renderer, and typing indicator — mounted inside the chat rail shell (a separate, already-filed child issue of this same epic). The epic's own explicit dependency: this issue is BLOCKED on the ui-kit state-views port child issue landing first, since the message list must consume the ported LoadingState/EmptyState/ErrorState from @loopover/ui-kit, not invent its own async-state handling. A child issue that hand-rolls its own loading/error/empty JSX instead of importing the ported primitive does not satisfy the epic's design.
Requirements
- Build the message list (rendering user/assistant turns), composer (text input + Enter-to-submit), streaming response renderer, and typing indicator.
- The message list's async states (loading history, error fetching, empty conversation) MUST use the ported
LoadingState/EmptyState/ErrorState/StateBoundary from @loopover/ui-kit — do not hand-roll a second implementation.
- No backend grounding or action-dispatch in this issue — those are separate child issues. This issue can be built/tested against a mocked or stubbed response stream.
Deliverables
Test Coverage Requirements
99%+ Codecov patch coverage on every changed line and branch, plus a regression test for the new/changed behavior (note: apps/** UI code may fall outside the strict Codecov patch gate — check coverage.include — but a before/after screenshot table per this repo's UI-PR convention is still required for any visual change).
Expected Outcome
A functional chat UI exists inside the rail shell, ready to be wired to the real backend-grounding child issue.
Links & Resources
Epic: #6504. Blocked by the "Port LoadingState/EmptyState/ErrorState/StateBoundary/Spinner into @loopover/ui-kit proper" issue in this same epic.
Context
Part of epic #6504's chat track. This is the functional chat UI — message list, composer, streaming response renderer, and typing indicator — mounted inside the chat rail shell (a separate, already-filed child issue of this same epic). The epic's own explicit dependency: this issue is BLOCKED on the ui-kit state-views port child issue landing first, since the message list must consume the ported
LoadingState/EmptyState/ErrorStatefrom@loopover/ui-kit, not invent its own async-state handling. A child issue that hand-rolls its own loading/error/empty JSX instead of importing the ported primitive does not satisfy the epic's design.Requirements
LoadingState/EmptyState/ErrorState/StateBoundaryfrom@loopover/ui-kit— do not hand-roll a second implementation.Deliverables
@loopover/ui-kitprimitivesTest Coverage Requirements
99%+ Codecov patch coverage on every changed line and branch, plus a regression test for the new/changed behavior (note: apps/** UI code may fall outside the strict Codecov patch gate — check coverage.include — but a before/after screenshot table per this repo's UI-PR convention is still required for any visual change).
Expected Outcome
A functional chat UI exists inside the rail shell, ready to be wired to the real backend-grounding child issue.
Links & Resources
Epic: #6504. Blocked by the "Port LoadingState/EmptyState/ErrorState/StateBoundary/Spinner into @loopover/ui-kit proper" issue in this same epic.