From 67ba04eced5bc1b6d2ce9fdba0093a71ec33126c Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Mon, 21 Jul 2025 21:20:37 +0300 Subject: [PATCH] feat(web): Add grid component --- packages/web/.astro/types.d.ts | 1 - .../src/components/astro/HeroComponent.astro | 196 ++--------- packages/web/src/components/solidjs/Stack.tsx | 6 +- .../src/components/solidjs/index.module.css | 316 +++++++++++++++--- packages/web/src/components/solidjs/index.ts | 1 + packages/web/src/pages/index.astro | 27 +- 6 files changed, 306 insertions(+), 241 deletions(-) diff --git a/packages/web/.astro/types.d.ts b/packages/web/.astro/types.d.ts index 03d7cc43..f964fe0c 100644 --- a/packages/web/.astro/types.d.ts +++ b/packages/web/.astro/types.d.ts @@ -1,2 +1 @@ /// -/// \ No newline at end of file diff --git a/packages/web/src/components/astro/HeroComponent.astro b/packages/web/src/components/astro/HeroComponent.astro index 329f93fc..96884d9b 100644 --- a/packages/web/src/components/astro/HeroComponent.astro +++ b/packages/web/src/components/astro/HeroComponent.astro @@ -1,173 +1,41 @@ --- -import { Stack } from "../solidjs/index.ts"; +import { Stack, Grid } from "../solidjs/index.ts"; --- -
- - -
- -
-
-
-
-
-
-
-
-
-
- +
+ +
+ diff --git a/packages/web/src/components/solidjs/Stack.tsx b/packages/web/src/components/solidjs/Stack.tsx index 4d78e58a..1c236433 100644 --- a/packages/web/src/components/solidjs/Stack.tsx +++ b/packages/web/src/components/solidjs/Stack.tsx @@ -5,8 +5,9 @@ export interface StackProps { stackFlex?: string; stackDirection?: "column" | "row" | "row-reverse" | "column-reverse"; stackAlign?: "start" | "end" | "center" | "stretch" | "baseline"; - stackJustify?: "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly"; + stackJustify?: "center" | "space-between" | "space-around" | "space-evenly" | "flex-start" | "flex-end"; stackPadding?: string; + stackGap?: string; smStackGap?: string; mdStackGap?: string; lgStackGap?: string; @@ -37,6 +38,7 @@ const defaultProps: Omit = { stackAlign: "stretch", stackJustify: "center", stackPadding: "0px", + stackGap: "16px", smStackGap: "16px", mdStackGap: "24px", lgStackGap: "24px", @@ -66,6 +68,7 @@ export function Stack(props: StackProps) { "stackAlign", "stackJustify", "stackPadding", + "stackGap", "smStackGap", "mdStackGap", "lgStackGap", @@ -95,6 +98,7 @@ export function Stack(props: StackProps) { "--stack-direction": local.stackDirection, "--stack-align": local.stackAlign, "--stack-justify": local.stackJustify, + "--stack-gap": local.stackGap, "--stack-padding": local.stackPadding, "--sm-stack-gap": local.smStackGap, "--md-stack-gap": local.mdStackGap, diff --git a/packages/web/src/components/solidjs/index.module.css b/packages/web/src/components/solidjs/index.module.css index 48d2b50c..7b30808d 100644 --- a/packages/web/src/components/solidjs/index.module.css +++ b/packages/web/src/components/solidjs/index.module.css @@ -33,60 +33,278 @@ @media screen and (min-width: 961px) and (max-width: 1200px) { .stack { - --stack-direction: var( - --lg-stack-direction, - var(--md-stack-direction, var(--sm-stack-direction)) - ); - --stack-align: var( - --lg-stack-align, - var(--md-stack-align, var(--sm-stack-align)) - ); - --stack-justify: var( - --lg-stack-justify, - var(--md-stack-justify, var(--sm-stack-justify)) - ); - --stack-padding: var( - --lg-stack-padding, - var(--md-stack-padding, var(--sm-stack-padding)) - ); - --stack-gap: var( - --lg-stack-gap, - var(--md-stack-gap, var(--sm-stack-gap)) - ); + --stack-direction: var(--lg-stack-direction, + var(--md-stack-direction, var(--sm-stack-direction))); + --stack-align: var(--lg-stack-align, + var(--md-stack-align, var(--sm-stack-align))); + --stack-justify: var(--lg-stack-justify, + var(--md-stack-justify, var(--sm-stack-justify))); + --stack-padding: var(--lg-stack-padding, + var(--md-stack-padding, var(--sm-stack-padding))); + --stack-gap: var(--lg-stack-gap, + var(--md-stack-gap, var(--sm-stack-gap))); } } @media screen and (min-width: 1201px) { .stack { - --stack-direction: var( - --xl-stack-direction, - var( - --lg-stack-direction, - var(--md-stack-direction, var(--sm-stack-direction)) - ) - ); - --stack-align: var( - --xl-stack-align, - var(--lg-stack-align, var(--md-stack-align, var(--sm-stack-align))) - ); - --stack-justify: var( - --xl-stack-justify, - var( - --lg-stack-justify, - var(--md-stack-justify, var(--sm-stack-justify)) - ) - ); - --stack-padding: var( - --xl-stack-padding, - var( - --lg-stack-padding, - var(--md-stack-padding, var(--sm-stack-padding)) - ) - ); - --stack-gap: var( - --xl-stack-gap, - var(--lg-stack-gap, var(--md-stack-gap, var(--sm-stack-gap))) - ); + --stack-direction: var(--xl-stack-direction, + var(--lg-stack-direction, + var(--md-stack-direction, var(--sm-stack-direction)))); + --stack-align: var(--xl-stack-align, + var(--lg-stack-align, var(--md-stack-align, var(--sm-stack-align)))); + --stack-justify: var(--xl-stack-justify, + var(--lg-stack-justify, + var(--md-stack-justify, var(--sm-stack-justify)))); + --stack-padding: var(--xl-stack-padding, + var(--lg-stack-padding, + var(--md-stack-padding, var(--sm-stack-padding)))); + --stack-gap: var(--xl-stack-gap, + var(--lg-stack-gap, var(--md-stack-gap, var(--sm-stack-gap)))); } } +.dark .grid_system { + --guide-color: var(--color-gray-200); +} + +.grid_system { + --max-width: 1080px; + --min-width: 368px; + --guide-width: 1px; + --horizontal-margin: 2rem; + --grid-system-width: 100vw; + --guide-color: var(--color-gray-400); + --cross-color: var(--color-gray-600); + display: flex; + position: relative; + flex-direction: column; + max-width: var(--max-width); + min-width: var(--min-width); + margin-top: var(--guide-width); + border-bottom: var(--guide-width) solid var(--guide-color); + margin-left: var(--guide-width); +} + +.grid_system::before { + position: absolute; + inset: 0; + left: calc(-1 * var(--guide-width)); + top: calc(-1 * var(--guide-width)); + content: ""; + border: var(--guide-width) solid var(--guide-color); + pointer-events: none; +} + +.grid_grid { + --width: clamp(calc(var(--min-width) - var(--guide-width)), calc(var(--grid-system-width) - var(--guide-width) - (var(--horizontal-margin) * 2)), calc(var(--max-width) - var(--guide-width))); + width: var(--width); + height: var(--height); + display: grid; + position: relative; + --column-width: calc(var(--width) / var(--grid-cols)); + --row-height: calc(var(--height) / var(--grid-rows)); + grid-template-columns: repeat(var(--grid-cols), var(--column-width)); + grid-template-rows: repeat(var(--grid-rows), var(--row-height)); +} + +.grid_cross { + width: -moz-fit-content; + width: fit-content; + height: -moz-fit-content; + height: fit-content; + pointer-events: none; + position: absolute; + grid-column-start: var(--cross-column); + grid-row-start: var(--cross-row); + z-index: 2; + --cross-size: 21px; + --cross-half-size: calc((var(--cross-size) / 2) + var(--guide-width) - 0.5px); + inset: calc(var(--cross-half-size) * -1); +} + +.grid_crossLine { + position: absolute; + border: var(--guide-width) solid var(--cross-color); + border-width: 0; +} + +.grid_gridGuides { + pointer-events: none; + z-index: 1; + display: contents; +} + +.grid_gridGuide { + inset: 0; + position: absolute; + grid-column-start: var(--x); + grid-row-start: var(--y); + grid-column-end: span 1; + grid-row-end: span 1; + border: var(--guide-width) solid var(--guide-color); + border-left: none; + border-top: none; +} + +@media screen and (max-width: 400px) { + .grid_system { + --horizontal-margin: 1rem + } + + .grid_grid { + --height: var(--xs-height, var(--sm-height)); + --grid-rows: var(--xs-grid-rows, var(--sm-grid-rows)); + --grid-cols: var(--xs-grid-cols, var(--sm-grid-cols)); + --cell-padding: 24px; + --grid-divider-gap: calc(72px - var(--cell-padding)) + } + + .grid_block { + --grid-row: var(--xs-grid-row, var(--sm-grid-row)); + --grid-column: var(--xs-grid-column, var(--sm-grid-column)); + --block-display: var(--xs-block-display, var(--sm-block-display)); + --cell-rows: var(--xs-cell-rows, var(--sm-cell-rows)); + --cell-columns: var(--xs-cell-columns, var(--sm-cell-columns)) + } + + .grid_cross { + --cross-size: 11px; + --cross-row: var(--xs-cross-row, var(--sm-cross-row)); + --cross-column: var(--xs-cross-column, var(--sm-cross-column)) + } + + .grid_lgGuide, + .grid_mdGuide, + .grid_smGuide, + .grid_smdGuide { + display: none + } +} + +@media screen and (min-width: 401px) and (max-width:600px) { + .grid_system { + --horizontal-margin: 1rem + } + + .grid_grid { + --height: var(--sm-height); + --grid-rows: var(--sm-grid-rows); + --grid-cols: var(--sm-grid-cols); + --cell-padding: 24px; + --grid-divider-gap: calc(72px - var(--cell-padding)) + } + + .grid_block { + --grid-row: var(--sm-grid-row); + --grid-column: var(--sm-grid-column); + --cell-rows: var(--sm-cell-rows); + --cell-columns: var(--sm-cell-columns); + --block-display: var(--sm-block-display) + } + + .grid_cross { + --cross-size: 11px; + --cross-row: var(--sm-cross-row); + --cross-column: var(--sm-cross-column) + } + + .grid_lgGuide, + .grid_mdGuide, + .grid_smdGuide, + .grid_xsGuide { + display: none + } +} + +@media screen and (min-width: 601px) and (max-width:768px) { + .grid_grid { + --height: var(--smd-height, var(--md-height, var(--sm-height))); + --grid-rows: var(--smd-grid-rows, var(--md-grid-rows, var(--sm-grid-rows))); + --grid-cols: var(--smd-grid-cols, var(--md-grid-cols, var(--sm-grid-cols))); + --cell-padding: 40px; + --grid-divider-gap: calc(120px - var(--cell-padding)) + } + + .grid_block { + --grid-row: var(--smd-grid-row, var(--md-grid-row, var(--sm-grid-row))); + --grid-column: var(--smd-grid-column, var(--md-grid-column, var(--sm-grid-column))); + --cell-rows: var(--smd-cell-rows, var(--md-cell-rows, var(--sm-cell-rows))); + --cell-columns: var(--smd-cell-columns, var(--md-cell-columns, var(--sm-cell-columns))); + --block-display: var(--smd-block-display) + } + + .grid_cross { + --cross-size: 15px; + --cross-row: var(--smd-cross-row, var(--md-cross-row, var(--sm-cross-row))); + --cross-column: var(--smd-cross-column, var(--md-cross-column, var(--sm-cross-column))) + } + + .grid_lgGuide, + .grid_mdGuide, + .grid_smGuide, + .grid_xsGuide { + display: none + } +} + +@media screen and (min-width: 769px) and (max-width:960px) { + .grid_grid { + --height: var(--md-height, var(--smd-height, var(--sm-height))); + --grid-rows: var(--md-grid-rows, var(--smd-grid-rows, var(--sm-grid-rows))); + --grid-cols: var(--md-grid-cols, var(--smd-grid-cols, var(--sm-grid-cols))); + --cell-padding: 40px; + --grid-divider-gap: calc(140px - var(--cell-padding)) + } + + .grid_block { + --grid-row: var(--md-grid-row, var(--smd-grid-row, var(--sm-grid-row))); + --grid-column: var(--md-grid-column, var(--smd-grid-column, var(--sm-grid-column))); + --cell-rows: var(--md-cell-rows, var(--smd-cell-rows, var(--sm-cell-rows))); + --cell-columns: var(--md-cell-columns, var(--smd-cell-columns, var(--sm-cell-columns))); + --block-display: var(--md-block-display, var(--smd-block-display)) + } + + .grid_cross { + --cross-size: 15px; + --cross-row: var(--md-cross-row, var(--smd-cross-row, var(--sm-cross-row))); + --cross-column: var(--md-cross-column, var(--smd-cross-column, var(--sm-cross-column))) + } + + .grid_lgGuide, + .grid_smGuide, + .grid_smdGuide, + .grid_xsGuide { + display: none + } +} + +@media screen and (min-width: 961px) { + .grid_grid { + --height: var(--lg-height, var(--md-height, var(--smd-height, var(--sm-height)))); + --grid-rows: var(--lg-grid-rows, var(--md-grid-rows, var(--smd-grid-rows, var(--sm-grid-rows)))); + --grid-cols: var(--lg-grid-cols, var(--md-grid-cols, var(--smd-grid-cols, var(--sm-grid-cols)))); + --cell-padding: 48px; + --grid-divider-gap: calc(140px - var(--cell-padding)) + } + + .grid_block { + --grid-row: var(--lg-grid-row, var(--md-grid-row, var(--smd-grid-row, var(--sm-grid-row)))); + --grid-column: var(--lg-grid-column, var(--md-grid-column, var(--smd-grid-column, var(--sm-grid-column)))); + --cell-rows: var(--lg-cell-rows, var(--md-cell-rows, var(--smd-cell-rows, var(--sm-cell-rows)))); + --cell-columns: var(--lg-cell-columns, var(--md-cell-columns, var(--smd-cell-columns, var(--sm-cell-columns)))); + --block-display: var(--smd-block-display) + } + + .grid_cross { + --cross-row: var(--lg-cross-row, var(--md-cross-row, var(--smd-cross-row, var(--sm-cross-row)))); + --cross-column: var(--lg-cross-column, var(--md-cross-column, var(--smd-cross-column, var(--sm-cross-column)))); + } + + .grid_mdGuide, + .grid_smGuide, + .grid_smdGuide, + .grid_xsGuide { + display: none + } +} diff --git a/packages/web/src/components/solidjs/index.ts b/packages/web/src/components/solidjs/index.ts index ca947f63..71772c58 100644 --- a/packages/web/src/components/solidjs/index.ts +++ b/packages/web/src/components/solidjs/index.ts @@ -1 +1,2 @@ export * from "./Stack" +export * from "./Grid" diff --git a/packages/web/src/pages/index.astro b/packages/web/src/pages/index.astro index 740670ce..d2d53cb4 100644 --- a/packages/web/src/pages/index.astro +++ b/packages/web/src/pages/index.astro @@ -5,31 +5,6 @@ import HeroComponent from "../components/astro/HeroComponent.astro";
-
-
- - - -
-
+