Layout
AdminLTE 4 for Laravel ships a complete admin shell as Blade views. Your pages
extend the adminlte::page layout and fill in a few sections; the package
renders the navbar, sidebar, footer, color-mode toggle, command palette,
control sidebar and preloader around your content.
Extending the page layout
Most pages extend adminlte::page, which is a thin wrapper around
adminlte::master:
@extends('adminlte::page')
@section('title', 'Dashboard')
@section('content_header')
<h3 class="mb-0">Dashboard</h3>
@stop
@section('content')
<p>Welcome to your dashboard.</p>
@stop
Available sections and stacks
| Hook | Type | Purpose |
|---|---|---|
@section('title', '...') |
section | Page title. Combined with title_prefix / title_postfix and falls back to config('adminlte.title'). |
@section('content_header') |
section | Optional. Rendered inside .app-content-header (a container-fluid). Omit it entirely to drop the header bar. |
@section('content') |
section | Required. Your page body, rendered inside .app-content > .container-fluid. |
@push('css') |
stack | Per-page <link>/<style> tags, emitted in <head>. |
@yield('css') |
section | Same slot as @push('css'), for a single block. |
@push('js') |
stack | Per-page <script> tags, emitted at the end of <body>. |
@yield('js') |
section | Same slot as @push('js'), for a single block. |
@push('adminlte_css') |
stack | Early <head> CSS, output before the Vite bundle (via the adminlte_css section in page.blade.php). |
Scripts are placed at the bottom of
<body>, after@pluginScripts. CSS is placed in<head>, after the Vite bundle and before@pluginStyles.
Master layout structure
master.blade.php builds the document and the body class list from config, then
assembles the shell:
<body class="layout-fixed fixed-header ... sidebar-mini bg-body-tertiary">
preloader
.app-wrapper
partials.navbar (app-header)
partials.sidebar (app-sidebar)
main.app-main
.app-content-header (only if content_header section is defined)
.app-content (yields content)
partials.footer (app-footer)
partials.control-sidebar
@pluginScripts
@stack('js') / @yield('js')
</body>
Body classes driven by config
The <body> class list is assembled from these config keys:
| Config key | Class added |
|---|---|
layout_fixed_sidebar |
layout-fixed |
layout_fixed_navbar |
fixed-header |
layout_fixed_footer |
fixed-footer |
sidebar_breakpoint (default lg) |
sidebar-expand-{breakpoint} |
sidebar_mini |
sidebar-mini |
sidebar_collapse |
sidebar-collapse |
classes_body |
appended verbatim |
bg-body-tertiary is always added.
The <html> element reflects the active locale (lang), dir (from
layout_rtl), and an optional data-bs-theme="dark" when a $darkMode
variable is set in the view.
Navbar (partials/navbar.blade.php)
The top bar (.app-header) has a left and right side.
Left side:
- Sidebar toggle (
data-lte-toggle="sidebar"). - A Home link to
/. - A Documentation link to
config('adminlte.sidebar_docs_url'). - Any items registered for the
navbar-leftmenu scope (app('adminlte')->menu('navbar-left')).
Right side (ms-auto):
- A unified search pill (
data-adminlte-search) showing a⌘Khint. Clicking it (or pressing⌘K/Ctrl+K) opens the command palette. - Messages dropdown —
partials/navbar-messages.blade.php. - Notifications dropdown —
partials/navbar-notifications.blade.php. - Fullscreen toggle (
data-lte-toggle="fullscreen"). - Color-mode toggle (
partials/color-mode.blade.php), shown whenconfig('adminlte.color_mode_toggle', true). - User menu (
partials/usermenu.blade.php), shown whenconfig('adminlte.usermenu_enabled', true).
The navbar's wrapper classes come from classes_topnav
(default navbar-expand bg-body) and classes_topnav_container
(default container-fluid).
Command palette (⌘K)
partials/command-palette.blade.php renders a modal search dialog. It flattens
the sidebar menu into a searchable list of leaf links (skipping headers,
expanding submenus into a breadcrumb-style group label), then filters them
client-side by text or group. Keyboard support: ⌘K/Ctrl+K to toggle,
↑/↓ to move, Enter to navigate, Esc to close. Styles and script are
emitted inline (@once / @push('js')) because the partial renders inside the
body.
Messages & notifications dropdowns
Both are demo-data driven and meant to be replaced with real data in your app:
- Messages read
config('adminlte.navbar_messages', [...])(each item:name,text,time,star,img). The badge shows the message count. - Notifications read
config('adminlte.navbar_notifications', [...])(each item:icon,text,time) andconfig('adminlte.navbar_notifications_count')for the badge.
User menu
partials/usermenu.blade.php uses auth()->user() for the display name and
avatar (falling back to a bundled placeholder, or the user's
profile_photo_url when usermenu_image is enabled). The footer links to
usermenu_profile_url (default admin/profile) and posts to /logout for
sign-out.
Sidebar (partials/sidebar.blade.php)
The .app-sidebar contains:
- Brand — logo image (
logo_img) and HTML logo text (logo, default<b>Admin</b>LTE), linking to/. - Treeview menu — built from
app('adminlte')->menu('sidebar'), with each item rendered bypartials/menu-item.blade.php. The<ul>carriesdata-lte-toggle="treeview"(accordion off). - "View documentation" CTA — a bottom button shown only when
config('adminlte.sidebar_docs_url')is set. It collapses to icon-only in a mini sidebar and is hidden in a fully-collapsed (non-mini) sidebar.
Sidebar appearance is config-driven: sidebar_theme (dark adds
data-bs-theme="dark"), classes_sidebar (default bg-body-secondary shadow),
and classes_sidebar_nav.
Footer (partials/footer.blade.php)
Config-driven and rendered as raw HTML:
config('adminlte.footer_right')— right side (defaultVersion <b>4.0</b>), hidden on extra-small screens.config('adminlte.footer_left')— left side.
Color mode (light / dark / auto)
The color-mode dropdown offers Light, Dark and Auto (system
preference). The selection is wired by the core adminlte.js (published from
resources/js/adminlte.js) using data-bs-theme-value buttons and
data-lte-theme-icon icons. Auto is the default active option.
RTL
Set config('adminlte.layout_rtl', true). The master layout then sets
dir="rtl" on <html> and loads the prebuilt RTL stylesheet from
vendor/adminlte/css/adminlte.rtl.min.css. That file is copied into
public/vendor by php artisan adminlte:install (see the plugins doc).
Preloader
partials/preloader.blade.php renders a centered animated logo only when
config('adminlte.preloader', false) is enabled. It uses the bundled
vendor/adminlte/img/AdminLTELogo.png.
Control sidebar
partials/control-sidebar.blade.php renders a right-hand .control-sidebar
only when config('adminlte.control_sidebar', false) is enabled. Its theme
comes from control_sidebar_theme (default dark) and it exposes a $slot for
custom content. Toggle it with data-lte-toggle="control-sidebar".
Plugin asset directives
The master layout includes two directives that run at request time (not compile time), so plugins enabled by components on the current page are reflected:
@pluginStyles— in<head>, emits<link>tags for every enabled plugin's CSS.@pluginScripts— at the bottom of<body>, emits<script>tags for every enabled plugin's JS.
See plugins.md for details.
Minimal page example
@extends('adminlte::page')
@section('title', 'Reports')
@section('content_header')
<h3 class="mb-0">Reports</h3>
@stop
@section('content')
<x-adminlte-card title="Monthly summary">
<p>Your content here.</p>
</x-adminlte-card>
@stop
@push('css')
<style>.report-table th { white-space: nowrap; }</style>
@endpush
@push('js')
<script>console.log('Reports page ready');</script>
@endpush