@openeuropa/bcl-theme-joinup 0.4298.202511051800 → 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 +167 -85
  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 -46
  21. package/templates/bcl-alert/alert.html.twig +18 -21
  22. package/templates/bcl-badge/badge.html.twig +11 -15
  23. package/templates/bcl-banner/banner.html.twig +34 -37
  24. package/templates/bcl-base-templates/content-type.html.twig +63 -67
  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 -20
  28. package/templates/bcl-breadcrumb/breadcrumb.html.twig +24 -28
  29. package/templates/bcl-button/button.html.twig +24 -27
  30. package/templates/bcl-button-group/button-group.html.twig +25 -29
  31. package/templates/bcl-card/card.html.twig +98 -101
  32. package/templates/bcl-card-layout/card-layout.html.twig +34 -37
  33. package/templates/bcl-carousel/carousel.html.twig +64 -67
  34. package/templates/bcl-contact-form/contact-form.html.twig +1 -1
  35. package/templates/bcl-content-banner/content-banner.html.twig +37 -40
  36. package/templates/bcl-date-block/date-block.html.twig +26 -29
  37. package/templates/bcl-description-list/description-list-details.html.twig +6 -9
  38. package/templates/bcl-description-list/description-list-title.html.twig +11 -14
  39. package/templates/bcl-description-list/description-list.html.twig +44 -48
  40. package/templates/bcl-dropdown/dropdown.html.twig +48 -52
  41. package/templates/bcl-event/event.html.twig +7 -7
  42. package/templates/bcl-fact-figures/fact-figures.html.twig +34 -37
  43. package/templates/bcl-featured-media/featured-media.html.twig +42 -46
  44. package/templates/bcl-file/file-translations.html.twig +29 -32
  45. package/templates/bcl-file/file.html.twig +47 -50
  46. package/templates/bcl-footer/footer.html.twig +31 -34
  47. package/templates/bcl-form/form.html.twig +70 -73
  48. package/templates/bcl-form-input/form-input.html.twig +57 -61
  49. package/templates/bcl-gallery/gallery-item.html.twig +20 -23
  50. package/templates/bcl-gallery/gallery.html.twig +62 -66
  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 -82
  56. package/templates/bcl-heading/heading.html.twig +13 -17
  57. package/templates/bcl-icon/icon.html.twig +10 -13
  58. package/templates/bcl-inpage-navigation/inpage-navigation.html.twig +20 -23
  59. package/templates/bcl-landing-page/landing-page.html.twig +33 -33
  60. package/templates/bcl-language-list/language-list-grid.html.twig +25 -28
  61. package/templates/bcl-language-list/language-list-modal.html.twig +52 -52
  62. package/templates/bcl-language-list/language-list.html.twig +33 -37
  63. package/templates/bcl-language-switcher/language-switcher.html.twig +12 -15
  64. package/templates/bcl-link/link.html.twig +24 -27
  65. package/templates/bcl-links-block/links-block.html.twig +30 -34
  66. package/templates/bcl-list-group/list-group.html.twig +43 -47
  67. package/templates/bcl-listing/listing.html.twig +88 -91
  68. package/templates/bcl-mega-menu/mega-menu-items.html.twig +18 -21
  69. package/templates/bcl-mega-menu/mega-menu-submenu.html.twig +28 -26
  70. package/templates/bcl-mega-menu/mega-menu.html.twig +37 -38
  71. package/templates/bcl-modal/modal.html.twig +21 -23
  72. package/templates/bcl-navbar/navbar.html.twig +35 -38
  73. package/templates/bcl-navigation/navigation.html.twig +105 -110
  74. package/templates/bcl-offcanvas/offcanvas.html.twig +33 -36
  75. package/templates/bcl-page/page.html.twig +27 -27
  76. package/templates/bcl-pagination/pagination-item.html.twig +22 -26
  77. package/templates/bcl-pagination/pagination.html.twig +59 -62
  78. package/templates/bcl-pagination-v2/pagination-item.html.twig +31 -35
  79. package/templates/bcl-pagination-v2/pagination.html.twig +79 -82
  80. package/templates/bcl-person/person.html.twig +12 -12
  81. package/templates/bcl-placeholder/placeholder.html.twig +14 -18
  82. package/templates/bcl-progress/progress.html.twig +16 -20
  83. package/templates/bcl-project/project-lists.html.twig +25 -29
  84. package/templates/bcl-project/project.html.twig +35 -35
  85. package/templates/bcl-project-status/project-contributions.html.twig +25 -28
  86. package/templates/bcl-project-status/project-status.html.twig +32 -37
  87. package/templates/bcl-recent-activities/recent-activities.html.twig +13 -16
  88. package/templates/bcl-search/search.html.twig +12 -12
  89. package/templates/bcl-search-form/search-form.html.twig +21 -24
  90. package/templates/bcl-select/select.html.twig +52 -56
  91. package/templates/bcl-spinner/spinner.html.twig +10 -13
  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 -17
  95. package/templates/bcl-table/table.html.twig +61 -65
  96. package/templates/bcl-textarea/textarea.html.twig +44 -47
  97. package/templates/bcl-timeline/timeline-item.html.twig +12 -15
  98. package/templates/bcl-timeline/timeline.html.twig +42 -45
  99. package/templates/bcl-toasts/toasts.html.twig +56 -60
  100. package/templates/bcl-user/user-compact.html.twig +24 -27
  101. package/templates/bcl-user/user-terms.html.twig +6 -6
  102. package/templates/bcl-user/user.html.twig +117 -117
@@ -3204,12 +3204,27 @@ document.addEventListener("DOMContentLoaded", () => {
3204
3204
  MainNavigation.init(".bcl-navbar-toggler");
3205
3205
  });
3206
3206
 
3207
+ const SUBMENU_HEIGHT_VARIABLE = "--oel-mega-menu-submenu-height";
3208
+ const SUBMENU_BODY_SELECTOR = ".__submenu_body";
3207
3209
  class MegaMenu {
3210
+ scheduleSubmenuHeightUpdate = () => {
3211
+ if (this.submenuHeightFrame) {
3212
+ return;
3213
+ }
3214
+ this.submenuHeightFrame = window.requestAnimationFrame(() => {
3215
+ this.submenuHeightFrame = null;
3216
+ this.updateSubmenuHeight();
3217
+ });
3218
+ };
3208
3219
  constructor(root) {
3209
3220
  this.root = root;
3221
+ this.submenuHeightFrame = null;
3222
+ this.submenuBodies = SelectorEngine.find(SUBMENU_BODY_SELECTOR, this.root);
3210
3223
  this.backButton = SelectorEngine.findOne(".back-button", this.root);
3211
3224
  this.trigger = SelectorEngine.findOne(':scope > .dropdown-toggle[data-bs-toggle="dropdown"]', this.root);
3212
3225
  this.ul = SelectorEngine.findOne('.bcl-mega-menu__items.__level-1', this.root);
3226
+ EventHandler.on(window, "resize", this.scheduleSubmenuHeightUpdate);
3227
+ EventHandler.on(window, "orientationchange", this.scheduleSubmenuHeightUpdate);
3213
3228
  this.addSubmenuTriggerListeners();
3214
3229
  this.addBackButtonListener();
3215
3230
  this.addTriggerListeners();
@@ -3265,6 +3280,7 @@ class MegaMenu {
3265
3280
 
3266
3281
  // When the mega menu is opened, focus the first item in the menu.
3267
3282
  EventHandler.on(this.trigger, 'shown.bs.dropdown', () => {
3283
+ this.scheduleSubmenuHeightUpdate();
3268
3284
  const panelId = this.trigger.getAttribute('aria-controls');
3269
3285
  const panel = panelId ? document.getElementById(panelId) : null;
3270
3286
  const firstFocusable = panel ? this.getFocusableChildren(panel)[0] : null;
@@ -3323,6 +3339,7 @@ class MegaMenu {
3323
3339
  trigger.setAttribute('aria-expanded', 'true');
3324
3340
  const panel = this.getPanelForTrigger(trigger);
3325
3341
  if (panel) panel.hidden = false;
3342
+ this.scheduleSubmenuHeightUpdate();
3326
3343
  }
3327
3344
 
3328
3345
  /**
@@ -3348,6 +3365,33 @@ class MegaMenu {
3348
3365
  const panel = this.getPanelForTrigger(trigger);
3349
3366
  if (panel) panel.hidden = true;
3350
3367
  }
3368
+ updateSubmenuHeight() {
3369
+ if (!this.trigger || this.trigger.getAttribute('aria-expanded') !== 'true') {
3370
+ return;
3371
+ }
3372
+ if (!this.submenuBodies || this.submenuBodies.length === 0) {
3373
+ return;
3374
+ }
3375
+ const viewportHeight = document.documentElement && document.documentElement.clientHeight || window.innerHeight || 0;
3376
+ if (!viewportHeight) {
3377
+ return;
3378
+ }
3379
+ this.submenuBodies.forEach(submenuBody => {
3380
+ if (!submenuBody.isConnected || submenuBody.closest('[hidden]')) {
3381
+ return;
3382
+ }
3383
+ const rect = submenuBody.getBoundingClientRect();
3384
+ const visibleTop = Math.max(rect.top, 0);
3385
+ // Use the distance to the viewport bottom instead of the current element
3386
+ // height. Nested submenus inherit the parent max-height, so relying on
3387
+ // rect.bottom would keep the parent's value and never recalc for children.
3388
+ const availableHeight = Math.max(0, viewportHeight - visibleTop);
3389
+ const value = `${availableHeight}px`;
3390
+ if (submenuBody.style.getPropertyValue(SUBMENU_HEIGHT_VARIABLE) !== value) {
3391
+ submenuBody.style.setProperty(SUBMENU_HEIGHT_VARIABLE, value);
3392
+ }
3393
+ });
3394
+ }
3351
3395
  static init(selector = ".bcl-mega-menu") {
3352
3396
  const megaMenus = SelectorEngine.find(selector);
3353
3397
  megaMenus.forEach(menuEl => new MegaMenu(menuEl));
@@ -5256,5 +5300,71 @@ enableDismissTrigger(Toast);
5256
5300
 
5257
5301
  defineJQueryPlugin$1(Toast);
5258
5302
 
5259
- export { AccessibleToggle, AccordionToggle, Alert, Button, Carousel, Collapse, Dropdown, Gallery, MainNavigation, MegaMenu, Modal, Offcanvas, Popover, ScrollSpy, ScrollSpy$1 as ScrollSpyV2, Tab, Toast, Tooltip };
5303
+ const HEADER_SELECTOR = ".bcl-header";
5304
+ const TOGGLER_SELECTOR = ".bcl-navbar-toggler";
5305
+ const OFFSET_VARIABLE = "--oel-mega-menu-offset-top";
5306
+ class Header {
5307
+ scheduleUpdate = () => {
5308
+ if (this.frameRequest) {
5309
+ return;
5310
+ }
5311
+ this.frameRequest = window.requestAnimationFrame(() => {
5312
+ this.frameRequest = null;
5313
+ this.updateOffset();
5314
+ });
5315
+ };
5316
+ constructor(element) {
5317
+ this.element = element;
5318
+ this.frameRequest = null;
5319
+ this.resizeObserver = null;
5320
+ this.init();
5321
+ }
5322
+ init() {
5323
+ this.updateOffset();
5324
+ EventHandler.on(window, "resize", this.scheduleUpdate);
5325
+ EventHandler.on(window, "orientationchange", this.scheduleUpdate);
5326
+ const togglers = SelectorEngine.find(TOGGLER_SELECTOR, this.element);
5327
+ togglers.forEach(toggler => {
5328
+ // Some layouts move the header when the nav toggler expands; keep offset in sync.
5329
+ EventHandler.on(toggler, "click", this.scheduleUpdate);
5330
+ });
5331
+ }
5332
+ updateOffset() {
5333
+ if (!this.element) {
5334
+ return;
5335
+ }
5336
+ const rect = this.element.getBoundingClientRect();
5337
+ const offset = Math.max(0, rect.top);
5338
+ const value = `${offset}px`;
5339
+ if (this.element.style.getPropertyValue(OFFSET_VARIABLE) === value) {
5340
+ return;
5341
+ }
5342
+ this.element.style.setProperty(OFFSET_VARIABLE, value);
5343
+ }
5344
+ static init(root) {
5345
+ if (typeof document === "undefined" || typeof window === "undefined") {
5346
+ return;
5347
+ }
5348
+ const resolvedRoot = root || document;
5349
+ const context = resolvedRoot instanceof Element ? resolvedRoot : resolvedRoot.documentElement || document.documentElement;
5350
+ const headers = SelectorEngine.find(HEADER_SELECTOR, context);
5351
+ headers.forEach(headerElement => {
5352
+ if (headerElement.dataset.headerOffsetInitialized === "true") {
5353
+ return;
5354
+ }
5355
+ headerElement.dataset.headerOffsetInitialized = "true";
5356
+ new Header(headerElement);
5357
+ });
5358
+ }
5359
+ }
5360
+ if (typeof document !== "undefined") {
5361
+ const initializeHeaderOffset = () => Header.init();
5362
+ if (document.readyState === "loading") {
5363
+ document.addEventListener("DOMContentLoaded", initializeHeaderOffset);
5364
+ } else {
5365
+ initializeHeaderOffset();
5366
+ }
5367
+ }
5368
+
5369
+ export { AccessibleToggle, AccordionToggle, Alert, Button, Carousel, Collapse, Dropdown, Gallery, Header, MainNavigation, MegaMenu, Modal, Offcanvas, Popover, ScrollSpy, ScrollSpy$1 as ScrollSpyV2, Tab, Toast, Tooltip };
5260
5370
  //# sourceMappingURL=oe-bcl-joinup.esm.js.map