Download
Download the Metronic Integration Examples from our GitHub repository .
The Laravel Livewire integration uses Metronic pre-built assets directly. You need to copy the compiled assets from your downloaded Metronic HTML package to complete the integration.
Clone Integration Repository
git clone https://github.com/keenthemes/metronic-tailwind-html-integration.git cd metronic-tailwind-html-integration/metronic-tailwind-laravel-livewire
Copy Metronic Assets
assets
folder from your metronic-tailwind-html-demos/dist
directory into the Laravel project's public/
directory. This creates the structure public/assets/
. # From your metronic-tailwind-html distribution cp -r /path/to/metronic-tailwind-html-demos/dist/assets/* public/assets/ # Verify the structure ls public/assets/ # Should show: css/ js/ media/ vendors/
Install Dependencies
# Install PHP dependencies composer install # Install Node.js dependencies npm install # Set up environment cp .env.example .env php artisan key:generate
Start Development Server
# Start Laravel development server php artisan serve # In another terminal, start Vite (for app assets only) npm run dev
http://127.0.0.1:8000
to see your Laravel Livewire app. You can explore both demo layouts: # Demo 1 - Sidebar Layout http://127.0.0.1:8000/demo1 # Demo 2 - Header Layout http://127.0.0.1:8000/demo2
If you prefer to create a project from scratch, follow the manual setup steps in the next sections.
Create Laravel Project
This guide assumes you have PHP 8.2+ and Composer installed. For detailed Laravel installation instructions, refer to the official Laravel documentation .
Create Laravel Project with Livewire
# Create new Laravel project composer create-project laravel/laravel metronic-livewire cd metronic-livewire # Install Livewire and Alpine.js composer require livewire/livewire npm install alpinejs # Set up environment cp .env.example .env php artisan key:generate
Create Metronic Directory Structure
# Create Livewire component directories for Metronic demos mkdir -p app/Livewire/Demo1 mkdir -p app/Livewire/Demo2 mkdir -p app/Livewire/Shared # Create view directories for Metronic layouts mkdir -p resources/views/livewire/demo1 mkdir -p resources/views/livewire/demo2 mkdir -p resources/views/livewire/shared mkdir -p resources/views/layouts/demo1 mkdir -p resources/views/layouts/demo2 mkdir -p resources/views/layouts/partials # Create assets directory for Metronic pre-built files mkdir -p public/assets
Test Basic Setup
# Run database migrations php artisan migrate # Start development server php artisan serve # In another terminal, build assets npm run dev
http://127.0.0.1:8000
. Your project foundation is now ready for Metronic integration! For detailed information about Laravel features like routing, controllers, and middleware, refer to the Laravel documentation . For Livewire concepts like components, properties, and actions, see the Livewire documentation .
Integrate Core
This section focuses on Metronic-specific integration. For detailed Livewire component concepts, refer to the Livewire Components documentation .
Create Demo Routes
// routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Livewire\Demo1\Index as Demo1Index; use App\Livewire\Demo2\Index as Demo2Index; Route::get('/', function () { return redirect()-> route('demo1.index'); }); // Demo1 routes Route::get('/demo1', Demo1Index::class)->name('demo1.index'); // Demo2 routes Route::get('/demo2', Demo2Index::class)->name('demo2.index');
Generate Essential Metronic Components
# Generate main demo index components php artisan livewire:make Demo1.Index php artisan livewire:make Demo2.Index # Generate shared topbar components (essential for both demos) php artisan livewire:make Shared.TopbarUserDropdown php artisan livewire:make Shared.MegaMenu php artisan livewire:make Shared.ThemeToggle
Key Metronic Integration Requirements
Data Attributes
Preserve all data-kt-*
attributes for Metronic JavaScript functionality •
Component Structure
Organize Demo1 (sidebar-based) and Demo2 (header-based) separately •
Shared Components
Reuse topbar elements across both demo layouts •
Layout Integration
Components must work within Metronic's HTML structure Configure Demo Layout Components
// app/Livewire/Demo1/Index.php - Key Metronic integration class Index extends Component { public function render() { return view('livewire.demo1.index') ->layout('layouts.demo1.base'); // Metronic Demo1 layout } }
Test Core Integration
# Clear any cached views php artisan view:clear # Start the development server php artisan serve # Test the routes curl -I http://127.0.0.1:8000/demo1 curl -I http://127.0.0.1:8000/demo2
Integrate Styles
This section assumes you have completed the "Integrate Core" steps. Metronic uses pre-compiled assets, so no Tailwind compilation is required.
Copy Metronic Assets
# Navigate to your Laravel project root cd your-laravel-project # Copy assets from Metronic HTML package # Replace /path/to/metronic-tailwind-html with your actual path cp -r /path/to/metronic-tailwind-html-demos/dist/assets/* public/assets/ # Verify the assets are copied ls -la public/assets/ # You should see directories like: # css/, js/, media/, vendors/
Create Layout Partials
{{-- resources/views/layouts/partials/head.blade.php --}} <title> {{ product.capitalize() }} - Tailwind CSS </title> <meta charset="utf-8"/> <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/> {{-- Metronic Fonts --}} <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"/> {{-- Metronic Vendor Stylesheets --}} <link href="{{ asset('assets/vendors/apexcharts/apexcharts.css') }}" rel="stylesheet"/> <link href="{{ asset('assets/vendors/keenicons/styles.bundle.css') }}" rel="stylesheet"/> {{-- Metronic Main Stylesheet --}} <link href="{{ asset('assets/css/styles.css') }}" rel="stylesheet"/>
{{-- resources/views/layouts/partials/scripts.blade.php --}} {{-- Metronic Core JavaScript --}} <script src="{{ asset('assets/js/core.bundle.js') }}"> </script> <script src="{{ asset('assets/vendors/ktui/ktui.min.js') }}"> </script> {{-- Metronic Vendor Scripts --}} <script src="{{ asset('assets/vendors/apexcharts/apexcharts.min.js') }}"> </script> {{-- Metronic Layout Scripts --}} <script src="{{ asset('assets/js/widgets/general.js') }}"> </script> <script src="{{ asset('assets/js/layouts/demo1.js') }}"> </script>
Create Base Layout Templates
{{-- resources/views/layouts/demo1/base.blade.php --}} <!DOCTYPE html> <html class="h-full" data-kt-theme="true" data-kt-theme-mode="light" dir="ltr" lang="en"> <head> @include('layouts.partials.head') @livewireStyles </head> <body class="antialiased flex h-full text-base text-foreground bg-background demo1 kt-sidebar-fixed kt-header-fixed"> <livewire:shared.theme-toggle> </livewire:shared.theme-toggle> <div class="flex grow"> <livewire:demo1.sidebar> </livewire:demo1.sidebar> <div class="kt-wrapper flex grow flex-col"> <livewire:demo1.header> </livewire:demo1.header> <main class="grow pt-5" id="content" role="content"> {{ $slot }} </main> <livewire:demo1.footer> </livewire:demo1.footer> </div> </div> @include('layouts.partials.scripts') @livewireScripts </body> </html>
Configure Asset Serving
# For development, assets are served directly from public/assets/ # No additional configuration needed # For production, ensure proper asset permissions chmod -R 755 public/assets/ # Verify asset URLs work curl -I http://127.0.0.1:8000/assets/css/styles.css curl -I http://127.0.0.1:8000/assets/js/core.bundle.js
Test Asset Integration
# Start the development server php artisan serve # Test asset accessibility curl -I http://127.0.0.1:8000/assets/css/styles.css curl -I http://127.0.0.1:8000/assets/js/core.bundle.js curl -I http://127.0.0.1:8000/assets/vendors/keenicons/styles.bundle.css # Check browser console for any 404 errors # Visit: http://127.0.0.1:8000/demo1
For advanced asset management strategies in Laravel, including CDN integration and optimization, refer to the Laravel Filesystem documentation .
Convert Layouts
Key Conversion Principles
Data Attributes
Keep all data-kt-*
attributes for Metronic JavaScript functionality •
CSS Classes
Preserve kt-*
classes and Metronic structure •
Asset References
Convert to Laravel's {{ asset() }}
helper •
Component Integration
Replace static content with Livewire components Convert Demo1 Header Component
{{-- resources/views/livewire/demo1/header.blade.php --}} <header class="kt-header fixed top-0 z-10 start-0 end-0 flex items-stretch shrink-0 bg-background" data-kt-sticky="true" data-kt-sticky-class="border-b border-border" data-kt-sticky-name="header" id="header"> <div class="kt-container-fixed flex justify-between items-stretch lg:gap-4" id="headerContainer"> {{-- Mobile Logo --}} <div class="flex gap-2.5 lg:hidden items-center -ms-1"> <a class="shrink-0" href="{{ route('demo1.index') }}"> <img class="max-h-[25px] w-full" src="{{ asset('assets/media/app/mini-logo.svg') }}"/> </a> <div class="flex items-center"> <button class="kt-btn kt-btn-icon kt-btn-ghost" data-kt-drawer-toggle="#sidebar"> <i class="ki-filled ki-menu"> </i> </button> <button class="kt-btn kt-btn-icon kt-btn-ghost" data-kt-drawer-toggle="#mega_menu_wrapper"> <i class="ki-filled ki-burger-menu-2"> </i> </button> </div> </div> <livewire:shared.mega-menu> </livewire:shared.mega-menu> {{-- Topbar --}} <div class="flex items-center gap-2.5"> <livewire:shared.topbar-search-modal> </livewire:shared.topbar-search-modal> <livewire:shared.topbar-notification-dropdown> </livewire:shared.topbar-notification-dropdown> <livewire:shared.topbar-chat> </livewire:shared.topbar-chat> <livewire:shared.topbar-apps> </livewire:shared.topbar-apps> <livewire:shared.topbar-user-dropdown> </livewire:shared.topbar-user-dropdown> </div> </div> </header>
Create Shared Topbar Components
{{-- resources/views/livewire/shared/topbar-user-dropdown.blade.php --}} <div class="kt-menu" data-kt-menu="true"> <div class="kt-menu-item" data-kt-menu-item-offset="0, 10px" data-kt-menu-item-placement="bottom-end" data-kt-menu-item-toggle="dropdown" data-kt-menu-item-trigger="click"> <button class="kt-menu-toggle kt-btn kt-btn-icon"> <img alt="User Avatar" class="size-8 rounded-full" src="{{ asset('assets/media/avatars/300-2.jpg') }}"/> </button> <div class="kt-menu-dropdown w-screen max-w-xs"> {{-- User dropdown content with Metronic structure --}} <div class="kt-menu-content"> {{-- Preserve all data-kt-* attributes and kt-* classes --}} </div> </div> </div> </div>
Preserve JavaScript Functionality
// resources/js/app.js import Alpine from 'alpinejs'; // Initialize Metronic functionality document.addEventListener('DOMContentLoaded', function() { initializeMetronicComponents(); }); // CRITICAL: Re-initialize after Livewire updates document.addEventListener('livewire:navigated', function() { initializeMetronicComponents(); }); // CRITICAL: Re-initialize after any Livewire content updates document.addEventListener('livewire:updated', function() { initializeMetronicComponents(); }); // Centralized Metronic component initialization function initializeMetronicComponents() { // Initialize all Metronic components if (window.KTDrawer) { KTDrawer.createInstances(); } if (window.KTMenu) { KTMenu.createInstances(); } if (window.KTSticky) { KTSticky.createInstances(); } if (window.KTScrolltop) { KTScrolltop.createInstances(); } if (window.KTImageInput) { KTImageInput.createInstances(); } if (window.KTPasswordMeter) { KTPasswordMeter.createInstances(); } // Add other Metronic components as needed } window.Alpine = Alpine; Alpine.start();
Asset Path Conversion
{{-- Convert image sources --}} {{-- FROM: src="assets/media/logos/logo.svg" --}} {{-- TO: --}} src="{{ asset('assets/media/logos/logo.svg') }}" {{-- Convert background images in CSS --}} {{-- FROM: background-image: url('assets/media/patterns/pattern-1.jpg') --}} {{-- TO: --}} style="background-image: url('{{ asset("assets/media/patterns/pattern-1.jpg") }}')" {{-- Convert icon references --}} {{-- FROM: <i class="ki-filled ki-menu"> </i> --}} {{-- TO: --}} <i class="ki-filled ki-menu"> </i> {{-- No change needed for icon classes --}}
Complete Demo Layout Integration
Demo1
Sidebar-based layout with header, sidebar, and footer components •
Demo2
Header-based layout with navbar, toolbar, and footer components •
Shared Components
Reusable topbar elements across both demos •
Data Preservation
All Metronic data-kt-*
attributes maintained Test Complete Integration
# Start the development server php artisan serve npm run dev # Test both layouts # http://127.0.0.1:8000/demo1 (Sidebar layout) # http://127.0.0.1:8000/demo2 (Header layout) # Verify in browser: # - Metronic styling loads correctly # - JavaScript functionality works (menus, dropdowns, etc.) # - Livewire components render properly # - No console errors
For complete component examples with Metronic HTML structures, refer to the actual project files in metronic-tailwind-laravel-livewire/resources/views/livewire/
from the downloaded integration package.