jekyll-theme-zer0 1.24.0 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +94 -0
- data/README.md +3 -3
- data/_data/authors.yml +1 -0
- data/_data/features.yml +37 -2
- data/_data/navigation/README.md +15 -5
- data/_data/navigation/main.yml +0 -8
- data/_data/roadmap.yml +1 -0
- data/_includes/README.md +10 -7
- data/_includes/analytics/google-analytics.html +1 -0
- data/_includes/analytics/google-tag-manager-body.html +1 -0
- data/_includes/analytics/google-tag-manager-head.html +1 -0
- data/_includes/analytics/posthog.html +1 -0
- data/_includes/components/README.md +2 -1
- data/_includes/components/admin-links.html +63 -0
- data/_includes/components/admin-tabs.html +1 -0
- data/_includes/components/ai-chat.html +27 -5
- data/_includes/components/author-eeat.html +1 -0
- data/_includes/components/background-customizer.html +1 -0
- data/_includes/components/background-settings.html +36 -37
- data/_includes/components/component-showcase.html +1 -0
- data/_includes/components/cookie-consent.html +1 -0
- data/_includes/components/dev-shortcuts.html +1 -8
- data/_includes/components/env-switcher.html +90 -138
- data/_includes/components/feature-card.html +1 -1
- data/_includes/components/halfmoon.html +22 -41
- data/_includes/components/info-section.html +127 -130
- data/_includes/components/mermaid.html +1 -0
- data/_includes/components/nanobar.html +1 -0
- data/_includes/components/post-type-badge.html +1 -0
- data/_includes/components/preview-image.html +1 -0
- data/_includes/components/search-modal.html +1 -0
- data/_includes/components/searchbar.html +1 -0
- data/_includes/components/shortcuts-modal.html +1 -0
- data/_includes/components/theme-info.html +21 -30
- data/_includes/components/theme-preview-gallery.html +1 -0
- data/_includes/content/backlinks.html +1 -0
- data/_includes/content/giscus.html +1 -0
- data/_includes/content/jsonld-faq.html +1 -0
- data/_includes/content/seo.html +1 -0
- data/_includes/content/sitemap.html +1 -0
- data/_includes/content/toc.html +1 -0
- data/_includes/core/color-mode-init.html +1 -0
- data/_includes/core/footer.html +1 -0
- data/_includes/core/head.html +1 -0
- data/_includes/core/header.html +5 -15
- data/_includes/navigation/admin-nav.html +1 -0
- data/_includes/navigation/breadcrumbs.html +1 -0
- data/_includes/navigation/local-graph-fab.html +3 -9
- data/_includes/navigation/local-graph.html +4 -9
- data/_includes/navigation/navbar.html +1 -0
- data/_includes/navigation/sidebar-categories.html +56 -14
- data/_includes/navigation/sidebar-config.html +115 -0
- data/_includes/navigation/sidebar-folders.html +168 -62
- data/_includes/navigation/sidebar-left.html +29 -52
- data/_includes/navigation/sidebar-nav.html +30 -0
- data/_includes/navigation/sidebar-right.html +1 -0
- data/_includes/navigation/toc-fab.html +3 -9
- data/_includes/navigation/unified-drawer.html +7 -14
- data/_includes/obsidian/full-graph.html +1 -0
- data/_includes/setup/wizard.html +1 -0
- data/_includes/stats/stats-categories.html +1 -0
- data/_includes/stats/stats-header.html +1 -0
- data/_includes/stats/stats-metrics.html +1 -0
- data/_includes/stats/stats-overview.html +1 -0
- data/_includes/stats/stats-tags.html +1 -0
- data/_layouts/admin.html +1 -0
- data/_layouts/article.html +1 -0
- data/_layouts/author.html +1 -0
- data/_layouts/authors.html +1 -0
- data/_layouts/collection.html +1 -0
- data/_layouts/default.html +14 -37
- data/_layouts/home.html +1 -0
- data/_layouts/index.html +1 -0
- data/_layouts/landing.html +1 -0
- data/_layouts/news.html +1 -0
- data/_layouts/note.html +1 -0
- data/_layouts/notebook.html +1 -0
- data/_layouts/root.html +3 -2
- data/_layouts/search.html +1 -0
- data/_layouts/section.html +1 -0
- data/_layouts/setup.html +1 -0
- data/_layouts/sitemap-collection.html +1 -0
- data/_layouts/stats.html +1 -0
- data/_layouts/tag.html +1 -0
- data/_layouts/welcome.html +1 -0
- data/_plugins/author_pages_generator.rb +1 -0
- data/_plugins/obsidian_links.rb +1 -0
- data/_plugins/preview_image_generator.rb +1 -0
- data/_plugins/search_and_sitemap_generator.rb +1 -0
- data/_plugins/theme_version.rb +1 -0
- data/_sass/components/_author.scss +12 -1
- data/_sass/components/_footer.scss +22 -0
- data/_sass/components/_ui-enhancements.scss +9 -0
- data/_sass/core/_docs-layout.scss +1 -0
- data/_sass/core/_navbar.scss +10 -27
- data/_sass/core/_obsidian.scss +2 -2
- data/_sass/core/code-copy.scss +10 -0
- data/_sass/custom.scss +1 -0
- data/_sass/notebooks.scss +1 -0
- data/_sass/theme/_backgrounds.scss +7 -2
- data/_sass/utilities/_layout.scss +11 -0
- data/assets/css/main.scss +2 -1
- data/assets/js/ai-chat.js +1 -0
- data/assets/js/author-profile.js +1 -0
- data/assets/js/auto-hide-nav.js +1 -0
- data/assets/js/back-to-top.js +1 -0
- data/assets/js/background-customizer.js +1 -0
- data/assets/js/code-copy.js +1 -0
- data/assets/js/halfmoon.js +23 -22
- data/assets/js/modules/navigation/gestures.js +1 -0
- data/assets/js/modules/navigation/keyboard.js +1 -0
- data/assets/js/modules/navigation/scroll-spy.js +1 -0
- data/assets/js/modules/navigation/sidebar-state.js +1 -0
- data/assets/js/modules/navigation/sidebar-visibility.js +1 -0
- data/assets/js/modules/navigation/smooth-scroll.js +1 -0
- data/assets/js/modules/theme/appearance.js +52 -16
- data/assets/js/nanobar-init.js +1 -0
- data/assets/js/navigation.js +1 -0
- data/assets/js/obsidian-graph.js +1 -0
- data/assets/js/obsidian-wiki-links.js +1 -0
- data/assets/js/palette-generator.js +1 -0
- data/assets/js/particles-source.js +1 -0
- data/assets/js/search-modal.js +1 -0
- data/assets/js/setup-wizard.js +1 -0
- data/assets/js/share-actions.js +1 -0
- data/assets/js/skin-editor.js +1 -0
- data/assets/js/table-copy.js +1 -0
- data/assets/js/theme-customizer.js +1 -0
- data/scripts/analyze-commits.sh +1 -0
- data/scripts/bin/giscus-discussions +1 -0
- data/scripts/bin/install +1 -0
- data/scripts/bin/validate +1 -0
- data/scripts/build +1 -0
- data/scripts/content-review.rb +1 -0
- data/scripts/convert-notebooks.sh +4 -3
- data/scripts/fix-markdown-format.sh +1 -0
- data/scripts/generate-preview-images.sh +1 -0
- data/scripts/generate-roadmap.sh +1 -0
- data/scripts/install-preview-generator.sh +1 -0
- data/scripts/release +1 -0
- data/scripts/requirements.txt +11 -0
- data/scripts/setup.sh +1 -0
- data/scripts/tag-features +136 -0
- data/scripts/validate-features.rb +7 -0
- data/scripts/vendor-install.sh +1 -0
- metadata +8 -3
- data/_plugins/admin_page_urls.rb +0 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2ffe866835e858107f670f29086f904914d21bf1159d8c6eb3cbd138f79caf64
|
|
4
|
+
data.tar.gz: d26f27d6460136cc9f2da67da26523721b52b0e7525e0811498910215e2f29e2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 50038606f12260b1382fceee13299e6f8a9ca0b08b00ba18e285ed88ee762fd425e853d6fde39e8c9f72f8b345f841b04b29a3e4b095a89c36f01dc4d267d036
|
|
7
|
+
data.tar.gz: e2e2764ca02d2d10250c768beb66ca7b7ba44c60b22e1852f3993f245080b5b2d3ad532245b33e394a078ae912cc60b28b33ee9fb23403194a1e75183841d925
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,99 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.25.0](https://github.com/bamr87/zer0-mistakes/compare/v1.24.0...v1.25.0) (2026-07-03)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **features:** reverse-traceability source tags — applied and enforced ([#270](https://github.com/bamr87/zer0-mistakes/issues/270)) ([f2c0c07](https://github.com/bamr87/zer0-mistakes/commit/f2c0c073c08bce62956a56b4b3e77d48a00ba309))
|
|
14
|
+
* **includes:** rebuild settings offcanvas into 3 coherent tabs ([#276](https://github.com/bamr87/zer0-mistakes/issues/276)) ([6d7fa5e](https://github.com/bamr87/zer0-mistakes/commit/6d7fa5e028a540576205462cb37797f6ee11c98a))
|
|
15
|
+
* **navigation:** collection-aware sidebar modes with shared resolver ([#273](https://github.com/bamr87/zer0-mistakes/issues/273)) ([104285f](https://github.com/bamr87/zer0-mistakes/commit/104285fbed2d27646549c9aa956dea5108d91f77))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* **features:** stop ZER0-061 card from swallowing every following card ([#268](https://github.com/bamr87/zer0-mistakes/issues/268)) ([46a604d](https://github.com/bamr87/zer0-mistakes/commit/46a604d1bf4331422b382bf895aeecae928fda70))
|
|
21
|
+
* **navigation:** remove redundant entries from navigation menus ([916eca2](https://github.com/bamr87/zer0-mistakes/commit/916eca269726c984c5c0c9dc9533c83d9975f906))
|
|
22
|
+
* **sass:** mobile audit — contain author card, restore consent z-order, grow tap targets ([#275](https://github.com/bamr87/zer0-mistakes/issues/275)) ([8ec9867](https://github.com/bamr87/zer0-mistakes/commit/8ec9867858ff87e9b8a6fcd4a68ec7e50582c3c1))
|
|
23
|
+
|
|
24
|
+
## [Unreleased]
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **Settings panel rebuilt** — the navbar Settings offcanvas (`#info-section`)
|
|
29
|
+
is reorganized from four overlapping tabs (Settings / Environment /
|
|
30
|
+
Developer / Background) into three with one purpose each, guarded by the
|
|
31
|
+
new `test/visual/settings-panel.spec.js` smoke suite
|
|
32
|
+
(evidence: [`test/visual/evidence/settings-panel/`](test/visual/evidence/settings-panel/README.md)
|
|
33
|
+
— 4 tabs → 3, duplicate color-mode controls 6 → 3, dead search box
|
|
34
|
+
removed, admin links 0 → 4):
|
|
35
|
+
- **Appearance** consolidates every look-and-feel control exactly once:
|
|
36
|
+
color mode (one-click segmented control replacing the two-click
|
|
37
|
+
dropdown), theme skin, background toggle + layer opacity with inline
|
|
38
|
+
values, and the primary-color picker — now mounted *inside* the tab
|
|
39
|
+
instead of appended below the tab content where it duplicated the
|
|
40
|
+
color-mode buttons under every tab.
|
|
41
|
+
- **Site** stacks the environment card (copyable page URL via a delegated
|
|
42
|
+
`data-zer0-copy` handler — inline `onclick` handlers removed),
|
|
43
|
+
quick links, deduplicated theme & build info, and Admin quick links.
|
|
44
|
+
- **Developer** keeps page location (rendered only where breadcrumbs
|
|
45
|
+
render — no more empty heading on the homepage), page metadata, and
|
|
46
|
+
source shortcuts (dead never-initialized tooltip attributes dropped).
|
|
47
|
+
- The dead Settings-tab search box (an empty `#searchbox` no JS ever
|
|
48
|
+
bound to) is removed; the search modal remains the one search surface.
|
|
49
|
+
- Mobile tabs keep their text labels (their accessible names) at every
|
|
50
|
+
width and drop the decorative icons instead of the reverse.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- **Settings panel admin links never rendered** — the
|
|
55
|
+
`_plugins/admin_page_urls.rb` lookup powering them never ran: the
|
|
56
|
+
`github-pages` gem forces safe mode and randomizes `plugins_dir`, so local
|
|
57
|
+
`_plugins` are disabled on GitHub Pages, in CI, and in the Docker dev
|
|
58
|
+
server alike. The plugin is replaced with a pure-Liquid scan in the cached
|
|
59
|
+
`_includes/components/admin-links.html` (jekyll-include-cache is
|
|
60
|
+
whitelisted), so the Admin section now renders its existence-gated links
|
|
61
|
+
(0 → 4 on the demo site).
|
|
62
|
+
|
|
63
|
+
- **Mobile responsive audit** — four defects found by driving every key route
|
|
64
|
+
and component under phone emulation (320–414px), each guarded by the new
|
|
65
|
+
`test/visual/mobile-responsive.spec.js` smoke suite
|
|
66
|
+
(evidence: [`test/visual/evidence/mobile-responsive/`](test/visual/evidence/mobile-responsive/README.md) —
|
|
67
|
+
author-card page overflow 19px → 0 on small phones; consent buttons 0
|
|
68
|
+
tap-blocked; all footer/copy tap targets ≥24px):
|
|
69
|
+
- **Author card**: a long nowrap expertise badge propagated through flexbox
|
|
70
|
+
`min-width: auto` and pushed the whole page past the viewport on ≤340px
|
|
71
|
+
phones, widening the layout viewport so the fixed navbar rendered "cut
|
|
72
|
+
off" and the page panned sideways.
|
|
73
|
+
- **Cookie consent banner**: the `.zer0-bg-body` child-elevation rule
|
|
74
|
+
flattened the banner (and the TOC FAB) to `z-index: 1`, letting the chat
|
|
75
|
+
and local-graph FABs paint over — and steal taps from — the banner's
|
|
76
|
+
Reject All / Accept All buttons on mobile. The rule now excludes
|
|
77
|
+
`.position-fixed`, restoring the `--zer0-layer-*` token order.
|
|
78
|
+
- **Footer tap targets**: text links (~19px) and icon-only social links
|
|
79
|
+
(~16px) now meet the WCAG 2.5.8 24px minimum via block padding and
|
|
80
|
+
minimum boxes — text size and visual design unchanged.
|
|
81
|
+
- **Breadcrumb tap targets**: breadcrumb links (~19px bare text) gain a
|
|
82
|
+
≥24px tap box via block padding + matching negative margin, without
|
|
83
|
+
shifting the visual baseline.
|
|
84
|
+
- **Code-copy buttons**: grown from ~22px to ≥24px tall (32px on
|
|
85
|
+
coarse/touch pointers).
|
|
86
|
+
- **ToC / chat FAB collision**: on mobile, the table-of-contents FAB and
|
|
87
|
+
the AI-chat toggle both claimed the right-edge slot above back-to-top
|
|
88
|
+
and overlapped (ToC painting over the chat button). The chat toggle and
|
|
89
|
+
its panel now step one slot higher on pages that render the ToC FAB,
|
|
90
|
+
and the chat panel is capped to the viewport so it can't poke above
|
|
91
|
+
short tablet/landscape screens.
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
|
|
95
|
+
- **Mobile test tier**: `test/visual/mobile-responsive.spec.js` runs the above
|
|
96
|
+
guards plus offcanvas-menu, search-modal, and settings-panel fit/tap checks
|
|
97
|
+
under real Pixel-class emulation in the `smoke` tier; `npm run test:mobile`
|
|
98
|
+
runs just this suite. New `dismissCookieConsent` fixture pre-seeds the
|
|
99
|
+
consent choice for tests that interact with lower-screen chrome.
|
|
100
|
+
|
|
8
101
|
## [1.24.0](https://github.com/bamr87/zer0-mistakes/compare/v1.23.0...v1.24.0) (2026-07-01)
|
|
9
102
|
|
|
10
103
|
|
|
@@ -42,6 +135,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
42
135
|
|
|
43
136
|
### Bug Fixes
|
|
44
137
|
|
|
138
|
+
* **features:** stop a feature card from swallowing every card after it on `/features/` — a raw `<key>` in the ZER0-061 description rendered as a stray HTML element. Fixed the description (`/authors/:key/`), escaped all `description` output on the features page and in `feature-card.html`, and added a registry-gate check that rejects raw `<`/`>` in titles/descriptions. (evidence: [`test/visual/evidence/features-card-escape/`](test/visual/evidence/features-card-escape/README.md))
|
|
45
139
|
* **includes:** existence-guard component-showcase demo links — breadcrumb and list-group items now render as real links when the target page exists in the build (`/docs/`, `/docs/customization/`, `/categories/`, `/tags/`) and as plain text when absent; removes inert `href="#"` / `onclick="return false;"` workaround ([#219](https://github.com/bamr87/zer0-mistakes/issues/219)) (evidence: [`test/visual/evidence/component-showcase/`](test/visual/evidence/component-showcase/README.md))
|
|
46
140
|
|
|
47
141
|
### Tests
|
data/README.md
CHANGED
|
@@ -757,11 +757,11 @@ All workflows live under [`.github/workflows/`](.github/workflows/).
|
|
|
757
757
|
|
|
758
758
|
| # | Workflow | File | Trigger | Purpose |
|
|
759
759
|
|---|----------|------|---------|---------|
|
|
760
|
-
| 1 | **Comprehensive CI Pipeline** | [`ci.yml`](.github/workflows/ci.yml) | push / PR / dispatch | Detect changes →
|
|
761
|
-
| 2 | **TEST (Latest Dependencies)** | [`test-latest.yml`](.github/workflows/test-latest.yml) | daily schedule / push /
|
|
760
|
+
| 1 | **Comprehensive CI Pipeline** | [`ci.yml`](.github/workflows/ci.yml) | push / PR / dispatch | Detect changes → quality control (incl. quick preflight) → matrix test suite → integration tests → build & validate |
|
|
761
|
+
| 2 | **TEST (Latest Dependencies)** | [`test-latest.yml`](.github/workflows/test-latest.yml) | daily schedule / push / dispatch | Zero-pin Docker build with bleeding-edge gems; tests then promotes passing images to Docker Hub |
|
|
762
762
|
| 3 | **Release** | [`release.yml`](.github/workflows/release.yml) | push to `main` | release-please opens a release PR from Conventional Commits; merging it tags `vX.Y.Z` and publishes the gem to [RubyGems](https://rubygems.org/gems/jekyll-theme-zer0) |
|
|
763
763
|
| 4 | **Update Dependencies** | [`update-dependencies.yml`](.github/workflows/update-dependencies.yml) | weekly schedule | Refreshes `Gemfile.lock` to latest compatible versions and opens an automated PR |
|
|
764
|
-
| 5 | **CodeQL Security Scanning** | [`codeql.yml`](.github/workflows/codeql.yml) | push / PR on code paths + weekly | Static security analysis across Ruby, JavaScript/TypeScript, Python,
|
|
764
|
+
| 5 | **CodeQL Security Scanning** | [`codeql.yml`](.github/workflows/codeql.yml) | push / PR on code paths + weekly | Static security analysis across Ruby, JavaScript/TypeScript, Python, and Actions |
|
|
765
765
|
| 6 | **Content & Docs Review** | [`ai-content-review.yml`](.github/workflows/ai-content-review.yml) | PR on docs/content | Deterministic SEO/quality review + optional Claude agent + docs front matter, internal-link, and markdownlint checks |
|
|
766
766
|
| 7 | **Convert Jupyter Notebooks** | [`convert-notebooks.yml`](.github/workflows/convert-notebooks.yml) | push to `pages/_notebooks/**.ipynb` | Auto-converts `.ipynb` → Jekyll-friendly Markdown with extracted images |
|
|
767
767
|
| 8 | **Sync** | [`sync.yml`](.github/workflows/sync.yml) | push affecting `_data/backlog.yml` or `_data/roadmap.yml` | Mirrors the backlog to GitHub Issues and regenerates the README roadmap section |
|
data/_data/authors.yml
CHANGED
data/_data/features.yml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# zer0-mistakes Theme Features Registry
|
|
2
2
|
# Comprehensive feature tracking for the zer0-mistakes Jekyll theme
|
|
3
|
-
# Version: 1.
|
|
3
|
+
# Version: 1.24.0
|
|
4
4
|
# Last Updated: 2026-06-30
|
|
5
5
|
|
|
6
6
|
features:
|
|
@@ -1767,7 +1767,7 @@ features:
|
|
|
1767
1767
|
|
|
1768
1768
|
- id: ZER0-061
|
|
1769
1769
|
title: "Author Profiles System"
|
|
1770
|
-
description: "Auto-generated author profile pages and a searchable author directory from _data/authors.yml — each author gets a /authors
|
|
1770
|
+
description: "Auto-generated author profile pages and a searchable author directory from _data/authors.yml — each author gets a /authors/:key/ hub with bio, stats, and a filterable grid of their content across collections"
|
|
1771
1771
|
implemented: true
|
|
1772
1772
|
version: "1.20.0"
|
|
1773
1773
|
link: "/authors/"
|
|
@@ -2109,3 +2109,38 @@ features:
|
|
|
2109
2109
|
- na: "CI security scan — .github/workflows/secret-scan.yml"
|
|
2110
2110
|
references:
|
|
2111
2111
|
workflow: ".github/workflows/secret-scan.yml"
|
|
2112
|
+
|
|
2113
|
+
- id: ZER0-077
|
|
2114
|
+
title: "Unified Settings Panel"
|
|
2115
|
+
description: "Navbar settings offcanvas reorganized into Appearance, Site, and Developer tabs — consolidated color-mode/skin/background controls, delegated copy-to-clipboard, and existence-gated admin quick links computed in cached Liquid"
|
|
2116
|
+
implemented: true
|
|
2117
|
+
version: "1.25.0"
|
|
2118
|
+
link: "/"
|
|
2119
|
+
docs: "/docs/customization/includes/"
|
|
2120
|
+
tags: [ui, navigation, bootstrap, accessibility]
|
|
2121
|
+
date: 2026-07-02
|
|
2122
|
+
provenance:
|
|
2123
|
+
introduced_in: "1.25.0"
|
|
2124
|
+
pr: 276
|
|
2125
|
+
commit: "3b951604"
|
|
2126
|
+
issue: null
|
|
2127
|
+
tests:
|
|
2128
|
+
- "test/visual/settings-panel.spec.js"
|
|
2129
|
+
references:
|
|
2130
|
+
includes:
|
|
2131
|
+
- "_includes/components/info-section.html"
|
|
2132
|
+
- "_includes/components/admin-links.html"
|
|
2133
|
+
- "_includes/components/halfmoon.html"
|
|
2134
|
+
- "_includes/components/env-switcher.html"
|
|
2135
|
+
- "_includes/components/theme-info.html"
|
|
2136
|
+
- "_includes/components/background-settings.html"
|
|
2137
|
+
- "_includes/components/dev-shortcuts.html"
|
|
2138
|
+
scripts:
|
|
2139
|
+
- "assets/js/halfmoon.js"
|
|
2140
|
+
- "assets/js/modules/theme/appearance.js"
|
|
2141
|
+
sass:
|
|
2142
|
+
- "_sass/utilities/_layout.scss"
|
|
2143
|
+
features:
|
|
2144
|
+
- "Appearance tab: one-click color mode, 9 theme skins, background layer opacity, primary color"
|
|
2145
|
+
- "Site tab: environment badge, copyable page URL, quick links, theme & build info, admin links"
|
|
2146
|
+
- "Developer tab: breadcrumb page location, page metadata, source-code shortcuts"
|
data/_data/navigation/README.md
CHANGED
|
@@ -19,11 +19,18 @@
|
|
|
19
19
|
#
|
|
20
20
|
# ## Navigation Modes
|
|
21
21
|
#
|
|
22
|
-
# The sidebar supports
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
22
|
+
# The sidebar supports these navigation modes set via `page.sidebar.nav`
|
|
23
|
+
# (resolved by _includes/navigation/sidebar-config.html; page front matter →
|
|
24
|
+
# collection `sidebar:` metadata → site.sidebar → nothing):
|
|
25
|
+
#
|
|
26
|
+
# 1. **auto** - Best mode for the page's collection: a curated
|
|
27
|
+
# _data/navigation/<collection>.yml wins, then the live "collection"
|
|
28
|
+
# folder tree, then post "categories"
|
|
29
|
+
# 2. **collection** - Live folder tree of the page's (or a named) collection
|
|
30
|
+
# 3. **categories** - Posts grouped by Jekyll category
|
|
31
|
+
# 4. **tags** - Posts grouped by Jekyll tag
|
|
32
|
+
# 5. **<file name>** - Any other value renders _data/navigation/<value>.yml
|
|
33
|
+
# as a curated tree (e.g. `nav: docs` → docs.yml)
|
|
27
34
|
#
|
|
28
35
|
# ## Available Files
|
|
29
36
|
#
|
|
@@ -42,6 +49,9 @@
|
|
|
42
49
|
# nav: docs # Uses _data/navigation/docs.yml
|
|
43
50
|
# ```
|
|
44
51
|
#
|
|
52
|
+
# Collections named like a file here get it automatically under `nav: auto`
|
|
53
|
+
# (docs.yml, about.yml, quickstart.yml, posts.yml ↔ the matching collection).
|
|
54
|
+
#
|
|
45
55
|
# ## Navbar capacity & responsive constraints (main.yml)
|
|
46
56
|
#
|
|
47
57
|
# The top navbar adapts the `main.yml` items to the viewport automatically:
|
data/_data/navigation/main.yml
CHANGED
|
@@ -18,8 +18,6 @@
|
|
|
18
18
|
icon: bi-newspaper
|
|
19
19
|
url: /news/
|
|
20
20
|
children:
|
|
21
|
-
- title: All News
|
|
22
|
-
url: /news/
|
|
23
21
|
- title: Categories
|
|
24
22
|
url: /categories/
|
|
25
23
|
- title: Tags
|
|
@@ -29,8 +27,6 @@
|
|
|
29
27
|
icon: bi-journal-text
|
|
30
28
|
url: /notes/
|
|
31
29
|
children:
|
|
32
|
-
- title: All Notes
|
|
33
|
-
url: /notes/
|
|
34
30
|
- title: Git Cheatsheet
|
|
35
31
|
url: /notes/git-cheatsheet/
|
|
36
32
|
- title: Docker Commands
|
|
@@ -46,8 +42,6 @@
|
|
|
46
42
|
icon: bi-journal-code
|
|
47
43
|
url: /notebooks/
|
|
48
44
|
children:
|
|
49
|
-
- title: All Notebooks
|
|
50
|
-
url: /notebooks/
|
|
51
45
|
- title: Test Notebook
|
|
52
46
|
url: /notebooks/test-notebook/
|
|
53
47
|
|
|
@@ -55,8 +49,6 @@
|
|
|
55
49
|
icon: bi-journal-bookmark
|
|
56
50
|
url: /docs/
|
|
57
51
|
children:
|
|
58
|
-
- title: Documentation Home
|
|
59
|
-
url: /docs/
|
|
60
52
|
- title: Installation
|
|
61
53
|
url: /docs/installation/
|
|
62
54
|
- title: Jekyll Guide
|
data/_data/roadmap.yml
CHANGED
data/_includes/README.md
CHANGED
|
@@ -18,10 +18,12 @@ Essential layout components that form the foundation of the site:
|
|
|
18
18
|
All navigation-related components:
|
|
19
19
|
|
|
20
20
|
- `navbar.html` - Main navigation menu
|
|
21
|
-
- `sidebar-left.html` - Left sidebar
|
|
21
|
+
- `sidebar-left.html` - Left sidebar panel (offcanvas shell around the resolved nav)
|
|
22
|
+
- `sidebar-config.html` - Resolves the effective sidebar mode/title/icon (page → collection → site); shared by layout, header, sidebar, and drawer
|
|
23
|
+
- `sidebar-nav.html` - Renders the resolved sidebar mode (dispatches to the includes below)
|
|
22
24
|
- `sidebar-right.html` - Right sidebar content
|
|
23
|
-
- `sidebar-folders.html` -
|
|
24
|
-
- `sidebar-categories.html` -
|
|
25
|
+
- `sidebar-folders.html` - "collection" mode: collapsible folder tree of a collection's documents
|
|
26
|
+
- `sidebar-categories.html` - "categories"/"tags" modes: posts grouped by taxonomy term
|
|
25
27
|
- `nav_list.html` - Manual navigation list rendering
|
|
26
28
|
- `breadcrumbs.html` - Navigation breadcrumbs
|
|
27
29
|
|
|
@@ -37,12 +39,13 @@ Analytics and tracking integrations:
|
|
|
37
39
|
|
|
38
40
|
Reusable UI components and widgets:
|
|
39
41
|
|
|
40
|
-
- `searchbar.html` -
|
|
42
|
+
- `searchbar.html` - Deprecated search stub (superseded by `search-modal.html`)
|
|
41
43
|
- `powered-by.html` - "Powered by" credits display
|
|
42
44
|
- `quick-index.html` - Quick page index
|
|
43
45
|
- `dev-shortcuts.html` - Developer shortcuts
|
|
44
|
-
- `info-section.html` - Settings/
|
|
45
|
-
- `
|
|
46
|
+
- `info-section.html` - Settings offcanvas (Appearance / Site / Developer tabs)
|
|
47
|
+
- `admin-links.html` - Cached admin quick links for the settings offcanvas
|
|
48
|
+
- `halfmoon.html` - Light/dark/auto color-mode segmented control
|
|
46
49
|
- `zer0-env-var.html` - Environment variable configuration
|
|
47
50
|
- `svg.html` - SVG icon definitions
|
|
48
51
|
- `js-cdn.html` - CDN JavaScript libraries
|
|
@@ -79,7 +82,7 @@ When including files in layouts or other templates, use the full path:
|
|
|
79
82
|
```liquid
|
|
80
83
|
{% include core/head.html %}
|
|
81
84
|
{% include navigation/sidebar-left.html %}
|
|
82
|
-
{% include components/
|
|
85
|
+
{% include components/search-modal.html %}
|
|
83
86
|
{% include analytics/google-analytics.html %}
|
|
84
87
|
```
|
|
85
88
|
|
|
@@ -87,7 +87,8 @@ If a component needs a token that doesn't exist yet, propose it in `_sass/tokens
|
|
|
87
87
|
| Component | Purpose |
|
|
88
88
|
|--------------------------|------------------------------------------------------|
|
|
89
89
|
| `author-eeat.html` | E-E-A-T author bio with Schema.org markup. |
|
|
90
|
-
| `
|
|
90
|
+
| `admin-links.html` | Cached admin quick links (settings offcanvas Site tab). |
|
|
91
|
+
| `info-section.html` | Settings offcanvas — Appearance / Site / Developer. |
|
|
91
92
|
| `js-cdn.html` | Body-end script bundle. |
|
|
92
93
|
| `search-modal.html` | Global search modal. |
|
|
93
94
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{% comment %} Feature: ZER0-077 {% endcomment %}
|
|
2
|
+
{%- comment -%}
|
|
3
|
+
Component: admin-links
|
|
4
|
+
Path: _includes/components/admin-links.html
|
|
5
|
+
Purpose: "Admin" section of the settings offcanvas — quick links to the
|
|
6
|
+
built-in admin pages, each rendered only when the target page
|
|
7
|
+
exists in the build (prevents 404s on bare-minimum /
|
|
8
|
+
remote-theme sites that haven't created the admin pages).
|
|
9
|
+
Params: none — site-scoped only. Include with {% include_cached %} so
|
|
10
|
+
the URL scan below runs once per build, not once per page.
|
|
11
|
+
Depends on: site.pages, the `about` collection, Bootstrap list-group.
|
|
12
|
+
Notes: Pure Liquid on purpose: local _plugins never load under the
|
|
13
|
+
github-pages gem (it forces safe mode and randomizes
|
|
14
|
+
plugins_dir), so a plugin-computed lookup is dead on GitHub
|
|
15
|
+
Pages and in the Docker dev server. Keep page.* out of this
|
|
16
|
+
file — it would poison the include cache.
|
|
17
|
+
{%- endcomment -%}
|
|
18
|
+
|
|
19
|
+
{%- assign _page_urls = site.pages | map: "url" | join: "|" -%}
|
|
20
|
+
{%- assign _about_urls = "" -%}
|
|
21
|
+
{%- if site.about -%}
|
|
22
|
+
{%- assign _about_urls = site.about | map: "url" | join: "|" -%}
|
|
23
|
+
{%- endif -%}
|
|
24
|
+
{%- capture _admin_urls -%}|{{ _page_urls }}|{{ _about_urls }}|{%- endcapture -%}
|
|
25
|
+
|
|
26
|
+
{%- assign _cfg_page = false -%}
|
|
27
|
+
{%- assign _theme_page = false -%}
|
|
28
|
+
{%- assign _nav_page = false -%}
|
|
29
|
+
{%- assign _env_page = false -%}
|
|
30
|
+
{%- if _admin_urls contains "|/about/config/|" -%}{% assign _cfg_page = true %}{%- endif -%}
|
|
31
|
+
{%- if _admin_urls contains "|/about/settings/theme/|" -%}{% assign _theme_page = true %}{%- endif -%}
|
|
32
|
+
{%- if _admin_urls contains "|/about/settings/navigation/|" -%}{% assign _nav_page = true %}{%- endif -%}
|
|
33
|
+
{%- if _admin_urls contains "|/about/settings/environment/|" -%}{% assign _env_page = true %}{%- endif -%}
|
|
34
|
+
|
|
35
|
+
{% if _cfg_page or _theme_page or _nav_page or _env_page %}
|
|
36
|
+
<div class="mb-3">
|
|
37
|
+
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
38
|
+
<i class="bi bi-speedometer2 me-1" aria-hidden="true"></i>Admin
|
|
39
|
+
</h6>
|
|
40
|
+
<div class="list-group list-group-flush small">
|
|
41
|
+
{% if _cfg_page %}
|
|
42
|
+
<a href="{{ '/about/config/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
43
|
+
<i class="bi bi-gear me-2 text-body-secondary" aria-hidden="true"></i>Configuration
|
|
44
|
+
</a>
|
|
45
|
+
{% endif %}
|
|
46
|
+
{% if _theme_page %}
|
|
47
|
+
<a href="{{ '/about/settings/theme/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
48
|
+
<i class="bi bi-palette me-2 text-body-secondary" aria-hidden="true"></i>Theme Customizer
|
|
49
|
+
</a>
|
|
50
|
+
{% endif %}
|
|
51
|
+
{% if _nav_page %}
|
|
52
|
+
<a href="{{ '/about/settings/navigation/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
53
|
+
<i class="bi bi-signpost-2 me-2 text-body-secondary" aria-hidden="true"></i>Navigation Editor
|
|
54
|
+
</a>
|
|
55
|
+
{% endif %}
|
|
56
|
+
{% if _env_page %}
|
|
57
|
+
<a href="{{ '/about/settings/environment/' | relative_url }}" class="list-group-item list-group-item-action d-flex align-items-center px-0">
|
|
58
|
+
<i class="bi bi-hdd-network me-2 text-body-secondary" aria-hidden="true"></i>Environment Dashboard
|
|
59
|
+
</a>
|
|
60
|
+
{% endif %}
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
{% endif %}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
{% comment %} Feature: ZER0-060 {% endcomment %}
|
|
1
2
|
{%- comment -%}
|
|
2
3
|
Component: ai-chat
|
|
3
4
|
Path: _includes/components/ai-chat.html
|
|
@@ -351,14 +352,35 @@
|
|
|
351
352
|
@media (max-width: 576px) {
|
|
352
353
|
#aiChatPanel {
|
|
353
354
|
width: calc(100vw - 2rem);
|
|
354
|
-
right: 1rem;
|
|
355
|
-
|
|
355
|
+
right: var(--zer0-space-fab-offset, 1rem);
|
|
356
|
+
/* One gap above the toggle's slot (toggle is 3rem tall). */
|
|
357
|
+
bottom: calc(var(--zer0-space-fab-offset, 1rem) + var(--zer0-space-fab-size, 3.5rem) + var(--zer0-space-fab-gap, 0.75rem) + 3rem + var(--zer0-space-fab-gap, 0.75rem));
|
|
356
358
|
max-height: 60vh;
|
|
357
359
|
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* Below lg, pages with a sidebar/TOC render the mobile TOC FAB in this
|
|
363
|
+
same right-edge slot (offset + size + gap — see .bd-toc-fab in
|
|
364
|
+
_sass/layouts/_navbar-extras.scss). Step the chat toggle and panel one
|
|
365
|
+
slot higher there so the two buttons never overlap. */
|
|
366
|
+
@media (max-width: 991.98px) {
|
|
367
|
+
/* Cap the panel to the space between its anchored bottom (worst case:
|
|
368
|
+
the stepped-up slot below) and the fixed header — a 540px panel pokes
|
|
369
|
+
above short tablet/landscape viewports. */
|
|
370
|
+
#aiChatPanel {
|
|
371
|
+
max-height: min(60vh, calc(100vh
|
|
372
|
+
- var(--zer0-space-fab-offset, 1rem)
|
|
373
|
+
- 2 * (var(--zer0-space-fab-size, 3.5rem) + var(--zer0-space-fab-gap, 0.75rem))
|
|
374
|
+
- 3rem - var(--zer0-space-fab-gap, 0.75rem)
|
|
375
|
+
- 4rem));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
body:has(#tocFab) #aiChatToggle {
|
|
379
|
+
bottom: calc(var(--zer0-space-fab-offset, 1rem) + 2 * (var(--zer0-space-fab-size, 3.5rem) + var(--zer0-space-fab-gap, 0.75rem)));
|
|
380
|
+
}
|
|
358
381
|
|
|
359
|
-
#
|
|
360
|
-
bottom:
|
|
361
|
-
right: 1rem;
|
|
382
|
+
body:has(#tocFab) #aiChatPanel {
|
|
383
|
+
bottom: calc(var(--zer0-space-fab-offset, 1rem) + 2 * (var(--zer0-space-fab-size, 3.5rem) + var(--zer0-space-fab-gap, 0.75rem)) + 3rem + var(--zer0-space-fab-gap, 0.75rem));
|
|
362
384
|
}
|
|
363
385
|
}
|
|
364
386
|
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
+
{% comment %} Feature: ZER0-077 {% endcomment %}
|
|
1
2
|
<!--
|
|
2
3
|
===================================================================
|
|
3
4
|
BACKGROUND SETTINGS — fffuel-style background controls (tab content)
|
|
4
5
|
===================================================================
|
|
5
|
-
|
|
6
|
+
|
|
6
7
|
File: background-settings.html
|
|
7
8
|
Path: _includes/components/background-settings.html
|
|
8
|
-
Purpose:
|
|
9
|
-
inside the Settings offcanvas
|
|
10
|
-
|
|
9
|
+
Purpose: Theme-skin selector and SVG-background controls, rendered
|
|
10
|
+
inside the Settings offcanvas Appearance tab.
|
|
11
|
+
|
|
11
12
|
Dependencies:
|
|
12
13
|
- assets/js/background-customizer.js (zer0Bg API)
|
|
13
14
|
- _sass/theme/_backgrounds.scss (CSS custom properties)
|
|
14
15
|
- Bootstrap 5 form components
|
|
16
|
+
|
|
17
|
+
Section headings match the h6 pattern used by the parent
|
|
18
|
+
info-section.html so the Appearance tab reads as one surface.
|
|
15
19
|
===================================================================
|
|
16
20
|
-->
|
|
17
21
|
|
|
@@ -21,9 +25,9 @@
|
|
|
21
25
|
<!-- Skin selector -->
|
|
22
26
|
<div class="mb-4">
|
|
23
27
|
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
24
|
-
<i class="bi bi-palette2 me-1"></i>Theme Skin
|
|
28
|
+
<i class="bi bi-palette2 me-1" aria-hidden="true"></i>Theme Skin
|
|
25
29
|
</h6>
|
|
26
|
-
<div class="d-flex flex-wrap gap-2" id="zer0SkinButtons">
|
|
30
|
+
<div class="d-flex flex-wrap gap-2" id="zer0SkinButtons" role="group" aria-label="Theme skin">
|
|
27
31
|
{% for skin in skins %}
|
|
28
32
|
<button class="btn btn-sm btn-outline-primary{% if skin == current_skin %} active{% endif %}"
|
|
29
33
|
data-skin="{{ skin }}"
|
|
@@ -34,51 +38,48 @@
|
|
|
34
38
|
</div>
|
|
35
39
|
</div>
|
|
36
40
|
|
|
37
|
-
<!--
|
|
41
|
+
<!-- SVG background toggle + layer opacity -->
|
|
38
42
|
<div class="mb-4">
|
|
39
43
|
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
40
|
-
<i class="bi bi-image me-1"></i>
|
|
44
|
+
<i class="bi bi-image me-1" aria-hidden="true"></i>Background
|
|
41
45
|
</h6>
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
|
|
47
|
+
<div class="d-flex align-items-center justify-content-between p-3 bg-body-tertiary rounded mb-3">
|
|
48
|
+
<label class="form-check-label" for="zer0BgToggle">SVG backgrounds</label>
|
|
44
49
|
<div class="form-check form-switch mb-0">
|
|
45
50
|
<input class="form-check-input" type="checkbox" id="zer0BgToggle" checked>
|
|
46
51
|
</div>
|
|
47
52
|
</div>
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<!-- Opacity sliders -->
|
|
51
|
-
<div class="mb-4">
|
|
52
|
-
<h6 class="text-body-secondary small text-uppercase fw-semibold mb-2">
|
|
53
|
-
<i class="bi bi-sliders2 me-1"></i>Layer Opacity
|
|
54
|
-
</h6>
|
|
55
53
|
|
|
56
54
|
<div class="mb-3">
|
|
57
|
-
<label class="form-label small" for="zer0GradientOpacity">
|
|
55
|
+
<label class="form-label small d-flex justify-content-between mb-1" for="zer0GradientOpacity">
|
|
56
|
+
<span>Gradient opacity</span>
|
|
57
|
+
<span class="text-body-secondary" id="zer0GradientOpacityVal">0.6</span>
|
|
58
|
+
</label>
|
|
58
59
|
<input type="range" class="form-range" id="zer0GradientOpacity"
|
|
59
60
|
min="0" max="1" step="0.05" value="0.6">
|
|
60
|
-
<small class="text-body-secondary"><span id="zer0GradientOpacityVal">0.6</span></small>
|
|
61
61
|
</div>
|
|
62
62
|
|
|
63
63
|
<div class="mb-3">
|
|
64
|
-
<label class="form-label small" for="zer0TextureOpacity">
|
|
64
|
+
<label class="form-label small d-flex justify-content-between mb-1" for="zer0TextureOpacity">
|
|
65
|
+
<span>Texture opacity</span>
|
|
66
|
+
<span class="text-body-secondary" id="zer0TextureOpacityVal">0.04</span>
|
|
67
|
+
</label>
|
|
65
68
|
<input type="range" class="form-range" id="zer0TextureOpacity"
|
|
66
69
|
min="0" max="0.2" step="0.005" value="0.04">
|
|
67
|
-
<small class="text-body-secondary"><span id="zer0TextureOpacityVal">0.04</span></small>
|
|
68
70
|
</div>
|
|
69
71
|
|
|
70
72
|
<div class="mb-3">
|
|
71
|
-
<label class="form-label small" for="zer0PatternOpacity">
|
|
73
|
+
<label class="form-label small d-flex justify-content-between mb-1" for="zer0PatternOpacity">
|
|
74
|
+
<span>Pattern opacity</span>
|
|
75
|
+
<span class="text-body-secondary" id="zer0PatternOpacityVal">0.08</span>
|
|
76
|
+
</label>
|
|
72
77
|
<input type="range" class="form-range" id="zer0PatternOpacity"
|
|
73
78
|
min="0" max="0.3" step="0.01" value="0.08">
|
|
74
|
-
<small class="text-body-secondary"><span id="zer0PatternOpacityVal">0.08</span></small>
|
|
75
79
|
</div>
|
|
76
|
-
</div>
|
|
77
80
|
|
|
78
|
-
|
|
79
|
-
<
|
|
80
|
-
<button class="btn btn-sm btn-outline-danger" id="zer0BgReset" type="button">
|
|
81
|
-
<i class="bi bi-arrow-counterclockwise me-1"></i>Reset to defaults
|
|
81
|
+
<button class="btn btn-sm btn-outline-secondary" id="zer0BgReset" type="button">
|
|
82
|
+
<i class="bi bi-arrow-counterclockwise me-1" aria-hidden="true"></i>Reset background
|
|
82
83
|
</button>
|
|
83
84
|
</div>
|
|
84
85
|
|
|
@@ -119,15 +120,13 @@ document.addEventListener("DOMContentLoaded", function () {
|
|
|
119
120
|
document.getElementById("zer0BgReset").addEventListener("click", function () {
|
|
120
121
|
zer0Bg.setSkin("{{ current_skin }}");
|
|
121
122
|
zer0Bg.toggle(true);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
document.getElementById("zer0TextureOpacityVal").textContent = "0.04";
|
|
130
|
-
document.getElementById("zer0PatternOpacityVal").textContent = "0.08";
|
|
123
|
+
var defaults = { zer0GradientOpacity: "0.6", zer0TextureOpacity: "0.04", zer0PatternOpacity: "0.08" };
|
|
124
|
+
var layers = { zer0GradientOpacity: "gradient", zer0TextureOpacity: "texture", zer0PatternOpacity: "pattern" };
|
|
125
|
+
Object.keys(defaults).forEach(function (id) {
|
|
126
|
+
zer0Bg.setOpacity(layers[id], defaults[id]);
|
|
127
|
+
document.getElementById(id).value = defaults[id];
|
|
128
|
+
document.getElementById(id + "Val").textContent = defaults[id];
|
|
129
|
+
});
|
|
131
130
|
toggle.checked = true;
|
|
132
131
|
document.querySelectorAll("#zer0SkinButtons .btn").forEach(function (b) { b.classList.remove("active"); });
|
|
133
132
|
var active = document.querySelector('#zer0SkinButtons [data-skin="{{ current_skin }}"]');
|