initial commit
This commit is contained in:
134
templates/base.html
Normal file
134
templates/base.html
Normal file
@@ -0,0 +1,134 @@
|
||||
<!DOCTYPE html>
|
||||
<html
|
||||
lang="{{ config.default_language | default(value="en") }}"
|
||||
data-theme="light"
|
||||
>
|
||||
<head>
|
||||
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VWE2PKJ3KL"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-VWE2PKJ3KL');
|
||||
</script>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
{# -------------------------
|
||||
TITLE
|
||||
------------------------- #}
|
||||
<title>
|
||||
{% if page is defined and page.title %}
|
||||
{{ page.title }} – {{ config.title }}
|
||||
{% elif section is defined and section.title %}
|
||||
{{ section.title }} – {{ config.title }}
|
||||
{% else %}
|
||||
{{ config.title }}
|
||||
{% endif %}
|
||||
</title>
|
||||
|
||||
{# -------------------------
|
||||
META DESCRIPTION
|
||||
------------------------- #}
|
||||
{% if page is defined and page.description %}
|
||||
<meta name="description" content="{{ page.description }}">
|
||||
{% elif section is defined and section.description %}
|
||||
<meta name="description" content="{{ section.description }}">
|
||||
{% elif config.description %}
|
||||
<meta name="description" content="{{ config.description }}">
|
||||
{% endif %}
|
||||
|
||||
{# -------------------------
|
||||
OPEN GRAPH
|
||||
------------------------- #}
|
||||
<meta property="og:site_name" content="{{ config.title }}">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:title" content="{{ config.title }}">
|
||||
<meta property="og:description" content="{{ config.description }}">
|
||||
<meta property="og:url" content="{{ current_url | default(value=config.base_url) }}">
|
||||
|
||||
{# Optional: add when you have one #}
|
||||
{# <meta property="og:image" content="{{ config.base_url }}/img/og-image.png"> #}
|
||||
|
||||
{# -------------------------
|
||||
TWITTER
|
||||
------------------------- #}
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="{{ config.title }}">
|
||||
<meta name="twitter:description" content="{{ config.description }}">
|
||||
|
||||
{# Optional #}
|
||||
{# <meta name="twitter:image" content="{{ config.base_url }}/img/og-image.png"> #}
|
||||
|
||||
{# -------------------------
|
||||
STRUCTURED DATA (JSON-LD)
|
||||
------------------------- #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareSourceCode",
|
||||
"name": "{{ config.title }}",
|
||||
"description": "{{ config.description }}",
|
||||
"url": "{{ config.base_url }}",
|
||||
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
|
||||
"codeRepository": "{{ config.extra.repo_url | default(value="") }}",
|
||||
"programmingLanguage": "Go",
|
||||
"operatingSystem": "Linux"
|
||||
}
|
||||
</script>
|
||||
|
||||
{# -------------------------
|
||||
STYLES
|
||||
------------------------- #}
|
||||
<link rel="stylesheet" href="{{ get_url(path="main.css") }}">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
{% include "partials/header.html" %}
|
||||
|
||||
<main class="oc-main">
|
||||
{% block content %}{% endblock content %}
|
||||
</main>
|
||||
|
||||
{% include "partials/footer.html" %}
|
||||
|
||||
{# -------------------------
|
||||
THEME TOGGLE SCRIPT
|
||||
------------------------- #}
|
||||
<script>
|
||||
(function () {
|
||||
const root = document.documentElement;
|
||||
const stored = localStorage.getItem('oc-theme');
|
||||
|
||||
if (stored === 'dark') {
|
||||
root.setAttribute('data-theme', 'dark');
|
||||
} else {
|
||||
root.setAttribute('data-theme', 'light');
|
||||
}
|
||||
|
||||
const btn = document.getElementById('oc-theme-toggle');
|
||||
if (!btn) return;
|
||||
|
||||
const updateLabel = () => {
|
||||
const current = root.getAttribute('data-theme') || 'light';
|
||||
btn.innerText = current === 'dark' ? '☀ Light' : '🌙 Dark';
|
||||
};
|
||||
|
||||
updateLabel();
|
||||
|
||||
btn.addEventListener('click', () => {
|
||||
const next = root.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';
|
||||
root.setAttribute('data-theme', next);
|
||||
localStorage.setItem('oc-theme', next);
|
||||
updateLabel();
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
16
templates/page.html
Normal file
16
templates/page.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="oc-section">
|
||||
<div class="oc-container oc-section-header">
|
||||
<h1>{{ page.title }}</h1>
|
||||
{% if page.description %}
|
||||
<p class="oc-section-description">{{ page.description }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="oc-container oc-content">
|
||||
{{ page.content | safe }}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock content %}
|
||||
30
templates/partials/footer.html
Normal file
30
templates/partials/footer.html
Normal file
@@ -0,0 +1,30 @@
|
||||
<footer class="oc-footer">
|
||||
<div class="oc-container oc-footer-inner">
|
||||
<div class="oc-footer-left">
|
||||
|
||||
<!-- 👇 Add your PNG logo here -->
|
||||
<a href="https://www.irt-saintexupery.com/">
|
||||
<img
|
||||
src="/logo_IRT Saint Exupery_RVB_300x166.png"
|
||||
alt="OpenCloud footer logo"
|
||||
class="oc-footer-logo"
|
||||
/>
|
||||
</a>
|
||||
<div class="oc-footer-text">
|
||||
<p>© {{ now() | date(format="%Y") }} {{ config.extra.project_name | default(value="OpenCloud") }}</p>
|
||||
<p class="oc-footer-tagline">
|
||||
{{ config.extra.tagline | default(value="Sovereign, distributed, open-source cloud.") }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="oc-footer-right">
|
||||
{% if config.extra.repo_url %}
|
||||
<a href="{{ config.extra.repo_url | safe }}" class="oc-footer-link" target="_blank" rel="noopener">
|
||||
Source code
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
57
templates/partials/header.html
Normal file
57
templates/partials/header.html
Normal file
@@ -0,0 +1,57 @@
|
||||
<header class="oc-header">
|
||||
<div class="oc-container oc-header-inner">
|
||||
<a href="{{ config.base_url | safe }}" class="oc-logo">
|
||||
<svg
|
||||
class="oc-logo-svg"
|
||||
viewBox="0 0 550.21571 484.1958"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
aria-hidden="true">
|
||||
<g transform="translate(-200.84662,-412.20907)">
|
||||
<path
|
||||
d="m 589.87109,547.33398 a 14.191169,14.191169 0 0 0 -14.1914,14.19141 14.191169,14.191169 0 0 0 14.1914,14.19141 h 101.65235 a 14.191169,14.191169 0 0 0 14.1914,-14.19141 14.191169,14.191169 0 0 0 -14.1914,-14.19141 z"
|
||||
style="fill:currentColor;fill-rule:evenodd;stroke-linecap:round;" />
|
||||
<path
|
||||
d="m 453.76672,412.20907 q 44.48935,0 77.01376,41.43523 32.69294,41.22909 32.69294,103.07272 0,63.69894 -32.86145,105.75261 -32.86146,42.05368 -79.54158,42.05368 -47.18568,0 -79.37304,-41.02295 -32.01886,-41.02294 -32.01886,-106.1649 0,-66.58497 37.07446,-108.63865 32.18738,-36.48774 77.01377,-36.48774 z m -3.20188,15.04861 q -30.6707,0 -49.20792,27.82964 -23.08729,34.63244 -23.08729,101.42355 0,68.4403 23.92989,105.34033 18.3687,28.03577 48.53383,28.03577 32.18738,0 53.0839,-30.71566 21.06503,-30.71567 21.06503,-96.88836 0,-71.73861 -23.08728,-106.98948 -18.53723,-28.03579 -51.23016,-28.03579 z"
|
||||
style="fill:currentColor;" />
|
||||
<path
|
||||
d="m 255.11051,789.25838 q -16.34484,0 -25.72535,10.94393 -9.38052,10.94393 -9.38052,29.98922 0,18.90315 8.66987,29.98922 8.812,10.94393 26.29387,10.94393 6.68006,0 12.64948,-1.13703 5.96942,-1.13704 11.65458,-2.84258 v 11.08606 q -5.68516,2.13193 -11.79671,3.12684 -5.96942,0.9949 -14.35503,0.9949 -15.49206,0 -25.86748,-6.39581 -10.37541,-6.3958 -15.63419,-18.19251 -5.11664,-11.7967 -5.11664,-27.71515 0,-15.34993 5.54303,-27.00451 5.68516,-11.79671 16.62909,-18.33464 10.94393,-6.68006 26.57812,-6.68006 16.06058,0 27.99942,5.96941 l -5.11665,10.80181 q -4.69025,-2.13194 -10.51754,-3.83749 -5.68516,-1.70554 -12.50735,-1.70554 z m 46.33405,91.6732 v -101.4801 h 12.79161 v 90.10978 h 44.34424 v 11.37032 z M 461.62389,830.0494 q 0,15.77632 -5.4009,27.57302 -5.25877,11.65458 -15.63419,18.19252 -10.37541,6.53793 -25.72535,6.53793 -15.77631,0 -26.29386,-6.53793 -10.37542,-6.53794 -15.49206,-18.33465 -5.11665,-11.7967 -5.11665,-27.57302 0,-15.63419 5.11665,-27.28877 5.11664,-11.65458 15.49206,-18.19251 10.51755,-6.53793 26.43599,-6.53793 15.20781,0 25.58322,6.53793 10.37542,6.3958 15.63419,18.19251 5.4009,11.65458 5.4009,27.4309 z m -80.16075,0 q 0,19.18741 8.10135,30.27347 8.10136,10.94394 25.29896,10.94394 17.33974,0 25.29897,-10.94394 7.95922,-11.08606 7.95922,-30.27347 0,-19.18742 -7.95922,-29.98922 -7.95923,-10.94393 -25.15684,-10.94393 -17.19761,0 -25.44109,10.94393 -8.10135,10.8018 -8.10135,29.98922 z m 179.79321,15.06567 q 0,10.51755 -4.26387,19.04529 -4.26387,8.38561 -13.07587,13.36012 -8.66987,4.83239 -22.17212,4.83239 -18.90316,0 -28.85219,-10.23329 -9.8069,-10.37542 -9.8069,-27.28877 v -65.37933 h 12.79161 v 65.80572 q 0,12.36522 6.53794,19.18742 6.68006,6.82219 20.04018,6.82219 13.78652,0 19.89806,-7.24858 6.25368,-7.39071 6.25368,-18.90316 v -65.66359 h 12.64948 z m 108.01817,-15.91845 q 0,25.72535 -14.07078,38.80122 -13.92864,12.93374 -38.94334,12.93374 h -28.28367 v -101.4801 h 31.26838 q 15.34993,0 26.57812,5.68516 11.22819,5.68515 17.33974,16.77122 6.11155,10.94393 6.11155,27.28876 z m -13.50226,0.42639 q 0,-20.32445 -10.09116,-29.70496 -9.94903,-9.52264 -28.28367,-9.52264 h -16.62909 v 79.59224 h 13.78651 q 41.21741,0 41.21741,-40.36464 z"
|
||||
style="fill:currentColor;" />
|
||||
<path
|
||||
d="m 585.22244,636.45955 q 8.91,0 14.31,6.21 5.49,6.21 5.49,18.72 0,12.33 -5.49,18.72 -5.4,6.39 -14.4,6.39 -5.58,0 -9.27,-2.07 -3.6,-2.16 -5.67,-4.95 h -0.54 q 0.18,1.53 0.36,3.87 0.18,2.34 0.18,4.05 v 19.8 h -7.92 v -69.84 h 6.48 l 1.08,6.57 h 0.36 q 2.16,-3.15 5.67,-5.31 3.51,-2.16 9.36,-2.16 z m -1.44,6.66 q -7.38,0 -10.44,4.14 -2.97,4.14 -3.15,12.6 v 1.53 q 0,8.91 2.88,13.77 2.97,4.77 10.89,4.77 4.41,0 7.2,-2.43 2.88,-2.43 4.23,-6.57 1.44,-4.23 1.44,-9.63 0,-8.28 -3.24,-13.23 -3.15,-4.95 -9.81,-4.95 z m 52.46998,-6.66 q 6.21,0 10.62,2.7 4.5,2.7 6.84,7.65 2.43,4.86 2.43,11.43 v 4.77 h -33.03 q 0.18,8.19 4.14,12.51 4.05,4.23 11.25,4.23 4.59,0 8.1,-0.81 3.6,-0.9 7.38,-2.52 v 6.93 q -3.69,1.62 -7.29,2.34 -3.6,0.81 -8.55,0.81 -6.84,0 -12.15,-2.79 -5.22,-2.79 -8.19,-8.28 -2.88,-5.58 -2.88,-13.59 0,-7.92 2.61,-13.59 2.7,-5.67 7.47,-8.73 4.86,-3.06 11.25,-3.06 z m -0.09,6.48 q -5.67,0 -9,3.69 -3.24,3.6 -3.87,10.08 h 24.57 q -0.09,-6.12 -2.88,-9.9 -2.79,-3.87 -8.82,-3.87 z m 55.43993,-6.48 q 8.64,0 13.05,4.23 4.41,4.14 4.41,13.5 v 31.41 h -7.83 v -30.87 q 0,-11.61 -10.8,-11.61 -8.01,0 -11.07,4.5 -3.06,4.5 -3.06,12.96 v 25.02 h -7.92 v -48.24 h 6.39 l 1.17,6.57 h 0.45 q 2.34,-3.78 6.48,-5.58 4.14,-1.89 8.73,-1.89 z"
|
||||
style="fill:currentColor;" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
<span class="oc-logo-text">{{ config.extra.project_short | default(value="OpenCloud") }}</span>
|
||||
</a>
|
||||
|
||||
|
||||
<!-- CENTER: Navigation -->
|
||||
<nav class="oc-nav">
|
||||
<ul>
|
||||
{% if config.extra.nav_items %}
|
||||
{% for item in config.extra.nav_items %}
|
||||
<li>
|
||||
<a href="{{ item.url | safe }}"
|
||||
class="{% if current_url and current_url == item.url %}oc-nav-active{% endif %}">
|
||||
{{ item.name }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- RIGHT: Theme Toggle -->
|
||||
<button id="oc-theme-toggle" class="oc-theme-toggle" type="button">
|
||||
🌙 Dark
|
||||
</button>
|
||||
|
||||
<!-- MOBILE BURGER -->
|
||||
<input type="checkbox" id="nav-toggle" class="oc-nav-toggle">
|
||||
<label for="nav-toggle" class="oc-nav-toggle-label">
|
||||
<span></span><span></span><span></span>
|
||||
</label>
|
||||
|
||||
</div>
|
||||
</header>
|
||||
48
templates/partials/hero.html
Normal file
48
templates/partials/hero.html
Normal file
@@ -0,0 +1,48 @@
|
||||
<section class="oc-hero">
|
||||
<div class="oc-container oc-hero-inner">
|
||||
<div class="oc-hero-text">
|
||||
<h1>
|
||||
{% if section is defined and section.title %}
|
||||
{{ section.title }}
|
||||
{% else %}
|
||||
{{ config.extra.project_name | default(value="OpenCloud") }}
|
||||
{% endif %}
|
||||
</h1>
|
||||
|
||||
<p class="oc-hero-tagline">
|
||||
{{ config.extra.tagline | default(value="A sovereign, peer-to-peer distributed cloud for trusted partners.") }}
|
||||
</p>
|
||||
|
||||
{% if section is defined and section.content %}
|
||||
<div class="oc-hero-body">
|
||||
{{ section.content | safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="oc-hero-ctas">
|
||||
{% if config.extra.primary_cta_label and config.extra.primary_cta_url %}
|
||||
<a href="{{ config.extra.primary_cta_url | safe }}" class="oc-btn oc-btn-primary">
|
||||
{{ config.extra.primary_cta_label }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if config.extra.secondary_cta_label and config.extra.secondary_cta_url %}
|
||||
<a href="{{ config.extra.secondary_cta_url | safe }}" class="oc-btn oc-btn-secondary">
|
||||
{{ config.extra.secondary_cta_label }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="oc-hero-visual">
|
||||
<div class="oc-hero-card">
|
||||
<h2>Distributed • Sovereign • Resilient</h2>
|
||||
<ul>
|
||||
<li>Peer-to-peer federation of private clouds</li>
|
||||
<li>Trust controlled by each participant</li>
|
||||
<li>No central authority, no lock-in</li>
|
||||
<li>Open-source and auditable by design</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
32
templates/section.html
Normal file
32
templates/section.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="oc-section">
|
||||
<div class="oc-container oc-section-header">
|
||||
<h1>{{ section.title }}</h1>
|
||||
{% if section.description %}
|
||||
<p class="oc-section-description">{{ section.description }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="oc-container oc-content">
|
||||
{{ section.content | safe }}
|
||||
</div>
|
||||
|
||||
{% if section.pages | length > 0 %}
|
||||
<div class="oc-container oc-grid-2 oc-section-list">
|
||||
{% for page in section.pages %}
|
||||
<article class="oc-card oc-card-link">
|
||||
<h2><a href="{{ page.permalink }}">{{ page.title }}</a></h2>
|
||||
{% if page.description %}
|
||||
<p>{{ page.description }}</p>
|
||||
{% else %}
|
||||
<p>{{ page.summary | safe }}</p>
|
||||
{% endif %}
|
||||
<a href="{{ page.permalink }}" class="oc-link-arrow">Read more →</a>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endblock content %}
|
||||
Reference in New Issue
Block a user