Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 4.4.1

- [600](https://github.com/bvaughn/react-resizable-panels/pull/600): Bugfix: Collapsible `Panel` should treat `defaultSize={0}` as _collapsed_ on mount

## 4.4.0

- [599](https://github.com/bvaughn/react-resizable-panels/pull/599): Add new `onLayoutChanged` prop to `Group`.
Expand Down
26 changes: 19 additions & 7 deletions integrations/tests/tests/default-sizes.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@ test.describe("default panel sizes", () => {
<Group>
<Panel defaultSize="30%" id="left" minSize={50} />
<Separator />
<Panel collapsible defaultSize="0%" id="middle" minSize={50} />
<Separator />
<Panel id="right" minSize={50} />
</Group>,
{ usePopUpWindow }
);

await expect(page.getByText("id: left")).toContainText("30%");
await expect(page.getByRole("separator")).toBeVisible();
await expect(page.getByText("id: middle")).toContainText("0%");
await expect(page.getByText("id: right")).toContainText("70%");
await expect(page.getByRole("separator")).toHaveCount(2);
});

test("pixels", async ({ page: mainPage }) => {
Expand All @@ -28,14 +31,17 @@ test.describe("default panel sizes", () => {
<Group>
<Panel defaultSize={200} id="left" minSize={50} />
<Separator />
<Panel collapsible defaultSize={0} id="middle" minSize={50} />
<Separator />
<Panel id="right" minSize={50} />
</Group>,
{ usePopUpWindow }
);

await expect(page.getByText("id: left")).toContainText("200px");
await expect(page.getByRole("separator")).toBeVisible();
await expect(page.getByText("id: right")).toContainText("776px");
await expect(page.getByText("id: middle")).toContainText("0px");
await expect(page.getByText("id: right")).toContainText("752px");
await expect(page.getByRole("separator")).toHaveCount(2);
});

test("rems", async ({ page: mainPage }) => {
Expand All @@ -44,14 +50,17 @@ test.describe("default panel sizes", () => {
<Group>
<Panel defaultSize="10rem" id="left" minSize={50} />
<Separator />
<Panel collapsible defaultSize="0rem" id="middle" minSize={50} />
<Separator />
<Panel id="right" minSize={50} />
</Group>,
{ usePopUpWindow }
);

await expect(page.getByText("id: left")).toContainText("160px");
await expect(page.getByRole("separator")).toBeVisible();
await expect(page.getByText("id: right")).toContainText("816px");
await expect(page.getByText("id: middle")).toContainText("0px");
await expect(page.getByText("id: right")).toContainText("792px");
await expect(page.getByRole("separator")).toHaveCount(2);
});

test("vw", async ({ page: mainPage }) => {
Expand All @@ -60,14 +69,17 @@ test.describe("default panel sizes", () => {
<Group>
<Panel defaultSize="25vw" id="left" minSize={50} />
<Separator />
<Panel collapsible defaultSize="0vw" id="middle" minSize={50} />
<Separator />
<Panel id="right" minSize={50} />
</Group>,
{ usePopUpWindow }
);

await expect(page.getByText("id: left")).toContainText("250px");
await expect(page.getByRole("separator")).toBeVisible();
await expect(page.getByText("id: right")).toContainText("726px");
await expect(page.getByText("id: middle")).toContainText("0px");
await expect(page.getByText("id: right")).toContainText("702px");
await expect(page.getByRole("separator")).toHaveCount(2);
});
});
}
Expand Down
8 changes: 4 additions & 4 deletions lib/global/dom/calculatePanelConstraints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function calculatePanelConstraints(group: RegisteredGroup) {
const { element, panelConstraints } = panel;

let collapsedSize = 0;
if (panelConstraints.collapsedSize) {
if (panelConstraints.collapsedSize !== undefined) {
const pixels = sizeStyleToPixels({
groupSize,
panelElement: element,
Expand All @@ -36,7 +36,7 @@ export function calculatePanelConstraints(group: RegisteredGroup) {
}

let defaultSize: number | undefined = undefined;
if (panelConstraints.defaultSize) {
if (panelConstraints.defaultSize !== undefined) {
const pixels = sizeStyleToPixels({
groupSize,
panelElement: element,
Expand All @@ -47,7 +47,7 @@ export function calculatePanelConstraints(group: RegisteredGroup) {
}

let minSize = 0;
if (panelConstraints.minSize) {
if (panelConstraints.minSize !== undefined) {
const pixels = sizeStyleToPixels({
groupSize,
panelElement: element,
Expand All @@ -58,7 +58,7 @@ export function calculatePanelConstraints(group: RegisteredGroup) {
}

let maxSize = 100;
if (panelConstraints.maxSize) {
if (panelConstraints.maxSize !== undefined) {
const pixels = sizeStyleToPixels({
groupSize,
panelElement: element,
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-resizable-panels",
"version": "4.4.0",
"version": "4.4.1",
"type": "module",
"author": "Brian Vaughn <brian.david.vaughn@gmail.com> (https://github.com/bvaughn/)",
"contributors": [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"html": "<div><span class=\"tok-punctuation\">&#60;</span><span class=\"tok-typeName\">Group</span><span class=\"tok-punctuation\">&#62;</span><span class=\"\"></span></div>\n<div><span class=\"\"> </span><span class=\"tok-punctuation\">&#60;</span><span class=\"tok-typeName\">Panel</span><span class=\"\"> </span><span class=\"tok-propertyName\">collapsible</span><span class=\"\"> </span><span class=\"tok-propertyName\">defaultSize</span><span class=\"tok-operator\">=</span><span class=\"tok-string\">\"0%\"</span><span class=\"\"> </span><span class=\"tok-propertyName\">minSize</span><span class=\"tok-operator\">=</span><span class=\"tok-string\">\"10%\"</span><span class=\"\"> </span><span class=\"tok-punctuation\">/&#62;</span><span class=\"\"></span></div>\n<div><span class=\"\"> </span><span class=\"tok-punctuation\">&#60;</span><span class=\"tok-typeName\">Separator</span><span class=\"\"> </span><span class=\"tok-punctuation\">/&#62;</span><span class=\"\"></span></div>\n<div><span class=\"\"> </span><span class=\"tok-punctuation\">&#60;</span><span class=\"tok-typeName\">Panel</span><span class=\"\"> </span><span class=\"tok-punctuation\">/&#62;</span><span class=\"\"></span></div>\n<div><span class=\"\"></span><span class=\"tok-punctuation\">&#60;/</span><span class=\"tok-typeName\">Group</span><span class=\"tok-punctuation\">&#62;</span></div>"
}
20 changes: 20 additions & 0 deletions src/routes/CollapsiblePanelsRoute.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Box, Callout, Code, Header } from "react-lib-tools";
import { html as ExampleHTML } from "../../public/generated/examples/CollapsiblePanels.json";
import { html as ExampleCollapsedByDefaultHTML } from "../../public/generated/examples/CollapsiblePanelsCollapsedByDefault.json";
import { html as ExampleWithCollapsedSizeHTML } from "../../public/generated/examples/CollapsiblePanelsCollapsedSize.json";
import { Group } from "../components/styled-panels/Group";
import { Panel } from "../components/styled-panels/Panel";
Expand Down Expand Up @@ -48,6 +49,25 @@ export default function CollapsiblePanelsRoute() {
<Callout intent="primary">
A panel's collapse threshold is half its minimum size.
</Callout>
<div>
Collapsible panels can also be collapsed by default by setting their{" "}
<code>defaultSize</code> to 0 (pixels or percent).
</div>
<Code html={ExampleCollapsedByDefaultHTML} />
<Group>
<Panel
collapsible
defaultSize={0}
maxSize="75%"
minSize="10%"
showSizeAsPercentage
/>
<Separator />
<Panel>
The panel on the left is collapsed by default but can be expanded by
dragging the separator.
</Panel>
</Group>
</Box>
);
}
10 changes: 10 additions & 0 deletions src/routes/examples/CollapsiblePanelsCollapsedByDefault.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Group, Panel, Separator } from "react-resizable-panels";

// <begin>

/* prettier-ignore */
<Group>
<Panel collapsible defaultSize="0%" minSize="10%" />
<Separator />
<Panel />
</Group>
Loading