2026-04-15 15:03:15 +02:00
|
|
|
|
<script lang="ts">
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
import { onMount } from 'svelte';
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
import { page } from '$app/state';
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
import { bootstrapReadRelays } from '$lib/stores/readRelays';
|
2026-04-21 14:00:26 +02:00
|
|
|
|
import { initI18n, t } from '$lib/i18n';
|
|
|
|
|
|
import LanguageSwitcher from '$lib/components/LanguageSwitcher.svelte';
|
2026-04-18 16:19:21 +02:00
|
|
|
|
import CcZeroBadge from '$lib/components/CcZeroBadge.svelte';
|
2026-04-15 15:03:15 +02:00
|
|
|
|
|
2026-04-21 14:00:26 +02:00
|
|
|
|
initI18n();
|
|
|
|
|
|
|
2026-04-15 15:03:15 +02:00
|
|
|
|
let { children } = $props();
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
// Normalisierter pfad ohne trailing slash für aktiv-erkennung ("/" bleibt "/")
|
|
|
|
|
|
const currentPath = $derived((page.url?.pathname ?? '/').replace(/\/$/, '') || '/');
|
|
|
|
|
|
|
|
|
|
|
|
function isActive(path: string): boolean {
|
|
|
|
|
|
const normalized = path.replace(/\/$/, '') || '/';
|
|
|
|
|
|
return currentPath === normalized;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
onMount(() => {
|
|
|
|
|
|
bootstrapReadRelays();
|
|
|
|
|
|
});
|
2026-04-15 15:03:15 +02:00
|
|
|
|
</script>
|
|
|
|
|
|
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
<!-- favicon-Tags liegen in src/app.html — hier nichts nötig. -->
|
|
|
|
|
|
|
|
|
|
|
|
<header class="site-header">
|
|
|
|
|
|
<div class="header-inner">
|
2026-04-21 14:00:26 +02:00
|
|
|
|
<a href="/" class="brand" aria-label={$t('nav.brand_aria')}>Jörg Lohrer</a>
|
|
|
|
|
|
<nav aria-label={$t('nav.brand_aria')}>
|
|
|
|
|
|
<a href="/" class:active={isActive('/')}>{$t('nav.home')}</a>
|
|
|
|
|
|
<a href="/archiv/" class:active={isActive('/archiv/')}>{$t('nav.archive')}</a>
|
|
|
|
|
|
<a href="/impressum/" class:active={isActive('/impressum/')}>{$t('nav.imprint')}</a>
|
|
|
|
|
|
<LanguageSwitcher />
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
</nav>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</header>
|
2026-04-15 15:03:15 +02:00
|
|
|
|
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
<main>
|
|
|
|
|
|
{@render children()}
|
|
|
|
|
|
</main>
|
|
|
|
|
|
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
<footer class="site-footer">
|
|
|
|
|
|
<div class="footer-inner">
|
2026-04-18 16:19:21 +02:00
|
|
|
|
<span class="footer-license">
|
|
|
|
|
|
<a
|
|
|
|
|
|
href="https://creativecommons.org/publicdomain/zero/1.0/deed.de"
|
|
|
|
|
|
target="_blank"
|
|
|
|
|
|
rel="license noopener"
|
|
|
|
|
|
aria-label="CC0 1.0 Universal Public Domain Dedication"
|
|
|
|
|
|
title="CC0 1.0 Universal"
|
|
|
|
|
|
>
|
|
|
|
|
|
<CcZeroBadge />
|
|
|
|
|
|
<span class="cc-label">CC0</span>
|
|
|
|
|
|
</a>
|
|
|
|
|
|
Jörg Lohrer
|
|
|
|
|
|
</span>
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
<span class="footer-sep">·</span>
|
2026-04-21 14:00:26 +02:00
|
|
|
|
<a href="/impressum/">{$t('nav.imprint')}</a>
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
<span class="footer-sep">·</span>
|
2026-04-18 16:19:21 +02:00
|
|
|
|
<a
|
|
|
|
|
|
href="https://github.com/joerglohrer/joerglohrerde"
|
|
|
|
|
|
target="_blank"
|
|
|
|
|
|
rel="noopener"
|
|
|
|
|
|
title="Quellcode, Making-of und Nostr-Publish-Pipeline"
|
|
|
|
|
|
>Nostr-basiert – Making-of im Repo</a>
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</footer>
|
|
|
|
|
|
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
<style>
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
.site-header {
|
|
|
|
|
|
border-bottom: 1px solid var(--border);
|
|
|
|
|
|
background: var(--bg);
|
|
|
|
|
|
position: sticky;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
z-index: 10;
|
|
|
|
|
|
backdrop-filter: blur(8px);
|
|
|
|
|
|
}
|
|
|
|
|
|
.header-inner {
|
|
|
|
|
|
max-width: 720px;
|
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
|
padding: 0.75rem 1rem;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
gap: 1rem;
|
|
|
|
|
|
}
|
|
|
|
|
|
.brand {
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
font-size: 1.05rem;
|
|
|
|
|
|
color: var(--fg);
|
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
}
|
|
|
|
|
|
nav {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
gap: 1rem;
|
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
}
|
|
|
|
|
|
nav a {
|
|
|
|
|
|
color: var(--muted);
|
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
font-size: 0.95rem;
|
|
|
|
|
|
padding: 0.25rem 0;
|
|
|
|
|
|
border-bottom: 2px solid transparent;
|
|
|
|
|
|
transition: color 120ms, border-color 120ms;
|
|
|
|
|
|
}
|
|
|
|
|
|
nav a:hover {
|
|
|
|
|
|
color: var(--fg);
|
|
|
|
|
|
}
|
|
|
|
|
|
nav a.active {
|
|
|
|
|
|
color: var(--accent);
|
|
|
|
|
|
border-bottom-color: var(--accent);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
main {
|
|
|
|
|
|
max-width: 720px;
|
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
|
padding: 1.5rem 1rem;
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
min-height: calc(100vh - 200px);
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
}
|
|
|
|
|
|
@media (min-width: 640px) {
|
|
|
|
|
|
main {
|
|
|
|
|
|
padding: 1.5rem;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
|
|
|
|
|
|
.site-footer {
|
|
|
|
|
|
border-top: 1px solid var(--border);
|
|
|
|
|
|
margin-top: 3rem;
|
|
|
|
|
|
}
|
|
|
|
|
|
.footer-inner {
|
|
|
|
|
|
max-width: 720px;
|
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
|
padding: 1rem;
|
|
|
|
|
|
color: var(--muted);
|
|
|
|
|
|
font-size: 0.85rem;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
gap: 0.3rem;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
}
|
|
|
|
|
|
.footer-inner a {
|
|
|
|
|
|
color: var(--muted);
|
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
.footer-inner a:hover {
|
|
|
|
|
|
color: var(--accent);
|
|
|
|
|
|
text-decoration: underline;
|
|
|
|
|
|
}
|
|
|
|
|
|
.footer-sep {
|
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
|
}
|
2026-04-18 16:19:21 +02:00
|
|
|
|
.footer-license a {
|
|
|
|
|
|
color: var(--accent);
|
|
|
|
|
|
display: inline-flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
gap: 0.25em;
|
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
.footer-license a:hover .cc-label {
|
|
|
|
|
|
text-decoration: underline;
|
|
|
|
|
|
}
|
|
|
|
|
|
.cc-label {
|
|
|
|
|
|
font-weight: 600;
|
spa: startseite + archiv + impressum + menü + assets für cutover
Startseite (+page.svelte) komplett überarbeitet:
- Hero mit lokalem Profilbild (WebP aus static/, schneller als
kind:0-roundtrip), Begrüßung "Hi Willkommen auf meinem Blog 🤗",
About/Website aus kind:0
- Social-Icons-Leiste (Nostr/Mastodon/Bluesky/LinkedIn/ORCID/Mail)
als inline-SVG, monochrom via currentColor, hover färbt blau
- Nostr-Icon von satscoffee/nostr_icons (outline, CC0), die anderen
stilisiert als vereinfachte Brand-Icons
- Neueste 5 Posts + Archiv-Link
Archiv-Route (/archiv/): alle Posts, nach Jahr gruppiert.
Impressum (/impressum/): static-page, rendert content/impressum.md
(via vite ?raw-import), bleibt aus nostr-feeds draußen. Frontmatter-
parser toleriert trailing-spaces auf --- zeilen.
Menü im Layout: sticky header mit brand + 3 links (Home, Archiv,
Impressum), aktiv-state via akzent-farbe. Footer mit © + Impressum
+ "Nostr-basiert"-hinweis.
Assets: profilbild und favicons aus dem hugo-static (repo-root) nach
app/static/ übernommen, favicon-links in app.html ergänzt.
NIP-05: .well-known/nostr.json in app/static angelegt mit CORS-header
via .htaccess, damit "joerglohrer@joerg-lohrer.de" nach cutover
verifizierbar bleibt.
E2E-Tests angepasst an neue hero/navigation-struktur, 29/29 unit + 4/4
e2e grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:35:05 +02:00
|
|
|
|
}
|
spa(phase 3, tasks 15-22): routing, komponenten, home, postview
Phase 3 komplett:
- Task 15: LoadingOrError-Komponente (loading/error-states, Habla-Fallback)
- Task 16: app.html mit CSS-Variablen (light/dark), Base-Typography
- Task 17: +layout.svelte mit Container + bootstrapReadRelays onMount
- Task 18: ProfileCard-Komponente (Avatar, Name, About, NIP-05, Website)
- Task 19: PostCard-Komponente (Thumbnail + Titel/Summary/Datum), responsive
- Task 20: +page.svelte als Home (Profil + Liste, Promise.all für beides)
- Task 21: PostView-Komponente (Titel, Meta, Cover, Summary, Markdown-Body)
- Task 22: [...slug]/+page.ts+svelte — Catch-all-Route mit Legacy-301-Redirect
Alle $props()-abhängigen Werte via $derived() (Svelte-5-Runes-Konformität).
npm run check: 0 errors, 0 warnings, 592 files. npm run build grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:39:24 +02:00
|
|
|
|
</style>
|