xplodman/filament-count-up
xplodman/filament-count-up is a Laravel Filament package that adds smooth animated count-up effects to numeric stats, KPI cards, and dashboard widgets. Built for quick setup and flexible styling, it makes admin panels more engaging with minimal configuration. Ideal for dashboards and reporting views...
Install and register
composer require xplodman/filament-count-up
php artisan filament:assets # Filament v3 asset pipeline; v4 may not need it
There is no service provider to register manually in a standard Laravel 11+ app — Filament packages auto-discover. Confirm the package's composer.json lists a Filament version constraint compatible with yours before installing; a 9-star package is unlikely to carry a wide support matrix.
Read the README's first example, then the source
duration, decimals, separator, prefix, suffix, easing).src/ for the two entry points (a stat widget/stat class and a table column class), then resources/views/ and resources/js/ to see how the Alpine component is bootstrapped. That view is your escape hatch.composer.json namespace (likely Xplodman\FilamentCountUp\...) — the README examples are authoritative; don't guess class paths.First use case: a KPI card on an existing dashboard Take one numeric stat you already render and swap the class:
use Xplodman\FilamentCountUp\Widgets\CountUpStat; // verify exact FQCN
protected function getStats(): array
{
return [
CountUpStat::make('Monthly revenue', $this->monthlyRevenue)
->prefix('$')
->decimals(0)
->duration(1200),
];
}
Do this on a single stat before rolling it across a dashboard — it confirms assets load and the animation fires.
CountUpColumn re-animates on pagination, sorting, filtering, and search because Filament re-renders rows. Good for a small "top 10 accounts by spend" table; bad for a 50-row paginated ledger.->money('USD') or ->numeric(decimalPlaces: 2), match decimals and separators in the count-up config or you get a visible "snap" at the end of the animation.decimal casts return strings; wrap in (float) or cast in the model. A string like "1234.56" will typically animate to 0 or throw in the JS layer with no PHP error.description() and descriptionIcon() on the stat — the animation composes fine with Filament's standard stat chrome, and the description is where the non-animated delta belongs.php artisan filament:assets and php artisan view:clear. In Filament v4 the asset registration path changed, so an older package version may silently no-op.wire:key that changes with the value (e.g. wire:key="revenue-{{ $value }}") or wrap in wire:ignore if you're driving it yourself.aria-hidden on the animated span. Also respect prefers-reduced-motion — check whether the package does; if not, gate the duration to 0 in CSS or JS.0, so a slow script load or a failed asset doesn't show a dashboard of zeros. Test with JS disabled once.separator and decimal options. A German locale needs . thousands and , decimals — invert the defaults or the number reads wrong even though the animation succeeds. Derive from app()->getLocale() rather than hardcoding.composer.json and read the diff before upgrading — there is likely one maintainer and no meaningful CI gate.x-data/data-* attributes → countUp.js present in network tab → no console errors → value is numeric, not a string → duration isn't 0 → Alpine initialised (check for a conflicting x-data on a parent). Almost every issue lands in the first two.How can I help you explore Laravel packages today?