Skip to content

Commit e93ab85

Browse files
committed
feat: collapsed panes now retain minimum width and the overflow is hidden
1 parent 03cea10 commit e93ab85

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

src/components/Pane.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,40 +34,46 @@ const CollapseOverlay = styled.div`
3434
`;
3535
export interface PaneProps {
3636
size: number;
37-
37+
minSize: number;
3838
split: SplitType;
3939
className: string;
4040
isCollapsed: boolean;
4141
forwardRef: React.Ref<HTMLDivElement>;
4242
collapseOverlayCss?: React.CSSProperties;
43-
isSiblingCollapsed: boolean;
43+
collapsedIndices: number[];
4444
children: React.ReactNode;
4545
transitionTimeout: number | undefined;
4646
}
4747
export const Pane = React.memo(
4848
({
4949
size,
50+
minSize,
5051
isCollapsed,
5152
collapseOverlayCss = { background: 'rgba(220,220,220, 0.1)' },
5253
split,
5354
className,
54-
forwardRef,
5555
children,
56-
isSiblingCollapsed,
56+
forwardRef,
57+
collapsedIndices,
5758
transitionTimeout,
5859
}: PaneProps) => {
5960
const classes = useMergeClasses(['Pane', split, className]);
6061
const timeout = useMemo(() => transitionTimeout ?? DEFAULT_COLLAPSE_TRANSITION_TIMEOUT, [
6162
transitionTimeout,
6263
]);
63-
const [shouldAnimate, setShouldAnimate] = useState<boolean>(isCollapsed || isSiblingCollapsed);
64+
const [shouldAnimate, setShouldAnimate] = useState<boolean>(false);
6465
useEffect(() => {
6566
if (timeout !== 0) {
6667
setShouldAnimate(true);
6768
setTimeout(() => setShouldAnimate(false), 500);
6869
}
69-
}, [setShouldAnimate, isCollapsed, isSiblingCollapsed, timeout]);
70+
}, [setShouldAnimate, collapsedIndices, timeout]);
7071

72+
const minStyle = useMemo(
73+
() => (split === 'vertical' ? { minWidth: minSize } : { minHeight: minSize }),
74+
[minSize, split]
75+
);
76+
const wrappedChildren = <div style={minStyle}>{children}</div>;
7177
return (
7278
<StyledDiv
7379
isVertical={split === 'vertical'}
@@ -78,9 +84,9 @@ export const Pane = React.memo(
7884
timeout={timeout}
7985
>
8086
{isCollapsed ? (
81-
<CollapseOverlay style={collapseOverlayCss}>{children}</CollapseOverlay>
87+
<CollapseOverlay style={collapseOverlayCss}>{wrappedChildren}</CollapseOverlay>
8288
) : (
83-
children
89+
wrappedChildren
8490
)}
8591
</StyledDiv>
8692
);

src/components/SplitPane/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
22
import { Pane } from '../Pane';
33
import { CollapseOptions, Resizer, ResizerOptions } from '../Resizer';
44
import { useSplitPaneResize } from './hooks/useSplitPaneResize';
5-
import { convertCollapseSizesToIndices, Wrapper } from './helpers';
5+
import { convertCollapseSizesToIndices, getMinSize, Wrapper } from './helpers';
66
import { useMergeClasses } from '../../hooks/useMergeClasses';
77
import { useIsCollapseReversed } from './hooks/memos/useIsCollapseReversed';
88
import { useToggleCollapse } from './hooks/callbacks/useToggleCollapse';
@@ -84,6 +84,7 @@ export const SplitPane = ({ className = '', direction = 'ltr', ...props }: Split
8484
isCollapsed={getIsPaneCollapsed(paneIndex)}
8585
collapsedIndices={collapsedIndices}
8686
split={props.split}
87+
minSize={getMinSize(paneIndex, props.minSizes)}
8788
className={className}
8889
transitionTimeout={props.collapseOptions?.collapseTransitionTimeout}
8990
collapseOverlayCss={props.collapseOptions?.overlayCss}

0 commit comments

Comments
 (0)