commit 00c3343b1d58a59c0e9fa0de320147644e857785 Author: karim Date: Sat May 23 20:25:29 2026 +0200 init: scaffold OPENBUREAU site with shibui-derived theme - Hugo site for openbureau.ch (Deutsch, i18n-ready for EN/IT) - Theme themes/openbureau/ = local copy of shibui, customized via site-level layouts and assets to keep the theme reference clean - Editorial typography stack: Newsreader serif body, Space Grotesk display, Inter for listings, IBM Plex Mono for technical meta - Content structure: library/ (Theorie, Büroführung, Software) with manifest and colophon at root; software is a library category, not a separate top-level - Three views over one source: Journal (chronological home), Library (atlas grouped by section + tag cloud), single articles Co-Authored-By: Claude Opus 4.7 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24985e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Hugo +/public/ +/resources/ +.hugo_build.lock +hugo_stats.json + +# macOS +.DS_Store +**/.DS_Store + +# Editors +.vscode/ +.idea/ +*.swp +*.swo + +# Local secrets / overrides +.env +.env.local +hugo.local.yaml diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..9b0a7ed --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,620 @@ +/* ======================================================================== + OPENBUREAU — site-level overrides on top of shibui. + Differentiation from kgva.ch: serif body, strong wordmark, wider column, + editorial journal entries (not portfolio cards), more breathing room, + no 8bit cursor. + ======================================================================== */ + +@import url('https://fonts.bunny.net/css?family=newsreader:400,400i,500,500i,600,600i|ibm-plex-mono:400,500|space-grotesk:400,500,700|inter:400,500,600'); + +:root { + /* Typography — editorial: + serif body, display for headings/nav, sans (Inter) for listings/labels, + mono kept narrow (code, dates, technical stamps). */ + --font-family-serif: 'Newsreader', Charter, 'Source Serif Pro', Georgia, serif; + --font-family-sans: 'Inter', system-ui, -apple-system, sans-serif; + --font-family-mono: 'IBM Plex Mono', 'Courier New', ui-monospace, monospace; + --font-family-display: 'Space Grotesk', 'Inter', system-ui, sans-serif; + --font-family-mono-shibui: var(--font-family-mono); + + --font-size-base: 1.0625rem; + --font-size-small: 0.875rem; + --font-size-code: 0.92rem; + + --spacing-base: 1.7em; + --spacing-xs: calc(var(--spacing-base) * 0.25); + --spacing-sm: calc(var(--spacing-base) * 0.5); + --spacing-md: var(--spacing-base); + --spacing-lg: calc(var(--spacing-base) * 2); + --spacing-xl: calc(var(--spacing-base) * 3); + + --container-width: 72ch; + + /* Off-white paper + warm ink */ + --bg-h: 35; + --bg-s: 14%; + --bg-l: 96%; + + --color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l)); + --color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 3%)); + --color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 12%)); + --color-text-primary: hsl(25 18% 10%); + --color-text-muted: hsl(25 8% 38%); + --color-text-code: hsl(25 10% 22%); + + --accent: #b54a2c; + --accent-soft: #d97a5a; + + color-scheme: light; +} + +/* ------------------------------------------------------------------------ + Base body — serif by default (editorial) + ------------------------------------------------------------------------ */ +body { + font-family: var(--font-family-serif); + font-size: var(--font-size-base); + line-height: 1.55; + padding: var(--spacing-sm) 1.75rem var(--spacing-xl); + gap: var(--spacing-sm); + display: grid; + grid-template-rows: auto 1fr auto; + grid-template-columns: minmax(auto, var(--container-width)); + justify-content: center; +} + + +p { margin: var(--spacing-sm) 0; } +h1, h2, h3, h4, h5 { font-family: var(--font-family-display); font-weight: 600; } + +/* Disable shibui's nested h2/h3/h4 counters everywhere on this site */ +h2::before, h3::before, h4::before, h5::before { content: none !important; } + +code, pre, kbd, samp { font-family: var(--font-family-mono); } +code { font-size: var(--font-size-code); } + +a { + color: var(--color-text-primary); + border-bottom: 1px solid var(--color-border); + text-decoration: none; + margin-left: 0; +} +a:hover { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* ------------------------------------------------------------------------ + Site header — strong wordmark, not breadcrumb-first + ------------------------------------------------------------------------ */ +/* 2-column header: wordmark left edge of content | nav right edge of content. + Center-aligned vertically so wordmark and nav read as one masthead line. */ +.site-header { + display: grid; + grid-template-columns: auto 1fr; + align-items: center; + column-gap: 2rem; + row-gap: 0.6rem; + padding-bottom: var(--spacing-sm); + border-bottom: 1px solid var(--color-border); +} + +.wordmark-link { + border: none; + margin: 0; + padding: 0; + display: inline-block; + grid-column: 1; + justify-self: start; + font-family: var(--font-family-display); + font-weight: 700; + font-size: clamp(1.2rem, 2.4vw, 1.5rem); + letter-spacing: -0.01em; + line-height: 1; + color: var(--color-text-primary); +} +.wordmark-link:hover, +.wordmark-link:focus { color: var(--color-text-primary); border: none; } + +.site-header .site-nav { + grid-column: 2; + justify-self: end; +} + +/* Mobile: stack */ +@media (max-width: 720px) { + .site-header { + grid-template-columns: 1fr; + align-items: start; + row-gap: 0.4rem; + } + .wordmark-link, + .site-header .site-nav { + grid-column: 1; + justify-self: start; + } +} + +.wordmark-link:focus-visible { outline: 2px dotted var(--color-text-muted); outline-offset: 4px; } + +.wordmark-tagline { + font-family: var(--font-family-serif); + font-style: italic; + font-size: var(--font-size-small); + color: var(--color-text-muted); + margin: 0; + max-width: 32ch; + line-height: 1.35; + text-align: right; +} +@media (max-width: 720px) { + .wordmark-tagline { text-align: left; max-width: 38ch; } +} + +/* Site nav — horizontal, lowercase-strong, mono */ +.site-nav nav { + margin: 0; +} +.site-nav ul { + list-style: none; + margin-left: 0; + display: flex; + flex-wrap: wrap; + gap: 0.25rem 1.4rem; + font-family: var(--font-family-display); + font-size: 0.9rem; + font-weight: 500; + letter-spacing: 0.02em; +} +.site-nav li { margin: 0; } +.site-nav a { border: none; } +.site-nav a.active, +.site-nav a.ancestor { + color: var(--accent); +} + +/* Breadcrumb (only on non-home pages) */ +.path-nav { + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.03em; +} +.path-nav ol { + list-style: none; + margin-left: 0; + display: flex; + flex-wrap: wrap; + gap: 0.2rem; +} +.path-nav li { margin: 0; } +.path-nav a { + border: none; + color: var(--color-text-muted); +} +.path-nav a:hover { color: var(--accent); } +.path-nav li.current a { color: var(--color-text-primary); } + +/* ------------------------------------------------------------------------ + Journal (home) — editorial entries, not portfolio cards + ------------------------------------------------------------------------ */ +.journal-header { + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-md); +} +.journal-header h2 { + font-size: 0.95rem; + font-family: var(--font-family-mono); + font-weight: 500; + letter-spacing: 0.05em; + color: var(--color-text-muted); + margin: 0 0 0.25rem; +} +.journal-header p { + margin: 0; + font-style: italic; +} + +.journal-list { + list-style: none; + margin-left: 0; + display: flex; + flex-direction: column; + gap: 0; +} + +.journal-entry { + border-top: 1px solid var(--color-border); + padding: 1rem 0 1.1rem; +} +.journal-entry:last-child { border-bottom: 1px solid var(--color-border); } + +/* Grid with explicit row-gap: bulletproof against margin/line-height inheritance */ +.journal-entry-link { + display: grid; + grid-auto-flow: row; + row-gap: 0.45rem; + border: none; + margin: 0; + padding: 0; +} +.journal-entry-link > * { margin: 0; } +.journal-entry-link:hover .journal-title { color: var(--accent); } + +.journal-meta { + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + line-height: 1.3; + color: var(--color-text-muted); + display: flex; + gap: 0.8rem; + align-items: baseline; +} +.journal-section { color: var(--accent); font-weight: 500; } +.journal-date { font-variant-numeric: tabular-nums; } + +.journal-title { + font-family: var(--font-family-display); + font-size: 1.2rem; + font-weight: 600; + letter-spacing: -0.012em; + line-height: 1.2; + color: var(--color-text-primary); + transition: color 0.15s ease; +} + +.journal-summary { + font-family: var(--font-family-serif); + font-size: var(--font-size-base); + line-height: 1.45; + color: var(--color-text-primary); + max-width: 60ch; +} + +.journal-tags { + list-style: none; + display: flex; + flex-wrap: wrap; + gap: 0.6rem; + font-family: var(--font-family-sans); + font-size: 0.78rem; + line-height: 1.2; + color: var(--color-text-muted); + padding: 0; +} +.journal-tags li { margin: 0; } + +.more { + margin-top: var(--spacing-md); + font-family: var(--font-family-mono); + font-size: var(--font-size-small); +} + +/* ------------------------------------------------------------------------ + Library — Atlas view + ------------------------------------------------------------------------ */ +.atlas { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + margin-top: var(--spacing-md); +} +.atlas-section h2, +.atlas-tags h2 { + font-family: var(--font-family-display); + font-size: 1.15rem; + font-weight: 600; + letter-spacing: -0.005em; + color: var(--color-text-primary); + border-bottom: 1px solid var(--color-border); + padding-bottom: var(--spacing-xs); + margin-bottom: var(--spacing-sm); +} +.atlas-section h2 a, +.atlas-tags h2 a { border: none; color: inherit; } +.atlas-section h2 a:hover { color: var(--accent); } +.atlas-section > p { font-style: italic; color: var(--color-text-muted); margin-bottom: var(--spacing-sm); } + +.atlas-list { + list-style: none; + margin-left: 0; + display: flex; + flex-direction: column; + gap: 0.5rem; +} +.atlas-list li { + display: flex; + gap: 0.6rem; + align-items: baseline; + flex-wrap: wrap; +} +.atlas-list .list-meta { font-family: var(--font-family-mono); font-size: 0.78rem; } + +.tag-cloud { + list-style: none; + margin-left: 0; + display: flex; + flex-wrap: wrap; + gap: 0.5rem 1.1rem; + font-family: var(--font-family-sans); + font-size: var(--font-size-small); +} +.tag-cloud li { margin: 0; } +.tag-cloud a { border: none; } + +/* ------------------------------------------------------------------------ + Library subsection (chronological list) + ------------------------------------------------------------------------ */ +.time-list ul { + list-style: none; + margin-left: 0; +} +.list-item { + border-top: 1px solid var(--color-border); + padding: var(--spacing-sm) 0; +} +.list-item:last-child { border-bottom: 1px solid var(--color-border); } +.list-title-row { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1rem; +} +.list-title { + margin: 0; + font-family: var(--font-family-display); + font-size: 1.15rem; + font-weight: 500; + flex: 1; +} +.list-title a { border: none; } +.list-meta { + font-family: var(--font-family-mono); + font-size: 0.8rem; + color: var(--color-text-muted); + white-space: nowrap; +} +.list-summary { + margin-top: 0.3rem; + font-style: italic; + line-height: 1.45; +} + +/* ------------------------------------------------------------------------ + Software showcase + ------------------------------------------------------------------------ */ +.software-showcase { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + margin-top: var(--spacing-md); +} +.software-item { + border-top: 1px solid var(--color-border); + padding-top: var(--spacing-md); +} +.software-item:last-child { border-bottom: 1px solid var(--color-border); padding-bottom: var(--spacing-md); } +.software-item h2 { + font-family: var(--font-family-display); + font-size: 1.8rem; + letter-spacing: -0.015em; + margin: 0 0 0.4rem; +} +.software-item h2 a { border: none; } +.software-summary { + margin: 0 0 0.5rem; + font-style: italic; + color: var(--color-text-primary); + max-width: 55ch; +} +.software-meta { + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + display: flex; + gap: 0.4rem; + align-items: baseline; + flex-wrap: wrap; +} +.software-external { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* ------------------------------------------------------------------------ + Single page (article) + ------------------------------------------------------------------------ */ +.single { margin-top: var(--spacing-md); } +.single-header { margin-bottom: var(--spacing-md); } +.single-header h1 { + font-family: var(--font-family-display); + font-size: clamp(1.2rem, 2.4vw, 1.5rem); + font-weight: 700; + letter-spacing: -0.01em; + line-height: 1.15; + margin: 0 0 var(--spacing-xs); +} +.single-summary { + font-family: var(--font-family-serif); + font-style: italic; + font-size: 1.02rem; + line-height: 1.45; + margin: 0; + max-width: 55ch; +} +.single-content h2 { + font-family: var(--font-family-display); + font-size: 1.15rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-xs); +} +.single-content h3 { + font-family: var(--font-family-display); + font-size: 1rem; + font-weight: 600; + margin-top: var(--spacing-sm); + margin-bottom: var(--spacing-xs); +} +.single-content blockquote { + border-left: 2px solid var(--accent); + padding-left: 1rem; + margin: var(--spacing-md) 0; + font-style: italic; + color: var(--color-text-muted); +} +.single-content ul, .single-content ol { margin: var(--spacing-sm) 0 var(--spacing-sm) 1.6rem; } +.single-content li { margin: 0.3rem 0; } + +.toc { + font-family: var(--font-family-sans); + font-size: var(--font-size-small); + line-height: 1.45; + border-left: 2px solid var(--color-border); + padding: var(--spacing-xs) 0 var(--spacing-xs) var(--spacing-sm); + margin-bottom: var(--spacing-lg); + color: var(--color-text-muted); +} +.toc strong { + color: var(--color-text-primary); + display: block; + margin-bottom: 0.4rem; + font-size: 0.78rem; + font-weight: 600; + letter-spacing: 0.02em; +} +.toc a { border: none; color: var(--color-text-muted); } +.toc a:hover { color: var(--accent); } +.toc ul, .toc ol { margin: 0 0 0 1.2rem; padding: 0; } +.toc li { margin: 0.15rem 0; } + +.time { + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + color: var(--color-text-muted); + margin-top: var(--spacing-lg); + padding-top: var(--spacing-sm); + border-top: 1px solid var(--color-border); +} + +.back-nav-wrap { + margin-top: var(--spacing-md); + font-family: var(--font-family-mono); + font-size: var(--font-size-small); +} +.back-link { border: none; color: var(--color-text-muted); } +.back-link:hover { color: var(--accent); } + +/* ------------------------------------------------------------------------ + Page foot breadcrumb (moved from top → bottom) + ------------------------------------------------------------------------ */ +.page-foot-nav { + margin-top: var(--spacing-lg); + padding-top: var(--spacing-sm); + border-top: 1px solid var(--color-border); + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.03em; +} +.page-foot-nav ol { + list-style: none; + margin-left: 0; + display: flex; + flex-wrap: wrap; + gap: 0.2rem; +} +.page-foot-nav li { margin: 0; } +.page-foot-nav a { border: none; color: var(--color-text-muted); } +.page-foot-nav a:hover { color: var(--accent); } +.page-foot-nav li.current a { color: var(--color-text-primary); } + +/* ------------------------------------------------------------------------ + Footer — mirrors the header rhythm: 2-col grid, baseline-aligned, + wordmark left, nav right; below: tagline left, credit right. + Text left-aligned everywhere (no centering). + ------------------------------------------------------------------------ */ +footer { + margin-top: var(--spacing-xl); + padding-top: var(--spacing-md); + border-top: 1px solid var(--color-border); + color: var(--color-text-muted); +} +footer a { color: var(--color-text-muted); border: none; } +footer a:hover { color: var(--accent); } +footer p { text-align: left; margin: 0; } + +.footer-grid { + display: grid; + grid-template-columns: auto 1fr; + align-items: baseline; + column-gap: 2rem; + row-gap: var(--spacing-sm); +} + +.footer-mark { + grid-column: 1; + font-family: var(--font-family-display); + font-weight: 600; + font-size: 0.95rem; + letter-spacing: 0.01em; + color: var(--color-text-primary); +} + +.footer-nav { + grid-column: 2; + justify-self: end; +} +.footer-nav ul { + list-style: none; + margin-left: 0; + display: flex; + flex-wrap: wrap; + gap: 0.4rem 1.2rem; + font-family: var(--font-family-display); + font-size: 0.85rem; + font-weight: 500; + letter-spacing: 0.01em; +} +.footer-nav li { margin: 0; } + +.footer-tagline { + grid-column: 1; + font-family: var(--font-family-serif); + font-style: italic; + font-size: var(--font-size-small); + line-height: 1.4; + max-width: 36ch; +} + +.footer-credit { + grid-column: 2; + justify-self: end; + font-family: var(--font-family-mono); + font-size: 0.78rem; +} + +/* Mobile: stack everything left */ +@media (max-width: 720px) { + .footer-grid { grid-template-columns: 1fr; } + .footer-mark, + .footer-nav, + .footer-tagline, + .footer-credit { + grid-column: 1; + justify-self: start; + } +} + +/* ------------------------------------------------------------------------ + Images — keep grayscale-on-hover but no portfolio aspect-ratio crop + ------------------------------------------------------------------------ */ +img { + filter: grayscale(100%); + transition: filter 0.4s ease; + max-width: 100%; + height: auto; + margin: var(--spacing-sm) 0; +} +img:hover { filter: grayscale(0%); } diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..885e532 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,7 @@ +--- +title: "OPENBUREAU" +description: "Eine offene Plattform für Architekturpraxis, Theorie und Werkzeuge." +--- + +Ein offenes Architekturbüro — Sammlung, Plattform, Praxis. +Hier wachsen Texte, Werkzeuge und Gespräche über das Machen von Architektur. diff --git a/content/colophon.md b/content/colophon.md new file mode 100644 index 0000000..4b21936 --- /dev/null +++ b/content/colophon.md @@ -0,0 +1,24 @@ +--- +title: "Colophon" +date: 2026-05-23 +toc: false +--- + +OPENBUREAU wird von **Karim Gabriele Varano** geführt. +Mitwirkende werden auf dieser Seite namentlich aufgeführt — sobald sie da sind. + +## Technik + +- Site generiert mit [Hugo](https://gohugo.io), Theme abgeleitet von [Shibui](https://github.com/ntk148v/shibui). +- Code in eigener [Gitea](https://gitea.kgva.ch)-Instanz. +- Diskussion in eigener [Flarum](https://openstudio.kgva.ch)-Instanz. +- Selbst-gehostet auf eigener Infrastruktur. + +## Lizenz + +Texte: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) — geteilt unter gleicher Lizenz. +Code: jeweils im Repository ausgewiesen (überwiegend MIT/AGPL). + +## Kontakt + +[karim@gabrielevarano.ch](mailto:karim@gabrielevarano.ch) diff --git a/content/library/_index.md b/content/library/_index.md new file mode 100644 index 0000000..e26bc38 --- /dev/null +++ b/content/library/_index.md @@ -0,0 +1,7 @@ +--- +title: "Library" +description: "Die Bibliothek von OPENBUREAU — Texte, Notizen, Recherchen." +--- + +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. diff --git a/content/library/buerofuehrung/_index.md b/content/library/buerofuehrung/_index.md new file mode 100644 index 0000000..50959be --- /dev/null +++ b/content/library/buerofuehrung/_index.md @@ -0,0 +1,4 @@ +--- +title: "Büroführung" +description: "Wie wir ein offenes Architekturbüro organisieren — Honorare, Verträge, Werkzeuge, Workflow." +--- diff --git a/content/library/buerofuehrung/warum-offen.md b/content/library/buerofuehrung/warum-offen.md new file mode 100644 index 0000000..c89a3c2 --- /dev/null +++ b/content/library/buerofuehrung/warum-offen.md @@ -0,0 +1,20 @@ +--- +title: "Warum ein offenes Büro" +date: 2026-05-22 +tags: ["büroführung", "praxis", "open-source"] +summary: "Ein offenes Architekturbüro ist nicht karitativ — es ist praktischer, robuster, ehrlicher." +--- + +Architektur ist traditionell ein geschlossener Beruf. Wettbewerbe sind nicht-öffentlich, Verträge nicht-verhandelbar, Werkzeuge proprietär. Wissen wird gehortet, weil es als Wettbewerbsvorteil verstanden wird. + +Wir bezweifeln, dass das stimmt. + +**Offen** zu arbeiten heisst hier dreierlei: + +1. **Texte und Notizen sind öffentlich.** Wer mitlesen will, kann das. +2. **Werkzeuge sind frei.** Programme wie DOSSIER und RAPPORT sind quelloffen, andere dürfen sie nutzen, anpassen, weiterbauen. +3. **Verträge und Honorare sind dokumentiert.** Wir zeigen, wie ein offenes Büro sich finanziert, ohne das gegen sich zu drehen. + +Das ist kein karitatives Projekt. Es ist eine Wette darauf, dass **Offenheit produktiver ist als Abschottung** — für die Praxis, für die Kollegen, für die Disziplin. + +— mehr dazu in den folgenden Notizen. diff --git a/content/library/software/_index.md b/content/library/software/_index.md new file mode 100644 index 0000000..7f4f1c1 --- /dev/null +++ b/content/library/software/_index.md @@ -0,0 +1,6 @@ +--- +title: "Software" +description: "Was wir bauen, was wir benutzen — und warum." +--- + +Eigene Programme wie **DOSSIER** und **RAPPORT**, der **empfohlene Stack** für ein offenes Architekturbüro, und Texte über Werkzeuge. diff --git a/content/library/software/dossier.md b/content/library/software/dossier.md new file mode 100644 index 0000000..1fdf53a --- /dev/null +++ b/content/library/software/dossier.md @@ -0,0 +1,13 @@ +--- +title: "DOSSIER" +date: 2026-05-23 +weight: 10 +tags: ["software", "eigene-werkzeuge"] +summary: "Projektorganisation für ein Architekturbüro — von der Anfrage zur Übergabe." +external: "https://dossier.gabrielevarano.ch" +--- + +**DOSSIER** ist die Projektverwaltung von OPENBUREAU. +Eine Anwendung, die ein Projekt von der ersten Anfrage bis zur Schlussrechnung begleitet — strukturiert, nachvollziehbar, offen. + +→ [dossier.gabrielevarano.ch](https://dossier.gabrielevarano.ch) diff --git a/content/library/software/eigene-werkzeuge.md b/content/library/software/eigene-werkzeuge.md new file mode 100644 index 0000000..f62969c --- /dev/null +++ b/content/library/software/eigene-werkzeuge.md @@ -0,0 +1,15 @@ +--- +title: "Warum wir eigene Werkzeuge bauen" +date: 2026-05-21 +tags: ["software", "praxis", "tools"] +summary: "DOSSIER und RAPPORT sind keine Lifestyle-Projekte — sie sind Reaktion auf konkrete Lücken." +--- + +Wir benutzen viel fremde Software. Aber an zwei Stellen kam keiner der existierenden Werkzeuge an die Praxis heran, die wir brauchten — also haben wir selbst gebaut. + +- **[DOSSIER](https://dossier.gabrielevarano.ch)** organisiert Projekte: von der ersten Anfrage über Vertrag, Planstände, Rechnungen bis zur Übergabe. Strukturiert genug, um nichts zu verlieren; offen genug, um nicht im Weg zu stehen. +- **[RAPPORT](https://rapport.gabrielevarano.ch)** hält Stunden, Wege und Aufwand fest. Nicht als Überwachung, sondern als Material für die nächste Honoraroffert. + +Beide sind quelloffen. Beide sind im Aufbau. Beide sind so geschrieben, dass ein anderes Büro sie morgen für sich nutzen könnte. + +Eine vollständige Liste der **anderen** Werkzeuge, die wir empfehlen, findet sich unter [Werkzeuge](/library/werkzeuge). diff --git a/content/library/software/rapport.md b/content/library/software/rapport.md new file mode 100644 index 0000000..2a68b58 --- /dev/null +++ b/content/library/software/rapport.md @@ -0,0 +1,13 @@ +--- +title: "RAPPORT" +date: 2026-05-23 +weight: 20 +tags: ["software", "eigene-werkzeuge"] +summary: "Zeit- und Aufwandserfassung für ein Architekturbüro." +external: "https://rapport.gabrielevarano.ch" +--- + +**RAPPORT** erfasst Stunden, Wege und Aufwand. +Material für transparente Honorarofferten, nicht für Überwachung. + +→ [rapport.gabrielevarano.ch](https://rapport.gabrielevarano.ch) diff --git a/content/library/software/stack.md b/content/library/software/stack.md new file mode 100644 index 0000000..02db581 --- /dev/null +++ b/content/library/software/stack.md @@ -0,0 +1,32 @@ +--- +title: "Empfohlener Stack" +date: 2026-05-23 +weight: 30 +tags: ["software", "stack", "empfehlungen"] +summary: "Programme und Dienste, die wir Tag für Tag benutzen — kuratiert und kommentiert." +--- + +Diese Liste wächst. Sie ist kein Inventar, sondern eine **Position**: jedes Werkzeug steht für eine Entscheidung über die Arbeitsweise des Büros. + +## Zeichnen & Modellieren + +- **Rhino + Grasshopper** — das Rückgrat des geometrischen Arbeitens. Wir entwickeln eigene Plugins ([Rhino-Panel](https://gitea.kgva.ch)). +- **Blender** — für freie 3D-Arbeiten, Visualisierungen, Animation. + +## Schreiben & Dokumentieren + +- **Markdown + Hugo** — alle Texte, auch diese hier, sind `.md` und werden statisch generiert. +- **Zotero** — Literatur und Quellen. + +## Koordination + +- **Gitea** (selbst-gehostet) — Code, Texte, Repositories. +- **Flarum** (selbst-gehostet) — Diskussion und Gespräch. +- **Nextcloud** (selbst-gehostet) — Dateien, Kalender, Kontakte. + +## Eigene Werkzeuge + +- **[DOSSIER](/library/software/dossier/)** — Projektverwaltung. +- **[RAPPORT](/library/software/rapport/)** — Stundenerfassung. + +— diese Seite wird laufend erweitert. diff --git a/content/library/theorie/_index.md b/content/library/theorie/_index.md new file mode 100644 index 0000000..8dc6e05 --- /dev/null +++ b/content/library/theorie/_index.md @@ -0,0 +1,4 @@ +--- +title: "Theorie" +description: "Architekturtheorie, Lektüren, Begriffe." +--- diff --git a/content/library/theorie/typologie-als-werkzeug.md b/content/library/theorie/typologie-als-werkzeug.md new file mode 100644 index 0000000..00da31a --- /dev/null +++ b/content/library/theorie/typologie-als-werkzeug.md @@ -0,0 +1,14 @@ +--- +title: "Typologie als Werkzeug" +date: 2026-05-20 +tags: ["theorie", "typologie", "methode"] +summary: "Erste Notiz über Typologie nicht als Katalog, sondern als operatives Werkzeug im Entwurf." +--- + +Typologie wird oft als Inhaltsverzeichnis missverstanden: eine Liste von Grundrissen, sortiert nach Funktion. Diese Lesart ist bequem und falsch. + +Eine Typologie ist ein **Denkwerkzeug**. Sie macht das Wiederkehrende sichtbar und damit das Besondere argumentierbar. Erst wenn wir das Übliche kennen, können wir das Eigentümliche begründen. + +Im Entwurf bedeutet das: nicht "welcher Typ ist das?", sondern "**gegen welchen Typ** entwerfen wir hier?". + +— ein erster Notiz, weitere folgen. diff --git a/content/manifest.md b/content/manifest.md new file mode 100644 index 0000000..4fa5921 --- /dev/null +++ b/content/manifest.md @@ -0,0 +1,15 @@ +--- +title: "Manifest" +date: 2026-05-23 +toc: false +--- + +OPENBUREAU ist der Versuch, ein Architekturbüro **offen** zu führen. + +Offen heisst: was wir lernen, schreiben und bauen, gehört nicht in eine Schublade. +Texte werden in einer Bibliothek gesammelt. Werkzeuge — Programme wie **DOSSIER** und **RAPPORT** — entstehen unter freier Lizenz und stehen jedem zur Verfügung. Gespräche finden im Forum statt, Code lebt in einem öffentlichen Repository. + +Wir glauben, dass ein Büro mehr ist als seine Projekte. +Es ist eine Praxis: eine Art zu lesen, zu zeichnen, zu organisieren, miteinander zu denken. Diese Praxis sichtbar zu machen ist die Aufgabe dieser Seite. + +OPENBUREAU ist kein fertiges Produkt. Es ist eine **Werkstatt** im Aufbau. diff --git a/hugo.yaml b/hugo.yaml new file mode 100644 index 0000000..1ab8519 --- /dev/null +++ b/hugo.yaml @@ -0,0 +1,95 @@ +# OPENBUREAU — Hugo site configuration +baseURL: "https://openbureau.ch/" +title: "OPENBUREAU" +theme: "openbureau" + +enableRobotsTXT: true +enableGitInfo: false +hasCJKLanguage: false + +defaultContentLanguage: de +defaultContentLanguageInSubdir: false + +languages: + de: + label: Deutsch + locale: de_CH + weight: 1 + title: OPENBUREAU + params: + description: "Eine offene Plattform für Architekturpraxis, Theorie und Werkzeuge." + # en: + # label: English + # locale: en + # weight: 2 + # title: OPENBUREAU + # it: + # label: Italiano + # locale: it + # weight: 3 + # title: OPENBUREAU + +module: + hugoVersion: + extended: false + min: "0.146.0" + +markup: + goldmark: + renderer: + unsafe: true + highlight: + noClasses: true + style: algol_nu + codeFences: true + guessSyntax: true + lineNos: false + tabWidth: 4 + tableOfContents: + startLevel: 2 + endLevel: 4 + ordered: false + +taxonomies: + tag: tags + +outputs: + home: [html, rss] + page: [html] + section: [html, rss] + +pagination: + pagerSize: 20 + +menus: + main: + - name: JOURNAL + pageRef: / + weight: 10 + - name: LIBRARY + pageRef: /library + weight: 20 + - name: MANIFEST + pageRef: /manifest + weight: 30 + - name: FORUM + url: https://openstudio.kgva.ch + weight: 40 + - name: CODE + url: https://gitea.kgva.ch + weight: 50 + +params: + author: + name: "Karim Gabriele Varano" + email: "karim@gabrielevarano.ch" + showreadingtime: true + showlastmod: true + comments: false + # Accent for OPENBUREAU + accent: "#b54a2c" + +frontmatter: + date: ['date', 'publishDate', 'lastmod'] + lastmod: [':git', 'lastmod', 'date', 'publishDate'] + publishDate: ['publishDate', 'date'] diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 0000000..564f5c2 --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,25 @@ + + + + {{ partial "head.html" . }} + + + + +
{{ block "main" . }}{{ end }}
+ {{ if not .IsHome }} + + {{ end }} +
{{ partial "footer.html" . }}
+ + diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..0b5402e --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,41 @@ +{{ define "main" }} + {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} + +
+
+

{{ .Title }}

+ {{ with .Params.summary }} +

{{ . }}

+ {{ end }} +
+ + {{/* Table of Contents */}} + {{ $hasToC := .Params.toc | default true }} + {{ $headers := findRE " + Inhalt +
{{ .TableOfContents }}
+ + {{ end }} + +
+ {{ .Content }} +
+ +
+ {{ partial "date.html" .Date }} + {{ $showReadingTime := .Params.showreadingtime | default site.Params.showreadingtime | default true }} + {{ if and $showReadingTime .ReadingTime }} + · {{ .ReadingTime }} min Lesezeit + {{ end }} + {{ $showLastMod := .Params.showlastmod | default site.Params.showlastmod | default false }} + {{ if and $showLastMod .Lastmod }} + {{ if ne (.Lastmod.Format "2006-01-02") (.Date.Format "2006-01-02") }} + · Zuletzt aktualisiert: {{ .Lastmod.Format "2006-01-02" }} + {{ end }} + {{ end }} +
+
+ +{{ end }} diff --git a/layouts/_partials/footer.html b/layouts/_partials/footer.html new file mode 100644 index 0000000..63287e3 --- /dev/null +++ b/layouts/_partials/footer.html @@ -0,0 +1,17 @@ + diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html new file mode 100644 index 0000000..47ce08d --- /dev/null +++ b/layouts/_partials/head.html @@ -0,0 +1,49 @@ + + + + +{{ if .IsHome }}{{ site.Title | upper }}{{ else }}{{ printf "%s | %s" (.Title | upper) (site.Title | upper) }}{{ end }} + +{{ with .Description | default site.Params.description }}{{ end }} + + + +{{/* Open Graph */}} + +{{ with .Description | default site.Params.description }}{{ end }} + + +{{ with site.Params.ogImage }}{{ end }} + +{{/* Twitter Card */}} + + +{{ with .Description | default site.Params.description }}{{ end }} + +{{/* RSS */}} +{{ with .OutputFormats.Get "rss" -}} + {{ printf `` .Rel .MediaType.Type .Permalink site.Title | safeHTML }} +{{ end }} + +{{/* JSON-LD for articles */}} +{{ if .IsPage }} + +{{ end }} + +{{ partialCached "head/favicon.html" . }} +{{ partialCached "head/css.html" . }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..72d725a --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,41 @@ +{{ define "main" }} + {{ .Content }} + + {{ $library := where site.RegularPages "Section" "library" }} + {{ $journal := first 20 $library.ByDate.Reverse }} + +
+
+

Journal

+

Was zuletzt geschrieben wurde.

+
+ +
    + {{ range $journal }} +
  1. + +
    + {{ with .Parent }} + {{ .Title }} + {{ end }} + +
    +

    {{ .LinkTitle }}

    + {{ with .Params.summary }} +

    {{ . }}

    + {{ end }} + {{ with .Params.tags }} +
      + {{ range . }}
    • #{{ . }}
    • {{ end }} +
    + {{ end }} +
    +
  2. + {{ end }} +
+ + {{ if gt (len $library) 20 }} +

→ Alle Beiträge in der Library

+ {{ end }} +
+{{ end }} diff --git a/layouts/library/list.html b/layouts/library/list.html new file mode 100644 index 0000000..bed2170 --- /dev/null +++ b/layouts/library/list.html @@ -0,0 +1,59 @@ +{{ define "main" }} + {{ .Content }} + + {{ if .IsSection }} + {{ if eq .Path "/library" }} + {{/* Library root: Atlas — gruppiert nach Untersection */}} +
+ {{ range .Sections.ByWeight }} +
+

{{ .Title }}

+ {{ with .Params.description }}

{{ . }}

{{ end }} +
    + {{ range first 6 .RegularPages.ByDate.Reverse }} +
  • + {{ .LinkTitle }} + · {{ partial "date.html" .Date }} +
  • + {{ end }} +
+ {{ if gt (len .RegularPages) 6 }} +

alle in {{ .Title }} →

+ {{ end }} +
+ {{ end }} + + {{/* Tag-Cloud */}} + {{ with site.Taxonomies.tags }} + + {{ end }} +
+ {{ else }} + {{/* Library subsection: chronologisch */}} +
+
    + {{ range .RegularPages.ByDate.Reverse }} +
  • +
    +
    + {{ .LinkTitle }} + {{ with .Params.summary }} +
    {{ . }}
    + {{ end }} +
    +
    {{ partial "date.html" .Date }}
    +
    +
  • + {{ end }} +
+
+ {{ end }} + {{ end }} +{{ end }} diff --git a/themes/openbureau/.github/workflows/gh-page.yml b/themes/openbureau/.github/workflows/gh-page.yml new file mode 100755 index 0000000..08325c9 --- /dev/null +++ b/themes/openbureau/.github/workflows/gh-page.yml @@ -0,0 +1,98 @@ +# Sample workflow for building and deploying a Hugo site to GitHub Pages +name: Deploy Hugo site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: + - master + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.147.2 + HUGO_ENVIRONMENT: production + TZ: America/Los_Angeles + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Install Dart Sass + run: sudo snap install dart-sass + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Install Node.js dependencies + run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + - name: Cache Restore + id: cache-restore + uses: actions/cache/restore@v4 + with: + path: | + ${{ runner.temp }}/hugo_cache + key: hugo-${{ github.run_id }} + restore-keys: + hugo- + - name: Configure Git + run: git config core.quotepath false + + - name: Build with Hugo + working-directory: exampleSite + run: | + hugo \ + --themesDir=../.. \ + --gc \ + --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" \ + --cacheDir "${{ runner.temp }}/hugo_cache" + - name: Cache Save + id: cache-save + uses: actions/cache/save@v4 + with: + path: | + ${{ runner.temp }}/hugo_cache + key: ${{ steps.cache-restore.outputs.cache-primary-key }} + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./exampleSite/public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/themes/openbureau/.gitignore b/themes/openbureau/.gitignore new file mode 100755 index 0000000..6ee04c3 --- /dev/null +++ b/themes/openbureau/.gitignore @@ -0,0 +1,50 @@ +### Hugo +# Generated files by hugo +/public/ +/resources/_gen/ +/assets/jsconfig.json +hugo_stats.json + +# Executable may be added to repository +hugo.exe +hugo.darwin +hugo.linux + +# Temporary lock file while building +/.hugo_build.lock + +### VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### Vim +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + diff --git a/themes/openbureau/CHANGELOG.md b/themes/openbureau/CHANGELOG.md new file mode 100755 index 0000000..9472dd9 --- /dev/null +++ b/themes/openbureau/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +All notable changes to the Shibui theme will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added +- Reading time estimation feature with `showreadingtime` parameter +- Last modified date display option with `showlastmod` parameter +- Theme configuration parameters documentation +- ARIA labels to navigation elements for improved accessibility +- Preconnect/DNS prefetch for external resources (mermaid CDN) +- Enhanced 404 page with additional navigation options +- CSS styling for reading time and lastmod indicators + +### Changed +- Reorganized CSS loading to remove redundant custom.css import from main.css +- Improved semantic HTML structure with landmark roles + +### Fixed +- None yet + +## [0.1.0] - 2025-11-20 + +### Added +- Initial release of Shibui theme +- Minimalist design following Shibui (渋い) aesthetics +- Terminal-inspired navigation +- Clean typography with monospace font +- Automatic dark/light theme support via CSS variables +- Nested heading counters +- Zero JavaScript (pure CSS solutions) +- Table of contents support +- Tags and taxonomy support +- Responsive layout +- Print styles diff --git a/themes/openbureau/LICENSE b/themes/openbureau/LICENSE new file mode 100755 index 0000000..30c1853 --- /dev/null +++ b/themes/openbureau/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 Kien Nguyen-Tuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/openbureau/README.md b/themes/openbureau/README.md new file mode 100755 index 0000000..0c20c95 --- /dev/null +++ b/themes/openbureau/README.md @@ -0,0 +1,271 @@ +
+ +

Shibui (渋い)

+

A minimalist Hugo theme emphasizing simplicity and refinement

+

+ + GitHub license + + + GitHub stars + + + Hugo + +

+
+ +Table of contents: + +- [Features](#features) +- [Installation](#installation) + - [As a Git Submodule](#as-a-git-submodule) + - [Configuration](#configuration) + - [Page Configuration](#page-configuration) +- [Color Scheme](#color-scheme) +- [Customization](#customization) + - [CSS Variables](#css-variables) +- [Contributing](#contributing) +- [License](#license) +- [Demo](#demo) +- [Theme Structure](#theme-structure) + - [Template Organization](#template-organization) + - [Assets](#assets) + - [ExampleSite](#examplesite) +- [Updating](#updating) +- [Version Requirements](#version-requirements) +- [Credits](#credits) + +| | | +| -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| dark | dark | +| dark | dark | + +[Shibui](https://en.wikipedia.org/wiki/Shibui) (渋い) (adjective), shibumi (渋み) (subjective noun), or shibusa (渋さ) (objective noun) are Japanese words that refer to a particular aesthetic of simple, subtle, and unobtrusive beauty. Like other Japanese aesthetics terms, such as iki and wabi-sabi, shibui can apply to a wide variety of subjects, not just art or fashion. + +## Features + +- Minimalist design following Shibui (渋い) aesthetics +- Terminal-inspired navigation +- Clean typography with monospace font +- Semantic HTML with proper text styling (bold, italic, blockquotes) +- Paper-like color scheme +- Automatic dark/light theme support +- Nested heading counters +- Zero JavaScript (pure CSS solutions) +- Highly customizable through CSS variables +- Mobile-responsive layout +- Table of Contents support +- Tags support +- Customizable + +## Installation + +### As a Git Submodule + +```bash +git submodule add https://github.com/ntk148v/shibui.git themes/shibui +git submodule update --init --recursive +``` + +### Configuration + +Add the following to your `config.toml`: + +```toml +baseURL = 'http://example.org/' +languageCode = 'en-us' +title = 'Your Site Title' +theme = "shibui" + +[params] + author = "Your Name" + email = "your.email@example.com" + +[menu] + [[menu.main]] + name = "Posts" + url = "/posts/" + weight = 1 + [[menu.main]] + name = "About" + url = "/about/" + weight = 2 +``` + +### Page Configuration + +In the front matter of your content files: + +```yaml +--- +title: "Your Post Title" +date: 2023-06-13 +tags: ["hugo", "theme"] +--- +``` + +### Theme Parameters + +You can configure theme behavior by adding parameters to your site's `config.toml`: + +```toml +[params] + author = "Your Name" + email = "your.email@example.com" + + # Enable/disable comments on posts (default: true) + comments = true + + # Default table of contents visibility per page (default: true) + # Can be overridden per-page with `toc: false` in front matter + showtoc = true + + # Show estimated reading time on posts (default: true) + showreadingtime = true + + # Show last modified date on posts (default: false) + showlastmod = false + + # Social links (optional) + twitterHandle = "username" + ogImage = "/images/og-image.jpg" +``` + +Supported front matter parameters for individual pages: + +- `toc` (boolean): Show/hide table of contents (default: true) +- `comments` (boolean): Enable/disable comments for this page (default: site.Params.comments) +- `showreadingtime` (boolean): Override reading time display (default: site.Params.showreadingtime) +- `showlastmod` (boolean): Override last modified date display (default: site.Params.showlastmod) + +## Color Scheme + +The theme uses a paper-like color palette, use a background primary color as base and then derive the rest of theme colors by shifting lightness (or saturation/hue if needed) relative to that base, so we can easily generate multiple variants (light, dark, high-contrast, etc.). Therefore, you can adjust just base color and keep the same vibe, checkout [#4](https://github.com/ntk148v/shibui/pull/4) for preview. + +```css +/* Base theme knobs */ +--bg-h: 0; +--bg-s: 0%; +--bg-l: 99%; + +/* Background colors */ +--color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l)); +--color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 2%)); +--color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 6%)); +--color-selection-bg: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 13%)); + +/* Text colors with WCAG-friendly contrast */ +/* Primary: ensures near-black on light bg and near-white on dark bg */ +--color-text-primary: hsl( + var(--bg-h) var(--bg-s) clamp(8%, calc(100% - var(--bg-l)), 92%) +); + +/* Muted: softer but still >4.5:1 contrast */ +--color-text-muted: hsl( + var(--bg-h) var(--bg-s) clamp(30%, calc(85% - var(--bg-l)), 75%) +); + +/* Code text: slightly brighter than muted */ +--color-text-code: hsl( + var(--bg-h) var(--bg-s) clamp(20%, calc(90% - var(--bg-l)), 85%) +); +``` + +## Customization + +### CSS Variables + +You can customize the theme by overriding CSS variables in your `assets/css/custom.css`: + +For example, you want to create a dark theme, just adjust the base color. + +```css +:root { + /* Base theme knobs */ + --bg-h: 0; + --bg-s: 0%; + --bg-l: 12%; +} +``` + +## Contributing + +Contributions are welcome! Primary goals are: + +- Maintain minimalist design principles +- Keep it simple and efficient +- Avoid JavaScript when CSS can solve the problem +- Follow Shibui (渋い) aesthetics + +## License + +MIT + +## Demo + +Visit the [demo site](https://ntk148v.github.io/shibui) to see the theme in action. + +## Theme Structure + +``` +shibui/ +├── archetypes/ # Content template files +├── assets/ +│ ├── css/ # Theme CSS files +│ └── js/ # Theme JavaScript files +├── layouts/ # Template files +│ ├── _default/ # Default templates +│ ├── _partials/ # Reusable template parts +│ └── index.html # Homepage template +├── static/ # Static assets +└── exampleSite/ # Example site for reference +``` + +### Template Organization + +- `layouts/_default/baseof.html`: Base template with common layout +- `layouts/_default/single.html`: Template for individual pages +- `layouts/_default/list.html`: Template for section pages +- `layouts/_partials/`: Contains reusable components like header, footer +- `layouts/index.html`: Homepage template + +### Assets + +The theme uses a minimal set of assets: + +- CSS: Single stylesheet with CSS variables for customization +- JS: Optional JavaScript for enhanced functionality +- Static: Basic favicon and other static assets + +### ExampleSite + +The `exampleSite` directory contains a complete example of a site using the theme. Use it as a reference for: + +- Configuration setup +- Content organization +- Front matter examples +- Menu structure + +## Updating + +Since the theme is installed as a Git submodule, you can update it to the latest version with: + +```bash +cd themes/shibui +git pull origin main +``` + +## Version Requirements + +- Hugo Extended v0.93.0 or higher +- Go 1.18 or higher (for Hugo modules) + +## Credits + +This theme was inspired by various minimalist designs and the Japanese concept of Shibui (渋い). Special thanks to: + +- [William Jansson](https://williamjansson.com) +- The Hugo community +- [Minimalist design principles]() +- Japanese aesthetics, particularly [Shibui](https://en.wikipedia.org/wiki/Shibui) diff --git a/themes/openbureau/archetypes/default.md b/themes/openbureau/archetypes/default.md new file mode 100755 index 0000000..25b6752 --- /dev/null +++ b/themes/openbureau/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ diff --git a/themes/openbureau/assets/css/custom.css b/themes/openbureau/assets/css/custom.css new file mode 100755 index 0000000..b45fd01 --- /dev/null +++ b/themes/openbureau/assets/css/custom.css @@ -0,0 +1,50 @@ +/* Quadratisches Bild */ +.list-image { + aspect-ratio: 9 / 5; + overflow: hidden; +} + +.list-image img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + margin: 0; +} + +/* Titel + Meta in einer Zeile */ +.list-title-row { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-top: 0.4rem; +} + +.list-title { + margin: 0; +} + +.list-meta { + display: flex; + gap: 8px; +} + +/* Grayscale */ +img { + filter: grayscale(100%); + transition: filter 0.4s ease; +} +img:hover { + filter: grayscale(0%); +} +.auto-carousel img { + filter: none !important; +} +body { + padding: var(--spacing-sm) 1.5rem; + gap: var(--spacing-sm); +} + +img { + margin: 0; +} diff --git a/themes/openbureau/assets/css/main.css b/themes/openbureau/assets/css/main.css new file mode 100755 index 0000000..bfa7ea9 --- /dev/null +++ b/themes/openbureau/assets/css/main.css @@ -0,0 +1,623 @@ +:root { + /* Typography */ + --spacing-base: 1.5em; + --font-family-mono: monospace; + --font-size-base: 1em; + --font-size-small: 0.9em; + --font-size-code: 0.95em; + + /* Spacing */ + --spacing-xs: calc(var(--spacing-base) * 0.25); + --spacing-sm: calc(var(--spacing-base) * 0.5); + --spacing-md: var(--spacing-base); + --spacing-lg: calc(var(--spacing-base) * 2); + + /* Base theme knobs - fixed for light mode only */ + --bg-h: 0; + --bg-s: 0%; + --bg-l: 99%; + + /* Background colors */ + --color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l)); + --color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 2%)); + --color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 6%)); + --color-selection-bg: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 13%)); + + /* Text colors */ + --color-text-primary: hsl(var(--bg-h) var(--bg-s) 8%); + --color-text-muted: hsl(var(--bg-h) var(--bg-s) 50%); + --color-text-code: hsl(var(--bg-h) var(--bg-s) 30%); + + /* Layout */ + --container-width: 60ch; + --pre-border-radius: 0.75rem; + --inline-border-radius: 0.375rem; + --gap-base: 1em; + --gap-small: 0.5rem; + + /* Breakpoints */ + --breakpoint-mobile: 600px; + + color-scheme: light; +} + +.no-scrollbar { + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE and Edge */ +} + +.no-scrollbar::-webkit-scrollbar { + display: none; /* Chrome, Safari, Opera */ +} + +.list-unstyled { + list-style: none; + margin-left: 0; +} + +.text-muted { + color: var(--color-text-muted); +} + +.no-underline { + text-decoration: none; + border-bottom: none; +} + +::selection { + background: var(--color-selection-bg); + color: var(--color-text-primary); +} + +/* Skip link for accessibility */ +.skip-link { + position: absolute; + top: -100%; + left: 0; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--color-bg-primary); + border: 1px solid var(--color-border); + z-index: 1000; + opacity: 0; + transition: opacity 0.2s ease-in-out; +} + +.skip-link:focus { + position: fixed; + top: var(--spacing-sm); + left: var(--spacing-sm); + opacity: 1; +} + +/* Focus styles for accessibility */ +a:focus-visible, +button:focus-visible, +input:focus-visible, +textarea:focus-visible, +select:focus-visible { + outline: 2px solid var(--color-text-primary); + outline-offset: 2px; +} + +* { + margin: 0; + padding: 0; + font: inherit; + color: var(--color-text-primary); + box-sizing: border-box; +} + +ul { + list-style-type: disc; + margin-left: 1.5rem; +} + +ol { + list-style-type: decimal; + margin-left: 1.5rem; +} + +html { + margin: 0 0 0 calc(100vw - 100%); + -webkit-text-size-adjust: 100%; + height: 100%; +} + +body { + font: var(--font-size-base) / var(--spacing-base) var(--font-family-mono); + background: var(--color-bg-primary); + min-height: 100%; + display: grid; + grid-template-rows: auto 1fr auto; + grid-template-columns: minmax(auto, var(--container-width)); + justify-content: center; + padding: var(--spacing-lg); + gap: var(--spacing-lg); +} + +a { + display: inline-block; + margin-left: -0.16666em; + text-decoration: none; + border-bottom: 1px dotted; + white-space: pre-wrap; + word-wrap: break-word; +} + +a:hover { + border-bottom: 1px solid; +} + +p, +pre { + margin: var(--spacing-base) 0; +} + +h1, +h2, +h3, +h4, +h5 { + margin: var(--spacing-base) 0; + font-weight: bold; +} + +h2 { + counter-increment: h2; + counter-reset: h3; +} + +h3 { + counter-increment: h3; + counter-reset: h4; +} + +h4 { + counter-increment: h4; + counter-reset: h5; +} + +h5 { + counter-increment: h5; +} + +/* nested counters */ +h2::before { + content: counter(h2) ". "; +} + +h3::before { + content: counter(h2) "." counter(h3) ". "; +} + +h4::before { + content: counter(h2) "." counter(h3) "." counter(h4) ". "; +} + +h5::before { + content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) ". "; +} + +time { + color: var(--color-text-muted); +} + +footer { + padding: calc(var(--spacing-base) * 2) 0; + text-align: center; +} +footer p { + margin-bottom: 0; +} + +pre { + border: 1px solid var(--color-border); + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--pre-border-radius); + white-space: pre-wrap; + word-wrap: break-word; + font-family: var(--font-family-mono); + font-size: var(--font-size-code); + line-height: 1.6; + color: var(--color-text-code); + overflow-x: auto; + box-shadow: 0 1px 2px 0 var(--color-border); +} + +pre code { + background: none; + border: none; + padding: 0; + font-size: inherit; + color: inherit; +} + +p > code, +li > code, +h1 > code, +h2 > code, +h3 > code, +h4 > code, +h5 > code { + background: var(--color-bg-secondary); + border: 1px solid var(--color-border); + border-radius: var(--inline-border-radius); + padding: 0.2em 0.4em; + font-family: var(--font-family-mono); + font-size: var(--font-size-code); + color: var(--color-text-code); + white-space: pre-wrap; + word-wrap: break-word; +} + +.terms-list { + padding-bottom: var(--spacing-base); +} + +.terms-list ul { + list-style-type: none; + margin-left: 0; +} + +.terms-list ul li { + display: inline-block; + font-style: italic; + font-size: var(--font-size-small); + color: var(--color-text-muted); + padding: 0 3px; +} + +/* Path navigation styles */ +.path-nav { + font-family: var(--font-family-mono); + padding: var(--spacing-base) 0; + white-space: nowrap; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + width: 100%; +} + +.path-nav::-webkit-scrollbar { + display: none; /* Chrome, Safari, Opera */ +} + +.path-nav ol { + display: flex; + flex-wrap: nowrap; + list-style: none; + margin: 0; + padding: 0; +} + +.path-nav li { + display: flex; + align-items: center; + color: var(--color-text-muted); + flex-shrink: 0; + max-width: 200px; +} + +.path-nav li.current { + max-width: none; +} + +.path-nav li a { + text-decoration: none; + border-bottom: none; + padding: 0 0.25em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--color-text-muted); +} + +.path-nav li.current a { + color: var(--color-text-primary); + font-weight: bold; + overflow: visible; + text-overflow: clip; + white-space: normal; +} + +.path-nav a:hover { + text-decoration: underline; +} + +.back-nav { + margin-bottom: var(--spacing-base); +} + +.back-link { + color: var(--color-text-muted); + border-bottom: none; +} + +.back-link:hover { + color: var(--color-text-primary); + text-decoration: none; +} + +/* Time list */ +.time-list ul { + list-style: none; + margin-left: 0; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; + padding: 0; +} + +.time-list li { + display: flex; + flex-direction: column; + gap: 0; + padding: 0; +} + +@media (max-width: 600px) { + .time-list ul { + grid-template-columns: 1fr; + } + + .time-list time { + font-size: var(--font-size-small); + } +} + +/* Archive styles */ +.archive { + margin: var(--spacing-base) 0; +} + +.archive-year { + margin: calc(var(--spacing-base) * 1.5) 0 var(--spacing-sm) 0; + font-size: 1.2em; + color: var(--color-text-primary); +} + +.archive-month { + margin: var(--spacing-md) 0 var(--spacing-sm) 0; + font-size: 1.1em; + color: var(--color-text-muted); +} + +.archive-item { + display: flex; + align-items: baseline; + gap: var(--gap-small); + margin: var(--spacing-sm) 0; + padding-left: 1em; +} + +.archive-item time { + font-family: var(--font-family-mono); + font-size: var(--font-size-small); + color: var(--color-text-muted); + min-width: 2em; +} + +.archive-item a { + font-size: var(--font-size-base); +} + +/* Main menu navigation styles */ +.terminal-nav { + font-family: var(--font-family-mono); + border-top: 1px solid var(--color-border); + margin-top: calc(var(--spacing-base) * 2); + padding-top: var(--spacing-base); +} + +.terminal-nav nav ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + gap: 1em; + justify-content: center; +} + +.terminal-nav nav ul li { + display: inline-block; +} + +.terminal-nav nav ul li a, +.terminal-nav .back-link { + color: var(--color-text-muted); + border-bottom: none; + text-decoration: none; +} + +.terminal-nav nav ul li a:hover, +.terminal-nav .back-link:hover { + color: var(--color-text-primary); +} + +.terminal-nav nav ul li a.active { + color: var(--color-text-primary); + font-weight: bold; +} + +.terminal-nav .back-nav { + margin: calc(var(--spacing-base) * 0.5) 0; +} + +/* Image styles */ +img { + display: block; + max-width: 100%; + height: auto; + margin: var(--spacing-base) auto; +} + +figure { + margin: var(--spacing-base) 0; + text-align: center; +} + +figure img { + margin: 0 auto; +} + +figcaption { + color: var(--color-text-muted); + font-size: var(--font-size-small); + margin-top: calc(var(--spacing-base) / 2); +} + +/* Table styles */ +table { + width: 100%; + margin: var(--spacing-base) 0; + border-collapse: collapse; +} + +thead th, +th { + font-weight: bold; + text-align: center; + border-bottom: 2px solid var(--color-border); + padding: var(--spacing-sm); +} + +td { + padding: var(--spacing-sm); + border-bottom: 1px solid var(--color-border); +} + +/* Typography emphasis */ +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +/* Blockquote styles */ +blockquote { + margin: var(--spacing-base) 0; + padding: var(--spacing-sm) var(--spacing-base); + border: 1px solid var(--color-border); + border-radius: var(--pre-border-radius); + background: var(--color-bg-secondary); + box-shadow: 0 1px 2px 0 var(--color-border); + font-style: italic; +} + +blockquote > :first-child { + margin-top: 0; +} + +blockquote > :last-child { + margin-bottom: 0; +} + +/* Table of Contents */ +.toc { + margin: var(--spacing-base) 0; + padding: var(--spacing-sm); + border: 1px solid var(--color-border); + background: var(--color-bg-secondary); + border-radius: var(--pre-border-radius); + box-shadow: 0 1px 2px 0 var(--color-border); +} + +.toc .toc-content a { + text-decoration: none; + color: var(--color-text-primary); + font-size: var(--font-size-small); +} + +.toc .toc-content ol li { + list-style-type: disc !important; +} + +.time { + margin: var(--spacing-md) 0; +} + +.reading-time, +.lastmod { + color: var(--color-text-muted); + font-size: var(--font-size-small); +} + +@media (max-width: 600px) { + .path-nav li { + max-width: 100px; + } + + .path-nav li:first-child { + max-width: none; + } + + .path-nav li.current { + max-width: none; + } +} + +@media (max-width: 600px) { + body { + padding-top: 2em; + } + + pre { + max-width: calc(100vw - 4em); + } +} + +/* Print styles */ +@media print { + body { + background: white; + color: black; + padding: 0; + display: block; + } + + header, + footer, + .terminal-nav, + .skip-link, + .toc, + .back-nav { + display: none !important; + } + + main { + max-width: 100%; + } + + a { + border-bottom: none; + color: black; + } + + a[href]::after { + content: " (" attr(href) ")"; + font-size: 0.8em; + color: gray; + } + + a[href^="#"]::after, + a[href^="javascript:"]::after { + content: ""; + } + + pre, + blockquote, + img { + page-break-inside: avoid; + } + + h1, + h2, + h3, + h4, + h5 { + page-break-after: avoid; + } +} diff --git a/themes/openbureau/assets/js/cursor.js b/themes/openbureau/assets/js/cursor.js new file mode 100755 index 0000000..cf3f7dd --- /dev/null +++ b/themes/openbureau/assets/js/cursor.js @@ -0,0 +1,60 @@ +(function() { + if (!window.matchMedia('(pointer: fine)').matches) return; + + const canvas = document.createElement('canvas'); + canvas.style.cssText = 'position:fixed;pointer-events:none;z-index:9999;image-rendering:pixelated;left:-200px;top:-200px;'; + document.body.appendChild(canvas); + + const ctx = canvas.getContext('2d'); + const P = 2; + + const grid = [ + '_BB_______', + 'BRRB______', + 'BRRRB_____', + 'BRRRRB____', + 'BRRRRRB___', + 'BRRRRRRB__', + 'BRRRRRRB__', + 'BRRRRSB___', + 'BRRSRRB___', + '_BBBRRB___', + '____BBB___', + ]; + + const rows = grid.length; + const cols = Math.max(...grid.map(r => r.length)); + canvas.width = cols * P; + canvas.height = rows * P; + canvas.style.width = cols * P + 'px'; + canvas.style.height = rows * P + 'px'; + + grid.forEach((row, y) => { + for (let x = 0; x < row.length; x++) { + const c = row[x]; + if (c === 'B') { ctx.fillStyle = '#1a1a1a'; ctx.fillRect(x*P, y*P, P, P); } + else if (c === 'R') { ctx.fillStyle = '#ffffff'; ctx.fillRect(x*P, y*P, P, P); } + else if (c === 'S') { ctx.fillStyle = '#b0b0b0'; ctx.fillRect(x*P, y*P, P, P); } + } + }); + + function setPos(x, y) { + canvas.style.left = x + 'px'; + canvas.style.top = y + 'px'; + } + + try { + const saved = sessionStorage.getItem('cursorPos'); + if (saved) { + const pos = JSON.parse(saved); + setPos(pos.x, pos.y); + } + } catch(e) {} + + document.addEventListener('mousemove', e => { + setPos(e.clientX, e.clientY); + try { + sessionStorage.setItem('cursorPos', JSON.stringify({ x: e.clientX, y: e.clientY })); + } catch(e) {} + }, { passive: true }); +})(); diff --git a/themes/openbureau/hugo.toml b/themes/openbureau/hugo.toml new file mode 100755 index 0000000..a90e895 --- /dev/null +++ b/themes/openbureau/hugo.toml @@ -0,0 +1,25 @@ +baseURL = 'https://example.org/' +languageCode = 'en-US' +title = 'My New Hugo Site' + +[menus] + [[menus.main]] + name = 'Home' + pageRef = '/' + weight = 10 + + [[menus.main]] + name = 'Posts' + pageRef = '/posts' + weight = 20 + + [[menus.main]] + name = 'Tags' + pageRef = '/tags' + weight = 30 + +[module] + [module.hugoVersion] + extended = false + min = '0.93.0' + diff --git a/themes/openbureau/images/1.png b/themes/openbureau/images/1.png new file mode 100755 index 0000000..6e1eee3 Binary files /dev/null and b/themes/openbureau/images/1.png differ diff --git a/themes/openbureau/images/2.png b/themes/openbureau/images/2.png new file mode 100755 index 0000000..9ff8d0c Binary files /dev/null and b/themes/openbureau/images/2.png differ diff --git a/themes/openbureau/images/3.png b/themes/openbureau/images/3.png new file mode 100755 index 0000000..82af921 Binary files /dev/null and b/themes/openbureau/images/3.png differ diff --git a/themes/openbureau/images/4.png b/themes/openbureau/images/4.png new file mode 100755 index 0000000..6ff7f4e Binary files /dev/null and b/themes/openbureau/images/4.png differ diff --git a/themes/openbureau/images/screenshot.png b/themes/openbureau/images/screenshot.png new file mode 100755 index 0000000..6e1eee3 Binary files /dev/null and b/themes/openbureau/images/screenshot.png differ diff --git a/themes/openbureau/images/tn.png b/themes/openbureau/images/tn.png new file mode 100755 index 0000000..6e1eee3 Binary files /dev/null and b/themes/openbureau/images/tn.png differ diff --git a/themes/openbureau/layouts/404.html b/themes/openbureau/layouts/404.html new file mode 100755 index 0000000..490e4e2 --- /dev/null +++ b/themes/openbureau/layouts/404.html @@ -0,0 +1,24 @@ +{{ define "main" }} +

RESOURCE NOT FOUND

+

the page you're looking for doesn't exist or has been moved.

+ + +{{ end }} diff --git a/themes/openbureau/layouts/_default/_markup/render-image.html b/themes/openbureau/layouts/_default/_markup/render-image.html new file mode 100755 index 0000000..50a8719 --- /dev/null +++ b/themes/openbureau/layouts/_default/_markup/render-image.html @@ -0,0 +1,20 @@ +{{- $alt := .Text -}} {{- $src := .Destination -}} {{- $title := .Title -}} + +
+ {{ $alt }} + {{- with $alt }} +
{{ . }}
+ {{ end -}} +
diff --git a/themes/openbureau/layouts/_default/archive.html b/themes/openbureau/layouts/_default/archive.html new file mode 100755 index 0000000..bf247f4 --- /dev/null +++ b/themes/openbureau/layouts/_default/archive.html @@ -0,0 +1,30 @@ +{{ define "main" }} +

archive

+
+ {{- $.Scratch.Add "year" "" -}} + {{- $.Scratch.Add "month" "" -}} + + {{- range where site.Pages "Section" "posts" -}} + {{- if and (not .Draft) .Date -}} + {{- $year := .Date.Format "2006" -}} + {{- $month := .Date.Format "January" -}} + + {{- if ne $year ($.Scratch.Get "year") -}} + {{- $.Scratch.Set "year" $year -}} + {{- $.Scratch.Set "month" "" -}} +

{{ $year }}

+ {{- end -}} + + {{- if ne $month ($.Scratch.Get "month") -}} + {{- $.Scratch.Set "month" $month -}} +

{{ $month }}

+ {{- end -}} + + + {{- end -}} + {{- end -}} +
+{{ end }} \ No newline at end of file diff --git a/themes/openbureau/layouts/_default/baseof.html b/themes/openbureau/layouts/_default/baseof.html new file mode 100755 index 0000000..939f75b --- /dev/null +++ b/themes/openbureau/layouts/_default/baseof.html @@ -0,0 +1,18 @@ + + + + + {{ partial "head.html" . }} + + + + +
{{ partial "header.html" . }}
+
{{ block "main" . }}{{ end }}
+
{{ partial "footer.html" . }}
+ {{ with resources.Get "js/cursor.js" }}{{ end }} + + diff --git a/themes/openbureau/layouts/_default/list.html b/themes/openbureau/layouts/_default/list.html new file mode 100755 index 0000000..96e09b6 --- /dev/null +++ b/themes/openbureau/layouts/_default/list.html @@ -0,0 +1,24 @@ +{{ define "main" }} + {{ .Content }} +
+
    + {{ range .Pages }} +
  • + {{ if .Params.image }} +
    + {{ .LinkTitle }} +
    + {{ end }} +
    + +
    + {{ partial "date.html" .Date }} +
    +
    +
  • + {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/openbureau/layouts/_default/single.html b/themes/openbureau/layouts/_default/single.html new file mode 100755 index 0000000..534bc4c --- /dev/null +++ b/themes/openbureau/layouts/_default/single.html @@ -0,0 +1,55 @@ +{{ define "main" }} + {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} + + {{/* Table of Contents */}} + {{ $hasToC := .Params.toc | default true }} + {{ $headers := findRE " + TABLE OF CONTENTS +
+ {{ .TableOfContents }} +
+ + {{ end }} + + + {{ partial "list-to-carousel.html" .Content }} + + + + + +
+ {{ partial "date.html" .Date }} + {{ $showReadingTime := .Params.showreadingtime | default site.Params.showreadingtime | default true }} + {{ if and $showReadingTime .ReadingTime }} + · {{ .ReadingTime }} min read + {{ end }} + {{ $showLastMod := .Params.showlastmod | default site.Params.showlastmod | default false }} + {{ if and $showLastMod .Lastmod }} + {{ if ne .LastMod.Format "2006-01-02" .Date.Format "2006-01-02" }} + · Last updated: {{ .LastMod.Format "2006-01-02" }} + {{ end }} + {{ end }} +
+ + + {{ if and .Content (default true (default .Site.Params.comments + .Params.comments)) + }} +
{{- partial "comments" . -}}
+ {{ end }} + + {{ if not .IsHome }} +
+
+ {{ with .Parent }} + ../ + {{ else }} + ../ + {{ end }} +
+
+ {{ end }} +{{ end }} diff --git a/themes/openbureau/layouts/_partials/8bit_cursor_v3.html b/themes/openbureau/layouts/_partials/8bit_cursor_v3.html new file mode 100755 index 0000000..bc1049d --- /dev/null +++ b/themes/openbureau/layouts/_partials/8bit_cursor_v3.html @@ -0,0 +1,77 @@ + + + +

8-bit cursor preview

+
bewege die maus hier
+ + + diff --git a/themes/openbureau/layouts/_partials/comments.html b/themes/openbureau/layouts/_partials/comments.html new file mode 100755 index 0000000..59c5f22 --- /dev/null +++ b/themes/openbureau/layouts/_partials/comments.html @@ -0,0 +1,2 @@ + +{{ template "_internal/disqus.html" . }} diff --git a/themes/openbureau/layouts/_partials/date.html b/themes/openbureau/layouts/_partials/date.html new file mode 100755 index 0000000..92e7c1b --- /dev/null +++ b/themes/openbureau/layouts/_partials/date.html @@ -0,0 +1 @@ + diff --git a/themes/openbureau/layouts/_partials/footer.html b/themes/openbureau/layouts/_partials/footer.html new file mode 100755 index 0000000..5cb815a --- /dev/null +++ b/themes/openbureau/layouts/_partials/footer.html @@ -0,0 +1,4 @@ +

© {{ now.Year }} karimgabrielevarano.xyz

+

legal notice

+ + diff --git a/themes/openbureau/layouts/_partials/head.html b/themes/openbureau/layouts/_partials/head.html new file mode 100755 index 0000000..63cab4b --- /dev/null +++ b/themes/openbureau/layouts/_partials/head.html @@ -0,0 +1,66 @@ + + + + + + + {{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title + site.Title }}{{ end }} + +{{ with .Description | default .Site.Params.description }}{{ end }} {{/* Canonical URL */}} + + +{{/* Open Graph */}} + +{{ with .Description | default .Site.Params.description }}{{ end }} + + +{{ with .Site.Params.ogImage }}{{ end }} {{/* Twitter Card */}} + + +{{ with .Description | default .Site.Params.description }}{{ end }} {{ with .Site.Params.twitterHandle }}{{ end }} {{ with .Site.Params.ogImage }}{{ end }} {{/* RSS Feed */}} {{ with .OutputFormats.Get "rss" -}} {{ printf +`` .Rel .MediaType.Type +.Permalink site.Title | safeHTML }} {{ end }} {{/* JSON-LD Structured Data for +Articles */}} {{ if .IsPage }} + +{{ end }} {{ partialCached "head/favicon.html" . }} {{ partialCached +"head/css.html" . }} diff --git a/themes/openbureau/layouts/_partials/head/css.html b/themes/openbureau/layouts/_partials/head/css.html new file mode 100755 index 0000000..d5162ba --- /dev/null +++ b/themes/openbureau/layouts/_partials/head/css.html @@ -0,0 +1,19 @@ +{{- with resources.Get "css/main.css" }} + {{- if hugo.IsDevelopment }} + + {{- else }} + {{- with . | minify | fingerprint }} + + {{- end }} + {{- end }} +{{- end }} + +{{- with resources.Get "css/custom.css" }} + {{- if hugo.IsDevelopment }} + + {{- else }} + {{- with . | minify | fingerprint }} + + {{- end }} + {{- end }} +{{- end }} diff --git a/themes/openbureau/layouts/_partials/head/favicon.html b/themes/openbureau/layouts/_partials/head/favicon.html new file mode 100755 index 0000000..24c7530 --- /dev/null +++ b/themes/openbureau/layouts/_partials/head/favicon.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/themes/openbureau/layouts/_partials/header.html b/themes/openbureau/layouts/_partials/header.html new file mode 100755 index 0000000..80cd9eb --- /dev/null +++ b/themes/openbureau/layouts/_partials/header.html @@ -0,0 +1,19 @@ + + +{{ define "breadcrumbnav" }} + {{ if .p1.Parent }} + {{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) }} + {{ else if not .p1.IsHome }} + {{ template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 ) }} + {{ end }} + + {{ if .p1.IsHome }}/{{ end }} + {{ if .p1.IsHome }}{{ .p1.Site.Title }}{{ else }}{{ .p1.Title }}{{ end }} + {{ if ne .p1 .p2 }}/{{ end }} + +{{ end }} + diff --git a/themes/openbureau/layouts/_partials/list-to-carousel.html b/themes/openbureau/layouts/_partials/list-to-carousel.html new file mode 100755 index 0000000..f1c7d30 --- /dev/null +++ b/themes/openbureau/layouts/_partials/list-to-carousel.html @@ -0,0 +1,21 @@ +{{- $duration := "7000" -}} +{{- $content := $ -}} +{{- $imageListPattern := `
    \s*(?:
  • \s*]*/?>\s*
    \s*
  • \s*)+
` -}} +{{- $imageLists := findRE $imageListPattern $content -}} +{{- range $index,$il := $imageLists -}} + {{- $listItems := findRE `
  • \s*]*/?>\s*
    \s*
  • ` $il -}} + {{- $items := `
      ` -}} + {{- range $i,$li := $listItems -}} + {{- $img := index (findRE `]*/?>` $li) 0 -}} + {{- $items = print $items `
    • ` $img `
    • ` -}} + {{- end -}} + {{- $items = print $items `
    ` -}} + {{- $indicators := `
      ` -}} + {{- range $i,$li := $listItems -}} + {{- $indicators = print $indicators `
    1. ` -}} + {{- end -}} + {{- $indicators = print $indicators `
    ` -}} + {{- $replacement := print `` -}} + {{- $content = replace $content $il $replacement -}} +{{- end -}} +{{- $content | safeHTML -}} diff --git a/themes/openbureau/layouts/_partials/menu.html b/themes/openbureau/layouts/_partials/menu.html new file mode 100755 index 0000000..b09a2fd --- /dev/null +++ b/themes/openbureau/layouts/_partials/menu.html @@ -0,0 +1,51 @@ +{{- /* +Renders a menu for the given menu ID. + +@context {page} page The current page. +@context {string} menuID The menu ID. + +@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }} +*/}} + +{{- $page := .page }} +{{- $menuID := .menuID }} + +{{- with index site.Menus $menuID }} + +{{- end }} + +{{- define "_partials/inline/menu/walk.html" }} + {{- $page := .page }} + {{- range .menuEntries }} + {{- $attrs := dict "href" .URL }} + {{- if $page.IsMenuCurrent .Menu . }} + {{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }} + {{- else if $page.HasMenuCurrent .Menu .}} + {{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }} + {{- end }} + {{- $name := .Name }} + {{- with .Identifier }} + {{- with T . }} + {{- $name = . }} + {{- end }} + {{- end }} +
  • + {{ $name }} + {{- with .Children }} +
      + {{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }} +
    + {{- end }} +
  • + {{- end }} +{{- end }} diff --git a/themes/openbureau/layouts/_partials/terms.html b/themes/openbureau/layouts/_partials/terms.html new file mode 100755 index 0000000..ee6a261 --- /dev/null +++ b/themes/openbureau/layouts/_partials/terms.html @@ -0,0 +1,22 @@ +{{- /* +For a given taxonomy, renders a list of terms assigned to the page. + +@context {page} page The current page. +@context {string} taxonomy The taxonomy. + +@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} +*/}} + +{{- $page := .page }} +{{- $taxonomy := .taxonomy }} + +{{- with $page.GetTerms $taxonomy }} + {{- $label := (index . 0).Parent.LinkTitle }} +
    + +
    +{{- end }} diff --git a/themes/openbureau/layouts/index.html b/themes/openbureau/layouts/index.html new file mode 100755 index 0000000..278cae2 --- /dev/null +++ b/themes/openbureau/layouts/index.html @@ -0,0 +1,6 @@ +{{ define "main" }} + {{ .Content }} +
    + {{ partial "menu.html" (dict "menuID" "main" "page" .) }} +
    +{{ end }} diff --git a/themes/openbureau/layouts/robots.txt b/themes/openbureau/layouts/robots.txt new file mode 100755 index 0000000..6b4c001 --- /dev/null +++ b/themes/openbureau/layouts/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: {{ "sitemap.xml" | absURL }} diff --git a/themes/openbureau/layouts/shortcodes/mermaid.html b/themes/openbureau/layouts/shortcodes/mermaid.html new file mode 100755 index 0000000..1c00332 --- /dev/null +++ b/themes/openbureau/layouts/shortcodes/mermaid.html @@ -0,0 +1,2 @@ + +
    {{ safeHTML .Inner }}
    diff --git a/themes/openbureau/static/favicon.ico b/themes/openbureau/static/favicon.ico new file mode 100755 index 0000000..67f8b77 Binary files /dev/null and b/themes/openbureau/static/favicon.ico differ diff --git a/themes/openbureau/static/favicon_io/android-icon-144x144.png b/themes/openbureau/static/favicon_io/android-icon-144x144.png new file mode 100755 index 0000000..3e7da9c Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-144x144.png differ diff --git a/themes/openbureau/static/favicon_io/android-icon-192x192.png b/themes/openbureau/static/favicon_io/android-icon-192x192.png new file mode 100755 index 0000000..c19043d Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-192x192.png differ diff --git a/themes/openbureau/static/favicon_io/android-icon-36x36.png b/themes/openbureau/static/favicon_io/android-icon-36x36.png new file mode 100755 index 0000000..c5ae9bd Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-36x36.png differ diff --git a/themes/openbureau/static/favicon_io/android-icon-48x48.png b/themes/openbureau/static/favicon_io/android-icon-48x48.png new file mode 100755 index 0000000..09b3a90 Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-48x48.png differ diff --git a/themes/openbureau/static/favicon_io/android-icon-72x72.png b/themes/openbureau/static/favicon_io/android-icon-72x72.png new file mode 100755 index 0000000..fe77544 Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-72x72.png differ diff --git a/themes/openbureau/static/favicon_io/android-icon-96x96.png b/themes/openbureau/static/favicon_io/android-icon-96x96.png new file mode 100755 index 0000000..b932da1 Binary files /dev/null and b/themes/openbureau/static/favicon_io/android-icon-96x96.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-114x114.png b/themes/openbureau/static/favicon_io/apple-icon-114x114.png new file mode 100755 index 0000000..db7aa9d Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-114x114.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-120x120.png b/themes/openbureau/static/favicon_io/apple-icon-120x120.png new file mode 100755 index 0000000..1bd8363 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-120x120.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-144x144.png b/themes/openbureau/static/favicon_io/apple-icon-144x144.png new file mode 100755 index 0000000..3e7da9c Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-144x144.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-152x152.png b/themes/openbureau/static/favicon_io/apple-icon-152x152.png new file mode 100755 index 0000000..4fb3e66 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-152x152.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-180x180.png b/themes/openbureau/static/favicon_io/apple-icon-180x180.png new file mode 100755 index 0000000..369bb7a Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-180x180.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-57x57.png b/themes/openbureau/static/favicon_io/apple-icon-57x57.png new file mode 100755 index 0000000..7949ad0 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-57x57.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-60x60.png b/themes/openbureau/static/favicon_io/apple-icon-60x60.png new file mode 100755 index 0000000..ae8a2fa Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-60x60.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-72x72.png b/themes/openbureau/static/favicon_io/apple-icon-72x72.png new file mode 100755 index 0000000..fe77544 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-72x72.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-76x76.png b/themes/openbureau/static/favicon_io/apple-icon-76x76.png new file mode 100755 index 0000000..1024007 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-76x76.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon-precomposed.png b/themes/openbureau/static/favicon_io/apple-icon-precomposed.png new file mode 100755 index 0000000..a829446 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon-precomposed.png differ diff --git a/themes/openbureau/static/favicon_io/apple-icon.png b/themes/openbureau/static/favicon_io/apple-icon.png new file mode 100755 index 0000000..a829446 Binary files /dev/null and b/themes/openbureau/static/favicon_io/apple-icon.png differ diff --git a/themes/openbureau/static/favicon_io/browserconfig.xml b/themes/openbureau/static/favicon_io/browserconfig.xml new file mode 100755 index 0000000..c554148 --- /dev/null +++ b/themes/openbureau/static/favicon_io/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/themes/openbureau/static/favicon_io/favicon-16x16.png b/themes/openbureau/static/favicon_io/favicon-16x16.png new file mode 100755 index 0000000..b9c00fd Binary files /dev/null and b/themes/openbureau/static/favicon_io/favicon-16x16.png differ diff --git a/themes/openbureau/static/favicon_io/favicon-32x32.png b/themes/openbureau/static/favicon_io/favicon-32x32.png new file mode 100755 index 0000000..37eba92 Binary files /dev/null and b/themes/openbureau/static/favicon_io/favicon-32x32.png differ diff --git a/themes/openbureau/static/favicon_io/favicon-96x96.png b/themes/openbureau/static/favicon_io/favicon-96x96.png new file mode 100755 index 0000000..0f4ced1 Binary files /dev/null and b/themes/openbureau/static/favicon_io/favicon-96x96.png differ diff --git a/themes/openbureau/static/favicon_io/favicon.ico b/themes/openbureau/static/favicon_io/favicon.ico new file mode 100755 index 0000000..1ff0315 Binary files /dev/null and b/themes/openbureau/static/favicon_io/favicon.ico differ diff --git a/themes/openbureau/static/favicon_io/manifest.json b/themes/openbureau/static/favicon_io/manifest.json new file mode 100755 index 0000000..013d4a6 --- /dev/null +++ b/themes/openbureau/static/favicon_io/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/themes/openbureau/static/favicon_io/ms-icon-144x144.png b/themes/openbureau/static/favicon_io/ms-icon-144x144.png new file mode 100755 index 0000000..42b74b0 Binary files /dev/null and b/themes/openbureau/static/favicon_io/ms-icon-144x144.png differ diff --git a/themes/openbureau/static/favicon_io/ms-icon-150x150.png b/themes/openbureau/static/favicon_io/ms-icon-150x150.png new file mode 100755 index 0000000..e47af00 Binary files /dev/null and b/themes/openbureau/static/favicon_io/ms-icon-150x150.png differ diff --git a/themes/openbureau/static/favicon_io/ms-icon-310x310.png b/themes/openbureau/static/favicon_io/ms-icon-310x310.png new file mode 100755 index 0000000..83666ef Binary files /dev/null and b/themes/openbureau/static/favicon_io/ms-icon-310x310.png differ diff --git a/themes/openbureau/static/favicon_io/ms-icon-70x70.png b/themes/openbureau/static/favicon_io/ms-icon-70x70.png new file mode 100755 index 0000000..238c63b Binary files /dev/null and b/themes/openbureau/static/favicon_io/ms-icon-70x70.png differ diff --git a/themes/openbureau/theme.toml b/themes/openbureau/theme.toml new file mode 100755 index 0000000..fdcda57 --- /dev/null +++ b/themes/openbureau/theme.toml @@ -0,0 +1,21 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "Shibui (渋い)" +license = "MIT" +licenselink = "https://github.com/ntk148v/shibui/blob/main/LICENSE" +description = "Shibui is a yet another minimalistic Hugo theme" +homepage = "https://github.com/ntk148v/shibui" +demosite = "https://ntk148v.github.io/shibui" +tags = ["minimalist", "clean", "responsive", "blog", "simple"] +features = ["responsive"] + +[author] +name = "ntk148v" +homepage = "https://github.com/ntk148v" + +[module] +[module.hugoVersion] +extended = false +min = "0.93.0" +