diff --git a/README.md b/README.md index a69e27a..028d2e4 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# Trilium Share – Gruvbox Blog System +# Trilium Share – Harbor Blog System [![License](https://img.shields.io/badge/License-GPL--3.0-fb4934)](LICENSE) [![Live demo](https://img.shields.io/badge/Live%20demo-richard.familie--zink.org-8ec07c)](https://richard.familie-zink.org) [![TriliumNext](https://img.shields.io/badge/TriliumNext-Public%20Share-83a598)](https://github.com/TriliumNext/Trilium) -[![Theme](https://img.shields.io/badge/Theme-Gruvbox-98971a)](https://github.com/morhetz/gruvbox) +[![Theme](https://img.shields.io/badge/Theme-Harbor-e75a50)](https://github.com/HANCORE-linux/omarchy-harbor-theme) [![Built with](https://img.shields.io/badge/Built%20with-Opencode-fe8019)](https://opencode.ai) [![Model](https://img.shields.io/badge/Model-Deepseek%20V4%20Flash-d3869b)](https://www.deepseek.com/) > **Note:** This theme and blog system was created with the help of > [**Opencode**](https://opencode.ai) and **Deepseek V4 Flash**. -A complete **public-share blog system + Gruvbox theme** for [TriliumNext](https://github.com/TriliumNext/Trilium). +A complete **public-share blog system + Harbor theme** for [TriliumNext](https://github.com/TriliumNext/Trilium). It turns a normal Trilium note tree into a themed, searchable blog with categories, an RSS feed, a sitemap, a digital garden (growth states) and client-side rendering of Mermaid, Excalidraw and mind-map notes. @@ -18,13 +18,13 @@ 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/`). -![Gruvbox palette](assets/palette.png) +![Harbor palette](assets/palette.png) -*Palette from the [morhetz/gruvbox](https://github.com/morhetz/gruvbox) repository.* +*Palette from the [HANCORE-linux/omarchy-harbor-theme](https://github.com/HANCORE-linux/omarchy-harbor-theme) (Harbor light / Harbordark) repository, MIT licensed.* ## Features -- Gruvbox light/dark theme for the share, with a theme toggle in the header. +- Harbor light/dark theme for the share, with a theme toggle in the header. - 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 +66,7 @@ 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 Gruvbox share theme | code, `text/css` | +| `theme/blog_share_theme.css` | the Harbor share theme (Harbor light / Harbordark) | 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` | @@ -297,7 +297,7 @@ server { ## Customisation -- **Theme**: edit `theme/blog_share_theme.css` (Gruvbox light/dark via `html.theme-light/dark`). +- **Theme**: edit `theme/blog_share_theme.css` (Harbor light/dark via `html.theme-light/dark`). - **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 diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md index 9318741..2734cdf 100644 --- a/THIRD_PARTY_LICENSES.md +++ b/THIRD_PARTY_LICENSES.md @@ -8,7 +8,8 @@ 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` | Gruvbox palette image from [morhetz/gruvbox](https://github.com/morhetz/gruvbox) (repo: MIT) | [MIT](#mit-license) | +| `assets/palette.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) | +| `theme/blog_share_theme.css` | Harbor light / Harbordark color scheme from [HANCORE-linux/omarchy-harbor-theme](https://github.com/HANCORE-linux/omarchy-harbor-theme) (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.png b/assets/palette.png index b19bd5e..b5bf87b 100644 Binary files a/assets/palette.png and b/assets/palette.png differ diff --git a/theme/blog_share_theme.css b/theme/blog_share_theme.css index 1e9307e..64ffefe 100644 --- a/theme/blog_share_theme.css +++ b/theme/blog_share_theme.css @@ -1,41 +1,41 @@ /* - * 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 + * 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: #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; + --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: #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; + --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; } @@ -139,8 +139,8 @@ body { padding: 6px 12px 8px; border-radius: 8px; background: #fabd2f; - color: #1d2021; - border: 2px solid #1d2021; + color: #1c2d28; + border: 2px solid #1c2d28; font-family: "Cookie", "Brush Script MT", cursive; font-size: 1.4em; line-height: 1.1; @@ -149,8 +149,8 @@ body { } .bmc-btn:hover { - background: #fe8019; - color: #1d2021; + background: #dc8164; + color: #1c2d28; text-decoration: none; transform: translateY(-1px); } @@ -325,35 +325,35 @@ body { 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); + 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: #076678; - background: rgba(7, 102, 120, 0.10); + border-color: #4c6c94; + background: rgba(76, 108, 148, 0.10); } .blog-search-header-input:focus { outline: none; - border-color: #83a598; - box-shadow: 0 0 0 2px rgba(131, 165, 152, 0.20); + 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: #076678; - box-shadow: 0 0 0 2px rgba(7, 102, 120, 0.15); + border-color: #4c6c94; + box-shadow: 0 0 0 2px rgba(76, 108, 148, 0.15); } .search-item .search-icon { - color: rgba(131, 165, 152, 0.85); + color: rgba(119, 131, 138, 0.85); } html.theme-light .search-item .search-icon { - color: #076678; + color: #4c6c94; } .tn-image { @@ -541,13 +541,13 @@ body.is-garden #title .note-state { } 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; + 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(184, 187, 38, 0.20) !important; - border-bottom-color: rgba(184, 187, 38, 0.45) !important; + background-color: rgba(85, 103, 83, 0.15) !important; + border-bottom-color: rgba(85, 103, 83, 0.40) !important; } /* ---------- Blog index (generated article list) ---------- */ @@ -681,35 +681,35 @@ a.tag:hover { border-bottom: 1px solid var(--background-highlight); } -/* ---------- Headings (h2-h6) - Gruvbox header boxes ---------- */ +/* ---------- Headings (h2-h6) - Harbor 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); + --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(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); + --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 { @@ -766,36 +766,36 @@ html.theme-light { display: none; } -/* ---------- Code blocks - Gruvbox Dark (always, also in light mode) ---------- */ +/* ---------- Code blocks - Harbordark (always, also in light mode) ---------- */ .ck-content pre, #content pre { - background-color: #282828; - color: #ebdbb2; - border: 1px solid #504945; + background-color: #222222; + color: #efebdc; + border: 1px solid #2e2e2e; border-radius: 8px; } .ck-content code, #content code { - background-color: #3c3836; - color: #ebdbb2; - border-color: #504945; + 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: #fbf1c7; - color: #3c3836; - border-color: #d5c4a1; + background-color: #e8ecd0; + color: #1c2d28; + border-color: #c3c9a6; } html.theme-light .ck-content code, html.theme-light #content code { - background-color: #d5c4a1; - color: #3c3836; - border-color: #bdae93; + background-color: #cdd3b0; + color: #1c2d28; + border-color: #b3ba96; } /* ---------- Eingebettete Bilder: Radius wie Code-Blöcke (8px) ---------- */ @@ -815,7 +815,7 @@ html.theme-light #content code { width: calc(100vw - 24px); margin: 1em 0; margin-left: calc(50% - (100vw - 24px) / 2); - background: #1d2021; + background: #1b1b1b; border: 1px solid var(--background-highlight); border-radius: 8px; overflow: hidden; @@ -833,9 +833,9 @@ html.theme-light #content code { z-index: 3; display: none; font-size: 0.75em; - color: #a89984; - background: rgba(40, 40, 40, 0.8); - border: 1px solid #504945; + color: #a99b7a; + background: rgba(27, 27, 27, 0.85); + border: 1px solid #2e2e2e; border-radius: 6px; padding: 2px 10px; font-variant-numeric: tabular-nums; @@ -858,12 +858,12 @@ html.theme-light #content code { text-align: center; padding: 48px; box-sizing: border-box; - color: #a89984; + color: #a99b7a; font-size: 0.9em; } .model-viewer-status.error { - color: #fb4934; + color: #F44336; } .model-viewer-progress { @@ -874,7 +874,7 @@ html.theme-light #content code { height: 6px; width: min(60%, 480px); margin: 0 auto; - background: #3c3836; + background: #2a2a2a; border-radius: 3px; overflow: hidden; } @@ -882,7 +882,7 @@ html.theme-light #content code { .model-viewer-progress-fill { height: 100%; width: 0; - background: #b8bb26; + background: #E1CE98; border-radius: 3px; transition: width 150ms ease; } @@ -902,7 +902,7 @@ html.theme-light #content code { top: 8px; left: 10px; font-size: 0.75em; - color: #a89984; + color: #a99b7a; z-index: 2; pointer-events: none; } @@ -923,7 +923,7 @@ html.theme-light #content code { height: 100%; } -/* ---------- Bildunterschriften (Gruvbox) ---------- */ +/* ---------- Bildunterschriften (Harbor) ---------- */ #content figcaption { font-size: 0.85em; font-style: italic; @@ -938,19 +938,19 @@ html.theme-light #content code { } .hljs { - background: #282828; - color: #ebdbb2; + background: #222222; + color: #efebdc; } .hljs-comment, .hljs-quote { - color: #928374; + color: #817f68; } .hljs-keyword, .hljs-selector-tag, .hljs-subst { - color: #fb4934; + color: #F44336; } .hljs-number, @@ -958,24 +958,24 @@ html.theme-light #content code { .hljs-variable, .hljs-template-variable, .hljs-tag .hljs-attr { - color: #d3869b; + color: #e58980; } .hljs-string, .hljs-doctag { - color: #b8bb26; + color: #a99b7a; } .hljs-title, .hljs-section, .hljs-selector-id { - color: #fe8019; + color: #E1CE98; } .hljs-type, .hljs-class .hljs-title, .hljs-attribute { - color: #fabd2f; + color: #77838a; } .hljs-symbol, @@ -984,13 +984,13 @@ html.theme-light #content code { .hljs-meta, .hljs-deletion, .hljs-addition { - color: #d3869b; + color: #e58980; } .hljs-built_in, .hljs-builtin-name, .hljs-params { - color: #8ec07c; + color: #77838a; } .hljs-emphasis { @@ -1000,22 +1000,22 @@ html.theme-light #content code { .hljs-strong { font-weight: bold; } -/* ---------- Light mode: Gruvbox Light highlighter ---------- */ +/* ---------- Light mode: Harbor light highlighter ---------- */ html.theme-light .hljs, html.theme-light pre code.hljs { - background: #fbf1c7 !important; - color: #3c3836; + background: #e8ecd0 !important; + color: #1c2d28; } html.theme-light .hljs-comment, html.theme-light .hljs-quote { - color: #928374; + color: #7d8794; } html.theme-light .hljs-keyword, html.theme-light .hljs-selector-tag, html.theme-light .hljs-subst { - color: #9d0006; + color: #b14752; } html.theme-light .hljs-number, @@ -1023,24 +1023,24 @@ 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; + color: #8a5b81; } html.theme-light .hljs-string, html.theme-light .hljs-doctag { - color: #79740e; + color: #556753; } html.theme-light .hljs-title, html.theme-light .hljs-section, html.theme-light .hljs-selector-id { - color: #af3a03; + color: #dc8164; } html.theme-light .hljs-type, html.theme-light .hljs-class .hljs-title, html.theme-light .hljs-attribute { - color: #b57614; + color: #4c6c94; } html.theme-light .hljs-symbol, @@ -1049,13 +1049,13 @@ html.theme-light .hljs-link, html.theme-light .hljs-meta, html.theme-light .hljs-deletion, html.theme-light .hljs-addition { - color: #8f3f71; + color: #8a5b81; } html.theme-light .hljs-built_in, html.theme-light .hljs-builtin-name, html.theme-light .hljs-params { - color: #427b58; + color: #3d727d; } html.theme-light .hljs-regexp, @@ -1064,16 +1064,16 @@ 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; + color: #8a5b81; } html.theme-light .hljs-name, html.theme-light .hljs-tag { - color: #076678; + color: #4c6c94; } html.theme-light .hljs-meta .hljs-string { - color: #79740e; + color: #556753; } /* ---------- Admonitions (Trilium-style, gefüllt) ---------- */ .admonition { @@ -1090,18 +1090,18 @@ html.theme-light .hljs-meta .hljs-string { 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.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(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); } +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; @@ -1112,11 +1112,11 @@ html.theme-light .admonition.warning { --admonition-bg: rgba(226, 170, 3, 0.20); 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.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); @@ -1131,25 +1131,25 @@ html.theme-light .admonition.warning { --admonition-bg: rgba(226, 170, 3, 0.20); .admonition.important::before { content: "\ea7c"; } .admonition.caution::before { content: "\eac7"; } .admonition.warning::before { content: "\eac5"; } -/* ---------- Tables (Gruvbox, theme-aware) ---------- */ +/* ---------- Tables (Harbor, 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-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(131, 165, 152, 0.16); + --table-hover: rgba(231, 90, 80, 0.12); --table-rowlabel-bg: rgba(255, 255, 255, 0.05); - --table-rowlabel-text: #ebdbb2; + --table-rowlabel-text: #efebdc; } 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-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(7, 102, 120, 0.12); + --table-hover: rgba(94, 129, 172, 0.12); --table-rowlabel-bg: rgba(0, 0, 0, 0.05); - --table-rowlabel-text: #3c3836; + --table-rowlabel-text: #1c2d28; } .ck-content table, @@ -1209,19 +1209,19 @@ html.theme-light { .ck-content table tbody tr:hover td, #content table tbody tr:hover td { - background-color: rgba(254, 128, 25, 0.07) !important; + background-color: rgba(94, 129, 172, 0.10) !important; } .ck-content table .col-hover, #content table .col-hover { - background-color: rgba(254, 128, 25, 0.07) !important; + 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(254, 128, 25, 0.14) !important; + background-color: rgba(94, 129, 172, 0.18) !important; } /* ---------- Category subcategories ---------- */ .blog-subcategories { @@ -1276,18 +1276,18 @@ html.theme-light { text-transform: capitalize; white-space: nowrap; } -/* ---------- Digital Garden rows: clickable + green hover ---------- */ +/* ---------- 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(184, 187, 38, 0.12) !important; + background-color: rgba(169, 155, 122, 0.15) !important; } #content .blog-garden-table tbody tr:hover td.col-hover { - background-color: rgba(184, 187, 38, 0.20) !important; + background-color: rgba(169, 155, 122, 0.25) !important; } .note-state { display: inline-flex; @@ -1296,44 +1296,44 @@ html.theme-light { font-size: 0.8em; padding: 2px 10px; border-radius: 8px; - background: rgba(184, 187, 38, 0.18); + background: rgba(169, 155, 122, 0.20); color: var(--text-heading); font-weight: 600; white-space: nowrap; } .note-state i { - color: #b8bb26; + color: #a99b7a; } .note-state.state-draft { - background: rgba(146, 131, 116, 0.22); + background: rgba(109, 109, 109, 0.22); } .note-state.state-draft i { - color: #928374; + color: #6d6d6d; } .note-state.state-review { - background: rgba(131, 165, 152, 0.25); + background: rgba(119, 131, 138, 0.25); } .note-state.state-review i { - color: #83a598; + color: #77838a; } .note-state.state-unknown { - background: rgba(251, 73, 52, 0.20); + background: rgba(244, 67, 54, 0.18); } .note-state.state-unknown i { - color: #fb4934; + color: #F44336; } -/* ---------- Code notes: always Gruvbox dark like code boxes ---------- */ +/* ---------- Code notes: always Harbordark like code boxes ---------- */ #content.type-code pre { - background-color: #282828 !important; - color: #ebdbb2; - border: 1px solid #504945; + background-color: #222222 !important; + color: #efebdc; + border: 1px solid #2e2e2e; border-radius: 8px; padding: 1em; margin: 1em 0; @@ -1341,18 +1341,18 @@ html.theme-light { #content.type-code code { background-color: transparent !important; - color: #ebdbb2; + color: #efebdc; border: 0; } html.theme-light #content.type-code pre { - background-color: #fbf1c7 !important; - color: #3c3836; - border-color: #d5c4a1; + background-color: #e8ecd0 !important; + color: #1c2d28; + border-color: #c3c9a6; } html.theme-light #content.type-code code { - color: #3c3836; + color: #1c2d28; } /* ---------- Code: line numbers + copy button ---------- */ pre.code-processed { @@ -1450,12 +1450,12 @@ pre.code-processed .code-copy-btn:hover, #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; + 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(254, 128, 25, 0.08) !important; + background-color: rgba(94, 129, 172, 0.08) !important; } .hljs-ln-numbers { @@ -1475,7 +1475,7 @@ html.theme-light #content .hljs-ln tbody tr:hover td.col-hover { white-space: pre; vertical-align: top; } -/* ---------- Scrollbars (Gruvbox) ---------- */ +/* ---------- Scrollbars (Harbor) ---------- */ ::-webkit-scrollbar { width: 12px; height: 12px; @@ -1503,49 +1503,49 @@ html.theme-light #content .hljs-ln tbody tr:hover td.col-hover { pre, pre.code-processed .code-wrap, .hljs-ln-code { - scrollbar-color: #504945 #1d2021; + scrollbar-color: #2e2e2e #1b1b1b; } pre::-webkit-scrollbar-thumb, pre.code-processed .code-wrap::-webkit-scrollbar-thumb, .hljs-ln-code::-webkit-scrollbar-thumb { - background: #504945; + background: #2e2e2e; } pre::-webkit-scrollbar-thumb:hover, pre.code-processed .code-wrap::-webkit-scrollbar-thumb:hover, .hljs-ln-code::-webkit-scrollbar-thumb:hover { - background: #665c54; + background: #3f3f3f; } pre::-webkit-scrollbar-track, pre.code-processed .code-wrap::-webkit-scrollbar-track, .hljs-ln-code::-webkit-scrollbar-track { - background: #1d2021; + background: #1b1b1b; } html.theme-light pre, html.theme-light pre.code-processed .code-wrap, html.theme-light .hljs-ln-code { - scrollbar-color: #bdae93 #ebdbb2; + 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: #bdae93; + 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: #d5c4a1; + 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: #ebdbb2; + background: #d0d6b4; } /* ---------- Link icons / markers: internal links without arrow, external links keep a marker ---------- */ @@ -1591,23 +1591,200 @@ a.previous::before, /* action links as buttons (subtle tint, noticeable on hover) */ .blog-pn { padding: 6px 14px; - border: 1px solid rgba(131, 165, 152, 0.35); + border: 1px solid rgba(231, 90, 80, 0.30); border-radius: 8px; - background: rgba(131, 165, 152, 0.08); + 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(7, 102, 120, 0.35); - background: rgba(7, 102, 120, 0.08); + border-color: rgba(76, 108, 148, 0.30); + background: rgba(76, 108, 148, 0.08); } .blog-pn:hover { - background: rgba(131, 165, 152, 0.18); - border-color: #83a598; + background: rgba(231, 90, 80, 0.18); + border-color: #e75a50; } html.theme-light .blog-pn:hover { - background: rgba(7, 102, 120, 0.15); - border-color: #076678; + 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; } \ No newline at end of file