feat(miner-ui): chat message list, bubble, and typing indicator components - #6563
Conversation
…nents First presentational pieces of the miner-ui chat rail (JSONbored#6515), delivered as three standalone, backend-agnostic components driven entirely by fixture data — no network/WebSocket, no live source (that arrives in a later issue). - components/chat/message-bubble.tsx — MessageBubble: Avatar (ui-kit) with an initials fallback, a role-colored bubble built only from existing theme tokens (user=primary, assistant=muted, system=secondary), and a <time>. - components/chat/typing-indicator.tsx — TypingIndicator: an animated dot-pulse with a typing-specific aria-label (distinct from ui-kit's loading Spinner); renders nothing when not composing. - components/chat/message-list.tsx — MessageList: ui-kit ScrollArea viewport wrapping ui-kit StateBoundary for its own loading/empty/error states, plus the TypingIndicator when composing. - components/chat/fixtures.ts — shared ChatMessage shape + empty/single/ multi-turn/long-content sample arrays. Component tests cover every branch: MessageList's loading/empty/error/populated states, MessageBubble's per-role color + avatar-image-vs-fallback + timestamp, and TypingIndicator's composing/hidden states + accessible name. No new dependency; theme.css untouched. Local gate: @loopover/ui-miner typecheck + 162 tests + eslint (0 errors) green. Closes JSONbored#6515
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
1 similar comment
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Tip ✅ LoopOver review result - approve/merge recommendedReview updated: 2026-07-16 14:33:43 UTC
Review summary Nits — 5 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|

Summary
First presentational pieces of the miner-ui chat rail (#6515) — three standalone, backend-agnostic components under
apps/loopover-miner-ui/src/components/chat/, driven entirely by fixture data (no network/WebSocket/live source; that's a later, separately-scoped issue).Components (no new dependency;
theme.cssuntouched)message-bubble.tsx—MessageBubble:Avatar/AvatarImage/AvatarFallbackfrom@loopover/ui-kit/components/avatarwith an initials fallback; a role-colored bubble built only from existing theme tokens (user=primary, assistant=muted, system=secondary); a rendered<time>.typing-indicator.tsx—TypingIndicator: an animated three-dot pulse with a typing-specificaria-label(deliberately distinct from ui-kit's loading-onlySpinner); renders nothing whencomposingis false.message-list.tsx—MessageList: viewport viaScrollAreafrom@loopover/ui-kit/components/scroll-area(not a raw overflow div), wrappingStateBoundaryfrom@loopover/ui-kit/components/state-viewsfor its own loading/empty/error states, plus theTypingIndicatorwhen composing.fixtures.ts— sharedChatMessageshape +empty/single/multi-turn/long-contentsample arrays.Tests (every branch)
src/chat-message-components.test.tsx—MessageList's loading/empty/error/populatedStateBoundarybranches;MessageBubble's per-role color, avatar-image-vs-fallback, and timestamp;TypingIndicator's composing/hidden states + accessible name (asserts it says typing, not loading).apps/**is outside Codecov'scoverage.include(per repo CLAUDE.md) socodecov/patchwon't score these — verification is the branch tests. Local gate:@loopover/ui-minertypecheck + 162 tests + eslint (0 errors) green.Closes #6515