From 2c8fafdec45e826966c6c097275ebb6e95f8542f Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Wed, 3 Jun 2026 17:59:49 +0530 Subject: [PATCH] Implement new separator design (#33599) * Remove `onFocus` and `onBlur` handlers react-resizable-panels fixed the issue where focus-visible was not working as expected, so we no longer need this bit of code. * Implement new hover/focus separator * Collapse the panel when clicking on the new focus separator * Remove `isFocusedViaKeyboard` from snapshot * Update tests and storybook * Expand panel only on double click * Add animation * Fix tests * Don't render border when type is bar * Single click to expand, double click to collapse * Change focus separator color --- .../viewmodels/structures/ResizerViewModel.ts | 31 +-- .../structures/ResizerViewModel-test.ts | 25 +-- .../SeparatorView.stories.tsx/hover-1.png | Bin 4238 -> 0 bytes .../hover-when-collapsed-1.png | Bin 0 -> 13282 bytes .../hover-when-expanded-1.png | Bin 0 -> 13200 bytes .../keyboard-focused-1.png | Bin 5567 -> 14666 bytes .../with-jump-to-date-picker-auto.png | Bin 31962 -> 31959 bytes .../shared-components/src/resize/index.ts | 5 - .../panel/LeftResizablePanelView.stories.tsx | 5 - .../resize/separator/SeparatorView.module.css | 58 +++++- .../separator/SeparatorView.stories.tsx | 58 +++++- .../resize/separator/SeparatorView.test.tsx | 23 ++- .../src/resize/separator/SeparatorView.tsx | 31 +-- .../__snapshots__/SeparatorView.test.tsx.snap | 179 +++++++++++++++++- 14 files changed, 325 insertions(+), 90 deletions(-) delete mode 100644 packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-when-collapsed-1.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-when-expanded-1.png diff --git a/apps/web/src/viewmodels/structures/ResizerViewModel.ts b/apps/web/src/viewmodels/structures/ResizerViewModel.ts index 322db045f1..2d9da268db 100644 --- a/apps/web/src/viewmodels/structures/ResizerViewModel.ts +++ b/apps/web/src/viewmodels/structures/ResizerViewModel.ts @@ -15,7 +15,6 @@ import { type ResizerViewSnapshot, } from "@element-hq/web-shared-components"; import { debounce } from "lodash"; -import whatInput from "what-input"; import SettingsStore from "../../settings/SettingsStore"; import { SettingLevel } from "../../settings/SettingLevel"; @@ -25,13 +24,11 @@ function getInitialState(): ResizerViewSnapshot { return { isCollapsed: true, initialSize: 0, - isFocusedViaKeyboard: false, }; } return { isCollapsed: false, initialSize: SettingsStore.getValue("RoomList.panelSize") ?? undefined, - isFocusedViaKeyboard: false, }; } @@ -87,12 +84,18 @@ export class ResizerViewModel }; private onSeparatorClick = (): void => { + // When panel is collapsed, single click should expand the panel. if (this.panelHandle?.isCollapsed()) { const lastSize = SettingsStore.getValue("RoomList.panelSize"); this.panelHandle.resize(`${lastSize ?? 100}%`); } }; + public onDoubleClick = (): void => { + // When the panel is expanded, double click should collapse. + if (!this.panelHandle?.isCollapsed()) this.panelHandle?.collapse(); + }; + public onPointerUp = (): void => { this.mouseClickHandler.onPointerUp(); }; @@ -104,28 +107,6 @@ export class ResizerViewModel public onPointerDown = (): void => { this.mouseClickHandler.onPointerDown(); }; - - public onFocus = (): void => { - /** - * The intention here is to make the separator visible when it is focused by keyboard - * navigation i.e tabbing through the app. - * - * There's a good reason to take this approach instead of just relying on the focus-visible - * selector: - * When exactly an element gets focus-visible is determined by browser heuristics and usually - * interacting with the mouse will not give an element focus-visible. - * However with this separator on chrome, mouse interaction occasionally gives it focus-visible. - * The leads to flakey separator behaviour. - */ - const currentNavigation = whatInput.ask(); - if (currentNavigation === "keyboard") { - this.snapshot.merge({ isFocusedViaKeyboard: true }); - } - }; - - public onBlur = (): void => { - this.snapshot.merge({ isFocusedViaKeyboard: false }); - }; } /** diff --git a/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts b/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts index c8f3d5251e..f25949528a 100644 --- a/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts +++ b/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts @@ -7,7 +7,6 @@ import { waitFor } from "jest-matrix-react"; import { type PanelImperativeHandle } from "@element-hq/web-shared-components"; -import whatInput from "what-input"; import { ResizerViewModel } from "../../../src/viewmodels/structures/ResizerViewModel"; import SettingsStore from "../../../src/settings/SettingsStore"; @@ -27,7 +26,6 @@ describe("LeftPanelResizerViewModel", () => { expect(vm.getSnapshot()).toStrictEqual({ isCollapsed: true, initialSize: 0, - isFocusedViaKeyboard: false, }); }); @@ -37,7 +35,6 @@ describe("LeftPanelResizerViewModel", () => { expect(vm.getSnapshot()).toStrictEqual({ isCollapsed: false, initialSize: 34, - isFocusedViaKeyboard: false, }); }); @@ -46,7 +43,6 @@ describe("LeftPanelResizerViewModel", () => { expect(vm.getSnapshot()).toStrictEqual({ isCollapsed: false, initialSize: undefined, - isFocusedViaKeyboard: false, }); }); }); @@ -89,7 +85,7 @@ describe("LeftPanelResizerViewModel", () => { expect(mockHandle.resize).not.toHaveBeenCalledWith("34%"); }); - describe("should expand panel on click()", () => { + describe("should expand panel on double click when panel is collapsed", () => { it("to last non-zero width that the user set", () => { const vm = new ResizerViewModel(); SettingsStore.setValue("RoomList.panelSize", null, SettingLevel.DEVICE, 34); @@ -98,11 +94,9 @@ describe("LeftPanelResizerViewModel", () => { isCollapsed: jest.fn().mockReturnValue(true), } as unknown as PanelImperativeHandle; vm.setPanelHandle(mockHandle); - // Simulate click vm.onPointerDown(); vm.onPointerUp(); - expect(mockHandle.resize).toHaveBeenCalledWith("34%"); }); @@ -113,22 +107,23 @@ describe("LeftPanelResizerViewModel", () => { isCollapsed: jest.fn().mockReturnValue(true), } as unknown as PanelImperativeHandle; vm.setPanelHandle(mockHandle); - // Simulate click vm.onPointerDown(); vm.onPointerUp(); - expect(mockHandle.resize).toHaveBeenCalledWith("100%"); }); }); - it("should set isFocusedViaKeyboard state correctly", () => { - whatInput.ask = jest.fn().mockReturnValue("keyboard"); + it("should collapse panel on click when panel is expanded", () => { const vm = new ResizerViewModel(); - vm.onFocus(); - expect(vm.getSnapshot().isFocusedViaKeyboard).toStrictEqual(true); - vm.onBlur(); - expect(vm.getSnapshot().isFocusedViaKeyboard).toStrictEqual(false); + const mockHandle = { + collapse: jest.fn(), + isCollapsed: jest.fn().mockReturnValue(false), + } as unknown as PanelImperativeHandle; + vm.setPanelHandle(mockHandle); + + vm.onDoubleClick(); + expect(mockHandle.collapse).toHaveBeenCalled(); }); it("should resize to nearest whole number", () => { diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png deleted file mode 100644 index 34149eba6c1ec9cf1ab9b1d15a01e219b8f35de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4238 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-when-expanded-1.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-when-expanded-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9188daa9829ee5116b01b9c5fe9c939953693f1 GIT binary patch literal 13200 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 bWeRQMUkmf@eoiZc6WTg++qGG1JpcF~F!`d0 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/keyboard-focused-1.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/keyboard-focused-1.png index 769bf9de511a9b5faf53cb581217e58d0c01f606..d79630a5a0eebef72be18a5174ce8a3b3f03a10e 100644 GIT binary patch literal 14666 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 literal 31962 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%0Ac~*v>K3n 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 diff --git a/packages/shared-components/src/resize/index.ts b/packages/shared-components/src/resize/index.ts index 7030fbe0fe..00a2b96250 100644 --- a/packages/shared-components/src/resize/index.ts +++ b/packages/shared-components/src/resize/index.ts @@ -27,11 +27,6 @@ export interface ResizerViewSnapshot { * This is the initial size of the panel if available; should be interpreted as percentage. */ initialSize?: number; - /** - * Whether the separator is currently focused by navigating - * to it using keyboard input. - */ - isFocusedViaKeyboard: boolean; } /** diff --git a/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx b/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx index b3badd97be..96d2048e86 100644 --- a/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx +++ b/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx @@ -41,14 +41,9 @@ const meta = { component: LeftResizablePanelViewWrapper, // This is a structural component, so nothing to visually test. tags: ["autodocs", "!snapshot"], - argTypes: { - // This snapshot state is not relevant for this View. - isFocusedViaKeyboard: { table: { disable: true } }, - }, args: { initialSize: 20, isCollapsed: false, - isFocusedViaKeyboard: false, onLeftPanelResize: fn(), setPanelHandle: fn(), }, diff --git a/packages/shared-components/src/resize/separator/SeparatorView.module.css b/packages/shared-components/src/resize/separator/SeparatorView.module.css index ec418c398b..06c04c5275 100644 --- a/packages/shared-components/src/resize/separator/SeparatorView.module.css +++ b/packages/shared-components/src/resize/separator/SeparatorView.module.css @@ -8,12 +8,33 @@ .separator { /* Necessary to avoid weird focus outlines (doubled on one side, absent on one side etc...) */ outline-offset: -2px; + + /* We set the separator container to relative so that the child container (activeSeparatorContainer) + can be absolutely positioned */ + position: relative; + + display: flex; + justify-content: center; } /* When type=border, we just render a 1px border */ .separator[data-separator-type="border"] { - width: 0px; - border-right: 1px solid var(--cpd-color-bg-subtle-primary); + /* + We reserve 1px of space even though the actual separator is absolute positioned. + This keeps the panel looking the same as when the border was part of the panel. + */ + width: 1px; + + /* We can disable the browser focus ring since we show a thicker separator on focus */ + outline: none; + + .activeSeparatorContainer { + .activeSeparator { + width: 0px; + border-right: 1px solid var(--cpd-color-bg-subtle-primary); + outline: none; + } + } } /* When type=bar, we render the 12px separator */ @@ -28,3 +49,36 @@ .separator:focus-visible { background: var(--cpd-color-bg-action-tertiary-hovered); } + +/* When type=border and the user hovers/focuses the separator, we make the separator thicker */ +.separator[data-separator-type="border"]:is([data-separator="hover"], [data-separator="active"]), +.separator[data-separator-type="border"]:focus-visible { + .activeSeparatorContainer { + .activeSeparator { + width: 0px; + border-right: 2px solid var(--cpd-color-border-interactive-secondary); + outline: none; + } + } +} + +/* Container for the separator when the left panel is expanded */ +.activeSeparatorContainer { + display: flex; + justify-content: center; + + /* + By making this container absolutely positioned an wide enough to cover the entire hit region, + we're able to intercept all the pointer events. + Without this, we'd only capture the events within a narrow 2px/1px border. + */ + position: absolute; + width: 20px; + z-index: 100; + height: 100%; + + .activeSeparator { + /* Fade in/ fade out the border */ + transition: border 0.15s ease-in-out 0.3s; + } +} diff --git a/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx b/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx index 93a589f4b4..d5a3e5f0a7 100644 --- a/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx +++ b/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx @@ -17,14 +17,13 @@ import { Flex } from "../../core/utils/Flex"; type SeparatorViewProps = ResizerViewSnapshot & SeparatorViewActions; const Wrapper = ({ - onFocus, - onBlur, onPointerDown, onPointerMove, onPointerUp, + onDoubleClick, ...snapshot }: SeparatorViewProps): JSX.Element => { - const vm = useMockedViewModel(snapshot, { onFocus, onBlur, onPointerDown, onPointerMove, onPointerUp }); + const vm = useMockedViewModel(snapshot, { onPointerDown, onPointerMove, onPointerUp, onDoubleClick }); return ; }; @@ -35,13 +34,11 @@ const meta = { component: SeparatorViewWrapper, tags: ["autodocs"], args: { - onFocus: fn(), - onBlur: fn(), onPointerUp: fn(), onPointerMove: fn(), onPointerDown: fn(), + onDoubleClick: fn(), isCollapsed: true, - isFocusedViaKeyboard: false, }, parameters: { design: { @@ -118,16 +115,17 @@ export const KeyboardFocused: Story = { decorators: [(Story) => commonDecorator(Story)], args: { isCollapsed: false, - isFocusedViaKeyboard: true, }, play: async ({ canvas, canvasElement }) => { const separator = canvas.getByRole("separator"); separator.focus(); + // Wait for animations to finish + await new Promise((r) => setTimeout(r, 500)); await expect(canvasElement).toMatchImageSnapshot(); }, }; -export const Hover: Story = { +export const HoverWhenCollapsed: Story = { // We'll manually take a screenshot for this story tags: ["autodocs", "!snapshot"], decorators: [ @@ -159,3 +157,47 @@ export const Hover: Story = { await expect(canvasElement).toMatchImageSnapshot(); }, }; + +export const HoverWhenExpanded: Story = { + // We'll manually take a screenshot for this story + tags: ["autodocs", "!snapshot"], + args: { + isCollapsed: false, + }, + decorators: [ + (Story) => ( +

+ +
+ + + LEFT CONTENT + + + + + + MAIN CONTENT + + + +
+ ), + ], + play: async ({ canvas, canvasElement }) => { + const separator = canvas.getByRole("separator"); + separator.dataset.separator = "hover"; + // Wait for animations to finish + await new Promise((r) => setTimeout(r, 500)); + await expect(canvasElement).toMatchImageSnapshot(); + }, +}; diff --git a/packages/shared-components/src/resize/separator/SeparatorView.test.tsx b/packages/shared-components/src/resize/separator/SeparatorView.test.tsx index 2202e42093..fc6ea14191 100644 --- a/packages/shared-components/src/resize/separator/SeparatorView.test.tsx +++ b/packages/shared-components/src/resize/separator/SeparatorView.test.tsx @@ -15,17 +15,16 @@ import * as stories from "./SeparatorView.stories"; import { BaseViewModel } from "../../core/viewmodel"; import { ResizableGroup, Panel, type ResizerViewSnapshot, SeparatorView, type SeparatorViewActions } from ".."; -const { Default, LeftPanelExpanded, KeyboardFocused } = composeStories(stories); +const { Default, LeftPanelExpanded, KeyboardFocused, HoverWhenCollapsed, HoverWhenExpanded } = composeStories(stories); class MockViewModel extends BaseViewModel implements SeparatorViewActions { public constructor(snapshot: ResizerViewSnapshot) { super(undefined, snapshot); } - public onBlur: () => void = vi.fn(); - public onFocus: () => void = vi.fn(); public onPointerUp: () => void = vi.fn(); public onPointerMove: () => void = vi.fn(); public onPointerDown: () => void = vi.fn(); + public onDoubleClick: () => void = vi.fn(); } function renderPanel(initialSnapshot?: Partial): MockViewModel { @@ -57,6 +56,16 @@ describe("", () => { expect(container).toMatchSnapshot(); }); + it("renders HoverWhenCollapsed story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders HoverWhenExpanded story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("should call onPointerDown and onPointerUp on pointer events", async () => { const vm = renderPanel(); const separator = screen.getByRole("separator"); @@ -65,12 +74,10 @@ describe("", () => { expect(vm.onPointerUp).toHaveBeenCalledOnce(); }); - it("should call onFocus and onBlur when receiving/loosing focus", async () => { + it("should call onDoubleClick on double click", async () => { const vm = renderPanel(); const separator = screen.getByRole("separator"); - separator.focus(); - expect(vm.onFocus).toHaveBeenCalled(); - separator.blur(); - expect(vm.onBlur).toHaveBeenCalled(); + await userEvent.dblClick(separator); + expect(vm.onDoubleClick).toHaveBeenCalledOnce(); }); }); diff --git a/packages/shared-components/src/resize/separator/SeparatorView.tsx b/packages/shared-components/src/resize/separator/SeparatorView.tsx index 2d95f1940e..6f3169d1eb 100644 --- a/packages/shared-components/src/resize/separator/SeparatorView.tsx +++ b/packages/shared-components/src/resize/separator/SeparatorView.tsx @@ -33,14 +33,9 @@ export interface SeparatorViewActions { onPointerDown: () => void; /** - * onFocus handler for the separator. + * onDoubleClick handler for the separator. */ - onFocus: () => void; - - /** - * onBlur handler for the separator. - */ - onBlur: () => void; + onDoubleClick: () => void; } interface Props { @@ -53,14 +48,14 @@ interface Props { */ export function SeparatorView({ vm, className }: Props): React.ReactNode { const { translate: _t } = useI18n(); - const { isCollapsed, isFocusedViaKeyboard } = useViewModel(vm); + const { isCollapsed } = useViewModel(vm); /** * There are two types of separator: * - bar: This shows a thick bar separator with a resize icon in the middle; shown when the panel is collapsed. - * - border: This is just a 1px wide separator; shown when the panel is expanded. + * - border: This is just a thin separator; shown when the panel is expanded. */ - const type = isCollapsed || isFocusedViaKeyboard ? "bar" : "border"; + const type = isCollapsed ? "bar" : "border"; const barContent = ( @@ -75,19 +70,29 @@ export function SeparatorView({ vm, className }: Props): React.ReactNode { ); + /** + * This border is: + * - a 1px border that separates the left panel and main content. + * - a 2px border when the panel is expanded and the user is interacting with the separator. + */ + const border = ( +
+
+
+ ); + return ( - {type === "bar" ? barContent : null} + {type === "bar" ? barContent : border} ); } diff --git a/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap b/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap index 695dde68da..6ad257d117 100644 --- a/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap +++ b/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap @@ -80,7 +80,7 @@ exports[` > renders Default story 1`] = `
`; -exports[` > renders KeyboardFocused story 1`] = ` +exports[` > renders HoverWhenCollapsed story 1`] = `
> renders KeyboardFocused story 1`] = ` data-panel="true" data-testid="react-use-id-2" id="react-use-id-2" - style="min-height: 0px; max-height: 100%; height: auto; min-width: 0px; max-width: 100%; width: auto; border: 0px; padding: 0px; margin: 0px; display: flex; flex: 49.751 1 0px; overflow: visible;" + style="min-height: 0px; max-height: 100%; height: auto; min-width: 0px; max-width: 100%; width: auto; border: 0px; padding: 0px; margin: 0px; display: flex; flex: 0 1 0px; overflow: visible;" >
> renders KeyboardFocused story 1`] = ` aria-orientation="vertical" aria-valuemax="99.502" aria-valuemin="0" - aria-valuenow="49.751" + aria-valuenow="0" class="SeparatorView-module_separator Separator" data-separator="inactive" data-separator-type="bar" @@ -142,7 +142,160 @@ exports[` > renders KeyboardFocused story 1`] = ` data-panel="true" data-testid="react-use-id-4" id="react-use-id-4" - style="min-height: 0px; max-height: 100%; height: auto; min-width: 0px; max-width: 100%; width: auto; border: 0px; padding: 0px; margin: 0px; display: flex; flex: 50.249 1 0px; overflow: visible;" + style="min-height: 0px; max-height: 100%; height: auto; min-width: 0px; max-width: 100%; width: auto; border: 0px; padding: 0px; margin: 0px; display: flex; flex: 100 1 0px; overflow: visible;" + > +
+
+ MAIN CONTENT +
+
+
+
+
+
+`; + +exports[` > renders HoverWhenExpanded story 1`] = ` +
+
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+`; + +exports[` > renders KeyboardFocused story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+