{#-
       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.
-#}
{% set hide_left_bar = True %}
{% extends g.theme.master %}
{% from 'allura:templates/jinja_master/lib.html' import canonical_tag %}
{%- block head -%}
    <meta name="robots" content="noindex, follow">
    {{ canonical_tag() }}
{%- endblock -%}

{% block title %}{{c.project.name}} / {{type}} tools{% endblock %}

{% block extra_css %}
{% endblock %}

{% block inner_grid %}{% endblock %}
{% block header_classes %} colored title{% endblock %}
{% block header %}{{type}} tools{% endblock %}

{% block content %}
{{c.page_list.display(page=page, limit=limit, count=total_entries)}}
<div>
  <div class="list">
  {% for e in entries %}
    <div class="list card" style="width:97%; height: 30px;"><h2><a href="{{e.url}}">{{e.label}}</a></h2></div>
  {% endfor %}
  </div>
</div>
{{c.page_list.display(page=page, limit=limit, count=total_entries)}}
{% endblock %}
