admin-lte 4.2.0 → 4.3.1

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 (49) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +17 -1
  3. package/dist/css/adminlte-docs.css +1 -1
  4. package/dist/css/adminlte-docs.css.map +1 -1
  5. package/dist/css/adminlte-docs.min.css +1 -1
  6. package/dist/css/adminlte-docs.min.css.map +1 -1
  7. package/dist/css/adminlte-docs.rtl.css +1 -1
  8. package/dist/css/adminlte-docs.rtl.css.map +1 -1
  9. package/dist/css/adminlte-docs.rtl.min.css +1 -1
  10. package/dist/css/adminlte-docs.rtl.min.css.map +1 -1
  11. package/dist/css/adminlte-select2.css +329 -0
  12. package/dist/css/adminlte-select2.css.map +1 -0
  13. package/dist/css/adminlte-select2.min.css +12 -0
  14. package/dist/css/adminlte-select2.min.css.map +1 -0
  15. package/dist/css/adminlte-select2.rtl.css +328 -0
  16. package/dist/css/adminlte-select2.rtl.css.map +1 -0
  17. package/dist/css/adminlte-select2.rtl.min.css +12 -0
  18. package/dist/css/adminlte-select2.rtl.min.css.map +1 -0
  19. package/dist/css/adminlte.css +202 -1
  20. package/dist/css/adminlte.css.map +1 -1
  21. package/dist/css/adminlte.min.css +2 -2
  22. package/dist/css/adminlte.min.css.map +1 -1
  23. package/dist/css/adminlte.rtl.css +202 -1
  24. package/dist/css/adminlte.rtl.css.map +1 -1
  25. package/dist/css/adminlte.rtl.min.css +2 -2
  26. package/dist/css/adminlte.rtl.min.css.map +1 -1
  27. package/dist/js/adminlte.esm.js +231 -81
  28. package/dist/js/adminlte.esm.js.map +1 -1
  29. package/dist/js/adminlte.esm.min.js +2 -2
  30. package/dist/js/adminlte.esm.min.js.map +1 -1
  31. package/dist/js/adminlte.js +231 -80
  32. package/dist/js/adminlte.js.map +1 -1
  33. package/dist/js/adminlte.min.js +2 -2
  34. package/dist/js/adminlte.min.js.map +1 -1
  35. package/dist/js/types/adminlte.d.ts +2 -1
  36. package/dist/js/types/sidebar-search.d.ts +46 -0
  37. package/package.json +1 -1
  38. package/src/scss/_app-sidebar.scss +12 -0
  39. package/src/scss/_ribbon.scss +75 -0
  40. package/src/scss/_variables.scss +28 -0
  41. package/src/scss/_widgets.scss +192 -0
  42. package/src/scss/adminlte-docs.scss +1 -1
  43. package/src/scss/adminlte-select2.scss +31 -0
  44. package/src/scss/adminlte.scss +1 -1
  45. package/src/scss/compat/_select2.scss +476 -0
  46. package/src/scss/parts/_extra-components.scss +2 -0
  47. package/src/ts/accessibility.ts +25 -13
  48. package/src/ts/adminlte.ts +3 -1
  49. package/src/ts/sidebar-search.ts +252 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * AdminLTE v4.2.0 (https://adminlte.io)
2
+ * AdminLTE v4.3.1 (https://adminlte.io)
3
3
  * Copyright 2014-2026 Colorlib <https://colorlib.com>
4
4
  * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)
5
5
  */
@@ -198,16 +198,16 @@
198
198
  return event;
199
199
  };
200
200
 
201
- const NAME$4 = 'card-widget';
202
- const EVENT_KEY$5 = `.lte.${NAME$4}`;
203
- const EVENT_COLLAPSE$2 = `collapse${EVENT_KEY$5}`;
204
- const EVENT_EXPAND$1 = `expand${EVENT_KEY$5}`;
205
- const EVENT_REMOVE = `remove${EVENT_KEY$5}`;
206
- const EVENT_COLLAPSED$3 = `collapsed${EVENT_KEY$5}`;
207
- const EVENT_EXPANDED$2 = `expanded${EVENT_KEY$5}`;
208
- const EVENT_REMOVED = `removed${EVENT_KEY$5}`;
209
- const EVENT_MAXIMIZED$1 = `maximized${EVENT_KEY$5}`;
210
- const EVENT_MINIMIZED$1 = `minimized${EVENT_KEY$5}`;
201
+ const NAME$5 = 'card-widget';
202
+ const EVENT_KEY$6 = `.lte.${NAME$5}`;
203
+ const EVENT_COLLAPSE$2 = `collapse${EVENT_KEY$6}`;
204
+ const EVENT_EXPAND$1 = `expand${EVENT_KEY$6}`;
205
+ const EVENT_REMOVE = `remove${EVENT_KEY$6}`;
206
+ const EVENT_COLLAPSED$3 = `collapsed${EVENT_KEY$6}`;
207
+ const EVENT_EXPANDED$2 = `expanded${EVENT_KEY$6}`;
208
+ const EVENT_REMOVED = `removed${EVENT_KEY$6}`;
209
+ const EVENT_MAXIMIZED$1 = `maximized${EVENT_KEY$6}`;
210
+ const EVENT_MINIMIZED$1 = `minimized${EVENT_KEY$6}`;
211
211
  const CLASS_NAME_CARD = 'card';
212
212
  const CLASS_NAME_COLLAPSED = 'collapsed-card';
213
213
  const CLASS_NAME_COLLAPSING = 'collapsing-card';
@@ -228,7 +228,7 @@
228
228
  };
229
229
  class CardWidget extends BaseComponent {
230
230
  static get NAME() {
231
- return NAME$4;
231
+ return NAME$5;
232
232
  }
233
233
  static getInstance(element) {
234
234
  return this._getInstance(element);
@@ -395,29 +395,29 @@
395
395
  }
396
396
  });
397
397
 
398
- const NAME$3 = 'treeview';
399
- const EVENT_KEY$4 = `.lte.${NAME$3}`;
400
- const EVENT_EXPAND = `expand${EVENT_KEY$4}`;
401
- const EVENT_COLLAPSE$1 = `collapse${EVENT_KEY$4}`;
402
- const EVENT_EXPANDED$1 = `expanded${EVENT_KEY$4}`;
403
- const EVENT_COLLAPSED$2 = `collapsed${EVENT_KEY$4}`;
404
- const EVENT_LOAD_DATA_API = `load${EVENT_KEY$4}`;
405
- const CLASS_NAME_MENU_OPEN = 'menu-open';
406
- const SELECTOR_NAV_ITEM = '.nav-item';
407
- const SELECTOR_NAV_LINK = '.nav-link';
408
- const SELECTOR_TREEVIEW_MENU = '.nav-treeview';
409
- const SELECTOR_DATA_TOGGLE$1 = '[data-lte-toggle="treeview"]';
398
+ const NAME$4 = 'treeview';
399
+ const EVENT_KEY$5 = `.lte.${NAME$4}`;
400
+ const EVENT_EXPAND = `expand${EVENT_KEY$5}`;
401
+ const EVENT_COLLAPSE$1 = `collapse${EVENT_KEY$5}`;
402
+ const EVENT_EXPANDED$1 = `expanded${EVENT_KEY$5}`;
403
+ const EVENT_COLLAPSED$2 = `collapsed${EVENT_KEY$5}`;
404
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY$5}`;
405
+ const CLASS_NAME_MENU_OPEN$1 = 'menu-open';
406
+ const SELECTOR_NAV_ITEM$1 = '.nav-item';
407
+ const SELECTOR_NAV_LINK$1 = '.nav-link';
408
+ const SELECTOR_TREEVIEW_MENU$1 = '.nav-treeview';
409
+ const SELECTOR_DATA_TOGGLE$2 = '[data-lte-toggle="treeview"]';
410
410
  const Default = {
411
411
  animationSpeed: 300,
412
412
  accordion: true
413
413
  };
414
414
  const setAriaExpanded = (navItem, expanded) => {
415
- const link = navItem.querySelector(`:scope > ${SELECTOR_NAV_LINK}`);
415
+ const link = navItem.querySelector(`:scope > ${SELECTOR_NAV_LINK$1}`);
416
416
  link?.setAttribute('aria-expanded', String(expanded));
417
417
  };
418
418
  class Treeview extends BaseComponent {
419
419
  static get NAME() {
420
- return NAME$3;
420
+ return NAME$4;
421
421
  }
422
422
  static getInstance(element) {
423
423
  return this._getInstance(element);
@@ -435,26 +435,26 @@
435
435
  return;
436
436
  }
437
437
  if (this._config.accordion) {
438
- const openMenuList = this._element.parentElement?.querySelectorAll(`${SELECTOR_NAV_ITEM}.${CLASS_NAME_MENU_OPEN}`);
438
+ const openMenuList = this._element.parentElement?.querySelectorAll(`${SELECTOR_NAV_ITEM$1}.${CLASS_NAME_MENU_OPEN$1}`);
439
439
  openMenuList?.forEach(openMenu => {
440
440
  if (!this._element.contains(openMenu)) {
441
- openMenu.classList.remove(CLASS_NAME_MENU_OPEN);
441
+ openMenu.classList.remove(CLASS_NAME_MENU_OPEN$1);
442
442
  setAriaExpanded(openMenu, false);
443
- const childElement = openMenu?.querySelector(SELECTOR_TREEVIEW_MENU);
443
+ const childElement = openMenu?.querySelector(SELECTOR_TREEVIEW_MENU$1);
444
444
  if (childElement) {
445
445
  slideUp(childElement, this._config.animationSpeed);
446
446
  }
447
447
  }
448
448
  });
449
449
  }
450
- this._element.classList.add(CLASS_NAME_MENU_OPEN);
450
+ this._element.classList.add(CLASS_NAME_MENU_OPEN$1);
451
451
  setAriaExpanded(this._element, true);
452
- const childElement = this._element.querySelector(SELECTOR_TREEVIEW_MENU);
452
+ const childElement = this._element.querySelector(SELECTOR_TREEVIEW_MENU$1);
453
453
  if (childElement) {
454
454
  slideDown(childElement, this._config.animationSpeed);
455
455
  }
456
456
  setTimeout(() => {
457
- if (this._element.classList.contains(CLASS_NAME_MENU_OPEN)) {
457
+ if (this._element.classList.contains(CLASS_NAME_MENU_OPEN$1)) {
458
458
  dispatchCustomEvent(this._element, EVENT_EXPANDED$1);
459
459
  }
460
460
  }, this._config.animationSpeed);
@@ -463,20 +463,20 @@
463
463
  if (dispatchCustomEvent(this._element, EVENT_COLLAPSE$1, { cancelable: true }).defaultPrevented) {
464
464
  return;
465
465
  }
466
- this._element.classList.remove(CLASS_NAME_MENU_OPEN);
466
+ this._element.classList.remove(CLASS_NAME_MENU_OPEN$1);
467
467
  setAriaExpanded(this._element, false);
468
- const childElement = this._element.querySelector(SELECTOR_TREEVIEW_MENU);
468
+ const childElement = this._element.querySelector(SELECTOR_TREEVIEW_MENU$1);
469
469
  if (childElement) {
470
470
  slideUp(childElement, this._config.animationSpeed);
471
471
  }
472
472
  setTimeout(() => {
473
- if (!this._element.classList.contains(CLASS_NAME_MENU_OPEN)) {
473
+ if (!this._element.classList.contains(CLASS_NAME_MENU_OPEN$1)) {
474
474
  dispatchCustomEvent(this._element, EVENT_COLLAPSED$2);
475
475
  }
476
476
  }, this._config.animationSpeed);
477
477
  }
478
478
  toggle() {
479
- if (this._element.classList.contains(CLASS_NAME_MENU_OPEN)) {
479
+ if (this._element.classList.contains(CLASS_NAME_MENU_OPEN$1)) {
480
480
  this.close();
481
481
  }
482
482
  else {
@@ -489,13 +489,13 @@
489
489
  if (!(target instanceof Element)) {
490
490
  return;
491
491
  }
492
- const toggleRoot = target.closest(SELECTOR_DATA_TOGGLE$1);
492
+ const toggleRoot = target.closest(SELECTOR_DATA_TOGGLE$2);
493
493
  if (!toggleRoot) {
494
494
  return;
495
495
  }
496
- const targetItem = target.closest(SELECTOR_NAV_ITEM);
497
- const targetLink = target.closest(SELECTOR_NAV_LINK);
498
- if (!targetItem?.querySelector(SELECTOR_TREEVIEW_MENU)) {
496
+ const targetItem = target.closest(SELECTOR_NAV_ITEM$1);
497
+ const targetLink = target.closest(SELECTOR_NAV_LINK$1);
498
+ if (!targetItem?.querySelector(SELECTOR_TREEVIEW_MENU$1)) {
499
499
  return;
500
500
  }
501
501
  if (target.getAttribute('href') === '#' || targetLink?.getAttribute('href') === '#') {
@@ -510,34 +510,34 @@
510
510
  Treeview.getOrCreateInstance(targetItem, config).toggle();
511
511
  });
512
512
  onDOMContentLoaded(() => {
513
- const openMenuItems = document.querySelectorAll(`${SELECTOR_NAV_ITEM}.${CLASS_NAME_MENU_OPEN}`);
513
+ const openMenuItems = document.querySelectorAll(`${SELECTOR_NAV_ITEM$1}.${CLASS_NAME_MENU_OPEN$1}`);
514
514
  openMenuItems.forEach(menuItem => {
515
- const childElement = menuItem.querySelector(SELECTOR_TREEVIEW_MENU);
515
+ const childElement = menuItem.querySelector(SELECTOR_TREEVIEW_MENU$1);
516
516
  if (childElement) {
517
517
  slideDown(childElement, 0);
518
518
  const event = new Event(EVENT_LOAD_DATA_API);
519
519
  menuItem.dispatchEvent(event);
520
520
  }
521
521
  });
522
- document.querySelectorAll(SELECTOR_DATA_TOGGLE$1).forEach(root => {
523
- root.querySelectorAll(SELECTOR_NAV_ITEM).forEach(item => {
524
- if (item.querySelector(`:scope > ${SELECTOR_TREEVIEW_MENU}`)) {
525
- setAriaExpanded(item, item.classList.contains(CLASS_NAME_MENU_OPEN));
522
+ document.querySelectorAll(SELECTOR_DATA_TOGGLE$2).forEach(root => {
523
+ root.querySelectorAll(SELECTOR_NAV_ITEM$1).forEach(item => {
524
+ if (item.querySelector(`:scope > ${SELECTOR_TREEVIEW_MENU$1}`)) {
525
+ setAriaExpanded(item, item.classList.contains(CLASS_NAME_MENU_OPEN$1));
526
526
  }
527
527
  });
528
528
  });
529
529
  });
530
530
 
531
- const NAME$2 = 'direct-chat';
532
- const EVENT_KEY$3 = `.lte.${NAME$2}`;
533
- const EVENT_EXPANDED = `expanded${EVENT_KEY$3}`;
534
- const EVENT_COLLAPSED$1 = `collapsed${EVENT_KEY$3}`;
535
- const SELECTOR_DATA_TOGGLE = '[data-lte-toggle="chat-pane"]';
531
+ const NAME$3 = 'direct-chat';
532
+ const EVENT_KEY$4 = `.lte.${NAME$3}`;
533
+ const EVENT_EXPANDED = `expanded${EVENT_KEY$4}`;
534
+ const EVENT_COLLAPSED$1 = `collapsed${EVENT_KEY$4}`;
535
+ const SELECTOR_DATA_TOGGLE$1 = '[data-lte-toggle="chat-pane"]';
536
536
  const SELECTOR_DIRECT_CHAT = '.direct-chat';
537
537
  const CLASS_NAME_DIRECT_CHAT_OPEN = 'direct-chat-contacts-open';
538
538
  class DirectChat extends BaseComponent {
539
539
  static get NAME() {
540
- return NAME$2;
540
+ return NAME$3;
541
541
  }
542
542
  static getInstance(element) {
543
543
  return this._getInstance(element);
@@ -561,7 +561,7 @@
561
561
  if (!(target instanceof Element)) {
562
562
  return;
563
563
  }
564
- const trigger = target.closest(SELECTOR_DATA_TOGGLE);
564
+ const trigger = target.closest(SELECTOR_DATA_TOGGLE$1);
565
565
  if (!trigger) {
566
566
  return;
567
567
  }
@@ -572,10 +572,10 @@
572
572
  }
573
573
  });
574
574
 
575
- const NAME$1 = 'fullscreen';
576
- const EVENT_KEY$2 = `.lte.${NAME$1}`;
577
- const EVENT_MAXIMIZED = `maximized${EVENT_KEY$2}`;
578
- const EVENT_MINIMIZED = `minimized${EVENT_KEY$2}`;
575
+ const NAME$2 = 'fullscreen';
576
+ const EVENT_KEY$3 = `.lte.${NAME$2}`;
577
+ const EVENT_MAXIMIZED = `maximized${EVENT_KEY$3}`;
578
+ const EVENT_MINIMIZED = `minimized${EVENT_KEY$3}`;
579
579
  const SELECTOR_FULLSCREEN_TOGGLE = '[data-lte-toggle="fullscreen"]';
580
580
  const SELECTOR_MAXIMIZE_ICON = '[data-lte-icon="maximize"]';
581
581
  const SELECTOR_MINIMIZE_ICON = '[data-lte-icon="minimize"]';
@@ -592,7 +592,7 @@
592
592
  }
593
593
  class FullScreen extends BaseComponent {
594
594
  static get NAME() {
595
- return NAME$1;
595
+ return NAME$2;
596
596
  }
597
597
  static getInstance(element) {
598
598
  return this._getInstance(element);
@@ -636,12 +636,12 @@
636
636
  document.addEventListener('fullscreenchange', syncFullScreenState, { signal: getLifecycleSignal() });
637
637
  });
638
638
 
639
- const NAME = 'push-menu';
640
- const EVENT_KEY$1 = `.lte.${NAME}`;
641
- const EVENT_OPEN = `open${EVENT_KEY$1}`;
642
- const EVENT_COLLAPSE = `collapse${EVENT_KEY$1}`;
643
- const EVENT_OPENED = `opened${EVENT_KEY$1}`;
644
- const EVENT_COLLAPSED = `collapsed${EVENT_KEY$1}`;
639
+ const NAME$1 = 'push-menu';
640
+ const EVENT_KEY$2 = `.lte.${NAME$1}`;
641
+ const EVENT_OPEN = `open${EVENT_KEY$2}`;
642
+ const EVENT_COLLAPSE = `collapse${EVENT_KEY$2}`;
643
+ const EVENT_OPENED = `opened${EVENT_KEY$2}`;
644
+ const EVENT_COLLAPSED = `collapsed${EVENT_KEY$2}`;
645
645
  const CLASS_NAME_SIDEBAR_MINI = 'sidebar-mini';
646
646
  const CLASS_NAME_SIDEBAR_EXPAND = 'sidebar-expand';
647
647
  const CLASS_NAME_SIDEBAR_OVERLAY = 'sidebar-overlay';
@@ -658,7 +658,7 @@
658
658
  };
659
659
  class PushMenu extends BaseComponent {
660
660
  static get NAME() {
661
- return NAME;
661
+ return NAME$1;
662
662
  }
663
663
  static getInstance(element) {
664
664
  return this._getInstance(element);
@@ -859,8 +859,8 @@
859
859
  });
860
860
 
861
861
  const DATA_KEY = 'lte.color-mode';
862
- const EVENT_KEY = `.${DATA_KEY}`;
863
- const EVENT_CHANGED = `changed${EVENT_KEY}`;
862
+ const EVENT_KEY$1 = `.${DATA_KEY}`;
863
+ const EVENT_CHANGED = `changed${EVENT_KEY$1}`;
864
864
  const STORAGE_KEY = 'lte-theme';
865
865
  const ATTRIBUTE_THEME = 'data-bs-theme';
866
866
  const ATTRIBUTE_TOGGLE = 'data-bs-theme-value';
@@ -972,6 +972,154 @@
972
972
  }, { signal: getLifecycleSignal() });
973
973
  });
974
974
 
975
+ const NAME = 'sidebar-search';
976
+ const EVENT_KEY = `.lte.${NAME}`;
977
+ const EVENT_FILTERED = `filtered${EVENT_KEY}`;
978
+ const CLASS_NAME_MENU_OPEN = 'menu-open';
979
+ const SELECTOR_DATA_TOGGLE = '[data-lte-toggle="sidebar-search"]';
980
+ const SELECTOR_SIDEBAR = '.app-sidebar';
981
+ const SELECTOR_MENU = '.sidebar-menu';
982
+ const SELECTOR_NAV_ITEM = '.nav-item';
983
+ const SELECTOR_NAV_HEADER = '.nav-header';
984
+ const SELECTOR_NAV_LINK = ':scope > .nav-link';
985
+ const SELECTOR_TREEVIEW_MENU = ':scope > .nav-treeview';
986
+ const SELECTOR_EMPTY_STATE = '[data-lte-search-empty]';
987
+ const submenuOf = (item) => item.querySelector(SELECTOR_TREEVIEW_MENU);
988
+ const setOpen = (item, submenu, open, display) => {
989
+ item.classList.toggle(CLASS_NAME_MENU_OPEN, open);
990
+ item.querySelector(SELECTOR_NAV_LINK)?.setAttribute('aria-expanded', String(open));
991
+ submenu.style.display = display;
992
+ };
993
+ class SidebarSearch extends BaseComponent {
994
+ static get NAME() {
995
+ return NAME;
996
+ }
997
+ static getInstance(element) {
998
+ return this._getInstance(element);
999
+ }
1000
+ static getOrCreateInstance(element) {
1001
+ return this.getInstance(element) ?? new this(element);
1002
+ }
1003
+ _menu;
1004
+ _emptyState;
1005
+ _snapshot = null;
1006
+ constructor(element) {
1007
+ super(element);
1008
+ const target = element.dataset.lteTarget;
1009
+ const scope = element.closest(SELECTOR_SIDEBAR) ?? document;
1010
+ this._menu = target ?
1011
+ document.querySelector(target) :
1012
+ scope.querySelector(SELECTOR_MENU);
1013
+ this._emptyState = scope.querySelector(SELECTOR_EMPTY_STATE);
1014
+ }
1015
+ search(term) {
1016
+ const menu = this._menu;
1017
+ if (!menu) {
1018
+ return;
1019
+ }
1020
+ const query = term.trim().toLowerCase();
1021
+ if (!query) {
1022
+ this.clear();
1023
+ return;
1024
+ }
1025
+ this._snapshot ??= this._takeSnapshot(menu);
1026
+ const items = [...menu.querySelectorAll(SELECTOR_NAV_ITEM)];
1027
+ const matched = new Set();
1028
+ for (const item of items) {
1029
+ const label = item.querySelector(SELECTOR_NAV_LINK)?.textContent?.replace(/\s+/g, ' ').trim().toLowerCase();
1030
+ if (label?.includes(query)) {
1031
+ matched.add(item);
1032
+ }
1033
+ }
1034
+ for (let index = items.length - 1; index >= 0; index--) {
1035
+ const item = items[index];
1036
+ item.hidden = !(matched.has(item) || item.querySelector(`${SELECTOR_NAV_ITEM}:not([hidden])`));
1037
+ }
1038
+ for (const item of matched) {
1039
+ for (const descendant of item.querySelectorAll(SELECTOR_NAV_ITEM)) {
1040
+ descendant.hidden = false;
1041
+ }
1042
+ }
1043
+ let visible = 0;
1044
+ for (const item of items) {
1045
+ if (!item.hidden) {
1046
+ visible++;
1047
+ }
1048
+ const submenu = submenuOf(item);
1049
+ if (submenu) {
1050
+ const expand = !item.hidden && Boolean(item.querySelector(`${SELECTOR_NAV_ITEM}:not([hidden])`));
1051
+ setOpen(item, submenu, expand, expand ? 'block' : 'none');
1052
+ }
1053
+ }
1054
+ for (const header of menu.querySelectorAll(SELECTOR_NAV_HEADER)) {
1055
+ header.hidden = true;
1056
+ }
1057
+ if (this._emptyState) {
1058
+ this._emptyState.hidden = visible > 0;
1059
+ }
1060
+ dispatchCustomEvent(this._element, EVENT_FILTERED, { detail: { query, matches: visible } });
1061
+ }
1062
+ clear() {
1063
+ const menu = this._menu;
1064
+ if (!menu) {
1065
+ return;
1066
+ }
1067
+ for (const item of menu.querySelectorAll(`${SELECTOR_NAV_ITEM}, ${SELECTOR_NAV_HEADER}`)) {
1068
+ item.hidden = false;
1069
+ }
1070
+ if (this._snapshot) {
1071
+ for (const [item, state] of this._snapshot) {
1072
+ const submenu = submenuOf(item);
1073
+ if (submenu) {
1074
+ setOpen(item, submenu, state.open, state.display);
1075
+ }
1076
+ }
1077
+ this._snapshot = null;
1078
+ }
1079
+ if (this._emptyState) {
1080
+ this._emptyState.hidden = true;
1081
+ }
1082
+ dispatchCustomEvent(this._element, EVENT_FILTERED, { detail: { query: '', matches: -1 } });
1083
+ }
1084
+ dispose() {
1085
+ this.clear();
1086
+ super.dispose();
1087
+ }
1088
+ _takeSnapshot(menu) {
1089
+ const snapshot = new Map();
1090
+ for (const item of menu.querySelectorAll(SELECTOR_NAV_ITEM)) {
1091
+ const submenu = submenuOf(item);
1092
+ if (submenu) {
1093
+ snapshot.set(item, {
1094
+ open: item.classList.contains(CLASS_NAME_MENU_OPEN),
1095
+ display: submenu.style.display
1096
+ });
1097
+ }
1098
+ }
1099
+ return snapshot;
1100
+ }
1101
+ }
1102
+ document.addEventListener('input', event => {
1103
+ const target = event.target;
1104
+ if (target instanceof HTMLInputElement && target.matches(SELECTOR_DATA_TOGGLE)) {
1105
+ SidebarSearch.getOrCreateInstance(target).search(target.value);
1106
+ }
1107
+ });
1108
+ document.addEventListener('keydown', event => {
1109
+ const target = event.target;
1110
+ if (event.key === 'Escape' && target instanceof HTMLInputElement && target.matches(SELECTOR_DATA_TOGGLE)) {
1111
+ target.value = '';
1112
+ SidebarSearch.getOrCreateInstance(target).clear();
1113
+ }
1114
+ });
1115
+ onDOMContentLoaded(() => {
1116
+ document.querySelectorAll(SELECTOR_DATA_TOGGLE).forEach(input => {
1117
+ if (input.value) {
1118
+ SidebarSearch.getOrCreateInstance(input).search(input.value);
1119
+ }
1120
+ });
1121
+ });
1122
+
975
1123
  class AccessibilityManager {
976
1124
  config;
977
1125
  liveRegion = null;
@@ -1045,19 +1193,21 @@
1045
1193
  this.ensureSkipTargets();
1046
1194
  }
1047
1195
  ensureSkipTargets() {
1048
- const main = document.querySelector('#main, main, [role="main"]');
1049
- if (main && !main.id) {
1050
- main.id = 'main';
1051
- }
1052
- if (main && !main.hasAttribute('tabindex')) {
1053
- main.setAttribute('tabindex', '-1');
1054
- }
1055
- const nav = document.querySelector('#navigation, nav, [role="navigation"]');
1056
- if (nav && !nav.id) {
1057
- nav.id = 'navigation';
1058
- }
1059
- if (nav && !nav.hasAttribute('tabindex')) {
1060
- nav.setAttribute('tabindex', '-1');
1196
+ const targets = [
1197
+ ['main', 'main, [role="main"]'],
1198
+ ['navigation', 'nav, [role="navigation"]']
1199
+ ];
1200
+ for (const [id, fallbackSelector] of targets) {
1201
+ const target = document.getElementById(id) ?? document.querySelector(fallbackSelector);
1202
+ if (!target) {
1203
+ continue;
1204
+ }
1205
+ if (!target.id) {
1206
+ target.id = id;
1207
+ }
1208
+ if (!target.hasAttribute('tabindex')) {
1209
+ target.setAttribute('tabindex', '-1');
1210
+ }
1061
1211
  }
1062
1212
  }
1063
1213
  initFocusManagement() {
@@ -1414,6 +1564,7 @@
1414
1564
  exports.FullScreen = FullScreen;
1415
1565
  exports.Layout = Layout;
1416
1566
  exports.PushMenu = PushMenu;
1567
+ exports.SidebarSearch = SidebarSearch;
1417
1568
  exports.Treeview = Treeview;
1418
1569
  exports.initAccessibility = initAccessibility;
1419
1570
  exports.initialize = initialize;