Grid
Pure CSS grid system with simple column layouts, bento grids, and masonry patterns. Responsive by default, no JavaScript required.
Example
A flexible grid system with both simple layouts and advanced bento-style configurations.
Featured
6 columns, 2 rows
Widget 1
Span 3
Widget 2
Span 3
Widget 3
Span 3
Widget 4
Span 3
<div class="omni-bento-grid omni-bento-rows-auto">
<div class="omni-card omni-bento-span-6 omni-bento-row-2">Featured</div>
<div class="omni-card omni-bento-span-3">Widget 1</div>
<div class="omni-card omni-bento-span-3">Widget 2</div>
<div class="omni-card omni-bento-span-3">Widget 3</div>
<div class="omni-card omni-bento-span-3">Widget 4</div>
<div class="omni-card omni-bento-span-full">Full Width Footer</div>
</div>
Simple Grid Layouts
Basic column layouts that work out of the box with responsive breakpoints.
Two Columns
Responsive grid that stacks on mobile:
<div class="omni-grid-2">
<div class="omni-card">Column 1</div>
<div class="omni-card">Column 2</div>
</div>
Three Columns
Three columns on desktop, two on tablet, one on mobile:
Four Columns
Four columns on desktop, two on tablet/mobile:
Auto-Fit Grid
Automatically fits columns based on minimum width. Set --omni-grid-min-width to control minimum column size:
<div class="omni-grid omni-grid-auto" style="--omni-grid-min-width: 200px;">
<div class="omni-card">Auto 1</div>
<div class="omni-card">Auto 2</div>
<!-- ... -->
</div>
Gap Control
Control spacing between grid items:
No Gap
Small Gap (8px)
Large Gap (24px)
<div class="omni-grid-3 omni-grid-gap-0">...</div>
<div class="omni-grid-3 omni-grid-gap-2">...</div>
<div class="omni-grid-3 omni-grid-gap-4">...</div> <!-- Default -->
<div class="omni-grid-3 omni-grid-gap-6">...</div>
Common App Layouts
Sidebar Layout
Sidebar with main content. Set --omni-sidebar-width to control sidebar size:
<div class="omni-grid omni-grid-sidebar" style="--omni-sidebar-width: 250px;">
<aside class="omni-card">Sidebar</aside>
<main class="omni-card">Main Content</main>
</div>
Header Layout
Full-height layout with fixed header:
<div class="omni-grid omni-grid-header">
<header class="omni-card">Header</header>
<main class="omni-card">Main Content</main>
</div>
Bento Grid System
Advanced 12-column grid system with flexible item sizing and intelligent gap filling.
Basic Bento Grid
12-column grid that adapts to smaller screens (8 cols on tablet, 4 on mobile):
<div class="omni-bento-grid omni-bento-rows-auto">
<div class="omni-card omni-bento-span-6">Span 6</div>
<div class="omni-card omni-bento-span-6">Span 6</div>
<div class="omni-card omni-bento-span-4">Span 4</div>
<div class="omni-card omni-bento-span-4">Span 4</div>
<div class="omni-card omni-bento-span-4">Span 4</div>
</div>
Magazine Layout
Editorial layout with featured first item:
<div class="omni-bento-grid omni-bento-grid-magazine">
<article class="omni-card">Featured Story</article>
<article class="omni-card">Story 2</article>
<article class="omni-card">Story 3</article>
<!-- ... -->
</div>
Row Spanning
Items can span multiple rows:
<div class="omni-bento-grid omni-bento-rows-auto">
<div class="omni-card omni-bento-span-4 omni-bento-row-2">Tall Item</div>
<div class="omni-card omni-bento-span-4">Item 2</div>
<!-- ... -->
</div>
Full Width Span
Masonry Layout
Pinterest-style layout using CSS columns (not grid). Items flow vertically then horizontally:
<div class="omni-bento-grid-masonry">
<div class="omni-card">Item 1</div>
<div class="omni-card">Item 2</div>
<!-- Variable height items -->
</div>
Row Height Control
Control the height behavior of grid rows:
Auto Rows (120px min)
Fixed Rows (192px)
<div class="omni-bento-grid omni-bento-rows-auto">...</div>
<div class="omni-bento-grid omni-bento-rows-fixed">...</div>
<div class="omni-bento-grid omni-bento-rows-sm">...</div>
<div class="omni-bento-grid omni-bento-rows-lg">...</div>
Additional Utilities
Alignment
<div class="omni-grid-3 omni-grid-center">...</div>
<div class="omni-grid-3 omni-grid-start">...</div>
<div class="omni-grid-3 omni-grid-stretch">...</div>
Aspect Ratios
Control item aspect ratios:
<div class="omni-card omni-aspect-square">...</div>
<div class="omni-card omni-aspect-video">...</div>
<div class="omni-card omni-aspect-landscape">...</div>
<div class="omni-card omni-aspect-portrait">...</div>
API Reference
Simple Grid Classes
| Class | Description | Responsive Behavior |
|---|---|---|
.omni-grid |
Base grid container | Always grid, default gap |
.omni-grid-2 |
2-column layout | 1 col on mobile |
.omni-grid-3 |
3-column layout | 2 cols on tablet, 1 on mobile |
.omni-grid-4 |
4-column layout | 2 cols on tablet/mobile |
.omni-grid-auto |
Auto-fit columns | Based on --omni-grid-min-width |
.omni-grid-sidebar |
Sidebar layout | Stacks on mobile |
.omni-grid-header |
Header + main layout | Full viewport height |
Bento Grid Classes
| Class | Description |
|---|---|
.omni-bento-grid |
12-column bento grid container |
.omni-bento-grid-magazine |
Magazine layout with featured first item |
.omni-bento-grid-masonry |
Pinterest-style masonry layout |
.omni-bento-item |
Bento grid item with hover effects |
.omni-bento-span-2/3/4/6 |
Column span utilities (responsive) |
.omni-bento-span-full |
Full width span (1 / -1) |
.omni-bento-row-2/3 |
Row span utilities |
Row Height Utilities
| Class | Height |
|---|---|
.omni-bento-rows-auto |
minmax(120px, auto) |
.omni-bento-rows-fixed |
192px |
.omni-bento-rows-sm |
120px |
.omni-bento-rows-lg |
240px |
.omni-bento-rows-equal |
1fr |
Gap Utilities
| Class | Gap Size |
|---|---|
.omni-grid-gap-0 |
0 |
.omni-grid-gap-2 |
8px |
.omni-grid-gap-4 |
16px (default) |
.omni-grid-gap-6 |
24px |
.omni-bento-gap-* |
Same values for bento grids |
.omni-bento-row-gap-* |
Row-specific gap |
.omni-bento-col-gap-* |
Column-specific gap |
Other Utilities
| Class | Description |
|---|---|
.omni-grid-center |
Center items in grid |
.omni-grid-start |
Align items to start |
.omni-grid-stretch |
Stretch items to fill |
.omni-aspect-square |
1:1 aspect ratio |
.omni-aspect-video |
16:9 aspect ratio |
.omni-aspect-landscape |
4:3 aspect ratio |
.omni-aspect-portrait |
3:4 aspect ratio |
CSS Custom Properties
| Property | Default | Description |
|---|---|---|
--omni-grid-min-width |
— | Minimum column width for auto-fit grids |
--omni-sidebar-width |
— | Width of sidebar in sidebar layout |
--omni-bento-columns |
12 | Number of columns in bento grid |
--omni-bento-gap |
16px | Gap size for bento grid |
Advanced Features
Auto Layout Adaptation
Add data-auto-layout to enable automatic layout adaptation based on item count:
<div class="omni-bento-grid" data-auto-layout>
<!-- Grid adapts based on number of items -->
</div>
Container Queries
Bento grid items respond to container size, not viewport. Items automatically stack when the container is small, regardless of viewport size.
Dense Grid Packing
Bento grids use grid-auto-flow: dense to fill gaps intelligently, creating compact layouts automatically.
Accessibility
- Pure CSS implementation works everywhere, including email clients
- Responsive breakpoints ensure readable layouts on all screen sizes
- Grid gaps provide sufficient spacing for touch targets
- Container queries enable context-aware responsive behavior
- Masonry layout maintains source order for screen readers
- Bento item hover effects respect
prefers-reduced-motion - No JavaScript required means no runtime failures
Components Used
Other OmniUI components demonstrated on this page: