From 451a7c0d16eb93a8625945da5c4a114fe7ff6e11 Mon Sep 17 00:00:00 2001 From: mintaka Date: Tue, 6 Oct 2026 06:14:01 -0400 Subject: [PATCH 1/2] feat(ui): two-pane split with a resizable splitter (RIG-4446) A split tab renders both views side by side or stacked, sized by its ratio, with a keyboard- and pointer-resizable separator clamped to 0.2-0.8 and persisted with the layout. The focused pane carries a focus rule. Adds the split-view e2e and a local split-view visual baseline. Co-authored-by: Matt Wilkinson --- apps/ui/e2e/__screens__/split-view.png | Bin 0 -> 104976 bytes apps/ui/e2e/split-view.spec.ts | 56 +++++ apps/ui/e2e/visual-smoke.spec.ts | 19 ++ apps/ui/src/App.tsx | 101 +++++---- apps/ui/src/components/SplitPane.test.tsx | 220 +++++++++++++++++++ apps/ui/src/components/SplitPane.tsx | 136 ++++++++++++ apps/ui/src/design/components/split-pane.css | 69 ++++++ apps/ui/src/test-router.tsx | 6 +- apps/ui/src/window-layout.ts | 4 +- 9 files changed, 565 insertions(+), 46 deletions(-) create mode 100644 apps/ui/e2e/__screens__/split-view.png create mode 100644 apps/ui/e2e/split-view.spec.ts create mode 100644 apps/ui/src/components/SplitPane.test.tsx create mode 100644 apps/ui/src/components/SplitPane.tsx create mode 100644 apps/ui/src/design/components/split-pane.css diff --git a/apps/ui/e2e/__screens__/split-view.png b/apps/ui/e2e/__screens__/split-view.png new file mode 100644 index 0000000000000000000000000000000000000000..fbea106efbb3c7b41371d365aaaf9db9d3c80ad3 GIT binary patch literal 104976 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%0A{@McEIioMnV_8Op)`ehw%MiW9vs2|{MxqEp0 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 z

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 { + await page.goto(`/#${TOPIC_PATH}`); + const tabs = page.locator('.cx-tab-strip [role="tab"]'); + const panels = page.locator(".cx-split-pane:not([hidden]) > .view-panel"); + await expect(page.locator(".conv-composer input.field")).toBeVisible(); + + await tabs.first().click(); + await page.keyboard.press("w"); + await page.keyboard.press("v"); + await expect(panels).toHaveCount(2); + await expect(tabs).toHaveCount(1); + await expect(page.locator('[role="separator"]')).toBeVisible(); + const [first, second] = [panels.nth(0), panels.nth(1)]; + const firstBox = await first.boundingBox(); + const secondBox = await second.boundingBox(); + expect(firstBox?.y).toBe(secondBox?.y); + expect(firstBox?.x ?? 0).toBeLessThan(secondBox?.x ?? 0); + // The two panes and the 1px splitter fill main between them. + const fill = await page.evaluate(() => { + const box = document.querySelector(".cx-split-pane:not([hidden])"); + const parts = [...(box?.children ?? [])].map( + (el) => el.getBoundingClientRect().width, + ); + return { + sum: parts.reduce((a, b) => a + b, 0), + main: document.querySelector(".main")?.clientWidth ?? 0, + }; + }); + expect(Math.abs(fill.sum - fill.main)).toBeLessThanOrEqual(2); + + // The new second pane holds focus, so the sidebar navigates it alone. + await expect(second).toHaveAttribute("data-focused", ""); + await page.locator(".tree-agent", { hasText: "compass-ui" }).first().click(); + await expect(second.locator(".agent-view")).toBeVisible(); + await expect(first.locator(".conv-composer input.field")).toBeVisible(); + + const composer = first.locator(".conv-composer input.field"); + await composer.click(); + await expect(first).toHaveAttribute("data-focused", ""); + await composer.fill("from the first pane"); + await composer.press("Enter"); + + await expect(first.locator(".conv-composer")).toBeVisible(); + await expect(second.locator(".agent-view")).toBeVisible(); + await expect(second.locator(".conv-composer")).toHaveCount(0); + await expect(first).toHaveAttribute("data-focused", ""); +}); diff --git a/apps/ui/e2e/visual-smoke.spec.ts b/apps/ui/e2e/visual-smoke.spec.ts index b2de3f273..820dbcf05 100644 --- a/apps/ui/e2e/visual-smoke.spec.ts +++ b/apps/ui/e2e/visual-smoke.spec.ts @@ -242,4 +242,23 @@ test.describe("visual smoke — legacy-palette baseline", () => { scale: "css", }); }); + + test("split view — channel and agent side by side", async ({ page }) => { + await page.goto("/#/channel/ch-svc-compass/topic/top-compass-acp"); + await page.locator(".conv-composer").waitFor({ state: "visible" }); + await page.locator('.cx-tab-strip [role="tab"]').first().click(); + await page.keyboard.press("w"); + await page.keyboard.press("v"); + await page + .locator("aside.left .tree-agent", { hasText: "compass-ui" }) + .first() + .click(); + await page.locator(".cx-split-pane .agent-view").waitFor(); + await page.evaluate(() => document.fonts.ready); + await expect(page).toHaveScreenshot("split-view.png", { + fullPage: true, + animations: "disabled", + scale: "css", + }); + }); }); diff --git a/apps/ui/src/App.tsx b/apps/ui/src/App.tsx index 4d6b97815..b2afb0f7b 100644 --- a/apps/ui/src/App.tsx +++ b/apps/ui/src/App.tsx @@ -27,18 +27,18 @@ import { LeftSidebar } from "./components/LeftSidebar"; import { Palette } from "./components/Palette"; import { RightSidebar } from "./components/RightSidebar"; import { ShortcutsOverlay } from "./components/ShortcutsOverlay"; +import { SplitPane } from "./components/SplitPane"; import { TabStrip } from "./components/TabStrip"; import { TopBarSearch } from "./components/TopBarSearch"; import { UsageBar } from "./components/UsageBar"; -import { ViewHost } from "./components/ViewHost"; import { useStore } from "./context"; import type { CommandId } from "./keyboard/commands"; import { detectPlatform, installKeymap } from "./keyboard/dispatch"; import { shortcutForAria } from "./keyboard/keymap"; import type { LiveClients } from "./live/client"; import { routeTitle } from "./route-title"; -import { focusViewPanel, viewPanelId, viewTabId } from "./view-panel"; -import { focusedViewOf, shownViewIds, tabViews } from "./window-layout"; +import { focusViewPanel } from "./view-panel"; +import { focusedViewOf, shownViewIds } from "./window-layout"; // Compass shell: routed center view with persistent navigation and usage chrome. @@ -68,15 +68,23 @@ const App: Component< ); // Panels toggle `hidden` imperatively so a switch can move focus into the // shown view before hiding the old one; a hidden element drops focus. - const panels = new Map(); + // SplitPane renders them, so they are found under main by view id. + let main: HTMLElement | undefined; + const panels = (): Map => + new Map( + [ + ...(main?.querySelectorAll(".view-panel[data-view-id]") ?? + []), + ].map((el) => [el.dataset.viewId ?? "", el]), + ); const lastFocus = new Map(); // The view focus was last in, kept even after a close removes its panel. let focusedPanelView: string | undefined; const rememberFocus = (event: FocusEvent): void => { const target = event.target; if (!(target instanceof HTMLElement)) return; - const panel = target.closest('[role="tabpanel"]'); - const viewId = [...panels].find(([, el]) => el === panel)?.[0]; + const viewId = target.closest(".view-panel[data-view-id]") + ?.dataset.viewId; if (viewId === undefined) return; lastFocus.set(viewId, target); focusedPanelView = viewId; @@ -87,53 +95,65 @@ const App: Component< const forgetFocus = (event: FocusEvent): void => { const next = event.relatedTarget; if (!(next instanceof Node)) return; - if (![...panels.values()].some((el) => el.contains(next))) + if (![...panels().values()].some((el) => el.contains(next))) focusedPanelView = undefined; }; - const tabIdOf = (viewId: string): string | undefined => { - const tab = store - .layout() - .tabs.find((t) => tabViews(t.layout).some((v) => v.id === viewId)); - return tab ? viewTabId(tab.id) : undefined; - }; // Focus is leaving if it sits in a panel about to hide, or it was in a panel // a close just removed (the browser has already dropped it to the body). - const focusLeaving = (shownIds: readonly string[]): boolean => { + const focusLeaving = ( + shown: Map, + shownIds: readonly string[], + ): boolean => { const active = document.activeElement; if (active === null || active === document.body) - return focusedPanelView !== undefined && !panels.has(focusedPanelView); - return [...panels].some( + return focusedPanelView !== undefined && !shown.has(focusedPanelView); + return [...shown].some( ([id, el]) => !shownIds.includes(id) && el.contains(active), ); }; - const prunePanels = (ids: readonly string[]): void => { - for (const id of [...panels.keys()]) { - if (ids.includes(id)) continue; - panels.delete(id); - lastFocus.delete(id); + const pruneFocus = (ids: readonly string[]): void => { + for (const id of [...lastFocus.keys()]) { + if (!ids.includes(id)) lastFocus.delete(id); } }; + // Each tab's box and every panel, paired with whether it should show. + const visibility = ( + current: Map, + shownIds: readonly string[], + activeTabId: string, + ): [HTMLElement, boolean][] => [ + ...[...(main?.querySelectorAll(".cx-split-pane") ?? [])].map( + (box): [HTMLElement, boolean] => [box, box.dataset.tabId === activeTabId], + ), + ...[...current].map(([id, el]): [HTMLElement, boolean] => [ + el, + shownIds.includes(id), + ]), + ]; createEffect( () => ({ shownIds: shownViewIds(store.layout()), focusedId: focusedViewOf(store.layout()).id, + activeTabId: store.layout().activeTabId, ids: store.viewScopes().map((scope) => scope.id), }), - ({ shownIds, focusedId, ids }) => { - prunePanels(ids); - const focused = panels.get(focusedId); + ({ shownIds, focusedId, activeTabId, ids }) => { + pruneFocus(ids); + const current = panels(); + const focused = current.get(focusedId); if (!focused) return; - for (const id of shownIds) panels.get(id)?.removeAttribute("hidden"); - const activePanelId = [...panels].find(([, panel]) => + const toggles = visibility(current, shownIds, activeTabId); + for (const [el, show] of toggles) if (show) el.hidden = false; + const activePanelId = [...current].find(([, panel]) => panel.contains(document.activeElement), )?.[0]; if ( - focusLeaving(shownIds) || + focusLeaving(current, shownIds) || (activePanelId !== undefined && activePanelId !== focusedId) ) { focusInto(focusedId, focused); } - for (const [id, el] of panels) el.hidden = !shownIds.includes(id); + for (const [el, show] of toggles) el.hidden = !show; }, ); const focusInto = (viewId: string, panel: HTMLElement): void => { @@ -223,21 +243,16 @@ const App: Component< -

- scope.id}> - {(scope) => ( - - )} +
{ + main = el; + }} + onFocusIn={rememberFocus} + onFocusOut={forgetFocus} + > + tab.id}> + {(tab) => }
diff --git a/apps/ui/src/components/SplitPane.test.tsx b/apps/ui/src/components/SplitPane.test.tsx new file mode 100644 index 000000000..a522fa92c --- /dev/null +++ b/apps/ui/src/components/SplitPane.test.tsx @@ -0,0 +1,220 @@ +import { afterEach, describe, expect, test } from "bun:test"; +import { cleanup, fireEvent } from "@solidjs/testing-library"; +import type { CommandId } from "../keyboard/commands"; +import type { AppStore } from "../store"; +import { flush, mountApp } from "../test-router"; +import { + loadLayout, + type TabLayout, + type WindowLayout, +} from "../window-layout"; + +// A split tab renders both views in one row or column, sized by the ratio, +// with a keyboard- and pointer-driven splitter whose ratio persists. + +const TOPIC_PATH = "/channel/ch-svc-compass/topic/top-compass-acp"; + +type Split = Extract; + +function memoryStorage(): Storage { + const items = new Map(); + return { + get length() { + return items.size; + }, + clear: () => items.clear(), + getItem: (key) => items.get(key) ?? null, + key: (index) => [...items.keys()][index] ?? null, + removeItem: (key) => { + items.delete(key); + }, + setItem: (key, value) => { + items.set(key, value); + }, + }; +} + +const activeSplit = (layout: WindowLayout): Split => { + const tab = layout.tabs.find((item) => item.id === layout.activeTabId); + if (tab?.layout.kind !== "split") throw new Error("active tab is not split"); + return tab.layout; +}; +const splitter = (c: HTMLElement): HTMLElement => { + const el = c.querySelector('.cx-split-pane [role="separator"]'); + if (!el) throw new Error("no splitter"); + return el; +}; +const panel = (c: HTMLElement, viewId: string): HTMLElement => { + const el = c.querySelector(`#view-panel-${viewId}`); + if (!el) throw new Error(`no panel for ${viewId}`); + return el; +}; +const runCommand = (store: AppStore, id: string): void => { + const command = store.keyboard.registry.get(id as CommandId); + if (!command) throw new Error(`missing command ${id}`); + command.run(); +}; + +async function mountSplit(direction: "row" | "column") { + const storage = memoryStorage(); + const mounted = mountApp(TOPIC_PATH, storage); + await flush(); + mounted.store.dispatchLayout({ kind: "split", direction }); + await flush(); + return { ...mounted, storage }; +} + +afterEach(() => cleanup()); + +describe("SplitPane", () => { + test("a row split shows both views side by side, sized by the ratio", async () => { + const { store, container } = await mountSplit("row"); + const split = activeSplit(store.layout()); + const first = panel(container, split.first.id); + const second = panel(container, split.second.id); + const root = first.parentElement; + expect(root?.classList.contains("cx-split-pane")).toBe(true); + expect(root?.dataset.direction).toBe("row"); + expect(second.parentElement).toBe(root); + expect([first.hidden, second.hidden]).toEqual([false, false]); + expect([first.style.flexGrow, second.style.flexGrow]).toEqual([ + "0.5", + "0.5", + ]); + const sep = splitter(container); + expect(sep.getAttribute("aria-orientation")).toBe("vertical"); + expect(sep.getAttribute("aria-controls")).toBe(first.id); + // The splitter sits between the two panes. + expect(first.nextElementSibling).toBe(sep); + expect(sep.nextElementSibling).toBe(second); + }); + + test("a column split stacks the views with a horizontal splitter", async () => { + const { store, container } = await mountSplit("column"); + const split = activeSplit(store.layout()); + expect( + panel(container, split.first.id).parentElement?.dataset.direction, + ).toBe("column"); + expect(splitter(container).getAttribute("aria-orientation")).toBe( + "horizontal", + ); + }); + + test("a single-view tab has no splitter", async () => { + const { container } = mountApp(TOPIC_PATH); + await flush(); + expect(container.querySelector('[role="separator"]')).toBeNull(); + }); + + test("arrow keys step the ratio along the split axis, clamped and persisted", async () => { + const { store, container, storage } = await mountSplit("row"); + const sep = splitter(container); + expect(sep.tabIndex).toBe(0); + expect( + ["aria-valuemin", "aria-valuemax", "aria-valuenow"].map((name) => + sep.getAttribute(name), + ), + ).toEqual(["20", "80", "50"]); + + fireEvent.keyDown(sep, { key: "ArrowRight" }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.55); + expect(sep.getAttribute("aria-valuenow")).toBe("55"); + + // Each real keydown is its own task, so the layout settles between them. + for (let i = 0; i < 10; i++) { + fireEvent.keyDown(sep, { key: "ArrowRight" }); + await flush(); + } + expect(activeSplit(store.layout()).ratio).toBe(0.8); + expect(sep.getAttribute("aria-valuenow")).toBe("80"); + + fireEvent.keyDown(sep, { key: "ArrowLeft" }); + await flush(); + // The cross axis does nothing on a row split. + fireEvent.keyDown(sep, { key: "ArrowUp" }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.75); + expect(activeSplit(loadLayout(storage, TOPIC_PATH)).ratio).toBe(0.75); + }); + + test("up and down step a column split", async () => { + const { store, container } = await mountSplit("column"); + const sep = splitter(container); + fireEvent.keyDown(sep, { key: "ArrowUp" }); + fireEvent.keyDown(sep, { key: "ArrowRight" }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.45); + }); + + test("dragging the splitter resizes, clamped to the bounds, and persists", async () => { + const { store, container, storage } = await mountSplit("row"); + const sep = splitter(container); + const root = sep.parentElement; + if (!root) throw new Error("splitter has no root"); + root.getBoundingClientRect = () => new DOMRect(100, 0, 1000, 600); + + fireEvent.pointerDown(sep, { pointerId: 1, button: 0, clientX: 600 }); + fireEvent.pointerMove(sep, { pointerId: 1, clientX: 400 }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.3); + const split = activeSplit(store.layout()); + expect(panel(container, split.first.id).style.flexGrow).toBe("0.3"); + expect(panel(container, split.second.id).style.flexGrow).toBe("0.7"); + + fireEvent.pointerMove(sep, { pointerId: 1, clientX: 120 }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.2); + + fireEvent.pointerUp(sep, { pointerId: 1, clientX: 120 }); + fireEvent.pointerMove(sep, { pointerId: 1, clientX: 900 }); + await flush(); + expect(activeSplit(store.layout()).ratio).toBe(0.2); + expect(activeSplit(loadLayout(storage, TOPIC_PATH)).ratio).toBe(0.2); + }); + + test("the focused pane carries the focus marker, and only in a split", async () => { + const { store, container } = await mountSplit("row"); + const split = activeSplit(store.layout()); + const first = panel(container, split.first.id); + const second = panel(container, split.second.id); + expect([first.dataset.focused, second.dataset.focused]).toEqual([ + undefined, + "", + ]); + runCommand(store, "pane.focusFirst"); + await flush(); + expect([first.dataset.focused, second.dataset.focused]).toEqual([ + "", + undefined, + ]); + runCommand(store, "pane.closeOther"); + await flush(); + expect(first.dataset.focused).toBeUndefined(); + }); + + test("splitting and closing the other pane keep the first view mounted", async () => { + const { store, container } = mountApp(TOPIC_PATH); + await flush(); + const input = container.querySelector( + ".conv-composer input.field", + ); + if (!input) throw new Error("no composer"); + fireEvent.input(input, { target: { value: "draft" } }); + store.dispatchLayout({ kind: "split", direction: "row" }); + await flush(); + runCommand(store, "pane.focusFirst"); + runCommand(store, "pane.closeOther"); + await flush(); + expect(input.isConnected).toBe(true); + expect(input.value).toBe("draft"); + }); + + test("an inactive split tab hides its splitter with its panes", async () => { + const { store, container } = await mountSplit("row"); + const sep = splitter(container); + store.dispatchLayout({ kind: "open", path: "/settings" }); + await flush(); + expect(sep.closest("[hidden]")).not.toBeNull(); + }); +}); diff --git a/apps/ui/src/components/SplitPane.tsx b/apps/ui/src/components/SplitPane.tsx new file mode 100644 index 000000000..eb44c2847 --- /dev/null +++ b/apps/ui/src/components/SplitPane.tsx @@ -0,0 +1,136 @@ +import { type Component, createMemo, For, Show } from "solid-js"; +import "../design/components/split-pane.css"; +import { useStore } from "../context"; +import { viewPanelId, viewTabId } from "../view-panel"; +import { + MAX_RATIO, + MIN_RATIO, + type TabLayout, + tabViews, +} from "../window-layout"; +import { ViewHost } from "./ViewHost"; + +type Split = Extract; + +const KEY_STEP = 0.05; + +/** One view tab's box: its single view, or both panes of a split with a + * splitter between them. App toggles `hidden` on the box and its panels. */ +export const SplitPane: Component<{ tabId: string }> = (props) => { + const store = useStore(); + const layout = createMemo( + () => store.layout().tabs.find((tab) => tab.id === props.tabId)?.layout, + ); + const split = createMemo((): Split | undefined => { + const tab = layout(); + return tab?.kind === "split" ? tab : undefined; + }); + const views = createMemo(() => { + const tab = layout(); + return tab ? tabViews(tab) : []; + }); + let root: HTMLDivElement | undefined; + let dragging: number | undefined; + + const onKeyDown = (event: KeyboardEvent, current: Split): void => { + const [back, forward] = + current.direction === "row" + ? ["ArrowLeft", "ArrowRight"] + : ["ArrowUp", "ArrowDown"]; + const step = + event.key === forward ? KEY_STEP : event.key === back ? -KEY_STEP : 0; + if (step === 0) return; + event.preventDefault(); + // Rounded so repeated steps land on whole percents, not float drift. + const ratio = Math.round((current.ratio + step) * 100) / 100; + store.dispatchLayout({ kind: "resize", ratio }); + }; + const onPointerMove = (event: PointerEvent, current: Split): void => { + if (dragging !== event.pointerId || !root) return; + const box = root.getBoundingClientRect(); + const ratio = + current.direction === "row" + ? (event.clientX - box.left) / box.width + : (event.clientY - box.top) / box.height; + store.dispatchLayout({ kind: "resize", ratio }); + }; + + return ( +