import React, {ReactNode, Children, createContext, useContext} from 'react' import {useStyle, cssRule} from '@karma.run/react' import {Spacing} from '../style/helpers' interface GridStyleProps { readonly spacing: Spacing } const GridStyle = cssRule(({spacing}) => ({ display: 'flex', flexWrap: 'wrap', margin: -spacing / 2 })) export interface GridProps { readonly children?: ReactNode readonly spacing?: Spacing } export function Grid({children, spacing = Spacing.Tiny}: GridProps) { const css = useStyle({spacing}) return (
{children}
) } interface ColumnStyleProps { readonly flexBasis: string readonly spacing: Spacing } const ColumnStyle = cssRule(({flexBasis, spacing}) => ({ _className: process.env.NODE_ENV !== 'production' ? 'Column' : undefined, overflow: 'hidden', display: 'flex', flexDirection: 'column', flexWrap: 'nowrap', flexBasis })) const ColumnItemStyle = cssRule(({spacing}) => ({ _className: process.env.NODE_ENV !== 'production' ? 'ColumnItem' : undefined, padding: spacing / 2 })) export interface GridColumnProp { readonly ratio?: number readonly children?: ReactNode } export function Column({ratio, children}: GridColumnProp) { const {spacing} = useContext(GridContext) const css = useStyle({ flexBasis: ratio ? `${ratio * 100}%` : '100%', spacing }) return (
{Children.map(children, child => (
{child}
))}
) } export interface GridContextState { readonly spacing: Spacing } export const GridContext = createContext({spacing: Spacing.None})