summaryrefslogtreecommitdiff
path: root/base.html.jinja
diff options
context:
space:
mode:
Diffstat (limited to 'base.html.jinja')
-rw-r--r--base.html.jinja305
1 files changed, 305 insertions, 0 deletions
diff --git a/base.html.jinja b/base.html.jinja
new file mode 100644
index 0000000..c4d288b
--- /dev/null
+++ b/base.html.jinja
@@ -0,0 +1,305 @@
+{#
+SPDX-License-Identifier: GPL-3.0-or-later OR CC-BY-SA-4.0
+
+Hydrilla&Haketilo reusable base page template.
+
+This file is part of Hydrilla&Haketilo.
+
+Copyright (C) 2022 Wojtek Kosior
+
+Dual licensed under
+* GNU General Public License v3.0 or later and
+* Creative Commons Attribution Share Alike 4.0 International.
+
+You can choose to use either of these licenses or both.
+
+
+I, Wojtek Kosior, thereby promise not to sue for violation of this
+file's licenses. Although I request that you do not make use of this
+code in a proprietary work, I am not going to enforce this in court.
+#}
+<!DOCTYPE html>
+
+{% macro button_row(buttons_data, common_fields={}) %}
+ <div class="flex-row">
+ {% for classes, text, extra_fields in buttons_data %}
+ {% if not loop.first %}
+ <div class="button-row-separator"></div>
+ {% do classes.append('button-bordering-left') %}
+ {% endif %}
+
+ {% if not loop.last %}
+ {% do classes.append('button-bordering-right') %}
+ {% endif %}
+
+ {% if 'disabled-button' in classes %}
+ {% set disabled_attr = ' disabled=""' %}
+ {% else %}
+ {% set disabled_attr = '' %}
+ {% endif %}
+
+ <form method="POST" class="flex-row">
+ {% for name, value in extra_fields.items() %}
+ <input name="{{ name }}" value="{{ value }}" type="hidden">
+ {% endfor %}
+ {% for name, value in common_fields.items() %}
+ <input name="{{ name }}" value="{{ value }}" type="hidden">
+ {% endfor %}
+
+ <button class="{{ classes|join(' ') }}"{{ disabled_attr }}>
+ {{ text }}
+ </button>
+ </form>
+ {% endfor %}
+ </div>
+{% endmacro %}
+
+{% macro error_note(note_text) %}
+ <aside class="error-note">
+ {{ note_text }}
+ </aside>
+{% endmacro %}
+
+{% macro label(label_text, label_name=none) %}
+ {% set for_attr = label_name and (label_name + "_field") %}
+ <label {{ {'for': for_attr, 'class': 'section-label'}|xmlattr }}>
+ <span>{{ label_text }}</span>
+ {% if caller is defined %}
+ {{ caller() }}
+ {% endif %}
+ </label>
+{% endmacro %}
+
+{%
+ macro form_field(
+ field_name,
+ required = true,
+ sep_after = true,
+ height = none,
+ initial_value = none
+ )
+%}
+ <div class="flex-row">
+ {%
+ set attrs = {
+ 'id': field_name + '_field',
+ 'name': field_name,
+ 'required': '' if required else none,
+ 'rows': height
+ }
+ %}
+
+ {% if height is none %}
+ {% do attrs.update({'value': initial_value}) %}
+ <input{{ attrs|xmlattr }}>
+ {% else %}
+ {% set value = initial_value|default('', true) %}
+ <textarea{{ attrs|xmlattr }}>{{ value }}</textarea>
+ {% endif %}
+ </div>
+
+ {% if sep_after %}
+ <div class="horizontal-separator"></div>
+ {% endif %}
+{% endmacro %}
+
+{% macro verbatim() %}
+ <code><pre>{{ caller()|safe }}</pre></code>
+{% endmacro %}
+
+{% macro unordered_list() %}
+ <ul>
+ {{ caller() }}
+ </ul>
+{% endmacro %}
+
+{% macro list_entry() %}
+ <li class="has-colored-links">
+ {{ caller() }}
+ </li>
+{% endmacro %}
+
+{% macro doc_link(doc_url) %}
+ <a class="doc-link" href="{{ doc_url }}" target="_blank"></a>
+{% endmacro %}
+
+<html>
+ <head>
+ {% block head %}
+ {% if style_nonce is defined %}
+ {% set style_attrs = {'nonce': style_nonce} %}
+ {% endif %}
+ <style{{ style_attrs|default({})|xmlattr }}>
+ {% block style %}
+ body {
+ color: #444;
+ margin: 0;
+ }
+
+ #main {
+ max-width: 750px;
+ margin: auto;
+ padding: 0 5px;
+ }
+
+ a {
+ text-decoration: inherit;
+ color: inherit;
+ }
+
+ .has-colored-links a {
+ color: #557b8e;
+ }
+
+ .small-print {
+ font-size: 80%;
+ color: #555;
+ }
+
+ .error-note {
+ display: block;
+ border-left: 5px solid #a33;
+ padding: 10px;
+ background-color: #fcc;
+ }
+
+ #main > .error-note:first-child {
+ margin-top: 10px;
+ }
+
+ .block-with-bottom-margin, .section-label, .flex-row, aside, p {
+ display: block;
+ margin: 0 0 10px 0;
+ }
+
+ .section-label > span:first-child {
+ font-style: italic;
+ text-decoration: underline #ccc;
+ }
+
+ .flex-row {
+ display: flex;
+ padding: 0;
+ }
+
+ .flex-row > * {
+ flex: 1 1 0;
+ }
+
+ .flex-row > .flex-row {
+ margin: 0;
+ }
+
+ .button-row-separator {
+ background-color: #888;
+ flex: 0 0 2px;
+ }
+
+ div.horizontal-separator {
+ display: block;
+ background-color: #e3e3e3;
+ height: 1px;
+ margin: 0 0 10px 0;
+ }
+
+ textarea {
+ resize: none;
+ }
+
+ .green-button, .red-button, .blue-button {
+ border: none;
+ border-radius: 2px;
+ color: white;
+ text-align: center;
+ text-decoration: none;
+ display: block;
+ padding: 5px 10px;
+ -moz-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font: 400 0.9em sans-serif;
+ }
+
+ .green-button {
+ background-color: #4caf50;
+ }
+
+ .red-button {
+ background-color: #af504c;
+ }
+
+ .blue-button {
+ background-color: #504caf;
+ }
+
+ .disabled-button {
+ background-color: #aaa;
+ cursor: default;
+ }
+
+ .button-bordering-right {
+ border-radius: 2px 0 0 2px;
+ }
+
+ .button-bordering-left {
+ border-radius: 0 2px 2px 0;
+ }
+
+ .button-bordering-left.button-bordering-right {
+ border-radius: 0;
+ }
+
+ .doc-link {
+ display: inline-block;
+ width: 1.2em;
+ height: 1em;
+ }
+
+ .doc-link::after {
+ content: "?";
+ position:absolute;
+ display: inline-block;
+ width:1.2em;
+ height:1.2em;
+ line-height: 1.2em;
+ border: 2px solid #ffffff88;
+ border-radius: 1em;
+ transform: translate(1px, calc(-0.1em - 1px));
+ background-color: #4caf50;
+ color:white;
+ text-align: center;
+ font-style: normal;
+ font-family: initial;
+ font-size: 90%;
+ font-weight:bold;
+ }
+
+ .doc-link:hover::after {
+ color: #ffffffaa;
+ border-color: #4caf50;
+ }
+
+ code > pre {
+ overflow-x: auto;
+ background-color: #f0f0f0;
+ padding: 5px;
+ border: 1px solid #e3e3e3;
+ }
+
+ .bold {
+ font-weight: bold;
+ }
+
+ .hide {
+ display: none !important;
+ }
+ {% endblock style %}
+ </style>
+ {% endblock head %}
+ </head>
+ <body>
+ {% block body %}
+ <div id="main">{% block main required %}{% endblock %}</div>
+ {% endblock body %}
+ </body>
+</html>