gregoriohc/laravel-nova-theme-responsive
A responsive theme for Laravel Nova that adapts the admin panel to mobile and tablet screens, fixing layout and navigation issues on small devices so Nova stays usable anywhere. Easy to install and configure.
Know what you're actually installing before you type a command. This is not a Laravel package in the usual sense — no service provider, no migration, no facades. It's a folder of CSS that Nova loads instead of (or on top of) its default stylesheet, wired up through a single config key. Your entire integration surface is config/nova.php. That's the good news and the bad news: nothing to break, but nothing to debug either when it silently does nothing.
Step 0 — check your Nova major version. This is the whole decision.
composer show laravel/nova | grep -i versions
The package's last release is March 2020, which places it squarely in the Nova 2.x/3.x era. Nova 4+ rewrote the frontend (Vue 3/Inertia, new asset pipeline, native responsive behaviour). On 4+, assume this package is a no-op at best. Stop here and use Nova's own responsiveness.
Step 1 — install pinned.
composer require gregoriohc/laravel-nova-theme-responsive:^1.0
Don't let an unmaintained theme float. Commit composer.lock. If you need a PHP-constraint bump for Laravel 10/11, prefer a VCS repository entry pointing at your own fork at an exact commit over dev-master.
Step 2 — point Nova at it.
// config/nova.php
'theme' => 'gregoriohc/laravel-nova-theme-responsive',
The value must match the Composer package name exactly. There is no validation — a typo gives you an unstyled or blank Nova, not an exception.
Step 3 — publish and clear.
php artisan nova:publish
php artisan config:clear
nova:publish copies the theme's assets into public/vendor/nova. Skip it and the theme never reaches the browser. Skip config:clear and your theme change is invisible if config is cached.
Where to look first:
vendor/gregoriohc/laravel-nova-theme-responsive/resources/ — read the CSS. You need to know which Nova selectors are being overridden before you layer anything on top.composer.json — check its laravel/nova and php constraints against yours..blade.php and .vue files:find vendor/gregoriohc/laravel-nova-theme-responsive -name '*.blade.php' -o -name '*.vue'
Empty output means asset-only, which is a fundamentally lower risk profile. View overrides mean Nova point releases can produce blank panels.
First use case: an existing Nova 2/3 admin that's fine on desktop but unusable on a phone. Load /nova in DevTools at 375px, open the sidebar, scroll a resource index, open a create form. Collapsing sidebar + horizontally scrolling tables is your "it works" signal.
Make the theme a per-environment switch, not a hardcoded value.
// config/nova.php
'theme' => env('NOVA_THEME', 'gregoriohc/laravel-nova-theme-responsive'),
Staging can run it while production waits for sign-off. Rollback becomes an .env edit plus php artisan config:cache. This is also your feature flag if you want a QA gate before real admin users see it.
Never edit vendor files. Layer your own CSS on top.
Nova gives you a first-class hook in app/Providers/NovaServiceProvider.php:
public function boot()
{
parent::boot();
Nova::style('css/admin-responsive-overrides.css');
}
Put that file under public/css/ and treat it as first-party code. This is where you fix the things the theme doesn't cover — bigger tap targets, brand colours, a breakpoint that actually matches your device fleet. It's also the seam that makes extraction cheap later.
Treat the package as a reference implementation, not a dependency.
The highest-leverage pattern with a six-year-stale theme is to read it once and own the parts you need:
cp vendor/gregoriohc/laravel-nova-theme-responsive/resources/css/*.css public/css/
# prune to the selectors your panel actually uses
composer remove gregoriohc/laravel-nova-theme-responsive
# then remove the 'theme' key from config/nova.php
You trade an unmaintained dependency for a few hundred lines of CSS you control, that you can diff against every Nova upgrade. Do this before you pile customizations on top of the theme, or you'll be untangling two layers of overrides with no clear provenance.
Own the publish step in the deploy pipeline.
The theme lands as static assets under public/vendor/nova. That directory is not refreshed by composer install. Make it an explicit deploy step:
php artisan nova:publish
php artisan config:cache
Then hook it into your asset versioning or CDN invalidation, so a deploy doesn't leave phones holding stale CSS from three releases ago.
Build a viewport QA matrix — it can be tiny.
The theme's failure mode is silent. A two-minute manual pass is worth more than trusting it:
| Width | Views |
|---|---|
| 375px | resource index, detail, create form, action modal |
| 768px | same |
| 1280px | same (regression check) |
Screenshot before/after. When a Nova point release breaks something, you want to be able to attribute it.
Separate layout from content density.
The theme fixes layout: sidebar, table overflow, modal sizing. It does nothing about a 14-column index that's unreadable at 375px no matter how nicely it scrolls. Pair it with resource-level work:
// In your Resource class
public static function indexQuery(NovaRequest $request, $query)
{
$isMobile = preg_match(
'/Mobile|Android|iPhone/i',
$request->userAgent() ?? ''
);
return $query->when($isMobile, fn ($q) => $q->limit(25));
}
And lean on hideFromIndex() / hideWhenCreating() for wide columns and rarely-used fields on narrow screens. Responsive layout plus a desktop-only column set is what actually makes mobile admin usable. Layout alone just means the cramping is now horizontally scrollable.
Isolate adoption in its own release.
Land the theme in a deploy window adjacent to — never inside — a Nova upgrade. If both ship together and mobile admin breaks, you can't tell whether it's the theme, the Nova bump, or the interaction. Separate releases make the bisect trivial.
Nova 4+ is a hard stop, not a "maybe". The rewritten Vue 3/Inertia frontend means 2020-vintage selector CSS either does nothing or breaks silently. Check the Nova major version before you spend a single minute on this.
A wrong theme value fails silently. No validation, no exception. If Nova looks blank or unstyled after enabling, check in this order: exact package-name spelling in config/nova.php, php artisan config:clear, and whether public/vendor/nova actually contains the theme's CSS.
Config caching eats your change. config/nova.php is cached in production. "I changed the key and nothing happened" is the single most common false alarm with Nova config edits. php artisan config:clear (or config:cache) after every change.
Stale published assets after deploy. nova:publish copies into public/vendor/nova, which Composer does not touch. Half-themed mobile views almost always mean the publish step didn't run. php artisan nova:publish --force overwrites — use it deliberately, not as a reflex.
Mobile Safari caching will waste an afternoon. A phone holding a cached stylesheet while desktop looks correct is a classic. If a fix "doesn't work on my phone," hard-reload or test in a private tab before you start debugging CSS.
Confirm asset-only before you commit. Grep the vendored package for .blade.php and .vue files. Pure CSS means Nova upgrades are low-risk. View overrides mean Nova point releases can produce blank panels or JS errors in a privileged admin surface — a high-visibility production incident. Know which one you're buying into.
Watch the PHP constraint. Old packages cap at PHP 7.x. If resolution fails on Laravel 10/11, that's the likely cause. Fix it with a fork carrying a widened constraint — never --ignore-platform-reqs on an admin dependency.
Responsiveness is not accessibility. CSS that shrinks or hides controls can wreck focus order and tap targets. After enabling, tab through the sidebar and an action dropdown with a keyboard and confirm focus stays visible. In a regulated environment that's compliance exposure, not cosmetics.
No vendor, no SLA, one maintainer. Budget a couple of hours per Nova major upgrade to re-validate selectors, and assign an explicit internal owner — usually the platform or admin-UX lead. An orphaned admin theme is worse than no theme, because nobody knows whether it still works and nobody feels responsible for finding out.
Removal is genuinely cheap — which is the point. Revert the theme key, delete public/vendor/nova artifacts (or your own CSS file), composer remove, config:clear. No migrations, no data cleanup, no runtime state. That's exactly why the right plan is a short, pinned trial with an extraction-or-removal decision on the calendar — not an open-ended standing dependency on a modern Nova stack.
How can I help you explore Laravel packages today?