From 47106902a3c62101b460bd43ee2e0ba5d3e79c7c Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Mon, 13 Jul 2026 18:03:22 +0900 Subject: [PATCH 1/3] [#233] Unified workspace left rail: one host-tagged room list, 1/3-2/3 split MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge the "Your rooms" (hosted) and "Rooms I'm in" (joined) sections into ONE top-rail list: hosted rooms first, each with a compact `host` tag, then joined rooms by most-recent activity. Joined affordances move with the list — reachability, #210 archive/delete, #217 remember form — nothing removed. The existing ~34%/66% flex rail (own scroll per region) is preserved; the merged list caps at 6 and the channel nav at 8 behind their own view-more controls. Channel nav now renders room.channels ({id,name,type}) when the control-plane payload provides them, keeping the #general fallback. Token-free throughout; design-kit tokens only; no new fetches or dependencies. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/browser/shell.css | 45 ++--- src/browser/shell.html | 22 +-- src/browser/shell.js | 314 +++++++++++++++++++--------------- test/browser-platform.test.ts | 219 +++++++++++++++++++++++- 4 files changed, 432 insertions(+), 168 deletions(-) diff --git a/src/browser/shell.css b/src/browser/shell.css index 6d675b2..ce5fe3a 100644 --- a/src/browser/shell.css +++ b/src/browser/shell.css @@ -287,9 +287,9 @@ body { } /* Rows collapsed behind the overflow control (the whole list item is hidden so - no empty gap remains). */ + no empty gap remains). The merged room list (#233) holds both hosted `.room-row` + and joined `.joined-row` items, so one rule covers both. */ .room-list > li.is-collapsed, -.joined-list > li.is-collapsed, .channel-nav > li.is-collapsed { display: none; } @@ -420,6 +420,8 @@ body { color: var(--danger); } +/* Merged workspace room list (#233): hosted `.room-row` items first, then joined + `.joined-row` items, in one scroll region. Tokens only. */ .room-list { list-style: none; margin: 0; @@ -428,28 +430,14 @@ body { gap: 8px; } -/* "Rooms I'm in" (#178): device-local joined-room list. Tokens only. */ -.joined-section { - margin-top: 20px; - padding-top: 16px; +/* Device-local joined-room tools (#178/#217): the remember form + honest empty + note, below the merged list. */ +.rail-tools { + margin-top: 16px; + padding-top: 12px; border-top: 1px solid var(--line); } -.joined-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; -} - -.joined-list { - list-style: none; - margin: 0 0 8px; - padding: 0; - display: grid; - gap: 6px; -} - .joined-empty, .joined-note { margin: 0 0 8px; @@ -1331,6 +1319,21 @@ body { font-size: 10px; } +/* Compact host tag (#233): marks owner-operated rooms in the merged list. */ +.room-tag { + flex: 0 0 auto; + padding: 1px 7px; + border: 1px solid var(--accent-line); + border-radius: var(--r-pill); + background: var(--accent-weak); + color: var(--accent-text); + font-size: 9.5px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + white-space: nowrap; +} + .room-sub { color: var(--muted); font-size: 11.5px; diff --git a/src/browser/shell.html b/src/browser/shell.html index b444372..bdc4834 100644 --- a/src/browser/shell.html +++ b/src/browser/shell.html @@ -71,24 +71,24 @@

Bring people and their agents into one room

+ form and honest empty note live in `.joined-section` below the list. -->
Rooms
@@ -87,8 +87,9 @@

Bring people and their agents into one room

-
+ note for the joined entries that render inside the merged list above. + Reuses the existing `.joined-section` styling. --> +

No joined rooms tracked on this device yet. Paste an invite link to remember one (metadata only — the token is never stored). @@ -100,7 +101,7 @@

Bring people and their agents into one room

Same-device only — never synced or copied to any server.

-
+