-
-
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
Set div css flex-basis, PanelResizeHandle Slow #128
Comments
I don't know what you're reporting here. If it's a bug or a performance issue, you'll need to share a repro (like Code Sandbox or something) not just a picture. |
Sorry. It's still not clear to me why you want to do this. Flex basis and grow are meant to be managed by this library. Overriding those styles will cause problems. |
@bvaughn |
So this essentially boils down to your wanting support for min/max sizes in pixels? That's something I've consciously chosen not to support with this library. (See #114, #46, #47, #78) I'm going to copy-paste my response form one of those other issues showing how you could tackle your own pixel constraints (if you want to do that) but I don't think you should use 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:
|
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)
Whether it can be supported or not can be accelerated by adjusting the number of steps.
The text was updated successfully, but these errors were encountered: