Skip to content

Introduction ​

Envelop's atomic CSS system brings Tailwind-style utility classes to email templates. Write familiar classes that automatically compile to inline styles for maximum email client compatibility.

What is Atomic CSS ​

Atomic CSS is a design approach where each utility class applies a single CSS property. Instead of writing custom CSS or inline styles manually, you compose designs by combining small, reusable utility classes.

Terminology ​

Understanding the key concepts in Envelop's atomic system:

  • Preset: A class implementing the Preset interface that provides rules and a theme
  • Rule: A regex pattern that matches utility classes and generates CSS
  • Theme: Design tokens (colors, spacing, typography, etc.) that rules can reference
  • Design Tokens: Individual values in a theme (e.g., a specific color or spacing value)
  • Atomic CSS: Utility-first CSS where each class does one thing
  • Parser: The component that processes utility classes and converts them to inline styles
blade
<!-- Instead of this -->
<a href="..." style="background-color: #3b82f6; color: #ffffff; padding: 16px 32px;">
  Click Here
</a>

<!-- Write this -->
<x-envelop::button href="..." class="bg-blue-600 text-white px-8 py-4">
  Click Here
</x-envelop::button>

How It Works in Envelop ​

Envelop's atomic system parses utility classes through the atomic() helper function and generates inline styles:

php
atomic('bg-blue-600 text-white px-8 py-4')
// Returns: "background-color: #2563eb; color: #ffffff; padding-left: 32px; padding-right: 32px; padding-top: 16px; padding-bottom: 16px;"

The Parsing Flow ​

  1. Input: Utility classes are passed to the atomic() helper
  2. Matching: Each class is matched against parsing rules using regex patterns
  3. Resolving: Matched rules look up values in the theme (e.g., blue-600 → #2563eb)
  4. Merging: All resolved styles are combined into a single inline style string
  5. Output: Inline CSS ready for email clients

The atomic() Helper ​

The atomic() helper function is the core of Envelop's CSS system. It's available globally in your Blade templates:

php
atomic(string $classes, array $defaults = []): string

Parameters:

  • $classes: Space-separated utility class names
  • $defaults: Optional array of default CSS properties to merge with

Returns: Inline CSS style string

Basic Example ​

blade
<div style="{{ atomic('bg-slate-100 p-4 rounded') }}">
  Content
</div>

Output:

blade
<div style="background-color: #f1f5f9; padding: 16px; border-radius: 4px;">
  Content
</div>

With Defaults ​

Components use defaults to ensure email-safe base styles:

php
public function style(): string
{
    return atomic($this->class, [
        'display' => 'inline-block',
        'text-decoration' => 'none',
    ]);
}

User classes override defaults, so class="underline" would change text-decoration from none to underline.

Available Utility Classes ​

Envelop includes comprehensive utilities organized by category:

Colors ​

Background colors, text colors, border colors with full Tailwind palette support.

Typography ​

Font sizes, weights, families, line heights, letter spacing, text alignment, transforms, and decoration.

Spacing ​

Padding and margin with numeric scale and directional variants (px, py, pt, pr, pb, pl).

Sizing ​

Width, height, max-width, min-width, max-height, min-height with numeric and percentage values.

Borders ​

Border widths, styles, colors, and radius with directional controls.

Display & Layout ​

Display modes, vertical alignment.

Effects ​

Box shadows and opacity.

Arbitrary Values ​

For one-off values not in the theme, use arbitrary value syntax with square brackets:

blade
<x-envelop::text class="text-[#ff0000] p-[20px] w-[500px]">
  Custom values
</x-envelop::text>

Arbitrary values work for:

  • Colors: bg-[#ff0000], text-[rgb(255,0,0)]
  • Sizes: w-[500px], h-[100%]
  • Spacing: p-[20px], m-[1em]
  • Any other property: leading-[1.8], rounded-[10px]

Important: While Envelop will process arbitrary values for any CSS property, not all properties are email-safe. Stick to well-supported properties like colors, spacing, typography, and borders. Properties like display: flex, transform, and position: absolute will not work in most email clients.

Class Precedence ​

When multiple classes affect the same CSS property, the last one wins:

blade
class="bg-blue-500 bg-red-500"
<!-- Results in: background-color: #ef4444 (red) -->

This matches Tailwind's behavior and lets you conditionally override classes in your Blade templates.

Email Client Compatibility ​

All utility classes compile to inline styles, which is the most reliable way to style emails:

  • Works in all clients: Inline styles are universally supported
  • No external CSS: Everything is inlined, no <style> tags needed
  • MSO-safe: Compatible with Microsoft Outlook's rendering engine
  • Mobile-friendly: Styles work on desktop and mobile email clients

Next Steps ​

Released under the MIT License.