From 9806483add47bf2a68d158c94c545501e9987052 Mon Sep 17 00:00:00 2001 From: trilium-share-gruvbox Date: Mon, 7 Sep 2026 19:43:51 +0200 Subject: [PATCH] Ship all three blog themes (Coffee/Harbor/Gruvbox) with palette images, theme-switch guide; make 3D viewer read theme CSS variables --- README.md | 37 +- THIRD_PARTY_LICENSES.md | 8 +- assets/palette-coffee.png | Bin 0 -> 23125 bytes assets/palette-gruvbox.png | Bin 0 -> 24374 bytes assets/palette-harbor.png | Bin 0 -> 20024 bytes assets/palette.png | Bin 24653 -> 0 bytes docs/switch-blog-theme.md | 65 + scripts/3d_model_viewer.js | 9 +- ..._theme.css => blog_share_theme_coffee.css} | 0 theme/blog_share_theme_gruvbox.css | 1886 +++++++++++++++++ theme/blog_share_theme_harbor.css | 1886 +++++++++++++++++ 11 files changed, 3877 insertions(+), 14 deletions(-) create mode 100644 assets/palette-coffee.png create mode 100644 assets/palette-gruvbox.png create mode 100644 assets/palette-harbor.png delete mode 100644 assets/palette.png create mode 100644 docs/switch-blog-theme.md rename theme/{blog_share_theme.css => blog_share_theme_coffee.css} (100%) create mode 100644 theme/blog_share_theme_gruvbox.css create mode 100644 theme/blog_share_theme_harbor.css diff --git a/README.md b/README.md index 4c6d8bc..247322a 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,27 @@ mind-map notes. Everything is driven by Trilium's built-in **Public Share** feature plus a few frontend/backend scripts – no external dependencies (except `highlight.js`, vendored in `lib/`). -![Coffee palette](assets/palette.png) +## Themes -*Palette from the [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (Coffee / Coffee Latte) repository, MIT licensed.* +The share ships with **three themes**, each with a dark and a light variant (toggled via the header +switch / `html.theme-light` + `html.theme-dark`). They live in `theme/` and are set on the blog by +pointing the `shareCss` relation at the matching note – see +[`docs/switch-blog-theme.md`](docs/switch-blog-theme.md) for the step-by-step guide. + +| Theme | File | Palette (dark / light) | Source | +|---|---|---|---| +| **Coffee** (active by default) | `theme/blog_share_theme_coffee.css` | espresso `#1d150f` / latte-cream `#f0e2d0`, caramel `#e0a15c` · cream `#E8E3C3` / ink `#2D1A1D`, berry `#8e2d53` | [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (MIT) | +| **Harbor** | `theme/blog_share_theme_harbor.css` | near-black `#1b1b1b` / cream `#efebdc`, coral `#e75a50` · paper `#dfe4c4` / ink `#1c2d28`, nord-blue `#5e81ac` | [HANCORE-linux/omarchy-harbor-theme](https://github.com/HANCORE-linux/omarchy-harbor-theme) (MIT) | +| **Gruvbox** | `theme/blog_share_theme_gruvbox.css` | bg `#282828` / fg `#ebdbb2`, accents red/green/yellow/blue | [morhetz/gruvbox](https://github.com/morhetz/gruvbox) (MIT) | + +![Coffee palette](assets/palette-coffee.png) +![Harbor palette](assets/palette-harbor.png) +![Gruvbox palette](assets/palette-gruvbox.png) ## Features -- Coffee dark / Coffee Latte light theme for the share, with a theme toggle in the header. +- Coffee dark / Coffee Latte light theme for the share, with a theme toggle in the header + (Gruvbox and Harbor are available as well – see the [Themes](#themes) section). - Blog index, category pages, sub-categories, tags and tag overview. - **Menu sorting**: articles in the left menu are sorted by publication date (newest first) and labelled `Fri 2026-08-28 ` automatically. All date displays @@ -66,7 +80,9 @@ no external dependencies (except `highlight.js`, vendored in `lib/`). |---|---|---| | `blog_generator.js` | backend script that generates index, feed, sitemap, search data, category & tag pages | code, `application/javascript;env=backend` | | `blog_publish_manager.js` | backend script that mirrors notes between `Unpublished` and the blog | code, `application/javascript;env=backend` | -| `theme/blog_share_theme.css` | the Coffee share theme (Coffee / Coffee Latte) | code, `text/css` | +| `theme/blog_share_theme_coffee.css` | Coffee / Coffee Latte share theme (active by default) | code, `text/css` | +| `theme/blog_share_theme_harbor.css` | Harbor / Harbordark share theme | code, `text/css` | +| `theme/blog_share_theme_gruvbox.css` | Gruvbox light/dark share theme | code, `text/css` | | `theme/favicon.svg` | default site favicon | code (SVG) | | `theme/cookie.woff2` | "Cookie" font for the Buy me a coffee button | file, `font/woff2` | | `lib/highlight.js` | vendored highlight.js | code, `application/javascript` | @@ -124,7 +140,9 @@ Under **`.blog`** create one code note per file, using the file name as the note | Note title | File | mime | |---|---|---| -| `blog_share_theme.css` | `theme/blog_share_theme.css` | `text/css` | +| `blog_share_theme_coffee.css` | `theme/blog_share_theme_coffee.css` | `text/css` | +| `blog_share_theme_harbor.css` | `theme/blog_share_theme_harbor.css` | `text/css` | +| `blog_share_theme_gruvbox.css` | `theme/blog_share_theme_gruvbox.css` | `text/css` | | `favicon` | `theme/favicon.svg` | – (SVG) | | `Cookie` | `theme/cookie.woff2` | `font/woff2` (file note) | | `highlight.js` | `lib/highlight.js` | `application/javascript` | @@ -176,7 +194,7 @@ mime `application/javascript;env=backend`) and `blog_publish_manager` (from | `shareOpenGraphURL` | `https://YOUR-INSTANCE.example.com/` | – | | `shareOpenGraphColor` | `#83a598` | – | | `iconClass` | `bx bx-edit-alt` | – | -| `~shareCss` | → `blog_share_theme.css` | yes | +| `~shareCss` | → `blog_share_theme_coffee.css` (the active theme) | yes | | `~shareFavicon` | → `favicon` | yes | | `~shareTemplate` | → `share template` | yes | | `~shareOpenGraphImage` | → `og-banner` | – | @@ -297,7 +315,10 @@ server { ## Customisation -- **Theme**: edit `theme/blog_share_theme.css` (Coffee / Coffee Latte via `html.theme-light/dark`). +- **Theme**: pick one of `theme/blog_share_theme_{coffee,harbor,gruvbox}.css` and point the blog's + `shareCss` relation at it – see [`docs/switch-blog-theme.md`](docs/switch-blog-theme.md). Each theme + ships dark + light via `html.theme-light/dark`. The 3D viewer and Mermaid rendering read the theme's + CSS variables, so they adapt automatically to whichever theme is active. - **Buy me a coffee**: edit `scripts/bmc_button.js` (link, text, copyright) – the font is referenced via `__COOKIE_FONT_ID__`. - **Category logos**: copy the `examples/` icon + `ignis8_menu_icon.js` pattern to give a @@ -309,6 +330,6 @@ This project is licensed under the **GNU General Public License v3.0** – see [ The repository also contains third-party assets that keep their own licenses: `lib/highlight.js` (BSD-3-Clause), `lib/hljs_line_numbers.js` (MIT), -`theme/cookie.woff2` (SIL OFL 1.1), `assets/palette.png` (MIT) and the embedded +`theme/cookie.woff2` (SIL OFL 1.1), the three palette images `assets/palette-*.png` (MIT) and the embedded Trilium logo in `scripts/bmc_button.js` (AGPL-3.0). See [`THIRD_PARTY_LICENSES.md`](THIRD_PARTY_LICENSES.md) for details. \ No newline at end of file diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md index 3826dbc..2dfb65b 100644 --- a/THIRD_PARTY_LICENSES.md +++ b/THIRD_PARTY_LICENSES.md @@ -8,8 +8,12 @@ The following files in this repository are **not** covered by the GPL-3.0 and ke | `lib/highlight.js` | [Highlight.js](https://github.com/highlightjs/highlight.js) v11.9.0 | [BSD-3-Clause](#bsd-3-clause) | | `lib/hljs_line_numbers.js` | [highlightjs-line-numbers](https://github.com/yury-dymov/highlightjs-line-numbers) | [MIT](#mit-license) | | `theme/cookie.woff2` | "Cookie" font, © 2011 [Ania Kruk](https://fonts.google.com/specimen/Cookie) | [SIL Open Font License 1.1](https://openfontlicense.org/) | -| `assets/palette.png` | Coffee / Coffee Latte palette image generated from [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (repo: MIT) | [MIT](#mit-license) | -| `theme/blog_share_theme.css` | Coffee / Coffee Latte color scheme from [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (repo: MIT) | [MIT](#mit-license) | +| `assets/palette-coffee.png` | Coffee / Coffee Latte palette image generated from [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (repo: MIT) | [MIT](#mit-license) | +| `assets/palette-harbor.png` | Harbor / Harbordark palette image generated from [HANCORE-linux/omarchy-harbor-theme](https://github.com/HANCORE-linux/omarchy-harbor-theme) (repo: MIT) | [MIT](#mit-license) | +| `assets/palette-gruvbox.png` | Gruvbox palette image generated from [morhetz/gruvbox](https://github.com/morhetz/gruvbox) (repo: MIT) | [MIT](#mit-license) | +| `theme/blog_share_theme_coffee.css` | Coffee / Coffee Latte color scheme from [megabyte0x/omarchy-coffee-theme](https://github.com/megabyte0x/omarchy-coffee-theme) (repo: MIT) | [MIT](#mit-license) | +| `theme/blog_share_theme_harbor.css` | Harbor / Harbordark color scheme from [HANCORE-linux/omarchy-harbor-theme](https://github.com/HANCORE-linux/omarchy-harbor-theme) (repo: MIT) | [MIT](#mit-license) | +| `theme/blog_share_theme_gruvbox.css` | Gruvbox color scheme from [morhetz/gruvbox](https://github.com/morhetz/gruvbox) (repo: MIT) | [MIT](#mit-license) | | `lib/3d/three.min.js`, `lib/3d/OrbitControls.js`, `lib/3d/STLLoader.js` | [three.js](https://github.com/mrdoob/three.js) r128 | [MIT](#mit-license) | | `lib/3d/occt-import-js.js`, `lib/3d/occt-import-js.wasm` | [occt-import-js](https://github.com/kovacsv/occt-import-js) (OpenCASCADE, WASM) | [LGPL-2.1](#lgpl-21) | | `lib/3d/occt-wasm-bundle.js`, `lib/3d/occt-wasm.wasm` | [occt-wasm](https://github.com/andymai/occt-wasm) (OpenCASCADE **OCCT V8**, WebAssembly, esbuild-bundled `OcctKernel`) | [MIT OR Apache-2.0](#mit-license) | diff --git a/assets/palette-coffee.png b/assets/palette-coffee.png new file mode 100644 index 0000000000000000000000000000000000000000..d984c66e482203de951df8b0a163220f66b32f39 GIT binary patch literal 23125 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 literal 0 HcmV?d00001 diff --git a/assets/palette-gruvbox.png b/assets/palette-gruvbox.png new file mode 100644 index 0000000000000000000000000000000000000000..3a271b9d973e5cfda20b33cc23e55f8fb6432a81 GIT binary patch literal 24374 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 RuFU)lh@HqCmD`S9{0mqjdZPdU diff --git a/docs/switch-blog-theme.md b/docs/switch-blog-theme.md new file mode 100644 index 0000000..7847be3 --- /dev/null +++ b/docs/switch-blog-theme.md @@ -0,0 +1,65 @@ +# Switching the blog theme + +The blog theme is **not** selected by a file name – it is controlled by the **`~shareCss` relation** +on the blog root note (`Richard's Blog`) inside Trilium. The relation points at a `text/css` note +that holds the theme stylesheet. Everything below uses the notes of this repository's live blog; +note IDs are given for reference. + +## Available themes + +| Theme | Repo file | Live note | Dark / light | +|---|---|---|---| +| Coffee (default) | `theme/blog_share_theme_coffee.css` | `NqZXcFRGi3II` | espresso / latte-cream | +| Harbor | `theme/blog_share_theme_harbor.css` | `Ep54EDTwKxup` | harbordark / paper | +| Gruvbox | `theme/blog_share_theme_gruvbox.css` | `edhL5cByGwqA` | gruvbox dark / light | + +All three themes include a `html.theme-light` + `html.theme-dark` block, theme-aware **3D viewer** +overlays and **Mermaid** rendering. The 3D viewer reads the theme's CSS variables +(`--background-primary` for the canvas, `--background-active` for the model material), so it adapts +automatically to whichever theme is active – no script changes needed. + +## How the active theme is resolved + +1. The blog root note (`Richard's Blog`, `OKjkpgmXZY1L`) carries `~shareCss` → `blog_share_theme_*.css`. +2. The target note is a `code` note with mime `text/css` living under `.blog` (the share system note). +3. The public share renders the page and loads that note's CSS. + +## Switching themes + +Pick the target note and re-point the relation. The theme note already exists in Trilium (see the +table above), so only the relation needs to change. + +### Option A – via the Trilium UI + +1. Find the target theme note under `.blog` (e.g. `blog_share_theme_gruvbox.css`). +2. Open `Richard's Blog` → Attributes → edit the `~shareCss` relation to point at that note. +3. Hard-refresh the blog (Ctrl+F5). Done. + +### Option B – via ETAPI (scriptable) + +```bash +TOKEN="your-etapi-token" +SERVER="https://notes.familie-zink.org" + +# 1. Delete the current shareCss relation on the blog root (OKjkpgmXZY1L) +curl -X DELETE "$SERVER/etapi/attributes/" -H "Authorization: $TOKEN" + +# 2. Point shareCss at the desired theme note (example: Gruvbox edhL5cByGwqA) +curl -X POST "$SERVER/etapi/attributes" \ + -H "Authorization: $TOKEN" -H "Content-Type: application/json" \ + -d '{"noteId":"OKjkpgmXZY1L","type":"relation","name":"shareCss","value":"edhL5cByGwqA","isInheritable":true}' +``` + +The attribute ID of the old `shareCss` relation can be looked up via +`GET $SERVER/etapi/notes/OKjkpgmXZY1L/attributes` (or the Trilium attribute list on the note). + +### Option C – create a fresh theme note from this repo + +If you want to add or customise a theme on a new Trilium instance: + +1. Create a `code` note with mime `text/css` under `.blog`, title e.g. `blog_share_theme_coffee.css`. +2. Copy the contents of the matching `theme/blog_share_theme_*.css` file into it. +3. Point `~shareCss` on the blog root at the new note (Option A or B). + +> **Tip:** After a theme/content change the page may be cached – do a hard reload. If you run +> nginx proxy caching, also clear the cache (see `AGENTS.md` / the nginx guide). \ No newline at end of file diff --git a/scripts/3d_model_viewer.js b/scripts/3d_model_viewer.js index 77fc5d3..a09bff6 100644 --- a/scripts/3d_model_viewer.js +++ b/scripts/3d_model_viewer.js @@ -232,8 +232,9 @@ var initSize = canvasSize(); var renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(initSize.w, initSize.h); - var isLight = document.documentElement.classList.contains("theme-light"); - renderer.setClearColor(isLight ? 0xE8E3C3 : 0x1d150f, 1); + var cs = getComputedStyle(document.documentElement); + function cssVar(n, fb) { var v = (cs.getPropertyValue(n) || "").trim(); return v || fb; } + renderer.setClearColor(cssVar("--background-primary", "#1d150f"), 1); var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(45, initSize.w / initSize.h, 0.1, 1000000); @@ -309,7 +310,7 @@ geo.setAttribute("position", new THREE.Float32BufferAttribute(e.data.positions, 3)); if (e.data.indices) geo.setIndex(new THREE.BufferAttribute(e.data.indices, 1)); fixWinding(geo); - var mat = new THREE.MeshStandardMaterial({ color: isLight ? 0x8e2d53 : 0xe0a15c, metalness: 0.2, roughness: 0.6, side: THREE.DoubleSide, flatShading: false }); + var mat = new THREE.MeshStandardMaterial({ color: cssVar("--background-active", "#e0a15c"), metalness: 0.2, roughness: 0.6, side: THREE.DoubleSide, flatShading: false }); chunkGeometry(geo, group, mat); var tris = (e.data.indices && e.data.indices.length) ? e.data.indices.length / 3 : e.data.positions.length / 9; fit(); @@ -331,7 +332,7 @@ } else { var geo = new THREE.STLLoader().parse(data.buffer); geo.computeVertexNormals(); - var mat = new THREE.MeshStandardMaterial({ color: isLight ? 0x8e2d53 : 0xe0a15c, metalness: 0.25, roughness: 0.55, flatShading: true }); + var mat = new THREE.MeshStandardMaterial({ color: cssVar("--background-active", "#e0a15c"), metalness: 0.25, roughness: 0.55, flatShading: true }); group.add(new THREE.Mesh(geo, mat)); fit(); showCanvas(); diff --git a/theme/blog_share_theme.css b/theme/blog_share_theme_coffee.css similarity index 100% rename from theme/blog_share_theme.css rename to theme/blog_share_theme_coffee.css diff --git a/theme/blog_share_theme_gruvbox.css b/theme/blog_share_theme_gruvbox.css new file mode 100644 index 0000000..5b37ac3 --- /dev/null +++ b/theme/blog_share_theme_gruvbox.css @@ -0,0 +1,1886 @@ +/* + * Gruvbox Share Theme for Richard's Blog (Trilium Public Share) + * Palette: bg #282828 / #3c3836 / #504945 / #1d2021 fg #ebdbb2 / #fbf1c7 + * red #fb4934 green #b8bb26 yellow #fabd2f + * blue #83a598 purple #d3869b aqua #8ec07c orange #fe8019 + */ + +html.theme-light { + --background-primary: #fbf1c7; + --background-secondary: #ebdbb2; + --background-highlight: #d5c4a1; + --background-active: #83a598; + --blog-card-bg: #ebdbb2; + --scrollbar-thumb: #d5c4a1; + --scrollbar-hover: #bdae93; + --scrollbar-track: #ebdbb2; + --text-primary: #3c3836; + --text-heading: #282828; + --text-menu: #504945; + --text-link: #076678; + --text-menu-active: #fbf1c7; + color-scheme: light; +} + +html.theme-dark { + --background-primary: #282828; + --background-secondary: #1d2021; + --background-highlight: #504945; + --background-active: #83a598; + --blog-card-bg: #3c3836; + --scrollbar-thumb: #504945; + --scrollbar-hover: #665c54; + --scrollbar-track: #1d2021; + --text-primary: #ebdbb2; + --text-heading: #fbf1c7; + --text-menu: #a89984; + --text-link: #83a598; + --text-menu-active: #1d2021; + color-scheme: dark; +} + +body { + font-family: "Inter", "Montserrat", "Lucida Grande", "Lucida Sans Unicode", arial, sans-serif; +} + +/* ---------- Header: Logo durch Laptop-Emoji ---------- */ +#header-logo img { + display: none; +} + +#header-logo::before { + content: "💻"; + font-size: 1.5em; + line-height: 1; + margin-right: 8px; + display: inline-block; + vertical-align: middle; +} + +/* ---------- Buy Me a Coffee (original, lokal) ---------- */ +@font-face { + font-family: "Cookie"; + src: url(/api/notes/__COOKIE_FONT_ID__/download) format("woff2"); + font-weight: 400; + font-display: swap; +} + +#bmc-links { + margin-top: auto; + padding: 8px 25px 4px; + background: var(--background-secondary); + display: flex; + flex-direction: column; + gap: 2px; +} + +.bmc-link { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 6px 4px 24px; + border-radius: 6px; + color: var(--text-heading); + text-decoration: none; + font-size: 0.9em; + transition: background-color 150ms ease, color 150ms ease; +} + +.bmc-link:hover { + background: var(--background-highlight); + color: var(--text-heading); + text-decoration: none; +} + +.bmc-link .tn-icon { + color: var(--text-link); +} + +/* ---------- Menu: wie Footer-Links gestalten ---------- */ +#menu a { + color: var(--text-heading); + gap: 8px; + font-size: 0.9em; + padding: 4px 6px; + border-color: transparent; + transition: background-color 150ms ease, color 150ms ease; +} + +#menu a:hover { + background: var(--background-highlight); + color: var(--text-heading); + border-color: transparent; + text-decoration: none; +} + +#menu a.active { + background: var(--background-active); + color: var(--background-secondary); + border-color: transparent; +} + +#menu .tn-icon { + color: var(--text-link); +} + +#bmc-wrap { + padding: 8px 14px 14px; + background: var(--background-secondary); + border-top: 1px solid var(--background-highlight); +} + +.bmc-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + box-sizing: border-box; + padding: 6px 12px 8px; + border-radius: 8px; + background: #fabd2f; + color: #1d2021; + border: 2px solid #1d2021; + font-family: "Cookie", "Brush Script MT", cursive; + font-size: 1.4em; + line-height: 1.1; + text-decoration: none; + transition: background-color 150ms ease, transform 150ms ease; +} + +.bmc-btn:hover { + background: #fe8019; + color: #1d2021; + text-decoration: none; + transform: translateY(-1px); +} + +.bmc-btn .bmc-emoji { + font-size: 1.15em; +} + +.bmc-copyright { + margin-top: 8px; + font-size: 0.75em; + color: var(--text-menu); + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + flex-wrap: wrap; +} + +.bmc-powered { + display: inline-flex; + align-items: center; + gap: 3px; + color: var(--text-menu); + text-decoration: none; + transition: color 150ms ease; +} + +.bmc-powered:hover { + color: var(--text-link); + text-decoration: none; +} + +.powered-logo { + width: 1em; + height: 1em; + display: inline-block; +} + +/* ---------- Reading time ---------- */ +.reading-time { + font-size: 0.8em; + color: var(--text-menu); + margin: -0.9em 0 1.25em; +} + +/* ---------- Blog pagination ---------- */ +.blog-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin: 1.5em 0 0; + padding-top: 1em; + border-top: 1px solid var(--background-highlight); +} + +.blog-pagination .blog-page-num { + font-size: 0.85em; + color: var(--text-menu); +} + +/* ---------- Share footer navigation (built-in prev/next) ausblenden ---------- */ +#content-footer .navigation { + display: none; +} + +/* ---------- Prev/Next ---------- */ +.blog-prevnext { + display: flex; + justify-content: space-between; + gap: 12px; + margin: 1.5em 0 0; + padding-top: 1em; + border-top: 1px solid var(--background-highlight); +} + +.blog-pn { + display: flex; + flex-direction: column; + gap: 2px; + max-width: 45%; + color: var(--text-heading); + text-decoration: none; + transition: color 150ms ease; +} + +.blog-pn.next { + margin-left: auto; + align-items: flex-end; + text-align: right; +} + +.blog-pn-label { + font-size: 0.72em; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-menu); +} + +.blog-pn:hover { + color: var(--text-link); + text-decoration: none; +} + +.blog-pn.empty { + display: none; +} + +/* ---------- Search ---------- */ +.blog-search { + margin: 0.5em 0 1em; +} + +.blog-search-input { + width: 100%; + box-sizing: border-box; + padding: 10px 14px; + border-radius: 8px; + border: 1px solid var(--background-highlight); + background: var(--background-secondary); + color: var(--text-heading); + font-size: 1em; +} + +.blog-search-input:focus { + outline: none; + border-color: var(--text-link); +} + +.blog-search-list { + list-style: none; + padding: 0; + margin: 1em 0 0; +} + +.blog-search-hit { + display: flex; + flex-direction: column; + gap: 2px; + padding: 8px 12px; + border-radius: 8px; + border: 1px solid var(--background-highlight); + background: var(--blog-card-bg); + color: var(--text-heading); + text-decoration: none; + margin-bottom: 8px; + transition: border-color 150ms ease; +} + +.blog-search-hit:hover { + border-color: var(--text-link); + text-decoration: none; +} + +.blog-search-path { + font-size: 0.8em; + color: var(--text-menu); +} + +.blog-search-none { + color: var(--text-menu); +} + +/* ---------- Header-Suche (ersetzt eingebaute) ---------- */ +.search-item { + position: relative; +} + +.blog-search-header-input { + flex: 1; + min-width: 0; + padding: 6px 10px 6px 32px; + border-radius: 6px; + border: 1px solid rgba(131, 165, 152, 0.55); + background: rgba(131, 165, 152, 0.08); + color: var(--text-heading); + font-size: 0.9em; + transition: border-color 150ms ease, box-shadow 150ms ease; +} + +html.theme-light .blog-search-header-input { + border-color: #076678; + background: rgba(7, 102, 120, 0.10); +} + +.blog-search-header-input:focus { + outline: none; + border-color: #83a598; + box-shadow: 0 0 0 2px rgba(131, 165, 152, 0.20); +} + +html.theme-light .blog-search-header-input:focus { + border-color: #076678; + box-shadow: 0 0 0 2px rgba(7, 102, 120, 0.15); +} + +.search-item .search-icon { + color: rgba(131, 165, 152, 0.85); +} + +html.theme-light .search-item .search-icon { + color: #076678; +} + +.tn-image { + width: 18px; + height: 18px; + border-radius: 4px; + flex-shrink: 0; + vertical-align: middle; +} + +.tn-image-svg { + color: var(--text-link); +} + +.title-image { + width: 34px; + height: 34px; + border-radius: 6px; + vertical-align: middle; + margin-right: 10px; +} + +.note-fallback { + margin: 1em 0; + overflow: hidden; +} + +.note-fallback-link { + font-size: 0.9em; +} + +.mermaid-fallback { + margin: 1em 0; +} + +.mermaid-render { + margin: 1em 0; + padding: 14px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow-x: auto; +} + +.mermaid-render svg { + max-width: 100%; + height: auto; +} + +.mermaid-source { + margin: 12px 0 0; + text-align: center; +} + +.mermaid-source summary { + cursor: pointer; + font-size: 0.85em; + color: var(--text-menu); + user-select: none; + padding: 4px 10px; + border: 1px solid var(--background-highlight); + border-radius: 6px; + display: inline-block; + background: var(--background-secondary); +} + +.mermaid-source summary:hover { + color: var(--text-heading); + border-color: var(--text-link); +} + +.mermaid-source pre { + width: min(100%, 820px); + margin: 8px auto 0; + text-align: left; + position: relative; + overflow: hidden; +} + +#content .mermaid-source .hljs-ln { + width: 100%; +} + +/* ---------- Rendered widgets: mind map + excalidraw ---------- */ +.mindmap-render, +.excalidraw-render { + margin: 1em 0; + padding: 14px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow-x: auto; +} + +.mindmap-svg { + display: block; + width: 100%; + height: auto; +} + +.excalidraw-svg { + display: block; + max-width: 100%; + height: auto; +} + +.mindmap-render svg text { + user-select: none; +} + +.blog-search-overlay { + display: none; + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + z-index: 50; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); +} + +.blog-search-overlay.open { + display: block; +} + +.blog-search-overlay-hit { + display: flex; + flex-direction: column; + gap: 1px; + padding: 7px 10px; + color: var(--text-heading); + text-decoration: none; + font-size: 0.85em; + border-bottom: 1px solid var(--background-highlight); +} + +.blog-search-overlay-hit:last-child { + border-bottom: none; +} + +.blog-search-overlay-hit:hover { + background: var(--background-highlight); + text-decoration: none; +} + +.blog-search-overlay-hit .s { + font-size: 0.75em; + color: var(--text-menu); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.blog-search-overlay .blog-search-none { + padding: 8px 10px; + font-size: 0.85em; +} + +#main { + max-width: min(92vw, 1200px); +} + +#site-header { + padding-bottom: 10px; +} + +#title { + font-family: "JetBrains Mono", "Montserrat", monospace; + letter-spacing: -0.02em; +} + +body.is-garden #title { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +body.is-garden #title .note-state { + margin-left: auto; + flex-shrink: 0; +} + +body.is-garden #content h1#title { + background-color: rgba(184, 187, 38, 0.35) !important; + border-bottom-color: rgba(184, 187, 38, 0.60) !important; +} + +html.theme-light body.is-garden #content h1#title { + background-color: rgba(184, 187, 38, 0.20) !important; + border-bottom-color: rgba(184, 187, 38, 0.45) !important; +} + +/* ---------- Blog index (generated article list) ---------- */ +.blog-post { + padding: 1.2em 1.4em; + margin-bottom: 1.25em; + border: 1px solid var(--background-highlight); + border-radius: 10px; + background: var(--blog-card-bg); + transition: border-color 150ms ease, box-shadow 150ms ease; + cursor: pointer; +} + +.blog-post:last-child { + margin-bottom: 0; +} + +.blog-post:hover { + border-color: var(--text-link); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18); +} + +#content .blog-post:first-of-type { + margin-top: 1.5em; +} + +/* ---------- Blog post thumbnails (Bild links, Teaser rechts) ---------- */ +.blog-post-inner { + display: flex; + gap: 16px; + align-items: stretch; +} + +.blog-thumb-link { + flex: 0 0 auto; + width: min(256px, 35%); + text-decoration: none; +} + +.blog-thumb { + display: block; + width: 100%; + height: 100%; + max-height: 256px; + object-fit: cover; + border-radius: 8px; + border: 1px solid var(--background-highlight); +} + +.blog-post-body { + flex: 1; + min-width: 0; +} + +.blog-post-title { + margin: 0 0 0.25em; +} + +.blog-post-title a { + color: var(--text-heading); + text-decoration: none; + transition: color 150ms ease; +} + +.blog-post-title a:hover { + color: var(--text-link); + text-decoration: none; +} + +.blog-post-meta { + display: flex; + gap: 12px; + font-size: 0.85em; + color: var(--text-menu); + margin-bottom: 0.5em; +} + +.blog-post-date { + font-variant-numeric: tabular-nums; + opacity: 0.85; +} + +.blog-post-category { + background: var(--background-highlight); + border-radius: 8px; + padding: 1px 10px; + color: var(--text-heading); + font-weight: 600; +} + +.blog-post-summary { + margin: 0 0 0.5em; + color: var(--text-primary); +} + +.blog-post-tags { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.tag { + font-size: 0.78em; + color: var(--text-link); + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + padding: 1px 8px; +} + +a.tag { + text-decoration: none; + transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease; +} + +a.tag:hover { + background: var(--background-highlight); + border-color: var(--text-link); + color: var(--text-heading); + text-decoration: none; +} + +/* ---------- Article meta (date/category on individual pages) ---------- */ +.article-meta { + display: flex; + gap: 12px; + font-size: 0.9em; + color: var(--text-menu); + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--background-highlight); +} + +/* ---------- Headings (h2-h6) - Gruvbox header boxes ---------- */ +html.theme-dark { + --header-h2-bg: rgba(131, 165, 152, 0.35); + --header-h2-border: rgba(131, 165, 152, 0.7); + --header-h3-bg: rgba(142, 192, 124, 0.25); + --header-h3-border: rgba(142, 192, 124, 0.6); + --header-h4-bg: rgba(250, 189, 47, 0.25); + --header-h4-border: rgba(250, 189, 47, 0.6); + --header-h5-bg: rgba(211, 134, 155, 0.25); + --header-h5-border: rgba(211, 134, 155, 0.6); + --header-h6-bg: rgba(254, 128, 25, 0.25); + --header-h6-border: rgba(254, 128, 25, 0.6); + --header-h1-bg: rgba(251, 73, 52, 0.30); + --header-h1-border: rgba(251, 73, 52, 0.6); +} + +html.theme-light { + --header-h2-bg: rgba(7, 102, 120, 0.18); + --header-h2-border: rgba(7, 102, 120, 0.45); + --header-h3-bg: rgba(121, 116, 14, 0.10); + --header-h3-border: rgba(121, 116, 14, 0.35); + --header-h4-bg: rgba(181, 118, 20, 0.10); + --header-h4-border: rgba(181, 118, 20, 0.35); + --header-h5-bg: rgba(143, 63, 113, 0.10); + --header-h5-border: rgba(143, 63, 113, 0.35); + --header-h6-bg: rgba(175, 58, 3, 0.10); + --header-h6-border: rgba(175, 58, 3, 0.35); + --header-h1-bg: rgba(157, 0, 6, 0.12); + --header-h1-border: rgba(157, 0, 6, 0.40); +} + +#content h1 { + background-color: var(--header-h1-bg); + border-bottom: 2px solid var(--header-h1-border); + border-radius: 4px; + padding: 0.3em 0.4em; + font-size: 1.6em; + font-weight: 700; + margin-top: 1.5em; + margin-bottom: 1.25em; +} + +#content h2 { + background-color: var(--header-h2-bg); + border-bottom: 2px solid var(--header-h2-border); + border-radius: 4px; + padding: 0.25em 0.4em; +} + +#content h3 { + background-color: var(--header-h3-bg); + border-bottom: 2px solid var(--header-h3-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h4 { + background-color: var(--header-h4-bg); + border-bottom: 2px solid var(--header-h4-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h5 { + background-color: var(--header-h5-bg); + border-bottom: 2px solid var(--header-h5-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h6 { + background-color: var(--header-h6-bg); + border-bottom: 2px solid var(--header-h6-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#childLinks { + display: none; +} + +#index { + display: none; +} + +/* ---------- Code blocks - Gruvbox Dark (always, also in light mode) ---------- */ +.ck-content pre, +#content pre { + background-color: #282828; + color: #ebdbb2; + border: 1px solid #504945; + border-radius: 8px; +} + +.ck-content code, +#content code { + background-color: #3c3836; + color: #ebdbb2; + border-color: #504945; + border-radius: 8px; + padding: 0.1em 0.35em; +} + +html.theme-light .ck-content pre, +html.theme-light #content pre { + background-color: #fbf1c7; + color: #3c3836; + border-color: #d5c4a1; +} + +html.theme-light .ck-content code, +html.theme-light #content code { + background-color: #d5c4a1; + color: #3c3836; + border-color: #bdae93; +} + +/* ---------- Eingebettete Bilder: Radius wie Code-Blöcke (8px) ---------- */ +#content figure.image { + margin: 1.25em auto; +} + +#content figure img, +#content img:not(.blog-thumb) { + border-radius: 8px; +} + +/* ---------- 3D model viewer (STL / STEP) ---------- */ +.model-viewer { + position: relative; + box-sizing: border-box; + width: calc(100vw - 24px); + margin: 1em 0; + margin-left: calc(50% - (100vw - 24px) / 2); + background: #1d2021; + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; +} + +.model-viewer.model-viewer-inline { + width: 100%; + margin-left: 0; +} + +.model-viewer-data { + position: absolute; + top: 8px; + right: 10px; + z-index: 3; + display: none; + font-size: 0.75em; + color: #a89984; + background: rgba(40, 40, 40, 0.8); + border: 1px solid #504945; + border-radius: 6px; + padding: 2px 10px; + font-variant-numeric: tabular-nums; + pointer-events: none; +} + +.model-viewer-canvas { + position: relative; + width: 100%; + height: min(70vh, 900px); + min-height: 420px; +} + +.model-viewer-status { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + padding: 48px; + box-sizing: border-box; + color: #a89984; + font-size: 0.9em; +} + +.model-viewer-status.error { + color: #fb4934; +} + +.model-viewer-progress { + position: absolute; + left: 0; + right: 0; + bottom: 40px; + height: 6px; + width: min(60%, 480px); + margin: 0 auto; + background: #3c3836; + border-radius: 3px; + overflow: hidden; +} + +.model-viewer-progress-fill { + height: 100%; + width: 0; + background: #b8bb26; + border-radius: 3px; + transition: width 150ms ease; +} + +.model-viewer-progress-fill.indeterminate { + width: 40%; + animation: model-progress 1.1s ease-in-out infinite; +} + +@keyframes model-progress { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(250%); } +} + +.model-viewer-hint { + position: absolute; + top: 8px; + left: 10px; + font-size: 0.75em; + color: #a89984; + z-index: 2; + pointer-events: none; +} + +.model-viewer-caption { + font-size: 0.85em; + font-style: italic; + color: var(--text-menu); + text-align: center; + padding: 4px 12px; + background: var(--background-secondary); + border-top: 1px solid var(--background-highlight); +} + +.model-viewer canvas { + display: block; + width: 100%; + height: 100%; +} + +/* ---------- 3D-Viewer: theme-bewusste Overlays ---------- */ +html.theme-light .model-viewer { + background: #fbf1c7; +} +html.theme-light .model-viewer-status, +html.theme-light .model-viewer-hint, +html.theme-light .model-viewer-data { + color: #3c3836; +} +html.theme-light .model-viewer-data { + background: rgba(251, 241, 199, 0.85); + border-color: #d5c4a1; +} +html.theme-light .model-viewer-status.error { + color: #9d0006; +} +html.theme-light .model-viewer-progress { + background: #d5c4a1; +} +html.theme-light .model-viewer-progress-fill { + background: #83a598; +} + +/* ---------- Bildunterschriften (Gruvbox) ---------- */ +#content figcaption { + font-size: 0.85em; + font-style: italic; + color: var(--text-menu); + text-align: center; + margin-top: 8px; + padding: 4px 12px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + display: inline-block; +} + +.hljs { + background: #282828; + color: #ebdbb2; +} + +.hljs-comment, +.hljs-quote { + color: #928374; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #fb4934; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #d3869b; +} + +.hljs-string, +.hljs-doctag { + color: #b8bb26; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #fe8019; +} + +.hljs-type, +.hljs-class .hljs-title, +.hljs-attribute { + color: #fabd2f; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-deletion, +.hljs-addition { + color: #d3869b; +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #8ec07c; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} +/* ---------- Light mode: Gruvbox Light highlighter ---------- */ +html.theme-light .hljs, +html.theme-light pre code.hljs { + background: #fbf1c7 !important; + color: #3c3836; +} + +html.theme-light .hljs-comment, +html.theme-light .hljs-quote { + color: #928374; +} + +html.theme-light .hljs-keyword, +html.theme-light .hljs-selector-tag, +html.theme-light .hljs-subst { + color: #9d0006; +} + +html.theme-light .hljs-number, +html.theme-light .hljs-literal, +html.theme-light .hljs-variable, +html.theme-light .hljs-template-variable, +html.theme-light .hljs-tag .hljs-attr { + color: #8f3f71; +} + +html.theme-light .hljs-string, +html.theme-light .hljs-doctag { + color: #79740e; +} + +html.theme-light .hljs-title, +html.theme-light .hljs-section, +html.theme-light .hljs-selector-id { + color: #af3a03; +} + +html.theme-light .hljs-type, +html.theme-light .hljs-class .hljs-title, +html.theme-light .hljs-attribute { + color: #b57614; +} + +html.theme-light .hljs-symbol, +html.theme-light .hljs-bullet, +html.theme-light .hljs-link, +html.theme-light .hljs-meta, +html.theme-light .hljs-deletion, +html.theme-light .hljs-addition { + color: #8f3f71; +} + +html.theme-light .hljs-built_in, +html.theme-light .hljs-builtin-name, +html.theme-light .hljs-params { + color: #427b58; +} + +html.theme-light .hljs-regexp, +html.theme-light .hljs-operator, +html.theme-light .hljs-selector-attr, +html.theme-light .hljs-selector-pseudo, +html.theme-light .hljs-selector-class, +html.theme-light .hljs-template-tag { + color: #8f3f71; +} + +html.theme-light .hljs-name, +html.theme-light .hljs-tag { + color: #076678; +} + +html.theme-light .hljs-meta .hljs-string { + color: #79740e; +} +/* ---------- Admonitions (Trilium-style, gefüllt) ---------- */ +.admonition { + --accent-color: var(--background-highlight); + --admonition-bg: var(--background-secondary); + border: 1px solid var(--accent-color); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + background: var(--admonition-bg); + border-radius: 0.5em; + padding: 1em; + padding-inline-start: 2.5em; + margin: 1.25em 0; + position: relative; + overflow: hidden; +} + +html.theme-dark .admonition.note { --admonition-bg: rgba(105, 199, 255, 0.16); } +html.theme-dark .admonition.tip { --admonition-bg: rgba(64, 192, 37, 0.14); } +html.theme-dark .admonition.important { --admonition-bg: rgba(152, 57, 247, 0.18); } +html.theme-dark .admonition.caution { --admonition-bg: rgba(255, 46, 46, 0.16); } +html.theme-dark .admonition.warning { --admonition-bg: rgba(226, 170, 3, 0.14); } +html.theme-dark .admonition { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); } + +html.theme-light .admonition.note { --admonition-bg: rgba(105, 199, 255, 0.22); } +html.theme-light .admonition.tip { --admonition-bg: rgba(64, 192, 37, 0.16); } +html.theme-light .admonition.important { --admonition-bg: rgba(152, 57, 247, 0.15); } +html.theme-light .admonition.caution { --admonition-bg: rgba(255, 46, 46, 0.15); } +html.theme-light .admonition.warning { --admonition-bg: rgba(226, 170, 3, 0.20); } + +.admonition p:last-child { + margin-bottom: 0; +} + +.admonition p, +.admonition h2 { + margin-top: 0; +} + +.admonition.note { --accent-color: #69c7ff; } +.admonition.tip { --accent-color: #40c025; } +.admonition.important { --accent-color: #9839f7; } +.admonition.caution { --accent-color: #ff2e2e; } +.admonition.warning { --accent-color: #e2aa03; } + +.admonition::before { + color: var(--accent-color); + font-family: boxicons !important; + position: absolute; + top: 1em; + inset-inline-start: 1em; +} + +.admonition.note::before { content: "\eb21"; } +.admonition.tip::before { content: "\ea0d"; } +.admonition.important::before { content: "\ea7c"; } +.admonition.caution::before { content: "\eac7"; } +.admonition.warning::before { content: "\eac5"; } +/* ---------- Tables (Gruvbox, theme-aware) ---------- */ +html.theme-dark { + --table-header-bg: rgba(131, 165, 152, 0.30); + --table-header-text: #fbf1c7; + --table-header-border: rgba(131, 165, 152, 0.6); + --table-stripe: rgba(255, 255, 255, 0.04); + --table-hover: rgba(131, 165, 152, 0.16); + --table-rowlabel-bg: rgba(255, 255, 255, 0.05); + --table-rowlabel-text: #ebdbb2; +} + +html.theme-light { + --table-header-bg: rgba(7, 102, 120, 0.20); + --table-header-text: #282828; + --table-header-border: rgba(7, 102, 120, 0.45); + --table-stripe: rgba(0, 0, 0, 0.04); + --table-hover: rgba(7, 102, 120, 0.12); + --table-rowlabel-bg: rgba(0, 0, 0, 0.05); + --table-rowlabel-text: #3c3836; +} + +.ck-content table, +#content table { + border-collapse: separate; + border-spacing: 0; + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; + margin: 1em 0; +} + +.ck-content table th, +.ck-content table td, +#content table th, +#content table td { + border: none; + border-bottom: 1px solid var(--background-highlight); + border-right: 1px solid var(--background-highlight); + padding: 8px 12px; + text-align: left; + background-color: transparent !important; +} + +.ck-content table th:last-child, +.ck-content table td:last-child, +#content table th:last-child, +#content table td:last-child { + border-right: none; +} + +.ck-content table tr:last-child td, +#content table tr:last-child td { + border-bottom: none; +} + +.ck-content table thead th, +#content table thead th { + background-color: var(--table-header-bg) !important; + color: var(--table-header-text); + font-weight: 700; + border-bottom: 2px solid var(--table-header-border); +} + +.ck-content table tbody td:first-child, +#content table tbody td:first-child { + background-color: var(--table-rowlabel-bg) !important; + color: var(--table-rowlabel-text); + font-weight: 600; + white-space: nowrap; +} + +.ck-content table tbody tr:nth-child(even) td:not(:first-child), +#content table tbody tr:nth-child(even) td:not(:first-child) { + background-color: var(--table-stripe) !important; +} + +.ck-content table tbody tr:hover td, +#content table tbody tr:hover td { + background-color: rgba(254, 128, 25, 0.07) !important; +} + +.ck-content table .col-hover, +#content table .col-hover { + background-color: rgba(254, 128, 25, 0.07) !important; +} + +.ck-content table tbody tr:hover td.col-hover, +.ck-content table thead th.col-hover, +#content table tbody tr:hover td.col-hover, +#content table thead th.col-hover { + background-color: rgba(254, 128, 25, 0.14) !important; +} +/* ---------- Category subcategories ---------- */ +.blog-subcategories { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin: 0 0 1.25em; +} + +.blog-subcategory { + display: inline-flex; + align-items: center; + gap: 6px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + padding: 4px 12px; + color: var(--text-heading); + text-decoration: none; + font-weight: 600; + transition: background-color 150ms ease, border-color 150ms ease; +} + +.blog-subcategory i { + color: var(--text-link); +} + +.blog-subcategory:hover { + background: var(--background-highlight); + border-color: var(--text-link); + color: var(--text-heading); + text-decoration: none; +} +/* ---------- Digital Garden note table ---------- */ +.blog-garden-table { + width: 100%; +} + +.blog-garden-table tbody td:first-child { + background: transparent !important; + font-weight: normal; +} + +.note-type { + display: inline-block; + font-size: 0.8em; + padding: 2px 10px; + border-radius: 8px; + background: var(--background-highlight); + color: var(--text-heading); + font-weight: 600; + text-transform: capitalize; + white-space: nowrap; +} +/* ---------- Digital Garden rows: clickable + green hover ---------- */ +.blog-garden-table tbody tr { + cursor: pointer; +} + +#content .blog-garden-table tbody tr:hover td, +#content .blog-garden-table .col-hover { + background-color: rgba(184, 187, 38, 0.12) !important; +} + +#content .blog-garden-table tbody tr:hover td.col-hover { + background-color: rgba(184, 187, 38, 0.20) !important; +} +.note-state { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 0.8em; + padding: 2px 10px; + border-radius: 8px; + background: rgba(184, 187, 38, 0.18); + color: var(--text-heading); + font-weight: 600; + white-space: nowrap; +} + +.note-state i { + color: #b8bb26; +} + +.note-state.state-draft { + background: rgba(146, 131, 116, 0.22); +} + +.note-state.state-draft i { + color: #928374; +} + +.note-state.state-review { + background: rgba(131, 165, 152, 0.25); +} + +.note-state.state-review i { + color: #83a598; +} + +.note-state.state-unknown { + background: rgba(251, 73, 52, 0.20); +} + +.note-state.state-unknown i { + color: #fb4934; +} + +/* ---------- Peppige Garden-Badges (dark) ---------- */ +html.theme-dark .note-state { + background: rgba(184, 187, 38, 0.45); + border: 1px solid #b8bb26; + color: #282828; +} +html.theme-dark .note-state i { + color: #282828; +} +html.theme-dark .note-state.state-draft { + background: rgba(251, 73, 52, 0.85); + border-color: #ff6a5e; + color: #1d2021; +} +html.theme-dark .note-state.state-draft i { + color: #1d2021; +} +html.theme-dark .note-state.state-review { + background: rgba(131, 165, 152, 0.85); + border-color: #a3c7bb; + color: #1d2021; +} +html.theme-dark .note-state.state-review i { + color: #1d2021; +} +html.theme-dark .note-state.state-unknown { + background: rgba(254, 128, 25, 0.85); + border-color: #ffa45e; + color: #1d2021; +} +html.theme-dark .note-state.state-unknown i { + color: #1d2021; +} + +/* ---------- Peppige Garden-Badges (light) ---------- */ +html.theme-light .note-state { + background: rgba(121, 116, 14, 0.85); + border: 1px solid #79740e; + color: #f9f5d7; +} +html.theme-light .note-state i { + color: #f9f5d7; +} +html.theme-light .note-state.state-draft { + background: rgba(204, 36, 29, 0.90); + border-color: #9d0006; + color: #f9f5d7; +} +html.theme-light .note-state.state-draft i { + color: #f9f5d7; +} +html.theme-light .note-state.state-review { + background: rgba(69, 133, 136, 0.90); + border-color: #427b58; + color: #f9f5d7; +} +html.theme-light .note-state.state-review i { + color: #f9f5d7; +} +html.theme-light .note-state.state-unknown { + background: rgba(175, 58, 3, 0.90); + border-color: #af3a03; + color: #f9f5d7; +} +html.theme-light .note-state.state-unknown i { + color: #f9f5d7; +} +/* ---------- Code notes: always Gruvbox dark like code boxes ---------- */ +#content.type-code pre { + background-color: #282828 !important; + color: #ebdbb2; + border: 1px solid #504945; + border-radius: 8px; + padding: 1em; + margin: 1em 0; +} + +#content.type-code code { + background-color: transparent !important; + color: #ebdbb2; + border: 0; +} + +html.theme-light #content.type-code pre { + background-color: #fbf1c7 !important; + color: #3c3836; + border-color: #d5c4a1; +} + +html.theme-light #content.type-code code { + color: #3c3836; +} +/* ---------- Code: line numbers + copy button ---------- */ +pre.code-processed { + position: relative; + display: flex; + align-items: flex-start; + line-height: 1.6; +} + +pre.code-processed .code-wrap { + flex: 1; + min-width: 0; + overflow-x: auto; + border-radius: 8px; +} + +pre.code-processed .code-wrap code { + display: block; + line-height: inherit; + padding: 0; + margin: 0; +} + +pre.code-processed .code-lines { + flex-shrink: 0; + user-select: none; + text-align: right; + padding: 0 12px 0 0; + margin: 0 12px 0 0; + border-right: 1px solid var(--background-highlight); + color: var(--text-menu); + white-space: pre; + font-family: "JetBrains Mono", Consolas, monospace; + font-size: 1em; + line-height: inherit; +} + +pre.code-processed .code-copy-btn, +.mermaid-source pre .code-copy-btn { + position: absolute; + top: 6px; + right: 6px; + z-index: 2; + font-size: 0.75em; + padding: 2px 10px; + border-radius: 6px; + border: 1px solid var(--background-highlight); + background: var(--background-secondary); + color: var(--text-heading); + cursor: pointer; + opacity: 0.6; + transition: opacity 150ms ease; +} + +pre.code-processed:hover .code-copy-btn, +.mermaid-source pre:hover .code-copy-btn { + opacity: 1; +} + +pre.code-processed .code-copy-btn:hover, +.mermaid-source pre .code-copy-btn:hover { + border-color: var(--text-link); + opacity: 1; +} +/* ---------- highlight.js line numbers ---------- */ +#content .hljs-ln { + border-collapse: collapse; + border: none !important; + box-shadow: none; + border-radius: 8px; + margin: 0; + width: auto; + line-height: 1.4; +} + +#content .hljs-ln td, +#content .hljs-ln th { + border: none !important; + background-color: transparent !important; + padding: 0; +} + +#content .hljs-ln tbody td:first-child, +#content .hljs-ln thead th:first-child { + background-color: transparent !important; +} + +#content .hljs-ln tbody tr:nth-child(even) td { + background-color: transparent !important; +} + +#content .hljs-ln .col-hover { + background-color: transparent !important; +} + +#content .hljs-ln tbody tr:hover td, +#content .hljs-ln tbody tr:hover td.col-hover { + background-color: rgba(254, 128, 25, 0.07) !important; +} + +html.theme-light #content .hljs-ln tbody tr:hover td, +html.theme-light #content .hljs-ln tbody tr:hover td.col-hover { + background-color: rgba(254, 128, 25, 0.08) !important; +} + +.hljs-ln-numbers { + user-select: none; + text-align: right; + padding-right: 12px !important; + padding-left: 4px; + border-right: 1px solid var(--background-highlight) !important; + color: var(--text-menu); + white-space: nowrap; + vertical-align: top; + font-family: "JetBrains Mono", Consolas, monospace; +} + +.hljs-ln-code { + padding-left: 12px !important; + white-space: pre; + vertical-align: top; +} +/* ---------- Scrollbars (Gruvbox) ---------- */ +::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +::-webkit-scrollbar-track { + background: var(--scrollbar-track); +} + +::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-hover); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); +} + +/* ---------- Code boxes: scrollbars ---------- */ +pre, +pre.code-processed .code-wrap, +.hljs-ln-code { + scrollbar-color: #504945 #1d2021; +} + +pre::-webkit-scrollbar-thumb, +pre.code-processed .code-wrap::-webkit-scrollbar-thumb, +.hljs-ln-code::-webkit-scrollbar-thumb { + background: #504945; +} + +pre::-webkit-scrollbar-thumb:hover, +pre.code-processed .code-wrap::-webkit-scrollbar-thumb:hover, +.hljs-ln-code::-webkit-scrollbar-thumb:hover { + background: #665c54; +} + +pre::-webkit-scrollbar-track, +pre.code-processed .code-wrap::-webkit-scrollbar-track, +.hljs-ln-code::-webkit-scrollbar-track { + background: #1d2021; +} + +html.theme-light pre, +html.theme-light pre.code-processed .code-wrap, +html.theme-light .hljs-ln-code { + scrollbar-color: #bdae93 #ebdbb2; +} + +html.theme-light pre::-webkit-scrollbar-thumb, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-thumb, +html.theme-light .hljs-ln-code::-webkit-scrollbar-thumb { + background: #bdae93; +} + +html.theme-light pre::-webkit-scrollbar-thumb:hover, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-thumb:hover, +html.theme-light .hljs-ln-code::-webkit-scrollbar-thumb:hover { + background: #d5c4a1; +} + +html.theme-light pre::-webkit-scrollbar-track, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-track, +html.theme-light .hljs-ln-code::-webkit-scrollbar-track { + background: #ebdbb2; +} + +/* ---------- Link icons / markers: internal links without arrow, external links keep a marker ---------- */ +#content a::after, +#content a::before, +#content-footer .navigation a::after, +#content-footer .navigation a::before, +a.next::after, +a.previous::before, +.bmc-btn::after, +.bmc-btn::before, +.bmc-powered::after, +.bmc-powered::before { + content: none !important; +} + +#content a[href^="http://"]:not([href^="https://YOUR-INSTANCE.example.com"])::after, +#content a[href^="https://"]:not([href^="https://YOUR-INSTANCE.example.com"])::after { + content: " ↗" !important; + display: inline-block; + margin-left: 3px; + font-size: 0.85em; + color: var(--text-link); +} + +/* inline text links (in paragraphs/lists): colour only */ +#content p a:not([class]), +#content li a:not([class]) { + color: var(--text-link); + text-decoration: none; + background: transparent; + border: 0; + padding: 0; + border-radius: 0; +} + +#content p a:not([class]):hover, +#content li a:not([class]):hover { + color: var(--text-heading); + background: transparent; +} + +/* action links as buttons (subtle tint, noticeable on hover) */ +.blog-pn { + padding: 6px 14px; + border: 1px solid rgba(131, 165, 152, 0.35); + border-radius: 8px; + background: rgba(131, 165, 152, 0.08); + transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease; +} + +html.theme-light .blog-pn { + border-color: rgba(7, 102, 120, 0.35); + background: rgba(7, 102, 120, 0.08); +} + +.blog-pn:hover { + background: rgba(131, 165, 152, 0.18); + border-color: #83a598; +} + +html.theme-light .blog-pn:hover { + background: rgba(7, 102, 120, 0.15); + border-color: #076678; +} + +/* ---------- Mermaid diagrams - Gruvbox, theme-following ---------- */ +/* + * The blog renders inline Mermaid diagrams with the default theme, so the + * generated SVG carries light-blue node fills that clash with Gruvbox. + * Override the SVG element colours here; the selectors hang off + * html.theme-dark / html.theme-light, so the diagrams follow the theme + * toggle automatically without re-rendering. + */ + +.mermaid { + margin: 1.25em auto; + overflow-x: auto; + background: transparent; +} + +.mermaid svg { + max-width: 100%; + height: auto; +} + +/* Text in node labels and titles */ +html.theme-dark .mermaid svg text, +html.theme-dark .mermaid svg tspan, +html.theme-dark .mermaid svg .nodeLabel, +html.theme-dark .mermaid svg .edgeLabel p { + fill: #ebdbb2 !important; + color: #ebdbb2 !important; +} + +html.theme-light .mermaid svg text, +html.theme-light .mermaid svg tspan, +html.theme-light .mermaid svg .nodeLabel, +html.theme-light .mermaid svg .edgeLabel p { + fill: #3c3836 !important; + color: #3c3836 !important; +} + +/* Graph/node title */ +html.theme-dark .mermaid svg .titleText text, +html.theme-dark .mermaid svg .node .label .nodeLabel { + fill: #fbf1c7 !important; + color: #fbf1c7 !important; +} + +html.theme-light .mermaid svg .titleText text, +html.theme-light .mermaid svg .node .label .nodeLabel { + fill: #282828 !important; + color: #282828 !important; +} + +/* Node shapes (rectangles, rounded boxes, ellipses, diamonds) */ +html.theme-dark .mermaid svg .node rect, +html.theme-dark .mermaid svg .node polygon, +html.theme-dark .mermaid svg .node circle, +html.theme-dark .mermaid svg .node ellipse, +html.theme-dark .mermaid svg .node path, +html.theme-dark .mermaid svg .cluster rect { + fill: #3c3836 !important; + stroke: #83a598 !important; +} + +html.theme-light .mermaid svg .node rect, +html.theme-light .mermaid svg .node polygon, +html.theme-light .mermaid svg .node circle, +html.theme-light .mermaid svg .node ellipse, +html.theme-light .mermaid svg .node path, +html.theme-light .mermaid svg .cluster rect { + fill: #ebdbb2 !important; + stroke: #076678 !important; +} + +/* Rounded corners on rectangular node boxes and subgraph clusters (8 px, like the blog cards) */ +html.theme-dark .mermaid svg .node rect, +html.theme-light .mermaid svg .node rect, +html.theme-dark .mermaid svg .cluster rect, +html.theme-light .mermaid svg .cluster rect { + rx: 8px !important; + ry: 8px !important; +} + +/* Edge lines: stroke only (a filled edge path would look like a polygon) */ +html.theme-dark .mermaid svg .edgePaths path { + fill: none !important; + stroke: #a89984 !important; +} + +html.theme-light .mermaid svg .edgePaths path { + fill: none !important; + stroke: #928374 !important; +} + +/* Arrowheads (markers): filled triangles */ +html.theme-dark .mermaid svg marker.flowchart-v2, +html.theme-dark .mermaid svg .arrowMarkerPath { + fill: #a89984 !important; + stroke: #a89984 !important; +} + +html.theme-light .mermaid svg marker.flowchart-v2, +html.theme-light .mermaid svg .arrowMarkerPath { + fill: #928374 !important; + stroke: #928374 !important; +} + +/* Edge labels: HTML text inside a foreignObject (div.labelBkg > span.edgeLabel); + the label panel background lives on the g.edgeLabel element itself */ +html.theme-dark .mermaid svg g.edgeLabel { + background: #282828 !important; + fill: #ebdbb2 !important; + color: #ebdbb2 !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg { + fill: #282828 !important; + background: #282828 !important; + color: #ebdbb2 !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg .edgeLabel { + fill: #ebdbb2 !important; + color: #ebdbb2 !important; + background: #282828 !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg .edgeLabel p { + fill: #ebdbb2 !important; + color: #ebdbb2 !important; + background: #282828 !important; +} + +html.theme-light .mermaid svg g.edgeLabel { + background: #ebdbb2 !important; + fill: #3c3836 !important; + color: #3c3836 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg { + fill: #ebdbb2 !important; + background: #ebdbb2 !important; + color: #3c3836 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg .edgeLabel { + fill: #3c3836 !important; + color: #3c3836 !important; + background: #ebdbb2 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg .edgeLabel p { + fill: #3c3836 !important; + color: #3c3836 !important; + background: #ebdbb2 !important; +} + +/* Subgraph cluster border + label */ +html.theme-dark .mermaid svg .cluster rect { + stroke: #504945 !important; + fill: rgba(40, 40, 40, 0.35) !important; +} + +html.theme-light .mermaid svg .cluster rect { + stroke: #d5c4a1 !important; + fill: rgba(235, 219, 178, 0.40) !important; +} + +html.theme-dark .mermaid svg .cluster .nodeLabel, +html.theme-dark .mermaid svg .cluster-label text { + fill: #a89984 !important; + color: #a89984 !important; +} + +html.theme-light .mermaid svg .cluster .nodeLabel, +html.theme-light .mermaid svg .cluster-label text { + fill: #504945 !important; + color: #504945 !important; +} +/* ---------- G-code / Zusatz-Scopes (name = G/M-Codes, attr = Parameter) ---------- */ +.hljs-name { color: #fabd2f; } +.hljs-attr { color: #83a598; } +html.theme-light .hljs-name { color: #076678; } +html.theme-light .hljs-attr { color: #427b58; } \ No newline at end of file diff --git a/theme/blog_share_theme_harbor.css b/theme/blog_share_theme_harbor.css new file mode 100644 index 0000000..08d4dc3 --- /dev/null +++ b/theme/blog_share_theme_harbor.css @@ -0,0 +1,1886 @@ +/* + * Harbor Share Theme for Richard's Blog (Trilium Public Share) + * Light: Harbor (paper #dfe4c4 / ink #1c2d28, accent #5e81ac) + * Dark: Harbordark (#1b1b1b / #efebdc, accent #e75a50) + * Based on https://github.com/HANCORE-linux/omarchy-harbor-theme (MIT) + */ + +html.theme-light { + --background-primary: #dfe4c4; + --background-secondary: #d0d6b4; + --background-highlight: #c3c9a6; + --background-active: #5e81ac; + --blog-card-bg: #d0d6b4; + --scrollbar-thumb: #c3c9a6; + --scrollbar-hover: #b3ba96; + --scrollbar-track: #d0d6b4; + --text-primary: #1c2d28; + --text-heading: #1c2d28; + --text-menu: #556753; + --text-link: #4c6c94; + --text-menu-active: #dfe4c4; + color-scheme: light; +} + +html.theme-dark { + --background-primary: #1b1b1b; + --background-secondary: #232323; + --background-highlight: #2e2e2e; + --background-active: #e75a50; + --blog-card-bg: #262626; + --scrollbar-thumb: #2e2e2e; + --scrollbar-hover: #3f3f3f; + --scrollbar-track: #1b1b1b; + --text-primary: #efebdc; + --text-heading: #efebdc; + --text-menu: #a99b7a; + --text-link: #e58980; + --text-menu-active: #1b1b1b; + color-scheme: dark; +} + +body { + font-family: "Inter", "Montserrat", "Lucida Grande", "Lucida Sans Unicode", arial, sans-serif; +} + +/* ---------- Header: Logo durch Laptop-Emoji ---------- */ +#header-logo img { + display: none; +} + +#header-logo::before { + content: "💻"; + font-size: 1.5em; + line-height: 1; + margin-right: 8px; + display: inline-block; + vertical-align: middle; +} + +/* ---------- Buy Me a Coffee (original, lokal) ---------- */ +@font-face { + font-family: "Cookie"; + src: url(/api/notes/__COOKIE_FONT_ID__/download) format("woff2"); + font-weight: 400; + font-display: swap; +} + +#bmc-links { + margin-top: auto; + padding: 8px 25px 4px; + background: var(--background-secondary); + display: flex; + flex-direction: column; + gap: 2px; +} + +.bmc-link { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 6px 4px 24px; + border-radius: 6px; + color: var(--text-heading); + text-decoration: none; + font-size: 0.9em; + transition: background-color 150ms ease, color 150ms ease; +} + +.bmc-link:hover { + background: var(--background-highlight); + color: var(--text-heading); + text-decoration: none; +} + +.bmc-link .tn-icon { + color: var(--text-link); +} + +/* ---------- Menu: wie Footer-Links gestalten ---------- */ +#menu a { + color: var(--text-heading); + gap: 8px; + font-size: 0.9em; + padding: 4px 6px; + border-color: transparent; + transition: background-color 150ms ease, color 150ms ease; +} + +#menu a:hover { + background: var(--background-highlight); + color: var(--text-heading); + border-color: transparent; + text-decoration: none; +} + +#menu a.active { + background: var(--background-active); + color: var(--background-secondary); + border-color: transparent; +} + +#menu .tn-icon { + color: var(--text-link); +} + +#bmc-wrap { + padding: 8px 14px 14px; + background: var(--background-secondary); + border-top: 1px solid var(--background-highlight); +} + +.bmc-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + box-sizing: border-box; + padding: 6px 12px 8px; + border-radius: 8px; + background: #fabd2f; + color: #1c2d28; + border: 2px solid #1c2d28; + font-family: "Cookie", "Brush Script MT", cursive; + font-size: 1.4em; + line-height: 1.1; + text-decoration: none; + transition: background-color 150ms ease, transform 150ms ease; +} + +.bmc-btn:hover { + background: #dc8164; + color: #1c2d28; + text-decoration: none; + transform: translateY(-1px); +} + +.bmc-btn .bmc-emoji { + font-size: 1.15em; +} + +.bmc-copyright { + margin-top: 8px; + font-size: 0.75em; + color: var(--text-menu); + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + flex-wrap: wrap; +} + +.bmc-powered { + display: inline-flex; + align-items: center; + gap: 3px; + color: var(--text-menu); + text-decoration: none; + transition: color 150ms ease; +} + +.bmc-powered:hover { + color: var(--text-link); + text-decoration: none; +} + +.powered-logo { + width: 1em; + height: 1em; + display: inline-block; +} + +/* ---------- Reading time ---------- */ +.reading-time { + font-size: 0.8em; + color: var(--text-menu); + margin: -0.9em 0 1.25em; +} + +/* ---------- Blog pagination ---------- */ +.blog-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin: 1.5em 0 0; + padding-top: 1em; + border-top: 1px solid var(--background-highlight); +} + +.blog-pagination .blog-page-num { + font-size: 0.85em; + color: var(--text-menu); +} + +/* ---------- Share footer navigation (built-in prev/next) ausblenden ---------- */ +#content-footer .navigation { + display: none; +} + +/* ---------- Prev/Next ---------- */ +.blog-prevnext { + display: flex; + justify-content: space-between; + gap: 12px; + margin: 1.5em 0 0; + padding-top: 1em; + border-top: 1px solid var(--background-highlight); +} + +.blog-pn { + display: flex; + flex-direction: column; + gap: 2px; + max-width: 45%; + color: var(--text-heading); + text-decoration: none; + transition: color 150ms ease; +} + +.blog-pn.next { + margin-left: auto; + align-items: flex-end; + text-align: right; +} + +.blog-pn-label { + font-size: 0.72em; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-menu); +} + +.blog-pn:hover { + color: var(--text-link); + text-decoration: none; +} + +.blog-pn.empty { + display: none; +} + +/* ---------- Search ---------- */ +.blog-search { + margin: 0.5em 0 1em; +} + +.blog-search-input { + width: 100%; + box-sizing: border-box; + padding: 10px 14px; + border-radius: 8px; + border: 1px solid var(--background-highlight); + background: var(--background-secondary); + color: var(--text-heading); + font-size: 1em; +} + +.blog-search-input:focus { + outline: none; + border-color: var(--text-link); +} + +.blog-search-list { + list-style: none; + padding: 0; + margin: 1em 0 0; +} + +.blog-search-hit { + display: flex; + flex-direction: column; + gap: 2px; + padding: 8px 12px; + border-radius: 8px; + border: 1px solid var(--background-highlight); + background: var(--blog-card-bg); + color: var(--text-heading); + text-decoration: none; + margin-bottom: 8px; + transition: border-color 150ms ease; +} + +.blog-search-hit:hover { + border-color: var(--text-link); + text-decoration: none; +} + +.blog-search-path { + font-size: 0.8em; + color: var(--text-menu); +} + +.blog-search-none { + color: var(--text-menu); +} + +/* ---------- Header-Suche (ersetzt eingebaute) ---------- */ +.search-item { + position: relative; +} + +.blog-search-header-input { + flex: 1; + min-width: 0; + padding: 6px 10px 6px 32px; + border-radius: 6px; + border: 1px solid rgba(119, 131, 138, 0.55); + background: rgba(119, 131, 138, 0.10); + color: var(--text-heading); + font-size: 0.9em; + transition: border-color 150ms ease, box-shadow 150ms ease; +} + +html.theme-light .blog-search-header-input { + border-color: #4c6c94; + background: rgba(76, 108, 148, 0.10); +} + +.blog-search-header-input:focus { + outline: none; + border-color: #77838a; + box-shadow: 0 0 0 2px rgba(119, 131, 138, 0.20); +} + +html.theme-light .blog-search-header-input:focus { + border-color: #4c6c94; + box-shadow: 0 0 0 2px rgba(76, 108, 148, 0.15); +} + +.search-item .search-icon { + color: rgba(119, 131, 138, 0.85); +} + +html.theme-light .search-item .search-icon { + color: #4c6c94; +} + +.tn-image { + width: 18px; + height: 18px; + border-radius: 4px; + flex-shrink: 0; + vertical-align: middle; +} + +.tn-image-svg { + color: var(--text-link); +} + +.title-image { + width: 34px; + height: 34px; + border-radius: 6px; + vertical-align: middle; + margin-right: 10px; +} + +.note-fallback { + margin: 1em 0; + overflow: hidden; +} + +.note-fallback-link { + font-size: 0.9em; +} + +.mermaid-fallback { + margin: 1em 0; +} + +.mermaid-render { + margin: 1em 0; + padding: 14px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow-x: auto; +} + +.mermaid-render svg { + max-width: 100%; + height: auto; +} + +.mermaid-source { + margin: 12px 0 0; + text-align: center; +} + +.mermaid-source summary { + cursor: pointer; + font-size: 0.85em; + color: var(--text-menu); + user-select: none; + padding: 4px 10px; + border: 1px solid var(--background-highlight); + border-radius: 6px; + display: inline-block; + background: var(--background-secondary); +} + +.mermaid-source summary:hover { + color: var(--text-heading); + border-color: var(--text-link); +} + +.mermaid-source pre { + width: min(100%, 820px); + margin: 8px auto 0; + text-align: left; + position: relative; + overflow: hidden; +} + +#content .mermaid-source .hljs-ln { + width: 100%; +} + +/* ---------- Rendered widgets: mind map + excalidraw ---------- */ +.mindmap-render, +.excalidraw-render { + margin: 1em 0; + padding: 14px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow-x: auto; +} + +.mindmap-svg { + display: block; + width: 100%; + height: auto; +} + +.excalidraw-svg { + display: block; + max-width: 100%; + height: auto; +} + +.mindmap-render svg text { + user-select: none; +} + +.blog-search-overlay { + display: none; + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + z-index: 50; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); +} + +.blog-search-overlay.open { + display: block; +} + +.blog-search-overlay-hit { + display: flex; + flex-direction: column; + gap: 1px; + padding: 7px 10px; + color: var(--text-heading); + text-decoration: none; + font-size: 0.85em; + border-bottom: 1px solid var(--background-highlight); +} + +.blog-search-overlay-hit:last-child { + border-bottom: none; +} + +.blog-search-overlay-hit:hover { + background: var(--background-highlight); + text-decoration: none; +} + +.blog-search-overlay-hit .s { + font-size: 0.75em; + color: var(--text-menu); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.blog-search-overlay .blog-search-none { + padding: 8px 10px; + font-size: 0.85em; +} + +#main { + max-width: min(92vw, 1200px); +} + +#site-header { + padding-bottom: 10px; +} + +#title { + font-family: "JetBrains Mono", "Montserrat", monospace; + letter-spacing: -0.02em; +} + +body.is-garden #title { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +body.is-garden #title .note-state { + margin-left: auto; + flex-shrink: 0; +} + +body.is-garden #content h1#title { + background-color: rgba(169, 155, 122, 0.30) !important; + border-bottom-color: rgba(169, 155, 122, 0.60) !important; +} + +html.theme-light body.is-garden #content h1#title { + background-color: rgba(85, 103, 83, 0.15) !important; + border-bottom-color: rgba(85, 103, 83, 0.40) !important; +} + +/* ---------- Blog index (generated article list) ---------- */ +.blog-post { + padding: 1.2em 1.4em; + margin-bottom: 1.25em; + border: 1px solid var(--background-highlight); + border-radius: 10px; + background: var(--blog-card-bg); + transition: border-color 150ms ease, box-shadow 150ms ease; + cursor: pointer; +} + +.blog-post:last-child { + margin-bottom: 0; +} + +.blog-post:hover { + border-color: var(--text-link); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18); +} + +#content .blog-post:first-of-type { + margin-top: 1.5em; +} + +/* ---------- Blog post thumbnails (Bild links, Teaser rechts) ---------- */ +.blog-post-inner { + display: flex; + gap: 16px; + align-items: stretch; +} + +.blog-thumb-link { + flex: 0 0 auto; + width: min(256px, 35%); + text-decoration: none; +} + +.blog-thumb { + display: block; + width: 100%; + height: 100%; + max-height: 256px; + object-fit: cover; + border-radius: 8px; + border: 1px solid var(--background-highlight); +} + +.blog-post-body { + flex: 1; + min-width: 0; +} + +.blog-post-title { + margin: 0 0 0.25em; +} + +.blog-post-title a { + color: var(--text-heading); + text-decoration: none; + transition: color 150ms ease; +} + +.blog-post-title a:hover { + color: var(--text-link); + text-decoration: none; +} + +.blog-post-meta { + display: flex; + gap: 12px; + font-size: 0.85em; + color: var(--text-menu); + margin-bottom: 0.5em; +} + +.blog-post-date { + font-variant-numeric: tabular-nums; + opacity: 0.85; +} + +.blog-post-category { + background: var(--background-highlight); + border-radius: 8px; + padding: 1px 10px; + color: var(--text-heading); + font-weight: 600; +} + +.blog-post-summary { + margin: 0 0 0.5em; + color: var(--text-primary); +} + +.blog-post-tags { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.tag { + font-size: 0.78em; + color: var(--text-link); + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + padding: 1px 8px; +} + +a.tag { + text-decoration: none; + transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease; +} + +a.tag:hover { + background: var(--background-highlight); + border-color: var(--text-link); + color: var(--text-heading); + text-decoration: none; +} + +/* ---------- Article meta (date/category on individual pages) ---------- */ +.article-meta { + display: flex; + gap: 12px; + font-size: 0.9em; + color: var(--text-menu); + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--background-highlight); +} + +/* ---------- Headings (h2-h6) - Harbor header boxes ---------- */ +html.theme-dark { + --header-h2-bg: rgba(231, 90, 80, 0.30); + --header-h2-border: rgba(231, 90, 80, 0.6); + --header-h3-bg: rgba(169, 155, 122, 0.25); + --header-h3-border: rgba(169, 155, 122, 0.6); + --header-h4-bg: rgba(225, 206, 152, 0.22); + --header-h4-border: rgba(225, 206, 152, 0.55); + --header-h5-bg: rgba(119, 131, 138, 0.25); + --header-h5-border: rgba(119, 131, 138, 0.6); + --header-h6-bg: rgba(229, 137, 128, 0.25); + --header-h6-border: rgba(229, 137, 128, 0.6); + --header-h1-bg: rgba(244, 67, 54, 0.30); + --header-h1-border: rgba(244, 67, 54, 0.6); +} + +html.theme-light { + --header-h2-bg: rgba(94, 129, 172, 0.18); + --header-h2-border: rgba(94, 129, 172, 0.45); + --header-h3-bg: rgba(85, 103, 83, 0.14); + --header-h3-border: rgba(85, 103, 83, 0.38); + --header-h4-bg: rgba(220, 129, 100, 0.14); + --header-h4-border: rgba(220, 129, 100, 0.38); + --header-h5-bg: rgba(138, 91, 129, 0.12); + --header-h5-border: rgba(138, 91, 129, 0.35); + --header-h6-bg: rgba(61, 114, 125, 0.12); + --header-h6-border: rgba(61, 114, 125, 0.35); + --header-h1-bg: rgba(177, 71, 82, 0.14); + --header-h1-border: rgba(177, 71, 82, 0.40); +} + +#content h1 { + background-color: var(--header-h1-bg); + border-bottom: 2px solid var(--header-h1-border); + border-radius: 4px; + padding: 0.3em 0.4em; + font-size: 1.6em; + font-weight: 700; + margin-top: 1.5em; + margin-bottom: 1.25em; +} + +#content h2 { + background-color: var(--header-h2-bg); + border-bottom: 2px solid var(--header-h2-border); + border-radius: 4px; + padding: 0.25em 0.4em; +} + +#content h3 { + background-color: var(--header-h3-bg); + border-bottom: 2px solid var(--header-h3-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h4 { + background-color: var(--header-h4-bg); + border-bottom: 2px solid var(--header-h4-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h5 { + background-color: var(--header-h5-bg); + border-bottom: 2px solid var(--header-h5-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#content h6 { + background-color: var(--header-h6-bg); + border-bottom: 2px solid var(--header-h6-border); + border-radius: 4px; + padding: 0.2em 0.35em; +} + +#childLinks { + display: none; +} + +#index { + display: none; +} + +/* ---------- Code blocks - Harbordark (always, also in light mode) ---------- */ +.ck-content pre, +#content pre { + background-color: #222222; + color: #efebdc; + border: 1px solid #2e2e2e; + border-radius: 8px; +} + +.ck-content code, +#content code { + background-color: #2a2a2a; + color: #efebdc; + border-color: #3f3f3f; + border-radius: 8px; + padding: 0.1em 0.35em; +} + +html.theme-light .ck-content pre, +html.theme-light #content pre { + background-color: #e8ecd0; + color: #1c2d28; + border-color: #c3c9a6; +} + +html.theme-light .ck-content code, +html.theme-light #content code { + background-color: #cdd3b0; + color: #1c2d28; + border-color: #b3ba96; +} + +/* ---------- Eingebettete Bilder: Radius wie Code-Blöcke (8px) ---------- */ +#content figure.image { + margin: 1.25em auto; +} + +#content figure img, +#content img:not(.blog-thumb) { + border-radius: 8px; +} + +/* ---------- 3D model viewer (STL / STEP) ---------- */ +.model-viewer { + position: relative; + box-sizing: border-box; + width: calc(100vw - 24px); + margin: 1em 0; + margin-left: calc(50% - (100vw - 24px) / 2); + background: #1b1b1b; + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; +} + +.model-viewer.model-viewer-inline { + width: 100%; + margin-left: 0; +} + +.model-viewer-data { + position: absolute; + top: 8px; + right: 10px; + z-index: 3; + display: none; + font-size: 0.75em; + color: #a99b7a; + background: rgba(27, 27, 27, 0.85); + border: 1px solid #2e2e2e; + border-radius: 6px; + padding: 2px 10px; + font-variant-numeric: tabular-nums; + pointer-events: none; +} + +.model-viewer-canvas { + position: relative; + width: 100%; + height: min(70vh, 900px); + min-height: 420px; +} + +.model-viewer-status { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + padding: 48px; + box-sizing: border-box; + color: #a99b7a; + font-size: 0.9em; +} + +.model-viewer-status.error { + color: #F44336; +} + +.model-viewer-progress { + position: absolute; + left: 0; + right: 0; + bottom: 40px; + height: 6px; + width: min(60%, 480px); + margin: 0 auto; + background: #2a2a2a; + border-radius: 3px; + overflow: hidden; +} + +.model-viewer-progress-fill { + height: 100%; + width: 0; + background: #E1CE98; + border-radius: 3px; + transition: width 150ms ease; +} + +.model-viewer-progress-fill.indeterminate { + width: 40%; + animation: model-progress 1.1s ease-in-out infinite; +} + +@keyframes model-progress { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(250%); } +} + +.model-viewer-hint { + position: absolute; + top: 8px; + left: 10px; + font-size: 0.75em; + color: #a99b7a; + z-index: 2; + pointer-events: none; +} + +.model-viewer-caption { + font-size: 0.85em; + font-style: italic; + color: var(--text-menu); + text-align: center; + padding: 4px 12px; + background: var(--background-secondary); + border-top: 1px solid var(--background-highlight); +} + +.model-viewer canvas { + display: block; + width: 100%; + height: 100%; +} + +/* ---------- 3D-Viewer: theme-bewusste Overlays ---------- */ +html.theme-light .model-viewer { + background: #e8ecd0; +} +html.theme-light .model-viewer-status, +html.theme-light .model-viewer-hint, +html.theme-light .model-viewer-data { + color: #1c2d28; +} +html.theme-light .model-viewer-data { + background: rgba(223, 228, 196, 0.85); + border-color: #c3c9a6; +} +html.theme-light .model-viewer-status.error { + color: #b14752; +} +html.theme-light .model-viewer-progress { + background: #c3c9a6; +} +html.theme-light .model-viewer-progress-fill { + background: #5e81ac; +} + +/* ---------- Bildunterschriften (Harbor) ---------- */ +#content figcaption { + font-size: 0.85em; + font-style: italic; + color: var(--text-menu); + text-align: center; + margin-top: 8px; + padding: 4px 12px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + display: inline-block; +} + +.hljs { + background: #222222; + color: #efebdc; +} + +.hljs-comment, +.hljs-quote { + color: #817f68; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #F44336; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #e58980; +} + +.hljs-string, +.hljs-doctag { + color: #a99b7a; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #E1CE98; +} + +.hljs-type, +.hljs-class .hljs-title, +.hljs-attribute { + color: #77838a; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-deletion, +.hljs-addition { + color: #e58980; +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #77838a; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} +/* ---------- Light mode: Harbor light highlighter ---------- */ +html.theme-light .hljs, +html.theme-light pre code.hljs { + background: #e8ecd0 !important; + color: #1c2d28; +} + +html.theme-light .hljs-comment, +html.theme-light .hljs-quote { + color: #7d8794; +} + +html.theme-light .hljs-keyword, +html.theme-light .hljs-selector-tag, +html.theme-light .hljs-subst { + color: #b14752; +} + +html.theme-light .hljs-number, +html.theme-light .hljs-literal, +html.theme-light .hljs-variable, +html.theme-light .hljs-template-variable, +html.theme-light .hljs-tag .hljs-attr { + color: #8a5b81; +} + +html.theme-light .hljs-string, +html.theme-light .hljs-doctag { + color: #556753; +} + +html.theme-light .hljs-title, +html.theme-light .hljs-section, +html.theme-light .hljs-selector-id { + color: #dc8164; +} + +html.theme-light .hljs-type, +html.theme-light .hljs-class .hljs-title, +html.theme-light .hljs-attribute { + color: #4c6c94; +} + +html.theme-light .hljs-symbol, +html.theme-light .hljs-bullet, +html.theme-light .hljs-link, +html.theme-light .hljs-meta, +html.theme-light .hljs-deletion, +html.theme-light .hljs-addition { + color: #8a5b81; +} + +html.theme-light .hljs-built_in, +html.theme-light .hljs-builtin-name, +html.theme-light .hljs-params { + color: #3d727d; +} + +html.theme-light .hljs-regexp, +html.theme-light .hljs-operator, +html.theme-light .hljs-selector-attr, +html.theme-light .hljs-selector-pseudo, +html.theme-light .hljs-selector-class, +html.theme-light .hljs-template-tag { + color: #8a5b81; +} + +html.theme-light .hljs-name, +html.theme-light .hljs-tag { + color: #4c6c94; +} + +html.theme-light .hljs-meta .hljs-string { + color: #556753; +} +/* ---------- Admonitions (Trilium-style, gefüllt) ---------- */ +.admonition { + --accent-color: var(--background-highlight); + --admonition-bg: var(--background-secondary); + border: 1px solid var(--accent-color); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + background: var(--admonition-bg); + border-radius: 0.5em; + padding: 1em; + padding-inline-start: 2.5em; + margin: 1.25em 0; + position: relative; + overflow: hidden; +} + +html.theme-dark .admonition.note { --admonition-bg: rgba(76, 108, 148, 0.16); } +html.theme-dark .admonition.tip { --admonition-bg: rgba(85, 103, 83, 0.16); } +html.theme-dark .admonition.important { --admonition-bg: rgba(138, 91, 129, 0.18); } +html.theme-dark .admonition.caution { --admonition-bg: rgba(177, 71, 82, 0.16); } +html.theme-dark .admonition.warning { --admonition-bg: rgba(220, 129, 100, 0.16); } +html.theme-dark .admonition { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); } + +html.theme-light .admonition.note { --admonition-bg: rgba(76, 108, 148, 0.18); } +html.theme-light .admonition.tip { --admonition-bg: rgba(85, 103, 83, 0.16); } +html.theme-light .admonition.important { --admonition-bg: rgba(138, 91, 129, 0.16); } +html.theme-light .admonition.caution { --admonition-bg: rgba(177, 71, 82, 0.16); } +html.theme-light .admonition.warning { --admonition-bg: rgba(220, 129, 100, 0.20); } + +.admonition p:last-child { + margin-bottom: 0; +} + +.admonition p, +.admonition h2 { + margin-top: 0; +} + +.admonition.note { --accent-color: #4c6c94; } +.admonition.tip { --accent-color: #556753; } +.admonition.important { --accent-color: #8a5b81; } +.admonition.caution { --accent-color: #b14752; } +.admonition.warning { --accent-color: #dc8164; } + +.admonition::before { + color: var(--accent-color); + font-family: boxicons !important; + position: absolute; + top: 1em; + inset-inline-start: 1em; +} + +.admonition.note::before { content: "\eb21"; } +.admonition.tip::before { content: "\ea0d"; } +.admonition.important::before { content: "\ea7c"; } +.admonition.caution::before { content: "\eac7"; } +.admonition.warning::before { content: "\eac5"; } +/* ---------- Tables (Harbor, theme-aware) ---------- */ +html.theme-dark { + --table-header-bg: rgba(231, 90, 80, 0.20); + --table-header-text: #efebdc; + --table-header-border: rgba(231, 90, 80, 0.45); + --table-stripe: rgba(255, 255, 255, 0.04); + --table-hover: rgba(231, 90, 80, 0.12); + --table-rowlabel-bg: rgba(255, 255, 255, 0.05); + --table-rowlabel-text: #efebdc; +} + +html.theme-light { + --table-header-bg: rgba(94, 129, 172, 0.16); + --table-header-text: #1c2d28; + --table-header-border: rgba(94, 129, 172, 0.40); + --table-stripe: rgba(0, 0, 0, 0.04); + --table-hover: rgba(94, 129, 172, 0.12); + --table-rowlabel-bg: rgba(0, 0, 0, 0.05); + --table-rowlabel-text: #1c2d28; +} + +.ck-content table, +#content table { + border-collapse: separate; + border-spacing: 0; + border: 1px solid var(--background-highlight); + border-radius: 8px; + overflow: hidden; + margin: 1em 0; +} + +.ck-content table th, +.ck-content table td, +#content table th, +#content table td { + border: none; + border-bottom: 1px solid var(--background-highlight); + border-right: 1px solid var(--background-highlight); + padding: 8px 12px; + text-align: left; + background-color: transparent !important; +} + +.ck-content table th:last-child, +.ck-content table td:last-child, +#content table th:last-child, +#content table td:last-child { + border-right: none; +} + +.ck-content table tr:last-child td, +#content table tr:last-child td { + border-bottom: none; +} + +.ck-content table thead th, +#content table thead th { + background-color: var(--table-header-bg) !important; + color: var(--table-header-text); + font-weight: 700; + border-bottom: 2px solid var(--table-header-border); +} + +.ck-content table tbody td:first-child, +#content table tbody td:first-child { + background-color: var(--table-rowlabel-bg) !important; + color: var(--table-rowlabel-text); + font-weight: 600; + white-space: nowrap; +} + +.ck-content table tbody tr:nth-child(even) td:not(:first-child), +#content table tbody tr:nth-child(even) td:not(:first-child) { + background-color: var(--table-stripe) !important; +} + +.ck-content table tbody tr:hover td, +#content table tbody tr:hover td { + background-color: rgba(94, 129, 172, 0.10) !important; +} + +.ck-content table .col-hover, +#content table .col-hover { + background-color: rgba(94, 129, 172, 0.10) !important; +} + +.ck-content table tbody tr:hover td.col-hover, +.ck-content table thead th.col-hover, +#content table tbody tr:hover td.col-hover, +#content table thead th.col-hover { + background-color: rgba(94, 129, 172, 0.18) !important; +} +/* ---------- Category subcategories ---------- */ +.blog-subcategories { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin: 0 0 1.25em; +} + +.blog-subcategory { + display: inline-flex; + align-items: center; + gap: 6px; + background: var(--background-secondary); + border: 1px solid var(--background-highlight); + border-radius: 8px; + padding: 4px 12px; + color: var(--text-heading); + text-decoration: none; + font-weight: 600; + transition: background-color 150ms ease, border-color 150ms ease; +} + +.blog-subcategory i { + color: var(--text-link); +} + +.blog-subcategory:hover { + background: var(--background-highlight); + border-color: var(--text-link); + color: var(--text-heading); + text-decoration: none; +} +/* ---------- Digital Garden note table ---------- */ +.blog-garden-table { + width: 100%; +} + +.blog-garden-table tbody td:first-child { + background: transparent !important; + font-weight: normal; +} + +.note-type { + display: inline-block; + font-size: 0.8em; + padding: 2px 10px; + border-radius: 8px; + background: var(--background-highlight); + color: var(--text-heading); + font-weight: 600; + text-transform: capitalize; + white-space: nowrap; +} +/* ---------- Digital Garden rows: clickable + sage hover ---------- */ +.blog-garden-table tbody tr { + cursor: pointer; +} + +#content .blog-garden-table tbody tr:hover td, +#content .blog-garden-table .col-hover { + background-color: rgba(169, 155, 122, 0.15) !important; +} + +#content .blog-garden-table tbody tr:hover td.col-hover { + background-color: rgba(169, 155, 122, 0.25) !important; +} +.note-state { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 0.8em; + padding: 2px 10px; + border-radius: 8px; + background: rgba(169, 155, 122, 0.20); + color: var(--text-heading); + font-weight: 600; + white-space: nowrap; +} + +.note-state i { + color: #a99b7a; +} + +.note-state.state-draft { + background: rgba(109, 109, 109, 0.22); +} + +.note-state.state-draft i { + color: #6d6d6d; +} + +.note-state.state-review { + background: rgba(119, 131, 138, 0.25); +} + +.note-state.state-review i { + color: #77838a; +} + +.note-state.state-unknown { + background: rgba(244, 67, 54, 0.18); +} + +.note-state.state-unknown i { + color: #F44336; +} + +/* ---------- Peppige Garden-Badges (dark) ---------- */ +html.theme-dark .note-state { + background: rgba(169, 155, 122, 0.40); + border: 1px solid #a99b7a; + color: #1b1b1b; +} +html.theme-dark .note-state i { + color: #1b1b1b; +} +html.theme-dark .note-state.state-draft { + background: rgba(244, 67, 54, 0.85); + border-color: #ff8a7f; + color: #1b1b1b; +} +html.theme-dark .note-state.state-draft i { + color: #1b1b1b; +} +html.theme-dark .note-state.state-review { + background: rgba(76, 108, 148, 0.85); + border-color: #8fb4e0; + color: #1b1b1b; +} +html.theme-dark .note-state.state-review i { + color: #1b1b1b; +} +html.theme-dark .note-state.state-unknown { + background: rgba(225, 206, 152, 0.85); + border-color: #f2e4b8; + color: #1b1b1b; +} +html.theme-dark .note-state.state-unknown i { + color: #1b1b1b; +} + +/* ---------- Peppige Garden-Badges (light) ---------- */ +html.theme-light .note-state { + background: rgba(85, 103, 83, 0.85); + border: 1px solid #556753; + color: #dfe4c4; +} +html.theme-light .note-state i { + color: #dfe4c4; +} +html.theme-light .note-state.state-draft { + background: rgba(220, 129, 100, 0.95); + border-color: #b85f3f; + color: #1c2d28; +} +html.theme-light .note-state.state-draft i { + color: #1c2d28; +} +html.theme-light .note-state.state-review { + background: rgba(94, 129, 172, 0.95); + border-color: #3d5f8a; + color: #dfe4c4; +} +html.theme-light .note-state.state-review i { + color: #dfe4c4; +} +html.theme-light .note-state.state-unknown { + background: rgba(177, 71, 82, 0.95); + border-color: #8f3a40; + color: #dfe4c4; +} +html.theme-light .note-state.state-unknown i { + color: #dfe4c4; +} +/* ---------- Code notes: always Harbordark like code boxes ---------- */ +#content.type-code pre { + background-color: #222222 !important; + color: #efebdc; + border: 1px solid #2e2e2e; + border-radius: 8px; + padding: 1em; + margin: 1em 0; +} + +#content.type-code code { + background-color: transparent !important; + color: #efebdc; + border: 0; +} + +html.theme-light #content.type-code pre { + background-color: #e8ecd0 !important; + color: #1c2d28; + border-color: #c3c9a6; +} + +html.theme-light #content.type-code code { + color: #1c2d28; +} +/* ---------- Code: line numbers + copy button ---------- */ +pre.code-processed { + position: relative; + display: flex; + align-items: flex-start; + line-height: 1.6; +} + +pre.code-processed .code-wrap { + flex: 1; + min-width: 0; + overflow-x: auto; + border-radius: 8px; +} + +pre.code-processed .code-wrap code { + display: block; + line-height: inherit; + padding: 0; + margin: 0; +} + +pre.code-processed .code-lines { + flex-shrink: 0; + user-select: none; + text-align: right; + padding: 0 12px 0 0; + margin: 0 12px 0 0; + border-right: 1px solid var(--background-highlight); + color: var(--text-menu); + white-space: pre; + font-family: "JetBrains Mono", Consolas, monospace; + font-size: 1em; + line-height: inherit; +} + +pre.code-processed .code-copy-btn, +.mermaid-source pre .code-copy-btn { + position: absolute; + top: 6px; + right: 6px; + z-index: 2; + font-size: 0.75em; + padding: 2px 10px; + border-radius: 6px; + border: 1px solid var(--background-highlight); + background: var(--background-secondary); + color: var(--text-heading); + cursor: pointer; + opacity: 0.6; + transition: opacity 150ms ease; +} + +pre.code-processed:hover .code-copy-btn, +.mermaid-source pre:hover .code-copy-btn { + opacity: 1; +} + +pre.code-processed .code-copy-btn:hover, +.mermaid-source pre .code-copy-btn:hover { + border-color: var(--text-link); + opacity: 1; +} +/* ---------- highlight.js line numbers ---------- */ +#content .hljs-ln { + border-collapse: collapse; + border: none !important; + box-shadow: none; + border-radius: 8px; + margin: 0; + width: auto; + line-height: 1.4; +} + +#content .hljs-ln td, +#content .hljs-ln th { + border: none !important; + background-color: transparent !important; + padding: 0; +} + +#content .hljs-ln tbody td:first-child, +#content .hljs-ln thead th:first-child { + background-color: transparent !important; +} + +#content .hljs-ln tbody tr:nth-child(even) td { + background-color: transparent !important; +} + +#content .hljs-ln .col-hover { + background-color: transparent !important; +} + +#content .hljs-ln tbody tr:hover td, +#content .hljs-ln tbody tr:hover td.col-hover { + background-color: rgba(94, 129, 172, 0.08) !important; +} + +html.theme-light #content .hljs-ln tbody tr:hover td, +html.theme-light #content .hljs-ln tbody tr:hover td.col-hover { + background-color: rgba(94, 129, 172, 0.08) !important; +} + +.hljs-ln-numbers { + user-select: none; + text-align: right; + padding-right: 12px !important; + padding-left: 4px; + border-right: 1px solid var(--background-highlight) !important; + color: var(--text-menu); + white-space: nowrap; + vertical-align: top; + font-family: "JetBrains Mono", Consolas, monospace; +} + +.hljs-ln-code { + padding-left: 12px !important; + white-space: pre; + vertical-align: top; +} +/* ---------- Scrollbars (Harbor) ---------- */ +::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +::-webkit-scrollbar-track { + background: var(--scrollbar-track); +} + +::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-hover); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); +} + +/* ---------- Code boxes: scrollbars ---------- */ +pre, +pre.code-processed .code-wrap, +.hljs-ln-code { + scrollbar-color: #2e2e2e #1b1b1b; +} + +pre::-webkit-scrollbar-thumb, +pre.code-processed .code-wrap::-webkit-scrollbar-thumb, +.hljs-ln-code::-webkit-scrollbar-thumb { + background: #2e2e2e; +} + +pre::-webkit-scrollbar-thumb:hover, +pre.code-processed .code-wrap::-webkit-scrollbar-thumb:hover, +.hljs-ln-code::-webkit-scrollbar-thumb:hover { + background: #3f3f3f; +} + +pre::-webkit-scrollbar-track, +pre.code-processed .code-wrap::-webkit-scrollbar-track, +.hljs-ln-code::-webkit-scrollbar-track { + background: #1b1b1b; +} + +html.theme-light pre, +html.theme-light pre.code-processed .code-wrap, +html.theme-light .hljs-ln-code { + scrollbar-color: #b3ba96 #d0d6b4; +} + +html.theme-light pre::-webkit-scrollbar-thumb, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-thumb, +html.theme-light .hljs-ln-code::-webkit-scrollbar-thumb { + background: #b3ba96; +} + +html.theme-light pre::-webkit-scrollbar-thumb:hover, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-thumb:hover, +html.theme-light .hljs-ln-code::-webkit-scrollbar-thumb:hover { + background: #c3c9a6; +} + +html.theme-light pre::-webkit-scrollbar-track, +html.theme-light pre.code-processed .code-wrap::-webkit-scrollbar-track, +html.theme-light .hljs-ln-code::-webkit-scrollbar-track { + background: #d0d6b4; +} + +/* ---------- Link icons / markers: internal links without arrow, external links keep a marker ---------- */ +#content a::after, +#content a::before, +#content-footer .navigation a::after, +#content-footer .navigation a::before, +a.next::after, +a.previous::before, +.bmc-btn::after, +.bmc-btn::before, +.bmc-powered::after, +.bmc-powered::before { + content: none !important; +} + +#content a[href^="http://"]:not([href^="https://YOUR-INSTANCE.example.com"])::after, +#content a[href^="https://"]:not([href^="https://YOUR-INSTANCE.example.com"])::after { + content: " ↗" !important; + display: inline-block; + margin-left: 3px; + font-size: 0.85em; + color: var(--text-link); +} + +/* inline text links (in paragraphs/lists): colour only */ +#content p a:not([class]), +#content li a:not([class]) { + color: var(--text-link); + text-decoration: none; + background: transparent; + border: 0; + padding: 0; + border-radius: 0; +} + +#content p a:not([class]):hover, +#content li a:not([class]):hover { + color: var(--text-heading); + background: transparent; +} + +/* action links as buttons (subtle tint, noticeable on hover) */ +.blog-pn { + padding: 6px 14px; + border: 1px solid rgba(231, 90, 80, 0.30); + border-radius: 8px; + background: rgba(231, 90, 80, 0.08); + transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease; +} + +html.theme-light .blog-pn { + border-color: rgba(76, 108, 148, 0.30); + background: rgba(76, 108, 148, 0.08); +} + +.blog-pn:hover { + background: rgba(231, 90, 80, 0.18); + border-color: #e75a50; +} + +html.theme-light .blog-pn:hover { + background: rgba(76, 108, 148, 0.15); + border-color: #4c6c94; +} + +/* ---------- Mermaid diagrams - Harbor, theme-following ---------- */ +/* + * The blog renders inline Mermaid diagrams with the default theme, so the + * generated SVG carries light-blue node fills that clash with Harbor. + * Override the SVG element colours here; the selectors hang off + * html.theme-dark / html.theme-light, so the diagrams follow the theme + * toggle automatically without re-rendering. + */ + +.mermaid { + margin: 1.25em auto; + overflow-x: auto; + background: transparent; +} + +.mermaid svg { + max-width: 100%; + height: auto; +} + +/* Text in node labels and titles */ +html.theme-dark .mermaid svg text, +html.theme-dark .mermaid svg tspan, +html.theme-dark .mermaid svg .nodeLabel, +html.theme-dark .mermaid svg .edgeLabel p { + fill: #efebdc !important; + color: #efebdc !important; +} + +html.theme-light .mermaid svg text, +html.theme-light .mermaid svg tspan, +html.theme-light .mermaid svg .nodeLabel, +html.theme-light .mermaid svg .edgeLabel p { + fill: #1c2d28 !important; + color: #1c2d28 !important; +} + +/* Graph/node title */ +html.theme-dark .mermaid svg .titleText text, +html.theme-dark .mermaid svg .node .label .nodeLabel { + fill: #efebdc !important; + color: #efebdc !important; +} + +html.theme-light .mermaid svg .titleText text, +html.theme-light .mermaid svg .node .label .nodeLabel { + fill: #1c2d28 !important; + color: #1c2d28 !important; +} + +/* Node shapes (rectangles, rounded boxes, ellipses, diamonds) */ +html.theme-dark .mermaid svg .node rect, +html.theme-dark .mermaid svg .node polygon, +html.theme-dark .mermaid svg .node circle, +html.theme-dark .mermaid svg .node ellipse, +html.theme-dark .mermaid svg .node path, +html.theme-dark .mermaid svg .cluster rect { + fill: #232323 !important; + stroke: #77838a !important; +} + +html.theme-light .mermaid svg .node rect, +html.theme-light .mermaid svg .node polygon, +html.theme-light .mermaid svg .node circle, +html.theme-light .mermaid svg .node ellipse, +html.theme-light .mermaid svg .node path, +html.theme-light .mermaid svg .cluster rect { + fill: #d0d6b4 !important; + stroke: #4c6c94 !important; +} + +/* Rounded corners on rectangular node boxes and subgraph clusters (8 px, like the blog cards) */ +html.theme-dark .mermaid svg .node rect, +html.theme-light .mermaid svg .node rect, +html.theme-dark .mermaid svg .cluster rect, +html.theme-light .mermaid svg .cluster rect { + rx: 8px !important; + ry: 8px !important; +} + +/* Edge lines: stroke only (a filled edge path would look like a polygon) */ +html.theme-dark .mermaid svg .edgePaths path { + fill: none !important; + stroke: #a99b7a !important; +} + +html.theme-light .mermaid svg .edgePaths path { + fill: none !important; + stroke: #7d8794 !important; +} + +/* Arrowheads (markers): filled triangles */ +html.theme-dark .mermaid svg marker.flowchart-v2, +html.theme-dark .mermaid svg .arrowMarkerPath { + fill: #a99b7a !important; + stroke: #a99b7a !important; +} + +html.theme-light .mermaid svg marker.flowchart-v2, +html.theme-light .mermaid svg .arrowMarkerPath { + fill: #7d8794 !important; + stroke: #7d8794 !important; +} + +/* Edge labels: HTML text inside a foreignObject (div.labelBkg > span.edgeLabel); + the label panel background lives on the g.edgeLabel element itself */ +html.theme-dark .mermaid svg g.edgeLabel { + background: #1b1b1b !important; + fill: #efebdc !important; + color: #efebdc !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg { + fill: #1b1b1b !important; + background: #1b1b1b !important; + color: #efebdc !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg .edgeLabel { + fill: #efebdc !important; + color: #efebdc !important; + background: #1b1b1b !important; +} + +html.theme-dark .mermaid svg .edgeLabel .labelBkg .edgeLabel p { + fill: #efebdc !important; + color: #efebdc !important; + background: #1b1b1b !important; +} + +html.theme-light .mermaid svg g.edgeLabel { + background: #d0d6b4 !important; + fill: #1c2d28 !important; + color: #1c2d28 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg { + fill: #d0d6b4 !important; + background: #d0d6b4 !important; + color: #1c2d28 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg .edgeLabel { + fill: #1c2d28 !important; + color: #1c2d28 !important; + background: #d0d6b4 !important; +} + +html.theme-light .mermaid svg .edgeLabel .labelBkg .edgeLabel p { + fill: #1c2d28 !important; + color: #1c2d28 !important; + background: #d0d6b4 !important; +} + +/* Subgraph cluster border + label */ +html.theme-dark .mermaid svg .cluster rect { + stroke: #2e2e2e !important; + fill: rgba(27, 27, 27, 0.35) !important; +} + +html.theme-light .mermaid svg .cluster rect { + stroke: #c3c9a6 !important; + fill: rgba(208, 214, 180, 0.40) !important; +} + +html.theme-dark .mermaid svg .cluster .nodeLabel, +html.theme-dark .mermaid svg .cluster-label text { + fill: #a99b7a !important; + color: #a99b7a !important; +} + +html.theme-light .mermaid svg .cluster .nodeLabel, +html.theme-light .mermaid svg .cluster-label text { + fill: #556753 !important; + color: #556753 !important; +} +/* ---------- G-code / Zusatz-Scopes (name = G/M-Codes, attr = Parameter) ---------- */ +.hljs-name { color: #E1CE98; } +.hljs-attr { color: #77838a; } +html.theme-light .hljs-name { color: #4c6c94; } +html.theme-light .hljs-attr { color: #556753; } \ No newline at end of file