Grid.tsx 2.3 Ko
Télécharger le fichier
import { CSSProperties, FC, useMemo } from 'react';
import { Base, BaseProps } from './Base';
import { GridContextProvider } from './GridContext';
import { AlignItemType, AlignSelfType, JustifyContentType, SpacingType } from './types';
export interface GridProps extends BaseProps<HTMLDivElement> {
inline?: boolean;
gap?: SpacingType;
maxContent?: boolean;
columnCount?: number;
center?: boolean;
alignSelf?: AlignSelfType;
alignItems?: AlignItemType;
justifyContent?: JustifyContentType;
}
export const Grid: FC<GridProps> = (props) => {
const {
inline = false,
gap = 2,
maxContent = false,
columnCount = 0,
center = false,
alignSelf = null,
alignItems = null,
justifyContent = null,
fullHeight = true,
classNames = [],
style = {},
...rest
} = props;
const getClassNames = useMemo(() => {
const newClassNames: string[] = [];
if (inline) newClassNames.push('inline-grid');
else newClassNames.push('grid grid-rows-[repeat(var(--bs-rows,1),1fr)] grid-cols-[repeat(var(--bs-columns,12),1fr)]');
if (gap) newClassNames.push('gap-' + gap);
else if (gap === 0) newClassNames.push('gap-0');
if (maxContent) newClassNames.push('basis-[max-content]');
if (alignSelf) newClassNames.push('self-' + alignSelf);
if (alignItems) newClassNames.push('items-' + alignItems);
if (justifyContent) newClassNames.push('justify-' + justifyContent);
if (!alignItems && !justifyContent && center) newClassNames.push('items-center', 'justify-center');
if (classNames.length) newClassNames.push(...classNames);
return newClassNames;
}, [inline, gap, maxContent, alignSelf, alignItems, justifyContent, center, classNames]);
const getStyle = useMemo(() => {
let newStyle: CSSProperties = {};
if (columnCount) newStyle['--bs-columns'] = columnCount.toString();
if (Object.keys(style).length) newStyle = { ...newStyle, ...style };
return newStyle;
}, [columnCount, style]);
return (
<GridContextProvider value={{ isCssGrid: true }}>
<Base classNames={getClassNames} fullHeight={fullHeight} style={getStyle} {...rest} />
</GridContextProvider>
);
};
