All notable changes to @adminlte/angular are documented here. The format is based on
Keep a Changelog, and this project adheres to
Semantic Versioning.
Charts move from ApexCharts to Chart.js 4.5 (MIT). From 5.2.0 ApexCharts ships under the proprietary "ApexCharts License", which does not suit an MIT library that other people build products on, so the wrapper is replaced rather than kept alongside.
LteApexChart(ApexChartComponent,<lte-apex-chart>) and the optionalapexchartspeer dependency.
LteChart(ChartComponent,<lte-chart>) — a signal-driven Chart.js wrapper withtype,data,options,plugins,height,widthandlabel(canvasaria-label) inputs, plus achartgetter for the live instance. It lazily importschart.js(new optional peer dependency^4.5.0) in the browser only, updates in place when inputs change, re-creates only whentype/pluginschange, resizes with its container and destroys the chart on teardown.ChartThemeService— resolves Bootstrap/AdminLTE's--bs-*variables (theme colours, body/muted text, borders, card background, body font) into apalettesignal and re-reads it when<html>changesdata-bs-theme,dirordata-lte-primary, so charts re-theme live on a colour-mode switch. SSR-safe.- AdminLTE Chart.js preset applied to
Chart.defaultsby the first<lte-chart>: Bootstrap font, muted ticks, subtle horizontal-only gridlines, smooth 2px lines, rounded bars, card-coloured slice separators, circular legend markers and a Bootstrap-style tooltip; RTL documents get right-to-left legends and tooltips. Exported helpers:applyChartDefaults,verticalGradient(area gradient fill),withAlpha, and theChartPalette/ChartThemeColortypes.
npm uninstall apexcharts && npm install chart.js- Import
ChartComponentinstead ofApexChartComponent. - Rewrite each ApexCharts options object as Chart.js config:
<lte-apex-chart [options]="o" />→<lte-chart type="line" [data]="data" [options]="options" [height]="300" />chart.type: 'area'→type="line"with datasetfill: 'origin'(optionallybackgroundColor: verticalGradient(color));stroke.curve: 'smooth'is the default.chart.type: 'bar'→type="bar";plotOptions.bar.horizontal→options.indexAxis: 'y';stacked→scales.x.stacked/scales.y.stacked.donut/pie→type="doughnut"/"pie"withdata.labels+datasets[0].data.chart.height→ the[height]input;sparkline.enabled→ hide both scales, the legend and the tooltip.- Hard-coded
colors→ChartThemeService.palette().colors.*so charts follow dark mode. - The ApexCharts toolbar (download/zoom) has no equivalent; add
chartjs-plugin-zoom(MIT) if you need zoom.
Chart.defaultsis global: if your app also draws charts with Chart.js directly, they pick up the AdminLTE preset once an<lte-chart>has rendered.
- Dashboard v1 (sales area chart + three sparklines), v2 (sales area chart, browser-usage donut,
seven table sparklines) and v3 (visitors line chart with striped rows, grouped sales bars) are
rebuilt on
<lte-chart>with the same data and colours. The charts now follow dark mode — under ApexCharts the v3 charts kept light-mode grid stripes and labels after a switch. - The v2 order-table sparklines were rebuilt on every change-detection pass (the template called a method that returned a new options object); they are now a computed signal.
- The demo's lazily loaded chart chunk drops from ~949 kB / ~223 kB transfer (ApexCharts 6.10) to ~205 kB / ~61 kB (Chart.js 4.5.1).
- Bundled AdminLTE core moved to 4.8.3, which carries the fix for every page scrolling sideways at phone widths. The port's own header fix stays — both set the same custom property, so they do not compound.
- Stretch-set components for parity with the Vue/React ports:
- Widgets:
LteProgressGroup,LteRatings,LteDirectChat,LteTabs/LteTab,LteAccordion/LteAccordionItem. - Topbar dropdown menus:
LteNavMessages,LteNavNotifications,LteNavTasks. - Plugin wrappers (optional peer deps, lazily imported like
LteApexChart):LteInputFlatpickr(flatpickr),LteInputTomSelect(tom-select), andLteDatatable(simple-datatables).
- Widgets:
- New
Componentsdemo page (/components) dogfooding the additions, plus the three nav dropdowns wired into the demo topbar. - Optional peer dependencies
flatpickr,tom-selectandsimple-datatables(alloptional: true). - Initial Angular 22 port of AdminLTE 4 — a signal-first, standalone-component library
on Bootstrap 5.3, published as
@adminlte/angular. - Layout components:
LteDashboardLayout,LteAuthLayout,LteAppContent,LteTopbar,LteSidebar,LteSidebarBrand,LteSidebarNav,LteSidebarNavItem,LteSidebarOverlay,LteFooter,LteColorModeToggle,LteFullscreenToggle. - Widgets:
LteCard,LteSmallBox,LteInfoBox,LteAlert,LteCallout,LteProgress,LteTimeline,LteProfileCard,LteDescriptionBlock,LteBreadcrumb,LteCommandPalette,LteApexChart,LteModal. - Forms:
LteButton,LteInput,LteSelect,LteTextarea,LteInputSwitch(ControlValueAccessor+model()two-way binding). - Signal services:
ColorModeService(SSR-safe dark mode, no-flash),SidebarService(responsive state + body classes),CommandPaletteService(⌘K),FullscreenService,TreeviewService(accordion registry). - Typed, config-driven sidebar menu (
MenuNodediscriminated union withvisibleflag). @adminlte/angular/cssexport — AdminLTE's compiled CSS copied intodistat build time.- Demo application (
projects/demo) dogfooding the library: dashboard, widgets, forms and login pages with a theme-aware ApexCharts chart.
- Target AdminLTE 4.8.1 (was 4.0.0) — the
admin-ltepeer dependency is now^4.8.1, so@adminlte/angular/cssre-exports AdminLTE 4.8.1's compiled stylesheet. Upstream additions now available to consumers: the opt-in extended palette (admin-lte/dist/css/adminlte-colors.css) and the AdminLTE 3 palette (adminlte-colors-v3.css),data-lte-primary="…"on<html>to promote a palette colour to Bootstrap'sprimary,data-lte-print="plain"for document printing,data-lte-contrast="aa"for WCAG AA text on the v3 palette, and a pagination focus-ring fix. The library imports no AdminLTE JavaScript, so the modules bundled upstream since 4.1 (ColorMode,SidebarSearch) never collide with the Angular services. - Dependencies refreshed. Angular 22.0.x → 22.1.x (
@angular/common,compiler,compiler-cli,core,forms,platform-browser,router→ 22.1.2;@angular/buildand@angular/cli→ 22.1.4) viang update, plusng-packagr22.0.0 → 22.1.1,zone.js~0.15.0→~0.16.0(the version Angular 22's own CLI scaffolds, and inside@angular/core's~0.15.0 || ~0.16.0peer range),simple-datatables10.2.0 → 10.3.0 andtom-select2.6.1 → 2.6.2. The refreshed build chain also clears most of the workspace's transitive advisories (npm audit: 15 → 4, including the only critical). - ApexCharts 5 → 6 (major). The
apexchartspeer dependency now reads^4.0.0 || ^5.0.0 || ^6.0.0, and the demo builds against 6.10.0.LteApexChartneeded no changes — v6 keeps thenew ApexCharts(el, options)/render()/updateOptions()/destroy()API and existing option objects unchanged; its two new defaults (variable-length data transitions, pinch-zoom/pan gestures) are opt-out viachart.animations.dynamicAnimationandchart.zoom.pinch/chart.pan.inertia. Consumers staying on ApexCharts 4 or 5 are unaffected. Note that v6's full bundle is larger (the demo's lazily-loadedapexchartschunk grows from ~135 kB to ~223 kB transfer); v6 also ships per-chart-type entry points (apexcharts/area,apexcharts/bar, …) for consumers who want to trim that. - The
bootstrappeer dependency is now^5.3.8(was^5.3.0), matching whatadmin-lte@4.8.1itself requires — the advertised range no longer resolves to a Bootstrap older than the CSS it is paired with. - Held back — FullCalendar 7. Only
@fullcalendar/corehas a stable 7.x (7.0.2). The plugins the demo calendar needs (daygrid,timegrid,list,interaction) are onlatest: 6.1.21, with 7.x available only as7.0.0-rc.0/7.0.0-beta.6pre-releases, and the v6 plugins pin@fullcalendar/core@~6.1.21, so upgrading core alone failsnpm installwithERESOLVE. FullCalendar 7's core also adds two new required peers (temporal-polyfill,@full-ui/headless-calendar). All@fullcalendar/*packages therefore stay on 6.1.21 until the plugin set ships stable 7.x builds. - Held back — TypeScript 7.
@angular/compiler-cli@22.1.2and@angular/build@22.1.4both declaretypescript: >=6.0 <6.1, so the workspace stays on~6.0.0.
LteAuthLayoutrendered an empty card forvariant="v2"(breaking). The template declared the default<ng-content />twice — once per@ifbranch — and Angular distributes projected nodes into a single slot when the component is created, so the copy in the losing branch never received anything. Everyvariant="v2"page therefore shipped<div class="card-body login-card-body"></div>with no children: the demo's/login,/login-v2and/register-v2showed a blank card, and the[logo]slot had the same defect. Both slots are now declared exactly once — the default slot in the.card-bodyboth variants share, and[logo]in an<ng-template>that each variant stamps withngTemplateOutlet— sodefaultandv2project identically. The rendered markup is unchanged for consumers (.login-box > .card.card-outline.card-primary > .card-header + .card-bodyfor v2, brand above a plain.cardotherwise). Anyone extending the component: a projection slot may only be declared once per template.- Sidebar: collapsed submenus stayed keyboard-focusable (a11y). A closed
.nav-treeviewcollapses toheight: 0inside the grid animation wrapper, but stayedvisibility: visiblewith noinert, so its links kept their place in the tab order — 19 invisible links on the demo's default route, reachable with Tab and focusable via script. The wrapper now carriesinertwhile closed (removing the subtree from both the tab order and the accessibility tree), backed by avisibility: hiddenthat is delayed until the collapse transition ends, so the slide-open/slide-shut animation is unchanged. The group toggle also gainedaria-controlspointing at the submenu's newid. - Header overflowed the viewport on phones. With the standard toggle row (search,
messages, notifications, tasks, fullscreen, colour mode, user menu), Bootstrap's 1rem
navbar link padding made the header 413 px wide inside a 390 px viewport, so every page
scrolled sideways (
scrollWidth413 vsclientWidth390).LteTopbarnow halves--bs-navbar-nav-link-padding-xbelow thesmbreakpoint; the property is declared on<nav class="app-header">, so it also applies to items projected through[topbar-start]/[topbar-end]. Measured 390/390 at 390 px and 320/320 at 320 px; layout atsmand above is untouched. - Demo: a MIME-type console error on every two-segment route. The demo build now sets
baseHref/deployUrlto/, soindex.htmlemits absolute asset URLs (/main-*.js,/chunk-*.js,/styles-*.css). The relative<link rel="modulepreload" href="chunk-*.js">was resolved against the current location rather than<base href="/">by the browser's speculative preloader, so on a two-segment route such as/dashboard/v2it fetched/dashboard/chunk-*.js; Cloudflare Pages' SPA fallback answered withindex.htmland Chrome logged "Failed to load module script: Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of text/html" on ~16 routes. Absolute URLs resolve identically from any depth.