]> git.zndr.dk Git - zndr-11ty.git/commitdiff
New theme
authorJannik ZANDER <jzander@grundfos.com>
Mon, 8 Sep 2025 18:40:32 +0000 (20:40 +0200)
committerJannik ZANDER <jzander@grundfos.com>
Mon, 8 Sep 2025 18:40:32 +0000 (20:40 +0200)
16 files changed:
site/_includes/layouts/base.njk
site/assets/styles.css
site/public/app-icon.png [new file with mode: 0644]
site/public/apple-touch-icon.png [new file with mode: 0644]
site/public/favicon-16.png [new file with mode: 0644]
site/public/favicon-24.png [new file with mode: 0644]
site/public/favicon-32.png [new file with mode: 0644]
site/public/favicon-48.png [new file with mode: 0644]
site/public/favicon-64.png [new file with mode: 0644]
site/public/favicon.ico [new file with mode: 0644]
site/public/favicon.png [new file with mode: 0644]
site/public/favicon.svg
site/public/icon-192.png [new file with mode: 0644]
site/public/icon-512.png [new file with mode: 0644]
site/public/zndr.png [deleted file]
site/public/zndr.svg [new file with mode: 0644]

index 3692b47e8654eb9361ba05619670fa66e476fbbd..25d49dc738a8365dcd04e39e59b7deee3fa960b8 100644 (file)
@@ -4,22 +4,35 @@
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
   <title>{{ title or 'zndr.dk' }}</title>
-  <meta name="description" content="Minimal start page with quick links to my selfhosted services." />
+  <meta name="description" content="Minimal start page with quick links to my self-hosted services." />
   <meta name="color-scheme" content="light dark" />
-  <meta name="theme-color" content="#111111" />
-  <link rel="icon" href="/zndr.png">
+
+  <!-- Theme color per mode -->
+  <meta name="theme-color" content="#1a1b1e" media="(prefers-color-scheme: dark)">
+  <meta name="theme-color" content="#f7f7f8" media="(prefers-color-scheme: light)">
+
+  <!-- LOAD YOUR CSS -->
   <link rel="stylesheet" href="/assets/styles.css">
+
+  <!-- Favicons -->
+  <link rel="icon" href="/zndr.svg" type="image/svg+xml">
+  <link rel="icon" href="/favicon.png" sizes="32x32">
+  <link rel="icon" href="/favicon.ico" sizes="any">
+  <link rel="apple-touch-icon" href="/apple-touch-icon.png">
+  <link rel="manifest" href="/site.webmanifest">
 </head>
 <body>
   <div class="container">
     <header>
       <a class="brand" href="/" aria-label="Home">
-       <span class="logo" aria-hidden="true">
-          <img src="/zndr.png" alt="" style="width:22px;height:22px;" />
+        <span class="logo">
+          <span class="logo-core">
+            <span class="logo-text">ZN<br>DR</span>
+          </span>
         </span>
         <div>
           <div class="title">zndr.dk</div>
-          <div class="subtitle">Selfhosted services • Denmark</div>
+          <div class="subtitle">Self-hosted services • Denmark</div>
         </div>
       </a>
     </header>
@@ -27,7 +40,7 @@
     {{ content | safe }}
 
     <footer>
-      <div>© {{ "" | year }} Jannik • Tange</div>
+      <div>© 2025 Jannik • Tange</div>
       <div class="foot-links">
         <a href="/pgp.txt">PGP</a>
         <a href="/keys.txt">SSH Keys</a>
@@ -38,7 +51,7 @@
 
   <script>
     // Slash to focus any #filter found on page
-    window.addEventListener('keydown', (e) => {
+    addEventListener('keydown', (e) => {
       const f = document.getElementById('filter');
       if (!f) return;
       if (e.key === '/' && document.activeElement !== f) { e.preventDefault(); f.focus(); }
index 225b16135baf5f627814ccf9d174ec70978265bf..f3c4ad0a6de944fb074095311f616e085c12e023 100644 (file)
-/* === zndr.dk — full theme & layout === */
-
-/* --- Dark mode defaults (base palette) --- */
-:root {
-  --bg: #0b0f1a;        /* page background */
-  --card: #111827;      /* card background */
-  --fg: #e5e7eb;        /* primary text */
-  --muted: #9aa4b2;     /* secondary text */
-  --ring: #243244;      /* borders / outlines */
-  --accent: #60a5fa;    /* interactive accents (hover, focus) */
-  --accent-strong: #3b82f6;
-  --shadow: rgba(0,0,0,0.45);
+/* === zndr.dk — (dark-first) === */
+
+/* ---------- Dark mode (defaults) ---------- */
+:root{
+  --bg:#1a1b1e;          /* page background */
+  --panel:#2a2b32;       /* cards / input panels */
+  --fg:#e6e6e6;          /* primary text */
+  --muted:#9ca3af;       /* secondary text */
+  --ring:#3a3b45;        /* borders */
+  --accent:#10a37f;      /* green */
+  --accent-strong:#059669;
+  --accent-alt:#ef4444;  /* red */
+  --shadow:rgba(0,0,0,.5);
 }
 
-/* Global */
-* { box-sizing: border-box; }
-html, body { height: 100%; }
-body {
-  margin: 0;
-  font: 16px/1.6 system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
-  color: var(--fg);
-  background: var(--bg);
+*{box-sizing:border-box}
+html,body{height:100%}
+body{
+  margin:0;
+  font:16px/1.6 system-ui,-apple-system,"Segoe UI",Roboto,Ubuntu,Cantarell,"Noto Sans",Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji";
+  background:var(--bg);
+  color:var(--fg);
 }
 
 /* Layout */
-.container { max-width: 1100px; margin: 0 auto; padding: 32px 20px 48px; }
-header { display:flex; align-items:center; justify-content:space-between; gap:16px; margin-bottom: 28px; }
-.brand { display:flex; align-items:center; gap:12px; text-decoration:none; color: inherit; }
-.logo { width:36px; height:36px; border-radius:10px; background:#0f172a; display:grid; place-items:center; box-shadow: 0 8px 24px var(--shadow); }
-.logo svg { width:22px; height:22px; fill:#fff; }
-.title { font-weight:700; letter-spacing:.2px; }
-.subtitle { color:var(--muted); font-size:.95rem; }
+.container{max-width:1100px;margin:0 auto;padding:32px 20px 48px}
+header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:28px}
+.brand{display:flex;align-items:center;gap:12px;text-decoration:none;color:inherit}
+.title{font-weight:700;letter-spacing:.2px}
+.subtitle{color:var(--muted);font-size:.95rem}
+
+/* Gradient logo box (green→red) with white stacked text */
+.logo{
+  --g1:var(--accent);
+  --g2:var(--accent-alt);
+  width:36px;height:36px;
+  border-radius:8px;
+  background:linear-gradient(135deg,var(--g1),var(--g2));
+  display:inline-grid;place-items:center;
+  box-shadow:0 4px 12px rgba(16,163,127,.25),0 0 6px rgba(239,68,68,.15);
+}
+.logo-core{width:100%;height:100%;border-radius:6px;display:grid;place-items:center}
+.logo-text{font-weight:700;font-size:.78rem;letter-spacing:.4px;line-height:1.05;color:#fff;text-align:center}
 
 /* Search */
-.search { width:100%; margin:18px 0 24px; }
-.search input {
+.search{width:100%;margin:18px 0 24px}
+.search input{
   width:100%;
   padding:12px 14px;
   border-radius:12px;
   border:1px solid var(--ring);
-  background:#0f172a;
+  background:var(--panel);
   color:var(--fg);
   outline:none;
+  box-shadow:inset 0 1px 3px rgba(0,0,0,.6);
 }
-.search input:focus {
+.search input::placeholder{color:color-mix(in oklab,var(--muted) 85%, transparent)}
+.search input:focus{
   border-color:var(--accent);
-  box-shadow:0 0 0 3px color-mix(in oklab, var(--accent) 25%, transparent);
+  box-shadow:0 0 0 2px rgba(16,163,127,.40), inset 0 1px 3px rgba(0,0,0,.6);
 }
 
 /* Grid + Cards */
-.grid { display:grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap:14px; }
-
-.card {
+.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
+.card{
   position:relative;
-  border-radius:14px;
-  background:var(--card);
+  border-radius:10px;
+  background:var(--panel);
   border:1px solid var(--ring);
   padding:16px 14px 14px;
   text-decoration:none;
   color:inherit;
-  transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
-  box-shadow:0 8px 24px var(--shadow);
+  box-shadow:none;
+  transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease;
 }
-.card h3 { margin:0 0 6px; font-size:1.05rem; color:var(--fg); }
-.card p  { margin:0; font-size:.95rem; color:var(--muted); }
-
-/* Dark-mode hover with stronger glow */
-.card:hover {
-  transform: translateY(-2px);
-  border-color: var(--accent);
+.card:hover{
+  transform:translateY(-1px);
+  border-color:var(--accent);
   box-shadow:
-    0 6px 14px rgba(0,0,0,0.7),
-    0 0 18px color-mix(in oklab, var(--accent) 90%, transparent);
+    0 0 12px rgba(16,163,127,.25),  /* green glow */
+    0 0 6px rgba(239,68,68,.20);    /* red glow */
 }
 
-/* Chip (top-right badge) */
-.chip {
-  position:absolute; top:10px; right:10px;
+/* Titles and descriptions (single-line clamp) */
+.card h3{
+  margin:0 0 6px;
+  font-size:1.05rem;
+  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
+}
+.card p{
+  margin:0;
+  font-size:.95rem;
+  color:var(--muted);
+  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;overflow:hidden;
+}
+
+/* Badge (Public/Home/etc.) with gradient fill */
+.chip{
+  position:absolute;top:10px;right:10px;
   font-size:.75rem;
-  border:1px solid var(--ring);
-  padding:.1rem .5rem;
+  padding:.12rem .5rem;
   border-radius:999px;
-  color: color-mix(in oklab, var(--fg) 80%, #fff 0%);
-  background:#0f172a; /* ok for dark; overridden in light block below */
+  background:linear-gradient(135deg,var(--accent) 0%,var(--accent-alt) 100%);
+  color:#fff;
+  border:none;
 }
 
-/* Links in footer/content */
-a { color:var(--accent); }
-a:hover { color:var(--accent-strong); }
+/* Static dim for LAN-only / offline (stripe overlay FIXED) */
+.card.is-lan,.card.is-offline{opacity:.85;position:relative}
+.card.is-lan::after,.card.is-offline::after{
+  content:'';                      /* REQUIRED */
+  position:absolute; inset:0;      /* REQUIRED */
+  pointer-events:none;
+  border-radius:10px;
+  background:repeating-linear-gradient(
+    45deg,
+    transparent 0 6px,
+    rgba(16,163,127,.08) 6px 9px,
+    rgba(239,68,68,.08) 9px 12px
+  );
+}
+
+/* Links */
+a{color:var(--accent)}
+a:hover{color:var(--accent-strong)}
 
 /* Footer */
-footer {
-  margin-top:36px; display:flex; gap:12px; flex-wrap:wrap;
-  align-items:center; justify-content:space-between;
-  color:var(--muted); font-size:.9rem;
+footer{
+  margin-top:36px;display:flex;gap:12px;flex-wrap:wrap;
+  align-items:center;justify-content:space-between;
+  color:var(--muted);font-size:.9rem;
 }
-.foot-links { display:flex; gap:12px; flex-wrap:wrap; }
-.foot-links a { color:inherit; text-decoration:none; border-bottom:1px dashed var(--ring); }
-.foot-links a:hover { color:var(--fg); border-bottom-color:var(--accent); }
+.foot-links{display:flex;gap:12px;flex-wrap:wrap}
+.foot-links a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--ring)}
+.foot-links a:hover{color:var(--fg);border-bottom-color:var(--accent)}
 
-/* Focus-visible for keyboard users */
-:where(a, input).focus-visible, :where(a, input):focus-visible {
+/* Keyboard focus */
+:where(a,input).focus-visible,:where(a,input):focus-visible{
   outline:3px solid var(--accent);
   outline-offset:2px;
   border-radius:10px;
 }
 
-/* Static dim style for LAN-only cards (no JS needed) */
-.card.is-lan,
-.card.is-offline {
-  opacity:0.82; /* readable but visibly dimmed */
-  position:relative;
-}
-.card.is-lan::after,
-.card.is-offline::after {
-  content:'';
-  position:absolute; inset:0; pointer-events:none;
-  background: repeating-linear-gradient(45deg, transparent 0 6px, rgba(255,255,255,0.04) 6px 12px);
-  border-radius:14px;
-}
-
-/* --- Light mode overrides all in one place --- */
-@media (prefers-color-scheme: light) {
-  :root {
-    --bg:#f6f7fb;
-    --card:#ffffff;
+/* ---------- Light mode ---------- */
+@media (prefers-color-scheme: light){
+  :root{
+    --bg:#f7f7f8;
+    --panel:#ffffff;
     --fg:#0f172a;
-    --muted:#475569;
-    --ring:#cbd5e1;
-    --accent:#2563eb;
-    --accent-strong:#1d4ed8;
-    --shadow: rgba(2, 6, 23, .18);
+    --muted:#4b5563;
+    --ring:#e5e7eb;
+    --accent:#10a37f;     /* keep brand green */
+    --accent-strong:#0b8a6c;
+    --shadow:rgba(2,6,23,.12);
   }
 
-  .search input { background:#ffffff; }
+  /* keep gradient logo in light mode too (don’t override background) */
+  .logo{box-shadow:0 6px 16px rgba(2,6,23,.10), 0 0 6px rgba(239,68,68,.12)}
 
-  /* Make chip readable in light */
-  .chip {
-    background:#eef2f7;
-    color:#0f172a;
-    border-color:#cbd5e1;
+  .search input{
+    background:var(--panel);
+    border:1px solid var(--ring);
+    box-shadow:inset 0 1px 2px rgba(0,0,0,.06);
   }
-
-  /* Lighten logo box in light (or set to transparent if you prefer) */
-  .logo {
-    background:#e2e8f0;
-    box-shadow:0 6px 16px rgba(2, 6, 23, 0.10);
+  .search input:focus{
+    box-shadow:0 0 0 2px rgba(16,163,127,.3), inset 0 1px 2px rgba(0,0,0,.06);
   }
 
-  /* Softer hover shadows in light mode */
-  .card:hover {
-    box-shadow:
-      0 6px 12px rgba(0,0,0,0.15),
-      0 0 6px rgba(0,0,0,0.05);
-  }
+  .card{background:var(--panel);border:1px solid var(--ring);box-shadow:none}
+  .card:hover{box-shadow:0 4px 10px rgba(0,0,0,.10)}
 
-  /* Lighter stripe for dimmed cards on light bg */
-  .card.is-lan::after,
-  .card.is-offline::after {
-    background: repeating-linear-gradient(45deg, transparent 0 6px, rgba(0,0,0,0.03) 6px 12px);
+  /* If you prefer a neutral chip in light mode, uncomment:
+  .chip{background:#eef2f7;color:#0f172a;border:1px solid #dfe3ea}
+  */
+
+  .card.is-lan::after,.card.is-offline::after{
+    background:repeating-linear-gradient(45deg,transparent 0 6px, rgba(0,0,0,.03) 6px 12px);
   }
 }
-
diff --git a/site/public/app-icon.png b/site/public/app-icon.png
new file mode 100644 (file)
index 0000000..b27ae0d
Binary files /dev/null and b/site/public/app-icon.png differ
diff --git a/site/public/apple-touch-icon.png b/site/public/apple-touch-icon.png
new file mode 100644 (file)
index 0000000..3fd5a7e
Binary files /dev/null and b/site/public/apple-touch-icon.png differ
diff --git a/site/public/favicon-16.png b/site/public/favicon-16.png
new file mode 100644 (file)
index 0000000..3be8ac6
Binary files /dev/null and b/site/public/favicon-16.png differ
diff --git a/site/public/favicon-24.png b/site/public/favicon-24.png
new file mode 100644 (file)
index 0000000..93561b7
Binary files /dev/null and b/site/public/favicon-24.png differ
diff --git a/site/public/favicon-32.png b/site/public/favicon-32.png
new file mode 100644 (file)
index 0000000..6d954ef
Binary files /dev/null and b/site/public/favicon-32.png differ
diff --git a/site/public/favicon-48.png b/site/public/favicon-48.png
new file mode 100644 (file)
index 0000000..6330e91
Binary files /dev/null and b/site/public/favicon-48.png differ
diff --git a/site/public/favicon-64.png b/site/public/favicon-64.png
new file mode 100644 (file)
index 0000000..a5f4036
Binary files /dev/null and b/site/public/favicon-64.png differ
diff --git a/site/public/favicon.ico b/site/public/favicon.ico
new file mode 100644 (file)
index 0000000..6709ee4
Binary files /dev/null and b/site/public/favicon.ico differ
diff --git a/site/public/favicon.png b/site/public/favicon.png
new file mode 100644 (file)
index 0000000..6d954ef
Binary files /dev/null and b/site/public/favicon.png differ
index c64a480e1232e4a87466bc41b37a935338d9d248..4dac8706d4f4c011ba9f66e07db068094f212cf1 100644 (file)
@@ -1 +1,27 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100" height="100" rx="20" fill="#000"/><path d="M22 70 L50 20 L78 70 Z" fill="#fff"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
+  <defs>
+    <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
+      <stop offset="0%" stop-color="#10a37f"/>
+      <stop offset="100%" stop-color="#ef4444"/>
+    </linearGradient>
+  </defs>
+
+  <!-- Rounded gradient background -->
+  <rect width="64" height="64" rx="12" fill="url(#grad)" />
+
+  <!-- Larger stacked white text, visually centered -->
+  <text x="50%" y="44%" text-anchor="middle"
+        font-family="system-ui, sans-serif"
+        font-weight="700"
+        font-size="26"
+        fill="#ffffff">
+    ZN
+  </text>
+  <text x="50%" y="84%" text-anchor="middle"
+        font-family="system-ui, sans-serif"
+        font-weight="700"
+        font-size="26"
+        fill="#ffffff">
+    DR
+  </text>
+</svg>
diff --git a/site/public/icon-192.png b/site/public/icon-192.png
new file mode 100644 (file)
index 0000000..74a2165
Binary files /dev/null and b/site/public/icon-192.png differ
diff --git a/site/public/icon-512.png b/site/public/icon-512.png
new file mode 100644 (file)
index 0000000..5a1a784
Binary files /dev/null and b/site/public/icon-512.png differ
diff --git a/site/public/zndr.png b/site/public/zndr.png
deleted file mode 100644 (file)
index 9b36921..0000000
Binary files a/site/public/zndr.png and /dev/null differ
diff --git a/site/public/zndr.svg b/site/public/zndr.svg
new file mode 100644 (file)
index 0000000..413bca0
--- /dev/null
@@ -0,0 +1,25 @@
+<!-- zndr.svg — 64x64, white "ZN/DR", green→red gradient, tuned vertical centering -->
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
+  <defs>
+    <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
+      <stop offset="0%"  stop-color="#10a37f"/>
+      <stop offset="100%" stop-color="#ef4444"/>
+    </linearGradient>
+  </defs>
+
+  <!-- Rounded gradient background -->
+  <rect width="64" height="64" rx="12" fill="url(#grad)"/>
+
+  <!-- White stacked text (visually centered) -->
+  <text x="50%" y="44%" text-anchor="middle"
+        font-family="system-ui, sans-serif"
+        font-weight="700"
+        font-size="26"
+        fill="#ffffff">ZN</text>
+  <text x="50%" y="84%" text-anchor="middle"
+        font-family="system-ui, sans-serif"
+        font-weight="700"
+        font-size="26"
+        fill="#ffffff">DR</text>
+</svg>
+