[#8093] theme layout using foundation
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 9955e21..921d989 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -1399,8 +1399,13 @@
class ResponsiveTheme(ThemeProvider):
+ master_template = 'allura:templates_responsive/jinja_master/master.html'
+ jinja_macros = 'allura:templates_responsive/jinja_master/theme_macros.html'
+ nav_menu = 'allura:templates_responsive/jinja_master/nav_menu.html'
+ top_nav = 'allura:templates_responsive/jinja_master/top_nav.html'
+ sidebar_menu = 'allura:templates_responsive/jinja_master/sidebar_menu.html'
+
def require(self):
- g.register_theme_css('../allura/css/site_style.css', compress=False) # temporarily include original theme too
g.register_theme_css('css/styles.css', compress=False)
diff --git a/Allura/allura/nf/responsive/scss/_chrome.scss b/Allura/allura/nf/responsive/scss/_chrome.scss
new file mode 100644
index 0000000..8171a5d
--- /dev/null
+++ b/Allura/allura/nf/responsive/scss/_chrome.scss
@@ -0,0 +1,67 @@
+/*
+ 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.
+*/
+
+/**
+ Styles for the overall page layout, header, footer, etc.
+
+ Custom themes most likely would not want these rules.
+ */
+
+.project-icon {
+ margin-right: $global-margin;
+}
+
+.title h1 {
+ margin-bottom: 0;
+}
+
+#top_nav_admin > ul > li.selected {
+ background: $light-gray;
+}
+
+#content_base {
+ border: 1px solid $light-gray;
+}
+
+.column#sidebar {
+ border-right: 1px solid $light-gray;
+}
+
+#messages {
+ position: fixed;
+ z-index: 100000;
+ top: 45px;
+ right: 20px;
+ .message {
+ @include callout();
+ min-width: rem-calc(400);
+ &.info {
+ @include callout-style(get-color(primary));
+ }
+ &.confirm {
+ @include callout-style(get-color(success));
+ }
+ &.warning {
+ @include callout-style(get-color(warning));
+ }
+ &.error {
+ @include callout-style(get-color(alert));
+ }
+ }
+}
diff --git a/Allura/allura/nf/responsive/scss/_settings.scss b/Allura/allura/nf/responsive/scss/_settings.scss
index 59a7e4a..7ec77cd 100644
--- a/Allura/allura/nf/responsive/scss/_settings.scss
+++ b/Allura/allura/nf/responsive/scss/_settings.scss
@@ -62,6 +62,13 @@
@import 'util/util';
+
+// Allura specific settings
+
+$sidebar-width: 240px;
+
+
+
// 1. Global
// ---------
@@ -856,7 +863,7 @@
// 56. Xy Grid
// -----------
-$xy-grid: true;
+$xy-grid: false;
$grid-container: $global-width;
$grid-columns: 12;
$grid-margin-gutters: (
@@ -867,3 +874,4 @@
$grid-container-padding: $grid-padding-gutters;
$grid-container-max: $global-width;
$xy-block-grid-max: 8;
+
diff --git a/Allura/allura/nf/responsive/scss/_sidebar.scss b/Allura/allura/nf/responsive/scss/_sidebar.scss
new file mode 100644
index 0000000..fae40f0
--- /dev/null
+++ b/Allura/allura/nf/responsive/scss/_sidebar.scss
@@ -0,0 +1,27 @@
+/*
+ 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.
+*/
+
+/**
+ Non-thematic sidebar rules
+ */
+
+.column#sidebar {
+ flex: 0 0 $sidebar-width;
+ max-width: $sidebar-width;
+}
\ No newline at end of file
diff --git a/Allura/allura/nf/responsive/scss/styles.scss b/Allura/allura/nf/responsive/scss/styles.scss
index 8e203ed..02b768a 100644
--- a/Allura/allura/nf/responsive/scss/styles.scss
+++ b/Allura/allura/nf/responsive/scss/styles.scss
@@ -77,3 +77,8 @@
// @include motion-ui-transitions;
// @include motion-ui-animations;
+
+
+
+@import '_chrome';
+@import '_sidebar';
diff --git a/Allura/allura/templates/award.html b/Allura/allura/templates/award.html
index 329b8b2..a0cc736 100644
--- a/Allura/allura/templates/award.html
+++ b/Allura/allura/templates/award.html
@@ -22,14 +22,6 @@
{% block header %}Award{% endblock %}
-{% block nav_menu %}
-{% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
-{% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
<form action="{{award.longurl()}}/update" method="post" enctype="multipart/form-data">
<table>
diff --git a/Allura/allura/templates/jinja_master/master.html b/Allura/allura/templates/jinja_master/master.html
index f4b19ac..3892f64 100644
--- a/Allura/allura/templates/jinja_master/master.html
+++ b/Allura/allura/templates/jinja_master/master.html
@@ -93,7 +93,7 @@
{% set flash = tg.flash_obj.render('flash', use_js=False) %}
-{% call theme_macros.all_content_wrapper() %}
+{% call theme_macros.all_content_wrapper(login_url, logout_url) %}
{{ theme_macros.header(g.login_url, '/auth/logout') }}
{{ theme_macros.site_notification() }}
{% block masthead %}{% endblock %}
diff --git a/Allura/allura/templates/jinja_master/theme_macros.html b/Allura/allura/templates/jinja_master/theme_macros.html
index f403243..47b632d 100644
--- a/Allura/allura/templates/jinja_master/theme_macros.html
+++ b/Allura/allura/templates/jinja_master/theme_macros.html
@@ -56,7 +56,7 @@
{% if not all_content_wrapper %}
-{% macro all_content_wrapper() -%}
+{% macro all_content_wrapper(login_url, logout_url) -%}
{{- caller(**kwargs) -}}
{%- endmacro %}
{% endif %}
diff --git a/Allura/allura/templates/neighborhood_admin_accolades.html b/Allura/allura/templates/neighborhood_admin_accolades.html
index ca9bb86..5e28591 100644
--- a/Allura/allura/templates/neighborhood_admin_accolades.html
+++ b/Allura/allura/templates/neighborhood_admin_accolades.html
@@ -22,14 +22,6 @@
{% block header %}Award Administration for {{neighborhood.name}}{% endblock %}
-{% block nav_menu %}
-{% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
-{% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
{% if awards_count > 0 %}
<p>
diff --git a/Allura/allura/templates/neighborhood_admin_overview.html b/Allura/allura/templates/neighborhood_admin_overview.html
index da2be53..3ae9f42 100644
--- a/Allura/allura/templates/neighborhood_admin_overview.html
+++ b/Allura/allura/templates/neighborhood_admin_overview.html
@@ -22,14 +22,6 @@
{% block header %}Administration Overview for {{neighborhood.name}}{% endblock %}
-{% block nav_menu %}
-{% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
-{% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
{{c.overview_form.display(value=neighborhood, neighborhood=neighborhood, allow_wiki_as_root=allow_wiki_as_root)}}
{% endblock %}
diff --git a/Allura/allura/templates/neighborhood_help.html b/Allura/allura/templates/neighborhood_help.html
index 18f2568..7a2cd83 100644
--- a/Allura/allura/templates/neighborhood_help.html
+++ b/Allura/allura/templates/neighborhood_help.html
@@ -22,14 +22,6 @@
{% block header %}Neighborhood Help{% endblock %}
-{% block nav_menu %}
- {% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
- {% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
<p>Welcome to your neighborhood! We strive to make many neighborhood features easy to understand on their own,
but there's always room for some additional explanation. Here's information on a few advanced features.</p>
diff --git a/Allura/allura/templates/neighborhood_moderate.html b/Allura/allura/templates/neighborhood_moderate.html
index c164140..22fe175 100644
--- a/Allura/allura/templates/neighborhood_moderate.html
+++ b/Allura/allura/templates/neighborhood_moderate.html
@@ -23,14 +23,6 @@
{% block header %}{{neighborhood.name}} Moderation{% endblock %}
-{% block nav_menu %}
-{% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
-{% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
<h2>Invite Projects?</h2>
<form method="POST" action="invite" class="grid-10">
diff --git a/Allura/allura/templates/neighborhood_project_list.html b/Allura/allura/templates/neighborhood_project_list.html
index ea4d3c5..91fecd3 100644
--- a/Allura/allura/templates/neighborhood_project_list.html
+++ b/Allura/allura/templates/neighborhood_project_list.html
@@ -37,14 +37,6 @@
{% endif %}
{% endblock %}
-{% block nav_menu %}
-{% include 'allura:templates/jinja_master/neigh_nav_menu.html' %}
-{% endblock %}
-
-{% block top_nav %}
-{% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block inner_grid %}{% endblock %}
{% block header_classes %} colored{% endblock %}
diff --git a/Allura/allura/templates/neighborhood_stats.html b/Allura/allura/templates/neighborhood_stats.html
index 3b0b0ee..0ef680d 100644
--- a/Allura/allura/templates/neighborhood_stats.html
+++ b/Allura/allura/templates/neighborhood_stats.html
@@ -18,10 +18,6 @@
-#}
{% extends g.theme.master %}
-{% block top_nav %}
- {% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block title %}Neighborhood Statistics{% endblock %}
{% block header %}Neighborhood Statistics{% endblock %}
diff --git a/Allura/allura/templates/neighborhood_stats_adminlist.html b/Allura/allura/templates/neighborhood_stats_adminlist.html
index 4deafe1..c0ffce7 100644
--- a/Allura/allura/templates/neighborhood_stats_adminlist.html
+++ b/Allura/allura/templates/neighborhood_stats_adminlist.html
@@ -22,10 +22,6 @@
{% block header %}Admins list{% endblock %}
-{% block top_nav %}
- {% include 'allura:templates/jinja_master/top_nav.html' %}
-{% endblock %}
-
{% block content %}
<table>
<thead>
diff --git a/Allura/allura/templates_responsive/jinja_master/master.html b/Allura/allura/templates_responsive/jinja_master/master.html
new file mode 100644
index 0000000..ecb1290
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/master.html
@@ -0,0 +1,167 @@
+{#-
+ 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.
+-#}
+<!DOCTYPE html>
+<!-- Server: {{g.server_name}} -->
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+{% if g.theme.jinja_macros %}
+ {% import g.theme.jinja_macros as theme_macros with context %}
+{% endif %}
+{% do g.register_forge_js('js/jquery-base.js', location='head_js') %}{# TODO: upgrade #}
+{% do g.register_forge_js('js/foundation.min.js', location='head_js', compress=False) %}
+{% do g.register_forge_js('js/jquery.notify.js') %}
+{% do g.register_forge_js('js/jquery.tooltipster.js') %}{# TODO: use foundation #}
+{% do g.register_forge_js('js/sylvester.js') %}
+{% do g.register_forge_js('js/twemoji.min.js') %}
+{% do g.register_forge_js('js/allura-base.js') %}
+{% do g.register_forge_js('js/checklist.js') %}
+{% do g.register_forge_css('css/forge/hilite.css') %}
+{% do g.register_forge_css('css/forge/tooltipster.css') %}{# TODO: use foundation #}
+{% do g.register_forge_css('css/font-awesome.min.css', compress=False) %}
+{% do g.theme.require() %}
+{% do g.register_forge_js('js/admin_modal.js') %}
+{% do g.register_js('js/jquery.lightbox_me.js') %}
+{% if h.has_access(c.project, 'admin')() %}
+ {# this would be better placed in top_nav.html but that file is included later so its too late for it to register
+ any css. (Unlike other html files which are the top-level file and extend this master.html) #}
+ {% do g.register_forge_css('css/navbar.css') %}
+{% endif %}
+{% do g.register_forge_js('js/memorable.js') %}
+{% do g.resource_manager.register_widgets(c) %}
+
+<html lang="en" class="no-js">
+<head>
+ <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
+ <title>{% block title %}Your title goes here{% endblock %}</title>
+ {{ theme_macros.extra_header(g.theme_href('')) }}
+ {% for blob in g.resource_manager.emit('head_css') %}
+ {{ blob }}
+ {% endfor %}
+ {% for blob in g.resource_manager.emit('head_js') %}
+ {{ blob }}
+ {% endfor %}
+
+ {% if c.project and c.project.neighborhood.css %}
+ <style type="text/css">
+ {{c.project.neighborhood.get_custom_css()|safe}}
+ </style>
+ {% elif neighborhood and neighborhood.css %}
+ <style type="text/css">
+ {{neighborhood.get_custom_css()}}
+ </style>
+ {% endif %}
+ {% block extra_css %}{% endblock %}
+ <style>.{{ g.antispam.honey_class }} {
+ display: none
+ }</style>
+
+ {% block head %}
+ {% endblock %}
+ {% if g.production_mode %}{{ g.analytics.display() }}{% endif %}
+ {% block head_bottom -%}
+ {% endblock %}
+</head>
+
+<body{% block body_attrs %}{% endblock %} class="{% block body_css_class %}{% endblock %}" id="forge">
+{% block body_top_js %}
+ {% for blob in g.resource_manager.emit('body_top_js') %}
+ {{ blob }}
+ {% endfor %}
+{% endblock %}
+
+{% set flash = tg.flash_obj.render('flash', use_js=False) %}
+
+{% call theme_macros.all_content_wrapper(g.login_url, '/auth/logout') %}
+ {{ theme_macros.header(g.login_url, '/auth/logout') }}
+ {{ theme_macros.site_notification() }}
+ {% block masthead %}{% endblock %}
+ <section id="page-body" class="{{ g.document_class(neighborhood) }} {% block page_body_classes %}{% endblock %}">
+ {% if c.project and c.project.is_nbhd_project %}
+ {% set neighborhood=c.project.neighborhood %}
+ {% include 'allura:templates_responsive/jinja_master/neigh_nav_menu.html' with context %}
+ {% else %}
+ {% block nav_menu %}
+ {% include g.theme.nav_menu %}
+ {% endblock %}
+ {% endif %}
+ {% block top_nav %}
+ {% include g.theme.top_nav %}
+ {% endblock %}
+ <div id="content_base" class="row">
+ {% block content_base %}
+ {% if not hide_left_bar %}
+ {% block sidebar_menu %}
+ {% include g.theme.sidebar_menu %}
+ {% endblock %}
+ {% endif %}
+ <div class="column">
+ <h2 class="{% block header_classes %} title{% endblock %}">{% block header %}{% endblock %}
+ <!-- actions -->
+ <small>
+ {% block actions %}{% endblock %}
+ </small>
+ <!-- /actions -->
+ </h2>
+ {% block edit_box %}{% endblock %}
+ <div>
+ {% block before_content %}{% endblock %}
+ {% block content %}{% endblock %}
+ </div>
+ {% if show_right_bar %}
+ <div class="columns">
+ {% block right_content %}{% endblock %}
+ </div>
+ {% endif %}
+ {% block after_content %}{% endblock %}
+ </div>
+ {% endblock %}
+ </div>
+ </section>
+ {{ theme_macros.footer(g.year(), g.theme_href('')) }}
+{% endcall %}
+
+<div id="messages">
+ {% for n in h.pop_user_notifications() %}
+ <section class="message {{ n.subject or 'info' }}">
+ <header>Notification:</header>
+ <div class="content">{{ n.text }}</div>
+ </section>
+ {% endfor %}
+</div>
+{% if c.show_login_overlay %}
+ {{ theme_macros.login_overlay() }}
+{% endif %}
+{% for blob in g.resource_manager.emit('body_js') %}
+ {{ blob }}
+{% endfor %}
+{% for blob in g.resource_manager.emit('body_js_tail') %}
+ {{ blob }}
+{% endfor %}
+{% block extra_js %}{% endblock %}
+{% if neighborhood %}
+ {{ neighborhood.site_specific_html | safe }}
+{% elif c.project.neighborhood %}
+ {{ c.project.neighborhood.site_specific_html | safe }}
+{% endif %}
+{{ theme_macros.custom_js() }}
+{% if flash %}
+ <script type="text/javascript">{{ flash | safe }}</script>
+{% endif %}
+</body>
+</html>
diff --git a/Allura/allura/templates_responsive/jinja_master/nav_menu.html b/Allura/allura/templates_responsive/jinja_master/nav_menu.html
new file mode 100644
index 0000000..5e2d6ee
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/nav_menu.html
@@ -0,0 +1,77 @@
+{#-
+ 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.
+-#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+{% import g.theme.jinja_macros as theme_macros with context %}
+{% set n = c.project.neighborhood %}
+{% if not c.project or (n.neighborhood_project == c.project and not n.show_title) %}
+ <!-- no nav menu -->
+{% else %}
+ {% if not c.project.is_user_project %}
+ {{ theme_macros.breadcrumbs(c.project, c.app) }}
+ {% endif %}
+ <div class="row collapse">
+ <div class="column shrink project-icon">
+ {% if c.project.is_user_project %}
+ {{lib.gravatar(c.project.user_project_of, size=90)}}
+ {% elif c.project.icon %}
+ <img alt="Project Logo" {{ lib.project_icon_srcs(c.project, base_size=90) }}>
+ {% endif %}
+ </div>
+ <div class="column title">
+ <div class="row">
+ <h1>
+ <a href="{{c.project.url()}}">
+ {%- if c.project.is_user_project -%}
+ {{ c.project.user_project_of.display_name }}
+ {%- elif not c.project.is_nbhd_project -%}
+ {{ c.project.name }}
+ {%- endif -%}
+ </a>
+ </h1>
+ {% set status = c.project.troves_by_type('developmentstatus')|sort(attribute='fullname') %}
+ {% set status = status[-1] %}
+ {% if status and status.shortname not in ['production', 'mature'] %}
+ <span class="{{ status.shortname }}">{{ status.shortname }}</span>
+ {% endif %}
+ </div>
+ {% if c.project.summary %}
+ <div class="row project_summary{% if c.project.icon %} with-icon{% endif %}">
+ {{c.project.summary}}
+ </div>
+ {% endif %}
+ {% if not c.project.is_user_project %}
+ <div class="row">
+ <div class="brought-by{% if c.project.icon %} with-icon{% endif %}">
+ Brought to you by:
+ {% set admins = c.project.admins()|sort(attribute='username') %}
+ {% for admin in admins[:5] %}
+ {% if loop.last and admins|length > 5 -%}
+ and <a href="{{ c.project.url() }}_members/">{{ admins|length - 4 }} others</a>
+ {% else %}
+ <a href="{{ admin.url() }}">{{ admin.username }}</a>{{ ',' if not loop.last }}
+ {% endif %}
+ {%- endfor -%}
+ </div>
+ </div>
+ {% endif %}
+ </div>
+
+ {{ theme_macros.project_header_right(c.project, c.app) }}
+ </div>
+{% endif %}
diff --git a/Allura/allura/templates_responsive/jinja_master/neigh_nav_menu.html b/Allura/allura/templates_responsive/jinja_master/neigh_nav_menu.html
new file mode 100644
index 0000000..8258cf1
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/neigh_nav_menu.html
@@ -0,0 +1,40 @@
+{#-
+ 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.
+-#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+{% if not neighborhood or not neighborhood.show_title %}
+ <!-- no nav menu -->
+{% else %}
+ <div class="row collapse">
+ <div class="column shrink project-icon">
+ {% if neighborhood.icon %}
+ <a href="{{neighborhood.url()}}"><img {{ lib.project_icon_srcs(neighborhood.neighborhood_project, base_size=90) }} alt="{{neighborhood.name}} Logo"/></a>
+ {% endif %}
+ </div>
+ <div class="column">
+ <h1 class="project_title"><a href="{{neighborhood.url()}}">{{neighborhood.name}}</a></h1>
+ </div>
+ {% if neighborhood.project_list_url %}
+ <div class="column shrink project_title_link">
+ <a href="{{neighborhood.project_list_url}}">
+ View Projects
+ </a>
+ </div>
+ {% endif %}
+ </div>
+{% endif %}
diff --git a/Allura/allura/templates_responsive/jinja_master/sidebar_menu.html b/Allura/allura/templates_responsive/jinja_master/sidebar_menu.html
new file mode 100644
index 0000000..ac9b374
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/sidebar_menu.html
@@ -0,0 +1,101 @@
+{#-
+ 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 ul_active = [] %}
+{% macro sidebar_item(s) -%}
+ {% if s.url %}
+ {% if not ul_active[-1] %}
+ <ul class="sidebarmenu">
+ {% do ul_active.append(True) %}
+ {% endif %}
+ <li{% if request.path.find(s.url,-s.url.__len__()) != -1 %} class="active"{% endif %}>
+ {% if s.ui_icon %}
+ {{ s.ui_icon.render(href=s.url, extra_css=s.className, closing_tag=False, **s.extra_html_attrs) }}
+ {% else %}
+ <a href="{{ s.url }}" {{ s.extra_html_attrs|xmlattr }} {% if s.className %}class="{{ s.className or '' }}"{% endif %}>
+ {% endif %}
+ <span{% if s.small != None %} class="has_small"{% endif %}>{{ h.really_unicode(s.label) }}</span>
+ {% if s.small != None %}<small>{{ s.small }}</small>{% endif %}</a>
+ </li>
+ {% else %}
+ {% if ul_active[-1] %}
+ </ul>
+ {% do ul_active.append(False) %}
+ {% endif %}
+ {% if s.label %}
+ <h3 class="{{s.className or ''}}">{% if s.ui_icon %}{{ s.ui_icon.render() }}{% endif %}{{s.label}}</h3>
+ {% endif %}
+ {% endif %}
+{%- endmacro %}
+
+<div id="sidebar" class="column">
+ {% if c.app and c.app.searchable %}
+ <form id="search" method="GET" action="{{c.app.url + 'search/'}}">
+ <input name="q" type="text" title="Search {{c.app.config.options.mount_label}}" placeholder="Search {{c.app.config.options.mount_label}}">
+ <label>
+ <input type="submit" style="display:none">
+ <b class="fa fa-search" title="Submit"></b>
+ </label>
+ </form>
+ {% else %}
+ <div class="placeholder-no-searchbox"> </div>
+ {% endif %}
+ {% if c.custom_sidebar_menu %}
+ {% for s in c.custom_sidebar_menu %}
+ {{sidebar_item(s)}}
+ {% endfor %}
+ {% endif %}
+ {% if c.app %}
+ {% if h.has_access(c.app, 'admin')() %}
+ {% if c.app.tool_label.lower() == 'wiki' %}
+ {% set admin_menu = c.app.admin_menu(skip_common_menu=True) %}
+ {% else %}
+ {% set admin_menu = c.app.admin_menu() %}
+ {% endif %}
+ {% if admin_menu %}
+ <a id='sidebar-admin-header' onclick='$("#sidebar-admin-menu").toggleClass("hidden");$("#sidebar-admin-header").toggleClass("expanded");return false;'
+ href='#' {% if request.path.startswith(c.app.admin_url) %}class="expanded"{% endif %}>
+ {{sidebar_item(c.app.admin_menu_collapse_button)}}
+ </a>
+ <div id='sidebar-admin-menu' {% if not request.path.startswith(c.app.admin_url) %}class='hidden'{% endif %}>
+ {% for s in admin_menu %}
+ {{sidebar_item(s)}}
+ {% endfor %}
+ {{sidebar_item(c.app.admin_menu_delete_button)}}
+ {{sidebar_item(None)}}
+ </div>
+ {% endif %}
+ {% endif %}
+ {% for s in c.app.sidebar_menu() %}
+ {{sidebar_item(s)}}
+ {% endfor %}
+ {% elif c.project %}
+ {% for s in c.project.sidebar_menu() %}
+ {{sidebar_item(s)}}
+ {% endfor %}
+ {% endif %}
+ {% if ul_active[-1] %}
+ </ul>
+ {% do ul_active.append(False) %}
+ {% endif %}
+ {% if c.app and c.app.sidebar_menu_js() %}
+ <script>
+ {{c.app.sidebar_menu_js()|safe}}
+ </script>
+ {% endif %}
+</div>
diff --git a/Allura/allura/templates_responsive/jinja_master/theme_macros.html b/Allura/allura/templates_responsive/jinja_master/theme_macros.html
new file mode 100644
index 0000000..2420744
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/theme_macros.html
@@ -0,0 +1,211 @@
+{#-
+ 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.
+-#}
+
+{#
+Each macro is wrapped with an 'if' clause so that a custom theme may extend this file and override individual macros
+http://stackoverflow.com/questions/26582731/redefining-imported-jinja-macros
+#}
+
+
+{# account_links are used in primary nav, and off-canvas menu for small screens #}
+{% if not account_links %}
+{%- macro account_links(c, h, config, login_url, logout_url) %}
+ {% if c.user._id %}
+ <a href="/auth/preferences/">Account</a>
+ <a href="{{c.user.url()}}">{{name}}</a>
+ <a href="{{logout_url}}">Log Out</a>
+ {% else %}
+ {% if h.asbool(config.get('auth.allow_user_registration', True)) %}
+ <a href="/auth/create_account">Register</a>
+ {% endif %}
+ <a href="{{login_url}}">Log In</a>
+ {% endif %}
+{%- endmacro %}
+{% endif %}
+
+{% if not header %}
+{%- macro header(login_url, logout_url) %}
+{% set breakpoint='medium' %}
+<div class="row">
+ <header class="columns small-12 title-bar">
+ <div class="title-bar-left">
+ {% if g.nav_logo %}
+ <a href="{{ g.nav_logo['redirect_link'] }}"><img style="{% if g.nav_logo['image_width'] %}width: {{g.nav_logo['image_width']}}px;{% endif %} {% if g.nav_logo['image_height'] %}height: {{ g.nav_logo['image_height'] }}px;{% endif %}" src="{{ g.nav_logo['image_path'] }}" /></a>
+ {% endif %}
+ {% for nav_link in g.global_nav %}
+ <a href="{{ nav_link['url'] }}" {% if g.nav_logo or not loop.first %}class="show-for-{{ breakpoint }}"{% endif %}>{{ nav_link['title'] }}</a>
+ {% endfor %}
+ </div>
+ <div class="title-bar-right show-for-{{ breakpoint }}">
+ {{ account_links(c, h, config, login_url, logout_url) }}
+ </div>
+ <button class="menu-icon hide-for-{{ breakpoint }}" type="button" data-open="offCanvas"></button>
+ </header>
+</div>
+{%- endmacro %}
+{% endif %}
+
+
+{% if not all_content_wrapper %}
+{% macro all_content_wrapper(login_url, logout_url) -%}
+ <div class="off-canvas position-right" id="offCanvas" data-off-canvas>
+ <div class="menu vertical">
+ {% for nav_link in g.global_nav %}
+ <a href="{{ nav_link['url'] }}">{{ nav_link['title'] }}</a>
+ {% endfor %}
+ {{ account_links(c, h, config, login_url, logout_url) }}
+ </div>
+ </div>
+ <div class="off-canvas-content" data-off-canvas-content>
+ {{- caller(**kwargs) -}}
+ </div>
+{%- endmacro %}
+{% endif %}
+
+
+{% if not footer %}
+{%- macro footer(year, path_to_static='') %}
+<footer id="site-footer" class="row align-right">
+ <p>This project is powered by <a href="https://allura.apache.org/">Apache Allura</a>™.</p>
+</footer>
+{%- endmacro %}
+{% endif %}
+
+{% if not custom_js %}
+{%- macro custom_js(path_to_static) %}
+<script>
+ $(document).foundation();
+</script>
+{%- endmacro %}
+{% endif %}
+
+{% if not custom_tracking_js %}
+{%- macro custom_tracking_js(accounts, user, project) %}
+ {# This should be overridden in your custom theme (e.g., sftheme) to implement custom tracking code. #}
+ var _gaq = _gaq || [];
+
+ function _add_tracking(prefix, tracking_id) {
+ _gaq.push(
+ [prefix+'._setAccount', tracking_id],
+ [prefix+'._trackPageview']
+ );
+ }
+
+ {%- for account in accounts %}
+ _add_tracking('acct{{ loop.index }}', '{{account}}');
+ {%- endfor %}
+ {% if project and project.neighborhood.features['google_analytics'] -%}
+ {% if project.neighborhood.tracking_id -%}
+ _add_tracking('nbhd', '{{project.neighborhood.tracking_id}}');
+ {%- endif %}
+ {% if project.tracking_id -%}
+ _add_tracking('proj', '{{project.tracking_id}}');
+ {%- endif %}
+ {%- endif %}
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+{%- endmacro %}
+{% endif %}
+
+{% if not extra_header %}
+{%- macro extra_header(path_to_static) %}
+
+{%- endmacro %}
+{% endif %}
+
+{% if not breadcrumbs %}
+{%- macro breadcrumbs(project, app) %}
+ <nav aria-label="You are here:" role="navigation" class="row">
+ <ul class="breadcrumbs">
+ <li><a href="/">Home</a></li>
+ {% for label,url in project.breadcrumbs() %}
+ {% if not loop.last or app %}
+ <li><a href="{{ url }}">{{ label }}</a></li>
+ {% else %}
+ <li>{{ label }}</li>
+ {% endif %}
+ {% endfor %}
+ {% if app %}
+ <li>{{ app.config.options.mount_label }}</li>
+ {% endif %}
+ </ul>
+ </nav>
+{%- endmacro %}
+{% endif %}
+
+
+{% if not project_header_right %}
+{%- macro project_header_right(project, app) %}
+ {% if project.neighborhood.icon %}
+ <div class="column shrink neighborhood_block">
+ <a href="{{project.neighborhood.url()}}"><img {{ lib.project_icon_srcs(project.neighborhood.neighborhood_project) }} class="neighborhood_icon"
+ alt="Return to {{project.neighborhood.name}}" title="Return to {{project.neighborhood.name}}"></a>
+ <div class="neighborhood_title">
+ <h3><a href="{{project.neighborhood.url()}}">{{project.neighborhood.name}}</a></h3>
+ {% if project.neighborhood.project_list_url %}
+ <div class="neighborhood_title_link">
+ <a href="{{project.neighborhood.project_list_url}}">
+ View More Projects
+ </a>
+ </div>
+ {% endif %}
+ </div>
+ </div>
+ {% endif %}
+{%- endmacro %}
+{% endif %}
+
+{% if not login_overlay %}
+{%- macro login_overlay() %}
+ {% do g.register_js('js/jquery.lightbox_me.js') %}
+ {% do g.register_forge_js('js/jquery-ui.min.js') %}
+ {% do g.register_js('js/login_overlay.js') %}
+ <div id="login_overlay" class="ui-widget-content">
+ <h2 class="dark title">Login Required</h2>
+ <iframe src="{{g.login_fragment_url}}"></iframe>
+ </div>
+{%- endmacro %}
+{% endif %}
+
+{% if not site_notification %}
+{%- macro site_notification() %}
+ {% set note = g.theme.get_site_notification() %}
+ {% if note %}
+ <div id="site-notification">
+ <section class="callout primary" data-notification-id="{{note._id}}">
+ {{note.content|safe}}
+ <button class="close-button btn-close" aria-label="Dismiss alert" type="button">
+ {# .btn-close instead of data-close, since allura-base.js handles closing it, not Foundation #}
+ <span aria-hidden="true">×</span>
+ </button>
+ </section>
+ </div>
+ {% endif %}
+{%- endmacro %}
+{% endif %}
+
+{% if not placeholder_project_icon %}
+{%- macro placeholder_project_icon() %}
+ <div class="placeholder-icon"></div>
+{%- endmacro %}
+{% endif %}
diff --git a/Allura/allura/templates_responsive/jinja_master/top_nav.html b/Allura/allura/templates_responsive/jinja_master/top_nav.html
new file mode 100644
index 0000000..a0373a9
--- /dev/null
+++ b/Allura/allura/templates_responsive/jinja_master/top_nav.html
@@ -0,0 +1,84 @@
+{#-
+ 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.
+-#}
+{% if c.project %}
+<div id="top_nav_admin" class="row">
+<ul class="menu dropdown" data-dropdown-menu>
+ {% for s in c.project.grouped_navbar_entries() %}
+ <li class="{% if s.matches_url(request) %}selected{% endif %}">
+ <a href="{{s.url}}" class="tool-{{(s.tool_name or 'admin').lower()}}-32">
+ {{s.label}}
+ </a>
+ {% set grouped_tool_count = s.matching_urls|length %}
+ {% if grouped_tool_count %}
+ <ul>
+ {%for tool in s.children%}
+ <li class="{% if tool.matches_url(request) %}selected{% endif %}"><a href="{{tool.url}}">{{tool.label}}</a></li>
+ {%endfor%}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ {% if h.has_access(c.project, 'admin')() %}
+ <li id="add-tool-container"><a href='#' class="add-tool-toggle">Add New...</a></li>
+ <button id="toggle-admin-btn" title="Click to unlock the toolbar and configure your project's tools.">
+ <i class="fa fa-lock"></i>
+ </button>
+ {% endif %}
+</ul>
+</div>
+{% if h.has_access(c.project, 'admin')() %}
+ {% do g.register_forge_js('js/underscore-min.js') %}
+ {% do g.register_forge_js('js/browser-polyfill.min.js') %}
+ {% do lib.register_react_js_files() %}
+ {% do g.register_forge_js('js/react-drag.min.js') %}
+ {% do g.register_forge_js('js/react-reorderable.min.js') %}
+ {% do g.register_forge_js('js/build/transpiled.js') %} {# if we do more es6, we'll need to register this in other places, or maybe even global #}
+ <script>
+ 'use strict';
+ /*global ReactDOM, React, Main, ToggleAddNewTool */
+ var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe }};
+ $(document).ready(function () {
+ $('#toggle-admin-btn').click(function () {
+ if (typeof Main === 'undefined') {
+ alert('Compiled JS is missing. Need to run `npm install; npm run build;` on the server.');
+ return;
+ }
+ ReactDOM.render(React.createElement(Main, {
+ initialData: _data
+ }), document.getElementById("top_nav_admin"));
+ });
+
+ if (typeof ToggleAddNewTool === 'undefined') {
+ $('#add-tool-container').click(function(){
+ alert('Compiled JS is missing. Need to run `npm install; npm run build;` on the server.');
+ });
+ } else {
+ ReactDOM.render(React.createElement(ToggleAddNewTool, {
+ installableTools: _data['installable_tools']
+ }), document.getElementById('add-tool-container'));
+ }
+ $("#toggle-admin-btn").tooltipster({
+ delay: 200,
+ theme: 'tooltipster-light',
+ position: 'top'
+ });
+ });
+ </script>
+{% endif %}
+{% endif %}
diff --git a/Allura/development.ini b/Allura/development.ini
index 8922c30..8f86fca 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -140,7 +140,8 @@
; 32 in nested comments
; 48 in standard comments
; and then 1.5x and 2x versions of all
-project_icon_sizes = 16 24 32 48 64 72 96
+; 90px for new large project icons, and 1.5x 2x 3x versions
+project_icon_sizes = 16 24 32 48 64 72 90 96 135 180 270
; To use a custom image for default user profile avatars, specify a full URL here. Size 96x96 is best, 48x48 ok
;default_avatar_image =