From d88a19617263b547d521e6012b51e793c7ee2b0e Mon Sep 17 00:00:00 2001 From: Rohit C Prasad Date: Fri, 21 Aug 2026 10:14:01 -0700 Subject: [PATCH] =?UTF-8?q?Right=20drawer:=20retire=20the=20More=20fold=20?= =?UTF-8?q?=E2=80=94=20all=20sections=20list=20flat,=20collapsed=20by=20de?= =?UTF-8?q?fault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- surfaces/gui/e2e/access-section.spec.ts | 3 -- surfaces/gui/e2e/board.spec.ts | 3 +- surfaces/gui/e2e/cloud-status-pending.spec.ts | 1 - surfaces/gui/e2e/files-explorer.spec.ts | 9 ++-- surfaces/gui/e2e/roots.spec.ts | 1 - surfaces/gui/e2e/slack-directory.spec.ts | 2 - surfaces/gui/e2e/sources-channels.spec.ts | 3 -- surfaces/gui/src/components/RightRail.tsx | 43 ++++++------------- 8 files changed, 17 insertions(+), 48 deletions(-) diff --git a/surfaces/gui/e2e/access-section.spec.ts b/surfaces/gui/e2e/access-section.spec.ts index ef95c5f9..522218f8 100644 --- a/surfaces/gui/e2e/access-section.spec.ts +++ b/surfaces/gui/e2e/access-section.spec.ts @@ -19,7 +19,6 @@ test("no topbar opener; the Access header IS the ambient glance; expanding edits // The trust surface is ambient once More is unfolded: the collapsed header always shows // the summary — and no nudge text ever renders at rest (§23's rule carried over). - await page.getByTestId("rail-more-toggle").click(); const section = page.getByTestId("access-section"); await expect(section.getByTestId("access-summary")).toHaveText("Browser, Slack +1 · 1 folder"); await expect(section.getByText(/recommended/i)).toHaveCount(0); @@ -45,7 +44,6 @@ test("+ Add a source: full catalog on focus, filter as you type → connect-in-c }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); await page.getByTestId("access-toggle").click(); // Focusing the empty input shows the FULL catalog (FB-012) — every available connector @@ -88,7 +86,6 @@ test("per-session mute round-trips; the summary follows", async ({ page }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); const section = page.getByTestId("access-section"); await section.getByTestId("access-toggle").click(); const body = page.getByRole("region", { name: "Session access" }); diff --git a/surfaces/gui/e2e/board.spec.ts b/surfaces/gui/e2e/board.spec.ts index 1aadfc60..257ed986 100644 --- a/surfaces/gui/e2e/board.spec.ts +++ b/surfaces/gui/e2e/board.spec.ts @@ -147,11 +147,10 @@ test("Add a note is a pure append — it lands in the timeline, state untouched" await expect(detail.getByRole("button", { name: "Mark done" })).toBeVisible(); }); -test("journal folds behind More; expanding lists cases once a board exists", async ({ page }) => { +test("journal section lists cases once a board exists", async ({ page }) => { await planTheWork(page); // Journal is not a primary section — it sits behind the quiet More row. await expect(page.getByTestId("rail-toggle-journal")).toHaveCount(0); - await page.getByTestId("rail-more-toggle").click(); await page.getByTestId("rail-toggle-journal").click(); const journal = page.getByTestId("journal-list"); await expect(journal).toBeVisible(); diff --git a/surfaces/gui/e2e/cloud-status-pending.spec.ts b/surfaces/gui/e2e/cloud-status-pending.spec.ts index f5298a8c..044fef37 100644 --- a/surfaces/gui/e2e/cloud-status-pending.spec.ts +++ b/surfaces/gui/e2e/cloud-status-pending.spec.ts @@ -9,7 +9,6 @@ import { test } from "./fixtures"; const openGmailPane = async (page: import("@playwright/test").Page) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); await page.getByTestId("access-add-source").click(); await page.getByTestId("access-add-gmail").click(); diff --git a/surfaces/gui/e2e/files-explorer.spec.ts b/surfaces/gui/e2e/files-explorer.spec.ts index f234ab8c..d56f92b4 100644 --- a/surfaces/gui/e2e/files-explorer.spec.ts +++ b/surfaces/gui/e2e/files-explorer.spec.ts @@ -1,6 +1,6 @@ -// UX-037: Files — an explorer over the session's roots behind the More fold. Each root -// opens in the artifact viewer (breadcrumb "Files"), whose folder listings click through -// to subfolders and files. Artifacts stays the curated scratch-only surface beside it. +// UX-037: Files — an explorer over the session's roots. Each root opens in the artifact +// viewer (breadcrumb "Files"), whose folder listings click through to subfolders and +// files. Artifacts stays the curated scratch-only surface beside it. import { expect } from "@playwright/test"; import { test } from "./fixtures"; @@ -10,8 +10,7 @@ test("Files lists the session roots and browses into a file", async ({ page }) = await page.getByRole("button", { name: "Send" }).click(); await expect(page.getByText(/Echo: hello/)).toBeVisible(); - // Behind More, collapsed by default like every section. - await page.getByTestId("rail-more-toggle").click(); + // Collapsed by default like every section (the More fold is gone — owner 2026-08-20). await page.getByTestId("rail-toggle-files").click(); const row = page.getByTestId("files-root-row").first(); await expect(row).toContainText("scratch"); diff --git a/surfaces/gui/e2e/roots.spec.ts b/surfaces/gui/e2e/roots.spec.ts index d30fed07..ee9ad25b 100644 --- a/surfaces/gui/e2e/roots.spec.ts +++ b/surfaces/gui/e2e/roots.spec.ts @@ -10,7 +10,6 @@ test("working directories: add folders with the read-only / read-write gate", as await page.getByText("Draft the launch note").first().click(); // Expand the rail's Access section. - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); const dirs = page.getByTestId("drawer-directories"); await expect(dirs.getByText("Folders")).toBeVisible(); diff --git a/surfaces/gui/e2e/slack-directory.spec.ts b/surfaces/gui/e2e/slack-directory.spec.ts index a8868e2d..55d8295e 100644 --- a/surfaces/gui/e2e/slack-directory.spec.ts +++ b/surfaces/gui/e2e/slack-directory.spec.ts @@ -50,7 +50,6 @@ test("channel typeahead: a NAME resolves to the workspace's id-address", async ( }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); await page.getByRole("button", { name: /Channels · 0/ }).click(); @@ -72,7 +71,6 @@ test("channel typeahead: a NAME resolves to the workspace's id-address", async ( test("channel typeahead: private and not-a-member states are honest", async ({ page }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); await page.getByRole("button", { name: /Channels · 0/ }).click(); diff --git a/surfaces/gui/e2e/sources-channels.spec.ts b/surfaces/gui/e2e/sources-channels.spec.ts index 7e59a272..1668913d 100644 --- a/surfaces/gui/e2e/sources-channels.spec.ts +++ b/surfaces/gui/e2e/sources-channels.spec.ts @@ -8,7 +8,6 @@ test("Slack channels drill-down: gating, add (auto-prefixed), remove", async ({ // Open the pinned cowork session, then expand the rail's Access section. await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); const body = page.getByRole("region", { name: "Session access" }); @@ -43,7 +42,6 @@ test("Slack channels drill-down: gating, add (auto-prefixed), remove", async ({ test("recent channels popover: opens on focus, filters, picks", async ({ page }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); await page.getByRole("button", { name: /Channels · 0/ }).click(); @@ -82,7 +80,6 @@ test("channel add: link URLs resolve, bare #names are rejected with a hint", asy }) => { await page.goto("/"); await page.getByText("Draft the launch note").first().click(); - await page.getByTestId("rail-more-toggle").click(); // Access folds behind More (17th pass) await page.getByTestId("access-toggle").click(); await page.getByRole("button", { name: /Channels · 0/ }).click(); diff --git a/surfaces/gui/src/components/RightRail.tsx b/surfaces/gui/src/components/RightRail.tsx index e8d354f9..07e5589a 100644 --- a/surfaces/gui/src/components/RightRail.tsx +++ b/surfaces/gui/src/components/RightRail.tsx @@ -52,9 +52,8 @@ interface Props { // Fires when a full artifact preview opens/closes, so the app can auto-collapse the left nav // to give the preview (PDF/webpage/sheet) more room (#3). onPreviewChange?: (open: boolean) => void; - // §32: the rail is the ONE session panel for every non-chat persona. Artifacts stays - // cowork-only (deliverables; code-family gets "Files" later — slot reserved); the Access - // section (the former Session-settings drawer) renders for all. + // §32: the rail is the ONE session panel for every persona. Artifacts (scratch-side + // deliverables), Files (all roots), and Access all render for every session (UX-036/037). showArtifacts?: boolean; personaId?: string; projectScoped?: boolean; @@ -119,8 +118,6 @@ export function RightRail({ team: false, files: false, }); - // Journal + Access sit behind a quiet "More" row (three primary sections max). - const [moreOpen, setMoreOpen] = useState(false); const autoOpenedProgress = useRef(false); useEffect(() => { if (!isLead && running && todo.length > 0 && !autoOpenedProgress.current) { @@ -135,16 +132,9 @@ export function RightRail({ seenBoardKey.current = openBoardKey; setOpen((prev) => ({ ...prev, board: true })); }, [openBoardKey]); - // Access deep links (intro "Configure ›" etc.) must survive the More fold. - const seenAccessKey = useRef(openAccessKey); - useEffect(() => { - if (openAccessKey === seenAccessKey.current) return; - seenAccessKey.current = openAccessKey; - setMoreOpen(true); - }, [openAccessKey]); const [artifacts, setArtifacts] = useState([]); // UX-037 Files: the session's roots (workspace/scratch/grants) — the entry points of - // the file explorer. Fetched lazily when the More fold opens. + // the file explorer. const [rootDirs, setRootDirs] = useState([]); const [journal, setJournal] = useState([]); const [selected, setSelected] = useState(null); @@ -158,9 +148,9 @@ export function RightRail({ }, [active, sessionId, refreshKey, showArtifacts]); useEffect(() => { - if (!active || !moreOpen) return; + if (!active) return; getRoots(sessionId).then(setRootDirs).catch(() => setRootDirs([])); - }, [active, moreOpen, sessionId, refreshKey]); + }, [active, sessionId, refreshKey]); // Journal cases surface only when a board exists — same visibility rule as the // Board section, so plain sessions carry zero team chrome. @@ -372,17 +362,10 @@ export function RightRail({ )} - {/* Seventeenth pass: three primary sections max — Journal and Access fold - behind a quiet "More" row. Deep links (Access openKey) unfold it. */} - - {moreOpen && board?.space && journal.length > 0 && ( + {/* The More fold is gone (owner call 2026-08-20): every section lists flat, + collapsed by default — with Files added, one extra click hid half the + drawer for no gain. */} + {board?.space && journal.length > 0 && ( 0 && ( + {rootDirs.length > 0 && ( + key: its data ownership resets with the conversation, like the old row did. */} +