xeerpe logo

craft().chain().done()

Style CSS backgrounds and text by chaining properties and effects

  • Zero dependencies
  • Fully typed
  • Any framework

Build any CSS background, one method at a time

Describe it the way you would say it out loud. Each method adds a layer, and toStyle() turns the chain into a style object.

  1. 01

    Craft a glow

    Start with a soft amber light in the corner.

    .radialGradient({ … })
  2. 02

    Put something dark underneath

    Layers added later are drawn below the earlier ones.

    .linearGradient({ … })
  3. 03

    Lay a pattern over the top

    Patterns always sit above the gradients.

    .dots({ … })
  4. 04

    Add texture

    Film grain and a vignette give it depth.

    .grain().vignette()
  5. 05

    Make it move

    One more method, and the whole card floats.

    .float()
The whole chain
new Builder()
  .radialGradient({ from: '#FF7A18', to: 'transparent', position: '75% 25%', colorToPosition: '60%' })
  .linearGradient({ from: '#1a0b05', to: '#060302', angle: '160deg' })
  .dots({ color: '#FF7A18', size: '24px', opacity: 0.14 })
  .grain({ intensity: 2 })
  .vignette({ intensity: 0.6, spread: 0.5 })
  .float({ duration: '5s' })
  .toStyle()

Metals, gems, skies and more

Every preset is a regular Builder, so you can keep chaining effects, patterns and animations on top.

Real interface pieces, no presets needed

Text, glass panels, buttons, avatars and loaders. The same chain works on any element.

Chain it.

Gradient text

The same chain, applied to text with toTextStyle().

new Builder()
  .linearGradient({ colors: ['#5EB847', '#CAD328', '#ffd166'], angle: '90deg' })
  .toTextStyle()
Frosted glass

Frosted glass

A translucent panel that blurs whatever sits behind it.

new Builder()
  .linearGradient({ from: 'rgba(255,255,255,0.22)', to: 'rgba(255,255,255,0.06)' })
  .blur({ amount: '14px' })
  .toStyle()

Neon button

Two glows, one outside and one inside, make a neon outline.

new Builder()
  .linearGradient({ from: '#06080f', to: '#0b1020' })
  .glow({ color: '#22d3ee', amount: '18px' })
  .glow({ type: 'inner', color: '#22d3ee', amount: '12px' })
  .toStyle()
NC

Avatar ring

A conic gradient that spins around a profile picture.

new Builder()
  .conicGradient({ colors: ['#5EB847', '#CAD328', '#22d3ee', '#7a5cff', '#5EB847'] })
  .rotate({ duration: '4s' })
  .toStyle()

Loading skeleton

A light band that slides across placeholder content.

new Builder()
  .linearGradient({
    colors: ['#1c2620', '#2f3d34', '#1c2620'],
    angle: '90deg',
    backgroundSize: '200% 100%',
  })
  .shimmer({ duration: '1.6s' })
  .toStyle()
New229 presetsOne line of code each.

Spotlight card

A corner light, a dark base, dots and an inner glow.

new Builder()
  .radialGradient({ from: 'rgba(94,184,71,0.35)', to: 'transparent', position: '0% 0%', colorToPosition: '70%' })
  .linearGradient({ from: '#0c140e', to: '#060906' })
  .dots({ color: '#5EB847', size: '18px', opacity: 0.18 })
  .glow({ type: 'inner', color: 'rgba(94,184,71,0.35)', amount: '30px' })
  .toStyle()

craft().chain().done()

Zero dependencies, any framework.
Install it and write your first chain in a minute.

Yes, this background is made with xeerpe too :)
Released under the MIT License – © 2026 Nicola Centonze