consolidate: fold openbureau (+ rapport, dossier) into about; drop it as a standalone nav destination

about now lists cv.md, openbureau.md, rapport.md, dossier.md side by side. the standalone /openbureau/ page, its layout, and its home-menu entry are gone; internal links repointed to /about/. also switch the info-panel text to justified (with hyphenation, per earlier request) instead of ragged-right.
This commit is contained in:
kgva CMS
2026-08-10 22:50:04 +00:00
parent 85148623d7
commit d3f63251eb
10 changed files with 38 additions and 68 deletions
+4 -7
View File
@@ -209,13 +209,10 @@ body:not(.home) .menu { display: none; }
font-family: var(--font-family-serif);
font-size: 0.85em;
line-height: 1.6;
text-align: left;
/* ragged-right with hyphenation reads better than a raw ragged edge at this
column width; :lang() on <html> (set per-page by Hugo) picks the right
hyphenation dictionary for en vs. de automatically. text-wrap:pretty asks
the browser to look ahead across the whole paragraph (not just line by
line) so the rag varies naturally instead of coming out too even or
leaving a short orphan on the last line. */
text-align: justify;
/* justified needs hyphenation, otherwise a narrow column like this one gets
ugly gaps between words; :lang() on <html> (set per-page by Hugo) picks
the right hyphenation dictionary for en vs. de automatically. */
hyphens: auto;
-webkit-hyphens: auto;
text-wrap: pretty;
-1
View File
@@ -44,7 +44,6 @@
["ok", "Mounted /", 50],
["ok", "Mounted /portfolio", 50],
["ok", "Mounted /about", 50],
["ok", "Mounted /openbureau", 50],
["ok", "Mounted /cv", 50],
["ok", "Mounted /colophon", 110],
["st", "Prerendering portfolio...", 220],
+3 -4
View File
@@ -110,7 +110,7 @@
var email = bar.getAttribute("data-email");
if (info) lines.push(info);
if (email) lines.push(email);
lines.push("type: portfolio · about · openbureau");
lines.push("type: portfolio · about");
return lines.join("\n");
}
@@ -151,7 +151,6 @@
l.push("├── portfolio/");
work.forEach(function (s, i) { l.push("│ " + (i === work.length - 1 ? "└── " : "├── ") + s + "/"); });
l.push("├── about/");
l.push("├── openbureau/");
l.push("├── .colophon");
l.push("└── .legal-notice");
return l.join("\n");
@@ -167,7 +166,7 @@
" |_|\\_\\ degree: ba architecture",
" status: ma in progress",
" uptime: " + up + "s",
" ~: portfolio · about · openbureau"
" ~: portfolio · about"
].join("\n");
}
@@ -258,7 +257,7 @@
if (/^rm\b/.test(lc)) return "rm: some things you keep.";
if (lc === "whoami") return "karim";
if (lc === "pwd") return pwd();
if (lc === "help" || /^man\b/.test(lc)) return "nav: portfolio · about · openbureau · cv\nbasics: info · contact · date · time · tree · fetch · history\ntheme: dark · light";
if (lc === "help" || /^man\b/.test(lc)) return "nav: portfolio · about · cv\nbasics: info · contact · date · time · tree · fetch · history\ntheme: dark · light";
if (lc === "hello" || lc === "hi" || lc === "hey") return "hi :)";
if (lc === "exit" || lc === "logout") return "there is no exit. only architecture.";
if (lc === "coffee" || lc === "brew") return "☕ brewing… (418: i'm a teapot)";
+2 -2
View File
@@ -8,10 +8,10 @@ diese seite ist ein kleines terminal.
sie ist statisch. hugo verwandelt meinen text in einfache html-dateien, und mehr gibt der server nie heraus. keine datenbank, kein backend, nichts zum einloggen. sie läuft auf fast jedem host.
die leiste oben ist eine echte shell. du kannst darin tippen. portfolio, about, openbureau bringen dich zu diesen seiten. help zeigt die grundlagen, tab vervollständigt ein wort, die pfeiltaste nach oben holt zurück, was du vorher getippt hast. nicht alles, was sie kennt, steht in der liste. jede seite ist auch eine dateiliste, du kannst die projekte und sogar das impressum wie verzeichnisse durchsehen und an ort und stelle lesen.
die leiste oben ist eine echte shell. du kannst darin tippen. portfolio, about bringen dich zu diesen seiten. help zeigt die grundlagen, tab vervollständigt ein wort, die pfeiltaste nach oben holt zurück, was du vorher getippt hast. nicht alles, was sie kennt, steht in der liste. jede seite ist auch eine dateiliste, du kannst die projekte und sogar das impressum wie verzeichnisse durchsehen und an ort und stelle lesen.
der rest sind kleinigkeiten. die schrift ist iosevka, hier gehostet und von niemandem nachgeladen. der cursor ist pixel für pixel gezeichnet. es gibt einen dunkelmodus, wenn du dark tippst. nichts wird verfolgt, keine cookies, kein tracking.
sie folgt derselben idee wie [openbureau](/de/openbureau/): besitze deine werkzeuge, halte deine formate lesbar. die inhalte stehen unter cc by-sa, hugo und das theme sind open source (das [impressum](/de/legal-notice/) hat die details), und die seite baut zu einem docker-image, sodass jeder seine eigene kopie betreiben kann.
sie folgt derselben idee wie [openbureau](/de/about/): besitze deine werkzeuge, halte deine formate lesbar. die inhalte stehen unter cc by-sa, hugo und das theme sind open source (das [impressum](/de/legal-notice/) hat die details), und die seite baut zu einem docker-image, sodass jeder seine eigene kopie betreiben kann.
geschrieben zwischen rheintal und luzern.
+2 -2
View File
@@ -8,10 +8,10 @@ this site is a small terminal.
it's static. hugo turns my text into plain html files, and that's all the server ever hands out. no database, no backend, nothing to log into. it runs on almost any host.
the bar at the top is a real shell. you can type in it. work, about, openbureau take you to those pages. help shows the basics, tab completes a word, the up arrow brings back what you typed before. not everything it knows is in the list. every page is also a file listing, so you browse the projects, and even the legal notice, like directories and read them on the spot.
the bar at the top is a real shell. you can type in it. work, about take you to those pages. help shows the basics, tab completes a word, the up arrow brings back what you typed before. not everything it knows is in the list. every page is also a file listing, so you browse the projects, and even the legal notice, like directories and read them on the spot.
the rest is small things. the type is iosevka, hosted here and not pulled from anyone. the cursor is drawn pixel by pixel. there's a dark mode if you type dark. nothing is tracked, no cookies, no analytics.
it follows the same idea as [openbureau](/openbureau/): own your tools, keep your formats readable. the content is cc by-sa, hugo and the theme are open source (the [legal notice](/legal-notice/) has the details), and the site builds into a docker image so anyone can run their own copy.
it follows the same idea as [openbureau](/about/): own your tools, keep your formats readable. the content is cc by-sa, hugo and the theme are open source (the [legal notice](/legal-notice/) has the details), and the site builds into a docker image so anyone can run their own copy.
written between the rhine valley and lucerne.
+3 -1
View File
@@ -1,7 +1,9 @@
---
title: "openbureau"
description: "offene und selbst besessene werkzeuge für die architektur"
layout: "openbureau"
build:
render: never
list: never
---
architektur läuft auf werkzeugen. die werkzeuge formen, was gedacht, gezeichnet und gebaut wird. die meisten sind proprietär: abonnements, die gekündigt werden können, dateiformate, die nur ihre eigentümer lesen können, arbeit, die verschwindet, wenn eine lizenz ausläuft. in einem beruf, der ohnehin auf prekärer arbeit läuft, ist das mietabschöpfung.
+3 -1
View File
@@ -1,7 +1,9 @@
---
title: "openbureau"
description: "open and self-owned tools for architecture"
layout: "openbureau"
build:
render: never
list: never
---
architecture runs on tools. the tools shape what gets thought, drawn, and built. most are proprietary: subscriptions that can be cancelled, file formats only their owners can read, work that disappears when a license lapses. in a profession that already runs on precarious labor, that's rent extraction.
-8
View File
@@ -34,10 +34,6 @@ enableRobotsTXT = true
name = "about"
pageRef = "/about"
weight = 2
[[languages.en.menu.main]]
name = "openbureau"
pageRef = "/openbureau"
weight = 4
[languages.de]
locale = "de_CH"
@@ -54,10 +50,6 @@ enableRobotsTXT = true
name = "about"
pageRef = "/about"
weight = 2
[[languages.de.menu.main]]
name = "openbureau"
pageRef = "/openbureau"
weight = 4
[markup]
[markup.goldmark.renderer]
+21 -7
View File
@@ -1,23 +1,37 @@
{{ define "bodyclass" }}page-about{{ end }}
{{ define "main" }}
{{ $cv := .Site.GetPage "/cv" }}
{{ $files := slice
(.Site.GetPage "/cv")
(.Site.GetPage "/openbureau")
(.Site.GetPage "/ob/rapport")
(.Site.GetPage "/ob/dossier") }}
{{ $names := slice "cv.md" "openbureau.md" "rapport.md" "dossier.md" }}
{{ $total := 0 }}{{ range $files }}{{ if . }}{{ $total = add $total 1 }}{{ end }}{{ end }}
<div class="proj-layout">
{{ if $cv }}
{{ if gt $total 0 }}
<div class="tui tui--files filebrowser">
<p class="tui__cmd"><span class="tui__sym">$</span> ls</p>
<p class="tui__cmd tui__total">total 1</p>
<p class="tui__cmd tui__total">total {{ $total }}</p>
<ul class="tui__ls">
<li><a href="{{ "/" | relLangURL }}" data-name="..">
<span class="tui__perm">drwxr-xr-x</span><span class="tui__name">..</span>
</a></li>
<li><a data-name="cv.md" data-text="cv.md" class="is-selected">
<span class="tui__perm">-rw-r--r--</span><span class="tui__name">cv.md</span>
{{ $first := true }}
{{ range $i, $p := $files }}{{ if $p }}
<li><a data-name="{{ index $names $i }}" data-text="{{ index $names $i }}"{{ if $first }} class="is-selected"{{ end }}>
<span class="tui__perm">-rw-r--r--</span><span class="tui__name">{{ index $names $i }}</span>
</a></li>
{{ $first = false }}
{{ end }}{{ end }}
</ul>
<figure class="tui__preview">
<div class="tui__text" data-text="cv.md">{{ $cv.Content }}</div>
<figcaption class="tui__status">cv.md</figcaption>
{{ $first := true }}
{{ range $i, $p := $files }}{{ if $p }}
<div class="tui__text" data-text="{{ index $names $i }}"{{ if not $first }} hidden{{ end }}>{{ $p.Content }}</div>
{{ $first = false }}
{{ end }}{{ end }}
<figcaption class="tui__status">{{ range $i, $p := $files }}{{ if $p }}{{ index $names $i }}{{ break }}{{ end }}{{ end }}</figcaption>
</figure>
</div>
{{ end }}
-35
View File
@@ -1,35 +0,0 @@
{{ define "bodyclass" }}page-openbureau{{ end }}
{{ define "main" }}
{{ $rapport := .Site.GetPage "/ob/rapport" }}
{{ $dossier := .Site.GetPage "/ob/dossier" }}
<div class="tui tui--files filebrowser">
<p class="tui__cmd"><span class="tui__sym">$</span> ls</p>
{{ $total := 1 }}{{ if $rapport }}{{ $total = add $total 1 }}{{ end }}{{ if $dossier }}{{ $total = add $total 1 }}{{ end }}
<p class="tui__cmd tui__total">total {{ $total }}</p>
<ul class="tui__ls">
<li><a href="{{ "/" | relLangURL }}" data-name="..">
<span class="tui__perm">drwxr-xr-x</span><span class="tui__name">..</span>
</a></li>
<li><a data-name="info.md" data-text="info.md" class="is-selected">
<span class="tui__perm">-rw-r--r--</span><span class="tui__name">info.md</span>
</a></li>
{{ if $rapport }}
<li><a data-name="rapport.md" data-text="rapport.md">
<span class="tui__perm">-rw-r--r--</span><span class="tui__name">rapport.md</span>
</a></li>
{{ end }}
{{ if $dossier }}
<li><a data-name="dossier.md" data-text="dossier.md">
<span class="tui__perm">-rw-r--r--</span><span class="tui__name">dossier.md</span>
</a></li>
{{ end }}
</ul>
<figure class="tui__preview">
<div class="tui__text" data-text="info.md">{{ .Content }}</div>
{{ if $rapport }}<div class="tui__text" data-text="rapport.md" hidden>{{ $rapport.Content }}</div>{{ end }}
{{ if $dossier }}<div class="tui__text" data-text="dossier.md" hidden>{{ $dossier.Content }}</div>{{ end }}
<figcaption class="tui__status">info.md</figcaption>
</figure>
</div>
{{ end }}