1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-26 17:43:22 +00:00

[CL-971] update responsive behavior of three panel layout (#19086) (#19149)

* update responsive behavior of three panel layout; give sidenav extra top padding on electron; add stories that show mix of drawer and sidenav states

---------

Co-authored-by: Will Martin <contact@willmartian.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Robyn MacCallum
2026-02-23 12:57:58 -05:00
committed by GitHub
parent b9b23fca40
commit d5478ee8d2
22 changed files with 601 additions and 221 deletions

View File

@@ -2,14 +2,7 @@ import { importProvidersFrom } from "@angular/core";
import { provideNoopAnimations } from "@angular/platform-browser/animations";
import { RouterModule } from "@angular/router";
import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular";
import {
userEvent,
getAllByRole,
getByRole,
fireEvent,
getByText,
getAllByLabelText,
} from "storybook/test";
import { userEvent, getAllByRole, getByRole, fireEvent, getAllByLabelText } from "storybook/test";
import { PasswordManagerLogo } from "@bitwarden/assets/svg";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@@ -90,6 +83,22 @@ export default {
type Story = StoryObj<LayoutComponent>;
type KitchenSinkRoute = "/bitwarden" | "/virtual-scroll";
async function navigateTo(path: KitchenSinkRoute) {
window.location.hash = path;
await new Promise((resolve) => setTimeout(resolve, 50));
}
/** Waits for the ResizeObserver + Angular CD to settle, then opens the side nav if it's closed. */
async function openSideNav(canvas: HTMLElement) {
await new Promise((resolve) => setTimeout(resolve, 200));
const toggleButton = getByRole(canvas, "button", { name: "Toggle side navigation" });
if (toggleButton.getAttribute("aria-expanded") === "false") {
await userEvent.click(toggleButton);
}
}
export const Default: Story = {
render: (args) => {
return {
@@ -130,6 +139,7 @@ export const MenuOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const table = getByRole(canvas, "table");
const menuButton = getAllByRole(table, "button")[0];
@@ -144,6 +154,7 @@ export const DialogOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const dialogButton = getByRole(canvas, "button", {
name: "Open Dialog",
});
@@ -157,6 +168,7 @@ export const DrawerOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const drawerButton = getByRole(canvas, "button", {
name: "Open Drawer",
});
@@ -170,6 +182,7 @@ export const PopoverOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const popoverLink = getByRole(canvas, "button", {
name: "Popover trigger link",
});
@@ -182,6 +195,7 @@ export const SimpleDialogOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const submitButton = getByRole(canvas, "button", {
name: "Submit",
});
@@ -195,6 +209,7 @@ export const EmptyTab: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
const emptyTab = getByRole(canvas, "tab", { name: "Empty tab" });
await userEvent.click(emptyTab);
},
@@ -204,8 +219,7 @@ export const VirtualScrollBlockingDialog: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
const navItem = getByText(canvas, "Virtual Scroll");
await userEvent.click(navItem);
await navigateTo("/virtual-scroll");
const htmlEl = canvas.ownerDocument.documentElement;
htmlEl.scrollTop = 2000;
@@ -216,11 +230,38 @@ export const VirtualScrollBlockingDialog: Story = {
},
};
export const SideNavOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
await navigateTo("/bitwarden");
await openSideNav(canvas);
},
parameters: {
chromatic: { viewports: [640, 1024, 1280] },
},
};
export const DrawerOpenBeforeSideNavOpen: Story = {
render: Default.render,
play: async (context) => {
const canvas = context.canvasElement;
// workaround for userEvent not firing in FF https://github.com/testing-library/user-event/issues/1075
await fireEvent.click(getByRole(canvas, "button", { name: "Open Drawer" }));
await navigateTo("/bitwarden");
await openSideNav(canvas);
},
parameters: {
chromatic: { viewports: [640, 1024, 1280, 1440] },
},
};
export const ResponsiveSidebar: Story = {
render: Default.render,
parameters: {
chromatic: {
viewports: [640, 1280],
viewports: [640, 1024, 1280, 1440],
},
},
};