From 045b1d758e986fa860227e30c2f8a18fb3d8cc34 Mon Sep 17 00:00:00 2001 From: AAA <35992542+TNTcraftHIM@users.noreply.github.com> Date: Sat, 29 Aug 2026 03:22:30 +0800 Subject: [PATCH] feat(ui): integrate living-room UI (#321) --- docs/product/presentation-lifecycle.md | 27 + index.html | 10 +- package-lock.json | 10 - package.json | 1 - src/client/App.tsx | 198 +- src/client/components/AppHeader.tsx | 16 - .../components/ConnectionDetailsToggle.tsx | 28 - src/client/components/RoomCode.tsx | 154 - src/client/components/RoomCodeEntry.tsx | 74 - src/client/components/StageEntryActions.tsx | 51 - src/client/components/StatsGrid.tsx | 279 -- src/client/components/StatusBadge.tsx | 79 - src/client/components/TopologyView.tsx | 58 - src/client/components/connection-details.ts | 7 +- src/client/components/living/Comic.tsx | 1296 +++++++++ src/client/components/living/ComicTooltip.tsx | 246 ++ src/client/components/living/Couch.tsx | 149 + src/client/components/living/Header.tsx | 94 + src/client/components/living/Metrics.tsx | 257 ++ src/client/components/living/PawnDetail.tsx | 139 + src/client/components/living/RoomChip.tsx | 153 + src/client/components/living/RouteTree.tsx | 321 +++ src/client/components/living/Stage.tsx | 115 + src/client/components/living/hints/index.tsx | 128 + src/client/components/living/hints/set1.tsx | 294 ++ src/client/components/living/hints/set2.tsx | 537 ++++ src/client/components/living/hints/set3.tsx | 416 +++ src/client/components/living/hints/set4.tsx | 441 +++ src/client/components/living/primitives.tsx | 306 ++ src/client/components/status-badge-model.ts | 8 +- src/client/lib/api.ts | 45 +- src/client/lib/display-name.ts | 12 +- src/client/main.tsx | 3 + src/client/media/host-sfu-route.ts | 17 +- src/client/media/quality.ts | 69 +- src/client/media/viewer-presentation.ts | 86 +- src/client/pages/HostPage.tsx | 2252 +++++++++------ src/client/pages/JoinPage.tsx | 102 +- src/client/pages/ViewerPage.tsx | 1050 ++++--- src/client/pages/host-page-notices.ts | 71 +- src/client/sfu/publisher.ts | 9 +- src/client/styles.css | 2549 +++++++---------- src/client/ui/copy.ts | 842 ++++++ src/client/ui/icons.tsx | 109 + src/client/ui/theme.ts | 56 + src/client/webrtc/host-peer.ts | 27 +- src/client/webrtc/viewer-peer.ts | 9 +- tests/connection-details-toggle.test.ts | 29 - tests/connection-details.test.ts | 8 +- tests/copy.test.ts | 49 + tests/host-page-notice.test.ts | 3 + tests/living-components.test.ts | 55 + ...tats-grid.test.ts => metric-cells.test.ts} | 99 +- tests/route-tree.test.ts | 124 + tests/stage-entry-actions.test.ts | 73 - tests/status-badge.test.ts | 16 +- tests/topology-view.test.ts | 56 - tests/viewer-presentation.test.ts | 24 +- 58 files changed, 9758 insertions(+), 3978 deletions(-) delete mode 100644 src/client/components/AppHeader.tsx delete mode 100644 src/client/components/ConnectionDetailsToggle.tsx delete mode 100644 src/client/components/RoomCode.tsx delete mode 100644 src/client/components/RoomCodeEntry.tsx delete mode 100644 src/client/components/StageEntryActions.tsx delete mode 100644 src/client/components/StatsGrid.tsx delete mode 100644 src/client/components/StatusBadge.tsx delete mode 100644 src/client/components/TopologyView.tsx create mode 100644 src/client/components/living/Comic.tsx create mode 100644 src/client/components/living/ComicTooltip.tsx create mode 100644 src/client/components/living/Couch.tsx create mode 100644 src/client/components/living/Header.tsx create mode 100644 src/client/components/living/Metrics.tsx create mode 100644 src/client/components/living/PawnDetail.tsx create mode 100644 src/client/components/living/RoomChip.tsx create mode 100644 src/client/components/living/RouteTree.tsx create mode 100644 src/client/components/living/Stage.tsx create mode 100644 src/client/components/living/hints/index.tsx create mode 100644 src/client/components/living/hints/set1.tsx create mode 100644 src/client/components/living/hints/set2.tsx create mode 100644 src/client/components/living/hints/set3.tsx create mode 100644 src/client/components/living/hints/set4.tsx create mode 100644 src/client/components/living/primitives.tsx create mode 100644 src/client/ui/copy.ts create mode 100644 src/client/ui/icons.tsx create mode 100644 src/client/ui/theme.ts delete mode 100644 tests/connection-details-toggle.test.ts create mode 100644 tests/copy.test.ts create mode 100644 tests/living-components.test.ts rename tests/{stats-grid.test.ts => metric-cells.test.ts} (68%) create mode 100644 tests/route-tree.test.ts delete mode 100644 tests/stage-entry-actions.test.ts delete mode 100644 tests/topology-view.test.ts diff --git a/docs/product/presentation-lifecycle.md b/docs/product/presentation-lifecycle.md index c808e3c..ac137f0 100644 --- a/docs/product/presentation-lifecycle.md +++ b/docs/product/presentation-lifecycle.md @@ -17,6 +17,33 @@ room identity, current state, roster, and one manual media-reconnect action. Controls and text must remain usable without overlap or horizontal overflow on desktop and mobile viewports. +## Visual Language + +The interface presents one small shared living room rather than an operations +dashboard. The television is the media stage, the couch and pawns make presence +spatial, the shelf separates watching from controls, and the room display keeps +the four-digit code prominent. This metaphor must clarify the same product +state on Host and Viewer pages; decoration never creates a second state model. + +Chinese, English, and pure-visual modes are three expressions of the same typed +state and command catalog. A fresh Browser starts in visual mode and persists +an explicit later choice. Text modes use concise copy. Visual mode uses one +consistent stroke language for single concepts, small panel comics for causes +and sequences, and literal scene objects for people, rooms, and media. Glyphs do +not form sentences. Universal digits, transport symbols, URLs, and measured +values remain literal when users need the data. + +Motion explains entry, transition, progress, and control feedback. Stable state +stays still; ambient animation and motion added only for ornament are outside +the language. All meaning remains available with reduced motion. Functional +controls remain native buttons or inputs with localized accessible names, and +hover, keyboard focus, and touch receive equivalent guidance. + +The visual hierarchy, interaction ownership, and information order remain the +same across themes and viewport sizes. Responsive layout may reflow or scroll a +bounded visualization, but it must not hide a primary action, truncate an +essential value, overlap controls, or change product semantics. + ## Playback Ownership One native `