import * as React from 'react'; export default { title: 'Components/Grid', }; type FilterString = S extends T ? never : S; type Split = string extends S ? string[] : S extends '' ? [] : S extends `${infer T}${D}${infer U}` ? [T, ...Split] : [S]; function useGridTemplate(template: T) { type SplitLines = Split[number]; type WithoutFourSpace = Split[number]; type WithoutTripleSpace = Split[number]; type WithoutDoubleSpace = Split[number]; type SplitTokens = Split[number]; type AreaName = FilterString; const RootComponentRef = React.useRef( ({ style, columns, rows, ...props }: React.ComponentProps<'div'> & { columns?: React.CSSProperties['gridTemplateColumns']; rows?: React.CSSProperties['gridTemplateRows']; }) => { return (
`"${area}"`) .join('\n'), }} /> ); }, ); const ItemComponentRef = React.useRef( React.forwardRef(function ItemComponentRef( { style, area, ...props }: { area: AreaName } & React.ComponentProps<'div'>, ref?: React.Ref, ) { return
; }), ); const Resizer = React.useRef( ({ style, area, onResize, dimension, onResizeFinished, ...props }: { area: AreaName; dimension: 'horizontal' | 'vertical'; onResize: (amount: number) => void; onResizeFinished?: () => void; } & React.ComponentProps<'div'>) => { return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions
); }, ); return { Root: RootComponentRef.current, Item: ItemComponentRef.current, Resizer: Resizer.current, }; } export const DescriptUI = () => { const scriptRef = React.useRef(null); const timelineRef = React.useRef(null); const [scriptSize, scriptSizeSet] = React.useState(700); const [timelineSize, timelineSizeSet] = React.useState(200); const Grid = useGridTemplate(` header header header header script scriptResize video properties timelineResize timelineResize timelineResize timelineResize timeline timeline timeline timeline `); return ( Header Script { scriptSizeSet((s) => s + amount); }} onResizeFinished={() => { if (!scriptRef.current) { return; } scriptSizeSet(scriptRef.current.clientWidth); }} /> Video Properties { timelineSizeSet((s) => s - amount); }} onResizeFinished={() => { if (!timelineRef.current) { return; } timelineSizeSet(timelineRef.current.clientHeight); }} /> Timeline ); };