orivex-x/elemento

Modern PHP HTML template builder with fluent interface, form building, theming, and component system.

Maintainers

Package info

github.com/Orivex-x/Elemento

Homepage

pkg:composer/orivex-x/elemento

Transparency log

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-07-25 00:22 UTC

This package is auto-updated.

Last update: 2026-07-25 00:23:17 UTC


README

CI Coverage snapshot PHP License

Elemento is a PHP 8.3+ HTML builder with typed element classes, fluent attributes, forms, themes, and macros.

Who it’s for

Elemento is for PHP developers who prefer composing HTML in PHP over maintaining separate template files. It is especially useful for reusable UI components, server-rendered forms, emails, admin interfaces, and libraries that need to return safe, renderable HTML fragments.

It suits projects that want a small fluent API with automatic escaping and explicit trusted-HTML boundaries. It is not a full framework or client-side rendering solution; use it alongside your router, validation layer, CSS framework, and application templates.

Where Elemento wins over hand-written HTML

Hand-written HTML is excellent - until it becomes a growing tangle of interpolated values, conditional attributes, repeated components, validation errors, and escaping decisions. Elemento lets PHP describe the structure of the page directly, while keeping the final output ordinary, portable HTML.

The same approach powers the polished examples/login-form.php demo: a server-rendered form is an object you can configure, bind, validate, render, and test - not a long string split between a controller and template:

use Elemento\Elemento;

session_start();

$form = Elemento::postForm('/login')
    ->withCSRFToken(Elemento::csrf())
    ->setRenderOptions([
        'wrapper_class' => 'field',
        'error_class' => 'field-error',
    ]);

$form->field('email', 'email', [
    'label' => 'Email address',
    'placeholder' => 'you@example.test',
    'required' => true,
]);

$form->field('password', 'password', [
    'label' => 'Password',
    'required' => true,
]);

$form->bindData(['email' => 'ada@example.test'])
    ->setErrors(['password' => ['Your email or password is incorrect.']])
    ->add(Elemento::button('Sign in securely')->submit()->addClass('submit-button'));

echo $form;
When your HTML needs... Elemento gives you...
Runtime text and attributes Escaping by default, including malformed UTF-8 handling, so safe output is the normal path.
Repeated UI patterns Composable Element objects you can return from methods, pass into components, clone, and reuse.
Optional state Fluent classes, boolean attributes, data-* values, and child manipulation instead of error-prone string branches.
Serious server-rendered forms Consistent labels, values, errors, select matching, CSRF fields, and PUT/DELETE method spoofing.
Confidence during refactors Deterministic rendered HTML that PHPUnit can assert without a browser or DOM snapshot tool.

The result is not a proprietary runtime or a client-side framework. It is clean HTML that works in an email, a traditional PHP page, a CMS integration, or a response from your own library - just produced with the same clarity and discipline as the rest of your PHP.

For a mostly static page with little dynamic content, plain HTML or an existing template engine may still be the simpler choice. Elemento shines when PHP is already responsible for assembling the interface.

composer require orivex-x/elemento
use Elemento\Elemento;
use Elemento\Theme\BootstrapTheme;

Elemento::setTheme(new BootstrapTheme());

$overview = Elemento::div(['class' => 'row g-4'])->add([
    Elemento::div(['class' => 'col-md-4'])->add(
        Elemento::card('Monthly revenue', '£12,480 · ↑ 18.2%')
    ),
    Elemento::div(['class' => 'col-md-4'])->add(
        Elemento::card('Active teams', '284 · ↑ 12 this week')
    ),
    Elemento::div(['class' => 'col-md-4'])->add(
        Elemento::card('Uptime', '99.99% · All systems normal')
    ),
]);

echo $overview;

Safety

Text and attribute values are escaped with ENT_QUOTES | ENT_SUBSTITUTE. Child text added with add() is escaped too. To deliberately render a known-safe fragment, create a SafeHtml value explicitly:

use Elemento\SafeHtml;

echo Elemento::div()->trustedHtml(new SafeHtml('<strong>Verified markup</strong>'));

SafeHtml is a trust marker, not a sanitizer. Never construct it from request data or other untrusted input.

Guides

Examples

The runnable examples in examples/ cover login forms, a dashboard, an admin panel, reusable components, and an email-friendly layout. Run one from the project root after installing dependencies:

php -S localhost:8000 -t examples

Then visit the corresponding example file, such as http://localhost:8000/login-form.php.

Elemento is released under the MIT license.