ia: Umbenennung — Library→Archiv, Wiki→Library (URLs, Content, Code)

Neue Informationsarchitektur:
- ARCHIV (/archiv) = die fertigen Texte (vormals Library): Essays mit Byline,
  Quellen/Zitieren, Dialog, Versionsverlauf. Section "archiv".
- LIBRARY (/library) = das verlinkte Werkstattwissen (vormals Wiki): zwei-
  spaltig mit Gruppen-Navigation + Filter. Section "library".

Umgesetzt:
- content/ + layouts/ verschoben (git mv), Menü (ARCHIV+LIBRARY, kein WIKI),
  Startseiten-Journal zieht jetzt Section "archiv", Querverweise umgeschrieben
  (/library→/archiv, /wiki→/library).
- CMS: files.js klassifiziert archiv/<sec>→beitrag, library/→biblio;
  stats.js + Admin (Typ "Library-Seite", KIND_LABEL, Pfade) nachgezogen.
- single.html: Byline/Provenance/Dialog an Section "archiv" gebunden.
- Beide Header zentriert (section-header) — einheitlicher Look.
- Interne Dialog-Werte (thread.kind='library', Forum "Beiträge") unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 22:13:50 +02:00
parent 54f03270d0
commit 790141bafe
33 changed files with 208 additions and 215 deletions
+4 -13
View File
@@ -719,19 +719,10 @@ a.byline-author:hover, a.journal-author:hover { color: var(--accent); }
.dialog-hint { font-size: var(--font-size-small); color: var(--color-text-muted); align-self: center; opacity: 0.7; }
.dialog-spacer { flex: 1; }
/* ── Wiki: vollbreiter Section-Header (wie Library) + zwei Spalten darunter.
Gleiche max-width/Zentrierung wie der normale Inhalt → Wiki- und Library-
Header fluchten exakt. ── */
.wiki {
display: grid;
grid-template-columns: 200px 1fr;
column-gap: 2.6em; row-gap: var(--spacing-sm);
align-items: start;
max-width: calc(var(--container-width) + 3.5rem);
margin-inline: auto;
}
.wiki > .section-header { grid-column: 1 / -1; margin-top: 0; }
@media (max-width: 760px) { .wiki { grid-template-columns: 1fr; column-gap: 0; } .wiki-side { position: static; } }
/* ── Library/Wiki-Bereich: zentrierter Section-Header (wie Archiv) darüber,
zweispaltige Fläche (Seitenleiste + Inhalt) darunter. ── */
.wiki { display: grid; grid-template-columns: 200px 1fr; gap: 2.6em; align-items: start; }
@media (max-width: 760px) { .wiki { grid-template-columns: 1fr; gap: 1.4em; } .wiki-side { position: static; } }
.wiki-side { position: sticky; top: 1em; align-self: start; }
.wiki-nav { display: flex; flex-direction: column; gap: 0.35em; font-size: var(--font-size-small); }
.wiki-nav-home { text-decoration: none; color: var(--color-text-primary); font-weight: 600; }
+10 -10
View File
@@ -22,7 +22,7 @@ const hexOf = (name) => (COLORS.find((c) => c[0] === name) || [])[2] || 'transpa
const LAYOUTS = ['', 'text', 'image', 'icon'];
const SECTIONS = ['buerofuehrung', 'software', 'theorie'];
const KIND_LABEL = { beitrag: 'Beiträge', wiki: 'Wiki', seite: 'Seiten', rubrik: 'Rubriken' };
const KIND_LABEL = { beitrag: 'Beiträge', biblio: 'Library', seite: 'Seiten', rubrik: 'Rubriken' };
const EMPTY = {
isNew: true, path: '', type: 'beitrag', section: 'software', slug: '',
@@ -89,7 +89,7 @@ function Dashboard({ email }) {
const q = query.trim().toLowerCase();
const filtered = q ? entries.filter((e) => e.title.toLowerCase().includes(q) || (e.section || '').includes(q)) : entries;
const groups = { beitrag: [], wiki: [], seite: [], rubrik: [] };
const groups = { beitrag: [], biblio: [], seite: [], rubrik: [] };
for (const e of filtered) (groups[e.kind] || groups.seite).push(e);
return (
@@ -126,7 +126,7 @@ function Dashboard({ email }) {
<aside>
<button className="new" onClick={() => setCurrent({ ...EMPTY })}> Neuer Beitrag</button>
<div className="search"><span></span><input placeholder="Suchen…" value={query} onChange={(e) => setQuery(e.target.value)} /></div>
{['beitrag', 'wiki', 'seite', 'rubrik'].map((kind) => groups[kind].length > 0 && (
{['beitrag', 'biblio', 'seite', 'rubrik'].map((kind) => groups[kind].length > 0 && (
<div className="group" key={kind}>
<div className="group-title">{KIND_LABEL[kind]} <span>{groups[kind].length}</span></div>
<ul className="list">
@@ -169,7 +169,7 @@ function Editor({ initial, onSaved, onMsg }) {
const dragging = useRef(false);
const coverIn = useRef(null);
const set = (k) => (e) => setF({ ...f, [k]: e.target.type === 'checkbox' ? e.target.checked : e.target.value });
const isWiki = f.type === 'wiki' || (f.path || '').startsWith('wiki/');
const isWiki = f.type === 'biblio' || (f.path || '').startsWith('library/');
async function pickCover(ev) {
const file = ev.target.files?.[0]; ev.target.value = '';
@@ -198,8 +198,8 @@ function Editor({ initial, onSaved, onMsg }) {
if (!data.isNew) return data.path;
const slug = (data.slug || '').trim();
if (!slug) return '';
if (data.type === 'beitrag') return `library/${data.section}/${slug}.md`;
if (data.type === 'wiki') return `wiki/${slug}.md`;
if (data.type === 'beitrag') return `archiv/${data.section}/${slug}.md`;
if (data.type === 'biblio') return `library/${slug}.md`;
return `${slug}.md`;
}
@@ -256,7 +256,7 @@ function Editor({ initial, onSaved, onMsg }) {
<label className="sm">Typ
<select value={f.type} onChange={set('type')}>
<option value="beitrag">Beitrag</option>
<option value="wiki">Wiki-Seite</option>
<option value="biblio">Library-Seite</option>
<option value="seite">Seite</option>
</select>
</label>
@@ -423,7 +423,7 @@ function Overview({ onMsg, go }) {
<h2>Übersicht</h2>
<div className="stat-grid">
<Card label="Beiträge" value={s.content.beitraege} hint={`${s.content.entwuerfe} Entwürfe`} to="content" />
<Card label="Wiki-Seiten" value={s.content.wiki} to="content" />
<Card label="Library-Seiten" value={s.content.library} to="content" />
<Card label="Seiten" value={s.content.seiten} />
<Card label="Autor:innen" value={s.users.total} hint={`${s.users.admin} Admin · ${s.users.editor} Red.`} to="users" />
<Card label="Foren" value={s.dialog.forums} to="forums" />
@@ -438,7 +438,7 @@ function Overview({ onMsg, go }) {
<button onClick={() => go('users')}>Autor:innen &amp; Rollen</button>
<a className="quick-link" href="/" target="_blank" rel="noreferrer">Website </a>
<a className="quick-link" href="/dialog/" target="_blank" rel="noreferrer">Dialog </a>
<a className="quick-link" href="/wiki/" target="_blank" rel="noreferrer">Wiki </a>
<a className="quick-link" href="/library/" target="_blank" rel="noreferrer">Library </a>
</div>
</div>
</div>
@@ -681,7 +681,7 @@ function slugify(s) {
function fromRead(r) {
const fm = r.frontmatter || {};
const p = r.path || '';
const type = p.startsWith('library/') ? 'beitrag' : p.startsWith('wiki/') ? 'wiki' : 'seite';
const type = p.startsWith('archiv/') ? 'beitrag' : p.startsWith('library/') ? 'biblio' : 'seite';
return {
isNew: false, path: r.path, type, section: '', slug: '',
title: fm.title || '', date: fm.date ? String(fm.date).slice(0, 10) : '',
+7 -6
View File
@@ -26,7 +26,8 @@ async function walk(dir) {
return out;
}
// Beitrag (library/<section>/<slug>.md) | Rubrik (_index.md) | Seite (sonst).
// Beitrag (archiv/<section>/<slug>.md) | Library-Seite (library/<slug>.md)
// | Rubrik (_index.md) | Seite (sonst).
function classify(rel) {
const base = path.basename(rel);
const parts = rel.split('/');
@@ -34,11 +35,11 @@ function classify(rel) {
const section = parts.length >= 2 ? parts[parts.length - 2] : 'home';
return { kind: 'rubrik', section };
}
if (parts[0] === 'library' && parts.length === 3) {
if (parts[0] === 'archiv' && parts.length === 3) {
return { kind: 'beitrag', section: parts[1] };
}
if (parts[0] === 'wiki') {
return { kind: 'wiki', section: 'wiki' };
if (parts[0] === 'library') {
return { kind: 'biblio', section: 'library' };
}
return { kind: 'seite', section: null };
}
@@ -85,8 +86,8 @@ export async function listEntries() {
url: urlFor(rel),
});
}
// Beiträge zuerst, dann Wiki, Seiten, Rubriken; je nach Datum/Titel.
const order = { beitrag: 0, wiki: 1, seite: 2, rubrik: 3 };
// Beiträge zuerst, dann Library, Seiten, Rubriken; je nach Datum/Titel.
const order = { beitrag: 0, biblio: 1, seite: 2, rubrik: 3 };
items.sort((a, b) =>
(order[a.kind] - order[b.kind]) ||
(b.date || '').localeCompare(a.date || '') ||
+2 -2
View File
@@ -9,11 +9,11 @@ stats.use('*', requireAdmin);
stats.get('/', async (c) => {
// Inhalte aus dem Dateisystem zählen.
const content = { beitraege: 0, entwuerfe: 0, wiki: 0, seiten: 0, rubriken: 0 };
const content = { beitraege: 0, entwuerfe: 0, library: 0, seiten: 0, rubriken: 0 };
try {
for (const e of await listEntries()) {
if (e.kind === 'beitrag') { content.beitraege++; if (e.draft) content.entwuerfe++; }
else if (e.kind === 'wiki') content.wiki++;
else if (e.kind === 'biblio') content.library++;
else if (e.kind === 'rubrik') content.rubriken++;
else content.seiten++;
}
+6
View File
@@ -0,0 +1,6 @@
---
title: "Archiv"
description: "Das Archiv von OPENBUREAU — fertige Texte, Recherchen, Anleitungen."
---
Das Archiv ist die Sammlung der fertigen Texte. Alles, was gelesen und geschrieben wird, lebt hier — thematisch organisiert; das **Journal** auf der Startseite zeigt dieselben Inhalte chronologisch.
@@ -11,7 +11,7 @@ Offen zu arbeiten heißt nicht, alles zu verschenken. Es heißt, die Grundlagen
Die rechtliche Absicherung dafür sind Lizenzen. Inhalte auf OPENBUREAU stehen unter CC BY-SA,[^ccbysa] der Code überwiegend unter AGPL oder MIT.[^agpl] Beide sorgen dafür, dass Offenheit weitergegeben wird, statt verloren zu gehen.
Verwandt: Der [Werkzeug-Stack](/library/software/stack/) zeigt, womit wir das konkret tun.
Verwandt: Der [Werkzeug-Stack](/archiv/software/stack/) zeigt, womit wir das konkret tun.
[^ccbysa]: Creative Commons, *Attribution-ShareAlike 4.0 International* (CC BY-SA 4.0), <https://creativecommons.org/licenses/by-sa/4.0/>.
[^agpl]: Free Software Foundation, *GNU Affero General Public License v3.0*, 2007.
@@ -14,4 +14,4 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor i
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet — [Werkzeuge](/library/werkzeuge).
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet — [Werkzeuge](/archiv/werkzeuge).
@@ -7,7 +7,7 @@ color: yuyake
layout: text
---
Die Werkzeuge des Büros sind keine Inseln, sondern eine Kette: [DOSSIER](/library/software/dossier/) hält die Projektdaten, [RAPPORT](/library/software/rapport/) erzeugt Berichte daraus, und diese Site veröffentlicht, was öffentlich sein soll.
Die Werkzeuge des Büros sind keine Inseln, sondern eine Kette: [DOSSIER](/archiv/software/dossier/) hält die Projektdaten, [RAPPORT](/archiv/software/rapport/) erzeugt Berichte daraus, und diese Site veröffentlicht, was öffentlich sein soll.
Der Build ist bewusst banal — ein Befehl:[^hugo]
@@ -7,7 +7,7 @@ color: kusa
layout: text
---
Die Kiste aus dem [ersten Teil](/library/software/server-im-eigenen-haus/) muss man nicht streicheln können, um sie zu verstehen. Es genügt ein Bild: Proxmox macht aus einem Rechner ein Mehrfamilienhaus. Das Haus ist die Maschine, die Wohnungen sind die Container, und in jeder Wohnung lebt genau ein Dienst — die Website, die Zeiterfassung, der Dateispeicher. Niemand stört den anderen, jeder hat seine eigene Tür, und zieht eine Partei aus, bleiben die übrigen, wo sie sind.
Die Kiste aus dem [ersten Teil](/archiv/software/server-im-eigenen-haus/) muss man nicht streicheln können, um sie zu verstehen. Es genügt ein Bild: Proxmox macht aus einem Rechner ein Mehrfamilienhaus. Das Haus ist die Maschine, die Wohnungen sind die Container, und in jeder Wohnung lebt genau ein Dienst — die Website, die Zeiterfassung, der Dateispeicher. Niemand stört den anderen, jeder hat seine eigene Tür, und zieht eine Partei aus, bleiben die übrigen, wo sie sind.
Dieser Text zeigt, wie man das Haus baut und die erste Wohnung bezieht. Er setzt keine Erfahrung mit Servern voraus, nur die Bereitschaft, einen Befehl abzutippen und zu lesen, was er antwortet.
@@ -33,4 +33,4 @@ Bleibt die unbequeme Seite, und sie gehört in jeden ehrlichen Text dieser Art:
Tragbar finden wir das aus zwei Gründen. Der Aufwand ist kleiner, als er klingt, sobald die Handgriffe automatisiert sind — einen neuen Dienst aufzusetzen ist bei uns ein einziger Befehl und kein verlorener Nachmittag. Und die Kontrolle ist den Rest wert: Lieber für ein Backup geradestehen, das man versteht, als sich auf eines verlassen, das man nie gesehen hat.
Wie die Kiste im Schrank konkret eingerichtet ist — die Maschine, die Container, die Befehle, mit denen ein Dienst in Minuten steht — steht im zweiten Teil: [Proxmox, Schritt für Schritt](/library/software/proxmox-schritt-fuer-schritt/).
Wie die Kiste im Schrank konkret eingerichtet ist — die Maschine, die Container, die Befehle, mit denen ein Dienst in Minuten steht — steht im zweiten Teil: [Proxmox, Schritt für Schritt](/archiv/software/proxmox-schritt-fuer-schritt/).
@@ -28,7 +28,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor i
## Lorem Ipsum IV
- **[DOSSIER](/library/software/dossier/)** — lorem ipsum.
- **[RAPPORT](/library/software/rapport/)** — dolor sit amet.
- **[DOSSIER](/archiv/software/dossier/)** — lorem ipsum.
- **[RAPPORT](/archiv/software/rapport/)** — dolor sit amet.
— sed ut perspiciatis unde omnis iste natus error sit voluptatem.
+4 -3
View File
@@ -1,7 +1,8 @@
---
title: "Library"
description: "Die Bibliothek von OPENBUREAU — Texte, Notizen, Recherchen."
summary: "Das Werkstattwissen des Büros — verlinkte Notizen, die mit der Praxis wachsen."
---
Die Library ist die Sammlung. Alles, was gelesen und geschrieben wird, lebt hier.
Texte werden thematisch organisiert; das **Journal** auf der Startseite zeigt dieselben Inhalte chronologisch.
Das [Archiv](/archiv/) sammelt fertige Texte; die Library sammelt das Dazwischen — Begriffe, Handgriffe, Konventionen, die man im Alltag nachschlägt. Sie ist bewusst unfertig: Eine Seite darf kurz sein, Lücken haben, sich später widersprechen — solange sie wächst, statt in einer Schublade zu verschwinden.
Links findest du alle Seiten nach Bereich gruppiert; das Feld oben filtert sie. Wer einen Eintrag ergänzen oder neu anlegen will, tut das im Redaktions-Editor oder direkt im Repository.
@@ -8,4 +8,4 @@ Der **Typus** ist nicht das fertige Vorbild, sondern das zugrunde liegende Prinz
Fürs Büro ist der Typus ein Werkzeug der Ökonomie: Wer den Typus einer Aufgabe kennt, beginnt nicht bei null, sondern variiert bewusst — und kann die eigenen Entscheidungen begründen.
Ausführlicher in der Bibliothek: [Typus und Modell](/library/theorie/muster-typologie-fussnoten/).
Ausführlicher in der Bibliothek: [Typus und Modell](/archiv/theorie/muster-typologie-fussnoten/).
@@ -1,11 +1,11 @@
---
title: "Wie dieses Wiki funktioniert"
title: "Wie die Library funktioniert"
group: "Werkstatt"
summary: "Kleine Seiten, klare Titel, viele Verweise."
toc: true
---
Dieses Wiki ist kein Lexikon, das jemand fertigstellt, sondern ein gemeinsames Gedächtnis, das beim Arbeiten entsteht. Ein paar Konventionen halten es übersichtlich.
Die Library ist kein Lexikon, das jemand fertigstellt, sondern ein gemeinsames Gedächtnis, das beim Arbeiten entsteht. Ein paar Konventionen halten sie übersichtlich.
## Eine Seite, ein Begriff
@@ -13,7 +13,7 @@ Lieber viele kleine Seiten als wenige grosse. Eine Seite behandelt einen Begriff
## Verweise
Seiten verweisen mit gewöhnlichen Markdown-Links aufeinander — `[Typus](/wiki/typus/)` — und gerne auch in die [Bibliothek](/library/), wenn ein Gedanke dort ausführlicher steht. Verlinken ist die eigentliche Arbeit: Eine Notiz, auf die nichts zeigt, findet niemand.
Seiten verweisen mit gewöhnlichen Markdown-Links aufeinander — `[Typus](/library/typus/)` — und gerne auch ins [Archiv](/archiv/), wenn ein Gedanke dort ausführlicher steht. Verlinken ist die eigentliche Arbeit: Eine Notiz, auf die nichts zeigt, findet niemand.
## Gruppen
@@ -21,4 +21,4 @@ Das Feld `group` im Frontmatter sortiert eine Seite in die Navigation links —
## Bearbeiten
Jede Seite hat unten einen **bearbeiten**-Link, der direkt ins Repository führt. Wer lieber im Redaktions-Editor arbeitet, legt eine Seite vom Typ *Wiki* an und füllt Titel, Gruppe und Text.
Jede Seite hat unten einen **bearbeiten**-Link, der direkt ins Repository führt. Wer lieber im Redaktions-Editor arbeitet, legt eine Seite vom Typ *Library* an und füllt Titel, Gruppe und Text.
-8
View File
@@ -1,8 +0,0 @@
---
title: "Wiki"
summary: "Das Werkstattwissen des Büros — verlinkte Notizen, die mit der Praxis wachsen."
---
Die [Bibliothek](/library/) sammelt fertige Texte; das Wiki sammelt das Dazwischen — Begriffe, Handgriffe, Konventionen, die man im Alltag nachschlägt. Es ist bewusst unfertig: Eine Seite darf kurz sein, Lücken haben, sich später widersprechen — solange sie wächst, statt in einer Schublade zu verschwinden.
Links findest du alle Seiten nach Bereich gruppiert; das Feld oben filtert sie. Wer einen Eintrag ergänzen oder neu anlegen will, tut das im Redaktions-Editor oder direkt im Repository.
+2 -2
View File
@@ -69,8 +69,8 @@ menus:
- name: LIBRARY
pageRef: /library
weight: 20
- name: WIKI
pageRef: /wiki
- name: ARCHIV
pageRef: /archiv
weight: 25
- name: MANIFEST
pageRef: /manifest
+3 -3
View File
@@ -17,7 +17,7 @@
{{ end }}
{{/* Byline + Meta nur bei Library-Beiträgen — Seiten wie Manifest,
Kontakt, Spenden brauchen weder Autor noch „Aktualisiert am". */}}
{{ if eq .Section "library" }}
{{ if eq .Section "archiv" }}
{{ $author := .Params.author | default site.Params.author.name }}
{{ $aslug := urlize $author }}
{{ if not .Params.author }}{{ with index site.Data.authors site.Params.author.email }}{{ with .slug }}{{ $aslug = . }}{{ end }}{{ end }}{{ end }}
@@ -62,7 +62,7 @@
{{/* Tags: bei Seiten (nicht-Library) wie bisher unter dem Text. Bei Library
wandern sie in die Aktionsreihe (rechts neben Dialog) im Partial. */}}
{{ if ne .Section "library" }}
{{ if ne .Section "archiv" }}
{{- with .Params.tags }}
<ul class="tag-pills" aria-label="Tags">
{{- range . -}}<li><a href="/tags/{{ . | urlize }}/">{{ . }}</a></li>{{- end -}}
@@ -71,7 +71,7 @@
{{ end }}
{{/* Artikel-Fuß (zitieren, Dialog, Tags, Versionen) — nur bei Library. */}}
{{ if eq .Section "library" }}
{{ if eq .Section "archiv" }}
{{ partial "provenance.html" . }}
<script src="/version-history.js"></script>
{{ end }}
@@ -1,7 +1,7 @@
{{- /* Wiki-Seitenleiste: alle Wiki-Seiten nach `group` gruppiert, mit Filter.
{{- /* Library-Seitenleiste: alle Library-Seiten nach `group` gruppiert, mit Filter.
Seiten ohne `group` landen unter „Allgemein“. */ -}}
{{- $cur := .RelPermalink -}}
{{- $pages := where site.RegularPages "Section" "wiki" -}}
{{- $pages := where site.RegularPages "Section" "library" -}}
{{- $groups := dict -}}
{{- range $pages -}}
{{- $g := .Params.group | default "Allgemein" -}}
+113
View File
@@ -0,0 +1,113 @@
{{ define "main" }}
{{ .Content }}
{{ if .IsSection }}
{{ if eq .Path "/archiv" }}
{{/* Archiv root: Atlas — gruppiert nach Untersection */}}
<section class="atlas">
{{ range .Sections.ByWeight }}
{{ $section := path.Base .RelPermalink }}
<article class="atlas-section" data-section="{{ $section }}">
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
{{ with .Params.description }}<p class="text-muted">{{ . }}</p>{{ end }}
<ul class="atlas-list">
{{ range first 6 .RegularPages.ByDate.Reverse }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
<span class="list-meta text-muted"> · {{ partial "date.html" .Date }}</span>
</li>
{{ end }}
</ul>
{{ if gt (len .RegularPages) 6 }}
<p class="more"><a href="{{ .RelPermalink }}">alle in {{ .Title }} →</a></p>
{{ end }}
</article>
{{ end }}
{{/* Tag-Cloud */}}
{{ with site.Taxonomies.tags }}
<article class="atlas-tags">
<h2>Tags</h2>
<ul class="tag-cloud">
{{ range $name, $taxonomy := . }}
<li><a href="/tags/{{ $name | urlize }}/">{{ $name }} <span class="text-muted">({{ len $taxonomy }})</span></a></li>
{{ end }}
</ul>
</article>
{{ end }}
</section>
{{ else if eq .Path "/archiv/software" }}
{{/* Software: kuratierte Landing — Werkzeuge (mit externem Link) getrennt
von Texten & Anleitungen. */}}
<header class="section-header" data-section="software">
<p class="section-rubric">Archiv</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.description }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
{{ $tools := where .RegularPages "Params.external" "!=" nil }}
{{ $texts := where .RegularPages "Params.external" nil }}
{{ with $tools }}
<section class="software-tools">
<h2 class="software-h">Werkzeuge</h2>
<ul class="tool-list">
{{ range .ByWeight }}
<li class="tool-item"{{ with .Params.color }} data-color="{{ . }}"{{ end }}>
<a class="tool-main" href="{{ .RelPermalink }}">
<span class="tool-name">{{ .LinkTitle }}</span>
{{ with .Params.summary }}<span class="tool-sum text-muted">{{ . }}</span>{{ end }}
</a>
{{ with .Params.external }}<a class="tool-ext" href="{{ . }}" rel="noopener" aria-label="extern öffnen"></a>{{ end }}
</li>
{{ end }}
</ul>
</section>
{{ end }}
<section class="software-texts">
<h2 class="software-h">Texte &amp; Anleitungen</h2>
<div class="time-list" data-section="software">
<ul>
{{ range $texts.ByDate.Reverse }}
<li class="list-item">
<div class="list-title-row">
<div class="list-title">
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .Params.summary }}<div class="list-summary text-muted">{{ . }}</div>{{ end }}
</div>
<div class="list-meta">{{ partial "date.html" .Date }}</div>
</div>
</li>
{{ end }}
</ul>
</div>
</section>
{{ else }}
{{/* Library subsection: chronologisch */}}
{{ $section := path.Base .RelPermalink }}
<header class="section-header" data-section="{{ $section }}">
<p class="section-rubric">Archiv</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.description }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
<div class="time-list" data-section="{{ $section }}">
<ul>
{{ range .RegularPages.ByDate.Reverse }}
<li class="list-item">
<div class="list-title-row">
<div class="list-title">
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .Params.summary }}
<div class="list-summary text-muted">{{ . }}</div>
{{ end }}
</div>
<div class="list-meta">{{ partial "date.html" .Date }}</div>
</div>
</li>
{{ end }}
</ul>
</div>
{{ end }}
{{ end }}
{{ end }}
+4 -4
View File
@@ -1,8 +1,8 @@
{{ define "main" }}
{{ .Content }}
{{ $library := where site.RegularPages "Section" "library" }}
{{ $journal := first 20 $library.ByDate.Reverse }}
{{ $archiv := where site.RegularPages "Section" "archiv" }}
{{ $journal := first 20 $archiv.ByDate.Reverse }}
<section class="journal" aria-label="Journal — neueste Beiträge">
<header class="journal-header">
@@ -21,8 +21,8 @@
</ol>
</div>
{{ if gt (len $library) 20 }}
<p class="more"><a href="/library/">→ Alle Beiträge in der Library</a></p>
{{ if gt (len $archiv) 20 }}
<p class="more"><a href="/archiv/">→ Alle Beiträge im Archiv</a></p>
{{ end }}
</section>
{{ end }}
+32 -104
View File
@@ -1,113 +1,41 @@
{{ define "main" }}
{{ .Content }}
<header class="section-header">
<h1 class="section-title">{{ .Title }}</h1>
</header>
{{ if .IsSection }}
{{ if eq .Path "/library" }}
{{/* Library root: Atlas — gruppiert nach Untersection */}}
<section class="atlas">
{{ range .Sections.ByWeight }}
{{ $section := path.Base .RelPermalink }}
<article class="atlas-section" data-section="{{ $section }}">
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
{{ with .Params.description }}<p class="text-muted">{{ . }}</p>{{ end }}
<ul class="atlas-list">
{{ range first 6 .RegularPages.ByDate.Reverse }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
<span class="list-meta text-muted"> · {{ partial "date.html" .Date }}</span>
</li>
{{ end }}
</ul>
{{ if gt (len .RegularPages) 6 }}
<p class="more"><a href="{{ .RelPermalink }}">alle in {{ .Title }} →</a></p>
{{ end }}
</article>
{{ end }}
<div class="wiki">
<aside class="wiki-side">{{ partial "library-nav.html" . }}</aside>
{{/* Tag-Cloud */}}
{{ with site.Taxonomies.tags }}
<article class="atlas-tags">
<h2>Tags</h2>
<ul class="tag-cloud">
{{ range $name, $taxonomy := . }}
<li><a href="/tags/{{ $name | urlize }}/">{{ $name }} <span class="text-muted">({{ len $taxonomy }})</span></a></li>
{{ end }}
</ul>
</article>
{{ end }}
</section>
{{ else if eq .Path "/library/software" }}
{{/* Software: kuratierte Landing — Werkzeuge (mit externem Link) getrennt
von Texten & Anleitungen. */}}
<header class="section-header" data-section="software">
<p class="section-rubric">Library</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.description }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
<div class="wiki-page">
<div class="single-content">{{ .Content }}</div>
{{ $tools := where .RegularPages "Params.external" "!=" nil }}
{{ $texts := where .RegularPages "Params.external" nil }}
{{ with $tools }}
<section class="software-tools">
<h2 class="software-h">Werkzeuge</h2>
<ul class="tool-list">
{{ range .ByWeight }}
<li class="tool-item"{{ with .Params.color }} data-color="{{ . }}"{{ end }}>
<a class="tool-main" href="{{ .RelPermalink }}">
<span class="tool-name">{{ .LinkTitle }}</span>
{{ with .Params.summary }}<span class="tool-sum text-muted">{{ . }}</span>{{ end }}
</a>
{{ with .Params.external }}<a class="tool-ext" href="{{ . }}" rel="noopener" aria-label="extern öffnen"></a>{{ end }}
</li>
{{ end }}
</ul>
</section>
{{ $pages := where site.RegularPages "Section" "library" }}
{{ $groups := dict }}
{{ range $pages }}
{{ $g := .Params.group | default "Allgemein" }}
{{ $existing := index $groups $g | default slice }}
{{ $groups = merge $groups (dict $g ($existing | append .)) }}
{{ end }}
<section class="software-texts">
<h2 class="software-h">Texte &amp; Anleitungen</h2>
<div class="time-list" data-section="software">
<ul>
{{ range $texts.ByDate.Reverse }}
<li class="list-item">
<div class="list-title-row">
<div class="list-title">
{{ if $pages }}
<div class="wiki-index">
{{ range $g, $ps := $groups }}
<section class="wiki-group">
<h2>{{ $g }}</h2>
<ul>
{{ range sort $ps "Title" }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .Params.summary }}<div class="list-summary text-muted">{{ . }}</div>{{ end }}
</div>
<div class="list-meta">{{ partial "date.html" .Date }}</div>
</div>
</li>
{{ end }}
</ul>
</div>
</section>
{{ else }}
{{/* Library subsection: chronologisch */}}
{{ $section := path.Base .RelPermalink }}
<header class="section-header" data-section="{{ $section }}">
<p class="section-rubric">Library</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.description }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
<div class="time-list" data-section="{{ $section }}">
<ul>
{{ range .RegularPages.ByDate.Reverse }}
<li class="list-item">
<div class="list-title-row">
<div class="list-title">
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .Params.summary }}
<div class="list-summary text-muted">{{ . }}</div>
{{ end }}
</div>
<div class="list-meta">{{ partial "date.html" .Date }}</div>
</div>
</li>
{{ with .Params.summary }}<span class="text-muted">{{ . }}</span>{{ end }}
</li>
{{ end }}
</ul>
</section>
{{ end }}
</ul>
</div>
{{ end }}
{{ end }}
</div>
{{ else }}
<p class="text-muted"><em>Noch keine Einträge — der erste entsteht im Redaktions-Editor.</em></p>
{{ end }}
</div>
</div>
{{ end }}
@@ -1,11 +1,12 @@
{{ define "main" }}
<header class="section-header">
<p class="section-rubric">{{ with .Params.group }}{{ . }}{{ else }}Library{{ end }}</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.summary }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
<div class="wiki">
<header class="section-header">
<p class="section-rubric">{{ with .Params.group }}{{ . }}{{ else }}Wiki{{ end }}</p>
<h1 class="section-title">{{ .Title }}</h1>
{{ with .Params.summary }}<p class="section-description">{{ . }}</p>{{ end }}
</header>
<aside class="wiki-side">{{ partial "wiki-nav.html" . }}</aside>
<aside class="wiki-side">{{ partial "library-nav.html" . }}</aside>
<div class="wiki-page">
{{ $hasToC := .Params.toc | default false }}
-40
View File
@@ -1,40 +0,0 @@
{{ define "main" }}
<div class="wiki">
<header class="section-header">
<h1 class="section-title">{{ .Title }}</h1>
</header>
<aside class="wiki-side">{{ partial "wiki-nav.html" . }}</aside>
<div class="wiki-page">
<div class="single-content">{{ .Content }}</div>
{{ $pages := where site.RegularPages "Section" "wiki" }}
{{ $groups := dict }}
{{ range $pages }}
{{ $g := .Params.group | default "Allgemein" }}
{{ $existing := index $groups $g | default slice }}
{{ $groups = merge $groups (dict $g ($existing | append .)) }}
{{ end }}
{{ if $pages }}
<div class="wiki-index">
{{ range $g, $ps := $groups }}
<section class="wiki-group">
<h2>{{ $g }}</h2>
<ul>
{{ range sort $ps "Title" }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .Params.summary }}<span class="text-muted"> — {{ . }}</span>{{ end }}
</li>
{{ end }}
</ul>
</section>
{{ end }}
</div>
{{ else }}
<p class="text-muted"><em>Noch keine Einträge — der erste entsteht im Redaktions-Editor.</em></p>
{{ end }}
</div>
</div>
{{ end }}