Files
Frank Schwenk 8abd7ddb59 feat: Archiv-Backfill, responsive Bilder und Site-Meta
Ergänzt Backfill- und Hilfsskripte, erzeugt nach der Pixazo-Generierung
komprimierte srcset-Varianten, validiert leere Bilder und fügt Favicon,
Web Manifest sowie Open-Graph-/Twitter-Tags in die Templates ein.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 18:14:40 +02:00

389 lines
9.5 KiB
Django/Jinja
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MOBEA Archiv Unsere bisherigen Pivots</title>
<meta name="description" content="Jeden Tag ein neues Startup. Hier ruhen die bisherigen.">
<meta property="og:title" content="MOBEA Archiv Unsere bisherigen Pivots">
<meta property="og:description" content="Jeden Tag ein neues Startup. Hier ruhen die bisherigen.">
{% set og_title = 'MOBEA Archiv Unsere bisherigen Pivots' %}
{% set og_description = 'Jeden Tag ein neues Startup. Hier ruhen die bisherigen.' %}
{% set canonical_path = '/archiv/' %}
{% include '_head_common.html.j2' %}
<meta name="theme-color" content="#111118">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
background: #111118;
color: #e4e4ec;
line-height: 1.6;
min-height: 100vh;
}
a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }
.container {
width: 100%;
max-width: 1080px;
margin: 0 auto;
padding: 0 1.25rem;
}
/* Header */
.header {
border-bottom: 1px solid #2a2a38;
padding: 1.5rem 0;
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.logo {
font-weight: 800;
font-size: 1.25rem;
letter-spacing: 0.12em;
color: #ffffff;
}
.header-nav {
display: flex;
gap: 1.5rem;
font-size: 0.85rem;
}
.header-nav a {
color: #8888a0;
transition: color 0.2s;
}
.header-nav a:hover { color: #c8c8d8; }
/* Main */
.main { padding: 3rem 0 4rem; }
.intro {
margin-bottom: 3rem;
}
.intro h1 {
font-size: clamp(1.5rem, 4vw, 2.25rem);
font-weight: 700;
color: #ffffff;
margin-bottom: 0.75rem;
}
.intro p {
font-size: 1.05rem;
color: #8888a0;
max-width: 36rem;
}
/* Empty state */
.empty {
text-align: center;
padding: 4rem 2rem;
border: 1px dashed #2a2a38;
border-radius: 12px;
color: #8888a0;
font-size: 1.1rem;
}
/* Grid */
.archive-grid {
display: grid;
gap: 1.5rem;
}
@media (min-width: 600px) {
.archive-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 900px) {
.archive-grid { grid-template-columns: repeat(3, 1fr); }
}
.entry-card {
display: flex;
flex-direction: column;
background: #1a1a24;
border: 1px solid #2a2a38;
border-radius: 12px;
overflow: hidden;
transition: border-color 0.2s, transform 0.2s, box-shadow 0.2s;
}
.entry-card:has(.entry-link:hover) {
border-color: #4a4a60;
transform: translateY(-3px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.35);
}
.entry-link {
display: flex;
flex-direction: column;
flex: 1;
color: inherit;
}
.entry-thumb {
aspect-ratio: 16 / 9;
overflow: hidden;
background: linear-gradient(135deg, #2a2040 0%, #1a2838 50%, #283020 100%);
}
.entry-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
}
.entry-body {
padding: 1.25rem;
flex: 1;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.entry-date {
font-size: 0.75rem;
color: #686880;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.entry-backronym {
font-size: 0.95rem;
font-weight: 700;
color: #ffffff;
line-height: 1.35;
}
.entry-tagline {
font-size: 0.85rem;
color: #a0a0b8;
flex: 1;
}
.entry-topics {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-top: 0.5rem;
}
.topic-badge {
font-size: 0.7rem;
font-weight: 600;
padding: 0.2rem 0.6rem;
border-radius: 999px;
background: #2a2a38;
color: #a0a0b8;
border: 1px solid #3a3a50;
}
.entry-prompts {
border-top: 1px solid #2a2a38;
font-size: 0.8rem;
}
.entry-prompts > summary {
padding: 0.75rem 1.25rem;
cursor: pointer;
color: #8888a0;
font-weight: 600;
list-style: none;
user-select: none;
transition: color 0.2s, background 0.2s;
}
.entry-prompts > summary::-webkit-details-marker { display: none; }
.entry-prompts > summary::before {
content: "▸ ";
display: inline-block;
transition: transform 0.2s;
}
.entry-prompts[open] > summary::before {
transform: rotate(90deg);
}
.entry-prompts > summary:hover {
color: #c8c8d8;
background: #222230;
}
.prompt-panel {
padding: 0 1.25rem 1.25rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
.prompt-block h3 {
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #686880;
margin-bottom: 0.4rem;
}
.prompt-text {
font-family: ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, monospace;
font-size: 0.72rem;
line-height: 1.5;
color: #b8b8cc;
background: #111118;
border: 1px solid #2a2a38;
border-radius: 8px;
padding: 0.75rem;
white-space: pre-wrap;
word-break: break-word;
max-height: 14rem;
overflow-y: auto;
}
.prompt-label {
font-size: 0.65rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #585870;
margin: 0.6rem 0 0.25rem;
}
.prompt-label:first-child { margin-top: 0; }
/* Footer */
.footer {
border-top: 1px solid #2a2a38;
padding: 2rem 0;
margin-top: auto;
}
.footer-inner {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: 1rem;
font-size: 0.8rem;
color: #686880;
}
.footer-links {
display: flex;
gap: 1.5rem;
}
.footer-links a {
color: #8888a0;
transition: color 0.2s;
}
.footer-links a:hover { color: #c8c8d8; }
</style>
</head>
<body>
<header class="header">
<div class="container header-inner">
<span class="logo">MOBEA</span>
<nav class="header-nav">
<a href="/">Heute</a>
<a href="/echt-jetzt/">Kontakt</a>
</nav>
</div>
</header>
<main class="main">
<div class="container">
<div class="intro">
<h1>Unsere bisherigen Pivots</h1>
<p>Jeden Tag ein neues Startup. Hier ruhen die bisherigen.</p>
</div>
{% if entries %}
<div class="archive-grid">
{% for entry in entries %}
<article class="entry-card">
<a href="{{ entry.url }}" class="entry-link">
<div class="entry-thumb">
{% if entry.image %}
<img src="{{ entry.image.thumb_src }}" srcset="{{ entry.image.thumb_srcset }}" sizes="{{ entry.image.thumb_sizes }}" alt="{{ entry.backronym }}" width="360" height="203" loading="lazy">
{% endif %}
</div>
<div class="entry-body">
<time class="entry-date" datetime="{{ entry.date }}">{{ entry.date_human }}</time>
<h2 class="entry-backronym">{{ entry.backronym }}</h2>
<p class="entry-tagline">{{ entry.tagline }}</p>
{% if entry.topics %}
<div class="entry-topics">
{% for topic in entry.topics %}
<span class="topic-badge">{{ topic }}</span>
{% endfor %}
</div>
{% endif %}
</div>
</a>
{% if entry.prompts %}
<details class="entry-prompts">
<summary>Prompts anzeigen</summary>
<div class="prompt-panel">
<div class="prompt-block">
<h3>Seiteninhalt (OpenRouter)</h3>
{% if entry.prompts.content_system %}
<p class="prompt-label">System</p>
<pre class="prompt-text">{{ entry.prompts.content_system }}</pre>
{% endif %}
{% if entry.prompts.content_user %}
<p class="prompt-label">User</p>
<pre class="prompt-text">{{ entry.prompts.content_user }}</pre>
{% endif %}
</div>
<div class="prompt-block">
<h3>Bildgenerierung (SDXL)</h3>
{% if entry.prompts.image_prompt %}
<p class="prompt-label">Prompt</p>
<pre class="prompt-text">{{ entry.prompts.image_prompt }}</pre>
{% endif %}
{% if entry.prompts.image_negative_prompt %}
<p class="prompt-label">Negative Prompt</p>
<pre class="prompt-text">{{ entry.prompts.image_negative_prompt }}</pre>
{% endif %}
</div>
</div>
</details>
{% endif %}
</article>
{% endfor %}
</div>
{% else %}
<p class="empty">Noch keine Pivots. Komm morgen wieder.</p>
{% endif %}
</div>
</main>
<footer class="footer">
<div class="container footer-inner">
<span>© MOBEA Archiv</span>
<nav class="footer-links">
<a href="/">Zurück zur Startseite</a>
<a href="/echt-jetzt/">Echt jetzt</a>
</nav>
</div>
</footer>
</body>
</html>