🔒 Repository is read-only – file editing is disabled.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
<!DOCTYPE html>
<html lang="{{ lang }}">
<head>
<meta charset="UTF-8">
<script>
/* Motyw przed pierwszym renderem – cookie wspólne dla *.paganlinux.eu */
(function () {
try {
var m = (document.cookie.match(/(?:^|; )pag_theme=([^;]+)/) || [])[1]
|| localStorage.getItem('pag_theme') || 'dark';
if (m === 'light') { document.documentElement.setAttribute('data-theme', 'light'); }
} catch (e) {}
})();
</script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{% block title %}PaganLinux Mokosz{% endblock %}</title>
<link rel="stylesheet" href="/static/css/style.css?v=11">
<link rel="icon" type="image/svg+xml" href="/static/pagan-loki-pingwin.svg">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta property="og:site_name" content="PaganOS">
<meta property="og:type" content="website">
<meta property="og:title" content="{% block og_title %}PaganOS Linux – Polska Niezależna Dystrybucja Linux | PaganLinux{% endblock %}">
<meta property="og:description" content="{% block og_description %}Polska, niezależna dystrybucja Linux budowana od podstaw. Własne repozytorium, system buildów i dokumentacja.{% endblock %}">
<meta property="og:url" content="{{ request.url }}">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ self.og_title() }}">
<meta name="twitter:description" content="{{ self.og_description() }}">
<meta name="twitter:image" content="https://paganlinux.eu/static/pagan-loki-pingwin.png">
<meta name="description" content="{% block meta_description %}PaganOS (PaganLinux) – polska, niezależna dystrybucja Linux budowana od podstaw. Własne repozytorium pakietów, system buildów i dokumentacja.{% endblock %}">
<meta name="keywords" content="PaganOS, PaganLinux, Pagan Linux, polska dystrybucja Linux, niezależna dystrybucja Linux, dystrybucja Linux, polski system operacyjny, open source">
<meta name="robots" content="index, follow">
<meta name="author" content="Pagan Linux Community">
<link rel="canonical" href="{% block canonical %}{{ request.url.split('?')[0] }}{% endblock %}">
<meta property="og:image" content="https://paganlinux.eu/static/pagan-loki-pingwin.png">
<meta property="og:locale" content="{{ 'pl_PL' if lang == 'pl' else 'en_US' }}">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "PaganOS Linux",
"alternateName": "PaganLinux",
"url": "https://paganlinux.eu/",
"description": "Polska niezależna dystrybucja Linux – PaganOS (PaganLinux). Własne repozytorium, system buildów, dokumentacja.",
"inLanguage": ["pl", "en"]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "PaganOS Linux",
"alternateName": "PaganLinux",
"url": "https://paganlinux.eu/",
"logo": "https://paganlinux.eu/static/pagan-loki-pingwin.png"
}
</script>
<style>
input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]),
textarea,select{background:var(--bg);border:1px solid var(--border);color:var(--text-bright);border-radius:var(--radius-sm);padding:0.45rem 0.6rem;font-size:0.88rem;font-family:inherit}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
textarea{font-family:var(--mono);resize:vertical}
</style>
{% block head %}{% endblock %}
</head>
<body>
<nav class="topnav">
<div class="nav-inner">
<a href="https://paganlinux.eu" class="logo"><img src="/static/pagan-loki-pingwin.svg" class="logo-img" alt="PaganOS" width="30" height="30"> PaganOS</a>
<div class="nav-links">
<a href="{{ section_url('git') }}" class="{% if section=='git' %}active{% endif %}"> {{ t('git') }}</a>
<a href="{{ section_url('repo') }}" class="{% if section=='repo' %}active{% endif %}"> {{ t('repo') }}</a>
<a href="{{ section_url('build') }}" class="{% if section=='build' %}active{% endif %}"> {{ t('build') }}</a>
<a href="{{ section_url('docs') }}" class="{% if section=='docs' %}active{% endif %}"> {{ t('docs') }}</a>
<a href="https://paganlinux.eu/submit-recipe" class="{% if request.path=='/submit-recipe' %}active{% endif %}"> {{ t('add_pkg') }}</a>
<a href="https://paganlinux.eu/status" class="{% if request.path=='/status' %}active{% endif %}"> {{ t('status_title') }}</a>
</div>
<div class="nav-user">
<button type="button" class="theme-btn" data-theme-btn title="Przełącz motyw jasny/ciemny" aria-label="Przełącz motyw"><svg class="tb tb-sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4m11.4-11.4 1.4-1.4"/></svg><svg class="tb tb-moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg></button>
<a href="https://paganlinux.eu/set-lang/{{ lang_switch() }}?next={{ request.url }}" class="nav-lang" title="{{ 'English' if lang_switch()=='pl' else 'Polski' }}"><span class="flg" data-lang="{{ 'pl' if lang_switch()=='pl' else 'en' }}"></span></a>
{% if username %}
{% if is_admin %}<a href="/admin" class="nav-admin" title="Admin" aria-label="Panel admina"><svg class="i16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3"/><path d="M1 14h6M9 8h6M17 16h6"/></svg></a>{% endif %}
<a href="/profile" class="nav-profile"> {{ username }}</a>
<a href="/logout" class="nav-logout">{{ t('logout_btn') }}</a>
{% else %}
<a href="/login" class="btn btn-sm btn-ghost nav-login">{{ t('login_btn') }}</a>
{% endif %}
<button class="nav-toggle" id="navToggle" aria-label="Menu" aria-expanded="false" aria-controls="navMobile">
<span></span><span></span><span></span>
</button>
</div>
</div>
<div class="nav-mobile" id="navMobile">
<div class="nm-top">
<button type="button" class="theme-btn nm-theme" data-theme-btn title="Przełącz motyw jasny/ciemny" aria-label="Przełącz motyw"><svg class="tb tb-sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4m11.4-11.4 1.4-1.4"/></svg><svg class="tb tb-moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg></button>
<a href="https://paganlinux.eu/set-lang/{{ lang_switch() }}?next={{ request.url }}" class="nm-lang"><span class="flg" data-lang="{{ 'pl' if lang_switch()=='pl' else 'en' }}"></span> {{ 'Polski' if lang_switch()=='pl' else 'English' }}</a>
</div>
<nav class="nm-group" aria-label="Sekcje">
<a href="{{ section_url('git') }}" class="nm-link {% if section=='git' %}active{% endif %}"> {{ t('git') }}</a>
<a href="{{ section_url('repo') }}" class="nm-link {% if section=='repo' %}active{% endif %}"> {{ t('repo') }}</a>
<a href="{{ section_url('build') }}" class="nm-link {% if section=='build' %}active{% endif %}"> {{ t('build') }}</a>
<a href="{{ section_url('docs') }}" class="nm-link {% if section=='docs' %}active{% endif %}"> {{ t('docs') }}</a>
<a href="https://paganlinux.eu/submit-recipe" class="nm-link {% if request.path=='/submit-recipe' %}active{% endif %}"> {{ t('add_pkg') }}</a>
<a href="https://paganlinux.eu/status" class="nm-link {% if request.path=='/status' %}active{% endif %}"> {{ t('status_title') }}</a>
</nav>
<div class="nm-user">
{% if username %}
{% if is_admin %}<a href="/admin"> Admin</a>{% endif %}
<a href="/profile"> {{ username }}</a>
<a href="/logout" style="background:transparent;color:var(--muted)">{{ t('logout_btn') }}</a>
{% else %}
<a href="/login" class="nm-cta">{{ t('login_btn') }}</a>
{% endif %}
</div>
</div>
</nav>
{% with msgs = get_flashed_messages(with_categories=true) %}
{% if msgs %}<div class="flash-container">{% for cat, msg in msgs %}<div class="flash flash-{{ cat }}">{{ msg }}</div>{% endfor %}</div>{% endif %}
{% endwith %}
<main class="content">{% block content %}{% endblock %}</main>
<footer class="site-footer">
<div class="footer-inner">
<div>
<h4 style="display:flex;align-items:center;gap:0.5rem"><img src="/static/pagan-loki-pingwin.svg" alt="PaganOS" class="footer-logo"> PaganOS</h4>
<p>{{ t('footer_about') }}</p>
</div>
<div>
<h4>{{ t('footer_links') }}</h4>
<a href="https://paganlinux.eu/download">⬇ {{ t('footer_dl') }}</a>
<a href="https://repo.paganlinux.eu/"> {{ t('footer_repo') }}</a>
<a href="https://git.paganlinux.eu/"> {{ t('footer_source') }}</a>
<a href="https://docs.paganlinux.eu/"> {{ t('footer_docs') }}</a>
</div>
<div>
<h4>{{ t('footer_community') }}</h4>
<a href="https://paganlinux.eu/submit-recipe"> {{ t('footer_suggest') }}</a>
<a href="https://paganlinux.eu/about">{{ t('footer_about_link') }}</a>
<a href="https://paganlinux.eu/translate"> {{ t('translate_nav') }}</a>
</div>
<div class="footer-bottom">
© {{ now().year if now else '2026' }} {{ t('footer_copy') }}
</div>
</div>
</footer>
<script>
(function() {
// ── Motyw jasny/ciemny ──
function applyThemeIcons() {
var light = document.documentElement.getAttribute('data-theme') === 'light';
document.querySelectorAll('[data-theme-btn]').forEach(function (b) {
b.setAttribute('title', light ? 'Przełącz na ciemny' : 'Przełącz na jasny');
});
}
function setTheme(mode) {
if (mode === 'light') { document.documentElement.setAttribute('data-theme', 'light'); }
else { document.documentElement.removeAttribute('data-theme'); }
try {
var c = 'pag_theme=' + mode + '; max-age=31536000; path=/; SameSite=Lax';
if (location.hostname.indexOf('paganlinux.eu') > -1) { c += '; Domain=.paganlinux.eu'; }
document.cookie = c;
localStorage.setItem('pag_theme', mode);
} catch (e) {}
applyThemeIcons();
}
document.querySelectorAll('[data-theme-btn]').forEach(function (btn) {
btn.addEventListener('click', function () {
var next = document.documentElement.getAttribute('data-theme') === 'light' ? 'dark' : 'light';
setTheme(next);
});
});
applyThemeIcons();
// ── Burger menu (mobile) ──
var toggle = document.getElementById('navToggle');
var panel = document.getElementById('navMobile');
if (toggle && panel) {
function closeMenu() {
toggle.classList.remove('open');
toggle.setAttribute('aria-expanded', 'false');
panel.classList.remove('open');
}
toggle.addEventListener('click', function(e) {
e.stopPropagation();
var open = panel.classList.toggle('open');
toggle.classList.toggle('open', open);
toggle.setAttribute('aria-expanded', open? 'true' : 'false');
});
panel.querySelectorAll('a').forEach(function(a) {
a.addEventListener('click', closeMenu);
});
document.addEventListener('click', function(e) {
if (!panel.contains(e.target) && !toggle.contains(e.target)) closeMenu();
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeMenu();
});
}
})();
</script>
<!-- Informacja o cookies (tylko niezbędne – sesja/CSRF, brak śledzenia) -->
<style>
#cookie-bar{position:fixed;left:12px;right:12px;bottom:12px;z-index:9999;max-width:820px;margin:0 auto;background:var(--card,#161b22);border:1px solid var(--border,#2d333b);border-radius:10px;padding:14px 16px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;box-shadow:0 8px 30px rgba(0,0,0,.45);font-size:.85rem;line-height:1.45}
#cookie-bar p{margin:0;flex:1;min-width:240px}
#cookie-bar a{color:var(--accent,#58a6ff);text-decoration:underline}
#cookie-bar button{background:var(--accent,#58a6ff);color:#06121f;border:0;padding:8px 16px;border-radius:8px;font-weight:700;cursor:pointer;font-size:.82rem}
#cookie-bar button:hover{filter:brightness(1.1)}
#cookie-link{position:fixed;left:12px;bottom:12px;z-index:9998;font-size:.7rem;opacity:.55;background:var(--card,#161b22);border:1px solid var(--border,#2d333b);color:var(--muted,#8b949e);padding:4px 10px;border-radius:99px;text-decoration:none}
#cookie-link:hover{opacity:1;color:var(--text,#e6edf3)}
</style>
<div id="cookie-bar" role="region" aria-label="Informacja o plikach cookie">
<p> Ta strona używa wyłącznie <b>niezbędnych plików cookie</b> (sesja logowania i ochrona CSRF w panelach).
Nie używamy cookie analitycznych, reklamowych ani śledzących.
<a href="https://paganlinux.eu/cookies">Polityka cookies</a></p>
<button type="button" onclick="document.cookie='pag_cookie_consent=1;max-age=31536000;path=/;SameSite=Lax';document.getElementById('cookie-bar').style.display='none';document.getElementById('cookie-link').style.display='inline-block'">Akceptuję</button>
</div>
<a id="cookie-link" href="https://paganlinux.eu/cookies" style="display:none" title="Polityka cookies"> Cookies</a>
<script>
(function(){
if(document.cookie.indexOf('pag_cookie_consent=1')>-1){
var b=document.getElementById('cookie-bar'); if(b) b.style.display='none';
var l=document.getElementById('cookie-link'); if(l) l.style.display='inline-block';
}
})();
</script>
<!-- Mermaid – diagramy w Markdown (```mermaid / graph TD).
Skrypt ładuje się TYLKO gdy strona ma element .mermaid (oszczędza ~3 MB).
CSP (script-src) już dopuszcza https://unpkg.com. -->
<style>
.markdown-body pre.mermaid, .mermaid{background:transparent;border:0;text-align:center;margin:1rem 0;overflow-x:auto}
.mermaid svg{max-width:100%;height:auto}
</style>
<script>
(function(){
if(!document.querySelector('.mermaid')) return;
var s=document.createElement('script');
s.src='https://unpkg.com/mermaid@11/dist/mermaid.min.js';
s.onload=function(){
try{
var dark=document.documentElement.getAttribute('data-theme')!=='light';
window.mermaid.initialize({startOnLoad:false,securityLevel:'strict',theme:dark?'dark':'default'});
window.mermaid.run();
}catch(e){}
};
s.onerror=function(){}; /* brak CDN → zostaje surowy blok kodu */
document.head.appendChild(s);
})();
</script>
</body>
</html>