Icon Column
The IconColumn renders a Lucide icon instead of raw text. The icon and its
color are set with icon() and color(), each accepting a static value (rendered client-side) or
a callable that receives the cell state and is resolved server-side per row.
Icon names may be passed as plain kebab-case strings ('circle-check') or as Icon enum cases
(Icon::CircleCheck) — both serialize to the same value.
Basic Usage
Set a single static icon for every cell:
use Pentiminax\UX\DataTables\Column\IconColumn;
use Pentiminax\UX\DataTables\Enum\Icon;
IconColumn::new('status', 'Status')
->icon(Icon::CircleCheck);
Dynamic Icon
Pass a callable to derive the icon from the cell value. The callable receives the (scalar) cell state:
IconColumn::new('status', 'Status')
->icon(fn (string $state): Icon => match ($state) {
'draft' => Icon::PencilLine,
'reviewing' => Icon::Clock,
'published' => Icon::CircleCheck,
default => Icon::Circle,
});
The callable runs server-side, once per row. It may return a string or an Icon.
Colors
color() accepts a semantic variant (success, warning, danger, info, primary, secondary,
light, dark) as a static string or a callable. Each adapter maps the variant to its own classes —
text-success on Bootstrap, text-green-600 on Tailwind.
IconColumn::new('status', 'Status')
->icon(fn (string $state): Icon => match ($state) {
'draft' => Icon::PencilLine,
'published' => Icon::CircleCheck,
default => Icon::Circle,
})
->color(fn (string $state): string => match ($state) {
'draft' => 'warning',
'published' => 'success',
default => 'secondary',
});
Boolean Mode
boolean() switches to a true/false rendering driven by trueIcon/falseIcon and
trueColor/falseColor:
IconColumn::new('enabled', 'Enabled')
->boolean()
->trueIcon(Icon::CircleCheck)
->falseIcon(Icon::CircleX)
->trueColor('success')
->falseColor('danger');
Sizes
size() accepts xs | sm | md | lg | xl (default md), as a string or an IconSize enum case:
use Pentiminax\UX\DataTables\Enum\IconSize;
IconColumn::new('status', 'Status')
->icon(Icon::CircleCheck)
->size(IconSize::Large);
Sizes map to pixel dimensions: xs=12, sm=16, md=20, lg=24, xl=32.
Tooltips
Add a title attribute per value:
IconColumn::new('status', 'Status')
->icon(Icon::CircleCheck)
->tooltips(['active' => 'Account is active']);
API Reference
| Method | Description |
|---|---|
| `IconColumn::new(string $name, string $title = '')` | Creates a new IconColumn (type: `html`). |
| `icon(string|Icon|callable $icon)` | Icon name (`string`/`Icon`) rendered client-side, or a `fn ($state)` resolved server-side per row. |
| `color(string|callable $color)` | Semantic variant (`string`) rendered client-side, or a `fn ($state)` resolved server-side per row. |
| `size(string|IconSize $size)` | Icon size: `xs | sm | md | lg | xl` (default `md`). |
| `tooltips(array $tooltips)` | Map of cell value => `title` attribute. |
| `boolean(bool $boolean = true)` | Switch to true/false rendering. |
| `trueIcon(string|Icon $icon)` / `falseIcon(string|Icon $icon)` | Icons used in boolean mode. |
| `trueColor(string $color)` / `falseColor(string $color)` | Variants used in boolean mode. |
Complete Example
use Pentiminax\UX\DataTables\Attribute\AsDataTable;
use Pentiminax\UX\DataTables\Column\IconColumn;
use Pentiminax\UX\DataTables\Column\TextColumn;
use Pentiminax\UX\DataTables\Enum\Icon;
use Pentiminax\UX\DataTables\Enum\IconSize;
use Pentiminax\UX\DataTables\Model\AbstractDataTable;
#[AsDataTable(User::class)]
final class UsersDataTable extends AbstractDataTable
{
public function configureColumns(): iterable
{
yield TextColumn::new('name', 'Name');
yield IconColumn::new('status', 'Status')
->icon(fn (string $state): Icon => match ($state) {
'active' => Icon::CircleCheck,
'pending' => Icon::Clock,
'archived' => Icon::Archive,
default => Icon::Circle,
})
->color(fn (string $state): string => match ($state) {
'active' => 'success',
'pending' => 'warning',
default => 'secondary',
})
->size(IconSize::Large)
->tooltips([
'active' => 'Account is active',
'pending' => 'Awaiting confirmation',
'archived' => 'No longer active',
]);
}
protected function mapRow(mixed $item): array
{
return [
'name' => $item->getName(),
'status' => $item->getStatus(),
];
}
}