admin-lte 4.0.0-rc7 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +43 -17
  3. package/dist/UI/general.html +303 -126
  4. package/dist/UI/icons.html +303 -126
  5. package/dist/UI/timeline.html +303 -126
  6. package/dist/css/adminlte.css +2798 -1167
  7. package/dist/css/adminlte.css.map +1 -1
  8. package/dist/css/adminlte.min.css +2 -2
  9. package/dist/css/adminlte.min.css.map +1 -1
  10. package/dist/css/adminlte.rtl.css +2798 -1167
  11. package/dist/css/adminlte.rtl.css.map +1 -1
  12. package/dist/css/adminlte.rtl.min.css +2 -2
  13. package/dist/css/adminlte.rtl.min.css.map +1 -1
  14. package/dist/docs/browser-support.html +261 -397
  15. package/dist/docs/color-mode.html +242 -382
  16. package/dist/docs/components/main-header.html +238 -374
  17. package/dist/docs/components/main-sidebar.html +253 -389
  18. package/dist/docs/customization.html +1056 -0
  19. package/dist/docs/deployment.html +1121 -0
  20. package/dist/docs/faq.html +857 -409
  21. package/dist/docs/getting-started.html +967 -0
  22. package/dist/docs/how-to-contribute.html +335 -462
  23. package/dist/docs/index.html +16 -0
  24. package/dist/docs/integrations.html +1207 -0
  25. package/dist/docs/introduction.html +453 -446
  26. package/dist/docs/javascript/accessibility.html +361 -491
  27. package/dist/docs/javascript/card-widget.html +446 -450
  28. package/dist/docs/javascript/direct-chat.html +324 -421
  29. package/dist/docs/javascript/fullscreen.html +348 -416
  30. package/dist/docs/javascript/layout.html +345 -436
  31. package/dist/docs/javascript/plugins-overview.html +1120 -0
  32. package/dist/docs/javascript/pushmenu.html +485 -492
  33. package/dist/docs/javascript/treeview.html +466 -400
  34. package/dist/docs/layout-blueprint.html +1063 -0
  35. package/dist/docs/layout.html +287 -415
  36. package/dist/docs/license.html +252 -387
  37. package/dist/docs/migration.html +1125 -0
  38. package/dist/docs/recipes.html +1161 -0
  39. package/dist/docs/rtl.html +933 -0
  40. package/dist/examples/lockscreen.html +65 -1
  41. package/dist/examples/login-v2.html +65 -1
  42. package/dist/examples/login.html +65 -1
  43. package/dist/examples/register-v2.html +65 -1
  44. package/dist/examples/register.html +65 -1
  45. package/dist/forms/{general.html → elements.html} +489 -463
  46. package/dist/forms/layout.html +1243 -0
  47. package/dist/forms/validation.html +1251 -0
  48. package/dist/forms/wizard.html +1386 -0
  49. package/dist/generate/theme.html +134 -4
  50. package/dist/index.html +303 -126
  51. package/dist/index2.html +306 -126
  52. package/dist/index3.html +303 -126
  53. package/dist/js/adminlte.js +5 -5
  54. package/dist/js/adminlte.js.map +1 -1
  55. package/dist/js/adminlte.min.js +2 -2
  56. package/dist/js/adminlte.min.js.map +1 -1
  57. package/dist/layout/collapsed-sidebar-without-hover.html +303 -126
  58. package/dist/layout/collapsed-sidebar.html +303 -126
  59. package/dist/layout/fixed-complete.html +303 -126
  60. package/dist/layout/fixed-footer.html +303 -126
  61. package/dist/layout/fixed-header.html +303 -126
  62. package/dist/layout/fixed-sidebar.html +303 -126
  63. package/dist/layout/layout-custom-area.html +303 -126
  64. package/dist/layout/layout-rtl.html +303 -126
  65. package/dist/layout/logo-switch.html +134 -4
  66. package/dist/layout/sidebar-mini.html +303 -126
  67. package/dist/layout/unfixed-sidebar.html +303 -126
  68. package/dist/mailbox/compose.html +1127 -0
  69. package/dist/mailbox/inbox.html +1477 -0
  70. package/dist/mailbox/read.html +1178 -0
  71. package/dist/pages/404.html +213 -0
  72. package/dist/pages/500.html +201 -0
  73. package/dist/pages/calendar.html +1242 -0
  74. package/dist/pages/chat.html +1403 -0
  75. package/dist/pages/faq.html +1359 -0
  76. package/dist/pages/file-manager.html +1811 -0
  77. package/dist/pages/invoice.html +1175 -0
  78. package/dist/pages/kanban.html +1415 -0
  79. package/dist/pages/maintenance.html +204 -0
  80. package/dist/pages/pricing.html +1255 -0
  81. package/dist/pages/profile.html +1358 -0
  82. package/dist/pages/projects.html +1620 -0
  83. package/dist/pages/settings.html +1363 -0
  84. package/dist/tables/data.html +1295 -0
  85. package/dist/tables/simple.html +303 -126
  86. package/dist/widgets/cards.html +303 -126
  87. package/dist/widgets/info-box.html +303 -126
  88. package/dist/widgets/small-box.html +303 -126
  89. package/netlify.toml +16 -0
  90. package/package.json +29 -23
  91. package/src/scss/_app-header.scss +27 -0
  92. package/src/scss/_app-sidebar.scss +24 -30
  93. package/src/scss/_bootstrap-variables.scss +11 -4
  94. package/src/scss/_docs.scss +816 -0
  95. package/src/scss/_table.scss +4 -4
  96. package/src/scss/adminlte.scss +4 -1
  97. package/src/ts/adminlte.ts +1 -1
  98. package/src/ts/fullscreen.ts +8 -4
  99. package/src/ts/push-menu.ts +66 -5
  100. package/.claude/settings.local.json +0 -37
  101. package/CLAUDE.md +0 -79
  102. package/release.md +0 -75
@@ -8,17 +8,17 @@
8
8
  }
9
9
 
10
10
  // fixed table head
11
+ // Uses Bootstrap CSS variables so the sticky header follows light/dark mode
12
+ // automatically. Fixes #6026.
11
13
  &.table-head-fixed {
12
14
  thead tr:nth-child(1) th {
13
15
  position: sticky;
14
16
  top: 0;
15
17
  z-index: 10;
16
- background-color: $white;
18
+ background-color: var(--bs-body-bg, #{$white});
17
19
  border-bottom: 0;
18
- box-shadow: inset 0 1px 0 $table-border-color, inset 0 -1px 0 $table-border-color;
20
+ box-shadow: inset 0 1px 0 var(--bs-border-color, #{$table-border-color}), inset 0 -1px 0 var(--bs-border-color, #{$table-border-color});
19
21
  }
20
-
21
- // Note: Dark table styling for fixed headers is handled by Bootstrap's built-in dark table classes
22
22
  }
23
23
 
24
24
  // no border
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * AdminLTE v4.0.0-rc7
2
+ * AdminLTE v4.0.0
3
3
  * Author: Colorlib
4
4
  * Website: AdminLTE.io <https://adminlte.io>
5
5
  * License: Open source - MIT <https://opensource.org/licenses/MIT>
@@ -76,3 +76,6 @@
76
76
 
77
77
  // AdminLTE Accessibility Styles - WCAG 2.1 AA Compliance
78
78
  @import "accessibility";
79
+
80
+ // AdminLTE Documentation Styles (only applies to pages with body.docs-page)
81
+ @import "docs";
@@ -8,7 +8,7 @@ import PushMenu from './push-menu.js'
8
8
  import { initAccessibility } from './accessibility.js'
9
9
 
10
10
  /**
11
- * AdminLTE v4.0.0-rc7
11
+ * AdminLTE v4.0.0
12
12
  * Author: Colorlib
13
13
  * Website: AdminLTE.io <https://adminlte.io>
14
14
  * License: Open source - MIT <https://opensource.org/licenses/MIT>
@@ -44,12 +44,16 @@ class FullScreen {
44
44
 
45
45
  void document.documentElement.requestFullscreen()
46
46
 
47
+ // Toggle Bootstrap's .d-none utility instead of hardcoding inline
48
+ // display:block. The previous approach overrode the icon library's
49
+ // natural display value (eg. some icon fonts use inline-block) and
50
+ // caused the icon to shift its position. Fixes #6021.
47
51
  if (iconMaximize) {
48
- iconMaximize.style.display = 'none'
52
+ iconMaximize.classList.add('d-none')
49
53
  }
50
54
 
51
55
  if (iconMinimize) {
52
- iconMinimize.style.display = 'block'
56
+ iconMinimize.classList.remove('d-none')
53
57
  }
54
58
 
55
59
  this._element.dispatchEvent(event)
@@ -64,11 +68,11 @@ class FullScreen {
64
68
  void document.exitFullscreen()
65
69
 
66
70
  if (iconMaximize) {
67
- iconMaximize.style.display = 'block'
71
+ iconMaximize.classList.remove('d-none')
68
72
  }
69
73
 
70
74
  if (iconMinimize) {
71
- iconMinimize.style.display = 'none'
75
+ iconMinimize.classList.add('d-none')
72
76
  }
73
77
 
74
78
  this._element.dispatchEvent(event)
@@ -115,12 +115,17 @@ class PushMenu {
115
115
  * Expand the sidebar menu.
116
116
  */
117
117
  expand(): void {
118
+ // Remove the sidebar-collapse class. Only on mobile, add the sidebar-open
119
+ // class to indicate the sidebar is explicitly open.
120
+
118
121
  document.body.classList.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
119
122
 
120
123
  if (this.isMobileSize()) {
121
124
  document.body.classList.add(CLASS_NAME_SIDEBAR_OPEN)
122
125
  }
123
126
 
127
+ // Dispatch the expand event.
128
+
124
129
  this._element.dispatchEvent(new Event(EVENT_OPEN))
125
130
  }
126
131
 
@@ -128,9 +133,14 @@ class PushMenu {
128
133
  * Collapse the sidebar menu.
129
134
  */
130
135
  collapse(): void {
136
+ // Remove the sidebar-open class (if present), and add the sidebar-collapse
137
+ // class.
138
+
131
139
  document.body.classList.remove(CLASS_NAME_SIDEBAR_OPEN)
132
140
  document.body.classList.add(CLASS_NAME_SIDEBAR_COLLAPSE)
133
141
 
142
+ // Dispatch the collapse event.
143
+
134
144
  this._element.dispatchEvent(new Event(EVENT_COLLAPSE))
135
145
  }
136
146
 
@@ -138,6 +148,8 @@ class PushMenu {
138
148
  * Toggle the sidebar menu state.
139
149
  */
140
150
  toggle(): void {
151
+ // Toggle the sidebar state.
152
+
141
153
  const isCollapsed = this.isCollapsed()
142
154
 
143
155
  if (isCollapsed) {
@@ -146,6 +158,8 @@ class PushMenu {
146
158
  this.collapse()
147
159
  }
148
160
 
161
+ // If persistence is enabled, save the new state to localStorage.
162
+
149
163
  if (this._config.enablePersistence) {
150
164
  this.saveSidebarState(
151
165
  isCollapsed ? CLASS_NAME_SIDEBAR_OPEN : CLASS_NAME_SIDEBAR_COLLAPSE
@@ -155,18 +169,28 @@ class PushMenu {
155
169
 
156
170
  /**
157
171
  * Read the CSS breakpoint of the sidebar from the DOM and update the
158
- * sidebarBreakpoint config.
172
+ * sidebarBreakpoint config. This breakpoint is defined using a CSS ::before
173
+ * pseudo element on the sidebar-expand element when @media queries are used
174
+ * to change the sidebar behavior based on screen size.
159
175
  */
160
176
  setupSidebarBreakPoint(): void {
177
+ // Find the sidebar-expand element in the DOM.
178
+
161
179
  const sidebarExpand = document.querySelector(SELECTOR_SIDEBAR_EXPAND)
162
180
 
163
181
  if (!sidebarExpand) {
164
182
  return
165
183
  }
166
184
 
185
+ // Read the content property of the ::before pseudo element to get the
186
+ // breakpoint value.
187
+
167
188
  const content = globalThis.getComputedStyle(sidebarExpand, '::before')
168
189
  .getPropertyValue('content')
169
190
 
191
+ // Update the config.sidebarBreakpoint value by extracting the numeric
192
+ // value from the content string.
193
+
170
194
  if (!content || content === 'none') {
171
195
  return
172
196
  }
@@ -186,10 +210,16 @@ class PushMenu {
186
210
  */
187
211
  updateStateByResponsiveLogic(): void {
188
212
  if (this.isMobileSize()) {
213
+ // On mobile sizes, keep the sidebar collapsed unless explicitly opened
214
+ // by the user to prevent unintended collapse on scroll or resize events.
215
+
189
216
  if (!this.isExplicitlyOpen()) {
190
217
  this.collapse()
191
218
  }
192
219
  } else {
220
+ // On big screen sizes, keep the sidebar expanded unless in mini mode and
221
+ // explicitly collapsed.
222
+
193
223
  if (!(this.isMiniMode() && this.isCollapsed())) {
194
224
  this.expand()
195
225
  }
@@ -202,14 +232,19 @@ class PushMenu {
202
232
  * @param state The state to save ('sidebar-open' or 'sidebar-collapse').
203
233
  */
204
234
  saveSidebarState(state: string): void {
235
+ // Check for localStorage availability (not a SSR environment).
236
+
205
237
  if (globalThis.localStorage === undefined) {
206
238
  return
207
239
  }
208
240
 
241
+ // Save the sidebar state to local storage.
242
+
209
243
  try {
210
244
  localStorage.setItem(STORAGE_KEY_SIDEBAR_STATE, state)
211
245
  } catch {
212
- // localStorage may be unavailable (private browsing, quota exceeded, etc.)
246
+ // The localStorage may be unavailable (private browsing, quota exceeded,
247
+ // etc.). Fail silently in these cases.
213
248
  }
214
249
  }
215
250
 
@@ -217,10 +252,14 @@ class PushMenu {
217
252
  * Load sidebar state from localStorage.
218
253
  */
219
254
  loadSidebarState(): void {
255
+ // Check for localStorage availability (not a SSR environment).
256
+
220
257
  if (globalThis.localStorage === undefined) {
221
258
  return
222
259
  }
223
260
 
261
+ // Load the sidebar state from local storage.
262
+
224
263
  try {
225
264
  const storedState = localStorage.getItem(STORAGE_KEY_SIDEBAR_STATE)
226
265
 
@@ -229,9 +268,11 @@ class PushMenu {
229
268
  } else if (storedState === CLASS_NAME_SIDEBAR_OPEN) {
230
269
  this.expand()
231
270
  } else {
271
+ // If null (never saved), let the responsive logic apply.
232
272
  this.updateStateByResponsiveLogic()
233
273
  }
234
274
  } catch {
275
+ // The localStorage may be unavailable. Let the responsive logic apply.
235
276
  this.updateStateByResponsiveLogic()
236
277
  }
237
278
  }
@@ -240,14 +281,18 @@ class PushMenu {
240
281
  * Clear sidebar state from localStorage.
241
282
  */
242
283
  clearSidebarState(): void {
284
+ // Check for localStorage availability (not a SSR environment).
285
+
243
286
  if (globalThis.localStorage === undefined) {
244
287
  return
245
288
  }
246
289
 
290
+ // Clear the sidebar state from local storage.
291
+
247
292
  try {
248
293
  localStorage.removeItem(STORAGE_KEY_SIDEBAR_STATE)
249
294
  } catch {
250
- // localStorage may be unavailable
295
+ // The localStorage may be unavailable. Fail silently in these cases.
251
296
  }
252
297
  }
253
298
 
@@ -255,12 +300,23 @@ class PushMenu {
255
300
  * Initialize the push menu plugin and setup the initial sidebar state.
256
301
  */
257
302
  init(): void {
303
+ // Read and setup the sidebar breakpoint from the DOM. This breakpoint is
304
+ // used to determine when the sidebar should be considered "mobile" vs
305
+ // "desktop".
306
+
258
307
  this.setupSidebarBreakPoint()
259
308
 
309
+ // When persistence is not enabled, clear any saved state, just for safety.
310
+
260
311
  if (!this._config.enablePersistence) {
261
312
  this.clearSidebarState()
262
313
  }
263
314
 
315
+ // When persistence is enabled and screen size is above the breakpoint, load
316
+ // the saved sidebar state from local storage. Otherwise, use responsive
317
+ // logic to set the initial state. On low screen sizes, the sidebar should
318
+ // always be collapsed by default unless explicitly opened.
319
+
264
320
  if (this._config.enablePersistence && !this.isMobileSize()) {
265
321
  this.loadSidebarState()
266
322
  } else {
@@ -276,13 +332,16 @@ class PushMenu {
276
332
  */
277
333
 
278
334
  onDOMContentLoaded(() => {
335
+ // Find the sidebar element in the DOM.
336
+
279
337
  const sidebar = document?.querySelector(SELECTOR_APP_SIDEBAR) as HTMLElement | undefined
280
338
 
281
339
  if (!sidebar) {
282
340
  return
283
341
  }
284
342
 
285
- // Read config from data attributes on the sidebar element.
343
+ // Read config from data attributes on the sidebar element, falling back to
344
+ // Defaults if not present.
286
345
 
287
346
  const sidebarBreakpointAttr = sidebar.dataset.sidebarBreakpoint
288
347
  const enablePersistenceAttr = sidebar.dataset.enablePersistence
@@ -314,7 +373,9 @@ onDOMContentLoaded(() => {
314
373
  sidebarOverlay.className = CLASS_NAME_SIDEBAR_OVERLAY
315
374
  document.querySelector(SELECTOR_APP_WRAPPER)?.append(sidebarOverlay)
316
375
 
317
- // Handle touch events on overlay.
376
+ // Handle touch events on overlay (area outside sidebar), usually we want to
377
+ // close the sidebar when the user taps outside the sidebar on mobile
378
+ // devices.
318
379
 
319
380
  let overlayTouchMoved = false
320
381
 
@@ -1,37 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm audit:*)",
5
- "Bash(npm run build:*)",
6
- "Bash(npm ls:*)",
7
- "Bash(gh pr list:*)",
8
- "Bash(npm outdated:*)",
9
- "Bash(npm install:*)",
10
- "Bash(gh pr view:*)",
11
- "Bash(gh pr diff:*)",
12
- "Bash(rm:*)",
13
- "Bash(gh api:*)",
14
- "Bash(gh issue list:*)",
15
- "Bash(gh issue view:*)",
16
- "Bash(npm run css:*)",
17
- "Bash(npm run js:*)",
18
- "Bash(npm run js-lint:*)",
19
- "Bash(npm run css-lint:*)",
20
- "Bash(npm run lint:*)",
21
- "Bash(npm whoami:*)",
22
- "Bash(npm run production:*)",
23
- "Bash(git add:*)",
24
- "Bash(git commit:*)",
25
- "Bash(npm view:*)",
26
- "Bash(cat:*)",
27
- "Bash(npm pack:*)",
28
- "Bash(npm publish:*)",
29
- "Bash(npm dist-tag add:*)",
30
- "Bash(git init:*)",
31
- "Bash(gh repo create:*)",
32
- "Bash(git push)"
33
- ],
34
- "deny": [],
35
- "ask": []
36
- }
37
- }
package/CLAUDE.md DELETED
@@ -1,79 +0,0 @@
1
- # CLAUDE.md
2
-
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
-
5
- ## Project Overview
6
-
7
- AdminLTE is a Bootstrap 5 admin dashboard template (v4.0.0-rc5). It provides responsive UI components for building admin panels and control dashboards.
8
-
9
- ## Build Commands
10
-
11
- ```bash
12
- npm install # Install dependencies
13
- npm start # Start dev server with file watching (http://localhost:3000)
14
- npm run build # Build all assets (CSS, JS, docs)
15
- npm run production # Full production build with linting and bundlewatch
16
- npm run lint # Run all linters (JS, CSS, docs, lockfile)
17
- ```
18
-
19
- ### Individual Build Tasks
20
-
21
- ```bash
22
- npm run css # Build CSS only (compile, prefix, rtl, minify)
23
- npm run js # Build JavaScript only (compile, minify)
24
- npm run css-lint # Lint SCSS files
25
- npm run js-lint # Lint TypeScript/JavaScript files
26
- ```
27
-
28
- ## Architecture
29
-
30
- ### Source Structure
31
-
32
- - **src/ts/** - TypeScript source files compiled via Rollup to `dist/js/adminlte.js`
33
- - **src/scss/** - SCSS source files compiled via Sass to `dist/css/adminlte.css`
34
- - **src/html/** - Astro-based documentation/demo pages
35
- - **src/config/** - Build tool configurations (rollup, postcss, astro, assets)
36
- - **src/assets/** - Static images copied to dist
37
-
38
- ### JavaScript Components (src/ts/)
39
-
40
- Entry point: `adminlte.ts` exports all components:
41
- - `Layout` - Core layout management and hold-transition behavior
42
- - `PushMenu` - Sidebar toggle functionality
43
- - `Treeview` - Hierarchical menu navigation
44
- - `CardWidget` - Card collapse/expand/remove actions
45
- - `DirectChat` - Chat widget toggle
46
- - `FullScreen` - Fullscreen toggle functionality
47
- - `initAccessibility` - WCAG 2.1 AA accessibility features
48
-
49
- ### SCSS Structure (src/scss/)
50
-
51
- Entry point: `adminlte.scss` imports Bootstrap then AdminLTE components:
52
- - `_bootstrap-variables.scss` - Bootstrap variable overrides
53
- - `_variables.scss` / `_variables-dark.scss` - AdminLTE theme variables
54
- - `parts/` - Organized component groups (core, components, extra-components, pages, miscellaneous)
55
- - Individual component files (`_cards.scss`, `_app-sidebar.scss`, etc.)
56
-
57
- ### Documentation (src/html/)
58
-
59
- Built with Astro framework:
60
- - `pages/` - Demo pages and documentation
61
- - `components/` - Reusable Astro components and MDX content
62
- - Output goes to `dist/html/` then flattened to `dist/`
63
-
64
- ### Build Output (dist/)
65
-
66
- Production assets:
67
- - `dist/js/adminlte.min.js` - Compiled and minified JavaScript (UMD format)
68
- - `dist/css/adminlte.min.css` - Compiled and minified CSS
69
- - `dist/css/*.rtl.css` - RTL (right-to-left) variants
70
- - `dist/assets/` - Static assets
71
-
72
- ## Key Technologies
73
-
74
- - Bootstrap 5.3.x - CSS framework base
75
- - TypeScript - JavaScript source language
76
- - Sass - CSS preprocessor
77
- - Rollup - JavaScript bundler
78
- - Astro - Documentation site generator
79
- - PostCSS with Autoprefixer and RTLCSS - CSS post-processing
package/release.md DELETED
@@ -1,75 +0,0 @@
1
- # AdminLTE v4.0.0-rc7 Release Notes
2
-
3
- ## Highlights
4
-
5
- This release delivers significant JavaScript refactors to the layout and push menu plugins, fixes several bugs affecting print, pagination, modals, and animations, upgrades to Astro 6.0.0, updates all dependencies, adds complete JavaScript documentation, and introduces a new sidebar-without-hover feature.
6
-
7
- ## Bug Fixes
8
-
9
- - **Print layout**: Sidebar and main content are now both visible in browser print preview (#5982, PR #5996 by @herley-shaori)
10
- - **Pagination border-radius**: Synced `_bootstrap-variables.scss` calc syntax with Bootstrap 5.3, fixing grouped pagination buttons showing rounded corners on all sides (#5951, reported by @Kneemund)
11
- - **Escape key & modals**: `handleEscapeKey()` no longer bypasses Bootstrap 5's `keyboard: false` option on modals (#5993, reported by @braytac)
12
- - **slideDown/slideUp animation**: Fixed unreliable `setTimeout` ordering when duration is 0, which caused sidebar treeview instant-open to fail (#5964, PR by @Kneemund)
13
- - **CSS lint**: Fixed property order in print layout rules (#5997, reported by @lfiorini)
14
-
15
- ## Refactors
16
-
17
- - **Layout transition handling** (#5956 by @dfsmania):
18
- - Fixed broken `holdTransition` timer (local variable promoted to instance property)
19
- - Removed duplicate `resize` event listeners registered on every call
20
- - Consolidated layout initialization to `layout.ts` (removed duplication from `adminlte.ts`)
21
- - Moved `app-loaded` class application to layout Data API section
22
-
23
- - **Push menu plugin overhaul** (#5954 by @dfsmania):
24
- - Single `PushMenu` instance instead of creating new instances per event handler
25
- - Proper separation of `setupSidebarBreakPoint()` and `updateStateByResponsiveLogic()`
26
- - `sidebar-open` class only added on mobile viewports (aligns with v3 behavior)
27
- - Configuration now readable from data attributes on sidebar element
28
- - Removed unused `menusClose()` method and dead constants
29
-
30
- ## New Features
31
-
32
- - **Sidebar without hover expand**: New `sidebar-without-hover` body class prevents the collapsed mini sidebar from expanding on hover (#5837 by @WojakGra). Add both `sidebar-mini sidebar-collapse sidebar-without-hover` to `<body>`.
33
- - **Fixed footer with layout-fixed**: Footer now stays pinned at the bottom when using `.fixed-footer` with `.layout-fixed` (#5805)
34
- - **Mobile scroll containment**: Sidebar no longer causes page scroll chaining on mobile (#5864)
35
-
36
- ## Documentation
37
-
38
- - **Complete JavaScript documentation**: Added doc pages for all 7 JS components — Layout, PushMenu, Treeview, Card Widget, Direct Chat, Fullscreen, and Accessibility
39
- - **Expanded PushMenu docs**: Now includes configuration options, responsive behavior, and CSS class reference
40
- - **CHANGELOG**: Added comprehensive rc7 entry documenting all changes
41
-
42
- ## Improvements
43
-
44
- - **Login/register box width**: Increased from 360px to 400px for better form readability (#5963 by @dfsmania)
45
- - **TypeScript compilation**: Added `removeComments: true` to `tsconfig.json`, reducing unminified `adminlte.js` by ~15% (#5953 by @dfsmania)
46
-
47
- ## Dependencies
48
-
49
- **Major upgrades:**
50
- - `astro` 5.18.0 -> 6.0.0 (includes Vite 7, Shiki 4)
51
- - `@astrojs/mdx` 4.3.13 -> 5.0.0
52
-
53
- **Minor/patch updates:**
54
- - `@astrojs/check` 0.9.7, `@typescript-eslint/*` 8.57.0
55
- - `autoprefixer` 10.4.27, `eslint` 9.39.4, `eslint-plugin-astro` 1.6.0
56
- - `fs-extra` 11.3.4, `nodemon` 3.1.14, `postcss` 8.5.8
57
- - `prettier` 3.8.1, `rimraf` 6.1.3, `rollup` 4.59.0
58
- - `sass` 1.97.3, `terser` 5.46.0
59
-
60
- ## Breaking Changes
61
-
62
- - **Sidebar persistence is now opt-in**: `enablePersistence` defaults to `false` (was `true`). To restore the previous behavior where sidebar state is remembered across page loads, add `data-enable-persistence="true"` to your sidebar element:
63
- ```html
64
- <aside class="app-sidebar" data-enable-persistence="true"></aside>
65
- ```
66
-
67
- ## Contributors
68
-
69
- Thank you to everyone who contributed to this release:
70
- - @dfsmania (Diego Smania) — layout refactor, push menu refactor, login box width, tsconfig cleanup
71
- - @herley-shaori (Herley) — print layout fix
72
- - @Kneemund (Moritz Mechelk) — pagination bug report, slideDown/slideUp fix
73
- - @braytac — escape key modal bug report
74
- - @lfiorini — CSS lint issue report
75
- - @WojakGra — sidebar-without-hover feature