@mastors/gridder

Complete CSS Grid utility class system for the Mastors Framework

v1.2.7 MIT SCSS Responsive

@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.

HTML
<div class="grid grid-cols-3 gap-4">
  <div>Column 1</div>
  <div>Column 2</div>
  <div>Column 3</div>
</div>
Live Preview
Column 1
Column 2
Column 3

Installation

Install the package inside a Mastors monorepo workspace or as a standalone npm dependency.

Shell
npm install @mastors/gridder

Import in your SCSS entry point:

SCSS
// 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:

HTML
<link rel="stylesheet" href="node_modules/@mastors/gridder/dist/mastors-gridder.css" />
Peer dependencies: @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 Signature
@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
)
SCSS Usage
@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
  );
}
Result — 3-column 1.5rem gap grid
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6

grid-item()

Place a grid item using span and optional start position. Applied to child elements of a grid container.

Mixin Signature
@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
)
SCSS Usage
@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);
}
Result — hero spans 2 cols, starts at col 1
Hero (col-span 2)
Sidebar
Card A
Card B
Card C

gridder()

Place a grid item using a named grid area or explicit row/column line placement. Optionally controls self-alignment.

Mixin Signature
@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
)
When only $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).
SCSS Usage — Named area
@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); }
SCSS Usage — Explicit lines
// 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 Signature
@mixin gridder-areas($rows...)
// Each $row is a quoted string of space-separated area names
SCSS Usage
@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); }
Result — named area layout
Header
Sidebar
Main
Footer

Display

Switch an element into a grid formatting context.

Class CSS Output Responsive
.griddisplay: gridYes
.inline-griddisplay: inline-gridYes
HTML
<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-12repeat(N, minmax(0, 1fr))Yes
.grid-cols-nonenoneYes
.grid-cols-subgridsubgridNo
.grid-cols-autoautoNo
.grid-cols-minmin-contentNo
.grid-cols-maxmax-contentNo
.grid-cols-frminmax(0, 1fr)No
Example
<!-- 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>
Preview — .grid-cols-4
A
B
C
D

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-6repeat(N, minmax(0, 1fr))Yes
.grid-rows-nonenoneYes
.grid-rows-subgridsubgridNo
.grid-rows-autoautoNo
.grid-rows-minmin-contentNo
.grid-rows-maxmax-contentNo
.grid-rows-frminmax(0, 1fr)No
Example
<!-- 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-headergrid-area: header
.area-navgrid-area: nav
.area-sidebargrid-area: sidebar
.area-maingrid-area: main
.area-asidegrid-area: aside
.area-footergrid-area: footer

SCSS Mixins for Custom Areas

SCSS — define-areas() & area()
@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-autogrid-column: auto
.grid-col-1 … .grid-col-12grid-column: N
Example
<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-autogrid-row: auto
.grid-row-1 … .grid-row-6grid-row: N

Auto Flow

Control how the auto-placement algorithm places items using grid-auto-flow.

Class CSS Output Responsive
.grid-flow-rowgrid-auto-flow: rowYes
.grid-flow-colgrid-auto-flow: columnYes
.grid-flow-densegrid-auto-flow: denseYes
.grid-flow-row-densegrid-auto-flow: row denseYes
.grid-flow-col-densegrid-auto-flow: column denseYes
Example
<!-- 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-autoauto
.auto-cols-minmin-content
.auto-cols-maxmax-content
.auto-cols-frminmax(0, 1fr)

Auto Rows — .auto-rows-*

Class Value
.auto-rows-autoauto
.auto-rows-minmin-content
.auto-rows-maxmax-content
.auto-rows-frminmax(0, 1fr)
Example
<!-- 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.

Classes follow the pattern .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 …).
Example
<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
.col-span-1 … -12span N / span N
.col-span-full1 / -1
.col-autoauto
Col Start
.col-start-1 … -13grid-column-start: N
.col-start-autoauto
Col End
.col-end-1 … -13grid-column-end: N
.col-end-autoauto
Example
<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>
Preview
col-span-2
Single
Single
col-span-full
col-start-2 col-span-3

Row Span / Start / End

Control how many rows an item occupies and where it starts or ends.

Row Span
.row-span-1 … -6span N / span N
.row-span-full1 / -1
.row-autoauto
Row Start
.row-start-1 … -7grid-row-start: N
.row-start-autoauto
Row End
.row-end-1 … -7grid-row-end: N
.row-end-autoauto
Example
<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>
Preview
row-span-2
A
B
C
col-span-2 footer

Alignment

Align all grid items (container-level) or individual items (self-level) along both axes.

justify-items — inline axis, all items

ClassValueResponsive
.justify-items-startstartYes
.justify-items-endendYes
.justify-items-centercenterYes
.justify-items-stretchstretchYes

align-items (items-*) — block axis, all items

ClassValueResponsive
.items-startstartYes
.items-endendYes
.items-centercenterYes
.items-stretchstretchYes
.items-baselinebaselineYes

place-items — shorthand (align + justify), all items

ClassValue
.place-items-start / -end / -center / -stretchplace-items: <value>

Self alignment — individual item overrides

Class PatternPropertyValues
.justify-self-{v}justify-selfauto, start, end, center, stretch
.self-{v}align-selfauto, start, end, center, stretch, baseline
.place-self-{v}place-selfauto, start, end, center, stretch
Example
<!-- 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.

Generated CSS
.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;
}
HTML
<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>
Preview
Header
Nav
Main
Aside
Footer

2 Sidebar Layout — .layout-sidebar

Auto-sized sidebar on the left, fluid main content on the right.

Generated CSS
.layout-sidebar {
  display: grid;
  grid-template-areas: "sidebar main";
  grid-template-columns: auto 1fr;
}
Preview
Sidebar
Main Content

3 Dashboard Layout — .layout-dashboard

Full-width header, sidebar + content area, full-width footer. Ideal for admin dashboards.

Generated CSS
.layout-dashboard {
  display: grid;
  grid-template-areas:
    "header  header"
    "sidebar content"
    "footer  footer";
  grid-template-columns: auto 1fr;
  grid-template-rows: auto 1fr auto;
}
Preview
Header
Sidebar
Content
Footer

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:640pxLarge phones / small tablets
md:768pxTablets
lg:1024pxLaptops
xl:1280pxDesktops
2xl:1536pxLarge screens

Responsive-enabled utilities

Utility Example class
Displaymd:grid, lg:inline-grid
Template Columnssm:grid-cols-2, lg:grid-cols-4
Template Rowsmd:grid-rows-3
Auto Flowlg:grid-flow-col
justify-itemsmd:justify-items-center
align-itemslg:items-start
place-itemsxl:place-items-center
justify-selfsm:justify-self-end
align-selfmd:self-center
place-selflg:place-self-stretch
Responsive example — 1 → 2 → 4 columns
<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-columnspan N / span N
.col-span-fullgrid-column1 / -1
.col-autogrid-columnauto
.col-start-{1-13}grid-column-startN
.col-start-autogrid-column-startauto
.col-end-{1-13}grid-column-endN
.col-end-autogrid-column-endauto
.grid-col-{1-12}grid-columnN
.grid-col-autogrid-columnauto
Row Placement
Class Property Value
.row-span-{1-6}grid-rowspan N / span N
.row-span-fullgrid-row1 / -1
.row-autogrid-rowauto
.row-start-{1-7}grid-row-startN
.row-start-autogrid-row-startauto
.row-end-{1-7}grid-row-endN
.row-end-autogrid-row-endauto
.grid-row-{1-6}grid-rowN
.grid-row-autogrid-rowauto

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.