@mastors/gridder
Complete CSS Grid utility class system for the Mastors Framework
@mastors/gridder is the dedicated CSS Grid package of the Mastors Framework. It provides
a complete suite of utility classes, SCSS mixins, and named-area layout presets to build any grid layout
without writing custom CSS. The package plugs into @mastors/core
for its class-generation engine and responsive breakpoint system.
12-column system
Full 1–12 column & 1–6 row track classes
Fully responsive
Breakpoint-prefixed variants: sm, md, lg, xl, 2xl
4 powerful mixins
grid-container, grid-item, gridder, gridder-areas
Quick Start
The fastest way to get a grid going — just add classes to your HTML.
<div class="grid grid-cols-3 gap-4">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
Installation
Install the package inside a Mastors monorepo workspace or as a standalone npm dependency.
npm install @mastors/gridder
Import in your SCSS entry point:
// Full utility + responsive layer
@use "@mastors/gridder";
// Or target just the mixins
@use "@mastors/gridder/scss/mixins/grid-container" as gc;
Or link the pre-built CSS directly:
<link rel="stylesheet" href="node_modules/@mastors/gridder/dist/mastors-gridder.css" />
@mastors/core ≥1.0.0 is required for the class-generation engine and gap utilities. Sass ≥1.80.0 is required when using the SCSS source.
grid-container()
Configure a complete CSS Grid layout in a single mixin call. All parameters are optional and default to sensible values.
File: scss/mixins/_grid-container.scss
@mixin grid-container(
$cols: null, // grid-template-columns value
$rows: null, // grid-template-rows value
$gap: null, // shorthand gap (row + column)
$col-gap: null, // column-gap only
$row-gap: null, // row-gap only
$flow: row, // grid-auto-flow (default: row)
$auto-cols: null, // grid-auto-columns
$auto-rows: null, // grid-auto-rows
$inline: false // true → display: inline-grid
)
@use "@mastors/gridder/scss/mixins/grid-container" as gc;
.my-layout {
@include gc.grid-container(
$cols: repeat(3, minmax(0, 1fr)),
$gap: 1.5rem,
$flow: row
);
}
// Inline grid with fixed columns and row gap only
.card-row {
@include gc.grid-container(
$cols: repeat(4, 200px),
$row-gap: 1rem,
$inline: true
);
}
grid-item()
Place a grid item using span and optional start position. Applied to child elements of a grid container.
@mixin grid-item(
$col-span: null, // columns to span
$row-span: null, // rows to span
$col-start: null, // explicit column start line
$row-start: null // explicit row start line
)
@use "@mastors/gridder/scss/mixins/grid-container" as gc;
.feature-card {
@include gc.grid-item($col-span: 2, $row-span: 1);
}
// Start at column 3, span 2 columns
.hero-block {
@include gc.grid-item($col-span: 2, $col-start: 3);
}
gridder()
Place a grid item using a named grid area or explicit row/column line placement. Optionally controls self-alignment.
@mixin gridder(
$area, // row-start (named area) OR row-start line number
$col-start: null, // column-start line (triggers explicit mode)
$row-end: null, // row-end line
$col-end: null, // column-end line
$align: null, // align-self value
$justify: null // justify-self value
)
$area is supplied, the mixin emits grid-area: <name> (named area mode). When any of $col-start, $row-end, or $col-end are supplied, it emits the full grid-area: row-start / col-start / row-end / col-end shorthand (explicit line mode).
@use "@mastors/gridder/scss/mixins/grid-container" as gc;
.page { @include gc.grid-container($cols: 1fr 3fr, $rows: auto 1fr auto); }
.page__header { @include gc.gridder(header); }
.page__sidebar { @include gc.gridder(sidebar, $align: start); }
.page__main { @include gc.gridder(main); }
.page__footer { @include gc.gridder(footer); }
// Places item from row-line 1 → 3, col-line 2 → 4
.hero {
@include gc.gridder(1, $col-start: 2, $row-end: 3, $col-end: 4);
// Outputs: grid-area: 1 / 2 / 3 / 4;
}
gridder-areas()
Emit grid-template-areas from a variadic list of quoted row strings — one string per row, space-separated area names within each string.
@mixin gridder-areas($rows...)
// Each $row is a quoted string of space-separated area names
@use "@mastors/gridder/scss/mixins/grid-container" as gc;
.app-layout {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: auto 1fr auto;
@include gc.gridder-areas(
"header header",
"sidebar main",
"footer footer"
);
}
// Children
.app-header { @include gc.gridder(header); }
.app-sidebar { @include gc.gridder(sidebar); }
.app-main { @include gc.gridder(main); }
.app-footer { @include gc.gridder(footer); }
Display
Switch an element into a grid formatting context.
| Class | CSS Output | Responsive |
|---|---|---|
| .grid | display: grid | Yes |
| .inline-grid | display: inline-grid | Yes |
<div class="grid grid-cols-2 gap-4">...</div>
<span class="inline-grid grid-cols-2 gap-2">...</span>
Template Columns
Set grid-template-columns. Fixed counts use equal minmax(0, 1fr) tracks.
| Class | CSS Output | Responsive |
|---|---|---|
| .grid-cols-1 … .grid-cols-12 | repeat(N, minmax(0, 1fr)) | Yes |
| .grid-cols-none | none | Yes |
| .grid-cols-subgrid | subgrid | No |
| .grid-cols-auto | auto | No |
| .grid-cols-min | min-content | No |
| .grid-cols-max | max-content | No |
| .grid-cols-fr | minmax(0, 1fr) | No |
<!-- 4 equal columns -->
<div class="grid grid-cols-4 gap-3">
<div>A</div><div>B</div><div>C</div><div>D</div>
</div>
<!-- Responsive: 1 col on mobile, 3 on md+ -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">...</div>
Template Rows
Set grid-template-rows. Fixed counts 1–6 use equal minmax(0, 1fr) tracks.
| Class | CSS Output | Responsive |
|---|---|---|
| .grid-rows-1 … .grid-rows-6 | repeat(N, minmax(0, 1fr)) | Yes |
| .grid-rows-none | none | Yes |
| .grid-rows-subgrid | subgrid | No |
| .grid-rows-auto | auto | No |
| .grid-rows-min | min-content | No |
| .grid-rows-max | max-content | No |
| .grid-rows-fr | minmax(0, 1fr) | No |
<!-- 3 equal rows, items fill columns automatically -->
<div class="grid grid-cols-2 grid-rows-3 gap-3" style="height:200px">
<div>1</div><div>2</div>
<div>3</div><div>4</div>
<div>5</div><div>6</div>
</div>
Template Areas
Named area utility classes and layout presets. Area names cannot be generated atomically, so Gridder provides common placement classes and three ready-to-use layout presets.
Area Placement Classes
| Class | CSS Output |
|---|---|
| .area-header | grid-area: header |
| .area-nav | grid-area: nav |
| .area-sidebar | grid-area: sidebar |
| .area-main | grid-area: main |
| .area-aside | grid-area: aside |
| .area-footer | grid-area: footer |
SCSS Mixins for Custom Areas
@use "@mastors/gridder/scss/utilities/grid-template-areas" as areas;
.page-layout {
display: grid;
grid-template-columns: 200px 1fr 200px;
// define-areas() sets grid-template-areas
@include areas.define-areas(
"header header header",
"nav main aside",
"footer footer footer"
);
}
.page-nav { @include areas.area(nav); }
.page-main { @include areas.area(main); }
.page-aside { @include areas.area(aside); }
Column Shorthand
Set the grid-column shorthand directly on an item.
| Class | CSS Output |
|---|---|
| .grid-col-auto | grid-column: auto |
| .grid-col-1 … .grid-col-12 | grid-column: N |
<div class="grid grid-cols-3 gap-3">
<div class="grid-col-2">Placed at column 2</div>
<div class="grid-col-auto">Auto placed</div>
</div>
Row Shorthand
Set the grid-row shorthand directly on an item.
| Class | CSS Output |
|---|---|
| .grid-row-auto | grid-row: auto |
| .grid-row-1 … .grid-row-6 | grid-row: N |
Auto Flow
Control how the auto-placement algorithm places items using grid-auto-flow.
| Class | CSS Output | Responsive |
|---|---|---|
| .grid-flow-row | grid-auto-flow: row | Yes |
| .grid-flow-col | grid-auto-flow: column | Yes |
| .grid-flow-dense | grid-auto-flow: dense | Yes |
| .grid-flow-row-dense | grid-auto-flow: row dense | Yes |
| .grid-flow-col-dense | grid-auto-flow: column dense | Yes |
<!-- Column flow: items fill down before moving right -->
<div class="grid grid-cols-3 grid-flow-col gap-3">
<div>1</div><div>2</div><div>3</div>
</div>
Auto Columns & Auto Rows
Size implicitly created grid tracks with grid-auto-columns and grid-auto-rows.
Auto Columns — .auto-cols-*
| Class | Value |
|---|---|
| .auto-cols-auto | auto |
| .auto-cols-min | min-content |
| .auto-cols-max | max-content |
| .auto-cols-fr | minmax(0, 1fr) |
Auto Rows — .auto-rows-*
| Class | Value |
|---|---|
| .auto-rows-auto | auto |
| .auto-rows-min | min-content |
| .auto-rows-max | max-content |
| .auto-rows-fr | minmax(0, 1fr) |
<!-- Column flow with fr-sized implicit columns -->
<div class="grid grid-flow-col auto-cols-fr gap-4">
<div>Auto A</div>
<div>Auto B</div>
<div>Auto C</div>
</div>
Gap
Gap utilities are provided by @mastors/core and work for both grid and flex containers. Gridder inherits them automatically.
.gap-{token}, .gap-x-{token} (column-gap), .gap-y-{token} (row-gap) where token maps to your core spacing scale (e.g., 0, 1, 2, 3, 4, 6, 8, 10, 12, 16 …).
<div class="grid grid-cols-3 gap-6">…</div> <!-- uniform gap -->
<div class="grid grid-cols-3 gap-x-8 gap-y-4">…</div> <!-- separate axes -->
Col Span / Start / End
Control how many columns an item occupies and where it starts or ends.
| .col-span-1 … -12 | span N / span N |
| .col-span-full | 1 / -1 |
| .col-auto | auto |
| .col-start-1 … -13 | grid-column-start: N |
| .col-start-auto | auto |
| .col-end-1 … -13 | grid-column-end: N |
| .col-end-auto | auto |
<div class="grid grid-cols-4 gap-3">
<div class="col-span-2">Spans 2</div>
<div>Single</div>
<div>Single</div>
<div class="col-span-full">Full width</div>
<div class="col-start-2 col-span-3">Start at 2, span 3</div>
</div>
Row Span / Start / End
Control how many rows an item occupies and where it starts or ends.
| .row-span-1 … -6 | span N / span N |
| .row-span-full | 1 / -1 |
| .row-auto | auto |
| .row-start-1 … -7 | grid-row-start: N |
| .row-start-auto | auto |
| .row-end-1 … -7 | grid-row-end: N |
| .row-end-auto | auto |
<div class="grid grid-cols-3 grid-rows-3 gap-3" style="height:220px">
<div class="row-span-2">Tall sidebar (2 rows)</div>
<div>Content A</div>
<div>Content B</div>
<div>Content C</div>
<div class="col-span-2">Footer (2 cols)</div>
</div>
Alignment
Align all grid items (container-level) or individual items (self-level) along both axes.
justify-items — inline axis, all items
| Class | Value | Responsive |
|---|---|---|
| .justify-items-start | start | Yes |
| .justify-items-end | end | Yes |
| .justify-items-center | center | Yes |
| .justify-items-stretch | stretch | Yes |
align-items (items-*) — block axis, all items
| Class | Value | Responsive |
|---|---|---|
| .items-start | start | Yes |
| .items-end | end | Yes |
| .items-center | center | Yes |
| .items-stretch | stretch | Yes |
| .items-baseline | baseline | Yes |
place-items — shorthand (align + justify), all items
| Class | Value |
|---|---|
| .place-items-start / -end / -center / -stretch | place-items: <value> |
Self alignment — individual item overrides
| Class Pattern | Property | Values |
|---|---|---|
| .justify-self-{v} | justify-self | auto, start, end, center, stretch |
| .self-{v} | align-self | auto, start, end, center, stretch, baseline |
| .place-self-{v} | place-self | auto, start, end, center, stretch |
<!-- All items centered vertically -->
<div class="grid grid-cols-3 items-center gap-4" style="height:120px">
<div>Short</div>
<div>Medium content that's taller</div>
<div class="self-end">Self end</div>
</div>
Layout Presets
Gridder ships three production-ready named-area layout presets you can drop into any project.
1 Holy Grail Layout — .layout-holy-grail
Header spanning full width, three-column middle (nav + main + aside), full-width footer.
.layout-holy-grail {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-columns: auto 1fr auto;
grid-template-rows: auto 1fr auto;
}
<div class="layout-holy-grail" style="min-height:200px">
<header class="area-header">Header</header>
<nav class="area-nav">Nav</nav>
<main class="area-main">Main Content</main>
<aside class="area-aside">Aside</aside>
<footer class="area-footer">Footer</footer>
</div>
2 Sidebar Layout — .layout-sidebar
Auto-sized sidebar on the left, fluid main content on the right.
.layout-sidebar {
display: grid;
grid-template-areas: "sidebar main";
grid-template-columns: auto 1fr;
}
3 Dashboard Layout — .layout-dashboard
Full-width header, sidebar + content area, full-width footer. Ideal for admin dashboards.
.layout-dashboard {
display: grid;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
grid-template-columns: auto 1fr;
grid-template-rows: auto 1fr auto;
}
Responsive Variants
All utilities marked Responsive generate breakpoint-prefixed variants via the @mastors/core responsive engine.
Class pattern: .{bp}:{class}
| Prefix | Min-width | Device target |
|---|---|---|
| sm: | 640px | Large phones / small tablets |
| md: | 768px | Tablets |
| lg: | 1024px | Laptops |
| xl: | 1280px | Desktops |
| 2xl: | 1536px | Large screens |
Responsive-enabled utilities
| Utility | Example class |
|---|---|
| Display | md:grid, lg:inline-grid |
| Template Columns | sm:grid-cols-2, lg:grid-cols-4 |
| Template Rows | md:grid-rows-3 |
| Auto Flow | lg:grid-flow-col |
| justify-items | md:justify-items-center |
| align-items | lg:items-start |
| place-items | xl:place-items-center |
| justify-self | sm:justify-self-end |
| align-self | md:self-center |
| place-self | lg:place-self-stretch |
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<div>Card A</div>
<div>Card B</div>
<div>Card C</div>
<div>Card D</div>
</div>
<!-- Flow switches to column layout on large screens -->
<div class="grid grid-flow-row lg:grid-flow-col gap-3">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
Full Class Reference
Every utility class generated by @mastors/gridder in one place.
| Column Placement | ||
|---|---|---|
| Class | Property | Value |
| .col-span-{1-12} | grid-column | span N / span N |
| .col-span-full | grid-column | 1 / -1 |
| .col-auto | grid-column | auto |
| .col-start-{1-13} | grid-column-start | N |
| .col-start-auto | grid-column-start | auto |
| .col-end-{1-13} | grid-column-end | N |
| .col-end-auto | grid-column-end | auto |
| .grid-col-{1-12} | grid-column | N |
| .grid-col-auto | grid-column | auto |
| Row Placement | ||
|---|---|---|
| Class | Property | Value |
| .row-span-{1-6} | grid-row | span N / span N |
| .row-span-full | grid-row | 1 / -1 |
| .row-auto | grid-row | auto |
| .row-start-{1-7} | grid-row-start | N |
| .row-start-auto | grid-row-start | auto |
| .row-end-{1-7} | grid-row-end | N |
| .row-end-auto | grid-row-end | auto |
| .grid-row-{1-6} | grid-row | N |
| .grid-row-auto | grid-row | auto |
Source files
Entry: scss/index.scss → imports mixins, utilities, and responsive engine.
Root alias: _index.scss → forwards scss/index.scss so @use "@mastors/gridder" works without a bundler alias.