SPB Git

spb/spbgit Public MIT

SPB Git — the platform hosting itself

JavaScript 73.9% CSS 11.7% Nunjucks 11.6% Shell 2.7%
5.4 KB · 77 lines jinja
Raw Blame History
1{#2  ─────────────────────────────────────────────3   SPB Git — Personal Git Platform4  ─────────────────────────────────────────────5   Author  : Simon-Pierre Boucher6   Contact : contact@spboucher.ai7   File    : src/web/views/layout.njk8   Purpose : Base layout — nav, footer, meta, OG cards, theme9   License : MIT © Simon-Pierre Boucher10  ─────────────────────────────────────────────11#}<!DOCTYPE html>12<html lang="en" data-theme="dark">13<head>14  <meta charset="utf-8">15  <meta name="viewport" content="width=device-width, initial-scale=1">16  <title>{{ title | default('SPB Git') }}</title>17  <meta name="description" content="{{ description | default('SPB Git — the personal git platform of Simon-Pierre Boucher.') }}">18  <link rel="canonical" href="{{ canonical }}">19  <meta name="author" content="{{ owner.name }}">20  <meta property="og:site_name" content="SPB Git">21  <meta property="og:type" content="website">22  <meta property="og:title" content="{{ title | default('SPB Git') }}">23  <meta property="og:description" content="{{ description | default('SPB Git — the personal git platform of Simon-Pierre Boucher.') }}">24  <meta property="og:url" content="{{ canonical }}">25  <meta property="og:image" content="{{ ogImage }}">26  <meta name="twitter:card" content="summary_large_image">27  <meta name="twitter:title" content="{{ title | default('SPB Git') }}">28  <meta name="twitter:description" content="{{ description | default('SPB Git — the personal git platform of Simon-Pierre Boucher.') }}">29  <meta name="twitter:image" content="{{ ogImage }}">30  <link rel="icon" type="image/svg+xml" href="/assets/img/logo.svg">31  <link rel="icon" type="image/png" href="/favicon.png">32  <link rel="apple-touch-icon" href="/apple-touch-icon.png">33  <link rel="alternate" type="application/atom+xml" title="SPB Git activity" href="/feed.atom">34  <link rel="preload" href="/assets/fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin>35  <link rel="preload" href="/assets/fonts/inter-600.woff2" as="font" type="font/woff2" crossorigin>36  <link rel="preload" href="/assets/fonts/jetbrains-mono-400.woff2" as="font" type="font/woff2" crossorigin>37  <link rel="stylesheet" href="/assets/css/tokens.css">38  <link rel="stylesheet" href="/assets/css/app.css">39  <link rel="stylesheet" href="/assets/css/markdown.css">40  <script src="/assets/js/theme-boot.js"></script>41</head>42<body>43  <a class="skip-link" href="#main">Skip to content</a>44  <header class="topnav">45    <div class="container topnav-inner">46      <a class="brand" href="/" aria-label="SPB Git home">47        <svg class="brand-mark" width="28" height="28" viewBox="0 0 28 28" aria-hidden="true">48          <rect width="28" height="28" rx="7" fill="var(--accent)"/>49          <path d="M8 18.5c1 1.4 2.7 2.2 4.6 2.2 2.6 0 4.4-1.3 4.4-3.3 0-1.8-1.2-2.7-3.6-3.3l-1.6-.4c-1.4-.4-2-.9-2-1.8 0-1.1 1-1.8 2.5-1.8 1.4 0 2.5.6 3.2 1.7l1.9-1.3c-1-1.6-2.8-2.5-5-2.5C10 8 8.2 9.4 8.2 11.4c0 1.9 1.2 2.8 3.4 3.3l1.7.4c1.5.4 2.1.9 2.1 1.8 0 1.1-1.1 1.8-2.7 1.8-1.6 0-2.9-.7-3.7-2z" fill="#fff"/>50        </svg>51        <span class="brand-name">SPB Git</span>52      </a>53      <form class="global-search" action="/search" method="get" role="search">54        <input type="search" name="q" id="global-search" placeholder="Search repositories…  ( / )"55               value="{{ q | default('') }}" autocomplete="off" aria-label="Search repositories">56      </form>57      <nav class="topnav-links" aria-label="Site">58        <button id="theme-toggle" class="icon-btn" type="button" aria-label="Toggle color theme" title="Toggle theme">59          <svg class="icon-sun" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-1 0v-1A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-1 0v-1A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1 0-1h1a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1 0-1h1A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-.707.708a.5.5 0 0 1-.708-.708l.707-.707a.5.5 0 0 1 .708 0zm-9.9 9.9a.5.5 0 0 1 0 .707l-.707.707a.5.5 0 0 1-.707-.707l.707-.707a.5.5 0 0 1 .707 0zm9.9 1.414a.5.5 0 0 1-.707 0l-.708-.707a.5.5 0 0 1 .708-.707l.707.707a.5.5 0 0 1 0 .707zm-9.9-9.9a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l.708.707a.5.5 0 0 1 0 .707z"/></svg>60          <svg class="icon-moon" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M6 .278a.77.77 0 0 1 .08.858 7.2 7.2 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.79.79 0 0 1 .81.316.73.73 0 0 1-.031.893A8.35 8.35 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.75.75 0 0 1 6 .278z"/></svg>61        </button>62        <a class="topnav-ext" href="https://spboucher.ai" rel="noopener">spboucher.ai</a>63      </nav>64    </div>65  </header>66  <main id="main" class="container">67    {% block content %}{% endblock %}68  </main>69  <footer class="footer">70    <div class="container">71      © {{ owner.name }} · <a href="mailto:{{ owner.email }}">{{ owner.email }}</a> · Powered by SPB Git72    </div>73  </footer>74  <script src="/assets/js/app.js" defer></script>75</body>76</html>77