99 </div >
1010 <ul class =" fr-sidemenu__list" >
1111 {% for link in navLinks %}
12- {% set linkUrl = link .url | locale_url (lang ) %}
13- {% set level2Id = ' sidemenu-2-' ~ loop .index0 %}
14- <li class =" fr-sidemenu__item" >
15- {% if not link .children | length %}
16- <a class =" fr-sidemenu__link" href ={{ linkUrl }} {% if linkUrl == page.url %} aria-current =" page" {% endif %} >
12+ {% if not link .sidemenuActive %}
13+ {% set parentIdx = loop .index0 %}
14+ {% set level2Id = ' sidemenu-2-' ~ parentIdx %}
15+ <li class =" fr-sidemenu__item" >
16+ {% if not link .children | length %}
17+ <a class =" fr-sidemenu__link" href ={{ link.url | locale_url(lang) }} {% if link.url == page.url %} aria-current =" page" {% endif %} >
1718 {{ link .title }}
1819 </a >
19- {% else %}
20- <button class =" fr-sidemenu__btn" aria-expanded =" false" aria-controls ={{ level2Id }} data-url ={{ linkUrl }} >
20+ {% else %}
21+ <button class =" fr-sidemenu__btn" aria-expanded =" false" aria-controls =" {{ level2Id }}" data-url =" {{ link.url | locale_url(lang) }} " >
2122 {{ link .title }}
2223 </button >
2324 <div class =" fr-collapse" id =" {{ level2Id }}" >
2425 <ul class =" fr-sidemenu__list" >
25- {% for sublink in link .children %}
26- {% set sublinkUrl = sublink .url | locale_url (lang ) or sublink .externalUrl %}
27- {% set level3Id = ' sidemenu-3-' ~ loop .parent .loop .index0 ~ ' -' ~ loop .index0 %}
28- <li class =" fr-sidemenu__item" >
29- {% if not sublink .children | length %}
26+ {% for sublink in link .children %}
27+ {% set level3Id = ' sidemenu-3-' ~ parentIdx ~ ' -' ~ loop .index0 %}
28+ <li class =" fr-sidemenu__item" >
29+ {% if not sublink .children | length %}
30+ <a class =" fr-sidemenu__link"
31+ href =" {{ sublink.url | locale_url(lang) or sublink.externalUrl }}"
32+ {% if sublink.externalUrl %} target =" _blank" rel =" noopener" {% endif %}
33+ {% if sublink.url == page.url %} aria-current =" page" {% endif %} >
34+ {{ sublink .title }}
35+ </a >
36+ {% else %}
37+ <button class =" fr-sidemenu__btn" aria-expanded =" false" aria-controls =" {{ level3Id }}" data-url =" {{ sublink.url | locale_url(lang) or sublink.externalUrl }}" >
38+ {{ sublink .title }}
39+ </button >
40+ <div class =" fr-collapse" id =" {{ level3Id }}" >
41+ <ul class =" fr-sidemenu__list" >
42+ {% for subsublink in sublink .children %}
43+ <li class =" fr-sidemenu__item" >
3044 <a class =" fr-sidemenu__link"
31- href =" {{ sublinkUrl }}"
32- {% if sublink .externalUrl %} target =" _blank" rel =" noopener" {% endif %}
33- {% if sublinkUrl == page.url %} aria-current =" page" {% endif %} >
34- {{ sublink .title }}
45+ href =" {{ subsublink.url | locale_url(lang) or subsublink.externalUrl }}"
46+ {% if subsublink .externalUrl %} target =" _blank" rel =" noopener" {% endif %}
47+ {% if subsublink.url == page.url %} aria-current =" page" {% endif %} >
48+ {{ subsublink .title }}
3549 </a >
36- {% else %}
37- <button class =" fr-sidemenu__btn" aria-expanded =" false" aria-controls ={{ level3Id }} data-url ={{ sublinkUrl }} >
38- {{ sublink .title }}
39- </button >
40- <div class =" fr-collapse" id ={{ level3Id }} >
41- <ul class =" fr-sidemenu__list" >
42- {% for subsublink in sublink .children %}
43- {% set subsublinkUrl = subsublink .url | locale_url (lang ) or subsublink .externalUrl %}
44- <li class =" fr-sidemenu__item" >
45- <a class =" fr-sidemenu__link"
46- href =" {{ subsublinkUrl }}"
47- {% if subsublink.externalUrl %} target =" _blank" rel =" noopener" {% endif %}
48- {% if subsublinkUrl == page.url %} aria-current =" page" {% endif %} >
49- {{ subsublink .title }}
50- </a >
51- </li >
52- {% endfor %}
53- </ul >
54- </div >
55- {% endif %}
56- </li >
57- {% endfor %}
50+ </li >
51+ {% endfor %}
52+ </ul >
53+ </div >
54+ {% endif %}
55+ </li >
56+ {% endfor %}
5857 </ul >
5958 </div >
60- {% endif %}
61- </li >
59+ {% endif %}
60+ </li >
61+ {% endif %}
6262 {% endfor %}
6363 </ul >
6464 </div >
6767
6868<script >
6969 (() => {
70- const currentPath = window .location .pathname ;
70+ const normalize = (p ) => {
71+ if (! p) return " " ;
72+ p = String (p).trim ();
73+ try { p = new URL (p, location .origin ).pathname ; } catch (e) {}
74+
75+ if (p .length > 1 && p .endsWith (" /" )) p = p .slice (0 , - 1 );
76+ if (p && ! p .startsWith (" /" )) p = " /" + p;
77+ return p;
78+ };
79+
80+ const hrefPath = (el ) => normalize (el .getAttribute (" href" ) || el .href || " " );
81+
82+ const currentPath = normalize (location .pathname );
83+ const sidemenuActive = normalize (" {{ eleventyNavigation.sidemenuActive or '' }}" );
84+
85+ const links = [... document .querySelectorAll (" .fr-sidemenu__link" )];
86+ const buttons = [... document .querySelectorAll (" .fr-sidemenu__btn[data-url]" )];
87+
88+ const activeParentBtn = buttons .find (btn =>
89+ normalize (btn .dataset .url ) === currentPath
90+ );
91+
92+ let activeLink = null ;
93+
94+ if (sidemenuActive) {
95+ activeLink = links .find (a => hrefPath (a) === sidemenuActive);
96+ }
97+
98+ if (! activeLink) {
99+ activeLink = links .find (a => hrefPath (a) === currentPath);
100+ }
101+
102+ if (activeParentBtn) {
103+ activeLink = null ;
104+ }
71105
72106 function expandParents (element ) {
73107 let parent = element .closest (" .fr-collapse" );
74108 while (parent) {
75- if (parent .id === " fr-sidemenu-wrapper" ) {
76- break ;
77- }
78- const toggleButton = parent .previousElementSibling ;
79- if (toggleButton? .classList .contains (" fr-sidemenu__btn" )) {
80- toggleButton .setAttribute (" aria-expanded" , " true" );
109+ if (parent .id === " fr-sidemenu-wrapper" ) break ;
110+
111+ const toggle = parent .previousElementSibling ;
112+ if (toggle? .classList .contains (" fr-sidemenu__btn" )) {
113+ toggle .setAttribute (" aria-expanded" , " true" );
81114 parent .classList .add (" fr-collapse--expanded" );
82115 }
83116 parent = parent .parentElement .closest (" .fr-collapse" );
84117 }
85118 }
86119
87- const activeLink = [ ... document .querySelectorAll (' .fr-sidemenu__link' )]
88- .find ( link => currentPath . endsWith ( link . getAttribute ( " href " ) ));
120+ document .querySelectorAll (" .fr-sidemenu__link[aria-current] " )
121+ .forEach ( l => l . removeAttribute ( " aria-current " ));
89122
90123 if (activeLink) {
91124 activeLink .setAttribute (" aria-current" , " page" );
92125 expandParents (activeLink);
93126 }
94127
95- const activeBtn = [ ... document . querySelectorAll ( ' .fr-sidemenu__btn ' )]
96- . find ( btn => currentPath . endsWith ( btn . dataset . url ) );
128+ else if (activeParentBtn) {
129+ activeParentBtn . setAttribute ( " aria-expanded " , " true " );
97130
98- if (activeBtn) {
99- activeBtn .setAttribute (" aria-expanded" , " true" );
100- const panel = activeBtn .nextElementSibling ;
131+ const panel = activeParentBtn .nextElementSibling ;
101132 if (panel? .classList .contains (" fr-collapse" )) {
102133 panel .classList .add (" fr-collapse--expanded" );
103134 }
104- expandParents (activeBtn);
135+
136+ activeParentBtn .classList .add (" fr-sidemenu__btn--current" );
137+
138+ expandParents (activeParentBtn);
105139 }
106140
107- document
108- .querySelectorAll (" .fr-sidemenu__link" )
109- .forEach (link => link .addEventListener (" click" , (e ) => {
141+ links .forEach ((link ) => {
142+ link .addEventListener (" click" , (e ) => {
110143 document
111- .querySelectorAll (" .fr-sidemenu__link" )
112- .forEach (l => l .removeAttribute (" aria-current" ));
144+ .querySelectorAll (" .fr-sidemenu__link[aria-current]" )
145+ .forEach ((l ) => l .removeAttribute (" aria-current" ));
146+
113147 e .currentTarget .setAttribute (" aria-current" , " page" );
114- }));
148+ });
149+ });
150+
115151 })();
116152< / script>
0 commit comments