<!--
  Copyright (c) 2016-2023 Martin Donath <martin.donath@squidfunk.com>

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to
  deal in the Software without restriction, including without limitation the
  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  sell copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  IN THE SOFTWARE.
-->

<!-- Determine class according to configuration -->
{% set class = "md-nav md-nav--primary" %}
{% if "navigation.tabs" in features %}
  {% set class = class ~ " md-nav--lifted" %}
{% endif %}
{% if "toc.integrate" in features %}
  {% set class = class ~ " md-nav--integrated" %}
{% endif %}

<!-- Main navigation -->
<nav
  class="{{ class }}"
  aria-label="{{ lang.t('nav') }}"
  data-md-level="0"
>

  <!-- Community site logo / home page link -->
  <label class="md-nav__title" for="__drawer">
    <a
      href="{{ config.extra.community_homepage | d(nav.homepage.url, true) | url }}"
      title="{{ config.site_name | e }}"
      class="md-nav__button md-logo"
      aria-label="{{ config.site_name }}"
      data-md-component="logo"
    >
      {% include "partials/logo.html" %}
    </a>
    <!-- Site title (nav item below links to site home) -->
    {{ config.site_name }}
  </label>

  <!-- Repository information -->
  {% if config.repo_url %}
    <div class="md-nav__source">
      {% include "partials/source.html" %}
    </div>
  {% endif %}

  <!-- Render item list -->
  <ul class="md-nav__list" data-md-scrollfix>
    {% for nav_item in nav %}
      {% set path = "__nav_" ~ loop.index %}
      {% set level = 1 %}
      {% include "partials/nav-item.html" %}
    {% endfor %}
  </ul>
</nav>
