Skip to content

ListDetailHeader

Open .md
Live preview

Loading example…

Controls row of the list column: a search field, filter chips and a result count.

import { ListDetailHeader } from "@jcsoftdev/ui/containers";

Single-component entry points tree-shake to just this component: @jcsoftdev/ui/containers/list-detail.

export const SideBySide: Story = {
decorators: inWidth("48rem"),
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
const list = canvas.getByRole("list", { name: "Students" });
await expect(list).toBeVisible();
await expect(canvas.getByText("Pick a student.")).toBeVisible();
await expect(canvas.queryByRole("button", { name: "Back to list" })).toBeNull();
await userEvent.click(canvas.getByRole("button", { name: /Luis/ }));
await expect(canvas.getByRole("button", { name: /Luis/ })).toHaveAttribute(
"aria-current",
"true",
);
await expect(canvas.getByRole("region", { name: "Luis Ramírez" })).toBeVisible();
// Beside the list, the list stays visible and keeps focus.
await expect(list).toBeVisible();
await expect(canvas.getByRole("button", { name: /Luis/ })).toHaveFocus();
await expect(
getComputedStyle(list.closest("[data-view]") as Element).gridTemplateColumns.split(" "),
).toHaveLength(2);
},
};

Source of the Storybook story.

Prop Type Default Description
count ReactNode End slot showing how many items match, e.g. 12. Announced politely when it changes.

* marks a required prop.

It also accepts the native props of the element or primitive it renders (for example className, id, aria-* and event handlers).

packages/ui/src/containers/list-detail/list-detail.tsx