Admin Theme Development
The admin theme powers the core dashboard, management interfaces, and settings of Billmora. By creating a custom admin theme, you can completely overhaul the look and feel of the back office without altering the core system files.
Creating Your Theme
Faster Development with CLI
We highly recommend using the Billmora Artisan CLI to scaffold your theme. It automatically generates the folder, theme.json, Vite configuration, and copies default Blade views as a starting point.
php artisan billmora:theme:make mytheme --type=admin- Create the Folder: Create a new folder under
/resources/themes/admin/(e.g.,mytheme). - Add
theme.json: Define your theme's metadata (see section below). - Configure Vite: Copy an existing
vite.config.jsinto your new theme folder to handle Tailwind CSS and JS compilation.
Theme Metadata (theme.json)
The theme.json file is required in the root of your theme folder for Billmora to discover and utilize it. For the admin theme, the type must be "admin", and the assets property must dictate where Vite drops compiled files.
{
"name": "My Custom Admin Theme",
"description": "A customized back-office experience.",
"author": "Your Name",
"version": "1.0.0",
"type": "admin",
"assets": "/themes/admin/mytheme"
}Theme Configuration (config.blade.php)
If you wish to allow Super Administrators to customize aspects of your Admin theme (like swapping logos or colors) without touching code, you can optionally include a config.blade.php file at the root. For more details on rendering admin configuration fields, see the Configuration Reference.
Compiling Assets
Because Billmora relies on environment variables to compile the correct theme, it is highly recommended to use npx cross-env to ensure cross-platform compatibility when building your theme.
To build your assets for production, run:
npx cross-env THEME=admin/mytheme vite buildTo run the Vite dev server with hot-module replacement (HMR), run:
npx cross-env THEME=admin/mytheme vite devOverriding Views
Any Blade file you place inside the views/ directory of your theme will strictly override the core Billmora view of the exact same name and path. For example, to override the admin dashboard view located at resources/views/admin/dashboard.blade.php, you would create: /resources/themes/admin/mytheme/views/dashboard.blade.php.
Distribution & Installation
Once your admin theme is complete, you can package it into a ZIP file for distribution or installation on other Billmora instances via the System > Themes section of the Admin panel.
You can easily package your theme using the Billmora Artisan CLI:
php artisan billmora:theme:export mytheme --type=adminThis command will automatically build your assets (if applicable), package them with the correct directory structure (placing all public-facing CSS/JS/Image files inside the assets/ folder), and save the distributable ZIP file to storage/app/exports/.
Alternatively, if you want to package it manually, refer to the Packaging for Distribution reference.
Full File Structure
Below is an overview of a fully configured Admin theme, taking the core moraine theme as a reference (organized with folders first). Use this hierarchy mapping when overriding template components.
/resources/themes/admin/moraine/
theme.json
vite.config.js
css
└── app.css
js
├── app.js
└── editor.js
views
├── index.blade.php
├── audits
│ ├── index.blade.php
│ ├── email
│ │ ├── index.blade.php
│ │ └── show.blade.php
│ ├── system
│ │ ├── index.blade.php
│ │ └── show.blade.php
│ └── user
│ └── index.blade.php
├── automations
│ └── index.blade.php
├── broadcasts
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── catalogs
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── components
│ ├── alert.blade.php
│ ├── browse.blade.php
│ ├── checkbox.blade.php
│ ├── input.blade.php
│ ├── multiselect.blade.php
│ ├── select.blade.php
│ ├── singleselect.blade.php
│ ├── slider.blade.php
│ ├── tabs.blade.php
│ ├── tags.blade.php
│ ├── textarea.blade.php
│ ├── toggle.blade.php
│ ├── editor
│ │ └── text.blade.php
│ ├── modal
│ │ ├── content.blade.php
│ │ └── trigger.blade.php
│ ├── radio
│ │ ├── group.blade.php
│ │ └── option.blade.php
│ └── table
│ └── sorthead.blade.php
├── coupons
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── domain-products
├── domains
├── gateways
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── health
│ └── index.blade.php
├── invoices
│ ├── create.blade.php
│ ├── edit.blade.php
│ ├── index.blade.php
│ ├── refund
│ │ └── index.blade.php
│ └── transaction
│ ├── create.blade.php
│ └── index.blade.php
├── layouts
│ ├── app.blade.php
│ ├── meta.blade.php
│ ├── script.blade.php
│ └── partials
│ ├── footer.blade.php
│ ├── header.blade.php
│ ├── pagination.blade.php
│ └── sidebar.blade.php
├── livewire
│ ├── invoices
│ │ ├── invoice-create.blade.php
│ │ └── invoice-edit.blade.php
│ ├── orders
│ │ └── order-create.blade.php
│ ├── packages
│ │ └── package-fields.blade.php
│ ├── registrants
│ │ └── registrant-edit.blade.php
│ ├── services
│ │ └── service-edit.blade.php
│ ├── tlds
│ │ ├── tld-create.blade.php
│ │ └── tld-edit.blade.php
│ └── variants
│ ├── option-create.blade.php
│ └── option-edit.blade.php
├── modules
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── orders
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── packages
│ ├── create.blade.php
│ ├── edit.blade.php
│ ├── index.blade.php
│ ├── fields
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ ├── pricing
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ ├── provisioning
│ │ └── index.blade.php
│ └── scaling
│ └── index.blade.php
├── plugins
│ └── index.blade.php
├── provisionings
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── registrants
│ ├── edit.blade.php
│ └── index.blade.php
├── registrars
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── services
│ ├── edit.blade.php
│ ├── index.blade.php
│ └── cancellations
│ ├── edit.blade.php
│ └── index.blade.php
├── settings
│ ├── index.blade.php
│ ├── api
│ │ ├── create.blade.php
│ │ └── index.blade.php
│ ├── auth
│ │ ├── social.blade.php
│ │ └── user.blade.php
│ ├── automation
│ │ ├── billing.blade.php
│ │ ├── scheduling.blade.php
│ │ ├── service.blade.php
│ │ └── ticket.blade.php
│ ├── captcha
│ │ ├── placement.blade.php
│ │ └── provider.blade.php
│ ├── currencies
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ ├── general
│ │ ├── company.blade.php
│ │ ├── credit.blade.php
│ │ ├── domain.blade.php
│ │ ├── invoice.blade.php
│ │ ├── misc.blade.php
│ │ ├── ordering.blade.php
│ │ ├── service.blade.php
│ │ ├── social.blade.php
│ │ └── term.blade.php
│ ├── mail
│ │ ├── mailer.blade.php
│ │ └── notification
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ ├── punishments
│ │ ├── create.blade.php
│ │ └── index.blade.php
│ ├── roles
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ ├── taxes
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── index.blade.php
│ └── ticket
│ ├── notify.blade.php
│ ├── piping.blade.php
│ └── ticketing.blade.php
├── tasks
│ └── index.blade.php
├── themes
│ └── index.blade.php
├── tickets
│ ├── create.blade.php
│ ├── edit.blade.php
│ ├── index.blade.php
│ └── reply
│ └── index.blade.php
├── tlds
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── index.blade.php
├── transactions
│ ├── create.blade.php
│ └── index.blade.php
├── update
│ ├── index.blade.php
│ └── progress.blade.php
├── users
│ ├── create.blade.php
│ ├── credits.blade.php
│ ├── index.blade.php
│ ├── invoices.blade.php
│ ├── profile.blade.php
│ ├── services.blade.php
│ ├── summary.blade.php
│ ├── tickets.blade.php
│ └── activity
│ ├── index.blade.php
│ └── show.blade.php
└── variants
├── create.blade.php
├── edit.blade.php
├── index.blade.php
└── option
├── create.blade.php
├── edit.blade.php
└── index.blade.php