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.
- package/CHANGELOG.md +48 -0
- package/README.md +43 -17
- package/dist/UI/general.html +303 -126
- package/dist/UI/icons.html +303 -126
- package/dist/UI/timeline.html +303 -126
- package/dist/css/adminlte.css +2798 -1167
- package/dist/css/adminlte.css.map +1 -1
- package/dist/css/adminlte.min.css +2 -2
- package/dist/css/adminlte.min.css.map +1 -1
- package/dist/css/adminlte.rtl.css +2798 -1167
- package/dist/css/adminlte.rtl.css.map +1 -1
- package/dist/css/adminlte.rtl.min.css +2 -2
- package/dist/css/adminlte.rtl.min.css.map +1 -1
- package/dist/docs/browser-support.html +261 -397
- package/dist/docs/color-mode.html +242 -382
- package/dist/docs/components/main-header.html +238 -374
- package/dist/docs/components/main-sidebar.html +253 -389
- package/dist/docs/customization.html +1056 -0
- package/dist/docs/deployment.html +1121 -0
- package/dist/docs/faq.html +857 -409
- package/dist/docs/getting-started.html +967 -0
- package/dist/docs/how-to-contribute.html +335 -462
- package/dist/docs/index.html +16 -0
- package/dist/docs/integrations.html +1207 -0
- package/dist/docs/introduction.html +453 -446
- package/dist/docs/javascript/accessibility.html +361 -491
- package/dist/docs/javascript/card-widget.html +446 -450
- package/dist/docs/javascript/direct-chat.html +324 -421
- package/dist/docs/javascript/fullscreen.html +348 -416
- package/dist/docs/javascript/layout.html +345 -436
- package/dist/docs/javascript/plugins-overview.html +1120 -0
- package/dist/docs/javascript/pushmenu.html +485 -492
- package/dist/docs/javascript/treeview.html +466 -400
- package/dist/docs/layout-blueprint.html +1063 -0
- package/dist/docs/layout.html +287 -415
- package/dist/docs/license.html +252 -387
- package/dist/docs/migration.html +1125 -0
- package/dist/docs/recipes.html +1161 -0
- package/dist/docs/rtl.html +933 -0
- package/dist/examples/lockscreen.html +65 -1
- package/dist/examples/login-v2.html +65 -1
- package/dist/examples/login.html +65 -1
- package/dist/examples/register-v2.html +65 -1
- package/dist/examples/register.html +65 -1
- package/dist/forms/{general.html → elements.html} +489 -463
- package/dist/forms/layout.html +1243 -0
- package/dist/forms/validation.html +1251 -0
- package/dist/forms/wizard.html +1386 -0
- package/dist/generate/theme.html +134 -4
- package/dist/index.html +303 -126
- package/dist/index2.html +306 -126
- package/dist/index3.html +303 -126
- package/dist/js/adminlte.js +5 -5
- package/dist/js/adminlte.js.map +1 -1
- package/dist/js/adminlte.min.js +2 -2
- package/dist/js/adminlte.min.js.map +1 -1
- package/dist/layout/collapsed-sidebar-without-hover.html +303 -126
- package/dist/layout/collapsed-sidebar.html +303 -126
- package/dist/layout/fixed-complete.html +303 -126
- package/dist/layout/fixed-footer.html +303 -126
- package/dist/layout/fixed-header.html +303 -126
- package/dist/layout/fixed-sidebar.html +303 -126
- package/dist/layout/layout-custom-area.html +303 -126
- package/dist/layout/layout-rtl.html +303 -126
- package/dist/layout/logo-switch.html +134 -4
- package/dist/layout/sidebar-mini.html +303 -126
- package/dist/layout/unfixed-sidebar.html +303 -126
- package/dist/mailbox/compose.html +1127 -0
- package/dist/mailbox/inbox.html +1477 -0
- package/dist/mailbox/read.html +1178 -0
- package/dist/pages/404.html +213 -0
- package/dist/pages/500.html +201 -0
- package/dist/pages/calendar.html +1242 -0
- package/dist/pages/chat.html +1403 -0
- package/dist/pages/faq.html +1359 -0
- package/dist/pages/file-manager.html +1811 -0
- package/dist/pages/invoice.html +1175 -0
- package/dist/pages/kanban.html +1415 -0
- package/dist/pages/maintenance.html +204 -0
- package/dist/pages/pricing.html +1255 -0
- package/dist/pages/profile.html +1358 -0
- package/dist/pages/projects.html +1620 -0
- package/dist/pages/settings.html +1363 -0
- package/dist/tables/data.html +1295 -0
- package/dist/tables/simple.html +303 -126
- package/dist/widgets/cards.html +303 -126
- package/dist/widgets/info-box.html +303 -126
- package/dist/widgets/small-box.html +303 -126
- package/netlify.toml +16 -0
- package/package.json +29 -23
- package/src/scss/_app-header.scss +27 -0
- package/src/scss/_app-sidebar.scss +24 -30
- package/src/scss/_bootstrap-variables.scss +11 -4
- package/src/scss/_docs.scss +816 -0
- package/src/scss/_table.scss +4 -4
- package/src/scss/adminlte.scss +4 -1
- package/src/ts/adminlte.ts +1 -1
- package/src/ts/fullscreen.ts +8 -4
- package/src/ts/push-menu.ts +66 -5
- package/.claude/settings.local.json +0 -37
- package/CLAUDE.md +0 -79
- package/release.md +0 -75
package/src/scss/_table.scss
CHANGED
|
@@ -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
|
package/src/scss/adminlte.scss
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* AdminLTE v4.0.0
|
|
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";
|
package/src/ts/adminlte.ts
CHANGED
|
@@ -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
|
|
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>
|
package/src/ts/fullscreen.ts
CHANGED
|
@@ -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.
|
|
52
|
+
iconMaximize.classList.add('d-none')
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
if (iconMinimize) {
|
|
52
|
-
iconMinimize.
|
|
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.
|
|
71
|
+
iconMaximize.classList.remove('d-none')
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
if (iconMinimize) {
|
|
71
|
-
iconMinimize.
|
|
75
|
+
iconMinimize.classList.add('d-none')
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
this._element.dispatchEvent(event)
|
package/src/ts/push-menu.ts
CHANGED
|
@@ -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,
|
|
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
|