Skip to content

Getting started ​

Install brief via Composer:

sh
composer require flowframe/brief

Creating a template ​

After installation, you can begin creating templates by defining their structure through components. The example below demonstrates a basic template structure:

php
use Flowframe\Brief\Components\Html;
use Flowframe\Brief\Components\Body;
use Flowframe\Brief\Components\Container;
use Flowframe\Brief\Components\Section;
use Flowframe\Brief\Components\Text;
use Flowframe\Brief\Components\Hr;
use Flowframe\Brief\Components\Button;

$template = Html::make(
    Body::make(
        Container::make(
            Section::make(
                Text::make('Reset your password'),

                Text::make(<<<'TEXT'
                We've received a new password reset request,
                if this wasn't you then ignore this email.
                TEXT),
            ),

            Hr::make(),

            Section::make(
                Button::make('Reset password')
                    ->href('https://example.com')
            ),

            Text::make('Copyright 2025 Acme Corp.')
        )
    )
)

Rendering templates ​

To render the template, use the RendererFactory:

php
use Flowframe\Brief\Components\Html;
use Flowframe\Brief\Components\Body;
use Flowframe\Brief\Components\Container;
use Flowframe\Brief\Components\Section;
use Flowframe\Brief\Components\Text;
use Flowframe\Brief\Components\Hr;
use Flowframe\Brief\Components\Button;
use Flowframe\Brief\Renderers\HtmlRenderer; 
use Flowframe\Brief\Renderers\TextRenderer; 
use Flowframe\Brief\Renderers\RendererFactory; 

$template = Html::make(
    Body::make(
        Container::make(
            Section::make(
                Text::make('Reset your password'),

                Text::make(<<<'TEXT'
                We've received a new password reset request,
                if this wasn't you then ignore this email.
                TEXT),
            ),

            Hr::make(),

            Section::make(
                Button::make('Reset password')
                    ->href('https://example.com')
            ),

            Text::make('Copyright 2025 Acme Corp.')
        )
    )
);

$renderer = new RendererFactory(
    new HtmlRenderer, 
    new TextRenderer, 
); 

$html = $renderer->toHtml($template); 

$text = $renderer->toText($template); 

WARNING

Components should not render themselves directly. The renderer processes the component tree to generate HTML output, maintaining separation between component structure and rendering logic.

Styling components ​

Apply styles using the style() method on components that implement the StylesInterface. The template supports Atomic CSS methodology for styling, similar to Tailwind CSS's utility-first approach:

php
use Flowframe\Brief\Components\Button;
use Flowframe\Brief\Atomic\Atomic;
use Flowframe\Brief\Atomic\Presets\DefaultPreset;

$a = Atomic::make([new DefaultPreset]);

Button::make('Click me')
    ->style($a('bg-blue-600 text-white px-3 py-2 rounded-lg font-medium'));

This pattern enables consistent styling through predefined utility classes. For implementation details, see Atomic.

Released under the MIT License.