<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

<nav class="navbar navbar-toggleable-md navbar-light sticky-top">
  <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  {% if page.url != "/" %}
  <a class="navbar-brand" href="/">
    <img class="main-logo" src="/img/pulsar-logo.png" alt="Pulsar logo">
  </a>
  {% endif %}

  <a class="navbar-nav"></a>

  <div class="collapse navbar-collapse justify-content-end" id="navbarNavDropdown">
    <ul class="navbar-nav">
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="clientLibsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Documentation</a>

        <div class="dropdown-menu" aria-labelledby="documentationDropdown">
          <a class="dropdown-item" href="/docs/latest/getting-started/LocalCluster">Latest</a>

          <div class="dropdown-divider"></div>
          <h3 class="dropdown-header">Stable release</h3>
          <a class="dropdown-item" href="/docs/v{{site.current_version}}/getting-started/LocalCluster">{{site.current_version}}</a>

          {% if site.archived_releases %}
              <div class="dropdown-divider"></div>
              <h3 class="dropdown-header">Other releases</h3>

              {% for version in site.archived_releases %}
                  <a class="dropdown-item" href="/docs/v{{version}}/getting-started/LocalCluster">{{version}}</a>
              {% endfor %}
          {% endif %}
        </div>
      </li>

      <li class="nav-item">
          <a class="nav-link" href="/download">Download</a>
      </li>

      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="clientLibsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Client libraries
        </a>
        <div class="dropdown-menu" aria-labelledby="clientLibsDropdown">
          <a class="dropdown-item" href="/docs/latest/clients/Java">
            Java
          </a>
          <a class="dropdown-item" href="/docs/latest/clients/Python">
            Python
          </a>
          <a class="dropdown-item" href="/docs/latest/clients/Cpp">
            C++
          </a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="/api/client">
            Java client Javadoc
          </a>
          <a class="dropdown-item" href="/api/admin">
            Java admin Javadoc
          </a>
          <a class="dropdown-item" href="/api/python">
            Python API docs
          </a>
          <a class="dropdown-item" href="/api/cpp">
            C++ API docs
          </a>
        </div>
      </li>

      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="versionsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Community
        </a>
        <div class="dropdown-menu dropdown-left" aria-labelledby="versionsDropdown">
          <h3 class="dropdown-header">Get in touch</h3>
          <a class="dropdown-item" href="{{ site.baseurl }}contact">Contact</a>
          <a class="dropdown-item" href="https://twitter.com/Apache_Pulsar">Twitter</a>
          <a class="dropdown-item" href="https://github.com/apache/incubator-pulsar/wiki">Wiki</a>
          <a class="dropdown-item" href="https://github.com/apache/incubator-pulsar/issues">Issue tracking</a>
          <div class="dropdown-divider"></div>
          <h3 class="dropdown-header">Resources</h3>
          <a class="dropdown-item" href="{{ site.baseurl }}presentations">Presentations</a>
          <a class="dropdown-item" href="{{ site.baseurl }}team">Team</a>
          <div class="dropdown-divider"></div>
          <h3 class="dropdown-header">Apache</h3>
          <a class="dropdown-item" href="http://www.apache.org/">The Apache Software Foundation</a>
          <a class="dropdown-item" href="http://www.apache.org/licenses/">License</a>
          <a class="dropdown-item" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
          <a class="dropdown-item" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
          <a class="dropdown-item" href="http://www.apache.org/security">Security</a>
        </div>
      </li>
    </ul>
  </div>
  <a class="hidden-md-down" href="http://www.apache.org/">
    <img class="asf-logo" title="Apache Software Foundation" src="/img/feather.png" />
  </a>
</nav>

<!--
<nav class="navbar navbar-toggleable-md navbar-light" style="border: 1px solid red;">
  <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <a class="navbar-brand" href="/">
    <img src="/img/pulsar-logo.png" class="d-inline-block align-top" alt="Pulsar logo" height="40" width="60">
  </a>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#">Disabled</a>
      </li>
    </ul>
  </div>
</nav>-->