<!--
 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.
-->

<ul class="side-nav">
    <li class="side-nav-title">Introduction</li>
    <li>
        {% if page.id == "overview" %}
        <a class="active" href="/docs.html">Overview</a>
        {% else %}
        <a href="/docs.html">Overview</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "installation" %}
        <a class="active" href="/installation.html">Installation</a>
        {% else %}
        <a href="/installation.html">Installation</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "installation" %}
        <a class="active" href="/first-example.html">First Example</a>
        {% else %}
        <a href="/first-example.html">First Example</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Built-in Components</li>
    <li>
        {% if page.id == "semantic" %}
        <a class="active" href="/semantic.html">Semantic Parser</a>
        {% else %}
        <a href="/semantic.html">Semantic Parser</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "built-in-components" %}
        <a class="active" href="/built-in-components.html">Built-in Components</a>
        {% else %}
        <a href="/built-in-components.html">Built-in Components</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Developer Guide</li>
    <li>
        {% if page.id == api-review" %}
        <a class="active" href="/api-review.html">API Review</a>
        {% else %}
        <a href="/api-review.html">API Review</a>
        {% endif %}
    </li>

    <li>
        {% if page.id == "custom-components" %}
        <a class="active" href="/custom-components.html">Custom Components</a>
        {% else %}
        <a href="/custom-components.html">Custom Components</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "intent_matching" %}
        <a class="active" href="/intent-matching.html">Intent Matching</a>
        {% else %}
        <a href="/intent-matching.html">Intent Matching</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "short_term_memory" %}
        <a class="active" href="/short-term-memory.html">Short-Term Memory</a>
        {% else %}
        <a href="/short-term-memory.html">Short-Term Memory</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Examples</li>
    <li>
        {% if page.id == "calculator" %}
        <a class="active" href="/examples/calculator.html">Calculator</a>
        {% else %}
        <a href="/examples/calculator.html">Calculator</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "time" %}
        <a class="active" href="/examples/time.html">Time</a>
        {% else %}
        <a href="/examples/time.html">Time</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch" %}
        <a class="active" href="/examples/light_switch.html">Light Switch</a>
        {% else %}
        <a href="/examples/light_switch.html">Light Switch</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch_fr" %}
        <a class="active" href="/examples/light_switch_fr.html">Light Switch FR</a>
        {% else %}
        <a href="/examples/light_switch_fr.html">Light Switch FR</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch_ru" %}
        <a class="active" href="/examples/light_switch_ru.html">Light Switch RU</a>
        {% else %}
        <a href="/examples/light_switch_ru.html">Light Switch RU</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "pizzeria" %}
        <a class="active" href="/examples/pizzeria.html">Pizzeria</a>
        {% else %}
        <a href="/examples/pizzeria.html">Pizzeria</a>
        {% endif %}
    </li>
</ul>
