@openeuropa/bcl-theme-joinup 0.4230.202512021730 → 0.4360.202601141610

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/css/oe-bcl-joinup.css +61 -48
  2. package/css/oe-bcl-joinup.css.map +1 -1
  3. package/css/oe-bcl-joinup.min.css +1 -1
  4. package/css/oe-bcl-joinup.min.css.map +1 -1
  5. package/js/oe-bcl-joinup.bundle.js +112 -1
  6. package/js/oe-bcl-joinup.bundle.js.map +1 -1
  7. package/js/oe-bcl-joinup.bundle.min.js +1 -1
  8. package/js/oe-bcl-joinup.bundle.min.js.map +1 -1
  9. package/js/oe-bcl-joinup.esm.js +111 -1
  10. package/js/oe-bcl-joinup.esm.js.map +1 -1
  11. package/js/oe-bcl-joinup.esm.min.js +1 -1
  12. package/js/oe-bcl-joinup.esm.min.js.map +1 -1
  13. package/js/oe-bcl-joinup.umd.js +112 -1
  14. package/js/oe-bcl-joinup.umd.js.map +1 -1
  15. package/js/oe-bcl-joinup.umd.min.js +1 -1
  16. package/js/oe-bcl-joinup.umd.min.js.map +1 -1
  17. package/package.json +7 -7
  18. package/src/js/index.esm.js +2 -0
  19. package/src/js/index.umd.js +2 -0
  20. package/templates/bcl-accordion/accordion.html.twig +42 -43
  21. package/templates/bcl-alert/alert.html.twig +18 -18
  22. package/templates/bcl-badge/badge.html.twig +11 -12
  23. package/templates/bcl-banner/banner.html.twig +34 -34
  24. package/templates/bcl-base-templates/content-type.html.twig +63 -64
  25. package/templates/bcl-base-templates/listing-page.html.twig +31 -31
  26. package/templates/bcl-base-templates/sidebar-search.html.twig +10 -10
  27. package/templates/bcl-blockquote/blockquote.html.twig +17 -17
  28. package/templates/bcl-breadcrumb/breadcrumb.html.twig +24 -25
  29. package/templates/bcl-button/button.html.twig +24 -24
  30. package/templates/bcl-button-group/button-group.html.twig +25 -26
  31. package/templates/bcl-card/card.html.twig +98 -98
  32. package/templates/bcl-card-layout/card-layout.html.twig +34 -34
  33. package/templates/bcl-carousel/carousel.html.twig +64 -64
  34. package/templates/bcl-contact-form/contact-form.html.twig +1 -1
  35. package/templates/bcl-content-banner/content-banner.html.twig +37 -37
  36. package/templates/bcl-date-block/date-block.html.twig +26 -26
  37. package/templates/bcl-description-list/description-list-details.html.twig +6 -6
  38. package/templates/bcl-description-list/description-list-title.html.twig +11 -11
  39. package/templates/bcl-description-list/description-list.html.twig +44 -45
  40. package/templates/bcl-dropdown/dropdown.html.twig +48 -49
  41. package/templates/bcl-event/event.html.twig +7 -7
  42. package/templates/bcl-fact-figures/fact-figures.html.twig +34 -34
  43. package/templates/bcl-featured-media/featured-media.html.twig +42 -43
  44. package/templates/bcl-file/file-translations.html.twig +29 -29
  45. package/templates/bcl-file/file.html.twig +46 -46
  46. package/templates/bcl-footer/footer.html.twig +31 -31
  47. package/templates/bcl-form/form.html.twig +70 -70
  48. package/templates/bcl-form-input/form-input.html.twig +57 -58
  49. package/templates/bcl-gallery/gallery-item.html.twig +20 -20
  50. package/templates/bcl-gallery/gallery.html.twig +62 -63
  51. package/templates/bcl-glossary/glossary-detail.html.twig +19 -19
  52. package/templates/bcl-glossary/glossary-listing.html.twig +6 -6
  53. package/templates/bcl-group/group-landing.html.twig +69 -69
  54. package/templates/bcl-group/group.html.twig +19 -19
  55. package/templates/bcl-header/header.html.twig +71 -79
  56. package/templates/bcl-heading/heading.html.twig +13 -14
  57. package/templates/bcl-icon/icon.html.twig +10 -10
  58. package/templates/bcl-inpage-navigation/inpage-navigation.html.twig +20 -20
  59. package/templates/bcl-landing-page/landing-page.html.twig +33 -33
  60. package/templates/bcl-language-list/language-list-grid.html.twig +25 -25
  61. package/templates/bcl-language-list/language-list-modal.html.twig +52 -52
  62. package/templates/bcl-language-list/language-list.html.twig +33 -34
  63. package/templates/bcl-language-switcher/language-switcher.html.twig +12 -12
  64. package/templates/bcl-link/link.html.twig +24 -24
  65. package/templates/bcl-links-block/links-block.html.twig +29 -30
  66. package/templates/bcl-list-group/list-group.html.twig +43 -44
  67. package/templates/bcl-listing/listing.html.twig +88 -88
  68. package/templates/bcl-mega-menu/mega-menu-items.html.twig +18 -18
  69. package/templates/bcl-mega-menu/mega-menu-submenu.html.twig +27 -22
  70. package/templates/bcl-mega-menu/mega-menu.html.twig +37 -35
  71. package/templates/bcl-modal/modal.html.twig +17 -17
  72. package/templates/bcl-navbar/navbar.html.twig +35 -35
  73. package/templates/bcl-navigation/navigation.html.twig +106 -106
  74. package/templates/bcl-offcanvas/offcanvas.html.twig +33 -33
  75. package/templates/bcl-page/page.html.twig +27 -27
  76. package/templates/bcl-pagination/pagination-item.html.twig +22 -23
  77. package/templates/bcl-pagination/pagination.html.twig +59 -59
  78. package/templates/bcl-pagination-v2/pagination-item.html.twig +31 -32
  79. package/templates/bcl-pagination-v2/pagination.html.twig +79 -79
  80. package/templates/bcl-person/person.html.twig +12 -12
  81. package/templates/bcl-placeholder/placeholder.html.twig +14 -15
  82. package/templates/bcl-progress/progress.html.twig +16 -17
  83. package/templates/bcl-project/project-lists.html.twig +25 -25
  84. package/templates/bcl-project/project.html.twig +35 -35
  85. package/templates/bcl-project-status/project-contributions.html.twig +25 -25
  86. package/templates/bcl-project-status/project-status.html.twig +32 -34
  87. package/templates/bcl-recent-activities/recent-activities.html.twig +13 -13
  88. package/templates/bcl-search/search.html.twig +12 -12
  89. package/templates/bcl-search-form/search-form.html.twig +21 -21
  90. package/templates/bcl-select/select.html.twig +52 -53
  91. package/templates/bcl-spinner/spinner.html.twig +10 -10
  92. package/templates/bcl-subscription/subscription-modal.html.twig +7 -7
  93. package/templates/bcl-subscription/subscription.html.twig +3 -3
  94. package/templates/bcl-subscription-block/subscription-block.html.twig +14 -14
  95. package/templates/bcl-table/table.html.twig +61 -62
  96. package/templates/bcl-textarea/textarea.html.twig +44 -44
  97. package/templates/bcl-timeline/timeline-item.html.twig +12 -12
  98. package/templates/bcl-timeline/timeline.html.twig +42 -42
  99. package/templates/bcl-toasts/toasts.html.twig +56 -57
  100. package/templates/bcl-user/user-compact.html.twig +24 -24
  101. package/templates/bcl-user/user-terms.html.twig +6 -6
  102. package/templates/bcl-user/user.html.twig +117 -117
@@ -4871,12 +4871,27 @@
4871
4871
  MainNavigation.init(".bcl-navbar-toggler");
4872
4872
  });
4873
4873
 
4874
+ const SUBMENU_HEIGHT_VARIABLE = "--oel-mega-menu-submenu-height";
4875
+ const SUBMENU_BODY_SELECTOR = ".__submenu_body";
4874
4876
  class MegaMenu {
4877
+ scheduleSubmenuHeightUpdate = () => {
4878
+ if (this.submenuHeightFrame) {
4879
+ return;
4880
+ }
4881
+ this.submenuHeightFrame = window.requestAnimationFrame(() => {
4882
+ this.submenuHeightFrame = null;
4883
+ this.updateSubmenuHeight();
4884
+ });
4885
+ };
4875
4886
  constructor(root) {
4876
4887
  this.root = root;
4888
+ this.submenuHeightFrame = null;
4889
+ this.submenuBodies = SelectorEngine.find(SUBMENU_BODY_SELECTOR, this.root);
4877
4890
  this.backButton = SelectorEngine.findOne(".back-button", this.root);
4878
4891
  this.trigger = SelectorEngine.findOne(':scope > .dropdown-toggle[data-bs-toggle="dropdown"]', this.root);
4879
4892
  this.ul = SelectorEngine.findOne('.bcl-mega-menu__items.__level-1', this.root);
4893
+ EventHandler.on(window, "resize", this.scheduleSubmenuHeightUpdate);
4894
+ EventHandler.on(window, "orientationchange", this.scheduleSubmenuHeightUpdate);
4880
4895
  this.addSubmenuTriggerListeners();
4881
4896
  this.addBackButtonListener();
4882
4897
  this.addTriggerListeners();
@@ -4932,6 +4947,7 @@
4932
4947
 
4933
4948
  // When the mega menu is opened, focus the first item in the menu.
4934
4949
  EventHandler.on(this.trigger, 'shown.bs.dropdown', () => {
4950
+ this.scheduleSubmenuHeightUpdate();
4935
4951
  const panelId = this.trigger.getAttribute('aria-controls');
4936
4952
  const panel = panelId ? document.getElementById(panelId) : null;
4937
4953
  const firstFocusable = panel ? this.getFocusableChildren(panel)[0] : null;
@@ -4990,6 +5006,7 @@
4990
5006
  trigger.setAttribute('aria-expanded', 'true');
4991
5007
  const panel = this.getPanelForTrigger(trigger);
4992
5008
  if (panel) panel.hidden = false;
5009
+ this.scheduleSubmenuHeightUpdate();
4993
5010
  }
4994
5011
 
4995
5012
  /**
@@ -5015,6 +5032,33 @@
5015
5032
  const panel = this.getPanelForTrigger(trigger);
5016
5033
  if (panel) panel.hidden = true;
5017
5034
  }
5035
+ updateSubmenuHeight() {
5036
+ if (!this.trigger || this.trigger.getAttribute('aria-expanded') !== 'true') {
5037
+ return;
5038
+ }
5039
+ if (!this.submenuBodies || this.submenuBodies.length === 0) {
5040
+ return;
5041
+ }
5042
+ const viewportHeight = document.documentElement && document.documentElement.clientHeight || window.innerHeight || 0;
5043
+ if (!viewportHeight) {
5044
+ return;
5045
+ }
5046
+ this.submenuBodies.forEach(submenuBody => {
5047
+ if (!submenuBody.isConnected || submenuBody.closest('[hidden]')) {
5048
+ return;
5049
+ }
5050
+ const rect = submenuBody.getBoundingClientRect();
5051
+ const visibleTop = Math.max(rect.top, 0);
5052
+ // Use the distance to the viewport bottom instead of the current element
5053
+ // height. Nested submenus inherit the parent max-height, so relying on
5054
+ // rect.bottom would keep the parent's value and never recalc for children.
5055
+ const availableHeight = Math.max(0, viewportHeight - visibleTop);
5056
+ const value = `${availableHeight}px`;
5057
+ if (submenuBody.style.getPropertyValue(SUBMENU_HEIGHT_VARIABLE) !== value) {
5058
+ submenuBody.style.setProperty(SUBMENU_HEIGHT_VARIABLE, value);
5059
+ }
5060
+ });
5061
+ }
5018
5062
  static init(selector = ".bcl-mega-menu") {
5019
5063
  const megaMenus = SelectorEngine.find(selector);
5020
5064
  megaMenus.forEach(menuEl => new MegaMenu(menuEl));
@@ -6923,6 +6967,72 @@
6923
6967
 
6924
6968
  defineJQueryPlugin$1(Toast);
6925
6969
 
6970
+ const HEADER_SELECTOR = ".bcl-header";
6971
+ const TOGGLER_SELECTOR = ".bcl-navbar-toggler";
6972
+ const OFFSET_VARIABLE = "--oel-mega-menu-offset-top";
6973
+ class Header {
6974
+ scheduleUpdate = () => {
6975
+ if (this.frameRequest) {
6976
+ return;
6977
+ }
6978
+ this.frameRequest = window.requestAnimationFrame(() => {
6979
+ this.frameRequest = null;
6980
+ this.updateOffset();
6981
+ });
6982
+ };
6983
+ constructor(element) {
6984
+ this.element = element;
6985
+ this.frameRequest = null;
6986
+ this.resizeObserver = null;
6987
+ this.init();
6988
+ }
6989
+ init() {
6990
+ this.updateOffset();
6991
+ EventHandler.on(window, "resize", this.scheduleUpdate);
6992
+ EventHandler.on(window, "orientationchange", this.scheduleUpdate);
6993
+ const togglers = SelectorEngine.find(TOGGLER_SELECTOR, this.element);
6994
+ togglers.forEach(toggler => {
6995
+ // Some layouts move the header when the nav toggler expands; keep offset in sync.
6996
+ EventHandler.on(toggler, "click", this.scheduleUpdate);
6997
+ });
6998
+ }
6999
+ updateOffset() {
7000
+ if (!this.element) {
7001
+ return;
7002
+ }
7003
+ const rect = this.element.getBoundingClientRect();
7004
+ const offset = Math.max(0, rect.top);
7005
+ const value = `${offset}px`;
7006
+ if (this.element.style.getPropertyValue(OFFSET_VARIABLE) === value) {
7007
+ return;
7008
+ }
7009
+ this.element.style.setProperty(OFFSET_VARIABLE, value);
7010
+ }
7011
+ static init(root) {
7012
+ if (typeof document === "undefined" || typeof window === "undefined") {
7013
+ return;
7014
+ }
7015
+ const resolvedRoot = root || document;
7016
+ const context = resolvedRoot instanceof Element ? resolvedRoot : resolvedRoot.documentElement || document.documentElement;
7017
+ const headers = SelectorEngine.find(HEADER_SELECTOR, context);
7018
+ headers.forEach(headerElement => {
7019
+ if (headerElement.dataset.headerOffsetInitialized === "true") {
7020
+ return;
7021
+ }
7022
+ headerElement.dataset.headerOffsetInitialized = "true";
7023
+ new Header(headerElement);
7024
+ });
7025
+ }
7026
+ }
7027
+ if (typeof document !== "undefined") {
7028
+ const initializeHeaderOffset = () => Header.init();
7029
+ if (document.readyState === "loading") {
7030
+ document.addEventListener("DOMContentLoaded", initializeHeaderOffset);
7031
+ } else {
7032
+ initializeHeaderOffset();
7033
+ }
7034
+ }
7035
+
6926
7036
  /**
6927
7037
  * --------------------------------------------------------------------------
6928
7038
  * Bootstrap (v5.1.0): index.esm.js
@@ -6948,7 +7058,8 @@
6948
7058
  ScrollSpy,
6949
7059
  Tab,
6950
7060
  Toast,
6951
- Tooltip
7061
+ Tooltip,
7062
+ Header
6952
7063
  };
6953
7064
 
6954
7065
  return index_umd;