|
1 |
| -{# When we are rendering the top nav bar (wide screens) we use bootstrap dropdowns, #} |
2 |
| -{# when we render the sidebar (narrow screens) use collapse instead. #} |
3 |
| -{# TODO: If you have a section uncollapsed and then expand the width of your screen, weird shit happens #} |
4 |
| -{% if in_header %} |
5 |
| -{% set toggle="dropdown" %} |
6 |
| -{% set list_class="dropdown-menu" %} |
7 |
| -{% else %} |
8 |
| -{% set toggle="collapse" %} |
9 |
| -{% set list_class="collapse" %} |
10 |
| -{% endif %} |
| 1 | +{% macro render_nav_item(item, depth=0) %} |
| 2 | + {# Determine item type and a unique, context-prefixed submenu ID #} |
| 3 | + {% set is_leaf = item[1] is string %} |
| 4 | + {% set is_nested = item[1] is iterable and (item[1]|length > 0) and (item[1][0] is sequence or item[1][0] is mapping) %} |
| 5 | + {% set context_prefix = 'header' if in_header else 'sidebar' %} |
| 6 | + {% set base_id = item[0]|replace(" ", "_")|lower %} |
| 7 | + {% set submenu_id = context_prefix ~ '_' ~ base_id ~ '_' ~ depth %} |
| 8 | + |
| 9 | + {# ----------------------------- LEAF LINK ----------------------------- #} |
| 10 | + {% if is_leaf %} |
| 11 | + <li class="nav-item{% if depth > 0 %} dropdown-submenu{% endif %} {% if depth == 0 %}ms-2{% endif %}"> |
| 12 | + <a class="{% if depth == 0 %}nav-link{% else %}dropdown-item{% endif %}{% if depth > 1 %} concertina-subitem{% endif %}" href="{{ sst_pathto(*item[1:]) }}"> |
| 13 | + {{ item[0] }} |
| 14 | + </a> |
| 15 | + </li> |
| 16 | + |
| 17 | + {# ----------------------------- TOP LEVEL DROPDOWN ----------------------------- #} |
| 18 | + {% elif depth == 0 and is_nested %} |
| 19 | + <li class="nav-item dropdown ms-2"> |
| 20 | + {% if in_header %} |
| 21 | + <a href="#" class="dropdown-toggle nav-link" id="dropdownMenu_{{ submenu_id }}" |
| 22 | + data-bs-toggle="dropdown" role="button" aria-expanded="false"> |
| 23 | + {{ item[0] }} |
| 24 | + </a> |
| 25 | + <ul class="dropdown-menu" aria-labelledby="dropdownMenu_{{ submenu_id }}"> |
| 26 | + {% else %} |
| 27 | + <a href="#" class="nav-link d-flex justify-content-between align-items-center" |
| 28 | + data-bs-toggle="collapse" data-bs-target="#collapse_{{ submenu_id }}" |
| 29 | + role="button" aria-expanded="false" aria-controls="collapse_{{ submenu_id }}"> |
| 30 | + {{ item[0] }} |
| 31 | + <span class="caret" aria-hidden="true">▾</span> |
| 32 | + </a> |
| 33 | + <ul class="collapse" id="collapse_{{ submenu_id }}"> |
| 34 | + {% endif %} |
| 35 | + {% for subitem in item[1] %} |
| 36 | + {{ render_nav_item(subitem, depth + 1) }} |
| 37 | + {% endfor %} |
| 38 | + </ul> |
| 39 | + </li> |
| 40 | + |
| 41 | + {# ----------------------------- NESTED CONCERTINA ----------------------------- #} |
| 42 | + {% elif depth > 0 and is_nested %} |
| 43 | + <li> |
| 44 | + <button class="dropdown-item concertina-toggle d-flex align-items-center px-0 position-relative" |
| 45 | + aria-expanded="false" |
| 46 | + aria-controls="submenu_{{ submenu_id }}"> |
| 47 | + <span class="concertina-label ps-4">{{ item[0] }}</span> |
| 48 | + <span class="concertina-icon position-absolute start-0" aria-hidden="true">▸</span> |
| 49 | + </button> |
| 50 | + <ul id="submenu_{{ submenu_id }}" class="concertina-submenu collapse"> |
| 51 | + {% for subitem in item[1] %} |
| 52 | + {{ render_nav_item(subitem, depth + 1) }} |
| 53 | + {% endfor %} |
| 54 | + </ul> |
| 55 | + </li> |
| 56 | + {% endif %} |
| 57 | +{% endmacro %} |
11 | 58 |
|
12 | 59 | <nav class="navbar-nav">
|
13 | 60 | <ul class="bd-navbar-elements navbar-nav">
|
14 | 61 | {% if theme_navbar_links %}
|
15 |
| - {%- for navlink in theme_navbar_links %} |
16 |
| - {% if navlink[1] is not string %} |
17 |
| - <li class="nav-item dropdown ms-2 has-children"> |
18 |
| - <a class="nav-link dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-bs-toggle="{{ toggle }}" data-bs-target="#{{ navlink[0] }}" aria-haspopup="true" aria-expanded="false">{{ navlink[0] }}<b class="caret"></b></a> |
19 |
| - <ul class="{{ list_class }}" id="{{ navlink[0] }}" aria-labelledby="dropdownMenuLink"> |
20 |
| - {%- for link in navlink[1] %} |
21 |
| - <li class="nav-item"> |
22 |
| - <a class="nav-link" href="{{ sst_pathto(*link[1:]) }}">{{ link[0] }}</a> |
23 |
| - </li> |
24 |
| - {%- endfor %} |
25 |
| - </ul> |
26 |
| - </li> |
27 |
| - {% else %} |
28 |
| - <li class="nav-item ms-2"><a class="nav-link" role="button" href="{{ sst_pathto(*navlink[1:]) }}">{{ navlink[0] }}</a></li> |
29 |
| - {% endif %} |
30 |
| - {%- endfor %} |
| 62 | + {% for navlink in theme_navbar_links %} |
| 63 | + {{ render_nav_item(navlink) }} |
| 64 | + {% endfor %} |
31 | 65 | {% endif %}
|
| 66 | + |
32 | 67 | {% if theme_external_links %}
|
33 |
| - {%- for external_link in theme_external_links %} |
34 |
| - <li class="nav-item ms-2"><a class="nav-link nav-external" role="button" href="{{ external_link['url'] }}">{{ external_link['name'] }}</a></li> |
35 |
| - {%- endfor %} |
| 68 | + {% for ext in theme_external_links %} |
| 69 | + <li class="nav-item ms-2"> |
| 70 | + <a class="nav-link nav-external" href="{{ ext['url'] }}">{{ ext['name'] }}</a> |
| 71 | + </li> |
| 72 | + {% endfor %} |
36 | 73 | {% endif %}
|
37 | 74 | </ul>
|
38 | 75 | </nav>
|
0 commit comments