All notable changes to colorlibhq/adminlte-laravel will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Charts use Chart.js 4 (MIT) instead of ApexCharts. From 5.2.0 ApexCharts
ships under its own proprietary licence rather than MIT, and
adminlte:installasked forapexcharts@^6.8, so every install pulled in a library whose terms can require a commercial licence once the app is used by others. The installer now addschart.js@^4.5, and the package no longer references ApexCharts anywhere. - The
apexchartsplugin is replaced bychartjs, which loadsvendor/chartjs/chart.umd.min.jsand a small preset the package ships,vendor/adminlte/js/charts.js. The preset themesChart.defaultsfrom the page's CSS variables, re-themes every chart when the light/dark/auto toggle or the text direction changes, resizes charts shown in tabs, modals and collapsed cards, and renders<x-adminlte-chart>.adminlte:installcopies both files. An app whose publishedconfig/adminlte.phppredates this release has nochartjsentry; the plugin is registered anyway, so charts work without editing the config. <x-adminlte-chart>renders a<canvas>(theidprop is now the canvas id, soChart.getChart(id)returns the chart). Its props are unchanged:typeacceptsarea,line,bar,pie,donut,radar,polarArea,scatter,bubbleandsparkline;optionsnow takes Chart.js options. Options written for the old component are translated where Chart.js has an equivalent (colors,labels,chart.stacked,chart.sparkline.enabled,plotOptions.bar.horizontal,legend.show/position,stroke.curve/width,xaxis.categories,yaxis.min/max); the rest are dropped. The ApexCharts toolbar (zoom, SVG/PNG download) is gone.- The Dashboard v1, v2 and v3 demo pages draw their charts with Chart.js: the same area, line, bar, donut and sparkline charts, in theme colours that follow dark mode (the old charts kept light-mode gridlines and labels).
- The published
resources/js/adminlte.jsstub no longer contains a chart initializer; the preset does that job.
window.AdminLteCharts(create,sparkline,color,alpha,palette,refresh,init) for charts written by hand, andComponents\Tool\Chart::config(), which returns the Chart.js config as an array. Seedocs/plugins.md.
<x-adminlte-chart>lost itstypeandheightwheneveroptionsheld achartkey (for example['chart' => ['stacked' => true]]drew a line chart), and pie/donut charts ignoredcategoriesand labelled their slicesseries-1,series-2, and so on.
composer update colorlibhq/adminlte-laravel
npm uninstall apexcharts
npm install -D chart.js@^4.5
php artisan adminlte:install --only=assets --no-interaction-deps
rm -rf public/vendor/apexcharts
npm run build- Files you published earlier are not updated by
composer update. Until you re-publish them they keep their ApexCharts code:- Published views (
adminlte:install --only=views, inresources/views/vendor/adminlte): the demo dashboards keep callingnew ApexCharts(...), and the oldcomponents/tool/chart.blade.phprenders an empty box because nothing initialises it any more. Re-publish withphp artisan vendor:publish --tag=adminlte-views --force(copy your own edits first), or delete the files you did not change. resources/js/adminlte.js: its ApexCharts block does nothing once the library is gone. Delete it, or re-publish withphp artisan vendor:publish --tag=adminlte-assets --forceif you have not customised the file.config/adminlte.php: remove theapexchartsentry underplugins. Achartjsentry is optional; add one only to change its paths or load it on every page.
- Published views (
- Your own charts written against ApexCharts need porting to Chart.js;
AdminLteCharts.create(el, config)gives them the theme and dark-mode handling.
- The activity log no longer stores secrets. The published
LogsActivitytrait records every changed attribute of a model, so when it was added toUser, password hashes, remember tokens and 2FA secrets ended up inactivity_log.properties.ActivityLoggernow drops the subject model's$hiddenattributes and any key matchingpassword,secret,token,api_key,private_keyorrecovery_codesbefore writing a row; list other keys in the newadminlte.activity_log.redactconfig option. Because the filtering lives in the package, apps that already published the trait are covered aftercomposer update. - A new package migration,
redact_secrets_in_adminlte_activity_log, removes such values from rows earlier versions stored. The package now registers itsdatabase/migrationsdirectory, sophp artisan migratepicks it up; it only touches the tableadminlte:scaffold activity-logcreates and does nothing when that table is absent. - The activity log viewer requires the
view-activityability. The publishedActivityControllercallsGate::authorize('view-activity'), and the package defines a default gate: with RBAC, admins and roles holding the newview-activitypermission (seeded foradmin); without RBAC, any signed-in user, as before. Previously every signed-in user could read every other user's sign-ins, IP addresses and changes. Apps that scaffolded the viewer earlier should add theGate::authorizeline to their published controller (seedocs/activity-log.md) and re-runAdminLteRbacSeederto create the permission.
-
Menu items defined with
routeare now highlighted as the current page (#20).ActiveFilteronly ever auto-derived its match pattern fromurl, so a route-driven item never became active — and neither did its treeview parent, which meant the submenu did not render expanded either. The scaffolded sections all suggest route-based menu entries, so following the documented path produced a sidebar that never highlighted anything.The pattern now comes from the item's resolved
href, whichHrefFilterhas already derived fromrouteorurlone step earlier in the pipeline, rather than from a second route lookup. Links to another host,#placeholders, explicitactivepatterns and explicit booleans all behave as before, and aurlof'/'still matches only the site root. Thanks @ruanpepe for finding it and for the original patch.
UserTable::modelClass()— resolves the Eloquent class backing the app's users from the default guard's provider, defaulting toApp\Models\User.{{ users_model_import }}and{{ users_model_ref }}stub placeholders. The first renders what followsuse(aliasedas Userwhen the model's short name is something else); the second renders an inline reference and is namespace-aware — a bare short name when the stub already sits in the model's namespace, fully qualified with a leading separator anywhere else, so PHP cannot resolve it against the stub's own namespace.
-
adminlte:scaffoldandadminlte:make-authno longer publish code that hardcodesApp\Models\User(#19). That is only the Laravel 8+ convention: codebases upgraded from Laravel 6/7 keepApp\User, and apps are free to put the model in a namespace of their own — 29 stubs named it outright, so every scaffolded policy, factory, seeder, feature test, and model relation pointed at a class those apps do not have. Thanks @ruanpepe for raising it and for the original patch.Output for an app on the conventional
App\Models\Useris byte-for-byte what it was in 1.5.0.The primary key remains deliberately unresolved. Pointing a foreign key at a differently named key column without also changing the column type produces a migration the database rejects —
foreignId()emitsbigint unsigned, soconstrained('users', 'uuid')yields a constraint MySQL and PostgreSQL both refuse. A user model on a non-conventional key still needs its foreign keys adjusted by hand;docs/scaffolding.mdsays so.
ColorlibHQ\AdminLte\Support\UserTable— resolves the table backing the app's users (an authenticated Eloquent user answers for itself; otherwise the default guard's provider config,tablefor thedatabasedriver or themodelit names foreloquent;usersas the fallback). Package code and the console commands both ask it rather than hardcoding the conventional name.ColorlibHQ\AdminLte\Console\Concerns\RendersStubs— the placeholder substitutionadminlte:scaffoldandadminlte:make-authrun over every stub they publish. Stubs write{{ users_table }}; the resolved name is baked into the published file, so generated migrations name their table outright instead of consulting config at run time.
-
The navbar message dropdown no longer assumes the user table is called
userswith anidkey.NavbarData::messages()now resolves the table from the authenticated user (an Eloquent model answers for itself; thedatabaseprovider'sGenericUseris read offauth.providers.*.table, falling back tousers) and joins ongetAuthIdentifierName()instead of a hardcodedu.id. Apps with a renamed users table or a custom auth model previously got a "no such table: users" error on every authenticated page render. Thanks @ruanpepe for reporting and for the original patch (#17). -
adminlte:scaffoldandadminlte:make-authno longer publish code that hardcodes theuserstable (#18). Seven migrations usedconstrained('users'), sophp artisan migratefailed outright on an app that had renamed it;DashboardController,ChatController, the profile migration,StoreMessageRequest,UpdateProfileRequest, the RBACUserController,RegisterController, and the publishedProfileTestall named the table orusers.idin queries and validation rules. Every one now goes through the placeholder. Output for an app on the conventionaluserstable is byte-for-byte what it was.The primary key is deliberately untouched: the scaffold's
foreignId()columns presume abigintid, so a user model on a UUID key still needs those foreign keys adjusted by hand. This is now stated indocs/scaffolding.md.
-
Bumped the AdminLTE version advertised by
adminlte:install(and the matching README/docs) to the current latest:admin-lte@^4.8(was^4.3). No other advertised package moved. Verified against the published 4.8.1 tarball that every path this package consumes still exists —admin-lte/dist/css/adminlte.css,admin-lte/dist/css/adminlte.rtl.min.css(vendor-copied by the installer) andadmin-lte/src/scss/adminlte(the Option B source build in the published CSS stub) — and that the--bs-*custom properties the theme colors override are untouched.What the core releases in that range bring to an app on this package:
- 4.4.0 — opt-in extended palette (
admin-lte/dist/css/adminlte-colors.css, 14 colours plus sidebar/navbar skins) and a fix that lets.sidebar-wrapperfill the sidebar. The package'spartials/sidebar.blade.phpuses that class, so the fix applies with no change here. - 4.5.0 —
admin-lte/dist/css/adminlte-colors-v3.css, the 18 AdminLTE 3 colours exactly as they were, for apps ported from v3. - 4.6.0 —
data-lte-primary="teal"on<html>promotes any palette colour to Bootstrap'sprimary(buttons, links, pagination, form focus rings). - 4.7.0 —
data-lte-print="plain"for pages meant to print as documents. - 4.8.0 —
data-lte-contrast="aa"for WCAG AA text on the v3 palette. - 4.8.1 — pagination focus-ring fix.
Both palette stylesheets are opt-in and additive: add the one you want to
resources/css/adminlte.cssnext to the existingadmin-lte/dist/css/adminlte.cssimport. Thedata-lte-*attributes go on<html>, which this package renders inresources/views/master.blade.php(andauth/auth-master.blade.php,layouts/errors-master.blade.php). Nothing is enabled by default, so an install that changes nothing looks exactly as it did. - 4.4.0 — opt-in extended palette (
- Navbar documentation link now respects
sidebar_docs_urlconfig. Whensidebar_docs_urlis set tofalseto hide the documentation CTA in the sidebar, the documentation link in the navbar is now also hidden, making behaviour consistent across both locations.
- Documentation:
usermenu_profile_urlwas documented as taking'profile'after scaffolding.adminlte:scaffoldregisters its routes in a group prefixedadmin, so the correct value is'admin/profile'. The 1.3.0 notes also claimed nothing in the package served/admin/profile; that was wrong. Hiding the link when the key isfalse— the actual behaviour change — is unaffected and still matches what the docs have always said.
Three config blocks that have shipped since 1.0 — auth_logo and the six
usermenu_* keys — were never read by any view, and the lockscreen rendered
against class names AdminLTE 4 does not define. All of it now works.
Upgrading: the usermenu_* keys default to false, so honouring them
hides the user dropdown's coloured header, its avatar and its Profile button
on apps that were relying on the hardcoded markup. Set usermenu_header,
usermenu_image and usermenu_desc to true — and usermenu_profile_url to
a path — to keep the previous appearance.
ColorlibHQ\AdminLte\Http\Middleware\DemoUserMenu, applied to the bundled demo route group. It turns the user-menu header, avatar and description on fordemo/*requests only, so the showcase keeps the full AdminLTE dropdown while a fresh install still gets the plain one. Seedocs/demo-pages.md.
auth_logois wired up. The config block has shipped since 1.0 but no view ever read it, so enabling it did nothing. The auth pages now render the configured image — honouringclass,widthandheight, and omitting each attribute when its config value is empty — above the textlogo. Withauth_logo.enabledleft at itsfalsedefault the auth pages are unchanged.- The user-menu config keys did nothing.
usermenu_header,usermenu_header_class,usermenu_imageandusermenu_deschave shipped since 1.0 but the partial ignored all four and hardcoded the header, the avatar and the "member since" line. They are now honoured. Note the defaults are allfalse, so the dropdown header is hidden unless you turn it on — setusermenu_headerandusermenu_imagetotrueto keep the previous appearance. The bundled demo pages do exactly that for themselves via the newDemoUserMenumiddleware, so the showcase keeps the coloured header and the 90px avatar without changing what a fresh install ships.usermenu_header_classdefault corrected totext-bg-primary;bg-primaryalone sets no contrasting foreground color. usermenu_profile_url => falsenow hides the "Profile" link as the docs have always claimed, instead of silently falling back to/admin/profile. With the link hidden, "Sign out" fills the footer. To keep the link, set the key to'admin/profile'— the pathadminlte:scaffold profilecreates.- The lockscreen rendered unstyled. It extended the auth card layout, which
produced
.lockscreen-page/.lockscreen-box— neither exists in AdminLTE 4. The page's real styles are all scoped under a.lockscreenbody class, so none of them applied. It is now a standalone layout carrying that class, and posts to thepassword.confirmroute (falling back to the bare path when auth hasn't been scaffolded) instead of tologin, which could never have succeeded from a password-only form. Reported by @ruanpepe.
- Theme colors are now real config keys.
primary_color,sidebar_color,navbar_colorandfooter_colorrepaint the chrome without compiling SCSS. Each is injected into the layout<head>as a block of CSS custom-property overrides by the newColorlibHQ\AdminLte\Support\ThemeColors; all four default tonull, in which case nothing is emitted and the stock AdminLTE palette applies untouched.primary_coloralso recomputes the hover/active button shades with Bootstrap'sshade-color()weights and picks button text the way Bootstrap'scolor-contrast()does, so a custom brand color behaves like a recompiled$primaryinstead of a flat swap. Values are validated against a strict#rgb/#rrggbbpattern and anything else is dropped — the block is rendered unescaped, so only hex is safe to put in it. Applies to the main, auth and error layouts. Seedocs/configuration.md.
-
The control sidebar is now a Bootstrap Offcanvas, and actually works. It was rendering AdminLTE 3 markup:
.control-sidebar/.control-sidebar-dark/.control-sidebar-contentplusdata-lte-toggle="control-sidebar". AdminLTE 4 dropped that component — the string does not appear anywhere in 4.1 or 4.3, in the CSS, the JS or the SCSS source — so there were no styles, no toggle handler, and no grid area for a right-hand panel. Settingcontrol_sidebar => truedid not give you a panel that failed to open; it injected an unstyled, permanently visible block into the layout grid after the footer, and nothing in the package could open or close it.It is now a Bootstrap Offcanvas (
#adminlte-control-sidebar), which brings the backdrop, Esc-to-close and focus trap for free and needs no custom CSS or JS — Bootstrap is already imported by the publishedresources/js/adminlte.js. Enablingcontrol_sidebaralso adds the gear toggle to the navbar that was missing, so the panel can be opened at all.control_sidebar_themenow does something too: it is applied asdata-bs-themeon the panel. Fill the body with@section('control_sidebar')or@push('control_sidebar'); the$slotpath still works for direct includes.If you styled the old class names yourself, retarget those rules at
#adminlte-control-sidebar. In practice nothing rendered before, so this is unlikely to affect anyone. -
Bumped the frontend dependency versions advertised by
adminlte:install(and the matching README/docs) to the current latest:admin-lte@^4.3(was^4.1) andapexcharts@^6.8(was^6.7). Every other advertised package was already at its current minor.fullcalendarstays at^6.1for the reason recorded inInstallCommand: v7 drops the minified global bundle this package copies and swaps the bundled CSS for a skeleton + theme + palette model. Verified against the published tarballs that every vendor-copied source path still exists at the versions these ranges now resolve to, and that the--bs-*custom properties the theme colors override are unchanged between admin-lte 4.1.0 and 4.3.1. Dev:orchestra/testbench^11.2,larastan/larastan^3.10.
- Every color picker on the Theme Generator demo rendered Bootstrap blue.
The page passed
value="#343a40"to<x-adminlte-input-color>, which has novalueprop — so the color fell through to$attributes->merge()and was appended after the component's ownvalue, and browsers keep the first of two duplicate attributes. All four swatches showed#0d6efdregardless of what the page asked for. They now use the documenteddefaultprop and are seeded from config. Reported and originally fixed by @ruanpepe in #8. - The Theme Generator emitted a config snippet that did nothing. Four of the
five keys it told you to paste were never read by the package, and
color_modewas not a config key at all. It now writes only keys that exist, previews every change live on the page, seeds each control from the running config, and labels the color-mode select as preview-only (the runtime mode comes from the topbar toggle and the visitor's system preference). - Color inputs on the Theme Generator now use the component's
labelprop, so each label is actually associated with its input instead of floating loose.
-
Flatpickr, Tom Select, Tabulator and Quill never worked. All four optional plugins were broken end to end, so
<x-adminlte-editor>,<x-adminlte-input-flatpickr>,<x-adminlte-input-tom-select>and<x-adminlte-datatable>rendered inert markup no matter how the app was set up. Two independent gaps, both fixed:adminlte:installnever copied the four libraries out ofnode_modules, even thoughconfig('adminlte.plugins')pointed atpublic/vendor/{quill,flatpickr,tom-select,tabulator-tables}/…. Every@pluginScriptstag they emitted 404'd. They're now in the installer's copy map, andInstallCommandTestasserts that every configured plugin asset has a matching copy source so this can't regress.- The published
resources/js/adminlte.jshad no initializer for any of them, so even a hand-copied library did nothing. It now shipsinitDatePickers(),initTomSelects(),initDatatables()andinitEditors()alongside the existing four, each feature-detecting its global and skipping elements it has already wired.
Quill in particular now seeds itself from the component's hidden input, mirrors its HTML back on every change so a plain form POST submits the content, and writes
''instead of<p><br></p>when emptied sorequired/nullablevalidation behaves. (#6) -
adminlte:installnow copies vendor files on--only=assets, and after a declined npm prompt or--no-interaction-deps. Previously the copy step ran only on a full interactive install where the prompt was accepted, so anyone managing npm themselves silently got an emptypublic/vendor. Re-runningadminlte:install --only=assetsis now the documented way to pick up a plugin installed after the initial setup.
adminlte:statusgroups its output into Required, Optional and Optional plugins, and lists the four optional plugin libraries so a half-finished install is visible. Opt-in resources (published views, scaffolded sections) no longer render as a red ✗ that triggers a "resources are missing" warning — they were never part of a default install, and the warning sent people to re-run a command that wouldn't have created them.- Bumped the frontend dependency versions advertised by
adminlte:install(and the matching README/docs) to the current latest:apexcharts@^6.7(was^5.16) andsass@^1.102.fullcalendarstays at^6.1: v7 drops the minified global bundle entirely (index.global.min.jsis gone in favour of an unminifiedall/global.js) and replaces the bundled CSS with askeleton.css+ theme + palette model, which the calendar component needs explicit work to support. laravel/pintdev constraint raised to^1.30.
adminlte:installCSS stub now imports OverlayScrollbars via the export-safeoverlayscrollbars/overlayscrollbars.cssspecifier. The oldoverlayscrollbars/styles/overlayscrollbars.csspath is absent from the package'sexportsmap before 2.5.0, so Vite/PostCSS failed on installs resolving to overlayscrollbars 2.0–2.4 (Missing "./styles/…" specifier). The short specifier resolves across the whole 2.x range. (#3)
- Bumped the frontend dependency versions advertised by
adminlte:install(and the matching README/docs) to the current latest:admin-lte@^4.1,overlayscrollbars@^2.16,apexcharts@^5.16,sass@^1.101,tom-select@^2.6,tabulator-tables@^6.5.fullcalendarstays at^6.1— v7 drops the bundled CSS and Bootstrap 5 theme the calendar component relies on. Nocomposer.jsonchanges: every PHP constraint already allows the current major (verified green against Laravel 13.19, PHPUnit 13.2.4, Pint 1.29.3, Larastan 3.10). - CI:
actions/checkoutupgraded v6 → v7. (#2)
- Dev tooling only — nothing changes for consuming apps:
phpunit/phpunitconstraint widened to^12.4 || ^13.0(PHPUnit 13 requires PHP ≥ 8.4.1, which madecomposer updateunresolvable for contributors and CI on PHP 8.3).- PHPStan: ignore the always-false
class_exists('App\…')finding the latest release reports for the service provider's intentional consuming-app guards.
First stable release. The package now offers full AdminLTE 4 demo parity, 40 Blade components, an 18-section scaffolding system, dependency-free RBAC, 9 complete locales, in-app docs, and a 57-test suite — Pint, PHPStan level 8 and PHPUnit run green on PHP 8.3–8.5 / Laravel 13.
- Native, dependency-free RBAC via
adminlte:scaffold rbac: roles & permissions tables,Role/Permissionmodels, aHasRolestrait wired into theUsermodel (idempotent),role:/permission:middleware, a seeder (admin/editor/viewer), and a Users/Roles management UI under/admin. - The service provider opportunistically wires it when present (guarded by
class_exists): registers the scaffolded model policies, aliases therole/permissionmiddleware, and adds a permission-awareGate::before(admins pass everything; otherwise abilities resolve against permissions, so@can('manage-x')and menu'can' => 'manage-x'just work). - An ADMINISTRATION sidebar section (Users, Roles), gated by
can.
- DB-backed sections now also generate model factories (
HasFactory), Form Requests (validated writes), Policies (controllers callauthorize()), and feature tests intests/Feature/AdminLte/.
- Data-driven dashboard (
adminlte:scaffold dashboard): aDashboardController+ view rendering real aggregates (users, projects, unread messages, upcoming events, projects-by-status, recent activity), each guarded by table existence. - Notifications (
adminlte:scaffold notifications): standard Laravel database notifications, a notifications page, and aNavbarDatahelper that feeds the navbar bell and messages dropdowns from real data (unread notifications / unread mailbox messages) with graceful fallback to demo data. - Account management — the
profilescaffold is now a tabbed account page: avatar upload, change password, active sessions + log-out-other-devices, and delete account. - Impersonation (
adminlte:scaffold impersonation): RBAC-gated "log in as" from the Users table, a revert banner on every page, and audit logging. - Activity/audit log (
adminlte:scaffold activity-log): anactivity_logtable,Activitymodel, aLogsActivitymodel trait, a viewer, and automatic auth-event logging (login/logout/failed) via the service provider — all throughColorlibHQ\AdminLte\Support\ActivityLogger. - API tokens (
adminlte:scaffold api): a Sanctum personal-access-token management UI,HasApiTokenswired intoUser(trait_exists-guarded), and an exampleauth:sanctumendpoint. Requiresphp artisan install:api. - Real-time (
adminlte:scaffold realtime): aNewChatMessagebroadcast event, conversation channel authorization, and an Echo listener bundle for live chat & notifications. Degrades gracefully without a broadcaster.
- Login rate limiting (5 attempts per email+IP), email verification
(controller, view, signed/throttled routes;
Usermade to implementMustVerifyEmail), and password confirmation (controller, view,password.confirmroute).
- New guides:
authorization,account-management,notifications,activity-log,dashboard,api,realtime, anddeployment— all registered in the in-app docs nav and thedocs/index, and cross-linked fromscaffolding.md.
- All 9 locales are now complete. Backfilled the missing keys (33 in
de/es, 76 infr/it/ja/pt_BR/ru/zh) covering account management, email verification, sessions, impersonation, API tokens, activity log, navbar, and the RBAC UI. AdminLte::add()— append menu items at runtime; andaddAfter()now really splices items after the item whosekey/text/headermatches (it previously appended to the end regardless of the key).- Accessibility: decorative icons are
aria-hidden; form components link validation errors viaaria-describedby/aria-invalid; sidebar submenu toggles exposearia-expanded(kept in sync by the publishedapp.js); the command palette is a propercombobox/listboxwitharia-activedescendant. - Composer scripts:
composer test/lint/fix/analyse/check(analysebakes in the--memory-limit=1GPHPStan now needs). CI uses them and also runs on PHP 8.5. - Community files: issue/PR templates,
SECURITY.md, Dependabot config. - 23 new tests: runtime menu mutations, docs routes (incl. traversal
attempts), component escaping/XSS regressions,
NavbarDatafallbacks.
adminlte:installpins every npm dependency to a tested major version (notablyfullcalendar@^6.1— v7 is breaking) and prints install guidance for the optional plugins (Flatpickr, Tom Select, Tabulator, Quill).- Auth and error layouts no longer load Bootstrap Icons from the jsDelivr
CDN — the icons already ship in the Vite bundle (
resources/css/adminlte.css), so offline/strict-CSP apps work and the double-load is gone. - The command palette builds its result list with
textContentinstead of HTML string concatenation.
NavbarData::notifications()/messages()now respect the$limitargument for demo/fallback data too.- Profile Card social links reject dangerous URL schemes (
javascript:,data:) — onlyhttp(s),mailtoand relative URLs render. - Docs route asserts the resolved file stays inside
docs/(defense in depth on top of the existing slug sanitization). - ApexCharts init in the published
app.jsis wrapped in try/catch so one bad chart config can't break every chart on the page. - Removed three duplicate keys (
email,profile,no_messages) from thede/estranslation files. - Sanctum/RBAC trait detection uses
trait_exists(traits are not classes). create_activity_log_table/create_notifications_tablemigrations are guarded against re-runs.
- Pint clean; PHPStan level 8 clean; 32 package tests pass (added
MakeAuthCommandTest; extendedScaffoldCommandTestfor the new artifact types — notifications, concerns, events — and view-less sections).
- Faithful Dashboard v1 recreation behind Laravel auth — small-boxes,
Sales Value ApexCharts area chart, jsVectorMap world map with sparklines,
and Direct Chat, matching
index.html. - Showcase pages wired to the sidebar (every link now resolves): Dashboard v2 & v3, Widgets (Small Box / Info Box / Cards), UI Elements (General / Icons / Timeline), Forms (Elements / Layout / Validation / Wizard), Tables (Simple / Data), and a config-driven Layout Options page.
- ⌘K command palette — a floating overlay that searches the sidebar menu; opens via the navbar search pill or Cmd/Ctrl+K, with arrow-key navigation.
- Demo routes auto-registered by the service provider behind
config('adminlte.demo')(defaulttrue) anddemo_middleware(default['web', 'auth']); set'demo' => falseto skip them. - Navbar messages & notifications dropdowns, and a richer user menu, bound to
the authenticated user; "View documentation" CTA in the sidebar
(
sidebar_docs_url). - Comprehensive documentation under
docs/: installation, configuration, layout, menu, components, plugins, scaffolding, authentication, commands, translations, and demo pages. - In-app documentation viewer — the
docs/*.mdfiles are rendered (via CommonMark) inside the AdminLTE layout at/docsand/docs/{page}, with a navigation sidebar and intra-doc links rewritten to/docs/…. Toggle withconfig('adminlte.docs')/docs_middleware. The navbar "Documentation" link and sidebar CTA point here by default (sidebar_docs_url).
- Scaffolded page designs upgraded to match the originals while keeping their DB backing: Profile (About card + Activity/Timeline/Settings tabs), Invoice (print-ready with subtotal/tax/total), Chat (split-pane with styled bubbles), Settings (multi-section), Calendar (draggable-events sidebar), File Manager (folder breadcrumb + file-type grid).
- Footer text reduced to a compact, regular-weight line (config-driven via
footer_left/footer_right).
- Translations:
__('adminlte.key')now resolves out of the box — the package registers its lang directory as a default-namespace path. Previously every key (navbar, sidebar, auth views) rendered as a rawadminlte.*string because translations were only registered under theadminlte::namespace. - Navbar search now works — replaced the inert AdminLTE 3
data-widget="navbar-search"hook with the ⌘K command palette. - The sidebar "View documentation" CTA collapses to an icon-only button when the sidebar is minimised (and hides on fully-collapsed off-canvas sidebars).
@pluginStyles/@pluginScriptsresolve enabled plugins at request time instead of compile time, so component-enabled plugins are injected.- Removed the duplicate CDN Bootstrap Icons
<link>(icons now come solely from the Vite bundle). adminlte:installinstalls the plugin npm packages (apexcharts, jsvectormap, fullcalendar, sortablejs) and copies their dist files (plus the RTL stylesheet) intopublic/vendor/*, fixing 404s that left charts/maps/ calendar/kanban blank.app.jsinitialises ApexCharts, jsVectorMap, FullCalendar, and SortableJS from thedata-*attributes the components emit.- Tabs/Tab panes push to a Blade stack so they render inside
.tab-content.
- PHPStan level 8 fully clean (0 errors) across
src/; Pint clean; 26 tests pass. Stopped tracking the PHPStan cache (/build).
- 6 new fully-translated locales: French, Italian, Portuguese (Brazil), Russian, Chinese, Japanese — all 9 locales now cover every key (German and Spanish brought to parity).
- Prebuilt RTL stylesheet (
adminlte.rtl.min.css) published by the installer and loaded bymaster.blade.phpwhenlayout_rtlis enabled. - Preloader partial with AdminLTE animation, gated by the
preloaderconfig. - Theme generator demo page with live
data-bs-themepreview and copy-to-clipboard config output.
adminlte:make-authcommand:--type=plainpublishes working Login/Register/ForgotPassword/ResetPassword controllers (modern Auth facade) and an idempotent auth route group wired to the package's auth views;--type=breeze/--type=fortifyprint integration guidance.adminlte:statusgains checks for the RTL stylesheet, the four plugin vendor files, and scaffolded sections.adminlte:install --only=langpublishes language files.- Theme generator page for visual customization and config output.
adminlte:scaffoldcommand with interactive multi-select and--all/--force/--seedflags, driven by a declarative section manifest.- Full DB-backed scaffolding for 5 sections — mailbox, chat, kanban, calendar, projects — each generating real migrations, Eloquent models, controllers, seeders (fake demo data), page views, and routes.
- Controller-only / static sections: file-manager (Laravel Storage), profile, settings, invoice, pricing, faq.
- Route registration injects an idempotent, auth-protected
/adminroute group (namedadminlte.*) intoroutes/web.php. ScaffoldCommandTestasserts every manifest-referenced stub exists.
- 7 new Widget components: DirectChat, Toast, Tabs, Tab, Accordion, AccordionItem, Breadcrumb
- 7 new Tool components: Chart (ApexCharts), VectorMap (jsVectorMap), Calendar (FullCalendar), Kanban (SortableJS), Sortable, Wizard, WizardStep
- 4 new plugin configurations: ApexCharts, jsVectorMap, FullCalendar, SortableJS
- 3 new auth views: lockscreen, login-v2 (floating labels), register-v2 (floating labels)
- 3 new error pages: 404, 500, maintenance on dedicated errors-master layout
- Config keys:
footer_left,footer_right,preloader,control_sidebar,control_sidebar_theme - Preloader and control sidebar partials
- Master view:
@pluginStylesand@pluginScriptsdirectives for auto-asset injection - Footer: config-driven left/right text rendering
- 30+ new translation keys across English, German, Spanish
- All 14 new components registered with auto-plugin enablement
- Component registration now includes 40 total Blade components (up from 26)
- Multi-language support with lang files for English, German, Spanish (+ 7 stubs)
- Publish tag
adminlte-langfor user customization - All auth views and components use
__('adminlte.key')pattern for translations - Config-driven lazy-loading of optional JavaScript libraries via PluginManager
- Blade directives
@pluginStyles/@pluginScriptsfor head/body injection - 5 new widget components: timeline, progress-group, description-block, profile-card, ratings
- 4 plugin-enabled form components: input-flatpickr, input-tom-select, datatable, editor
- 3 navbar dropdown components: nav-notifications, nav-messages, nav-tasks
- RTL (right-to-left) layout support via
layout_rtlconfig - Expanded test coverage for plugin system, widget components, menu filters
- PHPStan static analysis (level 8) via Larastan in CI
- Demo dashboard view showcasing all components
- Auth views migrated to use
__('adminlte.key')pattern (from generic__())
- Three more Bootstrap-native form components (no external JS required):
<x-adminlte-input-switch>,<x-adminlte-input-color>,<x-adminlte-input-file>. - GitHub Actions CI: Pint + PHPUnit across PHP 8.3 / 8.4 on Laravel 13.
- Initial public release. AdminLTE 4 integration for Laravel 13 / PHP 8.3+.
- Config-driven sidebar menu (
config/adminlte.php) with a filter pipeline: gate authorization (can), href resolution (route/url), automatic active-state, and navbar-search normalization. Unlimited treeview nesting, badges, icons, section headers. - Blade layouts:
master+page(extend with@extends('adminlte::page')), plus navbar, sidebar, footer, color-mode toggle, and user-menu partials. - Auth views: login, register, forgot-password, reset-password on a dedicated auth layout, wired to Laravel's conventional named routes.
- 11 Blade components: card, small-box, info-box, alert, callout, progress,
input, textarea, select, button, modal. Form components surface validation
errors and repopulate
old()input automatically. - Artisan commands:
adminlte:installandadminlte:status. - Vite-first asset strategy — pulls
admin-lte+bootstrapfrom npm and imports through the app's Vite pipeline (no precompiled assets shipped).