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.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +94 -0
  3. data/README.md +3 -3
  4. data/_data/authors.yml +1 -0
  5. data/_data/features.yml +37 -2
  6. data/_data/navigation/README.md +15 -5
  7. data/_data/navigation/main.yml +0 -8
  8. data/_data/roadmap.yml +1 -0
  9. data/_includes/README.md +10 -7
  10. data/_includes/analytics/google-analytics.html +1 -0
  11. data/_includes/analytics/google-tag-manager-body.html +1 -0
  12. data/_includes/analytics/google-tag-manager-head.html +1 -0
  13. data/_includes/analytics/posthog.html +1 -0
  14. data/_includes/components/README.md +2 -1
  15. data/_includes/components/admin-links.html +63 -0
  16. data/_includes/components/admin-tabs.html +1 -0
  17. data/_includes/components/ai-chat.html +27 -5
  18. data/_includes/components/author-eeat.html +1 -0
  19. data/_includes/components/background-customizer.html +1 -0
  20. data/_includes/components/background-settings.html +36 -37
  21. data/_includes/components/component-showcase.html +1 -0
  22. data/_includes/components/cookie-consent.html +1 -0
  23. data/_includes/components/dev-shortcuts.html +1 -8
  24. data/_includes/components/env-switcher.html +90 -138
  25. data/_includes/components/feature-card.html +1 -1
  26. data/_includes/components/halfmoon.html +22 -41
  27. data/_includes/components/info-section.html +127 -130
  28. data/_includes/components/mermaid.html +1 -0
  29. data/_includes/components/nanobar.html +1 -0
  30. data/_includes/components/post-type-badge.html +1 -0
  31. data/_includes/components/preview-image.html +1 -0
  32. data/_includes/components/search-modal.html +1 -0
  33. data/_includes/components/searchbar.html +1 -0
  34. data/_includes/components/shortcuts-modal.html +1 -0
  35. data/_includes/components/theme-info.html +21 -30
  36. data/_includes/components/theme-preview-gallery.html +1 -0
  37. data/_includes/content/backlinks.html +1 -0
  38. data/_includes/content/giscus.html +1 -0
  39. data/_includes/content/jsonld-faq.html +1 -0
  40. data/_includes/content/seo.html +1 -0
  41. data/_includes/content/sitemap.html +1 -0
  42. data/_includes/content/toc.html +1 -0
  43. data/_includes/core/color-mode-init.html +1 -0
  44. data/_includes/core/footer.html +1 -0
  45. data/_includes/core/head.html +1 -0
  46. data/_includes/core/header.html +5 -15
  47. data/_includes/navigation/admin-nav.html +1 -0
  48. data/_includes/navigation/breadcrumbs.html +1 -0
  49. data/_includes/navigation/local-graph-fab.html +3 -9
  50. data/_includes/navigation/local-graph.html +4 -9
  51. data/_includes/navigation/navbar.html +1 -0
  52. data/_includes/navigation/sidebar-categories.html +56 -14
  53. data/_includes/navigation/sidebar-config.html +115 -0
  54. data/_includes/navigation/sidebar-folders.html +168 -62
  55. data/_includes/navigation/sidebar-left.html +29 -52
  56. data/_includes/navigation/sidebar-nav.html +30 -0
  57. data/_includes/navigation/sidebar-right.html +1 -0
  58. data/_includes/navigation/toc-fab.html +3 -9
  59. data/_includes/navigation/unified-drawer.html +7 -14
  60. data/_includes/obsidian/full-graph.html +1 -0
  61. data/_includes/setup/wizard.html +1 -0
  62. data/_includes/stats/stats-categories.html +1 -0
  63. data/_includes/stats/stats-header.html +1 -0
  64. data/_includes/stats/stats-metrics.html +1 -0
  65. data/_includes/stats/stats-overview.html +1 -0
  66. data/_includes/stats/stats-tags.html +1 -0
  67. data/_layouts/admin.html +1 -0
  68. data/_layouts/article.html +1 -0
  69. data/_layouts/author.html +1 -0
  70. data/_layouts/authors.html +1 -0
  71. data/_layouts/collection.html +1 -0
  72. data/_layouts/default.html +14 -37
  73. data/_layouts/home.html +1 -0
  74. data/_layouts/index.html +1 -0
  75. data/_layouts/landing.html +1 -0
  76. data/_layouts/news.html +1 -0
  77. data/_layouts/note.html +1 -0
  78. data/_layouts/notebook.html +1 -0
  79. data/_layouts/root.html +3 -2
  80. data/_layouts/search.html +1 -0
  81. data/_layouts/section.html +1 -0
  82. data/_layouts/setup.html +1 -0
  83. data/_layouts/sitemap-collection.html +1 -0
  84. data/_layouts/stats.html +1 -0
  85. data/_layouts/tag.html +1 -0
  86. data/_layouts/welcome.html +1 -0
  87. data/_plugins/author_pages_generator.rb +1 -0
  88. data/_plugins/obsidian_links.rb +1 -0
  89. data/_plugins/preview_image_generator.rb +1 -0
  90. data/_plugins/search_and_sitemap_generator.rb +1 -0
  91. data/_plugins/theme_version.rb +1 -0
  92. data/_sass/components/_author.scss +12 -1
  93. data/_sass/components/_footer.scss +22 -0
  94. data/_sass/components/_ui-enhancements.scss +9 -0
  95. data/_sass/core/_docs-layout.scss +1 -0
  96. data/_sass/core/_navbar.scss +10 -27
  97. data/_sass/core/_obsidian.scss +2 -2
  98. data/_sass/core/code-copy.scss +10 -0
  99. data/_sass/custom.scss +1 -0
  100. data/_sass/notebooks.scss +1 -0
  101. data/_sass/theme/_backgrounds.scss +7 -2
  102. data/_sass/utilities/_layout.scss +11 -0
  103. data/assets/css/main.scss +2 -1
  104. data/assets/js/ai-chat.js +1 -0
  105. data/assets/js/author-profile.js +1 -0
  106. data/assets/js/auto-hide-nav.js +1 -0
  107. data/assets/js/back-to-top.js +1 -0
  108. data/assets/js/background-customizer.js +1 -0
  109. data/assets/js/code-copy.js +1 -0
  110. data/assets/js/halfmoon.js +23 -22
  111. data/assets/js/modules/navigation/gestures.js +1 -0
  112. data/assets/js/modules/navigation/keyboard.js +1 -0
  113. data/assets/js/modules/navigation/scroll-spy.js +1 -0
  114. data/assets/js/modules/navigation/sidebar-state.js +1 -0
  115. data/assets/js/modules/navigation/sidebar-visibility.js +1 -0
  116. data/assets/js/modules/navigation/smooth-scroll.js +1 -0
  117. data/assets/js/modules/theme/appearance.js +52 -16
  118. data/assets/js/nanobar-init.js +1 -0
  119. data/assets/js/navigation.js +1 -0
  120. data/assets/js/obsidian-graph.js +1 -0
  121. data/assets/js/obsidian-wiki-links.js +1 -0
  122. data/assets/js/palette-generator.js +1 -0
  123. data/assets/js/particles-source.js +1 -0
  124. data/assets/js/search-modal.js +1 -0
  125. data/assets/js/setup-wizard.js +1 -0
  126. data/assets/js/share-actions.js +1 -0
  127. data/assets/js/skin-editor.js +1 -0
  128. data/assets/js/table-copy.js +1 -0
  129. data/assets/js/theme-customizer.js +1 -0
  130. data/scripts/analyze-commits.sh +1 -0
  131. data/scripts/bin/giscus-discussions +1 -0
  132. data/scripts/bin/install +1 -0
  133. data/scripts/bin/validate +1 -0
  134. data/scripts/build +1 -0
  135. data/scripts/content-review.rb +1 -0
  136. data/scripts/convert-notebooks.sh +4 -3
  137. data/scripts/fix-markdown-format.sh +1 -0
  138. data/scripts/generate-preview-images.sh +1 -0
  139. data/scripts/generate-roadmap.sh +1 -0
  140. data/scripts/install-preview-generator.sh +1 -0
  141. data/scripts/release +1 -0
  142. data/scripts/requirements.txt +11 -0
  143. data/scripts/setup.sh +1 -0
  144. data/scripts/tag-features +136 -0
  145. data/scripts/validate-features.rb +7 -0
  146. data/scripts/vendor-install.sh +1 -0
  147. metadata +8 -3
  148. data/_plugins/admin_page_urls.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f65c3a0d1bdabc361ffa201b1ef8718b51d9d90ac9f562d465cbcf11da23cff3
4
- data.tar.gz: 5a688bea4feaf4b0408a072cf0d23dea6922aaab810dfea9e71f5e6d55147b29
3
+ metadata.gz: 2ffe866835e858107f670f29086f904914d21bf1159d8c6eb3cbd138f79caf64
4
+ data.tar.gz: d26f27d6460136cc9f2da67da26523721b52b0e7525e0811498910215e2f29e2
5
5
  SHA512:
6
- metadata.gz: 021abbb9996ad7419ce2d27e73ece0234e79f63b8fca7f9ce1619406f91d5e61eabe9ab352257dc09df144c45a75ffa79aa9ff4120c354384fdf3c65420d2557
7
- data.tar.gz: 01f76088c04901271942a073140c1ab38ac98bb1ed9ec2defa4d20cb532e331589415f341fa62a0dc34e20ad4a6194a6d9e34477e35d601a8e3593e96d830f22
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 → fast checks quality control → matrix test suite → integration tests → build & validate |
761
- | 2 | **TEST (Latest Dependencies)** | [`test-latest.yml`](.github/workflows/test-latest.yml) | daily schedule / push / PR / dispatch | Zero-pin Docker build with bleeding-edge gems; tests then promotes passing images to Docker Hub |
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, Actions, and YAML |
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
@@ -1,3 +1,4 @@
1
+ # Feature: ZER0-061
1
2
  # Authors Data File
2
3
  # =================
3
4
  # Define author profiles for blog posts
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.23.0
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/<key>/ hub with bio, stats, and a filterable grid of their content across collections"
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"
@@ -19,11 +19,18 @@
19
19
  #
20
20
  # ## Navigation Modes
21
21
  #
22
- # The sidebar supports three navigation modes set via `page.sidebar.nav`:
23
- #
24
- # 1. **auto** - Auto-generates from collection documents
25
- # 2. **tree** - Uses YAML data from this directory
26
- # 3. **categories** - Groups by Jekyll categories
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:
@@ -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
@@ -1,3 +1,4 @@
1
+ # Feature: ZER0-052
1
2
  # =============================================================================
2
3
  # zer0-mistakes Roadmap — Single Source of Truth
3
4
  # =============================================================================
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 with dynamic navigation
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` - Dynamic folder structure generation
24
- - `sidebar-categories.html` - Category-based navigation
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` - Search functionality
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/info modal
45
- - `halfmoon.html` - Dark mode toggle
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/searchbar.html %}
85
+ {% include components/search-modal.html %}
83
86
  {% include analytics/google-analytics.html %}
84
87
  ```
85
88
 
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-038 {% endcomment %}
1
2
  <!-- Global site tag (gtag.js) - Google Analytics -->
2
3
  <script>
3
4
  (function () {
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-039 {% endcomment %}
1
2
  <!-- Google Tag Manager (noscript) -->
2
3
  <noscript>
3
4
  <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NN8P7RZ"
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-039 {% endcomment %}
1
2
  <!--
2
3
  title: Google Tag Manager
3
4
  file:
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-006 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  POSTHOG ANALYTICS - Privacy-First Web Analytics Integration
@@ -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
- | `info-section.html` | Settings offcanvas with theme/appearance controls. |
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-050 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  ADMIN TABS — Reusable tabbed interface for admin pages
@@ -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
- bottom: 8rem;
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
- #aiChatToggle {
360
- bottom: 4.5rem;
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,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-054 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  AUTHOR E-E-A-T BLOCK - Experience, Expertise, Authority, Trust
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-065 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  BACKGROUND CUSTOMIZER — fffuel-style background settings panel
@@ -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: Background skin selector and opacity controls, rendered
9
- inside the Settings offcanvas Background tab.
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
- <!-- Background toggle -->
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>SVG Backgrounds
44
+ <i class="bi bi-image me-1" aria-hidden="true"></i>Background
41
45
  </h6>
42
- <div class="d-flex align-items-center justify-content-between p-3 bg-body-tertiary rounded">
43
- <label class="form-check-label" for="zer0BgToggle">Enable SVG backgrounds</label>
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">Gradient opacity</label>
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">Texture opacity</label>
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">Pattern opacity</label>
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
- <!-- Reset -->
79
- <div>
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
- zer0Bg.setOpacity("gradient", 0.6);
123
- zer0Bg.setOpacity("texture", 0.04);
124
- zer0Bg.setOpacity("pattern", 0.08);
125
- document.getElementById("zer0GradientOpacity").value = 0.6;
126
- document.getElementById("zer0TextureOpacity").value = 0.04;
127
- document.getElementById("zer0PatternOpacity").value = 0.08;
128
- document.getElementById("zer0GradientOpacityVal").textContent = "0.6";
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 }}"]');
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-071 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  COMPONENT SHOWCASE - Live Bootstrap 5 demo gallery
@@ -1,3 +1,4 @@
1
+ {% comment %} Feature: ZER0-007 {% endcomment %}
1
2
  <!--
2
3
  ===================================================================
3
4
  COOKIE CONSENT - GDPR/CCPA Compliant Privacy Management