shadcn composition
An all-in-one tag (<twig:Tabler:Card title="…" />) and, where it makes sense, dedicated sub-components
(<twig:Tabler:Card:Header>, <twig:Tabler:Card:Body>…).
<div class="row row-cards"> <div class="col-md-6"> <twig:Tabler:Card status="success"> <twig:Tabler:Card:Header> <twig:Tabler:Card:Title>Deployments</twig:Tabler:Card:Title> <twig:Tabler:Card:Actions> <twig:Tabler:Badge variant="success" light="{{ true }}">Healthy</twig:Tabler:Badge> </twig:Tabler:Card:Actions> </twig:Tabler:Card:Header> <twig:Tabler:Card:Body> <twig:Tabler:Progress value="72" variant="success" size="sm" label="72% of the rollout" /> <div class="mt-3"><twig:Tabler:Status variant="success" dot="{{ true }}" animated="{{ true }}" label="Live on 18 of 25 servers" /></div> </twig:Tabler:Card:Body> <twig:Tabler:Card:Footer> <twig:Tabler:Button variant="primary" size="sm">Promote</twig:Tabler:Button> <twig:Tabler:Button appearance="ghost" variant="secondary" size="sm">Roll back</twig:Tabler:Button> </twig:Tabler:Card:Footer> </twig:Tabler:Card> </div> <div class="col-md-6"> <twig:Tabler:Alert variant="success" title="Saved!" description="Your changes are live." dismissible="{{ true }}" /> <twig:Tabler:Alert variant="warning" important="{{ true }}" title="Disk almost full" description="92% used on db-1." /> </div></div><div class="row row-cards"> <div class="col-md-6"> <div class="card"> <div class="card-status-top bg-success"></div> <div class="card-header"> <h3 class="card-title">Deployments</h3> <div class="card-actions"><span class="badge bg-success-lt">Healthy</span></div> </div> <div class="card-body"> <div class="progress progress-sm"> <div class="progress-bar bg-success" role="progressbar" style="width: 72%" aria-valuenow="72" aria-valuemin="0" aria-valuemax="100" > <span class="visually-hidden">72% of the rollout</span> </div> </div> <div class="mt-3"> <span class="status status-success"> <span class="status-dot status-dot-animated"></span> Live on 18 of 25 servers </span> </div> </div> <div class="card-footer"> <button type="button" class="btn btn-sm btn-primary">Promote</button> <button type="button" class="btn btn-sm btn-ghost-secondary">Roll back</button> </div> </div> </div> <div class="col-md-6"> <div class="alert alert-success alert-dismissible" role="alert"> <div> <h4 class="alert-heading">Saved!</h4> <div class="alert-description">Your changes are live.</div> </div> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> <div class="alert alert-warning alert-important text-white" role="alert"> <div> <h4 class="alert-heading">Disk almost full</h4> <div class="alert-description">92% used on db-1.</div> </div> </div> </div></div>shadcn composition
An all-in-one tag (<twig:Tabler:Card title="…" />) and, where it makes sense, dedicated sub-components
(<twig:Tabler:Card:Header>, <twig:Tabler:Card:Body>…).
Block-mirrored props
On composite components, each prop has a matching Twig block: override one without rewriting the rest.
html_cva() variants
Classes are declared with html_cva(), Twig’s
take on shadcn’s CVA.
Plain Tabler markup
Components render Tabler and Bootstrap 5 classes; the interactive ones use the data-bs-* JavaScript of
tabler.js.
Attribute forwarding
Extra attributes (class, id, data-*…) are merged onto the root element.
Template-only
Anonymous Twig components: no PHP classes to register or configure.