navigation-menu.html.twig

Same filename in other branches
  1. 10 core/modules/navigation/templates/navigation-menu.html.twig
{% import _self as menus %}
<div class="admin-toolbar__item">
  <h4 class="visually-hidden focusable">{{ title }}</h4>
  <ul class="toolbar-block__list">
    {{ menus.menu_items(items, attributes, 0) }}
  </ul>
</div>

{% macro menu_items(items, attributes, menu_level) %}
  {% for item in items %}

    {% set item_link_tag = 'a' %}

    {% if item.url.isRouted %}
      {% if item.url.routeName == '<nolink>' %}
        {% set item_link_tag = constant('\\Drupal\\Core\\GeneratedNoLink::TAG') %}
      {% elseif item.url.routeName == '<button>' %}
        {% set item_link_tag = constant('\\Drupal\\Core\\GeneratedButton::TAG') %}
      {% endif %}
    {% endif %}

    {% if item.url.options.attributes is empty %}
      {% set item_link_attributes = create_attribute() %}
    {% else %}
      {% set item_link_attributes = create_attribute(item.url.options.attributes) %}
    {% endif %}

    {% set item_id = ('navigation-link--' ~ item.original_link.pluginId)|clean_unique_id %}
    {% if menu_level == 0 %}
      {% if item.below is empty %}
        <li id="{{ item_id }}" class="toolbar-block__list-item">
          {% include '@navigation/toolbar-button.html.twig' with {
            attributes: item_link_attributes.setAttribute('href', item.url|render|default(null)).setAttribute('data-drupal-tooltip', item.title).setAttribute('data-drupal-tooltip-class', 'admin-toolbar__tooltip'),
            icon: item.class|clean_class,
            html_tag: item_link_tag,
            text: item.title,
            extra_classes: 'toolbar-button--collapsible ' ~ (item_link_tag == 'span' ? 'toolbar-button--non-interactive'),
          } only %}
        </li>
      {% else %}
        <li id="{{ item_id }}" class="toolbar-block__list-item toolbar-popover" data-toolbar-popover>
          {% include '@navigation/toolbar-button.html.twig' with {
            action: true,
            attributes: create_attribute({'aria-expanded': 'false', 'aria-controls': item_id, 'data-toolbar-popover-control': true}),
            icon: item.class|clean_class,
            text: item.title,
            extra_classes: 'toolbar-button--expand--side toolbar-button--collapsible toolbar-popover__control',
            has_safe_triangle: TRUE,
          } only %}
          <div class="toolbar-popover__wrapper" data-toolbar-popover-wrapper inert>
            {% if item.url %}
              {{ link(item.title, item.url, item_link_attributes.addClass(['toolbar-popover__header', 'toolbar-button', 'toolbar-button--large', 'toolbar-button--dark'])) }}
            {% else %}
              <span class="toolbar-popover__header toolbar-button toolbar-button--large toolbar-button--dark toolbar-button--non-interactive">{{ item.title }}</span>
            {% endif %}
            <ul class="toolbar-menu toolbar-popover__menu">
              {{ menus.menu_items(item.below, attributes, 1) }}
            </ul>
          </div>
        </li>
      {% endif %}

    {% elseif menu_level == 1 %}
      <li class="toolbar-menu__item toolbar-menu__item--level-{{ menu_level }}">
        {% if item.below is empty  %}
          {% include '@navigation/toolbar-button.html.twig' with {
            attributes: item_link_attributes.setAttribute('href', item.url|render|default(null)),
            text: item.title,
            html_tag: item_link_tag,
            extra_classes: item_link_tag == 'span' ? 'toolbar-button--non-interactive',
          } only %}
        {% else %}
          <button
            class="toolbar-button toolbar-button--expand--down"
            data-toolbar-menu-trigger="{{ menu_level }}"
            aria-expanded="false"
            data-index-text="{{ item.title|first|lower }}"
          >
            <span class="toolbar-menu__link-action visually-hidden">{{ 'Extend'|t }}</span>
            <span class="toolbar-menu__link-title">{{ item.title }}</span>
          </button>
          <ul class="toolbar-menu toolbar-menu--level-{{ menu_level + 1 }}" inert>
            {{ menus.menu_items(item.below, attributes, menu_level + 1) }}
          </ul>
        {% endif %}
      </li>
    {% else %}
      <li class="toolbar-menu__item toolbar-menu__item--level-{{ menu_level }}">
        {% if item.below is empty  %}
          {{ link(item.title, item.url, {
            'class': [
              'toolbar-menu__link',
              'toolbar-menu__link--' ~ menu_level,
            ],
            'data-index-text': item.title|first|lower
          }) }}
        {% else %}
          <button
            class="toolbar-menu__link toolbar-menu__link--{{ menu_level }}"
            data-toolbar-menu-trigger="{{ menu_level }}"
            aria-expanded="false"
            data-index-text="{{ item.title|first|lower }}"
          >
            <span class="toolbar-menu__link-action visually-hidden">{{ 'Extend'|t }}</span>
            <span class="toolbar-menu__link-title">{{ item.title }}</span>
          </button>
          <ul class="toolbar-menu toolbar-menu--level-{{ menu_level + 1 }}" inert>
            {{ menus.menu_items(item.below, attributes, menu_level + 1) }}
          </ul>
        {% endif %}
      </li>
    {% endif %}
  {% endfor %}
{% endmacro %}
1 theme call to navigation-menu.html.twig
ShortcutLazyBuilder::lazyLinks in core/modules/navigation/src/ShortcutLazyBuilder.php
The #lazy_builder callback; builds shortcut navigation links.

File

core/modules/navigation/templates/navigation-menu.html.twig

View source
  1. {% import _self as menus %}
  2. <div class="admin-toolbar__item">
  3. <h4 class="visually-hidden focusable">{{ title }}</h4>
  4. <ul class="toolbar-block__list">
  5. {{ menus.menu_items(items, attributes, 0) }}
  6. </ul>
  7. </div>
  8. {% macro menu_items(items, attributes, menu_level) %}
  9. {% for item in items %}
  10. {% set item_link_tag = 'a' %}
  11. {% if item.url.isRouted %}
  12. {% if item.url.routeName == '<nolink>' %}
  13. {% set item_link_tag = constant('\\Drupal\\Core\\GeneratedNoLink::TAG') %}
  14. {% elseif item.url.routeName == '<button>' %}
  15. {% set item_link_tag = constant('\\Drupal\\Core\\GeneratedButton::TAG') %}
  16. {% endif %}
  17. {% endif %}
  18. {% if item.url.options.attributes is empty %}
  19. {% set item_link_attributes = create_attribute() %}
  20. {% else %}
  21. {% set item_link_attributes = create_attribute(item.url.options.attributes) %}
  22. {% endif %}
  23. {% set item_id = ('navigation-link--' ~ item.original_link.pluginId)|clean_unique_id %}
  24. {% if menu_level == 0 %}
  25. {% if item.below is empty %}
  26. <li id="{{ item_id }}" class="toolbar-block__list-item">
  27. {% include '@navigation/toolbar-button.html.twig' with {
  28. attributes: item_link_attributes.setAttribute('href', item.url|render|default(null)).setAttribute('data-drupal-tooltip', item.title).setAttribute('data-drupal-tooltip-class', 'admin-toolbar__tooltip'),
  29. icon: item.class|clean_class,
  30. html_tag: item_link_tag,
  31. text: item.title,
  32. extra_classes: 'toolbar-button--collapsible ' ~ (item_link_tag == 'span' ? 'toolbar-button--non-interactive'),
  33. } only %}
  34. </li>
  35. {% else %}
  36. <li id="{{ item_id }}" class="toolbar-block__list-item toolbar-popover" data-toolbar-popover>
  37. {% include '@navigation/toolbar-button.html.twig' with {
  38. action: true,
  39. attributes: create_attribute({'aria-expanded': 'false', 'aria-controls': item_id, 'data-toolbar-popover-control': true}),
  40. icon: item.class|clean_class,
  41. text: item.title,
  42. extra_classes: 'toolbar-button--expand--side toolbar-button--collapsible toolbar-popover__control',
  43. has_safe_triangle: TRUE,
  44. } only %}
  45. <div class="toolbar-popover__wrapper" data-toolbar-popover-wrapper inert>
  46. {% if item.url %}
  47. {{ link(item.title, item.url, item_link_attributes.addClass(['toolbar-popover__header', 'toolbar-button', 'toolbar-button--large', 'toolbar-button--dark'])) }}
  48. {% else %}
  49. <span class="toolbar-popover__header toolbar-button toolbar-button--large toolbar-button--dark toolbar-button--non-interactive">{{ item.title }}</span>
  50. {% endif %}
  51. <ul class="toolbar-menu toolbar-popover__menu">
  52. {{ menus.menu_items(item.below, attributes, 1) }}
  53. </ul>
  54. </div>
  55. </li>
  56. {% endif %}
  57. {% elseif menu_level == 1 %}
  58. <li class="toolbar-menu__item toolbar-menu__item--level-{{ menu_level }}">
  59. {% if item.below is empty %}
  60. {% include '@navigation/toolbar-button.html.twig' with {
  61. attributes: item_link_attributes.setAttribute('href', item.url|render|default(null)),
  62. text: item.title,
  63. html_tag: item_link_tag,
  64. extra_classes: item_link_tag == 'span' ? 'toolbar-button--non-interactive',
  65. } only %}
  66. {% else %}
  67. <button
  68. class="toolbar-button toolbar-button--expand--down"
  69. data-toolbar-menu-trigger="{{ menu_level }}"
  70. aria-expanded="false"
  71. data-index-text="{{ item.title|first|lower }}"
  72. >
  73. <span class="toolbar-menu__link-action visually-hidden">{{ 'Extend'|t }}</span>
  74. <span class="toolbar-menu__link-title">{{ item.title }}</span>
  75. </button>
  76. <ul class="toolbar-menu toolbar-menu--level-{{ menu_level + 1 }}" inert>
  77. {{ menus.menu_items(item.below, attributes, menu_level + 1) }}
  78. </ul>
  79. {% endif %}
  80. </li>
  81. {% else %}
  82. <li class="toolbar-menu__item toolbar-menu__item--level-{{ menu_level }}">
  83. {% if item.below is empty %}
  84. {{ link(item.title, item.url, {
  85. 'class': [
  86. 'toolbar-menu__link',
  87. 'toolbar-menu__link--' ~ menu_level,
  88. ],
  89. 'data-index-text': item.title|first|lower
  90. }) }}
  91. {% else %}
  92. <button
  93. class="toolbar-menu__link toolbar-menu__link--{{ menu_level }}"
  94. data-toolbar-menu-trigger="{{ menu_level }}"
  95. aria-expanded="false"
  96. data-index-text="{{ item.title|first|lower }}"
  97. >
  98. <span class="toolbar-menu__link-action visually-hidden">{{ 'Extend'|t }}</span>
  99. <span class="toolbar-menu__link-title">{{ item.title }}</span>
  100. </button>
  101. <ul class="toolbar-menu toolbar-menu--level-{{ menu_level + 1 }}" inert>
  102. {{ menus.menu_items(item.below, attributes, menu_level + 1) }}
  103. </ul>
  104. {% endif %}
  105. </li>
  106. {% endif %}
  107. {% endfor %}
  108. {% endmacro %}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.