-
-
Notifications
You must be signed in to change notification settings - Fork 144
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support for minimum pixel width panels? #114
Comments
It's come up a few times 😅 #46, #47, #78 Here is a way you could basically implement this in your application code:
const MIN_SIZE_IN_PIXELS = 100;
const [minSize, setMinSize] = useState(10);
useLayoutEffect(() => {
const panelGroup = document.querySelector('[data-panel-group-id="group"]');
const resizeHandles = document.querySelectorAll(
"[data-panel-resize-handle-id]"
);
const observer = new ResizeObserver(() => {
let height = panelGroup.offsetHeight;
resizeHandles.forEach((resizeHandle) => {
height -= resizeHandle.offsetHeight;
});
// Minimum size in pixels is a percentage of the PanelGroup's height,
// less the (fixed) height of the resize handles.
setMinSize((MIN_SIZE_IN_PIXELS / height) * 100);
});
observer.observe(panelGroup);
resizeHandles.forEach((resizeHandle) => {
observer.observe(resizeHandle);
});
return () => {
observer.disconnect();
};
}, []); Here my reasoning for not wanting to add it to the NPM package directly:
|
Apologies! Should have used search 😶 but appreciate the context here, ty! |
@bvaughn Thanks for the great library. It's easy to use and elegant. However, this one limitation that many people asked you, we can't set a fixed pixel width or height for the first or last panel. In many panel designs, the first panel (or last) is often fixed and doesn't grow with window resizing, and only the next panels do. For example, in Chrome Dev Tools' Sources tab, only the first panel grows on browser resize. Looking at your code, I see that you're using flex grow for panel sizes. If we want a fixed pixel size for panel 1, you could set its flex grow to 0 and flex basis to '300px' (or any other pixels size). The rest of the panels could then have the same flex grow but minus 300px for the first panel. This could work well for many cases. Thanks again for your work. I hope this suggestion helps to implement this feature. BTW: solution here does not work |
I think I have a possible solution for the pixel-based constraints; see #176 ❤️ → ☕ givebrian.coffee |
Relates to issues #46, #47, #51, #78, #114, #128, #141 This PR adds a new prop (`units`) to `PanelGroup`. This prop defaults to "percentage" but can be set to "pixels" for static, pixel based layout constraints. This can be used to add enable pixel-based min/max and default size values, e.g.: ```tsx <PanelGroup direction="horizontal" units="pixels"> {/* Will be constrained to 100-200 pixels (assuming group is large enough to permit this) */} <Panel minSize={100} maxSize={200} /> <PanelResizeHandle /> <Panel /> <PanelResizeHandle /> <Panel /> </PanelGroup> ``` Imperative API methods are also able to work with either pixels or percentages now. They default to whatever units the group has been configured to use, but can be overridden with an additional, optional parameter, e.g. ```ts panelRef.resize(100, "pixels"); panelGroupRef.setLayout([25, 50, 25], "percentages"); // Works for getters too, e.g. const percentage = panelRef.getSize("percentages"); const pixels = panelRef.getSize("pixels"); const layout = panelGroupRef.getLayout("pixels"); ``` See the docs for more: [.../examples/pixel-based-layouts](https://react-resizable-panels-git-panelgroup-layout-val-2424f0-bvaughn.vercel.app/examples/pixel-based-layouts)
Hey there, I'm curious if you have considered adding support for pixel-based min/max values on the
Panel
component?We have a use case where it would be nice to have a panel that maintains a minimum fixed width in pixels so that it is still usable when the screen becomes quite small. VSCode has a somewhat similar behavior where the primary side bar is fixed width while the editor panel is fluid when resizing the window:
There are probably many edges I'm not considering here or maybe there is a way to do this today - curious to get your thoughts regardless.
The text was updated successfully, but these errors were encountered: