GitHub

grid

Responsive CSS grid. Collapses to a single column on mobile. Direct children of the content slot become grid items — no wrapper needed.

Column counts

Use cols to set the number of columns. All layouts collapse to one column on mobile.

2 columns

Left
Right
grid({ cols: 2, content: left + right })

3 columns (default)

One
Two
Three
grid({ cols: 3, content: items.join('') })

4 columns

A
B
C
D
grid({ cols: 4, content: items.join('') })

Gap sizes

Control spacing between items with gap: 'sm' | 'md' | 'lg'. Default is 'md'.

Small gap

One
Two
Three
grid({ cols: 3, gap: 'sm', content: items.join('') })

Large gap

One
Two
Three
grid({ cols: 3, gap: 'lg', content: items.join('') })

With components

Grid accepts any HTML string as content — pass other component outputs directly.

Feature grid

Fast

Sub-100ms server responses with streaming SSR.

Secure

Security headers on every response, including errors.

Simple

No build step, no virtual DOM, no dependencies.

grid({
  cols: 3,
  content: features.map(f => feature(f)).join(''),
})

Stat grid

Monthly users

24.8k

+12%

Revenue

$18.2k

+8.4%

Churn rate

2.1%

−0.3%

Uptime

99.98%

0.0%

grid({
  cols: 4,
  content: stats.map(s => stat(s)).join(''),
})

Testimonial grid

There is no dedicated testimonial component — build one with card(): the quote in content, the name and role in footer.

“Shipped our redesign in a weekend. No boilerplate, no config hell.”

“The streaming SSR makes our pages feel instant. Lighthouse is happy.”

“Finally a UI kit that doesn't fight the platform. Just HTML.”

grid({
  cols: 3,
  content: testimonials.map(t => card({
    content: `<p>${t.quote}</p>`,
    footer:  `<strong>${t.name}</strong><br>${t.role}`,
  })).join(''),
})

Card grid

Getting started

Install and run your first Pulse app in under five minutes.

Components

30+ accessible, composable UI primitives ready to drop in.

Deployment

Static hosting, Node servers, or edge runtimes — one build.

grid({
  cols: 3,
  content: docs.map(d => card({
    title:   d.title,
    content: `<p>${d.summary}</p>`,
    footer:  badge({ label: d.tag }),
  })).join(''),
})

Single column

Use cols: 1 for a stacked list with consistent spacing — useful for form sections or timelines.

Step one
Step two
Step three
grid({ cols: 1, gap: 'sm', content: steps.join('') })
PropTypeDefaultDescription
contentstring (HTML)Raw HTML slot — direct children are grid items
colsnumber31 · 2 · 3 · 4
gapstring'md''sm' · 'md' · 'lg'