Skip to main content
The control panel may be customized in a number of different ways. You may add new pages, menus, a stylesheet, or maybe you just want to add some arbitrary Javascript. When you need to add features to your Shopper administration, you can first set up some configurations

Adding CSS and JS Assets

Shopper can load extra stylesheets and JavaScript files in the admin panel. Register them from a service provider using the Shopper facade:
Local paths (starting with /) are resolved from the public/ directory. CDN URLs are loaded directly.

Customize Shopper theme

Shopper ships with a pre-compiled CSS file (dist/shopper.css) that works out of the box. However, if you want to customize the admin panel styles using Tailwind CSS, you can build your own theme by importing Shopper’s theme.css file. Shopper provides a dedicated theme.css entry point that handles all internal imports (Tailwind, Filament, Shopper base styles, source detection, and plugins) so you don’t have to wire them up manually.

Setting up Tailwind CSS for your project

Install Tailwind CSS v4 with the Vite plugin and the required plugins:
Add the @tailwindcss/vite plugin to your vite.config.js:

Creating the theme file

Create a resources/css/shopper.css file and import Shopper’s theme entry point:
The theme.css file already includes Tailwind, Filament CSS, Shopper base styles and components, source detection for all required Blade views, and the @tailwindcss/forms and @tailwindcss/typography plugins. You don’t need to configure any of that yourself. To add your own source paths (custom Livewire components, app modules, etc.) or custom styles, add them after the import:

Load theme

In your AppServiceProvider or any other provider, register the Vite theme in the boot method:
By default, the Shopper logo is used on the login page and in the sidebar header. You have several options to replace it with your own brand.

Via configuration

The simplest approach is to set the brand key in your config/shopper/admin.php configuration file with a path to your logo image:
This will load the image using the Laravel asset() helper function, so the file should be in your public/ directory.

Via service provider

For more control, use the brandLogo() method on the Shopper facade. You can pass an HTML string, a closure that returns a string, or a closure that returns a View instance:
This takes priority over the config value, giving you full flexibility to render any HTML, such as an inline SVG, a Blade component, a dedicated view, or anything else.
The priority order is: Shopper::brandLogo() > config('shopper.admin.brand') > default Shopper logo.

Render hooks

Shopper allows you to render Blade content at specific points in the admin panel. This is useful for integrating third-party packages that require Blade components in the layout, such as Flux UI, Wire Elements Modal, or Laravel Notify, and for addons that need to inject content into specific pages.
If you are familiar with Filament’s render hooks, you already know how this works. Shopper’s render hooks follow the same concept.
Render hooks are organized into scoped classes by business domain under the Shopper\View namespace:

Registering a render hook

To register a render hook, call the Shopper::renderHook() method from a service provider’s boot method. The first argument is the hook constant, and the second is a closure that returns HTML:
Since all methods return the ShopperPanel instance, you can chain multiple calls:
You can also use hooks from different scoped classes to inject content into specific pages:

Available render hooks

Layout

Products

Orders

Customers

Collections

Catalog

Sales

Example: Wire Elements Modal

Example: Flux UI

Example: Laravel Notify

Adding control panel routes

If you need to have custom routes for the control panel:
  1. Create a routes file. Name it whatever you want, for example: routes/shopper.php
  2. Then add this to your shopper/routes.php file so that all routes are dynamically loaded:
  3. If you want to add middleware to further control access to the routes available in this file you can add in the key middleware of the shopper/routes.php file