From 7ebf0644f12a4f439c07e4b98ee92763da39eaa3 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 22 Jul 2025 15:53:38 +0300 Subject: [PATCH] feat(web): Add Grid component --- packages/web/src/components/solidjs/Grid.tsx | 192 +++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 packages/web/src/components/solidjs/Grid.tsx diff --git a/packages/web/src/components/solidjs/Grid.tsx b/packages/web/src/components/solidjs/Grid.tsx new file mode 100644 index 00000000..58f0dc00 --- /dev/null +++ b/packages/web/src/components/solidjs/Grid.tsx @@ -0,0 +1,192 @@ +import { splitProps, For } from "solid-js"; +import type { ParentProps, JSX } from 'solid-js'; +import styles from "./index.module.css"; + +export interface GridRootProps { + gridRows?: number; + smGridColumns?: number; + mdGridColumns?: number; + lgGridColumns?: number; + smHeight?: string; + heroHeading?: boolean; + class?: string; + style?: JSX.CSSProperties; +} + +const defaultProps: GridRootProps = { + gridRows: 1, + lgGridColumns: 1, + mdGridColumns: 1, + heroHeading: false, + smHeight: "calc(var(--width) / var(--grid-cols) * var(--grid-rows))", + smGridColumns: 1, +} + +export function Root(props: ParentProps) { + const [local, others] = splitProps({ ...defaultProps, ...props }, [ + "gridRows", + "smGridColumns", + "mdGridColumns", + "lgGridColumns", + "smHeight", + "heroHeading", + "class", + "style", + "children" + ]); + + const styleVars: Record = { + ...(local.smHeight && { "--sm-height": local.smHeight }), + ...(local.smGridColumns && { "--sm-grid-cols": local.smGridColumns.toString() }), + ...(local.mdGridColumns && { "--md-grid-cols": local.mdGridColumns.toString() }), + ...(local.lgGridColumns && { "--lg-grid-cols": local.lgGridColumns.toString() }), + ...(local.gridRows && { "--grid-rows": local.gridRows.toString() }), + } + + const styleStr = Object.entries({ ...styleVars, ...local.style }) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => `${k}: ${v}`) + .join("; "); + + + return ( +
+ {local.children} +
+ + {(_, rowIndex) => ( + + {(_, colIndex) => ( +
1 && rowIndex() < (local.gridRows || 1) - 1) && { + "border-bottom-width": "var(--guide-width)" + }) + }} + /> + )} + + )} + +
+
+ + {(_, rowIndex) => ( + + {(_, colIndex) => ( +
1 && rowIndex() < (local.gridRows || 1) - 1) && { + "border-bottom-width": "var(--guide-width)" + }) + }} + /> + )} + + )} + +
+
+ + {(_, rowIndex) => ( + + {(_, colIndex) => ( +
1 && rowIndex() < (local.gridRows || 1) - 1) && { + "border-bottom-width": "var(--guide-width)" + }) + }} + /> + )} + + )} + +
+
+ + {(_, rowIndex) => ( + + {(_, colIndex) => ( +
1 && rowIndex() < (local.gridRows || 1) - 1) && { + "border-bottom-width": "var(--guide-width)" + }) + }} + /> + )} + + )} + +
+
+ + {(_, rowIndex) => ( + + {(_, colIndex) => ( +
1 && rowIndex() < (local.gridRows || 1) - 1) && { + "border-bottom-width": "var(--guide-width)" + }) + }} + /> + )} + + )} + +
+
+ ); +} + +interface GridCrossProps { + crossRow: number; + crossColumn: number; +} + +export function Cross(props: GridCrossProps) { + return ( +
+
+
+
+ ) +} + +export default { Cross, Root }