/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ import React, {CSSProperties, forwardRef} from 'react'; import styled from '@emotion/styled'; import { normalizePadding, normalizeSpace, PaddingProps, Spacing, theme, } from './theme'; import type {SplitLayoutProps} from './Layout'; import {Sidebar} from './Sidebar'; const Empty = styled.div({width: 0, height: 0}); export function renderSplitLayout( props: SplitLayoutProps, direction: 'column' | 'row', grow: 1 | 2, ) { let [child1, child2] = props.children; // prevent some children to be accidentally omitted if the primary one is `null` if (!child1) { child1 = ; } if (!child2) { child2 = ; } if ('resizable' in props && props.resizable) { const {width, height, minHeight, minWidth, maxHeight, maxWidth} = props as any; const sizeProps = direction === 'column' ? ({ minHeight, height: height ?? 300, maxHeight, } as const) : ({ minWidth, width: width ?? 300, maxWidth, } as const); if (grow === 2) { child1 = ( {child1} ); } else { child2 = ( {child2} ); } } return ( {child1} {child2} ); } const SandySplitContainer = styled.div<{ grow: 1 | 2; gap?: Spacing; center?: boolean; flexDirection: CSSProperties['flexDirection']; }>((props) => ({ boxSizing: 'border-box', display: 'flex', flex: `1 1 0`, flexDirection: props.flexDirection, alignItems: props.center ? 'center' : 'stretch', gap: normalizeSpace(props.gap, theme.space.small), overflow: props.center ? undefined : 'hidden', // only use overflow hidden in container mode, to avoid weird resizing issues '>:nth-child(1)': { flex: props.grow === 1 ? splitGrowStyle : splitFixedStyle, minWidth: props.grow === 1 ? 0 : undefined, }, '>:nth-child(2)': { flex: props.grow === 2 ? splitGrowStyle : splitFixedStyle, minWidth: props.grow === 2 ? 0 : undefined, }, })); const splitFixedStyle = `0 0 auto`; const splitGrowStyle = `1 0 0`;