feature: Wiki — verlinktes Werkstattwissen mit Gruppen-Navigation
Neue Hugo-Sektion /wiki als 'effektives Wiki' im KISS-Sinn: - Zweispaltiges Layout: gruppierte Seitenleiste (nach Frontmatter 'group') mit Live-Filter + Inhalt mit TOC und 'zuletzt bearbeitet'/bearbeiten-Link - Übersichtsseite gruppiert alle Einträge; WIKI im Hauptmenü - Seiten ohne group landen unter 'Allgemein' (robust) - Start-Inhalte: Meta-Seite (wie es funktioniert), Typus (→ Bibliothek), Dateiablage/Benennung; Archetype setzt group/summary - Bewusst dateibasiert: jede Seite verlinkt zur Bearbeitung ins Repo Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: "{{ replace .File.ContentBaseName `-` ` ` | title }}"
|
||||||
|
group: "Allgemein"
|
||||||
|
summary: ""
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
@@ -719,6 +719,38 @@ 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-hint { font-size: var(--font-size-small); color: var(--color-text-muted); align-self: center; opacity: 0.7; }
|
||||||
.dialog-spacer { flex: 1; }
|
.dialog-spacer { flex: 1; }
|
||||||
|
|
||||||
|
/* ── Wiki: zweispaltig (Seitenleiste + Inhalt), schlicht ── */
|
||||||
|
.wiki { display: grid; grid-template-columns: 220px 1fr; gap: 2.6em; align-items: start; width: 100%; }
|
||||||
|
@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; }
|
||||||
|
.wiki-nav-home:hover { color: var(--accent); }
|
||||||
|
.wiki-nav-home.is-current { color: var(--accent); }
|
||||||
|
.wiki-filter { width: 100%; padding: 0.4em 0.7em; margin: 0.3em 0 0.4em; font: inherit; font-size: var(--font-size-small);
|
||||||
|
border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-bg-primary); }
|
||||||
|
.wiki-filter:focus { outline: none; border-color: var(--accent); }
|
||||||
|
.wiki-nav-title { text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.7rem; color: var(--color-text-muted); margin: 0.8em 0 0.25em; }
|
||||||
|
.wiki-nav ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.1em; }
|
||||||
|
.wiki-nav li a { display: block; text-decoration: none; color: var(--color-text-muted);
|
||||||
|
padding: 0.18em 0 0.18em 0.7em; border-left: 2px solid transparent; }
|
||||||
|
.wiki-nav li a:hover { color: var(--accent); }
|
||||||
|
.wiki-nav li a.is-current { color: var(--color-text-primary); font-weight: 600; border-left-color: var(--accent); }
|
||||||
|
|
||||||
|
.wiki-page { min-width: 0; }
|
||||||
|
.wiki-rubric { text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.72rem; color: var(--color-text-muted); margin: 0 0 0.2em; }
|
||||||
|
.wiki-head h1 { margin: 0 0 0.2em; }
|
||||||
|
.wiki-index { margin-top: var(--spacing-md); }
|
||||||
|
.wiki-group { margin-bottom: var(--spacing-md); }
|
||||||
|
.wiki-group h2 { font-family: var(--font-family-serif); font-size: 1.1rem; margin: 0 0 0.4em; }
|
||||||
|
.wiki-group ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4em; }
|
||||||
|
.wiki-group li a { font-weight: 600; text-decoration: none; }
|
||||||
|
.wiki-group li a:hover { color: var(--accent); }
|
||||||
|
.wiki-foot { margin-top: var(--spacing-lg); padding-top: var(--spacing-sm); border-top: 1px solid var(--color-border);
|
||||||
|
display: flex; gap: 1.2em; flex-wrap: wrap; font-size: var(--font-size-small); color: var(--color-text-muted); }
|
||||||
|
.wiki-foot a { color: var(--color-text-muted); text-decoration: none; }
|
||||||
|
.wiki-foot a:hover { color: var(--accent); }
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------
|
||||||
Journal entries — three Republik-style layouts (set in front matter
|
Journal entries — three Republik-style layouts (set in front matter
|
||||||
via `layout: image|icon|text`). Every entry is a full-bleed coloured
|
via `layout: image|icon|text`). Every entry is a full-bleed coloured
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
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.
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
title: "Dateiablage & Benennung"
|
||||||
|
group: "Konventionen"
|
||||||
|
summary: "Wie Projektdateien heissen, damit man sie in fünf Jahren noch findet."
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Eine Konvention ist nur dann eine, wenn sich alle daran halten. Dies ist ein Vorschlag, kein Gesetz — verbessern erwünscht.
|
||||||
|
|
||||||
|
## Projektordner
|
||||||
|
|
||||||
|
Jedes Projekt liegt unter `Projekte/JJJJ_Nummer_Kurzname/`, z. B. `2026_014_Mehrfamilienhaus-Seeblick/`. Das Jahr vorne sortiert chronologisch, die Nummer ist eindeutig, der Kurzname macht es lesbar.
|
||||||
|
|
||||||
|
## Dateinamen
|
||||||
|
|
||||||
|
`JJMMTT_Projekt_Inhalt_vNN` — Datum zuerst (sortiert sich selbst), dann was es ist, dann die Version:
|
||||||
|
|
||||||
|
- `260604_Seeblick_Grundriss-EG_v03.pdf`
|
||||||
|
- `260604_Seeblick_Kostenschaetzung_v01.xlsx`
|
||||||
|
|
||||||
|
Keine Umlaute, keine Leerzeichen, keine Sonderzeichen — Bindestrich trennt Wörter, Unterstrich trennt Felder.
|
||||||
|
|
||||||
|
## Versionen
|
||||||
|
|
||||||
|
`vNN` zählt hoch, nichts wird überschrieben. Die jeweils gültige Fassung bekommt keinen Sonderstatus im Namen — das erledigt das Datum. Wer mit Git arbeitet, lässt die Versionsnummer weg und vertraut der Historie.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: "Typus"
|
||||||
|
group: "Begriffe"
|
||||||
|
summary: "Ein Prinzip, das viele Werke begründet — nicht die Vorlage zum Kopieren."
|
||||||
|
---
|
||||||
|
|
||||||
|
Der **Typus** ist nicht das fertige Vorbild, sondern das zugrunde liegende Prinzip einer Bauaufgabe: das, was eine Markthalle zur Markthalle macht, unabhängig von Ort, Material und Epoche. Vom *Modell* unterscheidet er sich darin, dass man ihn nicht kopiert, sondern gegen ihn entwirft.
|
||||||
|
|
||||||
|
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/).
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
title: "Wie dieses Wiki 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.
|
||||||
|
|
||||||
|
## Eine Seite, ein Begriff
|
||||||
|
|
||||||
|
Lieber viele kleine Seiten als wenige grosse. Eine Seite behandelt einen Begriff, einen Handgriff, eine Entscheidung. Passt etwas nicht mehr auf eine Bildschirmseite, wird es meist zwei Themen sein.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
## Gruppen
|
||||||
|
|
||||||
|
Das Feld `group` im Frontmatter sortiert eine Seite in die Navigation links — z. B. `group: "Begriffe"`. Seiten ohne Gruppe landen unter „Allgemein". Mehr Struktur braucht es selten.
|
||||||
|
|
||||||
|
## 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.
|
||||||
@@ -69,6 +69,9 @@ menus:
|
|||||||
- name: LIBRARY
|
- name: LIBRARY
|
||||||
pageRef: /library
|
pageRef: /library
|
||||||
weight: 20
|
weight: 20
|
||||||
|
- name: WIKI
|
||||||
|
pageRef: /wiki
|
||||||
|
weight: 25
|
||||||
- name: MANIFEST
|
- name: MANIFEST
|
||||||
pageRef: /manifest
|
pageRef: /manifest
|
||||||
weight: 30
|
weight: 30
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{{- /* Wiki-Seitenleiste: alle Wiki-Seiten nach `group` gruppiert, mit Filter.
|
||||||
|
Seiten ohne `group` landen unter „Allgemein“. */ -}}
|
||||||
|
{{- $cur := .RelPermalink -}}
|
||||||
|
{{- $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 -}}
|
||||||
|
<nav class="wiki-nav" aria-label="Wiki-Navigation">
|
||||||
|
<a class="wiki-nav-home{{ if .IsSection }} is-current{{ end }}" href="/wiki/">Übersicht</a>
|
||||||
|
<input class="wiki-filter" type="search" placeholder="filtern…" aria-label="Wiki filtern" autocomplete="off" />
|
||||||
|
{{- range $g, $ps := $groups }}
|
||||||
|
<div class="wiki-nav-group">
|
||||||
|
<div class="wiki-nav-title">{{ $g }}</div>
|
||||||
|
<ul>
|
||||||
|
{{- range sort $ps "Title" }}
|
||||||
|
<li><a href="{{ .RelPermalink }}"{{ if eq .RelPermalink $cur }} class="is-current" aria-current="page"{{ end }}>{{ .LinkTitle }}</a></li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</nav>
|
||||||
|
<script>
|
||||||
|
(function () {
|
||||||
|
if (window.__wikiFilter) return; window.__wikiFilter = 1;
|
||||||
|
var inp = document.querySelector('.wiki-filter'); if (!inp) return;
|
||||||
|
inp.addEventListener('input', function () {
|
||||||
|
var q = inp.value.trim().toLowerCase();
|
||||||
|
document.querySelectorAll('.wiki-nav-group').forEach(function (g) {
|
||||||
|
var any = false;
|
||||||
|
g.querySelectorAll('li').forEach(function (li) {
|
||||||
|
var hit = li.textContent.toLowerCase().indexOf(q) > -1;
|
||||||
|
li.style.display = hit ? '' : 'none'; if (hit) any = true;
|
||||||
|
});
|
||||||
|
g.style.display = any ? '' : 'none';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
<div class="wiki">
|
||||||
|
<aside class="wiki-side">{{ partial "wiki-nav.html" . }}</aside>
|
||||||
|
|
||||||
|
<article class="wiki-page">
|
||||||
|
<header class="wiki-head">
|
||||||
|
<p class="wiki-rubric">Wiki</p>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<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 }}
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
<div class="wiki">
|
||||||
|
<aside class="wiki-side">{{ partial "wiki-nav.html" . }}</aside>
|
||||||
|
|
||||||
|
<article class="wiki-page">
|
||||||
|
<header class="wiki-head">
|
||||||
|
<p class="wiki-rubric">Wiki{{ with .Params.group }} · {{ . }}{{ end }}</p>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
{{ with .Params.summary }}<p class="single-summary">{{ . }}</p>{{ end }}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{ $hasToC := .Params.toc | default false }}
|
||||||
|
{{ $headers := findRE "<h[2-6]" .Content }}
|
||||||
|
{{ if and $hasToC (ge (len $headers) 2) }}
|
||||||
|
<nav class="toc">
|
||||||
|
<strong>Inhalt</strong>
|
||||||
|
<div class="toc-content">{{ .TableOfContents }}</div>
|
||||||
|
</nav>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="single-content wiki-content">
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="wiki-foot">
|
||||||
|
{{ if .Lastmod }}<span>Zuletzt bearbeitet am {{ .Lastmod.Format "02.01.2006" }}</span>{{ end }}
|
||||||
|
{{ with .File }}
|
||||||
|
<a href="{{ site.Params.repoURL }}/_edit/branch/main/content/{{ .Path }}" rel="nofollow">bearbeiten ↗</a>
|
||||||
|
{{ end }}
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
Reference in New Issue
Block a user