spb/spbgit Public MIT
SPB Git — the platform hosting itself
JavaScript 73.9%
CSS 11.7%
Nunjucks 11.6%
Shell 2.7%
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